Files
tradon/ITSA/Data Reconciliation/update_vw_utility_open_position.sql
AzureAD\SylvainDUVERNAY 181de17b89 Trade Finance + Other changes
2026-05-25 11:17:18 +02:00

155 lines
4.7 KiB
SQL

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;