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