# Business Logic - JKKKikiIchiranIkkatsuCC.isTknKikiModlSonzaiChk() [707 LOC]

| Field | Value |
|-------|-------|
| Fully Qualified Name | `com.fujitsu.futurity.bp.custom.common.JKKKikiIchiranIkkatsuCC` |
| Layer | CC / Common Component (Controller/Common Component - shared business logic aggregator) |
| Module | `common` (Package: `com.fujitsu.futurity.bp.custom.common`) |

## 1. Role

### JKKKikiIchiranIkkatsuCC.isTknKikiModlSonzaiChk()

This method performs the **indoor equipment logistics inventory existence check** (宅内機器物流在庫存在チェック) - a critical pre-validation gate executed during the equipment list edit screen (明細一覧編集画面) before a customer can finalize changes to indoor device assignments. Its business purpose is to ensure that every device (and its associated B-CAS and C-CAS conditional access modules) intended for delivery has sufficient stock across the logistics chain (manager location, warehouse, shelf).

The method processes all four equipment edit types (device addition, contract cancellation, equipment change, and recovery) by routing to type-specific logic blocks that calculate net inventory impacts (additions increase stock via +1, cancellations reduce stock via -1). It aggregates per-device inventory change requests into a `zaikoCheckMap`, then queries the actual inventory counts via service component, and finally validates against the delivery distribution method: for direct deliveries of new products, missing inventory triggers a blocking error (EKB5850-KW); for direct deliveries of non-new products, missing inventory generates only a warning (EKB5840--Q); for handover (handover delivery) deliveries, missing inventory triggers a blocking error (EKBB680-KW).

Additionally, for STB (Set-Top Box) equipment or non-STB-to-STB upgrades, the method also validates B-CAS and C-CAS card module inventory, with special handling for 4K-STB-to-STB downgrades where B-CAS modules become required again (4K-STBs are B-CAS-free). The method delegates sub-checks across multiple helper methods (getTknKikiButsuryuZaiko, isZaikoNashi, isZaikoDetailChk, setZaikoCheckMap) and follows a routing/dispatch pattern based on `kikiEditKbn` (equipment edit classification). Its role in the larger system is a shared inventory validation utility called from the main equipment list check process (isMeisaiListCheck), ensuring stock availability before any equipment edits are committed.

## 2. Processing Pattern (Detailed Business Logic)

```mermaid
flowchart TD
    START(["isTknKikiModlSonzaiChk"])

    START --> INIT["Initialize: ccMsg, bccas_prc_grp_cd, zaikoCheckMap, zaikoChkList, hddCapaBcasnoneList"]
    INIT --> CHECK_ICHIRAN{"kkiIchiranList != null and not empty?"}

    CHECK_ICHIRAN -->|Yes| LOOP_ICHIRAN["Loop: for i = 0 to kkiIchiranList.size()"]
    CHECK_ICHIRAN -->|No| CHECK_REIREKI{"rirekiList not empty?"}

    LOOP_ICHIRAN --> GET_MAP["Get workIchiranMap, kikiEditKbn, kktk_svc_cd, hddCapaCdBf, hddCapaCdAf"]
    GET_MAP --> SWITCH_EDIT{"kikiEditKbn"}

    SWITCH_EDIT -->|KIKI_ADD = 1 or KISHU_UPD = 4| BRANCH_ADD["Branch 1: Equipment Registration"]
    SWITCH_EDIT -->|KAI_CAN = 3| BRANCH_CAN["Branch 2: Contract Cancellation"]
    SWITCH_EDIT -->|KIKI_UPD = 2| BRANCH_UPD["Branch 3: Equipment Change"]
    SWITCH_EDIT -->|KIKI_KAIFUKU = 15| BRANCH_KAI["Branch 4: Recovery"]
    SWITCH_EDIT -->|Other| SKIP_ITER["continue to next iteration"]

    BRANCH_ADD --> ADD_HAISOU{"isHaisoKikiHantei?"}
    ADD_HAISOU -->|No| SKIP_ITER
    ADD_HAISOU -->|Yes| ADD_TKMODEL{"tkModelCd != empty?"}
    ADD_TKMODEL -->|No| SKIP_ITER
    ADD_TKMODEL -->|Yes| ADD_KOJICOMP{"knriPlcSkbtCd != KOJICOMP = 2?"}
    ADD_KOJICOMP -->|No| SKIP_ITER
    ADD_KOJICOMP -->|Yes| ADD_SET["setZaikoCheckMap(main device, +1)"]
    ADD_SET --> ADD_STB{"kktk_svc_cd == stb_kktk_svc_cd?"}
    ADD_STB -->|Yes| ADD_BCAS{"KIKI_ADD or KISHU_UPD+JUUSHO?"}
    ADD_BCAS -->|Yes| ADD_HDD{"4K-STB? hddCapaBcasnoneList.contains(hddCapaCdAf)?"}
    ADD_HDD -->|No| ADD_BCAS_SET["setZaikoCheckMap(B-CAS, +1)"]
    ADD_HDD -->|Yes| ADD_CCAS_SET["setZaikoCheckMap(C-CAS, +1)"]
    ADD_BCAS_SET --> ADD_CCAS_SET
    ADD_CCAS_SET --> ADD_ADD["Add to zaikoChkList"]
    ADD_BCAS -->|No| ADD_CCAS_SET
    ADD_STB -->|No| ADD_ADD
    ADD_ADD --> LOOP_END1{"i < size?"}

    BRANCH_CAN --> CAN_MODEL{"tkModelCd != empty?"}
    CAN_MODEL -->|No| SKIP_ITER
    CAN_MODEL -->|Yes| CAN_KOJICOMP{"KOJICOMP check?"}
    CAN_KOJICOMP -->|Yes| SKIP_ITER
    CAN_KOJICOMP -->|No| CAN_HAISOU{"haisoStat == UKEDUMI = 001?"}
    CAN_HAISOU -->|No| SKIP_ITER
    CAN_HAISOU -->|Yes| CAN_SOKOTANA["getSokoTana resolve location"]
    CAN_SOKOTANA --> CAN_STB2{"kktk_svc_cd == stb_kktk_svc_cd?"}
    CAN_STB2 -->|Yes| CAN_MINUS["setZaikoCheckMapStbDataMinus (minus B-CAS/C-CAS)"]
    CAN_STB2 -->|No| CAN_MINUS_MAIN["setZaikoCheckMap(tkModelCd, false/-1)"]

    BRANCH_UPD --> UPD_SKIP1{"khk_um == KAIFUKU = 1?"}
    UPD_SKIP1 -->|Yes| SKIP_ITER
    UPD_SKIP1 -->|No| UPD_SKIP2{"rtr_khk_um == KAIFUKU = 1?"}
    UPD_SKIP2 -->|Yes| SKIP_ITER
    UPD_SKIP2 -->|No| UPD_SKIP3{"tknSbtCd == BCAS = B0 or CCAS?"}
    UPD_SKIP3 -->|Yes| SKIP_ITER
    UPD_SKIP3 -->|No| UPD_HAISOU{"haisoStat == UKEDUMI?"}
    UPD_HAISOU -->|Yes| UPD_MINUS["setZaikoCheckMap(tkModelCd, -1)"]
    UPD_HAISOU -->|No| UPD_HAISOU2{"isHaisoKikiHantei?"}
    UPD_HAISOU2 -->|Yes| UPD_PLUS["setZaikoCheckMap(main, +1)"]
    UPD_PLUS --> UPD_NONSTB{"kktk_svc_cd_bf != stb && kktk_svc_cd == stb?"}
    UPD_NONSTB -->|Yes| UPD_BCAS2{"4K-STB check for B-CAS"}
    UPD_BCAS2 --> UPD_CCAS2["setCcasCheckMap"]
    UPD_BCAS2 -->|No| UPD_CCAS2
    UPD_CCAS2 --> UPD_ADD["Add to zaikoChkList"]
    UPD_HAISOU2 -->|No| LOOP_END1
    UPD_MINUS --> UPD_HAISOU2

    BRANCH_KAI --> KAI_STAT{"kktkSvcKeiStatKaifukuAf != TEIKYOCHU = 100?"}
    KAI_STAT -->|No| SKIP_ITER
    KAI_STAT -->|Yes| KAI_HAISOU{"isHaisoKikiHantei?"}
    KAI_HAISOU -->|Yes| KAI_SET["setZaikoCheckMap(+1)"]
    KAI_HAISOU -->|No| LOOP_END1
    KAI_SET --> KAI_ADD["Add to zaikoChkList"]

    LOOP_END1 -->|Yes| CHECK_REIREKI
    LOOP_END1 -->|No| LOOP_ICHIRAN

    CHECK_REIREKI -->|Yes| LOOP_REIREKI["Loop: for each rirekiData in rirekiList"]
    LOOP_REIREKI --> RI_HAISOU{"haiso_stat == UKEDUMI?"}
    RI_HAISOU -->|No| RI_CONTINUE["continue"]
    RI_HAISOU -->|Yes| RI_RIREKI["getKktkSvcKeiRireki"]
    RI_RIREKI --> RI_MODEL{"modelCd != empty?"}
    RI_MODEL -->|No| RI_CONTINUE
    RI_MODEL -->|Yes| RI_KOJICOMP{"KOJICOMP?"}
    RI_KOJICOMP -->|Yes| RI_CONTINUE
    RI_KOJICOMP -->|No| RI_SOKOTANA["getSokoTana + setZaikoCheckMap(-1)"]
    RI_SOKOTANA --> RI_CURR["getKikiTkSvcKeiInfo"]
    RI_CURR --> RI_HDD_CHK{"4K-STB cancel check"}
    RI_HDD_CHK --> RI_CONTINUE2["continue"]
    RI_HDD_CHK -->|Yes| RI_BCAS_MINUS["setZaikoCheckMap B-CAS (-1)"]
    RI_BCAS_MINUS --> RI_CONTINUE2
    RI_CONTINUE2 --> RI_END{"End of rirekiList?"}
    RI_END -->|No| LOOP_REIREKI
    RI_END -->|Yes| CHECK_ZAIKO2

    CHECK_ZAIKO2 -->|Empty| RETURN_TRUE["Return true"]
    CHECK_ZAIKO2 -->|Not empty| SAVE_MAP["temporaryData.put(ZAIKO_RENKEI_SU_KEY)"]
    SAVE_MAP --> FETCH_ZAIKO["getTknKikiButsuryuZaiko"]
    FETCH_ZAIKO --> FETCH_NULL{"result == null?"}
    FETCH_NULL -->|Yes| RETURN_FALSE["Return false"]
    FETCH_NULL -->|No| CALC_ZAIKO["Loop: setZaikoSuData for each"]
    CALC_ZAIKO --> MAIN_LOOP["for each zaikoChkList: detail check"]
    MAIN_LOOP --> MAIN_DETAIL["isZaikoDetailChk()"]
    MAIN_DETAIL --> MAIN_STB{"Non-STB to STB?"}
    MAIN_STB -->|Yes| MAIN_BCAS["Check B-CAS and C-CAS"]
    MAIN_STB -->|No| MAIN_DISTRIBUTION{"haiso_div_edit == CHOKUSO = 00?"}
    MAIN_BCAS --> MAIN_DISTRIBUTION
    MAIN_DISTRIBUTION -->|Yes| MAIN_DIRECT{"isHanbaiSbtNew?"}
    MAIN_DIRECT -->|Yes| MAIN_ERR["Error EKB5850-KW + return false"]
    MAIN_DIRECT -->|No| MAIN_WARN{"func_code == 2?"}
    MAIN_WARN -->|Yes| MAIN_WARNING["Warning EKB5840--Q, continue"]
    MAIN_WARN -->|No| MAIN_HANDOVER["Error EKBB680-KW + return false"]
    MAIN_WARNING --> MAIN_LOOP_END
    MAIN_HANDOVER --> MAIN_LOOP_END
    MAIN_ERR --> RETURN_FALSE2["Return false"]
    MAIN_LOOP_END --> MAIN_END{"End?"}
    MAIN_END -->|No| MAIN_LOOP
    MAIN_END -->|Yes| RETURN_TRUE2["Return true"]
```

**Key constant values resolved:**

| Constant | Value | Business Meaning |
|----------|-------|-----------------|
| `KIKI_EDIT_KBN_KIKI_ADD` | "1" | Equipment addition (機器追加) |
| `KIKI_EDIT_KBN_KISHU_UPD` | "4" | Equipment type change (機種変更) |
| `KIKI_EDIT_KBN_KAI_CAN` | "3" | Contract cancellation (解約キャンセル) |
| `KIKI_EDIT_KBN_KIKI_UPD` | "2" | Equipment change (機器変更) |
| `KIKI_EDIT_KBN_KIKI_KAIFUKU` | "15" | Recovery (復旧) |
| `HAISO_STAT_UKEDUMI` | "001" | Delivery status: accepted/order received (配送状態: 受注済) |
| `HAISO_KBN_CHOKUSO` | "00" | Delivery method: direct (配送区分: 直送) |
| `KNRI_PLC_SKBT_CD_KOJICOMP` | "2" | Manager location: construction company (管理場所識別コード: 工事会社) |
| `KOJIAK_SBT_CD_JUUSHOHENKOU` | "003" | Work type: address change (工事種別: 住所変更) |
| `KIKI_KAIFUKU_TAISHO_KAIFUKU` | "1" | Recovery target: recovery (復旧対象: 復旧) |
| `KIKISV_STAT_TEIKYOCHU` | "100" | Service status: in service (サービス提供中) |
| `FUNC_CODE_2` | "2" | Function code: check-only (检查专用) |
| `TAKNKIKI_SBT_CD_BCAS` | "B0" | Indoor device subtype: B-CAS |
| `TAKNKIKI_SBT_CD_CCAS` | "C0" | Indoor device subtype: C-CAS |
| `ERR_FLG_ERR` | "E" | Error flag |
| `ERR_FLG_WARNING` | "W" | Warning flag |

## 3. Parameter Analysis

| No | Parameter Name | Type | Business Description |
|----|---------------|------|---------------------|
| 1 | `handle` | `SessionHandle` | Database session handle used for all service component calls and CBS queries. Represents the database transaction context for inventory lookups. |
| 2 | `scCall` | `ServiceComponentRequestInvoker` | Service Component request invoker that dispatches calls to backend service components (e.g., JBSbatDKNyukaFinAdd, JBSbatDKTanaMoveShkaCmpAdd). Enables cross-component data retrieval. |
| 3 | `param` | `IRequestParameterReadWrite` | Request parameter object carrying screen input data, business parameters, and request metadata. Used to retrieve business parameters like `KK_BCCAS_PRC_GRP_CD` and HDD capacity code lists. |
| 4 | `dataMapKey` | `String` | Key used to retrieve the screen data map (`ccMsg`) from the parameter object. This map holds all screen-level state including the equipment list, delivery info, and function code. |
| 5 | `temporaryData` | `HashMap<String, Object>` | Temporary storage map holding post-change equipment model list (`TMP_TAKNKIKI_MODEL_LIST_NEW`), inventory linkage map output (`ZAIKO_RENKEI_SU_KEY`), and other transient state across the equipment list processing pipeline. |
| 6 | `kikiTkListBf` | `ArrayList<CAANMsg>` | Pre-change equipment service contract list - contains the original (before-edit) state of each equipment item. Used to extract pre-change model codes, HDD capacity codes, and service contract details for inventory delta calculations. |

**Instance fields / external state read by this method:**
- No instance fields are directly read; all state is passed through parameters.

## 4. CRUD Operations / Called Services

| CRUD | SC / CBS | SC Code | Entity / DB | Operation Description |
|------|----------|---------|-------------|----------------------|
| R | `getBuisinessParameter` | N/A | In-memory business params | Retrieves business parameters from server-side configuration (e.g., BCCAS processing group code, HDD capacity code list for BCAS-free devices) |
| R | `getSvcBetTknKikiKoh` | EKK1861B001 | KKM_M_TKNKIKI_KOH (Indoor equipment type candidates) | Queries service-type indoor equipment type candidate list (B-CAS) - EKK1861B001CBS |
| R | `getTknKikiModel` | N/A | In-memory list lookup | Extracts model code from equipment candidate list for B-CAS and C-CAS modules |
| R | `getIchiranMap` | N/A | In-memory map | Retrieves equipment list row map for processing |
| C | `execEKU0011A010` | EKU0011A010 | KK_T_ODR_KOJIAK (Work order contract) | Executes work order contract data retrieval when processing work-order-based equipment changes (KOJIAK_NO processing) |
| R | `getNullToStr` | N/A | In-memory conversion | Null-safe string conversion utility for map lookups |
| R | `isHaisoKikiHantei` | N/A | In-memory判断 | Determines if equipment data is designated for delivery based on delivery status flags |
| C | `setZaikoCheckMap` | N/A | In-memory map | Adds inventory change entries to the check map (+1 for additions, -1 for cancellations) |
| C | `setZaikoCheckMapStbDataMinus` | N/A | In-memory map | Minus STB B-CAS/C-CAS inventory data for contract cancellation |
| R | `getSokoTana` | N/A | In-memory calculation | Resolves manager location code to warehouse/shelf codes based on delivery location settings |
| C | `execEKK0341B501` | EKK0341B501 | KK_T_KKTK_SVC_KEI (Service contract header) | Retrieves STB service contract details for cancellation processing |
| C | `getKktkSvcKeiRireki` | N/A | KK_T_KKTK_SVC_KEI (Historical) | Retrieves service contract historical data for history cancellation processing |
| C | `getKikiTkSvcKeiInfo` | N/A | KK_T_KKTK_SVC_KEI (Current) | Retrieves current service contract info for HDD capacity comparison during history cancellation |
| R | `getTknKikiButsuryuZaiko` | EKKA0020005 | KK_T_SOKO_ZAIKO (Warehouse inventory) | Queries actual indoor equipment inventory counts by location and model code |
| - | `setZaikoSuData` | N/A | In-memory map | Calculates net inventory numbers by adding/subtracting change amounts to actual stock |
| R | `isZaikoDetailChk` | N/A | In-memory check | Performs per-device inventory existence check by comparing calculated stock against zero |
| R | `isZaikoNashi` | N/A | In-memory check | Checks if calculated inventory is less than zero (stockout) |
| R | `isHanbaiSbtNew` | N/A | In-memory check | Determines if sales type code indicates new product (sales type code "12") |
| - | `setMessageInfo` | N/A | In-memory message | Sets error or warning messages on the screen message map with error code and device model |

## 5. Dependency Trace

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

No screen/batch entry points found within 8 hops. Direct callers found: 1 method.

| # | Caller (Screen/Batch) | Call Chain (Full Path to this Method) | Terminal (SC / CRUD / Entity) |
|---|----------------------|--------------------------------------|-------------------------------|
| 1 | Method: `JKKKikiIchiranIkkatsuCC.isMeisaiListCheck()` | `isMeisaiListCheck` -> `isTknKikiModlSonzaiChk` | `setMessageInfo` [-] x9, `isHanbaiSbtNew` [R], `isZaikoNashi` [R] x3, `getNullToStr` [R] x6, `isZaikoDetailChk` [R] |

**Analysis:** This method is called from the same class's `isMeisaiListCheck()` method, which performs the main equipment list validation orchestration. It is not directly invoked by any screen (KKSV*) or batch entry point. The method operates as an internal validation subroutine within the equipment list batch processing pipeline. Terminal operations are all in-memory checks (`setMessageInfo`, `isHanbaiSbtNew`, `isZaikoNashi`, `isZaikoDetailChk`, `getNullToStr`) with no direct database or screen output beyond message setting.

## 6. Per-Branch Detail Blocks

**Block 1** — INIT (L16344)
> Initialize all working data structures, constants, and pre-fetch B-CAS related data.

| # | Type | Code |
|---|------|------|
| 1 | SET | `ccMsg = param.getData(dataMapKey)` |
| 1 | CALL | `bccas_prc_grp_cd = getBuisinessParameter(handle, scCall, param, dataMapKey, "KK_BCCAS_PRC_GRP_CD")` |
| 2 | CALL | `ekk1861b001CBSMsg1list = getSvcBetTknKikiKoh(handle, scCall, param, dataMapKey, ccMsg, bccas_prc_grp_cd)` // Service-type indoor equipment candidate list (EKK1861B001) |
| 3 | SET | `bcasModelCd = getTknKikiModel(ekk1861b001CBSMsg1list, ccMsg.get("tk_sbt_cd_bcas"))` |
| 4 | SET | `ccasModelCd = getTknKikiModel(ekk1861b001CBSMsg1list, ccMsg.get("tk_sbt_cd_ccas"))` |
| 5 | SET | `kkiIchiranList = (ArrayList<HashMap>)ccMsg.get(IN_KK_ICHIRAN_LIST)` |
| 6 | SET | `zaikoCheckMap = new HashMap<>()` // Inventory check accumulator |
| 7 | SET | `zaikoChkList = new ArrayList<>()` // Inventory check target list |
| 8 | SET | `stb_kktk_svc_cd = (String)ccMsg.get("stb_kktk_svc_cd")` |
| 9 | SET | `tknKikiMdlListAf = (ArrayList)temporaryData.get(TMP_TAKNKIKI_MODEL_LIST_NEW)` // Post-change model list |
| 10 | SET | `hddCapaBcasnoneList = Arrays.asList(getBuisinessParameter(..., JKKStrConst.KK_HDD_CAPA_BCASNONE).split(","))` // 4K-STB (B-CAS-free) HDD capacity codes |

**Block 2** — IF (outer loop guard: kkiIchiranList != null && not empty) (L16426)
> Check if there is equipment list data to process. If empty, skip to inventory check.

| # | Type | Code |
|---|------|------|
| 1 | EXEC | Guard check: `kkiIchiranList != null && !kkiIchiranList.isEmpty()` |

**Block 2.1** — FOR (inner loop: i = 0 to kkiIchiranList.size()) (L16430)
> Iterate over each equipment item in the list.

| # | Type | Code |
|---|------|------|
| 1 | SET | `ekk0341a010cbsMsg = kikiTkListBf.get(i)` // Pre-change data |
| 2 | SET | `ezm0411a010cbsMsgAf = tknKikiMdlListAf.get(i)` // Post-change model data |
| 3 | SET | `workIchiranMap = getIchiranMap(kkiIchiranList.get(i))` |
| 4 | SET | `kikiEditKbn = (String)workIchiranMap.get("kiki_edit_kbn")` |
| 5 | SET | `kktk_svc_cd = getNullToStr(workIchiranMap.get("kktk_svc_cd"))` |

**Block 2.1.1** — SET (kojiak processing) (L16450)
> Resolve work order subtype code with caching.

| # | Type | Code |
|---|------|------|
| 1 | SET | `kojiak_no_ichiran_edit = getNullToStr(workIchiranMap.get("kojiak_no_ichiran_edit"))` |
| 2 | IF | `kojiak_no_ichiran_edit` is not empty (L16452) |
| 3 | IF-ELSE | `kojiAkMap.containsKey(kojiak_no_ichiran_edit)` (L16454) |
| 4 | SET | `workKojiAkMap = (HashMap)kojiAkMap.get(kojiak_no_ichiran_edit)` |
| 5 | SET | `kojiakSbtCd = workKojiAkMap.get("KOJIAK_SBT_CD")` |
| 6 | ELSE | |
| 7 | CALL | `eku0011A010cbsMsg1list = execEKU0011A010(handle, scCall, param, kojiak_no_ichiran_edit, dataMapKey)` // Work order data |
| 8 | IF | `eku0011A010cbsMsg1list == null || length == 0` (L16464) |
| 9 | SET | `kojiakSbtCd = ""` |
| 10 | ELSE | |
| 11 | SET | `kojiAkMap.put(kojiak_no_ichiran_edit, eku0011A010cbsMsg1list[0].getHashMap())` // Cache result |
| 12 | SET | `kojiakSbtCd = eku0011A010cbsMsg1list[0].getString("KOJIAK_SBT_CD")` |

**Block 3** — IF/ELSE-IF chain (kikiEditKbn routing) (L16503)
> Main processing branch: dispatch based on equipment edit type.

**Block 3.1** — IF `KIKI_EDIT_KBN_KIKI_ADD = "1" || KIKI_EDIT_KBN_KISHU_UPD = "4"` (L16503)
> Branch: Equipment Registration (device addition or equipment type change)

| # | Type | Code |
|---|------|------|
| 1 | SET | `tkModelCd = getNullToStr(workIchiranMap.get("taknkiki_model_cd_edit"))` |
| 2 | IF | `tkModelCd == ""` (L16507) |
| 3 | EXEC | `continue` |
| 4 | CALL | `isHaisoKikiHantei(param, dataMapKey, workIchiranMap, temporaryData)` // Is equipment designated for delivery? |
| 5 | IF-THEN | Delivery designated (L16513) |
| 6 | SET | `knriPlcSkbtCd = getNullToStr(workIchiranMap.get("kriplace_skcd"))` |
| 7 | IF | `knriPlcSkbtCd != KOJICOMP = "2"` (L16516) |
| 8 | SET | `sokoCd = getNullToStr(workIchiranMap.get("kiki_hkat_shitei_soko_cd_edit"))` |
| 9 | SET | `tanaCd = getNullToStr(workIchiranMap.get("sokodana_cd"))` |
| 10 | SET | `tkModelCd = getNullToStr(workIchiranMap.get("taknkiki_model_cd_edit"))` |
| 11 | CALL | `setZaikoCheckMap(zaikoCheckMap, knriPlcSkbtCd, sokoCd, tanaCd, tkModelCd, true)` // +1 inventory for main device |
| 12 | IF | `stb_kktk_svc_cd.equals(kktk_svc_cd)` (L16524) // STB equipment? |
| 13 | IF | `KIKI_ADD = "1" || (KISHU_UPD = "4" && KOJIAK_SBT_CD_JUUSHOHENKOU = "003")` (L16535) // Device add or type change with address change |
| 14 | IF | `!hddCapaBcasnoneList.contains(hddCapaCdAf)` (L16540) // NOT 4K-STB (B-CAS required) |
| 15 | CALL | `setZaikoCheckMap(zaikoCheckMap, knriPlcSkbtCd, sokoCd, tanaCd, bcasModelCd, true)` // +1 B-CAS |
| 16 | ELSE-IF | `KISHU_UPD = "4" && hddCapaBcasnoneList.contains(hddCapaCdBf) && !hddCapaBcasnoneList.contains(hddCapaCdAf)` (L16553) // Type change: 4K-STB -> STB (B-CAS now needed) |
| 17 | CALL | `setZaikoCheckMap(zaikoCheckMap, knriPlcSkbtCd, sokoCd, tanaCd, bcasModelCd, true)` // +1 B-CAS |
| 18 | CALL | `setZaikoCheckMap(zaikoCheckMap, knriPlcSkbtCd, sokoCd, tanaCd, ccasModelCd, true)` // +1 C-CAS |
| 19 | SET | `workIchiranMap.put(KEY_KOJI_AK_SBT_CD + "ZAIKO", kojiakSbtCd)` |
| 20 | SET | `workIchiranMap.put("hdd_capa_cd_bf", hddCapaCdBf)` |
| 21 | SET | `workIchiranMap.put("hdd_capa_cd_af", hddCapaCdAf)` |
| 22 | SET | `workIchiranMap.put("ZAIKO_CHK_INDEX", "" + i)` |
| 23 | CALL | `zaikoChkList.add(workIchiranMap)` |

**Block 3.2** — ELSE-IF `KIKI_EDIT_KBN_KAI_CAN = "3"` (L16592)
> Branch: Contract Cancellation (解約キャンセル)

| # | Type | Code |
|---|------|------|
| 1 | SET | `haisoStat = getNullToStr(workIchiranMap.get("haiso_stat_bf"))` |
| 2 | IF | `HAISO_STAT_UKEDUMI = "001".equals(haisoStat)` (L16598) // Delivery accepted? |
| 3 | SET | `tkModelCd = getNullToStr(ekk0341a010cbsMsg.getString(EKK0341A010CBSMsg1List.TAKNKIKI_MODEL_CD))` |
| 4 | IF | `tkModelCd != ""` (L16601) |
| 5 | IF | `knriPlcSkbtCd != KOJICOMP = "2"` (L16605) |
| 6 | CALL | `sokoTanaMap = getSokoTana(...)` // Resolve delivery location to warehouse/shelf |
| 7 | SET | `knriPlcSkbtCd = sokoTanaMap.get(TMP_KRIPLACE_SKCD)` |
| 8 | SET | `sokoCd = sokoTanaMap.get(TMP_SOKO_CD)` |
| 9 | SET | `tanaCd = sokoTanaMap.get(TMP_SKDN_CD)` |
| 10 | IF | `stb_kktk_svc_cd.equals(kktk_svc_cd)` (L16620) // STB? |
| 11 | SET | `svc_kei_ucwk_no_bf = getNullToStr(ekk0341a010cbsMsg.getString(EKK0341A010CBSMsg1List.SVC_KEI_UCWK_NO))` |
| 12 | CALL | `ekk0341b501MsgList = execEKK0341B501(handle, scCall, param, temporaryData, dataMapKey, svc_kei_ucwk_no_bf)` |
| 13 | CALL | `setZaikoCheckMapStbDataMinus(...)` // Minus STB B-CAS/C-CAS |
| 14 | ELSE | |
| 15 | CALL | `setZaikoCheckMap(zaikoCheckMap, knriPlcSkbtCd, sokoCd, tanaCd, tkModelCd, false)` // -1 inventory for main device |

**Block 3.3** — ELSE-IF `KIKI_EDIT_KBN_KIKI_UPD = "2"` (L16644)
> Branch: Equipment Change (機器変更)

| # | Type | Code |
|---|------|------|
| 1 | IF | `KIKI_KAIFUKU_TAISHO_KAIFUKU = "1".equals(workIchiranMap.get("khk_um"))` (L16648) // Recovery target? |
| 2 | EXEC | `continue` |
| 3 | IF | `KIKI_KAIFUKU_TAISHO_KAIFUKU = "1".equals(workIchiranMap.get("rtr_khk_um"))` (L16656) // Router recovery? |
| 4 | EXEC | `continue` |
| 5 | SET | `tknSbtCd = getNullToStr(ekk0341a010cbsMsg.getString(EKK0341A010CBSMsg1List.TAKNKIKI_SBT_CD))` |
| 6 | IF | `TAKNKIKI_SBT_CD_BCAS = "B0".equals(tknSbtCd) || TAKNKIKI_SBT_CD_CCAS = "C0".equals(tknSbtCd)` (L16666) // B-CAS or C-CAS? |
| 7 | EXEC | `continue` |
| 8 | IF | `HAISO_STAT_UKEDUMI = "001".equals(haisoStat)` (L16673) // Pre-change minus: delivery accepted? |
| 9 | IF | `knriPlcSkbtCd != KOJICOMP = "2"` (L16677) |
| 10 | CALL | `sokoTanaMap = getSokoTana(...)` |
| 11 | SET | `knriPlcSkbtCd, sokoCd, tanaCd` from sokoTanaMap |
| 12 | SET | `tkModelCd = getNullToStr(ekk0341a010cbsMsg.getString(TAKNKIKI_MODEL_CD))` |
| 13 | CALL | `setZaikoCheckMap(zaikoCheckMap, knriPlcSkbtCd, sokoCd, tanaCd, tkModelCd, false)` // -1 pre-change |
| 14 | IF | `isHaisoKikiHantei(...)` (L16696) // Post-change: designated for delivery? |
| 15 | SET | `knriPlcSkbtCd = getNullToStr(workIchiranMap.get("kriplace_skcd"))` |
| 16 | IF | `knriPlcSkbtCd != KOJICOMP = "2"` (L16700) |
| 17 | SET | `sokoCd, tanaCd, tkModelCd` from workIchiranMap |
| 18 | CALL | `setZaikoCheckMap(zaikoCheckMap, knriPlcSkbtCd, sokoCd, tanaCd, tkModelCd, true)` // +1 post-change |
| 19 | SET | `kktk_svc_cd_bf = getNullToStr(ekk0341a010cbsMsg.getString(KKTK_SVC_CD))` |
| 20 | SET | `workIchiranMap.put("ZAIKO_CHK_INDEX", "" + i)` |
| 21 | SET | `workIchiranMap.put("ZAIKO_CHK_KKTK_SVC_CD_BF", kktk_svc_cd_bf)` |
| 22 | CALL | `zaikoChkList.add(workIchiranMap)` |
| 23 | IF | `kktk_svc_cd_bf != stb && kktk_svc_cd == stb` (L16711) // Non-STB to STB change? |
| 24 | IF | `!hddCapaBcasnoneList.contains(hddCapaCdAf)` (L16714) // NOT 4K-STB |
| 25 | CALL | `setZaikoCheckMap(zaikoCheckMap, knriPlcSkbtCd, sokoCd, tanaCd, bcasModelCd, true)` // +1 B-CAS |
| 26 | CALL | `setZaikoCheckMap(zaikoCheckMap, knriPlcSkbtCd, sokoCd, tanaCd, ccasModelCd, true)` // +1 C-CAS |

**Block 3.4** — ELSE-IF `KIKI_EDIT_KBN_KIKI_KAIFUKU = "15"` (L16728)
> Branch: Recovery (復旧) - Restore equipment after cancellation

| # | Type | Code |
|---|------|------|
| 1 | SET | `kktkSvcKeiStatKaifukuAf = getNullToStr(workIchiranMap.get(KKTK_SVC_KEI_STAT_KAIFUKU_AF))` |
| 2 | IF | `!KIKISV_STAT_TEIKYOCHU = "100".equals(kktkSvcKeiStatKaifukuAf)` (L16756) // Not in-service? |
| 3 | CALL | `isHaisoKikiHantei(...)` |
| 4 | IF-THEN | Delivery designated (L16759) |
| 5 | SET | `knriPlcSkbtCd = getNullToStr(workIchiranMap.get("kriplace_skcd"))` |
| 6 | IF | `knriPlcSkbtCd != KOJICOMP = "2"` (L16761) |
| 7 | SET | `sokoCd, tanaCd, tkModelCd` from workIchiranMap |
| 8 | CALL | `setZaikoCheckMap(zaikoCheckMap, knriPlcSkbtCd, sokoCd, tanaCd, tkModelCd, true)` // +1 |
| 9 | SET | `workIchiranMap.put("ZAIKO_CHK_INDEX", "" + i)` |
| 10 | CALL | `zaikoChkList.add(workIchiranMap)` |

**Block 4** — IF/ELSE (rirekiList processing) (L16768)
> Process history cancellation entries: for each historical record, minus its inventory.

| # | Type | Code |
|---|------|------|
| 1 | SET | `rirekiList = (ArrayList)ccMsg.get("rireki_list")` |
| 2 | IF | `!rirekiList.isEmpty()` (L16775) |
| 3 | FOR | For each `rirekiData` in `rirekiList` |
| 4 | SET | `haiso_stat = rirekiData.get("haiso_stat")` |
| 5 | IF | `HAISO_STAT_UKEDUMI = "001".equals(haiso_stat)` (L16781) |
| 6 | ELSE | `continue` |
| 7 | CALL | `ekk0341a010cbsMsg = getKktkSvcKeiRireki(...)` // Historical service contract data |
| 8 | IF | `getNullToStr(ekk0341a010cbsMsg.getString(TAKNKIKI_MODEL_CD)) == ""` (L16793) |
| 9 | EXEC | `continue` |
| 10 | IF | `KNRI_PLC_SKBT_CD_KOJICOMP = "2".equals(...KIKI_STI_JI_KRIPLACE_SKCD)` (L16799) // Construction company? |
| 11 | EXEC | `continue` |
| 12 | CALL | `sokoTanaMap = getSokoTana(...)` |
| 13 | CALL | `setZaikoCheckMap(zaikoCheckMap, knriPlcSkbtCd, sokoCd, tanaCd, tkModelCd, false)` // -1 inventory |
| 14 | CALL | `ekk0341a010cbsMsgCur = getKikiTkSvcKeiInfo(...)` // Current service contract info |
| 15 | IF | `ekk0341a010cbsMsgCur != null` (L16813) |
| 16 | SET | `hddCapaCdBf = ekk0341a010cbsMsg.getString(HDD_CAPA_CD)` |
| 17 | SET | `hddCapaCdAf = ekk0341a010cbsMsgCur.getString(HDD_CAPA_CD)` |
| 18 | IF | `!hddCapaBcasnoneList.contains(hddCapaCdBf) && hddCapaBcasnoneList.contains(hddCapaCdAf)` (L16822) // 4K-STB -> STB cancel |
| 19 | CALL | `setZaikoCheckMap(zaikoCheckMap, knriPlcSkbtCd, sokoCd, tanaCd, bcasModelCd, false)` // -1 B-CAS |

**Block 5** — IF (empty check) (L16831)
> If no inventory items need checking, return true immediately.

| # | Type | Code |
|---|------|------|
| 1 | IF | `zaikoCheckMap.isEmpty()` (L16833) |
| 2 | RETURN | `true` (no data to check - valid) |

**Block 6** — POST-ZAIKO SETUP (L16837)
> Save accumulated inventory check map for downstream use.

| # | Type | Code |
|---|------|------|
| 1 | SET | `temporaryData.put(ZAIKO_RENKEI_SU_KEY, zaikoCheckMap)` |

**Block 7** — INVENTORY DATA FETCH (L16841)
> Query actual inventory from warehouse system.

| # | Type | Code |
|---|------|------|
| 1 | CALL | `ekka0020005CBSMsg2list = getTknKikiButsuryuZaiko(handle, scCall, param, dataMapKey, temporaryData)` |
| 2 | IF | `ekka0020005CBSMsg2list == null` (L16845) |
| 3 | RETURN | `false` (inventory fetch failure) |

**Block 8** — INVENTORY CALCULATION LOOP (L16852)
> Calculate net inventory for each location-model combination.

| # | Type | Code |
|---|------|------|
| 1 | FOR | For each `ekka0020005CBSMsg2list[i]` |
| 2 | SET | `knriPlcSkbtCd = ekka.getString(KNRI_PLC_SKBT_CD)` |
| 3 | SET | `sokoCd = ekka.getString(KNRI_PLC_CD)` |
| 4 | SET | `tanaCd = ekka.getString(KNRI_PLC_SLF_CD)` |
| 5 | SET | `tkModelCd = ekka.getString(TK_MDL_CD)` |
| 6 | CALL | `zaikoKikiMap = zaikoCheckMap.get(getZaikoChkKikiMapKey(knriPlcSkbtCd, sokoCd, tanaCd, tkModelCd))` |
| 7 | CALL | `setZaikoSuData(zaikoKikiMap, ekka)` // Add actual stock to check map |

**Block 9** — MAIN INVENTORY VALIDATION LOOP (L16870)
> Validate inventory for each item in zaikoChkList against delivery method.

| # | Type | Code |
|---|------|------|
| 1 | FOR | For each item in `zaikoChkList` |
| 2 | SET | Reset flags: `ichiranChk = true, bCasChk = true, cCasChk = true` |
| 3 | SET | `workIchiranMap = zaikoChkList.get(i)` |
| 4 | SET | `kikiEditKbn = (String)workIchiranMap.get("kiki_edit_kbn")` |
| 5 | SET | `kktk_svc_cd, kktk_svc_cd_bf, haiso_div_edit, taknkikiModelCdEdit` from workIchiranMap |
| 6 | CALL | `ichiranChk = isZaikoDetailChk(workIchiranMap, zaikoCheckMap)` |
| 7 | IF | Non-STB to STB change: `kktk_svc_cd_bf != stb && kktk_svc_cd == stb` (L16905) |
| 8 | CALL | `bCasChk = isZaikoNashi(..., bcasModelCd)` with 4K-STB logic (L16915-L16939) |
| 9 | CALL | `cCasChk = isZaikoNashi(..., ccasModelCd)` |
| 10 | IF | `HAISO_KBN_CHOKUSO = "00".equals(haiso_div_edit)` (L16954) // Direct delivery? |
| 11 | IF | `isHanbaiSbtNew(workIchiranMap)` (L16958) // New product? |
| 12 | IF | `ichiranChk == false` |
| 13 | CALL | `setMessageInfo(ccMsg, "EKB5850-KW", "", "", ERR_FLG_ERR = "E")` |
| 14 | RETURN | `false` |
| 15 | ELSE-IF | Non-new product direct delivery (L16972) |
| 16 | IF | `FUNC_CODE_2 = "2".equals(ccMsg.get("func_code"))` // Check-only mode |
| 17 | CALL | `setMessageInfo(ccMsg, "EKB5840--Q", "", "", ERR_FLG_WARNING = "W")` // Warning only |
| 18 | ELSE | Handover delivery (L16989) |
| 19 | IF | Any of ichiranChk/bCasChk/cCasChk is false |
| 20 | CALL | `setMessageInfo(ccMsg, "EKBB680-KW", taknkikiModelCdEdit, "", ERR_FLG_ERR = "E")` |
| 21 | RETURN | `false` |

**Block 10** — FINAL RETURN (L17000)
> All checks passed.

| # | Type | Code |
|---|------|------|
| 1 | RETURN | `true` (inventory exists for all checked items) |

## 7. Glossary

| Term | Type | Business Meaning |
|------|------|-----------------|
| `isTknKikiModlSonzaiChk` | Method | Indoor equipment model existence check - validates stock availability for equipment changes |
| `kikiEditKbn` | Field | Equipment edit classification - indicates the type of equipment change (add, cancel, change, recovery) |
| `KIKI_EDIT_KBN_KIKI_ADD` | Constant | Equipment addition (機器追加) - adding new equipment |
| `KIKI_EDIT_KBN_KISHU_UPD` | Constant | Equipment type change (機種変更) - changing to a different model |
| `KIKI_EDIT_KBN_KAI_CAN` | Constant | Contract cancellation (解約キャンセル) - cancelling service contract |
| `KIKI_EDIT_KBN_KIKI_UPD` | Constant | Equipment change (機器変更) - changing existing equipment |
| `KIKI_EDIT_KBN_KIKI_KAIFUKU` | Constant | Recovery (復旧) - restoring equipment after cancellation |
| `tknKikiMdlListAf` | Field | Post-change indoor equipment model list - models after edit |
| `zaikoCheckMap` | Field | Inventory check accumulator map - stores per-location inventory delta calculations |
| `zaikoChkList` | Field | Inventory check target list - equipment items requiring stock validation |
| `haisoStat` / `haiso_stat` | Field | Delivery status (配送状態) - current status of delivery processing |
| `HAISO_STAT_UKEDUMI` | Constant | Delivery status: accepted/order received (配送状態: 受注済) - indicates delivery data is ready |
| `haiso_div_edit` | Field | Delivery distribution method (配送区分) - direct delivery vs. handover |
| `HAISO_KBN_CHOKUSO` | Constant | Direct delivery (直送) - equipment shipped directly to customer |
| `knriPlcSkbtCd` | Field | Manager location subtype code (管理場所種別コード) - logistics node type (office, construction company, etc.) |
| `KNRI_PLC_SKBT_CD_KOJICOMP` | Constant | Construction company (工事会社) - manager location code for construction contractor |
| `sokoCd` | Field | Warehouse code (倉庫コード) - storage facility identifier |
| `tanaCd` | Field | Shelf code (棚コード) - specific shelf within warehouse |
| `tkModelCd` | Field | Indoor equipment model code (宅内機器型式コード) - device model identifier |
| `bcasModelCd` | Field | B-CAS module model code - conditional access card model |
| `ccasModelCd` | Field | C-CAS module model code - secondary conditional access card model |
| `stb_kktk_svc_cd` | Field | STB indoor equipment service code - identifies STB service type |
| `kktk_svc_cd` | Field | Indoor equipment service code (宅内機器提供サービスコード) - service type for the device |
| `kktk_svc_cd_bf` | Field | Pre-change indoor equipment service code (変更前宅内機器提供サービスコード) |
| `hddCapaCd` | Field | HDD capacity code (HDD容量コード) - storage capacity identifier for set-top boxes |
| `hddCapaBcasnoneList` | Field | List of HDD capacity codes for B-CAS-free (4K) STBs |
| `KOJIAK_SBT_CD_JUUSHOHENKOU` | Constant | Address change work type (住所変更) - work subtype for address modification |
| `KIKISV_STAT_TEIKYOCHU` | Constant | Service status: in service (サービス提供中) - indicates active service |
| `isHaisoKikiHantei` | Method | Delivery equipment determination - checks if equipment is designated for delivery |
| `setZaikoCheckMap` | Method | Inventory check map setter - adds (+1) or subtracts (-1) inventory entries |
| `setZaikoCheckMapStbDataMinus` | Method | STB data minus setter - subtracts STB B-CAS/C-CAS inventory for cancellation |
| `getTknKikiButsuryuZaiko` | Method | Indoor equipment inventory quantity query - fetches actual stock levels |
| `isZaikoNashi` | Method | Stockout check - returns false if calculated inventory is below zero |
| `isZaikoDetailChk` | Method | Detailed inventory check - validates inventory for a specific device |
| `isHanbaiSbtNew` | Method | Sales type new product judgment - checks if sales type code indicates new product |
| `setMessageInfo` | Method | Error/warning message setter - sets screen error messages |
| `getBuisinessParameter` | Method | Business parameter retriever - fetches configurable business parameters from server |
| `getSvcBetTknKikiKoh` | Method | Service-type indoor equipment candidate list getter - queries device candidates by service |
| `getTknKikiModel` | Method | Indoor equipment model extractor - retrieves model code from candidate list |
| `getSokoTana` | Method | Warehouse/shelf resolver - translates delivery location to warehouse and shelf codes |
| `execEKU0011A010` | Method | Work order contract data executor (EKU0011A010) - retrieves work order contract information |
| `execEKK0341B501` | Method | Service contract detail executor (EKK0341B501) - retrieves STB service contract details |
| `getKktkSvcKeiRireki` | Method | Service contract historical data retriever - fetches past contract records |
| `getKikiTkSvcKeiInfo` | Method | Equipment service contract info getter - retrieves current contract details |
| `EKKA0020005CBSMsg2List` | Message | Warehouse inventory message - contains KNRI_PLC_SKBT_CD, KNRI_PLC_CD, KNRI_PLC_SLF_CD, TK_MDL_CD |
| `EKK0341A010CBSMsg1List` | Message | Service contract agreement message - contains TAKNKIKI_MODEL_CD, SVC_KEI_UCWK_NO, HDD_CAPA_CD, KKTK_SVC_CD, KIKI_STI_JI_KRIPLACE_SKCD |
| `EKU0011A010CBSMsg1List` | Message | Work order contract message - contains KOJIAK_SBT_CD |
| `EKK1861B001CBSMsg1List` | Message | Service-type equipment candidate list message (EKK1861B001) |
| `ERR_FLG_ERR` | Constant | Error flag value "E" |
| `ERR_FLG_WARNING` | Constant | Warning flag value "W" |
| B-CAS | Business term | B-CAS conditional access system - digital content protection card used in Japanese set-top boxes |
| C-CAS | Business term | C-CAS secondary conditional access card - supplementary access module |
| STB | Acronym | Set-Top Box - cable/satellite/ISDB set-top terminal device |
| 4K-STB | Business term | 4K resolution STB - newer generation box that does not require B-CAS cards (B-CAS-free) |
| 明細一覧編集画面 | Business term | Equipment list edit screen - the UI where customers review and modify equipment assignments |
| 宅内機器 | Business term | Indoor equipment - customer-premise devices (STBs, modems, routers) |
| 在庫 | Business term | Inventory/stock - physical equipment quantity at a logistics location |
| 直送 | Business term | Direct delivery - equipment shipped directly from warehouse to customer |
| 手渡し | Business term | Handover delivery - equipment delivered by technician/installer |
| 新品 | Business term | New product - equipment with sales type code ending in "0" (specifically "12" in this system) |
| KK_T_SOKO_ZAIKO | Entity | Warehouse inventory table - actual stock quantities by location and model |
| KK_T_KKTK_SVC_KEI | Entity | Indoor equipment service contract table - current service contract records |
| KK_T_ODR_KOJIAK | Entity | Work order contract table - work order and contract linkage records |
| KKM_M_TKNKIKI_KOH | Entity | Indoor equipment type candidate master table - master list of available device types |
| ZAIKO_RENKEI_SU_KEY | Constant | Inventory linkage calculation key - map key for storing calculated inventory counts |
| TK_CALC_ZAIKO_SU_KEY | Constant | Calculated inventory count key - map key for final calculated stock |
| TMP_TAKNKIKI_MODEL_LIST_NEW | Constant | Temporary post-change model list key - map key for temporary data storage |
| KKTK_SVC_KEI_STAT_KAIFUKU_AF | Constant | Recovery service status post key - map key for post-recovery service state |
| KEY_KOJI_AK_SBT_CD | Constant | Work order subtype key prefix - map key prefix for work order subtype data |
| FUNC_CODE_2 | Constant | Check-only function code "2" - indicates the screen is in validation-only mode |

---

*Document auto-generated from source code analysis. Line range: 16341-17047.*