# Business Logic — KKW01034SF04DBean.loadModelData() [93 LOC]

| Field | Value |
|-------|-------|
| Fully Qualified Name | `eo.web.webview.KKW01034SF.KKW01034SF04DBean` |
| Layer | View / Data Bean (Web MVC presentation layer) |
| Module | `KKW01034SF` (Package: `eo.web.webview.KKW01034SF`) |

## 1. Role

### KKW01034SF04DBean.loadModelData()

This method is the **data-loading gateway** for the Service Contract List screen (KKW01034SF). It acts as a **centralized lookup dispatcher** that resolves typed display fields by name (key) and field property (subkey — "value" or "state"). The method implements a **routing/dispatch design pattern**, mapping human-readable Japanese item names (such as "Service Contract Number", "Target Contract Identification Code", "Option Service Contract Number") to their corresponding getter methods on the bean itself.

This method supports **8 service-type categories** — the base Contract No. (no), Target Contract Identification Code (tg_kei_skbt_cd), Service Contract No. (svc_kei_no), Service Contract Sub-division No. (svc_kei_ucwk_no), Option Service Contract No. (op_svc_kei_no), Sub-Option Service Contract No. (sbop_svc_kei_no), Equipment Provider Service Contract No. (kktk_svc_kei_no), and Discount Service Target Service Code (wrib_svc_trgt_svc_cd). For each type, it retrieves either the current value or the validation/display state depending on the subkey.

Its **role in the larger system** is as a shared presentation-layer utility called by the parent screen bean (KKW01034SFBean) whenever a repeater-type list item needs to resolve a field value during screen rendering. This is part of the X33VDataTypeBean framework, where data beans expose a generic loadModelData interface to support dynamic field resolution on repeating list components such as "Target Contract List" and "Target Contract List 2". The method delegates to its own typed getters (no_state, no_value, etc.), which pull data from instance fields set earlier by the screen flow.

## 2. Processing Pattern (Detailed Business Logic)

```mermaid
flowchart TD
    START(["loadModelData key, subkey"])
    NULL_CHK{"key == null OR subkey == null"}
    END_RETURN(["Return value"])
    END_NULL(["Return null"])

    START --> NULL_CHK
    NULL_CHK -->|true| END_NULL
    NULL_CHK -->|false| KEY_DISPATCH{Route by key type}
    KEY_DISPATCH -->|"通番"| NO_BLOCK["No Block"]
    KEY_DISPATCH -->|"対象契約識別コード"| TG_BLOCK["Tg Kei Skbt Cd Block"]
    KEY_DISPATCH -->|"サービス契約番号"| SVC_BLOCK["Svc Kei No Block"]
    KEY_DISPATCH -->|"サービス契約内訳番号"| SVC_UCWK_BLOCK["Svc Kei Ucwk No Block"]
    KEY_DISPATCH -->|"オプションサービス契約番号"| OP_BLOCK["Op Svc Kei No Block"]
    KEY_DISPATCH -->|"サブオプションサービス契約番号"| SBOP_BLOCK["Sbop Svc Kei No Block"]
    KEY_DISPATCH -->|"機器提供サービス契約番号"| KKT_BLOCK["Kktk Svc Kei No Block"]
    KEY_DISPATCH -->|"割引サービス対象サービスコード"| WRIB_BLOCK["Wrib Svc Trgt Svc Cd Block"]
    KEY_DISPATCH -->|"Not matched"| END_NULL
    NO_BLOCK --> SUB_CHECK{"subkey equalsIgnoreCase value or state?"}
    SUB_CHECK -->|true| VALUE_RETURN["Return getter for value"]
    SUB_CHECK -->|false| END_NULL
    TG_BLOCK --> SUB_CHECK
    SVC_BLOCK --> SUB_CHECK
    SVC_UCWK_BLOCK --> SUB_CHECK
    OP_BLOCK --> SUB_CHECK
    SBOP_BLOCK --> SUB_CHECK
    KKT_BLOCK --> SUB_CHECK
    WRIB_BLOCK --> SUB_CHECK
    VALUE_RETURN --> END_RETURN
    END_NULL --> END_RETURN
```

This method performs a **two-level dispatch**:

1. **Null guard** — If either `key` or `subkey` is null, return null immediately.
2. **Key routing** — Dispatch to one of 8 typed blocks based on the `key` value. Each block is identified by a Japanese display label (item name).
3. **Subkey validation** — Within each block, check if `subkey` equals "value" or "state" (case-insensitive). If it matches, return the corresponding getter. If it matches neither, fall through to the next block.
4. **Fallback** — If no key matches any block, return null.

The method is a **pure read operation** — it does not create, update, or delete any data. It simply routes requests to typed getter methods that return the currently held value or state for each service contract field.

## 3. Parameter Analysis

| No | Parameter Name | Type | Business Description |
|----|---------------|------|---------------------|
| 1 | `key` | `String` | The item name (項目名) used to identify which data field to retrieve. This is a human-readable Japanese label representing one of 8 service contract categories: "通番" (Contract No.), "対象契約識別コード" (Target Contract Identification Code), "サービス契約番号" (Service Contract Number), "サービス契約内訳番号" (Service Contract Sub-division Number), "オプションサービス契約番号" (Option Service Contract Number), "サブオプションサービス契約番号" (Sub-Option Service Contract Number), "機器提供サービス契約番号" (Equipment Provider Service Contract Number), "割引サービス対象サービスコード" (Discount Service Target Service Code). The key determines which dispatch branch is taken. |
| 2 | `subkey` | `String` | The field property specifier indicating what attribute of the data to return. Accepts "value" (to get the actual data) or "state" (to get the validation/display state). The comparison is case-insensitive (`equalsIgnoreCase`). This determines which of the two getter methods (`getXxx_value()` or `getXxx_state()`) is invoked. |

**Instance fields / external state read:**
- The method reads data from its own instance fields via the 16 typed getter methods (`getNo_value`, `getNo_state`, `getTg_kei_skbt_cd_value`, `getTg_kei_skbt_cd_state`, `getSvc_kei_no_value`, `getSvc_kei_no_state`, `getSvc_kei_ucwk_no_value`, `getSvc_kei_ucwk_no_state`, `getOp_svc_kei_no_value`, `getOp_svc_kei_no_state`, `getSbop_svc_kei_no_value`, `getSbop_svc_kei_no_state`, `getKktk_svc_kei_no_value`, `getKktk_svc_kei_no_state`, `getWrib_svc_trgt_svc_cd_value`, `getWrib_svc_trgt_svc_cd_state`). These getters access fields set earlier by the screen flow or parent bean.

## 4. CRUD Operations / Called Services

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

| CRUD | SC / CBS | SC Code | Entity / DB | Operation Description |
|------|----------|---------|-------------|----------------------|
| R | `KKW01034SF04DBean.getKktk_svc_kei_no_state` | KKW01034SF04DBean | - | Returns the state of the Equipment Provider Service Contract Number field |
| R | `KKW01034SF04DBean.getKktk_svc_kei_no_value` | KKW01034SF04DBean | - | Returns the value of the Equipment Provider Service Contract Number field |
| R | `KKW01034SF04DBean.getNo_state` | KKW01034SF04DBean | - | Returns the state of the base Contract No. field |
| R | `KKW01034SF04DBean.getNo_value` | KKW01034SF04DBean | - | Returns the value of the base Contract No. field |
| R | `KKW01034SF04DBean.getOp_svc_kei_no_state` | KKW01034SF04DBean | - | Returns the state of the Option Service Contract Number field |
| R | `KKW01034SF04DBean.getOp_svc_kei_no_value` | KKW01034SF04DBean | - | Returns the value of the Option Service Contract Number field |
| R | `KKW01034SF04DBean.getSbop_svc_kei_no_state` | KKW01034SF04DBean | - | Returns the state of the Sub-Option Service Contract Number field |
| R | `KKW01034SF04DBean.getSbop_svc_kei_no_value` | KKW01034SF04DBean | - | Returns the value of the Sub-Option Service Contract Number field |
| R | `KKW01034SF04DBean.getSvc_kei_no_state` | KKW01034SF04DBean | - | Returns the state of the Service Contract Number field |
| R | `KKW01034SF04DBean.getSvc_kei_no_value` | KKW01034SF04DBean | - | Returns the value of the Service Contract Number field |
| R | `KKW01034SF04DBean.getSvc_kei_ucwk_no_state` | KKW01034SF04DBean | - | Returns the state of the Service Contract Sub-division Number field |
| R | `KKW01034SF04DBean.getSvc_kei_ucwk_no_value` | KKW01034SF04DBean | - | Returns the value of the Service Contract Sub-division Number field |
| R | `KKW01034SF04DBean.getTg_kei_skbt_cd_state` | KKW01034SF04DBean | - | Returns the state of the Target Contract Identification Code field |
| R | `KKW01034SF04DBean.getTg_kei_skbt_cd_value` | KKW01034SF04DBean | - | Returns the value of the Target Contract Identification Code field |
| R | `KKW01034SF04DBean.getWrib_svc_trgt_svc_cd_state` | KKW01034SF04DBean | - | Returns the state of the Discount Service Target Service Code field |
| R | `KKW01034SF04DBean.getWrib_svc_trgt_svc_cd_value` | KKW01034SF04DBean | - | Returns the value of the Discount Service Target Service Code field |

This method performs **no external SC (Service Component) or CBS (Business Service) calls**. All 16 calls are internal getter invocations on the bean itself, reading data from instance fields. There are **no database operations** — the data is already loaded into the bean's fields by the parent screen flow before this method is invoked.

## 5. Dependency Trace

| # | Caller (Screen/Batch) | Call Chain (Full Path to this Method) | Terminal (SC / CRUD / Entity) |
|---|----------------------|--------------------------------------|-------------------------------|
| 1 | View:KKW01034SF04DBean | `KKW01034SFBean.addListDataInstance` -> `KKW01034SFBean.loadModelData` -> `KKW01034SF04DBean.loadModelData` | `getNo_value [R] bean instance field`<br>`getNo_state [R] bean instance field`<br>`getTg_kei_skbt_cd_value [R] bean instance field`<br>`getTg_kei_skbt_cd_state [R] bean instance field`<br>`getSvc_kei_no_value [R] bean instance field`<br>`getSvc_kei_no_state [R] bean instance field`<br>`getSvc_kei_ucwk_no_value [R] bean instance field`<br>`getSvc_kei_ucwk_no_state [R] bean instance field`<br>`getOp_svc_kei_no_value [R] bean instance field`<br>`getOp_svc_kei_no_state [R] bean instance field`<br>`getSbop_svc_kei_no_value [R] bean instance field`<br>`getSbop_svc_kei_no_state [R] bean instance field`<br>`getKktk_svc_kei_no_value [R] bean instance field`<br>`getKktk_svc_kei_no_state [R] bean instance field`<br>`getWrib_svc_trgt_svc_cd_value [R] bean instance field`<br>`getWrib_svc_trgt_svc_cd_state [R] bean instance field` |

**Notes:**
- The `loadModelData` method is called indirectly from `KKW01034SFBean`, the parent screen bean for the KKW01034SF service contract list screen.
- `KKW01034SFBean.addListDataInstance` instantiates `KKW01034SF04DBean` objects for the "Target Contract List" (対象契約一覧) and "Target Contract List 2" (対象契約一覧2) repeater items.
- The X33VDataTypeBean framework then calls `loadModelData` on each bean instance during screen rendering to populate field values.
- All terminal operations are reads from in-memory instance fields — no database or external service access occurs.

## 6. Per-Branch Detail Blocks

### Block 1 — IF (null guard) (L290)

> If either `key` or `subkey` is null, return null immediately. This prevents null pointer exceptions in subsequent string comparisons.

| # | Type | Code |
|---|------|------|
| 1 | IF | `if (key == null || subkey == null)` // Check for null parameters [-> L290] |
| 2 | RETURN | `return null;` // Return null if either parameter is null |

### Block 2 — SET (separator extraction) (L292)

> Extract the position of the slash character in the key for potential future use (variable is assigned but not used in current logic).

| # | Type | Code |
|---|------|------|
| 1 | SET | `int separaterPoint = key.indexOf("/");` // Find slash position in key [-> L292] |

### Block 3 — IF-ELSE-IF (key dispatch chain) (L295)

> Dispatch to one of 8 typed data blocks based on the Japanese item name (key). Each block contains nested if/else-if for subkey "value" vs "state" resolution.

#### Block 3.1 — IF (key == "通番") (L295)
> Data type: Base Contract No. (no) — the primary sequential identifier for the contract entry.

| # | Type | Code |
|---|------|------|
| 1 | IF | `if (key.equals("通番"))` // Item: Base Contract No. [-> L295] |

##### Block 3.1.1 — IF (subkey == "value") (L296)
> Return the actual value of the base contract number field.

| # | Type | Code |
|---|------|------|
| 1 | IF | `if (subkey.equalsIgnoreCase("value"))` // Case-insensitive check for "value" [-> L296] |
| 2 | CALL | `return getNo_value();` // Return base contract no. value |

##### Block 3.1.2 — ELSE-IF (subkey == "state") (L299)
> Return the state (validation/display state) of the base contract number field.
> (コメント: subkeyが"state"の場合、ステータスを返す。 — Returns state when subkey is "state".)

| # | Type | Code |
|---|------|------|
| 1 | ELSE-IF | `else if (subkey.equalsIgnoreCase("state"))` // Case-insensitive check for "state" [-> L299] |
| 2 | CALL | `return getNo_state();` // Return base contract no. state |

#### Block 3.2 — ELSE-IF (key == "対象契約識別コード") (L303)
> Data type: Target Contract Identification Code (tg_kei_skbt_cd) — identifies the target contract type/code for this entry.

| # | Type | Code |
|---|------|------|
| 1 | ELSE-IF | `else if (key.equals("対象契約識別コード"))` // Item: Target Contract Identification Code [-> L303] |

##### Block 3.2.1 — IF (subkey == "value") (L304)
> Return the actual value of the target contract identification code field.

| # | Type | Code |
|---|------|------|
| 1 | IF | `if (subkey.equalsIgnoreCase("value"))` // Case-insensitive check for "value" [-> L304] |
| 2 | CALL | `return getTg_kei_skbt_cd_value();` // Return tg_kei_skbt_cd value |

##### Block 3.2.2 — ELSE-IF (subkey == "state") (L307)
> Return the state of the target contract identification code field.
> (コメント: subkeyが"state"の場合、ステータスを返す。 — Returns state when subkey is "state".)

| # | Type | Code |
|---|------|------|
| 1 | ELSE-IF | `else if (subkey.equalsIgnoreCase("state"))` // Case-insensitive check for "state" [-> L307] |
| 2 | CALL | `return getTg_kei_skbt_cd_state();` // Return tg_kei_skbt_cd state |

#### Block 3.3 — ELSE-IF (key == "サービス契約番号") (L311)
> Data type: Service Contract Number (svc_kei_no) — the main service contract identifier.

| # | Type | Code |
|---|------|------|
| 1 | ELSE-IF | `else if (key.equals("サービス契約番号"))` // Item: Service Contract Number [-> L311] |

##### Block 3.3.1 — IF (subkey == "value") (L312)

| # | Type | Code |
|---|------|------|
| 1 | IF | `if (subkey.equalsIgnoreCase("value"))` // Case-insensitive check for "value" [-> L312] |
| 2 | CALL | `return getSvc_kei_no_value();` // Return svc_kei_no value |

##### Block 3.3.2 — ELSE-IF (subkey == "state") (L315)

| # | Type | Code |
|---|------|------|
| 1 | ELSE-IF | `else if (subkey.equalsIgnoreCase("state"))` // Case-insensitive check for "state" [-> L315] |
| 2 | CALL | `return getSvc_kei_no_state();` // Return svc_kei_no state |

#### Block 3.4 — ELSE-IF (key == "サービス契約内訳番号") (L319)
> Data type: Service Contract Sub-division Number (svc_kei_ucwk_no) — internal tracking ID for service contract line items.

| # | Type | Code |
|---|------|------|
| 1 | ELSE-IF | `else if (key.equals("サービス契約内訳番号"))` // Item: Service Contract Sub-division Number [-> L319] |

##### Block 3.4.1 — IF (subkey == "value") (L320)

| # | Type | Code |
|---|------|------|
| 1 | IF | `if (subkey.equalsIgnoreCase("value"))` // Case-insensitive check for "value" [-> L320] |
| 2 | CALL | `return getSvc_kei_ucwk_no_value();` // Return svc_kei_ucwk_no value |

##### Block 3.4.2 — ELSE-IF (subkey == "state") (L323)

| # | Type | Code |
|---|------|------|
| 1 | ELSE-IF | `else if (subkey.equalsIgnoreCase("state"))` // Case-insensitive check for "state" [-> L323] |
| 2 | CALL | `return getSvc_kei_ucwk_no_state();` // Return svc_kei_ucwk_no state |

#### Block 3.5 — ELSE-IF (key == "オプションサービス契約番号") (L327)
> Data type: Option Service Contract Number (op_svc_kei_no) — the contract number for optional/add-on services.

| # | Type | Code |
|---|------|------|
| 1 | ELSE-IF | `else if (key.equals("オプションサービス契約番号"))` // Item: Option Service Contract Number [-> L327] |

##### Block 3.5.1 — IF (subkey == "value") (L328)

| # | Type | Code |
|---|------|------|
| 1 | IF | `if (subkey.equalsIgnoreCase("value"))` // Case-insensitive check for "value" [-> L328] |
| 2 | CALL | `return getOp_svc_kei_no_value();` // Return op_svc_kei_no value |

##### Block 3.5.2 — ELSE-IF (subkey == "state") (L331)

| # | Type | Code |
|---|------|------|
| 1 | ELSE-IF | `else if (subkey.equalsIgnoreCase("state"))` // Case-insensitive check for "state" [-> L331] |
| 2 | CALL | `return getOp_svc_kei_no_state();` // Return op_svc_kei_no state |

#### Block 3.6 — ELSE-IF (key == "サブオプションサービス契約番号") (L335)
> Data type: Sub-Option Service Contract Number (sbop_svc_kei_no) — the contract number for sub-option/add-on services.

| # | Type | Code |
|---|------|------|
| 1 | ELSE-IF | `else if (key.equals("サブオプションサービス契約番号"))` // Item: Sub-Option Service Contract Number [-> L335] |

##### Block 3.6.1 — IF (subkey == "value") (L336)

| # | Type | Code |
|---|------|------|
| 1 | IF | `if (subkey.equalsIgnoreCase("value"))` // Case-insensitive check for "value" [-> L336] |
| 2 | CALL | `return getSbop_svc_kei_no_value();` // Return sbop_svc_kei_no value |

##### Block 3.6.2 — ELSE-IF (subkey == "state") (L339)

| # | Type | Code |
|---|------|------|
| 1 | ELSE-IF | `else if (subkey.equalsIgnoreCase("state"))` // Case-insensitive check for "state" [-> L339] |
| 2 | CALL | `return getSbop_svc_kei_no_state();` // Return sbop_svc_kei_no state |

#### Block 3.7 — ELSE-IF (key == "機器提供サービス契約番号") (L343)
> Data type: Equipment Provider Service Contract Number (kktk_svc_kei_no) — the contract number for equipment provisioning services.

| # | Type | Code |
|---|------|------|
| 1 | ELSE-IF | `else if (key.equals("機器提供サービス契約番号"))` // Item: Equipment Provider Service Contract Number [-> L343] |

##### Block 3.7.1 — IF (subkey == "value") (L344)

| # | Type | Code |
|---|------|------|
| 1 | IF | `if (subkey.equalsIgnoreCase("value"))` // Case-insensitive check for "value" [-> L344] |
| 2 | CALL | `return getKktk_svc_kei_no_value();` // Return kktk_svc_kei_no value |

##### Block 3.7.2 — ELSE-IF (subkey == "state") (L347)

| # | Type | Code |
|---|------|------|
| 1 | ELSE-IF | `else if (subkey.equalsIgnoreCase("state"))` // Case-insensitive check for "state" [-> L347] |
| 2 | CALL | `return getKktk_svc_kei_no_state();` // Return kktk_svc_kei_no state |

#### Block 3.8 — ELSE-IF (key == "割引サービス対象サービスコード") (L351)
> Data type: Discount Service Target Service Code (wrib_svc_trgt_svc_cd) — the service code eligible for discounts.

| # | Type | Code |
|---|------|------|
| 1 | ELSE-IF | `else if (key.equals("割引サービス対象サービスコード"))` // Item: Discount Service Target Service Code [-> L351] |

##### Block 3.8.1 — IF (subkey == "value") (L352)

| # | Type | Code |
|---|------|------|
| 1 | IF | `if (subkey.equalsIgnoreCase("value"))` // Case-insensitive check for "value" [-> L352] |
| 2 | CALL | `return getWrib_svc_trgt_svc_cd_value();` // Return wrib_svc_trgt_svc_cd value |

##### Block 3.8.2 — ELSE-IF (subkey == "state") (L355)

| # | Type | Code |
|---|------|------|
| 1 | ELSE-IF | `else if (subkey.equalsIgnoreCase("state"))` // Case-insensitive check for "state" [-> L355] |
| 2 | CALL | `return getWrib_svc_trgt_svc_cd_state();` // Return wrib_svc_trgt_svc_cd state |

### Block 4 — RETURN (fallback null) (L359)

> If no matching key was found (comment: 条件に一致するプロパティが存在しない場合は、nullを返す。 — Returns null when no matching property exists.), return null. This ensures a safe exit for unrecognized item names.

| # | Type | Code |
|---|------|------|
| 1 | RETURN | `return null;` // No matching property found, return null |

## 7. Glossary

| Term | Type | Business Meaning |
|------|------|------------------|
| `no` | Field | Base Contract Number — the primary sequential identifier (通番) for a contract entry in the list |
| `tg_kei_skbt_cd` | Field | Target Contract Identification Code (対象契約識別コード) — identifies the type of target contract for this service entry |
| `svc_kei_no` | Field | Service Contract Number (サービス契約番号) — the main service contract identifier |
| `svc_kei_ucwk_no` | Field | Service Contract Sub-division Number (サービス契約内訳番号) — internal tracking ID for service contract line items |
| `op_svc_kei_no` | Field | Option Service Contract Number (オプションサービス契約番号) — the contract number for optional/add-on telecom services |
| `sbop_svc_kei_no` | Field | Sub-Option Service Contract Number (サブオプションサービス契約番号) — the contract number for sub-option services |
| `kktk_svc_kei_no` | Field | Equipment Provider Service Contract Number (機器提供サービス契約番号) — the contract number for equipment provisioning (e.g., modem, router) |
| `wrib_svc_trgt_svc_cd` | Field | Discount Service Target Service Code (割引サービス対象サービスコード) — the service code that is eligible for discount promotions |
| `key` | Parameter | Item name (項目名) — the human-readable Japanese label used to look up which data field to retrieve |
| `subkey` | Parameter | Sub-key (サブキー) — specifies whether to return the data "value" or its validation/display "state" |
| X33VDataTypeBean | Framework | Base bean class in the X33 framework that provides typed data binding for screen fields (String, List, repeater types) |
| KKW01034SF | Screen/Module | Service Contract List screen — displays contract information in a repeatable list format for telecom service orders |
| KKSV | Screen prefix | K-Opticom Service View screen naming convention (e.g., KKSV0001) |
| DBean | Component | Data Bean — a presentation-layer bean that holds and resolves field data for a screen or list item |
| 対象契約一覧 | Japanese UI label | Target Contract List — a repeater-type list item on the screen showing contract details |
| 対象契約一覧2 | Japanese UI label | Target Contract List 2 — a second instance of the target contract list (e.g., for secondary entries) |
