# 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

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