# Business Logic — JKKAdInfChgCC.seikyuShsAdUpd() [643 LOC]

| Field | Value |
|-------|-------|
| Fully Qualified Name | `com.fujitsu.futurity.bp.custom.common.JKKAdInfChgCC` |
| Layer | Common Component (CC) — shared business logic component |
| Module | `common` (Package: `com.fujitsu.futurity.bp.custom.common`) |

## 1. Role

### JKKAdInfChgCC.seikyuShsAdUpd()

This method performs **billing delivery address change processing** (請求書送付先住所変更処理). It is invoked when a customer's billing statement delivery address needs to be updated in the K-Opticom customer base system. The method processes a list of billing contracts passed as a parameter, iterating over each contract to update multiple fields: deliverer name (kanji), deliverer name (katakana), postal code, full address components (prefecture, city, district, town, block, building name, room number), and phone number.

For each billing contract, the method first fetches the existing agreement data via SC EKK0491A010 (Billing Contract Agreement Lookup), then branches based on the `updateNaiyo` (update content type) constant. If `UPDATE_ALL` ("0") or `UPDATE_NM` ("3") is specified, both the name fields (SHS_KANA, SOHUS_NM) and the full address fields are updated. If only `UPDATE_TEL` ("2") is specified, only the phone number is updated. If only `UPDATE_AD` ("1") is specified, only the address fields are updated.

The method implements a **routing/dispatch pattern** through the `updateNaiyo` constant to selectively update subsets of fields. It also implements an **audit trail builder** that accumulates a before/after change summary in `prg_tkjk` (before-edit detail text) and `prg_tkjk2` (after-edit detail text), which are later registered as progress supplement items. Finally, it updates the service contract content via SC EKK0491C060 and registers the address change event in the progress log via SC EKK1091D010.

The method serves as a **shared utility** called by screen-level CBS (Business Service) components — specifically KKSV0004 — and can handle multiple contracts in a single call, with deduplication via `updateSeikyuNoSet` to prevent duplicate processing of the same billing contract number.

## 2. Processing Pattern (Detailed Business Logic)

```mermaid
flowchart TD
    START(["seikyuShsAdUpd start"])
    START --> PREP["Prepare: get paramMap, mapper, scCall, useCaseId"]
    PREP --> LOOP_START{"seiky_shs_list iteration"}

    LOOP_START --> FETCH_SC["Fetch billing agreement: EKK0491A010"]
    FETCH_SC --> DEDUP{"Already processed?"}
    DEDUP -- Yes --> SKIP_NEXT["Continue to next iteration"]
    DEDUP -- No --> CHK_RSV["Check reservation data: existSeikyKeiRsvData"]
    CHK_RSV --> CHK_TYPE{"updateNaiyo = UPDATE_ALL or UPDATE_NM?"}

    CHK_TYPE -- Yes --> UPDATE_NAME["Update SHS_KANA and SOHUS_NM fields"]
    UPDATE_NAME --> CHK_NOT_TEL{"not UPDATE_TEL and not UPDATE_NM?"}

    CHK_TYPE -- No --> CHK_NOT_TEL

    CHK_NOT_TEL -- No --> SKIP_ADDRESS
    CHK_NOT_TEL -- Yes --> GET_KSH_FLG{"useCaseId = CKSV0064?"}

    GET_KSH_FLG -- Yes --> FLG_NASHI["Set SKS_SHS_KSH_AD_SAI_FLG = '0'"]
    GET_KSH_FLG -- No --> CALL_GET_KSH["Call getKshAdSaiFlg"]

    FLG_NASHI --> UPDATE_ADDR["Update address fields: AD_CD, PCD, STATE, CITY, OAZTSU, AZCHO, BNCHIGO, ADRTTM, ADRRM"]
    UPDATE_ADDR --> CHK_CHANGE{"AdChangeFlg = true?"}

    CHK_CHANGE -- Yes --> BUILD_FULL_ADDR["Build full address edit text: prg_tkjk and prg_tkjk2"]
    CHK_CHANGE -- No --> SET_IDO_DIV

    BUILD_FULL_ADDR --> SET_IDO_DIV["Set SOHUS_AD_MAN_INPUT_FLG, IDO_DIV, SOHUS_AD_CHK_LV"]

    SET_IDO_DIV --> CHK_NOT_AD{"not UPDATE_AD and not UPDATE_NM?"}
    CHK_NOT_AD -- Yes --> UPDATE_TEL["Update SOHUS_TELNO field"]
    CHK_NOT_AD -- No --> SET_RSV_APPLY

    UPDATE_TEL --> SET_RSV_APPLY["Set RSV_TSTA_KIBO_YMD, RSV_APLY_YMD, MSKM_DTL_NO, UPD_DTM_BEF"]
    SET_RSV_APPLY --> UPDATE_SC["Update service contract content: EKK0491C060"]

    UPDATE_SC --> ADD_SEEN["Add to updateSeikyuNoSet"]
    ADD_SEEN --> SET_UPD_DTM["Set UPD_DTM_AF, ad_chk_lv_res"]

    SET_UPD_DTM --> SVC_AGREE["Fetch service contract agreement: EKK0081A010"]
    SVC_AGREE --> CHK_STAT{"svcKeiStat = '010'?"}

    CHK_STAT -- Yes --> FETCH_PROG["Fetch progress info: EKK1091B001"]
    CHK_STAT -- No --> SKIP_PROG["Skip progress info fetch"]

    FETCH_PROG --> BUILD_PARENT
    SKIP_PROG --> BUILD_PARENT["Build parent_map: SVC_KEI_NO, SEIKY_KEI_NO, IDO_DIV, IDO_DTM, PRG_STAT"]

    BUILD_PARENT --> CHK_STAT2{"svcKeiStat = '010'?"}
    CHK_STAT2 -- Yes --> SET_PROG_DTM["Set IDO_DIV and IDO_Dtm from progress info"]
    CHK_STAT2 -- No --> SET_SYS_DTM["Set IDO_DIV and IDO_Dtm from system time"]

    SET_PROG_DTM --> SET_PRG_TKJK["Set PRG_TKJK_1 and PRG_TKJK_2 with edit texts"]
    SET_SYS_DTM --> SET_PRG_TKJK

    SET_PRG_TKJK --> REG_PROG["Register progress: EKK1091D010"]
    REG_PROG --> END_LOOP["Back to loop"]
    SKIP_NEXT --> END_LOOP
    FLG_NASHI --> SET_IDO_DIV

    END_LOOP --> LOOP_END{"Has next?"}
    LOOP_END -- Yes --> FETCH_SC
    LOOP_END -- No --> RETURN["Return / Next"]
    RETURN --> END_NODE(["seikyuShsAdUpd end"])
```

## 3. Parameter Analysis

| No | Parameter Name | Type | Business Description |
|----|---------------|------|---------------------|
| 1 | `param` | `IRequestParameterReadWrite` | Request parameter object containing a model group and control map. It carries the billing delivery address change list (`seiky_shs_ad_list`), the operation date, update content type (`update_naiyo`), move type (`ido_div`), and other fields such as `mskm_dtl_no` (mask detail number), `reigai` (extra/abnormal flag), and `usecaseID` (use case identifier, e.g., "CKSV0064" for e-Maip page customer info changes). |
| 2 | `fixedText` | `String` | User-defined arbitrary string used as a key to extract the data map from the request parameter via `param.getData(fixedText)`. It identifies the data context for the operation. |

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

| Field | Description |
|-------|-------------|
| `keepSesHandle` | ThreadLocal session handle that preserves the database session context across the processing loop, ensuring transactional consistency. |
| `PRG_TKJK_MAX_VALUE` | Constant `128` — maximum number of characters for progress supplement detail text. |
| `PCG_KUTEN_CANMA` | Constant "、" — Japanese comma used as a separator between change items in the audit trail text. |
| `PCG_SHS_*` text constants | Japanese labels for change audit text (e.g., "変更前送付先カナ名:" for "Before-edit deliverer kana name:"). |

## 4. CRUD Operations / Called Services

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

| CRUD | SC / CBS | SC Code | Entity / DB | Operation Description |
|------|----------|---------|-------------|----------------------|
| R | `JKKAdInfChgMapperCC.setEKK0491A010` | EKK0491A010 | KK_T_SEIKY_KEI (Billing contract) | Fetches the billing contract agreement data by contract number and operation date to obtain current field values. |
| R | `ServiceComponentRequestInvoker.run` | EKK0491A010 | KK_T_SEIKY_KEI | Executes the SC lookup for the billing contract agreement. |
| R | `JKKAdInfChgMapperCC.getEKK0491A010` | EKK0491A010 | KK_T_SEIKY_KEI | Retrieves the mapping result of the billing contract agreement lookup. |
| R | `JKKAdInfChgCC.existSeikyKeiRsvData` | - | KK_T_SEIKY_KEI | Checks whether pending reservation data exists for the billing contract on the given operation date. |
| R | `JKKAdInfChgMapperCC.setEKK0491C060` | EKK0491C060 | KK_T_SEIKY_KEI (Billing contract content) | Sets up the request parameters for updating the billing contract content. |
| R | `ServiceComponentRequestInvoker.run` | EKK0491C060 | KK_T_SEIKY_KEI | Executes the SC update for billing contract content. |
| R | `JKKAdInfChgMapperCC.getEKK0491C060` | EKK0491C060 | KK_T_SEIKY_KEI | Retrieves the result mapping after the billing contract content update. |
| R | `JKKAdInfChgMapperCC.setEKK0081A010` | EKK0081A010 | KK_T_SVC_KEI (Service contract) | Sets up the request for fetching service contract agreement data. |
| R | `ServiceComponentRequestInvoker.run` | EKK0081A010 | KK_T_SVC_KEI | Executes the service contract agreement lookup. |
| R | `JKKAdInfChgMapperCC.getEKK0081A010` | EKK0081A010 | KK_T_SVC_KEI | Retrieves the service contract agreement result. |
| R | `JKKAdInfChgMapperCC.setEKK1091B001` | EKK1091B001 | KK_T_IDO (Move/progress log) | Sets up the request for fetching progress/move information when the service contract status is "010". |
| R | `ServiceComponentRequestInvoker.run` | EKK1091B001 | KK_T_IDO | Executes the progress info lookup. |
| R | `JKKAdInfChgMapperCC.getEKK1091B001` | EKK1091B001 | KK_T_IDO | Retrieves progress info result. |
| C | `JKKAdInfChgMapperCC.setEKK1091D010` | EKK1091D010 | KK_T_IDO_DTL (Progress log detail) | Registers the progress log entry for the billing delivery address change event. |
| R | `JKKAdInfChgCC.getIdoRsnList` | - | KK_T_IDO (Move reason) | Builds the list of move reasons for the progress log registration. |
| R | `JKKAdInfChgMapperCC.getEKK1091D010` | EKK1091D010 | KK_T_IDO_DTL | Retrieves the mapping result of the progress log registration. |
| R | `JCCBatCommon.getSysDateTimeStamp` | - | - | Gets the current system date-time stamp. |
| R | `JCCBPCommon.getSysDateTimeStamp` | - | - | Gets the current system date-time stamp (alternative caller). |
| R | `JKKAdInfChgCC.getKshAdSaiFlg` | - | KK_T_SKS_YO (Requester room) | Determines whether the requester room address update flag should be set. |
| R | `JKKAdInfChgCC.getMapString` | - | - | Helper method that safely retrieves string values from maps. |

## 5. Dependency Trace

### Callers

| # | Caller (Screen/Batch) | Call Chain (Full Path to this Method) | Terminal (SC / CRUD / Entity) |
|---|----------------------|--------------------------------------|-------------------------------|
| 1 | Screen:KKSV0004 | `seikyuShsAdUpd` (direct call) | `EKK0491A010 [R] KK_T_SEIKY_KEI`, `EKK0491C060 [U] KK_T_SEIKY_KEI`, `EKK0081A010 [R] KK_T_SVC_KEI`, `EKK1091D010 [C] KK_T_IDO_DTL` |

This method is a private method called internally within the `JKKAdInfChgCC` class, invoked by the caller at line 344 (within another method of the same class, which is itself called from a screen CBS layer).

### Terminal operations from this method

| Method | Type | Entity / DB |
|--------|------|-------------|
| `setEKK0491A010` / `getEKK0491A010` | R | KK_T_SEIKY_KEI (Billing contract table) |
| `setEKK0491C060` / `getEKK0491C060` | U | KK_T_SEIKY_KEI (Billing contract content) |
| `setEKK0081A010` / `getEKK0081A010` | R | KK_T_SVC_KEI (Service contract table) |
| `setEKK1091B001` / `getEKK1091B001` | R | KK_T_IDO (Progress/move log table) |
| `setEKK1091D010` / `getEKK1091D010` | C | KK_T_IDO_DTL (Progress log detail table) |
| `scResultCheck` | - | - |
| `getSysDateTimeStamp` | R | - |
| `getKshAdSaiFlg` | R | KK_T_SKS_YO |
| `getIdoRsnList` | R | KK_T_IDO |
| `existSeikyKeiRsvData` | R | KK_T_SEIKY_KEI |
| `getMapString` | R | - |

## 6. Per-Branch Detail Blocks

### Block 1 — SETUP (L4214)

> Initializes local variables, gets mapper instance, SC request invoker, and extracts the billing delivery address list from the request parameter.

| # | Type | Code |
|---|------|------|
| 1 | SET | `condMap = new HashMap<String, String>()` |
| 2 | SET | `paramMap = (HashMap) param.getData(fixedText)` // Extract data map by key |
| 3 | SET | `useCaseId = JKKStringUtil.nullToBlank(param.getUsecaseID())` // ANK-3477 use case ID |
| 4 | SET | `mapper = JKKAdInfChgMapperCC.getInstance()` |
| 5 | SET | `scCall = new ServiceComponentRequestInvoker()` |
| 6 | SET | `seiky_shs_list = (ArrayList) paramMap.get(PARAM_KEY_SEIKY_SHS_AD_LIST)` // "seiky_shs_ad_list" |
| 7 | SET | `seiky_shs_list_ite = seiky_shs_list.iterator()` |
| 8 | SET | `updateSeikyuNoSet = new HashSet<String>()` // Dedup set for already-processed billing contract numbers |

### Block 2 — WHILE LOOP: iterate over billing delivery address list (L4231)

> For each billing contract in the change list, process the address update.

| # | Type | Code |
|---|------|------|
| 1 | EXEC | `cur_seiky_shs = seiky_shs_list_ite.next()` // Get current item |

#### Block 2.1 — DEDUP CHECK: already processed? (L4236)

> Skip if the same billing contract number was already processed in this call.

| # | Type | Code |
|---|------|------|
| 1 | SET | `seikyuKeiNo = (String) cur_seiky_shs.get(PARAM_KEY_SEIKY_SHS_AD_SEIKY_KEI_NO)` // Billing contract number |
| 2 | IF | `updateSeikyuNoSet.contains(seikyuKeiNo)` — already processed, skip |

#### Block 2.2 — RESERVATION CHECK: pending reservation data? (L4243)

> Check if there is pending reservation data for this billing contract. If yes, set flag in paramMap.

| # | Type | Code |
|---|------|------|
| 1 | SET | `opeYmd = (String) paramMap.get(PARAM_KEY_OPE_DATE)` |
| 2 | CALL | `existSeikyKeiRsvData(seikyuKeiNo, opeYmd, param, fixedText, scCall, mapper)` |
| 3 | IF (true) | `paramMap.put("ad_chk_seikyu_kei_rsv_exist", "1")` |

#### Block 2.3 — INITIALIZE PRG_TKJK VARIABLES (L4251–L4253)

> ANK-1820 and ANK-2394: Initialize progress supplement text accumulators.

| # | Type | Code |
|---|------|------|
| 1 | SET | `prg_tkjk = ""` // Before-edit detail text (old) |
| 2 | SET | `prg_tkjk2 = ""` // Before-edit detail text (ANK-2394 improvement case) |

### Block 3 — FETCH BILLING CONTRACT: EKK0491A010 (L4258)

> Fetch the current billing contract agreement data to get existing field values.

| # | Type | Code |
|---|------|------|
| 1 | EXEC | `condMap.clear()` |
| 2 | SET | `condMap.put(COND_KEY_SEIKY_KEI_NO, seikyuKeiNo)` |
| 3 | SET | `condMap.put(COND_KEY_OPEDATE, cur_seiky_shs.get(PARAM_KEY_SEIKY_SHS_AD_APLY_YMD))` // OM-2014-0001265: from current item, not paramMap |
| 4 | CALL | `mapper.setEKK0491A010(param, fixedText, condMap)` |
| 5 | CALL | `scCall.run(reqMap, keepSesHandle.get())` |
| 6 | CALL | `kk0491_a010_map = mapper.getEKK0491A010(param, fixedText, resMap)` |
| 7 | EXEC | `mapper.scResultCheck(param)` |

### Block 4 — UPDATE CONTENT CHECK (L4264)

> Branch based on the update content type (`updateNaiyo`): UPDATE_ALL="0", UPDATE_NM="3", UPDATE_AD="1", UPDATE_TEL="2".

| # | Type | Code |
|---|------|------|
| 1 | SET | `updateNaiyo = (String) paramMap.get(PARAM_KEY_UPDATE_NAIYO)` |
| 2 | IF | `UPDATE_ALL.equals(updateNaiyo) OR UPDATE_NM.equals(updateNaiyo)` — "0" or "3" |

### Block 4.1 — UPDATE NAME FIELDS: SHS_KANA (L4269–L284)

> Update the deliverer kana name (送付先カナ名). Builds audit trail text for name changes.

| # | Type | Code |
|---|------|------|
| 1 | IF (all null/empty) | Both old and new SHS_KANA are empty — skip |
| 2 | IF (old exists, new is empty) | `prg_tkjk += PCG_SHS_KANA_TEXT + old_SHS_KANA + PCG_KUTEN_CANMA` // "変更前送付先カナ名:" |
| 3 | IF (old empty, new exists) | Same as above — append before value |
| 4 | IF (old != new) | Same — values differ, append before value |
| 5 | SET | `kk0491_a010_map.put(SHS_KANA, cur_seiky_shs.get(PARAM_KEY_SEIKY_SHS_AD_KANA))` |

### Block 4.2 — UPDATE NAME FIELDS: SOHUS_NM (L4287–L302)

> Update the deliverer name (送付先名). Same pattern as Block 4.1.

| # | Type | Code |
|---|------|------|
| 1 | IF (all null/empty) | Both old and new SOHUS_NM are empty — skip |
| 2 | IF (old exists, new is empty) | `prg_tkjk += PCG_SHS_NM_TEXT + old_SOHUS_NM + PCG_KUTEN_CANMA` // "変更前送付先名:" |
| 3 | IF (old empty, new exists) | Same pattern |
| 4 | IF (old != new) | Same pattern |
| 5 | SET | `kk0491_a010_map.put(SOHUS_NM, cur_seiky_shs.get(PARAM_KEY_SEIKY_SHS_AD_NM))` |

### Block 5 — ADDRESS AND TEL UPDATE BLOCK (L4311)

> Condition: `not UPDATE_TEL AND not UPDATE_NM` ("2" or "3" excluded). This block handles non-phone-only and non-name-only updates, meaning it processes when the update involves address or "all" fields.

| # | Type | Code |
|---|------|------|
| 1 | IF | `USE_CASE_0064.equals(useCaseId)` — "CKSV0064" (e-Maip page customer info change) |
| 2 | THEN | `kk0491_a010_map.put(SKS_SHS_KSH_AD_SAI_FLG, CD00002_NASHI)` // "0" — do not update requester room |
| 3 | ELSE | `kk0491_a010_map.put(SKS_SHS_KSH_AD_SAI_FLG, getKshAdSaiFlg(paramMap))` |
| 4 | SET | `kk0491_a010_map.put(SOHUS_AD_CD, cur_seiky_shs.get(PARAM_KEY_SEIKY_SHS_AD_AD_CD))` |

#### Block 5.1 — UPDATE POSTAL CODE (L4323–L348)

> Postal code comparison with audit trail building for before and after (ANK-2394).

| # | Type | Code |
|---|------|------|
| 1 | IF (old empty, new empty) | Skip |
| 2 | IF (old exists, new empty) | `prg_tkjk += PCG_SHS_PCD_TEXT + old_PCD + PCG_KUTEN_CANMA`; `prg_tkjk2 += PCG_SHS_PCD_TEXT_AF + new_PCD + PCG_KUTEN_CANMA` |
| 3 | IF (old empty, new exists) | Same pattern |
| 4 | IF (old != new) | Same pattern |
| 5 | SET | `kk0491_a010_map.put(SOHUS_PCD, cur_seiky_shs.get(PARAM_KEY_SEIKY_SHS_AD_PCD))` |

#### Block 5.2 — ADDRESS CHANGE FLAG: PREFECTURE (L4352–L365)

> Compare old vs new state name. If they differ (or one is empty), set `AdChangeFlg = true`.

| # | Type | Code |
|---|------|------|
| 1 | SET | `AdChangeFlg = false` |
| 2 | IF (old != new, or one is null/empty) | `AdChangeFlg = true` |

#### Block 5.3 — ADDRESS CHANGE FLAG: CITY (L4370–L383)

> Same pattern: compare city name.

#### Block 5.4 — ADDRESS CHANGE FLAG: DISTRICT (L4388–L401)

> Compare district name (大字通称名).

#### Block 5.5 — ADDRESS CHANGE FLAG: TOWN (L4406–L419)

> Compare town name (字丁目名).

#### Block 5.6 — ADDRESS CHANGE FLAG: BLOCK (L4424–L437)

> Compare block number (番地号).

#### Block 5.7 — ADDRESS CHANGE FLAG: BUILDING (L4442–L455)

> Compare building name (住所補記・建物名).

#### Block 5.8 — ADDRESS CHANGE FLAG: ROOM (L4460–L473)

> Compare room number (住所補記・部屋番号).

#### Block 5.9 — BUILD FULL ADDRESS TEXT (L4478)

> If `AdChangeFlg = true`, append the full before/after address to the audit trail text.

| # | Type | Code |
|---|------|------|
| 1 | IF | `AdChangeFlg == true` |
| 2 | SET | `prg_tkjk += PCG_SHS_AD_TEXT + STATE_NM + CITY_NM + OAZTSU_NM + AZCHO_NM + BNCHIGO + ADRTTM + ADRRM + PCG_KUTEN_CANMA` // "変更前送付先住所:" |
| 3 | SET | `prg_tkjk2 += PCG_SHS_AD_TEXT_AF + new_STATE + new_CITY + new_OAZTSU + new_AZCHO + new_BNCHIGO + new_ADRTTM + new_ADRRM + PCG_KUTEN_CANMA` // "変更後送付先住所:" |

#### Block 5.10 — SET ADDRESS FIELDS (L4494–L502)

> Set all address fields in the map to new values.

| # | Type | Code |
|---|------|------|
| 1 | SET | `kk0491_a010_map.put(SOHUS_STATE_NM, cur.get(PARAM_KEY_SEIKY_SHS_AD_STATE))` |
| 2 | SET | `kk0491_a010_map.put(SOHUS_CITY_NM, cur.get(PARAM_KEY_SEIKY_SHS_AD_CITY))` |
| 3 | SET | `kk0491_a010_map.put(SOHUS_OAZTSU_NM, cur.get(PARAM_KEY_SEIKY_SHS_AD_OAZTSU))` |
| 4 | SET | `kk0491_a010_map.put(SOHUS_AZCHO_NM, cur.get(PARAM_KEY_SEIKY_SHS_AD_AZCHO))` |
| 5 | SET | `kk0491_a010_map.put(SOHUS_BNCHIGO, cur.get(PARAM_KEY_SEIKY_SHS_AD_BNCHIGO))` |
| 6 | SET | `kk0491_a010_map.put(SOHUS_ADRTTM, cur.get(PARAM_KEY_SEIKY_SHS_AD_ADRTTM))` |
| 7 | SET | `kk0491_a010_map.put(SOHUS_ADRRM, cur.get(PARAM_KEY_SEIKY_SHS_AD_ADRRM))` |

#### Block 5.11 — SET EXTRA FIELDS (L4507–L511)

> Set the manual input flag, move type, and address check level.

| # | Type | Code |
|---|------|------|
| 1 | SET | `kk0491_a010_map.put(SOHUS_AD_MAN_INPUT_FLG, reigai ? "1" : "0")` // OM-2013-0000871 |
| 2 | SET | `kk0491_a010_map.put(IDO_DIV, paramMap.get(PARAM_KEY_IDO_DIV))` |
| 3 | SET | `kk0491_a010_map.put(SOHUS_AD_CHK_LV, "1")` // ST3-2013-0000040 |

### Block 6 — PHONE NUMBER UPDATE (L4516)

> Condition: `not UPDATE_AD AND not UPDATE_NM` ("1" or "3" excluded). When updating phone number.

| # | Type | Code |
|---|------|------|
| 1 | IF (old empty, new empty) | Skip |
| 2 | IF (old exists, new empty) | `prg_tkjk += PCG_SHS_TELNO_TEXT + old_TELNO + PCG_KUTEN_CANMA`; `prg_tkjk2 += PCG_SHS_TELNO_TEXT_AF + new_TELNO + PCG_KUTEN_CANMA` |
| 3 | IF (old empty, new exists) | Same pattern |
| 4 | IF (old != new) | Same pattern |
| 5 | SET | `kk0491_a010_map.put(SOHUS_TELNO, cur_seiky_shs.get(PARAM_KEY_SEIKY_SHS_AD_TELNO))` |

### Block 7 — FINALIZE REQUEST MAP (L4529–L538)

> Set the apply date, mask detail number, and update timestamp.

| # | Type | Code |
|---|------|------|
| 1 | SET | `kk0491_a010_map.put(RSV_TSTA_KIBO_YMD, cur_seiky_shs.get(PARAM_KEY_SEIKY_SHS_AD_APLY_YMD))` |
| 2 | SET | `kk0491_a010_map.put(RSV_APLY_YMD, cur_seiky_shs.get(PARAM_KEY_SEIKY_SHS_AD_APLY_YMD))` |
| 3 | IF | `mskm_dtl_no != null` (ST2-2013-0001729) → `kk0491_a010_map.put(MSKM_DTL_NO, mskm_dtl_no)` |
| 4 | SET | `kk0491_a010_map.put(UPD_DT_SEIKY_KEI_UPD_DTM_BEF, kk0491_a010_map.get(LAST_UPD_DTM))` |

### Block 8 — UPDATE BILLING CONTRACT CONTENT: EKK0491C060 (L4542–L547)

> Call SC to update the billing contract content with the modified data.

| # | Type | Code |
|---|------|------|
| 1 | CALL | `mapper.setEKK0491C060(param, fixedText, kk0491_a010_map)` |
| 2 | CALL | `scCall.run(reqMap, keepSesHandle.get())` |
| 3 | CALL | `kk0491_c060_map = mapper.getEKK0491C060(param, fixedText, resMap)` |
| 4 | EXEC | `mapper.scResultCheck(param)` |

### Block 9 — POST-PROCESSING (L4549–L555)

| # | Type | Code |
|---|------|------|
| 1 | SET | `updateSeikyuNoSet.add(seikyuKeiNo)` |
| 2 | SET | `cur_seiky_shs.put(PARAM_KEY_SEIKY_SHS_AD_UPD_DTM_AF, kk0491_c060_map.get(UPD_DTM))` |
| 3 | SET | `ad_chk_lv_res = (String) paramMap.get(EKK0491C060CBSMsg.SOHUS_AD_CHK_LV_ERR)` |
| 4 | IF | `ad_chk_lv_res != null` → `paramMap.put("ad_chk_lv_res", ad_chk_lv_res)` |

### Block 10 — TRIM PROGRESS TEXT (L4558–L583)

> Remove trailing comma and truncate to 128 characters (PRG_TKJK_MAX_VALUE) if needed.

| # | Type | Code |
|---|------|------|
| 1 | IF | `prg_tkjk != null && not empty && length > 0` |
| 2 | SET | `prg_tkjk = prg_tkjk.substring(0, length - 1)` // Remove trailing "、" |
| 3 | IF | `length - 1 > PRG_TKJK_MAX_VALUE` (128) → truncate to 128 chars |
| 4 | IF | `prg_tkjk2 != null && not empty && length > 0` — same trim and truncate logic (ANK-2394) |

### Block 11 — SERVICE CONTRACT AGREEMENT: EKK0081A010 (L587–L600)

> Fetch the service contract agreement data to check status and move type.

| # | Type | Code |
|---|------|------|
| 1 | EXEC | `condMap.clear()` |
| 2 | SET | `condMap.put("key_svc_kei_no", cur_seiky_shs.get(PARAM_KEY_SEIKY_SHS_AD_SVC_KEI_NO))` |
| 3 | SET | `condMap.put("key_rsv_aply_ymd", getMapString(paramMap, PARAM_KEY_OPE_DATE))` |
| 4 | CALL | `mapper.setEKK0081A010(param, fixedText, condMap)` |
| 5 | CALL | `scCall.run(reqMap, keepSesHandle.get())` |
| 6 | CALL | `kk0081_a010_map = mapper.getEKK0081A010(param, fixedText, resMap)` |
| 7 | EXEC | `mapper.scResultCheck(param)` |
| 8 | SET | `svcKeiStat = getMapString(kk0081_a010_map, EKK0081A010CBSMsg1List.SVC_KEI_STAT)` |
| 9 | SET | `idoDiv = getMapString(kk0081_a010_map, EKK0081A010CBSMsg1List.IDO_DIV)` |

### Block 12 — PROGRESS INFO: EKK1091B001 (L605–L618)

> Condition: `SVC_KEI_STAT_010.equals(svcKeiStat)` — "010" (contract active). Fetch progress info.

| # | Type | Code |
|---|------|------|
| 1 | IF | `SVC_KEI_STAT_010 = "010"` — contract status is "active" |
| 2 | EXEC | `condMap.clear()` |
| 3 | SET | `condMap.put("key_svc_kei_no", cur_seiky_shs.get(PARAM_KEY_SEIKY_SHS_AD_SVC_KEI_NO))` |
| 4 | CALL | `mapper.setEKK1091B001(param, fixedText, condMap)` |
| 5 | CALL | `scCall.run(reqMap, keepSesHandle.get())` |
| 6 | CALL | `kk1091_a010_map = mapper.getEKK1091B001(param, fixedText, resMap)` |
| 7 | EXEC | `mapper.scResultCheck(param)` |
| 8 | SET | `idoDtm = getMapString(kk1091_a010_map, EKK1091B001CBSMsg1List.IDO_DTM)` |
| 9 | ELSE | Skip progress info fetch |

### Block 13 — BUILD PARENT MAP FOR PROGRESS REGISTRATION (L625–L661)

> Construct the progress log registration data.

| # | Type | Code |
|---|------|------|
| 1 | SET | `parent_map = new HashMap<String, Object>()` |
| 2 | SET | `parent_map.put(SVC_KEI_NO, cur_seiky_shs.get(PARAM_KEY_SEIKY_SHS_AD_SVC_KEI_NO))` |
| 3 | SET | `parent_map.put(SEIKY_KEI_NO, cur_seiky_shs.get(PARAM_KEY_SEIKY_SHS_AD_SEIKY_KEI_NO))` |
| 4 | IF | `SVC_KEI_STAT_010.equals(svcKeiStat)` → `parent_map.put(IDO_DIV, idoDiv)`, `parent_map.put(IDO_DTM, idoDtm)` |
| 5 | ELSE | `parent_map.put(IDO_DIV, paramMap.get(PARAM_KEY_IDO_DIV))`, `parent_map.put(IDO_DTM, JCCBPCommon.getSysDateTimeStamp())` |
| 6 | SET | `parent_map.put(PRG_STAT, CD00647_E050)` // "E050" — progress status: billing delivery address change |
| 7 | SET | `parent_map.put(PRG_TKJK_1, prg_tkjk)` |
| 8 | SET | `parent_map.put(PRG_TKJK_2, prg_tkjk2)` |
| 9 | IF | `mskm_dtl_no != null` → `parent_map.put(MSKM_DTL_NO, mskm_dtl_no)` |

### Block 14 — REGISTER PROGRESS: EKK1091D010 (L666–L671)

> Call SC to register the progress log entry for the billing delivery address change.

| # | Type | Code |
|---|------|------|
| 1 | CALL | `mapper.setEKK1091D010(param, fixedText, parent_map, getIdoRsnList(param, fixedText))` |
| 2 | CALL | `scCall.run(reqMap, keepSesHandle.get())` |
| 3 | CALL | `mapper.getEKK1091D010(param, fixedText, resMap)` |
| 4 | EXEC | `mapper.scResultCheck(param)` |

### Block 15 — EXCEPTION HANDLING (L676–L679)

| # | Type | Code |
|---|------|------|
| 1 | CATCH | `Exception ex` → `throw new CCException(ERR_STR_RESULT_CD, ex.getCause())` |

## 7. Glossary

| Term | Type | Business Meaning |
|------|------|------------------|
| `seiky_shs_ad_list` | Field | Billing delivery address change list — the list of billing contracts whose delivery address needs to be updated |
| `seiky_kei_no` | Field | Billing contract number — internal identifier for a billing contract line |
| `svc_kei_no` | Field | Service contract number — internal identifier for a telecom service contract |
| `ido_div` | Field | Move type classification — categorizes the type of address change event |
| `update_naiyo` | Field | Update content type — specifies which fields to update: "0"=all, "1"=address only, "2"=phone only, "3"=name only |
| `UPDATE_ALL` | Constant | "0" — update all fields |
| `UPDATE_AD` | Constant | "1" — update address fields only |
| `UPDATE_TEL` | Constant | "2" — update phone number only |
| `UPDATE_NM` | Constant | "3" — update name fields only |
| `CD00647_E050` | Constant | "E050" — progress status code for billing delivery address change |
| `CD00002_NASHI` | Constant | "0" — No (flag indicating requester room address update should not occur) |
| `SVC_KEI_STAT_010` | Constant | "010" — Service contract status: active/confirmed |
| `CKSV0064` | Constant | "CKSV0064" — Use case ID for e-Maip page customer information changes |
| `prg_tkjk` | Field | Progress supplement before-edit detail text — accumulates the before-values of changed fields |
| `prg_tkjk2` | Field | Progress supplement after-edit detail text (ANK-2394) — accumulates the after-values of changed fields |
| `PCG_KUTEN_CANMA` | Constant | "、" — Japanese comma used as a separator in audit trail text |
| `PCG_SHS_AD_TEXT` | Constant | "変更前送付先住所:" — prefix label for before-edit billing delivery address in audit text |
| `PCG_SHS_AD_TEXT_AF` | Constant | "変更後送付先住所:" — prefix label for after-edit billing delivery address in audit text |
| `AdChangeFlg` | Variable | Address change presence flag — set to true when any address field differs between old and new values |
| `SKS_SHS_KSH_AD_SAI_FLG` | Field | Requester room address update repeat flag — whether to also update the requester room address |
| `SOHUS_AD_MAN_INPUT_FLG` | Field | Address update manual input flag — indicates if the address change was manually entered |
| `SOHUS_AD_CHK_LV` | Field | Address check level — validation level for address data |
| `SHS_KANA` | Field | Deliverer kana name (送付先カナ名) — deliverer name in katakana |
| `SOHUS_NM` | Field | Deliverer name (送付先名) — deliverer name in kanji |
| `SOHUS_PCD` | Field | Deliverer postal code (送付先郵便番号) |
| `SOHUS_STATE_NM` | Field | Prefecture name (都道府県名) |
| `SOHUS_CITY_NM` | Field | City/municipality name (市区町村名) |
| `SOHUS_OAZTSU_NM` | Field | District name (大字通称名) |
| `SOHUS_AZCHO_NM` | Field | Town name (字丁目名) |
| `SOHUS_BNCHIGO` | Field | Block number (番地号) |
| `SOHUS_ADRTTM` | Field | Building name (住所補記・建物名) |
| `SOHUS_ADRRM` | Field | Room number (住所補記・部屋番号) |
| `SOHUS_TELNO` | Field | Deliverer phone number (送付先電話番号) |
| `EKK0491A010` | SC Code | Billing contract agreement lookup SC — fetches current billing contract data |
| `EKK0491C060` | SC Code | Billing contract content update SC — updates billing contract field values |
| `EKK0081A010` | SC Code | Service contract agreement lookup SC — fetches service contract status and move type |
| `EKK1091B001` | SC Code | Progress/move info lookup SC — fetches detailed move history for active contracts |
| `EKK1091D010` | SC Code | Progress log registration SC — registers a new progress log entry for the address change event |
| KK_T_SEIKY_KEI | DB Table | Billing contract table — stores billing contract records |
| KK_T_SVC_KEI | DB Table | Service contract table — stores service contract records |
| KK_T_IDO | DB Table | Progress/move log table — stores progress log headers |
| KK_T_IDO_DTL | DB Table | Progress log detail table — stores progress log detail entries |
| KK_T_SKS_YO | DB Table | Requester room table — stores requester room address data |
| e-Maip | Business term | Fujitsu's customer self-service web portal — allows customers to change their own information |
| ANK-1820 | Jiken | Improvement case for progress supplement field enhancement — added detailed before/after change text |
| ANK-2394 | Jiken | Improvement case for before/after edit text — added `prg_tkjk2` for after-values |
| ANK-3477 | Jiken | e-Maip page customer info change auto-reflection — added use case ID handling for "CKSV0064" |
