facturation: attacher les paiements aux lignes de facturation (#81190) #99

Merged
lguerin merged 4 commits from wip/81190-invoicing-invoice-line-payment into main 2023-09-21 15:55:34 +02:00
There is no content yet.
lguerin added 1 commit 2023-09-14 14:58:16 +02:00
lguerin added 1 commit 2023-09-14 15:27:03 +02:00
lguerin force-pushed wip/81190-invoicing-invoice-line-payment from 9951cee1b4 to e379914e8c 2023-09-14 15:30:38 +02:00 Compare
lguerin added 2 commits 2023-09-14 20:41:54 +02:00
lguerin changed title from WIP: facturation: attacher les paiements aux lignes de facturation (#81190) to facturation: attacher les paiements aux lignes de facturation (#81190) 2023-09-15 08:28:34 +02:00
Poster
Owner

0001: tout ce qu'il faut pour passer de paiements attachés à des factures, à des paiements attachés à des lignes de facturation

0002: avec le commit précédent, on a dans l'UI et dans les pdf, une ligne par par ligne de facturation. Si un parent a une facture avec 10 lignes de facturation mais qu'il a fait un seul paiement, c'est moche. Donc rétropédalage et mécanique pour aggréger les lignes par paiement et facture. (vu avec Cédric)

0003: demande de Cédric, pour chaque ligne de facturation, dans l'UI, avoir le détail des lignes de paiement associées, repliées par défaut (cf screenshot)

0004: wording, vu avec Cédric

0001: tout ce qu'il faut pour passer de paiements attachés à des factures, à des paiements attachés à des lignes de facturation 0002: avec le commit précédent, on a dans l'UI et dans les pdf, une ligne par par ligne de facturation. Si un parent a une facture avec 10 lignes de facturation mais qu'il a fait un seul paiement, c'est moche. Donc rétropédalage et mécanique pour aggréger les lignes par paiement et facture. (vu avec Cédric) 0003: demande de Cédric, pour chaque ligne de facturation, dans l'UI, avoir le détail des lignes de paiement associées, repliées par défaut (cf screenshot) 0004: wording, vu avec Cédric
lguerin requested review from pducroquet 2023-09-15 18:04:33 +02:00
Poster
Owner

@pducroquet je te mets en relecteur car réécriture des triggers :)
(un autre relecteur pour la partie python est requis)

@pducroquet je te mets en relecteur car réécriture des triggers :) (un autre relecteur pour la partie python est requis)
lguerin force-pushed wip/81190-invoicing-invoice-line-payment from 9560f20435 to aa4ae99695 2023-09-18 14:27:46 +02:00 Compare
lguerin changed title from facturation: attacher les paiements aux lignes de facturation (#81190) to facturation: attacher les paiements aux lignes de facturation (#81190) 2023-09-18 15:37:20 +02:00
lguerin changed target branch from wip/80977-invoicing-nursery to main 2023-09-18 15:37:20 +02:00
lguerin force-pushed wip/81190-invoicing-invoice-line-payment from aa4ae99695 to 26610ad551 2023-09-18 15:38:29 +02:00 Compare

@pducroquet je te mets en relecteur car réécriture des triggers :)
(un autre relecteur pour la partie python est requis)

Je prends la relecture de la partie python.

> @pducroquet je te mets en relecteur car réécriture des triggers :) > (un autre relecteur pour la partie python est requis) Je prends la relecture de la partie python.
pmarillonnet requested review from pmarillonnet 2023-09-19 09:08:12 +02:00
lguerin force-pushed wip/81190-invoicing-invoice-line-payment from 26610ad551 to 51f20f4c0f 2023-09-19 10:16:43 +02:00 Compare
lguerin force-pushed wip/81190-invoicing-invoice-line-payment from 51f20f4c0f to 0bfcc762ac 2023-09-19 10:17:25 +02:00 Compare
pmarillonnet reviewed 2023-09-20 15:12:07 +02:00
pmarillonnet left a comment
Owner

Côté python juste une petite chose que je n’ai pas comprise, le reste est clair pour moi.
Aussi juste des lignes de debug introduites dans du JS dans 0003 et qui sont retirées dans 0004 (les deux console.log()), il faudrait que ça n’apparaisse pas du tout.

Côté python juste une petite chose que je n’ai pas comprise, le reste est clair pour moi. Aussi juste des lignes de debug introduites dans du JS dans 0003 et qui sont retirées dans 0004 (les deux `console.log()`), il faudrait que ça n’apparaisse pas du tout.
@ -0,0 +16,4 @@
) # trigger not played yet, remaining_amount is not up to date
if not line.remaining_amount:
continue
paid_amount = decimal.Decimal(min(line.remaining_amount, remaining_amount))

Du point de vue fonctionnel ici je n’ai pas capté en quoi le rattachement aux lignes implique ce re-calcul des montants payés, ni en quoi c’est le minimum des deux valeurs trouvées qui nous intéresse ici.

Du point de vue fonctionnel ici je n’ai pas capté en quoi le rattachement aux lignes implique ce re-calcul des montants payés, ni en quoi c’est le minimum des deux valeurs trouvées qui nous intéresse ici.
Poster
Owner

On avait une ligne de paiement globale pour toute la facture: exemple 42€ affectés à une facture pour laquelle il restait 50€ à payer.

On veut attacher les lignes de paiement aux lignes de facturation (pour les stats, et d'autres besoins comptables, mais surtout pour ne pas permettre de payer un ligne de repas en cesu).
Imaginons qu'on ait dans cette facture 2 lignes à 20€ et 30€.
Première ligne, il faut y affecter seulement 20€, et non la totalité des 42€. Donc min(20, 42)
remaining_amount passe à 42-20 = 22€
Deuxième ligne, on peut y affecter la totalité du reste à affecter, 22€, soit min(30, 22)

(note: les triggers s'occupent de calculer remaining_amount à partir de total_amount et paid_amount, et garantissent que paid_amount ne dépasse pas total_amoun)

Peut-être que les noms de variable sont mal choisis, je vais revoir ça (même logique dans la migration et dans la méthode make_payment)

On avait une ligne de paiement globale pour toute la facture: exemple 42€ affectés à une facture pour laquelle il restait 50€ à payer. On veut attacher les lignes de paiement aux lignes de facturation (pour les stats, et d'autres besoins comptables, mais surtout pour ne pas permettre de payer un ligne de repas en cesu). Imaginons qu'on ait dans cette facture 2 lignes à 20€ et 30€. Première ligne, il faut y affecter seulement 20€, et non la totalité des 42€. Donc min(20, 42) remaining_amount passe à 42-20 = 22€ Deuxième ligne, on peut y affecter la totalité du reste à affecter, 22€, soit min(30, 22) (note: les triggers s'occupent de calculer remaining_amount à partir de total_amount et paid_amount, et garantissent que paid_amount ne dépasse pas total_amoun) Peut-être que les noms de variable sont mal choisis, je vais revoir ça (même logique dans la migration et dans la méthode make_payment)

Ah oui ok, je comprends mieux, merci.

Ah oui ok, je comprends mieux, merci.
lguerin force-pushed wip/81190-invoicing-invoice-line-payment from 0bfcc762ac to a3c24913c9 2023-09-21 09:06:39 +02:00 Compare
lguerin force-pushed wip/81190-invoicing-invoice-line-payment from a3c24913c9 to 7cfe867138 2023-09-21 09:20:38 +02:00 Compare
lguerin force-pushed wip/81190-invoicing-invoice-line-payment from 7cfe867138 to e67a2df8ce 2023-09-21 10:11:59 +02:00 Compare
Poster
Owner

Vu avec @pducroquet, une contrainte exprimée dans un trigger transformée en contrainte au niveau du modèle:

        constraints = [
            models.CheckConstraint(
                check=models.Q(
                    models.Q(
                        ('paid_amount__lte', models.F('total_amount')),
                        ('total_amount__gt', 0),
                    ),
                    models.Q(
                        ('paid_amount__gte', models.F('total_amount')),
                        ('total_amount__lt', 0),
                    ),
                    models.Q(('paid_amount', 0), ('total_amount', 0)),
                    _connector='OR',
                ),
                name='paid_amount_check',
            )
        ]

(j'ai aussi ajouté des tests avec des lignes de facturation négatives et des paiements dessus, ajusté la contrainte pour les montants négatifs)

Vu avec @pducroquet, une contrainte exprimée dans un trigger transformée en contrainte au niveau du modèle: ```python constraints = [ models.CheckConstraint( check=models.Q( models.Q( ('paid_amount__lte', models.F('total_amount')), ('total_amount__gt', 0), ), models.Q( ('paid_amount__gte', models.F('total_amount')), ('total_amount__lt', 0), ), models.Q(('paid_amount', 0), ('total_amount', 0)), _connector='OR', ), name='paid_amount_check', ) ] ``` (j'ai aussi ajouté des tests avec des lignes de facturation négatives et des paiements dessus, ajusté la contrainte pour les montants négatifs)
pmarillonnet approved these changes 2023-09-21 15:51:57 +02:00
pmarillonnet left a comment
Owner

Ack de mon côté, partie python donc.

Ack de mon côté, partie python donc.
pducroquet approved these changes 2023-09-21 15:54:25 +02:00
pducroquet left a comment
Owner

C'est bon pour moi côté SQL

C'est bon pour moi côté SQL
lguerin merged commit e67a2df8ce into main 2023-09-21 15:55:34 +02:00
lguerin deleted branch wip/81190-invoicing-invoice-line-payment 2023-09-21 15:55:34 +02:00
Sign in to join this conversation.
No reviewers
No Label
No Milestone
No Assignees
3 Participants
Notifications
Due Date
The due date is invalid or out of range. Please use the format 'yyyy-mm-dd'.

No due date set.

Dependencies

No dependencies set.

Reference: entrouvert/lingo#99
There is no content yet.