Forked from
Katharineum zu Lübeck / AlekSIS-App-FiBu
Up to date with the upstream repository.
-
Frank Poetzsch-Heffter authoredFrank Poetzsch-Heffter authored
models.py 4.40 KiB
from datetime import date
from django.contrib.auth.models import User
from django.db import models
from django.utils import timezone
from django.utils.translation import ugettext_lazy as _
from aleksis.core.mixins import ExtensibleModel
current_year = timezone.now().year
YEARS = [(x, str(x)) for x in range(current_year, current_year + 4)]
class Status:
def __init__(self, name, style_class):
self.name = name
self.style_class = style_class
def __str__(self):
return self.name
status_list = [
Status(name=_("requested"), style_class="red"),
Status(name=_("rejected"), style_class="black"),
Status(name=_("accepted"), style_class="orange"),
Status(name=_("ordered"), style_class="yellow darken-1"),
Status(name=_("submitted"), style_class="blue"),
Status(name=_("paid"), style_class="green"),
]
status_choices = [(x, val.name) for x, val in enumerate(status_list)]
class CostCenter(ExtensibleModel):
name = models.CharField(max_length=30, blank=False, verbose_name=_("Cost center"))
year = models.IntegerField(
default=timezone.now().year, choices=YEARS, blank=False, verbose_name=_("Year")
)
class Meta:
verbose_name = _("Cost center")
verbose_name_plural = _("Cost centers")
permissions = [
("manage_costcenter", _("Can manage costcenter")),
]
def __str__(self):
return self.name
class Account(ExtensibleModel):
name = models.CharField(max_length=20, blank=False, verbose_name=_("Booking account"))
cost_center = models.ForeignKey(
to=CostCenter, on_delete=models.CASCADE, blank=False, verbose_name=_("Cost center")
)
income = models.BooleanField(default=False, verbose_name=_("Income account"))
budget = models.IntegerField(default=0, verbose_name=_("Budget"))
saldo = models.DecimalField(max_digits=9, decimal_places=2, default=0.00)
rest = models.DecimalField(max_digits=9, decimal_places=2, default=0.00)
class Meta:
verbose_name = _("Booking account")
verbose_name_plural = _("Booking accounts")
permissions = [
("manage_account", _("Can manage account")),
]
def __str__(self):
return "{}: {}".format(self.cost_center, self.name)
class Booking(ExtensibleModel):
# General information
account = models.ForeignKey(
to=Account,
on_delete=models.SET_NULL,
blank=True,
null=True,
verbose_name=_("Booking account"),
)
contact = models.ForeignKey(
to=User,
related_name="bookings",
on_delete=models.SET_NULL,
verbose_name=_("Created by"),
blank=True,
null=True,
)
description = models.CharField(max_length=50, verbose_name=_("Description"))
justification = models.CharField(default="", max_length=2000, blank=True, verbose_name=_("Reason"))
planned_amount = models.IntegerField(verbose_name=_("Planned amount"))
# Details
invoice_date = models.DateField(default=timezone.now, blank=True, verbose_name=_("Date of invoice"))
invoice_number = models.CharField(default="0", max_length=20, blank=True, verbose_name=_("Bill number"))
firma = models.CharField(default="", max_length=30, blank=True, verbose_name=_("Company"))
amount = models.DecimalField(
max_digits=9, decimal_places=2, default=0.00, verbose_name=_("Amount")
)
payout_number = models.IntegerField(blank=True, null=True, verbose_name=_("Payout number"))
submission_date = models.DateField(blank=True, null=True, verbose_name=_("Submission date"))
booking_date = models.DateField(default=date.today, verbose_name=_("Booking date"))
maturity = models.DateField(blank=True, null=True, verbose_name=_("Maturity"))
upload = models.FileField(
upload_to="uploads/fibu/%Y/", default=None, blank=True, verbose_name=_("Scan of invoice"),
)
# Meta information
status = models.IntegerField(default=0, choices=status_choices, verbose_name=_("Status"))
class Meta:
verbose_name = _("Booking")
verbose_name_plural = _("Bookings")
permissions = [
("manage_booking", _("Can manage bookings")),
("request_booking", _("Can request a booking")),
("check_booking", _("Can check bookings")),
]
def __str__(self):
return "{} ({})".format(self.description, self.account)
def get_status(self):
return status_list[self.status]