WITH
----grouped prices-------------
pgrp AS (
	SELECT
		o.bill_dba 
		,o.ship_dba
        ,c.dsm
        ,i.partgroup
        ,i.pricegroup
		,o.part
		,o.odate
		,o.qtyord
		,i.nwht * CASE WHEN i.nwun = 'KG' THEN 2.2 ELSE 1 END lbs
		,i.mpck pltq
		,ROUND(o.sales_usd / o.qty,5) price
		,(o.pricing->>'guidance_price')::NUMERIC guidance
	    ,(o.pricing->>'floor'  )::numeric(15,5) floor        
	    ,(o.pricing->>'ceiling')::numeric(15,5) ceiling   
	    ,(o.pricing->>'uselimits')::boolean uselimits
	FROM
	 	rlarp.osm_stack o
	 	LEFT OUTER JOIN "CMS.CUSLG".itemm i ON 
	 		i.item = o.part
        INNER JOIN rlarp.cust_flag c ON 
            c.shipgrp = o.customer
            AND c.dsm = o.default_rep
	WHERE 
		VERSION = 'Actual' 
		AND o.oseas >= 2025
		AND calc_status <> 'CANCELED' 
		AND o.fs_line = '41010'
		AND o.part <> ''
		AND substring(o.glec,1,1) <= '2'
		AND o.qty <> 0
        AND o.sseas IS NOT NULL
        AND o.sales_usd <> 0
        -- AND customer in (select distinct renamed FROM newc )
	GROUP BY 
		o.bill_dba 
		,o.ship_dba
        ,c.dsm
        ,i.partgroup
        ,i.pricegroup
		,o.part
		,o.odate
		,o.qtyord
		,o.pounds
		,o.pallets
		,ROUND(o.sales_usd / o.qty,5)
		,i.nwht * CASE WHEN i.nwun = 'KG' THEN 2.2 ELSE 1 END
		,i.mpck
		,(o.pricing->>'guidance_price')::NUMERIC
	    ,(o.pricing->>'floor'  )::numeric(15,5)        
	    ,(o.pricing->>'ceiling')::numeric(15,5)
	    ,(o.pricing->>'uselimits')::boolean
)
-- SELECT * FROM pgrp where ship_dba ~ 'MONROVIA'
-- select * from npgrp limit 100
--sequenced for most recent price------------
,seq AS (
	SELECT 
		 bill_dba 
		,ship_dba
		,part
		,odate
		,qtyord
		,lbs
		,pltq
		,price last_price
		,guidance
	    ,floor        
	    ,ceiling   
	    ,uselimits
	    ,row_number() OVER (PARTITION BY bill_dba, ship_dba, part ORDER BY odate desc) rn
	    ,round(avg(price) over (PARTITION BY bill_dba, ship_dba, part),5) avgprice
	FROM 
		pgrp
)
-- SELECT * FROM SEQ WHERE ship_dba = 'MONROVIA' 
-- SELECT * FROM seq WHERE ship_dba like 'COSTA%'
,partlist AS (
    SELECT 
        billto_group
        ,shipto_group
        ,dsm
        ,part
        ,glec
        ,pricegroup
        ----order date as a proxy for order size
        ,order_date
        ,sum(units) qty
        ,round(sum(value_usd)/sum(units),5) hist_price
    FROM 
        rlarp.osm_pool o
        INNER JOIN "CMS.CUSLG".itemm i ON 
            i.item = o.part
    WHERE
        order_season = 2026
    GROUP BY
        billto_group
        ,shipto_group
        ,dsm
        ,part
        ,glec
        ,pricegroup
        ,order_date
    HAVING 
        abs(sum(units)) > 10
)
,combine AS MATERIALIZED (
-- select * from partlist
-- SELECT * FROM seq WHERE rn = 1 LIMIT 1000
-- ,guid AS (
    SELECT
         p.billto_group
        ,p.shipto_group
        ,p.dsm
        ,p.part
        ,p.glec
        ,p.pricegroup
        ,p.order_date
        ,p.qty
        ,p.hist_price
        ,CASE WHEN seq.floor = 0 THEN null else seq.floor END floor
        ,CASE WHEN seq.ceiling = 0 THEN null else seq.ceiling END ceiling
        ,seq.uselimits
        ,seq.last_price 
        ,seq.avgprice
        ,seq.pltq
        ,ROUND(CASE WHEN seq.uselimits THEN 
            CASE 
                WHEN glec = '1NU' THEN
                    --if more than 8/24 pallets, use floor
                    CASE WHEN p.qty >= 24*seq.pltq THEN seq.floor
                    -- if more than a pallet use the target price 
                    ELSE CASE WHEN qtyord >=  8*seq.pltq THEN (seq.ceiling + seq.floor) / 2
                    -- if more than a pallet use the target price 
                    ELSE CASE WHEN qtyord >=  2*seq.pltq THEN seq.ceiling
                    -- if more than a pallet use the target price 
                    ELSE  seq.ceiling * 1.05
                    END END END
                ELSE
                    CASE WHEN pricegroup ~ '(Hanger|Dish)' THEN
                        --at least 1 pallets is lower limit
                        CASE WHEN qtyord >= 01*seq.pltq THEN seq.floor
                        --at least 2 pallets is mid range
                        ELSE CASE WHEN qtyord >=  0.5*seq.pltq THEN (seq.ceiling + seq.floor) / 2
                        --less than a pallet is upper + 15%
                        ELSE  seq.ceiling 
                        END END
                    ELSE 
                        --at least 8 pallets is lower limit
                        CASE WHEN qtyord >= 08*seq.pltq THEN seq.floor
                        --at least 2 pallets is mid range
                        ELSE CASE WHEN qtyord >=  2*seq.pltq THEN (seq.ceiling + seq.floor) / 2
                        --at least 1 pallet is upper range
                        ELSE CASE WHEN qtyord >=  1*seq.pltq THEN seq.ceiling
                        --less than a pallet is upper + 15%
                        ELSE  seq.ceiling * 1.15
                        END END END
                    END
            END
        ELSE 
            null 
        END,5) guid
        ,least(hist_price, last_price, avgprice) lowest_last
        ,least(hist_price, last_price, avgprice, CASE WHEN uselimits THEN 
         ROUND(CASE WHEN seq.uselimits THEN 
            CASE 
                WHEN glec = '1NU' THEN
                    --if more than 8/24 pallets, use floor
                    CASE WHEN p.qty >= 24*seq.pltq THEN seq.floor
                    -- if more than a pallet use the target price 
                    ELSE CASE WHEN qtyord >=  8*seq.pltq THEN (seq.ceiling + seq.floor) / 2
                    -- if more than a pallet use the target price 
                    ELSE CASE WHEN qtyord >=  2*seq.pltq THEN seq.ceiling
                    -- if more than a pallet use the target price 
                    ELSE  seq.ceiling * 1.05
                    END END END
                ELSE
                    CASE WHEN pricegroup ~ '(Hanger|Dish)' THEN
                        --at least 1 pallets is lower limit
                        CASE WHEN qtyord >= 01*seq.pltq THEN seq.floor
                        --at least 2 pallets is mid range
                        ELSE CASE WHEN qtyord >=  0.5*seq.pltq THEN (seq.ceiling + seq.floor) / 2
                        --less than a pallet is upper + 15%
                        ELSE  seq.ceiling 
                        END END
                    ELSE 
                        --at least 8 pallets is lower limit
                        CASE WHEN qtyord >= 08*seq.pltq THEN seq.floor
                        --at least 2 pallets is mid range
                        ELSE CASE WHEN qtyord >=  2*seq.pltq THEN (seq.ceiling + seq.floor) / 2
                        --at least 1 pallet is upper range
                        ELSE CASE WHEN qtyord >=  1*seq.pltq THEN seq.ceiling
                        --less than a pallet is upper + 15%
                        ELSE  seq.ceiling * 1.15
                        END END END
                    END
            END
        ELSE 
            null 
        END,5) ELSE hist_price END) lowest_guid
        ,c.flag
    FROM 
        partlist p
        INNER JOIN rlarp.cust_flag c ON 
            c.shipgrp = p.shipto_group
            AND substring(c.dsm,1,5) = substring(p.dsm,1,5)
        LEFT OUTER JOIN seq seq ON 
            seq.ship_dba = p.shipto_group
            AND seq.bill_dba = p.billto_group
            AND seq.part = p.part
            AND seq.rn = 1
        LEFT OUTER JOIN rlarp.repc r ON 
            r.rcode = p.dsm
)
-- SELECT * FROM combine where shipto_group = 'MONROVIA'
,choose AS MATERIALIZED (
    SELECT
         billto_group
        ,shipto_group
        ,dsm
        ,part
        ,glec
        ,pricegroup
        ,order_date
        ,qty
        ,hist_price
        ,floor
        ,ceiling
        ,uselimits
        ,last_price 
        ,avgprice
        ,pltq
        ,guid
        ,lowest_last
        ,lowest_guid
        ,flag
        ,CASE flag 
            WHEN 'YoY' THEN lowest_last
            WHEN 'Floor' THEN lowest_guid
            WHEN 'Retail' THEN hist_price
            WHEN 'Warehouse' THEN hist_price
            WHEN 'Orphan' THEN lowest_guid
            ELSE lowest_last 
        END price_choice
    FROM 
        combine
)
-- SELECT * FROM choose where shipto_group = 'MONROVIA' and part = 'NBB005G1BE2B014PYIQX'
,logload AS (
    INSERT INTO rlarp.osm_log (doc) SELECT jsonb_build_object('user',current_user,'tag','Pricing 2','type','Pricing 2','stamp',current_timestamp,'source','top level','message','Pricing 2') RETURNING *
)
,delta_row AS (
    SELECT
         o.fspr            
        ,o.plnt            
        ,o.promo           
        ,o.terms           
        ,o.bill_cust_descr 
        ,o.ship_cust_descr 
        ,o.dsm             
        ,o.quota_rep_descr 
        ,o.director        
        ,o.billto_group    
        ,o.shipto_group    
        ,o.chan            
        ,o.chansub         
        ,o.chan_retail     
        ,o.part            
        ,o.part_descr      
        ,o.part_group      
        ,o.branding        
        ,o.majg_descr      
        ,o.ming_descr      
        ,o.majs_descr      
        ,o.mins_descr      
        ,o.segm            
        ,o.substance       
        ,o.fs_line         
        ,o.r_currency      
        ,o.r_rate          
        ,o.c_currency      
        ,o.c_rate          
        ,0::numeric units           
        ,(c.price_choice * sum(o.units) - sum(value_usd))/o.r_rate value_loc       
        ,c.price_choice * sum(o.units) - sum(value_usd) value_usd       
        ,0::numeric cost_loc        
        ,0::numeric cost_usd        
        ,o.calc_status     
        ,o.flag            
        ,o.order_date      
        ,o.order_month     
        ,o.order_season    
        ,o.request_date    
        ,o.request_month   
        ,o.request_season  
        ,o.ship_date       
        ,o.ship_month      
        ,o.ship_season     
        ,o.version         
        ,'Pricing 2' iter            
        ,logload.id logid
        ,logload.doc->>'tag' tag
        ,logload.doc->>'message' "comment"
        ,logload.doc->>'type' module
        ,0::NUMERIC pounds          
    FROM 
        rlarp.osm_pool o
        CROSS JOIN logload
        INNER JOIN choose c ON 
            c.billto_group = o.billto_group
            AND c.shipto_group = o.shipto_group
            AND substring(c.dsm,1,5) = substring(o.dsm,1,5)
            AND c.part = o.part
            AND c.order_date = o.order_date
    WHERE 
        o.order_season = 2026
    GROUP BY
         o.fspr            
        ,o.plnt            
        ,o.promo           
        ,o.terms           
        ,o.bill_cust_descr 
        ,o.ship_cust_descr 
        ,o.dsm             
        ,o.quota_rep_descr 
        ,o.director        
        ,o.billto_group    
        ,o.shipto_group    
        ,o.chan            
        ,o.chansub         
        ,o.chan_retail     
        ,o.part            
        ,o.part_descr      
        ,o.part_group      
        ,o.branding        
        ,o.majg_descr      
        ,o.ming_descr      
        ,o.majs_descr      
        ,o.mins_descr      
        ,o.segm            
        ,o.substance       
        ,o.fs_line         
        ,o.r_currency      
        ,o.r_rate          
        ,o.c_currency      
        ,o.c_rate          
        ,c.price_choice
        ,o.calc_status     
        ,o.flag            
        ,o.order_date      
        ,o.order_month     
        ,o.order_season    
        ,o.request_date    
        ,o.request_month   
        ,o.request_season  
        ,o.ship_date       
        ,o.ship_month      
        ,o.ship_season     
        ,o.version         
        ,logload.id
        ,logload.doc->>'tag'
        ,logload.doc->>'message'
        ,logload.doc->>'type'
)
-- SELECT SUM(value_usd) from delta_row
-- SELECT * FROM delta_row WHERE shipto_group = 'MONROVIA'
INSERT INTO rlarp.osm_pool SELECT * FROM delta_row
-- SELECT billto_group, shipto_group, substring(dsm,1,5), part, order_date, count(*) over (PARTITION BY billto_group, shipto_group, substring(dsm,1,5), part, order_date) cnt
-- FROM 
--     choose 
-- GROUP BY
--     billto_group, shipto_group, substring(dsm,1,5), part, order_date
-- select shipto_group, sum(value_usd) from delta_row group by shipto_group
