Upsert Customer - Assign Customer Segments Implementation Analysis (On-Prem)
Analysis of existing code of “Assign Customer Segments” feature
Input Request:
- Header
- CustomerHeaderType ( Source System, User, Brand)
- Params
- Customer Code
- SCV Code
- Customer Segments (SegmentationsType)
- Segments (SegmentType)
- SegmentType
- Brand ( Brand code, Brand name)
- Segment Classification ( Segment Classification Code, Segment Classification Value, Segment Classification Name, Segment Classification Description)
- Unassign Segment Flag
- SegmentType
- Segments (SegmentType)
Implementation:
- IF customer code is not given
- a) check whether given SCV code is valid or not. (DB query)
- if valid —> get customer code based on SCV code from DB (DB query)
- a) check whether given SCV code is valid or not. (DB query)
- OTHERWISE
- check whether given customer code is valid or not (DB query)
- if invalid —> throw an exception
- check whether given customer code is valid or not (DB query)
- Create UTIL BEAN
- Set customer code, data source connection, customer header (Customer Header Type)
- Put UTIL BEAN into JNDI registry (transactionRegistry) ?
- Create CustomerCompleteType
- Set customerCode
- Retrieve Customer Details by Customer Code
- LOG response time (performance)
- UtilBean —> Set existing customer VO with customer details
- IF customer segments are not empty from request params
- Get customer segments from request params
- Build customer segment VO list from list of customer segments)
- SegmentationsTypeVO ( brand name,
- brand code,
- classification,
- classification code,
- classification value,
- classification description )
- prepare segment VO list
- prepare segment VO list for deletion (UnassignSegmentFlag is true)
- UTIL BEAN —> set list of segment VO list for deletion.
- SegmentationsTypeVO ( brand name,
- UTIL BEAN —> get existing customer segments and
- Set classification code with value
- Set classification value with code
- Get customer segments to be deleted
- Mark respective existing customer segments for deletion
- Set customer segments list with existing customer segments list from UTIL BEAN
- Validate multiple segments allowed for segments list (DB Query)
- Create assign customer segment response MAP
- Put customer into map
- Below steps are implemented through INFORMATICA. Need to change the process in order to perform the below steps according to modern design
- Create Siperian Client from Get SIFC Client (To write new logic according to modernisation)
- Call dummy upsert using Siperian client (To write new logic according to modernisation)
- Get customer row id (getPTRPartyRoleRowId) by customer code (DB Query)
- Create new PutRequest()
- Create new Record()
- Create new RecordKey()
- From UTILBEAN’s customer header, get sour e system, last update user details.
- Set source system into RecordKey
- Set RecordKay into PutRequest
- Set generate source key as false into PutRequest
- Set source key as “source system” + “.” + “customer row id”
- Set SiberianObjectUid as “BASE_OBJECT.C_PTR_CUST”
- Set RowId of RecordKey with the response from DB query
- If Valid row id,
- Set Record into PutRequest
- Process the PutRequest through siperian client
- Set response code as “CMDWS-200”, Status as “assignment is successful”
- Log if it is not a KEY CLIENT
- Log deleted segments
DB Queries:
- To find given SCV code is valid or not
SELECT COUNT(1) CNT FROM PKG_RETRIEVE_CUSTOMER WHERE ALT_CODE_TYPE = 'PTR_ALT_CODES.CSTSCV' AND HUB_STATE_IND = 1 AND CODE = (?)
- To find customer code based on SCV code
WITH SCV_NUMBER AS ( SELECT ROWID_OBJECT, PTR_ROWID, CODE CUST_SCV_NUMBER FROM C_PTR_ALT_CODES WHERE HUB_STATE_IND = 1 AND TYP_TYPE_CD = 'PTR_ALT_CODES.CSTSCV' AND CODE = (?) ),
SCV_CODE AS ( SELECT ROWID_OBJECT, PTR_ROWID, CODE CUST_SCV_CODE FROM C_PTR_ALT_CODES WHERE HUB_STATE_IND = 1 AND TYP_TYPE_CD = 'PTR_ALT_CODES.CSTFCT' )
SELECT SCV_NUMBER.PTR_ROWID, SCV_NUMBER.CUST_SCV_NUMBER, SCV_CODE.CUST_SCV_CODE FROM SCV_NUMBER LEFT OUTER JOIN SCV_CODE ON ( SCV_CODE.PTR_ROWID = SCV_NUMBER.PTR_ROWID AND SUBSTR(SCV_NUMBER.CUST_SCV_NUMBER,4) = SUBSTR(SCV_CODE.CUST_SCV_CODE,3) )
- To find customer code is valid or not
WITH CUSTOMER_IDENTIFIER_INFO AS ( SELECT * FROM ( SELECT PTR_ROWID CUSTOMER_MDM_ID, TYP_TYPE_CD, CODE FROM C_PTR_ALT_CODES WHERE HUB_STATE_IND = 1 AND TYP_TYPE_CD IN ('PTR_ALT_CODES.CSTSCV','PTR_ALT_CODES.CSTFCT')
AND EXISTS ( SELECT 1 FROM C_PTR_ALT_CODES KK WHERE C_PTR_ALT_CODES.PTR_ROWID = KK.PTR_ROWID AND KK.CODE = (?) )
) PIVOT (MIN(CODE) FOR (TYP_TYPE_CD) IN ( 'PTR_ALT_CODES.CSTSCV' AS CUST_SCV_CODE, 'PTR_ALT_CODES.CSTFCT' AS CUST_FACT_CODE)) ) SELECT RPAD(DECODE(CUST_MDM_ID,'99999999999999', 'NOT AVAILABLE',CUST_MDM_ID),14,' ') CUST_MDM_ID, CUST_SCV_CODE, CUST_FACT_CODE FROM ( SELECT DISTINCT CUST_MDM_ID, CUST_SCV_CODE, CUST_FACT_CODE, DENSE_RANK() OVER (ORDER BY CUST_MDM_ID) D_RANK FROM ( SELECT CUSTOMER_IDENTIFIER_INFO.CUSTOMER_MDM_ID CUST_MDM_ID, CUSTOMER_IDENTIFIER_INFO.CUST_SCV_CODE, CUSTOMER_IDENTIFIER_INFO.CUST_FACT_CODE FROM CUSTOMER_IDENTIFIER_INFO INNER JOIN C_PTR_CUST ON C_PTR_CUST.PTR_CUST_ROWID = CUSTOMER_IDENTIFIER_INFO.CUSTOMER_MDM_ID WHERE C_PTR_CUST.HUB_STATE_IND = 1 AND ( NVL(C_PTR_CUST.PTR_CUST_STAT_CD ,'A') = 'A' OR ( NVL(C_PTR_CUST.PTR_CUST_STAT_CD ,'S') = 'S' and C_PTR_CUST.NMB_FLAG='Y') ) UNION ALL SELECT '99999999999999', '99999999999999','99999999999999' FROM DUAL ) ) WHERE D_RANK = 1
- To check whether multiple segments are allowed or not
WITH SEGMENT_INFO AS ( SELECT C_PTR_CLSSN_TYP.ROWID_OBJECT SEGMENT_TYP_MDM_ID, C_PTR_REL_CLSSN.ROWID_OBJECT SEGMENT_VAL_MDM_ID, C_PTR_CLSSN_TYP.MULTI_VAL_ALWD_IND, C_PTR_CLSSN_TYP.CODE SEGMENT_TYP_CD, C_PTR_CLSSN_TYP.NAME SEGMENT_TYP_NM, C_PTR_REL_CLSSN.CODE SEGMENT_VAL_CD, C_PTR_REL_CLSSN.NAME SEGMENT_VAL_NM, C_PTR_REL_CLSSN.DESCRIPTION SEGMENT_VAL_DESC FROM C_PTR_CLSSN_TYP INNER JOIN C_PTR_REL_CLSSN ON C_PTR_REL_CLSSN.CLSSN_TYPE_CD = C_PTR_CLSSN_TYP.CODE ), BRAND_INFO AS ( SELECT C_PTR_PARTY_RL.ROWID_OBJECT BRAND_MDM_ID, C_PTR_PARTY_RL.PARTY_RL_NM BRAND_NAME, C_PTR_ALT_CODES.CODE BRAND_CODE FROM C_PTR_PARTY_RL , C_PTR_ALT_CODES WHERE C_PTR_PARTY_RL.ROWID_OBJECT = C_PTR_ALT_CODES.PTR_ROWID AND C_PTR_PARTY_RL.HUB_STATE_IND = 1 AND C_PTR_ALT_CODES.HUB_STATE_IND = 1 AND C_PTR_PARTY_RL.RL_TYP_CD = 'CARR' AND C_PTR_ALT_CODES.TYP_TYPE_CD = 'PTR_ALT_CODES.LRA_CD' ), BRAND_SEGMENT AS ( SELECT BRAND_INFO.BRAND_MDM_ID, BRAND_INFO.BRAND_NAME, BRAND_INFO.BRAND_CODE, SEGMENT_INFO.SEGMENT_TYP_MDM_ID, SEGMENT_INFO.MULTI_VAL_ALWD_IND, SEGMENT_INFO.SEGMENT_TYP_CD, SEGMENT_INFO.SEGMENT_TYP_NM FROM BRAND_INFO INNER JOIN C_PTR_REL_CLSSN_REL ON C_PTR_REL_CLSSN_REL.PTR_RL_ROWID = BRAND_INFO.BRAND_MDM_ID INNER JOIN SEGMENT_INFO ON C_PTR_REL_CLSSN_REL.PTR_CLSSN_ROWID = SEGMENT_INFO.SEGMENT_VAL_MDM_ID )
SELECT DISTINCT * FROM BRAND_SEGMENT WHERE SEGMENT_TYP_CD = ? AND BRAND_CODE = ?
- To get Customer Row Id
SELECT DECODE(CUST_MDM_ID,'9999999999999999', 'NOT AVAILABLE',CUST_MDM_ID) CUST_MDM_ID FROM ( SELECT DISTINCT CUST_MDM_ID, DENSE_RANK() OVER (ORDER BY TO_NUMBER(CUST_MDM_ID)) D_RANK FROM ( SELECT DISTINCT C_PTR_PARTY_RL.ROWID_OBJECT CUST_MDM_ID FROM C_PTR_PARTY_RL INNER JOIN C_PTR_ALT_CODES ON C_PTR_ALT_CODES.PTR_ROWID = C_PTR_PARTY_RL.ROWID_OBJECT WHERE C_PTR_ALT_CODES.TYP_TYPE_CD = 'PTR_ALT_CODES.CSTFCT' AND C_PTR_ALT_CODES.CODE = ? UNION ALL SELECT '9999999999999999' FROM DUAL ) ) WHERE D_RANK = 1
- To get Row Id Object
SELECT ROWID_OBJECT, PTR_CUST_ROWID, ACC_GRP_CD, BROK, FORCOM, PTR_CUST_STAT_CD, PTR_CUST_TYP_CD, PTR_STS_RSN_CD, URL, INTL_DIALNG_ROWID_PH, PH_NUM, COMM_TYP, MOB_VALIDN_REQ_TS, MOB_VALIDN_REQ_ID FROM C_PTR_CUST WHERE PTR_CUST_ROWID = ?