# Business Logic — JKKPrcSimulationCC.chkVariSvcCd() [321 LOC]

| Field | Value |
|-------|-------|
| Fully Qualified Name | `com.fujitsu.futurity.bp.custom.common.JKKPrcSimulationCC` |
| Layer | CC / Common Component (Controller/Common — shared business logic class within the pricing simulation subsystem) |
| Module | `common` (Package: `com.fujitsu.futurity.bp.custom.common`) |

## 1. Role

### JKKPrcSimulationCC.chkVariSvcCd()

The `chkVariSvcCd` method is a **discount service code matching engine** that determines whether a candidate service (discount target) matches a pre-configured set of discount registration criteria. It operates within the **Fujitsu Futurity pricing simulation framework** (abbreviated "JKK"), which handles telecommunications service billing and discount qualification logic. The method implements a **routing/dispatch pattern** followed by **progressive granularity matching**: it first determines the service category (via `decideWribSvcTgt`), then iterates through that category's sub-lists and progressively relaxes the matching criteria based on which fields are present in the discount target map.

The method handles **six distinct service types/categories**, each representing a different level of telecom service granularity:
- **SVC** (Service): Top-level service codes, matched against service, price group, price code, and price plan.
- **SVC_UCWK** (Service Details / サービス内訳): Sub-service detail lines matched only by price code and price plan.
- **OP_SVC** (Option Service / オプションサービス): Optional add-on services (e.g., insurance, extra features) matched by option service code, price code, and price plan.
- **SBOP_SVC** (Sub-Option Service / サブオプションサービス): Nested optional services with the same matching hierarchy as OP_SVC.
- **KKTK_SVC** (Equipment Provisioning Service / 機器提供サービス): Hardware/equipment-related services with the most granular matching across four dimensions (equipment service code, equipment sub-type code, price code, price plan).
- **SEI_OP_SVC** (Billing Option Service / 請求オプションサービス): Billing-level optional services matched by service code, price code, and price plan.

Within each category, the method implements a **progressive fallback matching strategy**: it first attempts to match all available fields, then progressively falls back to matching fewer fields if some are null/empty. This allows discount criteria defined at different granularities to all find their matching services. The method appends all matching `svcInfoMap` entries to the `wribMatchList` accumulator, which is later used by the caller to validate that the correct number of discount-eligible services were found.

This method is a **shared utility** called during the discount registration check flow, invoked as part of the broader price simulation process. It does not perform any database CRUD operations — it is a pure in-memory matching/comparison routine.

## 2. Processing Pattern (Detailed Business Logic)

```mermaid
flowchart TD
    START(["chkVariSvcCd(wribTgSvcMap, svcInfoMap, wribMatchList)"])
    
    EXTRACT["Extract 9 fields from wribTgSvcMap (m_svc_cd, m_prc_grp_cd, m_pcrs_cd, m_pplan_cd, m_op_svc_cd, m_sbop_svc_cd, m_kktk_svc_cd, m_seiopsvc_cd, m_kktk_sbt_cd)"]
    
    DECIDE["Call decideWribSvcTgt(wribTgSvcMap)"]
    
    SWITCH["Switch on WRIB enum type"]
    
    BRANCH_SVC["Case: SVC (Service)"]
    EXTRACT_SVC["Extract svc_cd, prc_grp_cd, pcrs_cd, pplan_cd from svcInfoMap"]
    
    COND_SVC_ALL["All 4 fields set? (svc_cd, prc_grp_cd, pcrs_cd, pplan_cd)"]
    MATCH_SVC_ALL["All 4 fields equal? Add to wribMatchList"]
    
    COND_SVC_3["3 fields set? (svc_cd, prc_grp_cd, pcrs_cd; pplan_cd null)"]
    MATCH_SVC_3["3 fields equal? Add to wribMatchList"]
    
    COND_SVC_2["2 fields set? (svc_cd, prc_grp_cd; pcrs_cd, pplan_cd null)"]
    MATCH_SVC_2["2 fields equal? Add to wribMatchList"]
    
    COND_SVC_1["1 field set? (svc_cd only)"]
    MATCH_SVC_1["1 field equal? Add to wribMatchList"]
    
    BRANCH_SVC_UCWK["Case: SVC_UCWK (Service Details)"]
    EXTRACT_SVC_UCWK["Extract pcrs_cd, pplan_cd from svcInfoMap"]
    
    COND_UCWK_ALL["2 fields set? (pcrs_cd, pplan_cd)"]
    MATCH_UCWK_ALL["2 fields equal? Add to wribMatchList"]
    
    COND_UCWK_1["1 field set? (pcrs_cd only)"]
    MATCH_UCWK_1["1 field equal? Add to wribMatchList"]
    
    BRANCH_OP_SVC["Case: OP_SVC (Option Service)"]
    EXTRACT_OP_LIST["Get op_svc_list from svcInfoMap"]
    
    LOOP_OP["Iterate op_svc_list"]
    EXTRACT_OP["Extract op_svc_cd, pcrs_cd, pplan_cd from opSvcMap"]
    
    COND_OP_ALL["3 fields set? (op_svc_cd, pcrs_cd, pplan_cd)"]
    MATCH_OP_ALL["3 fields equal? Add + break"]
    
    COND_OP_2["2 fields set? (op_svc_cd, pcrs_cd)"]
    MATCH_OP_2["2 fields equal? Add + break"]
    
    COND_OP_1["1 field set? (op_svc_cd only)"]
    MATCH_OP_1["1 field equal? Add + break"]
    
    BRANCH_SBOP["Case: SBOP_SVC (Sub-Option Service)"]
    EXTRACT_SBOP_LIST["Get sbop_svc_list from svcInfoMap"]
    
    LOOP_SBOP["Iterate sbop_svc_list"]
    EXTRACT_SBOP["Extract sbop_svc_cd, pcrs_cd, pplan_cd from sbOpSvcMap"]
    
    COND_SBOP_ALL["3 fields set? (sbop_svc_cd, pcrs_cd, pplan_cd)"]
    MATCH_SBOP_ALL["3 fields equal? Add + break"]
    
    COND_SBOP_2["2 fields set? (sbop_svc_cd, pcrs_cd)"]
    MATCH_SBOP_2["2 fields equal? Add + break"]
    
    COND_SBOP_1["1 field set? (sbop_svc_cd only)"]
    MATCH_SBOP_1["1 field equal? Add + break"]
    
    BRANCH_KKTK["Case: KKTK_SVC (Equipment Provisioning Service)"]
    EXTRACT_KKTK_LIST["Get kktk_svc_list from svcInfoMap"]
    
    LOOP_KKTK["Iterate kktk_svc_list"]
    EXTRACT_KKTK["Extract kktk_svc_cd, kktk_sbt_cd, pcrs_cd, pplan_cd from kktkSvcMap"]
    
    COND_KKTK_4["4 fields set?"]
    MATCH_KKTK_4["4 fields equal? Add + break"]
    
    COND_KKTK_3A["3 fields (kktk_svc_cd, kktk_sbt_cd, pcrs_cd)"]
    MATCH_KKTK_3A["3 fields equal? Add + break"]
    
    COND_KKTK_3B["3 fields (kktk_svc_cd, pcrs_cd, pplan_cd)"]
    MATCH_KKTK_3B["3 fields equal? Add + break"]
    
    COND_KKTK_2A["2 fields (kktk_svc_cd, pcrs_cd)"]
    MATCH_KKTK_2A["2 fields equal? Add + break"]
    
    COND_KKTK_2B["2 fields (kktk_svc_cd, kktk_sbt_cd)"]
    MATCH_KKTK_2B["2 fields equal? Add + break"]
    
    COND_KKTK_1["1 field (kktk_svc_cd only)"]
    MATCH_KKTK_1["1 field equal? Add + break"]
    
    BRANCH_SEI["Case: SEI_OP_SVC (Billing Option Service)"]
    EXTRACT_SEI_LIST["Get seiopsvc_list from svcInfoMap"]
    
    LOOP_SEI["Iterate seiopsvc_list"]
    EXTRACT_SEI["Extract seiopsvc_cd, pcrs_cd, pplan_cd from seiOpSvcMap"]
    
    COND_SEI_ALL["3 fields set? (seiopsvc_cd, pcrs_cd, pplan_cd)"]
    MATCH_SEI_ALL["3 fields equal? Add + break"]
    
    COND_SEI_2["2 fields set? (seiopsvc_cd, pcrs_cd)"]
    MATCH_SEI_2["2 fields equal? Add + break"]
    
    COND_SEI_1["1 field set? (seiopsvc_cd only)"]
    MATCH_SEI_1["1 field equal? Add + break"]
    
    END_NODE(["Return / Next"])
    
    START --> EXTRACT --> DECIDE --> SWITCH
    
    SWITCH --> BRANCH_SVC
    BRANCH_SVC --> EXTRACT_SVC --> COND_SVC_ALL
    COND_SVC_ALL -->|Yes| MATCH_SVC_ALL --> END_NODE
    COND_SVC_ALL -->|No| COND_SVC_3
    COND_SVC_3 -->|Yes| MATCH_SVC_3 --> END_NODE
    COND_SVC_3 -->|No| COND_SVC_2
    COND_SVC_2 -->|Yes| MATCH_SVC_2 --> END_NODE
    COND_SVC_2 -->|No| COND_SVC_1
    COND_SVC_1 -->|Yes| MATCH_SVC_1 --> END_NODE
    COND_SVC_1 -->|No| END_NODE
    
    SWITCH --> BRANCH_SVC_UCWK
    BRANCH_SVC_UCWK --> EXTRACT_SVC_UCWK --> COND_UCWK_ALL
    COND_UCWK_ALL -->|Yes| MATCH_UCWK_ALL --> END_NODE
    COND_UCWK_ALL -->|No| COND_UCWK_1
    COND_UCWK_1 -->|Yes| MATCH_UCWK_1 --> END_NODE
    COND_UCWK_1 -->|No| END_NODE
    
    SWITCH --> BRANCH_OP_SVC
    BRANCH_OP_SVC --> EXTRACT_OP_LIST --> LOOP_OP --> EXTRACT_OP --> COND_OP_ALL
    COND_OP_ALL -->|Yes| MATCH_OP_ALL --> END_NODE
    COND_OP_ALL -->|No| COND_OP_2
    COND_OP_2 -->|Yes| MATCH_OP_2 --> END_NODE
    COND_OP_2 -->|No| COND_OP_1
    COND_OP_1 -->|Yes| MATCH_OP_1 --> END_NODE
    COND_OP_1 -->|No| END_NODE
    
    SWITCH --> BRANCH_SBOP
    BRANCH_SBOP --> EXTRACT_SBOP_LIST --> LOOP_SBOP --> EXTRACT_SBOP --> COND_SBOP_ALL
    COND_SBOP_ALL -->|Yes| MATCH_SBOP_ALL --> END_NODE
    COND_SBOP_ALL -->|No| COND_SBOP_2
    COND_SBOP_2 -->|Yes| MATCH_SBOP_2 --> END_NODE
    COND_SBOP_2 -->|No| COND_SBOP_1
    COND_SBOP_1 -->|Yes| MATCH_SBOP_1 --> END_NODE
    COND_SBOP_1 -->|No| END_NODE
    
    SWITCH --> BRANCH_KKTK
    BRANCH_KKTK --> EXTRACT_KKTK_LIST --> LOOP_KKTK --> EXTRACT_KKTK --> COND_KKTK_4
    COND_KKTK_4 -->|Yes| MATCH_KKTK_4 --> END_NODE
    COND_KKTK_4 -->|No| COND_KKTK_3A
    COND_KKTK_3A -->|Yes| MATCH_KKTK_3A --> END_NODE
    COND_KKTK_3A -->|No| COND_KKTK_3B
    COND_KKTK_3B -->|Yes| MATCH_KKTK_3B --> END_NODE
    COND_KKTK_3B -->|No| COND_KKTK_2A
    COND_KKTK_2A -->|Yes| MATCH_KKTK_2A --> END_NODE
    COND_KKTK_2A -->|No| COND_KKTK_2B
    COND_KKTK_2B -->|Yes| MATCH_KKTK_2B --> END_NODE
    COND_KKTK_2B -->|No| COND_KKTK_1
    COND_KKTK_1 -->|Yes| MATCH_KKTK_1 --> END_NODE
    COND_KKTK_1 -->|No| END_NODE
    
    SWITCH --> BRANCH_SEI
    BRANCH_SEI --> EXTRACT_SEI_LIST --> LOOP_SEI --> EXTRACT_SEI --> COND_SEI_ALL
    COND_SEI_ALL -->|Yes| MATCH_SEI_ALL --> END_NODE
    COND_SEI_ALL -->|No| COND_SEI_2
    COND_SEI_2 -->|Yes| MATCH_SEI_2 --> END_NODE
    COND_SEI_2 -->|No| COND_SEI_1
    COND_SEI_1 -->|Yes| MATCH_SEI_1 --> END_NODE
    COND_SEI_1 -->|No| END_NODE
```

**Processing Flow Summary:**

1. **Field Extraction** (L872–L889): Reads 9 fields from `wribTgSvcMap` using keys from `JKKWrisvcDchskmCommonUtil` constants. These are the "discount target criteria" (割引登録対象条件) — the values against which services will be compared.

2. **Service Type Routing** (L893–L1188): Delegates to `decideWribSvcTgt()` which inspects which service-type field is non-null in `wribTgSvcMap` and returns the appropriate `WRIB` enum value. The `switch` then routes to the matching branch.

3. **Progressive Matching** (per branch): Each case branch implements a nested if/else-if cascade that progressively relaxes the matching requirements. The method checks if all N fields are set; if so, it compares all N. If not, it falls through to check if fewer fields are set and compares those. A match appends `svcInfoMap` to `wribMatchList`.

**CRITICAL — Constant Resolution:**

| Constant | Resolved Value | Business Meaning |
|----------|---------------|-----------------|
| `JKKWrisvcDchskmCommonUtil.SVC_CD` | `"svc_cd"` | Service code — top-level service identifier |
| `JKKWrisvcDchskmCommonUtil.PRC_GRP_CD` | `"prc_grp_cd"` | Price group code — groups pricing tiers |
| `JKKWrisvcDchskmCommonUtil.PCRS_CD` | `"pcrs_cd"` | Price code — specific pricing designation |
| `JKKWrisvcDchskmCommonUtil.PPLAN_CD` | `"pplan_cd"` | Price plan — detailed pricing plan identifier |
| `JKKWrisvcDchskmCommonUtil.OP_SVC_CD` | `"op_svc_cd"` | Option service code — add-on service |
| `JKKWrisvcDchskmCommonUtil.SBOP_SVC_CD` | `"sbop_svc_cd"` | Sub-option service code — nested add-on |
| `JKKWrisvcDchskmCommonUtil.KKTK_SVC_CD` | `"kktk_svc_cd"` | Equipment provisioning service code |
| `JKKWrisvcDchskmCommonUtil.SEIOPSVC_CD` | `"seiopsvc_cd"` | Billing option service code |
| `JKKWrisvcDchskmCommonUtil.KKTK_SBT_CD` | `"kktk_sbt_cd"` | Equipment sub-type code |
| `KKSV0553_KKSV0553OP_WORK_SVC_INFO.SVC_CD` | `"svc_cd"` | Service code key in work info map |
| `KKSV0553_KKSV0553OP_WORK_SVC_INFO.PRC_GRP_CD` | `"prc_grp_cd"` | Price group code key in work info map |
| `KKSV0553_KKSV0553OP_WORK_SVC_INFO.PCRS_CD` | `"pcrs_cd"` | Price code key in work info map |
| `KKSV0553_KKSV0553OP_WORK_SVC_INFO.PPLAN_CD` | `"pplan_cd"` | Price plan key in work info map |
| `KKSV0553_KKSV0553OP_WORK_SVC_INFO.OP_SVC_LIST` | `"op_svc_list"` | Option service sub-list |
| `KKSV0553_KKSV0553OP_WORK_SVC_INFO.SBOP_SVC_LIST` | `"sbop_svc_list"` | Sub-option service sub-list |
| `KKSV0553_KKSV0553OP_WORK_SVC_INFO.KKTK_SVC_LIST` | `"kktk_svc_list"` | Equipment service sub-list |
| `KKSV0553_KKSV0553OP_WORK_SVC_INFO.SEIOPSVC_LIST` | `"seiopsvc_list"` | Billing option service sub-list |
| `KKSV0553_KKSV0553OP_WORK_OP_SVC_INFO.OP_SVC_CD` | `"op_svc_cd"` | Option service code key |
| `KKSV0553_KKSV0553OP_WORK_SBOP_SVC_INFO.SBOP_SVC_CD` | `"sbop_svc_cd"` | Sub-option service code key |
| `KKSV0553_KKSV0553OP_WORK_KKTK_SVC_INFO.KKTK_SVC_CD` | `"kktk_svc_cd"` | Equipment service code key |
| `KKSV0553_KKSV0553OP_WORK_KKTK_SVC_INFO.KKTK_SBT_CD` | `"kktk_sbt_cd"` | Equipment sub-type code key |
| `KKSV0553_KKSV0553OP_WORK_SEIOPSVC_INFO.SEIOPSVC_CD` | `"seiopsvc_cd"` | Billing option service code key |

## 3. Parameter Analysis

| No | Parameter Name | Type | Business Description |
|----|---------------|------|---------------------|
| 1 | `wribTgSvcMap` | `HashMap<String, Object>` | **Discount target service criteria map** — Contains the pre-configured discount registration conditions. Holds the service code, price group code, price code, price plan code, and optional/sub-option/equipment/billing option service codes. These values represent the "search criteria" against which actual services are compared. The `decideWribSvcTgt()` method inspects this map to determine which service category to match against. |
| 2 | `svcInfoMap` | `HashMap<String, Object>` | **Service information map** — Contains the actual service data to be evaluated. For top-level SVC and SVC_UCWK cases, it directly holds `svc_cd`, `prc_grp_cd`, `pcrs_cd`, and `pplan_cd`. For option/sub-option/equipment/billing-option cases, it holds `ArrayList` sub-lists (e.g., `op_svc_list`, `sbop_svc_list`) containing individual service candidate maps. This is the "candidate" data being tested against the criteria in `wribTgSvcMap`. |
| 3 | `wribMatchList` | `ArrayList<HashMap<String, Object>>` | **Discount match result accumulator** — A shared output list that accumulates all `svcInfoMap` entries that pass the matching criteria. The caller iterates over services and invokes `chkVariSvcCd` for each; matching entries are appended here. After processing, the caller validates the size of this list against an expected count (`chkTrgtKeiSvcCnt`). |

**Internal State / Constants Read:**

| Source | Items Read |
|--------|-----------|
| `JKKWrisvcDchskmCommonUtil` constants | `SVC_CD`, `PRC_GRP_CD`, `PCRS_CD`, `PPLAN_CD`, `OP_SVC_CD`, `SBOP_SVC_CD`, `KKTK_SVC_CD`, `SEIOPSVC_CD`, `KKTK_SBT_CD` |
| `KKSV0553_KKSV0553OP_WORK_SVC_INFO` constants | `SVC_CD`, `PRC_GRP_CD`, `PCRS_CD`, `PPLAN_CD`, `OP_SVC_LIST`, `SBOP_SVC_LIST`, `KKTK_SVC_LIST`, `SEIOPSVC_LIST` |
| `KKSV0553_KKSV0553OP_WORK_OP_SVC_INFO` constants | `OP_SVC_CD`, `PCRS_CD`, `PPLAN_CD` |
| `KKSV0553_KKSV0553OP_WORK_SBOP_SVC_INFO` constants | `SBOP_SVC_CD`, `PCRS_CD`, `PPLAN_CD` |
| `KKSV0553_KKSV0553OP_WORK_KKTK_SVC_INFO` constants | `KKTK_SVC_CD`, `KKTK_SBT_CD`, `PCRS_CD`, `PPLAN_CD` |
| `KKSV0553_KKSV0553OP_WORK_SEIOPSVC_INFO` constants | `SEIOPSVC_CD`, `PCRS_CD`, `PPLAN_CD` |

## 4. CRUD Operations / Called Services

This method performs **no database or entity-level CRUD operations**. It is a pure in-memory comparison routine. All called methods are internal to `JKKPrcSimulationCC` and operate on in-memory data structures only.

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

| CRUD | SC / CBS | SC Code | Entity / DB | Operation Description |
|------|----------|---------|-------------|----------------------|
| - | `JKKPrcSimulationCC.decideWribSvcTgt` | JKKPrcSimulationCC | - | Calls `decideWribSvcTgt` to determine the WRIB service type category based on which field is set in `wribTgSvcMap` |
| - | `JKKPrcSimulationCC.isNullSpace` | JKKPrcSimulationCC | - | Inline utility: checks whether a `String` is `null`, empty, or contains only whitespace (22+ calls across all branches) |
| - | `JKKPrcSimulationCC.printlnEjbLog` | JKKPrcSimulationCC | - | Logging utility: writes a log message identifying which service category is being processed (6 calls, one per switch case) |

**Classification rationale:** Since no DAO, SC (Service Component), or CBS (CBS = database service) methods are invoked, there are no R/U/D operations. The method is purely a comparator/matcher that reads from in-memory `HashMap` and `ArrayList` structures and writes matches to an output `ArrayList`.

## 5. Dependency Trace

### Direct callers of this method:

| # | Caller (Screen/Batch) | Call Chain (Full Path to this Method) | Terminal (SC / CRUD / Entity) |
|---|----------------------|--------------------------------------|-------------------------------|
| 1 | `JKKPrcSimulationCC.chkMainWribSvc` (CC/Common) | `chkMainWribSvc` -> iterates `svcList` -> `chkVariSvcCd(wribTgSvcMap, svcInfoMap, wribMatchList)` | `isNullSpace` [-], `printlnEjbLog` [-], `decideWribSvcTgt` [-] |
| 2 | `JKKWrisvcAutoAplyCC.chkWrisvcDchskmTgSvcJoken` (CC/Common) | `chkWrisvcDchskmTgSvcJoken` -> calls `JKKWrisvcDchskmCommonUtil.chkVariSvcCd` (different overloaded variant in CommonUtil) | `isNullSpace` [-], `printlnEjbLog` [-] |

**Note:** The caller `chkMainWribSvc` (at L534) is the primary invocation path. It iterates over a `svcList` and calls `chkVariSvcCd` for each candidate service. After the loop, the caller checks `chkTrgtKeiSvcCnt` to validate that the correct number of matching services were found. The caller at `JKKWrisvcAutoAplyCC` invokes a **different** variant — the static method `JKKWrisvcDchskmCommonUtil.chkVariSvcCd` — which has a different signature (takes 2 parameters and returns `boolean`). This is a distinct method sharing the same name.

### Full call chain from entry point:

Based on the code graph, `chkMainWribSvc` is called at line 167 from an unknown entry method (likely a screen operation class or batch entry point). The full chain from the top-level entry point through `chkMainWribSvc` to `chkVariSvcCd` is:

```
[Screen/Batch Entry Point]
    -> JKKPrcSimulationCC.chkMainWribSvc()
        -> [iterates svcList]
            -> JKKPrcSimulationCC.chkVariSvcCd()
                -> decideWribSvcTgt() (determines WRIB enum)
                -> isNullSpace() (22+ calls for progressive matching)
                -> printlnEjbLog() (6 calls for category identification)
```

## 6. Per-Branch Detail Blocks

### Block 1 — FIELD EXTRACTION (L872–L889)

> Extracts 9 discount target criteria fields from the `wribTgSvcMap` into local variables. All keys are resolved from `JKKWrisvcDchskmCommonUtil` constants.

| # | Type | Code |
|---|------|------|
| 1 | SET | `m_svc_cd = (String)wribTgSvcMap.get(JKKWrisvcDchskmCommonUtil.SVC_CD)` → `[-> "svc_cd"]` |
| 2 | SET | `m_prc_grp_cd = (String)wribTgSvcMap.get(JKKWrisvcDchskmCommonUtil.PRC_GRP_CD)` → `[-> "prc_grp_cd"]` |
| 3 | SET | `m_pcrs_cd = (String)wribTgSvcMap.get(JKKWrisvcDchskmCommonUtil.PCRS_CD)` → `[-> "pcrs_cd"]` |
| 4 | SET | `m_pplan_cd = (String)wribTgSvcMap.get(JKKWrisvcDchskmCommonUtil.PPLAN_CD)` → `[-> "pplan_cd"]` |
| 5 | SET | `m_op_svc_cd = (String)wribTgSvcMap.get(JKKWrisvcDchskmCommonUtil.OP_SVC_CD)` → `[-> "op_svc_cd"]` |
| 6 | SET | `m_sbop_svc_cd = (String)wribTgSvcMap.get(JKKWrisvcDchskmCommonUtil.SBOP_SVC_CD)` → `[-> "sbop_svc_cd"]` |
| 7 | SET | `m_kktk_svc_cd = (String)wribTgSvcMap.get(JKKWrisvcDchskmCommonUtil.KKTK_SVC_CD)` → `[-> "kktk_svc_cd"]` |
| 8 | SET | `m_seiopsvc_cd = (String)wribTgSvcMap.get(JKKWrisvcDchskmCommonUtil.SEIOPSVC_CD)` → `[-> "seiopsvc_cd"]` |
| 9 | SET | `m_kktk_sbt_cd = (String)wribTgSvcMap.get(JKKWrisvcDchskmCommonUtil.KKTK_SBT_CD)` → `[-> "kktk_sbt_cd"]` |
| 10 | SET | `svc_cd = null;` (16 local variables initialized to null) |

### Block 2 — SWITCH ROUTING (L893)

> Delegates to `decideWribSvcTgt()` which inspects `wribTgSvcMap` to determine which service type category is active. The return value (`WRIB` enum) determines the switch branch.

**`decideWribSvcTgt` routing logic:**

| # | Type | Code |
|---|------|------|
| 1 | COND | `if (!isNullSpace(svcCd))` → `return WRIB.SVC` |
| 2 | COND | `else if (!isNullSpace(opSvcCd))` → `return WRIB.OP_SVC` |
| 3 | COND | `else if (!isNullSpace(sbopSvcDd))` → `return WRIB.SBOP_SVC` |
| 4 | COND | `else if (!isNullSpace(kktkSvcCd))` → `return WRIB.KKTK_SVC` |
| 5 | COND | `else if (!isNullSpace(seiopsvcCd))` → `return WRIB.SEI_OP_SVC` |
| 6 | ELSE | `else { return WRIB.SVC_UCWK; }` (default — none of the above set) |

### Block 3 — Case: SVC (L895–L941) — Service

> The top-level service category. Extracts 4 fields from `svcInfoMap` and performs progressive 4→3→2→1 field matching.

**Block 3.1 — Case SVC: field extraction (L896–L901)**

| # | Type | Code |
|---|------|------|
| 1 | CALL | `printlnEjbLog("割引サービス対象サービスの対象【サービス】")` → (Logging: "Discount service target — [Service]") |
| 2 | SET | `svc_cd = (String)svcInfoMap.get(KKSV0553_KKSV0553OP_WORK_SVC_INFO.SVC_CD)` → `[-> "svc_cd"]` |
| 3 | SET | `prc_grp_cd = (String)svcInfoMap.get(KKSV0553_KKSV0553OP_WORK_SVC_INFO.PRC_GRP_CD)` → `[-> "prc_grp_cd"]` |
| 4 | SET | `pcrs_cd = (String)svcInfoMap.get(KKSV0553_KKSV0553OP_WORK_SVC_INFO.PCRS_CD)` → `[-> "pcrs_cd"]` |
| 5 | SET | `pplan_cd = (String)svcInfoMap.get(KKSV0553_KKSV0553OP_WORK_SVC_INFO.PPLAN_CD)` → `[-> "pplan_cd"]` |

**Block 3.2 — IF: All 4 fields set (L904–L912)**

> Matches if `m_svc_cd`, `m_prc_grp_cd`, `m_pcrs_cd`, `m_pplan_cd` are all non-null AND `svc_cd`, `prc_grp_cd`, `pcrs_cd`, `pplan_cd` are all non-null, and all 4 pairs are equal.

| # | Type | Code |
|---|------|------|
| 1 | COND | `!isNullSpace(m_svc_cd) && !isNullSpace(m_prc_grp_cd) && !isNullSpace(m_pcrs_cd) && !isNullSpace(m_pplan_cd)` → [All 4 set] |
| 2 | COND | `m_svc_cd.equals(svc_cd) && m_prc_grp_cd.equals(prc_grp_cd) && m_pcrs_cd.equals(pcrs_cd) && m_pplan_cd.equals(pplan_cd)` → [All 4 equal] |
| 3 | EXEC | `wribMatchList.add(svcInfoMap)` → Add matching service |

**Block 3.3 — ELSE-IF: 3 fields set (L914–L922)**

> Matches if `m_pplan_cd` is null but svc_cd, prc_grp_cd, pcrs_cd are set, and those 3 pairs are equal.

| # | Type | Code |
|---|------|------|
| 1 | COND | `!isNullSpace(m_svc_cd) && !isNullSpace(m_prc_grp_cd) && !isNullSpace(m_pcrs_cd) && isNullSpace(m_pplan_cd)` → [pplan_cd not set] |
| 2 | COND | `m_svc_cd.equals(svc_cd) && m_prc_grp_cd.equals(prc_grp_cd) && m_pcrs_cd.equals(pcrs_cd)` → [3 fields equal] |
| 3 | EXEC | `wribMatchList.add(svcInfoMap)` → Add matching service |

**Block 3.4 — ELSE-IF: 2 fields set (L924–L932)**

> Matches if `m_pcrs_cd` and `m_pplan_cd` are null but svc_cd and prc_grp_cd are set.

| # | Type | Code |
|---|------|------|
| 1 | COND | `!isNullSpace(m_svc_cd) && !isNullSpace(m_prc_grp_cd) && isNullSpace(m_pcrs_cd) && isNullSpace(m_pplan_cd)` → [pcrs_cd, pplan_cd not set] |
| 2 | COND | `m_svc_cd.equals(svc_cd) && m_prc_grp_cd.equals(prc_grp_cd)` → [2 fields equal] |
| 3 | EXEC | `wribMatchList.add(svcInfoMap)` → Add matching service |

**Block 3.5 — ELSE-IF: 1 field set (L934–L941)**

> Matches if only `m_svc_cd` is set and equals `svc_cd`.

| # | Type | Code |
|---|------|------|
| 1 | COND | `!isNullSpace(m_svc_cd) && isNullSpace(m_prc_grp_cd) && isNullSpace(m_pcrs_cd) && isNullSpace(m_pplan_cd)` → [only svc_cd set] |
| 2 | COND | `m_svc_cd.equals(svc_cd)` → [1 field equal] |
| 3 | EXEC | `wribMatchList.add(svcInfoMap)` → Add matching service |

**Block 3.6 — break** (L941) → Proceed to next iteration or return

### Block 4 — Case: SVC_UCWK (L945–L971) — Service Details

> The "service details" (内訳) category. Only 2 fields are used: `pcrs_cd` and `pplan_cd`. Progressive 2→1 field matching.

**Block 4.1 — Field extraction (L946–L949)**

| # | Type | Code |
|---|------|------|
| 1 | CALL | `printlnEjbLog("割引サービス対象サービスの対象【サービス内訳】")` → (Logging: "Discount service target — [Service Details]") |
| 2 | SET | `pcrs_cd = (String)svcInfoMap.get(KKSV0553_KKSV0553OP_WORK_SVC_INFO.PCRS_CD)` |
| 3 | SET | `pplan_cd = (String)svcInfoMap.get(KKSV0553_KKSV0553OP_WORK_SVC_INFO.PPLAN_CD)` |

**Block 4.2 — IF: Both fields set (L950–L959)**

| # | Type | Code |
|---|------|------|
| 1 | COND | `!isNullSpace(m_pcrs_cd) && !isNullSpace(m_pplan_cd)` → [2 fields set] |
| 2 | COND | `m_pcrs_cd.equals(pcrs_cd) && m_pplan_cd.equals(pplan_cd)` → [2 fields equal] |
| 3 | EXEC | `wribMatchList.add(svcInfoMap)` → Add matching service |

**Block 4.3 — ELSE-IF: 1 field set (L961–L969)**

| # | Type | Code |
|---|------|------|
| 1 | COND | `!isNullSpace(m_pcrs_cd) && isNullSpace(m_pplan_cd)` → [pplan_cd not set] |
| 2 | COND | `m_pcrs_cd.equals(pcrs_cd)` → [1 field equal] |
| 3 | EXEC | `wribMatchList.add(svcInfoMap)` → Add matching service |

**Block 4.4 — break** (L971)

### Block 5 — Case: OP_SVC (L977–L1026) — Option Service

> Iterates over the option service sub-list. Each option service can match on 3 fields (op_svc_cd, pcrs_cd, pplan_cd) with progressive 3→2→1 field fallback. Breaks on first match within the sub-list.

**Block 5.1 — Field extraction (L978–L980)**

| # | Type | Code |
|---|------|------|
| 1 | CALL | `printlnEjbLog("割引サービス対象サービスの対象【オプションサービス】")` → (Logging: "Discount service target — [Option Service]") |
| 2 | SET | `list = (ArrayList<HashMap<String, Object>>)svcInfoMap.get(KKSV0553_KKSV0553OP_WORK_SVC_INFO.OP_SVC_LIST)` → `[-> "op_svc_list"]` |

**Block 5.2 — FOR: Iterate op_svc_list (L981–L1026)**

| # | Type | Code |
|---|------|------|
| 1 | SET | `int i = 0; i < list.size(); i++` |
| 2 | SET | `HashMap<String, Object> opSvcMap = list.get(i)` |
| 3 | SET | `op_svc_cd = (String)opSvcMap.get(KKSV0553_KKSV0553OP_WORK_OP_SVC_INFO.OP_SVC_CD)` → `[-> "op_svc_cd"]` |
| 4 | SET | `pcrs_cd = (String)opSvcMap.get(KKSV0553_KKSV0553OP_WORK_OP_SVC_INFO.PCRS_CD)` |
| 5 | SET | `pplan_cd = (String)opSvcMap.get(KKSV0553_KKSV0553OP_WORK_OP_SVC_INFO.PPLAN_CD)` |

**Block 5.3 — IF: 3 fields set (L984–L994)**

| # | Type | Code |
|---|------|------|
| 1 | COND | `!isNullSpace(m_op_svc_cd) && !isNullSpace(m_pcrs_cd) && !isNullSpace(m_pplan_cd)` → [3 fields set] |
| 2 | COND | `m_op_svc_cd.equals(op_svc_cd) && m_pcrs_cd.equals(pcrs_cd) && m_pplan_cd.equals(pplan_cd)` → [3 fields equal] |
| 3 | EXEC | `wribMatchList.add(svcInfoMap)` |
| 4 | EXEC | `break;` → Exit inner for loop |

**Block 5.4 — ELSE-IF: 2 fields set (L996–L1005)**

> Note: Original source has a redundancy — `!isNullSpace(m_pcrs_cd) && !isNullSpace(m_pcrs_cd)` — which is logically equivalent to checking `m_pcrs_cd` once. This appears to be a copy-paste artifact.

| # | Type | Code |
|---|------|------|
| 1 | COND | `!isNullSpace(m_pcrs_cd) && !isNullSpace(m_pcrs_cd) && isNullSpace(m_pplan_cd)` → [pplan_cd not set; m_pcrs_cd redundantly checked twice] |
| 2 | COND | `m_op_svc_cd.equals(op_svc_cd) && m_pcrs_cd.equals(pcrs_cd)` → [2 fields equal] |
| 3 | EXEC | `wribMatchList.add(svcInfoMap)` |
| 4 | EXEC | `break;` |

**Block 5.5 — ELSE-IF: 1 field set (L1007–L1016)**

| # | Type | Code |
|---|------|------|
| 1 | COND | `!isNullSpace(op_svc_cd) && isNullSpace(m_pcrs_cd) && isNullSpace(m_pplan_cd)` → [only op_svc_cd set in candidate] |
| 2 | COND | `m_op_svc_cd.equals(op_svc_cd)` → [1 field equal] |
| 3 | EXEC | `wribMatchList.add(svcInfoMap)` |
| 4 | EXEC | `break;` |

**Block 5.6 — break** (L1026) → Exit switch

### Block 6 — Case: SBOP_SVC (L1032–L1081) — Sub-Option Service

> Iterates over the sub-option service sub-list. Same 3→2→1 progressive matching as OP_SVC, but using `sbop_svc_cd` instead of `op_svc_cd`.

**Block 6.1 — Field extraction (L1033–L1035)**

| # | Type | Code |
|---|------|------|
| 1 | CALL | `printlnEjbLog("割引サービス対象サービスの対象【サブオプションサービス】")` → (Logging: "Discount service target — [Sub-Option Service]") |
| 2 | SET | `list = (ArrayList<HashMap<String, Object>>)svcInfoMap.get(KKSV0553_KKSV0553OP_WORK_SVC_INFO.SBOP_SVC_LIST)` → `[-> "sbop_svc_list"]` |

**Block 6.2 — FOR: Iterate sbop_svc_list (L1036–L1081)**

| # | Type | Code |
|---|------|------|
| 1 | SET | `HashMap<String, Object> sbOpSvcMap = list.get(i)` |
| 2 | SET | `sbop_svc_cd = (String)sbOpSvcMap.get(KKSV0553_KKSV0553OP_WORK_SBOP_SVC_INFO.SBOP_SVC_CD)` → `[-> "sbop_svc_cd"]` |
| 3 | SET | `pcrs_cd = (String)sbOpSvcMap.get(KKSV0553_KKSV0553OP_WORK_SBOP_SVC_INFO.PCRS_CD)` |
| 4 | SET | `pplan_cd = (String)sbOpSvcMap.get(KKSV0553_KKSV0553OP_WORK_SBOP_SVC_INFO.PPLAN_CD)` |

**Block 6.3 — IF: 3 fields set (L1039–L1049)**

| # | Type | Code |
|---|------|------|
| 1 | COND | `!isNullSpace(m_sbop_svc_cd) && !isNullSpace(m_pcrs_cd) && !isNullSpace(m_pplan_cd)` |
| 2 | COND | `m_sbop_svc_cd.equals(sbop_svc_cd) && m_pcrs_cd.equals(pcrs_cd) && m_pplan_cd.equals(pplan_cd)` |
| 3 | EXEC | `wribMatchList.add(svcInfoMap)` |
| 4 | EXEC | `break;` |

**Block 6.4 — ELSE-IF: 2 fields set (L1051–L1060)**

> Note: Same redundancy as Block 5.4 — `!isNullSpace(m_pcrs_cd) && !isNullSpace(m_pcrs_cd)`.

| # | Type | Code |
|---|------|------|
| 1 | COND | `!isNullSpace(m_pcrs_cd) && !isNullSpace(m_pcrs_cd) && isNullSpace(m_pplan_cd)` |
| 2 | COND | `m_sbop_svc_cd.equals(sbop_svc_cd) && m_pcrs_cd.equals(pcrs_cd)` |
| 3 | EXEC | `wribMatchList.add(svcInfoMap)` |
| 4 | EXEC | `break;` |

**Block 6.5 — ELSE-IF: 1 field set (L1062–L1071)**

| # | Type | Code |
|---|------|------|
| 1 | COND | `!isNullSpace(m_sbop_svc_cd) && isNullSpace(m_pcrs_cd) && isNullSpace(m_pplan_cd)` |
| 2 | COND | `m_sbop_svc_cd.equals(sbop_svc_cd)` |
| 3 | EXEC | `wribMatchList.add(svcInfoMap)` |
| 4 | EXEC | `break;` |

**Block 6.6 — break** (L1081)

### Block 7 — Case: KKTK_SVC (L1087–L1166) — Equipment Provisioning Service

> The most complex branch with 6 sub-branches (4→3→3→2→2→1 field matching). Iterates over the equipment service sub-list. Uses 4 fields: `kktk_svc_cd`, `kktk_sbt_cd`, `pcrs_cd`, `pplan_cd`.

**Block 7.1 — Field extraction (L1088–L1095)**

| # | Type | Code |
|---|------|------|
| 1 | CALL | `printlnEjbLog("割引サービス対象サービスの対象【機器提供サービス】")` → (Logging: "Discount service target — [Equipment Provisioning Service]") |
| 2 | SET | `list = (ArrayList<HashMap<String, Object>>)svcInfoMap.get(KKSV0553_KKSV0553OP_WORK_SVC_INFO.KKTK_SVC_LIST)` → `[-> "kktk_svc_list"]` |
| 3 | SET | `kktk_svc_cd = (String)kktkSvcMap.get(KKSV0553_KKSV0553OP_WORK_KKTK_SVC_INFO.KKTK_SVC_CD)` → `[-> "kktk_svc_cd"]` |
| 4 | SET | `kktk_sbt_cd = (String)kktkSvcMap.get(KKSV0553_KKSV0553OP_WORK_KKTK_SVC_INFO.KKTK_SBT_CD)` → `[-> "kktk_sbt_cd"]` |
| 5 | SET | `pcrs_cd = (String)kktkSvcMap.get(KKSV0553_KKSV0553OP_WORK_KKTK_SVC_INFO.PCRS_CD)` |
| 6 | SET | `pplan_cd = (String)kktkSvcMap.get(KKSV0553_KKSV0553OP_WORK_KKTK_SVC_INFO.PPLAN_CD)` |

**Block 7.2 — IF: 4 fields set (L1098–L1108)**

| # | Type | Code |
|---|------|------|
| 1 | COND | `!isNullSpace(m_kktk_svc_cd) && !isNullSpace(m_kktk_sbt_cd) && !isNullSpace(m_pcrs_cd) && !isNullSpace(m_pplan_cd)` |
| 2 | COND | `m_kktk_svc_cd.equals(kktk_svc_cd) && m_kktk_sbt_cd.equals(kktk_sbt_cd) && m_pcrs_cd.equals(pcrs_cd) && m_pplan_cd.equals(pplan_cd)` |
| 3 | EXEC | `wribMatchList.add(svcInfoMap)` |
| 4 | EXEC | `break;` |

**Block 7.3 — ELSE-IF: 3 fields (kktk_svc_cd, kktk_sbt_cd, pcrs_cd) (L1110–L1120)**

> Note: Uses `m_kktk_svc_cd` and `m_kktk_sbt_cd` in the outer condition but the inner condition checks `kktk_svc_cd` and `kktk_sbt_cd` from the candidate map.

| # | Type | Code |
|---|------|------|
| 1 | COND | `!isNullSpace(m_kktk_svc_cd) && !isNullSpace(m_kktk_sbt_cd) && !isNullSpace(m_pcrs_cd) && isNullSpace(m_pplan_cd)` |
| 2 | COND | `m_kktk_svc_cd.equals(kktk_svc_cd) && m_kktk_sbt_cd.equals(kktk_sbt_cd) && m_pcrs_cd.equals(pcrs_cd)` |
| 3 | EXEC | `wribMatchList.add(svcInfoMap)` |
| 4 | EXEC | `break;` |

**Block 7.4 — ELSE-IF: 3 fields (kktk_svc_cd, pcrs_cd, pplan_cd) (L1122–L1132)**

> Note: `kktk_sbt_cd` is null in both the outer condition and the inner comparison.

| # | Type | Code |
|---|------|------|
| 1 | COND | `!isNullSpace(m_kktk_svc_cd) && isNullSpace(m_kktk_sbt_cd) && !isNullSpace(m_pcrs_cd) && !isNullSpace(m_pplan_cd)` |
| 2 | COND | `m_kktk_svc_cd.equals(kktk_svc_cd) && m_pcrs_cd.equals(pcrs_cd) && m_pplan_cd.equals(pplan_cd)` |
| 3 | EXEC | `wribMatchList.add(svcInfoMap)` |
| 4 | EXEC | `break;` |

**Block 7.5 — ELSE-IF: 2 fields (kktk_svc_cd, pcrs_cd) (L1134–L1144)**

> Note: `kktk_sbt_cd` is null, `pplan_cd` is null. Inner condition compares only `kktk_svc_cd` and `pcrs_cd`.

| # | Type | Code |
|---|------|------|
| 1 | COND | `!isNullSpace(m_kktk_svc_cd) && isNullSpace(m_kktk_sbt_cd) && !isNullSpace(m_pcrs_cd) && isNullSpace(m_pplan_cd)` |
| 2 | COND | `m_kktk_svc_cd.equals(kktk_svc_cd) && m_pcrs_cd.equals(pcrs_cd)` |
| 3 | EXEC | `wribMatchList.add(svcInfoMap)` |
| 4 | EXEC | `break;` |

**Block 7.6 — ELSE-IF: 2 fields (kktk_svc_cd, kktk_sbt_cd) (L1146–L1156)**

> Note: `pcrs_cd` is null, `pplan_cd` is null. Inner condition compares only `kktk_svc_cd` and `kktk_sbt_cd`.

| # | Type | Code |
|---|------|------|
| 1 | COND | `!isNullSpace(m_kktk_svc_cd) && !isNullSpace(m_kktk_sbt_cd) && isNullSpace(m_pcrs_cd) && isNullSpace(m_pplan_cd)` |
| 2 | COND | `m_kktk_svc_cd.equals(kktk_svc_cd) && m_kktk_sbt_cd.equals(kktk_sbt_cd)` |
| 3 | EXEC | `wribMatchList.add(svcInfoMap)` |
| 4 | EXEC | `break;` |

**Block 7.7 — ELSE-IF: 1 field (kktk_svc_cd only) (L1158–L1166)**

> Note: All other fields are null in the candidate map. Inner condition checks only `kktk_svc_cd`.

| # | Type | Code |
|---|------|------|
| 1 | COND | `!isNullSpace(m_kktk_svc_cd) && isNullSpace(m_kktk_sbt_cd) && isNullSpace(m_pcrs_cd) && isNullSpace(m_pplan_cd)` |
| 2 | COND | `m_kktk_svc_cd.equals(kktk_svc_cd)` |
| 3 | EXEC | `wribMatchList.add(svcInfoMap)` |
| 4 | EXEC | `break;` |

**Block 7.8 — break** (L1166)

### Block 8 — Case: SEI_OP_SVC (L1172–L1190) — Billing Option Service

> Iterates over the billing option service sub-list. Same 3→2→1 progressive matching as OP_SVC, but using `seiopsvc_cd` instead of `op_svc_cd`.

**Block 8.1 — Field extraction (L1173–L1175)**

| # | Type | Code |
|---|------|------|
| 1 | CALL | `printlnEjbLog("割引サービス対象サービスの対象【請求オプションサービス】")` → (Logging: "Discount service target — [Billing Option Service]") |
| 2 | SET | `list = (ArrayList<HashMap<String, Object>>)svcInfoMap.get(KKSV0553_KKSV0553OP_WORK_SVC_INFO.SEIOPSVC_LIST)` → `[-> "seiopsvc_list"]` |

**Block 8.2 — FOR: Iterate seiopsvc_list (L1176–L1190)**

| # | Type | Code |
|---|------|------|
| 1 | SET | `HashMap<String, Object> seiOpSvcMap = list.get(i)` |
| 2 | SET | `seiopsvc_cd = (String)seiOpSvcMap.get(KKSV0553_KKSV0553OP_WORK_SEIOPSVC_INFO.SEIOPSVC_CD)` → `[-> "seiopsvc_cd"]` |
| 3 | SET | `pcrs_cd = (String)seiOpSvcMap.get(KKSV0553_KKSV0553OP_WORK_SEIOPSVC_INFO.PCRS_CD)` |
| 4 | SET | `pplan_cd = (String)seiOpSvcMap.get(KKSV0553_KKSV0553OP_WORK_SEIOPSVC_INFO.PPLAN_CD)` |

**Block 8.3 — IF: 3 fields set (L1179–L1189)**

| # | Type | Code |
|---|------|------|
| 1 | COND | `!isNullSpace(m_seiopsvc_cd) && !isNullSpace(m_pcrs_cd) && !isNullSpace(m_pplan_cd)` |
| 2 | COND | `m_seiopsvc_cd.equals(seiopsvc_cd) && m_pcrs_cd.equals(pcrs_cd) && m_pplan_cd.equals(pplan_cd)` |
| 3 | EXEC | `wribMatchList.add(svcInfoMap)` |
| 4 | EXEC | `break;` |

**Block 8.4 — ELSE-IF: 2 fields set (L1191–L1200)**

> Note: This block (and its sub-blocks 8.5, 8.6) fall beyond the reported end of the method (L1190). They may exist in the extended source but are not shown in the provided line range.

| # | Type | Code |
|---|------|------|
| 1 | COND | `!isNullSpace(m_seiopsvc_cd) && !isNullSpace(m_pcrs_cd) && isNullSpace(m_pplan_cd)` |
| 2 | COND | `m_seiopsvc_cd.equals(seiopsvc_cd) && m_pcrs_cd.equals(pcrs_cd)` |
| 3 | EXEC | `wribMatchList.add(svcInfoMap)` |
| 4 | EXEC | `break;` |

**Block 8.5 — ELSE-IF: 1 field set (L1202–L1211)**

| # | Type | Code |
|---|------|------|
| 1 | COND | `!isNullSpace(m_seiopsvc_cd) && isNullSpace(m_pcrs_cd) && isNullSpace(m_pplan_cd)` |
| 2 | COND | `m_seiopsvc_cd.equals(seiopsvc_cd)` |
| 3 | EXEC | `wribMatchList.add(svcInfoMap)` |
| 4 | EXEC | `break;` |

**Block 8.6 — break** → Exit switch

### Block 9 — RETURN (L1190 / end of method)

> Returns `void` — no value returned. All results are communicated via mutation of `wribMatchList`.

| # | Type | Code |
|---|------|------|
| 1 | RETURN | `return;` (void return) |

## 7. Glossary

| Term | Type | Business Meaning |
|------|------|------------------|
| `wribTgSvcMap` | Field | Discount target service criteria map — holds the discount registration conditions to match against |
| `svcInfoMap` | Field | Service information map — holds the candidate service data to be evaluated |
| `wribMatchList` | Field | Discount match result accumulator — output list of matching services |
| `m_svc_cd` | Field | Service code (main criteria) — top-level service identifier used for matching |
| `m_prc_grp_cd` | Field | Price group code (main criteria) — groups pricing tiers for the discount |
| `m_pcrs_cd` | Field | Price code (main criteria) — specific pricing designation |
| `m_pplan_cd` | Field | Price plan (main criteria) — detailed pricing plan identifier |
| `m_op_svc_cd` | Field | Option service code (main criteria) — optional add-on service identifier |
| `m_sbop_svc_cd` | Field | Sub-option service code (main criteria) — nested optional service identifier |
| `m_kktk_svc_cd` | Field | Equipment provisioning service code (main criteria) — hardware/equipment service identifier |
| `m_kktk_sbt_cd` | Field | Equipment sub-type code (main criteria) — sub-type of equipment service |
| `m_seiopsvc_cd` | Field | Billing option service code (main criteria) — billing-level optional service identifier |
| WRIB | Enum | Discount/Write-back service target category — enum with values: SVC, SVC_UCWK, OP_SVC, SBOP_SVC, KKTK_SVC, SEI_OP_SVC |
| SVC | Enum Value | Top-level Service category — the broadest service classification |
| SVC_UCWK | Enum Value | Service Details (内訳) — sub-service detail lines |
| OP_SVC | Enum Value | Option Service (オプションサービス) — optional add-on services like insurance or extended features |
| SBOP_SVC | Enum Value | Sub-Option Service (サブオプションサービス) — nested optional services beneath option services |
| KKTK_SVC | Enum Value | Equipment Provisioning Service (機器提供サービス) — hardware/equipment rental or sale services |
| SEI_OP_SVC | Enum Value | Billing Option Service (請求オプションサービス) — billing-level optional charges/deductions |
| `pcrs_cd` | Field | Price code — specific pricing designation for a service |
| `pplan_cd` | Field | Price plan — detailed pricing plan (e.g., "PF0101" for standard, "PF0201" for optional) |
| `prc_grp_cd` | Field | Price group code — groups related pricing structures |
| `op_svc_list` | Field | Option service sub-list — ArrayList of option service candidate maps |
| `sbop_svc_list` | Field | Sub-option service sub-list — ArrayList of sub-option service candidate maps |
| `kktk_svc_list` | Field | Equipment service sub-list — ArrayList of equipment service candidate maps |
| `seiopsvc_list` | Field | Billing option service sub-list — ArrayList of billing option service candidate maps |
| `isNullSpace` | Method | Utility: checks if a String is null, empty, or whitespace-only |
| `decideWribSvcTgt` | Method | Determines the WRIB service type category by inspecting which field is set in `wribTgSvcMap` |
| `printlnEjbLog` | Method | Logging utility: writes category identification messages to the EJB log |
| JKK | Acronym | Fujitsu pricing simulation subsystem prefix (Japanese: 割引価格シミュレーション) |
| Futurity | Acronym | Fujitsu's billing and service management platform |
| CC | Acronym | Common Component — a shared business logic class in the JavaEE EJB tier |
| SOD | Acronym | Service Order Data — telecom order fulfillment data entity (used throughout the broader pricing simulation) |
| FTTH | Business term | Fiber To The Home — fiber-optic broadband service (commonly referenced in pricing rules) |
