
## 6. Per-Branch Detail Blocks

### Block 1 - [IF] svc_kind branch: NET/ADSL (svc_kind == "1" || svc_kind == "5") (L8974)

> Branch for eo Light Network (FTTH/Broadband) and eoADSL cancellation processing.

| # | Type | Code |
|---|------|------|
| 1 | SET | `getSameTrnNoFlg = false` // Same processing number search flag (同一処理番号採番フラグ) |
| 2 | SET | `eKK0351A010SCHashList = new ArrayList()` // Option service contract list |
| 3 | SET | `eKK0341B022SCHash = null` // Equipment-provided service contract list result (機器提供サービス契約一覧照会結果) |
| 4 | SET | `inHashMltise = new HashMap()` // Input hash for multi-service query |
| 5 | SET | `resultHashMltise = new HashMap()` // Result hash for multi-service query |
| 6 | SET | `inHashMltise.put(SVC_KEI_NO, svc_kei_no)` // Service contract number (サービス契約番号) |
| 7 | CALL | `callEKK0351B002SC(param, handle, inHashMltise, resultHashMltise, FUNC_CODE_1)` // Option service contract list inquiry (オプションサービス契約一覧照会 - サービス契約番号) |
| 8 | IF | `0 != statusCode` -> throw CCException with SCCallException |
| 9 | SET | `msgEKK0351B002SCList = resultHashMltise.get(TEMPLATE_ID_EKK0351B002)` // Option SVC contract list array |
| 10 | FOR | `i = 0` to `msgEKK0351B002SCList.length` // Iterate option service contracts |

#### Block 1.1 - [IF] Option service code match: Email/HP/MList/IPv6/Dup/Multi/FmtCel (L8997)

> Check if the option service code is one of the cancelable services.

| # | Type | Code |
|---|------|------|
| 1 | SET | `eKK0351B002SCHash = msgEKK0351B002SCList[i].getMsgData()` |
| 2 | SET | `op_svc_cd = eKK0351B002SCHash.get(OP_SVC_CD).toString()` // Option service code (オプションサービスコード) |
| 3 | IF | `op_svc_cd == 011 (EMAIL) OR 012 (HP) OR 032 (MLIST) OR 035 (IPv6) OR 033 (DUP) OR 031 (MLTISE) OR 034 (FMTCEL)` |

##### Block 1.1.1 - [IF] Call EKK0351A010SC for agreement details (L9010)

> Get detailed agreement info for the matching option service.

| # | Type | Code |
|---|------|------|
| 1 | SET | `inHashSvcKei = new HashMap()` |
| 2 | SET | `resultHashSvcKei = new HashMap()` |
| 3 | SET | `inHashSvcKei.put(OP_SVC_KEI_NO, eKK0351B002SCHash.get(OP_SVC_KEI_NO))` // Option service contract number (オプションサービス契約番号) |
| 4 | SET | `inHashSvcKei.put(GENE_ADD_DTM, eKK0351B002SCHash.get(GENE_ADD_DTM))` // Generation registration datetime |
| 5 | CALL | `callEKK0351A010SC(param, handle, inHashSvcKei, resultHashSvcKei, FUNC_CODE_1)` // Option SVC agreement inquiry |
| 6 | IF | `0 != statusCode` -> throw CCException |
| 7 | SET | `eKK0351A010SCHash = resultHashSvcKei.get(TEMPLATE_ID_EKK0351A010)` |
| 8 | SET | `op_mskm_dtl_no = eKK0351A010SCHash.get(MSKM_DTL_NO).toString()` // Submission detail number (申込明細番号) |
| 9 | SET | `op_svc_dlre_cd = eKK0351A010SCHash.get(SVC_DLRE_CD).toString()` // Service cancellation reason code (サービス解約理由コード) |
| 10 | SET | `op_mskm_dtl_no = shkkaChr(op_mskm_dtl_no)` // Null to empty string initialization |

###### Block 1.1.1.1 - [IF] Movement division matches cancellation target (L9036)

> Check if this option matches the cancellation order based on movement division.

| # | Type | Code |
|---|------|------|
| 1 | IF | `(IDO_DIV_DSL == ido_div OR IDO_DIV_TEKKYODSL == ido_div) AND op_mskm_dtl_no == this.mskm_dtl_no` [IDO_DIV_DSL="00005", IDO_DIV_TEKKYODSL="00006"] |
| 2 | OR | `IDO_DIV_KYOSEIDSL == ido_div AND SVC_DLRE_CD_KYOSEIDSL == op_svc_dlre_cd AND op_mskm_dtl_no == this.mskm_dtl_no` [IDO_DIV_KYOSEIDSL="00064"] |
| 3 | OR | `IDO_DIV_CANCEL == ido_div AND op_mskm_dtl_no == this.mskm_dtl_no` [IDO_DIV_CANCEL="00008"] |

####### Block 1.1.1.1.1 - [IF] Multi-Selection with fixed Global IP check (L9060)

> For Multi-Selection option, check if a fixed Global IP address exists that needs cancellation.

| # | Type | Code |
|---|------|------|
| 1 | IF | `op_svc_cd == 031 (MLTISE)` |
| 2 | FOR | `j = 0` to `msgEKK0351B002SCList.length` // Iterate all option contracts |
| 3 | SET | `op_svc_cd_fix = eKK0351B002SCHashFix.get(OP_SVC_CD).toString()` |
| 4 | SET | `op_svc_kei_stat_fix = eKK0351B002SCHashFix.get(OP_SVC_KEI_STAT).toString()` // Option service contract status (オプションサービス契約状態) |
| 5 | SET | `op_mskm_dtl_no_fix = eKK0351B002SCHashFix.get(MSKM_DTL_NO).toString()` // Fixed Global IP submission detail number |
| 6 | IF | `op_svc_cd_fix == 026 (FIXIPAD) AND (op_svc_kei_stat_fix == 910 OR op_svc_kei_stat_fix == 920) AND op_mskm_dtl_no_fix == this.mskm_dtl_no` [OP_SVC_CD_FIXIPAD="026", SVC_KEI_STAT_910="910", SVC_KEI_STAT_920="920"] |
| 7 | SET | `eKK0351A010SCHashList.add(eKK0351A010SCHash)` |
| 8 | SET | `getSameTrnNoFlg = true` // Same processing number found |
| 9 | RETURN | `break` |

####### Block 1.1.1.1.2 - [IF/ELSE] MyHomePage special handling (L9084)

> For MyHomePage option, query ISP agreement before adding to list.

| # | Type | Code |
|---|------|------|
| 1 | ELSE-IF | `op_svc_cd == 012 (HP)` |
| 2 | SET | `inHashOpSvcKeiIsp = new HashMap()` |
| 3 | SET | `resultHashOpSvcKeiIsp = new HashMap()` |
| 4 | SET | `inHashOpSvcKeiIsp.put(OP_SVC_KEI_NO, ...)` // Option service contract number |
| 5 | SET | `inHashOpSvcKeiIsp.put(GENE_ADD_DTM, ...)` // Generation registration datetime |
| 6 | CALL | `callEKK0361A010SC(param, handle, inHashOpSvcKeiIsp, resultHashOpSvcKeiIsp, FUNC_CODE_1)` // Option SVC <ISP> agreement inquiry |
| 7 | SET | `urlDomain = eKK0361A010SCHash.get(URL_DOMAIN)` |
| 8 | SET | `urlAccount = eKK0361A010SCHash.get(URL_ACCOUNT)` |
| 9 | IF | `!isBlank(urlDomain) AND !isBlank(urlAccount)` |
| 10 | SET | `eKK0351A010SCHashList.add(eKK0351A010SCHash)` |
| 11 | SET | `getSameTrnNoFlg = true` |
| 12 | ELSE | `eKK0351A010SCHashList.add(eKK0351A010SCHash); getSameTrnNoFlg = true` |

####### Block 1.1.1.1.3 - [ELSE] Default: Add to list directly (L9105)

> For other option types (Email, MList, IPv6, Dup, FmtCel), add to list directly.

| # | Type | Code |
|---|------|------|
| 1 | ELSE | `eKK0351A010SCHashList.add(eKK0351A010SCHash)` |
| 2 | SET | `getSameTrnNoFlg = true` |

###### Block 1.2 - [IF] Equipment-provided service: BBR check (L9122)

> Query equipment-provided service contract list and check for BBR service.

| # | Type | Code |
|---|------|------|
| 1 | SET | `inHashKktk = new HashMap()` // Equipment SVC input hash |
| 2 | SET | `resultHashKktk = new HashMap()` // Equipment SVC result hash |
| 3 | SET | `inHashKktk.put(SVC_KEI_NO, svc_kei_no)` // Service contract number |
| 4 | CALL | `callEKK0341B008SC(param, handle, inHashKktk, resultHashKktk, FUNC_CODE_1)` // Equipment-provided SVC list inquiry (機器提供サービス契約一覧照会) |
| 5 | IF | `0 != statusCode` -> throw CCException |
| 6 | SET | `msgEKK0341B008SCList = resultHashKktk.get(TEMPLATE_ID_EKK0341B022)` |
| 7 | FOR | `i = 0` to `msgEKK0341B008SCList.length` // Iterate equipment contracts |

####### Block 1.2.1 - [IF] BBR service code match (L9133)

> Check if the equipment-provided service is BBR.

| # | Type | Code |
|---|------|------|
| 1 | IF | `tmp_kktk_svc_cd == KKTK_SVC_CD_BBR` [KKTK_SVC_CD_BBR="C014"] |
| 2 | SET | `kk_mskm_dtl_no = eKK0341B008SCHash.get(MSKM_DTL_NO).toString()` // Submission detail number |
| 3 | SET | `kk_kiki_seizo_no = eKK0341B008SCHash.get(KIKI_SEIZO_NO).toString()` // Equipment manufacturing number |
| 4 | SET | `kk_svc_dlre_cd = eKK0341B008SCHash.get(SVC_DLRE_CD).toString()` // Service cancellation reason code |
| 5 | IF | `isBlank(kk_kiki_seizo_no)` -> `continue` |
| 6 | SET | `kk_mskm_dtl_no = shkkaChr(kk_mskm_dtl_no)` |
| 7 | IF | `(IDO_DIV_DSL == ido_div OR IDO_DIV_TEKKYODSL == ido_div) AND kk_mskm_dtl_no == this.mskm_dtl_no` |
| 8 | OR | `IDO_DIV_KYOSEIDSL == ido_div AND SVC_DLRE_CD_KYOSEIDSL == kk_svc_dlre_cd AND kk_mskm_dtl_no == this.mskm_dtl_no` |
| 9 | OR | `IDO_DIV_CANCEL == ido_div AND kk_mskm_dtl_no == this.mskm_dtl_no` |
| 10 | SET | `eKK0341B022SCHash = eKK0341B008SCHash` |
| 11 | SET | `getSameTrnNoFlg = true` |
| 12 | RETURN | `break` |

###### Block 1.3 - [IF] Multi-function router check (L9181)

> Check Takino (multi-function router) status.

| # | Type | Code |
|---|------|------|
| 1 | SET | `takino_flg = checkTakinoRT(handle, param)` |
| 2 | IF | `takino_flg != 0 && takino_flg != 9` |
| 3 | SET | `getSameTrnNoFlg = true` |

###### Block 1.4 - [IF] Inspection cancellation check (L9194)

> Check if this is a cancellation (inspection withdrawal) - SOD may need to be issued.

| # | Type | Code |
|---|------|------|
| 1 | IF | `IDO_DIV_CANCEL == this.ido_div` [IDO_DIV_CANCEL="00008"] |
| 2 | SET | `inEKK0161A010Hash = new HashMap()` |
| 3 | SET | `inEKK0161A010Hash.put(SVC_KEI_UCWK_NO, svc_kei_ucwk_no)` // Service contract detail number |
| 4 | SET | `inEKK0161A010Hash.put(GENE_ADD_DTM, chaf_svc_kei_ucwk_gene_add_dtm)` // Changed-after generation datetime |
| 5 | CALL | `callEKK0161A010SC(param, handle, inEKK0161A010Hash, retEKK0161A010Hash, FUNC_CODE_1)` // Service contract detail agreement |
| 6 | SET | `svcKeiUcwkStat = eKK0161A010Hash.get(SVC_KEI_UCWK_STAT).toString()` |
| 7 | SET | `isShosaCl = SVC_KEI_STAT_010.equals(svcKeiUcwkStat)` [SVC_KEI_STAT_010="010"] |
| 8 | IF | `isShosaCl` -> `getSameTrnNoFlg = true` |

###### Block 1.5 - [IF] Unified transaction number management (L9231)

> Get or clear the unified transaction number for grouping related cancellations.

| # | Type | Code |
|---|------|------|
| 1 | IF | `getSameTrnNoFlg` |
| 2 | SET | `sameTrnNo = new String[1]` |
| 3 | CALL | `getSame_trn_no(param, handle, null, sameTrnNo)` // Get unified transaction number (同一処理番号の取得) |
| 4 | SET | `this.same_trn_no = sameTrnNo[0]` |
| 5 | ELSE | `this.same_trn_no = ""` |

###### Block 1.6 - [IF] FTTH ID cancellation (L9241)

> If not ADSL or is Furetsu, and not mansion private, issue FTTH authentication cancellation SOD.

| # | Type | Code |
|---|------|------|
| 1 | IF | `!SVC_KIND_ADSL.equals(svc_kind) OR PCRS_CD_ADSL_FURETTSU.equals(pcrs_cd)` |
| 2 | IF | `!isMansionPrvate()` |
| 3 | SET | `this.svc_kei_ucwk_no = new String[1]` |
| 4 | SET | `this.svc_kei_ucwk_no[0] = svc_kei_ucwk_no` |
| 5 | SET | `this.svc_kei_ucwk_gadtm = new String[1]` |
| 6 | SET | `this.svc_kei_ucwk_gadtm[0] = chaf_svc_kei_ucwk_gene_add_dtm` |
| 7 | CALL | `param = addSOD(handle, param, ODR_NAIYO_CD_103)` // FTTH Authentication Cancellation (FTTH認証・解約) |
| 8 | IF | `isShosaCl` |
| 9 | CALL | `param = addSOD(handle, param, ODR_NAIYO_CD_104)` // FTTH Authentication Deletion (FTTH認証・消去) |

###### Block 1.7 - [FOR] Iterate option service cancellation list (L9267)

> Process each option service contract in the list for cancellation SOD generation.

| # | Type | Code |
|---|------|------|
| 1 | FOR | `i = 0` to `eKK0351A010SCHashList.size()` |
| 2 | SET | `op_svc_cd = eKK0351A010SCHash.get(OP_SVC_CD).toString()` |
| 3 | SET | `op_svc_kei_no = eKK0351A010SCHash.get(OP_SVC_KEI_NO).toString()` |
| 4 | SET | `op_gene_add_dtm = eKK0351A010SCHash.get(GENE_ADD_DTM).toString()` |
| 5 | IF | `op_svc_cd == 031 (MLTISE)` |
| 6 | SET | `oyaSvcKeiUcwkNo = eKK0351A010SCHash.get(SVC_KEI_UCWK_NO).toString()` |
| 7 | IF | `svc_kei_ucwk_no.equals(oyaSvcKeiUcwkNo)` |
| 8 | SET | `this.op_svc_kei_no_mltise = op_svc_kei_no` |
| 9 | SET | `this.op_gadtm_mltise = op_gene_add_dtm` |
| 10 | CALL | `param = addSOD(handle, param, ODR_NAIYO_CD_145)` // Multi-Selection (static) Cancellation (マルチセクション(静的)・解約) |
| 11 | ELSE | (L9294) // Non-Multi-Selection handling |

####### Block 1.7.1 - [IF] Course-change duplicate prevention (L9297)

> Prevent duplicate SOD generation during course changes.

| # | Type | Code |
|---|------|------|
| 1 | SET | `oyaSvcKeiUcwkNo = eKK0351A010SCHash.get(SVC_KEI_UCWK_NO).toString()` |
| 2 | IF | `(!isNewCourseFlag && targetSvcKeiUcwkCnt < 2) || (isNewCourseFlag && svc_kei_ucwk_no.equals(oyaSvcKeiUcwkNo)) || (isAdChgAddFlag && svc_kei_ucwk_no.equals(oyaSvcKeiUcwkNo))` |
| 3 | SET | `opSodMap = new HashMap()` // SOD map |
| 4 | SET | `opSodKihonInfoMap = new HashMap()` // SOD basic info |
| 5 | SET | `opSvcKeiInfoMap = new HashMap()` // Service contract info |
| 6 | SET | `opSvcKeiUcwkInfoMap = new HashMap()` // Service contract detail info |
| 7 | SET | `opOpSvkeiInfoMap = new HashMap()` // Option service contract info |
| 8 | SET | `opSodKihonInfoMap.put(INFO_SYSID, sys_id)` |
| 9 | SET | `opSodKihonInfoMap.put(INFO_IDO_DIV, ido_div)` |
| 10 | SET | `opSvcKeiInfoMap.put(INFO_SVC_KEI_NO, svc_kei_no)` |
| 11 | SET | `opSvcKeiUcwkInfoMap.put(INFO_SVC_KEI_UCWK_NO, svc_kei_ucwk_no)` |
| 12 | SET | `opSvcKeiUcwkInfoMap.put(INFO_CHAF_SVC_KEI_UCWK_GENE_ADD_DTM, chaf_svc_kei_ucwk_gene_add_dtm)` |
| 13 | SET | `opOpSvkeiInfoMap.put(INFO_CHBF_OPSVKEI_NO, op_svc_kei_no)` |
| 14 | SET | `opOpSvkeiInfoMap.put(INFO_CHBF_OPSVKEI_GENE_ADD_DTM, op_gene_add_dtm)` |
| 15 | SET | `opOpSvkeiInfoMap.put(INFO_CHAF_OPSVKEI_NO, op_svc_kei_no)` |
| 16 | SET | `opOpSvkeiInfoMap.put(INFO_CHAF_OPSVKEI_GENE_ADD_DTM, op_gene_add_dtm)` |
| 17 | SET | `opSodMap.put(SOD_KIHON_INFO, opSodKihonInfoMap)` |
| 18 | SET | `opSodMap.put(SVC_KEI_INFO, opSvcKeiInfoMap)` |
| 19 | SET | `opSodMap.put(SVC_KEI_UCWK_INFO, opSvcKeiUcwkInfoMap)` |
| 20 | SET | `opSodMap.put(OPSVKEI_INFO, opOpSvkeiInfoMap)` |
| 21 | CALL | `opSetOdrCtrl(handle, param, fixedText, opSodMap)` // Option setup SOD control |

###### Block 1.8 - [IF] Router connection cancellation (L9322)

> Issue router connection cancellation/deletion SOD when equipment-provided service was found.

| # | Type | Code |
|---|------|------|
| 1 | IF | `eKK0341B022SCHash != null && !isNewCourseFlag && targetSvcKeiUcwkCnt < 2` |
| 2 | SET | `this.kktk_svc_kei_no = new String[1]` |
| 3 | SET | `kktk_svc_kei_no[0] = eKK0341B022SCHash.get(KKTK_SVC_KEI_NO).toString()` |
| 4 | SET | `this.kktk_svc_kei_gadtm = new String[1]` |
| 5 | SET | `kktk_svc_kei_gadtm[0] = eKK0341B022SCHash.get(GENE_ADD_DTM).toString()` |
| 6 | SET | `this.taknkiki_model_cd = new String[1]` |
| 7 | SET | `taknkiki_model_cd[0] = eKK0341B022SCHash.get(TAKNKIKI_MODEL_CD).toString()` |
| 8 | SET | `this.kiki_seizo_no = new String[1]` |
| 9 | SET | `kiki_seizo_no[0] = eKK0341B022SCHash.get(KIKI_SEIZO_NO).toString()` |
| 10 | CALL | `param = addSOD(handle, param, ODR_NAIYO_CD_149)` // Router connection settings (ルータ接続情報・設定) |
| 11 | CALL | `param = addSOD(handle, param, ODR_NAIYO_CD_150)` // Router connection deletion (ルータ接続情報・消去) |

###### Block 1.9 - [IF] Multi-function router: Router function active (L9342)

> If multi-function router flag is 4 (both router and VA active) and count < 2.

| # | Type | Code |
|---|------|------|
| 1 | IF | `takino_flg == 4 && targetSvcKeiUcwkCnt < 2` |
| 2 | CALL | `param = addTakinoSOD(handle, param, ODR_NAIYO_CD_405)` // Multi-function router setup (multi-function router) |

###### Block 1.10 - [IF/ELSE] Multi-function router: Router function cancellation (L9347)

> If multi-function router flag is 3 (simultaneous cancellation).

| # | Type | Code |
|---|------|------|
| 1 | ELSE-IF | `takino_flg == 3 && targetSvcKeiUcwkCnt < 2` |
| 2 | CALL | `param = addTakinoSOD(handle, param, ODR_NAIYO_CD_419)` // Multi-function router cancellation (router function) |
| 3 | CALL | `param = addTakinoSOD(handle, param, ODR_NAIYO_CD_420)` // Multi-function router deletion (router function) |

###### Block 1.11 - [END] NET/ADSL block complete

> Back up the previous record changed service contract number.

| # | Type | Code |
|---|------|------|
| 1 | SET | `if (!isBlank(this.same_trn_no)) { this.mae_recode_ch_svc_kei_no = new String(svc_kei_no) }` |

---
