# Business Logic — KKW00128SF01DBean.typeModelData() [267 LOC]

| Field | Value |
|-------|-------|
| Fully Qualified Name | `eo.web.webview.KKA16601SF.KKW00128SF01DBean` |
| Layer | Controller / UI Data Bean (webview layer, part of the X33 web framework) |
| Module | `KKA16601SF` (Package: `eo.web.webview.KKA16601SF`) |

## 1. Role

### KKW00128SF01DBean.typeModelData()

This method serves as the **central type-routing dispatcher** for the KKA16601SF screen's data bean, which handles the management and display of telecom service contract change orders. In business terms, it acts as a **data type resolver** -- given a field name (key) and a sub-property identifier (subkey), it returns the appropriate Java `Class<?>` type so that the X33 web framework knows how to render, bind, and validate each UI component on the service contract change screen.

The method supports approximately 18 distinct business fields, each representing a piece of service contract data such as system ID, service contract number, movement (transfer/reassignment) classification and reason codes, optional service contract numbers, application numbers, pricing codes, and discount flags. For simple scalar fields, it always returns `String.class` regardless of which subkey (`value` or `state`) is requested. For two list-type fields -- Movement Reason Code (`ido_rsn_cd_list`) and Optional Service Contract Number (`op_svc_kei_no_list`) -- it performs index-based delegation: when the key contains a `"/"` separator followed by an index, it retrieves the corresponding element from the list and delegates type resolution to that element's own `typeModelData` method.

The design pattern used here is a **routing/dispatch pattern with delegation**: the method routes based on the field name (key), then either returns a primitive type directly or delegates to child bean instances for composite (list) data. This is a standard pattern in the X33 framework's data binding architecture, where the UI layer queries the bean for type information to dynamically construct form fields and bind user input. The method plays a critical role in the screen's data model lifecycle, enabling dynamic field rendering without hard-coding field types in the view layer.

## 2. Processing Pattern (Detailed Business Logic)

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

    START --> CHECK_NULL["Check null params"]
    CHECK_NULL -->|Yes| NULL_RET["Return null"]
    CHECK_NULL -->|No| FIND_SEP["Find first '/' in key"]
    FIND_SEP --> SYSID_BRANCH["System ID branch"]
    SYSID_BRANCH --> SYS_VALUE["subkey value"]
    SYS_VALUE --> SYS_RET1["Return String.class"]
    SYSID_BRANCH --> SYS_STATE["subkey state"]
    SYS_STATE --> SYS_RET2["Return String.class"]
    SYSID_BRANCH --> SYS_UNKNOWN["unknown"]
    SYS_UNKNOWN --> SYS_DEFAULT["Return null"]

    SYSRET1 --> COMMON_END["Return result"]
    SYSRET2 --> COMMON_END
    SYS_DEFAULT --> COMMON_END

    FIND_SEP --> SVC_BRANCH["Service Contract branch"]
    SVC_BRANCH --> SVC_VALUE["subkey value"]
    SVC_VALUE --> SVC_RET["Return String.class"]
    SVC_BRANCH --> SVC_STATE["subkey state"]
    SVC_STATE --> SVC_RET2["Return String.class"]
    SVC_BRANCH --> SVC_UNKNOWN["unknown"]
    SVC_UNKNOWN --> SVC_DEFAULT["Return null"]

    SVC_RET --> COMMON_END
    SVC_RET2 --> COMMON_END
    SVC_DEFAULT --> COMMON_END

    FIND_SEP --> IDO_BRANCH["Movement Classification branch"]
    IDO_BRANCH --> IDO_VALUE["subkey value"]
    IDO_VALUE --> IDO_RET["Return String.class"]
    IDO_BRANCH --> IDO_STATE["subkey state"]
    IDO_STATE --> IDO_RET2["Return String.class"]
    IDO_BRANCH --> IDO_UNKNOWN["unknown"]
    IDO_UNKNOWN --> IDO_DEFAULT["Return null"]

    IDO_RET --> COMMON_END
    IDO_RET2 --> COMMON_END
    IDO_DEFAULT --> COMMON_END

    FIND_SEP --> IDORSN_BRANCH["Movement Reason Code branch"]
    IDORSN_BRANCH --> IDORSN_ASTERISK["key is *"]
    IDORSN_ASTERISK --> IDORSN_COUNT["Return Integer.class count"]
    IDORSN_BRANCH --> IDORSN_INDEX["Parse integer index"]
    IDORSN_INDEX --> IDORSN_BOUNDS["Index in range?"]
    IDORSN_BOUNDS -->|No| IDORSN_NULL["Return null"]
    IDORSN_BOUNDS -->|Yes| IDORSN_DELEGATE["Delegate to list element typeModelData"]
    IDORSN_DELEGATE --> IDORSN_RET["Return result"]
    IDORSN_INDEX --> IDORSN_PARSE_FAIL["Parse exception"]
    IDORSN_PARSE_FAIL --> IDORSN_NULL

    IDORSN_COUNT --> COMMON_END
    IDORSN_RET --> COMMON_END
    IDORSN_NULL --> COMMON_END

    FIND_SEP --> COMMON_BRANCH["Common String field branch"]
    COMMON_BRANCH --> COMMON_SUB["subkey value or state"]
    COMMON_SUB --> COMMON_RET["Return String.class"]
    COMMON_BRANCH --> COMMON_UNKNOWN["unknown"]
    COMMON_UNKNOWN --> COMMON_DEFAULT["Return null"]

    COMMON_RET --> COMMON_END
    COMMON_DEFAULT --> COMMON_END

    IDORSN_NULL --> COMMON_END
```

The flowchart above shows the high-level architecture. The actual method contains a long if-else-if chain covering all 18 supported fields. Each branch is described in detail in Section 6 below.

The key distinction in the processing pattern is between:
- **Scalar fields** (16 out of 18): These always return `String.class` for both `value` and `state` subkeys. They represent simple text fields on the UI form.
- **List fields** (2 out of 18): These support index-based access via a `"/"`-separated syntax in the key (e.g., `"異動理由コード/0"` for index 0). They can also accept `"*"` as the index portion to return `Integer.class` (representing the list element count). For valid indices, they delegate to the child bean's `typeModelData` method.

## 3. Parameter Analysis

| No | Parameter Name | Type | Business Description |
|----|---------------|------|---------------------|
| 1 | `key` | `String` | The field name (項目名) identifying which screen field's type to resolve. Represents a business data element from the service contract change screen, such as "System ID" (システムID), "Service Contract Number" (サービス契約番号), "Movement Reason Code" (異動理由コード), etc. For list-type fields, the key may contain a `"/"` separator followed by an integer index or the wildcard `"*"` (e.g., `"異動理由コード/0"` or `"オプションサービス契約番号/*"`). |
| 2 | `subkey` | `String` | The sub-property identifier. Typically `"value"` to request the data value's type, or `"state"` to request the UI state's type (e.g., enabled/disabled, visible/hidden status). Case-insensitive comparison. |

**Instance fields read by this method:**

| Field | Type | Business Description |
|-------|------|---------------------|
| `ido_rsn_cd_list` | `X33VDataTypeList` | List of movement reason codes (異動理由コード) -- tracks reasons for service line reassignment or transfer. Contains `X33VDataTypeStringBean` elements. |
| `op_svc_kei_no_list` | `X33VDataTypeList` | List of optional service contract numbers (オプションサービス契約番号) -- tracks optional/added services on a contract line. Contains `X33VDataTypeStringBean` elements. |

## 4. CRUD Operations / Called Services

This method is a pure **data type resolver** and does not perform any database CRUD operations directly. It only reads instance fields and delegates to child bean methods for type resolution.

| CRUD | SC / CBS | SC Code | Entity / DB | Operation Description |
|------|----------|---------|-------------|----------------------|
| - | `X33VDataTypeList.get(int)` | X33VDataTypeList | - | Retrieves an element from the movement reason code list by index (ido_rsn_cd_list). Used for index-based access in list-type field branches. |
| - | `X33VDataTypeList.get(int)` | X33VDataTypeList | - | Retrieves an element from the optional service contract number list by index (op_svc_kei_no_list). Used for index-based access in list-type field branches. |
| - | `X33VDataTypeStringBean.typeModelData(String)` | KKW00128SF01DBean | - | Delegates type resolution to a child bean element for composite list fields. Called on individual list elements for the Movement Reason Code and Optional Service Contract Number fields. |

**Note:** The pre-computed evidence lists substring operations from utility classes (`JKKAdEditCC.substring`, `JKKAdEdit.substring`, `JKKTelnoInfoAddMapperCC.substring`, `JDKejbStringEdit.substring`). These appear in the method as `key.substring(separaterPoint + 1)` calls, which are standard Java `String` operations (not the custom utility classes). The method calls `String.substring()` to extract the index portion after the "/" separator in list-type field keys.

## 5. Dependency Trace

This method is called internally by the X33 web framework's data binding mechanism. The framework invokes `typeModelData(key, subkey)` when it needs to determine the Java type of a field during UI rendering, validation, or model loading.

| # | Caller (Screen/Batch) | Call Chain (Full Path to this Method) | Terminal (SC / CRUD / Entity) |
|---|----------------------|--------------------------------------|-------------------------------|
| 1 | Screen: KKW00128SF | `X33VViewBaseBean.loadModelProperty(key, subkey)` -> `KKW00128SF01DBean.typeModelData(key, subkey)` | `String.class` / `Integer.class` (return types) |
| 2 | Screen: KKW00128SF | `KKW00128SFBean.getXxx()` -> `KKW00128SF01DBean` instance -> `typeModelData(key, subkey)` | Internal X33 framework method (no external SC/DB call) |

**From this method outward (what it ultimately calls):**

| # | Called Method | Type | Result |
|---|--------------|------|--------|
| 1 | `X33VDataTypeList.get(int index)` | READ (list access) | Retrieves child bean from `ido_rsn_cd_list` or `op_svc_kei_no_list` |
| 2 | `X33VDataTypeStringBean.typeModelData(String subkey)` | Internal | Delegates to child bean's own typeModelData for composite list fields |

**Note:** No external SC (Service Component), CBS (Common Business Service), or database tables are accessed. This method operates entirely within the UI data bean layer, resolving type information from in-memory data structures and Java built-in types.

## 6. Per-Branch Detail Blocks

### Block 1 -- IF (null check) (L1319)

Null parameter guard. If either key or subkey is null, return null immediately.

| # | Type | Code |
|---|------|------|
| 1 | IF | `if (key == null || subkey == null)` [L1320] |
| 2 | RETURN | `return null;` // Returns null if either parameter is null -- key, subkeyがnullの場合、nullを返す |

---

### Block 2 -- SET (separator extraction) (L1324)

Extracts the position of the first "/" character in the key for later use in list-type field branches.

| # | Type | Code |
|---|------|------|
| 1 | SET | `int separaterPoint = key.indexOf("/");` // Extracts the first "/" position for list-type field index parsing |

---

### Block 3 -- IF (System ID field) (L1328)

Handles the System ID field (システムID, internal ID: `sysid`). A scalar String field.

| # | Type | Code |
|---|------|------|
| 1 | IF | `if (key.equals("システムID"))` [L1329] |
| 2 | IF | `if (subkey.equalsIgnoreCase("value"))` [L1330] |
| 3 | RETURN | `return String.class;` // Returns String type for value subkey |
| 4 | ELSE-IF | `else if (subkey.equalsIgnoreCase("state"))` [L1333] subkeyが"state"の場合、ステータスを返す。 |
| 5 | RETURN | `return String.class;` // Returns String type for state subkey |

---

### Block 4 -- IF (Service Contract Number field) (L1340)

Handles the Service Contract Number field (サービス契約番号, internal ID: `svc_kei_no`). A scalar String field.

| # | Type | Code |
|---|------|------|
| 1 | ELSE-IF | `else if (key.equals("サービス契約番号"))` [L1341] |
| 2 | IF | `if (subkey.equalsIgnoreCase("value"))` [L1342] |
| 3 | RETURN | `return String.class;` // Returns String type for value subkey |
| 4 | ELSE-IF | `else if (subkey.equalsIgnoreCase("state"))` [L1345] subkeyが"state"の場合、ステータスを返す。 |
| 5 | RETURN | `return String.class;` // Returns String type for state subkey |

---

### Block 5 -- IF (Movement Classification field) (L1352)

Handles the Movement Classification field (異動区分, internal ID: `ido_div`). A scalar String field.

| # | Type | Code |
|---|------|------|
| 1 | ELSE-IF | `else if (key.equals("異動区分"))` [L1353] データタイプがStringの項目"異動区分"(項目ID:ido_div) |
| 2 | IF | `if (subkey.equalsIgnoreCase("value"))` [L1354] |
| 3 | RETURN | `return String.class;` // Returns String type for value subkey |
| 4 | ELSE-IF | `else if (subkey.equalsIgnoreCase("state"))` [L1357] subkeyが"state"の場合、ステータスを返す。 |
| 5 | RETURN | `return String.class;` // Returns String type for state subkey |

---

### Block 6 -- IF (Movement Reason Code field -- LIST TYPE) (L1364)

Handles the Movement Reason Code field (異動理由コード, internal ID: `ido_rsn_cd`). This is a **list-type** field. The key may contain a "/"-separated index for element-level access.

| # | Type | Code |
|---|------|------|
| 1 | ELSE-IF | `else if (key.equals("異動理由コード"))` [L1365] 配列項目 "異動理由コード"(String型、項目ID:ido_rsn_cd) |
| 2 | SET | `key = key.substring(separaterPoint + 1);` // Extract the element after the first "/" -- keyの次の要素を取得 |
| 3 | IF | `if (key.equals("*"))` [L1368] インデックス値の代わりに"*"が指定されていた場合、リストの要素数を返す。 |
| 4 | RETURN | `return Integer.class;` // Returns Integer for count request |
| 5 | ELSE | Default index parsing [L1371] |
| 6 | SET | `Integer tmpIndexInt = null;` |
| 7 | TRY | `tmpIndexInt = Integer.valueOf(key);` [L1374] Parse the extracted key as an integer index |
| 8 | CATCH | `catch (NumberFormatException e)` [L1378] インデックス値が数値文字列でない場合は、ここでnullを返す。 |
| 9 | RETURN | `return null;` // Invalid index string |
| 10 | IF | `if (tmpIndexInt == null)` [L1381] |
| 11 | RETURN | `return null;` // Index is null |
| 12 | SET | `int tmpIndex = tmpIndexInt.intValue();` [L1384] |
| 13 | IF | `if (tmpIndex < 0 || tmpIndex >= ido_rsn_cd_list.size())` [L1386] インデックス値がリスト個数-1を超える場合、ここでnullを返す。 |
| 14 | RETURN | `return null;` // Index out of bounds |
| 15 | RETURN | `return ((X33VDataTypeStringBean)ido_rsn_cd_list.get(tmpIndex)).typeModelData(subkey);` // Delegates to child bean's typeModelData |

---

### Block 7 -- IF (Movement Reason Memo field) (L1392)

Handles the Movement Reason Memo field (異動理由メモ, internal ID: `ido_rsn_memo`). A scalar String field.

| # | Type | Code |
|---|------|------|
| 1 | ELSE-IF | `else if (key.equals("異動理由メモ"))` [L1393] データタイプがStringの項目"異動理由メモ"(項目ID:ido_rsn_memo) |
| 2 | IF | `if (subkey.equalsIgnoreCase("value"))` [L1394] |
| 3 | RETURN | `return String.class;` // Returns String type for value subkey |
| 4 | ELSE-IF | `else if (subkey.equalsIgnoreCase("state"))` [L1397] subkeyが"state"の場合、ステータスを返す。 |
| 5 | RETURN | `return String.class;` // Returns String type for state subkey |

---

### Block 8 -- IF (Optional Service Contract Number field -- LIST TYPE) (L1404)

Handles the Optional Service Contract Number field (オプションサービス契約番号, internal ID: `op_svc_kei_no`). This is a **list-type** field. The key may contain a "/"-separated index for element-level access.

| # | Type | Code |
|---|------|------|
| 1 | ELSE-IF | `else if (key.equals("オプションサービス契約番号"))` [L1405] 配列項目 "オプションサービス契約番号"(String型、項目ID:op_svc_kei_no) |
| 2 | SET | `key = key.substring(separaterPoint + 1);` // Extract the element after the first "/" -- keyの次の要素を取得 |
| 3 | IF | `if (key.equals("*"))` [L1408] インデックス値の代わりに"*"が指定されていた場合、リストの要素数を返す。 |
| 4 | RETURN | `return Integer.class;` // Returns Integer for count request |
| 5 | ELSE | Default index parsing [L1411] |
| 6 | SET | `Integer tmpIndexInt = null;` |
| 7 | TRY | `tmpIndexInt = Integer.valueOf(key);` [L1414] Parse the extracted key as an integer index |
| 8 | CATCH | `catch (NumberFormatException e)` [L1418] インデックス値が数値文字列でない場合は、ここでnullを返す。 |
| 9 | RETURN | `return null;` // Invalid index string |
| 10 | IF | `if (tmpIndexInt == null)` [L1421] |
| 11 | RETURN | `return null;` // Index is null |
| 12 | SET | `int tmpIndex = tmpIndexInt.intValue();` [L1424] |
| 13 | IF | `if (tmpIndex < 0 || tmpIndex >= op_svc_kei_no_list.size())` [L1426] インデックス値がリスト個数-1を超える場合、ここでnullを返す。 |
| 14 | RETURN | `return null;` // Index out of bounds |
| 15 | RETURN | `return ((X33VDataTypeStringBean)op_svc_kei_no_list.get(tmpIndex)).typeModelData(subkey);` // Delegates to child bean's typeModelData |

---

### Block 9 -- IF (Processing Classification field) (L1432)

Handles the Processing Classification field (処理区分, internal ID: `tran_div`). A scalar String field.

| # | Type | Code |
|---|------|------|
| 1 | ELSE-IF | `else if (key.equals("処理区分"))` [L1433] データタイプがStringの項目"処理区分"(項目ID:tran_div) |
| 2 | IF | `if (subkey.equalsIgnoreCase("value"))` [L1434] |
| 3 | RETURN | `return String.class;` |
| 4 | ELSE-IF | `else if (subkey.equalsIgnoreCase("state"))` [L1437] subkeyが"state"の場合、ステータスを返す。 |
| 5 | RETURN | `return String.class;` |

---

### Block 10 -- IF (Application Number field) (L1444)

Handles the Application Number field (申請番号, internal ID: `mskm_no`). A scalar String field.

| # | Type | Code |
|---|------|------|
| 1 | ELSE-IF | `else if (key.equals("申請番号"))` [L1445] データタイプがStringの項目"申請番号"(項目ID:mskm_no) |
| 2 | IF | `if (subkey.equalsIgnoreCase("value"))` [L1446] |
| 3 | RETURN | `return String.class;` |
| 4 | ELSE-IF | `else if (subkey.equalsIgnoreCase("state"))` [L1449] subkeyが"state"の場合、ステータスを返す。 |
| 5 | RETURN | `return String.class;` |

---

### Block 11 -- IF (Application Detail Number field) (L1456)

Handles the Application Detail Number field (申請明細番号, internal ID: `mskm_dtl_no`). A scalar String field.

| # | Type | Code |
|---|------|------|
| 1 | ELSE-IF | `else if (key.equals("申請明細番号"))` [L1457] データタイプがStringの項目"申請明細番号"(項目ID:mskm_dtl_no) |
| 2 | IF | `if (subkey.equalsIgnoreCase("value"))` [L1458] |
| 3 | RETURN | `return String.class;` |
| 4 | ELSE-IF | `else if (subkey.equalsIgnoreCase("state"))` [L1461] subkeyが"state"の場合、ステータスを返す。 |
| 5 | RETURN | `return String.class;` |

---

### Block 12 -- IF (Specific ID Item Name field) (L1468)

Handles the Specific ID Item Name field (特定ID項目名, internal ID: `tokutei_id_kmk_nm`). A scalar String field.

| # | Type | Code |
|---|------|------|
| 1 | ELSE-IF | `else if (key.equals("特定ID項目名"))` [L1469] データタイプがStringの項目"特定ID項目名"(項目ID:tokutei_id_kmk_nm) |
| 2 | IF | `if (subkey.equalsIgnoreCase("value"))` [L1470] |
| 3 | RETURN | `return String.class;` |
| 4 | ELSE-IF | `else if (subkey.equalsIgnoreCase("state"))` [L1473] subkeyが"state"の場合、ステータスを返す。 |
| 5 | RETURN | `return String.class;` |

---

### Block 13 -- IF (Specific ID Item Value field) (L1480)

Handles the Specific ID Item Value field (特定ID項目値, internal ID: `tokutei_id_kmk_value`). A scalar String field.

| # | Type | Code |
|---|------|------|
| 1 | ELSE-IF | `else if (key.equals("特定ID項目値"))` [L1481] データタイプがStringの項目"特定ID項目値"(項目ID:tokutei_id_kmk_value) |
| 2 | IF | `if (subkey.equalsIgnoreCase("value"))` [L1482] |
| 3 | RETURN | `return String.class;` |
| 4 | ELSE-IF | `else if (subkey.equalsIgnoreCase("state"))` [L1485] subkeyが"state"の場合、ステータスを返す。 |
| 5 | RETURN | `return String.class;` |

---

### Block 14 -- IF (Popup Mode field) (L1492)

Handles the Popup Mode field (ポップアップモード, internal ID: `popup_mode`). A scalar String field.

| # | Type | Code |
|---|------|------|
| 1 | ELSE-IF | `else if (key.equals("ポップアップモード"))` [L1493] データタイプがStringの項目"ポップアップモード"(項目ID:popup_mode) |
| 2 | IF | `if (subkey.equalsIgnoreCase("value"))` [L1494] |
| 3 | RETURN | `return String.class;` |
| 4 | ELSE-IF | `else if (subkey.equalsIgnoreCase("state"))` [L1497] subkeyが"state"の場合、ステータスを返す。 |
| 5 | RETURN | `return String.class;` |

---

### Block 15 -- IF (Movement Classification Selection Screen Transition Pattern field) (L1504)

Handles the Movement Classification Selection Screen Transition Pattern field (異動区分選択画面遷移パターン, internal ID: `ido_div_seni_ptn`). A scalar String field.

| # | Type | Code |
|---|------|------|
| 1 | ELSE-IF | `else if (key.equals("異動区分選択画面遷移パターン"))` [L1505] データタイプがStringの項目"異動区分選択画面遷移パターン"(項目ID:ido_div_seni_ptn) |
| 2 | IF | `if (subkey.equalsIgnoreCase("value"))` [L1506] |
| 3 | RETURN | `return String.class;` |
| 4 | ELSE-IF | `else if (subkey.equalsIgnoreCase("state"))` [L1509] subkeyが"state"の場合、ステータスを返す。 |
| 5 | RETURN | `return String.class;` |

---

### Block 16 -- IF (Service Code field) (L1516)

Handles the Service Code field (サービスコード, internal ID: `svc_cd`). A scalar String field.

| # | Type | Code |
|---|------|------|
| 1 | ELSE-IF | `else if (key.equals("サービスコード"))` [L1517] データタイプがStringの項目"サービスコード"(項目ID:svc_cd) |
| 2 | IF | `if (subkey.equalsIgnoreCase("value"))` [L1518] |
| 3 | RETURN | `return String.class;` |
| 4 | ELSE-IF | `else if (subkey.equalsIgnoreCase("state"))` [L1521] subkeyが"state"の場合、ステータスを返す。 |
| 5 | RETURN | `return String.class;` |

---

### Block 17 -- IF (Price Group Code field) (L1528)

Handles the Price Group Code field (料金グループコード, internal ID: `prc_grp_cd`). A scalar String field.

| # | Type | Code |
|---|------|------|
| 1 | ELSE-IF | `else if (key.equals("料金グループコード"))` [L1529] データタイプがStringの項目"料金グループコード"(項目ID:prc_grp_cd) |
| 2 | IF | `if (subkey.equalsIgnoreCase("value"))` [L1530] |
| 3 | RETURN | `return String.class;` |
| 4 | ELSE-IF | `else if (subkey.equalsIgnoreCase("state"))` [L1533] subkeyが"state"の場合、ステータスを返す。 |
| 5 | RETURN | `return String.class;` |

---

### Block 18 -- IF (Price Course Code field) (L1540)

Handles the Price Course Code field (料金コースコード, internal ID: `pcrs_cd`). A scalar String field.

| # | Type | Code |
|---|------|------|
| 1 | ELSE-IF | `else if (key.equals("料金コースコード"))` [L1541] データタイプがStringの項目"料金コースコード"(項目ID:pcrs_cd) |
| 2 | IF | `if (subkey.equalsIgnoreCase("value"))` [L1542] |
| 3 | RETURN | `return String.class;` |
| 4 | ELSE-IF | `else if (subkey.equalsIgnoreCase("state"))` [L1545] subkeyが"state"の場合、ステータスを返す。 |
| 5 | RETURN | `return String.class;` |

---

### Block 19 -- IF (Price Plan Code field) (L1552)

Handles the Price Plan Code field (料金プランコード, internal ID: `pplan_cd`). A scalar String field.

| # | Type | Code |
|---|------|------|
| 1 | ELSE-IF | `else if (key.equals("料金プランコード"))` [L1553] データタイプがStringの項目"料金プランコード"(項目ID:pplan_cd) |
| 2 | IF | `if (subkey.equalsIgnoreCase("value"))` [L1554] |
| 3 | RETURN | `return String.class;` |
| 4 | ELSE-IF | `else if (subkey.equalsIgnoreCase("state"))` [L1557] subkeyが"state"の場合、ステータスを返す。 |
| 5 | RETURN | `return String.class;` |

---

### Block 20 -- IF (Pre-Change Service Code field) (L1564)

Handles the Pre-Change Service Code field (変更前サービスコード, internal ID: `svc_cd_bf`). A scalar String field for tracking the service code before a change.

| # | Type | Code |
|---|------|------|
| 1 | ELSE-IF | `else if (key.equals("変更前サービスコード"))` [L1565] データタイプがStringの項目"変更前サービスコード"(項目ID:svc_cd_bf) |
| 2 | IF | `if (subkey.equalsIgnoreCase("value"))` [L1566] |
| 3 | RETURN | `return String.class;` |
| 4 | ELSE-IF | `else if (subkey.equalsIgnoreCase("state"))` [L1569] subkeyが"state"の場合、ステータスを返す。 |
| 5 | RETURN | `return String.class;` |

---

### Block 21 -- IF (Pre-Change Price Group Code field) (L1576)

Handles the Pre-Change Price Group Code field (変更前料金グループコード, internal ID: `prc_grp_cd_bf`). A scalar String field for tracking the price group before a change.

| # | Type | Code |
|---|------|------|
| 1 | ELSE-IF | `else if (key.equals("変更前料金グループコード"))` [L1577] データタイプがStringの項目"変更前料金グループコード"(項目ID:prc_grp_cd_bf) |
| 2 | IF | `if (subkey.equalsIgnoreCase("value"))` [L1578] |
| 3 | RETURN | `return String.class;` |
| 4 | ELSE-IF | `else if (subkey.equalsIgnoreCase("state"))` [L1581] subkeyが"state"の場合、ステータスを返す。 |
| 5 | RETURN | `return String.class;` |

---

### Block 22 -- IF (Pre-Change Price Course Code field) (L1588)

Handles the Pre-Change Price Course Code field (変更前料金コースコード, internal ID: `pcrs_cd_bf`). A scalar String field for tracking the price course before a change.

| # | Type | Code |
|---|------|------|
| 1 | ELSE-IF | `else if (key.equals("変更前料金コースコード"))` [L1589] データタイプがStringの項目"変更前料金コースコード"(項目ID:pcrs_cd_bf) |
| 2 | IF | `if (subkey.equalsIgnoreCase("value"))` [L1590] |
| 3 | RETURN | `return String.class;` |
| 4 | ELSE-IF | `else if (subkey.equalsIgnoreCase("state"))` [L1593] subkeyが"state"の場合、ステータスを返す。 |
| 5 | RETURN | `return String.class;` |

---

### Block 23 -- IF (Pre-Change Price Plan Code field) (L1600)

Handles the Pre-Change Price Plan Code field (変更前料金プランコード, internal ID: `pplan_cd_bf`). A scalar String field for tracking the price plan before a change.

| # | Type | Code |
|---|------|------|
| 1 | ELSE-IF | `else if (key.equals("変更前料金プランコード"))` [L1601] データタイプがStringの項目"変更前料金プランコード"(項目ID:pplan_cd_bf) |
| 2 | IF | `if (subkey.equalsIgnoreCase("value"))` [L1602] |
| 3 | RETURN | `return String.class;` |
| 4 | ELSE-IF | `else if (subkey.equalsIgnoreCase("state"))` [L1605] subkeyが"state"の場合、ステータスを返す。 |
| 5 | RETURN | `return String.class;` |

---

### Block 24 -- IF (Discount Auto-Apply Exclusion Flag field) (L1612)

Handles the Discount Auto-Apply Exclusion Flag field (割引自動適用対象外フラグ, internal ID: `wrib_auto_aply_tg_gai_flg`). A scalar String field.

| # | Type | Code |
|---|------|------|
| 1 | ELSE-IF | `else if (key.equals("割引自動適用対象外フラグ"))` [L1613] データタイプがStringの項目"割引自動適用対象外フラグ"(項目ID:wrib_auto_aply_tg_gai_flg) |
| 2 | IF | `if (subkey.equalsIgnoreCase("value"))` [L1614] |
| 3 | RETURN | `return String.class;` |
| 4 | ELSE-IF | `else if (subkey.equalsIgnoreCase("state"))` [L1617] subkeyが"state"の場合、ステータスを返す。 |
| 5 | RETURN | `return String.class;` |

---

### Block 25 -- ELSE (no matching property) (L1622)

Fallback case. If no known field name matches the provided key, return null.

| # | Type | Code |
|---|------|------|
| 1 | ELSE | No match found [L1623] 条件に合致するプロパティが存在しない場合は、nullを返す。 |
| 2 | RETURN | `return null;` // No matching property found |

---

## 7. Glossary

| Term | Type | Business Meaning |
|------|------|------------------|
| `sysid` | Field | System ID -- internal system identifier for tracking processing sessions |
| `sysid_update` | Field | System ID update flag -- indicates whether the system ID has been modified |
| `svc_kei_no` | Field | Service contract number -- the unique identifier for a service contract line item |
| `svc_kei_no_value` | Field | Service contract number value -- the actual contract number string |
| `svc_kei_no_state` | Field | Service contract number state -- UI state flag (enabled/disabled, etc.) |
| `ido_div` | Field | Movement classification -- classifies the type of service line transfer/reassignment |
| `ido_div_value` | Field | Movement classification value |
| `ido_rsn_cd` | Field | Movement reason code -- the code indicating why a service line was transferred or reassigned |
| `ido_rsn_cd_list` | Field | List of movement reason codes -- collection of X33VDataTypeStringBean elements |
| `ido_rsn_memo` | Field | Movement reason memo -- free-text explanation for the movement/reassignment reason |
| `op_svc_kei_no` | Field | Optional service contract number -- identifies optional/add-on services on a contract line |
| `op_svc_kei_no_list` | Field | List of optional service contract numbers -- collection of X33VDataTypeStringBean elements |
| `tran_div` | Field | Processing classification -- categorizes the type of processing operation (add, change, cancel, etc.) |
| `mskm_no` | Field | Application number -- the unique identifier for a service change application/requests |
| `mskm_dtl_no` | Field | Application detail number -- the unique identifier for a specific line item within an application |
| `tokutei_id_kmk_nm` | Field | Specific ID item name -- identifies a custom or named identifier field |
| `tokutei_id_kmk_value` | Field | Specific ID item value -- the actual value of the custom identifier field |
| `popup_mode` | Field | Popup mode -- controls popup window behavior for this field |
| `ido_div_seni_ptn` | Field | Movement classification selection screen transition pattern -- determines navigation pattern to the movement classification selection screen |
| `svc_cd` | Field | Service code -- identifies the type of telecom service (FTTH, Mail, etc.) |
| `prc_grp_cd` | Field | Price group code -- categorizes the pricing tier/group for a service |
| `pcrs_cd` | Field | Price course code -- identifies a specific pricing plan/course |
| `pplan_cd` | Field | Price plan code -- identifies the specific billing plan |
| `svc_cd_bf` | Field | Pre-change service code -- the service code before a modification was applied |
| `prc_grp_cd_bf` | Field | Pre-change price group code -- the price group before modification |
| `pcrs_cd_bf` | Field | Pre-change price course code -- the price course before modification |
| `pplan_cd_bf` | Field | Pre-change price plan code -- the price plan before modification |
| `wrib_auto_aply_tg_gai_flg` | Field | Discount auto-apply exclusion flag -- indicates whether automatic discounts should be excluded |
| `syscd` | Field | External system code -- identifies external system context (added via ANK-2693) |
| `key` | Parameter | Field name -- the business field identifier used to look up type metadata |
| `subkey` | Parameter | Sub-property name -- typically `"value"` for the data type or `"state"` for the UI state type |
| X33 | Acronym | Fujitsu Futurity X33 Web Framework -- enterprise web application framework used for the UI layer |
| X33VDataTypeStringBean | Class | X33 data type bean for String-typed fields -- contains value, update flag, and state sub-properties |
| X33VDataTypeList | Class | X33 generic list data type container -- manages a list of typed bean elements |
| 異動 (Idou) | Japanese term | Movement/Transfer -- reassignment or change of a service line within the telecom network |
| 契約 (Keiyaku) | Japanese term | Contract -- service agreement between the provider and customer |
| 申請 (Shinsei) | Japanese term | Application -- request for a service change, add, or delete |
| 料金 (Ryokin) | Japanese term | Price/Cost -- billing-related information for a service |
| フラグ (Furagu) | Japanese term | Flag -- boolean indicator stored as a String (e.g., discount exclusion flag) |
| KKA16601SF | Screen ID | Service contract change screen -- the UI screen for managing service contract modifications |
| SF | Suffix | Service Function -- indicates a screen-level functional module in the K-Opticom system |
| DBean | Suffix | Data Bean -- a UI data model bean implementing X33's data binding interfaces |
