ComptaClub/src/billing/models.py

107 lines
3.4 KiB
Python

# coding=utf-8
from django.db import models
class Client(models.Model):
class Meta:
verbose_name = "Client"
verbose_name_plural = "Clients"
name = models.CharField(max_length=255, verbose_name="Nom")
address = models.CharField(max_length=255, verbose_name="Adresse")
postal_code = models.IntegerField(verbose_name="Code postal")
city = models.CharField(max_length=255, verbose_name="Ville")
contact = models.CharField(max_length=255, verbose_name="Personne de contact")
is_company = models.BooleanField(blank=True, default=True)
company_number = models.CharField(
max_length=50, verbose_name="N° d'entreprise", blank=True, null=True
)
def __str__(self):
return "%s" % (self.name)
class Contract(models.Model):
class Meta:
verbose_name = "Contrat"
verbose_name_plural = "Contrats"
name = models.CharField(max_length=255, verbose_name="Nom")
client = models.ForeignKey(
Client, related_name="get_contract", on_delete=models.CASCADE
)
advance = models.DecimalField(
max_digits=6, decimal_places=2, blank=True, verbose_name="Acompte", default=0
)
reference = models.CharField(
max_length=255, verbose_name="Référence", blank=True, null=True, unique=True
)
is_finished = models.BooleanField(default=True, blank=True)
is_paid = models.BooleanField(blank=True, default=False)
date = models.DateField(auto_now_add=True)
description = models.TextField(verbose_name="Description", blank=True, null=True)
def __str__(self):
return "%s" % (self.name)
def __generate_reference(self):
"""
Génère automatiquement la référence du contract
"""
if self.reference is None:
if self.id is None:
object_id = "XX"
elif self.id < 10:
object_id = "0" + str(self.id)
else:
object_id = self.id
self.reference = str(self.date.year) + "-" + object_id
def save(self, *args, **kwargs):
"""
Enregistre l'objet en DB après avoir calculé le montant total.
"""
super().save(*args, **kwargs)
self.__generate_reference()
super().save(*args, **kwargs)
class Prestation(models.Model):
class Meta:
verbose_name = "Prestations"
verbose_name_plural = "Prestations"
ordering = ["date"]
contract = models.ForeignKey(
Contract,
related_name="get_prestation",
blank=True,
null=True,
on_delete=models.CASCADE,
)
date = models.DateField()
label = models.CharField(max_length=255, verbose_name="Libellé")
unit = models.DecimalField(
max_digits=5, decimal_places=2, verbose_name="Unité", default=1
)
unit_price = models.DecimalField(
max_digits=5, decimal_places=2, verbose_name="Prix unitaire", default="12,5"
)
total_amount = models.DecimalField(
max_digits=6, decimal_places=2, blank=True, verbose_name="Prix", default=0
)
def __compute_total_amount(self):
"""
Calcule le montant total de la prestation.
"""
self.total_amount = self.unit * self.unit_price
def save(self, *args, **kwargs):
"""
Enregistre l'objet en DB après avoir calculé le montant total.
"""
self.__compute_total_amount()
super().save(*args, **kwargs)