WITH 
target AS (select target_increment incr)
,basemix AS (
    SELECT
        fspr
        ,plnt          ---master data 
        ,promo          --history date mix
        ,terms
        ,bill_cust_descr          --history cust mix
        ,ship_cust_descr          --history cust mix
        ,dsm
        ,quota_rep_descr          --master data 
        ,director
        ,billto_group          --master data 
        ,shipto_group
        ,chan          --master data 
        ,chansub
        ,chan_retail
        ,part
        ,part_descr
        ,part_group
        ,branding
        ,majg_descr
        ,ming_descr
        ,majs_descr
        ,mins_descr
        ,segm
        ,fs_line          --master data 
        ,r_currency          --history cust mix
        ,r_rate          --master data 
        ,c_currency          --master data 
        ,c_rate          --master data 
        ,sum(coalesce(units,0)) units          --history value
        ,sum(coalesce(value_loc,0)) value_loc          --history value
        ,sum(coalesce(value_usd,0)) value_usd          --0 
        ,sum(coalesce(cost_loc,0)) cost_loc          --history part mix
        ,sum(coalesce(cost_usd,0)) cost_usd
        ,calc_status          --0 
        ,flag          --0 
        ,order_date          --history date mix
        ,order_month
        ,order_season
        ,request_date          --history date mix
        ,request_month
        ,request_season
        ,ship_date          --history date mix
        ,ship_month
        ,ship_season
    FROM
        rlarp.osm_pool
    WHERE
        -----------------scenario----------------------------
        where_clause
        -----------------additional params-------------------
        AND calc_status||flag <> 'CLOSEDREMAINDER' --exclude short ships when building order adjustments
        AND order_date <= ship_date
    GROUP BY
                fspr
        ,plnt          ---master data 
        ,promo          --history date mix
        ,terms
        ,bill_cust_descr          --history cust mix
        ,ship_cust_descr          --history cust mix
        ,dsm
        ,quota_rep_descr          --master data 
        ,director
        ,billto_group          --master data 
        ,shipto_group
        ,chan          --master data 
        ,chansub
        ,chan_retail
        ,part
        ,part_descr
        ,part_group
        ,branding
        ,majg_descr
        ,ming_descr
        ,majs_descr
        ,mins_descr
        ,segm
        ,fs_line          --master data 
        ,r_currency          --history cust mix
        ,r_rate          --master data 
        ,c_currency          --master data 
        ,c_rate          --master data 
        ,calc_status          --0 
        ,flag          --0 
        ,order_date          --history date mix
        ,order_month
        ,order_season
        ,request_date          --history date mix
        ,request_month
        ,request_season
        ,ship_date          --history date mix
        ,ship_month
        ,ship_season
)
,scale AS (
    SELECT
        (SELECT incr::numeric FROM target) incr
        ,(SELECT sum(value_loc * r_rate) FROM basemix) base
        ,CASE WHEN (SELECT sum(value_loc * r_rate) FROM basemix) = 0 THEN
            0
        ELSE
            (SELECT incr::numeric FROM target)/(SELECT sum(value_loc * r_rate) FROM basemix) 
        END factor
        ,CASE WHEN (SELECT sum(value_loc * r_rate) FROM basemix) = 0 THEN
            CASE WHEN ((SELECT incr::numeric FROM target) - (SELECT sum(value_loc * r_rate) FROM basemix)) <> 0 THEN
                --if the base value is -0- but the target value hasn't been achieved, derive a price to apply
                ((SELECT incr::numeric FROM target) - (SELECT sum(value_loc * r_rate) FROM basemix))/(SELECT sum(units) FROM basemix)
            ELSE
                0
            END
        ELSE
            0
        END mod_price
)
,log AS (
    INSERT INTO rlarp.osm_log(doc) SELECT $$replace_iterdef$$::jsonb doc RETURNING *
)
,final AS (
    SELECT
        fspr
        ,plnt          ---master data 
        ,promo          --history date mix
        ,terms
        ,bill_cust_descr          --history cust mix
        ,ship_cust_descr          --history cust mix
        ,dsm
        ,quota_rep_descr          --master data 
        ,director
        ,billto_group          --master data 
        ,shipto_group
        ,chan          --master data 
        ,chansub
        ,chan_retail
        ,part
        ,part_descr
        ,part_group
        ,branding
        ,majg_descr
        ,ming_descr
        ,majs_descr
        ,mins_descr
        ,segm
        ,fs_line          --master data 
        ,r_currency          --history cust mix
        ,r_rate          --master data 
        ,c_currency          --master data 
        ,c_rate          --master data 
        ,0::numeric units
        ,(CASE WHEN s.factor = 0 THEN b.units * s.mod_price/b.r_rate ELSE b.value_loc*s.factor END)::numeric value_loc
        ,(CASE WHEN s.factor = 0 THEN b.units * s.mod_price ELSE b.value_usd*s.factor END)::numeric value_usd
        ,0::numeric cost_loc
        ,0::numeric cost_usd
        ,calc_status          --0 
        ,flag          --0 
        ,order_date          --history date mix
        ,order_month
        ,order_season
        ,request_date          --history date mix
        ,request_month
        ,request_season
        ,ship_date          --history date mix
        ,ship_month
        ,ship_season
        ,'replace_version' "version"
        ,'replace_source'||' price'  iter
        ,log.id
        ,log.doc->>'message' "comment"
        ,log.doc->>'type' module
    FROM
        basemix b
        CROSS JOIN scale s
        CROSS JOIN log
    WHERE
        s.factor <> 0 or s.mod_price <> 0
)
--select sum(value_usd), count(*) from final
, ins AS (
    INSERT INTO rlarp.osm_pool SELECT * FROM final RETURNING *
)
,insagg AS (
   SELECT
        ---------customer info-----------------
        bill_cust_descr
        ,billto_group
        ,ship_cust_descr
        ,shipto_group
        ,quota_rep_descr
        ,director
        ,segm
        ,chan
        ,chansub
        ---------product info------------------
        ,majg_descr
        ,ming_descr
        ,majs_descr
        ,mins_descr
        --,brand
        --,part_family
        ,part_group
        ,branding
        --,color
        ,part_descr
        ---------dates-------------------------
        ,order_season
        ,order_month
        ,ship_season
        ,ship_month
        ,request_season
        ,request_month
        ,promo
        ,version
        ,iter
        ,logid
        ,comment
        ,module
        --------values-------------------------
        ,sum(value_loc) value_loc
        ,sum(value_usd) value_usd
        ,sum(cost_loc) cost_loc
        ,sum(cost_usd) cost_usd
        ,sum(units) units
    FROM
        ins
    GROUP BY
        ---------customer info-----------------
        bill_cust_descr
        ,billto_group
        ,ship_cust_descr
        ,shipto_group
        ,quota_rep_descr
        ,director
        ,segm
        ,chan
        ,chansub
        ---------product info------------------
        ,majg_descr
        ,ming_descr
        ,majs_descr
        ,mins_descr
        --,brand
        --,part_family
        ,part_group
        ,branding
        --,color
        ,part_descr
        ---------dates-------------------------
        ,order_season
        ,order_month
        ,ship_season
        ,ship_month
        ,request_season
        ,request_month
        ,promo
        ,version
        ,iter
        ,logid
        ,comment
        ,module
)
SELECT json_agg(row_to_json(insagg)) x from insagg
