# Business Logic — JKKOpsvkeiTelIktAddCC.editHakkoSODccMap() [182 LOC]

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

## 1. Role

### JKKOpsvkeiTelIktAddCC.editHakkoSODccMap()

This method edits and assembles the data map for Service Order Data (SOD) issuance -- specifically, it transforms operational service contract information gathered during the telephone option one-step registration flow into the structured SOD payload format expected by downstream order fulfillment processes. The method reads pre-populated result data from `resultHash` (obtained by prior service inquiry SC calls, such as equipment provision service contract listing and service contract detail inquiry), iterates over the operational service contract keys stored in the instance field `opSvcKeiKeyMap`, and for each eligible contract (those flagged for SOD issuance via the `sodTerm` map), builds a series of SOD map entries. Each SOD map entry contains the operational service contract details (before/after change values), optional sub-operational service contract details, and optionally the equipment provision service contract details for bundled service scenarios. The method also completes the SOD map with service contract detail information from the `EKK0161A010` inquiry result. Finally, all assembled SOD data is stored under the key `KKSV005003CC` in the request parameter object for downstream consumption by the SOD issuance component. This method acts as a shared data transformer, called by `mainProc()` within the same class, and serves as the bridge between pre-fetched contract data and the SOD issuance data model.

## 2. Processing Pattern (Detailed Business Logic)

```mermaid
flowchart TD
    START(["editHakkoSODccMap start"])
    KKSVC_MAP["Create kksv005003ccMap HashMap"]
    SET_DATA["param.setData KKSV005003CC -> kksv005003ccMap"]
    PUT_FUNC["kksv005003ccMap.put FUNC_CODE_KEY = FUNC_CD_1"]
    CREATE_LIST["Create trgt_data_list ArrayList"]
    CREATE_SOD_KIHON["Create sod_kihon_info HashMap"]
    SOD_PUT_SYSID["sod_kihon_info.put INFO_SYSID <- inHash SYSID"]
    SOD_PUT_IDO["sod_kihon_info.put INFO_IDO_DIV <- inHash IDO_DIV"]
    CREATE_SVC_KEI["Create svc_kei_info HashMap"]
    SVC_PUT_NO["svc_kei_info.put INFO_SVC_KEI_NO <- inHash SVC_KEI_NO"]
    SVC_PUT_SAKI["svc_kei_info.put INFO_SAKI_SVC_KEI_NO <- inHash SVC_KEI_NO"]
    GET_KK0341["Get kk0341Map from resultHash EKK0341B002"]
    J_SET["j = 0"]
    LOOP_START["Loop: for each Entry in opSvcKeiKeyMap"]
    GET_KEY["opSvcCd = entry.getKey()"]
    GET_PAIR["pair = entry.getValue()"]
    CREATE_OPINFO["Create opsvkei_info HashMap"]
    CHECK_CHBF{"opSvcCd matches B.* + _CHBF?"}
    EXTRACT_CHBF["Extract chbf_opSvcKeiNo and chbf_kk0351 from pair"]
    REMOVE_CHBF["opSvcCd = replace _CHBF suffix"]
    CHECK_SODFLAG{"sodTerm.get opSvcCd != null and true?"}
    SKIP_SOD["continue skip SOD issue"]
    PUT_OPINFO_CHBF["opsvkei_info.put INFO_CHBF_OPSVKEI_NO"]
    PUT_OPINFO_CHBF_DTM["opsvkei_info.put INFO_CHBF_OPSVKEI_GENE_ADD_DTM"]
    PUT_OPINFO_CHAF["opsvkei_info.put INFO_CHAF_OPSVKEI_NO"]
    PUT_OPINFO_CHAF_DTM["opsvkei_info.put INFO_CHAF_OPSVKEI_GENE_ADD_DTM"]
    GET_SBOP_MAP["Get kk0401Map from sbopSvcKeiKeyMap"]
    CHECK_SBOP{"kk0401Map not null and size > 0?"}
    LOOP_SBOP["Loop: for each sub-opsvkei pair"]
    CREATE_SBOPINFO["Create opsvkei_info401 HashMap"]
    COPY_ALL["opsvkei_info401.putAll opsvkei_info"]
    PUT_SBOP_CHAF["opsvkei_info401.put INFO_CHAF_SBOPSVKEI_NO and DTM"]
    CALL_SODMAP["getSODmap trgt_data_list j++"]
    PUT_OPINFO_IN_SOD["sod_map.put OPSVKEI_INFO opsvkei_info401"]
    CHECK_WARKMI{"WARKMI service AND kk0341Map not null?"}
    GET_KKTK_INFO["Get kktkSvcKeiNo and kk0341geneAddDtm"]
    CREATE_KKTSVKEI["Create kktsvkei_info HashMap"]
    PUT_KKTSVKEI_CHAF["kktsvkei_info.put INFO_CHAF_KKTSVKEI_NO and DTM"]
    CALL_SODMAP_KKTK["getSODmap trgt_data_list j-1"]
    PUT_KKTSVKEI_IN_SOD["sod_map.put KKTSVKEI_INFO kktsvkei_info"]
    CHECK_J_GT0{"j > 0?"}
    CREATE_SVC_UCWK["Create svc_kei_ucwk_info HashMap"]
    GET_KK0161["Get kk0161Map from resultHash EKK0161A010"]
    PUT_UCWK_NO["svc_kei_ucwk_info.put INFO_SVC_KEI_UCWK_NO"]
    PUT_UCWK_DTM["svc_kei_ucwk_info.put CHBF and AF GENE_ADD_DTM"]
    CALL_SODMAP_UCWK["getSODmap trgt_data_list i++"]
    PUT_UCWK_IN_SOD["sod_map.put SVC_KEI_UCWK_INFO svc_kei_ucwk_info"]
    SET_COMPKK["compkk0161Map = svc_kei_ucwk_info"]
    LOOP_TARGETS["Loop: for x = 0 to trgt_data_list.size"]
    GET_SOD_MAP["sod_map = trgt_data_list.get x"]
    PUT_SOD_KIHON["sod_map.put SOD_KIHON_INFO sod_kihon_info"]
    PUT_SVC_KEI_FULL["sod_map.put SVC_KEI_INFO svc_kei_info"]
    CHECK_SVC_UCWK{"svc_kei_ucwk_info null and compkk0161Map not null?"}
    PUT_SVC_UCWK_FULL["sod_map.put SVC_KEI_UCWK_INFO compkk0161Map fill-in"]
    CHECK_KKTK{"kktk_svc_kei_info null?"}
    PUT_KKTK_EMPTY["sod_map.put KKTSVKEI_INFO new HashMap fill-in"]
    FINAL_PUT["kksv005003ccMap.put TRGT_DATA_LIST trgt_data_list"]
    END_NODE(["Return / Next"])

    START --> KKSVC_MAP --> SET_DATA --> PUT_FUNC --> CREATE_LIST
    CREATE_LIST --> CREATE_SOD_KIHON --> SOD_PUT_SYSID --> SOD_PUT_IDO
    SOD_PUT_IDO --> CREATE_SVC_KEI --> SVC_PUT_NO --> SVC_PUT_SAKI
    SVC_PUT_SAKI --> GET_KK0341 --> J_SET --> LOOP_START
    LOOP_START --> GET_KEY --> GET_PAIR --> CREATE_OPINFO
    CREATE_OPINFO --> CHECK_CHBF
    CHECK_CHBF -- Yes --> EXTRACT_CHBF --> REMOVE_CHBF
    CHECK_CHBF -- No --> CHECK_SODFLAG
    REMOVE_CHBF --> CHECK_SODFLAG
    CHECK_SODFLAG -- No --> SKIP_SOD --> LOOP_START
    CHECK_SODFLAG -- Yes --> PUT_OPINFO_CHBF --> PUT_OPINFO_CHBF_DTM
    PUT_OPINFO_CHBF_DTM --> PUT_OPINFO_CHAF --> PUT_OPINFO_CHAF_DTM --> GET_SBOP_MAP --> CHECK_SBOP
    CHECK_SBOP -- Yes --> LOOP_SBOP --> CREATE_SBOPINFO --> COPY_ALL --> PUT_SBOP_CHAF --> CALL_SODMAP --> PUT_OPINFO_IN_SOD --> LOOP_START
    CHECK_SBOP -- No --> CALL_SODMAP --> PUT_OPINFO_IN_SOD --> LOOP_START
    LOOP_START --> CHECK_WARKMI
    CHECK_WARKMI -- Yes --> GET_KKTK_INFO --> CREATE_KKTSVKEI --> PUT_KKTSVKEI_CHAF --> CALL_SODMAP_KKTK --> PUT_KKTSVKEI_IN_SOD --> LOOP_START
    CHECK_WARKMI -- No --> LOOP_START
    LOOP_START --> CHECK_J_GT0
    CHECK_J_GT0 -- Yes --> GET_KK0161 --> CREATE_SVC_UCWK --> PUT_UCWK_NO --> PUT_UCWK_DTM --> CALL_SODMAP_UCWK --> PUT_UCWK_IN_SOD --> SET_COMPKK
    CHECK_J_GT0 -- No --> LOOP_TARGETS
    SET_COMPKK --> LOOP_TARGETS
    LOOP_TARGETS --> GET_SOD_MAP --> PUT_SOD_KIHON --> PUT_SVC_KEI_FULL --> CHECK_SVC_UCWK
    CHECK_SVC_UCWK -- Yes --> PUT_SVC_UCWK_FULL --> CHECK_KKTK
    CHECK_SVC_UCWK -- No --> CHECK_KKTK
    CHECK_KKTK -- Yes --> PUT_KKTK_EMPTY --> LOOP_TARGETS
    CHECK_KKTK -- No --> LOOP_TARGETS
    LOOP_TARGETS --> FINAL_PUT --> END_NODE
```

## 3. Parameter Analysis

| No | Parameter Name | Type | Business Description |
|----|---------------|------|---------------------|
| 1 | `param` | `IRequestParameterReadWrite` | The request parameter object used to store output data. Specifically, the method sets the assembled SOD data map under the key `KKSV005003CC`, which is consumed by the SOD issuance component downstream. |
| 2 | `inHash` | `HashMap<String, Object>` | Input data map carrying core business identifiers needed for SOD creation: `SYSID` (system ID), `IDO_DIV` (migration division), and `SVC_KEI_NO` (service contract number). These values are embedded into every SOD map entry. |
| 3 | `resultHash` | `HashMap<String, Object>` | Result data map populated by prior service inquiry SC calls. Contains `EKK0341B002` (equipment provision service contract listing for service contract number) and `EKK0161A010` (service contract detail consent meeting) data used to enrich the SOD maps. |

**Instance fields read by this method:**

| Field | Type | Business Description |
|-------|------|---------------------|
| `opSvcKeiKeyMap` | `Map<String, String[]>` | Operational service contract key map, keyed by operation service code. Values are string arrays of `[contract number, generation registration datetime]`. Defines the iteration scope. |
| `sbopSvcKeiKeyMap` | `Map<String, Map<String, String[]>>` | Sub-operational service contract key map, keyed by the after-change operational service contract number. Contains sub-operational contract numbers and timestamps. |
| `sodTerm` | `Map<String, Boolean>` | SOD issuance eligibility flag map. Keyed by operation service code; if the flag is `null` or `false`, the contract is excluded from SOD processing. |

## 4. CRUD Operations / Called Services

| CRUD | SC / CBS | SC Code | Entity / DB | Operation Description |
|------|----------|---------|-------------|----------------------|
| R | `resultHash.get(TEMPLATE_ID_EKK0341B002)` | - | Equipment Provision Service Contract Listing | Reads equipment provision service contract data from the pre-fetched result hash to retrieve service contract number and generation datetime. |
| R | `resultHash.get(TEMPLATE_ID_EKK0161A010)` | - | Service Contract Detail Consent Meeting | Reads service contract detail information from the pre-fetched result hash to obtain the service contract detail number and registration datetime. |
| R | `sodTerm.get(opSvcCd)` | - | SOD Issuance Eligibility Map | Checks the SOD issuance flag to determine if this contract requires SOD generation. |
| R | `sbopSvcKeiKeyMap.get(pair[NO_POS])` | - | Sub-Operational Service Contract Map | Looks up sub-operational service contracts associated with the current operational service contract. |
| - | `opSvcKeiKeyMap.entrySet()` | - | Operational Service Contract Key Map | Iterates over the operational service contract keys to process each eligible contract. |
| - | `getSODmap(trgt_data_list, pos)` | - | SOD Map Builder (private method) | Retrieves an existing HashMap at a given position in the target list, or creates a new one if not available. Returns a SOD info HashMap to be populated. |
| - | `param.setData(KKSV005003CC, kksv005003ccMap)` | - | Request Parameter Data Store | Sets the assembled SOD data map into the request parameter object. |
| - | `kksv005003ccMap.put(JCMConstants.FUNC_CODE_KEY, ...)` | - | Function Code Assignment | Sets the function code to `1` (FUNC_CD_1) for processing context identification. |

## 5. Dependency Trace

| # | Caller (Screen/Batch) | Call Chain (Full Path to this Method) | Terminal (SC / CRUD / Entity) |
|---|----------------------|--------------------------------------|-------------------------------|
| 1 | CC:JKKOpsvkeiTelIktAddCC.mainProc() | `mainProc()` -> `editHakkoSODccMap()` | `getSODmap [R] SOD map entry`, `getValue [-]`, `setValue [-]` |

**Notes:** The only direct caller is `mainProc()` within the same class `JKKOpsvkeiTelIktAddCC`. This method is invoked as part of the telephone option one-step registration flow (screen KKSV0050), after service contract detail inquiry and equipment provision service contract listing SC calls have been executed and their results stored in `wkResultHash`.

## 6. Per-Branch Detail Blocks

**Block 1** — [SET/INIT] `(setup output map)` (L2330)

> Initialize the output container map under the `KKSV005003CC` key in the request parameter, and set the function code for processing identification.

| # | Type | Code |
|---|------|------|
| 1 | SET | `kksv005003ccMap = new HashMap<String, Object>()` |
| 2 | EXEC | `param.setData(KKSV0050_KKSV0050OP.KKSV005003CC, kksv005003ccMap)` |
| 3 | SET | `kksv005003ccMap.put(JCMConstants.FUNC_CODE_KEY, JPCModelConstant.FUNC_CD_1)` [-> `FUNC_CODE_KEY = "func_code"`, `FUNC_CD_1 = "1"`] |
| 4 | SET | `trgt_data_list = new ArrayList<HashMap<String, Object>>()` |

**Block 2** — [SET/INIT] `(SOD basic info preparation)` (L2336)

> Build the SOD basic info map with system ID and migration division from the input hash.

| # | Type | Code |
|---|------|------|
| 1 | SET | `sod_kihon_info = new HashMap<String, Object>()` |
| 2 | SET | `sod_kihon_info.put(JKKHakkoSODConstCC.INFO_SYSID, inHash.get(SYSID))` [-> `INFO_SYSID = "sysid"`] |
| 3 | SET | `sod_kihon_info.put(JKKHakkoSODConstCC.INFO_IDO_DIV, inHash.get(IDO_DIV))` [-> `INFO_IDO_DIV = "ido_div"`] |

**Block 3** — [SET/INIT] `(Service contract info preparation)` (L2344)

> Build the service contract info map. Sets both the current service contract number and the "after" service contract number to the same value (no migration of contract number).

| # | Type | Code |
|---|------|------|
| 1 | SET | `svc_kei_info = new HashMap<String, Object>()` |
| 2 | SET | `svc_kei_info.put(JKKHakkoSODConstCC.INFO_SVC_KEI_NO, inHash.get(SVC_KEI_NO))` [-> `INFO_SVC_KEI_NO = "svc_kei_no"`] |
| 3 | SET | `svc_kei_info.put(JKKHakkoSODConstCC.INFO_SAKI_SVC_KEI_NO, inHash.get(SVC_KEI_NO))` [-> `INFO_SAKI_SVC_KEI_NO = "saki_svc_kei_no"`] |

**Block 4** — [SET/INIT] `(Equipment provision service contract lookup)` (L2350)

> Retrieves equipment provision service contract data from the result hash, which is later used for bundled telecom service scenarios (WARKMI).

| # | Type | Code |
|---|------|------|
| 1 | SET | `kk0341Map = (HashMap<String, Object>) resultHash.get(TEMPLATE_ID_EKK0341B002)` [-> `TEMPLATE_ID_EKK0341B002 = "EKK0341B002"`] |

**Block 5** — [FOR LOOP] `(Iterate over operational service contracts)` (L2354)

> Core processing loop. For each operational service contract key in `opSvcKeiKeyMap`, builds an operational service contract info map with before/after change values, optionally includes sub-operational service contracts, and adds equipment provision info for WARKMI (telecom option) services.

| # | Type | Code |
|---|------|------|
| 1 | SET | `j = 0` |
| 2 | EXEC | `for (Entry<String, String[]> e : opSvcKeiKeyMap.entrySet())` |

**Block 5.1** — [IF] `(CHBF suffix removal)` `[CHBF_KEY="_CHBF"]` (L2371)

> If the operation service code matches the pattern `B[0-9]+_CHBF` (indicating a port phone option addition), extracts the before-change values and strips the `_CHBF` suffix from the code. This is a fix for ST3-2013-0000603 where SOD is not issued during port phone option addition.

| # | Type | Code |
|---|------|------|
| 1 | SET | `opSvcCd = entry.getKey()`, `pair = entry.getValue()` |
| 2 | SET | `chbf_opSvcKeiNo = null`, `chbf_kk0351_geneAddDtm = null` |
| 3 | IF | `opSvcCd.matches("B[0-9]+" + CHBF_KEY)` [-> `CHBF_KEY = "_CHBF"`] |
| 4 | SET | `chbf_opSvcKeiNo = pair[NO_POS]` [-> `NO_POS = 0`] |
| 5 | SET | `chbf_kk0351_geneAddDtm = pair[GE_POS]` [-> `GE_POS = 1`] |
| 6 | SET | `wkOpSvcCd = opSvcCd.replace(CHBF_KEY, "")` |
| 7 | SET | `opSvcCd = wkOpSvcCd` (strip `_CHBF` suffix) |

**Block 5.2** — [IF] `(SOD issuance eligibility check)` (L2383)

> Skips contracts that do not have SOD issuance flagged in `sodTerm`. The map is keyed by operation service code; if absent or `false`, the contract is not eligible for SOD creation.

| # | Type | Code |
|---|------|------|
| 1 | SET | `canPutSOD = sodTerm.get(opSvcCd)` |
| 2 | IF | `null == canPutSOD || !canPutSOD` |
| 3 | EXEC | `continue` (skip this iteration) |

**Block 5.3** — [SET] `(Build operational service contract info)` (L2390)

> Populates the before-change and after-change contract number and generation datetime values for the operational service contract info map.

| # | Type | Code |
|---|------|------|
| 1 | SET | `opsvkei_info = new HashMap<String, Object>()` |
| 2 | SET | `opsvkei_info.put(JKKHakkoSODConstCC.INFO_CHBF_OPSVKEI_NO, chbf_opSvcKeiNo)` [-> `INFO_CHBF_OPSVKEI_NO = "chbf_opsvkei_no"`] |
| 3 | SET | `opsvkei_info.put(JKKHakkoSODConstCC.INFO_CHBF_OPSVKEI_GENE_ADD_DTM, chbf_kk0351_geneAddDtm)` [-> `INFO_CHBF_OPSVKEI_GENE_ADD_DTM = "chbf_opsvkei_gene_add_dtm"`] |
| 4 | SET | `opsvkei_info.put(JKKHakkoSODConstCC.INFO_CHAF_OPSVKEI_NO, pair[NO_POS])` [-> `INFO_CHAF_OPSVKEI_NO = "chaf_opsvkei_no"`] |
| 5 | SET | `opsvkei_info.put(JKKHakkoSODConstCC.INFO_CHAF_OPSVKEI_GENE_ADD_DTM, pair[GE_POS])` [-> `INFO_CHAF_OPSVKEI_GENE_ADD_DTM = "chaf_opsvkei_gene_add_dtm"`] |

**Block 5.4** — [IF] `(Sub-operational service contract processing)` (L2401)

> If sub-operational service contracts exist for this operational service contract (after-change number), creates a copy of the operational service contract info for each sub-operational contract, copying all fields but setting the before-change sub-contract number to null and the after-change values from the sub-operational contract.

| # | Type | Code |
|---|------|------|
| 1 | SET | `kk0401Map = sbopSvcKeiKeyMap.get(pair[NO_POS])` |
| 2 | IF | `null != kk0401Map && 0 < kk0401Map.size()` |
| 3 | EXEC | `for (String[] sbPair : kk0401Map.values())` |
| 4 | SET | `opsvkei_info401 = new HashMap<String, Object>()` |
| 5 | EXEC | `opsvkei_info401.putAll(opsvkei_info)` |
| 6 | SET | `opsvkei_info401.put(JKKHakkoSODConstCC.INFO_CHBF_SBOPSVKEI_NO, null)` [-> `INFO_CHBF_SBOPSVKEI_NO = "chbf_sbopsvkei_no"`] |
| 7 | SET | `opsvkei_info401.put(JKKHakkoSODConstCC.INFO_CHBF_SBOPSVKEI_GENE_ADD_DTM, null)` [-> `INFO_CHBF_SBOPSVKEI_GENE_ADD_DTM = "chbf_sbopsvkei_gene_add_dtm"`] |
| 8 | SET | `opsvkei_info401.put(JKKHakkoSODConstCC.INFO_CHAF_SBOPSVKEI_NO, sbPair[NO_POS])` [-> `INFO_CHAF_SBOPSVKEI_NO = "chaf_sbopsvkei_no"`] |
| 9 | SET | `opsvkei_info401.put(JKKHakkoSODConstCC.INFO_CHAF_SBOPSVKEI_GENE_ADD_DTM, sbPair[GE_POS])` [-> `INFO_CHAF_SBOPSVKEI_GENE_ADD_DTM = "chaf_sbopsvkei_gene_add_dtm"`] |
| 10 | CALL | `sod_map = getSODmap(trgt_data_list, j++)` |
| 11 | SET | `sod_map.put(JKKHakkoSODConstCC.OPSVKEI_INFO, opsvkei_info401)` [-> `OPSVKEI_INFO = "opsvkei_info"`] |

**Block 5.5** — [ELSE] `(No sub-operational service contracts)` (L2418)

> When no sub-operational service contracts exist, creates a single SOD map entry with the operational service contract info directly.

| # | Type | Code |
|---|------|------|
| 1 | CALL | `sod_map = getSODmap(trgt_data_list, j++)` |
| 2 | SET | `sod_map.put(JKKHakkoSODConstCC.OPSVKEI_INFO, opsvkei_info)` |

**Block 5.6** — [IF] `(WARKMI bundled service - equipment provision contract info)` (L2424)

> When the operation service code is the bundled telecom option service code (`B023`) and equipment provision data is available, also sets the equipment provision service contract info in the SOD map. Both before-change and after-change values are the same (no contract number change).

| # | Type | Code |
|---|------|------|
| 1 | IF | `JKKSvcConst.OP_SVC_CD_WARKMI.equals(opSvcCd) && null != kk0341Map` [-> `OP_SVC_CD_WARKMI = "B023"`] |
| 2 | SET | `kktkSvcKeiNo = kk0341Map.get(EKK0341B002CBSMsg1List.KKTK_SVC_KEI_NO)` |
| 3 | SET | `kk0341geneAddDtm = kk0341Map.get(EKK0341B002CBSMsg1List.GENE_ADD_DTM)` |
| 4 | SET | `kktsvkei_info = new HashMap<String, Object>()` |
| 5 | SET | `kktsvkei_info.put(JKKHakkoSODConstCC.INFO_CHBF_KKTSVKEI_NO, kktkSvcKeiNo)` [-> `INFO_CHBF_KKTSVKEI_NO = "chbf_kktsvkei_no"`] |
| 6 | SET | `kktsvkei_info.put(JKKHakkoSODConstCC.INFO_CHBF_KKTSVKEI_GENE_ADD_DTM, kk0341geneAddDtm)` [-> `INFO_CHBF_KKTSVKEI_GENE_ADD_DTM = "chbf_kktsvkei_gene_add_dtm"`] |
| 7 | SET | `kktsvkei_info.put(JKKHakkoSODConstCC.INFO_CHAF_KKTSVKEI_NO, kktkSvcKeiNo)` [-> `INFO_CHAF_KKTSVKEI_NO = "chaf_kktsvkei_no"`] |
| 8 | SET | `kktsvkei_info.put(JKKHakkoSODConstCC.INFO_CHAF_KKTSVKEI_GENE_ADD_DTM, kk0341geneAddDtm)` [-> `INFO_CHAF_KKTSVKEI_GENE_ADD_DTM = "chaf_kktsvkei_gene_add_dtm"`] |
| 9 | CALL | `sod_map = getSODmap(trgt_data_list, j-1)` (reuse the last SOD map entry) |
| 10 | SET | `sod_map.put(JKKHakkoSODConstCC.KKTSVKEI_INFO, kktsvkei_info)` [-> `KKTSVKEI_INFO = "kktsvkei_info"`] |

**Block 6** — [IF] `(Service contract detail info completion)` `[j > 0]` (L2442)

> If at least one operational service contract was processed (`j > 0`), retrieve service contract detail information from the pre-fetched `EKK0161A010` result and create a service contract detail info map to fill into the SOD maps.

| # | Type | Code |
|---|------|------|
| 1 | IF | `0 < j` |
| 2 | SET | `svc_kei_ucwk_info = new HashMap<String, Object>()` |
| 3 | SET | `kk0161Map = (HashMap<String, Object>) resultHash.get(TEMPLATE_ID_EKK0161A010)` [-> `TEMPLATE_ID_EKK0161A010 = "EKK0161A010"`] |
| 4 | SET | `svc_kei_ucwk_info.put(JKKHakkoSODConstCC.INFO_SVC_KEI_UCWK_NO, kk0161Map.get(EKK0161A010CBSMsg1List.SVC_KEI_UCWK_NO))` [-> `INFO_SVC_KEI_UCWK_NO = "svc_kei_ucwk_no"`] |
| 5 | SET | `svc_kei_ucwk_info.put(JKKHakkoSODConstCC.INFO_CHBF_SVC_KEI_UCWK_GENE_ADD_DTM, kk0161Map.get(EKK0161A010CBSMsg1List.GENE_ADD_DTM))` [-> `INFO_CHBF_SVC_KEI_UCWK_GENE_ADD_DTM = "chbf_svc_kei_ucwk_gene_add_dtm"`] |
| 6 | SET | `svc_kei_ucwk_info.put(JKKHakkoSODConstCC.INFO_CHAF_SVC_KEI_UCWK_GENE_ADD_DTM, kk0161Map.get(EKK0161A010CBSMsg1List.GENE_ADD_DTM))` [-> `INFO_CHAF_SVC_KEI_UCWK_GENE_ADD_DTM = "chaf_svc_kei_ucwk_gene_add_dtm"`] |
| 7 | CALL | `sod_map = getSODmap(trgt_data_list, i++)` |
| 8 | SET | `sod_map.put(JKKHakkoSODConstCC.SVC_KEI_UCWK_INFO, svc_kei_ucwk_info)` [-> `SVC_KEI_UCWK_INFO = "svc_kei_ucwk_info"`] |
| 9 | SET | `compkk0161Map = svc_kei_ucwk_info` (cache for fill-in later) |

**Block 7** — [FOR LOOP] `(Fill SOD maps with common info and complete missing fields)` (L2454)

> Iterates over all SOD map entries in the target list and populates each one with: SOD basic info, service contract info, service contract detail info (with fill-in from `compkk0161Map` if not already set), and equipment provision service contract info (with fill-in of an empty HashMap if not present).

| # | Type | Code |
|---|------|------|
| 1 | EXEC | `for (int x = 0; x < trgt_data_list.size(); x++)` |
| 2 | SET | `sod_map = trgt_data_list.get(x)` |
| 3 | SET | `sod_map.put(JKKHakkoSODConstCC.SOD_KIHON_INFO, sod_kihon_info)` [-> `SOD_KIHON_INFO = "sod_kihon_info"`] |
| 4 | SET | `sod_map.put(JKKHakkoSODConstCC.SVC_KEI_INFO, svc_kei_info)` [-> `SVC_KEI_INFO = "svc_kei_info"`] |
| 5 | SET | `svc_kei_ucwk_info = (Map<?, ?>) sod_map.get(JKKHakkoSODConstCC.SVC_KEI_UCWK_INFO)` |
| 6 | IF | `null == svc_kei_ucwk_info && null != compkk0161Map` |
| 7 | SET | `sod_map.put(JKKHakkoSODConstCC.SVC_KEI_UCWK_INFO, compkk0161Map)` // fill-in |
| 8 | SET | `kktk_svc_kei_info = (Map<?, ?>) sod_map.get(JKKHakkoSODConstCC.KKTSVKEI_INFO)` |
| 9 | IF | `null == kktk_svc_kei_info` |
| 10 | SET | `sod_map.put(JKKHakkoSODConstCC.KKTSVKEI_INFO, new HashMap<String, Object>())` // fill-in with empty map |

**Block 8** — [SET] `(Final assignment)` (L2470)

> Sets the complete target data list into the output container map under the `TRGT_DATA_LIST` key.

| # | Type | Code |
|---|------|------|
| 1 | SET | `kksv005003ccMap.put(JKKHakkoSODConstCC.TRGT_DATA_LIST, trgt_data_list)` [-> `TRGT_DATA_LIST = "trgt_data_list"`] |

## 7. Glossary

| Term | Type | Business Meaning |
|------|------|------------------|
| `svc_kei_no` | Field | Service contract number — the unique identifier for a service contract line item in the telecom service billing system |
| `svc_kei_ucwk_no` | Field | Service contract detail number — internal tracking ID for service contract line item details (e.g., circuit details, add-ons) |
| `op_svc_cd` | Field | Operation service code — code identifying the type of operation (add/change/delete) applied to a service, e.g., `B023` for bundled telecom option (WARKMI) |
| `ido_div` | Field | Migration division — indicates the type of migration/porting scenario being processed |
| `sysid` | Field | System ID — identifies the system origin of the SOD request |
| `chbf_opsvkei_no` | Field | Before-change operational service contract number — the contract number before an operation (change) is applied |
| `chaf_opsvkei_no` | Field | After-change operational service contract number — the contract number after an operation (change) is applied |
| `chbf_opsvkei_gene_add_dtm` | Field | Before-change operational service contract generation registration datetime — the timestamp when the before-change contract record was registered |
| `chaf_opsvkei_gene_add_dtm` | Field | After-change operational service contract generation registration datetime — the timestamp when the after-change contract record was registered |
| `chbf_sbopsvkei_no` | Field | Before-change sub-operational service contract number — always `null` in this method (sub-contracts do not have before-change values) |
| `chaf_sbopsvkei_no` | Field | After-change sub-operational service contract number — the sub-contract number associated with the main operational contract |
| `kktsvkei_no` | Field | Equipment provision service contract number — the contract number for equipment provisioning linked to a service contract |
| SOD | Acronym | Service Order Data — the data structure used to issue orders for telecom service activation/change in the order fulfillment system |
| WARKMI | Business term | Bundled Telecom Option Service (WARKMI = "WariKomi" in Japanese) — service code `B023` for bundled telecom service contracts where equipment is provisioned alongside the service |
| `_CHBF` | Constant | Port Phone Option Addition suffix — appended to operation service codes for port phone option additions; stripped during SOD map assembly per bug fix ST3-2013-0000603 |
| FTTH | Business term | Fiber To The Home — fiber-optic broadband internet service (relevant in the broader K-Opticom service catalog) |
| EKK0081A010 | SC Code | Service Contract Consent Meeting SC — retrieves service contract agreement data |
| EKK0161A010 | SC Code | Service Contract Detail Consent Meeting SC — retrieves service contract detail (circuit/add-on) data |
| EKK0341B002 | SC Code | Equipment Provision Service Contract Listing (by service contract number) SC — retrieves equipment provision service contract data |
| EKK0251B003 | SC Code | Service Contract Circuit Detail Listing (currently in use) SC — retrieves circuit detail data |
| KKSV0050 | Screen | Telephone Option One-Step Registration Screen — the customer-facing screen where customers register/modify telephone options |
| FUNC_CD_1 | Constant | Function code `1` — identifies the processing function type in the SOD issuance data map |
| INFO_SYSID | Constant | SOD basic info field key `sysid` — system identifier for SOD generation |
| INFO_IDO_DIV | Constant | SOD basic info field key `ido_div` — migration division identifier for SOD |
| TRGT_DATA_LIST | Constant | Output key `trgt_data_list` — the ArrayList of SOD maps stored in the output container |
| OPSVKEI_INFO | Constant | SOD map entry key `opsvkei_info` — holds operational service contract details within an SOD map |
| SVC_KEI_INFO | Constant | SOD map entry key `svc_kei_info` — holds service contract details within an SOD map |
| SVC_KEI_UCWK_INFO | Constant | SOD map entry key `svc_kei_ucwk_info` — holds service contract detail info within an SOD map |
| KKTSVKEI_INFO | Constant | SOD map entry key `kktsvkei_info` — holds equipment provision service contract info within an SOD map |
| SOD_KIHON_INFO | Constant | SOD map entry key `sod_kihon_info` — holds SOD basic info (system ID, migration division) within an SOD map |
| `opSvcKeiKeyMap` | Instance field | Operational service contract key map — keyed by operation service code, values are `[contract number, generation datetime]` arrays |
| `sbopSvcKeiKeyMap` | Instance field | Sub-operational service contract key map — keyed by after-change operational service contract number, contains sub-operational contract details |
| `sodTerm` | Instance field | SOD issuance eligibility flag map — keyed by operation service code, `true` means SOD should be generated for this contract |
| KKSV005003CC | Constant | Output key `KKSV005003CC` — the key under which the SOD data map is stored in the request parameter object |
