# Business Logic - JKKSvkeiShosaCC.runShosa() [455 LOC]

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

## 1. Role

### JKKSvkeiShosaCC.runShosa()

This method performs the **central validation (shosa) execution** for service contract operations in the Fujitsu Futurity telecommunications order fulfillment system. Shosa (照査) means verification or check -- it is the core validation step that runs before committing any service contract change. The method acts as a generic validation dispatch hub: it receives a map key identifying a specific service type, retrieves the corresponding work items from rsltMap, and for each work item, executes an SIF call through ServiceComponentRequestInvoker, then routes results to a specialized validation mapper.

It handles 35+ service types across multiple categories: primary service contracts (eo Hikari Net, eo Hikari TV, eo Hikari Phone, eo Mobile, eo ADSL), service contract details/additions (content verification for each service), optional service contracts (ISP, TV, Phone, Support), subscription optional services, equipment provision services, customer information changes (individual/legal entity), and specialized operations (group registration, contact registration, facility work registration, number change, installment contracts, billing option contracts).

The method implements the **routing/dispatch pattern**: a single entry point with a long if-else chain dispatching to specialized mappers based on the mapKey. It also implements the **template pattern** by wrapping each operation in SIF invocation, last-update timestamp management (via mergeSetLastUpdDtm / mergeGetLastUpdDtm for concurrency control), and error aggregation.

As a shared utility called by 12+ other methods within JKKSvkeiShosaCC, it is a central coordination point for all service contract validation workflows across multiple screens and business processes.

## 2. Processing Pattern (Detailed Business Logic)

```mermaid
flowchart TD
    START(["runShosa(handle, param, rsltMap, mapKey)"])
    INIT["Initialize: wkErrorList, SC Call Inst, scCall = new ServiceComponentRequestInvoker()"]
    GET_ARRAY["Get wkMapArray from rsltMap.get(mapKey)"]
    CHECK_NULL["wkMapArray != null?"]
    LOOP_START["For each wkMap in wkMapArray"]
    CHECK_WKMAP["wkMap != null?"]
    CREATE_ERROR["Create wkErrorList"]
    MERGE_SET["kkExclusiveMapper.mergeSetLastUpdDtm(wkMap)"]
    SIF_RUN["scCall.run(wkMap, handle)"]
    MERGE_GET["kkExclusiveMapper.mergeGetLastUpdDtm(wkMap)"]
    DISPATCH["Route by mapKey"]

    DIS_EKK0021C060["mapKey=EKK0021C060
Shomei shosa + gosemu iitoku"]
    DIS_EKK0091C010["mapKey=EKK0091C010
eo Hikari Net check"]
    DIS_EKK0101C010["mapKey=EKK0101C010
eo Hikari TV check"]
    DIS_EKK0111C010["mapKey=EKK0111C010
eo Hikari Phone check"]
    PPP_NINSHO["Get ppp_ninsho_id, agingWorkMap.put"]
    DIS_EKK0121C010["mapKey=EKK0121C010
eo Mobile check"]
    DIS_EKK0141C010["mapKey=EKK0141C010
eo ADSL check"]
    DIS_EKK0171C010["mapKey=EKK0171C010
eo Hikari Net detail check"]
    ISP_NINSHO["Get ninsho_id, agingWorkMap.put"]
    DIS_EKK0181C010["mapKey=EKK0181C010
eo Hikari TV detail check"]
    DIS_EKK0191C010["mapKey=EKK0191C010
eo Hikari Phone detail check"]
    SIP_USER_ID["Get ninsho_id, agingWorkMap.put with SVC_KEI_UCWK_NO"]
    DIS_EKK0221C010["mapKey=EKK0221C010
eo ADSL detail check"]
    ADSL_NINSHO["Get ninsho_id, split @, agingWorkMap.put"]
    DIS_EKK0361C010["mapKey=EKK0361C010
ISP option check"]
    GET_MLAD["Check MLAD, rsltMap.put"]
    DIS_EKK0381C010["mapKey=EKK0381C010
TV option check"]
    DIS_EKK0371C010["mapKey=EKK0371C010
Phone option check"]
    DIS_EKK0391C010["mapKey=EKK0391C010
Support option check"]
    DIS_EKK0411C020["mapKey=EKK0411C020
Sub-ISP option check"]
    DIS_EKK0421C010["mapKey=EKK0421C010
Sub-TV option check"]
    DIS_EKK0431C010["mapKey=EKK0431C010
Sub-Phone option check"]
    DIS_EKK0341C030["mapKey=EKK0341C030
Equipment provision contract check"]
    DIS_ECK0011C120["mapKey=ECK0011C120
Member type change"]
    SHK_EOID["Get shk_eoId from template"]
    DIS_ECK0021C010["mapKey=ECK0021C010
Customer individual change"]
    DIS_ECK0031C010["mapKey=ECK0031C010
Customer legal entity change"]
    DIS_ECK0201D010["mapKey=ECK0201D010
Contact registration"]
    DIS_ECK0201C010["mapKey=ECK0201C010
Contact change"]
    DIS_ECK0141D010["mapKey=ECK0141D010
Opt Internet access reg"]
    DIS_EKKA0020002["mapKey=EKKA0020002
Installation loc no. get"]
    ERR_CHK1["errChk(param, rslt, wkErrorList)"]
    GET_PLACE_NO["Get place_no"]
    DIS_EKK0251C030["mapKey=EKK0251C030
Contract line content change"]
    DIS_EKK0341C450["mapKey=EKK0341C450
Equipment install loc reflect"]
    DIS_EKK0121C020["mapKey=EKK0121C020
eo Mobile contract close"]
    DIS_EKK0201C030["mapKey=EKK0201C030
eo Mobile detail close"]
    DIS_EKK0361C030["mapKey=EKK0361C030
ISP option check close"]
    GET_AGING_MAP["getResultRPEKK0361C030"]
    DIS_EKK0411C040["mapKey=EKK0411C040
Sub-ISP option check close"]
    DIS_EKK0391C030["mapKey=EKK0391C030
Support option check close"]
    DIS_EKK0341C050["mapKey=EKK0341C050
Equipment provision check close"]
    DIS_ECK0111D010["mapKey=ECK0111D010
Group registration"]
    DIS_EKK0091C020["mapKey=EKK0091C020
eo Hikari Net close SC"]
    DIS_EKK0111C020["mapKey=EKK0111C020
eo Hikari Phone close SC"]
    DIS_EKK0141C020["mapKey=EKK0141C020
eo ADSL close SC"]
    DIS_EKK0171C030["mapKey=EKK0171C030
eo Hikari Net detail close SC"]
    DIS_EKK0191C030["mapKey=EKK0191C030
eo Hikari Phone detail close SC"]
    DIS_EKK0221C030["mapKey=EKK0221C030
eo ADSL detail close SC"]
    DIS_EKK0371C030["mapKey=EKK0371C030
Phone option detail close"]
    DIS_EKK0431C030["mapKey=EKK0431C030
Sub-Phone option detail close"]
    DIS_ETU0011D010["mapKey=ETU0011D010
Banpo construction reg"]
    DIS_EZM0121C010["mapKey=EZM0121C010
Phone number change"]
    DIS_EKKA0020003["mapKey=EKKA0020003
Home device agreement check"]
    DIS_EKKA0020004["mapKey=EKKA0020004
Device no. change"]
    DIS_EKK2541C030["mapKey=EKK2541C030
Priority contract check"]
    DIS_EKK0441C030["mapKey=EKK0441C030
Billing option check"]
    DIS_EKK0441C050["mapKey=EKK0441C050
Billing option check close"]
    DIS_EKK2451C010["mapKey=EKK2451C010
Other provider disc end"]
    DIS_EKK0191C060["mapKey=EKK0191C060
Billing option check"]
    DIS_EKK2451D010["mapKey=EKK2451D010
Other provider disc reg"]
    DIS_EKK2811C030["mapKey=EKK2811C030
Device option service check"]
    DIS_EKK2811C050["mapKey=EKK2811C050
Device option service close"]
    DIS_EKK3131C030["mapKey=EKK3131C030
Construction fee priority"]
    KOJIHI_FLAG["kojihi_kapu_flg = true"]
    DIS_EKK0341C530["mapKey=EKK0341C530
Device contract change reg"]
    GENE_ADD_DTM["Set GENE_ADD_DTM from template"]
    DIS_EKK0341C231["mapKey=EKK0341C231
Device contract change mid"]

    MERGE_ERRORS["errorList.addAll(wkErrorList)"]
    NEXT_LOOP["Next iteration"]
    END_RETURN["Return errorList"]

    START --> INIT --> GET_ARRAY
    GET_ARRAY --> CHECK_NULL
    CHECK_NULL -->|Yes| LOOP_START
    CHECK_NULL -->|No| END_RETURN
    LOOP_START --> CHECK_WKMAP
    CHECK_WKMAP -->|Yes| CREATE_ERROR
    CHECK_WKMAP -->|No| NEXT_LOOP
    CREATE_ERROR --> MERGE_SET --> SIF_RUN --> MERGE_GET --> DISPATCH

    DISPATCH --> DIS_EKK0021C060 --> MERGE_ERRORS
    DISPATCH --> DIS_EKK0091C010 --> MERGE_ERRORS
    DISPATCH --> DIS_EKK0101C010 --> MERGE_ERRORS
    DISPATCH --> DIS_EKK0111C010 --> PPP_NINSHO --> MERGE_ERRORS
    DISPATCH --> DIS_EKK0121C010 --> MERGE_ERRORS
    DISPATCH --> DIS_EKK0141C010 --> MERGE_ERRORS
    DISPATCH --> DIS_EKK0171C010 --> ISP_NINSHO --> MERGE_ERRORS
    DISPATCH --> DIS_EKK0181C010 --> MERGE_ERRORS
    DISPATCH --> DIS_EKK0191C010 --> SIP_USER_ID --> MERGE_ERRORS
    DISPATCH --> DIS_EKK0221C010 --> ADSL_NINSHO --> MERGE_ERRORS
    DISPATCH --> DIS_EKK0361C010 --> GET_MLAD --> MERGE_ERRORS
    DISPATCH --> DIS_EKK0381C010 --> MERGE_ERRORS
    DISPATCH --> DIS_EKK0371C010 --> MERGE_ERRORS
    DISPATCH --> DIS_EKK0391C010 --> MERGE_ERRORS
    DISPATCH --> DIS_EKK0411C020 --> MERGE_ERRORS
    DISPATCH --> DIS_EKK0421C010 --> MERGE_ERRORS
    DISPATCH --> DIS_EKK0431C010 --> MERGE_ERRORS
    DISPATCH --> DIS_EKK0341C030 --> MERGE_ERRORS
    DISPATCH --> DIS_ECK0011C120 --> SHK_EOID --> MERGE_ERRORS
    DISPATCH --> DIS_ECK0021C010 --> MERGE_ERRORS
    DISPATCH --> DIS_ECK0031C010 --> MERGE_ERRORS
    DISPATCH --> DIS_ECK0201D010 --> MERGE_ERRORS
    DISPATCH --> DIS_ECK0201C010 --> MERGE_ERRORS
    DISPATCH --> DIS_ECK0141D010 --> MERGE_ERRORS
    DISPATCH --> DIS_EKKA0020002 --> ERR_CHK1 --> GET_PLACE_NO --> MERGE_ERRORS
    DISPATCH --> DIS_EKK0251C030 --> MERGE_ERRORS
    DISPATCH --> DIS_EKK0341C450 --> MERGE_ERRORS
    DISPATCH --> DIS_EKK0121C020 --> MERGE_ERRORS
    DISPATCH --> DIS_EKK0201C030 --> MERGE_ERRORS
    DISPATCH --> DIS_EKK0361C030 --> GET_AGING_MAP --> MERGE_ERRORS
    DISPATCH --> DIS_EKK0411C040 --> MERGE_ERRORS
    DISPATCH --> DIS_EKK0391C030 --> MERGE_ERRORS
    DISPATCH --> DIS_EKK0341C050 --> MERGE_ERRORS
    DISPATCH --> DIS_ECK0111D010 --> MERGE_ERRORS
    DISPATCH --> DIS_EKK0091C020 --> MERGE_ERRORS
    DISPATCH --> DIS_EKK0111C020 --> MERGE_ERRORS
    DISPATCH --> DIS_EKK0141C020 --> MERGE_ERRORS
    DISPATCH --> DIS_EKK0171C030 --> MERGE_ERRORS
    DISPATCH --> DIS_EKK0191C030 --> MERGE_ERRORS
    DISPATCH --> DIS_EKK0221C030 --> MERGE_ERRORS
    DISPATCH --> DIS_EKK0371C030 --> MERGE_ERRORS
    DISPATCH --> DIS_EKK0431C030 --> MERGE_ERRORS
    DISPATCH --> DIS_ETU0011D010 --> MERGE_ERRORS
    DISPATCH --> DIS_EZM0121C010 --> MERGE_ERRORS
    DISPATCH --> DIS_EKKA0020003 --> ERR_CHK1 --> MERGE_ERRORS
    DISPATCH --> DIS_EKKA0020004 --> ERR_CHK1 --> MERGE_ERRORS
    DISPATCH --> DIS_EKK2541C030 --> ERR_CHK1 --> MERGE_ERRORS
    DISPATCH --> DIS_EKK0441C030 --> MERGE_ERRORS
    DISPATCH --> DIS_EKK0441C050 --> MERGE_ERRORS
    DISPATCH --> DIS_EKK2451C010 --> MERGE_ERRORS
    DISPATCH --> DIS_EKK0191C060 --> MERGE_ERRORS
    DISPATCH --> DIS_EKK2451D010 --> MERGE_ERRORS
    DISPATCH --> DIS_EKK2811C030 --> MERGE_ERRORS
    DISPATCH --> DIS_EKK2811C050 --> MERGE_ERRORS
    DISPATCH --> DIS_EKK3131C030 --> KOJIHI_FLAG --> MERGE_ERRORS
    DISPATCH --> DIS_EKK0341C530 --> GENE_ADD_DTM --> MERGE_ERRORS
    DISPATCH --> DIS_EKK0341C231 --> MERGE_ERRORS
    MERGE_ERRORS --> NEXT_LOOP
    NEXT_LOOP --> LOOP_START
```

### Branch Descriptions

**If (mapKey routing)** - Lines 5789-6176: The core dispatch logic uses a long if-else chain to route to specialized validation mappers. Branches are grouped by business category:

- **Primary service contract checks (mapKey ending in C010)**: eo Hikari Net, eo Hikari TV, eo Hikari Phone, eo Mobile, eo ADSL, and their detail/contents checks
- **Option service contract checks (EKK03xx)**: ISP option, TV option, Phone option, Support option
- **Sub-option service contracts (EKK04xx)**: Sub-ISP, Sub-TV, Sub-Phone
- **Equipment provision services (EKK0341x)**: Equipment contract check, contract change, install loc reflect
- **Customer info changes (ECKxxx)**: Member type change, individual/customer changes, contact registration
- **Contract close operations (mapKey ending in C020/C030/C050)**: Various service contract closures with SC routing (JKKSvkeiShosaCncMapper)
- **Specialized operations**: EKKA0020002 (installation loc no. get), EKKA0020003 (device agreement), EKKA0020004 (device no. change), EKK2541C030 (priority contract), EKK2451C010/D010 (other provider discount), EZM0121C010 (phone number change), EKK3131C030 (construction fee), ETU0011D010 (banpo construction)

Some branches include **agingWorkMap** population:
- EKK0111C010: Stores PPP authentication ID with AGING_SBT_PPP_NINSHO_ID = "012"
- EKK0171C010: Stores ISP authentication ID with AGING_SBT_ISP_NINSHO_ID = "013"
- EKK0191C010: Stores SIP user ID with AGING_SBT_SIP_USER_ID = "014" + SVC_KEI_UCWK_NO
- EKK0221C010: Stores ADSL authentication ID (split at @ sign) with AGING_SBT_ADSL_NINSHO_ID = "015"
- EKK0341C530: Stores GENE_ADD_DTM (generation registration date) back to wkMap
