90 lines
4.8 KiB
SQL
90 lines
4.8 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.targeted_qt - 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.targeted_qt - 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;;
|