# Business Logic — KKW00844SF01DBean.loadModelData() [137 LOC]

| Field | Value |
|-------|-------|
| Fully Qualified Name | `eo.web.webview.KKW00844SF.KKW00844SF01DBean` |
| Layer | Data Bean / View (Presentation — extends `X31CBaseBean`, implements `X33VDataTypeBeanInterface`, `X33VListedBeanInterface`) |
| Module | `KKW00844SF` (Package: `eo.web.webview.KKW00844SF`) |

## 1. Role

### KKW00844SF01DBean.loadModelData()

This method is the central data access dispatcher for the KKW00844SF screen's data bean. It provides a unified, key-based lookup mechanism that allows UI components to retrieve typed field values and their associated validation state by specifying a `key` (field name) and an optional `subkey` (attribute selector). The method supports nine distinct business data categories: system ID (`SYSID`), service contract number, move classification, move reason code, move reason memo, option service contract number, processing classification, application number, and application detail number. It implements a routing/dispatch design pattern — branching on the `key` to determine which data domain is being accessed, then on the `subkey` to return either the current value or the validation state flag. For list-based fields (`ido_rsn_cd_list` and `op_svc_kei_no_list`), it additionally supports indexed access (via an integer index extracted from `key` after the separator) and wildcard access (via `"*"` to return the list size). Its role in the larger system is that of a shared facade within the X33/X31 web framework: it is the canonical getter called by the screen's JSP views, controllers, and any code that needs to resolve field data dynamically at runtime.

## 2. Processing Pattern (Detailed Business Logic)

```mermaid
flowchart TD
    START(["loadModelData key, subkey"])
    NULL_CHECK{"key == null<br/>|| subkey == null"}
    FIND_SEP["separaterPoint = key.indexOf('/')"]
    IS_SYSID{"key == 'SYSID'"}
    IS_SVC{"key == 'サービス契約番号'"}
    IS_IDO_DIV{"key == '異動区分'"}
    IS_IDO_RSN_CD{"key == '異動理由コード'"}
    IS_IDO_RSN_MEMO{"key == '異動理由メモ'"}
    IS_OP_SVC{"key == 'オプションサービス契約番号'"}
    IS_TRAN_DIV{"key == '処理区分'"}
    IS_MSKM_NO{"key == '申請番号'"}
    IS_MSKM_DTL{"key == '申請明細番号'"}
    RETURN_NULL["return null"]

    SUBKEY_SYSID_VAL{"subkey == 'value'"}
    SUBKEY_SYSID_ST{"subkey == 'state'"}
    SUBKEY_SVC_VAL{"subkey == 'value'"}
    SUBKEY_SVC_ST{"subkey == 'state'"}
    SUBKEY_IDO_DIV_VAL{"subkey == 'value'"}
    SUBKEY_IDO_DIV_ST{"subkey == 'state'"}
    SUBKEY_IDO_RSN_MEMO_VAL{"subkey == 'value'"}
    SUBKEY_IDO_RSN_MEMO_ST{"subkey == 'state'"}
    SUBKEY_OP_SVC_VAL{"subkey == 'value'"}
    SUBKEY_OP_SVC_ST{"subkey == 'state'"}
    SUBKEY_TRAN_VAL{"subkey == 'value'"}
    SUBKEY_TRAN_ST{"subkey == 'state'"}
    SUBKEY_MSKM_VAL{"subkey == 'value'"}
    SUBKEY_MSKM_ST{"subkey == 'state'"}
    SUBKEY_MSKM_DTL_VAL{"subkey == 'value'"}
    SUBKEY_MSKM_DTL_ST{"subkey == 'state'"}

    SUBKEY_NOT_MATCH["subkey not value/state"]

    IDX_SPLIT["key = key.substring(separaterPoint + 1)"]
    IDX_STAR{"key == '*'"}
    IDX_PARSE["tmpIndexInt = Integer.valueOf(key)"]
    IDX_PARSE_ERR{NumberFormatException?}
    IDX_NULL{"tmpIndexInt == null"}
    IDX_GET["tmpIndex = tmpIndexInt.intValue()"]
    IDX_BOUNDS{"tmpIndex valid index?"}
    IDX_LIST_GET["list.get(tmpIndex).loadModelData(subkey)"]

    START --> NULL_CHECK
    NULL_CHECK -- true --> RETURN_NULL
    NULL_CHECK -- false --> FIND_SEP

    FIND_SEP --> IS_SYSID
    IS_SYSID -- true --> SUBKEY_SYSID_VAL
    IS_SYSID -- false --> IS_SVC
    IS_SVC -- true --> SUBKEY_SVC_VAL
    IS_SVC -- false --> IS_IDO_DIV
    IS_IDO_DIV -- true --> SUBKEY_IDO_DIV_VAL
    IS_IDO_DIV -- false --> IS_IDO_RSN_CD
    IS_IDO_RSN_CD -- true --> IDX_SPLIT
    IS_IDO_RSN_CD -- false --> IS_IDO_RSN_MEMO
    IS_IDO_RSN_MEMO -- true --> SUBKEY_IDO_RSN_MEMO_VAL
    IS_IDO_RSN_MEMO -- false --> IS_OP_SVC
    IS_OP_SVC -- true --> IDX_SPLIT
    IS_OP_SVC -- false --> IS_TRAN_DIV
    IS_TRAN_DIV -- true --> SUBKEY_TRAN_VAL
    IS_TRAN_DIV -- false --> IS_MSKM_NO
    IS_MSKM_NO -- true --> SUBKEY_MSKM_VAL
    IS_MSKM_NO -- false --> IS_MSKM_DTL
    IS_MSKM_DTL -- true --> SUBKEY_MSKM_DTL_VAL
    IS_MSKM_DTL -- false --> RETURN_NULL

    SUBKEY_SYSID_VAL -- true --> SYSID_RV["return getSysid_value()"]
    SUBKEY_SYSID_VAL -- false --> SUBKEY_SYSID_ST
    SUBKEY_SYSID_ST -- true --> SYSID_RS["return getSysid_state()"]
    SUBKEY_SYSID_ST -- false --> SUBKEY_NOT_MATCH
    SYSID_RV --> RETURN_NULL
    SYSID_RS --> RETURN_NULL

    SUBKEY_SVC_VAL -- true --> SVC_RV["return getSvc_kei_no_value()"]
    SUBKEY_SVC_VAL -- false --> SUBKEY_SVC_ST
    SUBKEY_SVC_ST -- true --> SVC_RS["return getSvc_kei_no_state()"]
    SUBKEY_SVC_ST -- false --> SUBKEY_NOT_MATCH
    SVC_RV --> RETURN_NULL
    SVC_RS --> RETURN_NULL

    SUBKEY_IDO_DIV_VAL -- true --> IDODIV_RV["return getIdo_div_value()"]
    SUBKEY_IDO_DIV_VAL -- false --> SUBKEY_IDO_DIV_ST
    SUBKEY_IDO_DIV_ST -- true --> IDODIV_RS["return getIdo_div_state()"]
    SUBKEY_IDO_DIV_ST -- false --> SUBKEY_NOT_MATCH
    IDODIV_RV --> RETURN_NULL
    IDODIV_RS --> RETURN_NULL

    SUBKEY_IDO_RSN_MEMO_VAL -- true --> IDOMEMO_RV["return getIdo_rsn_memo_value()"]
    SUBKEY_IDO_RSN_MEMO_VAL -- false --> SUBKEY_IDO_RSN_MEMO_ST
    SUBKEY_IDO_RSN_MEMO_ST -- true --> IDOMEMO_RS["return getIdo_rsn_memo_state()"]
    SUBKEY_IDO_RSN_MEMO_ST -- false --> SUBKEY_NOT_MATCH
    IDOMEMO_RV --> RETURN_NULL
    IDOMEMO_RS --> RETURN_NULL

    SUBKEY_OP_SVC_VAL -- true --> OPSVC_RV["return getOpSvcKeiNo_value()"]
    SUBKEY_OP_SVC_VAL -- false --> SUBKEY_OP_SVC_ST
    SUBKEY_OP_SVC_ST -- true --> OPSVC_RS["return getOpSvcKeiNo_state()"]
    SUBKEY_OP_SVC_ST -- false --> SUBKEY_NOT_MATCH
    OPSVC_RV --> RETURN_NULL
    OPSVC_RS --> RETURN_NULL

    SUBKEY_TRAN_VAL -- true --> TRAN_RV["return getTran_div_value()"]
    SUBKEY_TRAN_VAL -- false --> SUBKEY_TRAN_ST
    SUBKEY_TRAN_ST -- true --> TRAN_RS["return getTran_div_state()"]
    SUBKEY_TRAN_ST -- false --> SUBKEY_NOT_MATCH
    TRAN_RV --> RETURN_NULL
    TRAN_RS --> RETURN_NULL

    SUBKEY_MSKM_VAL -- true --> MSKM_RV["return getMskm_no_value()"]
    SUBKEY_MSKM_VAL -- false --> SUBKEY_MSKM_ST
    SUBKEY_MSKM_ST -- true --> MSKM_RS["return getMskm_no_state()"]
    SUBKEY_MSKM_ST -- false --> SUBKEY_NOT_MATCH
    MSKM_RV --> RETURN_NULL
    MSKM_RS --> RETURN_NULL

    SUBKEY_MSKM_DTL_VAL -- true --> MSKMDTL_RV["return getMskm_dtl_no_value()"]
    SUBKEY_MSKM_DTL_VAL -- false --> SUBKEY_MSKM_DTL_ST
    SUBKEY_MSKM_DTL_ST -- true --> MSKMDTL_RS["return getMskm_dtl_no_state()"]
    SUBKEY_MSKM_DTL_ST -- false --> SUBKEY_NOT_MATCH
    MSKMDTL_RV --> RETURN_NULL
    MSKMDTL_RS --> RETURN_NULL

    IDX_SPLIT --> IDX_STAR
    IDX_STAR -- true --> IDX_SIZE["return list.size()"]
    IDX_STAR -- false --> IDX_PARSE
    IDX_PARSE_ERR -- true --> RETURN_NULL
    IDX_PARSE --> IDX_NULL
    IDX_NULL -- true --> RETURN_NULL
    IDX_NULL -- false --> IDX_GET
    IDX_GET --> IDX_BOUNDS
    IDX_BOUNDS -- false --> RETURN_NULL
    IDX_BOUNDS -- true --> IDX_LIST_GET
    IDX_SIZE --> RETURN_NULL
    IDX_LIST_GET --> RETURN_NULL
```

## 3. Parameter Analysis

| No | Parameter Name | Type | Business Description |
|----|---------------|------|---------------------|
| 1 | `key` | `String` | The field name (item ID) used to identify which data attribute to retrieve. It maps to a specific business concept such as system ID, service contract number, or application number. For list-based fields (`異動理由コード`/Move Reason Code, `オプションサービス契約番号`/Option Service Contract Number), the key can include a trailing separator followed by either `"*"` (to request the list size), an integer index (to retrieve a specific list element), or a nested key for the sub-element's data. The separator character `/` is parsed via `indexOf("/")` to support this nested access pattern. |
| 2 | `subkey` | `String` | An attribute selector within the identified field. For scalar fields, it is either `"value"` (returns the actual field value, e.g. `getSysid_value()`) or `"state"` (returns the validation state flag, e.g. `getSysid_state()`). Case-insensitive matching is performed via `equalsIgnoreCase()`. For list-element fields, it is forwarded recursively to the sub-element's own `loadModelData()` method. |

**Instance fields read:**

| Field | Type | Usage |
|-------|------|-------|
| `sysid_value` | `String` | Returned when `key="SYSID"`, `subkey="value"` |
| `sysid_state` | `String` | Returned when `key="SYSID"`, `subkey="state"` |
| `svc_kei_no_value` | `String` | Returned when `key="サービス契約番号"`, `subkey="value"` |
| `svc_kei_no_state` | `String` | Returned when `key="サービス契約番号"`, `subkey="state"` |
| `ido_div_value` | `String` | Returned when `key="異動区分"`, `subkey="value"` |
| `ido_div_state` | `String` | Returned when `key="異動区分"`, `subkey="state"` |
| `ido_rsn_cd_list` | `X33VDataTypeList` | Indexed list for move reason codes — read to get size or retrieve `X33VDataTypeStringBean` elements |
| `ido_rsn_memo_value` | `String` | Returned when `key="異動理由メモ"`, `subkey="value"` |
| `ido_rsn_memo_state` | `String` | Returned when `key="異動理由メモ"`, `subkey="state"` |
| `op_svc_kei_no_list` | `X33VDataTypeList` | Indexed list for option service contract numbers — read to get size or retrieve `X33VDataTypeStringBean` elements |
| `tran_div_value` | `String` | Returned when `key="処理区分"`, `subkey="value"` |
| `tran_div_state` | `String` | Returned when `key="処理区分"`, `subkey="state"` |
| `mskm_no_value` | `String` | Returned when `key="申請番号"`, `subkey="value"` |
| `mskm_no_state` | `String` | Returned when `key="申請番号"`, `subkey="state"` |
| `mskm_dtl_no_value` | `String` | Returned when `key="申請明細番号"`, `subkey="value"` |
| `mskm_dtl_no_state` | `String` | Returned when `key="申請明細番号"`, `subkey="state"` |

## 4. CRUD Operations / Called Services

| CRUD | SC / CBS | SC Code | Entity / DB | Operation Description |
|------|----------|---------|-------------|----------------------|
| R | `JKKAdEditCC.substring` | JKKAdEditCC | - | Calls `substring` utility in `JKKAdEditCC` (pre-computed) |
| R | `JKKAdEdit.substring` | JKKAdEdit | - | Calls `substring` utility in `JKKAdEdit` (pre-computed) |
| R | `JKKTelnoInfoAddMapperCC.substring` | JKKTelnoInfoAddMapperCC | - | Calls `substring` utility in `JKKTelnoInfoAddMapperCC` (pre-computed) |
| R | `JDKejbStringEdit.substring` | JDKejbStringEdit | - | Calls `substring` utility in `JDKejbStringEdit` (pre-computed) |
| R | `KKW00844SF01DBean.getSysid_value` | KKW00844SF01DBean | - | Reads the `sysid_value` field |
| R | `KKW00844SF01DBean.getSysid_state` | KKW00844SF01DBean | - | Reads the `sysid_state` field |
| R | `KKW00844SF01DBean.getSvc_kei_no_value` | KKW00844SF01DBean | - | Reads the `svc_kei_no_value` field |
| R | `KKW00844SF01DBean.getSvc_kei_no_state` | KKW00844SF01DBean | - | Reads the `svc_kei_no_state` field |
| R | `KKW00844SF01DBean.getIdo_div_value` | KKW00844SF01DBean | - | Reads the `ido_div_value` field |
| R | `KKW00844SF01DBean.getIdo_div_state` | KKW00844SF01DBean | - | Reads the `ido_div_state` field |
| R | `KKW00844SF01DBean.getIdo_rsn_memo_value` | KKW00844SF01DBean | - | Reads the `ido_rsn_memo_value` field |
| R | `KKW00844SF01DBean.getIdo_rsn_memo_state` | KKW00844SF01DBean | - | Reads the `ido_rsn_memo_state` field |
| R | `KKW00844SF01DBean.getMskm_dtl_no_state` | KKW00844SF01DBean | - | Reads the `mskm_dtl_no_state` field |
| R | `KKW00844SF01DBean.getMskm_dtl_no_value` | KKW00844SF01DBean | - | Reads the `mskm_dtl_no_value` field |
| R | `KKW00844SF01DBean.getMskm_no_state` | KKW00844SF01DBean | - | Reads the `mskm_no_state` field |
| R | `KKW00844SF01DBean.getMskm_no_value` | KKW00844SF01DBean | - | Reads the `mskm_no_value` field |
| R | `KKW00844SF01DBean.getSvc_kei_no_state` | KKW00844SF01DBean | - | Reads the `svc_kei_no_state` field |
| R | `KKW00844SF01DBean.getSvc_kei_no_value` | KKW00844SF01DBean | - | Reads the `svc_kei_no_value` field |
| R | `KKW00844SF01DBean.getSysid_state` | KKW00844SF01DBean | - | Reads the `sysid_state` field |
| R | `KKW00844SF01DBean.getSysid_value` | KKW00844SF01DBean | - | Reads the `sysid_value` field |
| R | `KKW00844SF01DBean.getTran_div_state` | KKW00844SF01DBean | - | Reads the `tran_div_state` field |
| R | `KKW00844SF01DBean.getTran_div_value` | KKW00844SF01DBean | - | Reads the `tran_div_value` field |
| R | `KKW00844SF01DBean.loadModelData` | KKW00844SF01DBean | - | Recursive call on list element's `loadModelData()` |

**Classification notes:** This method is purely a **Read (R)** operation. It accesses local bean fields via getter methods and performs recursive `loadModelData` calls on list-element beans. No create, update, or delete operations occur. No SC/CBS codes or DB entity tables are directly involved — this is a pure data retrieval facade.

## 5. Dependency Trace

| # | Caller (Screen/Batch) | Call Chain (Full Path to this Method) | Terminal (SC / CRUD / Entity) |
|---|----------------------|--------------------------------------|-------------------------------|
| 1 | Screen:KKW00844SF | `KKW00844SF01DBean.loadModelData()` -> `KKW00844SF01DBean.loadModelData(key, subkey)` | `getSysid_value [R] sysid_value`, `getSysid_state [R] sysid_state`, `getSvc_kei_no_value [R] svc_kei_no_value`, `getSvc_kei_no_state [R] svc_kei_no_state`, `getIdo_div_value [R] ido_div_value`, `getIdo_div_state [R] ido_div_state`, `ido_rsn_cd_list.get() [R] X33VDataTypeStringBean`, `getIdo_rsn_memo_value [R] ido_rsn_memo_value`, `getIdo_rsn_memo_state [R] ido_rsn_memo_state`, `op_svc_kei_no_list.get() [R] X33VDataTypeStringBean`, `getTran_div_value [R] tran_div_value`, `getTran_div_state [R] tran_div_state`, `getMskm_no_value [R] mskm_no_value`, `getMskm_no_state [R] mskm_no_state`, `getMskm_dtl_no_value [R] mskm_dtl_no_value`, `getMskm_dtl_no_state [R] mskm_dtl_no_state` |

**Notes:** The sole known caller is the no-argument overload `KKW00844SF01DBean.loadModelData()` within the same class. This method is called from the KKW00844SF screen's data binding layer or controller, which resolves field values dynamically at render time through this dispatcher.

## 6. Per-Branch Detail Blocks

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

> Null check: if either `key` or `subkey` is null, return null immediately. This is the guard clause that prevents NPE when the UI framework passes incomplete data.

| # | Type | Code |
|---|------|------|
| 1 | IF | `if (key == null || subkey == null)` // 項目名とサブキーがnullの場合、nullを返す (If item name and subkey are null, return null) [-> L304] |
| 2 | RETURN | `return null;` |

**Block 2** — EXEC (separator extraction) (L306)

> Extract the index of the `/` separator from `key`. This is needed for list-based field access where `key` has the format `"異動理由コード/1"` or `"オプションサービス契約番号/2"`.

| # | Type | Code |
|---|------|------|
| 1 | SET | `separaterPoint = key.indexOf("/")` // 区切り位置の取得 (Get separator position) [-> L306] |

**Block 3** — ELSE-IF (SYSID field: system ID) [key == "SYSID"] (L308)

> Retrieves the system ID field value or state. The field `sysid` is a simple string field with no list semantics.

| # | Type | Code |
|---|------|------|
| 1 | IF | `if (key.equals("SYSID"))` // データタイプがStringの項目"SYSID"(項目ID:sysid) (Data type is String item "SYSID" (item ID: sysid)) [-> L308] |
| 2 | IF | &nbsp;&nbsp;`if (subkey.equalsIgnoreCase("value"))` // subkey that matches "value" [-> L309] |
| 3 | RETURN | &nbsp;&nbsp;&nbsp;&nbsp;`return getSysid_value();` |
| 4 | ELSE-IF | &nbsp;&nbsp;`else if (subkey.equalsIgnoreCase("state"))` // subkeyが"state"の場合、ステータスを返す (If subkey is "state", return the status) [-> L311] |
| 5 | RETURN | &nbsp;&nbsp;&nbsp;&nbsp;`return getSysid_state();` |

**Block 4** — ELSE-IF (Service Contract Number) [key == "サービス契約番号"] (L316)

> Retrieves the service contract number field value or state. Maps to `svc_kei_no_value` and `svc_kei_no_state` fields.

| # | Type | Code |
|---|------|------|
| 1 | IF | `else if (key.equals("サービス契約番号"))` // データタイプがStringの項目"サービス契約番号"(項目ID:svc_kei_no) (Data type is String item "Service Contract Number" (item ID: svc_kei_no)) [-> L316] |
| 2 | IF | &nbsp;&nbsp;`if (subkey.equalsIgnoreCase("value"))` |
| 3 | RETURN | &nbsp;&nbsp;&nbsp;&nbsp;`return getSvc_kei_no_value();` |
| 4 | ELSE-IF | &nbsp;&nbsp;`else if (subkey.equalsIgnoreCase("state"))` // subkeyが"state"の場合、ステータスを返す (If subkey is "state", return the status) [-> L318] |
| 5 | RETURN | &nbsp;&nbsp;&nbsp;&nbsp;`return getSvc_kei_no_state();` |

**Block 5** — ELSE-IF (Move Classification) [key == "異動区分"] (L323)

> Retrieves the move classification field value or state. Maps to `ido_div_value` and `ido_div_state` fields. "異動" (idou) refers to a customer record change/move operation in the telecom billing domain.

| # | Type | Code |
|---|------|------|
| 1 | IF | `else if (key.equals("異動区分"))` // データタイプがStringの項目"異動区分"(項目ID:ido_div) (Data type is String item "Move Classification" (item ID: ido_div)) [-> L323] |
| 2 | IF | &nbsp;&nbsp;`if (subkey.equalsIgnoreCase("value"))` |
| 3 | RETURN | &nbsp;&nbsp;&nbsp;&nbsp;`return getIdo_div_value();` |
| 4 | ELSE-IF | &nbsp;&nbsp;`else if (subkey.equalsIgnoreCase("state"))` // subkeyが"state"の場合、ステータスを返す (If subkey is "state", return the status) [-> L325] |
| 5 | RETURN | &nbsp;&nbsp;&nbsp;&nbsp;`return getIdo_div_state();` |

**Block 6** — ELSE-IF (Move Reason Code — LIST-based) [key == "異動理由コード"] (L330)

> Retrieves items from the move reason code list (`ido_rsn_cd_list`). Supports three access modes:
> - `"*"` suffix: returns the list size (element count).
> - Integer suffix: returns the element at that index, then delegates to the element's `loadModelData(subkey)`.
> - Non-integer suffix: returns null (parse failure).
> Out-of-bounds returns null.

| # | Type | Code |
|---|------|------|
| 1 | IF | `else if (key.equals("異動理由コード"))` // 配列項目 "異動理由コード"(String型、項目ID:ido_rsn_cd) (Array item "Move Reason Code" (String type, item ID: ido_rsn_cd)) [-> L330] |
| 2 | SET | &nbsp;&nbsp;`key = key.substring(separaterPoint + 1)` // keyの次の要素を取得 (Get the next element of key) [-> L332] |
| 3 | IF | &nbsp;&nbsp;`if (key.equals("*"))` // インデックス値の代わりに"*"が指定されていたなら、リストの要素数を返す (If "*" is specified instead of an index value, return the list element count) [-> L333] |
| 4 | RETURN | &nbsp;&nbsp;&nbsp;&nbsp;`return Integer.valueOf(ido_rsn_cd_list.size());` |
| 5 | ELSE | &nbsp;&nbsp;`else` [-> L336] |
| 6 | SET | &nbsp;&nbsp;&nbsp;&nbsp;`Integer tmpIndexInt = null;` [-> L337] |
| 7 | TRY | &nbsp;&nbsp;&nbsp;&nbsp;`try { tmpIndexInt = Integer.valueOf(key); }` // リスト中のインデックスを見る (Look at the index in the list) [-> L339] |
| 8 | CATCH | &nbsp;&nbsp;&nbsp;&nbsp;`catch (NumberFormatException e) { return null; }` // インデックス値が数値文字列でない場合は、ここでnullを返す (If the index value is not a numeric string, return null here) [-> L342] |
| 9 | IF | &nbsp;&nbsp;&nbsp;&nbsp;`if (tmpIndexInt == null) { return null; }` [-> L345] |
| 10 | SET | &nbsp;&nbsp;&nbsp;&nbsp;`int tmpIndex = tmpIndexInt.intValue();` [-> L347] |
| 11 | IF | &nbsp;&nbsp;&nbsp;&nbsp;`if (tmpIndex < 0 || tmpIndex >= ido_rsn_cd_list.size())` // インデックス値がリスト個数-1を超えたら、ここでnullを返す (If index value exceeds list count - 1, return null here) [-> L348] |
| 12 | RETURN | &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;`return null;` |
| 13 | RETURN | &nbsp;&nbsp;&nbsp;&nbsp;`return ((X33VDataTypeStringBean) ido_rsn_cd_list.get(tmpIndex)).loadModelData(subkey);` |

**Block 7** — ELSE-IF (Move Reason Memo) [key == "異動理由メモ"] (L352)

> Retrieves the move reason memo (free-text reason for a move/change operation) value or state. Maps to `ido_rsn_memo_value` and `ido_rsn_memo_state` fields.

| # | Type | Code |
|---|------|------|
| 1 | IF | `else if (key.equals("異動理由メモ"))` // データタイプがStringの項目"異動理由メモ"(項目ID:ido_rsn_memo) (Data type is String item "Move Reason Memo" (item ID: ido_rsn_memo)) [-> L352] |
| 2 | IF | &nbsp;&nbsp;`if (subkey.equalsIgnoreCase("value"))` |
| 3 | RETURN | &nbsp;&nbsp;&nbsp;&nbsp;`return getIdo_rsn_memo_value();` |
| 4 | ELSE-IF | &nbsp;&nbsp;`else if (subkey.equalsIgnoreCase("state"))` // subkeyが"state"の場合、ステータスを返す (If subkey is "state", return the status) [-> L354] |
| 5 | RETURN | &nbsp;&nbsp;&nbsp;&nbsp;`return getIdo_rsn_memo_state();` |

**Block 8** — ELSE-IF (Option Service Contract Number — LIST-based) [key == "オプションサービス契約番号"] (L359)

> Retrieves items from the option service contract number list (`op_svc_kei_no_list`). Supports the same access modes as Block 6 (`"*"` for count, integer for index). Each element is a `X33VDataTypeStringBean` that also supports `loadModelData(subkey)` for nested field access.

| # | Type | Code |
|---|------|------|
| 1 | IF | `else if (key.equals("オプションサービス契約番号"))` // 配列項目 "オプションサービス契約番号"(String型、項目ID:op_svc_kei_no) (Array item "Option Service Contract Number" (String type, item ID: op_svc_kei_no)) [-> L359] |
| 2 | SET | &nbsp;&nbsp;`key = key.substring(separaterPoint + 1)` // keyの次の要素を取得 (Get the next element of key) [-> L361] |
| 3 | IF | &nbsp;&nbsp;`if (key.equals("*"))` // インデックス値の代わりに"*"が指定されていたなら、リストの要素数を返す (If "*" is specified instead of an index value, return the list element count) [-> L362] |
| 4 | RETURN | &nbsp;&nbsp;&nbsp;&nbsp;`return Integer.valueOf(op_svc_kei_no_list.size());` |
| 5 | ELSE | &nbsp;&nbsp;`else` [-> L365] |
| 6 | SET | &nbsp;&nbsp;&nbsp;&nbsp;`Integer tmpIndexInt = null;` [-> L366] |
| 7 | TRY | &nbsp;&nbsp;&nbsp;&nbsp;`try { tmpIndexInt = Integer.valueOf(key); }` [-> L368] |
| 8 | CATCH | &nbsp;&nbsp;&nbsp;&nbsp;`catch (NumberFormatException e) { return null; }` // インデックス値が数値文字列でない場合は、ここでnullを返す (If the index value is not a numeric string, return null here) [-> L371] |
| 9 | IF | &nbsp;&nbsp;&nbsp;&nbsp;`if (tmpIndexInt == null) { return null; }` [-> L374] |
| 10 | SET | &nbsp;&nbsp;&nbsp;&nbsp;`int tmpIndex = tmpIndexInt.intValue();` [-> L376] |
| 11 | IF | &nbsp;&nbsp;&nbsp;&nbsp;`if (tmpIndex < 0 || tmpIndex >= op_svc_kei_no_list.size())` // インデックス値がリスト個数-1を超えたら、ここでnullを返す (If index value exceeds list count - 1, return null here) [-> L377] |
| 12 | RETURN | &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;`return null;` |
| 13 | RETURN | &nbsp;&nbsp;&nbsp;&nbsp;`return ((X33VDataTypeStringBean) op_svc_kei_no_list.get(tmpIndex)).loadModelData(subkey);` |

**Block 9** — ELSE-IF (Processing Classification) [key == "処理区分"] (L382)

> Retrieves the processing classification (transaction type discriminator) value or state. Maps to `tran_div_value` and `tran_div_state` fields.

| # | Type | Code |
|---|------|------|
| 1 | IF | `else if (key.equals("処理区分"))` // データタイプがStringの項目"処理区分"(項目ID:tran_div) (Data type is String item "Processing Classification" (item ID: tran_div)) [-> L382] |
| 2 | IF | &nbsp;&nbsp;`if (subkey.equalsIgnoreCase("value"))` |
| 3 | RETURN | &nbsp;&nbsp;&nbsp;&nbsp;`return getTran_div_value();` |
| 4 | ELSE-IF | &nbsp;&nbsp;`else if (subkey.equalsIgnoreCase("state"))` // subkeyが"state"の場合、ステータスを返す (If subkey is "state", return the status) [-> L384] |
| 5 | RETURN | &nbsp;&nbsp;&nbsp;&nbsp;`return getTran_div_state();` |

**Block 10** — ELSE-IF (Application Number) [key == "申請番号"] (L389)

> Retrieves the application number value or state. Maps to `mskm_no_value` and `mskm_no_state` fields.

| # | Type | Code |
|---|------|------|
| 1 | IF | `else if (key.equals("申請番号"))` // データタイプがStringの項目"申請番号"(項目ID:mskm_no) (Data type is String item "Application Number" (item ID: mskm_no)) [-> L389] |
| 2 | IF | &nbsp;&nbsp;`if (subkey.equalsIgnoreCase("value"))` |
| 3 | RETURN | &nbsp;&nbsp;&nbsp;&nbsp;`return getMskm_no_value();` |
| 4 | ELSE-IF | &nbsp;&nbsp;`else if (subkey.equalsIgnoreCase("state"))` // subkeyが"state"の場合、ステータスを返す (If subkey is "state", return the status) [-> L391] |
| 5 | RETURN | &nbsp;&nbsp;&nbsp;&nbsp;`return getMskm_no_state();` |

**Block 11** — ELSE-IF (Application Detail Number) [key == "申請明細番号"] (L396)

> Retrieves the application detail number (line-item identifier within an application) value or state. Maps to `mskm_dtl_no_value` and `mskm_dtl_no_state` fields.

| # | Type | Code |
|---|------|------|
| 1 | IF | `else if (key.equals("申請明細番号"))` // データタイプがStringの項目"申請明細番号"(項目ID:mskm_dtl_no) (Data type is String item "Application Detail Number" (item ID: mskm_dtl_no)) [-> L396] |
| 2 | IF | &nbsp;&nbsp;`if (subkey.equalsIgnoreCase("value"))` |
| 3 | RETURN | &nbsp;&nbsp;&nbsp;&nbsp;`return getMskm_dtl_no_value();` |
| 4 | ELSE-IF | &nbsp;&nbsp;`else if (subkey.equalsIgnoreCase("state"))` // subkeyが"state"の場合、ステータスを返す (If subkey is "state", return the status) [-> L398] |
| 5 | RETURN | &nbsp;&nbsp;&nbsp;&nbsp;`return getMskm_dtl_no_state();` |

**Block 12** — ELSE (fallback: no matching key) (L402)

> Returns null when no matching key is found. This is the safety net for unknown or misspelled field names.

| # | Type | Code |
|---|------|------|
| 1 | ELSE | `return null;` // 条件に一致するプロパティが存在しない場合は、nullを返す (If no property matches the condition, return null) [-> L402] |

## 7. Glossary

| Term | Type | Business Meaning |
|------|------|------------------|
| `sysid` | Field | System ID — internal system identifier for the record, stored in `sysid_value` / `sysid_state` |
| `svc_kei_no` | Field | Service Contract Number — the primary contract identifier for a customer's service line, stored in `svc_kei_no_value` / `svc_kei_no_state` |
| `ido_div` | Field | Move Classification — categorizes the type of customer record change (e.g., transfer, suspension), stored in `ido_div_value` / `ido_div_state` |
| `ido_rsn_cd_list` | Field | Move Reason Code List — a list of `X33VDataTypeStringBean` objects holding individual move reason codes for a multi-reason move operation |
| `ido_rsn_memo` | Field | Move Reason Memo — free-text description explaining the reason for a customer record change, stored in `ido_rsn_memo_value` / `ido_rsn_memo_state` |
| `op_svc_kei_no_list` | Field | Option Service Contract Number List — a list of `X33VDataTypeStringBean` objects holding option service line items attached to the primary contract |
| `tran_div` | Field | Processing Classification — a discriminator for the type of processing/transaction being performed, stored in `tran_div_value` / `tran_div_state` |
| `mskm_no` | Field | Application Number — the top-level application/request number for a service change request, stored in `mskm_no_value` / `mskm_no_state` |
| `mskm_dtl_no` | Field | Application Detail Number — the line-item number within an application, stored in `mskm_dtl_no_value` / `mskm_dtl_no_state` |
| 異動 (idou) | Japanese term | Move/Transfer — a customer record change operation in telecom billing (e.g., moving a service to a different location or customer) |
| 申請 (shinsei) | Japanese term | Application — a service change request submitted for processing |
| X33VDataTypeList | Type | A framework list container in the X33 web framework that holds typed data beans (`X33VDataTypeStringBean`) |
| X33VDataTypeStringBean | Type | A data bean wrapping a string value within the X33 framework; supports its own `loadModelData()` for nested field access |
| X31CBaseBean | Type | The base class for data beans in the X31 web framework; provides common property management utilities |
| state | Attribute | Validation state flag for a field — typically indicates whether the field has errors or has been modified |
| value | Attribute | The actual current value of a data field |
| X33/X31 framework | Technical | K-Opticom's proprietary Java web application framework for building telecom billing screens, built on JavaServer Faces (JSF) |
