Skip to content
Snippets Groups Projects
Forked from Katharineum zu Lübeck / AlekSIS-App-FiBu
Up to date with the upstream repository.
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]