# Valuation, PnL, MTM
Status: `partial migration`
Language: `en`
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
- An unmatched
sale.line must generate at least sale priced, sale fee, and derivative when 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, strategy must 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_line when present, otherwise line;
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 the sale.line is already matched to a purchase.line; it redirects to the owner purchase line generation.