# Business Logic - JKKHakkoSODCC.dslOdrCtrl() [1637 LOC]

| Field | Value |
|-------|-------|
| Fully Qualified Name | `com.fujitsu.futurity.bp.custom.common.JKKHakkoSODCC` |
| Layer | CC / Common Component (Business logic coordinator) |
| Module | `common` (Package: `com.fujitsu.futurity.bp.custom.common`) |

## 1. Role

### JKKHakkoSODCC.dslOdrCtrl()

This method is the **central cancellation order control** (解約オーダ制御処理) for the eo customer base system. It orchestrates the generation of all Service Order Data (SOD) required when a customer cancels their service contract. Based on the service type (Network/FTTH, Mobile, Telephone), it dispatches to specialized cancellation sub-flows that query related option services, equipment, and router information, then produce the appropriate cancellation, deletion, and transfer (tokii) SOD records.

The method handles **four major service categories**: (1) eo Light Network (FTTH/Broadband - svc_kind "1") and eoADSL (svc_kind "5"), (2) eo Mobile - including e-mobile, WiMAX, and SpotWiFi (svc_kind "4"), and (3) eo Light Telephone (svc_kind "2"), and (4) unknown service types which return immediately.

It implements a **routing/dispatch design pattern** via the `jdgSvcKind()` call, branching into service-type-specific cancellation flows. Within each branch, it repeatedly applies the **Option Setup SOD pattern** - building a mapped data structure (opSodMap) with SOD basic info, service contract info, service contract detail info, and option service contract info, then delegating to `opSetOdrCtrl()` to generate the option cancellation SOD.

The method also manages **unified transaction numbers** (same_trn_no) to ensure that related cancellations (e.g., FTTH ID cancellation + option service cancellation + equipment cancellation) are processed as a single atomic operation. It tracks course-change state (isNewCourseFlag, targetSvcKeiUcwkCnt, isAdChgAddFlag) to prevent duplicate SOD generation during service course changes or forced cancellations.

As a shared utility method, it is called by multiple callers within the same class (`cnclOdrCtrl`, `hakkoSOD`, `ksiDslFixOdrCtrl`, `ksiDslOdrCtrl`), making it a core business logic entry point for all cancellation-related order issuance in the eo customer base.

## 2. Processing Pattern (Detailed Business Logic)

```mermaid
flowchart TD
    START(["dslOdrCtrl()"])
    INIT["Extract SOD maps - kihon, svc_kei, svc_kei_ucwk"]
    PARAMS["Get sys_id, ido_div, svc_kei_no, svc_kei_ucwk_no"]
    SVCJUDGE["Call jdgSvcKind()"]
    SVCJUDGE --> D1{"svc_kind == 1 or 5<br/>NET/ADSL?"}
    D1 -->|Yes| NET
    D1 -->|No| D4{"svc_kind == 4<br/>Mobile?"}
    D4 -->|Yes| MOB
    D4 -->|No| D2{"svc_kind == 2<br/>Telephone?"}
    D2 -->|Yes| TEL
    D2 -->|No| RET["Return param"]
```

**NET/ADSL Branch** (svc_kind == "1" or "5")

NET --> N1["callEKK0351B002SC - Option SVC list query"]
N1 --> N2["Iterate options: Email(011), HP(012), MList(032), IPv6(035), Dup(033), Multi(031), FmtCel(034)"]
N2 --> N3{"Option matches Email/HP/MList/IPv6/Dup/Multi/FmtCel?"}
N3 -->|Yes| N4["callEKK0351A010SC - Option SVC agreement"]
N4 --> N5{"ido_div == 00005/00006 AND mskm_dtl_no matches?"}
N5 -->|Yes| N6{"op_svc_cd == 031<br/>Multi-Selection?"}
N6 -->|Yes| N7["Check fixed Global IP (026) existence"]
N7 --> N8["Add to eKK0351A010SCHashList"]
N6 -->|No| N9{"op_svc_cd == 012<br/>MyHomePage?"}
N9 -->|Yes| N10["callEKK0361A010SC - ISP inquiry"]
N10 --> N11{"URL domain + account set?"}
N11 -->|Yes| N8
N11 -->|No| N12["Add to list"]
N9 -->|No| N12
N5 -->|No| N13
N8 --> N13
N12 --> N13
N13["callEKK0341B008SC - Equipment SVC list"]
N13 --> N14{"BBR (C014)?"}
N14 -->|Yes| N15["Check equipment matches mskm_dtl_no"]
N15 --> N16["getSameTrnNoFlg = true, break"]
N14 -->|No| N17["checkTakinoRT"]
N16 --> N17
N17 --> N18{"takino_flg != 0 and != 9?"}
N18 -->|Yes| N18A["getSameTrnNoFlg = true"]
N18 -->|No| N19{"ido_div == 00008 (Cancel)?"}
N18A --> N19
N19 -->|Yes| N20["callEKK0161A010SC - Service contract detail"]
N20 --> N21{"svc_kei_ucwk_stat == 010?"}
N21 -->|Yes| N18A
N21 -->|No| N22["getSameTrnNoFlg?"]
N19 -->|No| N22
N22 -->|Yes| N23["getSame_trn_no()"]
N22 -->|No| N24["same_trn_no = empty"]
N23 --> N25{"Not ADSL OR Furetsu pcrs_cd?"}
N24 --> N25
N25 -->|Yes & not MansionPrivate| N26["addSOD(ODR_NAIYO_CD_103) - FTTH ID cancellation"]
N26 --> N27{"isShosaCl == true?"}
N27 -->|Yes| N28["addSOD(ODR_NAIYO_CD_104) - FTTH ID deletion"]
N27 -->|No| N29
N28 --> N29["Iterate eKK0351A010SCHashList"]
N25 -->|No| N30
N29 --> N31{"op_svc_cd == 031<br/>Multi-Selection?"}
N31 -->|Yes & same svc_kei_ucwk_no| N32["addSOD(ODR_NAIYO_CD_145) - Multi-Sel cancellation"]
N31 -->|No & targetSvcKeiUcwkCnt < 2| N33["opSetOdrCtrl()"]
N32 --> N34["eKK0341B022SCHash != null<br/>!isNewCourseFlag<br/>targetSvcKeiUcwkCnt < 2?"]
N33 --> N34
N34 -->|Yes| N35["addSOD(149) - Router connection<br/>addSOD(150) - Router deletion"]
N35 --> N36{"takino_flg == 4<br/>cnt < 2?"}
N36 -->|Yes| N37["addTakinoSOD(405) - Multi-router"]
N36 -->|No| N38{"takino_flg == 3<br/>cnt < 2?"}
N37 --> N38
N38 -->|Yes| N39["addTakinoSOD(419, 420) - Router cancel"]
N38 -->|No| N40["Set mae_recode_ch_svc_kei_no"]
N39 --> N40
N40 --> RET

MOB["Mobile Branch (svc_kind == 4)"]
MOB --> MOB1{"pcrs_cd == A30<br/>SpotWiFi?"}
MOB1 -->|Yes| MOB2["same_trn_no = empty"]
MOB1 -->|No| MOB3{"chgSvcKeiJdg(svc_kei_no)?"}
MOB2 --> MOB4["callEKK0351B002SC"]
MOB3 -->|Yes| MOB4
MOB3 -->|No| MOB4
MOB4 --> MOB5{"isEmobile()?"}
MOB5 -->|Yes & not Cancel/Kyousei| MOB6{"findMobileStartOrderAtKK1041?"}
MOB6 -->|Yes| MOB7["addSOD(313) - e-mobile cancel"]
MOB7 --> MOB8{"ido_div == 00007<br/>KyouseiFix?"}
MOB8 -->|Yes| MOB8A["return param"]
MOB8 -->|No| MOB9
MOB5 -->|No| MOB9
MOB9 --> MOB10{"ucwkPcrsCd == A46<br/>WiMAX?"}
MOB10 -->|Yes| MOB11["addSOD(309, 308) - WiMAX cancel"]
MOB10 -->|No| MOB12{"ucwkPcrsCd == A45<br/>FreeWiFi?"}
MOB11 --> MOB13
MOB12 -->|Yes| MOB14["judgeOdrHakkoJoken4WiFiSpot"]
MOB14 --> MOB15{"wifiSpotUm?"}
MOB15 -->|Yes| MOB16["addSOD(302) - WiFi Spot change"]
MOB15 -->|No| MOB17["addSOD(303) - WiFi Spot deletion"]
MOB16 --> MOB18
MOB17 --> MOB18{"pcrs_cd == A61<br/>MailAddress?"}
MOB18 -->|Yes| MOB19["callEKK0351B002SC + EKK0351A010SC"]
MOB18 -->|No| MOB8A
MOB19 --> MOB8A
MOB8A --> RET

TEL["Telephone Branch (svc_kind == 2)"]
TEL --> TEL1["Set svc_kei_ucwk_no arrays"]
TEL1 --> TEL2{"chgSvcKeiJdg(svc_kei_no)?"}
TEL2 -->|Yes| TEL3["getSame_trn_no"]
TEL2 -->|No| TEL4["callEKK0191A010SC - Tel SVC agreement"]
TEL3 --> TEL4
TEL4 --> TEL5["getEKK0251B001SC if Z1 ordered"]
TEL5 --> TEL6["checkTakinoRT"]
TEL6 --> TEL7{"takino_flg == 4?"}
TEL7 -->|Yes| TEL8["addTakinoSOD(417) - Multi-router active"]
TEL7 -->|No| TEL9{"takino_flg == 3?"}
TEL9 -->|Yes| TEL10["addTakinoSOD(421, 422) - Multi-router cancel"]
TEL9 -->|No| TEL11{"takino_flg == 0?"}
TEL11 -->|Yes| TEL12["addSOD(215, 216) - OLS setup/cancel"]
TEL11 -->|No| TEL13
TEL12 --> TEL13
TEL13 --> TEL14["callEKK1041B001SC - Order settings list<br/>check can_skip_delsod"]
TEL14 --> TEL15["callEKK0351B002SC - 050 Number Plate"]
TEL15 --> TEL16{"Z1 ordered & N050?"}
TEL16 -->|Yes| TEL17["opSetOdrCtrl() - 050 cancel"]
TEL16 -->|No| TEL18{"op_svc_cd == TENSO?"}
TEL17 --> TEL19
TEL18 -->|Yes| TEL20{"not Z1 & no BMP & no ShosaDslFin?"}
TEL20 -->|Yes| TEL21["addSOD(229, 230) - SIP cancel"]
TEL20 -->|No| TEL22
TEL21 --> TEL22{"isTajgsTelNo + isMonaiBmp?"}
TEL22 -->|Yes| TEL23["addSOD(266) - ENUM deletion"]
TEL22 -->|No| TEL24
TEL23 --> TEL24{"isZ1Ordered?"}
TEL24 -->|Yes| TEL25["addTokiSOD() - transfer registration"]
TEL25 --> TEL26{"!getTokiOdr & !can_skip_delsod?"}
TEL26 -->|Yes| TEL27["addSOD(229, 230) - SIP cancel"]
TEL27 --> TEL28{"!BMP & !TajgsTelNo & MonaiBmp?"}
TEL28 -->|Yes| TEL29["addSOD(252) - Emergency notification"]
TEL29 --> TEL30{"!can_skip_delsod?"}
TEL30 -->|Yes| TEL31["addSOD(266) - ENUM deletion"]
TEL30 -->|No| TEL32
TEL28 -->|No| TEL32
TEL26 -->|No| TEL32
TEL31 --> TEL32["Set mae_recode_ch_svc_kei_no"]
TEL32 --> RET

RET["Return param"]
RET --> END(["END"])
```

**CRITICAL - Constant Resolution:**

| Constant | Value | Business Meaning |
|----------|-------|-----------------|
| `SVC_KIND_NET` | "1" | eo Light Network (FTTH/Broadband) |
| `SVC_KIND_ADSL` | "5" | eoADSL service |
| `SVC_KIND_MOB` | "4" | eo Mobile service |
| `SVC_KIND_TEL` | "2" | eo Light Telephone service |
| `IDO_DIV_DSL` | "00005" | Cancellation (normal) |
| `IDO_DIV_TEKKYODSL` | "00006" | Withdrawal (cancellation) |
| `IDO_DIV_KYOSEIDSL` | "00064" | Forced cancellation |
| `IDO_DIV_KYOSEIDSLFIX` | "00007" | Forced cancellation confirmation |
| `IDO_DIV_CANCEL` | "00008" | Cancel (e.g., inspection withdrawal) |
| `IDO_DIV_OPSETTE` | "00031" | Option setup |
| `SVC_DLRE_CD_KYOSEIDSL` | - | Forced cancellation reason code |
| `KKTK_SVC_CD_BBR` | "C014" | Equipment-provided service BBR |
| `OP_SVC_CD_EMAIL` | "011" | E-mail option service |
| `OP_SVC_CD_HP` | "012" | My Home Page option service |
| `OP_SVC_CD_MLIST` | "032" | Mailing list option service |
| `OP_SVC_CD_IPV6` | "035" | IPv6 option service |
| `OP_SVC_CD_DUP` | "033" | Duplication option service |
| `OP_SVC_CD_MLTISE` | "031" | Multi-selection option service |
| `OP_SVC_CD_FMTCEL` | "034" | Format cell option service |
| `OP_SVC_CD_FIXIPAD` | "026" | Fixed Global IP address option |
| `OP_SVC_CD_TENSO` | "050" | Number plate option |
| `ODR_NAIYO_CD_103` | - | FTTH Authentication Cancellation |
| `ODR_NAIYO_CD_104` | - | FTTH Authentication Deletion |
| `ODR_NAIYO_CD_145` | - | Multi-Selection (static) Cancellation |
| `ODR_NAIYO_CD_149` | - | Router Connection Settings |
| `ODR_NAIYO_CD_150` | - | Router Connection Deletion |
| `ODR_NAIYO_CD_405` | - | Multi-Function Router Setup (Router function) |
| `ODR_NAIYO_CD_419` | - | Multi-Function Router Cancellation (Router function) |
| `ODR_NAIYO_CD_420` | - | Multi-Function Router Deletion (Router function) |
| `ODR_NAIYO_CD_417` | - | Multi-Router Active Setup |
| `ODR_NAIYO_CD_421` | - | Multi-Router Simultaneous Cancellation |
| `ODR_NAIYO_CD_422` | - | Multi-Router Deletion |
| `ODR_NAIYO_CD_215` | - | OLS Setup/Cancellation |
| `ODR_NAIYO_CD_216` | - | OLS Setup/Deletion |
| `ODR_NAIYO_CD_229` | - | SIP Cancellation |
| `ODR_NAIYO_CD_230` | - | SIP Deletion |
| `ODR_NAIYO_CD_252` | - | Emergency Notification Cancellation |
| `ODR_NAIYO_CD_266` | - | ENUM Deletion SOD |
| `ODR_NAIYO_CD_309` | - | WiMAX DEV Deletion |
| `ODR_NAIYO_CD_308` | - | WiMAX CUI Deletion |
| `ODR_NAIYO_CD_313` | - | e-mobile Cancellation |
| `ODR_NAIYO_CD_302` | - | Wi-Fi Spot Change |
| `ODR_NAIYO_CD_303` | - | Wi-Fi Spot Deletion |
| `PCRS_CD_WIFISPOT` | "A30" | WiFi Spot flat plan |
| `PCRS_CD_FREE_WIFI` | "A45" | Mobile WiFi Flat Unlimited Plan |
| `PCRS_CD_WIMAX` | "A46" | Mobile UQ WiMAX Authentication ID |
| `PCRS_CD_MAILADDRESS` | "A61" | Mobile Mail Address |
| `PCRS_CD_UQWIMAX_B` | "A28" | WiMAX 40M Black Route |
| `PCRS_CD_ADSL_FURETTSU` | "A22" | eo ADSL (Flets) |
| `PCRS_CD_100M` | "A03" | 100M Course |
| `PCRS_CD_1G` | "A05" | 1 Gig Course |
| `PCRS_CD_5G` | "A89" | 5 Gig Course |
| `PCRS_CD_10G` | "A83" | 10 Gig Course |

## 3. Parameter Analysis

| No | Parameter Name | Type | Business Description |
|----|---------------|------|---------------------|
| 1 | `handle` | `SessionHandle` | Session manager handle carrying session context (transaction ID, connection info, user authentication state) for database and service component calls |
| 2 | `param` | `IRequestParameterReadWrite` | Model group and control map containing parameter object; used as accumulator for SOD data throughout processing and returned with all generated order data |
| 3 | `fixedText` | `String` | User-defined arbitrary character string; passed through to `opSetOdrCtrl()` for optional reference text in option setup SOD processing |
| 4 | `sodMap` | `HashMap<String, Object>` | SOD map containing three nested sub-maps keyed by constants: `SOD_KIHON_INFO` (SOD basic info), `SVC_KEI_INFO` (service contract info), `SVC_KEI_UCWK_INFO` (service contract detail info) |

**Instance fields read by this method:**

| Field | Type | Business Description |
|-------|------|---------------------|
| `mskm_dtl_no` | `String` | Submission detail number (申込明細番号) - matches against option/equipment service detail numbers to identify matching cancellation targets |
| `ido_div` | `String` | Movement division (異動区分) - class of movement operation, read from sodMap to determine cancellation type |
| `svc_kei_stat` | `String` | Service contract status (サービス契約状態) - read during inspection cancellation checks (状態 == "010" = received) |
| `same_trn_no` | `String[]` | Unified transaction number - set when getSameTrnNoFlg is true; used to group related cancellation SOD |
| `svc_kei_ucwk_no` | `String[]` | Service contract detail number (set as single-element array for downstream processing) |
| `svc_kei_ucwk_gadtm` | `String[]` | Service contract detail generation registration datetime |
| `kktk_svc_kei_no` | `String[]` | Equipment-provided service contract number |
| `kktk_svc_kei_gadtm` | `String[]` | Equipment-provided service contract generation registration datetime |
| `taknkiki_model_cd` | `String[]` | Home equipment model code (宅内機器型式コード) |
| `kiki_seizo_no` | `String[]` | Equipment manufacturing number (機器製造番号) |
| `svc_kei_kaisen_ucwk_no` | `String[]` | Service line detail number (サービス回線内線番号) |
| `svc_kei_kaisen_ucwk_gadtm` | `String[]` | Service line detail generation registration datetime |
| `taknkiki_model_cd_takino` | `String` | Multi-function router model code comparison reference |
