93 lines
3.3 KiB
Python
93 lines
3.3 KiB
Python
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° BCE", blank=True, null=True)
|
|
|
|
def __str__(self):
|
|
return "%s" % (self.name)
|
|
|
|
|
|
class Contract(models.Model):
|
|
class Meta:
|
|
verbose_name = "Contrat"
|
|
verbose_name_plural = "Contrats"
|
|
|
|
title = models.CharField(max_length=255, verbose_name="Titre")
|
|
client = models.ForeignKey(
|
|
Client, related_name="contracts", on_delete=models.CASCADE
|
|
)
|
|
advance = models.DecimalField(
|
|
max_digits=7, 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, verbose_name="Finie")
|
|
is_paid = models.BooleanField(blank=True, default=False, verbose_name="Payée")
|
|
date = models.DateField(auto_now_add=True)
|
|
description = models.TextField(verbose_name="Description", blank=True, null=True)
|
|
|
|
def __str__(self):
|
|
return "%s" % self.title
|
|
|
|
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",
|
|
on_delete=models.CASCADE,
|
|
)
|
|
date = models.DateField()
|
|
label = models.CharField(max_length=255, verbose_name="Libellé")
|
|
unit = models.DecimalField(
|
|
max_digits=7, decimal_places=2, verbose_name="Unité", default=1
|
|
)
|
|
unit_price = models.DecimalField(
|
|
max_digits=7, decimal_places=2, verbose_name="Prix unitaire", default="12,5"
|
|
)
|
|
total_amount = models.DecimalField(
|
|
max_digits=8, 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)
|