BEGIN;

WITH
mseq AS (
    SELECT * FROM 
    (
        VALUES
        ('Jun',1,6,-1)
        ,('Jul',2,7,-1)
        ,('Aug',3,8,-1)
        ,('Sep',4,9,-1)
        ,('Oct',5,10,-1)
        ,('Nov',6,11,-1)
        ,('Dec',7,12,-1)
        ,('Jan',8,1,0)
        ,('Feb',9,2,0)
        ,('Mar',10,3,0)
        ,('Apr',11,4,0)
        ,('May',12,5,0)
    ) x(m,s,cal,yr)
)
,alldates AS (
    SELECT  
        shipgrp
        ,to_char(orderdate,'Mon') orderm
        ,extract(month FROM age(requestdate,orderdate)) rmo
        ,(sum((shipdate - requestdate)* (fb_val_loc * r_rate))/sum(fb_val_loc * r_rate))::int wav_lag
        --,sum(fb_val_loc * r_rate) value_usd
    FROM
        rlarp.osm
    WHERE
        adj_orderdate >= '2017-06-01'
        AND calc_status||flag <> 'CLOSEDREMAINDER' --exclude short ships when building order adjustments
        AND adj_orderdate <= adj_shipdate
        AND fspr IS NOT NULL
    GROUP BY
        shipgrp
        ,to_char(orderdate,'Mon')
        ,extract(month FROM age(requestdate,orderdate))
    HAVING
        sum(fb_val_loc * r_rate) <> 0
)
,lag AS (
    SELECT 
        shipgrp
        ,orderm
        ,rmo
        ,wav_lag
    FROM
        alldates 
    ORDER BY 
        shipgrp
        ,orderm
        ,rmo
)
,opord AS (
SELECT  
    shipgrp
    ,orderdate
    ,requestdate
    ,shipdate
    ,to_char(orderdate,'Mon') orderm
    ,extract(month FROM age(requestdate,orderdate)) rmo
    ,sum(fb_val_loc * r_rate) value_usd
FROM
    rlarp.osm
WHERE
    calc_status NOT IN ('CANCELED','CLOSED')
GROUP BY
    shipgrp
    ,orderdate
    ,requestdate
    ,shipdate
    ,to_char(orderdate,'Mon')
    ,extract(month FROM age(requestdate,orderdate))
ORDER BY
    value_usd DESC
)
,upd AS (
UPDATE rlarp.osmfs o SET
    adj_shipdate = greatest(shipdate + lag.wav_lag + 5 ,shipdate)
FROM
    lag
WHERE
    lag.shipgrp = o.shipgrp
    AND lag.orderm = to_char(o.orderdate,'Mon')
    AND lag.rmo = extract(month FROM age(o.requestdate,o.orderdate))
    AND o.calc_status in ('BACKORDER','OPEN')
RETURNING *
)
SELECT 
    sum(fb_val_loc *r_rate) filter (where adj_shipdate < '2019-04-01') 
    ,sum(fb_val_loc *r_rate) filter (where adj_shipdate >= '2019-04-01')
from upd;

COMMIT;