# Business Logic — JKKAdchgHakkoSODCC.stpUkOdrCtrl() [408 LOC]

| Field | Value |
|-------|-------|
| Fully Qualified Name | `com.fujitsu.futurity.bp.custom.common.JKKAdchgHakkoSODCC` |
| Layer | CC / Common Component (Service Component Controller) |
| Module | `common` (Package: `com.fujitsu.futurity.bp.custom.common`) |

## 1. Role

### JKKAdchgHakkoSODCC.stpUkOdrCtrl()

This method implements the **interruption acceptance order control processing** (中断受付オーダ制御処理) — it determines what Service Order Data (SOD) entities to issue when a telecom customer service interruption (中断) is being accepted within the Fujitsu ERP ordering system. It acts as the central dispatch router for three major service categories: **eo light network (eo光ネット)** for fiber-to-the-home broadband, **eo mobile (eoモバイル)** for 3G/WiMAX/WiFi spot wireless services, and **eo light telephone (eo光電話)** for SIP-based VoIP telephone services.

The method follows a **routing/dispatch pattern**: it first determines the service type (`svc_kind`) via `jdgSvcKind()`, then branches into three distinct processing pipelines. Within each branch, it performs pre-conditions checks (e.g., mansion private-line skip, number portability flags), queries external service component SCs to determine the current state of associated optional services (Dial-Up, Femtocell, WiFi Spot, etc.), and conditionally issues one or more SOD entities via `addSOD()` or `addItnTokiSOD()`. Each SOD represents a specific business action code (ODR_NAIYO_CD) such as temporary suspension, change, or deletion.

In the larger system, this method serves as a **shared utility** called by higher-level CBS methods that handle different disruption scenarios — specifically `addSODUkOdrCtrl` (interruption acceptance for new contract cases) and `telNoTikanStp` (telephone number portability interruption). It is a critical coordination point where business state is translated into order entities that downstream fulfillment processes consume.

## 2. Processing Pattern (Detailed Business Logic)

```mermaid
flowchart TD
    START(["stpUkOdrCtrl"])
    START --> EXTRACT["Extract SOD maps from sodMap"]
    EXTRACT --> SHKKA["Apply shkkaMap to all 3 maps"]
    SHKKA --> GETPARAMS["Get sys_id, svc_kei_no, svc_kei_ucwk_no"]
    GETPARAMS --> JDGSVC["Call jdgSvcKind to determine svc_kind"]
    JDGSVC --> COND1{svc_kind = 1 or<br/>pcrs_cd = A22}
    COND1 -->|NET/FLET'S| NETBLOCK["eo光net / eo光 FLET'S branch"]
    COND1 -->|MOB| MOBBLOCK["eo-mobile branch"]
    COND1 -->|TEL| TELBLOCK["eo光電話 branch"]

    NETBLOCK --> CHECKMANSION{isMansionPrvate}
    CHECKMANSION -->|true| RETURN_PARAM["Return param"]
    CHECKMANSION -->|false| INHASH["Build inHashMltise"]
    INHASH --> CALL0351["Call callEKK0351B002SC"]
    CALL0351 --> CHECKSTATUS{statusCode != 0}
    CHECKSTATUS -->|true| THROW1["Throw CCException"]
    CHECKSTATUS -->|false| LOOPMSG["Loop msgList from result"]
    LOOPMSG --> GETMSG["Extract op_svc_kei_no, op_svc_cd, op_svc_kei_stat"]
    GETMSG --> DUPCHK{op_svc_cd = B020}
    DUPCHK -->|true| STAT210CHK{op_svc_kei_stat = 210}
    DUPCHK -->|false| FMTCHK{op_svc_cd = B075}
    STAT210CHK -->|true| SETDIAL["Set op_svc_kei_no_dial, dial_flg = true"]
    STAT210CHK -->|false| NEXTITER
    FMTCHK -->|true| FMT210CHK{op_svc_kei_stat = 210}
    FMTCHK -->|false| NEXTITER
    FMT210CHK -->|true| SETFMTCEL["Set op_svc_kei_no_fmtcel, fmtcel_flg = true"]
    FMT210CHK -->|false| NEXTITER
    NEXTITER -->|loop| GETMSG

    SETDIAL --> CHECKDIAL{dial_flg or fmtcel_flg}
    SETFMTCEL --> CHECKDIAL
    NEXTITER --> CHECKDIAL

    CHECKDIAL -->|true| GETTRN["Call getSame_trn_no"]
    CHECKDIAL -->|false| SETEMPTY["Set same_trn_no = empty"]
    GETTRN --> SETUCWK["Set svc_kei_ucwk_no, svc_kei_ucwk_gadtm"]
    SETEMPTY --> SETUCWK
    SETUCWK --> ADD106["Call addSOD ODR_NAIYO_CD_106"]
    ADD106 --> CHECKDIALFLG{dial_flg}
    CHECKDIALFLG -->|true| ADD140["Call addSOD ODR_NAIYO_CD_140"]
    CHECKDIALFLG -->|false| CHECKFMTCEL
    ADD140 --> CHECKFMTCEL{fmtcel_flg}
    CHECKFMTCEL -->|true| ADD168["Call addSOD ODR_NAIYO_CD_168"]
    CHECKFMTCEL -->|false| NETDONE

    MOBBLOCK --> WIFISPOTCHK{pcrs_cd = A30}
    WIFISPOTCHK -->|true| CLEARTRN["Set same_trn_no = empty"]
    WIFISPOTCHK -->|false| CHGCHK{chgSvcKeiJdg}
    CHGCHK -->|true| GETTRNMOB["Call getSame_trn_no"]
    CHGCHK -->|false| GETTRNMOB

    CLEARTRN --> INEKK0161["Build inEKK0161A010Hash"]
    GETTRNMOB --> INEKK0161
    INEKK0161 --> CHECKUCWK{svc_kei_ucwk_no not empty}
    CHECKUCWK -->|true| CALL0161A["Call callEKK0161A010SC"]
    CHECKUCWK -->|false| SKIP0161A
    CALL0161A --> EXTRACTPCRS["Extract pcrsCd from result"]
    SKIP0161A --> EXTRACTPCRS
    EXTRACTPCRS --> EMCHK{pcrs_cd = A26 or A27}
    EMCHK -->|true| SAKICHECK{saki_svc_kei_no not empty}
    EMCHK -->|false| WIMAXCHK{ucwkPcrsCd = A46}
    SAKICHECK -->|true| ADD314["Call addSOD ODR_NAIYO_CD_314"]
    SAKICHECK -->|false| WIMAXCHK
    ADD314 --> WIMAXCHK

    WIMAXCHK -->|true| SETUCWKMOB["Set svc_kei_ucwk_no, svc_kei_ucwk_gadtm"]
    WIMAXCHK -->|false| SPOTCHK{ucwkPcrsCd = A45}
    SETUCWKMOB --> ADD310["Call addSOD ODR_NAIYO_CD_310"]
    ADD310 --> WIFI_COUNT

    SPOTCHK -->|true| INHASHSPOT["Build inHashUcwk with sys_id"]
    SPOTCHK -->|false| NOTBLANKCHK

    INHASHSPOT --> CALL0161B["Call callEKK0161B003SC"]
    CALL0161B --> SPOTLOOP["Loop msgListUcwk"]
    SPOTLOOP --> CALL0161AWIFI["Call callEKK0161A010SC for each WiFi spot"]
    CALL0161AWIFI --> WIFICHECK{pcrsCdWifi = A45}
    WIFICHECK -->|true| INCREMENT["wifiSpotCnt++"]
    WIFICHECK -->|false| NEXTSPOT
    INCREMENT --> NEXTSPOT
    NEXTSPOT -->|loop| SPOTLOOP

    WIFI_COUNT{"wifiSpotCnt >= 2"}
    SPOTLOOP --> WIFI_COUNT

    WIFI_COUNT -->|true| ADD302["Call addSOD ODR_NAIYO_CD_302"]
    WIFI_COUNT -->|false| ONECHK{wifiSpotCnt = 1}
    ONECHK -->|true| ADD304["Call addSOD ODR_NAIYO_CD_304"]
    ONECHK -->|false| NOTBLANKCHK

    TELBLOCK --> IDOCHECK{ido_div = 00062}
    IDOCHECK -->|true| GETTRNTEL["Call getSame_trn_no"]
    IDOCHECK -->|false| EMPTYTRN["Set same_trn_no = empty"]
    GETTRNTEL --> SETUCTEL["Set svc_kei_ucwk_no, svc_kei_ucwk_gadtm"]
    EMPTYTRN --> SETUCTEL
    SETUCTEL --> ADD223["Call addSOD ODR_NAIYO_CD_223"]
    ADD223 --> IDOCHK2{ido_div = 00062}
    IDOCHK2 -->|true| GETOPSPVCKEI["Call getOpSvcKei4Eohtel"]
    IDOCHK2 -->|false| NOTBLANKCHK
    GETOPSPVCKEI --> KKLOOP["Loop kk0351Map"]
    KKLOOP -->|next| STATCHECK{op_svc_kei_stat = 220<br/>and mskm match}
    STATCHECK -->|true| SETTIKAN["Set op_svc_kei_no_tikan"]
    STATCHECK -->|false| ADDSOD249
    SETTIKAN --> ADDSOD249["Call addSOD ODR_NAIYO_CD_249"]
    ADDSOD249 --> CALL0191["Call callEKK0191A010SC"]
    CALL0191 --> BMPCHK{BMP_UM = 1}
    BMPCHK -->|true| ADD226["Call addSOD ODR_NAIYO_CD_226"]
    BMPCHK -->|false| ADD221
    ADD226 --> ADD221["Call addItnTokiSOD ODR_NAIYO_CD_221"]
    ADD221 --> NETDONE

    WIFI_COUNT -->|false| NOTBLANKCHK{isBlank same_trn_no}
    ADD302 --> NOTBLANKCHK
    ADD304 --> NOTBLANKCHK

    NOTBLANKCHK -->|false| SETMAE["Set mae_recode_ch_svc_kei_no"]
    NOTBLANKCHK -->|true| NETDONE

    NETDONE --> RETURN["Return param"]
    RETURN_PARAM --> RETURN
    THROW1 --> RETURN
```

**Branch Constant Resolution:**

| Constant | Value | Business Meaning |
|----------|-------|-----------------|
| `SVC_KIND_NET` | "1" | eo light network (fiber broadband) |
| `SVC_KIND_MOB` | "4" | eo mobile (wireless 3G/WiMAX) |
| `SVC_KIND_TEL` | "2" | eo light telephone (VoIP/SIP) |
| `PCRS_CD_ADSL_FURETTSU` | "A22" | FLET'S ADSL pricing code (routed as NET) |
| `OP_SVC_CD_DUP` | "B020" | Dial-Up connection optional service |
| `OP_SVC_CD_FMTCEL` | "B075" | Femtocell optional service |
| `SVC_KEI_STAT_210` | "210" | Suspended/interrupted contract status |
| `SVC_KEI_STAT_220` | "220" | Stopped status |
| `PCRS_CD_WIFISPOT` | "A30" | WiFi Spot pricing code |
| `PCRS_CD_EMOBILE_7M` | "A26" | e-mobile 7M pricing code |
| `PCRS_CD_EMOBILE_21M` | "A27" | e-mobile 21M pricing code |
| `PCRS_CD_WIMAX` | "A46" | WiMAX pricing code |
| `PCRS_CD_FREE_WIFI` | "A45" | Free WiFi (WiFi Spot) pricing code |
| `IDO_DIV_USESTP` | "00062" | Usage suspension disruption division |
| `OP_SVC_CD_N050` | "B029" | 050 number optional service |
| `BMP_UM_ARI` | "1" | Banpo (number) present flag |

## 3. Parameter Analysis

| No | Parameter Name | Type | Business Description |
|----|---------------|------|---------------------|
| 1 | `handle` | `SessionHandle` | Session handle carrying session manager context used for all SC calls and database operations |
| 2 | `param` | `IRequestParameterReadWrite` | Parameter object containing the model group and control map; carries business data between screen, CBS, and SC layers; returned with updated SOD order data |
| 3 | `fixedText` | `String` | Request data map ID used as a key to identify the request payload; not directly used in this method but passed through to called methods |
| 4 | `sodMap` | `HashMap<String, Object>` | Business data acquisition/write map containing SOD basic info (`SOD_KIHON_INFO`), service contract info (`SVC_KEI_INFO`), and service contract detail info (`SVC_KEI_UCWK_INFO`); the source of truth for all customer contract state |

**Instance fields read by this method:**

| Field | Type | Business Description |
|-------|------|---------------------|
| `pcrs_cd` | `String` | Pricing code — determines the specific service plan (e.g., e-mobile 7M, WiMAX, FLET'S ADSL) |
| `ido_div` | `String` | Disruption division code — identifies the type of business operation (e.g., "00062" = usage suspension) |
| `dial_flg` | `boolean` | Flag set to true when a Dial-Up optional service with suspended status exists |
| `fmtcel_flg` | `boolean` | Flag set to true when a Femtocell optional service with suspended status exists |
| `same_trn_no` | `String` | Same transaction number — used for deduplication and transaction correlation |
| `svc_kei_ucwk_no` | `String[]` | Service contract detail number — array holding the current contract line item ID |
| `svc_kei_ucwk_gadtm` | `String[]` | Service contract detail generation registration datetime |
| `op_svc_kei_no_dial` | `String` | Optional service contract number for Dial-Up |
| `op_gadtm_dial` | `String` | Optional service contract generation registration datetime for Dial-Up |
| `op_svc_kei_no_fmtcel` | `String` | Optional service contract number for Femtocell |
| `op_gadtm_fmtcel` | `String` | Optional service contract generation registration datetime for Femtocell |
| `op_svc_kei_no_tikan` | `String` | Optional service contract number for number swap |
| `op_gadtm_tikan` | `String` | Generation registration datetime for number swap |
| `mskm_dtl_no` | `String` | Application detail number — matches against optional service detail to determine if suspension was applied |
| `mae_recode_ch_svc_kei_no` | `String` | Previous record change service contract number — set when `same_trn_no` is not blank |

## 4. CRUD Operations / Called Services

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

| CRUD | SC / CBS | SC Code | Entity / DB | Operation Description |
|------|----------|---------|-------------|----------------------|
| R | `JKKAdchgHakkoSODCC.callEKK0351B002SC` | EKK0351B002SC | KK_T_OP_SVC_KEI (optional service contract) | Queries optional service contract one-line match by service contract number — retrieves op_svc_kei_no, op_svc_kei_stat, op_svc_cd, gene_add_dtm for all optional services |
| R | `JKKAdchgHakkoSODCC.callEKK0161A010SC` | EKK0161A010SC | KK_T_SVC_KEI_UCWK (service contract detail) | Service contract detail one-agreement match — retrieves pcrs_cd (pricing code) for the given service contract detail number |
| R | `JKKAdchgHakkoSODCC.callEKK0161B003SC` | EKK0161B003SC | KK_T_SVC_KEI_UCWK (service contract detail) | Service contract detail one-line match by SYSID — used to query WiFi Spot service contract detail entries |
| R | `JKKAdchgHakkoSODCC.getSame_trn_no` | EKK1081C011 | KK_T_SAME_TRN_NO (same transaction number) | Same transaction number search — retrieves a shared transaction number for deduplication and correlation purposes |
| R | `JKKAdchgHakkoSODCC.getOpSvcKei4Eohtel` | EKK0351A010CBS / EKK0351B002SC | KK_T_OP_SVC_KEI (optional service contract) | Gets optional service contracts for eo light telephone — queries op_svc_kei_no, gene_add_dtm, mskm_dtl_no, op_svc_kei_stat filtered by OP_SVC_CD_N050 (050 number) |
| R | `JKKAdchgHakkoSODCC.callEKK0191A010SC` | EKK0191A010SC | KK_T_SVC_KEI_UCWK (service contract detail for eo light telephone) | Service contract detail for eo light telephone one-agreement match — retrieves BMP_UM (banpo/number present flag) |
| R | `JCCBPCommon.getOpeDate` | JCCBPCommon | - | Gets the current operation date from a common utility class |
| C | `JKKAdchgHakkoSODCC.addSOD` | - | KK_T_SVC_ORDER (service order / SOD) | Creates a new Service Order Data (SOD) entity with the specified order content code (ODR_NAIYO_CD) |
| C | `JKKAdchgHakkoSODCC.addItnTokiSOD` | - | KK_T_SVC_ORDER (service order / SOD) | Creates an internal temporary SOD entity for transfer registration termination (SIP/transfer setup end) |
| - | `JKKAdchgHakkoSODCC.chgSvcKeiJdg` | - | - | Judges whether the current service contract number differs from the previous record's — used for mobile service change detection |
| - | `JKKAdchgHakkoSODCC.jdgSvcKind` | - | - | Determines the service type code (NET, TEL, MOB, etc.) |
| - | `JKKAdchgHakkoSODCC.shkkaMap` | - | - | Applies a mask/transformation map to the SOD info maps |
| - | `JKKAdchgHakkoSODCC.isMansionPrvate` | - | - | Checks if the customer is a mansion private-line user (returns true to skip SOD issuance for FTTH auth and dial-up connections) |
| - | `JKKAdchgHakkoSODCC.isBlank` | - | - | Utility check whether a string is null or empty |

## 5. Dependency Trace

No external screen/batch entry points found. This is a private method invoked only by internal CBS methods within `JKKAdchgHakkoSODCC`. Direct callers found: 2 methods.

| # | Caller (Screen/Batch) | Call Chain (Full Path to this Method) | Terminal (SC / CRUD / Entity) |
|---|----------------------|--------------------------------------|-------------------------------|
| 1 | CBS:JKKAdchgHakkoSODCC.addSODUkOdrCtrl | `addSODUkOdrCtrl` -> `stpUkOdrCtrl` | `addSOD [C] KK_T_SVC_ORDER`, `callEKK0351B002SC [R] KK_T_OP_SVC_KEI`, `callEKK0161A010SC [R] KK_T_SVC_KEI_UCWK`, `getSame_trn_no [R] KK_T_SAME_TRN_NO` |
| 2 | CBS:JKKAdchgHakkoSODCC.telNoTikanStp | `telNoTikanStp` -> `stpUkOdrCtrl` | `addSOD [C] KK_T_SVC_ORDER`, `addItnTokiSOD [C] KK_T_SVC_ORDER`, `callEKK0191A010SC [R] KK_T_SVC_KEI_UCWK`, `callEKK0161B003SC [R] KK_T_SVC_KEI_UCWK`, `getOpSvcKei4Eohtel [R] KK_T_OP_SVC_KEI`, `getSame_trn_no [R] KK_T_SAME_TRN_NO` |

## 6. Per-Branch Detail Blocks

### Initialization Block (L7042–L7072)

> Extracts and transforms the three SOD maps from the input `sodMap`, then retrieves key parameters (sys_id, service contract number, service contract detail number, and generation registration datetime).

| # | Type | Code |
|---|------|------|
| 1 | SET | `statusCode = 0` // Service interval phase execution status [-> 0] |
| 2 | SET | `sod_kihon_info_Map = (HashMap)sodMap.get(JKKHakkoSODConstCC.SOD_KIHON_INFO)` // SOD basic info |
| 3 | SET | `svc_kei_info_Map = (HashMap)sodMap.get(JKKHakkoSODConstCC.SVC_KEI_INFO)` // Service contract info |
| 4 | SET | `svc_kei_ucwk_info_Map = (HashMap)sodMap.get(JKKHakkoSODConstCC.SVC_KEI_UCWK_INFO)` // Service contract detail info |
| 5 | EXEC | `sod_kihon_info_Map = shkkaMap(sod_kihon_info_Map)` // Apply transformation mask |
| 6 | EXEC | `svc_kei_info_Map = shkkaMap(svc_kei_info_Map)` |
| 7 | EXEC | `svc_kei_ucwk_info_Map = shkkaMap(svc_kei_ucwk_info_Map)` |
| 8 | SET | `sys_id = (String)sod_kihon_info_Map.get(JKKHakkoSODConstCC.INFO_SYSID)` // SYSID |
| 9 | SET | `svc_kei_no = (String)svc_kei_info_Map.get(JKKHakkoSODConstCC.INFO_SVC_KEI_NO)` // Service contract number |
| 10 | SET | `svc_kei_ucwk_no = (String)svc_kei_ucwk_info_Map.get(JKKHakkoSODConstCC.INFO_SVC_KEI_UCWK_NO)` // Service contract detail number |
| 11 | SET | `chaf_svc_kei_ucwk_gene_add_dtm = (String)svc_kei_ucwk_info_Map.get(JKKHakkoSODConstCC.INFO_CHAF_SVC_KEI_UCWK_GENE_ADD_DTM)` // Generation registration datetime after change |
| 12 | SET | `svc_kind = jdgSvcKind()` // Service type determination |

---

### Block 1 — IF [NET/FLET'S branch] (L7074–L7197)

> Condition: `SVC_KIND_NET = "1"` or `PCRS_CD_ADSL_FURETTSU = "A22"` — Handles eo light network (fiber broadband) and FLET'S ADSL service interruptions.

| # | Type | Code |
|---|------|------|
| 1 | IF | `SVC_KIND_NET.equals(svc_kind) || PCRS_CD_ADSL_FURETTSU.equals(pcrs_cd)` [SVC_KIND_NET="1", PCRS_CD_ADSL_FURETTSU="A22"] |

#### Block 1.1 — IF [Mansion private-line skip] (L7077–L7081)

> If the customer is a mansion private-line user, skip all SOD issuance. FTTH authentication cannot be issued, and dial-up connections are unavailable for this building type.

| # | Type | Code |
|---|------|------|
| 1 | IF | `isMansionPrvate()` [Returns true = skip SOD issuance] |
| 2 | RETURN | `return param` |

#### Block 1.2 — NET processing (L7083–L7197)

| # | Type | Code |
|---|------|------|
| 1 | SET | `inHashMltise = new HashMap()` // Input map for multi-service query |
| 2 | SET | `resultHashMltise = new HashMap()` // Result map for multi-service query |
| 3 | SET | `inHashMltise.put(SVC_KEI_NO, svc_kei_no)` // Set service contract number [SVC_KEI_NO="svc_kei_no"] |
| 4 | SET | `statusCode = callEKK0351B002SC(param, handle, inHashMltise, resultHashMltise, FUNC_CODE_1)` // [FUNC_CODE_1="1"] Query optional service contract one-line match |
| 5 | IF | `0 != statusCode` |
| 6 | THROW | `throw new CCException("", new SCCallException("", String.valueOf(statusCode), statusCode))` |
| 7 | SET | `msgList = (CAANMsg[])resultHashMltise.get(JKKHakkoSODConstCC.TEMPLATE_ID_EKK0351B002)` // [TEMPLATE_ID_EKK0351B002="EKK0351B002"] |
| 8 | SET | `op_svc_kei_no = ""` / `op_svc_kei_stat = ""` / `op_gene_add_dtm = ""` / `op_svc_cd = ""` |
| 9 | FOR | `for (i = 0; i < msgList.length; i++)` |
| 10 | SET | `retHash = msgList[i].getMsgData()` |
| 11 | SET | `op_svc_kei_no = (String)retHash.get(OP_SVC_KEI_NO)` // [OP_SVC_KEI_NO="op_svc_kei_no"] |
| 12 | SET | `op_gene_add_dtm = (String)retHash.get(GENE_ADD_DTM)` // [GENE_ADD_DTM="gene_add_dtm"] |
| 13 | SET | `op_svc_kei_stat = (String)retHash.get(OP_SVC_KEI_STAT)` // [OP_SVC_KEI_STAT="op_svc_kei_stat"] |
| 14 | SET | `op_svc_cd = (String)retHash.get(OP_SVC_CD)` // [OP_SVC_CD="op_svc_cd"] |

##### Block 1.2.A — IF [Dial-Up check] (L7110–L7121)

> If the optional service code is Dial-Up (B020) and the contract status is suspended/interrupted (210), record the Dial-Up service number and set the flag.

| # | Type | Code |
|---|------|------|
| 1 | IF | `OP_SVC_CD_DUP.equals(op_svc_cd)` [OP_SVC_CD_DUP="B020"] |
| 2 | IF | `SVC_KEI_STAT_210.equals(op_svc_kei_stat)` [SVC_KEI_STAT_210="210"] |
| 3 | SET | `this.op_svc_kei_no_dial = op_svc_kei_no` // [op_svc_kei_no_dial field] |
| 4 | SET | `this.op_gadtm_dial = op_gene_add_dtm` // [op_gadtm_dial field] |
| 5 | SET | `dial_flg = true` |

##### Block 1.2.B — IF [Femtocell check] (L7124–L7134)

> If the optional service code is Femtocell (B075) and the contract status is suspended/interrupted (210), record the Femtocell service number and set the flag.

| # | Type | Code |
|---|------|------|
| 1 | ELSE_IF | `OP_SVC_CD_FMTCEL.equals(op_svc_cd)` [OP_SVC_CD_FMTCEL="B075"] |
| 2 | IF | `SVC_KEI_STAT_210.equals(op_svc_kei_stat)` [SVC_KEI_STAT_210="210"] |
| 3 | SET | `this.op_svc_kei_no_fmtcel = op_svc_kei_no` |
| 4 | SET | `this.op_gadtm_fmtcel = op_gene_add_dtm` |
| 5 | SET | `fmtcel_flg = true` |

##### Block 1.2.C — IF [Same transaction number / SOD issuance] (L7141–L7195)

> If Dial-Up or Femtocell was found in suspended state, retrieve the same transaction number. Then set the service contract detail number and issue SOD entities.

| # | Type | Code |
|---|------|------|
| 1 | IF | `dial_flg \|\| fmtcel_flg` |
| 2 | SET | `sameTrnNo = new String[1]` |
| 3 | SET | `sameTrnNo = getSame_trn_no(param, handle, null, sameTrnNo)` // [Same transaction number search] |
| 4 | SET | `this.same_trn_no = sameTrnNo[0]` |
| 5 | ELSE | (else branch) |
| 6 | SET | `this.same_trn_no = ""` |
| 7 | SET | `this.svc_kei_ucwk_no = new String[1]` |
| 8 | SET | `this.svc_kei_ucwk_no[0] = svc_kei_ucwk_no` |
| 9 | SET | `this.svc_kei_ucwk_gadtm = new String[1]` |
| 10 | SET | `this.svc_kei_ucwk_gadtm[0] = chaf_svc_kei_ucwk_gene_add_dtm` |
| 11 | SET | `param = addSOD(handle, param, ODR_NAIYO_CD_106)` // [ODR_NAIYO_CD_106="106"] FTTH Auth Temporary Suspension |

###### Block 1.2.C.1 — IF [Dial-Up SOD] (L7198–L7200)

| # | Type | Code |
|---|------|------|
| 1 | IF | `dial_flg` |
| 2 | SET | `param = addSOD(handle, param, ODR_NAIYO_CD_140)` // [ODR_NAIYO_CD_140="140"] Dial-Up Temporary Suspension |

###### Block 1.2.C.2 — IF [Femtocell SOD] (L7203–L7205)

| # | Type | Code |
|---|------|------|
| 1 | IF | `fmtcel_flg` |
| 2 | SET | `param = addSOD(handle, param, ODR_NAIYO_CD_168)` // [ODR_NAIYO_CD_168="168"] Femtocell Temporary Suspension |

---

### Block 2 — ELSE_IF [Mobile branch] (L7222–L7240)

> Condition: `SVC_KIND_MOB = "4"` — Handles eo mobile (3G/WiMAX/WiFi Spot) service interruptions.

| # | Type | Code |
|---|------|------|
| 1 | ELSE_IF | `SVC_KIND_MOB.equals(svc_kind)` [SVC_KIND_MOB="4"] |

#### Block 2.1 — IF [WiFi Spot pricing code] (L7224–L7228)

> If the pricing code is WiFi Spot (A30), clear the same transaction number.

| # | Type | Code |
|---|------|------|
| 1 | IF | `PCRS_CD_WIFISPOT.equals(pcrs_cd)` [PCRS_CD_WIFISPOT="A30"] |
| 2 | SET | `this.same_trn_no = ""` |

#### Block 2.2 — ELSE_IF [Service contract change judgment] (L7230–L7236)

> If the service contract number differs from the previous record, get the same transaction number.

| # | Type | Code |
|---|------|------|
| 1 | ELSE_IF | `chgSvcKeiJdg(svc_kei_no)` |
| 2 | SET | `sameTrnNo = new String[1]` |
| 3 | SET | `sameTrnNo = getSame_trn_no(param, handle, null, sameTrnNo)` |
| 4 | SET | `this.same_trn_no = sameTrnNo[0]` |

#### Block 2.3 — EKK0161A010 query block (L7240–L7267)

> Prepare input map for service contract detail one-agreement match. Query only if svc_kei_ucwk_no is not empty.

| # | Type | Code |
|---|------|------|
| 1 | SET | `inEKK0161A010Hash = new HashMap()` |
| 2 | SET | `retEKK0161A010Hash = new HashMap()` |
| 3 | IF | `svc_kei_ucwk_no != null && svc_kei_ucwk_no.length() > 0` |
| 4 | SET | `inEKK0161A010Hash.put(SVC_KEI_UCWK_NO, svc_kei_ucwk_no)` // [SVC_KEI_UCWK_NO="svc_kei_ucwk_no"] |
| 5 | SET | `inEKK0161A010Hash.put(GENE_ADD_DTM, chaf_svc_kei_ucwk_gene_add_dtm)` |
| 6 | SET | `statusCode = callEKK0161A010SC(param, handle, inEKK0161A010Hash, retEKK0161A010Hash, FUNC_CODE_1)` |
| 7 | IF | `0 != statusCode` |
| 8 | THROW | `throw new CCException("", new SCCallException("", String.valueOf(statusCode), statusCode))` |
| 9 | SET | `eKK0161A010Hash = (HashMap)retEKK0161A010Hash.get(Template ID_EKK0161A010)` |
| 10 | IF | `eKK0161A010Hash != null` |
| 11 | SET | `ucwkPcrsCd = (String)eKK0161A010Hash.get(PCRS_CD)` // [PCRS_CD="pcrs_cd"] Extract pricing code |

#### Block 2.4 — IF [e-mobile 7M/21M] (L7269–L7285)

> If pricing code is e-mobile (A26 or A27), and a previous service contract number exists, issue an e-mobile temporary interruption SOD.

| # | Type | Code |
|---|------|------|
| 1 | IF | `PCRS_CD_EMOBILE_7M.equals(pcrs_cd) || PCRS_CD_EMOBILE_21M.equals(pcrs_cd)` [A26 or A27] |
| 2 | SET | `saki_svc_kei_no = (String)svc_kei_info_Map.get(INFO_SAKI_SVC_KEI_NO)` // [INFO_SAKI_SVC_KEI_NO="svc_kei_no_egchange_net"] Previous service contract number |
| 3 | IF | `saki_svc_kei_no != null && saki_svc_kei_no.length() > 0` |
| 4 | SET | `param = addSOD(handle, param, ODR_NAIYO_CD_314)` // [ODR_NAIYO_CD_314="314"] e-mobile Temporary Interruption |

#### Block 2.5 — IF [WiMAX] (L7287–L7300)

> If the service contract detail pricing code is WiMAX (A46), set the detail number and issue a WiMAX CUI temporary suspension SOD.

| # | Type | Code |
|---|------|------|
| 1 | IF | `PCRS_CD_WIMAX.equals(ucwkPcrsCd)` [PCRS_CD_WIMAX="A46"] |
| 2 | SET | `this.svc_kei_ucwk_no = new String[1]` |
| 3 | SET | `this.svc_kei_ucwk_no[0] = svc_kei_ucwk_no` |
| 4 | SET | `this.svc_kei_ucwk_gadtm = new String[1]` |
| 5 | SET | `this.svc_kei_ucwk_gadtm[0] = chaf_svc_kei_ucwk_gene_add_dtm` |
| 6 | SET | `param = addSOD(handle, param, ODR_NAIYO_CD_310)` // [ODR_NAIYO_CD_310="310"] WiMAX CUI Temporary Suspension |

#### Block 2.6 — ELSE_IF [Free WiFi Spot] (L7302–L7355)

> If the service contract detail pricing code is Free WiFi (A45), query the number of WiFi Spot entries and issue a change or temporary suspension SOD based on count.

| # | Type | Code |
|---|------|------|
| 1 | ELSE_IF | `PCRS_CD_FREE_WIFI.equals(ucwkPcrsCd)` [PCRS_CD_FREE_WIFI="A45"] |
| 2 | SET | `inHashUcwk = new HashMap()` / `resultHashUcwk = new HashMap()` |
| 3 | SET | `inHashUcwk.put(SYSID, sys_id)` // [SYSID="sysid"] |
| 4 | SET | `statusCode = callEKK0161B003SC(param, handle, inHashUcwk, resultHashUcwk, FUNC_CODE_1)` |
| 5 | IF | `0 != statusCode` |
| 6 | THROW | `throw new CCException("", new SCCallException("", String.valueOf(statusCode), statusCode))` |
| 7 | SET | `msgListUcwk = (CAANMsg[])resultHashUcwk.get(JKKHakkoSODConstCC.TEMPLATE_ID_EKK0161B003)` // [TEMPLATE_ID_EKK0161B003="EKK0161B003"] |
| 8 | SET | `wifiSpotCnt = 0` |
| 9 | FOR | `for (j = 0; j < msgListUcwk.length; j++)` |
| 10 | SET | `eKK0161B003Hash = msgListUcwk[j].getMsgData()` |
| 11 | SET | `tmp_svc_kei_ucwk_no = (String)eKK0161B003Hash.get(SVC_KEI_UCWK_NO)` |
| 12 | SET | `inHashUcwkWifi = new HashMap()` / `resultHashUcwkWifi = new HashMap()` |
| 13 | SET | `inHashUcwkWifi.put(SVC_KEI_UCWK_NO, tmp_svc_kei_ucwk_no)` |
| 14 | SET | `inHashUcwkWifi.put(OPE_DATE, JCCBPCommon.getOpeDate(null))` // [OPE_DATE="ope_date"] |
| 15 | SET | `statusCode = callEKK0161A010SC(param, handle, inHashUcwkWifi, resultHashUcwkWifi, FUNC_CODE_2)` // [FUNC_CODE_2="2"] |
| 16 | IF | `0 != statusCode` |
| 17 | THROW | `throw new CCException("", new SCCallException("", String.valueOf(statusCode), statusCode))` |
| 18 | SET | `eKK0161A010HashWifi = (HashMap)resultHashUcwkWifi.get(Template ID_EKK0161A010)` |
| 19 | SET | `pcrsCdWifi = (String)eKK0161A010HashWifi.get(PCRS_CD)` |
| 20 | IF | `PCRS_CD_FREE_WIFI.equals(pcrsCdWifi)` |
| 21 | SET | `wifiSpotCnt++` |

##### Block 2.6.A — IF [2+ WiFi Spots] (L7357–L7366)

> If 2 or more WiFi Spot entries are found, issue a WiFi Spot change SOD.

| # | Type | Code |
|---|------|------|
| 1 | IF | `wifiSpotCnt >= 2` |
| 2 | SET | `this.svc_kei_ucwk_no = new String[1]` / `svc_kei_ucwk_no[0] = svc_kei_ucwk_no` |
| 3 | SET | `this.svc_kei_ucwk_gadtm = new String[1]` / `svc_kei_ucwk_gadtm[0] = chaf_svc_kei_ucwk_gene_add_dtm` |
| 4 | SET | `param = addSOD(handle, param, ODR_NAIYO_CD_302)` // [ODR_NAIYO_CD_302="302"] WiFi Spot Change |

##### Block 2.6.B — ELSE_IF [1 WiFi Spot] (L7367–L7376)

> If exactly 1 WiFi Spot entry is found, issue a WiFi Spot temporary suspension SOD.

| # | Type | Code |
|---|------|------|
| 1 | ELSE_IF | `wifiSpotCnt == 1` |
| 2 | SET | `this.svc_kei_ucwk_no = new String[1]` / `svc_kei_ucwk_no[0] = svc_kei_ucwk_no` |
| 3 | SET | `this.svc_kei_ucwk_gadtm = new String[1]` / `svc_kei_ucwk_gadtm[0] = chaf_svc_kei_ucwk_gene_add_dtm` |
| 4 | SET | `param = addSOD(handle, param, ODR_NAIYO_CD_304)` // [ODR_NAIYO_CD_304="304"] WiFi Spot Temporary Suspension |

#### Block 2.7 — Post-processing (L7380–L7384)

> If `same_trn_no` is not blank, set the previous record change service contract number.

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

---

### Block 3 — ELSE_IF [Telephone branch] (L7387–L7436)

> Condition: `SVC_KIND_TEL = "2"` — Handles eo light telephone (SIP/VoIP) service interruptions.

| # | Type | Code |
|---|------|------|
| 1 | ELSE_IF | `SVC_KIND_TEL.equals(svc_kind)` [SVC_KIND_TEL="2"] |

#### Block 3.1 — IF [Usage suspension ido_div] (L7390–L7398)

> If the disruption division is usage suspension ("00062"), get the same transaction number via a different overload; otherwise set empty.

| # | Type | Code |
|---|------|------|
| 1 | IF | `IDO_DIV_USESTP.equals(this.ido_div)` [IDO_DIV_USESTP="00062"] |
| 2 | SET | `this.same_trn_no = getSame_trn_no(param, handle)` |
| 3 | ELSE | |
| 4 | SET | `this.same_trn_no = ""` |
| 5 | SET | `this.svc_kei_ucwk_no = new String[1]` |
| 6 | SET | `this.svc_kei_ucwk_no[0] = svc_kei_ucwk_no` |
| 7 | SET | `this.svc_kei_ucwk_gadtm = new String[1]` |
| 8 | SET | `this.svc_kei_ucwk_gadtm[0] = chaf_svc_kei_ucwk_gene_add_dtm` |
| 9 | SET | `param = addSOD(handle, param, ODR_NAIYO_CD_223)` // [ODR_NAIYO_CD_223="223"] SIP Temporary Suspension |

#### Block 3.2 — IF [050 Number Optional Service] (L7401–L7425)

> If disruption division is usage suspension, query optional service contracts for 050 number service. If the status is stopped (220) and the application detail number matches, issue a number swap delete SOD.

| # | Type | Code |
|---|------|------|
| 1 | IF | `IDO_DIV_USESTP.equals(this.ido_div)` |
| 2 | SET | `kk0351MapList = getOpSvcKei4Eohtel(param, handle, svc_kei_ucwk_no, OP_SVC_CD_N050)` // [OP_SVC_CD_N050="B029"] |
| 3 | FOR | `for (eKK0351A010SCHash : kk0351MapList)` |
| 4 | SET | `kk0351No = (String)eKK0351A010SCHash.get(OP_SVC_KEI_NO)` |
| 5 | SET | `op_gene_add_dtm = (String)eKK0351A010SCHash.get(GENE_ADD_DTM)` |
| 6 | SET | `op_mskm_dtl_no = (String)eKK0351A010SCHash.get(MSKM_DTL_NO)` // [MSKM_DTL_NO="mskm_dtl_no"] |
| 7 | SET | `op_svc_kei_stat = (String)eKK0351A010SCHash.get(OP_SVC_KEI_STAT)` |
| 8 | IF | `SVC_KEI_STAT_220.equals(op_svc_kei_stat) && op_mskm_dtl_no.equals(this.mskm_dtl_no)` [SVC_KEI_STAT_220="220"] |
| 9 | SET | `this.op_svc_kei_no_tikan = kk0351No` |
| 10 | SET | `this.op_gadtm_tikan = op_gene_add_dtm` |
| 11 | SET | `param = addSOD(handle, param, ODR_NAIYO_CD_249)` // [ODR_NAIYO_CD_249="249"] Number Swap Delete |

#### Block 3.3 — EKK0191A010 query + final SODs (L7427–L7436)

> Query the service contract detail for eo light telephone. If banpo (number) is present, issue a banpo info deletion SOD. Then issue a transfer registration termination SOD.

| # | Type | Code |
|---|------|------|
| 1 | SET | `inHashUcwk = new HashMap()` / `resultHashUcwk = new HashMap()` |
| 2 | SET | `inHashUcwk.put(SVC_KEI_UCWK_NO, svc_kei_ucwk_no)` |
| 3 | SET | `inHashUcwk.put(GENE_ADD_DTM, chaf_svc_kei_ucwk_gene_add_dtm)` |
| 4 | SET | `statusCode = callEKK0191A010SC(param, handle, inHashUcwk, resultHashUcwk, FUNC_CODE_1)` |
| 5 | IF | `0 != statusCode` |
| 6 | THROW | `throw new CCException("", new SCCallException("", String.valueOf(statusCode), statusCode))` |
| 7 | SET | `eKK0191A010Hash = (HashMap)resultHashUcwk.get(Template ID_EKK0191A010)` // [TEMPLATE_ID_EKK0191A010="EKK0191A010"] |
| 8 | IF | `BMP_UM_ARI.equals((String)eKK0191A010Hash.get(BMP_UM))` [BMP_UM_ARI="1", BMP_UM field from EKK0191A010CBSMsg1List.BMP_UM] |
| 9 | SET | `param = addSOD(handle, param, ODR_NAIYO_CD_226)` // [ODR_NAIYO_CD_226="226"] SIP Banpo Info Delete |
| 10 | SET | `param = addItnTokiSOD(handle, param, svc_kei_ucwk_no, ODR_NAIYO_CD_221)` // [ODR_NAIYO_CD_221="221"] SIP Transfer Registration Termination |

---

### Block RETURN (L7438)

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

## 7. Glossary

| Term | Type | Business Meaning |
|------|------|-----------------|
| `stpUkOdrCtrl` | Method | Interruption Acceptance Order Control Processing — dispatches SOD entities when a customer service interruption is accepted |
| `SOD` | Acronym | Service Order Data — telecom order fulfillment entity representing a service action to be processed by downstream systems |
| `ODR_NAIYO_CD` | Field | Order content code — classifies the specific type of order action (FTTH registration, temporary suspension, number swap, etc.) |
| `SVC_KEI_NO` | Field | Service contract number — the primary key for a customer's service contract line item |
| `SVC_KEI_UCWK_NO` | Field | Service contract detail number — internal tracking ID for service contract line item details |
| `SVC_KEI_STAT` | Field | Service contract status — code indicating the current state of the contract (100=providing, 210=suspended/interrupted, 220=stopped, 910=cancelled) |
| `pcrs_cd` | Field | Pricing code — identifies the specific service plan and bandwidth tier (e.g., A26=e-mobile 7M, A46=WiMAX, A22=FLET'S ADSL) |
| `ido_div` | Field | Disruption division code — identifies the type of business operation causing the interruption (e.g., 00062=usage suspension) |
| `same_trn_no` | Field | Same transaction number — shared transaction correlation ID used for deduplication across concurrent operations |
| `saki_svc_kei_no` | Field | Previous service contract number — the former contract number when a service was changed/ported |
| `svc_kind` | Field | Service type code — determines which of three service families is being processed (1=NET/fiber, 2=TEL/VoIP, 4=MOB/wireless) |
| `BMP_UM` | Field | Banpo (number) presence flag — indicates whether the customer has an associated telephone number (1=present, 1=absent) |
| `mskm_dtl_no` | Field | Application detail number — matches against optional service details to determine if a suspension was applied |
| `gen_e_add_dtm` | Field | Generation registration datetime — timestamp when the service contract detail was registered/created |
| FTTH | Business term | Fiber To The Home — fiber-optic broadband internet service provided by NTT FLET'S |
| eo light network | Business term | Fujitsu's fiber broadband service brand (eo光ネット) |
| eo mobile | Business term | Fujitsu's mobile wireless service brand (eoモバイル) including 3G, WiMAX, and WiFi Spot |
| eo light telephone | Business term | Fujitsu's SIP-based VoIP telephone service brand (eo光電話) |
| WiFi Spot | Business term | Fujitsu's public/private WiFi hotspot service offering |
| e-mobile | Business term | NTT Docomo's 3G wireless service brand (7M/21M bandwidth tiers) |
| WiMAX | Business term | Wireless broadband service (40M bandwidth) operated by UQ Communications |
| Femtocell | Business term | A small cellular base station (B075) for mobile coverage indoors, often deployed by carriers like docomo/au |
| Dial-Up | Business term | Optional Dial-Up connection service (B020) — legacy remote access optional service |
| 050 number | Business term | 050-number VoIP phone number optional service — an internet-based telephone number |
| Banpo (番泊) | Business term | Telephone number association — the presence of an assigned phone number linked to a service contract |
| Transfer registration | Business term | SIP call forwarding/transfer setup — registration of call destination in the SIP system |
| `jdgSvcKind` | Method | Determines the service type code (NET/TEL/MOB) by evaluating the service contract data |
| `shkkaMap` | Method | Applies a transformation/masking map to the SOD info maps |
| `addSOD` | Method | Creates a new Service Order Data (SOD) entity with a given order content code |
| `addItnTokiSOD` | Method | Creates an internal temporary SOD entity for SIP transfer registration termination |
| `callEKK0351B002SC` | Method | Calls the optional service contract one-line match SC to query optional service details |
| `callEKK0161A010SC` | Method | Calls the service contract detail one-agreement match SC |
| `callEKK0161B003SC` | Method | Calls the service contract detail one-line match SC by SYSID |
| `callEKK0191A010SC` | Method | Calls the service contract detail for eo light telephone one-agreement match SC |
| `getSame_trn_no` | Method | Searches for the same transaction number from EKK1081C011 CBS |
| `getOpSvcKei4Eohtel` | Method | Queries optional service contracts specifically for eo light telephone |
| `chgSvcKeiJdg` | Method | Judges whether the service contract number has changed from the previous record |
| `isMansionPrvate` | Method | Checks if the customer is a mansion (apartment building) private-line user |
| `isBlank` | Method | Utility method to check if a string is null or empty |
| OP_SVC_CD | Field | Optional service code — classifies optional services (B020=Dial-Up, B075=Femtocell, B029=050 number) |
| OP_SVC_CD_DUP | Constant | Optional service code "B020" — Dial-Up connection |
| OP_SVC_CD_FMTCEL | Constant | Optional service code "B075" — Femtocell |
| ODR_NAIYO_CD_106 | Constant | Order content code "106" — FTTH Auth Temporary Suspension |
| ODR_NAIYO_CD_140 | Constant | Order content code "140" — Dial-Up Temporary Suspension |
| ODR_NAIYO_CD_168 | Constant | Order content code "168" — Femtocell Temporary Suspension |
| ODR_NAIYO_CD_310 | Constant | Order content code "310" — WiMAX CUI Temporary Suspension |
| ODR_NAIYO_CD_314 | Constant | Order content code "314" — e-mobile Temporary Interruption |
| ODR_NAIYO_CD_302 | Constant | Order content code "302" — WiFi Spot Change |
| ODR_NAIYO_CD_304 | Constant | Order content code "304" — WiFi Spot Temporary Suspension |
| ODR_NAIYO_CD_223 | Constant | Order content code "223" — SIP Temporary Suspension |
| ODR_NAIYO_CD_226 | Constant | Order content code "226" — SIP Banpo Info Delete |
| ODR_NAIYO_CD_221 | Constant | Order content code "221" — SIP Transfer Registration Termination |
| ODR_NAIYO_CD_249 | Constant | Order content code "249" — Number Swap Delete |
| FUNC_CODE_1 | Constant | Function code "1" — standard function mode |
| FUNC_CODE_2 | Constant | Function code "2" — secondary function mode |
| IDO_DIV_USESTP | Constant | Disruption division "00062" — usage suspension |
| PCRS_CD_ADSL_FURETTSU | Constant | Pricing code "A22" — FLET'S ADSL |
| PCRS_CD_WIFISPOT | Constant | Pricing code "A30" — WiFi Spot |
| PCRS_CD_EMOBILE_7M | Constant | Pricing code "A26" — e-mobile 7M tier |
| PCRS_CD_EMOBILE_21M | Constant | Pricing code "A27" — e-mobile 21M tier |
| PCRS_CD_WIMAX | Constant | Pricing code "A46" — WiMAX |
| PCRS_CD_FREE_WIFI | Constant | Pricing code "A45" — Free WiFi (WiFi Spot) |
| SVC_KIND_NET | Constant | Service type "1" — eo light network (fiber) |
| SVC_KIND_MOB | Constant | Service type "4" — eo mobile (wireless) |
| SVC_KIND_TEL | Constant | Service type "2" — eo light telephone (VoIP) |
| SVC_KEI_STAT_210 | Constant | Contract status "210" — Suspended/Interrupted |
| SVC_KEI_STAT_220 | Constant | Contract status "220" — Stopped |
| BMP_UM_ARI | Constant | Banpo present flag "1" — telephone number is present |
| OP_SVC_CD_N050 | Constant | Optional service code "B029" — 050 number service |
