Bug pnl fee

This commit is contained in:
2026-05-14 14:31:23 +02:00
parent 82a30f246d
commit 20a4e20e91
8 changed files with 603 additions and 36 deletions

View File

@@ -19,7 +19,7 @@ Statut: `migration partielle`
</li>
<li style="margin:0.38rem 0;">Fees, freight, lots effectifs, <code>% rate</code>: <a href="fees.md">fees.md</a>
</li>
<li style="margin:0.38rem 0;">Valuation, PnL, MTM, derivatives: <a href="valuation-pnl-mtm.md">valuation-pnl-mtm.md</a>
<li style="margin:0.38rem 0;">Valuation, PnL, MTM, derivatives: <a href="valuation-pnl-mtm.md">FR</a> / <a href="valuation-pnl-mtm.en.md">EN</a>
</li>
<li style="margin:0.38rem 0;">Factures provisoires/finales, padding: <a href="invoicing.md">invoicing.md</a>
</li>
@@ -78,6 +78,8 @@ Statut: `migration partielle`
</li>
<li style="margin:0.38rem 0;"><code>BR-PT-VAL-003</code>: MTM hors fees.
</li>
<li style="margin:0.38rem 0;"><code>BR-PT-VAL-004</code>: snapshot courant PnL et identite economique.
</li>
<li style="margin:0.38rem 0;"><code>BR-PT-INV-001</code>: padding facture provisoire vente.
</li>
<li style="margin:0.38rem 0;"><code>BR-PT-ACC-001</code>: Validate facture client attribue le numero.

View File

@@ -0,0 +1,132 @@
<!-- Generated from docs_source/business by docs/tools/render_business_docs.py. -->
# Valuation, PnL, MTM
Status: `partial migration`
Language: `en`<br>
Mirror page: [valuation-pnl-mtm.md](valuation-pnl-mtm.md)
## BR-PT-VAL-001 - Valuation covers purchase, sale, and sale-first flows
Source: `BR-PT-004`, `BR-PT-006`, `BR-PT-011`
### Consultant Rule
PnL must exist for purchases and for sales, even when a sale is not yet matched
to a purchase.
### Developer Notes
<ul style="margin:0.65rem 0 1rem 1.1rem; padding-left:1rem; list-style-type:disc;">
<li style="margin:0.38rem 0;">An unmatched <code>sale.line</code> must generate at least <code>sale priced</code>, <code>sale fee</code>, and <code>derivative</code> when applicable.
</li>
<li style="margin:0.38rem 0;">A basis sale with no price detail must still produce a zero line or the economic fallback price according to the applicable rule.
</li>
<li style="margin:0.38rem 0;">Do not arbitrarily attach a single sale when several sales are matched to the same open balance.
</li>
</ul>
## BR-PT-VAL-002 - Valuation references
Source: `BR-PT-005`
### Consultant Rule
The PnL reference must describe the nature of the valued line: purchase or sale,
open or physical.
### Developer Notes
<ul style="margin:0.65rem 0 1rem 1.1rem; padding-left:1rem; list-style-type:disc;">
<li style="margin:0.38rem 0;">Allowed references: <code>Purchase/Open</code>, <code>Purchase/Physic</code>, <code>Sale/Open</code>, <code>Sale/Physic</code>.
</li>
<li style="margin:0.38rem 0;">A virtual lot must not be output with a physical reference.
</li>
</ul>
## BR-PT-VAL-003 - MTM excludes fees
Source: `BR-PT-007`
### Consultant Rule
Mark-to-market applies to prices and derivatives, not to fees.
### Developer Notes
<ul style="margin:0.65rem 0 1rem 1.1rem; padding-left:1rem; list-style-type:disc;">
<li style="margin:0.38rem 0;">MTM is allowed for <code>pur. priced</code>, <code>sale priced</code>, <code>derivative</code>.
</li>
<li style="margin:0.38rem 0;">Fees are outside MTM: <code>pur. fee</code>, <code>sale fee</code>, <code>shipment fee</code>, <code>line fee</code>.
</li>
<li style="margin:0.38rem 0;">For fees: <code>mtm_price</code>, <code>mtm</code>, <code>strategy</code> must stay empty.
</li>
</ul>
## BR-PT-VAL-004 - Current snapshot and economic identity
Source: session `2026-05-14`
### Consultant Rule
`valuation_valuation_line` represents the latest known PnL image.
It is not a history table.
<ul style="margin:0.65rem 0 1rem 1.1rem; padding-left:1rem; list-style-type:disc;">
<li style="margin:0.38rem 0;">A new generation replaces the previous generation for the same economic reality.
</li>
<li style="margin:0.38rem 0;">An unmatched sale owns its own PnL.
</li>
<li style="margin:0.38rem 0;">A matched sale is owned by the linked purchase line.
</li>
<li style="margin:0.38rem 0;">The PnL of a matched sale must not be generated twice: once from the sale side and once from the purchase side.
</li>
</ul>
### Developer Notes
<ul style="margin:0.65rem 0 1rem 1.1rem; padding-left:1rem; list-style-type:disc;">
<li style="margin:0.38rem 0;">Before creating rows in <code>valuation.valuation.line</code>, delete the current snapshot with the same economic identity.
</li>
<li style="margin:0.38rem 0;">Economic identity:
<ul style="margin:0.65rem 0 1rem 1.35rem; padding-left:1rem; list-style-type:circle;">
<li style="margin:0.38rem 0;"><code>sale_line</code> when present, otherwise <code>line</code>;
</li>
<li style="margin:0.38rem 0;"><code>lot</code>;
</li>
<li style="margin:0.38rem 0;"><code>type</code>;
</li>
<li style="margin:0.38rem 0;"><code>reference</code>;
</li>
<li style="margin:0.38rem 0;"><code>counterparty</code>;
</li>
<li style="margin:0.38rem 0;"><code>product</code>;
</li>
<li style="margin:0.38rem 0;"><code>state</code>;
</li>
<li style="margin:0.38rem 0;"><code>strategy</code>.
</li>
</ul>
</li>
<li style="margin:0.38rem 0;">Do not include in the identity:
<ul style="margin:0.65rem 0 1rem 1.35rem; padding-left:1rem; list-style-type:circle;">
<li style="margin:0.38rem 0;"><code>date</code>;
</li>
<li style="margin:0.38rem 0;"><code>price</code>;
</li>
<li style="margin:0.38rem 0;"><code>quantity</code>;
</li>
<li style="margin:0.38rem 0;"><code>amount</code>;
</li>
<li style="margin:0.38rem 0;"><code>mtm_price</code>;
</li>
<li style="margin:0.38rem 0;"><code>mtm</code>.
</li>
</ul>
</li>
<li style="margin:0.38rem 0;">These fields are recalculated results and must be replaced by the latest generation.
</li>
<li style="margin:0.38rem 0;"><code>generate_from_sale_line()</code> does not create a sale snapshot when the <code>sale.line</code> is already matched to a <code>purchase.line</code>; it redirects to the owner purchase line generation.
</li>
</ul>

View File

@@ -4,39 +4,42 @@
Statut: `migration partielle`
Langue: `fr`<br>
Page miroir: [valuation-pnl-mtm.en.md](valuation-pnl-mtm.en.md)
## BR-PT-VAL-001 - La valuation couvre achat, vente et sale-first
Source: `BR-PT-004`, `BR-PT-006`, `BR-PT-011`
### Regle consultant
### Règle consultant
Le PnL doit exister pour les achats et pour les ventes, meme quand une vente
n'est pas encore matchee a un achat.
Le PnL doit exister pour les achats et pour les ventes, même quand une vente
n'est pas encore matchée à un achat.
### Notes developpeur
### Notes développeur
<ul style="margin:0.65rem 0 1rem 1.1rem; padding-left:1rem; list-style-type:disc;">
<li style="margin:0.38rem 0;">Une <code>sale.line</code> non matchee doit generer au minimum <code>sale priced</code>, <code>sale fee</code> et <code>derivative</code> si applicable.
<li style="margin:0.38rem 0;">Une <code>sale.line</code> non matchée doit générer au minimum <code>sale priced</code>, <code>sale fee</code> et <code>derivative</code> si applicable.
</li>
<li style="margin:0.38rem 0;">Une sale basis sans detail de prix doit quand meme produire une ligne a zero ou au prix economique fallback selon la regle applicable.
<li style="margin:0.38rem 0;">Une sale basis sans détail de prix doit quand même produire une ligne à zéro ou au prix économique fallback selon la règle applicable.
</li>
<li style="margin:0.38rem 0;">Ne pas attacher arbitrairement une sale unique si plusieurs sales sont matchees au meme ouvert.
<li style="margin:0.38rem 0;">Ne pas attacher arbitrairement une sale unique si plusieurs sales sont matchées au même ouvert.
</li>
</ul>
## BR-PT-VAL-002 - References de valuation
## BR-PT-VAL-002 - Références de valuation
Source: `BR-PT-005`
### Regle consultant
### Règle consultant
La reference de PnL doit decrire la nature de la ligne valorisee: achat ou
La référence de PnL doit décrire la nature de la ligne valorisée: achat ou
vente, ouverte ou physique.
### Notes developpeur
### Notes développeur
<ul style="margin:0.65rem 0 1rem 1.1rem; padding-left:1rem; list-style-type:disc;">
<li style="margin:0.38rem 0;">References autorisees: <code>Purchase/Open</code>, <code>Purchase/Physic</code>, <code>Sale/Open</code>, <code>Sale/Physic</code>.
<li style="margin:0.38rem 0;">Références autorisées: <code>Purchase/Open</code>, <code>Purchase/Physic</code>, <code>Sale/Open</code>, <code>Sale/Physic</code>.
</li>
<li style="margin:0.38rem 0;">Un lot virtuel ne doit pas sortir avec une reference physique.
</li>
@@ -46,17 +49,84 @@ vente, ouverte ou physique.
Source: `BR-PT-007`
### Regle consultant
### Règle consultant
Le mark-to-market s'applique aux prix et aux derives, pas aux frais.
Le mark-to-market s'applique aux prix et aux dérivés, pas aux frais.
### Notes developpeur
### Notes développeur
<ul style="margin:0.65rem 0 1rem 1.1rem; padding-left:1rem; list-style-type:disc;">
<li style="margin:0.38rem 0;">MTM autorise pour <code>pur. priced</code>, <code>sale priced</code>, <code>derivative</code>.
<li style="margin:0.38rem 0;">MTM autorisé pour <code>pur. priced</code>, <code>sale priced</code>, <code>derivative</code>.
</li>
<li style="margin:0.38rem 0;">Fees hors MTM: <code>pur. fee</code>, <code>sale fee</code>, <code>shipment fee</code>, <code>line fee</code>.
</li>
<li style="margin:0.38rem 0;">Pour les fees: <code>mtm_price</code>, <code>mtm</code>, <code>strategy</code> doivent rester vides.
</li>
</ul>
## BR-PT-VAL-004 - Snapshot courant et identité économique
Source: session `2026-05-14`
### Règle consultant
`valuation_valuation_line` représente la dernière image connue du PnL.
Elle n'est pas un historique.
<ul style="margin:0.65rem 0 1rem 1.1rem; padding-left:1rem; list-style-type:disc;">
<li style="margin:0.38rem 0;">Une nouvelle génération remplace la génération précédente pour la même réalité économique.
</li>
<li style="margin:0.38rem 0;">Une vente non matchée porte son propre PnL.
</li>
<li style="margin:0.38rem 0;">Une vente matchée est portée par la ligne d&#x27;achat liée.
</li>
<li style="margin:0.38rem 0;">Le PnL d&#x27;une vente matchée ne doit pas être généré deux fois: une fois côté vente et une fois côté achat.
</li>
</ul>
### Notes développeur
<ul style="margin:0.65rem 0 1rem 1.1rem; padding-left:1rem; list-style-type:disc;">
<li style="margin:0.38rem 0;">Avant création dans <code>valuation.valuation.line</code>, supprimer le snapshot courant ayant la même identité économique.
</li>
<li style="margin:0.38rem 0;">Identité économique:
<ul style="margin:0.65rem 0 1rem 1.35rem; padding-left:1rem; list-style-type:circle;">
<li style="margin:0.38rem 0;"><code>sale_line</code> si elle existe, sinon <code>line</code>;
</li>
<li style="margin:0.38rem 0;"><code>lot</code>;
</li>
<li style="margin:0.38rem 0;"><code>type</code>;
</li>
<li style="margin:0.38rem 0;"><code>reference</code>;
</li>
<li style="margin:0.38rem 0;"><code>counterparty</code>;
</li>
<li style="margin:0.38rem 0;"><code>product</code>;
</li>
<li style="margin:0.38rem 0;"><code>state</code>;
</li>
<li style="margin:0.38rem 0;"><code>strategy</code>.
</li>
</ul>
</li>
<li style="margin:0.38rem 0;">Ne pas inclure dans l&#x27;identité:
<ul style="margin:0.65rem 0 1rem 1.35rem; padding-left:1rem; list-style-type:circle;">
<li style="margin:0.38rem 0;"><code>date</code>;
</li>
<li style="margin:0.38rem 0;"><code>price</code>;
</li>
<li style="margin:0.38rem 0;"><code>quantity</code>;
</li>
<li style="margin:0.38rem 0;"><code>amount</code>;
</li>
<li style="margin:0.38rem 0;"><code>mtm_price</code>;
</li>
<li style="margin:0.38rem 0;"><code>mtm</code>.
</li>
</ul>
</li>
<li style="margin:0.38rem 0;">Ces champs sont des résultats recalculés et doivent être remplacés par la dernière génération.
</li>
<li style="margin:0.38rem 0;"><code>generate_from_sale_line()</code> ne crée pas de snapshot vente si la <code>sale.line</code> est déjà matchée à une <code>purchase.line</code>; il redirige vers la génération de la ligne d&#x27;achat propriétaire.
</li>
</ul>