This repository has been archived on 2025-03-03. You can view files and clone it, but cannot push or open issues or pull requests.
facturio/invoices/models.py

102 lines
3 KiB
Python
Raw Normal View History

2024-08-16 22:12:49 +02:00
import decimal
from django.contrib.auth import get_user_model
from django.db import models
from django.utils import timezone
from django.utils.translation import gettext_lazy as _
from subjects import models as subject_models
2025-02-17 22:10:38 +01:00
UserModel = get_user_model()
2024-08-16 22:12:49 +02:00
class Invoice(models.Model):
class Meta:
verbose_name = _('Invoice')
verbose_name_plural = _('Invoices')
user = models.ForeignKey(UserModel, models.CASCADE)
supplier = models.ForeignKey(
2025-03-03 21:52:20 +01:00
subject_models.Subject,
on_delete=models.CASCADE,
related_name='+',
verbose_name=_('Supplier'),
2024-08-16 22:12:49 +02:00
)
supplier_data = models.ForeignKey(
2025-03-03 21:52:20 +01:00
subject_models.SubjectData,
on_delete=models.CASCADE,
related_name='+',
verbose_name=_('Supplier data'),
2024-08-16 22:12:49 +02:00
)
customer = models.ForeignKey(
2025-03-03 21:52:20 +01:00
subject_models.Subject,
on_delete=models.CASCADE,
related_name='+',
verbose_name=_('Customer'),
2024-08-16 22:12:49 +02:00
)
customer_data = models.ForeignKey(
2025-03-03 21:52:20 +01:00
subject_models.SubjectData,
on_delete=models.CASCADE,
related_name='+',
verbose_name=_('Customer data'),
2024-08-16 22:12:49 +02:00
)
invoice_date = models.DateField(_('Invoice date'), default=timezone.now)
due_date = models.DateField(_('Due date'))
def __str__(self):
return f'{self.id} - {self.supplier_data.name} -> {self.customer_data.name}'
def total_price(self) -> decimal.Decimal:
total = decimal.Decimal(0)
for item in self.items.all():
total += item.total_price()
return total
def custom_id(self) -> str:
2025-03-03 21:52:20 +01:00
return f'{self.invoice_date.year}-{self.id:04}'
2024-08-16 22:12:49 +02:00
class InvoiceItem(models.Model):
class Meta:
verbose_name = _('Invoice Item')
verbose_name_plural = _('Invoice Items')
invoice = models.ForeignKey(
2025-03-03 21:52:20 +01:00
Invoice,
on_delete=models.CASCADE,
related_name='items',
2024-08-16 22:12:49 +02:00
)
amount = models.DecimalField(_('Amount'), decimal_places=3, max_digits=8)
amount_unit = models.CharField(_('Amount unit'), max_length=32)
description = models.CharField(_('Description'), max_length=64)
price_for_amount = models.DecimalField(
2025-03-03 21:52:20 +01:00
_('Price for amount'),
decimal_places=3,
max_digits=8,
2024-08-16 22:12:49 +02:00
)
def total_price(self) -> decimal.Decimal:
return self.amount * self.price_for_amount
def __str__(self):
return f'{self.id} -> {self.invoice.id}'
2025-03-03 14:54:04 +01:00
class InvoiceFile(models.Model):
class Meta:
verbose_name = _('Invoice File')
verbose_name_plural = _('Invoice Files')
invoice = models.ForeignKey(Invoice, on_delete=models.CASCADE, related_name='files')
2025-03-03 21:52:20 +01:00
file = models.FileField(
_('File'), upload_to='invoice-files/%Y/%m/%d/', null=True, blank=True,
)
2025-03-03 14:54:04 +01:00
created_date = models.DateTimeField(_('Created Date'), auto_now=True)
def __str__(self):
return self.file.name
def get_file_name(self, ext: str) -> str:
2025-03-03 21:52:20 +01:00
return f'{self.invoice.id}-{self.created_date.strftime("%H%M%S")}.{ext}'