107 lines
2.9 KiB
Markdown
107 lines
2.9 KiB
Markdown
# BR-PT-001 - Ajustement de la quantite theorique apres creation du contrat
|
|
|
|
## Intent
|
|
|
|
Conserver la coherence entre la quantite theorique de la ligne d'achat, le lot virtuel associe et les quantites ouvertes stockees dans `lot.qt`.
|
|
|
|
## Scope
|
|
|
|
- Domaine: `purchase_trade`
|
|
- Flux: modification de `purchase.line.quantity_theorical` apres creation du contrat
|
|
- Priorite: `bloquante`
|
|
|
|
## Inputs
|
|
|
|
- Une `purchase.line` existe deja.
|
|
- Son champ `quantity_theorical` est modifie via `write`.
|
|
- Un lot unique de type `virtual` est rattache a la ligne.
|
|
|
|
## Expected Behavior
|
|
|
|
Quand `purchase.line.quantity_theorical` est modifiee apres creation du contrat, le systeme doit recalculer le delta entre l'ancienne et la nouvelle valeur.
|
|
|
|
La regle s'applique au lot unique de type `virtual` rattache a la `purchase.line`.
|
|
|
|
Si `delta > 0`:
|
|
|
|
- augmenter la quantite courante du lot `virtual` via `set_current_quantity` pour conserver l'historique `lot.qt.hist`
|
|
- augmenter le `lot.qt` ouvert existant
|
|
- si aucun `lot.qt` ouvert n'existe, en creer un nouveau avec le delta
|
|
|
|
Si `delta < 0`:
|
|
|
|
- diminuer le `lot.qt` ouvert uniquement si la quantite ouverte disponible est suffisante
|
|
- diminuer la quantite courante du lot `virtual` du meme delta
|
|
- si aucun `lot.qt` ouvert n'existe ou si sa quantite est insuffisante, bloquer avec l'erreur `Please unlink or unmatch lot`
|
|
|
|
Definition du `lot.qt` ouvert:
|
|
|
|
- `lot_p = virtual lot`
|
|
- `lot_s = None`
|
|
- `lot_shipment_in = None`
|
|
- `lot_shipment_internal = None`
|
|
- `lot_shipment_out = None`
|
|
|
|
## Edge Cases
|
|
|
|
- Si aucun lot `virtual` n'est trouve sur la ligne, la regle ne fait rien.
|
|
|
|
## Examples
|
|
|
|
### Exemple E1 - Augmentation simple
|
|
|
|
- Donnees:
|
|
- `ancienne quantity_theorical = 100`
|
|
- `nouvelle quantity_theorical = 120`
|
|
- `lot.qt ouvert = 40`
|
|
- Attendu:
|
|
- lot `virtual` augmente de `20`
|
|
- `lot.qt ouvert` passe de `40` a `60`
|
|
|
|
### Exemple E2 - Augmentation sans lot.qt ouvert
|
|
|
|
- Donnees:
|
|
- `ancienne quantity_theorical = 100`
|
|
- `nouvelle quantity_theorical = 110`
|
|
- aucun `lot.qt` ouvert
|
|
- Attendu:
|
|
- lot `virtual` augmente de `10`
|
|
- creation d'un `lot.qt` ouvert a `10`
|
|
|
|
### Exemple E3 - Diminution possible
|
|
|
|
- Donnees:
|
|
- `ancienne quantity_theorical = 100`
|
|
- `nouvelle quantity_theorical = 90`
|
|
- `lot.qt ouvert = 25`
|
|
- Attendu:
|
|
- lot `virtual` diminue de `10`
|
|
- `lot.qt ouvert` passe de `25` a `15`
|
|
|
|
### Exemple E4 - Diminution impossible
|
|
|
|
- Donnees:
|
|
- `ancienne quantity_theorical = 100`
|
|
- `nouvelle quantity_theorical = 80`
|
|
- `lot.qt ouvert = 5`
|
|
- Attendu:
|
|
- blocage avec `Please unlink or unmatch lot`
|
|
|
|
## Impacted Files
|
|
|
|
- `modules/purchase_trade/purchase.py`
|
|
- `modules/purchase_trade/lot.py`
|
|
|
|
## Tests
|
|
|
|
Couvrir au minimum:
|
|
|
|
- augmentation avec `lot.qt` ouvert existant
|
|
- augmentation sans `lot.qt` ouvert
|
|
- diminution possible
|
|
- diminution impossible avec erreur
|
|
|
|
## Source
|
|
|
|
- Decision metier documentee dans les commentaires de `purchase_trade.purchase.Line.write`.
|