7.7 KiB
Padding facture provisoire vente - notes de session
Statut: implemente - a valider comptablement
Derniere mise a jour: 2026-04-26
Scope: lot.invoice -> account.invoice.line -> account.move
1) Objectif metier
Le padding sert a augmenter temporairement la quantite facturee sur une facture provisoire cote vente, afin de constituer une provision avant la facture finale.
Le padding ne change jamais la quantite physique du lot. Il represente seulement la part incluse en plus dans la facture provisoire.
Exemple:
- 2 lots factures ensemble
- padding global saisi dans le wizard:
1000 - repartition actuelle:
500par lot - chaque ligne facture affiche:
Quantity = quantite reelle du lot + padding du lotInc. padding = padding du lot
2) Saisie et stockage
Wizard lot.invoice
- Champ:
sale_padding - Label UI:
Global padding - Visible uniquement pour:
type = saleaction = prov
Au clic Invoice, le wizard:
- prend le padding global saisi
- le repartit egalement entre les lots selectionnes
- ecrit la part de chaque lot dans
lot.sale_invoice_padding - lance la creation de la facture provisoire vente
lot.lot
- Champ:
sale_invoice_padding - Label UI:
Sale invoice padding - Mode UI: readonly
- Role: memoire durable de la part de padding appliquee au lot.
Ce champ est la source de verite fonctionnelle pour:
- afficher le padding sur la facture
- exclure le padding du calcul de delta de la facture finale
- calculer les ecritures comptables specifiques au padding
account.invoice.line
- Champ fonctionnel:
included_padding - Label UI:
Inc. padding - Unite affichee: meme unite que
Quantity - Role: afficher
line.lot.sale_invoice_paddingsur la ligne facture.
La valeur n'est pas stockee sur la ligne facture. Elle lit le padding depuis le lot pour eviter une deuxieme source de verite.
3) Impact sur la facture provisoire
Lors de la creation des lignes de facture vente provisoire:
- seules les lignes positives
out/Pro formasont impactees invoice_line.quantityest augmente delot.sale_invoice_padding- le montant de ligne augmente naturellement car Tryton calcule:
quantity * unit_price
Consequence:
- le move principal de facture contient deja le chiffre d'affaires augmente par le padding
Inc. paddingrend visible la part artificielle incluse dans la quantite- le lot garde sa quantite physique reelle
4) Impact sur la facture finale
La facture finale doit comparer la quantite physique finale avec la quantite reelle deja facturee en provisoire, pas avec la quantite provisoire augmentee du padding.
Regle:
- quantite provisoire reelle =
lot.sale_invoice_line_prov.quantity - lot.sale_invoice_padding - delta final =
lot.quantite_physique_courante - quantite_provisoire_reelle
Exemple:
- lot initial:
993 - padding provisoire:
100 - facture provisoire:
1093 - apres weighing:
1080 - delta final attendu:
1080 - 993 = 87
Sans cette correction, le wizard comparerait 1080 a 1093 et proposerait
-13, ce qui est faux car le padding ne doit pas etre considere comme une
quantite physique deja facturee.
5) Configuration comptable
Deux comptes par defaut sont ajoutes dans Financial / Configuration, dans une
section dediee Padding placee avant la section Invoice.
Champs:
Default Sale Padding- champ technique:
default_sale_padding_account - compte metier attendu:
80021 - nature attendue: revenu
- champ technique:
Default Accrual Padding- champ technique:
default_accrual_padding_account - compte metier attendu:
42021 - nature attendue: bilan / accrual
- champ technique:
Les champs suivent le pattern Tryton de account.configuration:
- champ
MultiValuesuraccount.configuration - stockage dans
account.configuration.default_account - domaine par compagnie via le contexte
company
6) Ecriture padding a la validation d'une provisoire
Point d'entree:
account.invoice.validate_invoice- puis
invoice.do_lot_invoicing() - surcharge
purchase_trade.invoice.Invoice.do_lot_invoicing
Condition:
- facture client:
invoice.type = out - reference facture:
Provisional - ligne facture:
description = Pro forma - ligne rattachee a un lot
lot.sale_invoice_padding > 0
Montant:
padding_amount = lot.sale_invoice_padding * invoice_line.unit_price- devise: devise de la facture provisoire
- montant societe: converti avec la devise, le taux et la date de la facture provisoire
Ecriture creee en additional_move:
- description:
Sale padding accrual - debit:
Default Sale Padding(80021) - credit:
Default Accrual Padding(42021) origindes lignes: ligne de facture provisoirelotdes lignes: lot concernepartyrenseigne si le compte le requiert
Raison du additional_move:
- ne pas modifier la construction standard du move principal de facture
- isoler l'ecriture padding pour audit et lettrage metier
- permettre le posting coordonne avec la facture
7) Ecriture inverse a la finale
La finale doit extourner exactement le padding comptabilise sur la provisoire. Elle ne doit pas recalculer le montant avec le prix final.
Source du montant:
- le lot porte deja le lien vers la ligne provisoire:
lot.sale_invoice_line_prov
- le montant d'extourne utilise:
lot.sale_invoice_paddinglot.sale_invoice_line_prov.unit_price- la devise, la date et le taux de la facture provisoire
Condition:
- facture client:
invoice.type = out - reference facture:
Final - ligne facture:
description = Final - lot avec
sale_invoice_padding > 0 - lot avec
sale_invoice_line_prov
Ecriture creee en additional_move:
- description:
Sale padding reversal - debit:
Default Accrual Padding(42021) - credit:
Default Sale Padding(80021) - montant: identique au montant padding de la provisoire
origindes lignes: ligne de facture provisoirelotdes lignes: lot concerne
8) Posting
Au Validate:
- le move principal de facture est cree
- le ou les
additional_movespadding sont crees en draft
Au Post:
- les
additional_movespadding deja crees en draft sont postes - si une facture est postee directement depuis draft, le module cree d'abord les moves padding manquants puis les poste
Une detection par description evite de recreer deux fois le meme move padding sur la meme facture:
Sale padding accrualSale padding reversal
9) Invariants a preserver
- Le padding est uniquement pour les factures provisoires cote vente.
- Le padding ne modifie jamais la quantite physique du lot.
lot.sale_invoice_paddingreste la memoire fonctionnelle du padding.- La facture affiche toujours l'ecart via
Inc. padding. - La facture finale ignore le padding pour calculer le delta de quantite.
- L'extourne finale reprend le montant de la provisoire, pas le prix final.
- Les ecritures padding doivent rester rattachees au lot.
10) Points de vigilance
- Le sens debit/credit actuellement implemente est:
- provisoire: debit
80021, credit42021 - finale: debit
42021, credit80021Ce sens doit etre valide par la comptabilite si le plan attendu impose une convention differente.
- provisoire: debit
- La detection du type de facture s'appuie sur
invoice.reference:ProvisionalFinal
- La detection des lignes s'appuie sur
invoice_line.description:Pro formaFinal
- Si ces libelles changent, la logique padding doit etre ajustee.
- Les tests unitaires complets n'ont pas pu etre lances dans l'environnement
local actuel a cause de dependances manquantes (
pytest, puisjwt).
11) Validations techniques de session
Validations effectuees localement:
- compilation Python ciblee des fichiers touches
- validation XML ciblee des vues et definitions modifiees
git diff --checksans erreur bloquante, avec seulement des alertes CRLF existantes dans le repository