# 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.