# Pricing, basis et fixing

Langue : `fr`
Statut : `migration partielle`
Derniere verification code : `2026-05-25`

Cette page consolide les regles de pricing trade autour des composants, des
periodes de prix, des periodes d'application, du fixing manuel et du prix final
des lignes achat / vente.

## A retenir

> **Resume operationnel**
> Une ligne trade peut etre en prix fixe, basis ou EFP. En basis, le prix de
> base vient d'un ou plusieurs composants de fixing. Chaque composant lit une
> courbe de prix, construit des dates de prix, applique ces prix sur des dates
> d'application, puis alimente le prix de la ligne via un summary.

| Sujet | Regle courte |
| --- | --- |
| Composant | Un `pricing.component` appartient a une ligne achat ou vente. |
| Courbe | La courbe principale est `price_index`. |
| Matrix | Une matrix peut alimenter un composant de fixing, avec ligne generique ou conditions. |
| Pricing period | Definit les dates ou lire les prix sur la courbe. |
| Application period | Definit les dates ou appliquer les tranches de fixing. |
| AVG | Utilise la moyenne progressive des prix lus. |
| LAST | Autorise la courbe a reprendre le dernier prix connu si la date n'a pas de prix. |
| Pricing rows | Les lignes `pricing.pricing` portent quantite fixee, non fixee et prix EOD. |
| Summary | Le summary remonte la derniere ligne de pricing du groupe. |
| Prix ligne | En `basis`, `unit_price` est le prix base hors premium. |

```text
pricing.component
        |
        v
pricing.trigger
        |
        +--> pricing period      --> dates de lecture curve
        |
        +--> application period  --> dates de fixing
                                      |
                                      v
                               pricing.pricing
                                      |
                                      v
                          purchase/sale pricing summary
                                      |
                                      v
                              line.unit_price
```

## Regles consultant

### BR-PT-PRI-001 - Le premium fait partie du prix economique

Source: `BR-PT-008`

| Point | Regle |
| --- | --- |
| Prix visible | `unit_price` reste le prix de base hors premium. |
| Prix economique | Le montant utilise `unit_price + premium`. |
| Basis | Le premium s'ajoute aussi quand le prix base vient du fixing. |
| Documents commerciaux | Une ligne `basis` peut afficher le premium comme prix visible selon le contexte document. |
| Valuation | Le premium doit etre pris en compte dans les lignes valorisees. |

> **Point cle**
> Le premium n'est pas un composant de fixing. Il reste porte par la ligne
> commerciale, mais il fait partie du prix economique utilise pour les montants.

### BR-PT-PRI-002 - Linked currency

Source: `BR-PT-009` et `BR-PT-010`

| Point | Regle |
| --- | --- |
| Activation | `linked_price`, `linked_currency` et `linked_unit` deviennent obligatoires. |
| Saisie | Le prix et le premium peuvent etre saisis dans le repere lie. |
| Conversion | Les calculs internes convertissent vers la devise / unite de la ligne. |
| Basis | En `basis + linked currency`, `linked_price` represente le basis brut hors premium. |
| Amount | Le montant ajoute le premium converti. |

### BR-PT-PRI-003 - Pricing manuel

Source: `BR-PT-016` et doublon historique `BR-PT-015`

| Colonne | Role |
| --- | --- |
| `pricing_date` | Date de saisie du fixing. |
| `quantity` | Quantite fixee ce jour. |
| `settl_price` | Prix de marche saisi. |
| `fixed_qt` | Cumul des quantites fixees. |
| `fixed_qt_price` | Prix moyen pondere du cumul fixe. |
| `unfixed_qt` | Solde restant a fixer. |
| `unfixed_qt_price` | Dernier prix disponible de la courbe du composant pour le solde non fixe, avec fallback sur `settl_price` si aucune courbe exploitable n'est disponible. |
| `eod_price` | Prix economique courant de la ligne de fixing. |
| `last` | Derniere ligne du groupe, utilisee par le summary. |

> **Saisie utilisateur**
> En manuel, l'utilisateur renseigne seulement `quantity` et `settl_price`.
> Les cumuls, le prix moyen, le solde non fixe et `last` sont recalcules par le
> systeme.

### BR-PT-PRI-004 - Pricing automatique par composant

| Etape | Effet metier |
| --- | --- |
| Composant | L'utilisateur choisit une courbe, un calendrier et active `Auto`. |
| Source curve | Le systeme lit les prix depuis `price_index`. |
| Source matrix | Le systeme lit les prix depuis `price_matrix.line`. |
| Trigger | L'utilisateur definit une periode de prix et une periode d'application. |
| Lecture prix | Le systeme lit les prix de la courbe sur les dates de pricing. |
| Application | Le systeme cree une ligne de pricing par date d'application. |
| Quota | La quantite fixee par date correspond a la quantite de ligne divisee par le nombre de dates d'application. |
| Moyenne | Si `AVG` est coche, le prix fixe utilise la moyenne progressive. |
| Fallback prix | Si `LAST` est coche, la courbe peut reprendre le dernier prix disponible. |
| Cut-off | `Pricing date max` arrete la generation apres cette date. |
| Ratio negatif | Un ratio `-100%` soustrait le composant du prix basis. |

```text
Prix lus:        P1   P2   P3   P4
Application:     A1   A2   A3   A4
Quantite fixee:  Q/4  Q/4  Q/4  Q/4
Summary:         derniere ligne marquee last
```

### BR-PT-PRI-005 - Mode From / To manuel

| Cas | Regle |
| --- | --- |
| Pas de `pricing_period` | L'utilisateur peut saisir `From` / `To` cote pricing. |
| Pas de `application_period` | L'utilisateur peut saisir `From` / `To` cote application. |
| Application vide | Par defaut, l'application reprend la meme fourchette que le pricing manuel. |
| Calendrier present | Les jours fermes du calendrier sont exclus. |
| Calendrier absent | Tous les jours calendaires de la fourchette sont utilises. |
| Lecture curve | Les prix sont lus sur les dates de la fourchette pricing. |
| Application fixing | Les lignes de fixing sont creees sur les dates de la fourchette application. |

> **Exemple simple**
> Pricing `01/04 -> 05/04`, Application vide. Le systeme lit les prix du 1 au
> 5 avril et cree les applications sur ces memes dates, sauf jours exclus par le
> calendrier si un calendrier est renseigne.

### BR-PT-PRI-006 - Matrix de premium ou spread

| Cas | Regle |
| --- | --- |
| Matrix generique | Une ligne matrix sans origin, destination, product ni quality s'applique comme fallback global. |
| Matrix conditionnelle | Une ligne avec origin, destination, product ou quality est prioritaire si elle correspond a la ligne trade. |
| Prix | `price_value` est converti vers l'unite / devise de la ligne si la matrix les renseigne. |
| Validite | `valid_from` et `valid_to` limitent la periode d'utilisation de la matrix. |
| Calendrier | Si le composant n'a pas de calendrier, le calendrier de la matrix est utilise. |
| Soustraction | Pour soustraire un premium, mettre le ratio du composant a `-100%`. |

> **Usage premium simple**
> Creer une matrix avec une ligne sans condition et `price_value = 45`, puis
> ajouter un composant de type `Matrix` sur la ligne trade. Avec un ratio
> `-100%`, ce composant diminue le prix basis de 45 dans le repere de la ligne.

## Section developpeur

### Modeles pivots

- Composant : `pricing.component`
- Trigger : `pricing.trigger`
- Periode relative : `pricing.period`
- Ligne de fixing : `pricing.pricing`
- Summary achat : `purchase.pricing.summary`
- Summary vente : `sale.pricing.summary`
- Ligne achat : `purchase.line`
- Ligne vente : `sale.line`
- Courbe : `price.price`
- Valeur de courbe : `price.price_value`
- Calendrier : `price.calendar`

### Methodes principales

- `pricing.trigger.getPricingListDates()`
- `pricing.trigger.getApplicationListDates()`
- `pricing.trigger.getListDates()`
- `pricing.trigger.getprice()`
- `purchase.line.check_pricing()`
- `sale.line.check_pricing()`
- `purchase.line.generate_pricing()`
- `sale.line.generate_pricing()`
- `pricing.pricing._sync_manual_values()`
- `pricing.pricing._sync_manual_last()`
- `purchase.pricing.summary.table_query()`
- `sale.pricing.summary.table_query()`

### Points d'attention actuels

| Sujet | Etat |
| --- | --- |
| `fallback` composant | Champ present, logique metier encore portee par `trigger.last`. |
| `last` trigger | Signifie dernier prix disponible sur la curve. |
| `last` pricing | Signifie derniere ligne du groupe pour le summary. |
| Matrix | Disponible dans le fixing auto, avec fallback generique et priorite aux lignes conditionnelles. |
| `prDate` / `apPrice` | Variables intermediaires historiques peu exploitees. |
| AVG | Moyenne progressive calculee sur la liste des prix lus. |

## Tests proches

- `modules/purchase_trade/tests/test_module.py`
- Couverture existante :
  - champs manuels readonly / editable ;
  - recalcul du pricing manuel ;
  - unicite logique du `last` par groupe ;
  - fallback `quantity` si `quantity_theorical` est vide ;
  - controle que le composant appartient a la ligne courante.
- Tests a maintenir :
  - From / To manuel sans calendrier ;
  - From / To manuel avec calendrier ;
  - application vide qui reprend la fourchette pricing ;
  - comportement AVG / LAST.
