---
title: JKKPrcSimulationCC.chkParam()
description: Input parameter validation for K-Opticom price simulation processing
created_at: 2026-07-26
---

# Business Logic — JKKPrcSimulationCC.chkParam() [270 LOC]

| Field | Value |
|-------|-------|
| Fully Qualified Name | `com.fujitsu.futurity.bp.custom.common.JKKPrcSimulationCC` |
| Layer | CC / Common Component (EJB Common Component layer) |
| Module | `common` (Package: `com.fujitsu.futurity.bp.custom.common`) |

## 1. Role

### JKKPrcSimulationCC.chkParam()

This method performs **input parameter validation** for the K-Opticom Price Simulation (料金シミュレーション) business process. It is the gatekeeper method that ensures all required data is present and non-empty before the price simulation engine proceeds with its calculations. The method accepts a single `HashMap<String, Object>` (`commonInfo`) that carries the full request payload for the price simulation screen (KKSV0553).

The validation follows a **layered cascade pattern**: first checking the top-level common information fields (movement separation code, application type code, application form code), then traversing the nested service information structure (a tree of service objects each containing mandatory fields), and finally validating the discount service code list. Every validation check is short-circuiting: the first failure returns `true` (error flag) immediately, preventing partial or corrupt data from reaching the downstream processing logic.

This method implements the **guard clause design pattern**, using early returns to keep the happy path clear. It is a shared validation utility called exclusively from the `execute()` entry point of `JKKPrcSimulationCC`. When `chkParam` returns `true`, the caller throws an `Exception("入力パラメータ不正")` (Input parameter error). Its role in the larger system is to ensure data integrity for the price simulation business operation, which calculates service charges and discounts for telecommunications customers based on their selected services, pricing plans, and eligibility for promotions.

## 2. Processing Pattern (Detailed Business Logic)

```mermaid
flowchart TD
    START(["chkParam params"])

    START --> INIT["errFlg=false, prefix=empty string"]
    INIT --> CHECK_COMMON_NULL{commonInfo == null?}

    CHECK_COMMON_NULL -->|Yes| LOG_COMMON_NULL["Log: NULL_ERR_MSG + common_info"]
    LOG_COMMON_NULL --> RET_ERR1["Return true"]

    CHECK_COMMON_NULL -->|No| LOG_COMMON["Log: input data (common info)"]
    LOG_COMMON --> CHECK_IDO{isNullBlank IDO_DIV?}

    CHECK_IDO -->|Yes| LOG_IDO_ERR["Log: NULL_ERR_MSG + IDO_DIV"]
    LOG_IDO_ERR --> RET_ERR2["Return true"]

    CHECK_IDO -->|No| CHECK_SBT{isNullBlank MSKM_SBT_CD?}
    CHECK_SBT -->|Yes| LOG_SBT_ERR["Log: NULL_ERR_MSG + MSKM_SBT_CD"]
    LOG_SBT_ERR --> RET_ERR3["Return true"]

    CHECK_SBT -->|No| CHECK_FORM{isNullBlank MSKM_FORM_CD?}
    CHECK_FORM -->|Yes| LOG_FORM_ERR["Log: NULL_ERR_MSG + MSKM_FORM_CD"]
    LOG_FORM_ERR --> RET_ERR4["Return true"]

    CHECK_FORM -->|No| GET_SVC_LIST["Get svc_info_list from common_info"]

    GET_SVC_LIST --> CHECK_SVC_LIST_NULL{svc_info_list == null?}
    CHECK_SVC_LIST_NULL -->|Yes| LOG_SVC_LIST_NULL["Log: NULL_ERR_MSG + SVC_INFO_LIST"]
    LOG_SVC_LIST_NULL --> RET_ERR5["Return true"]

    CHECK_SVC_LIST_NULL -->|No| SVC_LOOP["Iterator svc_info_list"]
    SVC_LOOP --> SVC_PREFIX["prefix = SVC_INFO_LIST + dash"]
    SVC_PREFIX --> SVC_NEXT["svc_info = iterator.next"]

    SVC_NEXT --> CHECK_SEKY{isNullBlank SEKY_KEI_NO?}
    CHECK_SEKY -->|Yes| LOG_SEKY["Log: NULL_ERR_MSG + prefix + SEKY_KEI_NO"]
    CHECK_SEKY -->|No| CHECK_KAISEN{isNullBlank KAISEN_KEI_NO?}
    CHECK_SEKY -->|No| CHECK_SOKUWARI{isNullBlank SOKUWARI_UM?}
    CHECK_SEKY -->|No| CHECK_FAMILY{isNullBlank FAMILY_PACK_UM?}
    CHECK_SEKY -->|No| CHECK_SVC_CD{isNullBlank SVC_CD?}
    CHECK_SEKY -->|No| CHECK_PRC_GRP{isNullBlank PRC_GRP_CD?}
    CHECK_SEKY -->|No| CHECK_PCRS{isNullBlank PCRS_CD?}
    CHECK_SEKY -->|No| CHECK_PPLAN{isNullBlank PPLAN_CD?}

    CHECK_KAISEN -->|Yes| LOG_KAISEN["Log: NULL_ERR_MSG + prefix + KAISEN_KEI_NO"]
    CHECK_KAISEN -->|No| CHECK_SOKUWARI_2{isNullBlank SOKUWARI_UM?}
    CHECK_SOKUWARI -->|Yes| LOG_SOKUWARI["Log: NULL_ERR_MSG + prefix + SOKUWARI_UM"]
    CHECK_SOKUWARI_2 -->|Yes| LOG_SOKUWARI_2["Log: NULL_ERR_MSG + prefix + SOKUWARI_UM"]
    CHECK_SOKUWARI_2 -->|No| CHECK_FAMILY_2{isNullBlank FAMILY_PACK_UM?}
    CHECK_FAMILY -->|Yes| LOG_FAMILY["Log: NULL_ERR_MSG + prefix + FAMILY_PACK_UM"]
    CHECK_FAMILY_2 -->|Yes| LOG_FAMILY_2["Log: NULL_ERR_MSG + prefix + FAMILY_PACK_UM"]
    CHECK_FAMILY_2 -->|No| CHECK_SVC_CD_2{isNullBlank SVC_CD?}
    CHECK_SVC_CD -->|Yes| LOG_SVC_CD["Log: NULL_ERR_MSG + prefix + SVC_CD"]
    CHECK_SVC_CD_2 -->|Yes| LOG_SVC_CD_2["Log: NULL_ERR_MSG + prefix + SVC_CD"]
    CHECK_SVC_CD_2 -->|No| CHECK_PRC_GRP_2{isNullBlank PRC_GRP_CD?}
    CHECK_PRC_GRP -->|Yes| LOG_PRC_GRP["Log: NULL_ERR_MSG + prefix + PRC_GRP_CD"]
    CHECK_PRC_GRP_2 -->|Yes| LOG_PRC_GRP_2["Log: NULL_ERR_MSG + prefix + PRC_GRP_CD"]
    CHECK_PRC_GRP_2 -->|No| CHECK_PCRS_2{isNullBlank PCRS_CD?}
    CHECK_PCRS -->|Yes| LOG_PCRS["Log: NULL_ERR_MSG + prefix + PCRS_CD"]
    CHECK_PCRS_2 -->|Yes| LOG_PCRS_2["Log: NULL_ERR_MSG + prefix + PCRS_CD"]
    CHECK_PCRS_2 -->|No| CHECK_PPLAN_2{isNullBlank PPLAN_CD?}
    CHECK_PPLAN -->|Yes| LOG_PPLAN["Log: NULL_ERR_MSG + prefix + PPLAN_CD"]
    CHECK_PPLAN_2 -->|Yes| LOG_PPLAN_2["Log: NULL_ERR_MSG + prefix + PPLAN_CD"]
    CHECK_PPLAN_2 -->|No| GET_OP_LIST["Get op_svc_list from svc_info"]

    GET_OP_LIST --> OP_LIST_NULL{op_svc_list == null?}
    OP_LIST_NULL -->|Yes| LOG_OP_NULL["Log: NULL_ERR_MSG + OP_SVC_LIST"]
    OP_LIST_NULL -->|No| OP_LOOP["Iterator op_svc_list"]
    OP_LOOP --> OP_PREFIX["prefix = OP_SVC_LIST + dash"]
    OP_LOOP --> OP_NEXT["op_svc_info = iterator.next"]
    OP_NEXT --> OP_CK_CD{isNullBlank OP_SVC_CD?}
    OP_CK_CD -->|Yes| LOG_OP_ERR["Log: NULL_ERR_MSG + prefix + OP_SVC_CD"]
    OP_CK_CD -->|No| OP_CK_PCRS{isNullBlank PCRS_CD?}
    OP_CK_PCRS -->|Yes| LOG_OP_PCRS["Log: NULL_ERR_MSG + prefix + PCRS_CD"]
    OP_CK_PCRS -->|No| OP_CK_PPLAN{isNullBlank PPLAN_CD?}
    OP_CK_PPLAN -->|Yes| LOG_OP_PPLAN["Log: NULL_ERR_MSG + prefix + PPLAN_CD"]
    OP_CK_PPLAN -->|No| GET_SBOP_LIST["Get sbop_svc_list from svc_info"]

    GET_SBOP_LIST --> SBOP_NULL{sbop_svc_list == null?}
    SBOP_NULL -->|Yes| LOG_SBOP_NULL["Log: NULL_ERR_MSG + SBOP_SVC_LIST"]
    SBOP_NULL -->|No| SBOP_LOOP["Iterator sbop_svc_list"]
    SBOP_LOOP --> SBOP_PREFIX["prefix = SBOP_SVC_LIST + dash"]
    SBOP_LOOP --> SBOP_NEXT["sbop_svc_info = iterator.next"]
    SBOP_NEXT --> SBOP_CK_CD{isNullBlank SBOP_SVC_CD?}
    SBOP_CK_CD -->|Yes| LOG_SBOP_ERR["Log: NULL_ERR_MSG + prefix + SBOP_SVC_CD"]
    SBOP_CK_CD -->|No| SBOP_CK_PCRS{isNullBlank PCRS_CD?}
    SBOP_CK_PCRS -->|Yes| LOG_SBOP_PCRS["Log: NULL_ERR_MSG + prefix + PCRS_CD"]
    SBOP_CK_PCRS -->|No| SBOP_CK_PPLAN{isNullBlank PPLAN_CD?}
    SBOP_CK_PPLAN -->|Yes| LOG_SBOP_PPLAN["Log: NULL_ERR_MSG + prefix + PPLAN_CD"]
    SBOP_CK_PPLAN -->|No| GET_SEIOPSVC["Get seiopsvc_list from svc_info"]

    GET_SEIOPSVC --> SEIOPSVC_NULL{seiopsvc_list == null?}
    SEIOPSVC_NULL -->|Yes| LOG_SEIOPSVC_NULL["Log: NULL_ERR_MSG + SEIOPSVC_LIST"]
    SEIOPSVC_NULL -->|No| SEIOPSVC_LOOP["Iterator seiopsvc_list"]
    SEIOPSVC_LOOP --> SEIOPSVC_PREFIX["prefix = SEIOPSVC_LIST + dash"]
    SEIOPSVC_LOOP --> SEIOPSVC_NEXT["seiopsvc_info = iterator.next"]
    SEIOPSVC_NEXT --> SEIOPSVC_CK_CD{isNullBlank SEIOPSVC_CD?}
    SEIOPSVC_CK_CD -->|Yes| LOG_SEIOPSVC_ERR["Log: NULL_ERR_MSG + prefix + SEIOPSVC_CD"]
    SEIOPSVC_CK_CD -->|No| SEIOPSVC_CK_PCRS{isNullBlank PCRS_CD?}
    SEIOPSVC_CK_PCRS -->|Yes| LOG_SEIOPSVC_PCRS["Log: NULL_ERR_MSG + prefix + PCRS_CD"]
    SEIOPSVC_CK_PCRS -->|No| SEIOPSVC_CK_PPLAN{isNullBlank PPLAN_CD?}
    SEIOPSVC_CK_PPLAN -->|Yes| LOG_SEIOPSVC_PPLAN["Log: NULL_ERR_MSG + prefix + PPLAN_CD"]
    SEIOPSVC_CK_PPLAN -->|No| GET_KKTK_LIST["Get kktk_svc_list from svc_info"]

    GET_KKTK_LIST --> KKTK_NULL{kktk_svc_list == null?}
    KKTK_NULL -->|Yes| LOG_KKTK_NULL["Log: NULL_ERR_MSG + KKTK_SVC_LIST"]
    KKTK_NULL -->|No| KKTK_LOOP["Iterator kktk_svc_list"]
    KKTK_LOOP --> KKTK_PREFIX["prefix = KKTK_SVC_LIST + dash"]
    KKTK_LOOP --> KKTK_NEXT["kktk_svc_info = iterator.next"]
    KKTK_NEXT --> KKTK_CK_CD{isNullBlank KKTK_SVC_CD?}
    KKTK_CK_CD -->|Yes| LOG_KKTK_ERR["Log: NULL_ERR_MSG + prefix + KKTK_SVC_CD"]
    KKTK_CK_CD -->|No| KKTK_CK_PCRS{isNullBlank PCRS_CD?}
    KKTK_CK_PCRS -->|Yes| LOG_KKTK_PCRS["Log: NULL_ERR_MSG + prefix + PCRS_CD"]
    KKTK_CK_PCRS -->|No| KKTK_CK_PPLAN{isNullBlank PPLAN_CD?}
    KKTK_CK_PPLAN -->|Yes| LOG_KKTK_PPLAN["Log: NULL_ERR_MSG + prefix + PPLAN_CD"]
    KKTK_CK_PPLAN -->|No| KKTK_CK_SBT{isNullBlank KKTK_SBT_CD?}
    KKTK_CK_SBT -->|Yes| LOG_KKTK_SBT["Log: NULL_ERR_MSG + prefix + KKTK_SBT_CD"]
    KKTK_CK_SBT -->|No| SVC_LOOP_END["next svc_info iteration"]

    SVC_LOOP_END --> SVC_NEXT

    GET_WRIB_LIST["Get wrib_svc_cd_list from common_info"]
    GET_WRIB_LIST --> WRIB_NULL{wrib_svc_cd_list == null?}
    WRIB_NULL -->|Yes| LOG_WRIB_NULL["Log: NULL_ERR_MSG + WRIB_SVC_CD_LIST"]
    WRIB_NULL -->|No| WRIB_LOOP["Iterator wrib_svc_cd_list"]
    WRIB_LOOP --> WRIB_PREFIX["prefix = WRIB_SVC_CD_LIST + dash"]
    WRIB_LOOP --> WRIB_NEXT["wri_svc_cd_info = iterator.next"]
    WRIB_NEXT --> WRIB_CK{isNullBlank WRIB_SVC_CD?}
    WRIB_CK -->|Yes| LOG_WRIB_ERR["Log: NULL_ERR_MSG + prefix + WRIB_SVC_CD"]
    WRIB_CK -->|No| WRIB_LOOP_END["next iteration"]

    WRIB_LOOP_END --> WRIB_NEXT

    SVC_LOOP_END --> GET_WRIB_LIST
    WRIB_LOOP_END --> LOG_PASS["Log: input parameter check PASS<br/>return errFlg false"]
    LOG_PASS --> END_NODE(["Return / Next"])

    RET_ERR1 --> END_NODE
    RET_ERR2 --> END_NODE
    RET_ERR3 --> END_NODE
    RET_ERR4 --> END_NODE
    RET_ERR5 --> END_NODE
    LOG_SEKY --> END_NODE
    LOG_KAISEN --> END_NODE
    LOG_SOKUWARI --> END_NODE
    LOG_SOKUWARI_2 --> END_NODE
    LOG_FAMILY --> END_NODE
    LOG_FAMILY_2 --> END_NODE
    LOG_SVC_CD --> END_NODE
    LOG_SVC_CD_2 --> END_NODE
    LOG_PRC_GRP --> END_NODE
    LOG_PRC_GRP_2 --> END_NODE
    LOG_PCRS --> END_NODE
    LOG_PCRS_2 --> END_NODE
    LOG_PPLAN --> END_NODE
    LOG_PPLAN_2 --> END_NODE
    LOG_OP_NULL --> END_NODE
    LOG_OP_ERR --> END_NODE
    LOG_OP_PCRS --> END_NODE
    LOG_OP_PPLAN --> END_NODE
    LOG_SBOP_NULL --> END_NODE
    LOG_SBOP_ERR --> END_NODE
    LOG_SBOP_PCRS --> END_NODE
    LOG_SBOP_PPLAN --> END_NODE
    LOG_SEIOPSVC_NULL --> END_NODE
    LOG_SEIOPSVC_ERR --> END_NODE
    LOG_SEIOPSVC_PCRS --> END_NODE
    LOG_SEIOPSVC_PPLAN --> END_NODE
    LOG_KKTK_NULL --> END_NODE
    LOG_KKTK_ERR --> END_NODE
    LOG_KKTK_PCRS --> END_NODE
    LOG_KKTK_PPLAN --> END_NODE
    LOG_KKTK_SBT --> END_NODE
    LOG_WRIB_NULL --> END_NODE
    LOG_WRIB_ERR --> END_NODE
```

**Key processing steps:**

1. **Null check on commonInfo** - Validates the top-level request map is not null.
2. **Top-level field validation** - Validates three required fields on the work object: movement separation code (`ido_div`), application type code (`mskm_sbt_cd`), and application form code (`mskm_form_cd`).
3. **Service info list iteration** - Iterates over the `svc_info_list` (service information list), validating eight fields per service entry: billing contract number (`seky_kei_no`), service contract line item number (`kaisen_kei_no`), immediate discount availability (`sokuwari_um`), family pack availability (`family_pack_um`), service code (`svc_cd`), price group code (`prc_grp_cd`), price course code (`pcrs_cd`), and price plan code (`pplan_cd`).
4. **Optional service sub-list validation** - For each service entry, iterates through three sub-lists:
   - **Option service list** (`op_svc_list`): validates option service code, price course code, price plan code.
   - **Sub-option service list** (`sbop_svc_list`): validates sub-option service code, price course code, price plan code.
   - **Billing option service list** (`seiopsvc_list`): validates billing option service code, price course code, price plan code.
5. **Device provision service sub-list** - Iterates through `kktk_svc_list` (device provision service list), validating device service code, price course, price plan, and device provision type code.
6. **Discount service code list** - Iterates through the top-level `wrib_svc_cd_list`, validating each discount service code.
7. **Pass** - All validations succeed; returns `false` (no error).

## 3. Parameter Analysis

| No | Parameter Name | Type | Business Description |
|----|---------------|------|---------------------|
| 1 | `commonInfo` | `HashMap<String, Object>` | The complete request payload for the price simulation screen (KKSV0553). It contains the movement separation code, application type/form codes, a nested list of service information objects (each containing contract numbers, pricing codes, and sub-lists of option services), and a discount service code list. |

**Instance fields / external state read by this method:**

None. This method reads no instance fields or external state. All data is passed through the `commonInfo` parameter. It calls helper methods `isNullBlank()` and `printlnEjbLog()` inherited from `AbstractCommonComponent` but does not access any instance variables.

## 4. CRUD Operations / Called Services

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

This method performs **no database or entity operations**. It is a pure validation routine that reads from the in-memory `commonInfo` HashMap and calls helper methods.

| CRUD | SC / CBS | SC Code | Entity / DB | Operation Description |
|------|----------|---------|-------------|----------------------|
| - | `JKKPrcSimulationCC.isNullBlank` | JKKPrcSimulationCC | - | Internal helper: checks if a value is null or blank (empty string or whitespace-only) |
| - | `JKKPrcSimulationCC.printlnEjbLog` | JKKPrcSimulationCC | - | Internal helper: writes log messages for the EJB log (入力データ, 入力パラメータチェック結果) |

**CRUD classification:** None. This method is a pure input validation utility. No data is created, read from, updated in, or deleted from any database table or entity. All checks operate on the in-memory request HashMap.

## 5. Dependency Trace

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

Direct callers: `JKKPrcSimulationCC.execute()`

### Caller information:

| # | Caller (Screen/Batch) | Call Chain (Full Path to this Method) | Terminal (SC / CRUD / Entity) |
|---|----------------------|--------------------------------------|-------------------------------|
| 1 | Screen:KKSV0553 | `JKKPrcSimulationCC.execute` -> `chkParam` | `isNullBlank [-], printlnEjbLog [-]` |

**Details:** The `execute()` method is the public entry point of `JKKPrcSimulationCC`. It is called from the KKSV0553 price simulation screen. Within `execute()`, after extracting `commonInfo` from the input map, it invokes `chkParam(commonInfo)`. If `chkParam` returns `true` (validation failure), `execute()` throws an `Exception("入力パラメータ不正")` (Input parameter error). The terminal operations from `chkParam` are `isNullBlank` (value check utility) and `printlnEjbLog` (logging utility) - neither performs database operations.

## 6. Per-Branch Detail Blocks

**Block 1** — [IF] `commonInfo == null` (L193)

> Null check on the top-level common info map. If the entire request payload is null, log the error and return immediately.

| # | Type | Code |
|---|------|------|
| 1 | SET | `errFlg = false` // Initialize error flag |
| 2 | SET | `prefix = ""` // Initialize prefix for nested error messages |
| 3 | IF | `commonInfo == null` (L193) |
| 4 | EXEC | `printlnEjbLog(NULL_ERR_MSG + "common_info")` // 入力データが未設定（必須項目目）:common_info |
| 5 | RETURN | `return true` // Error: common info not set |

**Block 2** — [EXEC] Log input data (L199)

> Log the incoming common info HashMap for debugging/tracing purposes.

| # | Type | Code |
|---|------|------|
| 1 | EXEC | `printlnEjbLog("入力データ（共通情報）[" + commonInfo + "]")` // Log: input data (common info) |

**Block 3** — [IF-IF-IF cascade] Top-level field validation (L202–L220)

> Validates the three required top-level fields on the work object: movement separation code, application type code, and application form code. Each check is independent with its own early return.

**Block 3.1** — [IF] `isNullBlank(IDO_DIV)` (L202)

> Movement separation code (異動区分) — required. Determines the direction of the service operation (e.g., new registration, change, cancellation).

| # | Type | Code |
|---|------|------|
| 1 | IF | `isNullBlank(commonInfo.get(KKSV0553_KKSV0553OP_WORK.IDO_DIV))` // IDO_DIV = "ido_div" |
| 2 | EXEC | `printlnEjbLog(NULL_ERR_MSG + KKSV0553_KKSV0553OP_WORK.IDO_DIV)` |
| 3 | RETURN | `return true` |

**Block 3.2** — [IF] `isNullBlank(MSKM_SBT_CD)` (L207)

> Application type code (申請種別コード) — required. Classifies the type of application (e.g., new service, modification, renewal).

| # | Type | Code |
|---|------|------|
| 1 | IF | `isNullBlank(commonInfo.get(KKSV0553_KKSV0553OP_WORK.MSKM_SBT_CD))` // MSKM_SBT_CD = "mskm_sbt_cd" |
| 2 | EXEC | `printlnEjbLog(NULL_ERR_MSG + KKSV0553_KKSV0553OP_WORK.MSKM_SBT_CD)` |
| 3 | RETURN | `return true` |

**Block 3.3** — [IF] `isNullBlank(MSKM_FORM_CD)` (L202)

> Application form code (申請形態コード) — required. Specifies the application submission format (e.g., online, paper, phone).

| # | Type | Code |
|---|------|------|
| 1 | IF | `isNullBlank(commonInfo.get(KKSV0553_KKSV0553OP_WORK.MSKM_FORM_CD))` // MSKM_FORM_CD = "mskm_form_cd" |
| 2 | EXEC | `printlnEjbLog(NULL_ERR_MSG + KKSV0553_KKSV0553OP_WORK.MSKM_FORM_CD)` |
| 3 | RETURN | `return true` |

**Block 4** — [IF] Service info list null check (L222–L230)

> Validates that the service information list is present and not null.

| # | Type | Code |
|---|------|------|
| 1 | SET | `svc_info_list = (ArrayList<HashMap<String,Object>>)commonInfo.get(KKSV0553_KKSV0553OP_WORK.SVC_INFO_LIST)` // SVC_INFO_LIST = "svc_info_list" |
| 2 | IF | `svc_info_list == null` |
| 3 | EXEC | `printlnEjbLog(NULL_ERR_MSG + KKSV0553_KKSV0553OP_WORK.SVC_INFO_LIST)` |
| 4 | RETURN | `return true` |

**Block 5** — [WHILE] Service info list iteration (L231–L427)

> Iterates over each service information entry, validating all required fields and sub-lists.

**Block 5.1** — [SET/IF] First service entry validation (L234–L312)

> For each service entry in the list, validates eight top-level fields. If any field is blank, logs the error with a prefix indicating the list and returns immediately.

| # | Type | Code |
|---|------|------|
| 1 | SET | `prefix = KKSV0553_KKSV0553OP_WORK.SVC_INFO_LIST + "-"` // prefix = "svc_info_list-" |
| 2 | SET | `svc_info = ite.next()` |
| 3 | IF | `isNullBlank(svc_info.get(SEKY_KEI_NO))` // SEKY_KEI_NO = "seky_kei_no" (請求契約番号) |
| 4 | EXEC | `printlnEjbLog(NULL_ERR_MSG + prefix + SEKY_KEI_NO)` |
| 5 | RETURN | `return true` |
| 6 | IF | `isNullBlank(svc_info.get(KAISEN_KEI_NO))` // KAISEN_KEI_NO = "kaisen_kei_no" (サービス契約回線内訳番号) |
| 7 | EXEC | `printlnEjbLog(NULL_ERR_MSG + prefix + KAISEN_KEI_NO)` |
| 8 | RETURN | `return true` |
| 9 | IF | `isNullBlank(svc_info.get(SOKUWARI_UM))` // SOKUWARI_UM = "sokuwari_um" (即割有无) |
| 10 | EXEC | `printlnEjbLog(NULL_ERR_MSG + prefix + SOKUWARI_UM)` |
| 11 | RETURN | `return true` |
| 12 | IF | `isNullBlank(svc_info.get(FAMILY_PACK_UM))` // FAMILY_PACK_UM = "family_pack_um" (ファミリーパック有无) |
| 13 | EXEC | `printlnEjbLog(NULL_ERR_MSG + prefix + FAMILY_PACK_UM)` |
| 14 | RETURN | `return true` |
| 15 | IF | `isNullBlank(svc_info.get(SVC_CD))` // SVC_CD = "svc_cd" (サービスコード) |
| 16 | EXEC | `printlnEjbLog(NULL_ERR_MSG + prefix + SVC_CD)` |
| 17 | RETURN | `return true` |
| 18 | IF | `isNullBlank(svc_info.get(PRC_GRP_CD))` // PRC_GRP_CD = "prc_grp_cd" (料金グループコード) |
| 19 | EXEC | `printlnEjbLog(NULL_ERR_MSG + prefix + PRC_GRP_CD)` |
| 20 | RETURN | `return true` |
| 21 | IF | `isNullBlank(svc_info.get(PCRS_CD))` // PCRS_CD = "pcrs_cd" (料金コースコード) |
| 22 | EXEC | `printlnEjbLog(NULL_ERR_MSG + prefix + PCRS_CD)` |
| 23 | RETURN | `return true` |
| 24 | IF | `isNullBlank(svc_info.get(PPLAN_CD))` // PPLAN_CD = "pplan_cd" (料金プランコード) |
| 25 | EXEC | `printlnEjbLog(NULL_ERR_MSG + prefix + PPLAN_CD)` |
| 26 | RETURN | `return true` |

**Block 5.2** — [IF] Option service list validation (L313–L348)

> Retrieves the optional service list (`op_svc_list`) from the current service entry. If null, returns error. Otherwise iterates through each optional service, validating service code, price course code, and price plan code.

| # | Type | Code |
|---|------|------|
| 1 | SET | `op_svc_list = (ArrayList<HashMap<String, Object>>)svc_info.get(OP_SVC_LIST)` // OP_SVC_LIST = "op_svc_list" |
| 2 | IF | `op_svc_list == null` (L316) |
| 3 | EXEC | `printlnEjbLog(NULL_ERR_MSG + KKSV0553_KKSV0553OP_WORK_SVC_INFO.OP_SVC_LIST)` |
| 4 | RETURN | `return true` |
| 5 | ELSE | op_svc_list is not null |

**Block 5.2.1** — [WHILE] Option service entry iteration (L321–L347)

| # | Type | Code |
|---|------|------|
| 1 | SET | `prefix = KKSV0553_KKSV0553OP_WORK_SVC_INFO.OP_SVC_LIST + "-"` // "op_svc_list-" |
| 2 | SET | `op_svc_info = ite1.next()` |
| 3 | IF | `isNullBlank(op_svc_info.get(OP_SVC_CD))` // OP_SVC_CD = "op_svc_cd" (オプションサービスコード) |
| 4 | EXEC | `printlnEjbLog(NULL_ERR_MSG + prefix + OP_SVC_CD)` |
| 5 | RETURN | `return true` |
| 6 | IF | `isNullBlank(op_svc_info.get(PCRS_CD))` // PCRS_CD = "pcrs_cd" (料金コースコード) |
| 7 | EXEC | `printlnEjbLog(NULL_ERR_MSG + prefix + PCRS_CD)` |
| 8 | RETURN | `return true` |
| 9 | IF | `isNullBlank(op_svc_info.get(PPLAN_CD))` // PPLAN_CD = "pplan_cd" (料金プランコード) |
| 10 | EXEC | `printlnEjbLog(NULL_ERR_MSG + prefix + PPLAN_CD)` |
| 11 | RETURN | `return true` |

**Block 5.3** — [IF] Sub-option service list validation (L349–L384)

> Retrieves the sub-option service list (`sbop_svc_list`). If null, returns error. Otherwise iterates through each entry, validating sub-option service code, price course code, and price plan code.

| # | Type | Code |
|---|------|------|
| 1 | SET | `sbop_svc_list = (ArrayList<HashMap<String, Object>>)svc_info.get(SBOP_SVC_LIST)` // SBOP_SVC_LIST = "sbop_svc_list" |
| 2 | IF | `sbop_svc_list == null` (L352) |
| 3 | EXEC | `printlnEjbLog(NULL_ERR_MSG + KKSV0553_KKSV0553OP_WORK_SVC_INFO.SBOP_SVC_LIST)` |
| 4 | RETURN | `return true` |
| 5 | ELSE | |

**Block 5.3.1** — [WHILE] Sub-option service entry iteration (L357–L383)

| # | Type | Code |
|---|------|------|
| 1 | SET | `prefix = KKSV0553_KKSV0553OP_WORK_SVC_INFO.SBOP_SVC_LIST + "-"` // "sbop_svc_list-" |
| 2 | SET | `sbop_svc_info = ite1.next()` |
| 3 | IF | `isNullBlank(sbop_svc_info.get(SBOP_SVC_CD))` // SBOP_SVC_CD = "sbop_svc_cd" (サブオプションサービスコード) |
| 4 | EXEC | `printlnEjbLog(NULL_ERR_MSG + prefix + SBOP_SVC_CD)` |
| 5 | RETURN | `return true` |
| 6 | IF | `isNullBlank(sbop_svc_info.get(PCRS_CD))` // PCRS_CD = "pcrs_cd" |
| 7 | EXEC | `printlnEjbLog(NULL_ERR_MSG + prefix + PCRS_CD)` |
| 8 | RETURN | `return true` |
| 9 | IF | `isNullBlank(sbop_svc_info.get(PPLAN_CD))` // PPLAN_CD = "pplan_cd" |
| 10 | EXEC | `printlnEjbLog(NULL_ERR_MSG + prefix + PPLAN_CD)` |
| 11 | RETURN | `return true` |

**Block 5.4** — [IF] Billing option service list validation (L385–L420)

> Retrieves the billing option service list (`seiopsvc_list`). If null, returns error. Otherwise iterates through each entry, validating billing option service code, price course code, and price plan code.

| # | Type | Code |
|---|------|------|
| 1 | SET | `seiopsvc_list = (ArrayList<HashMap<String, Object>>)svc_info.get(SEIOPSVC_LIST)` // SEIOPSVC_LIST = "seiopsvc_list" |
| 2 | IF | `seiopsvc_list == null` (L388) |
| 3 | EXEC | `printlnEjbLog(NULL_ERR_MSG + KKSV0553_KKSV0553OP_WORK_SVC_INFO.SEIOPSVC_LIST)` |
| 4 | RETURN | `return true` |
| 5 | ELSE | |

**Block 5.4.1** — [WHILE] Billing option service entry iteration (L393–L419)

| # | Type | Code |
|---|------|------|
| 1 | SET | `prefix = KKSV0553_KKSV0553OP_WORK_SVC_INFO.SEIOPSVC_LIST + "-"` // "seiopsvc_list-" |
| 2 | SET | `seiopsvc_info = ite1.next()` |
| 3 | IF | `isNullBlank(seiopsvc_info.get(SEIOPSVC_CD))` // SEIOPSVC_CD = "seiopsvc_cd" (請求オプションサービスコード) |
| 4 | EXEC | `printlnEjbLog(NULL_ERR_MSG + prefix + SEIOPSVC_CD)` |
| 5 | RETURN | `return true` |
| 6 | IF | `isNullBlank(seiopsvc_info.get(PCRS_CD))` // PCRS_CD = "pcrs_cd" |
| 7 | EXEC | `printlnEjbLog(NULL_ERR_MSG + prefix + PCRS_CD)` |
| 8 | RETURN | `return true` |
| 9 | IF | `isNullBlank(seiopsvc_info.get(PPLAN_CD))` // PPLAN_CD = "pplan_cd" |
| 10 | EXEC | `printlnEjbLog(NULL_ERR_MSG + prefix + PPLAN_CD)` |
| 11 | RETURN | `return true` |

**Block 5.5** — [IF] Device provision service list validation (L421–L470)

> Retrieves the device provision service list (`kktk_svc_list`). If null, returns error. Otherwise iterates through each entry, validating device service code, price course code, price plan code, and device provision type code.

| # | Type | Code |
|---|------|------|
| 1 | SET | `kktk_svc_list = (ArrayList<HashMap<String, Object>>)svc_info.get(KKTK_SVC_LIST)` // KKTK_SVC_LIST = "kktk_svc_list" |
| 2 | IF | `kktk_svc_list == null` (L424) |
| 3 | EXEC | `printlnEjbLog(NULL_ERR_MSG + KKSV0553_KKSV0553OP_WORK_SVC_INFO.KKTK_SVC_LIST)` |
| 4 | RETURN | `return true` |
| 5 | ELSE | |

**Block 5.5.1** — [WHILE] Device provision service entry iteration (L429–L469)

| # | Type | Code |
|---|------|------|
| 1 | SET | `prefix = KKSV0553_KKSV0553OP_WORK_SVC_INFO.KKTK_SVC_LIST + "-"` // "kktk_svc_list-" |
| 2 | SET | `kktk_svc_info = ite1.next()` |
| 3 | IF | `isNullBlank(kktk_svc_info.get(KKTK_SVC_CD))` // KKTK_SVC_CD = "kktk_svc_cd" (機器提供サービスコード) |
| 4 | EXEC | `printlnEjbLog(NULL_ERR_MSG + prefix + KKTK_SVC_CD)` |
| 5 | RETURN | `return true` |
| 6 | IF | `isNullBlank(kktk_svc_info.get(PCRS_CD))` // PCRS_CD = "pcrs_cd" |
| 7 | EXEC | `printlnEjbLog(NULL_ERR_MSG + prefix + PCRS_CD)` |
| 8 | RETURN | `return true` |
| 9 | IF | `isNullBlank(kktk_svc_info.get(PPLAN_CD))` // PPLAN_CD = "pplan_cd" |
| 10 | EXEC | `printlnEjbLog(NULL_ERR_MSG + prefix + PPLAN_CD)` |
| 11 | RETURN | `return true` |
| 12 | IF | `isNullBlank(kktk_svc_info.get(KKTK_SBT_CD))` // KKTK_SBT_CD = "kktk_sbt_cd" (機器提供種別コード) |
| 13 | EXEC | `printlnEjbLog(NULL_ERR_MSG + prefix + KKTK_SBT_CD)` |
| 14 | RETURN | `return true` |

**Block 6** — [IF] Discount service code list validation (L431–L452)

> Validates the top-level discount service code list (`wrib_svc_cd_list`). Each discount service entry must have at least a service code.

| # | Type | Code |
|---|------|------|
| 1 | SET | `wrib_svc_cd_list = (ArrayList<HashMap<String, Object>>)commonInfo.get(WRIB_SVC_CD_LIST)` // WRIB_SVC_CD_LIST = "wrib_svc_cd_list" |
| 2 | IF | `wrib_svc_cd_list == null` (L435) |
| 3 | EXEC | `printlnEjbLog(NULL_ERR_MSG + KKSV0553_KKSV0553OP_WORK.WRIB_SVC_CD_LIST)` |
| 4 | RETURN | `return true` |
| 5 | ELSE | |

**Block 6.1** — [WHILE] Discount service code entry iteration (L438–L449)

| # | Type | Code |
|---|------|------|
| 1 | SET | `prefix = KKSV0553_KKSV0553OP_WORK.WRIB_SVC_CD_LIST + "-"` // "wrib_svc_cd_list-" |
| 2 | SET | `wri_svc_cd_info = ite1.next()` |
| 3 | IF | `isNullBlank(wri_svc_cd_info.get(WRIB_SVC_CD))` // WRIB_SVC_CD = "wrib_svc_cd" (割引サービスコード) |
| 4 | EXEC | `printlnEjbLog(NULL_ERR_MSG + prefix + WRIB_SVC_CD)` |
| 5 | RETURN | `return true` |

**Block 7** — [EXEC/RETURN] Pass (L452)

> All validations have passed. Log the success indicator and return the error flag (false).

| # | Type | Code |
|---|------|------|
| 1 | EXEC | `printlnEjbLog("入力パラメータチェック結果：PASS")` // Log: input parameter check PASS |
| 2 | RETURN | `return errFlg` // false — no errors detected |

## 7. Glossary

| Term | Type | Business Meaning |
|------|------|------------------|
| `chkParam` | Method | Input parameter validation — checks all required fields before price simulation processing proceeds |
| `commonInfo` | Field | Common information map — the top-level HashMap carrying the entire price simulation request payload |
| `IDO_DIV` | Field | Movement separation (異動区分) — indicates the type of service operation (new registration, modification, cancellation) |
| `MSKM_SBT_CD` | Field | Application type code (申請種別コード) — classifies the kind of application being submitted |
| `MSKM_FORM_CD` | Field | Application form code (申請形態コード) — specifies the application submission channel/format |
| `SVC_INFO_LIST` | Field | Service information list (サービス情報リスト) — nested ArrayList of service entries for price simulation |
| `SEKY_KEI_NO` | Field | Billing contract number (請求契約番号) — internal contract line item identifier for billing |
| `KAISEN_KEI_NO` | Field | Service contract line item number (サービス契約回線内訳番号) — detailed line item number within a service contract |
| `SOKUWARI_UM` | Field | Immediate discount availability (即割有无) — flag indicating whether instant discount applies ("1" = yes) |
| `FAMILY_PACK_UM` | Field | Family pack availability (ファミリーパック有无) — flag indicating if a family pack bundle is available ("1" = yes) |
| `SVC_CD` | Field | Service code (サービスコード) — identifies the type of telecom service (e.g., FTTH, Mail, ENUM) |
| `PRC_GRP_CD` | Field | Price group code (料金グループコード) — groups services by pricing category |
| `PCRS_CD` | Field | Price course code (料金コースコード) — identifies the specific pricing plan/course for a service |
| `PPLAN_CD` | Field | Price plan code (料金プランコード) — identifies the detailed pricing plan for a service |
| `OP_SVC_LIST` | Field | Option service list (オプションサービスリスト) — sub-list of optional add-on services per service entry |
| `OP_SVC_CD` | Field | Option service code (オプションサービスコード) — identifies an optional add-on service |
| `SBOP_SVC_LIST` | Field | Sub-option service list (サブオプションサービスリスト) — sub-list of secondary optional services |
| `SBOP_SVC_CD` | Field | Sub-option service code (サブオプションサービスコード) — identifies a sub-option add-on service |
| `SEIOPSVC_LIST` | Field | Billing option service list (請求オプションサービスリスト) — sub-list of billing-related option services |
| `SEIOPSVC_CD` | Field | Billing option service code (請求オプションサービスコード) — identifies a billing option service |
| `KKTK_SVC_LIST` | Field | Device provision service list (機器提供サービスリスト) — sub-list of hardware/device provision services |
| `KKTK_SVC_CD` | Field | Device service code (機器提供サービスコード) — identifies a device/hardware provision service |
| `KKTK_SBT_CD` | Field | Device provision type code (機器提供種別コード) — classifies the type of device provision |
| `WRIB_SVC_CD_LIST` | Field | Discount service code list (割引サービスコードリスト) — top-level list of applicable discount services |
| `WRIB_SVC_CD` | Field | Discount service code (割引サービスコード) — identifies a specific discount/promotion service |
| `isNullBlank` | Method | Validation helper — returns true if the given value is null, empty string, or whitespace-only |
| `printlnEjbLog` | Method | Logging helper — writes a message to the EJB log for audit/debug purposes |
| `errFlg` | Variable | Error flag — returns true when validation fails, false when all checks pass |
| `NULL_ERR_MSG` | Constant | Error message prefix — "入力データが未設定（必須項目目）：" (Input data not set (required field):) |
| `KKSV0553` | Screen | Price simulation screen — the KKSV0553 web/screen for calculating service charges and discounts |
| Price Simulation (料金シミュレーション) | Business process | K-Opticom's core pricing engine that calculates customer charges based on selected services, pricing plans, and applicable discounts |
| FTTH | Business term | Fiber To The Home — fiber-optic broadband internet service |
| SOD | Acronym | Service Order Data — telecom order fulfillment entity in the K-Opticom system |
| JKK | Abbreviation | Fujitsu K-Opticom (富士通ケー・オプチコム) — internal project/code prefix |
| CC | Technical term | Common Component — shared reusable component in the EJB architecture |
| EJB | Technical term | Enterprise JavaBean — server-side component architecture for the K-Opticom backend |