Files
tradon/modules/purchase_trade/docs_source/business/pricing.md
2026-06-11 10:49:05 +02:00

215 lines
9.0 KiB
Markdown

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