5.7 KiB
5.7 KiB
Business Rules - Purchase Trade
Statut: draft
Version: v0.2
Derniere mise a jour: 2026-03-27
Owner metier: a completer
Owner technique: a completer
1) Scope
- Domaine:
purchase_trade - Hors scope:
- Modules impactes:
purchase_tradelot
2) Glossaire
Purchase Line: ligne d'achat.quantity_theorical: quantite theorique contractuelle de la ligne.Virtual Lot: lot unique de typevirtualrattache a unepurchase.line.lot.qt: table des quantites ouvertes, matchées ou shippées par lot.lot.qt ouvert: enregistrementlot.qtaveclot_p = virtual lot,lot_s = Noneet sans shipment.
3) Regles metier
BR-PT-001 - Ajustement de la quantite theorique apres creation du contrat
- Intent: conserver la coherence entre la quantite theorique de la ligne d'achat, le lot virtuel associe et les quantites ouvertes stockees dans
lot.qt. - Description:
- Quand
purchase.line.quantity_theoricalest modifiee apres creation du contrat, le systeme doit recalculer le delta entre l'ancienne et la nouvelle valeur. - La regle s'applique au lot unique de type
virtualrattache a lapurchase.line.
- Quand
- Conditions d'entree:
- Une
purchase.lineexiste deja. - Son champ
quantity_theoricalest modifie viawrite. - Un lot
virtualest rattache a la ligne.
- Une
- Resultat attendu:
- Si
delta > 0:- augmenter la quantite courante du lot
virtualviaset_current_quantitypour conserver l'historiquelot.qt.hist - augmenter le
lot.qtouvert existant - si aucun
lot.qtouvert n'existe, en creer un nouveau avec le delta
- augmenter la quantite courante du lot
- Si
delta < 0:- diminuer le
lot.qtouvert uniquement si la quantite ouverte disponible est suffisante - diminuer la quantite courante du lot
virtualdu meme delta - si aucun
lot.qtouvert n'existe ou si sa quantite est insuffisante, bloquer avec l'erreurPlease unlink or unmatch lot
- diminuer le
- Si
- Definition du
lot.qtouvert:lot_p = virtual lotlot_s = Nonelot_shipment_in = Nonelot_shipment_internal = Nonelot_shipment_out = None
- Exceptions:
- si aucun lot
virtualn'est trouve sur la ligne, la regle ne fait rien
- si aucun lot
- Priorite:
bloquante
- Source:
Decision metier documentee dans les commentaires de purchase_trade.purchase.Line.write
BR-PT-002 - Le lot physique est le pont metier entre purchase, sale et shipment
- Intent: disposer d'un chemin unique et stable pour retrouver les informations logistiques et de facturation reliees a un contrat d'achat ou de vente.
- Description:
- Le lot physique (
lot_type = physic) porte simultanement le lien vers:- la
purchase.linevialot.line - la
sale.linevialot.sale_line - le shipment via
lot.lot_shipment_in/lot.lot_shipment_internal/lot.lot_shipment_out
- la
- Pour toute logique qui doit naviguer entre achat, vente, shipment et facture, il faut privilegier ce lot physique comme source de verite.
- Le lot physique (
- Resultat attendu:
- depuis une facture d'achat:
- remonter a la
purchase.line - puis au lot physique de la ligne
- puis au shipment et aux donnees logistiques associees
- remonter a la
- depuis une facture de vente:
- remonter a la
sale.line - puis au lot physique matchant qui porte aussi la
purchase.line - puis au shipment et aux donnees logistiques associees
- remonter a la
- depuis une facture d'achat:
- Cas d'usage typiques:
- recuperer
bl_date,bl_number,controller,from_location,to_location - retrouver une facture provisoire liee au lot
- retrouver des fees rattaches au shipment
- recuperer
- Priorite:
structurante
BR-PT-003 - Le freight amount des templates facture vient du fee de shipment
- Intent: afficher dans les documents facture la vraie valeur de fret maritime rattachee au shipment du lot physique.
- Description:
- Le
FREIGHT VALUEd'une facture ne doit pas etre pris sur la facture elle-meme. - Il doit etre calcule a partir du
fee.feerattache au shipment (shipment_in) du lot physique relie a la facture.
- Le
- Regle de navigation:
- retrouver le lot physique pertinent depuis la facture
- retrouver son shipment
- chercher le
fee.feeavec:shipment_in = shipment.idproduct.name = 'Maritime freight'
- utiliser
fee.get_amount()comme montant de fret
- Portee:
- s'applique aussi bien aux factures d'achat qu'aux factures de vente
- cote vente, la remontee doit passer par le lot physique qui fait le lien entre
purchase.lineetsale.line
- Priorite:
importante
4) Exemples concrets
Exemple E1 - Augmentation simple
- Donnees:
ancienne quantity_theorical = 100nouvelle quantity_theorical = 120lot.qt ouvert = 40
- Attendu:
- lot
virtualaugmente de20 lot.qt ouvertpasse de40a60
- lot
Exemple E2 - Augmentation sans lot.qt ouvert
- Donnees:
ancienne quantity_theorical = 100nouvelle quantity_theorical = 110- aucun
lot.qtouvert
- Attendu:
- lot
virtualaugmente de10 - creation d'un
lot.qtouvert a10
- lot
Exemple E3 - Diminution possible
- Donnees:
ancienne quantity_theorical = 100nouvelle quantity_theorical = 90lot.qt ouvert = 25
- Attendu:
- lot
virtualdiminue de10 lot.qt ouvertpasse de25a15
- lot
Exemple E4 - Diminution impossible
- Donnees:
ancienne quantity_theorical = 100nouvelle quantity_theorical = 80lot.qt ouvert = 5
- Attendu:
- blocage avec
Please unlink or unmatch lot
- blocage avec
5) Impact code attendu
- Fichiers Python concernes:
modules/purchase_trade/purchase.pymodules/purchase_trade/lot.py
6) Strategie de tests
Pour cette regle, couvrir au minimum:
- augmentation avec
lot.qtouvert existant - augmentation sans
lot.qtouvert - diminution possible
- diminution impossible avec erreur