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;;