# Business Logic - JKKHakkoSODCC.kaihkOdrCtrl() [1726 LOC]

| Field | Value |
|-------|-------|
| Fully Qualified Name | `com.fujitsu.futurity.bp.custom.common.JKKHakkoSODCC` |
| Layer | Common Component / CC (Service Controller - Business Logic Gateway) |
| Module | `common` (Package: `com.fujitsu.futurity.bp.custom.common`) |

## 1. Role

### JKKHakkoSODCC.kaihkOdrCtrl()

This method implements **Recovery Order Control Processing** (回復オーダ制御処理). It is the central dispatch entry point that determines which **Service Order Data (SOD)** documents must be generated when a subscriber's telecom service contract is reactivated after suspension or termination. It inspects the current state of the service contract - including optional services (email, homepage, mailing list, Wi-Fi, IPv6, fixed IP address), device information (BBR router, VA phone), and service type (eo light NET, eo light telephone, eo mobile) - then creates the appropriate recovery SODs by delegating to specialized `addSOD`, `addTakinoSOD`, `addTokiSOD`, and `add050AddSod` methods.

The method handles **three primary service categories**: (1) **Network services** (eo light NET / eo light ADSL, svc_kind "1" or "5"), where it processes FTTH authentication recovery, multi-session and fixed IP optional service re-registration, BBR device recovery, multi-function router (Takino) configuration, IPv6 session handling, and pause/termination state handling; (2) **Mobile services** (eo mobile, svc_kind "4"), where it handles e-mobile suspend removal, WiMAX device recovery, WiFi Spot session reactivation, and email/homepage/mail-list service restoration; and (3) **Telephone services** (eo light telephone, svc_kind "2"), where it processes OLS (Optical Line Terminal) setup including phone number add-on, SIP registration, ENUM configuration, phone number portability (bangou pos), number change (bangou kae) operations, and emergency notification registration.

The design pattern is a **routing/dispatch pattern** - the method first determines the service kind via `jdgSvcKind()`, then branches into deeply nested conditional logic with per-service-type loops over optional service codes. Each branch collects operational contract data via service component calls (`callEKK*SC`), then produces one or more SOD documents. It acts as a **shared business logic gateway** called from `hakkoSOD()` (the main SOD generation entry point), coordinating complex multi-step order issuance across the entire telecom product portfolio.

## 2. Processing Pattern (Detailed Business Logic)

```mermaid
flowchart TD
    START(["kaihkOdrCtrl begin"])
    START --> INIT["Extract SOD maps, svc_kei_no, svc_kind"]
    INIT --> SVCJUDGE{"svc_kind == NET/ADSL?"}
    SVCJUDGE --> NET["Network branch"]
    SVCJUDGE --> MOBILE{"svc_kind == MOBILE?"}
    MOBILE --> MOB["Mobile branch"]
    MOBILE --> TEL["Telephone branch"]

    NET --> MLTISEQ["callEKK0351B002SC multi-session"]
    NET --> FIXIPAD["callEKK0351B002SC fixed IP"]
    NET --> BBRCHK["callEKK0341B008SC device provider"]
    BBRCHK --> TAKINO["checkTakinoRT"]
    TAKINO --> SAMETRANS["getSame_trn_no"]
    SAMETRANS --> FTTH["addSOD FTTH Auth Recovery 105"]
    FTTH --> MLTISESTAT{"stat == 100 or 210?"}
    MLTISESTAT --> MLTISESET["Set mltise fields"]
    MLTISESET --> MLTDYN{"Multi-session active, Fixed IP empty?"}
    MLTDYN --> ADDMLTCHG["addSOD Multi-session Change 142"]
    MLTDYN --> MLSTATCHK{"Multi-session AND Fixed IP?"}
    MLSTATCHK --> ADDMLTREC["addSOD Multi-session Static Recovery 161"]
    ADDMLTREC --> ADDMLCHG2["addSOD Multi-session Change 162"]
    MLSTATCHK --> ADDFIXIP["addSOD Fixed IP Change 153"]
    MLTISESTAT --> IPV6LOOP["jdgIpv6EKK0361A010"]
    IPV6LOOP --> STATCHECK{"svc_kei_stat == 210?"}
    STATCHECK --> PAUSECHK{"pause_stp_cd == 02?"}
    PAUSECHK --> PAUSE["pauseUkOdrCtrl"]
    PAUSECHK --> STOP["stpUkOdrCtrl"]
    PAUSECHK --> TELBRANCH["Continue to TEL"]

    TELBRANCH --> TELTEL["callEKK0251B001SC tel svc line list"]
    TELTEL --> TELOPS["callEKK0351B002SC tel opt svc"]
    TELOPS --> TELLOOP["Loop: N050, DSP_ME, TENSO"]
    TELLOOP --> Z1CHK{"Z1 order sent?"}
    Z1CHK --> Z1SKIP["opSodCtrl / addSODTelNew + return"]
    Z1CHK --> OLS["callEKK0191A010SC + EKK0341B008SC"]
    OLS --> DEVSET["Set kktk fields"]
    DEVSET --> TELTAKINO["checkTakinoRT"]
    TELTAKINO --> TELCHG{"chgSvcKeiJdg?"}
    TELCHG --> TELSAMETRANS["getSame_trn_no"]
    TELSAMETRANS --> RADIUS["addSOD Radius Auth Recovery 206"]
    RADIUS --> TELNOCHK{"telnoJun == 2?"}
    TELNOCHK --> TEL2ADD["addSOD OLS Phone Add 208"]
    TELNOCHK --> TEL1ADD["addSOD OLS Registration 207"]
    TEL1ADD --> SIPREG["addSOD SIP Registration 218"]
    TEL2ADD --> SIPREG
    SIPREG --> BMPCHK{"BMP_UM == ARI?"}
    BMPCHK --> BMPREG["isBmpOpenZumi + addSOD 225"]
    BMPCHK --> NBMPCHK{"not TajgsTelNo AND isMonaiBmp?"}
    NBMPCHK --> NBMPREG["addSOD 225 + ENUM 265"]
    BMPREG --> BMPTMP["addSOD SIP Temp Suspend 223"]
    TELLOOP --> TOKI["addTokiSOD"]
    TOKI --> N050CHK{"no050Um?"}
    N050CHK --> N050ADD["add050AddSod"]
    N050ADD --> TEL3["addSOD Emergency notification 250"]
    TEL3 --> PAUSE3{"svc_kei_stat == 210?"}
    PAUSE3 --> PAUSE3["pauseUkOdrCtrl"]
    PAUSE3 --> END(["return param"])

    TELBRANCH --> MOBILE2["Mobile branch"]
    MOBILE2 --> SPOTSKIP["same_trn_no = empty"]
    SPOTSKIP --> MOBMTRANSFER["getSame_trn_no"]
    MOBMTRANSFER --> EKK0161["callEKK0161A010SC"]
    EKK0161 --> UCWKPICK["Get ucwkPcrsCd"]
    UCWKPICK --> EMOBILECHK{"isEmobile?"}
    EMOBILECHK --> EMOADDSKIP["addSOD e-mobile Suspend Removal 315"]
    EMOADDSKIP --> EMOPS["callEKK0351B002SC mobile ops"]
    EMOPS --> EMLPLOOP["Loop: email/HP/mail-list"]
    EMLPLOOP --> UQCHK{"ucwkPcrsCd == WiMAX?"}
    UQCHK --> UQDEV["callEKK0341B002SC UQ device"]
    UQDEV --> UQREC["tsuikabunAddSOD WiMAX CUI Recov 316"]
    UQREC --> UQDEVREC["tsuikabunAddSOD WiMAX DEV Recov 317"]
    UQDEVREC --> UQOPS["callEKK0351B002SC UQ ops"]
    UQOPS --> UQLPLOOP["Loop: email/HP/mail-list"]
    UQLPLOOP --> WIFILOOPCHK{"pcrsCd == FREE_WIFI/WIFISPOT?"}
    WIFILOOPCHK --> UPDATESPOT["countUpWiFiSpotSessions"]
    UPDATESPOT --> WIFICHECK{"wifiSpotCnt > 0?"}
    WIFICHECK --> WIFICNG["tsuikabunAddSOD WiFi Spot Change 302"]
    WIFICHECK --> WIFIINS["tsuikabunAddSOD WiFi Spot Reg 301"]
    WIFIINS --> MAILCHK{"pcrs_cd == MailAddress?"}
    MAILCHK --> MAILOPS["callEKK0351B002SC mail ops"]
    MAILOPS --> MAILLP["Loop: email + mail-list"]
    MAILLP --> END2(["return param"])

    MLTISESTAT --> MLTISESET
    EMAIL --> IPV6LOOP
    HPB002 --> IPV6LOOP
    MLIST --> IPV6LOOP
    DUP --> IPV6LOOP
    FMTCEL --> IPV6LOOP
    IPV6 --> IPV6LOOP
    BBRLP --> TAKINO
    MLTISESET --> MLTDYN
    ADDMLTCHG --> IPV6LOOP
    ADDMLTREC --> IPV6LOOP
    ADDMLCHG2 --> IPV6LOOP
    ADDFIXIP --> IPV6LOOP
    TEL2ADD --> TEL1TAK{"takino_flg != 9?"}
    TEL1TAK --> TEL1TAKADD["addTakinoSOD 408"]
    TEL1TAKADD --> SIPREG
    TEL1ADD --> TEL1TAK2{"takino_flg == 2?"}
    TEL1TAK2 --> TEL1TAK4{"takino_flg == 4 or 1?"}
    TEL1TAK4 --> TEL1TAKADD2["addTakinoSOD 407"]
    TEL1TAKADD2 --> SIPREG
    NBMPREG --> ENUM["addSOD ENUM 265"]
    ENUM --> TOKI
    TEL3 --> TELTAKINO2["checkTakinoRT"]
    TELTAKINO2 --> TELCHG
    LOOPOPS --> EMAIL
    LOOPOPS --> HPB002
    LOOPOPS --> MLIST
    LOOPOPS --> DUP
    LOOPOPS --> FMTCEL
    LOOPOPS --> IPV6
    BBRCHK --> BBRLP
    BBRLP --> BBRSET["Set kktk fields"]
    BBRSET --> TAKINO
    SPOTSKIP --> MOBILECHK
    MOBMTRANSFER --> NONMLCHK
    EMOADDSKIP --> EMOPS
    TEL1TAKADD --> SIPREG
    N050ADD --> TEL3
    N050CHK --> TOKI2["addTokiSOD"]
    TOKI2 --> N050CHK2{"no050Um?"}
    N050CHK2 --> N050ADD2["add050AddSod"]
    N050ADD2 --> TEL3
    N050CHK2 --> TOKI3["addTokiSOD"]
    TOKI3 --> TEL3
    STATCHECK --> TELBRANCH
    MLTISESTAT --> MLTISESET
    MLTISESTAT --> MLTICONT["Continue to main ops"]
    MLTICONT --> MAINOPS["callEKK0351B002SC main"]
    MAINOPS --> LOOPOPS
    MLTISEQ --> MAINOPS
    FIXLOOP --> MAINOPS
    FIXIPAD --> MAINOPS
```

**Key Processing Steps:**

1. **Initialization** (L7194-7217): Extract SOD maps (sod_kihon_info, svc_kei_info, svc_kei_ucwk_info) from sodMap via shkkaMap() null-checks. Obtain sys_id, ido_div, svc_kei_no, svc_kei_ucwk_no, chaf_svc_kei_ucwk_gene_add_dtm, isNewCourseFlag, isOldCourseAvailable. Initialize instance fields for fixed IP and multi-session tracking.

2. **Service Kind Determination** (L7237): Call jdgSvcKind() to determine service type (NET=1, TEL=2, MOB=4, ADSL=5, ELSE=99).

3. **Network Branch** (L7241-8036): If svc_kind == NET or ADSL:
   - If not ADSL or ADSL Furetsu, query multi-session via callEKK0351B002SC + EKK0351A010SC, filter by status.
   - Query fixed IP via callEKK0351B002SC + EKK0351A010SC.
   - Query all optional services via callEKK0351B002SC, dispatch by op_svc_cd (B001=Email, B002=Homepage, B003=Mailing list, B020=Dial-up, B070=IPv6, B075=Flett Cell).
   - Query device provider via callEKK0341B008SC, filter for BBR, check status 100/210/030.
   - Call checkTakinoRT() for router flag. getSame_trn_no() for transaction number.
   - addSOD FTTH Auth Recovery (105). Based on multi-session/fixed IP presence, issue SODs 142/161/162/153.
   - jdgIpv6EKK0361A010 for IPv6. If svc_kei_stat == 210, check pause_stp_cd, issue pause or termination SODs.

4. **Mobile Branch** (L8036-8366): If svc_kind == MOBILE:
   - WiFi Spot: same_trn_no empty. chgSvcKeiJdg: getSame_trn_no.
   - If pcrs_cd != MailAddress, callEKK0161A010SC for ucwkPcrsCd.
   - e-mobile: addSOD Suspend Removal (315), then callEKK0351B002SC for ops.
   - WiMAX: callEKK0341B002SC device, tsuikabunAddSOD WiMAX CUI Recov (316) + DEV Recov (317).
   - WiFi Spot/Free: countUpWiFiSpotSessions, tsuikabunAddSOD WiFi Spot Change (302) or Reg (301).
   - MailAddress: callEKK0351B002SC for ops (email, mail-list).

5. **Telephone Branch** (L8366-8895): If svc_kind == TEL:
   - callEKK0251B001SC for tel svc line, callEKK0161A010SC for contract agreement.
   - callEKK0351B002SC for tel ops, loop N050/DSP_ME/TENSO.
   - If Z1 order not sent: edit4OpSetOdrCtrl, callEKK1081B001SC, addSODTelNew, early return.
   - If Z1 sent: callEKK0191A010SC + EKK0341B008SC (with EKK0341B008_02SC for EG switch).
   - isRegalVaKiki check, set kktk fields. checkTakinoRT(), chgSvcKeiJdg().
   - Radius Auth Recovery (206). telnoJun dispatch: OLS Registration (207) or Phone Add (208), Takino (406-408).
   - SIP Registration (218). BMP check: isBmpOpenZumi()/isTajgsTelNo() for SIP Phone Reg (225) or Temp Suspend (223).
   - No BMP: isTajgsTelNo() + isMonaiBmp() for Reg + ENUM (265).
   - telOpUm: addSOD (219). addTokiSOD(). no050Um: add050AddSod. Emergency notification (250).
   - svc_kei_stat == 210: pauseUkOdrCtrl.
