Valuation, PnL, MTM
Status: partial migration
Language: en
Mirror page: 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
- An unmatched
sale.linemust generate at leastsale priced,sale fee, andderivativewhen applicable. - A basis sale with no price detail must still produce a zero line or the economic fallback price according to the applicable rule.
- Do not arbitrarily attach a single sale when several sales are matched to the same open balance.
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
- Allowed references:
Purchase/Open,Purchase/Physic,Sale/Open,Sale/Physic. - A virtual lot must not be output with a physical reference.
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
- MTM is allowed for
pur. priced,sale priced,derivative. - Fees are outside MTM:
pur. fee,sale fee,shipment fee,line fee. - For fees:
mtm_price,mtm,strategymust stay empty.
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.
- A new generation replaces the previous generation for the same economic reality.
- An unmatched sale owns its own PnL.
- A matched sale is owned by the linked purchase line.
- The PnL of a matched sale must not be generated twice: once from the sale side and once from the purchase side.
Developer Notes
- Before creating rows in
valuation.valuation.line, delete the current snapshot with the same economic identity. - Economic identity:
sale_linewhen present, otherwiseline;lot;type;reference;counterparty;product;state;strategy.
- Do not include in the identity:
date;price;quantity;amount;mtm_price;mtm.
- These fields are recalculated results and must be replaced by the latest generation.
generate_from_sale_line()does not create a sale snapshot when thesale.lineis already matched to apurchase.line; it redirects to the owner purchase line generation.