# Business Logic — KKW00844SFBean.typeModelData() [334 LOC]

| Field | Value |
|-------|-------|
| Fully Qualified Name | `eo.web.webview.KKW00844SF.KKW00844SFBean` |
| Layer | Web View Bean / Screen Controller (eo.web.webview) |
| Module | `KKW00844SF` (Package: `eo.web.webview.KKW00844SF`) |

## 1. Role

### KKW00844SFBean.typeModelData()

This method serves as the **central type-dispatch router** for the `KKW00844SF` screen, resolving field names (item IDs) and subkeys into their corresponding Java `Class` types. In the context of a telecom order management system, it maps business field identifiers — such as "Start Date of Use" (利用開始日), "Service Contract Number" (サービス契約番号), and "Option Service Code" (オプションサービスコード) — to the runtime Java types (`String.class`, `Boolean.class`, `Integer.class`) that the view layer requires for dynamic data binding, validation, and form generation. The method implements a **routing/dispatch pattern**: it parses the input `key` string, identifies which field category the key belongs to (scalar field, list-viewer item, or shared-info-viewer), and delegates accordingly.

It handles **four distinct processing categories**:
- **Shared-info-viewer fields**: keys prefixed with `//` are delegated to `super.typeCommonInfoData()`.
- **Simple scalar fields**: 23 individual fields covering dates, identifiers, codes, and statuses — each with `value` or `state` subkey mappings.
- **List-viewer items**: Two list-type fields (`cust_kei_hktgi_list` and `ido_rsn_list`) that are recursively dispatched to their inner bean's `typeModelData`.
- **List size queries**: A wildcard `*` subkey returns `Integer.class` to indicate the type of list element count.

Its **role in the larger system** is as a shared utility within the screen bean, enabling the view layer to perform runtime type introspection without hardcoding type information. It is called by multiple downstream methods within `KKW00844SFBean` to support dynamic field rendering and validation in the web UI.

## 2. Processing Pattern (Detailed Business Logic)

```mermaid
flowchart TD
    START(["typeModelData key, subkey"])

    START --> CHECK_NULL{"key == null?"}
    CHECK_NULL -->|true| RET_NULL["Return null"]
    CHECK_NULL -->|false| CHECK_SUBKEY{"subkey == null?"}

    CHECK_SUBKEY -->|true| SUBKEY_EMPTY["subkey = \"\""]
    CHECK_SUBKEY -->|false| SUBKEY_VALID["subkey valid"]

    SUBKEY_EMPTY --> CHECK_COMMONINFO{"key starts with '//'?"}
    SUBKEY_VALID --> CHECK_COMMONINFO

    CHECK_COMMONINFO -->|true| DELEGATE_COMMON["super.typeCommonInfoData(key)"]
    CHECK_COMMONINFO -->|false| FIND_FIRST_SLASH["Find first '/' in key"]

    FIND_FIRST_SLASH --> EXTRACT_ELEMENT{"first '/' found (pos > 0)?"}
    EXTRACT_ELEMENT -->|yes| KEY_ELEMENT["keyElement = substring before '/'"]
    EXTRACT_ELEMENT -->|no| KEY_ELEMENT_FULL["keyElement = key"]

    KEY_ELEMENT --> CHECK_LIST_VIEWER{"keyElement == '顧客契約引継リスト'?"}
    KEY_ELEMENT_FULL --> CHECK_LIST_VIEWER

    CHECK_LIST_VIEWER -->|yes| LIST_VIEWER_BRANCH["Customer Contract List Branch"]
    CHECK_LIST_VIEWER -->|no| CHECK_MOVE_LIST{"keyElement == '異動理由リスト'?"}

    CHECK_MOVE_LIST -->|yes| MOVE_LIST_BRANCH["Move Reason List Branch"]
    CHECK_MOVE_LIST -->|no| BRANCH_BY_FIELD["Branch by Field"]

    LIST_VIEWER_BRANCH --> LV_CHECK_WILD["keyRemain == '*'?"]
    LV_CHECK_WILD -->|yes| LV_RET_INT["Return Integer.class"]
    LV_CHECK_WILD -->|no| LV_PARSE_INDEX["Parse index from key"]
    LV_PARSE_INDEX --> LV_BOUNDS{"index valid?"}
    LV_BOUNDS -->|no| LV_RET_NULL["Return null"]
    LV_BOUNDS -->|yes| LV_DELEGATE["Delegate to list item typeModelData"]

    MOVE_LIST_BRANCH --> ML_CHECK_WILD["keyRemain == '*'?"]
    ML_CHECK_WILD -->|yes| ML_RET_INT["Return Integer.class"]
    ML_CHECK_WILD -->|no| ML_PARSE_INDEX["Parse index from key"]
    ML_PARSE_INDEX --> ML_BOUNDS{"index valid?"}
    ML_BOUNDS -->|no| ML_RET_NULL["Return null"]
    ML_BOUNDS -->|yes| ML_DELEGATE["Delegate to list item typeModelData"]

    BRANCH_BY_FIELD --> USE_STAYMD{"keyElement == '利用開始日'?"}
    USE_STAYMD -->|yes| USE_STAYMD_SUBKEY{"subkey check"}
    USE_STAYMD_SUBKEY -->|"value"| USE_STAYMD_STR["Return String.class"]
    USE_STAYMD_SUBKEY -->|"enable"| USE_STAYMD_BOOL["Return Boolean.class"]
    USE_STAYMD_SUBKEY -->|"state"| USE_STAYMD_STATE["Return String.class"]

    USE_STAYMD_SUBKEY -->|"other"| ALL_STRING_FIELDS["Return String.class"]

    ALL_STRING_FIELDS --> RET_STRING["Return String.class"]

    BRANCH_BY_FIELD --> SYSID{"keyElement == 'SYSID'?"}
    SYSID -->|"value"| SYSID_STR["Return String.class"]
    SYSID -->|"state"| SYSID_STATE["Return String.class"]

    BRANCH_BY_FIELD --> OTHER_FIELDS["Other String fields: svc_kei_no, ido_div, unyo_ymd, unyo_dtm, svc_kei_stat, mskm_dtl_no, upd_dtm_bf, mskm_stat_skbt_cd_shonin, mskm_sbt_cd, op_svc_cd, op_pcrs_cd, op_pplan_cd, oya_kei_skbt_cd, rule0059_auto_aply, prg_memo, prg_stat, prg_tkjk_1, net_tab_op_if_ctl_cd, ido_dtm, haiso_hmpin_stat_cd"]
    OTHER_FIELDS --> OF_SUBKEY{"subkey check"}
    OF_SUBKEY -->|"value"| OF_STR["Return String.class"]
    OF_SUBKEY -->|"state"| OF_STATE["Return String.class"]
    OF_SUBKEY -->|"other"| OF_NULL["Return null"]

    USE_STAYMD_STR --> END_RET(["Return"])
    USE_STAYMD_BOOL --> END_RET
    USE_STAYMD_STATE --> END_RET
    SYSID_STR --> END_RET
    SYSID_STATE --> END_RET
    OF_STR --> END_RET
    OF_STATE --> END_RET
    OF_NULL --> END_RET
    RET_NULL --> END_RET
    DELEGATE_COMMON --> END_RET
    LV_RET_INT --> END_RET
    LV_RET_NULL --> END_RET
    LV_DELEGATE --> END_RET
    ML_RET_INT --> END_RET
    ML_RET_NULL --> END_RET
    ML_DELEGATE --> END_RET
    RET_STRING --> END_RET
```

**Key processing branches:**

| Branch | Condition | Behavior |
|--------|-----------|----------|
| Null key | `key == null` | Returns `null` immediately |
| Null subkey | `subkey == null` | Sets `subkey` to empty string `""` |
| Shared-info-viewer | `key.startsWith("//")` | Delegates to `super.typeCommonInfoData(key)` |
| List-viewer: Customer Contract | `keyElement == "顧客契約引継リスト"` | Parses nested path, delegates to `cust_kei_hktgi_list` items |
| List-viewer: Move Reason | `keyElement == "異動理由リスト"` | Parses nested path, delegates to `ido_rsn_list` items |
| Scalar: Start Date | `keyElement == "利用開始日"` | Returns `Boolean.class` for `enable`, `String.class` for others |
| Scalar: String fields | 23 other field names | Returns `String.class` for `value`/`state` subkeys |
| Wildcard list query | `keyRemain == "*"` | Returns `Integer.class` (list element count type) |
| Fallback | No match | Returns `null` |

## 3. Parameter Analysis

| No | Parameter Name | Type | Business Description |
|----|---------------|------|---------------------|
| 1 | `key` | `String` | The field name (item ID label in Japanese) or a composite path. For scalar fields it is the Japanese display name (e.g., "利用開始日" — Start Date of Use). For list-viewer items it follows the path format: `"リスト名/インデックス/サブ項目名"` (e.g., `"顧客契約引継リスト/0/プランリスト"`). For shared-info-viewer items it starts with `"//"`. A null `key` causes the method to return `null` immediately. |
| 2 | `subkey` | `String` | The sub-property identifier within a field. Common values are `"value"` (the data value itself) and `"state"` (the field's validation/display state). For the "Start Date of Use" field, `"enable"` is also valid (returns `Boolean.class`). Can be null (treated as empty string). For list-viewer items, it is forwarded to the inner bean's `typeModelData`. |

**Instance fields read by this method:**

| Field | Type | Business Description |
|-------|------|---------------------|
| `cust_kei_hktgi_list_list` | `List<? extends X33VDataTypeBeanInterface>` | Customer contract succession list — the list of customer contract handover records displayed as a list-viewer |
| `ido_rsn_list_list` | `List<? extends X33VDataTypeBeanInterface>` | Move reason list — the list of reason codes for service migration/changes displayed as a list-viewer |

## 4. CRUD Operations / Called Services

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

| CRUD | SC / CBS | SC Code | Entity / DB | Operation Description |
|------|----------|---------|-------------|----------------------|
| - | `super.typeCommonInfoData(String key)` | KKW00844SFBean (parent) | - | Delegates to parent class for shared-info-viewer type resolution |
| - | `X33VDataTypeBeanInterface.typeModelData(String keyElement, String subkey)` | X33VDataTypeBeanInterface | - | Recursively resolves type for a list-viewer inner item's field |
| - | `JKKAdEditCC.substring` | JKKAdEditCC | - | Calls `substring` in `JKKAdEditCC` (string utility) |
| - | `JKKAdEdit.substring` | JKKAdEdit | - | Calls `substring` in `JKKAdEdit` (string utility) |
| - | `JKKTelnoInfoAddMapperCC.substring` | JKKTelnoInfoAddMapperCC | - | Calls `substring` in `JKKTelnoInfoAddMapperCC` (string utility) |
| - | `JDKejbStringEdit.substring` | JDKejbStringEdit | - | Calls `substring` in `JDKejbStringEdit` (string utility) |
| - | `KKW00844SFBean.typeModelData` | KKW00844SFBean | - | Self-recursive call via list-item delegation |

**Analysis:** This method is a **pure type-dispatch utility** — it performs no direct CRUD operations against a database. It reads from instance-list collections (`cust_kei_hktgi_list_list`, `ido_rsn_list_list`) and delegates type resolution to parent classes and inner bean components. All string operations use `indexOf` and `substring` on the local `key` and `keyRemain` parameters.

## 5. Dependency Trace

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

No screen/batch entry points found within 8 hops. Direct callers found: 1 methods.
Terminal operations from this method: `typeModelData` [-], `typeModelData` [-], `substring` [-], `substring` [-], `substring` [-], `substring` [-], `substring` [-], `substring` [-], `substring` [-], `substring` [-], `substring` [-], `substring` [-], `substring` [-], `substring` [-], `typeModelData` [-], `typeModelData` [-], `substring` [-], `substring` [-], `substring` [-], `substring` [-]

| # | Caller (Screen/Batch) | Call Chain (Full Path to this Method) | Terminal (SC / CRUD / Entity) |
|---|----------------------|--------------------------------------|-------------------------------|
| 1 | KKW00844SFBean (internal) | `KKW00844SFBean.typeModelData(key, subkey)` | `super.typeCommonInfoData [R] shared-info-viewer` |
| 2 | KKW00844SFBean (internal) | `KKW00844SFBean.typeModelData(key, subkey) -> typeModelData(keyElement, subkey)` | `X33VDataTypeBeanInterface.typeModelData [R] list-viewer inner item` |

## 6. Per-Branch Detail Blocks

### Block 1 — IF `key == null` (L1613)

```java
if(key == null){
    return null;
}
```

> Returns null if the field name key is null, preventing downstream null-pointer issues.

| # | Type | Code |
|---|------|------|
| 1 | RETURN | `return null;` // Return null when key is null |

---

### Block 2 — IF-ELSE `subkey == null` (L1621)

```java
else if(subkey == null){
    subkey = new String("");
}
```

> Normalizes a null subkey to an empty string so downstream comparisons work correctly.

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

---

### Block 3 — IF `key starts with "//"` (shared-info-viewer) (L1628)

```java
int separaterPoint = key.indexOf("//"); // keyが共有情報ビューアに関する指定か否かチェック (Check if key is a shared-info-viewer designation)
if(separaterPoint == 0) {
    return super.typeCommonInfoData(key);
}
```

> Checks if the key begins with `//`, which marks a shared-info-viewer field. If so, delegates the type resolution to the parent class method `typeCommonInfoData`.

| # | Type | Code |
|---|------|------|
| 1 | SET | `separaterPoint = key.indexOf("//")` // Find position of "//" delimiter |
| 2 | IF | `separaterPoint == 0` // Key starts with "//" (shared-info-viewer) |
| 3 | CALL | `super.typeCommonInfoData(key)` // Delegate to parent class for shared-info type resolution |

---

### Block 4 — IF-ELSE `find first "/"` (L1634)

```java
separaterPoint = key.indexOf("/"); // keyがルート指定（"項目a/0/項目b"のような）の場合を想定し、区切り符号（ここでは"/"）を検索する。 (Assume key is a root-path designation like "fieldA/0/fieldB", search for delimiter "/")
if(separaterPoint > 0) {
    keyElement = key.substring(0, separaterPoint);
}
else{
    keyElement = key;
}
```

> Extracts the first element from the key by finding the first `/`. If found at position > 0, the keyElement is the substring before the `/`. If no `/` exists, the entire key is the element.

| # | Type | Code |
|---|------|------|
| 1 | SET | `separaterPoint = key.indexOf("/")` // Find first "/" delimiter |
| 2 | IF | `separaterPoint > 0` // First "/" found at valid position |
| 3 | SET | `keyElement = key.substring(0, separaterPoint)` // Extract field name before "/" |
| 4 | ELSE | `separaterPoint <= 0` // No "/" found — use entire key as element |
| 5 | SET | `keyElement = key` // Use entire key as the field identifier |

---

### Block 5 — IF `keyElement == "利用開始日"` (Start Date of Use) (L1643)

```java
if(keyElement.equals("利用開始日")) { // データタイプが String の項目"利用開始日"（項目ID:use_staymd） (Field with String data type: "Start Date of Use" (item ID: use_staymd))
    if(subkey.equalsIgnoreCase("value")) {
        return String.class;
    }
    else if(subkey.equalsIgnoreCase("enable")) {
        return Boolean.class;
    }
    else if(subkey.equalsIgnoreCase("state")) { // subkeyが"state"の場合、ステータスを返す。 (If subkey is "state", return the status)
        return String.class;
    }
}
```

> The "Start Date of Use" field is special: it has three subkeys. `"value"` → String, `"enable"` → Boolean (for form enablement), `"state"` → String (validation/display state).

| # | Type | Code |
|---|------|------|
| 1 | IF | `keyElement.equals("利用開始日")` // Field: Start Date of Use (itemID: use_staymd) |
| 2 | IF | `subkey.equalsIgnoreCase("value")` // Request the data value type |
| 3 | RETURN | `return String.class` // The value is a String |
| 4 | ELSE-IF | `subkey.equalsIgnoreCase("enable")` // Request the enable flag type |
| 5 | RETURN | `return Boolean.class` // The enable flag is a Boolean |
| 6 | ELSE-IF | `subkey.equalsIgnoreCase("state")` // Request the state/status type |
| 7 | RETURN | `return String.class` // The state is a String |

---

### Block 6 — IF `keyElement == "顧客契約引継リスト"` (Customer Contract Succession List) (L1654)

```java
else if(keyElement.equals("顧客契約引継リスト")) {
    // データタイプがデータタイプビューア型の項目"顧客契約引継リスト"（項目ID:cust_kei_hktgi_list） (Item with data-type-viewer: "Customer Contract Succession List" (item ID: cust_kei_hktgi_list))
    String keyRemain = key.substring(separaterPoint + 1); // keyの次の要素を取得 ("顧客契約引継リスト/0/プランリスト"のようなパス形式から最初の"/"より後を取得)。 (Get the next element after the first "/", e.g., from "listName/0/fieldName")
    if(keyRemain.equals("*")) { // インデックス値の代わりに"*"が指定されていたら、リストの要素数を返す。 (If "*" is specified instead of an index, return the type of the list element count)
        return Integer.class;
    }
    separaterPoint = keyRemain.indexOf("/"); // 次の区切り符号（ここでは"/"）を検索する。 (Search for next delimiter "/")
    if(separaterPoint <= 0) { // 区切り符号が見つからない、または不正な場合は、ここでnullを返す。 (If no delimiter found or invalid, return null)
        return null;
    }
    keyElement = keyRemain.substring(0, separaterPoint);
    // 次のリスト中のインデックスを見る (Check the index within the list)
    Integer tmpIndexInt = null;
    try{
        tmpIndexInt = Integer.valueOf(keyElement);
    }
    catch(NumberFormatException e){ // インデックス値が数値文字列でない場合は、ここでnullを返す。 (If index is not a numeric string, return null)
        return null;
    }
    if(tmpIndexInt == null) {
        return null;
    }
    int tmpIndex = tmpIndexInt.intValue();
    if(tmpIndex < 0 || tmpIndex >= cust_kei_hktgi_list_list.size()) { // インデックス値がリスト個数-1を超えれば、ここでnullを返す。 (If index exceeds list count - 1, return null)
        return null;
    }
    // 項目名を生成し、データタイプビューア型typeModelDataの値を返す (Generate item name and return type from data-type-viewer's typeModelData)
    keyElement = keyRemain.substring(separaterPoint + 1);
    return ((X33VDataTypeBeanInterface)cust_kei_hktgi_list_list.get(tmpIndex)).typeModelData(keyElement, subkey);
}
```

> The customer contract succession list is a **list-viewer** type. The key follows the pattern `"顧客契約引継リスト/インデックス/サブ項目名"`. Processing: (1) Parse remainder after first `/`, (2) Check for wildcard `"*"` — returns `Integer.class`, (3) Parse the list index, (4) Validate index bounds against `cust_kei_hktgi_list_list.size()`, (5) Recursively delegate to the inner bean's `typeModelData` with the field name and subkey.

| # | Type | Code |
|---|------|------|
| 1 | IF | `keyElement.equals("顧客契約引継リスト")` // Field: Customer Contract Succession List (itemID: cust_kei_hktgi_list) |
| 2 | SET | `keyRemain = key.substring(separaterPoint + 1)` // Get the path after the first "/" |
| 3 | IF | `keyRemain.equals("*")` // Wildcard index — query list size type |
| 4 | RETURN | `return Integer.class` // List element count is Integer |
| 5 | ELSE-IF | `separaterPoint <= 0` // No "/" found in remainder — invalid path |
| 6 | RETURN | `return null` |
| 7 | SET | `keyElement = keyRemain.substring(0, separaterPoint)` // Parse index from path |
| 8 | TRY-CATCH | `tmpIndexInt = Integer.valueOf(keyElement)` // Parse index as integer |
| 9 | CATCH | `NumberFormatException` // Index is not a numeric string |
| 10 | RETURN | `return null` |
| 11 | IF | `tmpIndexInt == null` // Index failed to parse |
| 12 | RETURN | `return null` |
| 13 | IF | `tmpIndex < 0 || tmpIndex >= cust_kei_hktgi_list_list.size()` // Index out of bounds |
| 14 | RETURN | `return null` |
| 15 | SET | `keyElement = keyRemain.substring(separaterPoint + 1)` // Parse inner field name |
| 16 | CALL | `cust_kei_hktgi_list_list.get(tmpIndex).typeModelData(keyElement, subkey)` // Delegate to inner bean |

---

### Block 7 — IF `keyElement == "異動理由リスト"` (Move Reason List) (L1700)

```java
else if(keyElement.equals("異動理由リスト")) {
    // データタイプがデータタイプビューア型の項目"異動理由リスト"（項目ID:ido_rsn_list） (Item with data-type-viewer: "Move Reason List" (item ID: ido_rsn_list))
    ... (same structure as Block 6: parse keyRemain, check "*", parse index, validate bounds, delegate) ...
}
```

> The move reason list is a **list-viewer** type with the same structural pattern as Block 6. Key pattern: `"異動理由リスト/インデックス/サブ項目名"`. The processing logic mirrors Block 6: wildcard → `Integer.class`, bounds check → `null`, valid index → delegate to `ido_rsn_list_list` inner bean.

| # | Type | Code |
|---|------|------|
| 1 | IF | `keyElement.equals("異動理由リスト")` // Field: Move Reason List (itemID: ido_rsn_list) |
| 2 | SET | `keyRemain = key.substring(separaterPoint + 1)` // Get path after first "/" |
| 3 | IF | `keyRemain.equals("*")` // Wildcard index |
| 4 | RETURN | `return Integer.class` |
| 5 | ELSE-IF | `separaterPoint <= 0` // Invalid path structure |
| 6 | RETURN | `return null` |
| 7 | SET | `keyElement = keyRemain.substring(0, separaterPoint)` // Parse list index |
| 8 | TRY-CATCH | `tmpIndexInt = Integer.valueOf(keyElement)` |
| 9 | CATCH | `NumberFormatException` // Non-numeric index |
| 10 | RETURN | `return null` |
| 11 | IF | `tmpIndex < 0 || tmpIndex >= ido_rsn_list_list.size()` // Index out of bounds |
| 12 | RETURN | `return null` |
| 13 | SET | `keyElement = keyRemain.substring(separaterPoint + 1)` // Parse inner field name |
| 14 | CALL | `ido_rsn_list_list.get(tmpIndex).typeModelData(keyElement, subkey)` // Delegate to inner bean |

---

### Block 8 — IF-ELIF chains for scalar String fields (L1748–L1925)

> Each of the following blocks follows the same pattern: check the `keyElement` against a specific Japanese field name, then check the `subkey` against `"value"` or `"state"`, returning `String.class`. The fields covered are:

| Block | Field (Japanese) | Item ID | Type |
|-------|-------------------|---------|------|
| 8.1 | "サービス契約番号" | `svc_kei_no` | String |
| 8.2 | "SYSID" | `sysid` | String |
| 8.3 | "異動区分" | `ido_div` | String |
| 8.4 | "運用日" | `unyo_ymd` | String |
| 8.5 | "運用日時分秒" | `unyo_dtm` | String |
| 8.6 | "サービス契約ステータス" | `svc_kei_stat` | String |
| 8.7 | "申請明细番号" | `mskm_dtl_no` | String |
| 8.8 | "更新年月日時分秒（更新前）" | `upd_dtm_bf` | String |
| 8.9 | "申請状態識別コード（承認済）" | `mskm_stat_skbt_cd_shonin` | String |
| 8.10 | "申請種類コード" | `mskm_sbt_cd` | String |
| 8.11 | "オプションサービスコード" | `op_svc_cd` | String |
| 8.12 | "オプション料金コースコード" | `op_pcrs_cd` | String |
| 8.13 | "オプション料金プランコード" | `op_pplan_cd` | String |
| 8.14 | "親契約識別コード" | `oya_kei_skbt_cd` | String |
| 8.15 | "事務手数料自動適用否" | `rule0059_auto_aply` | String |
| 8.16 | "進捗メモ" | `prg_memo` | String |
| 8.17 | "進捗ステータス" | `prg_stat` | String |
| 8.18 | "進捗特記事項1" | `prg_tkjk_1` | String |
| 8.19 | "ネットタブオプション情報制御コード" | `net_tab_op_if_ctl_cd` | String |
| 8.20 | "異動年月日時分秒" | `ido_dtm` | String |
| 8.21 | "配達返品状態コード" | `haiso_hmpin_stat_cd` | String |

> Each block structure is identical. Example for Block 8.1:

**Block 8.1** — IF `keyElement == "サービス契約番号"` (Service Contract Number) (L1748)

| # | Type | Code |
|---|------|------|
| 1 | IF | `keyElement.equals("サービス契約番号")` // Field: Service Contract Number (itemID: svc_kei_no) |
| 2 | IF | `subkey.equalsIgnoreCase("value")` // Request the data value |
| 3 | RETURN | `return String.class` |
| 4 | ELSE-IF | `subkey.equalsIgnoreCase("state")` // Request the state/status |
| 5 | RETURN | `return String.class` |

> (Blocks 8.2 through 8.21 follow the same structure.)

---

### Block 9 — ELSE (implicit, fallback) (L1930)

```java
return null;
```

> If the `keyElement` does not match any of the 24 recognized field names (Start Date, two list-viewer fields, or 21 other scalar String fields), return `null` indicating an unrecognized field.

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

---

## 7. Glossary

| Term | Type | Business Meaning |
|------|------|------------------|
| `use_staymd` | Field | Start Date of Use — the date a telecom service begins; supports `value`, `enable`, and `state` subkeys |
| `cust_kei_hktgi_list` | Field | Customer Contract Succession List — a list-viewer displaying customer contract handover records; each item is a data-type-viewer bean |
| `ido_rsn_list` | Field | Move Reason List — a list-viewer displaying reason codes for service migration/changes |
| `svc_kei_no` | Field | Service Contract Number — the unique identifier for a telecom service contract |
| `sysid` | Field | System ID — the system identifier for the application instance |
| `ido_div` | Field | Move Classification — the type/category of service migration (e.g., new, change, cancellation) |
| `unyo_ymd` | Field | Operating Date — the operational date (year/month/day) for a record |
| `unyo_dtm` | Field | Operating DateTime — the full timestamp for operational records |
| `svc_kei_stat` | Field | Service Contract Status — the current status of a service contract (e.g., active, suspended, completed) |
| `mskm_dtl_no` | Field | Application Detail Number — the detail record number for an application/submission |
| `upd_dtm_bf` | Field | Update DateTime (Before Update) — the timestamp before an update operation; used for audit trail |
| `mskm_stat_skbt_cd_shonin` | Field | Application Status Discrimination Code (Approved) — a flag/code indicating whether an application has been approved |
| `mskm_sbt_cd` | Field | Application Type Code — the classification code for the type of application/submission |
| `op_svc_cd` | Field | Option Service Code — the code identifying an optional add-on service (e.g., insurance, extra bandwidth) |
| `op_pcrs_cd` | Field | Option Pricing Course Code — the pricing tier code for an option service |
| `op_pplan_cd` | Field | Option Pricing Plan Code — the specific pricing plan code for an option service |
| `oya_kei_skbt_cd` | Field | Parent Contract Discrimination Code — identifies whether this contract is a child of a parent contract |
| `rule0059_auto_aply` | Field | Office Handling Fee Auto-Apply Flag — whether handling fees are automatically applied (Y/N string) |
| `prg_memo` | Field | Progress Memo — free-text notes on the processing progress of an application |
| `prg_stat` | Field | Progress Status — the current processing status (e.g., pending, in-progress, completed) |
| `prg_tkjk_1` | Field | Progress Special Notes 1 — a free-text field for special notes on processing progress |
| `net_tab_op_if_ctl_cd` | Field | Net Tab Option Info Control Code — controls display/behavior of option information on the network tab |
| `ido_dtm` | Field | Move DateTime — the full timestamp of a service migration event |
| `haiso_hmpin_stat_cd` | Field | Delivery Return Status Code — the status of a delivered item that was returned |
| 利用開始日 | Field (Japanese) | Start Date of Use — when the telecom service becomes active |
| 顧客契約引継リスト | Field (Japanese) | Customer Contract Succession List — list-viewer of contract handover records |
| 異動理由リスト | Field (Japanese) | Move Reason List — list-viewer of service migration reasons |
| サービス契約番号 | Field (Japanese) | Service Contract Number |
| SYSID | Field (Japanese/English) | System ID |
| 異動区分 | Field (Japanese) | Move Classification |
| 運用日 | Field (Japanese) | Operating Date |
| 運用日時分秒 | Field (Japanese) | Operating DateTime |
| サービス契約ステータス | Field (Japanese) | Service Contract Status |
| 申請明细番号 | Field (Japanese) | Application Detail Number |
| 更新年月日時分秒（更新前） | Field (Japanese) | Update DateTime (Before Update) |
| 申請状態識別コード（承認済） | Field (Japanese) | Application Status Discrimination Code (Approved) |
| 申請種類コード | Field (Japanese) | Application Type Code |
| オプションサービスコード | Field (Japanese) | Option Service Code |
| オプション料金コースコード | Field (Japanese) | Option Pricing Course Code |
| オプション料金プランコード | Field (Japanese) | Option Pricing Plan Code |
| 親契約識別コード | Field (Japanese) | Parent Contract Discrimination Code |
| 事務手数料自動適用否 | Field (Japanese) | Office Handling Fee Auto-Apply Flag |
| 進捗メモ | Field (Japanese) | Progress Memo |
| 進捗ステータス | Field (Japanese) | Progress Status |
| 進捗特記事項1 | Field (Japanese) | Progress Special Notes 1 |
| ネットタブオプション情報制御コード | Field (Japanese) | Net Tab Option Info Control Code |
| 異動年月日時分秒 | Field (Japanese) | Move DateTime |
| 配達返品状態コード | Field (Japanese) | Delivery Return Status Code |
| X33VDataTypeBeanInterface | Interface | The contract for data-type-viewer beans; provides `typeModelData()` for inner field type resolution |
| 共有情報ビューア | Business term (Japanese) | Shared-info-viewer — a UI component for displaying shared/common information; identified by keys starting with `"//"` |
| データタイプビューア | Business term (Japanese) | Data-type-viewer — a UI component for displaying lists of typed items; supports recursive type resolution |
| ルート指定 | Business term (Japanese) | Root-path designation — a key path format like `"fieldA/0/fieldB"` used to access nested list-viewer items |
| インデックス値 | Business term (Japanese) | Index value — the numeric position within a list (e.g., `"0"`, `"1"`, `"2"`) |
