# Business Logic — KKW02516SFBean.typeModelData() [424 LOC]

| Field | Value |
|-------|-------|
| Fully Qualified Name | `eo.web.webview.KKA16801SF.KKW02516SFBean` |
| Layer | View / Bean — Web-level data type resolution (part of the KKA16801SF screen module) |
| Module | `KKA16801SF` (Package: `eo.web.webview.KKA16801SF`) |

## 1. Role

### KKW02516SFBean.typeModelData()

This method serves as a **data-type resolver** for the service contract change screen (KKA16801SF) in a Japanese telecom operations system. Its business purpose is to translate a hierarchical key path into the corresponding Java type (Class) so the UI framework knows what kind of data each field holds, enabling dynamic rendering, validation, and binding of form elements without hard-coding types in the view layer.

The method implements a **routing/dispatch design pattern**: it receives a dotted key string (e.g., "顧客契約引継リスト/0/plan_name") and a subkey (e.g., "value", "enable", "state", or "*"), parses the key into components, and dispatches to type-specific logic based on the **item name** (the first segment of the key). Each item name corresponds to a business concept — customer contract list items, date fields, service codes, operational flags — and returns the appropriate Java `Class` (String.class, Boolean.class, Integer.class).

It supports **four distinct service type categories**: (1) **Data-type-view type** list items (nested data containers like "Customer Contract Inheritance List" and "Reason for Division List") that delegate to child beans for recursive type resolution; (2) **Date-type** fields (Start Date, End Date with year/month/day sub-parts) which expose value, enable, and state metadata; (3) **Simple string** fields (Service Contract Number, System ID, various operational dates and codes) that expose value and state; and (4) **Boolean** flag fields (Update Status Flag, Progress Special Item).

It also handles **shared-info view types** by delegating to the parent class's `typeCommonInfoData` when the key starts with `//`, enabling a consistent type-resolution mechanism across both screen-specific and shared view components. Its role in the larger system is that of a **shared utility** — it is a type introspection layer that allows the screen's data-binding framework to dynamically discover field types at runtime, supporting the framework's ability to render forms, validate input, and manage UI state based on declared data types rather than static definitions.

## 2. Processing Pattern (Detailed Business Logic)

```mermaid
flowchart TD
    START(["typeModelData key subkey"])
    START --> CHECK_NULL["key is null"]
    CHECK_NULL -->|Yes| RET_NULL1["return null"]
    CHECK_NULL -->|No| CHECK_SUBKEY["subkey is null"]
    CHECK_SUBKEY -->|Yes| SET_EMPTY["subkey empty string"]
    SET_EMPTY --> CHECK_SEP["key contains // prefix"]
    CHECK_SUBKEY -->|No| CHECK_SEP
    CHECK_SEP -->|Yes common info| RET_COMMON["super.typeCommonInfoData key"]
    CHECK_SEP -->|No| FIND_SLASH["find first / in key"]
    FIND_SLASH --> HAS_SLASH["separaterPoint > 0"]
    HAS_SLASH -->|Yes| EXTRACT_KEY["keyElement = substring before /"]
    HAS_SLASH -->|No| SET_KEY["keyElement = full key"]
    EXTRACT_KEY --> CHECK_LIST_TYPE["keyElement is Customer Contract List"]
    SET_KEY --> CHECK_LIST_TYPE
    CHECK_LIST_TYPE -->|Yes| LIST_BRANCH["List Type Branch"]
    LIST_BRANCH --> LR_CHECK["keyRemain is asterisk"]
    LR_CHECK -->|Yes| RET_INT["return Integer.class"]
    LR_CHECK -->|No| FIND_SLASH2["find second / in keyRemain"]
    FIND_SLASH2 --> SEP_CHECK["sep <= 0"]
    SEP_CHECK -->|Yes| RET_NULL2["return null"]
    SEP_CHECK -->|No| EXTRACT_IDX["keyElement = index string"]
    EXTRACT_IDX --> PARSE_IDX["parseInt keyElement"]
    PARSE_IDX --> PARSE_FAIL["NumberFormatException caught"]
    PARSE_FAIL --> RET_NULL2
    PARSE_IDX --> IDX_RANGE["index in list bounds"]
    IDX_RANGE -->|Out of bounds| RET_NULL2
    IDX_RANGE -->|Valid| RECURSE["recursive typeModelData call"]
    RECURSE --> RET_TYPE["return Type"]
    IDX_RANGE -->|Null index| RET_NULL2
    LIST_BRANCH -->|No simple| CHECK_DT1["keyElement is Use Start Date"]
    CHECK_DT1 --> DT_SUB["subkey is value enable or state"]
    DT_SUB --> SIMPLE_RET1["return String or Boolean"]
    CHECK_DT1 --> CHECK_DT2["keyElement is Use End Date variants"]
    CHECK_DT2 --> DT_SUB2["subkey is value enable or state"]
    DT_SUB2 --> SIMPLE_RET2["return String or Boolean"]
    CHECK_DT2 --> CHECK_OTHERS["other String fields"]
    CHECK_OTHERS --> SIMPLE_RET3["return String or Boolean"]
    CHECK_OTHERS --> CHECK_BOOL["chg_kahi_flg Boolean flag"]
    CHECK_BOOL --> BOOL_SUB["subkey is value or state"]
    BOOL_SUB --> SIMPLE_RET4["return Boolean or String"]
    SIMPLE_RET1 --> END_NODE(["End"])
    SIMPLE_RET2 --> END_NODE
    SIMPLE_RET3 --> END_NODE
    SIMPLE_RET4 --> END_NODE
    RET_NULL1 --> END_NODE
    RET_COMMON --> END_NODE
    RET_INT --> END_NODE
    RET_TYPE --> END_NODE
    RET_NULL2 --> END_NODE
```

**CRITICAL — Constant Resolution:**

The conditions in this method are based on **literal Japanese strings** rather than named constants. The key item names are embedded directly as string literals — they represent business-facing display names for form fields. Below are the resolved mappings:

| Literal Key Element | Business Meaning |
|---------------------|-----------------|
| `"顧客契約引継リスト"` | Customer Contract Inheritance List — a data-type-view list item containing nested service contract line items |
| `"利用開始日"` | Use Start Date — the date when the service becomes active |
| `"利用終了日（年）"` | Use End Date (Year) — year component of service end date |
| `"利用終了日（月）"` | Use End Date (Month) — month component of service end date |
| `"利用終了日（日）"` | Use End Date (Day) — day component of service end date |
| `"利用終了日"` | Use End Date — full end date |
| `"SYSID"` | System ID — internal system identifier |
| `"サービス契約番号"` | Service Contract Number — unique identifier for a service contract |
| `"異動区分"` | Division Classification — type of contract transfer/movement |
| `"異動理由リスト"` | Reason for Division List — data-type-view list of reasons for contract transfer |
| `"オプションサービス契約番号"` | Optional Service Contract Number — identifier for optional/add-on services |
| `"処理区分"` | Processing Classification — distinguishes processing type |
| `"申込番号"` | Application Number — order/application identifier |
| `"申込明細番号"` | Application Detail Number — line-item order identifier |
| `"運用年月日"` | Operating Date — date of operation |
| `"運用年月日時分秒"` | Operating Datetime — timestamp of operation |
| `"予約適用年月日"` | Reservation Application Date — date a reservation is applied |
| `"世代登録年月日時分秒"` | Generation Registration Datetime — timestamp of lineage/inheritance registration |
| `"オプションサービス契約ステータス"` | Optional Service Contract Status — status of optional service |
| `"オプションサービスコード"` | Optional Service Code — classification code for optional service |
| `"料金コースコード"` | Pricing Course Code — pricing plan classification |
| `"料金プランコード"` | Pricing Plan Code — specific pricing plan identifier |
| `"サービス開始年月日"` | Service Start Date |
| `"サービス終了年月日"` | Service End Date |
| `"サービス課金終了年月日"` | Service Billing End Date |
| `"回復年月日"` | Recovery Date — date of service restoration |
| `"最終更新年月日時分秒"` | Last Update Datetime — most recent modification timestamp |
| `"返却メッセージID"` | Return Message ID — identifier for a returned/rejected message |
| `"更新状態可否フラグ"` | Update Status Flag — boolean flag indicating whether updates are permitted |
| `"進捗特事項１"` | Progress Special Item 1 — custom progress tracking field |
| `"返却データ"` | Return Data — data returned from an operation (added via ANK-2694-00-00) |
| `"//"` separator prefix | Shared-info view type marker — triggers delegation to parent class |

## 3. Parameter Analysis

| No | Parameter Name | Type | Business Description |
|----|---------------|------|---------------------|
| 1 | `key` | `String` | A hierarchical key path identifying a specific UI field or data item. Format: `"ItemName/subkey"` or `"ItemName/index/subItemName"`. Represents the business-facing display name of a screen element (e.g., "サービス契約番号" = Service Contract Number). Special prefix `"//"` indicates a shared-info view type. Asterisk `"*"` in the sub-position requests the list element count type. Can be `null`, in which case `null` is returned immediately. |
| 2 | `subkey` | `String` | A sub-identifier within the key that specifies which metadata property to resolve. Common values: `"value"` (the data type of the field's value), `"enable"` (whether the field is editable/enabled — only on date-type fields), `"state"` (the UI state/status of the field). Can be `null`, in which case it is replaced with an empty string `""`. |

**Instance fields read by this method:**

| Field | Type | Business Description |
|-------|------|---------------------|
| `cust_kei_hktgi_list_list` | `List<? extends X33VDataTypeBeanInterface>` | The list of customer contract inheritance line items. Indexed by integer position from the key path. Each element is a data-type-view bean that supports recursive `typeModelData` calls for nested field resolution. |
| `ido_rsn_list_list` | `List<? extends X33VDataTypeBeanInterface>` | The list of reasons for division/transfer. Same structure as above — indexed by integer position, supports recursive type resolution. |

## 4. CRUD Operations / Called Services

This method performs **pure data-type resolution logic** — it contains **no database operations, no SC/CBS calls, and no Entity/table access**. All method calls are internal bean operations.

| CRUD | SC / CBS | SC Code | Entity / DB | Operation Description |
|------|----------|---------|-------------|----------------------|
| - | `super.typeCommonInfoData` | (Parent class — eo.web.webview base class) | - | Delegates to parent class for shared-info view type resolution when key starts with `//` |
| - | `X33VDataTypeBeanInterface.typeModelData` | (Data-type-view bean interface) | - | Recursive call to child bean for list item type resolution (Customer Contract Inheritance List or Reason for Division List) |
| - | `JKKAdEdit.substring` | JKKAdEdit | - | Java String.substring() — extracts key segments (used 2-3 times per list branch) |
| - | `JKKAdEditCC.substring` | JKKAdEditCC | - | Java String.substring() — extracts key segments |
| - | `JKKTelnoInfoAddMapperCC.substring` | JKKTelnoInfoAddMapperCC | - | Java String.substring() — extracts key segments |
| - | `JDKejbStringEdit.substring` | JDKejbStringEdit | - | Java String.substring() — extracts key segments |
| - | `KKW02516SFBean.typeModelData` | KKW02516SFBean | - | Self-recursive call for list item type resolution |

## 5. Dependency Trace

No screen/batch entry points found within 8 hops. Direct callers found: 1 methods.

| # | Caller (Screen/Batch) | Call Chain (Full Path to this Method) | Terminal (SC / CRUD / Entity) |
|---|----------------------|--------------------------------------|-------------------------------|
| 1 | `KKW02516SFBean` | `KKW02516SFBean.typeModelData` -> (recursive self-call) | `typeModelData [R] X33VDataTypeBeanInterface (nested bean)` |
| 2 | `KKW02516SFBean` | `KKW02516SFBean.typeModelData` -> `super.typeCommonInfoData` | `typeCommonInfoData [R] Shared-info view type resolution` |

**Terminal operations reached FROM this method:**

| Terminal | Type | Description |
|----------|------|-------------|
| `typeModelData` | R | Recursive call on list element beans (Customer Contract List / Reason for Division List) |
| `typeCommonInfoData` | R | Parent class delegation for shared-info view types |
| `substring` | - | String segment extraction (called 12+ times as part of key parsing) |

## 6. Per-Branch Detail Blocks

**Block 1** — [IF] `key == null` (L2050)

> Returns null immediately if the key parameter is null, providing a safe guard against null input.

| # | Type | Code |
|---|------|------|
| 1 | RETURN | `return null;` // key is null, no type information available |

---

**Block 2** — [ELSE IF] `subkey == null` (L2054)

> When the key is not null but subkey is null, normalizes subkey to an empty string to avoid null pointer issues in subsequent comparisons.

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

---

**Block 3** — [PROCESS] Shared-info view type check (L2061)

> Checks if the key starts with `"//"` prefix, which indicates a **shared-info view type** item (共有情報ビューン項目). If so, delegates to the parent class's `typeCommonInfoData` method for type resolution.

| # | Type | Code |
|---|------|------|
| 1 | SET | `keyElement = null;` // placeholder declaration |
| 2 | SET | `separaterPoint = key.indexOf("//");` // locate "//" prefix to check for shared-info view type |
| 3 | IF | `separaterPoint == 0` // key starts with "//" |
| 4 | &nbsp;&nbsp;RETURN | `super.typeCommonInfoData(key);` // delegate to parent class for shared-info view type resolution |

---

**Block 4** — [ELSE] Extract keyElement (first segment) (L2067)

> For non-shared-info keys, finds the first `"_"` separator and extracts the first segment as `keyElement` (the item name). If no separator exists, uses the entire key as the item name.

| # | Type | Code |
|---|------|------|
| 1 | SET | `separaterPoint = key.indexOf("/");` // find first "/" to extract the item name |
| 2 | IF | `separaterPoint > 0` // key contains "/" → it's a hierarchical path |
| 3 | &nbsp;&nbsp;SET | `keyElement = key.substring(0, separaterPoint);` // extract item name before first "/" |
| 4 | ELSE | `keyElement = key;` // no separator; entire key is the item name |

---

**Block 5** — [IF/ELSE-IF CHAIN] Item name dispatch (L2077–L2456)

> The core routing logic: each `keyElement` value is matched against known business item names, and the corresponding type information is returned based on the `subkey`.

### Block 5.1** — [IF] `keyElement.equals("顧客契約引継リスト")` (L2077)

> **Data-type-view type list** — Customer Contract Inheritance List. This is a nested data container where each list element is itself a data-type-view bean. The key path format is `"顧客契約引継リスト/index/subItemName"`.

| # | Type | Code |
|---|------|------|
| 1 | SET | `keyRemain = key.substring(separaterPoint + 1);` // extract remainder after first "/" (e.g., "0/plan_name") |
| 2 | IF | `keyRemain.equals("*")` // asterisk requests list element count type |
| 3 | &nbsp;&nbsp;RETURN | `return Integer.class;` // list size type is Integer |
| 4 | SET | `separaterPoint = keyRemain.indexOf("/");` // find second "/" to extract index |
| 5 | IF | `separaterPoint <= 0` // no separator found or invalid path |
| 6 | &nbsp;&nbsp;RETURN | `return null;` // invalid path format |
| 7 | SET | `keyElement = keyRemain.substring(0, separaterPoint);` // extract index string (e.g., "0") |
| 8 | SET | `tmpIndexInt = null;` // initialize for try block |
| 9 | TRY-CATCH | `tmpIndexInt = Integer.valueOf(keyElement);` // parse index |
| 10 | &nbsp;&nbsp;CATCH | `NumberFormatException` → `return null;` // index is not a valid integer |
| 11 | IF | `tmpIndexInt == null` // null after parse (unreachable but defensive) |
| 12 | &nbsp;&nbsp;RETURN | `return null;` // null index guard |
| 13 | SET | `tmpIndex = tmpIndexInt.intValue();` // unbox Integer to int |
| 14 | IF | `tmpIndex < 0 || tmpIndex >= cust_kei_hktgi_list_list.size()` // out of bounds |
| 15 | &nbsp;&nbsp;RETURN | `return null;` // index exceeds list size |
| 16 | SET | `keyElement = keyRemain.substring(separaterPoint + 1);` // extract sub-item name after index |
| 17 | RETURN | `return ((X33VDataTypeBeanInterface)cust_kei_hktgi_list_list.get(tmpIndex)).typeModelData(keyElement, subkey);` // recursive call on list element bean |

### Block 5.2** — [ELSE-IF] `keyElement.equals("利用開始日")` (L2108)

> **Date-type field** — Use Start Date. Exposes `value` (String), `enable` (Boolean), and `state` (String).

| # | Type | Code |
|---|------|------|
| 1 | IF | `subkey.equalsIgnoreCase("value")` |
| 2 | &nbsp;&nbsp;RETURN | `return String.class;` // the date value is a String |
| 3 | ELSE-IF | `subkey.equalsIgnoreCase("enable")` |
| 4 | &nbsp;&nbsp;RETURN | `return Boolean.class;` // whether the field is editable |
| 5 | ELSE-IF | `subkey.equalsIgnoreCase("state")` |
| 6 | &nbsp;&nbsp;RETURN | `return String.class;` // UI state/status (e.g., "normal", "disabled") |

### Block 5.3** — [ELSE-IF] `keyElement.equals("利用終了日（年）")` (L2119)

> **Date-type field (year component)** — Use End Date (Year). Same subkey structure as Block 5.2.

| # | Type | Code |
|---|------|------|
| 1 | IF | `subkey.equalsIgnoreCase("value")` → `return String.class;` // year value as String |
| 2 | ELSE-IF | `subkey.equalsIgnoreCase("enable")` → `return Boolean.class;` // editable flag |
| 3 | ELSE-IF | `subkey.equalsIgnoreCase("state")` → `return String.class;` // UI state |

### Block 5.4** — [ELSE-IF] `keyElement.equals("利用終了日（月）")` (L2130)

> **Date-type field (month component)** — Use End Date (Month). Same subkey structure.

| # | Type | Code |
|---|------|------|
| 1 | IF | `subkey.equalsIgnoreCase("value")` → `return String.class;` |
| 2 | ELSE-IF | `subkey.equalsIgnoreCase("enable")` → `return Boolean.class;` |
| 3 | ELSE-IF | `subkey.equalsIgnoreCase("state")` → `return String.class;` |

### Block 5.5** — [ELSE-IF] `keyElement.equals("利用終了日（日）")` (L2141)

> **Date-type field (day component)** — Use End Date (Day). Same subkey structure.

| # | Type | Code |
|---|------|------|
| 1 | IF | `subkey.equalsIgnoreCase("value")` → `return String.class;` |
| 2 | ELSE-IF | `subkey.equalsIgnoreCase("enable")` → `return Boolean.class;` |
| 3 | ELSE-IF | `subkey.equalsIgnoreCase("state")` → `return String.class;` |

### Block 5.6** — [ELSE-IF] `keyElement.equals("利用終了日")` (L2152)

> **Date-type field (full date)** — Use End Date (full, not split by year/month/day). Same subkey structure.

| # | Type | Code |
|---|------|------|
| 1 | IF | `subkey.equalsIgnoreCase("value")` → `return String.class;` |
| 2 | ELSE-IF | `subkey.equalsIgnoreCase("enable")` → `return Boolean.class;` |
| 3 | ELSE-IF | `subkey.equalsIgnoreCase("state")` → `return String.class;` |

### Block 5.7** — [ELSE-IF] `keyElement.equals("SYSID")` (L2163)

> **Simple String field** — System ID. Exposes `value` (String) and `state` (String). No `enable` subkey.

| # | Type | Code |
|---|------|------|
| 1 | IF | `subkey.equalsIgnoreCase("value")` → `return String.class;` // SYSID value |
| 2 | ELSE-IF | `subkey.equalsIgnoreCase("state")` → `return String.class;` // UI state |

### Block 5.8** — [ELSE-IF] `keyElement.equals("サービス契約番号")` (L2173)

> **Simple String field** — Service Contract Number (svc_kei_no). Exposes `value` (String) and `state` (String).

| # | Type | Code |
|---|------|------|
| 1 | IF | `subkey.equalsIgnoreCase("value")` → `return String.class;` |
| 2 | ELSE-IF | `subkey.equalsIgnoreCase("state")` → `return String.class;` |

### Block 5.9** — [ELSE-IF] `keyElement.equals("異動区分")` (L2183)

> **Simple String field** — Division Classification (ido_div). Exposes `value` (String) and `state` (String).

| # | Type | Code |
|---|------|------|
| 1 | IF | `subkey.equalsIgnoreCase("value")` → `return String.class;` |
| 2 | ELSE-IF | `subkey.equalsIgnoreCase("state")` → `return String.class;` |

### Block 5.10** — [IF/ELSE-IF CHAIN] `keyElement.equals("異動理由リスト")` (L2193)

> **Data-type-view type list** — Reason for Division List (ido_rsn_list). Same structure as Block 5.1 (Customer Contract Inheritance List): accepts index path, supports `*` for list count, validates index bounds, delegates recursively to child bean.

| # | Type | Code |
|---|------|------|
| 1 | SET | `keyRemain = key.substring(separaterPoint + 1);` // extract remainder |
| 2 | IF | `keyRemain.equals("*")` → `return Integer.class;` // list count type |
| 3 | SET | `separaterPoint = keyRemain.indexOf("/");` // find second separator |
| 4 | IF | `separaterPoint <= 0` → `return null;` // invalid path |
| 5 | SET | `keyElement = keyRemain.substring(0, separaterPoint);` // extract index |
| 6 | TRY-CATCH | `tmpIndexInt = Integer.valueOf(keyElement);` // parse |
| 7 | &nbsp;&nbsp;CATCH | `NumberFormatException` → `return null;` |
| 8 | IF | `tmpIndexInt == null` → `return null;` |
| 9 | SET | `tmpIndex = tmpIndexInt.intValue();` // unbox |
| 10 | IF | `tmpIndex < 0 || tmpIndex >= ido_rsn_list_list.size()` → `return null;` // out of bounds |
| 11 | SET | `keyElement = keyRemain.substring(separaterPoint + 1);` // extract sub-item name |
| 12 | RETURN | `return ((X33VDataTypeBeanInterface)ido_rsn_list_list.get(tmpIndex)).typeModelData(keyElement, subkey);` // recursive call |

### Block 5.11** — [ELSE-IF] `keyElement.equals("オプションサービス契約番号")` (L2232)

> **Simple String field** — Optional Service Contract Number (op_svc_kei_no). Exposes `value` (String) and `state` (String).

| # | Type | Code |
|---|------|------|
| 1 | IF | `subkey.equalsIgnoreCase("value")` → `return String.class;` |
| 2 | ELSE-IF | `subkey.equalsIgnoreCase("state")` → `return String.class;` |

### Block 5.12** — [ELSE-IF] `keyElement.equals("処理区分")` (L2242)

> **Simple String field** — Processing Classification (tran_div). Exposes `value` (String) and `state` (String).

| # | Type | Code |
|---|------|------|
| 1 | IF | `subkey.equalsIgnoreCase("value")` → `return String.class;` |
| 2 | ELSE-IF | `subkey.equalsIgnoreCase("state")` → `return String.class;` |

### Block 5.13** — [ELSE-IF] `keyElement.equals("申込番号")` (L2252)

> **Simple String field** — Application Number (mskm_no). Exposes `value` (String) and `state` (String).

| # | Type | Code |
|---|------|------|
| 1 | IF | `subkey.equalsIgnoreCase("value")` → `return String.class;` |
| 2 | ELSE-IF | `subkey.equalsIgnoreCase("state")` → `return String.class;` |

### Block 5.14** — [ELSE-IF] `keyElement.equals("申込明細番号")` (L2262)

> **Simple String field** — Application Detail Number (mskm_dtl_no). Exposes `value` (String) and `state` (String).

| # | Type | Code |
|---|------|------|
| 1 | IF | `subkey.equalsIgnoreCase("value")` → `return String.class;` |
| 2 | ELSE-IF | `subkey.equalsIgnoreCase("state")` → `return String.class;` |

### Block 5.15** — [ELSE-IF] `keyElement.equals("運用年月日")` (L2272)

> **Simple String field** — Operating Date (unyo_ymd). Exposes `value` (String) and `state` (String).

| # | Type | Code |
|---|------|------|
| 1 | IF | `subkey.equalsIgnoreCase("value")` → `return String.class;` |
| 2 | ELSE-IF | `subkey.equalsIgnoreCase("state")` → `return String.class;` |

### Block 5.16** — [ELSE-IF] `keyElement.equals("運用年月日時分秒")` (L2282)

> **Simple String field** — Operating Datetime (unyo_dtm). Exposes `value` (String) and `state` (String).

| # | Type | Code |
|---|------|------|
| 1 | IF | `subkey.equalsIgnoreCase("value")` → `return String.class;` |
| 2 | ELSE-IF | `subkey.equalsIgnoreCase("state")` → `return String.class;` |

### Block 5.17** — [ELSE-IF] `keyElement.equals("予約適用年月日")` (L2292)

> **Simple String field** — Reservation Application Date (rsv_aply_ymd). Exposes `value` (String) and `state` (String).

| # | Type | Code |
|---|------|------|
| 1 | IF | `subkey.equalsIgnoreCase("value")` → `return String.class;` |
| 2 | ELSE-IF | `subkey.equalsIgnoreCase("state")` → `return String.class;` |

### Block 5.18** — [ELSE-IF] `keyElement.equals("世代登録年月日時分秒")` (L2302)

> **Simple String field** — Generation Registration Datetime (gene_add_dtm). Exposes `value` (String) and `state` (String).

| # | Type | Code |
|---|------|------|
| 1 | IF | `subkey.equalsIgnoreCase("value")` → `return String.class;` |
| 2 | ELSE-IF | `subkey.equalsIgnoreCase("state")` → `return String.class;` |

### Block 5.19** — [ELSE-IF] `keyElement.equals("オプションサービス契約ステータス")` (L2312)

> **Simple String field** — Optional Service Contract Status (op_svc_kei_stat). Exposes `value` (String) and `state` (String).

| # | Type | Code |
|---|------|------|
| 1 | IF | `subkey.equalsIgnoreCase("value")` → `return String.class;` |
| 2 | ELSE-IF | `subkey.equalsIgnoreCase("state")` → `return String.class;` |

### Block 5.20** — [ELSE-IF] `keyElement.equals("オプションサービスコード")` (L2322)

> **Simple String field** — Optional Service Code (op_svc_cd). Exposes `value` (String) and `state` (String).

| # | Type | Code |
|---|------|------|
| 1 | IF | `subkey.equalsIgnoreCase("value")` → `return String.class;` |
| 2 | ELSE-IF | `subkey.equalsIgnoreCase("state")` → `return String.class;` |

### Block 5.21** — [ELSE-IF] `keyElement.equals("料金コースコード")` (L2332)

> **Simple String field** — Pricing Course Code (pcrs_cd). Exposes `value` (String) and `state` (String).

| # | Type | Code |
|---|------|------|
| 1 | IF | `subkey.equalsIgnoreCase("value")` → `return String.class;` |
| 2 | ELSE-IF | `subkey.equalsIgnoreCase("state")` → `return String.class;` |

### Block 5.22** — [ELSE-IF] `keyElement.equals("料金プランコード")` (L2342)

> **Simple String field** — Pricing Plan Code (pplan_cd). Exposes `value` (String) and `state` (String).

| # | Type | Code |
|---|------|------|
| 1 | IF | `subkey.equalsIgnoreCase("value")` → `return String.class;` |
| 2 | ELSE-IF | `subkey.equalsIgnoreCase("state")` → `return String.class;` |

### Block 5.23** — [ELSE-IF] `keyElement.equals("サービス開始年月日")` (L2352)

> **Simple String field** — Service Start Date (svc_staymd). Exposes `value` (String) and `state` (String).

| # | Type | Code |
|---|------|------|
| 1 | IF | `subkey.equalsIgnoreCase("value")` → `return String.class;` |
| 2 | ELSE-IF | `subkey.equalsIgnoreCase("state")` → `return String.class;` |

### Block 5.24** — [ELSE-IF] `keyElement.equals("サービス終了年月日")` (L2362)

> **Simple String field** — Service End Date (svc_endymd). Exposes `value` (String) and `state` (String).

| # | Type | Code |
|---|------|------|
| 1 | IF | `subkey.equalsIgnoreCase("value")` → `return String.class;` |
| 2 | ELSE-IF | `subkey.equalsIgnoreCase("state")` → `return String.class;` |

### Block 5.25** — [ELSE-IF] `keyElement.equals("サービス課金終了年月日")` (L2372)

> **Simple String field** — Service Billing End Date (svc_chrg_endymd). Exposes `value` (String) and `state` (String).

| # | Type | Code |
|---|------|------|
| 1 | IF | `subkey.equalsIgnoreCase("value")` → `return String.class;` |
| 2 | ELSE-IF | `subkey.equalsIgnoreCase("state")` → `return String.class;` |

### Block 5.26** — [ELSE-IF] `keyElement.equals("回復年月日")` (L2382)

> **Simple String field** — Recovery Date (kaihk_ymd). Exposes `value` (String) and `state` (String).

| # | Type | Code |
|---|------|------|
| 1 | IF | `subkey.equalsIgnoreCase("value")` → `return String.class;` |
| 2 | ELSE-IF | `subkey.equalsIgnoreCase("state")` → `return String.class;` |

### Block 5.27** — [ELSE-IF] `keyElement.equals("最終更新年月日時分秒")` (L2392)

> **Simple String field** — Last Update Datetime (last_upd_dtm). Exposes `value` (String) and `state` (String).

| # | Type | Code |
|---|------|------|
| 1 | IF | `subkey.equalsIgnoreCase("value")` → `return String.class;` |
| 2 | ELSE-IF | `subkey.equalsIgnoreCase("state")` → `return String.class;` |

### Block 5.28** — [ELSE-IF] `keyElement.equals("返却メッセージID")` (L2402)

> **Simple String field** — Return Message ID (rtn_msg_id). Exposes `value` (String) and `state` (String).

| # | Type | Code |
|---|------|------|
| 1 | IF | `subkey.equalsIgnoreCase("value")` → `return String.class;` |
| 2 | ELSE-IF | `subkey.equalsIgnoreCase("state")` → `return String.class;` |

### Block 5.29** — [ELSE-IF] `keyElement.equals("更新状態可否フラグ")` (L2412)

> **Boolean field** — Update Status Flag (chg_kahi_flg). Only exposes `value` (Boolean) and `state` (String). No `enable` subkey.

| # | Type | Code |
|---|------|------|
| 1 | IF | `subkey.equalsIgnoreCase("value")` → `return Boolean.class;` // flag value is Boolean |
| 2 | ELSE-IF | `subkey.equalsIgnoreCase("state")` → `return String.class;` // UI state |

### Block 5.30** — [ELSE-IF] `keyElement.equals("進捗特事項１")` (L2422)

> **Simple String field** — Progress Special Item 1 (prg_tkjk_1). Exposes `value` (String), `enable` (Boolean), and `state` (String).

| # | Type | Code |
|---|------|------|
| 1 | IF | `subkey.equalsIgnoreCase("value")` → `return String.class;` |
| 2 | ELSE-IF | `subkey.equalsIgnoreCase("enable")` → `return Boolean.class;` |
| 3 | ELSE-IF | `subkey.equalsIgnoreCase("state")` → `return String.class;` |

### Block 5.31** — [IF (ANK-2694-00-00 ADD START)] `keyElement.equals("返却データ")` (L2438)

> **Added via ANK-2694-00-00 (Wanstablep)** — Return Data (returndata). Exposes `value` (String), `enable` (Boolean), and `state` (String). This field was added as part of a WANST-UPP (ワンストップ) enhancement to handle return data from operations.

| # | Type | Code |
|---|------|------|
| 1 | IF | `subkey.equalsIgnoreCase("value")` → `return String.class;` |
| 2 | ELSE-IF | `subkey.equalsIgnoreCase("enable")` → `return Boolean.class;` |
| 3 | ELSE-IF | `subkey.equalsIgnoreCase("state")` → `return String.class;` // subkey is "state" — returns status |

### Block 6** — [DEFAULT] No matching keyElement (L2455)

> If none of the known item names match, returns null. This handles unexpected or unrecognized key elements gracefully.

| # | Type | Code |
|---|------|------|
| 1 | RETURN | `return null;` // no matching item type found |

## 7. Glossary

| Term | Type | Business Meaning |
|------|------|------------------|
| `key` | Parameter | Hierarchical key path identifying a UI field — format: "ItemName/subkey" or "ItemName/index/subItemName". Used as the primary lookup key in the type resolution framework. |
| `subkey` | Parameter | Sub-identifier within the key specifying which metadata property: `"value"` = the field's data type, `"enable"` = editability flag, `"state"` = UI state, `"*"` = list element count type. |
| `keyElement` | Field | First segment of the key path (the business-facing item name), extracted by splitting on "/". |
| `keyRemain` | Field | Remaining portion of the key after the first segment, used for list index and nested item lookup. |
| `separaterPoint` | Field | Index position of the next "/" or "//" in the key, used to parse hierarchical paths. |
| `cust_kei_hktgi_list_list` | Field | Customer Contract Inheritance List — a list of nested data-type-view beans representing line items in a service contract transfer/inheritance operation. |
| `ido_rsn_list_list` | Field | Reason for Division List — a list of nested data-type-view beans representing possible reasons for contract transfer/division. |
| `X33VDataTypeBeanInterface` | Interface | Data-type-view bean interface — contract for nested beans that support `typeModelData` for recursive type resolution. |
| `typeCommonInfoData` | Method | Parent class method — handles shared-info view type resolution for keys prefixed with "//". |
| 顧客契約引継リスト | Field (Japanese) | Customer Contract Inheritance List — a data-type-view list containing nested service contract line items for contract transfer operations. |
| 利用開始日 | Field (Japanese) | Use Start Date — the date when the service becomes active (svc_staymd). |
| 利用終了日 | Field (Japanese) | Use End Date — the date when the service ends (svc_endymd). Can be split into year/month/day sub-parts. |
| 利用終了日（年） | Field (Japanese) | Use End Date (Year) — year component of the service end date. |
| 利用終了日（月） | Field (Japanese) | Use End Date (Month) — month component of the service end date. |
| 利用終了日（日） | Field (Japanese) | Use End Date (Day) — day component of the service end date. |
| SYSID | Field (Japanese) | System ID (sysid) — internal system identifier. |
| サービス契約番号 | Field (Japanese) | Service Contract Number (svc_kei_no) — unique identifier for a service contract. |
| 異動区分 | Field (Japanese) | Division Classification (ido_div) — type of contract transfer/movement. |
| 異動理由リスト | Field (Japanese) | Reason for Division List (ido_rsn_list) — data-type-view list of reasons for contract transfer/division. |
| オプションサービス契約番号 | Field (Japanese) | Optional Service Contract Number (op_svc_kei_no) — identifier for optional/add-on services. |
| 処理区分 | Field (Japanese) | Processing Classification (tran_div) — distinguishes the type of processing operation. |
| 申込番号 | Field (Japanese) | Application Number (mskm_no) — order/application identifier. |
| 申込明細番号 | Field (Japanese) | Application Detail Number (mskm_dtl_no) — line-item order identifier. |
| 運用年月日 | Field (Japanese) | Operating Date (unyo_ymd) — date of operation. |
| 運用年月日時分秒 | Field (Japanese) | Operating Datetime (unyo_dtm) — timestamp of operation (year/month/day/hour/minute/second). |
| 予約適用年月日 | Field (Japanese) | Reservation Application Date (rsv_aply_ymd) — date a reservation is applied. |
| 世代登録年月日時分秒 | Field (Japanese) | Generation Registration Datetime (gene_add_dtm) — timestamp of lineage/inheritance registration. |
| オプションサービス契約ステータス | Field (Japanese) | Optional Service Contract Status (op_svc_kei_stat) — status of an optional/add-on service contract. |
| オプションサービスコード | Field (Japanese) | Optional Service Code (op_svc_cd) — classification code for an optional/add-on service. |
| 料金コースコード | Field (Japanese) | Pricing Course Code (pcrs_cd) — pricing plan classification code. |
| 料金プランコード | Field (Japanese) | Pricing Plan Code (pplan_cd) — specific pricing plan identifier code. |
| サービス開始年月日 | Field (Japanese) | Service Start Date (svc_staymd) — date when the service begins. |
| サービス終了年月日 | Field (Japanese) | Service End Date (svc_endymd) — date when the service ends. |
| サービス課金終了年月日 | Field (Japanese) | Service Billing End Date (svc_chrg_endymd) — date when service billing terminates. |
| 回復年月日 | Field (Japanese) | Recovery Date (kaihk_ymd) — date of service restoration/recovery. |
| 最終更新年月日時分秒 | Field (Japanese) | Last Update Datetime (last_upd_dtm) — most recent modification timestamp. |
| 返却メッセージID | Field (Japanese) | Return Message ID (rtn_msg_id) — identifier for a returned/rejected message. |
| 更新状態可否フラグ | Field (Japanese) | Update Status Flag (chg_kahi_flg) — Boolean flag indicating whether updates to the record are permitted. |
| 進捗特事項１ | Field (Japanese) | Progress Special Item 1 (prg_tkjk_1) — custom progress tracking field with enable capability. |
| 返却データ | Field (Japanese) | Return Data (returndata) — data returned from an operation (added via ANK-2694-00-00 Wanstablep enhancement). |
| 共有情報ビューン | Term (Japanese) | Shared-info View Type — a view type shared across multiple screens, indicated by "//" prefix in the key. |
| データタイプビューン型 | Term (Japanese) | Data-type-view Type — a nested container/list type where each element is itself a data-type-view bean supporting recursive type resolution. |
| X33VDataTypeList | Term | A framework class containing lists of view beans' order — holds the sequence order of beans for shared-info views. |
| ANK-2694-00-00 | Change ID | Enhancement ticket ID — added the "返却データ" (Return Data) field as part of the Wanstablep (ワンストップ) improvement project. |
| 項目名 | Term (Japanese) | Item Name — the business-facing display name used as the first segment of the key path. |
| インデックス値 | Term (Japanese) | Index Value — the numeric position within a list, extracted from the key path (e.g., "0", "1", "2" in "Customer Contract List/0/plan_name"). |
