# Business Logic — KKW01601SF02DBean.typeModelData() [1107 LOC]

| Field | Value |
|-------|-------|
| Fully Qualified Name | `eo.web.webview.KKA15301SF.KKW01601SF02DBean` |
| Layer | Data Bean / View Controller (Web presentation tier — `eo.web.webview` package) |
| Module | `KKA15301SF` (Package: `eo.web.webview.KKA15301SF`) |

## 1. Role

### KKW01601SF02DBean.typeModelData()

This method implements a **data type routing/dispatch pattern** for the K-Opticom web application's data binding framework. It maps **billing contract history** (請求契約履歴) field names and sub-keys to their corresponding Java runtime types (`String.class`, `Boolean.class`), enabling the framework to perform compile-time-safe property access on bean instances at runtime.

The method handles fields across multiple business domains within the **billing and contract history** context: payment review results, payment methods (bank transfer, credit card), financial institution details (bank name, branch code), card information (card number, expiry, card type), customer information (postal code, address components, phone number, department, responsible person name), invoice-related flags, audit timestamps, authorization records, and mask/flags for display fields.

It implements a **delegation pattern** through a long `if-else if` chain (approximately 70+ key conditions), where each key represents a specific business field name in Japanese. Each key branch further dispatches on the `subkey` parameter to distinguish between `value` (the actual data value), `enable` (editability flag), and `state` (UI state). This pattern is consistent with the X31/X33 web framework's data binding contract where `typeModelData` serves as a reflection-free alternative to Java's `Class` introspection.

The method is a **shared utility** called by the parent bean's `typeModelData` dispatcher (KKW01601SFBean) to resolve field types for the "billing contract history" list items, and is indirectly invoked by multiple screens: KKSV0381, KKSV0384, KKSV0403, KKSV0405, KKSV0406, and KKSV1057 through their respective OPDBMapper mapping classes. It plays no CRUD role — it is purely a **type resolution utility** with zero side effects.

## 2. Processing Pattern (Detailed Business Logic)

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

    START --> CHECK_NULL["key or subkey is null"]
    CHECK_NULL -->|Yes| RETURN_NULL["return null"]
    CHECK_NULL -->|No| COMPUTE_INDEX["compute separaterPoint = key.indexOf('/')"]

    COMPUTE_INDEX --> BRANCH_SEL["key equals '選択'"]
    BRANCH_SEL -->|Yes| SEL_SUB["subkey check"]
    BRANCH_SEL -->|No| BRANCH_KEI["key equals '請求契約番号'"]

    SEL_SUB --> SEL_VALUE["subkey equals 'value' (case-insensitive)"]
    SEL_VALUE -->|Yes| RET_STR1["return String.class"]
    SEL_SUB --> SEL_ENBL["subkey equals 'enable'"]
    SEL_ENBL -->|Yes| RET_BOOL1["return Boolean.class"]
    SEL_SUB --> SEL_STT["subkey equals 'state'"]
    SEL_STT -->|Yes| RET_STR2["return String.class"]

    BRANCH_KEI --> KEI_VALUE["subkey equals 'value'"]
    KEI_VALUE -->|Yes| RET_STR3["return String.class"]
    BRANCH_KEI --> KEI_ENBL["subkey equals 'enable'"]
    KEI_ENBL -->|Yes| RET_BOOL2["return Boolean.class"]
    BRANCH_KEI --> KEI_STT["subkey equals 'state'"]
    KEI_STT -->|Yes| RET_STR4["return String.class"]

    KEI_STT -->|No| MANY_FIELDS["remaining ~70 field keys"]

    MANY_FIELDS --> FR_BRANCH1["key: '支払い審査結果コード'"]
    FR_BRANCH1 --> FR1_SUB["subkey check"]
    FR1_SUB --> FR1_VALUE["subkey equals 'value'"]
    FR1_VALUE -->|Yes| RET_STR5["return String.class"]
    FR1_SUB --> FR1_STT["subkey equals 'state'"]
    FR1_STT -->|Yes| RET_STR6["return String.class"]

    FR1_STT -->|No| FR_BRANCH2["key: 'カード有効期限'"]
    FR_BRANCH2 --> FR2_SUB["subkey check"]
    FR2_SUB --> FR2_VALUE["subkey equals 'value'"]
    FR2_VALUE -->|Yes| RET_STR7["return String.class"]
    FR2_SUB --> FR2_ENBL["subkey equals 'enable'"]
    FR2_ENBL -->|Yes| RET_BOOL3["return Boolean.class"]
    FR2_SUB --> FR2_STT["subkey equals 'state'"]
    FR2_STT -->|Yes| RET_STR8["return String.class"]

    FR2_STT -->|No| FR_BRANCH3["key: '請求方法番号（クレジットカード）'"]
    FR_BRANCH3 --> FR3_SUB["subkey check"]
    FR3_SUB --> FR3_VALUE["subkey equals 'value'"]
    FR3_VALUE -->|Yes| RET_STR9["return String.class"]
    FR3_SUB --> FR3_STT["subkey equals 'state'"]
    FR3_STT -->|Yes| RET_STR10["return String.class"]

    FR3_STT -->|No| ALL_REMAIN["remaining fields (mask, flag, etc.)"]

    ALL_REMAIN --> M_BRANCH["key: '適用年月日マスク保持'"]
    M_BRANCH --> M_SUB["subkey check"]
    M_SUB --> M_VALUE["subkey equals 'value'"]
    M_VALUE -->|Yes| RET_STR11["return String.class"]
    M_SUB --> M_STT["subkey equals 'state'"]
    M_STT -->|Yes| RET_STR12["return String.class"]

    M_STT -->|No| END_NODE["return null"]
    RETURN_NULL --> END_NODE
    RET_STR1 --> END_NODE
    RET_STR2 --> END_NODE
    RET_STR3 --> END_NODE
    RET_STR4 --> END_NODE
    RET_BOOL1 --> END_NODE
    RET_BOOL2 --> END_NODE
    RET_STR5 --> END_NODE
    RET_STR6 --> END_NODE
    RET_STR7 --> END_NODE
    RET_STR8 --> END_NODE
    RET_STR9 --> END_NODE
    RET_STR10 --> END_NODE
    RET_STR11 --> END_NODE
    RET_STR12 --> END_NODE
```

**Processing Summary:**

1. **Null Guard** — If either `key` or `subkey` is `null`, return `null` immediately.
2. **Separator Index Computation** — Compute `separaterPoint = key.indexOf('/')`. (Note: the result is never used — this appears to be a vestigial computation.)
3. **Key Dispatch** — A chain of ~70 `else if(key.equals("JapaneseFieldName"))` conditions matches the input `key` against known field names. Each key corresponds to a specific business field listed in the KKW01601SFConst constant class.
4. **Sub-key Dispatch** — Within each matched key block, a nested `if-else if` chain dispatches on `subkey`:
   - `value` (case-insensitive) → `String.class`
   - `enable` (case-insensitive) → `Boolean.class`
   - `state` (case-insensitive) → `String.class`
5. **Notable sub-key patterns**: Some fields (e.g., "支払い方法コード", "請求書発行要否コード") have only `value` and `state` sub-keys (no `enable`). The "選択" (selection) field additionally supports `enable` with `Boolean.class`.
6. **Fallback** — If no key matches, return `null`.

## 3. Parameter Analysis

| No | Parameter Name | Type | Business Description |
|----|---------------|------|---------------------|
| 1 | `key` | `String` | Field name in Japanese — the business identifier of a billing/contract-history data item. Examples: "選択" (Selection), "請求契約番号" (Billing Contract Number), "支払い審査結果" (Payment Review Result), "口座番号" (Account Number), "クレジットカード" (Credit Card). Each `key` maps to a specific field in the billing contract history entity. |
| 2 | `subkey` | `String` | Sub-key identifying which property facet of the field to resolve: `value` (the data value itself), `enable` (whether the field is editable), or `state` (the UI state/status). Case-insensitive comparison. |

**Instance fields or external state read:** None. This method is entirely stateless — it does not read any instance fields, static variables, or external resources. It is a pure function of its two parameters.

## 4. CRUD Operations / Called Services

This method performs **no CRUD operations** and **calls no services**. It is a pure type-mapping utility with zero side effects. No database reads, writes, updates, or deletes occur.

| CRUD | SC / CBS | SC Code | Entity / DB | Operation Description |
|------|----------|---------|-------------|----------------------|
| — | — | — | — | No method calls — pure type resolution utility |

## 5. Dependency Trace

| # | Caller (Screen/Batch) | Call Chain (Full Path to this Method) | Terminal (SC / CRUD / Entity) |
|---|----------------------|--------------------------------------|-------------------------------|
| 1 | Screen:KKSV0381 | `KKSV0381OPDBMapper` → Bean access via constants → `KKW01601SFBean.typeModelData` → `KKW01601SF02DBean.typeModelData` | N/A (no CRUD) |
| 2 | Screen:KKSV0384 | `KKSV0384OPDBMapper` → Bean access via constants → `KKW01601SFBean.typeModelData` → `KKW01601SF02DBean.typeModelData` | N/A (no CRUD) |
| 3 | Screen:KKSV0403 | `KKSV0403OPDBMapper` → Bean access via constants → `KKW01601SFBean.typeModelData` → `KKW01601SF02DBean.typeModelData` | N/A (no CRUD) |
| 4 | Screen:KKSV0405 | `KKSV0405OPDBMapper` → Bean access via constants → `KKW01601SFBean.typeModelData` → `KKW01601SF02DBean.typeModelData` | N/A (no CRUD) |
| 5 | Screen:KKSV0406 | `KKSV0406OPDBMapper` → Bean access via constants → `KKW01601SFBean.typeModelData` → `KKW01601SF02DBean.typeModelData` | N/A (no CRUD) |
| 6 | Screen:KKSV1057 | `KKSV1057OPDBMapper` → Bean access via constants → `KKW01601SFBean.typeModelData` → `KKW01601SF02DBean.typeModelData` | N/A (no CRUD) |
| 7 | Parent Bean | `KKW01601SFBean.typeModelData(key, subkey)` directly delegates to `KKW01601SF02DBean.typeModelData(key, subkey)` | N/A (no CRUD) |

**Call pattern detail:** The `KKW01601SFBean` (parent container) contains a `typeModelData(String key, String subkey)` method that internally creates instances of `KKW01601SF02DBean` for the "billing contract history" list items, and delegates type resolution by calling `KKW01601SF02DBean.typeModelData` as a static utility or on the created instance. The `KKW01601SFBean.typeModelData(String key, String subkey)` method (at line 26314) is the direct delegator.

The `KKW01601SF02DBean` also has a duplicate copy at `source/koptWebB/...` mirroring the same implementation for the WebB build variant.

## 6. Per-Branch Detail Blocks

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

> Guard clause: return `null` if either parameter is `null`.

| # | Type | Code |
|---|------|------|
| 1 | IF | `if (key == null || subkey == null)` [null check] |
| 2 | RETURN | `return null;` |

**Block 2** — EXEC (unused computation) (L5435)

| # | Type | Code |
|---|------|------|
| 1 | SET | `int separaterPoint = key.indexOf("/");` // Computes '/' index — result unused |

**Block 3** — IF-ELSE-IF CHAIN — Key Dispatch (L5438–L6530)

> Each top-level `else if(key.equals("..."))` block matches a specific business field name. Inside, sub-key branches resolve the Java type.

---

**Block 3.1** — IF (key equals "選択" / Selection) (L5438)

> The "Selection" field — used for dropdown/select list UI components.

| # | Type | Code |
|---|------|------|
| 1 | IF | `if (subkey.equalsIgnoreCase("value"))` |
| 2 | RETURN | `return String.class;` |
| 3 | ELSE-IF | `else if (subkey.equalsIgnoreCase("enable"))` |
| 4 | RETURN | `return Boolean.class;` // Enable/disable toggle |
| 5 | ELSE-IF | `else if (subkey.equalsIgnoreCase("state"))` [subkeyが"state"の場合、ステータスを返す / Return status when subkey is "state"] |
| 6 | RETURN | `return String.class;` |

---

**Block 3.2** — IF-ELSE-IF (key equals "請求契約番号" / Billing Contract Number) (L5454)

> Field ID: `l_rireki_seiky_kei_no` — The billing contract number identifying a contract line item.

| # | Type | Code |
|---|------|------|
| 1 | IF | `if (subkey.equalsIgnoreCase("value"))` |
| 2 | RETURN | `return String.class;` |
| 3 | ELSE-IF | `else if (subkey.equalsIgnoreCase("enable"))` |
| 4 | RETURN | `return Boolean.class;` |
| 5 | ELSE-IF | `else if (subkey.equalsIgnoreCase("state"))` |
| 6 | RETURN | `return String.class;` |

---

**Block 3.3** — IF (key equals "支払い審査結果" / Payment Review Result) (L5470)

> Field ID: `l_rireki_pay_skekka` — The result of payment review (approval/rejection status).

| # | Type | Code |
|---|------|------|
| 1 | IF | `if (subkey.equalsIgnoreCase("value"))` |
| 2 | RETURN | `return String.class;` |
| 3 | ELSE-IF | `else if (subkey.equalsIgnoreCase("enable"))` |
| 4 | RETURN | `return Boolean.class;` |
| 5 | ELSE-IF | `else if (subkey.equalsIgnoreCase("state"))` |
| 6 | RETURN | `return String.class;` |

---

**Block 3.4** — IF (key equals "支払い審査結果コード" / Payment Review Result Code) (L5486)

> Field ID: `l_rireki_pay_skekka_cd` — The coded identifier for the payment review result.

| # | Type | Code |
|---|------|------|
| 1 | IF | `if (subkey.equalsIgnoreCase("value"))` |
| 2 | RETURN | `return String.class;` |
| 3 | ELSE-IF | `else if (subkey.equalsIgnoreCase("enable"))` |
| 4 | RETURN | `return Boolean.class;` |
| 5 | ELSE-IF | `else if (subkey.equalsIgnoreCase("state"))` |
| 6 | RETURN | `return String.class;` |

---

**Block 3.5** — IF (key equals "適用年月日" / Effective Date) (L5502)

> Field ID: `l_rireki_aply_ymd` — The effective start date when the contract takes effect.

| # | Type | Code |
|---|------|------|
| 1 | IF | `if (subkey.equalsIgnoreCase("value"))` |
| 2 | RETURN | `return String.class;` |
| 3 | ELSE-IF | `else if (subkey.equalsIgnoreCase("enable"))` |
| 4 | RETURN | `return Boolean.class;` |
| 5 | ELSE-IF | `else if (subkey.equalsIgnoreCase("state"))` |
| 6 | RETURN | `return String.class;` |

---

**Block 3.6** — IF (key equals "終了年月日" / End Date) (L5518)

> Field ID: `l_rireki_end_ymd` — The contract end/termination date.

| # | Type | Code |
|---|------|------|
| 1 | IF | `if (subkey.equalsIgnoreCase("value"))` |
| 2 | RETURN | `return String.class;` |
| 3 | ELSE-IF | `else if (subkey.equalsIgnoreCase("enable"))` |
| 4 | RETURN | `return Boolean.class;` |
| 5 | ELSE-IF | `else if (subkey.equalsIgnoreCase("state"))` |
| 6 | RETURN | `return String.class;` |

---

**Block 3.7** — IF (key equals "調整日" / Adjustment Date) (L5534)

> Field ID: `l_rireki_adj_ymd` — The adjustment/proration date for billing.

| # | Type | Code |
|---|------|------|
| 1 | IF | `if (subkey.equalsIgnoreCase("value"))` |
| 2 | RETURN | `return String.class;` |
| 3 | ELSE-IF | `else if (subkey.equalsIgnoreCase("enable"))` |
| 4 | RETURN | `return Boolean.class;` |
| 5 | ELSE-IF | `else if (subkey.equalsIgnoreCase("state"))` |
| 6 | RETURN | `return String.class;` |

---

**Block 3.8** — IF (key equals "支払い方法" / Payment Method) (L5550)

> Field ID: `l_rireki_payway` — The payment method (e.g., bank transfer, credit card).

| # | Type | Code |
|---|------|------|
| 1 | IF | `if (subkey.equalsIgnoreCase("value"))` |
| 2 | RETURN | `return String.class;` |
| 3 | ELSE-IF | `else if (subkey.equalsIgnoreCase("enable"))` |
| 4 | RETURN | `return Boolean.class;` |
| 5 | ELSE-IF | `else if (subkey.equalsIgnoreCase("state"))` |
| 6 | RETURN | `return String.class;` |

---

**Block 3.9** — IF (key equals "支払い方法コード" / Payment Method Code) (L5566)

> Field ID: `l_rireki_payway_cd` — Code identifier for the payment method. Only `value` and `state` sub-keys (no `enable`).

| # | Type | Code |
|---|------|------|
| 1 | IF | `if (subkey.equalsIgnoreCase("value"))` |
| 2 | RETURN | `return String.class;` |
| 3 | ELSE-IF | `else if (subkey.equalsIgnoreCase("state"))` |
| 4 | RETURN | `return String.class;` |

---

**Block 3.10** — IF (key equals "請求先名" / Billing Recipient Name) (L5579)

> Field ID: `l_rireki_seiky_kei_nm` — The name of the billing recipient entity.

| # | Type | Code |
|---|------|------|
| 1 | IF | `if (subkey.equalsIgnoreCase("value"))` |
| 2 | RETURN | `return String.class;` |
| 3 | ELSE-IF | `else if (subkey.equalsIgnoreCase("enable"))` |
| 4 | RETURN | `return Boolean.class;` |
| 5 | ELSE-IF | `else if (subkey.equalsIgnoreCase("state"))` |
| 6 | RETURN | `return String.class;` |

---

**Block 3.11** — IF (key equals "請求契約カナ名" / Billing Contract Kana Name) (L5595)

> Field ID: `l_rireki_seiky_kei_kana` — Kana (phonetic) name of the billing contract entity.

| # | Type | Code |
|---|------|------|
| 1 | IF | `if (subkey.equalsIgnoreCase("value"))` |
| 2 | RETURN | `return String.class;` |
| 3 | ELSE-IF | `else if (subkey.equalsIgnoreCase("enable"))` |
| 4 | RETURN | `return Boolean.class;` |
| 5 | ELSE-IF | `else if (subkey.equalsIgnoreCase("state"))` |
| 6 | RETURN | `return String.class;` |

---

**Block 3.12** — IF (key equals "請求契約ローマ字" / Billing Contract Romaji Name) (L5611)

> Field ID: `l_rireki_seiky_kei_romaji` — Romaji (Latin-alphabet) name of the billing contract entity.

| # | Type | Code |
|---|------|------|
| 1 | IF | `if (subkey.equalsIgnoreCase("value"))` |
| 2 | RETURN | `return String.class;` |
| 3 | ELSE-IF | `else if (subkey.equalsIgnoreCase("enable"))` |
| 4 | RETURN | `return Boolean.class;` |
| 5 | ELSE-IF | `else if (subkey.equalsIgnoreCase("state"))` |
| 6 | RETURN | `return String.class;` |

---

**Block 3.13** — IF (key equals "初回請求月" / First Billing Month) (L5627)

> Field ID: `l_rireki_first_seiky` — The month of the first invoice.

| # | Type | Code |
|---|------|------|
| 1 | IF | `if (subkey.equalsIgnoreCase("value"))` |
| 2 | RETURN | `return String.class;` |
| 3 | ELSE-IF | `else if (subkey.equalsIgnoreCase("enable"))` |
| 4 | RETURN | `return Boolean.class;` |
| 5 | ELSE-IF | `else if (subkey.equalsIgnoreCase("state"))` |
| 6 | RETURN | `return String.class;` |

---

**Block 3.14** — IF (key equals "請求書発行要否" / Invoice Issuance Required) (L5643)

> Field ID: `l_rireki_sks_hakko_yh` — Flag indicating whether an invoice should be issued.

| # | Type | Code |
|---|------|------|
| 1 | IF | `if (subkey.equalsIgnoreCase("value"))` |
| 2 | RETURN | `return String.class;` |
| 3 | ELSE-IF | `else if (subkey.equalsIgnoreCase("enable"))` |
| 4 | RETURN | `return Boolean.class;` |
| 5 | ELSE-IF | `else if (subkey.equalsIgnoreCase("state"))` |
| 6 | RETURN | `return String.class;` |

---

**Block 3.15** — IF (key equals "請求書発行要否コード" / Invoice Issuance Required Code) (L5659)

> Field ID: `l_rireki_sks_hakko_yh_cd` — Code for invoice issuance flag. Only `value` and `state` sub-keys.

| # | Type | Code |
|---|------|------|
| 1 | IF | `if (subkey.equalsIgnoreCase("value"))` |
| 2 | RETURN | `return String.class;` |
| 3 | ELSE-IF | `else if (subkey.equalsIgnoreCase("state"))` |
| 4 | RETURN | `return String.class;` |

---

**Block 3.16** — IF (key equals "金融機関名" / Financial Institution Name) (L5672)

> Field ID: `l_rireki_bank_nm` — The name of the bank or financial institution for payment.

| # | Type | Code |
|---|------|------|
| 1 | IF | `if (subkey.equalsIgnoreCase("value"))` |
| 2 | RETURN | `return String.class;` |
| 3 | ELSE-IF | `else if (subkey.equalsIgnoreCase("enable"))` |
| 4 | RETURN | `return Boolean.class;` |
| 5 | ELSE-IF | `else if (subkey.equalsIgnoreCase("state"))` |
| 6 | RETURN | `return String.class;` |

---

**Block 3.17** — IF (key equals "支店名" / Branch Name) (L5688)

> Field ID: `l_rireki_shiten_nm` — The bank branch name.

| # | Type | Code |
|---|------|------|
| 1 | IF | `if (subkey.equalsIgnoreCase("value"))` |
| 2 | RETURN | `return String.class;` |
| 3 | ELSE-IF | `else if (subkey.equalsIgnoreCase("enable"))` |
| 4 | RETURN | `return Boolean.class;` |
| 5 | ELSE-IF | `else if (subkey.equalsIgnoreCase("state"))` |
| 6 | RETURN | `return String.class;` |

---

**Block 3.18** — IF (key equals "金融機関コード" / Financial Institution Code) (L5704)

> Field ID: `l_rireki_bank_cd` — Bank code identifier.

| # | Type | Code |
|---|------|------|
| 1 | IF | `if (subkey.equalsIgnoreCase("value"))` |
| 2 | RETURN | `return String.class;` |
| 3 | ELSE-IF | `else if (subkey.equalsIgnoreCase("enable"))` |
| 4 | RETURN | `return Boolean.class;` |
| 5 | ELSE-IF | `else if (subkey.equalsIgnoreCase("state"))` |
| 6 | RETURN | `return String.class;` |

---

**Block 3.19** — IF (key equals "支店コード" / Branch Code) (L5720)

> Field ID: `l_rireki_shiten_cd` — Bank branch code.

| # | Type | Code |
|---|------|------|
| 1 | IF | `if (subkey.equalsIgnoreCase("value"))` |
| 2 | RETURN | `return String.class;` |
| 3 | ELSE-IF | `else if (subkey.equalsIgnoreCase("enable"))` |
| 4 | RETURN | `return Boolean.class;` |
| 5 | ELSE-IF | `else if (subkey.equalsIgnoreCase("state"))` |
| 6 | RETURN | `return String.class;` |

---

**Block 3.20** — IF (key equals "口座番号" / Account Number) (L5736)

> Field ID: `l_rireki_koza_no` — Bank account number for payment.

| # | Type | Code |
|---|------|------|
| 1 | IF | `if (subkey.equalsIgnoreCase("value"))` |
| 2 | RETURN | `return String.class;` |
| 3 | ELSE-IF | `else if (subkey.equalsIgnoreCase("enable"))` |
| 4 | RETURN | `return Boolean.class;` |
| 5 | ELSE-IF | `else if (subkey.equalsIgnoreCase("state"))` |
| 6 | RETURN | `return String.class;` |

---

**Block 3.21** — IF (key equals "預金種目" / Deposit Type) (L5752)

> Field ID: `l_rireki_yokin_shumoku` — The type of bank deposit (e.g., ordinary check account, savings).

| # | Type | Code |
|---|------|------|
| 1 | IF | `if (subkey.equalsIgnoreCase("value"))` |
| 2 | RETURN | `return String.class;` |
| 3 | ELSE-IF | `else if (subkey.equalsIgnoreCase("enable"))` |
| 4 | RETURN | `return Boolean.class;` |
| 5 | ELSE-IF | `else if (subkey.equalsIgnoreCase("state"))` |
| 6 | RETURN | `return String.class;` |

---

**Block 3.22** — IF (key equals "預金種目コード" / Deposit Type Code) (L5768)

> Field ID: `l_rireki_yokin_shumoku_cd` — Code for the deposit type. Only `value` and `state` sub-keys.

| # | Type | Code |
|---|------|------|
| 1 | IF | `if (subkey.equalsIgnoreCase("value"))` |
| 2 | RETURN | `return String.class;` |
| 3 | ELSE-IF | `else if (subkey.equalsIgnoreCase("state"))` |
| 4 | RETURN | `return String.class;` |

---

**Block 3.23** — IF (key equals "通帳記号" / Passbook Symbol) (L5781)

> Field ID: `l_rireki_tsucho_symbol` — The passbook symbol identifier.

| # | Type | Code |
|---|------|------|
| 1 | IF | `if (subkey.equalsIgnoreCase("value"))` |
| 2 | RETURN | `return String.class;` |
| 3 | ELSE-IF | `else if (subkey.equalsIgnoreCase("enable"))` |
| 4 | RETURN | `return Boolean.class;` |
| 5 | ELSE-IF | `else if (subkey.equalsIgnoreCase("state"))` |
| 6 | RETURN | `return String.class;` |

---

**Block 3.24** — IF (key equals "通帳番号" / Passbook Number) (L5797)

> Field ID: `l_rireki_tsucho_no` — The passbook number.

| # | Type | Code |
|---|------|------|
| 1 | IF | `if (subkey.equalsIgnoreCase("value"))` |
| 2 | RETURN | `return String.class;` |
| 3 | ELSE-IF | `else if (subkey.equalsIgnoreCase("enable"))` |
| 4 | RETURN | `return Boolean.class;` |
| 5 | ELSE-IF | `else if (subkey.equalsIgnoreCase("state"))` |
| 6 | RETURN | `return String.class;` |

---

**Block 3.25** — IF (key equals "カード種類" / Card Type) (L5813)

> Field ID: `l_rireki_card_kind` — The type of card (e.g., VISA, MasterCard).

| # | Type | Code |
|---|------|------|
| 1 | IF | `if (subkey.equalsIgnoreCase("value"))` |
| 2 | RETURN | `return String.class;` |
| 3 | ELSE-IF | `else if (subkey.equalsIgnoreCase("enable"))` |
| 4 | RETURN | `return Boolean.class;` |
| 5 | ELSE-IF | `else if (subkey.equalsIgnoreCase("state"))` |
| 6 | RETURN | `return String.class;` |

---

**Block 3.26** — IF (key equals "カード種類コード" / Card Type Code) (L5829)

> Field ID: `l_rireki_card_kind_cd` — Code for the card type. Only `value` and `state` sub-keys.

| # | Type | Code |
|---|------|------|
| 1 | IF | `if (subkey.equalsIgnoreCase("value"))` |
| 2 | RETURN | `return String.class;` |
| 3 | ELSE-IF | `else if (subkey.equalsIgnoreCase("state"))` |
| 4 | RETURN | `return String.class;` |

---

**Block 3.27** — IF (key equals "カード番号" / Card Number) (L5842)

> Field ID: `l_rireki_card_no` — The credit/debit card number.

| # | Type | Code |
|---|------|------|
| 1 | IF | `if (subkey.equalsIgnoreCase("value"))` |
| 2 | RETURN | `return String.class;` |
| 3 | ELSE-IF | `else if (subkey.equalsIgnoreCase("enable"))` |
| 4 | RETURN | `return Boolean.class;` |
| 5 | ELSE-IF | `else if (subkey.equalsIgnoreCase("state"))` |
| 6 | RETURN | `return String.class;` |

---

**Block 3.28** — IF (key equals "有効期限" / Expiry Date) (L5858)

> Field ID: `l_rireki_yk_kigen` — The card expiry date.

| # | Type | Code |
|---|------|------|
| 1 | IF | `if (subkey.equalsIgnoreCase("value"))` |
| 2 | RETURN | `return String.class;` |
| 3 | ELSE-IF | `else if (subkey.equalsIgnoreCase("enable"))` |
| 4 | RETURN | `return Boolean.class;` |
| 5 | ELSE-IF | `else if (subkey.equalsIgnoreCase("state"))` |
| 6 | RETURN | `return String.class;` |

---

**Block 3.29** — IF (key equals "無効年月" / Invalid Year-Month) (L5874)

> Field ID: `l_rireki_mk_kigen` — The date after which the card became invalid.

| # | Type | Code |
|---|------|------|
| 1 | IF | `if (subkey.equalsIgnoreCase("value"))` |
| 2 | RETURN | `return String.class;` |
| 3 | ELSE-IF | `else if (subkey.equalsIgnoreCase("enable"))` |
| 4 | RETURN | `return Boolean.class;` |
| 5 | ELSE-IF | `else if (subkey.equalsIgnoreCase("state"))` |
| 6 | RETURN | `return String.class;` |

---

**Block 3.30** — IF (key equals "郵便番号" / Postal Code) (L5890)

> Field ID: `l_rireki_pcd` — Japanese postal code (e.g., "100-0001").

| # | Type | Code |
|---|------|------|
| 1 | IF | `if (subkey.equalsIgnoreCase("value"))` |
| 2 | RETURN | `return String.class;` |
| 3 | ELSE-IF | `else if (subkey.equalsIgnoreCase("enable"))` |
| 4 | RETURN | `return Boolean.class;` |
| 5 | ELSE-IF | `else if (subkey.equalsIgnoreCase("state"))` |
| 6 | RETURN | `return String.class;` |

---

**Block 3.31** — IF (key equals "住所コード" / Address Code) (L5906)

> Field ID: `l_rireki_ad_cd` — Geographic address code.

| # | Type | Code |
|---|------|------|
| 1 | IF | `if (subkey.equalsIgnoreCase("value"))` |
| 2 | RETURN | `return String.class;` |
| 3 | ELSE-IF | `else if (subkey.equalsIgnoreCase("enable"))` |
| 4 | RETURN | `return Boolean.class;` |
| 5 | ELSE-IF | `else if (subkey.equalsIgnoreCase("state"))` |
| 6 | RETURN | `return String.class;` |

---

**Block 3.32–3.37** — IF (key equals delivery address components) (L5919–L6035)

> Fields: `l_rireki_sofus_ad` (Delivery Address), `l_rireki_sofus_kana` (Delivery Kana Name), `l_rireki_sofus_nm` (Delivery Name), `l_rireki_bkm` (Department Name), `l_rireki_tntsha_nm` (Responsible Person Name), `l_rireki_telno` (Phone Number), `l_color` (Background Color). All follow the same `value`/`enable`/`state` pattern returning `String.class`/`Boolean.class`/`String.class`.

---

**Block 3.38–3.43** — IF (key equals delivery address detailed components — no `enable`) (L5949–L6015)

> Fields: `l_rireki_sofus_state` (Delivery Prefecture), `l_rireki_sofus_city` (Delivery City/Town/Village), `l_rireki_sofus_oaztsu` (Delivery District), `l_rireki_sofus_azcho` (Delivery Chome), `l_rireki_sofus_bnchigo` (Delivery Block/Number), `l_rireki_sofus_adrttm` (Delivery Building Name), `l_rireki_sofus_adrrm` (Delivery Room Number). These fields have only `value` and `state` sub-keys.

---

**Block 3.44–3.46** — IF (key equals audit timestamp fields — no `enable`) (L6029–L6067)

> Fields: `l_upd_dtm` (Update DateTime), `l_gene_add_dtm` (Registration DateTime), `l_kakins_tstaymd` (Subsidy Effective Start Date). All return `String.class` for `value`/`state`.

---

**Block 3.47** — IF (key equals "初回支払い書受領年月日" / First Payment Receipt Date) (L6073)

> Field ID: `l_first_pay_mskmsho_rcp_ymd` — Date when the first payment document was received.

| # | Type | Code |
|---|------|------|
| 1 | IF | `if (subkey.equalsIgnoreCase("value"))` |
| 2 | RETURN | `return String.class;` |
| 3 | ELSE-IF | `else if (subkey.equalsIgnoreCase("state"))` |
| 4 | RETURN | `return String.class;` |

---

**Block 3.48–3.52** — IF (key equals manual entry / corporate flag fields — no `enable`) (L6087–L6139)

> Fields: `l_man_input_flg` (Manual Entry Flag), `l_kyosei_madoguchi` (Forced Window), `l_kyosei_madoguchi_nm` (Forced Window Name), `l_hojin_cd` (Corporate Type Code), `l_hojin_zengo_cd` (Corporate Pre/Post Designation Code). All return `String.class` for `value`/`state`.

---

**Block 3.53–3.62** — IF (key equals mask/flag preservation fields — no `enable`) (L6145–L6315)

> Fields prefixed with `_mskb` (mask保持 / mask preservation): `l_rireki_aply_ymd_mskb` (Effective Date Mask), `l_rireki_adj_ymd_mskb` (Adjustment Date Mask), `l_rireki_seiky_kei_nm_mskb` (Billing Recipient Name Mask), `l_rireki_seiky_kei_kana_mskb` (Billing Contract Kana Mask), `l_rireki_seiky_kei_romaji_mskb` (Billing Contract Romaji Mask), `l_rireki_first_seiky_mskb` (First Billing Month Mask), `l_rireki_bank_nm_mskb` (Financial Institution Name Mask), `l_rireki_shiten_nm_mskb` (Branch Name Mask), `l_rireki_bank_cd_mskb` (Financial Institution Code Mask), `l_rireki_shiten_cd_mskb` (Branch Code Mask). All return `String.class` for `value`/`state`.

---

**Block 3.63–3.66** — IF (key equals account/card mask fields — no `enable`) (L6315–L6367)

> Fields: `l_rireki_koza_no_mskb` (Account Number Mask), `l_rireki_tsucho_symbol_mskb` (Passbook Symbol Mask), `l_rireki_tsucho_no_mskb` (Passbook Number Mask), `l_rireki_card_no_mskb` (Card Number Mask), `l_rireki_yk_kigen_mskb` (Expiry Date Mask). All return `String.class` for `value`/`state`.

---

**Block 3.67–3.73** — IF (key equals payment method / credit card / authorization fields — no `enable`) (L6373–L6525)

> Fields: `seiky_way_no_crecard` (Payment Method Number — Credit Card), `crecard_stat` (Credit Card Status), `seiky_way_no_koza` (Payment Method Number — Account), `l_yk_cfm_rslt_div` (Validity Confirmation Result Division), `l_pay_skekka_ng_rsn_cd_koza` (Payment Review NG Reason Code — Account), `l_pay_skekka_ng_rsn_memo_koza` (Payment Review NG Reason Memo — Account), `l_koza_meigin_kanji` (Account Name in Kanji), `l_pay_judge_reqymd_koza` (Payment Review Request Date — Account), `l_out_khri_judge_fin_ymd` (External Statement Review Completion Date), `l_pay_skekka_ng_rsn_cd_cre` (Payment Review NG Reason Code — Credit), `l_pay_skekka_ng_rsn_memo_cre` (Payment Review NG Reason Memo — Credit), `l_pay_judge_reqymd_cre` (Payment Review Request Date — Credit), `l_credit_kokan_cd` (Credit Exchange Code), `l_crecard_nm_romaji` (Credit Card Name in Romaji), `l_authori_cfm_dtm` (Authorization Confirmation DateTime), `l_authori_shonin_no` (Authorization Approval Number), `paywaytcml_ctl_cd` (Payment Method Notification Email Control Code), `l_rireki_card_azkri_id` (Card Pre-registration ID), `l_rireki_card_azkri_id_mskb` (Card Pre-registration ID Mask), `shikosaki_comp_cd` (Destination Company Code), `l_rireki_aply_ymd_f` (Effective Date Initial Value), `l_rireki_ido_div` (Migration Division), `l_rireki_seiky_crecard_comp_nm` (Billing Card Company Name), `l_rireki_card_sbt` (Card Category), `l_rireki_kokunai_kaigai` (Domestic/Overseas), `l_rireki_koza_payway_uk_div_cd` (Account Payment Method Receipt Division Code), `l_rireki_payway_bk` (Payment Method Retreat), `l_rireki_koza_payway_uk_div_bk` (Account Payment Method Receipt Retreat).

Each follows the same `value` → `String.class` / `state` → `String.class` pattern. Note: `l_rireki_card_azkri_id` additionally has `enable` → `Boolean.class`.

---

**Block 4** — ELSE (no match found) (L6530)

> Fallback: If none of the ~70+ keys match, return `null`.

| # | Type | Code |
|---|------|------|
| 1 | RETURN | `return null;` // 条件に合致するプロパティが存在しない場合は、nullを返す / Return null if no matching property exists |

## 7. Glossary

| Term | Type | Business Meaning |
|------|------|------------------|
| `選択` | Field | Selection — a UI dropdown/select list field identifier |
| `請求契約番号` | Field | Billing Contract Number — the unique identifier for a billing contract line item |
| `支払い審査結果` | Field | Payment Review Result — the approval/rejection status of a payment review |
| `支払い審査結果コード` | Field | Payment Review Result Code — coded value for the payment review outcome |
| `適用年月日` | Field | Effective Date — the date from which the contract becomes effective |
| `終了年月日` | Field | End Date — the contract termination/expiry date |
| `調整日` | Field | Adjustment Date — the proration/rate adjustment date for billing |
| `支払い方法` | Field | Payment Method — how the customer pays (bank transfer, credit card, etc.) |
| `支払い方法コード` | Field | Payment Method Code — coded identifier for the payment method |
| `請求先名` | Field | Billing Recipient Name — name of the entity receiving the invoice |
| `請求契約カナ名` | Field | Billing Contract Kana Name — phonetic (kana) name of the billing contract entity |
| `請求契約ローマ字` | Field | Billing Contract Romaji Name — Latin-alphabet name of the billing contract entity |
| `初回請求月` | Field | First Billing Month — the month of the first invoice |
| `請求書発行要否` | Field | Invoice Issuance Required — flag indicating whether to issue an invoice |
| `請求書発行要否コード` | Field | Invoice Issuance Required Code — coded invoice issuance flag |
| `金融機関名` | Field | Financial Institution Name — name of the bank/financial institution |
| `支店名` | Field | Branch Name — the bank branch name |
| `金融機関コード` | Field | Financial Institution Code — bank code identifier |
| `支店コード` | Field | Branch Code — bank branch code |
| `口座番号` | Field | Account Number — bank account number for payment collection |
| `預金種目` | Field | Deposit Type — type of bank account (e.g., ordinary, savings) |
| `預金種目コード` | Field | Deposit Type Code — coded deposit account type |
| `通帳記号` | Field | Passbook Symbol — symbol identifier on a bank passbook |
| `通帳番号` | Field | Passbook Number — passbook serial number |
| `カード種類` | Field | Card Type — credit/debit card brand (VISA, MasterCard, etc.) |
| `カード種類コード` | Field | Card Type Code — coded card brand identifier |
| `カード番号` | Field | Card Number — the credit/debit card number |
| `有効期限` | Field | Expiry Date — the card validity expiry date |
| `無効年月` | Field | Invalid Year-Month — the date after which the card was invalidated |
| `郵便番号` | Field | Postal Code — Japanese postal code (e.g., "100-0001") |
| `住所コード` | Field | Address Code — geographic address identifier |
| `送付先住所` | Field | Delivery Address — the delivery destination address |
| `送付先カナ名` | Field | Delivery Kana Name — phonetic name of the delivery destination |
| `送付先名` | Field | Delivery Name — name of the delivery destination |
| `部署名` | Field | Department Name — the department name of the contact |
| `担当者名` | Field | Responsible Person Name — name of the contact person |
| `電話番号` | Field | Phone Number — contact telephone number |
| `背景色` | Field | Background Color — UI background color setting |
| `更新年月日时分秒` | Field | Update DateTime — timestamp of the last update to the record |
| `世代登録年月日时分秒` | Field | Registration DateTime — timestamp of initial registration |
| `課金前適用開始年月日` | Field | Subsidy Effective Start Date — date when subsidy becomes effective before billing |
| `初回支払い書受領年月日` | Field | First Payment Receipt Date — date the first payment document was received |
| `手動入力フラグ` | Field | Manual Entry Flag — flag indicating manual data entry |
| `強制窓口` | Field | Forced Window — a designated mandatory processing window/channel |
| `強制窓口フラグ名称` | Field | Forced Window Flag Name — name label for the forced window |
| `法人格種類コード` | Field | Corporate Type Code — legal entity classification code |
| `法人格前後指定コード` | Field | Corporate Pre/Post Designation Code — code for legal entity designation |
| `最終更新年月日时分秒請求契約` | Field | Final Update DateTime (Billing Contract) — last update timestamp for billing contract |
| `*_mskb` (suffix) | Field | Mask Preservation — suffix indicating a display mask/flag that retains the original display state |
| `請求方法番号（クレジットカード）` | Field | Payment Method Number (Credit Card) — payment method identifier for credit card |
| `クレジットカードステータス` | Field | Credit Card Status — current status of the credit card |
| `請求方法番号（口座）` | Field | Payment Method Number (Account) — payment method identifier for bank account |
| `有効性確認結果区分` | Field | Validity Confirmation Result Division — result category of validity check |
| `支払い審査結果.NG理由コード（口座）` | Field | Payment Review NG Reason Code (Account) — reason code for payment review rejection (account) |
| `支払い審査結果.NG理由メモ（口座）` | Field | Payment Review NG Reason Memo (Account) — memo for payment review rejection (account) |
| `口座名义人（漢字）` | Field | Account Name in Kanji — account holder name in kanji characters |
| `支払い審査依頼年月日（口座）` | Field | Payment Review Request Date (Account) — date payment review was requested (account) |
| `外部口座審完了年月日` | Field | External Statement Review Completion Date — date of external account review completion |
| `クレジットカード交換コード` | Field | Credit Exchange Code — code for credit card exchange |
| `クレジットカード名义（ローマ字）` | Field | Credit Card Name (Romaji) — cardholder name in Roman letters |
| `オーソリ確認年月日时分秒` | Field | Authorization Confirmation DateTime — timestamp of card authorization confirmation |
| `オーソリ承認番号` | Field | Authorization Approval Number — authorization approval reference number |
| `支払い方法通知メール制御コード` | Field | Payment Method Notification Email Control Code — controls email notification for payment method |
| `カード預りID` | Field | Card Pre-registration ID — ID for card pre-registration process |
| `カード預りIDマスク保持` | Field | Card Pre-registration ID Mask — mask flag for card pre-registration ID |
| `仕向先会社コード` | Field | Destination Company Code — code for the destination/recipient company |
| `適用年月日初期値` | Field | Effective Date Initial Value — default/initial value for the effective date |
| `異動区分` | Field | Migration Division — classification of record migration/change type |
| `請求カード会社名` | Field | Billing Card Company Name — name of the card company for billing |
| `カード種別` | Field | Card Category — classification of the card type |
| `国内／海外` | Field | Domestic/Overseas — whether the card usage is domestic or international |
| `口座支払い方法受払区分コード` | Field | Account Payment Method Receipt Division Code — coded division for account payment receipt |
| `支払い方法退避` | Field | Payment Method Retreat — flag for withdrawing the payment method |
| `口座支払い方法受払退避` | Field | Account Payment Method Receipt Retreat — flag for withdrawing account payment |
| X31CWebConst | Constant | X31 Framework Web Constant class — defines framework-level constants like `DATABEAN_GET_VALUE` and `DATABEAN_SET_VALUE` |
| KKSVxxxx | Screen | Web screen component — each KKSVxxxx class represents a specific user-facing screen in the K-Opticom billing system |
| OPDBMapper | Component | Object-to-Database Mapper — mapping class that translates between screen beans and database records |
| KKW01601SF | Module | Billing Contract History screen module — the service function module for billing/contract history operations |
| DBean | Component | Data Bean — a presentation-tier JavaBean that holds form data for a web screen |
| case-insensitive | Behavior | Sub-key comparison uses `equalsIgnoreCase()` — "VALUE", "Value", and "value" are treated identically |
