diff --git a/modules/purchase_trade/docs/business/lots-and-quantities.en.md b/modules/purchase_trade/docs/business/lots-and-quantities.en.md
index 909c4f1..b363a3a 100644
--- a/modules/purchase_trade/docs/business/lots-and-quantities.en.md
+++ b/modules/purchase_trade/docs/business/lots-and-quantities.en.md
@@ -288,8 +288,12 @@ them with Python guards and SQL diagnostics.
The check is performed during Add physical lots. |
+| Matched forecast |
+If lot_qt carries both lot_p and lot_s, the check applies to both purchase and sale sides. |
+
+
| Line excess |
-Confirmable warning in English when the projected physical quantity exceeds the current line tolerance. |
+Confirmable warning in English when the projected physical quantity exceeds the current line tolerance. The message names the blocking side: purchase, sale, or both if both checks are triggered successively. |
| Global envelope |
diff --git a/modules/purchase_trade/docs/business/lots-and-quantities.md b/modules/purchase_trade/docs/business/lots-and-quantities.md
index 0af9dad..fbb4f85 100644
--- a/modules/purchase_trade/docs/business/lots-and-quantities.md
+++ b/modules/purchase_trade/docs/business/lots-and-quantities.md
@@ -287,8 +287,12 @@ puis les sécuriser par des checks Python et des diagnostics SQL.
Le contrôle se fait au moment de Add physical lots. |
+| Forecast matché |
+Si lot_qt porte lot_p et lot_s, le contrôle porte sur les deux côtés achat et vente. |
+
+
| Dépassement ligne |
-Warning confirmable en anglais si la quantité physique projetée dépasse la tolérance courante de la ligne. |
+Warning confirmable en anglais si la quantité physique projetée dépasse la tolérance courante de la ligne. Le message indique le côté bloquant : purchase, sale, ou les deux si les deux checks déclenchent successivement. |
| Enveloppe globale |
diff --git a/modules/purchase_trade/docs_source/business/lots-and-quantities.en.md b/modules/purchase_trade/docs_source/business/lots-and-quantities.en.md
index 5088a9d..b0110d3 100644
--- a/modules/purchase_trade/docs_source/business/lots-and-quantities.en.md
+++ b/modules/purchase_trade/docs_source/business/lots-and-quantities.en.md
@@ -114,7 +114,8 @@ quantity_theorical
| Inheritance | Lines inherit the header tolerance by default. |
| Transport | No independent tolerance per transport. |
| Physical lot addition | The check is performed during `Add physical lots`. |
-| Line excess | Confirmable warning in English when the projected physical quantity exceeds the current line tolerance. |
+| Matched forecast | If `lot_qt` carries both `lot_p` and `lot_s`, the check applies to both purchase and sale sides. |
+| Line excess | Confirmable warning in English when the projected physical quantity exceeds the current line tolerance. The message names the blocking side: `purchase`, `sale`, or both if both checks are triggered successively. |
| Global envelope | A line excess is accepted after confirmation and consumes the contract-level envelope. |
| Remaining tolerance | Contract lines are recalculated with `inherit_tol = False`. |
| Over-execution | A line exceeding the header tolerance keeps a `+` tolerance at least equal to its actual excess. |
diff --git a/modules/purchase_trade/docs_source/business/lots-and-quantities.md b/modules/purchase_trade/docs_source/business/lots-and-quantities.md
index 4ba5d14..e54c573 100644
--- a/modules/purchase_trade/docs_source/business/lots-and-quantities.md
+++ b/modules/purchase_trade/docs_source/business/lots-and-quantities.md
@@ -113,7 +113,8 @@ quantity_theorical
| Héritage | Les lignes héritent de la tolérance header par défaut. |
| Transport | Pas de tolérance indépendante par transport. |
| Ajout physique | Le contrôle se fait au moment de `Add physical lots`. |
-| Dépassement ligne | Warning confirmable en anglais si la quantité physique projetée dépasse la tolérance courante de la ligne. |
+| Forecast matché | Si `lot_qt` porte `lot_p` et `lot_s`, le contrôle porte sur les deux côtés achat et vente. |
+| Dépassement ligne | Warning confirmable en anglais si la quantité physique projetée dépasse la tolérance courante de la ligne. Le message indique le côté bloquant : `purchase`, `sale`, ou les deux si les deux checks déclenchent successivement. |
| Enveloppe globale | Le dépassement ponctuel d'une ligne est accepté après confirmation et consomme l'enveloppe globale du contrat. |
| Tolérance restante | Les lignes du contrat sont recalculées avec `inherit_tol = False`. |
| Surconsommation | Une ligne qui dépasse la tolérance header garde une tolérance `+` au moins égale à son dépassement réel. |
diff --git a/modules/purchase_trade/lot.py b/modules/purchase_trade/lot.py
index fd9c1be..1e956fa 100755
--- a/modules/purchase_trade/lot.py
+++ b/modules/purchase_trade/lot.py
@@ -1420,14 +1420,25 @@ class LotQt(
if Warning.check(warning_name):
over_percent = (
(projected - theoretical) / theoretical * Decimal(100))
+ side = 'purchase'
+ contract = getattr(line, 'purchase', None)
+ if getattr(line, 'sale', None):
+ side = 'sale'
+ contract = line.sale
+ contract_number = getattr(contract, 'number', None) or getattr(
+ contract, 'id', None)
raise LotToleranceWarning(
warning_name,
"The physical lot quantity exceeds the current tolerance "
- "for this line (projected quantity: %s, maximum with "
- "current tolerance: %s, projected tolerance: %s%%). "
+ "on the %s side (contract: %s, line: %s, projected "
+ "quantity: %s, maximum with current tolerance: %s, "
+ "projected tolerance: %s%%). "
"Do you want to continue and consume the contract "
"tolerance envelope?"
% (
+ side,
+ contract_number,
+ getattr(line, 'id', None),
round(projected, 5),
round(max_quantity, 5),
round(over_percent, 2),