# Business Logic — KKW02516SFBean.loadModelData() [422 LOC]

| Field | Value |
|-------|-------|
| Fully Qualified Name | `eo.web.webview.KKA16801SF.KKW02516SFBean` |
| Layer | Controller (Webview Bean) |
| Module | `KKA16801SF` (Package: `eo.web.webview.KKA16801SF`) |

## 1. Role

### KKW02516SFBean.loadModelData()

This method serves as the unified data-access gateway for a telecom service-contract modification screen (module KKA16801SF). It implements the routing/dispatch design pattern: given a human-readable field name (`key`) and an optional subkey, it resolves the correct business property and returns its value, accessibility flag, or UI state metadata. The screen manages service contract line-item operations — including changes to service dates, plan codes, optional service flags, move/relocation reasons, and related audit metadata — and this method provides uniform key-based access to all screen-bound fields.

The method handles three distinct data categories: (1) data-type bean lists (e.g., Customer Contract Succession List and Move Reason List), which support nested property access via index and delegated `loadModelData()` calls on list element beans; (2) simple string fields (e.g., service start date, operation code, customer registration date), which resolve subkeys (`value`, `enable`, `state`); and (3) boolean flag fields (e.g., Update State Enable Flag), which resolve `value` and `state`. Keys prefixed with `//` are delegated to the superclass's `loadCommonInfoData()` for shared information bean types. Unknown keys or invalid index references return null. This design enables the view layer to query any screen property using a consistent string-based addressing scheme without requiring direct bean property access.

## 2. Processing Pattern (Detailed Business Logic)

```mermaid
flowchart TD
    START(["loadModelString key, String subkey"])
    START --> nullCheck["key null?"]
    nullCheck --> |yes| retNull1(["return null"])
    nullCheck --> |no| subkeyNull["subkey null?"]
    subkeyNull --> |yes| setEmpty["subkey = empty string"]
    subkeyNull --> |no| commonCheck["key starts with //?"]
    setEmpty --> commonCheck

    commonCheck --> |yes| loadCommon["super.loadCommonInfoDatakey"]
    commonCheck --> |no| rootCheck["key contains /?"]

    rootCheck --> |yes| splitKey["keyElement = key substring0, separaterPoint"]
    rootCheck --> |no| keyElement["keyElement = key"]

    splitKey --> dispatch["Dispatch by keyElement"]
    keyElement --> dispatch

    dispatch --> listBranch1["keyElement equals 顧客契約引継リスト"]
    dispatch --> listBranch2["keyElement equals 異動理由リスト"]
    dispatch --> strField["keyElement equals String field"]
    dispatch --> boolField["keyElement equals 更新状態可否フラグ"]
    dispatch --> default["default: return null"]

    listBranch1 --> listCheck1["keyRemain equals *?"]
    listCheck1 --> |yes| retSize1(["return list.size"])
    listCheck1 --> |no| parseIdx1["try parse index from keyRemain"]
    parseIdx1 --> idxBounds1["index in bounds?"]
    idxBounds1 --> |no| retNull2(["return null"])
    idxBounds1 --> |yes| nestedCall1["cast list.getindex to X33VDataTypeBeanInterface, call loadModelData keyElement, subkey"]
    nestedCall1 --> retNull2

    listBranch2 --> listCheck2["keyRemain equals *?"]
    listCheck2 --> |yes| retSize2(["return list.size"])
    listCheck2 --> |no| parseIdx2["try parse index from keyRemain"]
    parseIdx2 --> idxBounds2["index in bounds?"]
    idxBounds2 --> |no| retNull3(["return null"])
    idxBounds2 --> |yes| nestedCall2["cast list.getindex to X33VDataTypeBeanInterface, call loadModelData keyElement, subkey"]
    nestedCall2 --> retNull3

    strField --> subkeyType["subkey equals value?"]
    subkeyType --> |yes| retValue["return getter_value"]
    subkeyType --> |no| subkeyEnable["subkey equals enable?"]
    subkeyEnable --> |yes| retEnabled["return getter_enabled"]
    subkeyEnable --> |no| subkeyState["subkey equals state?"]
    subkeyState --> |yes| retState["return getter_state"]
    subkeyState --> |no| retNull4(["return null"])

    boolField --> boolSubkey["subkey equals value?"]
    boolSubkey --> |yes| retBoolValue["return getChg_kahi_flg_value"]
    boolSubkey --> |no| boolState["subkey equals state?"]
    boolState --> |yes| retBoolState["return getChg_kahi_flg_state"]
    boolState --> |no| retNull5(["return null"])

    default --> END(["return null"])
    retValue --> END
    retEnabled --> END
    retState --> END
    retNull1 --> END
    retNull2 --> END
    retNull3 --> END
    retNull4 --> END
    retNull5 --> END
    retSize1 --> END
    retSize2 --> END
    retBoolValue --> END
    retBoolState --> END
    loadCommon --> END
    nestedCall1 --> END
    nestedCall2 --> END
```

**Processing Flow:**

1. **Null-guard on key:** If `key` is null, immediately return null — this is a defensive check preventing downstream NPEs when the view layer sends incomplete lookups.
2. **Null-subkey normalization:** If `subkey` is null, normalize it to an empty string to simplify downstream string comparisons.
3. **Common info delegation:** If `key` starts with `//`, delegate to `super.loadCommonInfoData(key)` — this handles shared information bean types (e.g., customer information, billing entity data) defined in the base class.
4. **Key-path extraction:** For non-common-info keys, split on `/` to extract the `keyElement` (the top-level field name). If no `/` separator exists, the entire `key` is the field name.
5. **Dispatch by keyElement:** Route to one of the following handlers:
   - **List data-type beans** (`顧客契約引継リスト`, `異動理由リスト`): Parse nested path for list index and property. Support `*` wildcard for list size queries.
   - **String fields** (17 string fields): Route by `subkey` to `value`, `enable`, or `state` getter.
   - **Boolean fields** (`更新状態可否フラグ`): Route by `subkey` to `value` or `state` getter.
   - **Default:** Return null for unrecognized field names.

## 3. Parameter Analysis

| No | Parameter Name | Type | Business Description |
|----|---------------|------|---------------------|
| 1 | `key` | `String` | A human-readable field name (Japanese label) or a compound key path. Can be a simple field name like "利用開始日" (Service Start Date), a list-qualified path like "顧客契約引継リスト/0/プランリスト/0/プラン名" (Customer Contract Succession List/0/Plan List/0/Plan Name), a wildcard size query like "顧客契約引継リスト/*" (Customer Contract Succession List element count), or a common-info path prefixed with "//" (Shared Information Bean Type). Controls which field is resolved and which data access path is taken. |
| 2 | `subkey` | `String` | A metadata qualifier for the field access. Accepts `"value"` (returns the actual field value), `"enable"` (returns whether the field is editable/visible), or `"state"` (returns the UI state enum). Case-insensitive matching via `equalsIgnoreCase()`. For list data-type beans and simple fields without sub-properties, it is typically left null/empty. Determines whether the method returns the business data, the accessibility flag, or the rendering state. |

**Instance fields read:**

| Field | Type | Business Description |
|-------|------|---------------------|
| `cust_kei_hktgi_list_list` | `List<X33VDataTypeBeanInterface>` | Customer Contract Succession List — list of contract line items that are being transferred/successed between customers |
| `ido_rsn_list_list` | `List<X33VDataTypeBeanInterface>` | Move Reason List — list of relocation/change reasons for service contracts |

## 4. CRUD Operations / Called Services

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

| CRUD | SC / CBS | SC Code | Entity / DB | Operation Description |
|------|----------|---------|-------------|----------------------|
| - | `JKKAdEditCC.substring` | JKKAdEditCC | - | Calls `substring` in `JKKAdEditCC` (utility — not invoked in this method) |
| - | `JKKAdEdit.substring` | JKKAdEdit | - | Calls `substring` in `JKKAdEdit` (utility — not invoked in this method) |
| - | `JKKTelnoInfoAddMapperCC.substring` | JKKTelnoInfoAddMapperCC | - | Calls `substring` in `JKKTelnoInfoAddMapperCC` (utility — not invoked in this method) |
| - | `JDKejbStringEdit.substring` | JDKejbStringEdit | - | Calls `substring` in `JDKejbStringEdit` (utility — not invoked in this method) |
| R | `KKW02516SFBean.getChg_kahi_flg_state` | KKW02516SFBean | - | Calls `getChg_kahi_flg_state` in `KKW02516SFBean` |
| R | `KKW02516SFBean.getChg_kahi_flg_value` | KKW02516SFBean | - | Calls `getChg_kahi_flg_value` in `KKW02516SFBean` |
| R | `KKW02516SFBean.getGene_add_dtm_state` | KKW02516SFBean | - | Calls `getGene_add_dtm_state` in `KKW02516SFBean` |
| R | `KKW02516SFBean.getGene_add_dtm_value` | KKW02516SFBean | - | Calls `getGene_add_dtm_value` in `KKW02516SFBean` |
| R | `KKW02516SFBean.getIdo_div_state` | KKW02516SFBean | - | Calls `getIdo_div_state` in `KKW02516SFBean` |
| R | `KKW02516SFBean.getIdo_div_value` | KKW02516SFBean | - | Calls `getIdo_div_value` in `KKW02516SFBean` |
| R | `KKW02516SFBean.getKaihk_ymd_state` | KKW02516SFBean | - | Calls `getKaihk_ymd_state` in `KKW02516SFBean` |
| R | `KKW02516SFBean.getKaihk_ymd_value` | KKW02516SFBean | - | Calls `getKaihk_ymd_value` in `KKW02516SFBean` |
| R | `KKW02516SFBean.getLast_upd_dtm_state` | KKW02516SFBean | - | Calls `getLast_upd_dtm_state` in `KKW02516SFBean` |
| R | `KKW02516SFBean.getLast_upd_dtm_value` | KKW02516SFBean | - | Calls `getLast_upd_dtm_value` in `KKW02516SFBean` |
| R | `KKW02516SFBean.getMskm_dtl_no_state` | KKW02516SFBean | - | Calls `getMskm_dtl_no_state` in `KKW02516SFBean` |
| R | `KKW02516SFBean.getMskm_dtl_no_value` | KKW02516SFBean | - | Calls `getMskm_dtl_no_value` in `KKW02516SFBean` |
| R | `KKW02516SFBean.getMskm_no_state` | KKW02516SFBean | - | Calls `getMskm_no_state` in `KKW02516SFBean` |
| R | `KKW02516SFBean.getMskm_no_value` | KKW02516SFBean | - | Calls `getMskm_no_value` in `KKW02516SFBean` |
| R | `KKW02516SFBean.getOp_svc_cd_state` | KKW02516SFBean | - | Calls `getOp_svc_cd_state` in `KKW02516SFBean` |
| R | `KKW02516SFBean.getOp_svc_cd_value` | KKW02516SFBean | - | Calls `getOp_svc_cd_value` in `KKW02516SFBean` |
| R | `KKW02516SFBean.getOp_svc_kei_no_state` | KKW02516SFBean | - | Calls `getOp_svc_kei_no_state` in `KKW02516SFBean` |
| R | `KKW02516SFBean.getOp_svc_kei_no_value` | KKW02516SFBean | - | Calls `getOp_svc_kei_no_value` in `KKW02516SFBean` |
| R | `KKW02516SFBean.getOp_svc_kei_stat_state` | KKW02516SFBean | - | Calls `getOp_svc_kei_stat_state` in `KKW02516SFBean` |
| R | `KKW02516SFBean.getOp_svc_kei_stat_value` | KKW02516SFBean | - | Calls `getOp_svc_kei_stat_value` in `KKW02516SFBean` |
| R | `KKW02516SFBean.getPcrs_cd_state` | KKW02516SFBean | - | Calls `getPcrs_cd_state` in `KKW02516SFBean` |
| R | `KKW02516SFBean.getPcrs_cd_value` | KKW02516SFBean | - | Calls `getPcrs_cd_value` in `KKW02516SFBean` |
| R | `KKW02516SFBean.getPplan_cd_state` | KKW02516SFBean | - | Calls `getPplan_cd_state` in `KKW02516SFBean` |
| R | `KKW02516SFBean.getPplan_cd_value` | KKW02516SFBean | - | Calls `getPplan_cd_value` in `KKW02516SFBean` |
| R | `KKW02516SFBean.getPrg_tkjk_1_enabled` | KKW02516SFBean | - | Calls `getPrg_tkjk_1_enabled` in `KKW02516SFBean` |
| R | `KKW02516SFBean.getPrg_tkjk_1_state` | KKW02516SFBean | - | Calls `getPrg_tkjk_1_state` in `KKW02516SFBean` |
| R | `KKW02516SFBean.getReturnData_state` | KKW02516SFBean | - | Calls `getReturnData_state` in `KKW02516SFBean` |
| R | `KKW02516SFBean.getReturnData_value` | KKW02516SFBean | - | Calls `getReturnData_value` in `KKW02516SFBean` |
| R | `KKW02516SFBean.getReturnData_enabled` | KKW02516SFBean | - | Calls `getReturnData_enabled` in `KKW02516SFBean` |
| R | `KKW02516SFBean.getChg_kahi_flg_state` | KKW02516SFBean | - | Calls `getChg_kahi_flg_state` in `KKW02516SFBean` |
| R | `KKW02516SFBean.getChg_kahi_flg_value` | KKW02516SFBean | - | Calls `getChg_kahi_flg_value` in `KKW02516SFBean` |
| R | `KKW02516SFBean.getUse_staymd_enabled` | KKW02516SFBean | - | Calls `getUse_staymd_enabled` in `KKW02516SFBean` |
| R | `KKW02516SFBean.getUse_staymd_state` | KKW02516SFBean | - | Calls `getUse_staymd_state` in `KKW02516SFBean` |
| R | `KKW02516SFBean.getUse_staymd_value` | KKW02516SFBean | - | Calls `getUse_staymd_value` in `KKW02516SFBean` |
| R | `KKW02516SFBean.getUse_endymd_year_value` | KKW02516SFBean | - | Calls `getUse_endymd_year_value` in `KKW02516SFBean` |
| R | `KKW02516SFBean.getUse_endymd_year_enabled` | KKW02516SFBean | - | Calls `getUse_endymd_year_enabled` in `KKW02516SFBean` |
| R | `KKW02516SFBean.getUse_endymd_year_state` | KKW02516SFBean | - | Calls `getUse_endymd_year_state` in `KKW02516SFBean` |
| R | `KKW02516SFBean.getUse_endymd_mon_value` | KKW02516SFBean | - | Calls `getUse_endymd_mon_value` in `KKW02516SFBean` |
| R | `KKW02516SFBean.getUse_endymd_mon_enabled` | KKW02516SFBean | - | Calls `getUse_endymd_mon_enabled` in `KKW02516SFBean` |
| R | `KKW02516SFBean.getUse_endymd_mon_state` | KKW02516SFBean | - | Calls `getUse_endymd_mon_state` in `KKW02516SFBean` |
| R | `KKW02516SFBean.getUse_endymd_day_value` | KKW02516SFBean | - | Calls `getUse_endymd_day_value` in `KKW02516SFBean` |
| R | `KKW02516SFBean.getUse_endymd_day_enabled` | KKW02516SFBean | - | Calls `getUse_endymd_day_enabled` in `KKW02516SFBean` |
| R | `KKW02516SFBean.getUse_endymd_day_state` | KKW02516SFBean | - | Calls `getUse_endymd_day_state` in `KKW02516SFBean` |
| R | `KKW02516SFBean.getUse_endymd_value` | KKW02516SFBean | - | Calls `getUse_endymd_value` in `KKW02516SFBean` |
| R | `KKW02516SFBean.getUse_endymd_enabled` | KKW02516SFBean | - | Calls `getUse_endymd_enabled` in `KKW02516SFBean` |
| R | `KKW02516SFBean.getUse_endymd_state` | KKW02516SFBean | - | Calls `getUse_endymd_state` in `KKW02516SFBean` |
| R | `KKW02516SFBean.getSysid_state` | KKW02516SFBean | - | Calls `getSysid_state` in `KKW02516SFBean` |
| R | `KKW02516SFBean.getSysid_value` | KKW02516SFBean | - | Calls `getSysid_value` in `KKW02516SFBean` |
| R | `KKW02516SFBean.getSvc_kei_no_state` | KKW02516SFBean | - | Calls `getSvc_kei_no_state` in `KKW02516SFBean` |
| R | `KKW02516SFBean.getSvc_kei_no_value` | KKW02516SFBean | - | Calls `getSvc_kei_no_value` in `KKW02516SFBean` |
| R | `KKW02516SFBean.getTran_div_state` | KKW02516SFBean | - | Calls `getTran_div_state` in `KKW02516SFBean` |
| R | `KKW02516SFBean.getTran_div_value` | KKW02516SFBean | - | Calls `getTran_div_value` in `KKW02516SFBean` |
| R | `KKW02516SFBean.getUnyo_ymd_state` | KKW02516SFBean | - | Calls `getUnyo_ymd_state` in `KKW02516SFBean` |
| R | `KKW02516SFBean.getUnyo_ymd_value` | KKW02516SFBean | - | Calls `getUnyo_ymd_value` in `KKW02516SFBean` |
| R | `KKW02516SFBean.getUnyo_dtm_state` | KKW02516SFBean | - | Calls `getUnyo_dtm_state` in `KKW02516SFBean` |
| R | `KKW02516SFBean.getUnyo_dtm_value` | KKW02516SFBean | - | Calls `getUnyo_dtm_value` in `KKW02516SFBean` |
| R | `KKW02516SFBean.getRsv_aply_ymd_state` | KKW02516SFBean | - | Calls `getRsv_aply_ymd_state` in `KKW02516SFBean` |
| R | `KKW02516SFBean.getRsv_aply_ymd_value` | KKW02516SFBean | - | Calls `getRsv_aply_ymd_value` in `KKW02516SFBean` |
| R | `KKW02516SFBean.getSvc_staymd_state` | KKW02516SFBean | - | Calls `getSvc_staymd_state` in `KKW02516SFBean` |
| R | `KKW02516SFBean.getSvc_staymd_value` | KKW02516SFBean | - | Calls `getSvc_staymd_value` in `KKW02516SFBean` |
| R | `KKW02516SFBean.getSvc_endymd_state` | KKW02516SFBean | - | Calls `getSvc_endymd_state` in `KKW02516SFBean` |
| R | `KKW02516SFBean.getSvc_endymd_value` | KKW02516SFBean | - | Calls `getSvc_endymd_value` in `KKW02516SFBean` |
| R | `KKW02516SFBean.getSvc_chrg_endymd_state` | KKW02516SFBean | - | Calls `getSvc_chrg_endymd_state` in `KKW02516SFBean` |
| R | `KKW02516SFBean.getSvc_chrg_endymd_value` | KKW02516SFBean | - | Calls `getSvc_chrg_endymd_value` in `KKW02516SFBean` |
| R | `KKW02516SFBean.getRtn_msg_id_state` | KKW02516SFBean | - | Calls `getRtn_msg_id_state` in `KKW02516SFBean` |
| R | `KKW02516SFBean.getRtn_msg_id_value` | KKW02516SFBean | - | Calls `getRtn_msg_id_value` in `KKW02516SFBean` |
| R | `KKW02516SFBean.loadCommonInfoData` | (Base class) | - | Delegates to superclass for common/shared info bean data access (keys starting with "//") |
| R | `X33VDataTypeBeanInterface.loadModelData` | (Base bean) | - | Recursive delegation to list element beans for nested property access on data-type bean lists |

This method performs exclusively **Read (R)** operations — it is a pure data-accessor with no Create, Update, or Delete side effects. All calls resolve to getter methods on `KKW02516SFBean` itself (accessing local bean properties), the superclass's `loadCommonInfoData()` for shared info beans, or the `loadModelData()` of child beans in the list.

## 5. Dependency Trace

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

No screen/batch entry points found within 8 hops. Direct callers found: 3 methods.
Terminal operations from this method: `getReturnData_state` [R], `getReturnData_enabled` [R], `getReturnData_value` [R], `getPrg_tkjk_1_state` [R], `getPrg_tkjk_1_enabled` [R], `getPrg_tkjk_1_value` [R], `getChg_kahi_flg_state` [R], `getChg_kahi_flg_value` [R], `getRtn_msg_id_state` [R], `getRtn_msg_id_value` [R], `getLast_upd_dtm_state` [R], `getLast_upd_dtm_value` [R], `getKaihk_ymd_state` [R], `getKaihk_ymd_value` [R], `getSvc_chrg_endymd_state` [R], `getSvc_chrg_endymd_value` [R], `getSvc_endymd_state` [R], `getSvc_endymd_value` [R], `getSvc_staymd_state` [R], `getSvc_staymd_value` [R]

| # | Caller (Screen/Batch) | Call Chain (Full Path to this Method) | Terminal (SC / CRUD / Entity) |
|---|----------------------|--------------------------------------|-------------------------------|
| 1 | `KKW02516SFBean.getJsflist_typelist_cust_kei_hktgi_list()` | `getJsflist_typelist_cust_kei_hktgi_list` -> `loadModelData("顧客契約引継リスト/...", subkey)` | `getUse_staymd_value` [R], `getSvc_kei_no_value` [R], `cust_kei_hktgi_list_list` (List field) |
| 2 | `KKW02516SFBean.getJsflist_typelist_ido_rsn_list()` | `getJsflist_typelist_ido_rsn_list` -> `loadModelData("異動理由リスト/...", subkey)` | `getIdo_div_value` [R], `ido_rsn_list_list` (List field) |
| 3 | `KKW02516SFBean.loadModelData()` (no-arg overload) | `loadModelData()` -> `loadModelData(key, subkey)` | All getter_value/enable/state calls listed in Section 4 |
| 4 | `KKW02516SFBean.loadModelData()` (no-arg overload) | `loadModelData()` -> `loadModelData(key, subkey)` | All getter_value/enable/state calls listed in Section 4 |

**Notes:** All callers are internal methods within `KKW02516SFBean`. This method is called as a data-access utility within the screen's own bean, not directly by screens or batch jobs. The two `getJsflist_typelist_*` methods use this to populate nested data for plan lists within customer contract succession and move reason list structures.

## 6. Per-Branch Detail Blocks

**Block 1** — IF (null guard) `(key == null)` (L990)

> Defensive null check on the key parameter. Returns null to prevent downstream NullPointerException when the view layer requests data with an unspecified key.

| # | Type | Code |
|---|------|------|
| 1 | RETURN | `return null;` // Guard against null key — no processing performed |

**Block 2** — IF (subkey null normalization) `(subkey == null)` (L995)

> Normalizes a null subkey to an empty string, ensuring all subsequent `equalsIgnoreCase()` calls work correctly with a non-null operand.

| # | Type | Code |
|---|------|------|
| 1 | SET | `subkey = new String("");` // Normalize null subkey to empty string |

**Block 3** — IF (common info bean check) `(separaterPoint == 0)` `(key.indexOf("//") == 0)` (L1001)

> Checks if the key starts with `//`, which indicates a shared information bean type (e.g., customer master data, billing entity). Delegates to the superclass's `loadCommonInfoData()` for common info resolution.

| # | Type | Code |
|---|------|------|
| 1 | SET | `keyElement = ""` // Unused — keyElement declared but not set before delegation |
| 2 | CALL | `super.loadCommonInfoData(key)` // Delegate to parent class for common info bean access |

**Block 4** — IF/ELSE (root key extraction) `(separaterPoint > 0)` (L1007)

> Splits the key on `/` to extract the top-level field name (keyElement). If `/` exists, extracts the substring before the first separator; otherwise uses the full key.

| # | Type | Code |
|---|------|------|
| 1 | IF | `separaterPoint > 0` // key contains / separator |
| 1.1 | SET | `keyElement = key.substring(0, separaterPoint);` // Extract top-level field name before first "/" |
| 1.2 | ELSE | `keyElement = key;` // No separator — entire key is the field name |

**Block 5** — IF (データタイプビーン型: 顧客契約引継リスト) `(keyElement.equals("顧客契約引継リスト"))` (L1015)

> Handles the Customer Contract Succession List data-type bean. Supports three sub-queries: list size (`*`), indexed field access, and nested property resolution. This is a compound data structure where each list element is itself an `X33VDataTypeBeanInterface` capable of further `loadModelData` queries.

| # | Type | Code |
|---|------|------|
| 1 | SET | `keyRemain = key.substring(separaterPoint + 1);` // Extract remainder after first "/" — e.g., "0/プランリスト/0/プラン名" |
| 2 | IF | `keyRemain.equals("*")` // Wildcard — request list element count |
| 2.1 | RETURN | `return Integer.valueOf(cust_kei_hktgi_list_list.size());` // Return number of contract succession items |
| 2.2 | ELSE | — |
| 3 | SET | `separaterPoint = keyRemain.indexOf("/");` // Find next separator for index extraction |
| 4 | IF | `separaterPoint <= 0` // Invalid path — no second separator found |
| 4.1 | RETURN | `return null;` // Malformed key path — return null |
| 5 | SET | `keyElement = keyRemain.substring(0, separaterPoint);` // Extract index string |
| 6 | TRY | `tmpIndexInt = Integer.valueOf(keyElement);` // Parse index from string |
| 6.1 | CATCH | `NumberFormatException` -> `return null;` // Invalid index format — return null |
| 7 | IF | `tmpIndexInt == null` // Parse failed |
| 7.1 | RETURN | `return null;` // Null index — return null |
| 8 | SET | `tmpIndex = tmpIndexInt.intValue();` // Convert Integer to int |
| 9 | IF | `tmpIndex < 0 || tmpIndex >= cust_kei_hktgi_list_list.size()` // Index out of bounds |
| 9.1 | RETURN | `return null;` // Out-of-range index — return null |
| 10 | SET | `keyElement = keyRemain.substring(separaterPoint + 1);` // Extract field name after index |
| 11 | RETURN | `((X33VDataTypeBeanInterface)cust_kei_hktgi_list_list.get(tmpIndex)).loadModelData(keyElement, subkey);` // Cast and delegate to list element's loadModelData |

**Block 6** — IF (String field: 利用開始日) `(keyElement.equals("利用開始日"))` (L1038)

> Handles the Service Start Date field. Supports value/enable/state subkey resolution.

| # | Type | Code |
|---|------|------|
| 1 | IF | `subkey.equalsIgnoreCase("value")` |
| 1.1 | RETURN | `return getUse_staymd_value();` // Return service start date value |
| 2 | IF | `subkey.equalsIgnoreCase("enable")` // subkeyが"enable"の場合、項目ID_enableのgetterの戻り値を返す |
| 2.1 | RETURN | `return getUse_staymd_enabled();` // Return editability flag |
| 3 | IF | `subkey.equalsIgnoreCase("state")` // subkeyが"state"の場合、ステータスを返す |
| 3.1 | RETURN | `return getUse_staymd_state();` // Return UI state |

**Block 7** — IF (String field: 利用終了日（年）) `(keyElement.equals("利用終了日（年）"))` (L1047)

> Handles the Service End Date Year field component.

| # | Type | Code |
|---|------|------|
| 1 | IF | `subkey.equalsIgnoreCase("value")` |
| 1.1 | RETURN | `return getUse_endymd_year_value();` // Return end date year value |
| 2 | IF | `subkey.equalsIgnoreCase("enable")` |
| 2.1 | RETURN | `return getUse_endymd_year_enabled();` // Return editability |
| 3 | IF | `subkey.equalsIgnoreCase("state")` |
| 3.1 | RETURN | `return getUse_endymd_year_state();` // Return state |

**Block 8** — IF (String field: 利用終了日（月）) `(keyElement.equals("利用終了日（月）"))` (L1056)

> Handles the Service End Date Month field component.

| # | Type | Code |
|---|------|------|
| 1 | IF | `subkey.equalsIgnoreCase("value")` |
| 1.1 | RETURN | `return getUse_endymd_mon_value();` // Return end date month value |
| 2 | IF | `subkey.equalsIgnoreCase("enable")` |
| 2.1 | RETURN | `return getUse_endymd_mon_enabled();` // Return editability |
| 3 | IF | `subkey.equalsIgnoreCase("state")` |
| 3.1 | RETURN | `return getUse_endymd_mon_state();` // Return state |

**Block 9** — IF (String field: 利用終了日（日）) `(keyElement.equals("利用終了日（日）"))` (L1065)

> Handles the Service End Date Day field component.

| # | Type | Code |
|---|------|------|
| 1 | IF | `subkey.equalsIgnoreCase("value")` |
| 1.1 | RETURN | `return getUse_endymd_day_value();` // Return end date day value |
| 2 | IF | `subkey.equalsIgnoreCase("enable")` |
| 2.1 | RETURN | `return getUse_endymd_day_enabled();` // Return editability |
| 3 | IF | `subkey.equalsIgnoreCase("state")` |
| 3.1 | RETURN | `return getUse_endymd_day_state();` // Return state |

**Block 10** — IF (String field: 利用終了日) `(keyElement.equals("利用終了日"))` (L1074)

> Handles the full Service End Date field (not a date component).

| # | Type | Code |
|---|------|------|
| 1 | IF | `subkey.equalsIgnoreCase("value")` |
| 1.1 | RETURN | `return getUse_endymd_value();` // Return full end date value |
| 2 | IF | `subkey.equalsIgnoreCase("enable")` |
| 2.1 | RETURN | `return getUse_endymd_enabled();` // Return editability |
| 3 | IF | `subkey.equalsIgnoreCase("state")` |
| 3.1 | RETURN | `return getUse_endymd_state();` // Return state |

**Block 11** — IF (String field: ＳＶＳＩＤ) `(keyElement.equals("ＳＶＳＩＤ"))` (L1083)

> Handles the SVS ID (System/Service ID) field. Note: only value and state subkeys (no enable).

| # | Type | Code |
|---|------|------|
| 1 | IF | `subkey.equalsIgnoreCase("value")` |
| 1.1 | RETURN | `return getSysid_value();` // Return SVS ID value |
| 2 | IF | `subkey.equalsIgnoreCase("state")` |
| 2.1 | RETURN | `return getSysid_state();` // Return state |

**Block 12** — IF (String field: サービス契約番号) `(keyElement.equals("サービス契約番号"))` (L1092)

> Handles the Service Contract Number field. Only value and state subkeys.

| # | Type | Code |
|---|------|------|
| 1 | IF | `subkey.equalsIgnoreCase("value")` |
| 1.1 | RETURN | `return getSvc_kei_no_value();` // Return service contract number |
| 2 | IF | `subkey.equalsIgnoreCase("state")` |
| 2.1 | RETURN | `return getSvc_kei_no_state();` // Return state |

**Block 13** — IF (String field: 異動区分) `(keyElement.equals("異動区分"))` (L1101)

> Handles the Move/Relocation Division field — indicates the type of service change (e.g., relocation, suspension).

| # | Type | Code |
|---|------|------|
| 1 | IF | `subkey.equalsIgnoreCase("value")` |
| 1.1 | RETURN | `return getIdo_div_value();` // Return move division code |
| 2 | IF | `subkey.equalsIgnoreCase("state")` |
| 2.1 | RETURN | `return getIdo_div_state();` // Return state |

**Block 14** — IF (データタイプビーン型: 異動理由リスト) `(keyElement.equals("異動理由リスト"))` (L1110)

> Handles the Move Reason List data-type bean. Same structure as Block 5 (顧客契約引継リスト) — supports list size (`*`), indexed access, and nested property delegation.

| # | Type | Code |
|---|------|------|
| 1 | SET | `keyRemain = key.substring(separaterPoint + 1);` // Extract remainder after first "/" |
| 2 | IF | `keyRemain.equals("*")` // Wildcard — request list element count |
| 2.1 | RETURN | `return Integer.valueOf(ido_rsn_list_list.size());` // Return move reason list size |
| 2.2 | ELSE | — |
| 3 | SET | `separaterPoint = keyRemain.indexOf("/");` // Find next separator |
| 4 | IF | `separaterPoint <= 0` // Invalid path |
| 4.1 | RETURN | `return null;` // Malformed path |
| 5 | SET | `keyElement = keyRemain.substring(0, separaterPoint);` // Extract index string |
| 6 | TRY | `tmpIndexInt = Integer.valueOf(keyElement);` // Parse index |
| 6.1 | CATCH | `NumberFormatException` -> `return null;` // Invalid index |
| 7 | IF | `tmpIndexInt == null` |
| 7.1 | RETURN | `return null;` // Null index |
| 8 | SET | `tmpIndex = tmpIndexInt.intValue();` // Convert to int |
| 9 | IF | `tmpIndex < 0 \|\| tmpIndex >= ido_rsn_list_list.size()` // Out of bounds |
| 9.1 | RETURN | `return null;` // Out-of-range index |
| 10 | SET | `keyElement = keyRemain.substring(separaterPoint + 1);` // Extract field name after index |
| 11 | RETURN | `((X33VDataTypeBeanInterface)ido_rsn_list_list.get(tmpIndex)).loadModelData(keyElement, subkey);` // Delegate to list element bean |

**Block 15** — IF (String field: オプションサービス契約番号) `(keyElement.equals("オプションサービス契約番号"))` (L1131)

> Handles the Optional Service Contract Number field.

| # | Type | Code |
|---|------|------|
| 1 | IF | `subkey.equalsIgnoreCase("value")` |
| 1.1 | RETURN | `return getOp_svc_kei_no_value();` // Return optional service contract number |
| 2 | IF | `subkey.equalsIgnoreCase("state")` |
| 2.1 | RETURN | `return getOp_svc_kei_no_state();` // Return state |

**Block 16** — IF (String field: 処理区分) `(keyElement.equals("処理区分"))` (L1140)

> Handles the Processing Division field — distinguishes between different types of operations (e.g., addition, modification, cancellation).

| # | Type | Code |
|---|------|------|
| 1 | IF | `subkey.equalsIgnoreCase("value")` |
| 1.1 | RETURN | `return getTran_div_value();` // Return processing division code |
| 2 | IF | `subkey.equalsIgnoreCase("state")` |
| 2.1 | RETURN | `return getTran_div_state();` // Return state |

**Block 17** — IF (String field: 申込番号) `(keyElement.equals("申込番号"))` (L1149)

> Handles the Application Number field — unique identifier for the service application.

| # | Type | Code |
|---|------|------|
| 1 | IF | `subkey.equalsIgnoreCase("value")` |
| 1.1 | RETURN | `return getMskm_no_value();` // Return application number |
| 2 | IF | `subkey.equalsIgnoreCase("state")` |
| 2.1 | RETURN | `return getMskm_no_state();` // Return state |

**Block 18** — IF (String field: 申込明細番号) `(keyElement.equals("申込明細番号"))` (L1158)

> Handles the Application Detail Number field — sub-item identifier within an application.

| # | Type | Code |
|---|------|------|
| 1 | IF | `subkey.equalsIgnoreCase("value")` |
| 1.1 | RETURN | `return getMskm_dtl_no_value();` // Return application detail number |
| 2 | IF | `subkey.equalsIgnoreCase("state")` |
| 2.1 | RETURN | `return getMskm_dtl_no_state();` // Return state |

**Block 19** — IF (String field: 運用年月日) `(keyElement.equals("運用年月日"))` (L1167)

> Handles the Operation Date field.

| # | Type | Code |
|---|------|------|
| 1 | IF | `subkey.equalsIgnoreCase("value")` |
| 1.1 | RETURN | `return getUnyo_ymd_value();` // Return operation date |
| 2 | IF | `subkey.equalsIgnoreCase("state")` |
| 2.1 | RETURN | `return getUnyo_ymd_state();` // Return state |

**Block 20** — IF (String field: 運用年月日时分秒) `(keyElement.equals("運用年月日時分秒"))` (L1176)

> Handles the Operation Date-Time (year, month, day, hour, minute, second) field.

| # | Type | Code |
|---|------|------|
| 1 | IF | `subkey.equalsIgnoreCase("value")` |
| 1.1 | RETURN | `return getUnyo_dtm_value();` // Return full timestamp value |
| 2 | IF | `subkey.equalsIgnoreCase("state")` |
| 2.1 | RETURN | `return getUnyo_dtm_state();` // Return state |

**Block 21** — IF (String field: 予約適用年月日) `(keyElement.equals("予約適用年月日"))` (L1185)

> Handles the Reservation Apply Date field.

| # | Type | Code |
|---|------|------|
| 1 | IF | `subkey.equalsIgnoreCase("value")` |
| 1.1 | RETURN | `return getRsv_aply_ymd_value();` // Return reservation apply date |
| 2 | IF | `subkey.equalsIgnoreCase("state")` |
| 2.1 | RETURN | `return getRsv_aply_ymd_state();` // Return state |

**Block 22** — IF (String field: 世代登録年月日時分秒) `(keyElement.equals("世代登録年月日時分秒"))` (L1194)

> Handles the Generation Registration Date-Time field — timestamp when the service record was created in the current generation.

| # | Type | Code |
|---|------|------|
| 1 | IF | `subkey.equalsIgnoreCase("value")` |
| 1.1 | RETURN | `return getGene_add_dtm_value();` // Return generation registration timestamp |
| 2 | IF | `subkey.equalsIgnoreCase("state")` |
| 2.1 | RETURN | `return getGene_add_dtm_state();` // Return state |

**Block 23** — IF (String field: オプションサービス契約ステータス) `(keyElement.equals("オプションサービス契約ステータス"))` (L1203)

> Handles the Optional Service Contract Status field.

| # | Type | Code |
|---|------|------|
| 1 | IF | `subkey.equalsIgnoreCase("value")` |
| 1.1 | RETURN | `return getOp_svc_kei_stat_value();` // Return optional service contract status |
| 2 | IF | `subkey.equalsIgnoreCase("state")` |
| 2.1 | RETURN | `return getOp_svc_kei_stat_state();` // Return state |

**Block 24** — IF (String field: オプションサービスコード) `(keyElement.equals("オプションサービスコード"))` (L1212)

> Handles the Optional Service Code field — identifies the type of optional service.

| # | Type | Code |
|---|------|------|
| 1 | IF | `subkey.equalsIgnoreCase("value")` |
| 1.1 | RETURN | `return getOp_svc_cd_value();` // Return optional service code |
| 2 | IF | `subkey.equalsIgnoreCase("state")` |
| 2.1 | RETURN | `return getOp_svc_cd_state();` // Return state |

**Block 25** — IF (String field: 料金コースコード) `(keyElement.equals("料金コースコード"))` (L1221)

> Handles the Billing Course Code field — specifies the pricing tier/course.

| # | Type | Code |
|---|------|------|
| 1 | IF | `subkey.equalsIgnoreCase("value")` |
| 1.1 | RETURN | `return getPcrs_cd_value();` // Return billing course code |
| 2 | IF | `subkey.equalsIgnoreCase("state")` |
| 2.1 | RETURN | `return getPcrs_cd_state();` // Return state |

**Block 26** — IF (String field: 料金プランコード) `(keyElement.equals("料金プランコード"))` (L1230)

> Handles the Billing Plan Code field — specifies the billing plan.

| # | Type | Code |
|---|------|------|
| 1 | IF | `subkey.equalsIgnoreCase("value")` |
| 1.1 | RETURN | `return getPplan_cd_value();` // Return billing plan code |
| 2 | IF | `subkey.equalsIgnoreCase("state")` |
| 2.1 | RETURN | `return getPplan_cd_state();` // Return state |

**Block 27** — IF (String field: サービス開始年月日) `(keyElement.equals("サービス開始年月日"))` (L1239)

> Handles the Service Start Date (full date) field.

| # | Type | Code |
|---|------|------|
| 1 | IF | `subkey.equalsIgnoreCase("value")` |
| 1.1 | RETURN | `return getSvc_staymd_value();` // Return service start date |
| 2 | IF | `subkey.equalsIgnoreCase("state")` |
| 2.1 | RETURN | `return getSvc_staymd_state();` // Return state |

**Block 28** — IF (String field: サービス終了年月日) `(keyElement.equals("サービス終了年月日"))` (L1248)

> Handles the Service End Date (full date) field.

| # | Type | Code |
|---|------|------|
| 1 | IF | `subkey.equalsIgnoreCase("value")` |
| 1.1 | RETURN | `return getSvc_endymd_value();` // Return service end date |
| 2 | IF | `subkey.equalsIgnoreCase("state")` |
| 2.1 | RETURN | `return getSvc_endymd_state();` // Return state |

**Block 29** — IF (String field: サービス課金終了年月日) `(keyElement.equals("サービス課金終了年月日"))` (L1257)

> Handles the Service Billing End Date field — when billing ceases (may differ from service end).

| # | Type | Code |
|---|------|------|
| 1 | IF | `subkey.equalsIgnoreCase("value")` |
| 1.1 | RETURN | `return getSvc_chrg_endymd_value();` // Return billing end date |
| 2 | IF | `subkey.equalsIgnoreCase("state")` |
| 2.1 | RETURN | `return getSvc_chrg_endymd_state();` // Return state |

**Block 30** — IF (String field: 回復年月日) `(keyElement.equals("回復年月日"))` (L1266)

> Handles the Recovery Date field — when service is restored after suspension.

| # | Type | Code |
|---|------|------|
| 1 | IF | `subkey.equalsIgnoreCase("value")` |
| 1.1 | RETURN | `return getKaihk_ymd_value();` // Return recovery date |
| 2 | IF | `subkey.equalsIgnoreCase("state")` |
| 2.1 | RETURN | `return getKaihk_ymd_state();` // Return state |

**Block 31** — IF (String field: 最終更新年月日時分秒) `(keyElement.equals("最終更新年月日時分秒"))` (L1275)

> Handles the Last Update Date-Time field.

| # | Type | Code |
|---|------|------|
| 1 | IF | `subkey.equalsIgnoreCase("value")` |
| 1.1 | RETURN | `return getLast_upd_dtm_value();` // Return last update timestamp |
| 2 | IF | `subkey.equalsIgnoreCase("state")` |
| 2.1 | RETURN | `return getLast_upd_dtm_state();` // Return state |

**Block 32** — IF (String field: 返却メッセージID) `(keyElement.equals("返却メッセージID"))` (L1284)

> Handles the Return Message ID field — contains the message code returned from the back-end processing.

| # | Type | Code |
|---|------|------|
| 1 | IF | `subkey.equalsIgnoreCase("value")` |
| 1.1 | RETURN | `return getRtn_msg_id_value();` // Return return message ID |
| 2 | IF | `subkey.equalsIgnoreCase("state")` |
| 2.1 | RETURN | `return getRtn_msg_id_state();` // Return state |

**Block 33** — IF (Boolean field: 更新状態可否フラグ) `(keyElement.equals("更新状態可否フラグ"))` (L1293)

> Handles the Update State Enable Flag — a boolean indicating whether the current state allows updates. Only supports value and state subkeys (no enable, as the flag itself is the enable control).

| # | Type | Code |
|---|------|------|
| 1 | IF | `subkey.equalsIgnoreCase("value")` |
| 1.1 | RETURN | `return getChg_kahi_flg_value();` // Return the update enable flag value |
| 2 | IF | `subkey.equalsIgnoreCase("state")` |
| 2.1 | RETURN | `return getChg_kahi_flg_state();` // Return state |

**Block 34** — IF (String field: 進捗特記事項1) `(keyElement.equals("進捗特記事項1"))` (L1302)

> Handles the Progress Special Items 1 field — a free-text progress note/remark field. Supports value/enable/state.

| # | Type | Code |
|---|------|------|
| 1 | IF | `subkey.equalsIgnoreCase("value")` |
| 1.1 | RETURN | `return getPrg_tkjk_1_value();` // Return progress special items 1 value |
| 2 | IF | `subkey.equalsIgnoreCase("enable")` |
| 2.1 | RETURN | `return getPrg_tkjk_1_enabled();` // Return editability |
| 3 | IF | `subkey.equalsIgnoreCase("state")` |
| 3.1 | RETURN | `return getPrg_tkjk_1_state();` // Return state |

**Block 35** — IF (String field: 返却データ — ANK-2694-00-00 ADD START) `(keyElement.equals("返却データ"))` (L1314)

> Handles the Return Data field — added via change request ANK-2694-00-00 for WANstopp support. Supports value/enable/state subkeys.

| # | Type | Code |
|---|------|------|
| 1 | IF | `subkey.equalsIgnoreCase("value")` |
| 1.1 | RETURN | `return getReturnData_value();` // Return return data value |
| 2 | IF | `subkey.equalsIgnoreCase("enable")` // subkeyが"enable"の場合、項目ID_enableのgetterの戻り値を返す |
| 2.1 | RETURN | `return getReturnData_enabled();` // Return editability |
| 3 | IF | `subkey.equalsIgnoreCase("state")` // subkeyが"state"の場合、ステータスを返す |
| 3.1 | RETURN | `return getReturnData_state();` // Return state |

**Block 36** — ELSE (default) (L1325)

> Default return for any unrecognized keyElement. Covers all fields not matched by the preceding if/else-if chain.

| # | Type | Code |
|---|------|------|
| 1 | RETURN | `return null;` // Unrecognized field name — return null |

## 7. Glossary

| Term | Type | Business Meaning |
|------|------|------------------|
| `key` | Parameter | Field name — a human-readable Japanese label or compound path used to identify a screen data field. Can include nested list indices (e.g., "リスト/0/サブフィールド"). |
| `subkey` | Parameter | Metadata qualifier — specifies what aspect of the field to return: `value` (actual data), `enable` (editability), or `state` (UI rendering state). |
| `keyElement` | Field | Extracted top-level field name from the key path — the first segment before any "/" separator. |
| `keyRemain` | Field | Remainder of the key path after the first "/" — used for index and nested property resolution in list data-type beans. |
| `separaterPoint` | Field | Index position of the "/" or "//" separator within the key string — used for path splitting. |
| 顧客契約引継リスト | Field | Customer Contract Succession List — list of contract line items being transferred between customers during a service change operation. |
| 異動理由リスト | Field | Move Reason List — list of reasons for service contract changes (relocation, suspension, etc.). |
| 利用開始日 | Field | Service Start Date — the date when the customer's service begins (stored as separate date components: staymd/year/month/day). |
| 利用終了日 | Field | Service End Date — the date when the customer's service ends (with year/month/day component variants). |
| ＳＶＳＩＤ | Field | SVS ID — System/Service identifier, a unique identifier for the service entity in the SVS system. |
| サービス契約番号 | Field | Service Contract Number — the primary contract identifier for the customer's service agreement. |
| 異動区分 | Field | Move Division — classification code for the type of service change (relocation, suspension, restoration, etc.). |
| オプションサービス契約番号 | Field | Optional Service Contract Number — identifier for an optional/add-on service contract. |
| 処理区分 | Field | Processing Division — type of processing operation (addition, modification, cancellation). |
| 申込番号 | Field | Application Number — unique identifier for the service application request. |
| 申込明細番号 | Field | Application Detail Number — sub-item identifier within an application. |
| 運用年月日 | Field | Operation Date — the date when the system operation (processing) was executed. |
| 運用年月日時分秒 | Field | Operation Date-Time — full timestamp of the system operation execution. |
| 予約適用年月日 | Field | Reservation Apply Date — the date a reservation takes effect. |
| 世代登録年月日時分秒 | Field | Generation Registration Date-Time — timestamp when the service record was registered in the current data generation. |
| オプションサービス契約ステータス | Field | Optional Service Contract Status — current status of the optional service contract (active, suspended, etc.). |
| オプションサービスコード | Field | Optional Service Code — code identifying the type of optional service. |
| 料金コースコード | Field | Billing Course Code — code specifying the billing course/tier. |
| 料金プランコード | Field | Billing Plan Code — code specifying the billing plan. |
| サービス開始年月日 | Field | Service Start Date (full) — complete date when the service begins. |
| サービス終了年月日 | Field | Service End Date (full) — complete date when the service ends. |
| サービス課金終了年月日 | Field | Service Billing End Date — date when billing for the service terminates (may differ from service end date). |
| 回復年月日 | Field | Recovery Date — date when service is restored after suspension or interruption. |
| 最終更新年月日時分秒 | Field | Last Update Date-Time — timestamp of the most recent modification to the record. |
| 返却メッセージID | Field | Return Message ID — message code returned from back-end processing, used for error/status notification. |
| 更新状態可否フラグ | Field | Update State Enable Flag — boolean indicating whether the current record state permits updates. |
| 進捗特記事項1 | Field | Progress Special Items 1 — free-text field for progress notes or special remarks on the work order. |
| 返却データ | Field | Return Data — data returned from back-end processing, added for WANstopp support (change request ANK-2694-00-00). |
| `//` prefix | Convention | Shared Information Bean indicator — keys starting with "//" target common/shared info beans resolved by the superclass. |
| `X33VDataTypeBeanInterface` | Type | Data-type bean interface — contract for nested data beans that support `loadModelData()` for property access. |
| `cust_kei_hktgi_list_list` | Field | Customer Contract Succession List instance — managed bean list field holding contract succession data. |
| `ido_rsn_list_list` | Field | Move Reason List instance — managed bean list field holding move/relocation reason data. |
| KKA16801SF | Module | Screen module for service contract modification operations. |
| Bean | Pattern | JavaBean — a managed class with getter/setter properties used in the Struts/Java EE web framework. |
| ANK-2694-00-00 | Change Request | Internal change request ID for the WANstopp support feature addition. |
