# Eo / Web / Webview / Crw02702sf

## Overview

This module implements the **Option Service Contract List Inquiry** screen (`CRW027020PJP.jsp`), which displays a comprehensive overview of all option service contracts associated with a customer. It presents the main option service list with details such as service name, optional content, sub-option details, usage status, service start/end dates, and contract numbers. The module also supports logging into external services (e-mail and my homepage) via generated URLs with timestamp encryption, and shows discount service contract information for telephone service customers.

The screen is part of the K-Opticom customer backbone system (`eo` module) and uses the Futurity X31/X33 web framework. It is invoked via the `CRSV0103` use case ID for basic option contract lookups, and additionally calls `CRSV0278` when the user clicks a my homepage link to retrieve ISP agreement details.

## Key Classes and Interfaces

### CRW02702SFBean (Form Bean)

**Source:** [CRW02702SFBean.java](source/koptWebB/src/eo/web/webview/CRW02702SF/CRW02702SFBean.java)

The top-level form bean that holds all screen-level state for the option service contract list inquiry. It extends `X33VViewBaseBean` and implements `X33VListedBeanInterface` and `X31CBaseBean`.

**Purpose:** Acts as the central data container between the JSP view and the logic layer. Every property on this bean has a three-part naming convention: `<property>_update` (change tracking), `<property>_value` (current value), and `<property>_state` (visibility/editability state).

**Key fields:**

| Field Category | Fields | Description |
|---|---|---|
| Search parameters | `key_svc_kei_no`, `total_search_num`, `svc_pplan_nm`, `mskmsho_no`, `svc_cd` | Search/filter parameters and identifiers |
| Search control | `search_err_flg`, `search_dsp_flg` | Error flag and result display flag |
| Detail selection | `slct_detail_index`, `key_op_svc_kei_no` | Currently selected detail row index |
| Login credentials | `mlad` (mail address), `alias`, `web_id`, `ics_web_url`, `ics_web_open_flg` | Credentials and URL for external log-in |
| Data lists | `ekk0351b002cbsmsg1list_list`, `ecr0451b010cbsmsg1list_list`, `ekk0361a010cbsmsg1list_list`, `wrib_svc_kei_list_list` | `X33VDataTypeList` collections populated by service calls |

The four `X33VDataTypeList` fields hold arrays of child data beans:
- `ekk0351b002cbsmsg1list_list` — Main option service contract details (each row maps to a `CRW02702SF01DBean`)
- `ecr0451b010cbsmsg1list_list` — Corresponding history external connection URLs (each row maps to a `CRW02702SF03DBean`)
- `ekk0361a010cbsmsg1list_list` — Option service contract <ISP> agreement details (each row maps to a `CRW02702SF02DBean`)
- `wrib_svc_kei_list_list` — Discount service contract details (each row maps to a `CRW02702SF04DBean`)

The constructor initializes all four `X33VDataTypeList` instances.

### CRW02702SFLogic (View Logic)

**Source:** [CRW02702SFLogic.java](source/koptWebB/src/eo/web/webview/CRW02702SF/CRW02702SFLogic.java)

The primary business logic controller for this screen. It extends `JCCWebBusinessLogic` and orchestrates all screen interactions. This is the class referenced by both `WEBGAMEN_CRW027020PJP.xml` and `x31business_logic_CRW02702SF.xml` configurations.

**Key methods:**

#### `initOp()` — Initial display processing

This is the entry point when the user first accesses the screen. The method follows a structured six-phase pattern:

1. **Inherit info retrieval** — Calls `JCCWebCommon.getScreenInfo(this)` to load inherited screen state from the framework.
2. **Service form bean setup** — No additional setup needed.
3. **Service invocation** — Builds a parameter map with use case ID `CRSV0103`, creates a `CRSV0103_CRSV0103OPDBMapper`, and invokes four service mappings (`setCRSV010301SC`, `setJKKOPNAIYOSTKUCC`, `setGETSBOPSVKEIISPCC`, `setCRSV010302SC`). For telephone service customers (`SVC_CD_TEL`), three additional mappings are invoked including option pack data retrieval.
4. **Service result setup** — Retrieves results via the corresponding `get` mappings, calls `setAuthority()` to configure link display permissions, and uses `JZMWebCommon.replaceTendymd()` to replace placeholder date `20991231` with "Black" (end-of-life indicator) for both the option contract list and the discount service list.
5. **Inherit info setup** — No additional setup.
6. **Common form bean setup** — Sets the next screen ID and name in the shared `CommonInfoCF` bean.

#### `clickLinkOpNiy()` — Option content link click

Triggered when the user clicks the option content link (e.g., an e-mail address or my homepage name) in the detail list. This method:

1. Reads the selected row index from `slct_detail_index` and retrieves the corresponding `CRW02702SF01DBean` from the option service contract list.
2. Checks the option service code (`opSvcCd`) to determine the service type:
   - **Email (`B001`)**: Sets the mail address and alias on the form bean; clears web_id.
   - **My Homepage (`B002`)**: Clears mail address, web_id, and alias; sets the option service contract number.
3. If my homepage (`B002`), invokes a secondary service (`CRSV0278` use case) via `CRSV0278_CRSV0278OPDBMapper` to fetch ISP agreement details, then extracts the WebID from the first agreement row.
4. Constructs a log-in system URL by calling `getIcsWebUrl()`.
5. Sets `ics_web_open_flg` to `true` to signal the view should open the URL.

#### `clickLinkSbopNiy()` — Sub-option content link click

Similar to `clickLinkOpNiy()` but simpler — it always targets the e-mail service path (not my homepage). It extracts the option content (mail address) and sub-option content (alias) from the selected detail row, sets them on the form bean, and constructs the log-in URL.

#### `setAuthority()` — Link display permission control

Iterates through all rows in the option service contract list (`ekk0351b002cbsmsg1list_list`). For each row:
- If the option service code is neither email (`B001`) nor my homepage (`B002`), disables the option content link display flag (`l_op_svc_niy_link_dsp_flg`).
- Otherwise, calls `JCRWebCommon.checkAuthority(this, AUTHORITY_OP_NIY_DSP_FLG)` with the authority definition key `CRW027020PJP;OP_NIY_DSP_FLG;0` to determine whether the user is permitted to view the link.

This is a row-level permission check — different contracts may have different link visibility based on user authorization files.

#### `encryptTimestamp(String)` — Timestamp encryption

Encrypts a 14-digit timestamp string (YYYYMMDDHHmmss) into an obfuscated 14-character string for use in the log-in URL. The algorithm:
1. Takes the last digit of the timestamp (seconds place).
2. For each of the first 13 digits, adds the last digit value (mod 10) and maps through a substitution table (`REPLACE_MAP`: 0→A, 1→C, 2→E, ..., 9→S).
3. Reorders the 14 encrypted characters in a fixed permutation pattern (positions: 0, 13, 2, 10, 4, 8, 6, 13, 1, 11, 3, 9, 5, 7).

#### `getIcsWebUrl()` — Log-in system URL construction

Builds the URL for the log-in system (ICS) by:
1. Retrieving the base URL from the first row of the corresponding history external connection URL list (`ecr0451b010cbsmsg1list_list`).
2. Extracting the user ID (left-padded to 7 characters), mail address, web ID, alias, encrypted timestamp, and service contract number from the form beans.
3. Replacing placeholder tokens (`%LOGIN_ID%`, `%MAIL_ADDRESS%`, `%MAIL_ALIAS%`, `%WEB_ID%`, `%V%`, `%CONSUMER_ID%`) in the base URL.
4. Setting `ics_web_open_flg` to `true` so the view opens the constructed URL.

#### `getCRSV010301SCFuncCd(X31SDataBeanAccess)` — Function code for service invocation

Returns the function code for the `CRSV010301SC` service mapping. Returns `FUNC_CD_2` for telephone service customers (allowing sub-option data retrieval) and `FUNC_CD_1` for all other service types.

### CRW02702SF01DBean (Detail Row Bean)

**Source:** [CRW02702SF01DBean.java](source/koptWebB/src/eo/web/webview/CRW02702SF/CRW02702SF01DBean.java)

Represents a single row in the option service contract detail list. Implements `X33VDataTypeBeanInterface`, `X33VListedBeanInterface`, and `Serializable`. This is the most data-rich bean in the module with 13 column categories, each having `_update`, `_value`, `_enabled`, and `_state` properties (42 properties total, plus `index` and `l_line_style_class`, `l_line_style_id`).

**Columns displayed per row:**

| Column | Property Prefix | Description |
|---|---|---|
| Detail index | `l_detail_index` | Row sequence number |
| Option service name | `l_op_svc_cd_nm` | Name of the option service |
| Option content | `l_op_svc_niy` | Optional content description |
| Sub-option content | `l_sbop_svc_niy` | Sub-option content (e.g., alias for e-mail) |
| Usage status | `l_op_svc_kei_stat_nm` | Current service status |
| Service start date | `l_svc_staymd` | Start date of service |
| Expected cancellation date | `l_rsv_tsta_kibo_ymd` | Planned cancellation date |
| Service end date | `l_svc_endymd` | Actual end date |
| Option service contract number | `l_op_svc_kei_no` | Contract number |
| Option service code | `l_op_svc_cd` | Service code (B001=email, B002=my homepage) |
| Option content link display flag | `l_op_svc_niy_link_dsp_flg` | Whether the content link is clickable (Boolean) |
| Row style class | `l_line_style_class` | CSS styling class for alternating row appearance |
| Row style ID | `l_line_style_id` | CSS styling ID for the row |

Each property group follows the three-part naming convention (`_update`, `_value`, `_state`), except `_enabled` fields (Boolean) and `_update`/`_state` fields (String). The `loadModelData()`, `storeModelData()`, `listKoumokuIds()`, and `typeModelData()` methods implement the Futurity framework's dynamic data binding protocol, allowing the JSP to read/write values by Japanese column name and subkey (`"value"`, `"enable"`, `"state"`).

### CRW02702SF02DBean (ISP WebID Row Bean)

**Source:** [CRW02702SF02DBean.java](source/koptWebB/src/eo/web/webview/CRW02702SF/CRW02702SF02DBean.java)

A minimal bean representing a single row in the ISP agreement details list. Contains only one data column:
- `l2_web_id` (WebID for my homepage access)

Each property has `_update`, `_value`, and `_state` variants. This bean is used exclusively when the user clicks a my homepage link (`clickLinkOpNiy()`), where the logic layer retrieves the WebID from the first ISP agreement row to build the log-in URL.

### CRW02702SF03DBean (External Connection URL Bean)

**Source:** [CRW02702SF03DBean.java](source/koptWebB/src/eo/web/webview/CRW02702SF/CRW02702SF03DBean.java)

Represents rows in the corresponding history external connection URL list. Contains seven columns:

| Column | Property Prefix | Description |
|---|---|---|
| URL number | `l1_taiorrk_out_url_no` | Sequence number of the URL entry |
| URL sub-type code | `l1_taiorrk_out_url_sbt_cd` | Type classification code |
| URL sub-type name | `l1_taiorrk_out_url_sbt_cd_nm` | Human-readable type name |
| URL | `l1_taiorrk_out_url` | The base URL template |
| URL name | `l1_taiorrk_out_url_nm` | Display name for the URL |

Each property has `_update`, `_value`, and `_state` variants. This bean is populated by the `ecr0451b010cbsmsg1list_list` list, and the first row's URL is used as the base for constructing the ICS log-in URL.

### CRW02702SF04DBean (Discount Service Info Bean)

**Source:** [CRW02702SF04DBean.java](source/koptWebB/src/eo/web/webview/CRW02702SF/CRW02702SF04DBean.java)

Represents rows in the discount service contract details list, which is only populated for telephone service customers. Contains nine columns:

| Column | Property Prefix | Description |
|---|---|---|
| Service contract internal number | `l3_svc_kei_ucwk_no` | Internal contract number |
| Phone number | `l3_telno` | Telephone number (Boolean `_enabled` = true) |
| Discount service code name | `l3_wrib_svc_cd_nm` | Name of the discount service (Boolean `_enabled` = true) |
| Discount service contract status | `l3_wrib_svc_kei_stat_nm` | Status name (Boolean `_enabled` = true) |
| Service charge start date | `l3_svc_chrg_staymd` | Billing start date (Boolean `_enabled` = true) |
| Service charge end date | `l3_svc_chrg_endymd` | Billing end date (Boolean `_enabled` = true) |
| Application billing date | `l3_mskm_kisan_ymd` | Billing application date (Boolean `_enabled` = true) |
| Row style class | `l3_line_style_class` | CSS styling |
| Row style ID | `l3_line_style_id` | CSS styling |

The `_enabled` fields are all `true` by default, indicating these discount service columns are always visible/readable. The `l3_svc_chrg_endymd` field has a special `_enabled` variant (unlike most date fields that use `_state`), and the end date undergoes the same `replaceTendymd` processing (20991231 → Black) in `initOp()`.

### CRW02702SFChecker (GUI Validator)

**Source:** [CRW02702SF02702SFChecker.java](source/koptWebB/src/eo/web/webview/CRW02702SF/CRW02702SFChecker.java)

Implements `X31SGuiCheckBase` but performs no actual validation. The `checkMethod()` always returns `true`. It holds a reference to the `CRW02702SFLogic` instance (passed via constructor) but never uses it. This appears to be a placeholder generated by the Web Client tool for potential future validation logic.

### CRW02702SFConst (Constants)

**Source:** [CRW02702SFConst.java](source/koptWebB/src/eo/web/webview/CRW02702SF/CRW02702SFConst.java)

A utility class with a private constructor holding all string constants used across the module. Constants are organized into logical groups:

- **Search parameters**: `KEY_SVC_KEI_NO`, `TOTAL_SEARCH_NUM`, `SVC_PPLAN_NM`, `MSKMSHO_NO`, `SVC_CD`
- **Search flags**: `SEARCH_ERR_FLG`, `SEARCH_DSP_FLG`
- **Detail selection**: `SLCT_DETAIL_INDEX`
- **Login data**: `MLAD`, `ALIAS`, `WEB_ID`, `ICS_WEB_URL`, `ICS_WEB_OPEN_FLG`
- **Data list keys**: `EKK0351B002CBSMSG1LIST` (option service list), `ECR0451B010CBSMSG1LIST` (URL list), `EKK0361A010CBSMSG1LIST` (ISP agreement list), `WRIB_SVC_KEI_LIST` (discount service list)
- **Detail columns (01 suffix)**: `L_DETAIL_INDEX_01` through `L_LINE_STYLE_ID_01` — 13 column identifiers for the main option service contract table
- **ISP columns (02 suffix)**: `L2_WEB_ID_02` — WebID column for ISP agreements
- **URL columns (03 suffix)**: `L1_TAIORRK_OUT_URL_NO_03` through `L1_TAIORRK_OUT_URL_NM_03` — six columns for external connection URLs
- **Discount columns (04 suffix)**: `L3_SVC_KEI_UCWK_NO_04` through `L3_LINE_STYLE_ID_04` — nine columns for discount service contracts

## How It Works

### Request flow: Initial page load

```mermaid
flowchart TD
    A["User navigates to CRW027020PJP.jsp"] --> B["CRW02702SFLogic.initOp()"]
    B --> C["JCCWebCommon.getScreenInfo() - load inherited state"]
    B --> D["Build paramMap with CRSV0103 use case ID"]
    D --> E["CRSV0103_CRSV0103OPDBMapper"]
    E --> F["setCRSV010301SC - option contract list"]
    E --> G["setJKKOPNAIYOSTKUCC - option details"]
    E --> H["setGETSBOPSVKEIISPCC - sub-options"]
    E --> I["setCRSV010302SC - additional details"]
    J["Is phone service?"] -->|Yes| K["setCRSV010303SC + setTELSELECTOPPACKOPERATECC + setCRSV010304SC"]
    J -->|No| F
    F --> L["invokeService() - execute all mappings"]
    K --> L
    L --> M["get mappings - populate bean lists"]
    M --> N["setAuthority() - row-level permission checks"]
    N --> O["replaceTendymd - 20991231 to Black"]
    O --> P["Set next screen info in CommonInfoCF"]
    P --> Q["Return true - JSP renders"]
```

1. User accesses the screen (JSP page `CRW027020PJP.jsp`).
2. `initOp()` is invoked, which retrieves the form bean and common info bean.
3. Inherited screen info is loaded via `JCCWebCommon.getScreenInfo()`.
4. The service invocation builds a use case map with `CRSV0103` and creates a mapper instance.
5. Primary mappings are set: `setCRSV010301SC`, `setJKKOPNAIYOSTKUCC`, `setGETSBOPSVKEIISPCC`, `setCRSV010302SC`.
6. For phone service customers, additional mappings pull sub-option and option pack data.
7. `invokeService()` executes all service calls and populates output maps.
8. Result mappings (`getCRSV010301SC`, etc.) populate the form bean's data lists.
9. `setAuthority()` configures which rows have clickable option content links.
10. Date placeholders (20991231) are replaced with "Black" for end-of-life display.
11. Next screen navigation info is set in the common info bean.
12. The method returns `true`, and the JSP renders the populated data.

### Request flow: Option content link click

```mermaid
sequenceDiagram
    participant U as User
    participant JSP as CRW027020PJP
    participant L as CRW02702SFLogic
    participant S as Backend Service
    participant B as Form Bean

    U->>JSP: Clicks option content link
    JSP->>L: clickLinkOpNiy()
    L->>B: Get slct_detail_index
    L->>B: Get detail row from ekk0351b list
    L->>B: Get opSvcCd from detail
    alt opSvcCd == B001 (Email)
        L->>B: Set MLAD = op_svc_niy_value
        L->>B: Set WEB_ID = ""
        L->>B: Set ALIAS = sbop_svc_niy_value
    else opSvcCd == B002 (My Homepage)
        L->>B: Set MLAD = ""
        L->>B: Set ALIAS = ""
        L->>B: Set KEY_OP_SVC_KEI_NO
        L->>S: CRSV027801SC (ISP agreement data)
        S-->>L: ISP agreement results
        L->>B: Set WEB_ID from ISP row
    end
    L->>L: getIcsWebUrl() - build URL
    L->>B: Set ics_web_url
    L->>B: Set ics_web_open_flg = true
    L-->>JSP: Return true
    JSP->>U: Opens ICS URL in new window
```

### Row-level permission model

The `setAuthority()` method implements fine-grained display permissions on a per-row basis. The authority definition key `CRW027020PJP;OP_NIY_DSP_FLG;0` is checked via `JCRWebCommon.checkAuthority()`, which consults the authorization file system. Only rows where the option service code is email (`B001`) or my homepage (`B002`) can potentially show the link; all other service types are always hidden.

### Timestamp encryption for ICS URL

The `encryptTimestamp()` method is a custom substitution cipher designed to produce a stable but non-guessable timestamp token for the ICS log-in URL. The same input timestamp will always produce the same encrypted output (deterministic), but the output does not directly reveal the input time.

## Data Model

The module uses a hierarchical data model with the form bean at the top level and four `X33VDataTypeList` collections holding typed arrays of child beans:

```mermaid
flowchart LR
    BEAN["CRW02702SFBean"]
    DETAIL_LIST["ekk0351b002cbsmsg1list_list"]
    URL_LIST["ecr0451b010cbsmsg1list_list"]
    ISP_LIST["ekk0361a010cbsmsg1list_list"]
    DISCOUNT_LIST["wrib_svc_kei_list_list"]
    DETAIL_BEAN["CRW02702SF01DBean"]
    URL_BEAN["CRW02702SF03DBean"]
    ISP_BEAN["CRW02702SF02DBean"]
    DISCOUNT_BEAN["CRW02702SF04DBean"]

    BEAN --> DETAIL_LIST
    BEAN --> URL_LIST
    BEAN --> ISP_LIST
    BEAN --> DISCOUNT_LIST
    DETAIL_LIST --> DETAIL_BEAN
    URL_LIST --> URL_BEAN
    ISP_LIST --> ISP_BEAN
    DISCOUNT_LIST --> DISCOUNT_BEAN
```

- `ekk0351b002cbsmsg1list_list` — Each element is a `CRW02702SF01DBean` representing one option service contract. These are the main rows displayed in the detail table.
- `ecr0451b010cbsmsg1list_list` — Each element is a `CRW02702SF03DBean` representing an external connection URL entry. The first element's URL field is used as the ICS base URL.
- `ekk0361a010cbsmsg1list_list` — Each element is a `CRW02702SF02DBean` representing ISP agreement data. Only the first element is used (to extract WebID for my homepage login).
- `wrib_svc_kei_list_list` — Each element is a `CRW02702SF04DBean` representing a discount service contract. Only populated for telephone service customers.

## Dependencies and Integration

### Inbound dependencies (who uses this module)

| Consumer | What it uses |
|---|---|
| `CRW027020PJP.jsp` | `CRW02702SF01DBean`, `CRW02702SF04DBean`, `CRW02702SFBean` |
| `WEBGAMEN_CRW027020PJP.xml` | `CRW02702SFBean`, `CRW02702SFLogic` |
| `x31business_logic_CRW02702SF.xml` | `CRW02702SFLogic` |

### External services called

| Mapper | Use case | Purpose |
|---|---|---|
| `CRSV0103_CRSV0103OPDBMapper` | `CRSV0103` | Main option service contract list inquiry |
| `CRSV0278_CRSV0278OPDBMapper` | `CRSV0278` | ISP agreement details (my homepage only) |

### Framework dependencies

The module depends on the following packages and frameworks:
- `eo.web.webview.commonOneStop` and `eo.web.webview.CommonInfoCF` — Shared common info bean for cross-screen state
- `eo.web.webview.common.JCCWebCommon`, `JCRWebCommon`, `JZMWebCommon` — Shared utility methods for screen navigation, authority checks, and date formatting
- `eo.web.webview.mapping.CRSV0103` / `CRSV0278` — Database mapper classes for service invocations
- `eo.common.constant.JCRStrConst`, `JPCModelConstant` — System-wide string and function code constants
- `com.fujitsu.futurity.bp.custom.common` — Custom business logic base classes
- Fujitsu Futurity X31/X33 web framework — Form bean management, GUI validation, and business logic infrastructure

### Cross-module relationships

This module belongs to the `eo.web.webview` package hierarchy and interacts with many other screen modules in the customer backbone system, as indicated by the extensive import dependencies. The module integrates with the option service inquiry flow (`CRSV0103`) and the ISP agreement inquiry flow (`CRSV0278`), and leverages shared web utilities from the `common` sub-packages.

## Notes for Developers

### Adding a new column to the detail table

1. Add a new field group to `CRW02702SF01DBean` with `_update`, `_value`, `_enabled` (or `_state`), and `_state` properties.
2. Add a corresponding constant to `CRW02702SFConst`.
3. Register the column in `CRW02702SF01DBean.listKoumokuIds()`, `loadModelData()`, `storeModelData()`, and `typeModelData()`.
4. Add the mapping in `CRSV0103_CRSV0103OPDBMapper` if the data comes from the backend service.
5. Add the column to the JSP table layout.

### Authority-controlled links

The option content link display is controlled at the row level by the authorization file referenced in `AUTHORITY_OP_NIY_DSP_FLG` (`CRW027020PJP;OP_NIY_DSP_FLG;0`). If you need to add new permission-controlled elements, follow the same pattern: call `JCRWebCommon.checkAuthority(this, key)` and set the result on the appropriate `X31SDataBeanAccess` row.

### Telephone service branching

The module branches its behavior based on the service code. Telephone service (`SVC_CD_TEL`) triggers additional sub-option and option pack data retrieval. When adding new service types, check the `getCRSV010301SCFuncCd()` method to see how the function code affects service mapping behavior.

### Date end-of-life display

The placeholder date `20991231` is converted to "Black" (a visual indicator meaning "no end date set") by `JZMWebCommon.replaceTendymd()`. This is called twice in `initOp()`: once for the main option list (`EKK0351B002CBSMSG1LIST` / `L_SVC_ENDYMD_01`) and once for the discount service list (`WRIB_SVC_KEI_LIST` / `L3_SVC_CHRG_ENDYMD_04`). If you add a new date field that should receive the same treatment, add a call here.

### The checker class

`CRW02702SFChecker` is currently a no-op. It was generated by the Web Client tool but has no validation logic. If you need to add GUI-level validation (field format checks, cross-field validation), this is the place to implement it via the `checkMethod()` callback.

### The `REPLACE_MAP` substitution cipher

The static `REPLACE_MAP` used by `encryptTimestamp()` maps digits 0–9 to letters A, C, E, G, I, K, M, O, Q, S. This is intentionally simple obfuscation (not cryptographic) — the primary purpose is to prevent casual inspection of the timestamp in the URL. Do not rely on this for security-sensitive protection.

### Generated code patterns

All bean classes (`CRW02702SFBean`, `CRW02702SF01DBean`, `CRW02702SF02DBean`, `CRW02702SF03DBean`, `CRW02702SF04DBean`) are generated by the "Web Client tool" and follow a strict pattern: getter/setter triples (`_update`/`_value`/`_state`) plus `loadModelData`/`storeModelData`/`listKoumokuIds`/`typeModelData` for framework binding. New beans should follow the same pattern exactly.
