## 6. Per-Branch Detail Blocks

### Phase 1: Initialization

**Block 0** -- [SET] Field Extraction (L11478)

| # | Type | Code |
|---|------|------|
| 1 | SET | statusCode = 0 // service interface execution status |
| 2 | SET | sod_kihon_info_Map = (HashMap)sodMap.get(SOD_KIHON_INFO) // SOD basic info |
| 3 | SET | svc_kei_info_Map = (HashMap)sodMap.get(SVC_KEI_INFO) // service contract info |
| 4 | SET | svc_kei_ucwk_info_Map = (HashMap)sodMap.get(SVC_KEI_UCWK_INFO) // service contract detail info |
| 5 | SET | opsvkei_info_Map = (HashMap)sodMap.get(OPSVKEI_INFO) // option service contract info |
| 6 | SET | kktsvkei_info_Map = (HashMap)sodMap.get(KKTSVKEI_INFO) // equipment provision service contract info |

**Block 0.1** -- [EXEC] Map Cleaning (L11486)

| # | Type | Code |
|---|------|------|
| 1 | EXEC | sod_kihon_info_Map = shkkaMap(sod_kihon_info_Map) // null-to-blank for each map value |
| 2 | EXEC | svc_kei_info_Map = shkkaMap(svc_kei_info_Map) |
| 3 | EXEC | svc_kei_ucwk_info_Map = shkkaMap(svc_kei_ucwk_info_Map) |
| 4 | EXEC | opsvkei_info_Map = shkkaMap(opsvkei_info_Map) |
| 5 | EXEC | kktsvkei_info_Map = shkkaMap(kktsvkei_info_Map) |

**Block 0.2** -- [SET] Before/After Hash Variables (L11491)

| # | Type | Code |
|---|------|------|
| 1 | SET | chbfEKK0351A010SCHash = null // before-option service contract agreement hash |
| 2 | SET | chafEKK0351A010SCHash = null // after-option service contract agreement hash |
| 3 | SET | chbfEKK0361A010SCHash = null // before-option service contract (ISP) hash |
| 4 | SET | chafEKK0361A010SCHash = null // after-option service contract (ISP) hash |
| 5 | SET | chbfEKK0401A010SCHash = null // before sub-option service contract hash |
| 6 | SET | chafEKK0401A010SCHash = null // after sub-option service contract hash |
| 7 | SET | chbfEKK0411A010SCHash = null // before sub-option service contract (ISP) hash |
| 8 | SET | chafEKK0411A010SCHash = null // after sub-option service contract (ISP) hash |

**Block 0.3** -- [SET] Field Extraction from Sub-Maps (L11514)

| # | Type | Code |
|---|------|------|
| 1 | SET | ido_div = (String)sod_kihon_info_Map.get(INFO_IDO_DIV) // displacement classification |
| 2 | SET | svc_kei_no = (String)svc_kei_info_Map.get(INFO_SVC_KEI_NO) // service contract number |
| 3 | SET | chbf_opsvkei_no = (String)opsvkei_info_Map.get(INFO_CHBF_OPSVKEI_NO) // before-option contract number |
| 4 | SET | chbf_opsvkei_gene_add_dtm = (String)opsvkei_info_Map.get(INFO_CHBF_OPSVKEI_GENE_ADD_DTM) // before-option generation datetime |
| 5 | SET | chaf_opsvkei_no = (String)opsvkei_info_Map.get(INFO_CHAF_OPSVKEI_NO) // after-option contract number |
| 6 | SET | chaf_opsvkei_gene_add_dtm = (String)opsvkei_info_Map.get(INFO_CHAF_OPSVKEI_GENE_ADD_DTM) // after-option generation datetime |
| 7 | SET | chbf_sbopsvkei_no = (String)opsvkei_info_Map.get(INFO_CHBF_SBOPSVKEI_NO) // before-sub-option contract number |
| 8 | SET | chaf_sbopsvkei_no = (String)opsvkei_info_Map.get(INFO_CHAF_SBOPSVKEI_NO) // after-sub-option contract number |
| 9 | SET | svc_kei_ucwk_no = (String)svc_kei_ucwk_info_Map.get(INFO_SVC_KEI_UCWK_NO) // after-service contract detail number |
| 10 | SET | chaf_svc_kei_ucwk_gene_add_dtm = (String)svc_kei_ucwk_info_Map.get(INFO_CHAF_SVC_KEI_UCWK_GENE_ADD_DTM) // after-detail generation datetime |
| 11 | SET | chaf_kktk_svc_kei_no = (String)kktsvkei_info_Map.get(INFO_CHAF_KKTSVKEI_NO) // after-equipment provision contract number |
| 12 | SET | chaf_kktk_svc_kei_gene_add_dtm = (String)kktsvkei_info_Map.get(INFO_CHAF_KKTSVKEI_GENE_ADD_DTM) // after-equipment provision generation datetime |

**Block 0.4** -- [EXEC] String Cleaning (L11542)

| # | Type | Code |
|---|------|------|
| 1 | EXEC | chaf_opsvkei_no = shkkaChr(chaf_opsvkei_no) // null-to-blank |
| 2 | EXEC | chaf_opsvkei_gene_add_dtm = shkkaChr(chaf_opsvkei_gene_add_dtm) |
| 3 | EXEC | chbf_opsvkei_no = shkkaChr(chbf_opsvkei_no) |
| 4 | EXEC | chbf_opsvkei_gene_add_dtm = shkkaChr(chbf_opsvkei_gene_add_dtm) |

**Block 0.5** -- [SET] IPv6 Instance Fields (L11549)

| # | Type | Code |
|---|------|------|
| 1 | SET | this.ipv6_svc_kei_ucwk_no = shkkaChr(svc_kei_ucwk_no) // for IPv6 SOD work output [ANK-0046-00-01] |
| 2 | SET | this.ipv6_svc_kei_ucwk_gadtm = shkkaChr(chaf_svc_kei_ucwk_gene_add_dtm) |

---

### Phase 2: Fetch Before-Option Data

**Block 1** -- [IF] Has before-option option? `!isBlank(chbf_opsvkei_no) && !isBlank(chbf_opsvkei_gene_add_dtm)` (L11554)

> If the before-option service contract number and generation datetime are both present, fetch the before-state from SC.

| # | Type | Code |
|---|------|------|
| 1 | SET | chbfInHash = new HashMap() // before-state input |
| 2 | SET | chbfResultHash = new HashMap() // before-state result |
| 3 | EXEC | chbfInHash.put(OP_SVC_KEI_NO, chbf_opsvkei_no) |
| 4 | EXEC | chbfInHash.put(GENE_ADD_DTM, chbf_opsvkei_gene_add_dtm) |
| 5 | CALL | statusCode = callEKK0351A010SC(param, handle, chbfInHash, chbfResultHash, FUNC_CODE_1) // option service contract agreement |
| 6 | SET | if (0 != statusCode) throw new CCException(new SCCallException(statusCode)) // error on non-zero status |
| 7 | SET | chbfEKK0351A010SCHash = (HashMap)chbfResultHash.get(TEMPLATE_ID_EKK0351A010) |
| 8 | SET | opSvcCd = (String)chbfEKK0351A010SCHash.get(OP_SVC_CD) |
| 9 | SET | opSvcKind = jdgOpSvcKind(opSvcCd) // judge service kind |
| 10 | IF | if (null == opSvcKind) // not an SOD emission target |
| 11 | RETURN | return param // not SOD target, exit early |

**Block 1.1** -- [IF] Before-op kind == NET? `SVC_KIND_NET.equals(opSvcKind[0])` (L11570)

| # | Type | Code |
|---|------|------|
| 1 | SET | chbfInHashNet = new HashMap() |
| 2 | EXEC | chbfInHashNet.put(OP_SVC_KEI_NO, chbf_opsvkei_no) |
| 3 | EXEC | chbfInHashNet.put(GENE_ADD_DTM, chbf_opsvkei_gene_add_dtm) |
| 4 | CALL | callEKK0361A010SC(param, handle, chbfInHashNet, chbfResultHashNet, FUNC_CODE_1) // option ISP agreement |
| 5 | SET | chbfEKK0361A010SCHash = (HashMap)chbfResultHashNet.get(TEMPLATE_ID_EKK0361A010) |

**Block 1.2** -- [ELSE-IF] Before-op kind == TEL? `SVC_KIND_TEL.equals(opSvcKind[0])` (L11583)

> Commented out -- option service contract Phone agreement. No active processing.

**Block 1.3** -- [IF] Before-op needs sub-option? `"1".equals(opSvcKind[1]) && !isBlank(chbf_sbopsvkei_no)` (L11611)

> If sub-option flag is ON and sub-option number exists, fetch sub-option data.

**Block 1.3.1** -- [IF] Before-op kind == NET? (L11620)

| # | Type | Code |
|---|------|------|
| 1 | SET | chbfInHashSbopIsp = new HashMap() |
| 2 | EXEC | chbfInHashSbopIsp.put(OP_SVC_KEI_NO, chbf_opsvkei_no) |
| 3 | EXEC | chbfInHashSbopIsp.put(SBOP_SVC_KEI_NO, chbf_sbopsvkei_no) |
| 4 | EXEC | chbfInHashSbopIsp.put(GENE_ADD_DTM, chbf_sbopsvkei_gene_add_dtm) |
| 5 | CALL | callEKK0411A010SC(param, handle, chbfInHashSbopIsp, chbfResultHashSbopIsp, FUNC_CODE_1) // sub-option ISP |
| 6 | SET | chbfEKK0411A010SCHash = (HashMap)chbfResultHashSbopIsp.get(TEMPLATE_ID_EKK0411A010) |

**Block 1.3.2** -- [EXEC] Before-op sub-option common (L11637)

| # | Type | Code |
|---|------|------|
| 1 | SET | chbfInHashSbop = new HashMap() |
| 2 | EXEC | chbfInHashSbop.put(OP_SVC_KEI_NO, chbf_opsvkei_no) |
| 3 | EXEC | chbfInHashSbop.put(SBOP_SVC_KEI_NO, chbf_sbopsvkei_no) |
| 4 | EXEC | chbfInHashSbop.put(GENE_ADD_DTM, chbf_sbopsvkei_gene_add_dtm) |
| 5 | CALL | callEKK0401A010SC(param, handle, chbfInHashSbop, chbfResultHashSbop, FUNC_CODE_1) // sub-option agreement |
| 6 | SET | chbfEKK0401A010SCHash = (HashMap)chbfResultHashSbop.get(TEMPLATE_ID_EKK0401A010) |

---

### Phase 3: Fetch After-Option Data

**Block 2** -- [SET] After-Option Input (L11670)

| # | Type | Code |
|---|------|------|
| 1 | SET | chafInHash = new HashMap() |
| 2 | SET | chafResultHash = new HashMap() |
| 3 | EXEC | chafInHash.put(OP_SVC_KEI_NO, chaf_opsvkei_no) |
| 4 | EXEC | chafInHash.put(GENE_ADD_DTM, chaf_opsvkei_gene_add_dtm) |

**Block 2.1** -- [SET] Function Code Selection (L11680)

> FUNC_CODE_1 (normal) if geneAddDtm length is 17; else FUNC_CODE_2 (search) for multi-selection. [ST1-2012-0000810]

| # | Type | Code |
|---|------|------|
| 1 | SET | funcCode = (chaf_opsvkei_gene_add_dtm != null && 17 == length) ? FUNC_CODE_1 : FUNC_CODE_2 |

**Block 2.2** -- [EXEC] After-Option Agreement (L11685)

| # | Type | Code |
|---|------|------|
| 1 | CALL | statusCode = callEKK0351A010SC(param, handle, chafInHash, chafResultHash, funcCode) |
| 2 | SET | if (0 != statusCode) throw new CCException(statusCode) |
| 3 | SET | chafEKK0351A010SCHash = (HashMap)chafResultHash.get(TEMPLATE_ID_EKK0351A010) |
| 4 | SET | opSvcCd = (String)chafEKK0351A010SCHash.get(OP_SVC_CD) |
| 5 | IF | if (chaf_opsvkei_gene_add_dtm == null || 17 > length) // geneAddDtm not set for multi-selection |
| 6 | SET | chaf_opsvkei_gene_add_dtm = chafEKK0351A010SCHash.get(GENE_ADD_DTM) // set from SC result |

**Block 2.3** -- [SET] After-State Kind Judgment (L11694)

| # | Type | Code |
|---|------|------|
| 1 | SET | opSvcKind = jdgOpSvcKind(opSvcCd) |
| 2 | IF | if (null == opSvcKind) return param // not SOD target |

**Block 2.4** -- [IF] After-op kind == NET? (L11700)

| # | Type | Code |
|---|------|------|
| 1 | SET | chafInHashNet = new HashMap() |
| 2 | EXEC | chafInHashNet.put(OP_SVC_KEI_NO, chaf_opsvkei_no) |
| 3 | EXEC | chafInHashNet.put(GENE_ADD_DTM, chaf_opsvkei_gene_add_dtm) |
| 4 | SET | funcCode = (chaf_opsvkei_gene_add_dtm != null && 17 == length) ? FUNC_CODE_1 : FUNC_CODE_2 |
| 5 | CALL | callEKK0361A010SC(param, handle, chafInHashNet, chafResultHashNet, funcCode) // ISP after |
| 6 | SET | chafEKK0361A010SCHash = (HashMap)chafResultHashNet.get(TEMPLATE_ID_EKK0361A010) |

**Block 2.5** -- [IF] After-op needs sub-option? (L11728)

| # | Type | Code |
|---|------|------|
| 1 | IF | "1" equals opSvcKind[1] && sbopkei_no NOT blank |
| 2 | IF | kind == NET -> callEKK0411A010SC |
| 3 | [EXEC] common sub-option -> callEKK0401A010SC |
