diff --git a/modules/purchase_trade/docs/business/invariants.md b/modules/purchase_trade/docs/business/invariants.md index c7c0480..0c4aff7 100644 --- a/modules/purchase_trade/docs/business/invariants.md +++ b/modules/purchase_trade/docs/business/invariants.md @@ -43,7 +43,9 @@ executer.
sum(lots physiques) + lot virtuel = quantity_theorical.
sum(lot.qt non zero) = max(lot virtuel, 0).
+sum(lot.qt non zero) >= max(lot virtuel, 0).
+lot.qt s'arrete a zero, alors que le lot virtuel absorbe toute la quantite physique.
lot.qt a zero sont ignorees par les checks: elles peuvent servir de memoire d'une prevision consommee.
\i modules/purchase_trade/docs/business/sql/fee_quantity_consistency_checks.sql
diff --git a/modules/purchase_trade/docs/business/sql/fee_quantity_consistency_checks.sql b/modules/purchase_trade/docs/business/sql/fee_quantity_consistency_checks.sql
index 65e8a46..a2953e4 100644
--- a/modules/purchase_trade/docs/business/sql/fee_quantity_consistency_checks.sql
+++ b/modules/purchase_trade/docs/business/sql/fee_quantity_consistency_checks.sql
@@ -4,6 +4,9 @@ Read-only diagnostic for fee quantity consistency.
Business rule:
For every fee except Per packing, fee.quantity must equal the sum of the
applicable net/gross quantities of its effective lots.
+ The diagnostic is grouped by fee_id. Purchase/sale references are only
+ displayed to help identify the contracts involved; they must not split the
+ expected quantity.
Effective lots:
- physical lots if at least one physical lot is linked to the fee;
@@ -149,10 +152,20 @@ computed_fees AS (
fee_id,
mode,
fee_quantity,
- purchase_id,
- purchase_number,
- sale_id,
- sale_number,
+ CASE
+ WHEN count(DISTINCT purchase_id) FILTER (WHERE purchase_id IS NOT NULL) = 1
+ THEN min(purchase_id)
+ ELSE NULL
+ END AS purchase_id,
+ string_agg(DISTINCT purchase_number, ', ')
+ FILTER (WHERE purchase_number IS NOT NULL) AS purchase_number,
+ CASE
+ WHEN count(DISTINCT sale_id) FILTER (WHERE sale_id IS NOT NULL) = 1
+ THEN min(sale_id)
+ ELSE NULL
+ END AS sale_id,
+ string_agg(DISTINCT sale_number, ', ')
+ FILTER (WHERE sale_number IS NOT NULL) AS sale_number,
bool_or(selected_qt_state IS NULL) AS has_missing_state,
bool_or(
lot_unit_category IS NULL
@@ -163,8 +176,7 @@ computed_fees AS (
round(sum(computed_quantity)::numeric, 5) AS expected_quantity
FROM computed_lot_quantities
GROUP BY
- fee_id, mode, fee_quantity,
- purchase_id, purchase_number, sale_id, sale_number
+ fee_id, mode, fee_quantity
)
SELECT
'fee_quantity_mismatch' AS check_name,
diff --git a/modules/purchase_trade/docs_source/business/invariants.md b/modules/purchase_trade/docs_source/business/invariants.md
index a38144a..a041652 100644
--- a/modules/purchase_trade/docs_source/business/invariants.md
+++ b/modules/purchase_trade/docs_source/business/invariants.md
@@ -36,8 +36,11 @@ executer.
existants et des `lot.qt` deja matches ou shippes.
- Regle de conservation:
`sum(lots physiques) + lot virtuel = quantity_theorical`.
-- Regle du forecast ouvert:
- `sum(lot.qt non zero) = max(lot virtuel, 0)`.
+- Regle du forecast ouvert minimal:
+ `sum(lot.qt non zero) >= max(lot virtuel, 0)`.
+- Un surplus de forecast ouvert est accepte apres surconsommation physique:
+ `lot.qt` s'arrete a zero, alors que le lot virtuel absorbe toute la quantite
+ physique.
- Les lignes `lot.qt` a zero sont ignorees par les checks: elles peuvent servir
de memoire d'une prevision consommee.
- Le check applicatif est centralise dans
diff --git a/modules/purchase_trade/docs_source/business/sql/README.md b/modules/purchase_trade/docs_source/business/sql/README.md
index b11061a..19645b1 100644
--- a/modules/purchase_trade/docs_source/business/sql/README.md
+++ b/modules/purchase_trade/docs_source/business/sql/README.md
@@ -71,6 +71,11 @@ For every other fee, it recomputes the expected quantity from the effective
- `lot.qt.hist.quantity` for net fees and `lot.qt.hist.gross_quantity` for gross
fees.
+The diagnostic is grouped by `fee_id`. Purchase and sale columns are displayed
+only to help identify related contracts; they do not split the expected
+quantity. This matters for purchase fees whose linked lots may also be matched
+to several sale lines.
+
Run it on a restored test database:
```sql