Development #69728
Modèle facture, ligne de facture
0%
Description
Commençons par le minimum syndical :
Facture :
- un numéro de facture (on prend la primary key ou une colonne en plus dédiée ?)
- un libellé
- un montant (Decimal)
- une date d'émission
- un payeur (je dirais un text field pour commencer)
- un foreign key vers une régie
Une ligne de facture :
- un montant unitaire
- une quantité
- un montant total
- un libellé
- une foreignkey vers une facture
Avec les histoires de génération de trains de facturation, quoi doivent pouvoir être acceptés/amendés/rejetés, je partirais bien sur des modèles abstrait pour bien séparer les choses:
class AbstractInvoice(models.Model): ... ici les champs ... class Meta: abstract = True class Invoice(AbstractInvoice): .. class DraftInvoice(AbstractInvoice): ...
Histoire de ne pas faire ticket avec juste un modèle et rien d'autre, j’inclurais bien webservice de création d'une ligne de facturation.
(cas d'usage : paiement de 156 euros pour l'inscription au séjour au ski, paiement qui se fait avant la facturation finale, voir https://pad.libre-entreprise.org/p/eo-famille-facturation "Ajout de lignes de facture hors-calcul").
Demandes liées
Historique
Mis à jour par Emmanuel Cazenave il y a plus d'un an
Emmanuel Cazenave a écrit :
Facture :
- un numéro de facture (on prend la primary key ou une colonne en plus dédiée ?)
Il va falloir faire autrement :
- pas de trous dans la numérotation des factures en réglementation française (https://www.obat.fr/blog/numerotation-des-factures/)
- du coup les séquences postgres pas adaptées : "Thus, PostgreSQL sequence objects cannot be used to obtain “gapless” sequences." (https://www.postgresql.org/docs/current/functions-sequence.html)
https://www.cybertec-postgresql.com/en/gaps-in-sequences-postgresql/ une piste ? (j'ai lu en diagonale). Je vais mettre ce problème mettre de coté, on demandera à notre DBA.
Mis à jour par Emmanuel Cazenave il y a plus d'un an
Emmanuel Cazenave a écrit :
Il va falloir faire autrement
On ne peut pas se reposer sur la clé primaire.
Mis à jour par Benjamin Dauvergne il y a plus d'un an
Le plus simple c'est de créer un modèle Counter
, et de faire :
class Counter(model): name = CharField(max_length=128, primary_key=True) value = PositiveIntegerField(default=0) def get_count(name): with transaction.atomic(savepoint=False): created, counter = Counter.objects.get_or_create(name=name) if not created: counter = Counter.objects.select_for_update().get(pk=counter.pk) counter.value += 1 counter.save() return counter.value
invoice.number = get_count(f'invoice-{now().year}') # compteur de l'année de la facture
Mis à jour par Benjamin Dauvergne il y a plus d'un an
Plutôt qu'un nom le compteur peut-être relié à un objet parent des factures, la régie ou mieux l'année comptable elle même relié à la régie (je pense que ce serait fait comme ça dans un ERP classique).
class AccountingYear(Model): regie = ForeignKey(Regie) year = PositiveInteger() value = PositiveInteger(default=0) class Meta: unique_together = (('regie', 'year'),)
Mis à jour par Lauréline Guérin il y a plus d'un an
- Lié à Development #71528: facturation: générer des lignes de facturation sur un cas "simple" (prestation d'un enfant pour une période) ajouté
Mis à jour par Lauréline Guérin il y a environ un an
- Statut changé de Nouveau à Fermé
- Assigné à changé de Emmanuel Cazenave à Lauréline Guérin
(implémenté dans d'autres tickets)