From 181de17b897e3921bad12c960cfba985690b0b43 Mon Sep 17 00:00:00 2001 From: "AzureAD\\SylvainDUVERNAY" Date: Mon, 25 May 2026 11:17:18 +0200 Subject: [PATCH] Trade Finance + Other changes --- .../Contracts and Costs.xlsx | Bin 0 -> 108835 bytes .../ITSA_Forward_Position_Comparison.xlsx | Bin 0 -> 47657 bytes ...date_vw_bi_itsa_physical_open_costs_v2.sql | 267 ++++++++++ .../update_vw_utility_open_position.sql | 154 ++++++ ...ate_vw_utility_shipment_fee_allocation.sql | 495 ++++++++++++++++++ ...update_vw_utility_trade_pnl_quantities.sql | 382 ++++++++++++++ ...tility_shipment_fee_allocation_current.sql | 361 +++++++++++++ modules/trade_finance/facility.py | 156 +++++- modules/trade_finance/tests/__init__.py | 2 + modules/trade_finance/tests/test_module.py | 117 +++++ modules/trade_finance/view/facility_form.xml | 5 +- .../view/facility_limit_form.xml | 11 +- .../view/facility_limit_tree.xml | 10 +- 13 files changed, 1952 insertions(+), 8 deletions(-) create mode 100644 ITSA/Data Reconciliation/Contracts and Costs.xlsx create mode 100644 ITSA/Data Reconciliation/ITSA_Forward_Position_Comparison.xlsx create mode 100644 ITSA/Data Reconciliation/update_vw_bi_itsa_physical_open_costs_v2.sql create mode 100644 ITSA/Data Reconciliation/update_vw_utility_open_position.sql create mode 100644 ITSA/Data Reconciliation/update_vw_utility_shipment_fee_allocation.sql create mode 100644 ITSA/Data Reconciliation/update_vw_utility_trade_pnl_quantities.sql create mode 100644 ITSA/Data Reconciliation/vw_utility_shipment_fee_allocation_current.sql create mode 100644 modules/trade_finance/tests/__init__.py create mode 100644 modules/trade_finance/tests/test_module.py diff --git a/ITSA/Data Reconciliation/Contracts and Costs.xlsx b/ITSA/Data Reconciliation/Contracts and Costs.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..b2afc11056b8935418a3cd471403cef231e2a68c GIT binary patch literal 108835 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

6vn|7H_(Sg;_KfNDu`auI&1gp7HZ9e`4hxbMb!v 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 Y0H#Yq(Cbg{JQcu@Ao-?;KZhj$0u)DMumAu6 literal 0 HcmV?d00001 diff --git a/ITSA/Data Reconciliation/ITSA_Forward_Position_Comparison.xlsx b/ITSA/Data Reconciliation/ITSA_Forward_Position_Comparison.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..45738d958c3efced5f2579a77b12762ef0673fc7 GIT binary patch literal 47657 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 E0CQJAu>b%7 literal 0 HcmV?d00001 diff --git a/ITSA/Data Reconciliation/update_vw_bi_itsa_physical_open_costs_v2.sql b/ITSA/Data Reconciliation/update_vw_bi_itsa_physical_open_costs_v2.sql new file mode 100644 index 0000000..aa1ed18 --- /dev/null +++ b/ITSA/Data Reconciliation/update_vw_bi_itsa_physical_open_costs_v2.sql @@ -0,0 +1,267 @@ +CREATE OR REPLACE VIEW public.vw_utility_physical_pricing_definition AS +SELECT + 'Purchase'::text AS "strContractType", + pc.line AS "intContractLineId", + pc.id AS "intPricingComponentId", + pc.price_index AS "intPriceCurveId", + vpc."strPriceDescription", + vpc."strPriceIndex", + vpc."strCurrency", + vpc."strUnit", + vpc."strPriceCurveType", + vpc."strPriceArea", + vpc."strPriceCalendar", + vpc."strPricingType", + vpc."dtmPricingStartDate", + vpc."dtmPricingEndDate", + vpc."strPricingMonth" +FROM pricing_component pc +LEFT JOIN vw_utility_price_curve vpc + ON vpc."intPriceCurveId" = pc.price_index +WHERE pc.line IS NOT NULL + +UNION ALL + +SELECT + 'Sale'::text AS "strContractType", + pc.sale_line AS "intContractLineId", + pc.id AS "intPricingComponentId", + pc.price_index AS "intPriceCurveId", + vpc."strPriceDescription", + vpc."strPriceIndex", + vpc."strCurrency", + vpc."strUnit", + vpc."strPriceCurveType", + vpc."strPriceArea", + vpc."strPriceCalendar", + vpc."strPricingType", + vpc."dtmPricingStartDate", + vpc."dtmPricingEndDate", + vpc."strPricingMonth" +FROM pricing_component pc +LEFT JOIN vw_utility_price_curve vpc + ON vpc."intPriceCurveId" = pc.price_index +WHERE pc.sale_line IS NOT NULL; + +CREATE OR REPLACE VIEW public.vw_bi_itsa_physical_open_costs_v2 AS +WITH valuation_info AS ( + SELECT + pvl."intContractId", + pvl."intContractLineId", + pvl."strState", + avg(pvl."dblPrice") AS "avgPrice", + avg(pvl."dblMtmPrice")::numeric(18, 2) AS "avgMtmPrice" + FROM vw_utility_physical_valuation_line pvl + GROUP BY + pvl."intContractId", + pvl."intContractLineId", + pvl."strState" +), +utility_open_quantity AS ( + SELECT + CASE + WHEN uop."strContractSide" = 'purchase'::text THEN 'Purchase'::text + WHEN uop."strContractSide" = 'sale'::text THEN 'Sale'::text + ELSE NULL::text + END AS "TradeType", + uop."intContractLineId" AS "TradeLineId", + sum(uop."dblOpenQuantity")::numeric(18, 3) AS "OpenQuantitySigned" + FROM vw_utility_open_position uop + GROUP BY + CASE + WHEN uop."strContractSide" = 'purchase'::text THEN 'Purchase'::text + WHEN uop."strContractSide" = 'sale'::text THEN 'Sale'::text + ELSE NULL::text + END, + uop."intContractLineId" +), +contract_open_quantity AS ( + SELECT + 'Purchase'::text AS "TradeType", + pc."intPurchaseLineId" AS "TradeLineId", + abs(COALESCE(uop."OpenQuantitySigned", 0::numeric))::numeric(18, 3) AS "OpenQuantity", + COALESCE(uop."OpenQuantitySigned", 0::numeric)::numeric(18, 3) AS "OpenQuantitySigned", + COALESCE(vi."avgMtmPrice", 0::numeric(18, 2)) AS "AvgMtmPrice", + pc."dblTheoriticalQuantity" AS "TheoriticalQuantitySigned" + FROM vw_utility_purchase_physical_contract pc + LEFT JOIN utility_open_quantity uop + ON uop."TradeType" = 'Purchase'::text + AND uop."TradeLineId" = pc."intPurchaseLineId" + LEFT JOIN valuation_info vi + ON pc."intPurchaseLineId" = vi."intContractLineId" + + UNION ALL + + SELECT + 'Sale'::text AS "TradeType", + pc."intSaleLineId" AS "TradeLineId", + abs(COALESCE(uop."OpenQuantitySigned", 0::numeric))::numeric(18, 3) AS "OpenQuantity", + COALESCE(uop."OpenQuantitySigned", 0::numeric)::numeric(18, 3) AS "OpenQuantitySigned", + COALESCE(vi."avgMtmPrice", 0::numeric(18, 2)) AS "AvgMtmPrice", + pc."dblTheoreticalQuantity" * '-1'::integer::numeric AS "TheoriticalQuantitySigned" + FROM vw_utility_sale_physical_contract pc + LEFT JOIN utility_open_quantity uop + ON uop."TradeType" = 'Sale'::text + AND uop."TradeLineId" = pc."intSaleLineId" + LEFT JOIN valuation_info vi + ON pc."intSaleLineId" = vi."intContractLineId" +) +SELECT + 1 AS "Group Order", + 'Price'::text AS "Group Type", + ctr."intPurchaseLineId" AS "intTradeLineId", + CASE + WHEN ctr."strPricingType"::text = 'basis'::text THEN COALESCE(prc."strPriceDescription", 'Basis Price Curve Missing'::character varying) + ELSE 'Fixed Price'::character varying + END AS "Line Description", + pur."dblUnitPrice" AS "Price", + opq."OpenQuantitySigned" AS "Open Quantity Signed", + opq."OpenQuantitySigned" * pur."dblUnitPrice" * '-1'::integer::numeric AS "Open Cost Amount", + 1 AS "intPriceGroupId", + ctr."dtmEstimatedBLDate" AS "Estimated BL Date", + opq."TheoriticalQuantitySigned" AS "Contract Quantity Signed", + 'Price'::text AS "Line Group" +FROM vw_utility_dim_physical_purchase_contract ctr +JOIN vw_utility_purchase_physical_contract pur + ON ctr."intPurchaseLineId" = pur."intPurchaseLineId" +JOIN contract_open_quantity opq + ON ctr."intPurchaseLineId" = opq."TradeLineId" + AND opq."TradeType" = 'Purchase'::text +LEFT JOIN vw_utility_physical_pricing_definition prc + ON prc."strContractType" = 'Purchase'::text + AND prc."intContractLineId" = ctr."intPurchaseLineId" +WHERE + ctr."strPricingType"::text IN ('priced'::text, 'basis'::text) + AND opq."OpenQuantity" <> 0::numeric + +UNION ALL + +SELECT + 2 AS "Group Order", + 'MTM'::text AS "Group Type", + ctr."intPurchaseLineId" AS "intTradeLineId", + mtm."strComponentCurve" AS "Line Description", + opq."AvgMtmPrice" AS "Price", + opq."OpenQuantitySigned" AS "Open Quantity Signed", + opq."OpenQuantitySigned" * opq."AvgMtmPrice" AS "Open Cost Amount", + 3 AS "intPriceGroupId", + ctr."dtmEstimatedBLDate" AS "Estimated BL Date", + opq."TheoriticalQuantitySigned" AS "Contract Quantity Signed", + 'MTM'::text AS "Line Group" +FROM vw_utility_physical_mtm_definition mtm +JOIN vw_utility_dim_physical_purchase_contract ctr + ON mtm."intContractLineId" = ctr."intPurchaseLineId" +JOIN contract_open_quantity opq + ON ctr."intPurchaseLineId" = opq."TradeLineId" + AND opq."TradeType" = 'Purchase'::text +WHERE + mtm."strContractType" = 'Purchase'::text + AND opq."OpenQuantity" <> 0::numeric + +UNION ALL + +SELECT + 3 AS "Group Order", + 'Fee'::text AS "Group Type", + fees."intContractLineId" AS "intTradeLineId", + fees."strProduct" AS "Line Description", + fees."dblPrice" AS "Price", + opq."OpenQuantitySigned" AS "Open Quantity Signed", + CASE + WHEN fees."strPayOrRec"::text = 'pay'::text THEN 1 + ELSE '-1'::integer + END::numeric * opq."OpenQuantity" * fees."dblPrice" * '-1'::integer::numeric AS "Open Cost Amount", + 2 AS "intPriceGroupId", + ctr."dtmEstimatedBLDate" AS "Estimated BL Date", + opq."TheoriticalQuantitySigned" AS "Contract Quantity Signed", + fees."strProductGroup" AS "Line Group" +FROM vw_utility_contract_fees fees +JOIN vw_utility_dim_physical_purchase_contract ctr + ON fees."intContractLineId" = ctr."intPurchaseLineId" +JOIN contract_open_quantity opq + ON ctr."intPurchaseLineId" = opq."TradeLineId" + AND opq."TradeType" = 'Purchase'::text +WHERE + fees."strContractType" = 'Purchase'::text + AND opq."OpenQuantity" <> 0::numeric + +UNION ALL + +SELECT + 1 AS "Group Order", + 'Price'::text AS "Group Type", + ctr."intSaleLineId" AS "intTradeLineId", + CASE + WHEN ctr."strPricingType"::text = 'basis'::text THEN COALESCE(prc."strPriceDescription", 'Basis Price Curve Missing'::character varying) + ELSE 'Fixed Price'::character varying + END AS "Line Description", + sale."dblUnitPrice" AS "Price", + opq."OpenQuantitySigned" AS "Open Quantity Signed", + opq."OpenQuantitySigned" * sale."dblUnitPrice" * '-1'::integer::numeric AS "Open Cost Amount", + 1 AS "intPriceGroupId", + ctr."dtmEstimatedBLDate" AS "Estimated BL Date", + opq."TheoriticalQuantitySigned" AS "Contract Quantity Signed", + 'Price'::text AS "Line Group" +FROM vw_utility_dim_physical_sale_contract ctr +JOIN vw_utility_sale_physical_contract sale + ON ctr."intSaleLineId" = sale."intSaleLineId" +JOIN contract_open_quantity opq + ON ctr."intSaleLineId" = opq."TradeLineId" + AND opq."TradeType" = 'Sale'::text +LEFT JOIN vw_utility_physical_pricing_definition prc + ON prc."strContractType" = 'Sale'::text + AND prc."intContractLineId" = ctr."intSaleLineId" +WHERE + ctr."strPricingType"::text IN ('priced'::text, 'basis'::text) + AND opq."OpenQuantity" <> 0::numeric + +UNION ALL + +SELECT + 2 AS "Group Order", + 'MTM'::text AS "Group Type", + ctr."intSaleLineId" AS "intTradeLineId", + mtm."strComponentCurve" AS "Line Description", + opq."AvgMtmPrice" AS "Price", + opq."OpenQuantitySigned" AS "Open Quantity Signed", + opq."OpenQuantitySigned" * opq."AvgMtmPrice" AS "Open Cost Amount", + 3 AS "intPriceGroupId", + ctr."dtmEstimatedBLDate" AS "Estimated BL Date", + opq."TheoriticalQuantitySigned" AS "Contract Quantity Signed", + 'MTM'::text AS "Line Group" +FROM vw_utility_physical_mtm_definition mtm +JOIN vw_utility_dim_physical_sale_contract ctr + ON mtm."intContractLineId" = ctr."intSaleLineId" +JOIN contract_open_quantity opq + ON ctr."intSaleLineId" = opq."TradeLineId" + AND opq."TradeType" = 'Sale'::text +WHERE + mtm."strContractType" = 'Sale'::text + AND opq."OpenQuantity" <> 0::numeric + +UNION ALL + +SELECT + 3 AS "Group Order", + 'Fee'::text AS "Group Type", + fees."intContractLineId" AS "intTradeLineId", + fees."strProduct" AS "Line Description", + fees."dblPrice" AS "Price", + opq."OpenQuantitySigned" AS "Open Quantity Signed", + CASE + WHEN fees."strPayOrRec"::text = 'pay'::text THEN 1 + ELSE '-1'::integer + END::numeric * opq."OpenQuantity" * fees."dblPrice" * '-1'::integer::numeric AS "Open Cost Amount", + 2 AS "intPriceGroupId", + ctr."dtmEstimatedBLDate" AS "Estimated BL Date", + opq."TheoriticalQuantitySigned" AS "Contract Quantity Signed", + fees."strProductGroup" AS "Line Group" +FROM vw_utility_contract_fees fees +JOIN vw_utility_dim_physical_sale_contract ctr + ON fees."intContractLineId" = ctr."intSaleLineId" +JOIN contract_open_quantity opq + ON ctr."intSaleLineId" = opq."TradeLineId" + AND opq."TradeType" = 'Sale'::text +WHERE + fees."strContractType" = 'Sale'::text + AND opq."OpenQuantity" <> 0::numeric; diff --git a/ITSA/Data Reconciliation/update_vw_utility_open_position.sql b/ITSA/Data Reconciliation/update_vw_utility_open_position.sql new file mode 100644 index 0000000..885bee8 --- /dev/null +++ b/ITSA/Data Reconciliation/update_vw_utility_open_position.sql @@ -0,0 +1,154 @@ +CREATE OR REPLACE VIEW public.vw_utility_open_position AS +WITH physical_lot_quantity AS ( + SELECT + 'purchase'::text AS side, + l.line AS contract_line_id, + SUM(COALESCE(qh.quantity, 0::numeric)) AS physical_quantity + FROM lot_lot l + LEFT JOIN lot_qt_hist qh + ON qh.lot = l.id + AND qh.quantity_type = l.lot_state + WHERE + l.lot_type::text = 'physic'::text + AND l.line IS NOT NULL + GROUP BY + l.line + + UNION ALL + + SELECT + 'sale'::text AS side, + l.sale_line AS contract_line_id, + SUM(COALESCE(qh.quantity, 0::numeric)) AS physical_quantity + FROM lot_lot l + LEFT JOIN lot_qt_hist qh + ON qh.lot = l.id + AND qh.quantity_type = l.lot_state + WHERE + l.lot_type::text = 'physic'::text + AND l.sale_line IS NOT NULL + GROUP BY + l.sale_line +), +matched_virtual_quantity AS ( + SELECT + 'purchase'::text AS side, + lp.line AS contract_line_id, + SUM(lqt.lot_quantity) AS matched_quantity + FROM lot_qt lqt + JOIN lot_lot lp + ON lp.id = lqt.lot_p + WHERE + lp.lot_type::text = 'virtual'::text + AND lp.line IS NOT NULL + AND lqt.lot_s IS NOT NULL + AND lqt.lot_quantity > 0::numeric + GROUP BY + lp.line + + UNION ALL + + SELECT + 'sale'::text AS side, + ls.sale_line AS contract_line_id, + SUM(lqt.lot_quantity) AS matched_quantity + FROM lot_qt lqt + JOIN lot_lot ls + ON ls.id = lqt.lot_s + WHERE + ls.lot_type::text = 'virtual'::text + AND ls.sale_line IS NOT NULL + AND lqt.lot_p IS NOT NULL + AND lqt.lot_quantity > 0::numeric + GROUP BY + ls.sale_line +), +open_virtual_lots AS ( + SELECT + 'purchase'::text AS side, + lqt.id AS int_lot_qt_id, + lp.id AS int_lot_id, + pl.id AS int_contract_line_id, + pp.party AS int_counterparty_id, + pl.product AS int_product_id, + uom.name AS uom, + lqt.lot_quantity AS open_quantity, + pl.from_del AS period_start, + pl.to_del AS period_end, + COALESCE(plq.physical_quantity, 0::numeric) AS physical_lot_quantity, + pl.quantity_theorical - COALESCE(plq.physical_quantity, 0::numeric) + - COALESCE(mvq.matched_quantity, 0::numeric) + AS open_targeted_quantity + FROM lot_qt lqt + JOIN lot_lot lp + ON lp.id = lqt.lot_p + JOIN purchase_line pl + ON pl.id = lp.line + JOIN purchase_purchase pp + ON pp.id = pl.purchase + LEFT JOIN product_uom uom + ON uom.id = lqt.lot_unit + LEFT JOIN physical_lot_quantity plq + ON plq.side = 'purchase'::text + AND plq.contract_line_id = pl.id + LEFT JOIN matched_virtual_quantity mvq + ON mvq.side = 'purchase'::text + AND mvq.contract_line_id = pl.id + WHERE + lp.lot_type::text = 'virtual'::text + AND lqt.lot_s IS NULL + AND COALESCE(pl.finished, false) = false + AND lqt.lot_quantity > 0::numeric + + UNION ALL + + SELECT + 'sale'::text AS side, + lqt.id AS int_lot_qt_id, + ls.id AS int_lot_id, + sl.id AS int_contract_line_id, + ss.party AS int_counterparty_id, + sl.product AS int_product_id, + uom.name AS uom, + -lqt.lot_quantity AS open_quantity, + sl.from_del AS period_start, + sl.to_del AS period_end, + COALESCE(plq.physical_quantity, 0::numeric) AS physical_lot_quantity, + sl.quantity_theorical - COALESCE(plq.physical_quantity, 0::numeric) + - COALESCE(mvq.matched_quantity, 0::numeric) + AS open_targeted_quantity + FROM lot_qt lqt + JOIN lot_lot ls + ON ls.id = lqt.lot_s + JOIN sale_line sl + ON sl.id = ls.sale_line + JOIN sale_sale ss + ON ss.id = sl.sale + LEFT JOIN product_uom uom + ON uom.id = lqt.lot_unit + LEFT JOIN physical_lot_quantity plq + ON plq.side = 'sale'::text + AND plq.contract_line_id = sl.id + LEFT JOIN matched_virtual_quantity mvq + ON mvq.side = 'sale'::text + AND mvq.contract_line_id = sl.id + WHERE + ls.lot_type::text = 'virtual'::text + AND lqt.lot_p IS NULL + AND COALESCE(sl.finished, false) = false + AND lqt.lot_quantity > 0::numeric +) +SELECT + side AS "strContractSide", + int_lot_qt_id AS "intLotQtId", + int_lot_id AS "intLotId", + int_contract_line_id AS "intContractLineId", + int_counterparty_id AS "intCounterpartyId", + int_product_id AS "intProductId", + uom AS "strUom", + open_quantity AS "dblOpenQuantity", + period_start AS "dtmPeriodStart", + period_end AS "dtmPeriodEnd", + physical_lot_quantity AS "dblPhysicalLotQuantity", + open_targeted_quantity AS "dblOpenTargetedQuantity" +FROM open_virtual_lots; diff --git a/ITSA/Data Reconciliation/update_vw_utility_shipment_fee_allocation.sql b/ITSA/Data Reconciliation/update_vw_utility_shipment_fee_allocation.sql new file mode 100644 index 0000000..3bd0f7c --- /dev/null +++ b/ITSA/Data Reconciliation/update_vw_utility_shipment_fee_allocation.sql @@ -0,0 +1,495 @@ +CREATE OR REPLACE VIEW public.vw_utility_shipment_fee_allocation AS +WITH physical_shipment_lots AS ( + SELECT + l.lot_shipment_in AS shipment_id, + l.id AS lot_id, + l.lot_type, + l.line AS purchase_line_id, + l.sale_line AS sale_line_id, + qh.quantity AS shipment_quantity, + l.lot_unit_line AS shipment_unit_id + FROM lot_lot l + LEFT JOIN lot_qt_hist qh + ON qh.lot = l.id + AND qh.quantity_type = l.lot_state + WHERE + l.lot_type::text = 'physic'::text + AND l.lot_shipment_in IS NOT NULL +), +virtual_shipment_lots AS ( + SELECT + q.lot_shipment_in AS shipment_id, + vp.id AS lot_id, + vp.lot_type, + vp.line AS purchase_line_id, + COALESCE(vp.sale_line, ps.sale_line) AS sale_line_id, + q.lot_quantity AS shipment_quantity, + q.lot_unit AS shipment_unit_id + FROM lot_qt q + JOIN lot_lot vp + ON vp.id = q.lot_p + AND vp.lot_type::text = 'virtual'::text + LEFT JOIN lot_lot ps + ON ps.id = q.lot_s + WHERE + q.lot_shipment_in IS NOT NULL + AND NOT EXISTS ( + SELECT 1 + FROM physical_shipment_lots pl + WHERE + pl.shipment_id = q.lot_shipment_in + AND pl.purchase_line_id = vp.line + AND ( + pl.sale_line_id = COALESCE(vp.sale_line, ps.sale_line) + OR COALESCE(vp.sale_line, ps.sale_line) IS NULL + ) + ) +), +shipment_lots AS ( + SELECT + physical_shipment_lots.shipment_id, + physical_shipment_lots.lot_id, + physical_shipment_lots.lot_type, + physical_shipment_lots.purchase_line_id, + physical_shipment_lots.sale_line_id, + physical_shipment_lots.shipment_quantity, + physical_shipment_lots.shipment_unit_id + FROM physical_shipment_lots + + UNION ALL + + SELECT + virtual_shipment_lots.shipment_id, + virtual_shipment_lots.lot_id, + virtual_shipment_lots.lot_type, + virtual_shipment_lots.purchase_line_id, + virtual_shipment_lots.sale_line_id, + virtual_shipment_lots.shipment_quantity, + virtual_shipment_lots.shipment_unit_id + FROM virtual_shipment_lots +), +shipment_context AS ( + SELECT + shipment_lots.shipment_id, + shipment_lots.lot_id, + shipment_lots.purchase_line_id, + shipment_lots.sale_line_id, + shipment_lots.shipment_unit_id, + sum(COALESCE(shipment_lots.shipment_quantity, 0::numeric)) AS shipment_quantity + FROM shipment_lots + WHERE shipment_lots.shipment_id IS NOT NULL + GROUP BY + shipment_lots.shipment_id, + shipment_lots.lot_id, + shipment_lots.purchase_line_id, + shipment_lots.sale_line_id, + shipment_lots.shipment_unit_id +), +shipment_base AS ( + SELECT + shipment_context.shipment_id, + sum(shipment_context.shipment_quantity) AS shipment_quantity + FROM shipment_context + GROUP BY shipment_context.shipment_id +), +shipment_fee_candidates AS ( + SELECT + f.id AS fee_id, + 'Shipment'::text AS fee_source, + f.type AS fee_type, + CASE + WHEN f.type::text = 'ordered'::text THEN 1 + WHEN f.type::text = 'scheduled'::text THEN 2 + ELSE NULL::integer + END AS priority, + sb.shipment_id, + f.product AS product_id, + f.supplier AS supplier_id, + f.mode AS packaging, + f.p_r AS pay_or_rec, + f.state, + f.weight_type, + COALESCE(f.quantity, 0::numeric) AS requested_quantity, + sb.shipment_quantity, + f.price AS fee_price, + f.currency AS currency_id, + f.unit AS unit_id, + CASE + WHEN upper(f.p_r::text) = 'REC'::text THEN 1 + ELSE '-1'::integer + END AS sign_multiplier, + NULL::text AS forced_cost_group + FROM shipment_base sb + JOIN fee_fee f + ON f.shipment_in = sb.shipment_id + WHERE f.type::text = ANY (ARRAY['ordered'::character varying::text, 'scheduled'::character varying::text]) +), +shipment_fee_limits AS ( + SELECT + c.*, + LEAST( + GREATEST(c.requested_quantity, 0::numeric), + GREATEST( + c.shipment_quantity + - COALESCE( + sum(c.requested_quantity) OVER ( + PARTITION BY c.shipment_id, c.product_id, c.supplier_id + ORDER BY c.priority, c.fee_id + ROWS BETWEEN UNBOUNDED PRECEDING AND 1 PRECEDING + ), + 0::numeric + ), + 0::numeric + ) + ) AS fee_allocatable_quantity + FROM shipment_fee_candidates c +), +shipment_fee_allocated AS ( + SELECT + fl.fee_id, + fl.fee_source, + fl.fee_type, + fl.priority, + fl.shipment_id, + sc.lot_id, + sc.purchase_line_id, + sc.sale_line_id, + fl.product_id, + fl.supplier_id, + fl.packaging, + fl.pay_or_rec, + fl.state, + fl.weight_type, + fl.requested_quantity, + fl.shipment_quantity, + fl.fee_price, + fl.currency_id, + COALESCE(fl.unit_id, sc.shipment_unit_id) AS unit_id, + fl.sign_multiplier, + fl.forced_cost_group, + LEAST( + sc.shipment_quantity, + GREATEST( + fl.fee_allocatable_quantity + - COALESCE( + sum(sc.shipment_quantity) OVER ( + PARTITION BY fl.fee_id + ORDER BY sc.lot_id, sc.purchase_line_id, sc.sale_line_id + ROWS BETWEEN UNBOUNDED PRECEDING AND 1 PRECEDING + ), + 0::numeric + ), + 0::numeric + ) + ) AS allocated_quantity + FROM shipment_fee_limits fl + JOIN shipment_context sc + ON sc.shipment_id = fl.shipment_id +), +shipment_fee_coverage AS ( + SELECT + shipment_fee_allocated.shipment_id, + shipment_fee_allocated.product_id, + shipment_fee_allocated.supplier_id, + max(shipment_fee_allocated.shipment_quantity) AS shipment_quantity, + sum(shipment_fee_allocated.allocated_quantity) AS allocated_quantity + FROM shipment_fee_allocated + GROUP BY + shipment_fee_allocated.shipment_id, + shipment_fee_allocated.product_id, + shipment_fee_allocated.supplier_id +), +contract_budgeted_fee_candidates AS ( + SELECT + f.id AS fee_id, + 'Purchase Contract'::text AS fee_source, + f.type AS fee_type, + 3 AS priority, + sc.shipment_id, + sc.lot_id, + sc.purchase_line_id, + sc.sale_line_id, + f.product AS product_id, + f.supplier AS supplier_id, + f.mode AS packaging, + f.p_r AS pay_or_rec, + f.state, + f.weight_type, + sc.shipment_quantity, + f.price AS fee_price, + f.currency AS currency_id, + COALESCE(f.unit, sc.shipment_unit_id) AS unit_id, + CASE + WHEN upper(f.p_r::text) = 'REC'::text THEN '-1'::integer + ELSE 1 + END AS sign_multiplier, + NULL::text AS forced_cost_group + FROM shipment_context sc + JOIN fee_fee f + ON f.line = sc.purchase_line_id + WHERE + f.type::text = 'budgeted'::text + AND sc.purchase_line_id IS NOT NULL + + UNION ALL + + SELECT + f.id AS fee_id, + 'Sale Contract'::text AS fee_source, + f.type AS fee_type, + 3 AS priority, + sc.shipment_id, + sc.lot_id, + sc.purchase_line_id, + sc.sale_line_id, + f.product AS product_id, + f.supplier AS supplier_id, + f.mode AS packaging, + f.p_r AS pay_or_rec, + f.state, + f.weight_type, + sc.shipment_quantity, + f.price AS fee_price, + f.currency AS currency_id, + COALESCE(f.unit, sc.shipment_unit_id) AS unit_id, + CASE + WHEN upper(f.p_r::text) = 'REC'::text THEN 1 + ELSE '-1'::integer + END AS sign_multiplier, + NULL::text AS forced_cost_group + FROM shipment_context sc + JOIN fee_fee f + ON f.sale_line = sc.sale_line_id + WHERE + f.type::text = 'budgeted'::text + AND sc.sale_line_id IS NOT NULL +), +contract_budgeted_allocated AS ( + SELECT + c.fee_id, + c.fee_source, + c.fee_type, + c.priority, + c.shipment_id, + c.lot_id, + c.purchase_line_id, + c.sale_line_id, + c.product_id, + c.supplier_id, + c.packaging, + c.pay_or_rec, + c.state, + c.weight_type, + c.shipment_quantity, + c.fee_price, + c.currency_id, + c.unit_id, + c.sign_multiplier, + c.forced_cost_group, + LEAST( + c.shipment_quantity, + GREATEST( + sum(c.shipment_quantity) OVER ( + PARTITION BY c.shipment_id, c.product_id, c.supplier_id, c.fee_id + ) + - COALESCE(fc.allocated_quantity, 0::numeric) + - COALESCE( + sum(c.shipment_quantity) OVER ( + PARTITION BY c.shipment_id, c.product_id, c.supplier_id, c.fee_id + ORDER BY c.lot_id + ROWS BETWEEN UNBOUNDED PRECEDING AND 1 PRECEDING + ), + 0::numeric + ), + 0::numeric + ) + ) AS allocated_quantity + FROM contract_budgeted_fee_candidates c + LEFT JOIN shipment_fee_coverage fc + ON fc.shipment_id = c.shipment_id + AND fc.product_id = c.product_id + AND fc.supplier_id = c.supplier_id +), +price_rows AS ( + SELECT + NULL::integer AS fee_id, + 'Purchase Price'::text AS fee_source, + 'price'::text AS fee_type, + 4 AS priority, + sc.shipment_id, + sc.lot_id, + sc.purchase_line_id, + sc.sale_line_id, + pl.product AS product_id, + NULL::integer AS supplier_id, + NULL::character varying AS packaging, + NULL::character varying AS pay_or_rec, + NULL::character varying AS state, + NULL::character varying AS weight_type, + sc.shipment_quantity AS allocated_quantity, + pl.unit_price AS fee_price, + pl.currency_ AS currency_id, + COALESCE(pl.unit, sc.shipment_unit_id) AS unit_id, + 1 AS sign_multiplier, + 'PurchasePrice'::text AS forced_cost_group + FROM shipment_context sc + JOIN purchase_line pl + ON pl.id = sc.purchase_line_id + WHERE sc.purchase_line_id IS NOT NULL + + UNION ALL + + SELECT + NULL::integer AS fee_id, + 'Sale Price'::text AS fee_source, + 'price'::text AS fee_type, + 5 AS priority, + sc.shipment_id, + sc.lot_id, + sc.purchase_line_id, + sc.sale_line_id, + sl.product AS product_id, + NULL::integer AS supplier_id, + NULL::character varying AS packaging, + NULL::character varying AS pay_or_rec, + NULL::character varying AS state, + NULL::character varying AS weight_type, + sc.shipment_quantity AS allocated_quantity, + sl.unit_price AS fee_price, + ss.currency AS currency_id, + COALESCE(sl.unit, sc.shipment_unit_id) AS unit_id, + '-1'::integer AS sign_multiplier, + 'SalePrice'::text AS forced_cost_group + FROM shipment_context sc + JOIN sale_line sl + ON sl.id = sc.sale_line_id + JOIN sale_sale ss + ON ss.id = sl.sale + WHERE sc.sale_line_id IS NOT NULL +), +final_fees AS ( + SELECT + shipment_fee_allocated.fee_id, + shipment_fee_allocated.fee_source, + shipment_fee_allocated.fee_type, + shipment_fee_allocated.priority, + shipment_fee_allocated.shipment_id, + shipment_fee_allocated.lot_id, + shipment_fee_allocated.purchase_line_id, + shipment_fee_allocated.sale_line_id, + shipment_fee_allocated.product_id, + shipment_fee_allocated.supplier_id, + shipment_fee_allocated.packaging, + shipment_fee_allocated.pay_or_rec, + shipment_fee_allocated.state, + shipment_fee_allocated.weight_type, + shipment_fee_allocated.allocated_quantity AS fee_quantity, + shipment_fee_allocated.fee_price, + shipment_fee_allocated.currency_id, + shipment_fee_allocated.unit_id, + shipment_fee_allocated.sign_multiplier, + shipment_fee_allocated.forced_cost_group + FROM shipment_fee_allocated + WHERE shipment_fee_allocated.allocated_quantity > 0::numeric + + UNION ALL + + SELECT + contract_budgeted_allocated.fee_id, + contract_budgeted_allocated.fee_source, + contract_budgeted_allocated.fee_type, + contract_budgeted_allocated.priority, + contract_budgeted_allocated.shipment_id, + contract_budgeted_allocated.lot_id, + contract_budgeted_allocated.purchase_line_id, + contract_budgeted_allocated.sale_line_id, + contract_budgeted_allocated.product_id, + contract_budgeted_allocated.supplier_id, + contract_budgeted_allocated.packaging, + contract_budgeted_allocated.pay_or_rec, + contract_budgeted_allocated.state, + contract_budgeted_allocated.weight_type, + contract_budgeted_allocated.allocated_quantity AS fee_quantity, + contract_budgeted_allocated.fee_price, + contract_budgeted_allocated.currency_id, + contract_budgeted_allocated.unit_id, + contract_budgeted_allocated.sign_multiplier, + contract_budgeted_allocated.forced_cost_group + FROM contract_budgeted_allocated + WHERE contract_budgeted_allocated.allocated_quantity > 0::numeric + + UNION ALL + + SELECT + price_rows.fee_id, + price_rows.fee_source, + price_rows.fee_type, + price_rows.priority, + price_rows.shipment_id, + price_rows.lot_id, + price_rows.purchase_line_id, + price_rows.sale_line_id, + price_rows.product_id, + price_rows.supplier_id, + price_rows.packaging, + price_rows.pay_or_rec, + price_rows.state, + price_rows.weight_type, + price_rows.allocated_quantity AS fee_quantity, + price_rows.fee_price, + price_rows.currency_id, + price_rows.unit_id, + price_rows.sign_multiplier, + price_rows.forced_cost_group + FROM price_rows + WHERE price_rows.allocated_quantity > 0::numeric +) +SELECT + f.shipment_id AS "intShipmentId", + f.lot_id AS "intLotId", + COALESCE(f.fee_id, 0) AS "intFeeId", + f.fee_source AS "strFeeSource", + f.fee_type AS "strFeeType", + f.priority AS "intPriority", + COALESCE(f.purchase_line_id, 0) AS "intPurchaseLineId", + COALESCE(f.sale_line_id, 0) AS "intSaleLineId", + COALESCE(f.product_id, 0) AS "intProductId", + COALESCE(p.code, ''::character varying) AS "strFee", + COALESCE(f.supplier_id, 0) AS "intSupplierId", + COALESCE(sup.name, ''::character varying) AS "strSupplier", + COALESCE(f.packaging, ''::character varying) AS "strPackaging", + COALESCE(f.pay_or_rec, ''::character varying) AS "strPayOrRec", + COALESCE(f.state, ''::character varying) AS "strState", + CASE + WHEN upper(f.weight_type::text) = 'BRUT'::text THEN 'Gross'::text + ELSE 'Net'::text + END AS "strWeighingType", + f.fee_quantity AS "dblQuantity", + f.fee_price AS "dblPrice", + COALESCE(cur.name, ''::character varying) AS "strCurrency", + COALESCE(uom.name, 'Mt'::character varying) AS "strUnit", + f.fee_quantity * f.fee_price AS "dblAmount", + COALESCE( + f.forced_cost_group, + CASE + WHEN upper(p.code::text) ~~ '%FREIGHT%'::text THEN 'Freight'::text + WHEN upper(p.code::text) ~~ '%PROFIT SHARING%'::text THEN 'Profit Sharing'::text + ELSE 'Other Costs'::text + END + ) AS "strCostGroup", + CASE + WHEN f.pay_or_rec::text = 'pay'::text THEN - 1::numeric + WHEN f.pay_or_rec::text = 'rec'::text THEN 1::numeric + WHEN f.fee_source = 'Purchase Price'::text AND f.fee_type::text = 'price'::text THEN - 1::numeric + WHEN f.fee_source = 'Sale Price'::text AND f.fee_type::text = 'price'::text THEN 1::numeric + ELSE - 1::numeric + END AS "intSignMultiplier" +FROM final_fees f +JOIN product_product p + ON p.id = f.product_id +LEFT JOIN party_party sup + ON sup.id = f.supplier_id +LEFT JOIN currency_currency cur + ON cur.id = f.currency_id +LEFT JOIN product_uom uom + ON uom.id = f.unit_id; diff --git a/ITSA/Data Reconciliation/update_vw_utility_trade_pnl_quantities.sql b/ITSA/Data Reconciliation/update_vw_utility_trade_pnl_quantities.sql new file mode 100644 index 0000000..a53400d --- /dev/null +++ b/ITSA/Data Reconciliation/update_vw_utility_trade_pnl_quantities.sql @@ -0,0 +1,382 @@ +CREATE OR REPLACE VIEW public.vw_utility_trade_pnl_quantities AS +WITH lot_current_qty AS ( + SELECT + l.id AS lot_id, + round( + COALESCE(lh.quantity, 0::numeric) + * COALESCE(lot_uom.factor, 1::double precision)::numeric + / NULLIF(COALESCE(line_uom.factor, 1::double precision)::numeric, 0::numeric), + 5 + ) AS pnl_quantity, + lot_uom.name AS quantity_uom + FROM lot_lot l + LEFT JOIN lot_qt_hist lh ON lh.lot = l.id AND lh.quantity_type = l.lot_state + LEFT JOIN product_uom lot_uom ON lot_uom.id = l.lot_unit_line + LEFT JOIN purchase_line pl ON pl.id = l.line + LEFT JOIN sale_line sl ON sl.id = l.sale_line + LEFT JOIN product_uom line_uom ON line_uom.id = COALESCE(pl.unit, sl.unit) +), purchase_pnl_lots AS ( + SELECT + 'purchase'::text AS pnl_side, + p.id AS purchase_id, + p.number AS purchase_number, + p.reference AS purchase_reference, + pl.id AS purchase_line_id, + pl.finished AS purchase_line_finished, + s.id AS sale_id, + s.number AS sale_number, + s.reference AS sale_reference, + sl.id AS sale_line_id, + sl.finished AS sale_line_finished, + l.id AS valued_lot_id, + l.lot_type AS valued_lot_type, + NULL::integer AS lot_qt_id, + lcq.pnl_quantity, + lcq.quantity_uom AS quantity_unit, + pl.product AS product_id, + COALESCE(shi.from_location, sint.from_location, sho.from_location, p.from_location) AS from_location_id, + COALESCE(shi.to_location, sint.to_location, sho.to_location, p.to_location) AS to_location_id, + shi.id AS shipment_id, + shi.bl_date, + pl.from_del AS delivery_date_from, + pl.to_del AS delivery_date_to + FROM purchase_line pl + JOIN purchase_purchase p ON p.id = pl.purchase + JOIN lot_lot l ON l.line = pl.id + JOIN lot_current_qty lcq ON lcq.lot_id = l.id + LEFT JOIN sale_line sl ON sl.id = l.sale_line + LEFT JOIN sale_sale s ON s.id = sl.sale + LEFT JOIN stock_shipment_in shi ON shi.id = l.lot_shipment_in + LEFT JOIN stock_shipment_internal sint ON sint.id = l.lot_shipment_internal + LEFT JOIN stock_shipment_out sho ON sho.id = l.lot_shipment_out + WHERE pl.type::text = 'line'::text + AND (l.lot_type::text = ANY (ARRAY['virtual'::character varying::text, 'physic'::character varying::text])) +), sale_pnl_direct_lots AS ( + SELECT + 'sale'::text AS pnl_side, + p.id AS purchase_id, + p.number AS purchase_number, + p.reference AS purchase_reference, + pl.id AS purchase_line_id, + pl.finished AS purchase_line_finished, + s.id AS sale_id, + s.number AS sale_number, + s.reference AS sale_reference, + sl.id AS sale_line_id, + sl.finished AS sale_line_finished, + l.id AS valued_lot_id, + l.lot_type AS valued_lot_type, + NULL::integer AS lot_qt_id, + lcq.pnl_quantity, + lcq.quantity_uom AS quantity_unit, + sl.product AS product_id, + COALESCE(shi.from_location, sint.from_location, sho.from_location, s.from_location) AS from_location_id, + COALESCE(shi.to_location, sint.to_location, sho.to_location, s.to_location) AS to_location_id, + shi.id AS shipment_id, + shi.bl_date, + sl.from_del AS delivery_date_from, + sl.to_del AS delivery_date_to + FROM purchase_line pl + JOIN purchase_purchase p ON p.id = pl.purchase + JOIN lot_lot l ON l.line = pl.id AND l.sale_line IS NOT NULL + JOIN sale_line sl ON sl.id = l.sale_line + JOIN sale_sale s ON s.id = sl.sale + JOIN lot_current_qty lcq ON lcq.lot_id = l.id + LEFT JOIN stock_shipment_in shi ON shi.id = l.lot_shipment_in + LEFT JOIN stock_shipment_internal sint ON sint.id = l.lot_shipment_internal + LEFT JOIN stock_shipment_out sho ON sho.id = l.lot_shipment_out + WHERE pl.type::text = 'line'::text + AND l.lot_type::text = 'physic'::text + AND NOT EXISTS ( + SELECT 1 + FROM purchase_pnl_lots ppl + WHERE ppl.valued_lot_id = l.id + AND ppl.sale_line_id = sl.id + ) +), sale_pnl_matched_virtual_lots AS ( + SELECT + 'sale'::text AS pnl_side, + p.id AS purchase_id, + p.number AS purchase_number, + p.reference AS purchase_reference, + pl.id AS purchase_line_id, + pl.finished AS purchase_line_finished, + s.id AS sale_id, + s.number AS sale_number, + s.reference AS sale_reference, + sl.id AS sale_line_id, + sl.finished AS sale_line_finished, + sale_lot.id AS valued_lot_id, + sale_lot.lot_type AS valued_lot_type, + lqt.id AS lot_qt_id, + lcq.pnl_quantity, + lcq.quantity_uom AS quantity_unit, + sl.product AS product_id, + COALESCE(shi.from_location, sint.from_location, sho.from_location, s.from_location) AS from_location_id, + COALESCE(shi.to_location, sint.to_location, sho.to_location, s.to_location) AS to_location_id, + shi.id AS shipment_id, + shi.bl_date, + sl.from_del AS delivery_date_from, + sl.to_del AS delivery_date_to + FROM purchase_line pl + JOIN purchase_purchase p ON p.id = pl.purchase + JOIN lot_lot purchase_lot ON purchase_lot.line = pl.id + AND purchase_lot.lot_type::text = 'virtual'::text + AND purchase_lot.sale_line IS NULL + JOIN lot_qt lqt ON lqt.lot_p = purchase_lot.id + AND lqt.lot_s IS NOT NULL + AND lqt.lot_quantity > 0::numeric + JOIN lot_lot sale_lot ON sale_lot.id = lqt.lot_s + AND sale_lot.lot_type::text = 'virtual'::text + JOIN sale_line sl ON sl.id = sale_lot.sale_line + JOIN sale_sale s ON s.id = sl.sale + JOIN lot_current_qty lcq ON lcq.lot_id = sale_lot.id + LEFT JOIN stock_shipment_in shi ON shi.id = lqt.lot_shipment_in + LEFT JOIN stock_shipment_internal sint ON sint.id = lqt.lot_shipment_internal + LEFT JOIN stock_shipment_out sho ON sho.id = lqt.lot_shipment_out + WHERE pl.type::text = 'line'::text +), sale_pnl_unmatched_lots AS ( + SELECT + 'sale'::text AS pnl_side, + NULL::integer AS purchase_id, + NULL::character varying AS purchase_number, + NULL::character varying AS purchase_reference, + NULL::integer AS purchase_line_id, + NULL::boolean AS purchase_line_finished, + s.id AS sale_id, + s.number AS sale_number, + s.reference AS sale_reference, + sl.id AS sale_line_id, + sl.finished AS sale_line_finished, + l.id AS valued_lot_id, + l.lot_type AS valued_lot_type, + NULL::integer AS lot_qt_id, + lcq.pnl_quantity, + lcq.quantity_uom AS quantity_unit, + sl.product AS product_id, + COALESCE(shi.from_location, sint.from_location, sho.from_location, s.from_location) AS from_location_id, + COALESCE(shi.to_location, sint.to_location, sho.to_location, s.to_location) AS to_location_id, + shi.id AS shipment_id, + shi.bl_date, + sl.from_del AS delivery_date_from, + sl.to_del AS delivery_date_to + FROM sale_line sl + JOIN sale_sale s ON s.id = sl.sale + JOIN lot_lot l ON l.sale_line = sl.id + AND l.line IS NULL + AND (l.lot_type::text = ANY (ARRAY['virtual'::character varying::text, 'physic'::character varying::text])) + JOIN lot_current_qty lcq ON lcq.lot_id = l.id + LEFT JOIN stock_shipment_in shi ON shi.id = l.lot_shipment_in + LEFT JOIN stock_shipment_internal sint ON sint.id = l.lot_shipment_internal + LEFT JOIN stock_shipment_out sho ON sho.id = l.lot_shipment_out + WHERE sl.type::text = 'line'::text + AND NOT EXISTS ( + SELECT 1 + FROM lot_qt lqt + WHERE lqt.lot_s = l.id + AND lqt.lot_p IS NOT NULL + AND lqt.lot_quantity > 0::numeric + ) +), pnl_lot_rows AS ( + SELECT + purchase_pnl_lots.pnl_side, + purchase_pnl_lots.purchase_id, + purchase_pnl_lots.purchase_number, + purchase_pnl_lots.purchase_reference, + purchase_pnl_lots.purchase_line_id, + purchase_pnl_lots.purchase_line_finished, + purchase_pnl_lots.sale_id, + purchase_pnl_lots.sale_number, + purchase_pnl_lots.sale_reference, + purchase_pnl_lots.sale_line_id, + purchase_pnl_lots.sale_line_finished, + purchase_pnl_lots.valued_lot_id, + purchase_pnl_lots.valued_lot_type, + purchase_pnl_lots.lot_qt_id, + purchase_pnl_lots.pnl_quantity, + purchase_pnl_lots.quantity_unit, + purchase_pnl_lots.product_id, + purchase_pnl_lots.from_location_id, + purchase_pnl_lots.to_location_id, + purchase_pnl_lots.shipment_id, + purchase_pnl_lots.bl_date, + purchase_pnl_lots.delivery_date_from, + purchase_pnl_lots.delivery_date_to + FROM purchase_pnl_lots + UNION ALL + SELECT + sale_pnl_direct_lots.pnl_side, + sale_pnl_direct_lots.purchase_id, + sale_pnl_direct_lots.purchase_number, + sale_pnl_direct_lots.purchase_reference, + sale_pnl_direct_lots.purchase_line_id, + sale_pnl_direct_lots.purchase_line_finished, + sale_pnl_direct_lots.sale_id, + sale_pnl_direct_lots.sale_number, + sale_pnl_direct_lots.sale_reference, + sale_pnl_direct_lots.sale_line_id, + sale_pnl_direct_lots.sale_line_finished, + sale_pnl_direct_lots.valued_lot_id, + sale_pnl_direct_lots.valued_lot_type, + sale_pnl_direct_lots.lot_qt_id, + sale_pnl_direct_lots.pnl_quantity, + sale_pnl_direct_lots.quantity_unit, + sale_pnl_direct_lots.product_id, + sale_pnl_direct_lots.from_location_id, + sale_pnl_direct_lots.to_location_id, + sale_pnl_direct_lots.shipment_id, + sale_pnl_direct_lots.bl_date, + sale_pnl_direct_lots.delivery_date_from, + sale_pnl_direct_lots.delivery_date_to + FROM sale_pnl_direct_lots + UNION ALL + SELECT + sale_pnl_matched_virtual_lots.pnl_side, + sale_pnl_matched_virtual_lots.purchase_id, + sale_pnl_matched_virtual_lots.purchase_number, + sale_pnl_matched_virtual_lots.purchase_reference, + sale_pnl_matched_virtual_lots.purchase_line_id, + sale_pnl_matched_virtual_lots.purchase_line_finished, + sale_pnl_matched_virtual_lots.sale_id, + sale_pnl_matched_virtual_lots.sale_number, + sale_pnl_matched_virtual_lots.sale_reference, + sale_pnl_matched_virtual_lots.sale_line_id, + sale_pnl_matched_virtual_lots.sale_line_finished, + sale_pnl_matched_virtual_lots.valued_lot_id, + sale_pnl_matched_virtual_lots.valued_lot_type, + sale_pnl_matched_virtual_lots.lot_qt_id, + sale_pnl_matched_virtual_lots.pnl_quantity, + sale_pnl_matched_virtual_lots.quantity_unit, + sale_pnl_matched_virtual_lots.product_id, + sale_pnl_matched_virtual_lots.from_location_id, + sale_pnl_matched_virtual_lots.to_location_id, + sale_pnl_matched_virtual_lots.shipment_id, + sale_pnl_matched_virtual_lots.bl_date, + sale_pnl_matched_virtual_lots.delivery_date_from, + sale_pnl_matched_virtual_lots.delivery_date_to + FROM sale_pnl_matched_virtual_lots + UNION ALL + SELECT + sale_pnl_unmatched_lots.pnl_side, + sale_pnl_unmatched_lots.purchase_id, + sale_pnl_unmatched_lots.purchase_number, + sale_pnl_unmatched_lots.purchase_reference, + sale_pnl_unmatched_lots.purchase_line_id, + sale_pnl_unmatched_lots.purchase_line_finished, + sale_pnl_unmatched_lots.sale_id, + sale_pnl_unmatched_lots.sale_number, + sale_pnl_unmatched_lots.sale_reference, + sale_pnl_unmatched_lots.sale_line_id, + sale_pnl_unmatched_lots.sale_line_finished, + sale_pnl_unmatched_lots.valued_lot_id, + sale_pnl_unmatched_lots.valued_lot_type, + sale_pnl_unmatched_lots.lot_qt_id, + sale_pnl_unmatched_lots.pnl_quantity, + sale_pnl_unmatched_lots.quantity_unit, + sale_pnl_unmatched_lots.product_id, + sale_pnl_unmatched_lots.from_location_id, + sale_pnl_unmatched_lots.to_location_id, + sale_pnl_unmatched_lots.shipment_id, + sale_pnl_unmatched_lots.bl_date, + sale_pnl_unmatched_lots.delivery_date_from, + sale_pnl_unmatched_lots.delivery_date_to + FROM sale_pnl_unmatched_lots +), pnl_lot_rows_with_finished AS ( + SELECT + pnl_lot_rows.pnl_side, + pnl_lot_rows.purchase_id, + pnl_lot_rows.purchase_number, + pnl_lot_rows.purchase_reference, + pnl_lot_rows.purchase_line_id, + pnl_lot_rows.purchase_line_finished, + pnl_lot_rows.sale_id, + pnl_lot_rows.sale_number, + pnl_lot_rows.sale_reference, + pnl_lot_rows.sale_line_id, + pnl_lot_rows.sale_line_finished, + pnl_lot_rows.valued_lot_id, + pnl_lot_rows.valued_lot_type, + pnl_lot_rows.lot_qt_id, + pnl_lot_rows.pnl_quantity, + pnl_lot_rows.quantity_unit, + pnl_lot_rows.product_id, + pnl_lot_rows.from_location_id, + pnl_lot_rows.to_location_id, + pnl_lot_rows.shipment_id, + pnl_lot_rows.bl_date, + pnl_lot_rows.delivery_date_from, + pnl_lot_rows.delivery_date_to, + CASE + WHEN pnl_lot_rows.pnl_side = 'purchase'::text THEN pnl_lot_rows.purchase_line_finished + WHEN pnl_lot_rows.pnl_side = 'sale'::text THEN pnl_lot_rows.sale_line_finished + ELSE false + END AS valued_line_finished, + CASE + WHEN pnl_lot_rows.valued_lot_type::text = 'virtual'::text + AND ( + pnl_lot_rows.pnl_side = 'purchase'::text + AND pnl_lot_rows.purchase_line_finished IS TRUE + OR pnl_lot_rows.pnl_side = 'sale'::text + AND pnl_lot_rows.sale_line_finished IS TRUE + ) + THEN true + ELSE false + END AS ignored_by_finished_rule + FROM pnl_lot_rows +) +SELECT + pnl_side, + purchase_id, + purchase_number, + purchase_reference, + purchase_line_id, + purchase_line_finished, + sale_id, + sale_number, + sale_reference, + sale_line_id, + sale_line_finished, + valued_lot_id, + valued_lot_type, + valued_line_finished, + ignored_by_finished_rule, + sum(pnl_quantity) AS pnl_quantity_raw, + sum( + CASE + WHEN ignored_by_finished_rule THEN 0::numeric + ELSE pnl_quantity + END + ) AS pnl_quantity_after_finished_rule, + quantity_unit, + product_id, + from_location_id, + to_location_id, + shipment_id, + bl_date, + delivery_date_from, + delivery_date_to +FROM pnl_lot_rows_with_finished +GROUP BY + pnl_side, + purchase_id, + purchase_number, + purchase_reference, + purchase_line_id, + purchase_line_finished, + sale_id, + sale_number, + sale_reference, + sale_line_id, + sale_line_finished, + valued_lot_type, + valued_lot_id, + valued_line_finished, + ignored_by_finished_rule, + quantity_unit, + product_id, + from_location_id, + to_location_id, + shipment_id, + bl_date, + delivery_date_from, + delivery_date_to; diff --git a/ITSA/Data Reconciliation/vw_utility_shipment_fee_allocation_current.sql b/ITSA/Data Reconciliation/vw_utility_shipment_fee_allocation_current.sql new file mode 100644 index 0000000..990d0b3 --- /dev/null +++ b/ITSA/Data Reconciliation/vw_utility_shipment_fee_allocation_current.sql @@ -0,0 +1,361 @@ + WITH physical_shipment_lots AS ( + SELECT l.lot_shipment_in AS shipment_id, + l.id AS lot_id, + l.lot_type, + l.line AS purchase_line_id, + l.sale_line AS sale_line_id, + qh.quantity AS shipment_quantity, + l.lot_unit_line AS shipment_unit_id + FROM lot_lot l + LEFT JOIN lot_qt_hist qh ON qh.lot = l.id AND qh.quantity_type = l.lot_state + WHERE l.lot_type::text = 'physic'::text AND l.lot_shipment_in IS NOT NULL + ), virtual_shipment_lots AS ( + SELECT q.lot_shipment_in AS shipment_id, + vp.id AS lot_id, + vp.lot_type, + vp.line AS purchase_line_id, + COALESCE(vp.sale_line, ps.sale_line) AS sale_line_id, + q.lot_quantity AS shipment_quantity, + q.lot_unit AS shipment_unit_id + FROM lot_qt q + JOIN lot_lot vp ON vp.id = q.lot_p AND vp.lot_type::text = 'virtual'::text + LEFT JOIN lot_lot ps ON ps.id = q.lot_s + WHERE q.lot_shipment_in IS NOT NULL AND NOT (EXISTS ( SELECT 1 + FROM physical_shipment_lots pl + WHERE pl.shipment_id = q.lot_shipment_in AND pl.purchase_line_id = vp.line AND (pl.sale_line_id = COALESCE(vp.sale_line, ps.sale_line) OR COALESCE(vp.sale_line, ps.sale_line) IS NULL))) + ), shipment_lots AS ( + SELECT physical_shipment_lots.shipment_id, + physical_shipment_lots.lot_id, + physical_shipment_lots.lot_type, + physical_shipment_lots.purchase_line_id, + physical_shipment_lots.sale_line_id, + physical_shipment_lots.shipment_quantity, + physical_shipment_lots.shipment_unit_id + FROM physical_shipment_lots + UNION ALL + SELECT virtual_shipment_lots.shipment_id, + virtual_shipment_lots.lot_id, + virtual_shipment_lots.lot_type, + virtual_shipment_lots.purchase_line_id, + virtual_shipment_lots.sale_line_id, + virtual_shipment_lots.shipment_quantity, + virtual_shipment_lots.shipment_unit_id + FROM virtual_shipment_lots + ), shipment_context AS ( + SELECT shipment_lots.shipment_id, + shipment_lots.lot_id, + shipment_lots.purchase_line_id, + shipment_lots.sale_line_id, + shipment_lots.shipment_unit_id, + sum(COALESCE(shipment_lots.shipment_quantity, 0::numeric)) AS shipment_quantity + FROM shipment_lots + WHERE shipment_lots.shipment_id IS NOT NULL + GROUP BY shipment_lots.shipment_id, shipment_lots.lot_id, shipment_lots.purchase_line_id, shipment_lots.sale_line_id, shipment_lots.shipment_unit_id + ), shipment_base AS ( + SELECT shipment_context.shipment_id, + sum(shipment_context.shipment_quantity) AS shipment_quantity + FROM shipment_context + GROUP BY shipment_context.shipment_id + ), shipment_fee_candidates AS ( + SELECT f_1.id AS fee_id, + 'Shipment'::text AS fee_source, + f_1.type AS fee_type, + CASE + WHEN f_1.type::text = 'ordered'::text THEN 1 + WHEN f_1.type::text = 'scheduled'::text THEN 2 + ELSE NULL::integer + END AS priority, + sb.shipment_id, + NULL::integer AS lot_id, + NULL::integer AS purchase_line_id, + NULL::integer AS sale_line_id, + f_1.product AS product_id, + f_1.supplier AS supplier_id, + f_1.mode AS packaging, + f_1.p_r AS pay_or_rec, + f_1.state, + f_1.weight_type, + COALESCE(f_1.quantity, 0::numeric) AS requested_quantity, + sb.shipment_quantity, + f_1.price AS fee_price, + f_1.currency AS currency_id, + f_1.unit AS unit_id, + CASE + WHEN upper(f_1.p_r::text) = 'REC'::text THEN 1 + ELSE '-1'::integer + END AS sign_multiplier, + NULL::text AS forced_cost_group + FROM shipment_base sb + JOIN fee_fee f_1 ON f_1.shipment_in = sb.shipment_id + WHERE f_1.type::text = ANY (ARRAY['ordered'::character varying::text, 'scheduled'::character varying::text]) + ), shipment_fee_allocated AS ( + SELECT c.fee_id, + c.fee_source, + c.fee_type, + c.priority, + c.shipment_id, + c.lot_id, + c.purchase_line_id, + c.sale_line_id, + c.product_id, + c.supplier_id, + c.packaging, + c.pay_or_rec, + c.state, + c.weight_type, + c.requested_quantity, + c.shipment_quantity, + c.fee_price, + c.currency_id, + c.unit_id, + c.sign_multiplier, + c.forced_cost_group, + LEAST(GREATEST(c.requested_quantity, 0::numeric), GREATEST(c.shipment_quantity - COALESCE(sum(c.requested_quantity) OVER (PARTITION BY c.shipment_id, c.product_id, c.supplier_id ORDER BY c.priority, c.fee_id ROWS BETWEEN UNBOUNDED PRECEDING AND 1 PRECEDING), 0::numeric), 0::numeric)) AS allocated_quantity + FROM shipment_fee_candidates c + ), shipment_fee_coverage AS ( + SELECT shipment_fee_allocated.shipment_id, + shipment_fee_allocated.product_id, + shipment_fee_allocated.supplier_id, + max(shipment_fee_allocated.shipment_quantity) AS shipment_quantity, + sum(shipment_fee_allocated.allocated_quantity) AS allocated_quantity + FROM shipment_fee_allocated + GROUP BY shipment_fee_allocated.shipment_id, shipment_fee_allocated.product_id, shipment_fee_allocated.supplier_id + ), contract_budgeted_fee_candidates AS ( + SELECT f_1.id AS fee_id, + 'Purchase Contract'::text AS fee_source, + f_1.type AS fee_type, + 3 AS priority, + sc.shipment_id, + sc.lot_id, + sc.purchase_line_id, + sc.sale_line_id, + f_1.product AS product_id, + f_1.supplier AS supplier_id, + f_1.mode AS packaging, + f_1.p_r AS pay_or_rec, + f_1.state, + f_1.weight_type, + sc.shipment_quantity, + f_1.price AS fee_price, + f_1.currency AS currency_id, + COALESCE(f_1.unit, sc.shipment_unit_id) AS unit_id, + CASE + WHEN upper(f_1.p_r::text) = 'REC'::text THEN '-1'::integer + ELSE 1 + END AS sign_multiplier, + NULL::text AS forced_cost_group + FROM shipment_context sc + JOIN fee_fee f_1 ON f_1.line = sc.purchase_line_id + WHERE f_1.type::text = 'budgeted'::text AND sc.purchase_line_id IS NOT NULL + UNION ALL + SELECT f_1.id AS fee_id, + 'Sale Contract'::text AS fee_source, + f_1.type AS fee_type, + 3 AS priority, + sc.shipment_id, + sc.lot_id, + sc.purchase_line_id, + sc.sale_line_id, + f_1.product AS product_id, + f_1.supplier AS supplier_id, + f_1.mode AS packaging, + f_1.p_r AS pay_or_rec, + f_1.state, + f_1.weight_type, + sc.shipment_quantity, + f_1.price AS fee_price, + f_1.currency AS currency_id, + COALESCE(f_1.unit, sc.shipment_unit_id) AS unit_id, + CASE + WHEN upper(f_1.p_r::text) = 'REC'::text THEN 1 + ELSE '-1'::integer + END AS sign_multiplier, + NULL::text AS forced_cost_group + FROM shipment_context sc + JOIN fee_fee f_1 ON f_1.sale_line = sc.sale_line_id + WHERE f_1.type::text = 'budgeted'::text AND sc.sale_line_id IS NOT NULL + ), contract_budgeted_allocated AS ( + SELECT c.fee_id, + c.fee_source, + c.fee_type, + c.priority, + c.shipment_id, + c.lot_id, + c.purchase_line_id, + c.sale_line_id, + c.product_id, + c.supplier_id, + c.packaging, + c.pay_or_rec, + c.state, + c.weight_type, + c.shipment_quantity, + c.fee_price, + c.currency_id, + c.unit_id, + c.sign_multiplier, + c.forced_cost_group, + LEAST(c.shipment_quantity, GREATEST(sum(c.shipment_quantity) OVER (PARTITION BY c.shipment_id, c.product_id, c.supplier_id, c.fee_id) - COALESCE(fc.allocated_quantity, 0::numeric) - COALESCE(sum(c.shipment_quantity) OVER (PARTITION BY c.shipment_id, c.product_id, c.supplier_id, c.fee_id ORDER BY c.lot_id ROWS BETWEEN UNBOUNDED PRECEDING AND 1 PRECEDING), 0::numeric), 0::numeric)) AS allocated_quantity + FROM contract_budgeted_fee_candidates c + LEFT JOIN shipment_fee_coverage fc ON fc.shipment_id = c.shipment_id AND fc.product_id = c.product_id AND fc.supplier_id = c.supplier_id + ), price_rows AS ( + SELECT NULL::integer AS fee_id, + 'Purchase Price'::text AS fee_source, + 'price'::text AS fee_type, + 4 AS priority, + sc.shipment_id, + sc.lot_id, + sc.purchase_line_id, + sc.sale_line_id, + pl.product AS product_id, + NULL::integer AS supplier_id, + NULL::character varying AS packaging, + NULL::character varying AS pay_or_rec, + NULL::character varying AS state, + NULL::character varying AS weight_type, + sc.shipment_quantity AS allocated_quantity, + pl.unit_price AS fee_price, + pl.currency_ AS currency_id, + COALESCE(pl.unit, sc.shipment_unit_id) AS unit_id, + 1 AS sign_multiplier, + 'PurchasePrice'::text AS forced_cost_group + FROM shipment_context sc + JOIN purchase_line pl ON pl.id = sc.purchase_line_id + WHERE sc.purchase_line_id IS NOT NULL + UNION ALL + SELECT NULL::integer AS fee_id, + 'Sale Price'::text AS fee_source, + 'price'::text AS fee_type, + 5 AS priority, + sc.shipment_id, + sc.lot_id, + sc.purchase_line_id, + sc.sale_line_id, + sl.product AS product_id, + NULL::integer AS supplier_id, + NULL::character varying AS packaging, + NULL::character varying AS pay_or_rec, + NULL::character varying AS state, + NULL::character varying AS weight_type, + sc.shipment_quantity AS allocated_quantity, + sl.unit_price AS fee_price, + ss.currency AS currency_id, + COALESCE(sl.unit, sc.shipment_unit_id) AS unit_id, + '-1'::integer AS sign_multiplier, + 'SalePrice'::text AS forced_cost_group + FROM shipment_context sc + JOIN sale_line sl ON sl.id = sc.sale_line_id + JOIN sale_sale ss ON ss.id = sl.sale + WHERE sc.sale_line_id IS NOT NULL + ), final_fees AS ( + SELECT shipment_fee_allocated.fee_id, + shipment_fee_allocated.fee_source, + shipment_fee_allocated.fee_type, + shipment_fee_allocated.priority, + shipment_fee_allocated.shipment_id, + shipment_fee_allocated.lot_id, + shipment_fee_allocated.purchase_line_id, + shipment_fee_allocated.sale_line_id, + shipment_fee_allocated.product_id, + shipment_fee_allocated.supplier_id, + shipment_fee_allocated.packaging, + shipment_fee_allocated.pay_or_rec, + shipment_fee_allocated.state, + shipment_fee_allocated.weight_type, + shipment_fee_allocated.allocated_quantity AS fee_quantity, + shipment_fee_allocated.fee_price, + shipment_fee_allocated.currency_id, + shipment_fee_allocated.unit_id, + shipment_fee_allocated.sign_multiplier, + shipment_fee_allocated.forced_cost_group + FROM shipment_fee_allocated + WHERE shipment_fee_allocated.allocated_quantity > 0::numeric + UNION ALL + SELECT contract_budgeted_allocated.fee_id, + contract_budgeted_allocated.fee_source, + contract_budgeted_allocated.fee_type, + contract_budgeted_allocated.priority, + contract_budgeted_allocated.shipment_id, + contract_budgeted_allocated.lot_id, + contract_budgeted_allocated.purchase_line_id, + contract_budgeted_allocated.sale_line_id, + contract_budgeted_allocated.product_id, + contract_budgeted_allocated.supplier_id, + contract_budgeted_allocated.packaging, + contract_budgeted_allocated.pay_or_rec, + contract_budgeted_allocated.state, + contract_budgeted_allocated.weight_type, + contract_budgeted_allocated.allocated_quantity AS fee_quantity, + contract_budgeted_allocated.fee_price, + contract_budgeted_allocated.currency_id, + contract_budgeted_allocated.unit_id, + contract_budgeted_allocated.sign_multiplier, + contract_budgeted_allocated.forced_cost_group + FROM contract_budgeted_allocated + WHERE contract_budgeted_allocated.allocated_quantity > 0::numeric + UNION ALL + SELECT price_rows.fee_id, + price_rows.fee_source, + price_rows.fee_type, + price_rows.priority, + price_rows.shipment_id, + price_rows.lot_id, + price_rows.purchase_line_id, + price_rows.sale_line_id, + price_rows.product_id, + price_rows.supplier_id, + price_rows.packaging, + price_rows.pay_or_rec, + price_rows.state, + price_rows.weight_type, + price_rows.allocated_quantity AS fee_quantity, + price_rows.fee_price, + price_rows.currency_id, + price_rows.unit_id, + price_rows.sign_multiplier, + price_rows.forced_cost_group + FROM price_rows + WHERE price_rows.allocated_quantity > 0::numeric + ) + SELECT f.shipment_id AS "intShipmentId", + f.lot_id AS "intLotId", + COALESCE(f.fee_id, 0) AS "intFeeId", + f.fee_source AS "strFeeSource", + f.fee_type AS "strFeeType", + f.priority AS "intPriority", + COALESCE(f.purchase_line_id, 0) AS "intPurchaseLineId", + COALESCE(f.sale_line_id, 0) AS "intSaleLineId", + COALESCE(f.product_id, 0) AS "intProductId", + COALESCE(p.code, ''::character varying) AS "strFee", + COALESCE(f.supplier_id, 0) AS "intSupplierId", + COALESCE(sup.name, ''::character varying) AS "strSupplier", + COALESCE(f.packaging, ''::character varying) AS "strPackaging", + COALESCE(f.pay_or_rec, ''::character varying) AS "strPayOrRec", + COALESCE(f.state, ''::character varying) AS "strState", + CASE + WHEN upper(f.weight_type::text) = 'BRUT'::text THEN 'Gross'::text + ELSE 'Net'::text + END AS "strWeighingType", + f.fee_quantity AS "dblQuantity", + f.fee_price AS "dblPrice", + COALESCE(cur.name, ''::character varying) AS "strCurrency", + COALESCE(uom.name, 'Mt'::character varying) AS "strUnit", + f.fee_quantity * f.fee_price AS "dblAmount", + COALESCE(f.forced_cost_group, + CASE + WHEN upper(p.code::text) ~~ '%FREIGHT%'::text THEN 'Freight'::text + WHEN upper(p.code::text) ~~ '%PROFIT SHARING%'::text THEN 'Profit Sharing'::text + ELSE 'Other Costs'::text + END) AS "strCostGroup", + CASE + WHEN f.pay_or_rec::text = 'pay'::text THEN - 1::numeric + WHEN f.pay_or_rec::text = 'rec'::text THEN 1::numeric + WHEN f.fee_source = 'Purchase Price'::text AND f.fee_type::text = 'price'::text THEN - 1::numeric + WHEN f.fee_source = 'Sale Price'::text AND f.fee_type::text = 'price'::text THEN 1::numeric + ELSE - 1::numeric + END AS "intSignMultiplier" + FROM final_fees f + JOIN product_product p ON p.id = f.product_id + LEFT JOIN party_party sup ON sup.id = f.supplier_id + LEFT JOIN currency_currency cur ON cur.id = f.currency_id + LEFT JOIN product_uom uom ON uom.id = f.unit_id; diff --git a/modules/trade_finance/facility.py b/modules/trade_finance/facility.py index 8cff530..036faf7 100644 --- a/modules/trade_finance/facility.py +++ b/modules/trade_finance/facility.py @@ -1,7 +1,7 @@ # This file is part of Tradon. The COPYRIGHT file at the top level of # this repository contains the full copyright notices and license terms. -from trytond.model import ModelSQL, ModelView, fields +from trytond.model import ModelSQL, ModelView, fields, tree from trytond.model import sequence_ordered from trytond.pool import Pool from trytond.pyson import Eval, Bool @@ -184,7 +184,7 @@ class FacilityCovenant(ModelSQL, ModelView): # Facility Limit (Global Limit + Sub-Limits in one model) # --------------------------------------------------------------------------- -class FacilityLimit(ModelSQL, ModelView): +class FacilityLimit(tree(), ModelSQL, ModelView): 'Facility Limit' __name__ = 'trade_finance.facility_limit' _rec_name = 'name' @@ -194,24 +194,41 @@ class FacilityLimit(ModelSQL, ModelView): states={'readonly': Bool(Eval('parent'))}, depends=['parent']) parent = fields.Many2One('trade_finance.facility_limit', 'Parent Limit', + left='left', right='right', ondelete='RESTRICT', domain=[('facility', '=', Eval('facility'))], depends=['facility'], help='Leave empty for Global Limit (root node)') children = fields.One2Many('trade_finance.facility_limit', 'parent', 'Sub-Limits') + left = fields.Integer('Left', required=True) + right = fields.Integer('Right', required=True) name = fields.Char('Name', required=True) alternative_name = fields.Char('Limit Alternative Name') financing_type = fields.Many2One('trade_finance.financing_type', 'Financing Type', ondelete='RESTRICT') + currency = fields.Many2One('currency.currency', 'Currency', + ondelete='RESTRICT', + states={'readonly': Bool(Eval('parent'))}, + depends=['parent'], + help='Currency of the global limit. Sub-limits inherit it from ' + 'their parent.') amount = fields.Numeric('Amount', digits=(16, 2), required=True) tenor = fields.Integer('Tenor (days)', help='Maximum duration of financing from drawdown to repayment') + date_from = fields.Date('Valid From') + date_to = fields.Date('Valid To') sequence = fields.Integer('Sequence') + notes = fields.Text('Notes') _order = [('sequence', 'ASC'), ('id', 'ASC')] + @classmethod + def __register__(cls, module_name): + super().__register__(module_name) + cls._rebuild_tree('parent', None, 0) + haircuts = fields.One2Many('trade_finance.facility_limit_haircut', 'limit', 'Haircuts') currencies = fields.One2Many('trade_finance.facility_limit_currency', @@ -230,6 +247,38 @@ class FacilityLimit(ModelSQL, ModelView): def default_sequence(): return 10 + @staticmethod + def default_left(): + return 0 + + @staticmethod + def default_right(): + return 0 + + @fields.depends('facility', 'currency', 'date_from', 'date_to', 'parent', + '_parent_parent.facility', '_parent_parent.currency', + '_parent_parent.date_from', '_parent_parent.date_to') + def on_change_parent(self): + if self.parent: + self.facility = self.parent.facility + self.currency = self.parent.currency + if not self.date_from: + self.date_from = self.parent.date_from + if not self.date_to: + self.date_to = self.parent.date_to + + @fields.depends('facility', 'currency', 'date_from', 'date_to', 'parent', + '_parent_facility.currency', '_parent_facility.date_from', + '_parent_facility.date_to') + def on_change_facility(self): + if self.facility and not self.parent: + if not self.currency: + self.currency = self.facility.currency + if not self.date_from: + self.date_from = self.facility.date_from + if not self.date_to: + self.date_to = self.facility.date_to + @classmethod def create(cls, vlist): vlist = [v.copy() for v in vlist] @@ -237,13 +286,73 @@ class FacilityLimit(ModelSQL, ModelView): if values.get('parent') and not values.get('facility'): parent = cls(values['parent']) values['facility'] = parent.facility.id + if values.get('parent'): + parent = cls(values['parent']) + values['currency'] = ( + parent.currency.id if parent.currency else None) + values.setdefault('date_from', parent.date_from) + values.setdefault('date_to', parent.date_to) + elif values.get('facility'): + facility = Pool().get('trade_finance.facility')( + values['facility']) + values.setdefault('currency', + facility.currency.id if facility.currency else None) + values.setdefault('date_from', facility.date_from) + values.setdefault('date_to', facility.date_to) return super().create(vlist) + @classmethod + def write(cls, *args): + args = list(args) + actions = iter(args) + new_args = [] + check_descendants = [] + sync_currency = [] + for limits, values in zip(actions, actions): + values = values.copy() + if values.get('parent'): + parent = cls(values['parent']) + values['facility'] = parent.facility.id + values['currency'] = ( + parent.currency.id if parent.currency else None) + if {'parent', 'currency'} & set(values): + sync_currency.extend(limits) + if {'parent', 'currency', 'date_from', 'date_to'} & set(values): + check_descendants.extend(limits) + new_args.extend((limits, values)) + result = super().write(*new_args) + cls._sync_descendant_currencies(sync_currency) + cls._check_descendants(check_descendants) + return result + + @classmethod + def _sync_descendant_currencies(cls, limits): + for limit in limits: + limit = cls(limit.id) + if not limit.currency: + continue + descendants = cls.search([('parent', 'child_of', [limit.id])]) + if descendants: + super(FacilityLimit, cls).write( + descendants, {'currency': limit.currency.id}) + + @classmethod + def _check_descendants(cls, limits): + descendants = [] + for limit in limits: + descendants.extend( + cls.search([('parent', 'child_of', [limit.id])])) + if descendants: + cls.validate(descendants) + @classmethod def validate(cls, limits): super().validate(limits) for limit in limits: limit.check_single_root() + limit.check_required_values() + limit.check_parent_consistency() + limit.check_dates_within_parent() limit.check_amount_vs_parent() limit.check_children_amounts() @@ -260,6 +369,49 @@ class FacilityLimit(ModelSQL, ModelView): f"Limit ('{roots[0].name}'). Only one root limit is " f"allowed per facility.") + def check_required_values(self): + if not self.currency: + raise UserError( + f"Limit '{self.name}' must define or inherit a currency.") + if not self.date_from or not self.date_to: + raise UserError( + f"Limit '{self.name}' must define valid from and valid to " + f"dates.") + if self.date_from > self.date_to: + raise UserError( + f"Limit '{self.name}' valid from date cannot be after " + f"its valid to date.") + + def check_parent_consistency(self): + if not self.parent: + return + if self.facility != self.parent.facility: + raise UserError( + f"Sub-limit '{self.name}' must belong to the same facility " + f"as parent limit '{self.parent.name}'.") + if self.currency != self.parent.currency: + raise UserError( + f"Sub-limit '{self.name}' must use the same currency as " + f"parent limit '{self.parent.name}'.") + + def check_dates_within_parent(self): + if self.date_from and self.date_to and self.date_from > self.date_to: + raise UserError( + f"Limit '{self.name}' valid from date cannot be after its " + f"valid to date.") + if not self.parent: + return + if (self.date_from and self.parent.date_from + and self.date_from < self.parent.date_from): + raise UserError( + f"Sub-limit '{self.name}' valid from date cannot be before " + f"parent limit '{self.parent.name}' valid from date.") + if (self.date_to and self.parent.date_to + and self.date_to > self.parent.date_to): + raise UserError( + f"Sub-limit '{self.name}' valid to date cannot be after " + f"parent limit '{self.parent.name}' valid to date.") + def check_amount_vs_parent(self): if self.parent and self.amount > self.parent.amount: raise UserError( diff --git a/modules/trade_finance/tests/__init__.py b/modules/trade_finance/tests/__init__.py new file mode 100644 index 0000000..303e6e3 --- /dev/null +++ b/modules/trade_finance/tests/__init__.py @@ -0,0 +1,2 @@ +# This file is part of Tradon. The COPYRIGHT file at the top level of +# this repository contains the full copyright notices and license terms. diff --git a/modules/trade_finance/tests/test_module.py b/modules/trade_finance/tests/test_module.py new file mode 100644 index 0000000..e297e22 --- /dev/null +++ b/modules/trade_finance/tests/test_module.py @@ -0,0 +1,117 @@ +# This file is part of Tradon. The COPYRIGHT file at the top level of +# this repository contains the full copyright notices and license terms. + +from datetime import date +from decimal import Decimal + +from trytond.exceptions import UserError +from trytond.modules.currency.tests import create_currency +from trytond.pool import Pool +from trytond.tests.test_tryton import ModuleTestCase, with_transaction + + +class TradeFinanceTestCase(ModuleTestCase): + 'Test Trade Finance module' + module = 'trade_finance' + + def create_facility(self): + pool = Pool() + Bank = pool.get('bank') + Facility = pool.get('trade_finance.facility') + Party = pool.get('party.party') + + currency = create_currency('USD') + party = Party(name='Test Bank') + party.save() + bank = Bank(party=party) + bank.save() + facility = Facility( + name='Test Facility', + tfe=bank, + currency=currency, + commitment_status='committed', + date_from=date(2026, 1, 1), + date_to=date(2026, 12, 31)) + facility.save() + return facility, currency + + @with_transaction() + def test_sublimit_inherits_currency_and_dates(self): + 'Test sublimit inherits currency and dates from parent' + pool = Pool() + Limit = pool.get('trade_finance.facility_limit') + + facility, currency = self.create_facility() + root, = Limit.create([{ + 'facility': facility.id, + 'name': 'Global limit', + 'currency': currency.id, + 'amount': Decimal('100.00'), + 'date_from': date(2026, 1, 1), + 'date_to': date(2026, 12, 31), + }]) + child, = Limit.create([{ + 'parent': root.id, + 'name': 'Trading limit', + 'amount': Decimal('50.00'), + }]) + + self.assertEqual(child.facility, facility) + self.assertEqual(child.currency, currency) + self.assertEqual(child.date_from, root.date_from) + self.assertEqual(child.date_to, root.date_to) + + @with_transaction() + def test_sublimit_dates_must_stay_within_parent(self): + 'Test sublimit dates stay within parent dates' + pool = Pool() + Limit = pool.get('trade_finance.facility_limit') + + facility, currency = self.create_facility() + root, = Limit.create([{ + 'facility': facility.id, + 'name': 'Global limit', + 'currency': currency.id, + 'amount': Decimal('100.00'), + 'date_from': date(2026, 1, 1), + 'date_to': date(2026, 12, 31), + }]) + + with self.assertRaises(UserError): + Limit.create([{ + 'parent': root.id, + 'name': 'Late limit', + 'amount': Decimal('50.00'), + 'date_from': date(2026, 1, 1), + 'date_to': date(2027, 1, 1), + }]) + + @with_transaction() + def test_currency_change_cascades_to_sublimits(self): + 'Test root currency changes cascade to sublimits' + pool = Pool() + Limit = pool.get('trade_finance.facility_limit') + + facility, currency = self.create_facility() + other_currency = create_currency('EUR') + root, = Limit.create([{ + 'facility': facility.id, + 'name': 'Global limit', + 'currency': currency.id, + 'amount': Decimal('100.00'), + 'date_from': date(2026, 1, 1), + 'date_to': date(2026, 12, 31), + }]) + child, = Limit.create([{ + 'parent': root.id, + 'name': 'Trading limit', + 'amount': Decimal('50.00'), + }]) + + Limit.write([root], {'currency': other_currency.id}) + child = Limit(child.id) + + self.assertEqual(child.currency, other_currency) + + +del ModuleTestCase diff --git a/modules/trade_finance/view/facility_form.xml b/modules/trade_finance/view/facility_form.xml index 88b9a09..b2e296a 100644 --- a/modules/trade_finance/view/facility_form.xml +++ b/modules/trade_finance/view/facility_form.xml @@ -30,9 +30,10 @@ - + + domain="[('parent', '=', None)]" + view_ids="trade_finance.facility_limit_view_tree,trade_finance.facility_limit_view_form"/> diff --git a/modules/trade_finance/view/facility_limit_form.xml b/modules/trade_finance/view/facility_limit_form.xml index c49dbfe..5208e2e 100644 --- a/modules/trade_finance/view/facility_limit_form.xml +++ b/modules/trade_finance/view/facility_limit_form.xml @@ -6,8 +6,14 @@