From 984b2ba56fbb2956a89fa20ecc12e3d4814c902c Mon Sep 17 00:00:00 2001 From: laurentbarontini Date: Fri, 27 Mar 2026 14:08:07 +0100 Subject: [PATCH] 27.03.26 --- AGENTS.md | 2 + modules/purchase_trade/dashboard.py | 2 +- modules/purchase_trade/docs/business-rules.md | 48 ++++++++++++++++++- modules/purchase_trade/docs/template-rules.md | 36 ++++++++++++-- 4 files changed, 81 insertions(+), 7 deletions(-) diff --git a/AGENTS.md b/AGENTS.md index 9a9fb60..e1af654 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -45,6 +45,8 @@ Guide rapide pour les agents qui codent dans ce repository. - Si un document facture depend fortement d'une vente/achat, ajouter au besoin un petit pont Python pour exposer des `report_*` stables au template. - Si plusieurs actions de report pointent vers `report_name = 'account.invoice'`, verifier aussi le cache `invoice_report_cache` dans `modules/account_invoice/invoice.py`: un mauvais cache peut faire croire que plusieurs actions utilisent le meme `.fodt`. - Avant de conclure qu'un template ou une action est faux, verifier si le report alternatif doit bypasser le cache standard. + - Dans `purchase_trade`, pour remonter d'une facture vers shipment, pro forma, freight ou autres donnees logistiques, privilegier le lot physique comme pont entre `purchase.line`, `sale.line` et shipment. + - Pour `FREIGHT VALUE`, ne pas lire un champ direct sur la facture: retrouver le fee de shipment (`shipment_in`) dont le produit est `Maritime freight`, puis utiliser `fee.get_amount()`. ## 5) Workflow de modification (obligatoire) diff --git a/modules/purchase_trade/dashboard.py b/modules/purchase_trade/dashboard.py index 3afdcb5..ef97d8c 100755 --- a/modules/purchase_trade/dashboard.py +++ b/modules/purchase_trade/dashboard.py @@ -515,7 +515,7 @@ class Dashboard(ModelSQL, ModelView): '
🎬 Available Demo
' ] - demos = Demos.search([('active', '=', True)]) + demos = Demos.search([('active', '=', True)],order=[('id', 'DESC')]) for n in demos: icon = n.icon or "📰" category = n.category or "General" diff --git a/modules/purchase_trade/docs/business-rules.md b/modules/purchase_trade/docs/business-rules.md index 9540064..3095758 100644 --- a/modules/purchase_trade/docs/business-rules.md +++ b/modules/purchase_trade/docs/business-rules.md @@ -1,8 +1,8 @@ # Business Rules - Purchase Trade Statut: `draft` -Version: `v0.1` -Derniere mise a jour: `2026-03-25` +Version: `v0.2` +Derniere mise a jour: `2026-03-27` Owner metier: `a completer` Owner technique: `a completer` @@ -56,6 +56,50 @@ Owner technique: `a completer` - 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.line` via `lot.line` + - la `sale.line` via `lot.sale_line` + - le shipment via `lot.lot_shipment_in` / `lot.lot_shipment_internal` / `lot.lot_shipment_out` + - Pour toute logique qui doit naviguer entre achat, vente, shipment et facture, il faut privilegier ce lot physique comme source de verite. +- 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 + - 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 +- 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 +- 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 VALUE` d'une facture ne doit pas etre pris sur la facture elle-meme. + - Il doit etre calcule a partir du `fee.fee` rattache au shipment (`shipment_in`) du lot physique relie a la facture. +- Regle de navigation: + - retrouver le lot physique pertinent depuis la facture + - retrouver son shipment + - chercher le `fee.fee` avec: + - `shipment_in = shipment.id` + - `product.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.line` et `sale.line` +- Priorite: + - `importante` + ## 4) Exemples concrets ### Exemple E1 - Augmentation simple diff --git a/modules/purchase_trade/docs/template-rules.md b/modules/purchase_trade/docs/template-rules.md index 04ec891..7fbd8f4 100644 --- a/modules/purchase_trade/docs/template-rules.md +++ b/modules/purchase_trade/docs/template-rules.md @@ -1,8 +1,8 @@ # Template Rules - Purchase Trade Statut: `draft` -Version: `v0.1` -Derniere mise a jour: `2026-03-26` +Version: `v0.2` +Derniere mise a jour: `2026-03-27` ## 1) Scope @@ -93,6 +93,33 @@ Derniere mise a jour: `2026-03-26` - pour un report alternatif, ne pas reutiliser le cache du report standard `account_invoice/invoice.fodt` - si besoin, bypasser la lecture/ecriture du cache pour les templates alternatifs +### TR-007 - Pour une facture trade, privilegier le lot physique comme chemin de navigation + +- Pour remonter d'une facture vers des donnees logistiques ou metier, ne pas dupliquer de chemins differents selon achat/vente. +- Regle pratique: + - partir de la ligne metier (`purchase.line` ou `sale.line`) + - retrouver le lot physique associe + - utiliser ce lot comme pont vers le shipment et les autres objets lies +- Ce chemin doit etre privilegie pour exposer des proprietes `report_*` comme: + - `report_bl_date` + - `report_loading_port` + - `report_discharge_port` + - `report_controller_name` + - `report_si_number` + - `report_proforma_invoice_number` + - `report_proforma_invoice_date` + +### TR-008 - Le freight amount d'un template facture vient du fee de shipment + +- Ne pas lire le fret directement sur `account.invoice`. +- Pour les templates `invoice_ict*`, le `FREIGHT VALUE` doit etre expose par une propriete Python du type `invoice.report_freight_amount`. +- La logique attendue est: + - retrouver le lot physique pertinent + - retrouver son shipment + - chercher le `fee.fee` du shipment avec `product.name = 'Maritime freight'` + - utiliser `fee.get_amount()` +- Si le fee a sa propre devise, preferer aussi exposer le symbole de devise depuis le fee plutot que depuis la facture. + ## 4) Workflow recommande pour corriger un template en erreur 1. Identifier le placeholder exact qui provoque l'erreur Relatorio. @@ -110,8 +137,9 @@ Derniere mise a jour: `2026-03-26` - Fichier: `modules/account_invoice/invoice_ict.fodt` - Strategie retenue: - aligner la syntaxe sur `modules/account_invoice/invoice.fodt` - - reutiliser au maximum les proprietes de `sale.sale` - - exposer dans `modules/purchase_trade/invoice.py` des proprietes de pont `account.invoice -> sale` + - reutiliser au maximum les proprietes metier deja exposees + - exposer dans `modules/purchase_trade/invoice.py` des proprietes de pont `account.invoice -> sale/purchase` + - pour les donnees shipment et freight, passer par le lot physique comme pont achat/vente ### Sale ICT