-- Connection: usmidsap01.ubm
--\timing

/*----------------------------------------------------------------------------------------
1. copy existing actuals for the current season (which is incomplete)
    * for example 6/1/22 -> 3/7/23
2. fill out a full year of history by going back 2 years to get 3/8/22 -> 5/31/22
3. stack the results of 1 & 2 and increment all rows by 1 year
*/----------------------------------------------------------------------------------------

TRUNCATE TABLE rlarp.osmf;

INSERT INTO rlarp.osmf
WITH
baseline AS (
    SELECT
        -----------documents-------------
        null::int "ddord#"
        ,null::int "dditm#"
        ,null::int "fgbol#"
        ,null::int "fgent#"
        ,null::int "diinv#"
        ,null::int "dilin#"
        ,null::int quoten
        ,null::int quotel
        ----------dates/status------------------
        ,o.odate dcodat
        ,o.rdate ddqdat
        ,null::date dcmdat
        ,null::date fesdat
        ,greatest(least(o.sdate,gld.edat),gld.sdat) dhidat
        ,null::text fesind
        ,null::text dhpost
        ,o.fspr
        -----------measures--------------------
        ,null::numeric ddqtoi
        ,null::numeric ddqtsi
        ,null::numeric fgqshp
        ,null::numeric diqtsh
        ,null::numeric diext
        ,null::numeric ditdis
        ,null::jsonb discj
        ,null::text dhincr
        ,o.plnt
        ,COALESCE(o.promo,'') promo
        ,null::text return_reas
        ,o.terms
        ,null::text custpo
        ,null::text remit_to
        ,null::text bill_class
        ,o.bill_cust
        ,null::text bill_rep
        ,null::text bill_terr
        ,null::text ship_class
        ,o.ship_cust
        ,null::text ship_rep
        ,null::text ship_terr
        ,o.dsm
        ,null::text account
        ,null::text shipgrp
        ,null::text geo
        ,null::text chan
        ,null::text chansub
        ,null::text orig_ctry
        ,null::text orig_prov
        ,null::text orig_post
        ,null::text bill_ctry
        ,null::text bill_prov
        ,null::text bill_post
        ,null::text dest_ctry
        ,null::text dest_prov
        ,null::text dest_post
        ,o.part
        ,null::text styc
        ,null::text colc
        ,null::text colgrp
        ,null::text coltier
        ,null::text colstat
        ,null::text sizc
        ,null::text uomp
        ,null::text suffix
        ,null::text accs_ps
        ,null::text brnd
        ,null::text majg
        ,null::text ming
        ,null::text majs
        ,null::text mins
        ,null::text gldco
        ,null::text gldc
        ,null::text glec
        ,null::text harm
        ,null::text clss
        ,null::text brand
        ,null::text assc
        ,null::text ddunit
        ,null::text unti
        ,null::numeric lbs
        ,null::numeric plt
        ,null::text plcd
        ,o.fs_line
        ,o.r_currency
        ,o.r_rate
        ,o.c_currency
        ,o.c_rate
        ,sum(o.fb_qty) fb_qty
        ,sum(o.fb_val_loc) fb_val_loc
        ,sum(o.fb_val_loc_dis) fb_val_loc_dis
        ,sum(o.fb_val_loc_qt) fb_val_loc_qt
        ,sum(o.fb_val_loc_pl) fb_val_loc_pl
        ,sum(o.fb_val_loc_tar) fb_val_loc_tar
        ,sum(o.fb_cst_loc) fb_cst_loc
        ,sum(o.fb_cst_loc_cur) fb_cst_loc_cur
        ,sum(o.fb_cst_loc_fut) fb_cst_loc_fut
        ,o.calc_status
        ,o.flag
        ,o.odate
        ,o.oseas
        ,o.rdate
        ,o.rseas
        ,o.pdate
        ,o.pseas
        -----when null, greatest/least is just going to act like coalesce
        ,greatest(least(o.sdate,gld.edat),gld.sdat) sdate
        ,ss.ssyr sseas
        ,'b24' "version"
        ,'actuals' iter
    FROM
        rlarp.osm o
        --snap the ship dates of the historic fiscal period
        LEFT OUTER JOIN rlarp.gld ON
            gld.fspr = o.fspr
        --get the shipping season for open orders based on the snapped date
        LEFT OUTER JOIN rlarp.gld ss ON
            greatest(least(o.sdate,gld.edat),gld.sdat) BETWEEN ss.sdat AND ss.edat
    WHERE
        (
            --base period orders booked....
            o.odate BETWEEN '2018-06-01' AND '2019-05-31'
            --...or any open orders currently booked before cutoff....
            --OR (o.calc_status IN ('OPEN','BACKORDER') and o.odate < '2023-03-01')
            --...or anything that shipped in that period
            --OR ((o.fspr BETWEEN '1901' AND '1912' OR o.fspr = '0000') AND o.sdate < '2023-03-01')
            OR (o.fspr BETWEEN '1901' AND '1912') 
        )
        AND fs_line = '41010'
        AND calc_status <> 'CANCELED'
        AND NOT (calc_status = 'CLOSED' AND flag = 'REMAINDER')
        ---exclude integrated quotes----
        AND version = 'ACTUALS'
    GROUP BY
        o.fspr
        ,o.plnt
        ,COALESCE(o.promo,'')
        ,o.terms
        ,o.bill_cust
        ,o.ship_cust
        ,o.dsm
        ,o.part
        ,o.fs_line
        ,o.r_currency
        ,o.r_rate
        ,o.c_currency
        ,o.c_rate
        ,o.calc_status
        ,o.flag
        ,o.odate
        ,o.oseas
        ,o.rdate
        ,o.rseas
        ,o.pdate
        ,o.pseas
        ,greatest(least(o.sdate,gld.edat),gld.sdat)
        ,ss.ssyr
    UNION ALL
    SELECT
        -----------documents-------------
        null::int "ddord#"
        ,null::int "dditm#"
        ,null::int "fgbol#"
        ,null::int "fgent#"
        ,null::int "diinv#"
        ,null::int "dilin#"
        ,null::int quoten
        ,null::int quotel
        ----------dates/status------------------
        ,o.odate + interval '1 year' dcodat
        ,o.rdate + interval '1 year' ddqdat
        ,null::date dcmdat
        ,null::date fesdat
        ,greatest(least(o.sdate,gld.edat),gld.sdat)  + interval '1 year' dhidat
        ,null::text fesind
        ,null::text dhpost
        ,o.fspr
        -----------measures--------------------
        ,null::numeric ddqtoi
        ,null::numeric ddqtsi
        ,null::numeric fgqshp
        ,null::numeric diqtsh
        ,null::numeric diext
        ,null::numeric ditdis
        ,null::jsonb discj
        ,null::text dhincr
        ,plnt
        ,COALESCE(o.promo,'') promo
        ,null::text return_reas
        ,o.terms
        ,null::text custpo
        ,null::text remit_to
        ,null::text bill_class
        ,o.bill_cust
        ,null::text bill_rep
        ,null::text bill_terr
        ,null::text ship_class
        ,ship_cust
        ,null::text ship_rep
        ,null::text ship_terr
        ,o.dsm
        ,null::text account
        ,null::text shipgrp
        ,null::text geo
        ,null::text chan
        ,null::text chansub
        ,null::text orig_ctry
        ,null::text orig_prov
        ,null::text orig_post
        ,null::text bill_ctry
        ,null::text bill_prov
        ,null::text bill_post
        ,null::text dest_ctry
        ,null::text dest_prov
        ,null::text dest_post
        ,o.part
        ,null::text styc
        ,null::text colc
        ,null::text colgrp
        ,null::text coltier
        ,null::text colstat
        ,null::text sizc
        ,null::text uomp
        ,null::text suffix
        ,null::text accs_ps
        ,null::text brnd
        ,null::text majg
        ,null::text ming
        ,null::text majs
        ,null::text mins
        ,null::text gldco
        ,null::text gldc
        ,null::text glec
        ,null::text harm
        ,null::text clss
        ,null::text brand
        ,null::text assc
        ,null::text ddunit
        ,null::text unti
        ,null::numeric lbs
        ,null::numeric plt
        ,null::text plcd
        ,o.fs_line
        ,o.r_currency
        ,o.r_rate
        ,o.c_currency
        ,o.c_rate
        ,sum(o.fb_qty) fb_qty
        ,sum(o.fb_val_loc) fb_val_loc
        ,sum(o.fb_val_loc_dis) fb_val_loc_dis
        ,sum(o.fb_val_loc_qt) fb_val_loc_qt
        ,sum(o.fb_val_loc_pl) fb_val_loc_pl
        ,sum(o.fb_val_loc_tar) fb_val_loc_tar
        ,sum(o.fb_cst_loc) fb_cst_loc
        ,sum(o.fb_cst_loc_cur) fb_cst_loc_cur
        ,sum(o.fb_cst_loc_fut) fb_cst_loc_fut
        ,o.calc_status
        ,o.flag
        ,o.odate + interval '1 year' odate
        ,o.oseas + 5 rseas
        ,o.rdate + interval '1 year' rdate
        ,o.rseas + 5 rseas
        ,o.pdate + interval '1 year' pdate
        ,o.pseas + 5 pseas
        -----when null, greatest/least is just going to act like coalesce
        ,greatest(least(o.sdate,gld.edat),gld.sdat)  + interval '1 year' sdate
        ,ss.ssyr  sseas
        ,'b24' "version"
        ,'actuals_plug' iter
    FROM
        rlarp.osm o
        LEFT OUTER JOIN rlarp.gld ON
            gld.fspr = o.fspr
        LEFT OUTER JOIN rlarp.gld ss ON
            greatest(least(o.sdate,gld.edat),gld.sdat) + interval '1 year' BETWEEN ss.sdat AND ss.edat
    WHERE
        false
        --o.odate BETWEEN '2022-03-01' AND '2022-05-31'
        --AND fs_line = '41010'
        --AND calc_status <> 'CANCELED'
        --AND NOT (calc_status = 'CLOSED' AND flag = 'REMAINDER')
        ----OR (
        ----    (o.fspr BETWEEN '2209' AND '2212' OR o.fspr = '0000') 
        ----    AND o.sdate BETWEEN '2022-03-01' AND '2022-05-31'
        ----)
        --AND version = 'ACTUALS'
    GROUP BY
        o.fspr
        ,plnt
        ,COALESCE(o.promo,'')
        ,o.terms
        ,o.bill_cust
        ,o.ship_cust
        ,o.dsm
        ,o.part
        ,o.fs_line
        ,o.r_currency
        ,o.r_rate
        ,o.c_currency
        ,o.c_rate
        ,o.calc_status
        ,o.flag
        ,o.odate
        ,o.oseas
        ,o.rdate
        ,o.rseas
        ,o.pdate
        ,o.pseas
        ,greatest(least(o.sdate,gld.edat),gld.sdat)
        ,ss.ssyr
    UNION ALL
    SELECT
        -----------documents-------------
        null::int "ddord#"
        ,null::int "dditm#"
        ,null::int "fgbol#"
        ,null::int "fgent#"
        ,null::int "diinv#"
        ,null::int "dilin#"
        ,null::int quoten
        ,null::int quotel
        ----------dates/status------------------
        ,o.odate + interval '1 year' dcodat
        ,o.rdate + interval '1 year' ddqdat
        ,null::date dcmdat
        ,null::date fesdat
        ,greatest(least(o.sdate,gld.edat),gld.sdat)  + interval '1 year' dhidat
        ,null::text fesind
        ,null::text dhpost
        ,o.fspr
        -----------measures--------------------
        ,null::numeric ddqtoi
        ,null::numeric ddqtsi
        ,null::numeric fgqshp
        ,null::numeric diqtsh
        ,null::numeric diext
        ,null::numeric ditdis
        ,null::jsonb discj
        ,null::text dhincr
        ,plnt
        ,COALESCE(o.promo,'') promo
        ,null::text return_reas
        ,o.terms
        ,null::text custpo
        ,null::text remit_to
        ,null::text bill_class
        ,o.bill_cust
        ,null::text bill_rep
        ,null::text bill_terr
        ,null::text ship_class
        ,ship_cust
        ,null::text ship_rep
        ,null::text ship_terr
        ,null::text dsm
        ,null::text account
        ,null::text shipgrp
        ,null::text geo
        ,null::text chan
        ,null::text chansub
        ,null::text orig_ctry
        ,null::text orig_prov
        ,null::text orig_post
        ,null::text bill_ctry
        ,null::text bill_prov
        ,null::text bill_post
        ,null::text dest_ctry
        ,null::text dest_prov
        ,null::text dest_post
        ,o.part
        ,null::text styc
        ,null::text colc
        ,null::text colgrp
        ,null::text coltier
        ,null::text colstat
        ,null::text sizc
        ,null::text uomp
        ,null::text suffix
        ,null::text accs_ps
        ,null::text brnd
        ,null::text majg
        ,null::text ming
        ,null::text majs
        ,null::text mins
        ,null::text gldco
        ,null::text gldc
        ,null::text glec
        ,null::text harm
        ,null::text clss
        ,null::text brand
        ,null::text assc
        ,null::text ddunit
        ,null::text unti
        ,null::numeric lbs
        ,null::numeric plt
        ,null::text plcd
        ,o.fs_line
        ,o.r_currency
        ,null::numeric r_rate
        ,o.c_currency
        ,null::numeric c_rate
        ,sum(o.fb_qty) fb_qty
        ,sum(o.fb_val_loc) fb_val_loc
        ,sum(o.fb_val_loc_dis) fb_val_loc_dis
        ,sum(o.fb_val_loc_qt) fb_val_loc_qt
        ,sum(o.fb_val_loc_pl) fb_val_loc_pl
        ,sum(o.fb_val_loc_tar) fb_val_loc_tar
        ,sum(o.fb_cst_loc) fb_cst_loc
        ,sum(o.fb_cst_loc_cur) fb_cst_loc_cur
        ,sum(o.fb_cst_loc_fut) fb_cst_loc_fut
        ,o.calc_status
        ,o.flag
        ,o.odate odate
        ,o.oseas rseas
        ,o.rdate rdate
        ,o.rseas rseas
        ,o.pdate pdate
        ,o.pseas pseas
        -----when null, greatest/least is just going to act like coalesce
        ,greatest(least(o.sdate,gld.edat),gld.sdat) sdate
        ,ss.ssyr  sseas
        ,'b24' "version"
        ,'forecast_plug' iter
    FROM
        rlarp.osmp o
        LEFT OUTER JOIN rlarp.gld ON
            gld.fspr = o.fspr
        LEFT OUTER JOIN rlarp.gld ss ON
            greatest(least(o.sdate,gld.edat),gld.sdat)  BETWEEN ss.sdat AND ss.edat
    WHERE
        false
        --o.odate BETWEEN '2020-03-01' AND '2020-05-31'
        --AND fs_line = '41010'
        --AND calc_status <> 'CANCELED'
        ------dont pull forecast for a baseline this time around--
    GROUP BY
        o.fspr
        ,plnt
        ,COALESCE(o.promo,'')
        ,o.terms
        ,o.bill_cust
        ,ship_cust
        ,o.part
        ,o.fs_line
        ,o.r_currency
        ,o.c_currency
        ,o.calc_status
        ,o.flag
        ,o.odate
        ,o.oseas
        ,o.rdate
        ,o.rseas
        ,o.pdate
        ,o.pseas
        ,greatest(least(o.sdate,gld.edat),gld.sdat)
        ,ss.ssyr
)
----------increment the baseline selection---------------------
,incr AS (
SELECT
    o."ddord#"
    ,o."dditm#"
    ,o."fgbol#"
    ,o."fgent#"
    ,o."diinv#"
    ,o."dilin#"
    ,o.quoten
    ,o.quotel
    ,o.dcodat + interval '5 years'   --incremented
    ,o.ddqdat + interval '5 years'   --incremented
    ,o.dcmdat
    ,o.fesdat
    ,o.dhidat + interval '5 years'   --incremented
    ,o.fesind
    ,o.dhpost
    ,gld.fspr                       --incremented
    ,o.ddqtoi
    ,o.ddqtsi
    ,o.fgqshp
    ,o.diqtsh
    ,o.diext
    ,o.ditdis
    ,o.discj
    ,o.dhincr
    ,o.plnt
    ,o.promo
    ,o.return_reas
    ,o.terms
    ,o.custpo
    ,o.remit_to
    ,o.bill_class
    ,o.bill_cust
    ,o.bill_rep
    ,o.bill_terr
    ,o.ship_class
    ,o.ship_cust
    ,o.ship_rep
    ,o.ship_terr
    ,o.dsm
    ,o.account
    ,o.shipgrp
    ,o.geo
    ,o.chan
    ,o.chansub
    ,o.orig_ctry
    ,o.orig_prov
    ,o.orig_post
    ,o.bill_ctry
    ,o.bill_prov
    ,o.bill_post
    ,o.dest_ctry
    ,o.dest_prov
    ,o.dest_post
    ,o.part
    ,o.styc
    ,o.colc
    ,o.colgrp
    ,o.coltier
    ,o.colstat
    ,o.sizc
    ,o.uomp
    ,o.suffix
    ,o.accs_ps
    ,o.brnd
    ,o.majg
    ,o.ming
    ,o.majs
    ,o.mins
    ,o.gldco
    ,o.gldc
    ,o.glec
    ,o.harm
    ,o.clss
    ,o.brand
    ,o.assc
    ,o.ddunit
    ,o.unti
    ,o.lbs
    ,o.plt
    ,o.plcd
    ,o.fs_line
    ,o.r_currency
    ,o.r_rate
    ,o.c_currency
    ,o.c_rate
    ,o.fb_qty
    ,o.fb_val_loc
    ,o.fb_val_loc_dis
    ,o.fb_val_loc_qt
    ,o.fb_val_loc_pl
    ,o.fb_val_loc_tar
    ,o.fb_cst_loc
    ,o.fb_cst_loc_cur
    ,o.fb_cst_loc_fut
    ,o.calc_status
    ,o.flag
    ,o.odate + interval '5 years'    --incremented
    ,o.oseas + 5                    --incremented
    ,o.rdate + interval '5 years'    --incremented
    ,o.rseas + 5                    --incremented
    ,o.pdate + interval '5 years'    --incremented
    ,o.pseas + 5                    --incremented
    ,o.sdate + interval '5 years'    --incremented
    ,o.sseas + 5                    --incremented
    ,'b24' "version"
    ,'copy' iter
FROM
    baseline o
    LEFT OUTER JOIN rlarp.gld ON
        (o.sdate + interval '5 years') BETWEEN gld.sdat and gld.edat
WHERE
    true
    --o.odate + interval '5 years' >= '2023-06-01'
)
--INSERT INTO rlarp.osmf
SELECT
    -----------documents-------------
     "ddord#"
    ,"dditm#"
    ,"fgbol#"
    ,"fgent#"
    ,"diinv#"
    ,"dilin#"
    ,quoten
    ,quotel
    ----------dates/status------------------
    ,dcodat
    ,ddqdat
    ,dcmdat
    ,fesdat
    ,dhidat
    ------------document flags-------------------
    ,fesind
    ,dhpost
    ,fspr
    -----------measures--------------------
    ,ddqtoi
    ,ddqtsi
    ,fgqshp
    ,diqtsh
    ,diext
    ,ditdis
    ,discj
    ------------document attributes--------------
    ,dhincr
    ,plnt
    ,promo
    ,return_reas
    ,terms
    ,custpo
    ,remit_to
    ------------customer info---------------------
    ,bill_class
    ,bill_cust
    ,bill_rep
    ,bill_terr
    ,ship_class
    ,ship_cust
    ,ship_rep
    ,ship_terr
    ,dsm
    ,account
    ,shipgrp
    ,geo
    ,chan
    ,chansub
    ,orig_ctry
    ,orig_prov
    ,orig_post
    ,bill_ctry
    ,bill_prov
    ,bill_post
    ,dest_ctry
    ,dest_prov
    ,dest_post
    ------------product info----------------------
    ,part
    ,styc
    ,colc
    ,colgrp
    ,coltier
    ,colstat
    ,sizc
    ,uomp
    ,suffix
    ,accs_ps
    ,brnd
    ,majg
    ,ming
    ,majs
    ,mins
    ,gldco
    ,gldc
    ,glec
    ,harm
    ,clss
    ,brand
    ,assc
    ,ddunit
    ,unti
    ,lbs
    ,plt
    ------------fiscal info-----------------------
    ,plcd
    ,fs_line
    ,r_currency
    ,r_rate
    ,c_currency
    ,c_rate
    ,fb_qty
    ,fb_val_loc
    ,fb_val_loc_dis
    ,fb_val_loc_qt
    ,fb_val_loc_pl
    ,fb_val_loc_tar
    ,fb_cst_loc
    ,fb_cst_loc_cur
    ,fb_cst_loc_fut
    ------------status info-----------------------
    ,calc_status
    ,flag
    ,odate
    ,oseas
    ,rdate
    ,rseas
    ,pdate
    ,pseas
    ,sdate
    ,sseas
    ,"version"
    ,iter
FROM
    (
        SELECT * FROM baseline
        UNION ALL
        SELECT * FROM incr
    ) x;

---identify short ships: causes disconnect with actual sales-------------------------------------------------------------------
--UPDATE rlarp.osmfs SET iter = 'short ship' WHERE calc_status = 'CLOSED' AND flag = 'REMAINDER';

---identify goofy ship dates: causes disconnect with sales when splicing in a forecast that has this problem-------------------
--UPDATE rlarp.osmfs SET iter = 'bad date' WHERE adj_shipdate < adj_orderdate;
