-----------------customer status report 29/04/26 -----------------
select cust.c_bpartner_id
,cust.customer_code, cust.customer_name, cust.customer_address, cust.customer_phone
, prod_segment.segment_id, prod_segment.segment_name
,cust.district, cust.thana, cust.ad_org_id, cust.terr_id
,terr.terrName, terr.terrCode, terr.terroffval, terr.terrOfficer, terr.C_SalesRegion_Parent_ID
,terr.C_SalesRegion_ID, terr.AD_Org_ID
,zone.zoneName, zone.zoneCode, zone.zoneoffval, zone.zoneOfficer, zone.C_SalesRegion_ID as zone_id
,division.divisionName, division.divisionCode, division.divisionoffval, division.divisionOfficer, division.C_SalesRegion_ID as division_id
,hos.hosName, hos.hosCode, hos.hosoffval, hos.hosOfficer, hos.hosEmpID, hos.hosDesig
,(select name from ad_org where ad_org_id = cust.ad_org_id) as org_name
,(select name from m_warehouse where m_warehouse_id = da.m_warehouse_id limit 1) as warehouse
,da.m_warehouse_id
,main_data.order_amt as order_amt
,main_data.inv_amt as inv_amt
,main_data.pay_amt as pay_amt
,customerType.name
from
(
select cb.c_bpartner_id,cb.value as customer_code,cb.name as customer_name
,cl.customer_phone,cr.name as district,cc.name as thana,cb.ad_org_id,tca.territory_id as terr_id
,trim(trailing ',' from concat(cl.address1, cl.address2, cl.address3, cl.city, ',')) as customer_address
from c_bpartner cb
LEFT JOIN LATERAL (
SELECT cl.address1, cl.address2, cl.address3,cl.city,cl.c_region_id, cl.c_city_id
,case when cbl.phone is null and cbl.phone2 is not null then cbl.phone2 else cbl.phone end as customer_phone
FROM c_bpartner_location cbl
JOIN c_location cl ON cl.c_location_id = cbl.c_location_id
WHERE cbl.c_bpartner_id = cb.c_bpartner_id
AND cl.isactive = 'Y'
ORDER BY cbl.created
LIMIT 1
) cl ON TRUE
left join c_region cr on cr.c_region_id = cl.c_region_id
left join c_city cc on cc.c_city_id = cl.c_city_id
left join c_activity ca on ca.c_activity_id = cb.c_activity_id
left join T_CustomerAssignment tca on tca.c_bpartner_id = cb.c_bpartner_id
and (tca.datestart <= $P{dd2}::date and (tca.datefinish is null or tca.datefinish >= $P{dd2}::date))
where ($P{AD_Org_ID} IS NULL OR cb.ad_org_id = $P{AD_Org_ID})
and ($P{C_BPartner_ID} IS NULL OR cb.c_bpartner_id = $P{C_BPartner_ID})
order by cb.c_bpartner_id
) cust
-- =================== PRODUCT SEGMENT BLOCK (from order lines) ===================
join
(
SELECT
co.c_bpartner_id,
string_agg(DISTINCT ca.c_activity_id::text, ', ') as segment_id,
string_agg(DISTINCT ca.name, ', ') as segment_name
FROM c_order co
JOIN c_orderline col ON col.c_order_id = co.c_order_id
JOIN m_product mp ON mp.m_product_id = col.m_product_id
JOIN c_activity ca ON ca.c_activity_id = mp.c_activity_id
WHERE co.docstatus IN ('CO', 'CL')
AND ($P{C_Activity_ID} IS NULL OR ca.c_activity_id = $P{C_Activity_ID})
GROUP BY co.c_bpartner_id
) prod_segment ON prod_segment.c_bpartner_id = cust.c_bpartner_id
left join (
SELECT DISTINCT cd.c_doctype_id,cd.name,co.c_bpartner_id FROM c_order co JOIN c_doctype cd ON cd.c_doctype_id = co.c_doctype_id
WHERE cd.docbasetype LIKE 'SOO' AND cd.docsubtypeso LIKE 'SO'
) customerType on customerType.c_bpartner_id = cust.c_bpartner_id
left join
(
select DISTINCT rg.name as terrName, rg.value as terrCode
,bp.value as terroffval, bp.name as terrOfficer
,srgm.C_SalesRegion_Parent_ID
,rg.C_SalesRegion_ID, rg.AD_Org_ID
from C_SalesRegion rg
left join T_SupervisorAssignment cs on rg.C_SalesRegion_ID = cs.C_SalesRegion_ID
and (cs.datestart <= $P{dd2}::date and (cs.datefinish is null or cs.datefinish >= $P{dd2}::date))
left join C_BPartner bp on bp.C_BPartner_ID = cs.C_BPartner_ID
left join HR_Employee emp on bp.C_BPartner_ID = emp.C_BPartner_ID
left join HR_Job desig on emp.HR_Job_ID = desig.HR_Job_ID
left join T_SalesRegionMapping srgm on srgm.C_SalesRegion_ID = rg.C_SalesRegion_ID
left join C_SalesRegion prg on prg.C_SalesRegion_ID = srgm.C_SalesRegion_Parent_ID
left join T_SalesRegionMapping srgm1 on srgm1.C_SalesRegion_ID = prg.C_SalesRegion_ID
where rg.levelno = 4
order by terrName
) terr
on cust.terr_id = terr.C_SalesRegion_ID
and terr.AD_Org_ID = cust.ad_org_id
left join
(
select distinct rg.name as zoneName, rg.value as zoneCode
,bp.value as zoneoffval, bp.name as zoneOfficer
,srgm.C_SalesRegion_Parent_ID, rg.C_SalesRegion_ID
from C_SalesRegion rg
left join T_SupervisorAssignment cs on rg.C_SalesRegion_ID = cs.C_SalesRegion_ID
and (cs.datestart <= $P{dd2}::date and (cs.datefinish is null or cs.datefinish >= $P{dd2}::date))
left join C_BPartner bp on bp.C_BPartner_ID = cs.C_BPartner_ID
left join HR_Employee emp on bp.C_BPartner_ID = emp.C_BPartner_ID
left join HR_Job desig on emp.HR_Job_ID = desig.HR_Job_ID
left join T_SalesRegionMapping srgm on srgm.C_SalesRegion_ID = rg.C_SalesRegion_ID
left join C_SalesRegion prg on prg.C_SalesRegion_ID = srgm.C_SalesRegion_Parent_ID
left join T_SalesRegionMapping srgm1 on srgm1.C_SalesRegion_ID = prg.C_SalesRegion_ID
where rg.levelno = 3
order by zoneName
) zone on terr.C_SalesRegion_Parent_ID = zone.C_SalesRegion_ID
and terr.AD_Org_ID = cust.AD_Org_ID
left join
(
select DISTINCT rg.name as divisionName, rg.value as divisionCode
,bp.value as divisionoffval, bp.name as divisionOfficer
,srgm.C_SalesRegion_Parent_ID, rg.C_SalesRegion_ID
from C_SalesRegion rg
left join T_SupervisorAssignment cs on rg.C_SalesRegion_ID = cs.C_SalesRegion_ID
and (cs.datestart <= $P{dd2}::date and (cs.datefinish is null or cs.datefinish >= $P{dd2}::date))
left join C_BPartner bp on bp.C_BPartner_ID = cs.C_BPartner_ID
left join HR_Employee emp on bp.C_BPartner_ID = emp.C_BPartner_ID
left join HR_Job desig on emp.HR_Job_ID = desig.HR_Job_ID
left join T_SalesRegionMapping srgm on srgm.C_SalesRegion_ID = rg.C_SalesRegion_ID
left join C_SalesRegion prg on prg.C_SalesRegion_ID = srgm.C_SalesRegion_Parent_ID
left join T_SalesRegionMapping srgm1 on srgm1.C_SalesRegion_ID = prg.C_SalesRegion_ID
where rg.levelno = 2
order by divisionName
) division on zone.C_SalesRegion_Parent_ID = division.C_SalesRegion_ID
and terr.AD_Org_ID = cust.ad_org_id
left join
(
select DISTINCT rg.name as hosName, rg.value as hosCode
,bp.value as hosoffval, bp.name as hosOfficer
,srgm.C_SalesRegion_Parent_ID, rg.C_SalesRegion_ID
,emp.name as employee, emp.value as hosEmpID
,desig.name as hosDesig
from C_SalesRegion rg
left join T_SupervisorAssignment cs on rg.C_SalesRegion_ID = cs.C_SalesRegion_ID
and (cs.datestart <= $P{dd2}::date and (cs.datefinish is null or cs.datefinish >= $P{dd2}::date))
left join C_BPartner bp on bp.C_BPartner_ID = cs.C_BPartner_ID
left join HR_Employee emp on bp.C_BPartner_ID = emp.C_BPartner_ID
left join HR_Job desig on emp.HR_Job_ID = desig.HR_Job_ID
left join T_SalesRegionMapping srgm on srgm.C_SalesRegion_ID = rg.C_SalesRegion_ID
left join C_SalesRegion prg on prg.C_SalesRegion_ID = srgm.C_SalesRegion_Parent_ID
left join T_SalesRegionMapping srgm1 on srgm1.C_SalesRegion_ID = prg.C_SalesRegion_ID
where rg.levelno = 1
order by hosName
) hos on division.C_SalesRegion_Parent_ID = hos.C_SalesRegion_ID
LEFT JOIN LATERAL (
select da.m_warehouse_id
from T_WH_SRAssignment da
where da.c_salesregion_id = cust.terr_id
and $P{dd2}::date >= da.datestart
order by da.datestart desc limit 1
) da on true
JOIN
(
SELECT
CASE WHEN order_bp_id IS NOT NULL THEN order_bp_id
WHEN inv_bp_id IS NOT NULL THEN inv_bp_id
ELSE pay_bp_id END AS c_bpartner_id
,CASE WHEN order_org_id IS NOT NULL THEN order_org_id
WHEN inv_org_id IS NOT NULL THEN inv_org_id
ELSE pay_org_id END AS ad_org_id
,order_amt
,inv_amt
,pay_amt
FROM
(
-- -------- ORDER BLOCK --------
SELECT co.ad_org_id as order_org_id
,cb.c_bpartner_id as order_bp_id
-- ,max(aprv.approved_date) as approved_date
,sum(co.grandtotal) as order_amt
FROM c_order co
JOIN c_bpartner cb on cb.c_bpartner_id = co.c_bpartner_id
LEFT JOIN LATERAL
(
select max(case when oldvalue='AP' and newValue='CO' then chl.updated end) as approved_date
,max(case when oldvalue='AP' and newValue='CO' then
(case when usr.C_BPartner_ID > 0
then (select name from C_BPartner where C_BPartner_ID = usr.C_BPartner_ID)
else usr.name end)
end) as approvedBY
from AD_ChangeLog chl
join AD_User usr on usr.AD_User_ID = chl.updatedBy
where AD_Table_ID = 259 and AD_Column_ID = 2170 and record_id = co.c_order_id
) aprv on (1=1)
WHERE co.isSotrx = 'Y'
AND co.docstatus IN ('CO','CL')
AND (aprv.approved_date::date BETWEEN $P{dd1}::date AND $P{dd2}::date)
GROUP BY co.ad_org_id,cb.c_bpartner_id
) orderinfo
FULL JOIN
(
-- -------- INVOICE BLOCK --------
SELECT ci.ad_org_id as inv_org_id
,cb.c_bpartner_id as inv_bp_id
,sum(ci.grandtotal) as inv_amt
FROM c_invoice ci
JOIN c_bpartner cb on cb.c_bpartner_id = ci.c_bpartner_id
WHERE ci.isSotrx = 'Y'
AND ci.docstatus IN ('CO','CL')
AND ci.c_order_id IS NOT NULL
AND (ci.dateacct::date BETWEEN $P{dd1}::date AND $P{dd2}::date)
GROUP BY ci.ad_org_id, cb.c_bpartner_id
) invinfo
ON invinfo.inv_org_id = orderinfo.order_org_id
AND invinfo.inv_bp_id = orderinfo.order_bp_id
FULL JOIN
(
-- -------- PAYMENT BLOCK --------
SELECT cp.ad_org_id as pay_org_id
,cb.c_bpartner_id as pay_bp_id
,sum(cp.payamt) as pay_amt
FROM c_payment cp
JOIN c_bpartner cb on cb.c_bpartner_id = cp.c_bpartner_id
WHERE cp.isreceipt = 'Y'
AND cp.docstatus IN ('CO','CL')
AND (cp.dateacct::date BETWEEN $P{dd1}::date AND $P{dd2}::date)
GROUP BY cp.ad_org_id, cb.c_bpartner_id
) payinfo
ON payinfo.pay_org_id = orderinfo.order_org_id
AND payinfo.pay_bp_id = orderinfo.order_bp_id
) main_data ON main_data.c_bpartner_id = cust.c_bpartner_id
WHERE ($P{Territory_ID} IS NULL OR terr.C_SalesRegion_ID = $P{Territory_ID})
AND ($P{Zone_ID} IS NULL OR zone.C_SalesRegion_ID = $P{Zone_ID})
AND ($P{Division_ID} IS NULL OR division.C_SalesRegion_ID = $P{Division_ID})
AND ($P{C_DocType_ID}::integer IS NULL OR cd.c_doctype_id = $P{C_DocType_ID}::integer)
--GROUP BY
-- cust.c_bpartner_id, cust.customer_code, cust.customer_name, cust.customer_address, cust.customer_phone
-- , prod_segment.segment_id, prod_segment.segment_name, cust.district, cust.thana
-- ,cust.ad_org_id, cust.terr_id
-- ,terr.terrName, terr.terrCode, terr.terroffval, terr.terrOfficer, terr.C_SalesRegion_Parent_ID
-- ,terr.C_SalesRegion_ID, terr.AD_Org_ID
-- ,zone.zoneName, zone.zoneCode, zone.zoneoffval, zone.zoneOfficer, zone.C_SalesRegion_ID
-- ,division.divisionName, division.divisionCode, division.divisionoffval, division.divisionOfficer, division.C_SalesRegion_ID
-- ,hos.hosName, hos.hosCode, hos.hosoffval, hos.hosOfficer, hos.hosEmpID, hos.hosDesig
-- ,da.m_warehouse_id,inv_amt,pay_amt,customerType.name
---- ,main_data.approved_date
ORDER BY cust.customer_name;