# Business Logic — FUW02301SFLogic.getCommoninfoBeanInfo() [139 LOC]

| Field | Value |
|-------|-------|
| Fully Qualified Name | `eo.web.webview.FUW02301SF.FUW02301SFLogic` |
| Layer | Service (Web-tier Business Logic) |
| Module | `FUW02301SF` (Package: `eo.web.webview.FUW02301SF`) |

## 1. Role

### FUW02301SFLogic.getCommoninfoBeanInfo()

The `getCommoninfoBeanInfo` method retrieves and validates the full hierarchical contract information tree from the common form data bean (`X31SDataBeanAccess`) for the current customer session. It serves as a central data-preparation step for screens that display or modify existing customer service contracts — specifically the FTTH (Fiber To The Home) and Mail service change screens within the FUW02301SF module.

The method implements a **delegation + validation routing** pattern. It navigates a nested bean hierarchy (WEB change info -> SSO info -> existing customer info -> service contract info -> service contract breakdown info) to extract core identity data (SYSID, POP_ID) and structural bean references. Then it performs two iterative **contract-finding routines**: first, it searches through an array of option service contracts to identify the active primary option service (matching by POP_ID, service type "B001: Email", and an active contract status), and second, it searches through sub-option service contracts to find the active sub-option matching by contract number and service type "D01: Email E-Mail" with a valid lifecycle status.

The method acts as a **shared utility** called by the screen's entry-point methods (`cfm()`, `init()`, `mskm()`) within the same logic class, making it a core data-acquisition component for the FUW02301SF screen flow. It enforces business invariants — throwing contract status errors when no valid active option service exists, or system errors when the option service number is missing — ensuring that downstream screens never operate on invalid contract state data.

## 2. Processing Pattern (Detailed Business Logic)

```mermaid
flowchart TD
    START(["getCommoninfoBeanInfo(commoninfoBean)"])
    STEP1["Create resultMap (HashMap)"]
    STEP2["Extract webChgInfoBean from commoninfoBean[WEB_CHG_INFO]"]
    STEP3["Extract ssoInfoBean from webChgInfoBean[SSO_INFO]"]
    STEP4["Get ssoInfoSysid from ssoInfoBean[SYSID_21]"]
    STEP5["Get ssoInfoPopid from ssoInfoBean[POP_ID_21]"]
    STEP6["Extract genCustKeiInfoBean from webChgInfoBean[GEN_CUST_KEI_INFO]"]
    STEP7["Extract svcKeiInfoBean from genCustKeiInfoBean[SVC_KEI_INFO]"]
    STEP8["Extract svcKeiUcwkInfoBean from svcKeiInfoBean[SVC_KEI_UCWK_INFO]"]
    STEP9["Extract seikyKeiInfoBean from svcKeiInfoBean[SEIKY_KEI_INFO]"]
    STEP10["opSvcKeiInfoBean = null"]
    STEP11["Get opSvcKeiInfoArray from svcKeiUcwkInfoBean[OP_SVC_KEI_INFO]"]
    STEP12["m = 0, opSvcKeiInfoArray.getCount()"]
    STEP13["Get tmpOpSvcKeiInfoBean from opSvcKeiInfoArray.getDataBean(m)"]
    STEP14["Get popId from tmpOpSvcKeiInfoBean[POP_ID_28]"]
    STEP15["Get opSvCd from tmpOpSvcKeiInfoBean[OP_SVC_CD_28]"]
    STEP16["Get opSvcKeiStat from tmpOpSvcKeiInfoBean[OP_SVC_KEI_STAT_28]"]
    STEP17{"CD00037_020=020 (Confirmed) or CD00037_030=030 (Completed) or CD00037_100=100 (In Service)"}
    STEP18{"ssoInfoPopid equals popId AND CD00136_B001=B001 (Email)"}
    STEP19["opSvcKeiInfoBean = tmpOpSvcKeiInfoBean"]
    STEP20["break loop"]
    STEP21{"m < count, m++"}
    STEP22{"opSvcKeiInfoBean == null"}
    STEP23["Throw JCCBusinessException ERROR_CODE_0102 (Contract Status Error)"]
    STEP24["Get opInfoOpSvcKeiNo from opSvcKeiInfoBean[OP_SVC_KEI_NO_28]"]
    STEP25{"JFUWebCommon.isNull(opInfoOpSvcKeiNo)"}
    STEP26["Throw JCCBusinessException ERROR_CODE_0002 (System Error)"]
    STEP27["Get sbopSvcKeiInfoArray from opSvcKeiInfoArray.getDataBean(0).getDataBeanArray(SBOP_SVC_KEI_INFO)"]
    STEP28["n = 0, sbopSvcKeiInfoArray.getCount()"]
    STEP29["Get tmpSbopSvcKeiInfoBean from sbopSvcKeiInfoArray.getDataBean(n)"]
    STEP30["Get opSvcKeiNo from tmpSbopSvcKeiInfoBean[OP_SVC_KEI_NO_29]"]
    STEP31["Get sbopSvcKeiStat from tmpSbopSvcKeiInfoBean[SBOP_SVC_KEI_STAT_29]"]
    STEP32["Get sbopSvCd from tmpSbopSvcKeiInfoBean[SBOP_SVC_CD_29]"]
    STEP33{"CD00037_910=910 (Canceled) or CD00037_920=920 (Terminated)"}
    STEP34["continue loop"]
    STEP35{"opInfoOpSvcKeiNo equals opSvcKeiNo AND CD00137_D01=D01 (Email E-Mail)"}
    STEP36{"CD00037_020=020 or CD00037_030=030 or CD00037_100=100"}
    STEP37["sbopSvcKeiInfoBean = tmpSbopSvcKeiInfoBean"]
    STEP38{"CD00037_010=010 (Accepted)"}
    STEP39["continue loop"]
    STEP40{"CD00037_210=210 or CD00037_220=220"}
    STEP41["Throw JCCBusinessException ERROR_CODE_0102 (Contract Status Error)"]
    STEP42{"n < count, n++"}
    END1["Populate resultMap with all bean infos"]
    END2["Return resultMap"]

    START --> STEP1 --> STEP2 --> STEP3 --> STEP4 --> STEP5 --> STEP6 --> STEP7 --> STEP8 --> STEP9 --> STEP10 --> STEP11 --> STEP12 --> STEP13 --> STEP14 --> STEP15 --> STEP16 --> STEP17
    STEP17 -->|Yes| STEP18
    STEP17 -->|No| STEP21
    STEP18 -->|Yes| STEP19 --> STEP20 --> STEP12
    STEP18 -->|No| STEP21
    STEP21 -->|Yes| STEP13
    STEP21 -->|No| STEP22
    STEP22 -->|Yes| STEP23
    STEP22 -->|No| STEP24 --> STEP25
    STEP25 -->|Yes| STEP26
    STEP25 -->|No| STEP27 --> STEP28 --> STEP29 --> STEP30 --> STEP31 --> STEP32 --> STEP33
    STEP33 -->|Yes| STEP34 --> STEP28
    STEP33 -->|No| STEP35
    STEP35 -->|Yes| STEP36
    STEP35 -->|No| STEP42
    STEP36 -->|Yes| STEP37
    STEP36 -->|No| STEP38
    STEP38 -->|Yes| STEP39 --> STEP28
    STEP38 -->|No| STEP40
    STEP40 -->|Yes| STEP41
    STEP40 -->|No| STEP42
    STEP42 -->|Yes| STEP29
    STEP42 -->|No| END1 --> END2
```

## 3. Parameter Analysis

| No | Parameter Name | Type | Business Description |
|----|---------------|------|---------------------|
| 1 | `commoninfoBean` | `X31SDataBeanAccess` | The common form data bean carrying the full customer contract information hierarchy. It contains nested data beans for WEB change info (which in turn holds SSO identity info, existing customer contract info, service contract info, and billing contract info). This is the central data container passed through the screen flow to carry all shared business state between page renders and form submissions. |

## 4. CRUD Operations / Called Services

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

| CRUD | SC / CBS | SC Code | Entity / DB | Operation Description |
|------|----------|---------|-------------|----------------------|
| - | `JFUWebCommon.isNull` | JFUWebCommon | - | Null-check utility call to validate that `opInfoOpSvcKeiNo` (option service contract number) is not null/empty |
| R | `OneStopDataBeanAccessArray.getCount` | OneStopDataBeanAccessArray | - | Gets the count of option service contracts in the array for iteration |
| R | `OneStopDataBeanAccessArray.getDataBean` | OneStopDataBeanAccessArray | - | Retrieves a specific option service contract data bean by index during iteration |
| R | `OneStopDataBeanAccess.getDataBeanArray` | OneStopDataBeanAccess | - | Gets the sub-option service contract array from the first option service contract |
| R | `OneStopDataBeanAccess.getDataBeanArray` | OneStopDataBeanAccess | - | Gets the WEB change info array from the common info bean |
| R | `OneStopDataBeanAccess.getDataBeanArray` | OneStopDataBeanAccess | - | Gets the SSO info array from the WEB change info bean |
| R | `OneStopDataBeanAccess.getDataBeanArray` | OneStopDataBeanAccess | - | Gets the existing customer contract info array |
| R | `OneStopDataBeanAccess.getDataBeanArray` | OneStopDataBeanAccess | - | Gets the service contract info array |
| R | `OneStopDataBeanAccess.getDataBeanArray` | OneStopDataBeanAccess | - | Gets the service contract breakdown info array |
| R | `OneStopDataBeanAccess.getDataBeanArray` | OneStopDataBeanAccess | - | Gets the billing contract info array |
| R | `OneStopDataBeanAccess.getDataBeanArray` | OneStopDataBeanAccess | - | Gets the option service contract info array from service contract breakdown |
| R | `OneStopDataBeanAccessArray.getCount` | OneStopDataBeanAccessArray | - | Gets the count of sub-option service contracts for iteration |
| R | `OneStopDataBeanAccessArray.getDataBean` | OneStopDataBeanAccessArray | - | Retrieves a specific sub-option service contract data bean by index |
| - | `OneStopDataBeanAccess.sendMessageString` | OneStopDataBeanAccess | - | Retrieves String values (SYSID, POP_ID, service codes, statuses) from data beans by field key |
| - | `OneStopDataBeanAccess.sendMessageString` | OneStopDataBeanAccess | - | Retrieves String values (POP_ID, service code, status) from option service bean |
| - | `OneStopDataBeanAccess.sendMessageString` | OneStopDataBeanAccess | - | Retrieves String values (option service number, OP service code, contract status) from sub-option service bean |

*Classification notes:*
- This method is a **data-navigation and validation** method — it does not directly invoke any SC (Service Component) or CBS (Common Business Service) that performs database CRUD operations.
- All operations are **Read** (R) from in-memory data bean arrays (`X31SDataBeanAccess` / `X31SDataBeanAccessArray`), which are populated by prior service-layer calls before this method is invoked.
- `sendMessageString` with `X31CWebConst.DATABEAN_GET_VALUE` is the standard data-bean getter used to extract typed field values by key.
- `isNull` is a utility validation call, not a data-access operation.

## 5. Dependency Trace

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

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

| # | Caller (Screen/Batch) | Call Chain (Full Path to this Method) | Terminal (SC / CRUD / Entity) |
|---|----------------------|--------------------------------------|-------------------------------|
| 1 | Class: `FUW02301SFLogic` | `cfm()` -> `getCommoninfoBeanInfo(commoninfoBean)` | `sendMessageString [R] (in-memory bean)` |
| 2 | Class: `FUW02301SFLogic` | `init()` -> `getCommoninfoBeanInfo(commoninfoBean)` | `sendMessageString [R] (in-memory bean)` |
| 3 | Class: `FUW02301SFLogic` | `mskm()` -> `getCommoninfoBeanInfo(commoninfoBean)` | `sendMessageString [R] (in-memory bean)` |

**Terminal operations reached from this method:**
- `sendMessageString` (Read from in-memory data beans — SYSID, POP_ID, service codes, statuses, contract numbers)
- `getDataBean` / `getDataBeanArray` (Read from in-memory data bean arrays — navigation through nested bean hierarchy and iteration)
- `getCount` (Read — array size checks for iteration bounds)
- `isNull` (Validation — null/empty checks)

## 6. Per-Branch Detail Blocks

**Block 1** — [INITIALIZATION] `(Bean hierarchy extraction)` (L828)

> Extract and navigate the nested data bean hierarchy from the incoming `commoninfoBean`. This establishes references to all structural bean levels needed for contract information.

| # | Type | Code |
|---|------|------|
| 1 | SET | `resultMap = new HashMap<String, Object>()` // Initialize result map |
| 2 | SET | `webChgInfoBean = commoninfoBean.getDataBeanArray(CommonInfoCFConst.WEB_CHG_INFO).getDataBean(0)` // Get WEB change information bean [WEB_CHG_INFO = "WEB変更情報" / WEB Change Information] |
| 3 | SET | `ssoInfoBean = webChgInfoBean.getDataBeanArray(CommonInfoCFConst.SSO_INFO).getDataBean(0)` // Get SSO information bean [SSO_INFO = "SSO情報" / SSO Information] |
| 4 | SET | `ssoInfoSysid = ssoInfoBean.sendMessageString(CommonInfoCFConst.SYSID_21, X31CWebConst.DATABEAN_GET_VALUE)` // Extract SYSID [SYSID_21 = "SYSID"] |
| 5 | SET | `ssoInfoPopid = ssoInfoBean.sendMessageString(CommonInfoCFConst.POP_ID_21, X31CWebConst.DATABEAN_GET_VALUE)` // Extract POP_ID [POP_ID_21 = "POP_ID"] |
| 6 | SET | `genCustKeiInfoBean = webChgInfoBean.getDataBeanArray(CommonInfoCFConst.GEN_CUST_KEI_INFO).getDataBean(0)` // Get existing customer contract information [GEN_CUST_KEI_INFO = "現顧客契約情報" / Existing Customer Contract Information] |
| 7 | SET | `svcKeiInfoBean = genCustKeiInfoBean.getDataBeanArray(CommonInfoCFConst.SVC_KEI_INFO).getDataBean(0)` // Get service contract information [SVC_KEI_INFO = "サービス契約情報" / Service Contract Information] |
| 8 | SET | `svcKeiUcwkInfoBean = svcKeiInfoBean.getDataBeanArray(CommonInfoCFConst.SVC_KEI_UCWK_INFO).getDataBean(0)` // Get service contract breakdown information [SVC_KEI_UCWK_INFO = "サービス契約内訳情報" / Service Contract Breakdown Information] |
| 9 | SET | `seikyKeiInfoBean = svcKeiInfoBean.getDataBeanArray(CommonInfoCFConst.SEIKY_KEI_INFO).getDataBean(0)` // Get billing contract information [SEIKY_KEI_INFO = "請求契約情報" / Billing Contract Information] |
| 10 | SET | `opSvcKeiInfoBean = null` // Initialize option service contract info bean (to be matched) |
| 11 | SET | `opSvcKeiInfoArray = svcKeiUcwkInfoBean.getDataBeanArray(CommonInfoCFConst.OP_SVC_KEI_INFO)` // Get option service contract info array [OP_SVC_KEI_INFO = "オプションサービス契約情報" / Option Service Contract Information] |

**Block 2** — [FOR LOOP] `(Iterate through option service contracts)` `(L851)`

> Loop through each option service contract entry to find the active primary option service that matches the current SSO's POP_ID and has the service type "B001: Email". The contract status must be in an active state (confirmed, completed, or in service).

| # | Type | Code |
|---|------|------|
| 1 | SET | `m = 0` // Loop counter initialization |
| 2 | EXEC | `opSvcKeiInfoArray.getCount()` // Get total count of option service contracts |
| 3 | SET | `tmpOpSvcKeiInfoBean = opSvcKeiInfoArray.getDataBean(m)` // Get current option service contract data bean |
| 4 | SET | `popId = tmpOpSvcKeiInfoBean.sendMessageString(CommonInfoCFConst.POP_ID_28, X31CWebConst.DATABEAN_GET_VALUE)` // Extract POP_ID from current option service [POP_ID_28 = "POP_ID"] |
| 5 | SET | `opSvCd = tmpOpSvcKeiInfoBean.sendMessageString(CommonInfoCFConst.OP_SVC_CD_28, X31CWebConst.DATABEAN_GET_VALUE)` // Extract option service code [OP_SVC_CD_28 = "オプションサービスコード" / Option Service Code] |
| 6 | SET | `opSvcKeiStat = tmpOpSvcKeiInfoBean.sendMessageString(CommonInfoCFConst.OP_SVC_KEI_STAT_28, X31CWebConst.DATABEAN_GET_VALUE)` // Extract option service contract status [OP_SVC_KEI_STAT_28 = "オプションサービス契約ステータス" / Option Service Contract Status] |

**Block 2.1** — [IF] `(option service contract status is active: 020/030/100)` `(L857)` `[CD00037_020="020" (Confirmed), CD00037_030="030" (Completed), CD00037_100="100" (In Service)]`

> Check if the current option service contract has an active status. Only confirmed (020), completed (030), or in-service (100) contracts are eligible for matching.

| # | Type | Code |
|---|------|------|
| 1 | EXEC | `JFUStrConst.CD00037_020.equals(opSvcKeiStat) || JFUStrConst.CD00037_030.equals(opSvcKeiStat) || JFUStrConst.CD00037_100.equals(opSvcKeiStat)` // Status check [CD00037_020="020" (Confirmed), CD00037_030="030" (Completed), CD00037_100="100" (In Service)] |

**Block 2.1.1** — [IF] `(POP_ID matches AND service code is Email)` `(L861)` `[CD00136_B001="B001" (Email)]`

> Check if the POP_ID of the option service matches the SSO's POP_ID AND the service code is "B001: Email". This identifies the primary email option service contract.

| # | Type | Code |
|---|------|------|
| 1 | EXEC | `ssoInfoPopid.equals(popId)` // SSO POP_ID matches option service POP_ID |
| 2 | EXEC | `JFUStrConst.CD00136_B001.equals(opSvCd)` // Service code is Email [CD00136_B001="B001" (Email)] |
| 3 | SET | `opSvcKeiInfoBean = tmpOpSvcKeiInfoBean` // Match found — store as the confirmed option service contract bean |
| 4 | EXEC | `break` // Exit loop — primary option service found |

**Block 2.2** — [ELSE/LOOP UPDATE] `(L851)`

> If the status is not active, or if the inner conditions are not met, continue to the next iteration.

| # | Type | Code |
|---|------|------|
| 1 | SET | `m++` // Increment loop counter |
| 2 | EXEC | `m < opSvcKeiInfoArray.getCount()` // Check loop continuation |

**Block 3** — [IF] `(opSvcKeiInfoBean is still null — no active option service found)` `(L869)`

> After iterating through all option service contracts, if no active option service was found, this is a contract status error. The customer does not have a valid active option service contract.

| # | Type | Code |
|---|------|------|
| 1 | EXEC | `opSvcKeiInfoBean == null` // No matching option service found |
| 2 | EXEC | `throw new JCCBusinessException(JFUStrConst.ERROR_CODE_0102)` // Contract status error [ERROR_CODE_0102 = "0102" / Contract Status Error] |

**Block 4** — [VALIDATION] `(Option service number is not null)` `(L873)`

> Retrieve the option service contract number from the matched option service bean. If the number is null or empty, this indicates a system configuration error — a matched contract should always have a contract number assigned.

| # | Type | Code |
|---|------|------|
| 1 | SET | `opInfoOpSvcKeiNo = opSvcKeiInfoBean.sendMessageString(CommonInfoCFConst.OP_SVC_KEI_NO_28, X31CWebConst.DATABEAN_GET_VALUE)` // Get option service contract number [OP_SVC_KEI_NO_28 = "オプションサービス契約番号" / Option Service Contract Number] |
| 2 | EXEC | `JFUWebCommon.isNull(opInfoOpSvcKeiNo)` // Null/empty validation |
| 3 | EXEC | `X31SWebLog.DEBUG_LOG.debug("【オプションサービス契約番号未設定エラー】")` // Debug log: "Option service contract number not set error" |
| 4 | EXEC | `throw new JCCBusinessException(JFUStrConst.ERROR_CODE_0002)` // System error [ERROR_CODE_0002 = "0002" / System Error] |

**Block 5** — [INITIALIZATION] `(Sub-option service contract array extraction)` `(L878)`

> Initialize the sub-option service contract info bean reference and extract the sub-option array from the first element of the option service contract array. The sub-option contracts are nested under the matched option service.

| # | Type | Code |
|---|------|------|
| 1 | SET | `sbopSvcKeiInfoBean = null` // Initialize sub-option service contract info bean (to be matched) |
| 2 | SET | `sbopSvcKeiInfoArray = opSvcKeiInfoArray.getDataBean(0).getDataBeanArray(CommonInfoCFConst.SBOP_SVC_KEI_INFO)` // Get sub-option service contract info array [SBOP_SVC_KEI_INFO = "サブオプションサービス契約情報" / Sub-option Service Contract Information] |

**Block 6** — [FOR LOOP] `(Iterate through sub-option service contracts)` `(L880)`

> Loop through each sub-option service contract entry to find the active sub-option that matches the option service contract number and has the service type "D01: Email E-Mail" with a valid lifecycle status.

| # | Type | Code |
|---|------|------|
| 1 | SET | `n = 0` // Loop counter initialization |
| 2 | EXEC | `sbopSvcKeiInfoArray.getCount()` // Get total count of sub-option service contracts |
| 3 | SET | `tmpSbopSvcKeiInfoBean = sbopSvcKeiInfoArray.getDataBean(n)` // Get current sub-option data bean |
| 4 | SET | `opSvcKeiNo = tmpSbopSvcKeiInfoBean.sendMessageString(CommonInfoCFConst.OP_SVC_KEI_NO_29, X31CWebConst.DATABEAN_GET_VALUE)` // Get option service contract number from sub-option [OP_SVC_KEI_NO_29 = "オプションサービス契約番号"] |
| 5 | SET | `sbopSvcKeiStat = tmpSbopSvcKeiInfoBean.sendMessageString(CommonInfoCFConst.SBOP_SVC_KEI_STAT_29, X31CWebConst.DATABEAN_GET_VALUE)` // Get sub-option service contract status [SBOP_SVC_KEI_STAT_29 = "サブオプションサービス契約ステータス" / Sub-option Service Contract Status] |
| 6 | SET | `sbopSvCd = tmpSbopSvcKeiInfoBean.sendMessageString(CommonInfoCFConst.SBOP_SVC_CD_29, X31CWebConst.DATABEAN_GET_VALUE)` // Get sub-option service code [SBOP_SVC_CD_29 = "サブオプションサービスコード" / Sub-option Service Code] |

**Block 6.1** — [IF] `(sub-option status is Canceled or Terminated)` `(L888)` `[CD00037_910="910" (Canceled), CD00037_920="920" (Terminated)]`

> Skip sub-option service contracts that have already been canceled or terminated — they are not eligible for selection.

| # | Type | Code |
|---|------|------|
| 1 | EXEC | `JFUStrConst.CD00037_910.equals(sbopSvcKeiStat) || JFUStrConst.CD00037_920.equals(sbopSvcKeiStat)` // Skip if canceled or terminated [CD00037_910="910" (Canceled), CD00037_920="920" (Terminated)] |
| 2 | EXEC | `continue` // Skip this sub-option, process next |

**Block 6.2** — [IF] `(contract number matches AND service code is Email E-Mail)` `(L893)` `[CD00137_D01="D01" (Email E-Mail)]`

> Check if the sub-option's contract number matches the matched option service's contract number AND the service code is "D01: Email E-Mail". This is the primary matching criterion for sub-option selection.

| # | Type | Code |
|---|------|------|
| 1 | EXEC | `opInfoOpSvcKeiNo.equals(opSvcKeiNo)` // Option service contract number matches |
| 2 | EXEC | `JFUStrConst.CD00137_D01.equals(sbopSvCd)` // Service code is Email E-Mail [CD00137_D01="D01" (Email E-Mail)] |

**Block 6.2.1** — [IF] `(sub-option status is Confirmed/Completed/In Service)` `(L897)` `[CD00037_020="020" (Confirmed), CD00037_030="030" (Completed), CD00037_100="100" (In Service)]`

> If the sub-option has a valid active status, store it as the confirmed sub-option service contract.

| # | Type | Code |
|---|------|------|
| 1 | EXEC | `JFUStrConst.CD00037_020.equals(sbopSvcKeiStat) || JFUStrConst.CD00037_030.equals(sbopSvcKeiStat) || JFUStrConst.CD00037_100.equals(sbopSvcKeiStat)` // Active status check |
| 2 | SET | `sbopSvcKeiInfoBean = tmpSbopSvcKeiInfoBean` // Store as confirmed sub-option contract bean |

**Block 6.2.2** — [ELSE IF] `(sub-option status is Accepted)` `(L903)` `[CD00037_010="010" (Accepted)]`

> If the sub-option status is "Accepted" (010), skip it — this means the contract has been accepted but not yet confirmed/completed/in-service. It is not yet active.

| # | Type | Code |
|---|------|------|
| 1 | EXEC | `JFUStrConst.CD00037_010.equals(sbopSvcKeiStat)` // Status is Accepted |
| 2 | EXEC | `continue` // Skip — not yet active |

**Block 6.2.3** — [ELSE IF] `(sub-option status is Suspended/Stopped)` `(L907)` `[CD00037_210="210" (Suspended/Intermittent), CD00037_220="220" (Stopped)]`

> If the sub-option is suspended or stopped, this is a contract status error — the customer has a contract in an invalid intermediate state.

| # | Type | Code |
|---|------|------|
| 1 | EXEC | `JFUStrConst.CD00037_210.equals(sbopSvcKeiStat) || JFUStrConst.CD00037_220.equals(sbopSvcKeiStat)` // Suspended or stopped status [CD00037_210="210" (Suspended/Intermittent), CD00037_220="220" (Stopped)] |
| 2 | EXEC | `throw new JCCBusinessException(JFUStrConst.ERROR_CODE_0102)` // Contract status error |

**Block 6.3** — [ELSE/LOOP UPDATE] `(L880)`

> If the contract number does not match or the service code is not "D01: Email E-Mail", continue to the next sub-option.

| # | Type | Code |
|---|------|------|
| 1 | SET | `n++` // Increment loop counter |
| 2 | EXEC | `n < sbopSvcKeiInfoArray.getCount()` // Check loop continuation |

**Block 7** — [FINALIZATION] `(Populate resultMap)` `(L916)`

> Assemble all extracted and matched bean data into the result map using the standardized constant keys. All bean references and scalar values (SYSID, POP_ID) are stored for downstream use by screen logic.

| # | Type | Code |
|---|------|------|
| 1 | EXEC | `resultMap.put(CommonInfoCFConst.SYSID_21, ssoInfoSysid)` // Store SYSID [SYSID_21 = "SYSID"] |
| 2 | EXEC | `resultMap.put(CommonInfoCFConst.POP_ID_21, ssoInfoPopid)` // Store POP_ID [POP_ID_21 = "POP_ID"] |
| 3 | EXEC | `resultMap.put(CommonInfoCFConst.SSO_INFO, ssoInfoBean)` // Store SSO information bean [SSO_INFO = "SSO情報" / SSO Information] |
| 4 | EXEC | `resultMap.put(CommonInfoCFConst.GEN_CUST_KEI_INFO, genCustKeiInfoBean)` // Store existing customer contract information [GEN_CUST_KEI_INFO = "現顧客契約情報"] |
| 5 | EXEC | `resultMap.put(CommonInfoCFConst.SVC_KEI_INFO, svcKeiInfoBean)` // Store service contract information [SVC_KEI_INFO = "サービス契約情報"] |
| 6 | EXEC | `resultMap.put(CommonInfoCFConst.SVC_KEI_UCWK_INFO, svcKeiUcwkInfoBean)` // Store service contract breakdown information [SVC_KEI_UCWK_INFO = "サービス契約内訳情報"] |
| 7 | EXEC | `resultMap.put(CommonInfoCFConst.SEIKY_KEI_INFO, seikyKeiInfoBean)` // Store billing contract information [SEIKY_KEI_INFO = "請求契約情報"] |
| 8 | EXEC | `resultMap.put(CommonInfoCFConst.OP_SVC_KEI_INFO, opSvcKeiInfoBean)` // Store confirmed option service contract [OP_SVC_KEI_INFO = "オプションサービス契約情報"] |
| 9 | EXEC | `resultMap.put(CommonInfoCFConst.SBOP_SVC_KEI_INFO, sbopSvcKeiInfoBean)` // Store confirmed sub-option service contract [SBOP_SVC_KEI_INFO = "サブオプションサービス契約情報"] |
| 10 | RETURN | `return resultMap` |

## 7. Glossary

| Term | Type | Business Meaning |
|------|------|------------------|
| `SYSID` | Field | System ID — unique identifier for the customer account in the SSO (Single Sign-On) context |
| `POP_ID` | Field | Point of Presence ID — identifies the regional network access point associated with the customer's service |
| SSO | Acronym | Single Sign-On — authentication context carrying the customer's system identity and pop ID |
| WEB_CHG_INFO | Field | WEB Change Information — top-level container for WEB-based form data changes |
| GEN_CUST_KEI_INFO | Field | Existing Customer Contract Information — data for existing (already-contracted) customers |
| SVC_KEI_INFO | Field | Service Contract Information — master contract record linking customer to services |
| SVC_KEI_UCWK_INFO | Field | Service Contract Breakdown Information — detailed breakdown of a service contract including option and billing sub-contracts |
| SEIKY_KEI_INFO | Field | Billing Contract Information — contract details related to invoicing and billing |
| OP_SVC_KEI_INFO | Field | Option Service Contract Information — optional add-on service contracts (e.g., email service) |
| SBOP_SVC_KEI_INFO | Field | Sub-option Service Contract Information — contracts nested under an option service, representing specific service configurations |
| `opSvcKeiStat` | Field | Option Service Contract Status — lifecycle state code for an option service contract |
| `sbopSvcKeiStat` | Field | Sub-option Service Contract Status — lifecycle state code for a sub-option service contract |
| `opSvCd` | Field | Option Service Code — code identifying the type of option service (e.g., "B001" = Email) |
| `sbopSvCd` | Field | Sub-option Service Code — code identifying the type of sub-option service (e.g., "D01" = Email E-Mail) |
| `opInfoOpSvcKeiNo` | Field | Option Service Contract Number — unique contract number for the option service |
| `opSvcKeiNo` | Field | Option Service Contract Number (sub-option context) — contract number used to match a sub-option to its parent option |
| CD00037_010 | Constant | "010" — Contract Status: Accepted (受付済) — contract accepted but not yet confirmed |
| CD00037_020 | Constant | "020" — Contract Status: Confirmed (確認済) — contract confirmed and active |
| CD00037_030 | Constant | "030" — Contract Status: Completed (完了済) — contract processing completed |
| CD00037_100 | Constant | "100" — Contract Status: In Service (サービス提供中) — service actively being provided |
| CD00037_210 | Constant | "210" — Contract Status: Suspended/Intermittent (休止・中断中) — service temporarily suspended |
| CD00037_220 | Constant | "220" — Contract Status: Stopped (停止中) — service stopped |
| CD00037_910 | Constant | "910" — Contract Status: Canceled (解約済) — contract canceled |
| CD00037_920 | Constant | "920" — Contract Status: Terminated (キャンセル済) — contract terminated |
| CD00136_B001 | Constant | "B001" — Service Type: Email (メール) — primary email option service |
| CD00137_D01 | Constant | "D01" — Service Type: Email E-Mail (メールイエアス) — sub-option email service |
| ERROR_CODE_0102 | Constant | "0102" — Contract Status Error — thrown when no valid active option service or sub-option is found |
| ERROR_CODE_0002 | Constant | "0002" — System Error — thrown when the option service contract number is missing (system configuration issue) |
| FTTH | Business term | Fiber To The Home — fiber-optic internet service; the primary service context for the FUW02301SF screen |
| X31SDataBeanAccess | Class | Data bean access wrapper — provides typed access to form data fields via `sendMessageString` with constant keys |
| X31SDataBeanAccessArray | Class | Array wrapper for data bean collections — provides iteration via `getCount()` and `getDataBean(index)` |
