Skip to content
Snippets Groups Projects
models.py 4.31 KiB
Newer Older
Jonathan Weth's avatar
Jonathan Weth committed
from django.utils import timezone
Frank Poetzsch-Heffter's avatar
Frank Poetzsch-Heffter committed
from django.db import models
from django.contrib.auth.models import User
from datetime import date
from django.utils.translation import ugettext_lazy as _

Jonathan Weth's avatar
Jonathan Weth committed
current_year = timezone.now().year
YEARS = [(x, str(x)) for x in range(current_year, current_year + 4)]
Jonathan Weth's avatar
Jonathan Weth committed

class Status:
    def __init__(self, name, style_class):
        self.name = name
        self.style_class = style_class

    def __str__(self):
Jonathan Weth's avatar
Jonathan Weth committed
        return self.name
    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)]
Jonathan Weth's avatar
Jonathan Weth committed
class CostCenter(models.Model):
    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"))
Jonathan Weth's avatar
Jonathan Weth committed

Jonathan Weth's avatar
Jonathan Weth committed
        return self.name
Frank Poetzsch-Heffter's avatar
Frank Poetzsch-Heffter committed
    class Meta:
        verbose_name = _("Cost center")
        verbose_name_plural = _("Cost centers")
            ('manage_costcenter', _("Can manage costcenter")),
Jonathan Weth's avatar
Jonathan Weth committed

Frank Poetzsch-Heffter's avatar
Frank Poetzsch-Heffter committed
class Account(models.Model):
    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"))
Jonathan Weth's avatar
Jonathan Weth committed
    income = models.BooleanField(default=False,
                                 verbose_name=_("Income account"))
    budget = models.IntegerField(default=0, verbose_name=_("Budget"))
Jonathan Weth's avatar
Jonathan Weth committed
    saldo = models.DecimalField(max_digits=9, decimal_places=2, default=0.00)
    rest = models.DecimalField(max_digits=9, decimal_places=2, default=0.00)
    def __str__(self):
Jonathan Weth's avatar
Jonathan Weth committed
        return "{}: {}".format(self.cost_center, self.name)
Frank Poetzsch-Heffter's avatar
Frank Poetzsch-Heffter committed
    class Meta:
        verbose_name = _("Booking account")
        verbose_name_plural = _("Booking accounts")
            ('manage_account', _("Can manage account")),
Jonathan Weth's avatar
Jonathan Weth committed

Frank Poetzsch-Heffter's avatar
Frank Poetzsch-Heffter committed
class Booking(models.Model):
Jonathan Weth's avatar
Jonathan Weth committed
    # General information
    account = models.ForeignKey(to=Account, on_delete=models.SET_NULL, blank=True, null=True,
                                verbose_name=_("Booking account"))
Jonathan Weth's avatar
Jonathan Weth committed
    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(max_length=2000, blank=True, null=True, verbose_name=_("Reason"))
    planned_amount = models.IntegerField(verbose_name=_("Planned amount"))
Jonathan Weth's avatar
Jonathan Weth committed

    # Details
    invoice_date = models.DateField(blank=True, null=True, verbose_name=_("Date of invoice"))
    invoice_number = models.CharField(max_length=20, blank=True, null=True, verbose_name=_("Bill number"))
    firma = models.CharField(max_length=30, blank=True, null=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"))
Jonathan Weth's avatar
Jonathan Weth committed

    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"))
Jonathan Weth's avatar
Jonathan Weth committed

    upload = models.FileField(upload_to='uploads/fibu/%Y/', default=None, blank=True, null=True,
                              verbose_name=_("Scan of invoice"))
Jonathan Weth's avatar
Jonathan Weth committed

    # Meta information
    status = models.IntegerField(default=0, choices=status_choices, verbose_name=_("Status"))
Jonathan Weth's avatar
Jonathan Weth committed

    def get_status(self):
        return status_list[self.status]

Jonathan Weth's avatar
Jonathan Weth committed
    def __str__(self):
        return "{} ({})".format(self.description, self.account)

Frank Poetzsch-Heffter's avatar
Frank Poetzsch-Heffter committed
    class Meta:
        verbose_name = _("Booking")
        verbose_name_plural = _("Bookings")
            ('manage_booking', _("Can manage bookings")),
            ('request_booking', _("Can request a booking")),
            ('check_booking', _("Can check bookings")),
Jonathan Weth's avatar
Jonathan Weth committed
        ]