forecast_api/route_sql/mix_change.sql

302 lines
8.6 KiB
SQL

WITH
/*
the volume must be expressed in terms of units, since that is what it will be scaling
*/
target AS (select $$replace_request$$::json def)
,seg AS (
SELECT
x.GLEC glec
,x.SEGM segm
FROM
(
VALUES
('1SU','Sustainable'),
('1CU','Sustainable'),
('1GR','Greenhouse'),
('1NU','Nursery'),
('1RE','Retail'),
('2WI','Greenhouse'),
('3BM','Other'),
('3CO','Other'),
('3PE','Other'),
('3PP','Other'),
('4CO','Other'),
('4RA','Other'),
('9MI','Other'),
('9SA','Other'),
('9TO','Other')
) X(GLEC, SEGM)
)
,copr AS (
SELECT
LTRIM(RTRIM(A9)) AS COMP,
A30 AS DESCR,
SUBSTR(C.A249,242,2) CURR,
SUBSTR(C.A249,32,4) AS GL,
SUBSTR(C.A249,190,4) AS AR,
SUBSTR(C.A249,182,4) AS AP,
SUBSTR(C.A249,198,4) AS FA,
SUBSTR(C.A249,238,4) AS IC ,
SUBSTR(D.A249,9,5) CONS_FUNC
FROM
LGDAT.CODE
LEFT OUTER JOIN LGDAT.NAME C ON
'C0000'||LTRIM(RTRIM(A9)) = C.A7
LEFT OUTER JOIN LGDAT.NAME D ON
'D0000'||LTRIM(RTRIM(A9)) = D.A7
WHERE
A2 = 'AA' OR A2 IS NULL
)
,parts AS (
SELECT
jr.*
FROM
target
JOIN LATERAL json_array_elements(def->'parts') as ae(e) ON true
JOIN LATERAL json_to_record(ae.e) as jr(part text, qty numeric, price numeric, pounds numeric) ON true
)
-- SELECT * FROM parts
,dates AS (
SELECT
jr.*
,def->'scenario'->>'quota_rep_descr' quota_rep_descr
FROM
target
JOIN LATERAL json_array_elements(def->'dates') as ae(e) ON true
JOIN LATERAL json_to_record(ae.e) as jr(
bill_cust_descr text
,ship_cust_descr text
,promo text
,terms text
,r_currency text
,order_date date
,ship_date date
,fc_mix numeric
,baseline_mix numeric
) ON true
)
-- SELECT * FROM dates
,basemix AS (
SELECT
od.fspr
,d.promo
,d.terms
,d.r_currency
,d.bill_cust_descr
,d.ship_cust_descr
,d.quota_rep_descr
,p.part
,round(d.fc_mix * p.qty,0) units
,round(d.fc_mix * p.qty,0)* p.price value_usd --assume that target dollars are USD
,d.order_date
,sd.sortmo order_month
,sd.ssyr order_season
,d.ship_date request_date
,sd.sortmo request_month
,sd.ssyr request_season
,d.ship_date
,sd.sortmo ship_month
,sd.ssyr ship_season
FROM
dates d
CROSS JOIN parts p
LEFT OUTER JOIN rlarp.gld sd ON
d.ship_date <@ sd.drange
LEFT OUTER JOIN rlarp.gld od ON
d.order_date <@ od.drange
)
,log AS (
INSERT INTO rlarp.osm_log(doc) SELECT $$replace_iterdef$$::jsonb doc RETURNING *
)
-- SELECT * FROM basemix
,final AS (
SELECT
b.fspr
,i.dplt plnt
,b.promo
,b.terms
,b.bill_cust_descr
,b.ship_cust_descr
,r.rcode
,b.quota_rep_descr
,r.director
,bc.dba billto_group
,sc.dba shipto_group
,CASE SUBSTRING(bc.cclass,2,3)
--if the bill to class is ditsributor, then it's either warehouse or drop
WHEN 'DIS' THEN
--if the ship-to is a different name than the bill-to then it's drop, otherwise it's warehouse
CASE SUBSTRING(sc.cclass,2,3)
WHEN 'DIS' THEN 'WHS'
ELSE 'DRP'
END
--CASE WHEN RTRIM(SUBSTRING(LTRIM(SC.BVADR7)||SC.BVNAME,1,30)) = RTRIM(SUBSTRING(LTRIM(BC.BVADR7)||BC.BVNAME,1,30)) THEN 'DIS' ELSE 'DRP' END
--everything else does not involve a distributor and is considered direct
ELSE 'DIR'
END chan
,CASE SUBSTRING(bc.cclass,2,3)
WHEN 'DIS' THEN
--if the ship-to is a different name than the bill-to then it's drop, otherwise it's warehouse
CASE SUBSTRING(sc.cclass,2,3)
WHEN 'DIS' THEN 'WHS'
ELSE CASE SUBSTRING(sc.cclass,1,1) WHEN 'R' THEN 'RDP' ELSE 'DRP' END
END
WHEN 'MAS' THEN 'RMN'
WHEN 'NAT' THEN 'RMN'
ELSE CASE SUBSTRING(sc.cclass,1,1) WHEN 'R' THEN 'RDI' ELSE 'DIR' END
END chansub
,null::text chan_retail
,b.part
,b.part || ' - ' || i.descr
,i.partgroup
,i.branding
,i.majgd majg_descr
,i.mingd ming_descr
,i.majsd majs_descr
,i.minsd mins_descr
,seg.segm
,CASE WHEN i.majg = '610' THEN 'Fiber' ELSE 'Plastic' END substance
,'41010' fs_line --master data
,b.r_currency --history cust mix
,rx.rate r_rate --master data
,pl.curr c_currency --master data
,cx.rate c_rate --master data
,round(b.units ,2) units
,round((b.value_usd / COALESCE(rx.rate,1))::numeric ,2) value_loc --b.value is denominated in USD, need to apply currency to get to local, assume 1 if using a fake customer
,round(b.value_usd ,2) value_usd --b.value is already denominated in usd
,round((i.futstd*b.units)::numeric ,2) cost_loc
,round((i.futstdus*b.units)::numeric,2) cost_usd
,'CLOSED' calc_status
,'SHIPMENT' flag
,b.order_date
,b.order_month
,b.order_season
,b.request_date
,b.request_month
,b.request_season
,b.ship_date
,b.ship_month
,b.ship_season
,'replace_version' "version"
,'replace_source'||' volume' iter
,log.id
,COALESCE(log.doc->>'tag','') "tag"
,log.doc->>'message' "comment"
,log.doc->>'type' module
,round(b.units * i.nwht * CASE i.nwun WHEN 'KG' THEN 2.2046 ELSE 1 END, 2) pounds
FROM
basemix b
CROSS JOIN log
LEFT OUTER JOIN rlarp.repc r ON
r.repp = b.quota_rep_descr
LEFT OUTER JOIN "CMS.CUSLG".itemm i ON
i.item = b.part
LEFT OUTER JOIN rlarp.cust bc ON
bc.code = rtrim(substring(b.bill_cust_descr,1,8))
LEFT OUTER JOIN rlarp.cust sc ON
sc.code = rtrim(substring(b.bill_cust_descr,1,8))
LEFT OUTER JOIN seg ON
seg.glec = i.glec
LEFT OUTER JOIN rlarp.plpr pl ON
pl.plnt = i.dplt
LEFT OUTER JOIN rlarp.ffcret cx ON
cx.perd = pl.gl AND
cx.rtyp = 'MA' AND
cx.fcur = pl.curr AND
cx.tcur = 'US'
LEFT OUTER JOIN rlarp.ffcret rx ON
rx.perd = pl.gl AND
rx.rtyp = 'MA' AND
rx.fcur = b.r_currency AND
rx.tcur = 'US'
)
, 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
,substance
,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
,tag
,comment
--------values-------------------------
,sum(value_loc) value_loc
,sum(value_usd) value_usd
,sum(cost_loc) cost_loc
,sum(cost_usd) cost_usd
,sum(units) units
,sum(pounds) pounds
FROM
ins
GROUP BY
---------customer info-----------------
bill_cust_descr
,billto_group
,ship_cust_descr
,shipto_group
,quota_rep_descr
,director
,segm
,substance
,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
,tag
,comment
)
-- select 'insagg', * from insagg
--
SELECT json_agg(row_to_json(insagg)) x from insagg