# Business Logic — KKW02701SF01DBean.storeModelData() [247 LOC]

| Field | Value |
|-------|-------|
| Fully Qualified Name | `eo.web.webview.KKW02701SF.KKW02701SF01DBean` |
| Layer | View / Data-Binding (Web Bean layer — sits between screen controllers and model data) |
| Module | `KKW02701SF` (Package: `eo.web.webview.KKW02701SF`) |

## 1. Role

### KKW02701SF01DBean.storeModelData()

This method is the central data-binding dispatch router for the **telecom service contract change** screen (KKW02701SF). It receives a field name (in Japanese) as a `key` string and a subkey (`"value"` or `"state"`), then routes the incoming `in_value` to the appropriate typed setter method on this data bean. It acts as the single entry point for all screen-level model-data writes, enabling a unified bind/update protocol across 24 distinct business fields.

The method implements the **routing/dispatch** pattern: a cascading if-else chain matching the Japanese field name to a handler block. Most fields follow a simple two-branch structure — `"value"` triggers a `setXxx_value()` setter, while `"state"` triggers a `setXxx_state()` setter. Two fields — "異動理由コード" (Change Reason Code) and "オプションサービス契約番号" (Optional Service Contract Number) — are list-based: they extract an index from the key (e.g., `"hktgi_ido_rsn_cd/0"`), validate it against the list size, and delegate to a nested `X33VDataTypeStringBean.storeModelData()`, enabling recursive data binding for arbitrary-length item lists.

Its role in the larger system is that of a **shared data-population utility** — called by screen controllers and invoking components during screen initialization, form submission, and AJAX partial-refresh cycles. It allows downstream code to write screen data using a string-keyed API without needing compile-time knowledge of individual bean fields, enabling dynamic UI bindings and template-driven data population.

## 2. Processing Pattern (Detailed Business Logic)

```mermaid
flowchart TD
    START(["storeModelData key, subkey, in_value, isSetAsString"])
    NULL_CHECK{"key or subkey null?"}
    SEPARATOR["Find / in key"]
    SYSID{"key = \"SYSID\""}
    SVC_CONTRACT{"key = \"サービス契約番号\""}
    DIVISION{"key = \"異動区分\""}
    REASON_CD{"key = \"異動理由コード\""}
    REASON_MEMO{"key = \"異動理由メモ\""}
    OPT_SVC{"key = \"オプションサービス契約番号\""}
    TRAN_DIV{"key = \"処理区分\""}
    MSKM_NO{"key = \"申込番号\""}
    MSKM_DTL{"key = \"申込明細番号\""}
    TOKU_ID_KMK{"key = \"特定ID項目名\""}
    TOKU_ID_VAL{"key = \"特定ID項目値\""}
    POPUP_MODE{"key = \"ポップアップモード\""}
    SVC_CD{"key = \"サービスコード\""}
    PRCS_GRP{"key = \"料金グループコード\""}
    PRCS_CD{"key = \"料金コースコード\""}
    PPLAN_CD{"key = \"料金プランコード\""}
    BF_SVC{"key = \"変更前サービスコード\""}
    BF_PRCS{"key = \"変更前料金コースコード\""}
    BF_GRP{"key = \"変更前料金グループコード\""}
    BF_PPLAN{"key = \"変更前料金プランコード\""}
    WRIB_FLG{"key = \"割引自動適用対象外フラグ\""}
    RETURN_EARLY(["return - abort"])
    SYSID_VAL["setHktgi_sysid_value"]
    SYSID_STATE["setHktgi_sysid_state"]
    SVC_VAL["setHktgi_svc_kei_no_value"]
    SVC_STATE["setHktgi_svc_kei_no_state"]
    DIV_VAL["setHktgi_ido_div_value"]
    DIV_STATE["setHktgi_ido_div_state"]
    REASON_MEMO_VAL["setHktgi_ido_rsn_memo_value"]
    REASON_MEMO_STATE["setHktgi_ido_rsn_memo_state"]
    OPT_VAL["setHktgi_op_svc_kei_no_value"]
    OPT_STATE["setHktgi_op_svc_kei_no_state"]
    TRAN_VAL["setHktgi_tran_div_value"]
    TRAN_STATE["setHktgi_tran_div_state"]
    MSKM_VAL["setHktgi_mskm_no_value"]
    MSKM_STATE["setHktgi_mskm_no_state"]
    MSKM_DTL_VAL["setHktgi_mskm_dtl_no_value"]
    MSKM_DTL_STATE["setHktgi_mskm_dtl_no_state"]
    TOKU_KMK_VAL["setHktgi_tokutei_id_kmk_nm_value"]
    TOKU_KMK_STATE["setHktgi_tokutei_id_kmk_nm_state"]
    TOKU_VAL_VAL["setHktgi_tokutei_id_kmk_value_value"]
    TOKU_VAL_STATE["setHktgi_tokutei_id_kmk_value_state"]
    POPUP_VAL["setHktgi_popup_mode_value"]
    POPUP_STATE["setHktgi_popup_mode_state"]
    SVC_CD_VAL["setHktgi_svc_cd_value"]
    SVC_CD_STATE["setHktgi_svc_cd_state"]
    PRCS_GRP_VAL["setHktgi_prc_grp_cd_value"]
    PRCS_GRP_STATE["setHktgi_prc_grp_cd_state"]
    PRCS_CD_VAL["setHktgi_prcs_cd_value"]
    PRCS_CD_STATE["setHktgi_prcs_cd_state"]
    PPLAN_VAL["setHktgi_pplan_cd_value"]
    PPLAN_STATE["setHktgi_pplan_cd_state"]
    BF_SVC_VAL["setHktgi_svc_cd_bf_value"]
    BF_SVC_STATE["setHktgi_svc_cd_bf_state"]
    BF_PRCS_VAL["setHktgi_prcs_cd_bf_value"]
    BF_PRCS_STATE["setHktgi_prcs_cd_bf_state"]
    BF_GRP_VAL["setHktgi_prc_grp_cd_bf_value"]
    BF_GRP_STATE["setHktgi_prc_grp_cd_bf_state"]
    BF_PPLAN_VAL["setHktgi_pplan_cd_bf_value"]
    BF_PPLAN_STATE["setHktgi_pplan_cd_bf_state"]
    WRIB_VAL["setHktgi_wrib_auto_aply_tg_gai_flg_value"]
    WRIB_STATE["setHktgi_wrib_auto_aply_tg_gai_flg_state"]
    REASON_LIST["List-based routing - extract index, delegate to X33VDataTypeStringBean"]
    OPT_LIST["List-based routing - extract index, delegate to X33VDataTypeStringBean"]
    END_NODE(["Return / Next"])

    START --> NULL_CHECK
    NULL_CHECK -- Yes --> RETURN_EARLY
    NULL_CHECK -- No --> SEPARATOR
    SEPARATOR --> SYSID
    SYSID -- Yes --> SYSID_VAL
    SYSID -- No --> SVC_CONTRACT
    SYSID_STATE --> DIVISION
    SYSID_VAL --> SVC_CONTRACT
    SVC_CONTRACT -- Yes --> SVC_VAL
    SVC_CONTRACT -- No --> DIVISION
    SVC_VAL --> DIVISION
    SVC_STATE --> DIVISION
    DIVISION -- Yes --> DIV_VAL
    DIVISION -- No --> REASON_CD
    DIV_VAL --> REASON_CD
    DIV_STATE --> REASON_CD
    REASON_CD -- Yes --> REASON_LIST
    REASON_CD -- No --> REASON_MEMO
    REASON_LIST --> REASON_MEMO
    REASON_MEMO -- Yes --> REASON_MEMO_VAL
    REASON_MEMO -- No --> OPT_SVC
    REASON_MEMO_VAL --> OPT_SVC
    REASON_MEMO_STATE --> OPT_SVC
    OPT_SVC -- Yes --> OPT_LIST
    OPT_SVC -- No --> TRAN_DIV
    OPT_LIST --> TRAN_DIV
    OPT_VAL --> TRAN_DIV
    OPT_STATE --> TRAN_DIV
    TRAN_DIV -- Yes --> TRAN_VAL
    TRAN_DIV -- No --> MSKM_NO
    TRAN_VAL --> MSKM_NO
    TRAN_STATE --> MSKM_NO
    MSKM_NO -- Yes --> MSKM_VAL
    MSKM_NO -- No --> MSKM_DTL
    MSKM_VAL --> MSKM_DTL
    MSKM_STATE --> MSKM_DTL
    MSKM_DTL -- Yes --> MSKM_DTL_VAL
    MSKM_DTL -- No --> TOKU_ID_KMK
    MSKM_DTL_VAL --> TOKU_ID_KMK
    MSKM_DTL_STATE --> TOKU_ID_KMK
    TOKU_ID_KMK -- Yes --> TOKU_KMK_VAL
    TOKU_ID_KMK -- No --> TOKU_ID_VAL
    TOKU_KMK_VAL --> TOKU_ID_VAL
    TOKU_KMK_STATE --> TOKU_ID_VAL
    TOKU_ID_VAL -- Yes --> TOKU_VAL_VAL
    TOKU_ID_VAL -- No --> POPUP_MODE
    TOKU_VAL_VAL --> POPUP_MODE
    TOKU_VAL_STATE --> POPUP_MODE
    POPUP_MODE -- Yes --> POPUP_VAL
    POPUP_MODE -- No --> SVC_CD
    POPUP_VAL --> SVC_CD
    POPUP_STATE --> SVC_CD
    SVC_CD -- Yes --> SVC_CD_VAL
    SVC_CD -- No --> PRCS_GRP
    SVC_CD_VAL --> PRCS_GRP
    SVC_CD_STATE --> PRCS_GRP
    PRCS_GRP -- Yes --> PRCS_GRP_VAL
    PRCS_GRP -- No --> PRCS_CD
    PRCS_GRP_VAL --> PRCS_CD
    PRCS_GRP_STATE --> PRCS_CD
    PRCS_CD -- Yes --> PRCS_CD_VAL
    PRCS_CD -- No --> PPLAN_CD
    PRCS_CD_VAL --> PPLAN_CD
    PRCS_CD_STATE --> PPLAN_CD
    PPLAN_CD -- Yes --> PPLAN_VAL
    PPLAN_CD -- No --> BF_SVC
    PPLAN_VAL --> BF_SVC
    PPLAN_STATE --> BF_SVC
    BF_SVC -- Yes --> BF_SVC_VAL
    BF_SVC -- No --> BF_PRCS
    BF_SVC_VAL --> BF_PRCS
    BF_SVC_STATE --> BF_PRCS
    BF_PRCS -- Yes --> BF_PRCS_VAL
    BF_PRCS -- No --> BF_GRP
    BF_PRCS_VAL --> BF_GRP
    BF_PRCS_STATE --> BF_GRP
    BF_GRP -- Yes --> BF_GRP_VAL
    BF_GRP -- No --> BF_PPLAN
    BF_GRP_VAL --> BF_PPLAN
    BF_GRP_STATE --> BF_PPLAN
    BF_PPLAN -- Yes --> BF_PPLAN_VAL
    BF_PPLAN -- No --> END_NODE
    BF_PPLAN_VAL --> WRIB_FLG
    BF_PPLAN_STATE --> WRIB_FLG
    WRIB_FLG -- Yes --> WRIB_VAL
    WRIB_FLG -- No --> END_NODE
    WRIB_VAL --> END_NODE
    WRIB_STATE --> END_NODE
```

**CRITICAL — Constant Resolution:**
This method does NOT use any external constant files for branching. All conditions compare the `key` parameter directly against hardcoded Japanese string literals that represent field names. The two subkey comparisons use `equalsIgnoreCase("value")` and `equalsIgnoreCase("state")`, which are language-level string operations, not constant-based routing.

**List-based routing details:**
- For "異動理由コード" (Change Reason Code): The key is expected to contain a "/" separator followed by a zero-based index (e.g., `"hktgi_ido_rsn_cd/0"`). The method extracts the substring after the first "/", attempts to parse it as an `Integer`, and if valid, uses it as an index into `hktgi_ido_rsn_cd_list` to retrieve an `X33VDataTypeStringBean` instance and delegate the `storeModelData` call.
- For "オプションサービス契約番号" (Optional Service Contract Number): Same pattern — delegates to `X33VDataTypeStringBean` via index into `hktgi_op_svc_kei_no_list`.

## 3. Parameter Analysis

| No | Parameter Name | Type | Business Description |
|----|---------------|------|---------------------|
| 1 | `key` | `String` | The Japanese field name identifying which data item to set. Represents a screen-bound data field — e.g., `"サービスコード"` (Service Code), `"サービス契約番号"` (Service Contract Number), `"異動理由コード"` (Change Reason Code). For list-based fields, the key contains a "/" separator followed by the zero-based index into the list (e.g., `"hktgi_ido_rsn_cd/0"`). |
| 2 | `subkey` | `String` | A property qualifier — either `"value"` (sets the actual field value) or `"state"` (sets the field's display/validation state). Case-insensitive comparison. The "state" subkey is used to propagate UI rendering flags such as read-only, visible, or enabled status to the field. |
| 3 | `in_value` | `Object` | The data value to assign. Typically a `String` containing the actual field data (e.g., service code string, contract number). Cast to `(String)` in setter calls. |
| 4 | `isSetAsString` | `boolean` | A flag indicating whether to set the value as a String when the target property is a Long type. Not directly consumed by `storeModelData` itself, but forwarded to nested `X33VDataTypeStringBean` delegates for list-based items. Controls type coercion behavior in child beans. |

**Instance fields read by this method:**

| Field | Type | Usage |
|-------|------|-------|
| `hktgi_ido_rsn_cd_list` | `List` | List of `X33VDataTypeStringBean` objects for change reason codes. Used to validate index bounds and retrieve the correct bean for list-based "異動理由コード" routing. |
| `hktgi_op_svc_kei_no_list` | `List` | List of `X33VDataTypeStringBean` objects for optional service contract numbers. Used for list-based "オプションサービス契約番号" routing. |

## 4. CRUD Operations / Called Services

This method performs **no direct database or SC/CBS calls**. All operations are in-memory setter invocations on the data bean itself or delegation to nested child beans.

| CRUD | SC / CBS | SC Code | Entity / DB | Operation Description |
|------|----------|---------|-------------|----------------------|
| U | `JKKAdEditCC.substring` | - | - | Calls `substring` utility on `JKKAdEditCC` (not directly in this method — pre-computed reference) |
| U | `JKKAdEdit.substring` | - | - | Calls `substring` utility on `JKKAdEdit` |
| U | `JKKTelnoInfoAddMapperCC.substring` | - | - | Calls `substring` utility on `JKKTelnoInfoAddMapperCC` |
| U | `JDKejbStringEdit.substring` | - | - | Calls `substring` utility on `JDKejbStringEdit` |
| U | `KKW02701SF01DBean.setHktgi_sysid_value` | - | - | Sets system ID value |
| U | `KKW02701SF01DBean.setHktgi_sysid_state` | - | - | Sets system ID display state |
| U | `KKW02701SF01DBean.setHktgi_svc_kei_no_value` | - | - | Sets service contract number value |
| U | `KKW02701SF01DBean.setHktgi_svc_kei_no_state` | - | - | Sets service contract number display state |
| U | `KKW02701SF01DBean.setHktgi_ido_div_value` | - | - | Sets change reason code value |
| U | `KKW02701SF01DBean.setHktgi_ido_div_state` | - | - | Sets change reason code display state |
| U | `KKW02701SF01DBean.setHktgi_ido_rsn_memo_value` | - | - | Sets change reason memo value |
| U | `KKW02701SF01DBean.setHktgi_ido_rsn_memo_state` | - | - | Sets change reason memo display state |
| U | `KKW02701SF01DBean.setHktgi_op_svc_kei_no_value` | - | - | Sets optional service contract number value |
| U | `KKW02701SF01DBean.setHktgi_op_svc_kei_no_state` | - | - | Sets optional service contract number display state |
| U | `KKW02701SF01DBean.setHktgi_tran_div_value` | - | - | Sets processing type value |
| U | `KKW02701SF01DBean.setHktgi_tran_div_state` | - | - | Sets processing type display state |
| U | `KKW02701SF01DBean.setHktgi_mskm_no_value` | - | - | Sets application number value |
| U | `KKW02701SF01DBean.setHktgi_mskm_no_state` | - | - | Sets application number display state |
| U | `KKW02701SF01DBean.setHktgi_mskm_dtl_no_value` | - | - | Sets application detail number value |
| U | `KKW02701SF01DBean.setHktgi_mskm_dtl_no_state` | - | - | Sets application detail number display state |
| U | `KKW02701SF01DBean.setHktgi_tokutei_id_kmk_nm_value` | - | - | Sets specific ID item name value |
| U | `KKW02701SF01DBean.setHktgi_tokutei_id_kmk_nm_state` | - | - | Sets specific ID item name display state |
| U | `KKW02701SF01DBean.setHktgi_tokutei_id_kmk_value_value` | - | - | Sets specific ID item value value |
| U | `KKW02701SF01DBean.setHktgi_tokutei_id_kmk_value_state` | - | - | Sets specific ID item value display state |
| U | `KKW02701SF01DBean.setHktgi_popup_mode_value` | - | - | Sets popup mode value |
| U | `KKW02701SF01DBean.setHktgi_popup_mode_state` | - | - | Sets popup mode display state |
| U | `KKW02701SF01DBean.setHktgi_svc_cd_value` | - | - | Sets service code value |
| U | `KKW02701SF01DBean.setHktgi_svc_cd_state` | - | - | Sets service code display state |
| U | `KKW02701SF01DBean.setHktgi_prc_grp_cd_value` | - | - | Sets pricing group code value |
| U | `KKW02701SF01DBean.setHktgi_prc_grp_cd_state` | - | - | Sets pricing group code display state |
| U | `KKW02701SF01DBean.setHktgi_prcs_cd_value` | - | - | Sets pricing course code value |
| U | `KKW02701SF01DBean.setHktgi_prcs_cd_state` | - | - | Sets pricing course code display state |
| U | `KKW02701SF01DBean.setHktgi_pplan_cd_value` | - | - | Sets pricing plan code value |
| U | `KKW02701SF01DBean.setHktgi_pplan_cd_state` | - | - | Sets pricing plan code display state |
| U | `KKW02701SF01DBean.setHktgi_svc_cd_bf_value` | - | - | Sets pre-change service code value |
| U | `KKW02701SF01DBean.setHktgi_svc_cd_bf_state` | - | - | Sets pre-change service code display state |
| U | `KKW02701SF01DBean.setHktgi_prc_grp_cd_bf_value` | - | - | Sets pre-change pricing group code value |
| U | `KKW02701SF01DBean.setHktgi_prc_grp_cd_bf_state` | - | - | Sets pre-change pricing group code display state |
| U | `KKW02701SF01DBean.setHktgi_prcs_cd_bf_value` | - | - | Sets pre-change pricing course code value |
| U | `KKW02701SF01DBean.setHktgi_prcs_cd_bf_state` | - | - | Sets pre-change pricing course code display state |
| U | `KKW02701SF01DBean.setHktgi_pplan_cd_bf_value` | - | - | Sets pre-change pricing plan code value |
| U | `KKW02701SF01DBean.setHktgi_pplan_cd_bf_state` | - | - | Sets pre-change pricing plan code display state |
| U | `KKW02701SF01DBean.setHktgi_wrib_auto_aply_tg_gai_flg_value` | - | - | Sets discount auto-application target exclusion flag value |
| U | `KKW02701SF01DBean.setHktgi_wrib_auto_aply_tg_gai_flg_state` | - | - | Sets discount auto-application target exclusion flag display state |
| U | `X33VDataTypeStringBean.storeModelData` | - | - | Delegates to nested bean for list-based items ("異動理由コード", "オプションサービス契約番号") |

## 5. Dependency Trace

No screen/batch entry points found within 8 hops. Direct callers found: 2 methods.
Terminal operations from this method: `setHktgi_wrib_auto_aply_tg_gai_flg_state` [-], `setHktgi_wrib_auto_aply_tg_gai_flg_value` [-], `setHktgi_pplan_cd_bf_state` [-], `setHktgi_pplan_cd_bf_value` [-], `setHktgi_prcs_cd_bf_state` [-], `setHktgi_prcs_cd_bf_value` [-], `setHktgi_prc_grp_cd_bf_state` [-], `setHktgi_prc_grp_cd_bf_value` [-], `setHktgi_svc_cd_bf_state` [-], `setHktgi_svc_cd_bf_value` [-], `setHktgi_pplan_cd_state` [-], `setHktgi_pplan_cd_value` [-], `setHktgi_prcs_cd_state` [-], `setHktgi_prcs_cd_value` [-], `setHktgi_prc_grp_cd_state` [-], `setHktgi_prc_grp_cd_value` [-], `setHktgi_svc_cd_state` [-], `setHktgi_svc_cd_value` [-], `setHktgi_popup_mode_state` [-], `setHktgi_popup_mode_value` [-]

| # | Caller (Screen/Batch) | Call Chain (Full Path to this Method) | Terminal (SC / CRUD / Entity) |
|---|----------------------|--------------------------------------|-------------------------------|
| 1 | Internal — KKW02701SF01DBean | `KKW02701SF01DBean.storeModelData(key, subkey, in_value, isSetAsString)` | All 24 setter operations (see Section 4) |
| 2 | Internal — KKW02701SF01DBean | `KKW02701SF01DBean.storeModelData(subkey, in_value)` (2-param overload) | Delegates to nested `X33VDataTypeStringBean.storeModelData` for list items |

**Notes:**
- The pre-computed callers table shows 2 direct callers, both within `KKW02701SF01DBean` itself (likely the 2-parameter overload and self-referencing calls).
- This method is a **leaf data-binding utility** — it does not reach further into SC/CBS layers. The data it sets is ultimately read back by the screen controller during validation and persistence operations.
- The terminal operations are all `setXxx_state` and `setXxx_value` calls — pure in-memory bean property mutations with no external dependencies.

## 6. Per-Branch Detail Blocks

**Block 1** — IF (null guard) (L923)

Guard clause: early-return if either `key` or `subkey` is null. No processing occurs for null inputs.

| # | Type | Code |
|---|------|------|
| 1 | EXEC | `key.indexOf("/")` — Find the position of "/" separator in the key string [-> stored in `separaterPoint`] |
| 2 | SET | `separaterPoint = key.indexOf("/")` |
| 3 | RETURN | `return;` — abort processing if key or subkey is null |

**Block 2** — IF (SYSID branch) `(key = "SYSID")` (L928)

Handles the system ID field ("SYSID" / `hktgi_sysid`). Sets the system ID value or state.

| # | Type | Code |
|---|------|------|
| 1 | IF | `key.equals("SYSID")` — Matches field name for system ID [-> `hktgi_sysid`] |
| 1.1 | IF-IF | `subkey.equalsIgnoreCase("value")` — Set the actual system ID value |
| 1.1.1 | CALL | `setHktgi_sysid_value((String)in_value)` |
| 1.2 | IF-ELSEIF | `subkey.equalsIgnoreCase("state")` — Set the system ID display state [-> "subkeyがstateの場合、ステータスを返す"] |
| 1.2.1 | CALL | `setHktgi_sysid_state((String)in_value)` |

**Block 3** — ELSE-IF (Service Contract Number) `(key = "サービス契約番号")` (L937)

Handles the service contract number field (`hktgi_svc_kei_no`).

| # | Type | Code |
|---|------|------|
| 1 | IF | `key.equals("サービス契約番号")` — Matches field name for service contract number [-> `hktgi_svc_kei_no`] |
| 1.1 | IF-IF | `subkey.equalsIgnoreCase("value")` — Set the contract number value |
| 1.1.1 | CALL | `setHktgi_svc_kei_no_value((String)in_value)` |
| 1.2 | IF-ELSEIF | `subkey.equalsIgnoreCase("state")` — Set the display state |
| 1.2.1 | CALL | `setHktgi_svc_kei_no_state((String)in_value)` |

**Block 4** — ELSE-IF (Change Reason Division) `(key = "異動区分")` (L946)

Handles the change/relocation reason division field (`hktgi_ido_div`).

| # | Type | Code |
|---|------|------|
| 1 | IF | `key.equals("異動区分")` — Matches field name for change/relocation reason division [-> `hktgi_ido_div`] |
| 1.1 | IF-IF | `subkey.equalsIgnoreCase("value")` — Set the division value |
| 1.1.1 | CALL | `setHktgi_ido_div_value((String)in_value)` |
| 1.2 | IF-ELSEIF | `subkey.equalsIgnoreCase("state")` — Set the display state |
| 1.2.1 | CALL | `setHktgi_ido_div_state((String)in_value)` |

**Block 5** — ELSE-IF (Change Reason Code — List-Based) `(key = "異動理由コード")` (L955)

Handles the change reason code as a **list-based field** (`hktgi_ido_rsn_cd`). Extracts an index from the key (e.g., "hktgi_ido_rsn_cd/0"), validates it, and delegates to a nested `X33VDataTypeStringBean`.

| # | Type | Code |
|---|------|------|
| 1 | IF | `key.equals("異動理由コード")` — Matches list-based field for change reason codes [-> `hktgi_ido_rsn_cd`] |
| 1.1 | SET | `key = key.substring(separaterPoint + 1)` — Extract substring after the first "/" [-> "hktgi_ido_rsn_cd/0" becomes "0"] |
| 1.2 | SET | `Integer tmpIndexInt = null;` — Initialize index variable |
| 1.3 | TRY | `tmpIndexInt = Integer.valueOf(key)` — Attempt to parse index as integer |
| 1.3.1 | CATCH | `NumberFormatException e` — If not a numeric string, set `tmpIndexInt = null` [-> "インデックス値が数値文字列でない場合は、ここでnullを返す"] |
| 1.4 | IF | `tmpIndexInt != null` — Index parsed successfully [-> "インデックス値が数値文字列の場合"] |
| 1.4.1 | SET | `int tmpIndex = tmpIndexInt.intValue()` — Extract primitive int value |
| 1.4.2 | IF | `tmpIndex >= 0 && tmpIndex < hktgi_ido_rsn_cd_list.size()` — Validate index within bounds [-> "インデックス値がリスト個数-1以下の場合"] |
| 1.4.2.1 | CALL | `((X33VDataTypeStringBean)hktgi_ido_rsn_cd_list.get(tmpIndex)).storeModelData(subkey, in_value)` — Delegate to child bean [-> "キャスト部分は、項目定義型に応じてX33VDataTypeStringBean, X33VDataTypeLongBean, X33VDataTypeBooleanBeanのうちの1つを指定。X33VDataTypeLongBeanではsubkeyと入力値およびisSetAsStringフラグを引数に指定"] |

**Block 6** — ELSE-IF (Change Reason Memo) `(key = "異動理由メモ")` (L977)

Handles the change reason memo field (`hktgi_ido_rsn_memo`).

| # | Type | Code |
|---|------|------|
| 1 | IF | `key.equals("異動理由メモ")` — Matches field name for change reason memo [-> `hktgi_ido_rsn_memo`] |
| 1.1 | IF-IF | `subkey.equalsIgnoreCase("value")` — Set the memo value |
| 1.1.1 | CALL | `setHktgi_ido_rsn_memo_value((String)in_value)` |
| 1.2 | IF-ELSEIF | `subkey.equalsIgnoreCase("state")` — Set the display state |
| 1.2.1 | CALL | `setHktgi_ido_rsn_memo_state((String)in_value)` |

**Block 7** — ELSE-IF (Optional Service Contract Number — List-Based) `(key = "オプションサービス契約番号")` (L986)

Handles optional service contract numbers as a **list-based field** (`hktgi_op_svc_kei_no`). Same list-based delegation pattern as Block 5.

| # | Type | Code |
|---|------|------|
| 1 | IF | `key.equals("オプションサービス契約番号")` — Matches list-based field for optional service contracts [-> `hktgi_op_svc_kei_no`] |
| 1.1 | SET | `key = key.substring(separaterPoint + 1)` — Extract substring after the first "/" |
| 1.2 | SET | `Integer tmpIndexInt = null;` |
| 1.3 | TRY | `tmpIndexInt = Integer.valueOf(key)` |
| 1.3.1 | CATCH | `NumberFormatException e` — Set `tmpIndexInt = null` |
| 1.4 | IF | `tmpIndexInt != null` — Index parsed successfully |
| 1.4.1 | SET | `int tmpIndex = tmpIndexInt.intValue()` |
| 1.4.2 | IF | `tmpIndex >= 0 && tmpIndex < hktgi_op_svc_kei_no_list.size()` — Validate bounds |
| 1.4.2.1 | CALL | `((X33VDataTypeStringBean)hktgi_op_svc_kei_no_list.get(tmpIndex)).storeModelData(subkey, in_value)` — Delegate to child bean |

**Block 8** — ELSE-IF (Processing Division) `(key = "処理区分")` (L1014)

Handles the processing type/division field (`hktgi_tran_div`).

| # | Type | Code |
|---|------|------|
| 1 | IF | `key.equals("処理区分")` — Matches field name for processing type [-> `hktgi_tran_div`] |
| 1.1 | IF-IF | `subkey.equalsIgnoreCase("value")` — Set the value |
| 1.1.1 | CALL | `setHktgi_tran_div_value((String)in_value)` |
| 1.2 | IF-ELSEIF | `subkey.equalsIgnoreCase("state")` — Set the state |
| 1.2.1 | CALL | `setHktgi_tran_div_state((String)in_value)` |

**Block 9** — ELSE-IF (Application Number) `(key = "申込番号")` (L1023)

Handles the application number field (`hktgi_mskm_no`).

| # | Type | Code |
|---|------|------|
| 1 | IF | `key.equals("申込番号")` — Matches field name for application number [-> `hktgi_mskm_no`] |
| 1.1 | IF-IF | `subkey.equalsIgnoreCase("value")` — Set the value |
| 1.1.1 | CALL | `setHktgi_mskm_no_value((String)in_value)` |
| 1.2 | IF-ELSEIF | `subkey.equalsIgnoreCase("state")` — Set the state |
| 1.2.1 | CALL | `setHktgi_mskm_no_state((String)in_value)` |

**Block 10** — ELSE-IF (Application Detail Number) `(key = "申込明細番号")` (L1032)

Handles the application detail number field (`hktgi_mskm_dtl_no`).

| # | Type | Code |
|---|------|------|
| 1 | IF | `key.equals("申込明細番号")` — Matches field name for application detail number [-> `hktgi_mskm_dtl_no`] |
| 1.1 | IF-IF | `subkey.equalsIgnoreCase("value")` — Set the value |
| 1.1.1 | CALL | `setHktgi_mskm_dtl_no_value((String)in_value)` |
| 1.2 | IF-ELSEIF | `subkey.equalsIgnoreCase("state")` — Set the state |
| 1.2.1 | CALL | `setHktgi_mskm_dtl_no_state((String)in_value)` |

**Block 11** — ELSE-IF (Specific ID Item Name) `(key = "特定ID項目名")` (L1041)

Handles the specific ID item name field (`hktgi_tokutei_id_kmk_nm`).

| # | Type | Code |
|---|------|------|
| 1 | IF | `key.equals("特定ID項目名")` — Matches field name for specific ID item name [-> `hktgi_tokutei_id_kmk_nm`] |
| 1.1 | IF-IF | `subkey.equalsIgnoreCase("value")` — Set the value |
| 1.1.1 | CALL | `setHktgi_tokutei_id_kmk_nm_value((String)in_value)` |
| 1.2 | IF-ELSEIF | `subkey.equalsIgnoreCase("state")` — Set the state |
| 1.2.1 | CALL | `setHktgi_tokutei_id_kmk_nm_state((String)in_value)` |

**Block 12** — ELSE-IF (Specific ID Item Value) `(key = "特定ID項目値")` (L1050)

Handles the specific ID item value field (`hktgi_tokutei_id_kmk_value`).

| # | Type | Code |
|---|------|------|
| 1 | IF | `key.equals("特定ID項目値")` — Matches field name for specific ID item value [-> `hktgi_tokutei_id_kmk_value`] |
| 1.1 | IF-IF | `subkey.equalsIgnoreCase("value")` — Set the value |
| 1.1.1 | CALL | `setHktgi_tokutei_id_kmk_value_value((String)in_value)` |
| 1.2 | IF-ELSEIF | `subkey.equalsIgnoreCase("state")` — Set the state |
| 1.2.1 | CALL | `setHktgi_tokutei_id_kmk_value_state((String)in_value)` |

**Block 13** — ELSE-IF (Popup Mode) `(key = "ポップアップモード")` (L1059)

Handles the popup mode field (`hktgi_popup_mode`).

| # | Type | Code |
|---|------|------|
| 1 | IF | `key.equals("ポップアップモード")` — Matches field name for popup mode [-> `hktgi_popup_mode`] |
| 1.1 | IF-IF | `subkey.equalsIgnoreCase("value")` — Set the value |
| 1.1.1 | CALL | `setHktgi_popup_mode_value((String)in_value)` |
| 1.2 | IF-ELSEIF | `subkey.equalsIgnoreCase("state")` — Set the state |
| 1.2.1 | CALL | `setHktgi_popup_mode_state((String)in_value)` |

**Block 14** — ELSE-IF (Service Code) `(key = "サービスコード")` (L1068)

Handles the service code field (`hktgi_svc_cd`).

| # | Type | Code |
|---|------|------|
| 1 | IF | `key.equals("サービスコード")` — Matches field name for service code [-> `hktgi_svc_cd`] |
| 1.1 | IF-IF | `subkey.equalsIgnoreCase("value")` — Set the value |
| 1.1.1 | CALL | `setHktgi_svc_cd_value((String)in_value)` |
| 1.2 | IF-ELSEIF | `subkey.equalsIgnoreCase("state")` — Set the state |
| 1.2.1 | CALL | `setHktgi_svc_cd_state((String)in_value)` |

**Block 15** — ELSE-IF (Pricing Group Code) `(key = "料金グループコード")` (L1077)

Handles the pricing group code field (`hktgi_prc_grp_cd`).

| # | Type | Code |
|---|------|------|
| 1 | IF | `key.equals("料金グループコード")` — Matches field name for pricing group code [-> `hktgi_prc_grp_cd`] |
| 1.1 | IF-IF | `subkey.equalsIgnoreCase("value")` — Set the value |
| 1.1.1 | CALL | `setHktgi_prc_grp_cd_value((String)in_value)` |
| 1.2 | IF-ELSEIF | `subkey.equalsIgnoreCase("state")` — Set the state |
| 1.2.1 | CALL | `setHktgi_prc_grp_cd_state((String)in_value)` |

**Block 16** — ELSE-IF (Pricing Course Code) `(key = "料金コースコード")` (L1086)

Handles the pricing course code field (`hktgi_prcs_cd`).

| # | Type | Code |
|---|------|------|
| 1 | IF | `key.equals("料金コースコード")` — Matches field name for pricing course code [-> `hktgi_prcs_cd`] |
| 1.1 | IF-IF | `subkey.equalsIgnoreCase("value")` — Set the value |
| 1.1.1 | CALL | `setHktgi_prcs_cd_value((String)in_value)` |
| 1.2 | IF-ELSEIF | `subkey.equalsIgnoreCase("state")` — Set the state |
| 1.2.1 | CALL | `setHktgi_prcs_cd_state((String)in_value)` |

**Block 17** — ELSE-IF (Pricing Plan Code) `(key = "料金プランコード")` (L1095)

Handles the pricing plan code field (`hktgi_pplan_cd`).

| # | Type | Code |
|---|------|------|
| 1 | IF | `key.equals("料金プランコード")` — Matches field name for pricing plan code [-> `hktgi_pplan_cd`] |
| 1.1 | IF-IF | `subkey.equalsIgnoreCase("value")` — Set the value |
| 1.1.1 | CALL | `setHktgi_pplan_cd_value((String)in_value)` |
| 1.2 | IF-ELSEIF | `subkey.equalsIgnoreCase("state")` — Set the state |
| 1.2.1 | CALL | `setHktgi_pplan_cd_state((String)in_value)` |

**Block 18** — ELSE-IF (Pre-Change Service Code) `(key = "変更前サービスコード")` (L1104)

Handles the pre-change service code field (`hktgi_svc_cd_bf`). This field tracks the service code before a change, enabling audit trail of modifications.

| # | Type | Code |
|---|------|------|
| 1 | IF | `key.equals("変更前サービスコード")` — Matches field name for pre-change service code [-> `hktgi_svc_cd_bf`] |
| 1.1 | IF-IF | `subkey.equalsIgnoreCase("value")` — Set the pre-change value |
| 1.1.1 | CALL | `setHktgi_svc_cd_bf_value((String)in_value)` |
| 1.2 | IF-ELSEIF | `subkey.equalsIgnoreCase("state")` — Set the state |
| 1.2.1 | CALL | `setHktgi_svc_cd_bf_state((String)in_value)` |

**Block 19** — ELSE-IF (Pre-Change Pricing Group Code) `(key = "変更前料金グループコード")` (L1113)

Handles the pre-change pricing group code field (`hktgi_prc_grp_cd_bf`).

| # | Type | Code |
|---|------|------|
| 1 | IF | `key.equals("変更前料金グループコード")` — Matches field name for pre-change pricing group code [-> `hktgi_prc_grp_cd_bf`] |
| 1.1 | IF-IF | `subkey.equalsIgnoreCase("value")` — Set the value |
| 1.1.1 | CALL | `setHktgi_prc_grp_cd_bf_value((String)in_value)` |
| 1.2 | IF-ELSEIF | `subkey.equalsIgnoreCase("state")` — Set the state |
| 1.2.1 | CALL | `setHktgi_prc_grp_cd_bf_state((String)in_value)` |

**Block 20** — ELSE-IF (Pre-Change Pricing Course Code) `(key = "変更前料金コースコード")` (L1122)

Handles the pre-change pricing course code field (`hktgi_prcs_cd_bf`).

| # | Type | Code |
|---|------|------|
| 1 | IF | `key.equals("変更前料金コースコード")` — Matches field name for pre-change pricing course code [-> `hktgi_prcs_cd_bf`] |
| 1.1 | IF-IF | `subkey.equalsIgnoreCase("value")` — Set the value |
| 1.1.1 | CALL | `setHktgi_prcs_cd_bf_value((String)in_value)` |
| 1.2 | IF-ELSEIF | `subkey.equalsIgnoreCase("state")` — Set the state |
| 1.2.1 | CALL | `setHktgi_prcs_cd_bf_state((String)in_value)` |

**Block 21** — ELSE-IF (Pre-Change Pricing Plan Code) `(key = "変更前料金プランコード")` (L1131)

Handles the pre-change pricing plan code field (`hktgi_pplan_cd_bf`).

| # | Type | Code |
|---|------|------|
| 1 | IF | `key.equals("変更前料金プランコード")` — Matches field name for pre-change pricing plan code [-> `hktgi_pplan_cd_bf`] |
| 1.1 | IF-IF | `subkey.equalsIgnoreCase("value")` — Set the value |
| 1.1.1 | CALL | `setHktgi_pplan_cd_bf_value((String)in_value)` |
| 1.2 | IF-ELSEIF | `subkey.equalsIgnoreCase("state")` — Set the state |
| 1.2.1 | CALL | `setHktgi_pplan_cd_bf_state((String)in_value)` |

**Block 22** — ELSE-IF (Discount Auto-Application Exclusion Flag) `(key = "割引自動適用対象外フラグ")` (L1140)

Handles the discount auto-application target exclusion flag field (`hktgi_wrib_auto_aply_tg_gai_flg`). This boolean flag determines whether discount auto-application should be excluded for a given target.

| # | Type | Code |
|---|------|------|
| 1 | IF | `key.equals("割引自動適用対象外フラグ")` — Matches field name for discount auto-application exclusion flag [-> `hktgi_wrib_auto_aply_tg_gai_flg`] |
| 1.1 | IF-IF | `subkey.equalsIgnoreCase("value")` — Set the flag value |
| 1.1.1 | CALL | `setHktgi_wrib_auto_aply_tg_gai_flg_value((String)in_value)` |
| 1.2 | IF-ELSEIF | `subkey.equalsIgnoreCase("state")` — Set the flag display state [-> "subkeyがstateの場合、ステータスを返す"] |
| 1.2.1 | CALL | `setHktgi_wrib_auto_aply_tg_gai_flg_state((String)in_value)` |

**Block 23** — ELSE (no match) (L1149)

If the `key` does not match any of the 24 recognized field names, the method silently falls through to the end with no action. This is intentional — unmatched keys are ignored rather than throwing errors.

## 7. Glossary

| Term | Type | Business Meaning |
|------|------|------------------|
| `hktgi_sysid` | Field | System ID — internal identifier for the system or session in which the service contract change is being processed |
| サービス契約番号 (hktgi_svc_kei_no) | Field | Service Contract Number — the unique identifier assigned to a customer's service contract |
| 異動区分 (hktgi_ido_div) | Field | Change/Relocation Division — categorizes the type of change being made (e.g., new, transfer, cancellation) |
| 異動理由コード (hktgi_ido_rsn_cd) | Field | Change Reason Code — the reason code for the service change; stored as a list allowing multiple reason entries |
| 異動理由メモ (hktgi_ido_rsn_memo) | Field | Change Reason Memo — free-text memo field associated with the change reason code |
| オプションサービス契約番号 (hktgi_op_svc_kei_no) | Field | Optional Service Contract Number — contract numbers for add-on/optional services; stored as a list |
| 処理区分 (hktgi_tran_div) | Field | Processing Division/Type — classifies the processing type of this operation |
| 申込番号 (hktgi_mskm_no) | Field | Application Number — the unique identifier for the service change application/request |
| 申込明細番号 (hktgi_mskm_dtl_no) | Field | Application Detail Number — a sub-identifier for individual line items within an application |
| 特定ID項目名 (hktgi_tokutei_id_kmk_nm) | Field | Specific ID Item Name — a custom/denominational field name for identifying specific configuration items |
| 特定ID項目値 (hktgi_tokutei_id_kmk_value) | Field | Specific ID Item Value — the value associated with a specific ID item name |
| ポップアップモード (hktgi_popup_mode) | Field | Popup Mode — controls the behavior of popup dialogs on the screen |
| サービスコード (hktgi_svc_cd) | Field | Service Code — the code identifying the type of telecom service (e.g., FTTH, DSL, mobile) |
| 料金グループコード (hktgi_prc_grp_cd) | Field | Pricing Group Code — groups services into pricing categories |
| 料金コースコード (hktgi_prcs_cd) | Field | Pricing Course Code — identifies the specific pricing plan/course for a service |
| 料金プランコード (hktgi_pplan_cd) | Field | Pricing Plan Code — the specific pricing plan code (e.g., tier, bandwidth tier) for a service |
| 変更前サービスコード (hktgi_svc_cd_bf) | Field | Pre-Change Service Code — the service code BEFORE the change; used for audit and comparison |
| 変更前料金グループコード (hktgi_prc_grp_cd_bf) | Field | Pre-Change Pricing Group Code — the pricing group code before the change |
| 変更前料金コースコード (hktgi_prcs_cd_bf) | Field | Pre-Change Pricing Course Code — the pricing course code before the change |
| 変更前料金プランコード (hktgi_pplan_cd_bf) | Field | Pre-Change Pricing Plan Code — the pricing plan code before the change |
| 割引自動適用対象外フラグ (hktgi_wrib_auto_aply_tg_gai_flg) | Field | Discount Auto-Application Target Exclusion Flag — when true, discount auto-application is excluded for this target |
| X33VDataTypeStringBean | Class | A nested data bean for list-based string data items; provides its own `storeModelData` for recursive data binding |
| value (subkey) | Constant | Subkey value that triggers setting the actual field data value |
| state (subkey) | Constant | Subkey value that triggers setting the field's display/validation state (e.g., read-only, visible, enabled) |
| koptWebB | Package | KDDI optical web backend package — the web-layer application containing screen data beans |
| KK W02701 SF | Screen | Telecom service contract change screen (KKW02701SF) — the business process screen this data bean supports |
