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.
  • 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.
  • diff --git a/modules/purchase_trade/docs/business/sql/README.md b/modules/purchase_trade/docs/business/sql/README.md index 4abfe1d..4b901e9 100644 --- a/modules/purchase_trade/docs/business/sql/README.md +++ b/modules/purchase_trade/docs/business/sql/README.md @@ -89,6 +89,11 @@ For every other fee, it recomputes the expected quantity from the effective +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:
    \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