#!/bin/bash echo " --------------------------OOS ------------------------- drop table if exists public.om_oos_soldout_1; create table public.om_oos_soldout_1 as select snp_date_time,sku_code,inventory from ( select snp_date,snp_time,snp_date_time,sku_code,inventory, row_number() over (partition by sku_code,cast(snp_date_time as date) order by snp_date_time desc,inventory desc) as R from ( select distinct snp_date,snp_time,dateadd(hour,7,cast(cast(snp_date as varchar) || ' ' || cast(snp_time as varchar) as datetime)) as snp_date_time,sku_code,inventory from public.inventory_snapshot ) ) where R=1; --age drop table if exists public.om_oos_soldout_2; create table public.om_oos_soldout_2 as select *, datediff(day,cast(snp_date_time as date),current_date) as age from public.om_oos_soldout_1; drop table if exists public.om_oos_soldout_2_med; create table public.om_oos_soldout_2_med as select *, case when age between 1 and 3 then '<=3' when age between 4 and 7 then '4-7' when age between 8 and 15 then '8-15' when age > 15 then 'GT 15' end as age_group from public.om_oos_soldout_2 where age>0; drop table if exists public.om_oos_soldout_3; create table public.om_oos_soldout_3 as select a.*,b.inventory as Maximum_occurred_inventory from public.om_oos_soldout_2_med a inner join ( select inventory,age_group,sku_code from ( select inventory,age_group,sku_code,row_number() over (partition by age_group,sku_code order by Max_inventory desc) as R from ( select inventory,age_group,sku_code,count(*) as Max_inventory from public.om_oos_soldout_2_med group by inventory,age_group,sku_code order by 4 desc,1 ) ) where R=1 order by 2,3 ) b on a.sku_code=b.sku_code and a.age_group=b.age_group ; drop table if exists public.om_oos_soldout_3_med; create table public.om_oos_soldout_3_med as select a.*,b.\"<=3 Maximum_occurred_inventory\",\"4-7 Maximum_occurred_inventory\",\"8-15 Maximum_occurred_inventory\",\"GT 15 Maximum_occurred_inventory\" from public.om_oos_soldout_3 a inner join ( select distinct sku_code, sum(case when Age_group in ('<=3') then Maximum_occurred_inventory end)as \"<=3 Maximum_occurred_inventory\", sum(case when Age_group in ('4-7') then Maximum_occurred_inventory end) as \"4-7 Maximum_occurred_inventory\", sum(case when Age_group in ('8-15') then Maximum_occurred_inventory end) as \"8-15 Maximum_occurred_inventory\", sum(case when Age_group in ('GT 15') then Maximum_occurred_inventory end )as \"GT 15 Maximum_occurred_inventory\" from public.om_oos_soldout_3 group by 1 order by sku_code ) b on a.sku_code=b.sku_code ; drop table if exists public.om_oos_soldout_3_med_2; create table public.om_oos_soldout_3_med_2 as select a.*,b.sold_out_fl from public.om_oos_soldout_3 a inner join ( select sku_code,sold_out_fl from ( select *,row_number() over (partition by sku_code order by sold_out_fl) as R from ( select distinct sku_code, case when ((age=16 or age=17 or age=18 or age=19) and inventory=0) and (\"8-15 Maximum_occurred_inventory\"=0) and \"4-7 Maximum_occurred_inventory\"=0 and \"<=3 Maximum_occurred_inventory\"=0 then '1.GT 15 and sold out' when (age=8 and inventory=0) and \"4-7 Maximum_occurred_inventory\"=0 and \"<=3 Maximum_occurred_inventory\"=0 then '2.8-15 and sold out' when ((age=4 or age=5 or age=6) and inventory=0) and \"<=3 Maximum_occurred_inventory\"=0 then '3.4-7 and sold out' when (age=1 and inventory=0) then '4.<=3 and sold out' else '5.stocked' end as sold_out_fl--,count(distinct sku_code) from public.om_oos_soldout_3_med order by sku_code,age ) ) where R=1 ) b on a.sku_code=b.sku_code ; drop table if exists public.om_oos_soldout_4; create table public.om_oos_soldout_4 as select a.*,b.brand_name,b.\"EL/PL Flag\",b.give_away,b.active_status from public.om_oos_soldout_3_med_2 a inner join ( select distinct b.name as brand_name,a.sku,case when moqremark = 'NOT ORDER GIVE AWAY ITEM' then 'Yes' else 'No' end give_away, CASE WHEN a.is_archived = 'true' THEN 'Permanatly_delisted' WHEN a.is_delisted = 'true' THEN 'delisted' WHEN a.is_archived = 'false' AND a.is_delisted = 'false' THEN 'Active' END active_status, case when brand_name in ('HISTOIRE NATURELLE','INGRID','W DRESSROOM','FORENCOS','DEWYCEL','GLUTANEX','BELLFLOWER','ONE THING','BEAUSTA') then 'EL/PL' else 'NA' end as \"EL/PL Flag\" from raena_catalog_management.product a left join raena_catalog_management.brand b on a.brand_id=b.id left join public.demand_forecasting_configs c on a.sku=c.sku ) b on a.sku_code=b.sku ; drop table if exists public.om_oos_soldout_5; create table public.om_oos_soldout_5 as select a.*,coalesce(b.sku_type,'Not Moving') as sku_type,coalesce(b.new_sku_flag,'No') as new_sku_flag, cikarang_runrate,surabaya_runrate,semarang_runrate,medan_runrate,makassar_runrate,samarinda_runrate,total_runrate,c.gold_price,d.runrate as \"90_days_runrate\" from public.om_oos_soldout_4 a left join public.demand_forecast_dashboard_final b on a.sku_code=b.sku LEFT JOIN (SELECT distinct sku , case when is_slash_price='true' then json_extract_path_text(slashed_tier_price,'bf645e97-8a48-4977-8367-e987489760f9',TRUE) else json_extract_path_text(tier_price,'bf645e97-8a48-4977-8367-e987489760f9',TRUE) end as gold_price FROM raena_catalog_management.product p) c on a.sku_code=c.sku left join ( select sku,sum(oi.quantity)/count(distinct cast(o.created_at as date)) as runrate from raena_order_management.order o inner join raena_order_management.order_item oi on o.id=oi.order_id where cast(o.created_at as date)>=cast((current_date-90) as date) and o.payment_status='Paid' and cast(o.is_archived as varchar)='false' group by sku ) d on a.sku_code=d.sku ; /*drop table if exists public.om_oos_soldout_5; create table public.om_oos_soldout_5 as select a.*,coalesce(b.sku_type,'Not Moving') as sku_type,coalesce(b.new_sku_flag,'No') as new_sku_flag, cikarang_runrate,surabaya_runrate,semarang_runrate,medan_runrate,makassar_runrate,samarinda_runrate,total_runrate,c.gold_price,d.runrate as \"90_days_runrate\" from public.om_oos_soldout_4 a left join public.demand_forecast_dashboard_final b on a.sku_code=b.sku LEFT JOIN (SELECT distinct sku , case when is_slash_price='true' then json_extract_path_text(slashed_tier_price,'bf645e97-8a48-4977-8367-e987489760f9',TRUE) else json_extract_path_text(tier_price,'bf645e97-8a48-4977-8367-e987489760f9',TRUE) end as gold_price FROM raena_catalog_management.product p) c on a.sku_code=c.sku left join ( select distinct sku,total_runrate as runrate from public.demand_forecast_dashboard_final ) d on a.sku_code=d.sku; */ drop table if exists public.om_oos_soldout_6; create table public.om_oos_soldout_6 as select distinct cast(a.snp_date_time as date) as snp_date_time,a.sku_code,\"90_days_runrate\",a.gold_price,OOS_days,a.sold_out_fl, a.active_status,a.brand_name,\"EL/PL Flag\",a.give_away,a.sku_type,a.new_sku_flag,c.total_runrate,d.avg_remaining_LM_RV,d.avg_All_LM_RV,e.PO_Ordered_quantity from public.om_oos_soldout_5 a inner join ( select sku_code,sold_out_fl,max(case when inventory=0 and sold_out_fl='1.GT 15 and sold out' and age>15 then age when inventory=0 and sold_out_fl='2.8-15 and sold out' and age between 8 and 15 then age when inventory=0 and sold_out_fl='3.4-7 and sold out' and age between 4 and 7 then age when inventory=0 and sold_out_fl='4.<=3 and sold out' and age <=3 then age end) as OOS_days from public.om_oos_soldout_5 where sold_out_fl not like '%stocked' group by 1,2 ) b on a.sku_code=b.sku_code left join public.demand_forecast_dashboard_final c on a.sku_code=c.sku left join ( select sku,avg(remaining_shipping_fee)/avg(remaining_payment_amount) as avg_remaining_LM_RV,avg(shipping_fee)/avg(payment_amount) as avg_All_LM_RV from ( select distinct sku,case when (actual_warehouse!=expected_warehouse) or expected_warehouse isnull and payment_amount notnull then payment_amount end as remaining_payment_amount, case when (actual_warehouse!=expected_warehouse) or expected_warehouse isnull and payment_amount notnull then \"Actual Shipping Fee\" end as remaining_shipping_fee, payment_amount,\"Actual Shipping Fee\" as shipping_fee from ( select distinct sku,actual_warehouse,expected_warehouse,A.payment_amount, case when A.sub_order_shipping_id=sb.reference_id and A.order_id=sb.order_id then ((sb.shipping_amount)/(sb.order_weight))*(sb.final_weight) when A.order_id = D.id and (A.sub_order_shipping_id= D.id or A.sub_order_shipping_id is null) then D.shipping_amount when A.sub_order_shipping_id=C.id then C.shipping_amount end \"Actual Shipping Fee\" from public.rate_sheet_wise_expected_warehouse A left join raena_order_management.sales_sub_order_shipment C on A.sub_order_shipping_id=C.id left join raena_order_management.order D on A.order_id = D.id and (A.sub_order_shipping_id= D.id or A.sub_order_shipping_id is null) left join public.OM_Logistic_final_shipping_base sb on A.sub_order_shipping_id=sb.reference_id and A.order_id=sb.order_id where A.created_date>=(current_date-90) and A.is_campaign='false' ) ) where payment_amount!=0 group by 1 ) d on a.sku_code=d.sku left join ( select raena_code sku, coalesce(sum(case when warehouse_id = 'CGK WHS' then COALESCE(quantity,0) end),0) + coalesce(sum(case when warehouse_id = 'Makassar WHS' then COALESCE(quantity,0) end),0) + coalesce(sum(case when warehouse_id = 'Medan WHS' then COALESCE(quantity,0) end),0) + coalesce(sum(case when warehouse_id = 'Samarinda WHS' then COALESCE(quantity,0) end),0) + coalesce(sum(case when warehouse_id = 'Semarang WHS' then COALESCE(quantity,0) end),0) + coalesce(sum(case when warehouse_id = 'Surabaya WHS' then COALESCE(quantity,0) end),0) PO_Ordered_quantity from raena_erp_management.inbound_order A left join raena_erp_management.inbound_order_sku B on A.id = B.orderIdId where cast(expected_arrival_date as date) > current_date -1 and received_time is null group by raena_code ) e on a.sku_code=e.sku; -------------------restock drop table if exists public.om_oos_restock_1; create table public.om_oos_restock_1 as select report_date,a.sku,overall_qty_required_per_day as restock,sku_type,brand_name,give_away,new_sku_flag,active_status, coalesce(cikarang_project_quantity_to_order,0) as cikarang_project_quantity_to_order,coalesce(surabaya_project_quantity_to_order,0) as surabaya_project_quantity_to_order, coalesce(semarang_project_quantity_to_order,0) as semarang_project_quantity_to_order,coalesce(medan_project_quantity_to_order,0) as medan_project_quantity_to_order, coalesce(makassar_project_quantity_to_order,0) as makassar_project_quantity_to_order,coalesce(semarandi_project_quantity_to_order,0) as semarandi_project_quantity_to_order ,case when brand_name in ('HISTOIRE NATURELLE','INGRID','W DRESSROOM','FORENCOS','DEWYCEL','GLUTANEX','BELLFLOWER','ONE THING','BEAUSTA') then 'EL/PL' else 'NA' end as \"EL/PL Flag\", datediff(day,cast(report_date as date),current_date) as age,c.gold_price from public.OM_OOS_Base a LEFT JOIN (SELECT distinct sku , case when is_slash_price='true' then json_extract_path_text(slashed_tier_price,'bf645e97-8a48-4977-8367-e987489760f9',TRUE) else json_extract_path_text(tier_price,'bf645e97-8a48-4977-8367-e987489760f9',TRUE) end as gold_price FROM raena_catalog_management.product p) c on a.sku=c.sku; drop table if exists public.om_oos_restock_1_med; create table public.om_oos_restock_1_med as select * from public.om_oos_restock_1 unpivot (cnt for warehouse in (cikarang_project_quantity_to_order,surabaya_project_quantity_to_order,semarang_project_quantity_to_order,medan_project_quantity_to_order, makassar_project_quantity_to_order,semarandi_project_quantity_to_order)); drop table if exists public.om_oos_restock_2; create table public.om_oos_restock_2 as select *,case when age between 1 and 3 then '<=3' when age between 4 and 7 then '4-7' when age between 8 and 15 then '8-15' when age > 15 then 'GT 15' end as age_group from public.om_oos_restock_1_med where age>0; drop table if exists public.om_oos_restock_3; create table public.om_oos_restock_3 as select a.*,b.restock as Maximum_occurred_inventory from public.om_oos_restock_2 a inner join ( select restock,age_group,sku,warehouse from ( select restock,age_group,warehouse,sku,row_number() over (partition by age_group,warehouse,sku order by Max_inventory desc) as R from ( select cnt as restock,age_group,warehouse,sku,count(*) as Max_inventory from public.om_oos_restock_2 group by cnt,age_group,warehouse,sku order by 5 desc,1 ) ) where R=1 order by 2,3 ) b on a.sku=b.sku and a.age_group=b.age_group and a.warehouse=b.warehouse; drop table if exists public.om_oos_restock_4; create table public.om_oos_restock_4 as select a.*,b.\"<=3 Maximum_occurred_inventory\",\"4-7 Maximum_occurred_inventory\",\"8-15 Maximum_occurred_inventory\",\"GT 15 Maximum_occurred_inventory\" from public.om_oos_restock_3 a inner join ( select distinct sku,warehouse, sum(case when Age_group in ('<=3') then Maximum_occurred_inventory end)as \"<=3 Maximum_occurred_inventory\", sum(case when Age_group in ('4-7') then Maximum_occurred_inventory end) as \"4-7 Maximum_occurred_inventory\", sum(case when Age_group in ('8-15') then Maximum_occurred_inventory end) as \"8-15 Maximum_occurred_inventory\", sum(case when Age_group in ('GT 15') then Maximum_occurred_inventory end )as \"GT 15 Maximum_occurred_inventory\" from public.om_oos_restock_3 group by 1,2 order by sku ) b on a.sku=b.sku and a.warehouse=b.warehouse; drop table if exists public.om_oos_restock_5; create table public.om_oos_restock_5 as select a.*,b.sold_out_fl,c.runrate as \"90_days_runrate\" from public.om_oos_restock_4 a inner join ( select sku,sold_out_fl,warehouse from ( select *,row_number() over (partition by sku order by sold_out_fl) as R from ( select distinct sku,warehouse, case when ((age=16) and restock=0) and (\"8-15 Maximum_occurred_inventory\"=0) and \"4-7 Maximum_occurred_inventory\"=0 and \"<=3 Maximum_occurred_inventory\"=0 then '1.GT 15 and sold out' when (age=8 and restock=0) and \"4-7 Maximum_occurred_inventory\"=0 and \"<=3 Maximum_occurred_inventory\"=0 then '2.8-15 and sold out' when ((age=4) and restock=0) and \"<=3 Maximum_occurred_inventory\"=0 then '3.4-7 and sold out' when (age=1 and restock=0) then '4.<=3 and sold out' else '5.stocked' end as sold_out_fl--,count(distinct sku_code) from public.om_oos_restock_4 order by sku,age ) ) where R=1 ) b on a.sku=b.sku and a.warehouse=b.warehouse left join ( select sku,sum(oi.quantity)/count(distinct cast(o.created_at as date)) as runrate from raena_order_management.order o inner join raena_order_management.order_item oi on o.id=oi.order_id where cast(o.created_at as date)>=cast((current_date-90) as date) and o.payment_status='Paid' and cast(o.is_archived as varchar)='false' group by sku ) c on a.sku=c.sku; drop table if exists public.weight_sku_table; CREATE TABLE public.weight_sku_table AS SELECT sku, CASE WHEN weight>=volume_weight THEN weight ELSE volume_weight END weight FROM (SELECT a.sku, weight, (height*width*LENGTH)/6000 AS volume_weight FROM raena_catalog_management.product a WHERE CLASS<>'Bundle') A; drop table if exists public.om_shipping_fee_sku_base_stage2; CREATE TABLE public.om_shipping_fee_sku_base_stage2 AS SELECT A.*, B.weight*Quantity sku_weight, CASE WHEN (B.weight*Quantity)<1.3 THEN 1 WHEN (B.weight*Quantity)>=1.3 AND (ABS((B.weight*Quantity)) - FLOOR(ABS((B.weight*Quantity)))) BETWEEN 0.3 AND 0.999999 THEN FLOOR((B.weight*Quantity))+1 ELSE FLOOR((B.weight*Quantity)) END AS final_weight FROM ( select sku,actual_warehouse,expected_warehouse,payment_amount,quantity,sub_order_shipping_id,missed_inventory, coalesce(expected_JTR_shipping_fee,Expected_shipping_fee,\"Actual Shipping Fee\") as Expected_shipping_fee,\"Actual Shipping Fee\" from ( select distinct A.sku,actual_warehouse,expected_warehouse,A.payment_amount,quantity,A.sub_order_shipping_id,missed_inventory, case when A.sub_order_shipping_id=sb.reference_id and A.order_id=sb.order_id then ((sb.shipping_amount)/(sb.order_weight))*(sb.final_weight) when A.order_id = D.id and (A.sub_order_shipping_id= D.id or A.sub_order_shipping_id is null) then D.shipping_amount when A.sub_order_shipping_id=C.id then C.shipping_amount end \"Actual Shipping Fee\", public.rate_sheet_wise_expected_warehouse_expected_shipping_final.Expected_shipping_fee,jsf.expected_JTR_shipping_fee from public.rate_sheet_wise_expected_warehouse A left join raena_order_management.sales_sub_order_shipment C on A.sub_order_shipping_id=C.id left join raena_order_management.order D on A.order_id = D.id and (A.sub_order_shipping_id= D.id or A.sub_order_shipping_id is null) left join public.OM_Logistic_final_shipping_base sb on A.sub_order_shipping_id=sb.reference_id and A.order_id=sb.order_id left join public.rate_sheet_wise_expected_warehouse_expected_shipping_final on A.sub_order_shipping_id=public.rate_sheet_wise_expected_warehouse_expected_shipping_final.sub_order_shipping_id left join public.om_shipment_jtr_shipping_fee_base_11 jsf on A.sub_order_shipping_id=jsf.sub_order_shipping_id where A.created_date>=(current_date-90) and A.is_campaign='false' ) ) A LEFT JOIN public.weight_sku_table B ON A.sku = B.sku ; drop table if exists public.om_shipping_fee_sku_base_stage3; CREATE TABLE public.om_shipping_fee_sku_base_stage3 AS SELECT *, (sku_weight*\"Actual Shipping Fee\")/sum(sku_weight) over(partition BY sub_order_shipping_id) new_shipment_amount, (sku_weight*Expected_shipping_fee)/sum(sku_weight) over(partition BY sub_order_shipping_id) new_expected_shipment_amount FROM public.om_shipping_fee_sku_base_stage2; drop table if exists public.om_oos_restock_6; create table public.om_oos_restock_6 as select distinct a.report_date,a.sku,a.sku_type,a.brand_name,a.give_away,a.new_sku_flag,a.active_status,a.\"el/pl flag\",a.age,a.gold_price,a.cnt,a.age_group,a.sold_out_fl,\"90_days_runrate\", b.restock_days,c.total_runrate,d.avg_remaining_LM_RV,d.avg_All_LM_RV from public.om_oos_restock_5 a inner join ( select sku,sold_out_fl,max(case when restock=0 and sold_out_fl='1.GT 15 and sold out' and age>15 then age when restock=0 and sold_out_fl='2.8-15 and sold out' and age between 8 and 15 then age when restock=0 and sold_out_fl='3.4-7 and sold out' and age between 4 and 7 then age when restock=0 and sold_out_fl='4.<=3 and sold out' and age <=3 then age end) as restock_days from public.om_oos_restock_5 where sold_out_fl not like '%stocked' group by 1,2 ) b on a.sku=b.sku left join public.demand_forecast_dashboard_final c on a.sku=c.sku left join ( select sku,avg(shipping_fee)/avg(payment_amount) as avg_remaining_LM_RV,avg(new_expected_shipment_amount)/avg(payment_amount) as avg_All_LM_RV from ( select sku, new_expected_shipment_amount, payment_amount,\"Actual Shipping Fee\" as shipping_fee from ( select sku,actual_warehouse,expected_warehouse, (payment_amount/quantity) as payment_amount,missed_inventory,(new_shipment_amount/quantity) as \"Actual Shipping Fee\", (new_expected_shipment_amount/quantity) as new_expected_shipment_amount from public.om_shipping_fee_sku_base_stage3 --where sku='HAN020' ) ) where payment_amount!=0 group by 1 ) d on a.sku=d.sku; " > /home/ec2-user/cronjob/OOS/OOS_code.sql psql "host=raen-prd-sg-redshift-cluster.cdqj58hfx4p7.ap-southeast-1.redshift.amazonaws.com user=dbadmin dbname=analytics port=5439 password=5qCif6eyY3Kmg4z" -f /home/ec2-user/cronjob/OOS/OOS_code.sql