## 4. CRUD Operations / Called Services

### Pre-computed evidence from code analysis graph:

| CRUD | SC / CBS | SC Code | Entity / DB | Operation Description |
|------|----------|---------|-------------|----------------------|
| R | `JKKAdchgCancelHakkoSODCC.callEKK0351A010SC` (before) | EKK0351A010SC | Optional Service Contract Agreement | Retrieves before-change optional service contract consent data. Input: `op_svc_kei_no`, `gene_add_dtm`. Output: `op_svc_cd`, `op_svc_kei_stat` |
| R | `JKKAdchgCancelHakkoSODCC.callEKK0361A010SC` (before) | EKK0361A010SC | Optional Service Contract (ISP) Consent | Retrieves before-change ISP-specific optional service agreement. Input: `op_svc_kei_no`, `gene_add_dtm`. Output: `chbfEKK0361A010SCHash` containing MLAD (mail address) |
| R | `JKKAdchgCancelHakkoSODCC.callEKK0361A010SC` (after) | EKK0361A010SC | Optional Service Contract (ISP) Consent | Retrieves after-change ISP-specific optional service agreement. Input: `chaf_opsvkei_no`, `chaf_opsvkei_gene_add_dtm`. Output: `chafEKK0361A010SCHash` |
| R | `JKKAdchgCancelHakkoSODCC.callEKK0401A010SC` (before) | EKK0401A010SC | Sub-Option Service Contract Agreement | Retrieves before-change sub-option service consent. Input: `op_svc_kei_no`, `sbop_svc_kei_no`, `gene_add_dtm`. Output: `chbfEKK0401A010SCHash` |
| R | `JKKAdchgCancelHakkoSODCC.callEKK0401A010SC` (after) | EKK0401A010SC | Sub-Option Service Contract Agreement | Retrieves after-change sub-option service consent. Input: `chaf_opsvkei_no`, `chaf_sbopsvkei_no`, `chaf_sbopsvkei_gene_add_dtm`. Output: `chafEKK0401A010SCHash` containing `sbop_svc_cd`, `sbop_svc_kei_stat` |
| R | `JKKAdchgCancelHakkoSODCC.callEKK0411A010SC` (before) | EKK0411A010SC | Sub-Option Service Contract (ISP) Agreement | Retrieves before-change sub-option ISP consent. Input: `op_svc_kei_no`, `sbop_svc_kei_no`, `gene_add_dtm`. Output: `chbfEKK0411A010SCHash` |
| R | `JKKAdchgCancelHakkoSODCC.callEKK0411A010SC` (after) | EKK0411A010SC | Sub-Option Service Contract (ISP) Agreement | Retrieves after-change sub-option ISP consent. Input: `chaf_opsvkei_no`, `chaf_sbopsvkei_no`, `chaf_sbopsvkei_gene_add_dtm`. Output: `chafEKK0411A010SCHash` containing `add_capa`, `alias` |
| C | `JKKAdchgCancelHakkoSODCC.addSOD` (multiple calls) | - | SOD Order Data (various entities) | Creates SOD records for each order content code. Called 70+ times throughout the method. Each call writes a distinct SOD type (registration, unregistration, change, cancellation) to the SOD database |
| R | `JKKAdchgCancelHakkoSODCC.getSame_trn_no` | EKK1081C011 (template) | Same Transaction Number | Acquires same transaction number for deduplication. Input: `param`, `handle`, `svc_kei_no`. Output: `sameTrnNo[0]` |
| R | `JKKAdchgCancelHakkoSODCC.callEKK0161B004SC` (multiple) | EKK0161B004SC | Service Contract Detail List | Retrieves service detail contract info. Input: `svc_kei_no`. Output: `svc_kei_ucwk_no`, `svc_kei_ucwk_gadtm`, `svc_kei_ucwk_stat` |
| R | `JKKAdchgCancelHakkoSODCC.getEKK0251B001SC` | EKK0251B001CBS | Service Line Detail List | Retrieves service line detail info for assigned phone branch. Input: `svc_kei_no`. Output: `svc_kei_kaisen_ucwk_no`, `svc_kei_kaisen_ucwk_gadtm` |
| R | `JKKAdchgCancelHakkoSODCC.callEKK0341A010SC` | EKK0341A010SC | Device Provision Service Contract Agreement | Retrieves device provision service agreement for assigned phone branch. Input: `kktk_svc_kei_no`, `gene_add_dtm`. Output: `taknkiki_model_cd`, `kiki_seizo_no` |
| R | `JKKAdchgCancelHakkoSODCC.callEKK0191A010SC` | EKK0191A010SC | Service Detail: eo Light Phone Agreement | Retrieves service detail for call forwarding branch. Input: `svc_kei_ucwk_no`, `gene_add_dtm`. Output: `bmp_um` (phone number presence flag) |
| R | `JKKAdchgCancelHakkoSODCC.callEKK1041B001SC` | EKK1041B001CBS | Order Setting List | Retrieves order settings for call forwarding branch to check Z1 orders (Radius auth, OLS, SIP, emergency alert). Output: list of `svc_order_cd`, `rcnt_yokyu_sbt_cd` |
| R | `JKKAdchgCancelHakkoSODCC.getOldVrsbIdgSvcDtlCd` | - | Old VR Identification Service Detail Code | Retrieves old VR (version) identification determination service detail code. Used in multisection and fixed IP branches. Input: `handle`, `param`, `svc_kei_no`, `svc_kei_ucwk_no[0]`, `pplan_cd` |
| R | `JKKAdchgCancelHakkoSODCC.callEKK0351B002SC` | EKK0351B002SC | Optional Service Contract List (by svc_kei_no) | Retrieves optional service contract list for multisection branch to check for fixed IP address service status. Input: `svc_kei_no`, `op_svc_cd=FIXIPAD`. Output: `op_svc_kei_stat` |

**Classification Summary:**

| Operation Type | Count | Methods |
|---------------|-------|---------|
| Read (R) | 13 | EKK0351A010SC, EKK0361A010SC, EKK0401A010SC, EKK0411A010SC, EKK0161B004SC, EKK0251B001SC, EKK0341A010SC, EKK0191A010SC, EKK1041B001SC, EKK0351B002SC, getSame_trn_no, getOldVrsbIdgSvcDtlCd |
| Create (C) | 1 (but 70+ calls) | addSOD |
| Update (U) | 0 | - |
| Delete (D) | 0 | - |

## 5. Dependency Trace

### Callers

| # | Caller (Screen/Batch) | Call Chain (Full Path to this Method) |
|---|----------------------|--------------------------------------|
| 1 | CBS: `JKKHakkoSODCC` | `JKKHakkoSODCC.executeOdrHakkoJokenAdd` → `JKKAdchgCancelHakkoSODCC.opSetOdrCtrl` |
| 2 | CBS: `JKKAdchgHakkoSODCC` | `JKKAdchgHakkoSODCC.executeOdrAdchg` → `JKKAdchgCancelHakkoSODCC.opSetOdrCtrl` |
| 3 | CBS: `JKKCancelHakkoSODCC` (commented out) | `JKKAdchgCancelHakkoSODCC.executeOdrCancel` (call site at L5997) |
| 4 | CBS: `JKKAdchgCancelHakkoSODCC` | `JKKAdchgCancelHakkoSODCC.executeOdrAdchgCancel` (call site at L6180, L6341, L6505, L6740) |

Terminal operations from this method:
`addSOD` [C] SOD tables, `getSame_trn_no` [R] same transaction number, `jdgIpv6` [-] IPv6 judgment, `tsuikabunAddSOD` [C] additional SOD, `chgOpsvKeiJdg` [-] change judgment, `isBlank` [-], `shkkaChr` [-], `shkkaMap` [-]

## 6. Per-Branch Detail Blocks

**Block 1** — [SET/EXTRACT] (L7452)

> Extracts and sanitizes the five SOD maps from the sodMap parameter.

| # | Type | Code |
|---|------|------|
| 1 | EXTRACT | `sod_kihon_info_Map = sodMap.get(SOD_KIHON_INFO)` // SOD basic info |
| 2 | EXTRACT | `svc_kei_info_Map = sodMap.get(SVC_KEI_INFO)` // Service contract info |
| 3 | EXTRACT | `svc_kei_ucwk_info_Map = sodMap.get(SVC_KEI_UCWK_INFO)` // Service detail info |
| 4 | EXTRACT | `opsvkei_info_Map = sodMap.get(OPSVKEI_INFO)` // Optional service contract info |
| 5 | EXTRACT | `kktsvkei_info_Map = sodMap.get(KKTSVKEI_INFO)` // Device provision service contract info |
| 6 | CALL | `sod_kihon_info_Map = shkkaMap(sod_kihon_info_Map)` // Sanitize map |
| 7 | CALL | `svc_kei_info_Map = shkkaMap(svc_kei_info_Map)` // Sanitize map |
| 8 | CALL | `svc_kei_ucwk_info_Map = shkkaMap(svc_kei_ucwk_info_Map)` // Sanitize map |
| 9 | CALL | `opsvkei_info_Map = shkkaMap(opsvkei_info_Map)` // Sanitize map |
| 10 | CALL | `kktsvkei_info_Map = shkkaMap(kktsvkei_info_Map)` // Sanitize map |

**Block 2** — [SET] (L7474)

> Extracts key fields from all five maps into local variables.

| # | Type | Code |
|---|------|------|
| 1 | EXTRACT | `ido_div = sod_kihon_info_Map.get(INFO_IDO_DIV)` // Change division |
| 2 | EXTRACT | `svc_kei_no = svc_kei_info_Map.get(INFO_SVC_KEI_NO)` // Service contract number |
| 3 | EXTRACT | `chbf_opsvkei_no = opsvkei_info_Map.get(INFO_CHBF_OPSVKEI_NO)` // Before-change optional svc number |
| 4 | EXTRACT | `chbf_opsvkei_gene_add_dtm = opsvkei_info_Map.get(INFO_CHBF_OPSVKEI_GENE_ADD_DTM)` // Before-change timestamp |
| 5 | EXTRACT | `chaf_opsvkei_no = opsvkei_info_Map.get(INFO_CHAF_OPSVKEI_NO)` // After-change optional svc number |
| 6 | EXTRACT | `chaf_opsvkei_gene_add_dtm = opsvkei_info_Map.get(INFO_CHAF_OPSVKEI_GENE_ADD_DTM)` // After-change timestamp |
| 7 | EXTRACT | `chbf_sbopsvkei_no = opsvkei_info_Map.get(INFO_CHBF_SBOPSVKEI_NO)` // Before-change sub-option number |
| 8 | EXTRACT | `chaf_sbopsvkei_no = opsvkei_info_Map.get(INFO_CHAF_SBOPSVKEI_NO)` // After-change sub-option number |
| 9 | EXTRACT | `svc_kei_ucwk_no = svc_kei_ucwk_info_Map.get(INFO_SVC_KEI_UCWK_NO)` // Service detail number |
| 10 | EXTRACT | `chaf_svc_kei_ucwk_gene_add_dtm = svc_kei_ucwk_info_Map.get(INFO_CHAF_SVC_KEI_UCWK_GENE_ADD_DTM)` // After-change detail timestamp |
| 11 | EXTRACT | `chaf_kktk_svc_kei_no = kktsvkei_info_Map.get(INFO_CHAF_KKTSVKEI_NO)` // After-change device provision number |
| 12 | EXTRACT | `chaf_kktk_svc_kei_gene_add_dtm = kktsvkei_info_Map.get(INFO_CHAF_KKTSVKEI_GENE_ADD_DTM)` // After-change device provision timestamp |
| 13 | CALL | `chaf_opsvkei_no = shkkaChr(chaf_opsvkei_no)` // Trim and sanitize |
| 14 | CALL | `chaf_opsvkei_gene_add_dtm = shkkaChr(chaf_opsvkei_gene_add_dtm)` // Trim and sanitize |
| 15 | CALL | `chbf_opsvkei_no = shkkaChr(chbf_opsvkei_no)` // Trim and sanitize |
| 16 | CALL | `chbf_opsvkei_gene_add_dtm = shkkaChr(chbf_opsvkei_gene_add_dtm)` // Trim and sanitize |

**Block 3** — [IF] `isBlank(chaf_opsvkei_no) || isBlank(chbf_opsvkei_no)` (L7492)

> Early return if neither before nor after optional service number is specified.

| # | Type | Code |
|---|------|------|
| 1 | RETURN | `return param` // No optional service contract to process |

**Block 4** — [SET] (L7496-7499)

> Saves IPv6-related service detail fields for later IPv6 branch processing.

| # | Type | Code |
|---|------|------|
| 1 | SET | `this.ipv6_svc_kei_ucwk_no = shkkaChr(svc_kei_ucwk_no)` // Store for IPv6 branch |
| 2 | SET | `this.ipv6_svc_kei_ucwk_gadtm = shkkaChr(chaf_svc_kei_ucwk_gene_add_dtm)` // Store for IPv6 branch |

**Block 5** — [IF] `!isBlank(chbf_opsvkei_no) && !isBlank(chbf_opsvkei_gene_add_dtm)` (L7501)

> Before-change optional service information retrieval.

| # | Type | Code |
|---|------|------|
| 1 | SET | `chbfInHash.put(OP_SVC_KEI_NO, chbf_opsvkei_no)` // Set optional service number |
| 2 | SET | `chbfInHash.put(GENE_ADD_DTM, chbf_opsvkei_gene_add_dtm)` // Set generation timestamp |
| 3 | CALL | `callEKK0351A010SC(param, handle, chbfInHash, chbfResultHash, FUNC_CODE_1)` // Get before-change optional service contract |
| 4 | THROW | Error if `statusCode != 0` |
| 5 | EXTRACT | `opSvcCd = chbfEKK0351A010SCHash.get(OP_SVC_CD)` // Get before-change optional service code |
| 6 | CALL | `String[] opSvcKind = jdgOpSvcKind(opSvcCd)` // Classify service type |

**Block 5.1** — [IF] `null == opSvcKind` (L7532)

> If optional service code is unknown/null, skip to return.

| # | Type | Code |
|---|------|------|
| 1 | RETURN | `return param` // Unknown optional service code |

**Block 5.2** — [IF-ELSE-IF] `opSvcKind[0]` service type classification (L7535, L7544)

> Classifies the optional service into NET (1) or TEL (2).

| # | Type | Code |
|---|------|------|
| 1 | IF | `SVC_KIND_NET.equals(opSvcKind[0])` // eo Light Internet |
| 1.1 | SET | `chbfInHashNet.put(OP_SVC_KEI_NO, chbf_opsvkei_no)` |
| 1.2 | SET | `chbfInHashNet.put(GENE_ADD_DTM, chbf_opsvkei_gene_add_dtm)` |
| 1.3 | CALL | `callEKK0361A010SC(param, handle, chbfInHashNet, chbfResultHashNet, FUNC_CODE_1)` // Get before ISP consent |
| 1.4 | EXTRACT | `chbfEKK0361A010SCHash = chbfResultHashNet.get(TEMPLATE_ID_EKK0361A010)` |
| 2 | ELSE-IF | `SVC_KIND_TEL.equals(opSvcKind[0])` // eo Light Phone |
| 2.1 | (commented out) | `callEKK0371A010SC` — telephone consent retrieval is disabled |

**Block 5.3** — [IF] `opSvcKind[1].equals("1") && !isBlank(chbf_sbopsvkei_no)` (L7571)

> Sub-option service consent retrieval when sub-option exists.

| # | Type | Code |
|---|------|------|
| 1 | IF | `SVC_KIND_NET.equals(opSvcKind[0])` // Before-change NET sub-option |
| 1.1 | SET | `chbfInHashSbopIsp.put(OP_SVC_KEI_NO, chbf_opsvkei_no)` |
| 1.2 | SET | `chbfInHashSbopIsp.put(SBOP_SVC_KEI_NO, chbf_sbopsvkei_no)` |
| 1.3 | SET | `chbfInHashSbopIsp.put(GENE_ADD_DTM, chbf_sbopsvkei_gene_add_dtm)` |
| 1.4 | CALL | `callEKK0411A010SC(param, handle, chbfInHashSbopIsp, chbfResultHashSbopIsp, FUNC_CODE_1)` // Get before-change sub-option ISP consent |
| 1.5 | EXTRACT | `chbfEKK0411A010SCHash = chbfResultHashSbopIsp.get(TEMPLATE_ID_EKK0411A010)` |
| 2 | // NET and TEL common | |
| 2.1 | SET | `chbfInHashSbop.put(OP_SVC_KEI_NO, chbf_opsvkei_no)` |
| 2.2 | SET | `chbfInHashSbop.put(SBOP_SVC_KEI_NO, chbf_sbopsvkei_no)` |
| 2.3 | SET | `chbfInHashSbop.put(GENE_ADD_DTM, chbf_sbopsvkei_gene_add_dtm)` |
| 2.4 | CALL | `callEKK0401A010SC(param, handle, chbfInHashSbop, chbfResultHashSbop, FUNC_CODE_1)` // Get before-change sub-option consent |
| 2.5 | EXTRACT | `chbfEKK0401A010SCHash = chbfResultHashSbop.get(TEMPLATE_ID_EKK0401A010)` |

**Block 6** — [SET] (L7604)

> After-change optional service information retrieval.

| # | Type | Code |
|---|------|------|
| 1 | SET | `chafInHash.put(OP_SVC_KEI_NO, chaf_opsvkei_no)` |
| 2 | SET | `chafInHash.put(GENE_ADD_DTM, chaf_opsvkei_gene_add_dtm)` |
| 3 | CALL | `callEKK0351A010SC(param, handle, chafInHash, chafResultHash, FUNC_CODE_1)` // Get after-change optional service contract |
| 4 | THROW | Error if `statusCode != 0` |
| 5 | EXTRACT | `opSvcCd = chafEKK0351A010SCHash.get(OP_SVC_CD)` // After-change optional service code |
| 6 | CALL | `String[] opSvcKind = jdgOpSvcKind(opSvcCd)` // Classify service type |

**Block 6.1** — [IF] `null == opSvcKind` (L7633)

> If after-change optional service code is unknown/null, skip to return.

| # | Type | Code |
|---|------|------|
| 1 | RETURN | `return param` |

**Block 6.2** — [IF-ELSE-IF] After-change service type classification (L7637, L7646)

> Classifies the after-change optional service into NET (1) or TEL (2).

| # | Type | Code |
|---|------|------|
| 1 | IF | `SVC_KIND_NET.equals(opSvcKind[0])` // After-change NET |
| 1.1 | SET | `chafInHashNet.put(OP_SVC_KEI_NO, chaf_opsvkei_no)` |
| 1.2 | SET | `chafInHashNet.put(GENE_ADD_DTM, chaf_opsvkei_gene_add_dtm)` |
| 1.3 | CALL | `callEKK0361A010SC(param, handle, chafInHashNet, chafResultHashNet, FUNC_CODE_1)` // Get after ISP consent |
| 1.4 | EXTRACT | `chafEKK0361A010SCHash = chafResultHashNet.get(TEMPLATE_ID_EKK0361A010)` |
| 2 | ELSE-IF | `SVC_KIND_TEL.equals(opSvcKind[0])` // After-change TEL |
| 2.1 | (commented out) | `callEKK0371A010SC` — telephone consent retrieval is disabled |

**Block 6.3** — [IF] `opSvcKind[1].equals("1") && !isBlank(chaf_sbopsvkei_no)` (L7675)

> After-change sub-option service consent retrieval.

| # | Type | Code |
|---|------|------|
| 1 | IF | `SVC_KIND_NET.equals(opSvcKind[0])` // After-change NET sub-option |
| 1.1 | SET | `chafInHashSbopIsp.put(OP_SVC_KEI_NO, chaf_opsvkei_no)` |
| 1.2 | SET | `chafInHashSbopIsp.put(SBOP_SVC_KEI_NO, chaf_sbopsvkei_no)` |
| 1.3 | SET | `chafInHashSbopIsp.put(GENE_ADD_DTM, chaf_sbopsvkei_gene_add_dtm)` |
| 1.4 | CALL | `callEKK0411A010SC(param, handle, chafInHashSbopIsp, chafResultHashSbopIsp, FUNC_CODE_1)` // Get after sub-option ISP consent |
| 1.5 | EXTRACT | `chafEKK0411A010SCHash = chafResultHashSbopIsp.get(TEMPLATE_ID_EKK0411A010)` |
| 2 | // NET and TEL common | |
| 2.1 | SET | `chafInHashSbop.put(OP_SVC_KEI_NO, chaf_opsvkei_no)` |
| 2.2 | SET | `chafInHashSbop.put(SBOP_SVC_KEI_NO, chaf_sbopsvkei_no)` |
| 2.3 | SET | `chafInHashSbop.put(GENE_ADD_DTM, chaf_sbopsvkei_gene_add_dtm)` |
| 2.4 | CALL | `callEKK0401A010SC(param, handle, chafInHashSbop, chafResultHashSbop, FUNC_CODE_1)` // Get after sub-option consent |
| 2.5 | EXTRACT | `chafEKK0401A010SCHash = chafResultHashSbop.get(TEMPLATE_ID_EKK0401A010)` |

**Block 7** — [SET] (L7708)

> Computes four state-transition booleans: isNewOpsvkei, isDslOpsvkei, isKaihkOpsvkei, isChgOpsvkei.

| # | Type | Code |
|---|------|------|
| 1 | SET | `isNewOpsvkei = isBlank(chbf_opsvkei_no) && !isBlank(chaf_opsvkei_no)` // New optional service |
| 2 | SET | `isDslOpsvkei = SVC_KEI_STAT_910.equals(opsvkeiStatAfter) || SVC_KEI_STAT_920.equals(opsvkeiStatAfter)` // Cancelled or withdrawn |
| 3 | SET | `isKaihkOpsvkei = (910 before AND 100/030 after) || (920 before AND 020/030 after)` // Restored from cancelled |
| 4 | SET | `isChgOpsvkei = (100 before AND 100 after) || (020 before AND 020 after) || (030 before AND 030 after)` // Unchanged but modified |

**Block 8** — [IF] `opSvcCd == OP_SVC_CD_EMAIL` (L7737)

> **Email service branch.** Determines whether to register, unregister, or modify email address based on state transitions.

| # | Type | Code |
|---|------|------|
| 1 | SET | `this.op_svc_kei_no_ml = chaf_opsvkei_no` // Save key info |
| 1.1 | SET | `this.op_gadtm_ml = chaf_opsvkei_gene_add_dtm` |
| 1.2 | EXTRACT | `this.mlad = chafEKK0361A010SCHash.get(MLAD)` // Get mail address |
| 2 | IF | `isNewOpsvkei` // Email newly registered |
| 2.1 | IF | `chgOpsvKeiJdg && sameTrnJdg > 0` // Change detected + same txn needed |
| 2.1.1 | CALL | `getSame_trn_no(param, handle, null, sameTrnNo)` |
| 2.1.2 | SET | `this.same_trn_no = sameTrnNo[0]` |
| 2.2 | IF | `chgOpsvKeiJdg` // Before and after differ |
| 2.2.1 | SET | `selectOdrNaiyoCd = ODR_NAIYO_CD_108` |
| 2.2.2 | CALL | `addSOD(handle, param, ODR_NAIYO_CD_108)` // Mail registration |
| 3 | ELSE-IF | `isDslOpsvkei` // Email cancelled/withdrawn |
| 3.1 | IF | `!IDO_DIV_DSL && !IDO_DIV_TEKKYODSL && !IDO_DIV_KYOSEIDSL && !IDO_DIV_KYOSEIDSLFIX && !IDO_DIV_CANCEL` // Not a cancellation-divided workflow |
| 3.1.1 | SET | `this.same_trn_no = ""` // Clear same txn |
| 3.2 | SET | `selectOdrNaiyoCd = ODR_NAIYO_CD_116` |
| 3.2.1 | CALL | `addSOD(handle, param, ODR_NAIYO_CD_116)` // Mail unregistration |
| 4 | ELSE-IF | `isKaihkOpsvkei` // Email restored |
| 4.1 | SET | `this.same_trn_no = ""` // Clear same txn |
| 4.2 | SET | `selectOdrNaiyoCd = ODR_NAIYO_CD_120` |
| 4.2.1 | CALL | `addSOD(handle, param, ODR_NAIYO_CD_120)` // Mail restoration |
| 5 | ELSE-IF | `isChgOpsvkei` // Email unchanged but modified |
| 5.1 | IF | `chgOpsvKeiJdg && sameTrnJdg > 0` // Same txn needed for change |
| 5.1.1 | CALL | `getSame_trn_no(param, handle, null, sameTrnNo)` |
| 5.1.2 | SET | `this.same_trn_no = sameTrnNo[0]` |
| 5.2 | IF | `chgOpsvKeiJdg` // Before and after differ |
| 5.2.1 | EXTRACT | `chbfMlad = chbfEKK0361A010SCHash.get(MLAD)` // Before mail address |
| 5.2.2 | EXTRACT | `chafMlad = chafEKK0361A010SCHash.get(MLAD)` // After mail address |
| 5.2.3 | IF | `chbfMlad != chafMlad` // Mail address changed |
| 5.2.3.1 | IF | `isBlank(this.same_trn_no)` // Same txn not yet acquired |
| 5.2.3.1.1 | CALL | `getSame_trn_no(param, handle, null, sameTrnNo)` |
| 5.2.3.1.2 | SET | `this.same_trn_no = sameTrnNo[0]` |
| 5.2.3.2 | SET | `selectOdrNaiyoCd = ODR_NAIYO_CD_117` |
| 5.2.3.2.1 | CALL | `addSOD(handle, param, ODR_NAIYO_CD_117)` // Mail unregistration (with schedule date) |
| 5.2.3.3 | SET | `selectOdrNaiyoCd = ODR_NAIYO_CD_119` |
| 5.2.3.3.1 | CALL | `addSOD(handle, param, ODR_NAIYO_CD_119)` // Mail deletion (with schedule date) |
| 5.2.3.4 | SET | `selectOdrNaiyoCd = ODR_NAIYO_CD_108` |
| 5.2.3.4.1 | CALL | `addSOD(handle, param, ODR_NAIYO_CD_108)` // Mail registration |

### Email sub-branch: Sub-option service analysis

| # | Type | Code |
|---|------|------|
| 1 | EXTRACT | `chafsbopSvcCd = chafEKK0401A010SCHash.get(SBOP_SVC_CD)` // After sub-option service code |
| 2 | EXTRACT | `chafSbopSvcKeiStat = chafEKK0401A010SCHash.get(SBOP_SVC_KEI_STAT)` // After sub-option status |
| 3 | EXTRACT | `chbfSbopSvckeiStat = chbfEKK0401A010SCHash.get(SBOP_SVC_KEI_STAT)` // Before sub-option status |
| 4 | SET | `isNewSbopkei = isBlank(chbf_sbopsvkei_no) && !isBlank(chaf_sbopsvkei_no)` // Sub-option newly registered |
| 5 | SET | `isDslSbopkei = (030/100 before AND 910 after) || (020 before AND 920 after)` // Sub-option cancelled |
| 6 | SET | `isSbopkeiStatNotChg = (100/030/020 before AND same after)` // Sub-option status unchanged |
| 7 | IF | `isNewSbopkei && SBOP_SVC_CD_VIRUS.equals(chafsbopSvcCd)` // New antivirus |
| 7.1 | SET | `selectOdrNaiyoCd = ODR_NAIYO_CD_114` |
| 7.2 | CALL | `addSOD(handle, param, ODR_NAIYO_CD_114)` // Mail/Security Check registration |
| 8 | ELSE-IF | `SBOP_SVC_CD_VIRUS.equals(chafsbopSvcCd) && isDslSbopkei` // Cancelled antivirus |
| 8.1 | SET | `this.sbop_svckeino_mlvirus = chbf_sbopsvkei_no` // Save sub-option number |
| 8.2 | SET | `this.sbop_gadtm_mlvirus = chbf_sbopsvkei_gene_add_dtm` // Save timestamp |
| 8.3 | SET | `selectOdrNaiyoCd = ODR_NAIYO_CD_115` |
| 8.4 | CALL | `addSOD(handle, param, ODR_NAIYO_CD_115)` // Mail/Security Check unregistration |
| 9 | ELSE-IF | `SBOP_SVC_CD_MLCAPA.equals(chafsbopSvcCd) && (isNewSbopkei || isDslSbopkei)` // Mail backup capacity change |
| 9.1 | SET | `selectOdrNaiyoCd = ODR_NAIYO_CD_113` |
| 9.2 | CALL | `addSOD(handle, param, ODR_NAIYO_CD_113)` // Mail/Email backup capacity change |
| 10 | ELSE-IF | `isSbopkeiStatNotChg && SBOP_SVC_CD_MLCAPA.equals(chafsbopSvcCd)` // Capacity comparison |
| 10.1 | EXTRACT | `chbfCapa = chbfEKK0411A010SCHash.get(ADD_CAPA)` // Before capacity |
| 10.2 | EXTRACT | `chafCapa = chafEKK0411A010SCHash.get(ADD_CAPA)` // After capacity |
| 10.3 | IF | `!chbfCapa.equals(chafCapa)` // Capacity differs |
| 10.3.1 | SET | `selectOdrNaiyoCd = ODR_NAIYO_CD_113` |
| 10.3.2 | CALL | `addSOD(handle, param, ODR_NAIYO_CD_113)` // Mail/Email backup capacity change |
| 11 | ELSE-IF | `isNewSbopkei && SBOP_SVC_CD_ALIAS.equals(chafsbopSvcCd)` // New mail alias |
| 11.1 | SET | `this.sbop_svckeino_alias = chaf_sbopsvkei_no` |
| 11.2 | SET | `this.sbop_gadtm_alias = chaf_sbopsvkei_gene_add_dtm` |
| 11.3 | SET | `selectOdrNaiyoCd = ODR_NAIYO_CD_110` |
| 11.4 | CALL | `addSOD(handle, param, ODR_NAIYO_CD_110)` // Mail alias registration |
| 12 | ELSE-IF | `isDslSbopkei && SBOP_SVC_CD_ALIAS.equals(chafsbopSvcCd)` // Cancelled mail alias |
| 12.1 | SET | `this.sbop_svckeino_alias = chbf_sbopsvkei_no` |
| 12.2 | SET | `this.sbop_gadtm_alias = chbf_sbopsvkei_gene_add_dtm` |
| 12.3 | SET | `selectOdrNaiyoCd = ODR_NAIYO_CD_112` |
| 12.4 | CALL | `addSOD(handle, param, ODR_NAIYO_CD_112)` // Mail alias unregistration |
| 13 | ELSE-IF | `isSbopkeiStatNotChg && SBOP_SVC_CD_ALIAS.equals(chafsbopSvcCd)` // Alias comparison |
| 13.1 | EXTRACT | `chbfAlias = chbfEKK0411A010SCHash.get(ALIAS)` // Before alias |
| 13.2 | EXTRACT | `chafAlias = chafEKK0411A010SCHash.get(ALIAS)` // After alias |
| 13.3 | IF | `!chbfAlias.equals(chafAlias)` // Alias differs |
| 13.3.1 | SET | `this.sbop_svckeino_alias = chaf_sbopsvkei_no` |
| 13.3.2 | SET | `this.sbop_gadtm_alias = chaf_sbopsvkei_gene_add_dtm` |
| 13.3.3 | SET | `selectOdrNaiyoCd = ODR_NAIYO_CD_111` |
| 13.3.4 | CALL | `addSOD(handle, param, ODR_NAIYO_CD_111)` // Mail alias change |
