# Business Logic — FUW00943SFLogic.selectSvcNm() [807 LOC]

| Field | Value |
|-------|-------|
| Fully Qualified Name | `eo.web.webview.FUW00943SF.FUW00943SFLogic` |
| Layer | Controller (Web Business Logic) |
| Module | `FUW00943SF` (Package: `eo.web.webview.FUW00943SF`) |

## 1. Role

### FUW00943SFLogic.selectSvcNm()

This method constructs a formatted, human-readable service name string (StringBuilder) for email delivery purposes. It is the central text-aggregation engine used when sending subscription confirmation emails for K-Opticom's "eo Hikari" (fiber optic) service bundle. The method accepts a single X31SDataBeanAccess parameter that carries the complete set of subscribed services selected by the customer during the order process — including Internet (eo Hikari Net), telephone (eo Hikari Denwa), and television (eo Hikari TV) — as well as numerous optional add-ons.

The method implements a routing/dispatch pattern: it first checks which of the three core services (Net, Tel, TV) were selected, then branches into service-specific processing. For each selected service, it extracts sub-features (e.g., network speed tier, discount type, set-top box count and type, phone line features) and resolves display text via JFUWebCommon.getDispText() using message keys from the FUW00943 screen. It also handles supplementary service packs (Famipa Pack, Security Pack, Premium Pack), device purchases (GH terminals), bundled plans (PC/TV plans, mineo set discount), and content services.

Its role in the larger system is as a data transformer and presenter: it is called from finMskm() (the finalization method for in-store/visiting sales screen FUW00943) to build the service name portion of the automatic confirmation email sent to customers after they submit an order. The output is a multi-line StringBuilder where each line break ("\r
" = JFUStrConst.RETURN_CODE) separates a distinct service component, making the email readable for end users.

## 2. Processing Pattern (Detailed Business Logic)

```mermaid
flowchart TD
    START(["selectSvcNm(webNewInfoBean)"])
    START --> LOAD["Load beans: bnKykSrv, bnNet, bnEotel, bnTv, keiyakushaInfoBean, mansionInfoBean, elseInfoBean"]
    LOAD --> EXTRACT["Extract strings: tkHoshikiPtnCd, mskmKsnSvc, mskmMnsType, svcNet, svcTv, svcTel, kshaddOverwriteFlg"]
    EXTRACT --> CHK_CONTRACT["If kshaddOverwriteFlg = KEI_OVERWRITE_TRUE"]
    CHK_CONTRACT --> CONTRACT_APP["Append: Contract change reservation text + line breaks"]
    CONTRACT_APP --> CHK_NET["If svcNet = SELECT_SVC_NET_CHOICE"]
    CHK_NET --> NET_TRUE["Net selected: Yes"]
    NET_TRUE --> NET_LOAD["Load net details: netCourse, netSokuwari, netChowari, netAutoKeizoku, tonai_speed_cd, netFamipa, netRemote, netSmalin, netStb, netGh, netSecurityPack, netInetsgwl, netNtfmlprm, netPremiumPack, netWirelessLan, netMeshWiFi"]
    NET_LOAD --> NET_TYPE["Determine mlNetSvcNm by mskmKsnSvc + mskmMnsType"]
    NET_TYPE --> NET_CRS["Determine mlCourse by netCourse value"]
    NET_CRS --> NET_APPEND["Append: mlNetSvcNm + mlCourse"]
    NET_APPEND --> NET_DISCNT1["If netSokuwari = NET_SOKUWARI_MSKM"]
    NET_DISCNT1 --> DISCNT1_APP["Append: Line break + Sokuwari text"]
    DISCNT1_APP --> NET_DISCNT2["If netChowari = NET_CHOWARI_MSKM"]
    NET_DISCNT2 --> DISCNT2_APP["Append: Line break + Chowari text"]
    DISCNT2_APP --> NET_AUTO["If netAutoKeizoku = NET_AUTO_KEIZOKU_MSKM"]
    NET_AUTO --> AUTO_APP["Append: Line break + Auto-keizoku text"]
    AUTO_APP --> NET_FAMIPA["If netFamipa = FP_MSKM_MSKM"]
    NET_FAMIPA --> FAMIPA_APP["Append: Line break + Famipa pack text; set famipaFlg=true"]
    FAMIPA_APP --> NET_SEC["If netSecurityPack = SECURITY_PAC_MSKM"]
    NET_SEC --> SEC_APP["Append: Line break + Security pack text; set securityPackFlg=true"]
    SEC_APP --> NET_REMOTE["If netRemote=RMTSPRT_MSKM_MSKM OR netPremiumPack=SMALIN_PREMIUM_PACK_MSKM"]
    NET_REMOTE --> REMOTE_APP["Append: Line break + Remote support / Premium pack text"]
    REMOTE_APP --> NET_STB["If netStb = NET_STICK_STB_MSKM"]
    NET_STB --> STB_APP["Append: Line break + Stick STB text"]
    STB_APP --> NET_MESH["If netMeshWiFi = MESH_WIFI_MSKM"]
    NET_MESH --> MESH_APP["Append: Line break + Mesh WiFi text"]
    MESH_APP --> NET_WLAN["If netWirelessLan = PLC_MSKM_MSKM"]
    NET_WLAN --> WLAN_APP["Append: Line break + Wireless LAN text"]
    WLAN_APP --> NET_SMAL["If netSmalin = SMALIN_TABLET_MSKM"]
    NET_SMAL --> SMAL_APP["Append: Line break + Smartin text"]
    SMAL_APP --> NET_GH["If netGh = GH_TANMT_BUY"]
    NET_GH --> GH_APP["Append: Line break + GH terminal text"]
    GH_APP --> NET_INET["If netInetsgwl = INETSGWL_MSKM"]
    NET_INET --> INET_APP["Append: Line break + Internet gateway text"]
    INET_APP --> NET_NTFML["If netNtfmlprm = NTFMLPRM_MSKM"]
    NET_NTFML --> NTFML_APP["Append: Line break + Notified premium text"]
    NTFML_APP --> NET_PCPLN["If netPc_pln = PC_PLN_MSKM"]
    NET_PCPLN --> PCPLN_APP["Append: Line break + PC plan text"]
    PCWPLN_APP --> PCWPLN_CHECK["If netPcw_pln = PCW_PLN_MSKM"]
    PCWPLN_CHECK --> PCWPLN_APP2["Append: Line break + PCW plan text"]
    PCWPLN_APP2 --> TVPLN_CHECK["If netTv_pln = TV_PLN_MSKM"]
    TVPLN_CHECK --> TVPLN_APP2["Append: Line break + TV plan text"]
    TVPLN_APP2 --> NET_MINEO["If mineo set plan = 1/2 AND mineoNo NOT EMPTY"]
    NET_MINEO --> MINEO_APP["Append: Line break + mineo set plan text + mineoNo"]
    MINEO_APP --> NET_POST["If svcTel=SELECT_SVC_TEL_CHOICE OR svcTv=SELECT_SVC_TV_CHOICE: Append 2 line breaks"]
    NET_POST --> CHK_TEL["If svcTel = SELECT_SVC_TEL_CHOICE"]
    CHK_TEL --> TEL_TRUE["Tel selected: Yes"]
    TEL_TRUE --> TEL_LOAD["Load telCourse, bnEotel[0/1] details"]
    TEL_LOAD --> TEL_COURSE1["If telCourse = TEL_COURSE_1BANGOU_SVC"]
    TEL_COURSE1 --> TEL1_APP["Set mlTelNm = Tel1 text"]
    TEL1_APP --> TEL_COURSE2["If telCourse = TEL_COURSE_2BANGOU_SVC"]
    TEL_COURSE2 --> TEL2_APP["Set mlTelNm = Tel2 text; check bmpUm2+bmp_cancel_2 for Use/NotUse"]
    TEL2_APP --> TEL_BNP["Append: mlTelNm + linebreaks + mlBnp1 + bmpUm1 text"]
    TEL_BNP --> TEL_OPTS1["Check each tel option: hashinTch, easepack, eohtlPack3, eohtlPack7, hashinDsp, forwardTel, hitsuchiKyohi"]
    TEL_OPTS1 --> TEL_OPTS2["For each matched: Append linebreak + display text"]
    TEL_OPTS2 --> TEL_BNP2["If telCourse = TEL_COURSE_2BANGOU_SVC: Append mlBnp2 + bmpUm2 text"]
    TEL_BNP2 --> TEL_OPTS2DETAIL["For each 2nd line option: Append linebreak + display text"]
    TEL_OPTS2DETAIL --> TEL_POST["If svcTv=SELECT_SVC_TV_CHOICE: Append 2 line breaks"]
    TEL_POST --> CHK_TV["If svcTv = SELECT_SVC_TV_CHOICE"]
    CHK_TV --> TV_TRUE["TV selected: Yes"]
    TV_TRUE --> TV_LOAD["Load eoTVCourse, stbCnt"]
    TV_LOAD --> TV_APPEND["Append: mlTvCourse + linebreak"]
    TV_APPEND --> TV_BASIC["If eoTVCourse = EO_TV_COURSE_BASIC"]
    TV_BASIC --> TV_STBLOOP["Loop over stbCnt: append mlStb[i] + mlStbHd + mlStbNm"]
    TV_STBLOOP --> TV_GUIDE["If guideCnt != UNNECESSARY: Append linebreak + guide text"]
    TV_GUIDE --> TV_BSSTAR["If eoTVCourse = EO_TV_COURSE_BS_STAR"]
    TV_BSSTAR --> TV_BSAPP["Append: BS Star text"]
    TV_BSAPP --> TV_CS["If eoTVCourse=CS_PREMIUM or CS_BASIC: Append + guide text"]
    TV_CS --> TV_DEFAULT["Else: Append BS text"]
    TV_DEFAULT --> CONTENTS["Loop contentsList: collect contents where contSvcMskmChoice=true"]
    CONTENTS --> CONTENTS_APPEND["If contents found: Append 2 linebreaks + contents header"]
    CONTENTS_APPEND --> CONTENTS_LIST["For each contents: Append linebreak + bullet + contentsNm"]
    CONTENTS_LIST --> SECUPA["If securityPackFlg: Append 2 linebreaks + security pack detail (mansion or home)"]
    SECUPA --> FAMIPA_DTL["If famipaFlg: Append 2 linebreaks + famipa detail + optional mail + router detail"]
    FAMIPA_DTL --> ROUTER_MUSEN["Else if bnNet TKN_ROUTER_MUSEN: Append router + wireless detail"]
    ROUTER_MUSEN --> ROUTER_YUSEN["Else if bnNet TKN_ROUTER_YUSEN: Append router + wired detail"]
    ROUTER_YUSEN --> MESH_WIFI_DTL["If bnNet MESH_WIFI: Append Mesh WiFi title + detail"]
    MESH_WIFI_DTL --> PLC_WIFI_DTL["If bnNet PLC: Append Wireless LAN title + detail"]
    PLC_WIFI_DTL --> RETURN["Return serviceName"]
    CHK_CONTRACT -->|No| NO_CONTRACT["Skip contract change reservation"]
    NO_CONTRACT --> CHK_NET2["If svcNet = SELECT_SVC_NET_CHOICE"]
    CHK_NET2 -->|No| CHK_TEL2["If svcTel = SELECT_SVC_TEL_CHOICE"]
    CHK_TEL2 -->|No| CHK_TV2["If svcTv = SELECT_SVC_TV_CHOICE"]
    CHK_TV2 -->|No| CONTENTS2["Loop contentsList..."]
    CONTENTS2 -->|None| SECUPA2["Check securityPackFlg, famipaFlg, router details, Mesh WiFi, PLC"]
    SECUPA2 --> RETURN2["Return serviceName"]
    CHK_NET -->|No| NO_NET["Skip net processing"]
    NO_NET --> CHK_TEL2
    CHK_TEL -->|No| NO_TEL["Skip tel processing"]
    NO_TEL --> CHK_TV2
    CHK_TV -->|No| NO_TV["Skip tv processing"]
    NO_TV --> CONTENTS2
    NET_APP --> NET_DISCNT1
    DISCNT1_APP --> NET_DISCNT2
    DISCNT2_APP --> NET_AUTO
    AUTO_APP --> NET_FAMIPA
    FAMIPA_APP --> NET_SEC
    SEC_APP --> NET_REMOTE
    REMOTE_APP --> NET_STB
    STB_APP --> NET_MESH
    MESH_APP --> NET_WLAN
    WLAN_APP --> NET_SMAL
    SMAL_APP --> NET_GH
    GH_APP --> NET_INET
    INET_APP --> NET_NTFML
    NTFML_APP --> NET_PCPLN
    PCPLN_APP --> PCWPLN_CHECK
```

### Conditional Branch Details

1. **Contract Overwrite Reservation**: If `kshaddOverwriteFlg` equals `KEI_OVERWRITE_TRUE` (`"1"`), appends the "Contract change reservation" message with two line breaks.
2. **Net Service Branch**: If `svcNet` equals `SELECT_SVC_NET_CHOICE` (`"1"`), enters the Internet service detail block.
3. **Net Type Determination** (by mskmKsnSvc + mskmMnsType):
   - `MSKM_KSN_SVC_HOME` (`"1"`) → Home (mlNetSvcNm = Home type display text)
   - `MSKM_KSN_SVC_MANSION` (`"2"`) + `MSKM_MNS_TYPE_MEZON` (`"1"`) → Mezon type
   - `MSKM_KSN_SVC_MANSION` (`"2"`) + `MSKM_MNS_TYPE_MANSION` (`"2"`) → Mansion type
4. **Net Speed Course Resolution** (by netCourse):
   - `NET_COURSE_100M` (`"100M"`) → "100M Course"
   - `NET_COURSE_1G` (`"1G"`) → "1G Course"
   - `NET_COURSE_5G` (`"5G"`) → "5G Course"
   - `NET_COURSE_10G` (`"10G"`) → "10G Course"
   - `TK_HOSHIKI_PTN_VDSL` (`"1"`) / `TK_HOSHIKI_PTN_VDSLS` (`"2"`) for mansion VDSL → empty course
   - If `MT_CD01214_COURCE_CHANGE` (`"10240001"` or `"10240002"`) and `isTkHosikiChgSbtCd=true`: course overrides to `NET_COURSE_5G` or `NET_COURSE_10G`
5. **Discount Checks**: Each of netSokuwari, netChowari, netAutoKeizoku independently checked against their respective constant match values.
6. **Add-on Service Packs**: Independently checked — famipaFlg, securityPackFlg, Remote/Premium, Stick STB, Mesh WiFi, Smartin, GH terminal, Internet gateway, Notified premium.
7. **Bundled Plans**: PC plan, PCW plan, TV plan each independently checked.
8. **mineo Set Plan**: If `MINEO_SETPLAN_KBN_18` equals `"1"` or `"2"` AND `MINEO_SETPLAN_NO_18` is not empty.
9. **Telephone Service Branch**: If `svcTel` equals `SELECT_SVC_TEL_CHOICE` (`"1"`).
10. **Tel Course**: `TEL_COURSE_1BANGOU_SVC` (`"1"`) vs `TEL_COURSE_2BANGOU_SVC` (`"2"`).
11. **Phone Number Portability (BnpUm)**: For each line, if `USE_BMP_USE` (`"1"`) AND `bmp_cancel != BMP_CANCEL_FLG_CNL` (`"1"`), shows "Use"; otherwise "Not used".
12. **Telephone Options**: hashinTch, hashinDsp, forwardTel, easepack, eohtlPack3, eohtlPack7, hitsuchiKyohi — each checked independently with CHOICE constants.
13. **Television Service Branch**: If `svcTv` equals `SELECT_SVC_TV_CHOICE` (`"1"`).
14. **TV Course Types**:
    - `EO_TV_COURSE_BASIC` (`"1"`) → BasicHD/PremiumHD, loops over STB count
    - `EO_TV_COURSE_BS_STAR` (`"3"`) → Digital+BS Course, Star Channel Set
    - `EO_TV_COURSE_CS_PRE` (`"4"`) → CS Premium
    - `EO_TV_COURSE_CS_BAS` (`"5"`) → CS Basic
    - Default → Digital+BS
15. **STB HD Types**: `STB_HD_BASIC` (`"1"`) → BasicHD; `STB_HD_PREMIUM` (`"2"`) → PremiumHD; `STB_SM_COMPACT` (`"3"`) → Smart Compact; `STB_SM_BASIC` (`"4"`) → Smart Basic; else → Smart Premium.
16. **Guide**: If `GUIDEMG_CNT_13` != `GUIDEMG_CNT_UNNECESSARY` (`"0"`) and not empty.
17. **Content Services**: Loop over CONT_SVC_INFO, collect where CONT_SVC_MSKM_CHOICE_67 is true.
18. **Post-processing**: Security pack detail (mansion/home variant), Famipa pack detail, router details (wireless/wired), Mesh WiFi detail, Wireless LAN detail.

## 3. Parameter Analysis

| No | Parameter Name | Type | Business Description |
|----|---------------|------|---------------------|
| 1 | `webNewInfoBean` | `X31SDataBeanAccess` | The complete order data bean containing all subscribed services, customer information, and mansion details for the current subscription. It holds nested DataBean arrays for mansion info, contract services, phone services, content services, and miscellaneous info. |
| 2 | `bnKykSrv` (internal) | `X31SDataBeanAccess` | Retrieved via `getKeiyakusvcinfo()` — the contract service bean containing the selected service codes (Net, TV, Tel). |
| 3 | `bnNet` (internal) | `X31SDataBeanAccess` | Retrieved via `getEonet()` — the eo Hikari Net service bean containing network course, discounts, add-ons, and device options. |
| 4 | `bnEotel` (internal) | `X31SDataBeanAccess[]` | Retrieved via `getEotel()` — an array of 2 phone service beans (1st line and 2nd line) containing phone options, number portability, caller ID notification, and forwarding settings. |
| 5 | `bnTv` (internal) | `X31SDataBeanAccess` | Retrieved via `getEotv()` — the eo Hikari TV service bean containing TV course, STB count, and guide subscription. |
| 6 | `keiyakushaInfoBean` (internal) | `X31SDataBeanAccess` | Retrieved via `getKeiyakushaInfo()` — the contract holder info bean, used to check if contract address overwrites are reserved. |
| 7 | `mansionInfoBean` (internal) | `X31SDataBeanAccess` | Extracted from `webNewInfoBean.getDataBeanArray(CommonInfoCFConst.MANSION_INFO)` — the mansion/house info bean containing delivery method code and speed code. |
| 8 | `elseInfoBean` (internal) | `X31SDataBeanAccess` | Extracted from `webNewInfoBean.getDataBeanArray(CommonInfoCFConst.ELSE_INFO)` — miscellaneous info bean used for mineo set plan data. |
| 9 | `contentsMskmList` (internal) | `List<String>` | Dynamically collected list of content service names from CONT_SVC_INFO beans where CONT_SVC_MSKM_CHOICE_67 is true. |
| 10 | `famipaFlg` (internal) | `boolean` | Flag set to true when Famipa Pack is selected; used later for detail text branching (home vs mansion). |
| 11 | `securityPackFlg` (internal) | `boolean` | Flag set to true when Security Pack is selected; used later for detail text branching (mansion vs home). |

## 4. CRUD Operations / Called Services

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

| CRUD | SC / CBS | SC Code | Entity / DB | Operation Description |
|------|----------|---------|-------------|----------------------|
| - | `JFUMkmInfoAddUtil.isTkHosikiChgSbtCd` | JFUMkmInfoAdd | - | Calls `isTkHosikiChgSbtCd` in `JFUMkmInfoAddUtil` to check delivery method change status |
| R | `JEDK0011C080TPMA.getCount` | JEDK0011C080TPMA | - | Calls `getCount` in `JEDK0011C080TPMA` (called from `getEonet`) |
| R | `OneStopDataBeanAccessArray.getCount` | OneStopDataBeanAccessArray | - | Calls `getCount` in `OneStopDataBeanAccessArray` |
| R | `OneStopDataBeanAccessArray.getDataBean` | OneStopDataBeanAccessArray | - | Calls `getDataBean` in `OneStopDataBeanAccessArray` |
| R | `OneStopDataBeanAccess.getDataBeanArray` | OneStopDataBeanAccess | - | Calls `getDataBeanArray` in `OneStopDataBeanAccess` |
| - | `OneStopDataBeanAccess.sendMessageString` | OneStopDataBeanAccess | - | Calls `sendMessageString` in `OneStopDataBeanAccess` |
| R | `SCW00101SFLogic.getCount` | SCW00101SFLogic | - | Calls `getCount` in `SCW00101SFLogic` (called from `getKeiyakushaInfo`) |
| R | `JFUGetTabletTanmtCmpKbn.getDispText` | JFUGetTabletTanmtCmpKbn | - | Calls `getDispText` in `JFUGetTabletTanmtCmpKbn` for Smartin tablet comparison key lookup |
| R | `JFUMskmDmenMappingUtil.getDispText` | JFUMskmDmenMapping | - | Calls `getDispText` in `JFUMskmDmenMappingUtil` for delivery method mapping |
| R | `JFUWebCommon.getMansionTonaiSpeedCd` | JFUWebCommon | - | Calls `getMansionTonaiSpeedCd` to get building internal speed code |
| - | `JFUWebCommon.isTkHosikiChgSbtCd` | JFUWebCommon | - | Calls `isTkHosikiChgSbtCd` to check delivery method change business status |
| R | `FUW09905SFLogic.getDataBean` | FUW09905SFLogic | - | Calls `getDataBean` in `FUW09905SFLogic` (called from `getKeiyakushaInfo`) |
| R | `FUSV0277_FUSV0277OPDBMapper.getDataBean` | FUSV0277_FUSV0277OPDBMapper | - | Calls `getDataBean` in `FUSV0277_FUSV0277OPDBMapper` (called from `getKeiyakushaInfo`) |
| R | `FUW00162SFLogic.getDataBean` | FUW00162SFLogic | - | Calls `getDataBean` in `FUW00162SFLogic` (called from `getKeiyakushaInfo`) |
| R | `FUW07401SFLogic.getDispText` | FUW07401SFLogic | - | Calls `getDispText` in `FUW07401SFLogic` (called from `getEonet`) |
| R | `FUW07501SFLogic.getDispText` | FUW07501SFLogic | - | Calls `getDispText` in `FUW07501SFLogic` (called from `getEonet`) |
| R | `FUW12001SFLogic.getDispText` | FUW12001SFLogic | - | Calls `getDispText` in `FUW12001SFLogic` (called from `getEonet`) |
| R | `FUW00943SFLogic.getEonet` | FUW00943SFLogic | - | Calls `getEonet` to retrieve the eo Hikari Net service data bean |
| R | `FUW00943SFLogic.getEotel` | FUW00943SFLogic | - | Calls `getEotel` to retrieve the phone service data beans (array of 2) |
| R | `FUW00943SFLogic.getEotv` | FUW00943SFLogic | - | Calls `getEotv` to retrieve the eo Hikari TV service data bean |
| R | `FUW00943SFLogic.getKeiyakushaInfo` | FUW00943SFLogic | - | Calls `getKeiyakushaInfo` to retrieve the contract holder info |
| R | `FUW00943SFLogic.getKeiyakusvcinfo` | FUW00943SFLogic | - | Calls `getKeiyakusvcinfo` to retrieve the contract service bean with selected service codes |
| - | `JFUWebCommon.getDispText` | JFUWebCommon | - | Calls `getDispText` to resolve display text from message keys for the FUW00943 screen (used throughout for all service name text) |

**CRUD Classification by Business Meaning:**

All operations in this method are **Read (R)** — the method is a pure presentation transformer. It reads data beans, extracts service codes and feature flags, resolves display text via the message framework, and assembles the result. No Create, Update, or Delete operations occur.

## 5. Dependency Trace

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

No screen/batch entry points found within 8 hops. Direct callers found: 2 methods.
Terminal operations from this method: `getDispText` [R], `getDispText` [R], `getDispText` [R], `getDispText` [R], `getDispText` [R], `getDispText` [R], `getDispText` [R], `getDispText` [R], `getDispText` [R], `getDispText` [R], `getDispText` [R], `getDispText` [R], `getDispText` [R], `getDispText` [R], `getDispText` [R], `getEonet` [R], `getDispText` [R], `getDispText` [R], `getDispText` [R], `getDispText` [R]

| # | Caller (Screen/Batch) | Call Chain (Full Path to this Method) | Terminal (SC / CRUD / Entity) |
|---|----------------------|--------------------------------------|-------------------------------|
| 1 | Screen:FUW00943 | `FUW00943SFLogic.finMskm()` -> `FUW00943SFLogic.selectSvcNm()` | `JFUWebCommon.getDispText [R]` (message resolution) |

**Caller Description:**
- `finMskm()` is the finalization method of the same class `FUW00943SFLogic`. It is called from the in-store/visiting sales screen FUW00943 during order processing. It invokes `selectSvcNm()` to build the service name portion of the email confirmation content, then passes the result to the email sending infrastructure.

## 6. Per-Branch Detail Blocks

**Block 1** — [VARIABLE DECLARATIONS AND BEAN LOADING] (L2158)

> Loads all service beans, extracts contract holder info, mansion info, and miscellaneous info.

| # | Type | Code |
|---|------|------|
| 1 | SET | `serviceName = new StringBuilder()` |
| 2 | CALL | `bnKykSrv = getKeiyakusvcinfo(webNewInfoBean)` |
| 3 | CALL | `bnNet = getEonet(webNewInfoBean)` |
| 4 | CALL | `bnEotel = getEotel(webNewInfoBean)` |
| 5 | CALL | `bnTv = getEotv(webNewInfoBean)` |
| 6 | CALL | `keiyakushaInfoBean = getKeiyakushaInfo(webNewInfoBean)` |
| 7 | SET | `mansionInfoBean = webNewInfoBean.getDataBeanArray(MANSION_INFO).getDataBean(0)` |
| 8 | SET | `elseInfoBean = webNewInfoBean.getDataBeanArray(ELSE_INFO).getDataBean(0)` |
| 9 | SET | `tkHoshikiPtnCd = mansionInfoBean.sendMessageString(TEIKYO_HOSHIKI_PTN_CD_16, DATABEAN_GET_VALUE)` |
| 10 | SET | `mskmKsnSvc = webNewInfoBean.sendMessageString(MSKM_KSN_SVC_06, DATABEAN_GET_VALUE)` |
| 11 | SET | `mskmMnsType = webNewInfoBean.sendMessageString(MSKM_MNS_TYPE_06, DATABEAN_GET_VALUE)` |
| 12 | SET | `svcNet = bnKykSrv.sendMessageString(SELECT_SVC_NET_10, DATABEAN_GET_VALUE)` |
| 13 | SET | `svcTv = bnKykSrv.sendMessageString(SELECT_SVC_TV_10, DATABEAN_GET_VALUE)` |
| 14 | SET | `svcTel = bnKykSrv.sendMessageString(SELECT_SVC_TEL_10, DATABEAN_GET_VALUE)` |
| 15 | SET | `famipaFlg = false` |
| 16 | SET | `securityPackFlg = false` |
| 17 | SET | `kshaddOverwriteFlg = keiyakushaInfoBean.sendMessageString(KSHADD_OVERWRITE_FLG_09, DATABEAN_GET_VALUE)` |

**Block 2** — [IF] `(kshaddOverwriteFlg equals KEI_OVERWRITE_TRUE)` [KEI_OVERWRITE_TRUE="1"] (L2186)

> Appends the "Contract change reservation" message with line breaks if contract address overwrite is reserved.

| # | Type | Code |
|---|------|------|
| 1 | EXEC | `JFUStrConst.KEI_OVERWRITE_TRUE.equals(kshaddOverwriteFlg)` |
| 2 | CALL | `mailTextKyksh = JFUWebCommon.getDispText(SCREEN_ID_FUW00943, ML_DSP_CHG_RSV)` |
| 3 | SET | `serviceName.append(mailTextKyksh)` |
| 4 | EXEC | `serviceName.append(JFUStrConst.RETURN_CODE)` (line break) |
| 5 | EXEC | `serviceName.append(JFUStrConst.RETURN_CODE)` (line break) |

**Block 3** — [IF-ELSE] `(Net service selected)` [SELECT_SVC_NET_CHOICE="1"] (L2195)

> Main Net service processing block. When Net service is selected, loads all Net-related data and appends formatted service name text.

**Block 3.1** — [VARIABLE LOADING] (L2198)

> Loads all Net detail fields from the bean.

| # | Type | Code |
|---|------|------|
| 1 | SET | `netCourse = bnNet.sendMessageString(NET_COURSE_11, DATABEAN_GET_VALUE)` |
| 2 | SET | `netSokuwari = bnNet.sendMessageString(NET_SOKUWARI_11, DATABEAN_GET_VALUE)` |
| 3 | SET | `netChowari = bnNet.sendMessageString(NET_CHOWARI_11, DATABEAN_GET_VALUE)` |
| 4 | SET | `netAutoKeizoku = bnNet.sendMessageString(AUTO_KEIZOKU_11, DATABEAN_GET_VALUE)` |
| 5 | SET | `tonai_speed_cd = JFUWebCommon.getMansionTonaiSpeedCd(mansionInfoBean)` |
| 6 | SET | `netFamipa = bnNet.sendMessageString(FP_MSKM_11, DATABEAN_GET_VALUE)` |
| 7 | SET | `netRemote = bnNet.sendMessageString(RMTSPRT_MSKM_11, DATABEAN_GET_VALUE)` |
| 8 | SET | `netSmalin = bnNet.sendMessageString(TABLET_TANMT_MSKM_11, DATABEAN_GET_VALUE)` |
| 9 | SET | `netStb = bnNet.sendMessageString(NET_STICK_STB_MSKM_11, DATABEAN_GET_VALUE)` |
| 10 | SET | `netGh = bnNet.sendMessageString(GH_TANMT_11, DATABEAN_GET_VALUE)` |
| 11 | SET | `netSecurityPack = bnNet.sendMessageString(SECURITY_PACK_MSKM_11, DATABEAN_GET_VALUE)` |
| 12 | SET | `netInetsgwl = bnNet.sendMessageString(INETSGWL_MSKM_11, DATABEAN_GET_VALUE)` |
| 13 | SET | `netNtfmlprm = bnNet.sendMessageString(NTFMLPRM_MSKM_11, DATABEAN_GET_VALUE)` |
| 14 | SET | `netPremiumPack = bnNet.sendMessageString(PREMIUM_PACK_11, DATABEAN_GET_VALUE)` |
| 15 | SET | `netWirelessLan = bnNet.sendMessageString(PLC_MSKM_11, DATABEAN_GET_VALUE)` |
| 16 | SET | `netMeshWiFi = bnNet.sendMessageString(MESH_WIFI_11, DATABEAN_GET_VALUE)` |
| 17 | SET | `mlNetSvcNm = EMPTY` |

**Block 3.2** — [IF-ELSE IF-ELSE] `(Net service type determination)` (L2218)

> Determines the display name for the Net service based on mskmKsnSvc and mskmMnsType.

| # | Type | Code |
|---|------|------|
| 1 | IF | `MSKM_KSN_SVC_HOME.equals(mskmKsnSvc)` [MSKM_KSN_SVC_HOME="1"] |
| 2 | SET | `mlNetSvcNm = getDispText(SCREEN_ID_FUW00943, ML_DSP_NET_HF)` (Home type) |
| 3 | ELSE IF | `MSKM_KSN_SVC_MANSION.equals(mskmKsnSvc) && MSKM_MNS_TYPE_MEZON.equals(mskmMnsType)` [MSKM_KSN_SVC_MANSION="2", MSKM_MNS_TYPE_MEZON="1"] |
| 4 | SET | `mlNetSvcNm = getDispText(SCREEN_ID_FUW00943, ML_DSP_NET_MZ)` (Mezon type) |
| 5 | ELSE IF | `MSKM_KSN_SVC_MANSION.equals(mskmKsnSvc) && MSKM_MNS_TYPE_MANSION.equals(mskmMnsType)` [MSKM_MNS_TYPE_MANSION="2"] |
| 6 | SET | `mlNetSvcNm = getDispText(SCREEN_ID_FUW00943, ML_DSP_NET_MF)` (Mansion type) |

**Block 3.3** — [IF-ELSE] `(Network speed course override for delivery method change)` (L2232)

> If the mansion delivery method was changed and the building speed code matches the course-change codes, override the net course to 5G or 10G.

| # | Type | Code |
|---|------|------|
| 1 | IF | `isTkHosikiChgSbtCd(mansionInfoBean) && MT_CD01214_COURCE_CHANGE.contains(tonai_speed_cd)` [MT_CD01214_COURCE_CHANGE="10240001,10240002"] |
| 2 | IF | `tonai_speed_cd equals CD01214_008` [CD01214_008="10240002"] |
| 3 | SET | `netCourse = NET_COURSE_5G` [NET_COURSE_5G="5G"] |
| 4 | ELSE | SET | `netCourse = NET_COURSE_10G` [NET_COURSE_10G="10G"] |

**Block 3.4** — [IF-ELSE IF-ELSE] `(Network course display text resolution)` (L2244)

> Determines the display text for the Net course based on netCourse value.

| # | Type | Code |
|---|------|------|
| 1 | IF | `mskmKsnSvc=MANSION && mskmMnsType=MANSION && (tkHoshikiPtnCd=VDSL OR tkHoshikiPtnCd=VDSLS)` [TK_HOSHIKI_PTN_VDSL="1", TK_HOSHIKI_PTN_VDSLS="2"] |
| 2 | SET | `netCourse = EMPTY` (VDSL mansion override) |
| 3 | ELSE IF | `NET_COURSE_100M.equals(netCourse)` [NET_COURSE_100M="100M"] |
| 4 | SET | `mlCourse = getDispText(SCREEN_ID_FUW00943, ML_DSP_100M)` |
| 5 | ELSE IF | `NET_COURSE_1G.equals(netCourse)` [NET_COURSE_1G="1G"] |
| 6 | SET | `mlCourse = getDispText(SCREEN_ID_FUW00943, ML_DSP_1G)` |
| 7 | ELSE IF | `NET_COURSE_5G.equals(netCourse)` [NET_COURSE_5G="5G"] |
| 8 | SET | `mlCourse = getDispText(SCREEN_ID_FUW00943, ML_DSP_5G)` |
| 9 | ELSE IF | `NET_COURSE_10G.equals(netCourse)` [NET_COURSE_10G="10G"] |
| 10 | SET | `mlCourse = getDispText(SCREEN_ID_FUW00943, ML_DSP_10G)` |
| 11 | ELSE | SET | `mlCourse = getDispText(SCREEN_ID_FUW00943, ML_DSP_CRS_ + netCourse)` |

**Block 3.5** — [INDEPENDENT IFs] `(Net add-on service packs and discounts)` (L2252)

> Each add-on is checked independently. If matched, appends a line break followed by the display text.

| # | Type | Code |
|---|------|------|
| 1 | IF | `NET_SOKUWARI_MSKM.equals(netSokuwari)` → append `ML_DSP_SOKUWARI` |
| 2 | IF | `NET_CHOWARI_MSKM.equals(netChowari)` → append `ML_DSP_CHOWARI` |
| 3 | IF | `NET_AUTO_KEIZOKU_MSKM.equals(netAutoKeizoku)` → append `ML_DSP_AUTOK` |
| 4 | IF | `FP_MSKM_MSKM.equals(netFamipa)` → append `ML_DSP_FAMIPA`; set `famipaFlg = true` |
| 5 | IF | `SECURITY_PAC_MSKM.equals(netSecurityPack)` → append `ML_DSP_SECURITY_PACK`; set `securityPackFlg = true` |
| 6 | IF | `RMTSPRT_MSKM_MSKM.equals(netRemote) || SMALIN_PREMIUM_PACK_MSKM.equals(netPremiumPack)` → append `ML_DSP_REMOTE` |
| 7 | IF | `NET_STICK_STB_MSKM.equals(netStb)` → append `ML_DSP_STB` |
| 8 | IF | `MESH_WIFI_MSKM.equals(netMeshWiFi)` → append `ML_DSP_MESH_WIFI` |
| 9 | IF | `PLC_MSKM_MSKM.equals(netWirelessLan)` → append `ML_DSP_WIRELESS_LAN` |
| 10 | IF | `SMALIN_TABLET_MSKM.equals(netSmalin)` → append `ML_DSP_SMALIN` |
| 11 | IF | `GH_TANMT_BUY.equals(netGh)` → append `ML_DSP_GH` |
| 12 | IF | `INETSGWL_MSKM.equals(netInetsgwl)` → append `ML_DSP_INETSGWL` |
| 13 | IF | `NTFMLPRM_MSKM.equals(netNtfmlprm)` → append `ML_DSP_NTFMLPRM` |

**Block 3.6** — [INDEPENDENT IFs] `(Bundled PC/TV plans)` (L2306)

> PC plan, PCW plan, and TV plan are each checked independently.

| # | Type | Code |
|---|------|------|
| 1 | SET | `netPc_pln = bnNet.sendMessageString(KK_COMP_PC_MSKM_11, DATABEAN_GET_VALUE)` |
| 2 | SET | `netPcw_pln = bnNet.sendMessageString(KK_COMP_PCW_MSKM_11, DATABEAN_GET_VALUE)` |
| 3 | SET | `netTv_pln = bnNet.sendMessageString(KK_COMP_TV_MSKM_11, DATABEAN_GET_VALUE)` |
| 4 | IF | `PC_PLN_MSKM.equals(netPc_pln)` → append `ML_DSP_PC_PLAN` |
| 5 | IF | `PCW_PLN_MSKM.equals(netPcw_pln)` → append `ML_DSP_PCW_PLAN` |
| 6 | IF | `TV_PLN_MSKM.equals(netTv_pln)` → append `ML_DSP_TV_PLAN` |

**Block 3.7** — [IF] `(mineo Set Plan)` [MINEO_SETPLAN_KBN_18="1/2"] (L2322)

> If the customer applied for a mineo set discount, appends the mineo plan number.

| # | Type | Code |
|---|------|------|
| 1 | IF | `MINEO_SETPLAN_KBN_18` = "1" OR "2" AND `MINEO_SETPLAN_NO_18` != EMPTY |
| 2 | SET | `mineoNo = elseInfoBean.sendMessageString(MINEO_SETPLAN_NO_18, DATABEAN_GET_VALUE)` |
| 3 | SET | `mlNtfmlmineoSetPlan = getDispText(SCREEN_ID_FUW00943, ML_DSP_MSG_MINEO_SETPLAN)` |
| 4 | EXEC | `serviceName.append` with linebreak, plan text, and mineoNo |

**Block 3.8** — [IF] `(Net section closing line breaks)` (L2333)

> If Tel or TV are also selected, append two line breaks after Net service.

| # | Type | Code |
|---|------|------|
| 1 | IF | `svcTel=SELECT_SVC_TEL_CHOICE OR svcTv=SELECT_SVC_TV_CHOICE` → append 2 line breaks |

**Block 4** — [IF] `(Tel service selected)` [SELECT_SVC_TEL_CHOICE="1"] (L2341)

> Telephone service processing block. Handles 1st line and 2nd line phone services with all their optional features.

**Block 4.1** — [VARIABLE LOADING] (L2346)

| # | Type | Code |
|---|------|------|
| 1 | SET | `telCourse = webNewInfoBean.sendMessageString(TEL_COURSE_06, DATABEAN_GET_VALUE)` |
| 2 | SET | `mlTelNm = EMPTY` |
| 3 | SET | `mlBnpUm1 = EMPTY` |
| 4 | SET | `mlBnpUm2 = EMPTY` |

**Block 4.2** — [IF-ELSE IF] `(Tel course type)` (L2352)

| # | Type | Code |
|---|------|------|
| 1 | IF | `TEL_COURSE_1BANGOU_SVC.equals(telCourse)` [TEL_COURSE_1BANGOU_SVC="1"] → set `mlTelNm = ML_DSP_TEL1` |
| 2 | ELSE IF | `TEL_COURSE_2BANGOU_SVC.equals(telCourse)` [TEL_COURSE_2BANGOU_SVC="2"] → set `mlTelNm = ML_DSP_TEL2` |

**Block 4.2.1** — [Nested IF-ELSE] `(2nd line number portability)` (L2356)

| # | Type | Code |
|---|------|------|
| 1 | SET | `bmpUm2 = bnEotel[1].sendMessageString(USE_BMP_12, DATABEAN_GET_VALUE)` |
| 2 | SET | `bmp_cancel_2 = bnEotel[1].sendMessageString(BMP_CANCEL_FLG_12, DATABEAN_GET_VALUE)` |
| 3 | IF | `USE_BMP_USE.equals(bmpUm2) && !BMP_CANCEL_FLG_CNL.equals(bmp_cancel_2)` [USE_BMP_USE="1", BMP_CANCEL_FLG_CNL="1"] |
| 4 | SET | `mlBnpUm2 = getDispText(SCREEN_ID_FUW00943, ML_DSP_USE)` (Use) |
| 5 | ELSE | SET | `mlBnpUm2 = getDispText(SCREEN_ID_FUW00943, ML_DSP_NOT_USE)` (Not used) |

**Block 4.3** — [IF-ELSE] `(1st line number portability)` (L2370)

| # | Type | Code |
|---|------|------|
| 1 | SET | `bmpUm1 = bnEotel[0].sendMessageString(USE_BMP_12, DATABEAN_GET_VALUE)` |
| 2 | SET | `bmp_cancel_1 = bnEotel[0].sendMessageString(BMP_CANCEL_FLG_12, DATABEAN_GET_VALUE)` |
| 3 | IF | `USE_BMP_USE.equals(bmpUm1) && !BMP_CANCEL_FLG_CNL.equals(bmp_cancel_1)` |
| 4 | SET | `mlBnpUm1 = getDispText(SCREEN_ID_FUW00943, ML_DSP_USE)` |
| 5 | ELSE | SET | `mlBnpUm1 = getDispText(SCREEN_ID_FUW00943, ML_DSP_NOT_USE)` |

**Block 4.4** — [VARIABLE LOADING] `(1st line phone options)` (L2380)

| # | Type | Code |
|---|------|------|
| 1 | SET | `mlBnp1 = getDispText(SCREEN_ID_FUW00943, ML_DSP_BNP1)` |
| 2 | SET | `telHashinTch1 = bnEotel[0].sendMessageString(HASHINNO_TCH_12, DATABEAN_GET_VALUE)` |
| 3 | SET | `telHashinDsp1 = bnEotel[0].sendMessageString(HASHINNO_DSP_12, DATABEAN_GET_VALUE)` |
| 4 | SET | `telForwardTel1 = bnEotel[0].sendMessageString(FORWARD_TEL_12, DATABEAN_GET_VALUE)` |
| 5 | SET | `telEasepack1 = bnEotel[0].sendMessageString(EASE_PACK_12, DATABEAN_GET_VALUE)` |
| 6 | SET | `telEohtlPackThree1 = bnEotel[0].sendMessageString(EOHTL_PACK3_12, DATABEAN_GET_VALUE)` |
| 7 | SET | `telEohtlPackSeven1 = bnEotel[0].sendMessageString(EOHTL_PACK7_12, DATABEAN_GET_VALUE)` |
| 8 | SET | `telHitsuchiKyohi1 = bnEotel[0].sendMessageString(HITSUCHI_DNY_12, DATABEAN_GET_VALUE)` |

**Block 4.5** — [APEND] `(Append 1st line service name)` (L2392)

| # | Type | Code |
|---|------|------|
| 1 | EXEC | `serviceName.append(mlTelNm)` |
| 2 | EXEC | `serviceName.append(RETURN_CODE)` |
| 3 | EXEC | `serviceName.append(mlBnp1)` |
| 4 | EXEC | `serviceName.append(mlBnpUm1)` |

**Block 4.6** — [INDEPENDENT IFs] `(1st line option checks)` (L2398)

| # | Type | Code |
|---|------|------|
| 1 | IF | `HASHINNO_TCH_CHOICE.equals(telHashinTch1)` → append `ML_DSP_TEL_TCH1` |
| 2 | IF | `EASE_PACK_CHOICE.equals(telEasepack1)` → append `ML_DSP_TEL_EASE_PACK1` |
| 3 | IF | `EOHTL_PACK3_CHOICE.equals(telEohtlPackThree1)` → append `ML_DSP_TEL_PACK31` |
| 4 | IF | `EOHTL_PACK7_CHOICE.equals(telEohtlPackSeven1)` → append `ML_DSP_TEL_PACK71` |
| 5 | IF | `HASHINNO_DSP_CHOICE.equals(telHashinDsp1)` → append `ML_DSP_TEL_DSP1` |
| 6 | IF | `FORWARD_TEL_CHOICE.equals(telForwardTel1)` → append `ML_DSP_TEL_FORWARD1` |
| 7 | IF | `HITSUCHI_DNY_CHOICE.equals(telHitsuchiKyohi1)` → append `ML_DSP_TEL_KYOHI1` |

**Block 4.7** — [IF] `(2nd line processing)` [TEL_COURSE_2BANGOU_SVC="2"] (L2418)

> If 2nd line is selected, append 2nd line number portability info and all 2nd line phone options.

| # | Type | Code |
|---|------|------|
| 1 | EXEC | `serviceName.append(mlBnp2)` (from `ML_DSP_BNP2`) |
| 2 | EXEC | `serviceName.append(mlBnpUm2)` |
| 3 | SET | Load all 2nd line phone options (hashinTch2, hashinDsp2, forwardTel2, easepack2, eohtlPack3/7, hitsuchiKyohi2) |
| 4-10 | IF | Check each 2nd line option against CHOICE constant → append display text |

**Block 4.8** — [IF] `(Tel section closing line breaks)` (L2469)

> If TV is also selected, append two line breaks.

**Block 5** — [IF] `(TV service selected)` [SELECT_SVC_TV_CHOICE="1"] (L2479)

> Television service processing block. Handles TV course, STB count and types, and guide subscription.

**Block 5.1** — [VARIABLE LOADING] (L2482)

| # | Type | Code |
|---|------|------|
| 1 | SET | `mlTvCourse = getDispText(SCREEN_ID_FUW00943, ML_DSP_TV)` |
| 2 | SET | `eoTVCourse = bnTv.sendMessageString(EO_TV_COURSE_13, DATABEAN_GET_VALUE)` |
| 3 | SET | `stbCnt = bnTv.sendMessageString(STB_CNT_13, DATABEAN_GET_VALUE)` |
| 4 | EXEC | `serviceName.append(mlTvCourse)` |
| 5 | EXEC | `serviceName.append(RETURN_CODE)` |

**Block 5.2** — [IF-ELSE IF-ELSE] `(TV Course types)` (L2486)

| # | Type | Code |
|---|------|------|
| 1 | IF | `EO_TV_COURSE_BASIC.equals(eoTVCourse)` [EO_TV_COURSE_BASIC="1"] |
| 2 | SET | `intStbCnt = Integer.valueOf(stbCnt)` |
| 3 | FOR | `i = 0 to intStbCnt - 1`: loop over STBs |
| 4 | SET | `mlStb = getDispText(SCREEN_ID_FUW00943, ML_DSP_STB_TV[i])` |
| 5 | SET | `stbHd = bnTv.sendMessageString(ML_STB_HD[i], DATABEAN_GET_VALUE)` |
| 6 | IF-ELSE IF | `stbHd = STB_HD_BASIC("1")` → BasicHD; `STB_HD_PREMIUM("2")` → PremiumHD; `STB_SM_COMPACT("3")` → Smart Compact; `STB_SM_BASIC("4")` → Smart Basic; else → Smart Premium |
| 7 | SET | `mlStbNm = bnTv.sendMessageString(ML_STB_HD_NM[i], DATABEAN_GET_VALUE)` |
| 8 | IF | `i > 0` → append line break before STB entry |
| 9 | EXEC | `serviceName.append(mlStb)`, `mlStbHd`, `mlStbNm` |
| 10 | ELSE IF | `EO_TV_COURSE_BS_STAR.equals(eoTVCourse)` [EO_TV_COURSE_BS_STAR="3"] → append `ML_DSP_BS_STAR` |
| 11 | ELSE IF | `EO_TV_COURSE_CS_PRE.equals(eoTVCourse)` [EO_TV_COURSE_CS_PRE="4"] → append `ML_DSP_CS_PRE` + guide |
| 12 | ELSE IF | `EO_TV_COURSE_CS_BAS.equals(eoTVCourse)` [EO_TV_COURSE_CS_BAS="5"] → append `ML_DSP_CS_BAS` + guide |
| 13 | ELSE → append `ML_DSP_BS` |

**Block 5.3** — [IF] `(TV Guide subscription)` (L2542)

> If guide subscription count is not "0" (unnecessary) and not empty, append guide text.

| # | Type | Code |
|---|------|------|
| 1 | SET | `guideCnt = bnTv.sendMessageString(GUIDEMG_CNT_13, DATABEAN_GET_VALUE)` |
| 2 | IF | `!GUIDEMG_CNT_UNNECESSARY.equals(guideCnt) && !EMPTY.equals(guideCnt)` [GUIDEMG_CNT_UNNECESSARY="0"] |
| 3 | SET | `mlGuide = getDispText(SCREEN_ID_FUW00943, ML_DSP_TV_GUIDE + guideCnt)` |
| 4 | EXEC | `serviceName.append(RETURN_CODE)`, `mlGuide` |

**Block 6** — [LIST LOADING AND LOOP] `(Content services)` (L2554)

> Collects content service names where CONT_SVC_MSKM_CHOICE_67 is true, then appends them as a bulleted list.

| # | Type | Code |
|---|------|------|
| 1 | SET | `contentsMskmList = new ArrayList<String>()` |
| 2 | IF | `webNewInfoBean.getDataBeanArray(CONT_SVC_INFO).getCount() > 0` |
| 3 | SET | `contentsList = webNewInfoBean.getDataBeanArray(CONT_SVC_INFO)` |
| 4 | FOR | `i = 0 to contentsList.getCount() - 1` |
| 5 | SET | `contentsInfoBean = contentsList.getDataBean(i)` |
| 6 | IF | `contentsInfoBean.sendMessageBoolean(CONT_SVC_MSKM_CHOICE_67, DATABEAN_GET_VALUE)` |
| 7 | SET | `contentsMskmList.add(contentsInfoBean.sendMessageString(CONT_SVC_NM_67, DATABEAN_GET_VALUE))` |
| 8 | IF | `contentsMskmList.size() > 0` → append 2 linebreaks + `ML_DSP_MSG_CONTENTS` |
| 9 | FOR | `for (String contentsNm : contentsMskmList)` → append linebreak + "　　・" + contentsNm |

**Block 7** — [IF] `(Security pack detail)` (L2580)

> Appends Security Pack detail text, branching based on mansion type.

| # | Type | Code |
|---|------|------|
| 1 | IF | `securityPackFlg` |
| 2 | IF | `mskmKsnSvc=MANSION && mskmMnsType=MANSION` → append `ML_DSP_SECUPA_DTL_MANSION` |
| 3 | ELSE → append `ML_DSP_SECUPA_DTL_HOME` |

**Block 8** — [IF-ELSE IF-ELSE IF] `(Famipa Pack detail and Router details)` (L2597)

> If Famipa Pack was selected, append full Famipa detail including optional mail info, router text, and wireless detail. Otherwise, if router wireless/wired is enabled, append router detail.

| # | Type | Code |
|---|------|------|
| 1 | SET | `mlTknRouter = getDispText(SCREEN_ID_FUW00943, ML_DSP_TKN_ROUTER)` |
| 2 | SET | `mlRouterMusenDtl = getDispText(SCREEN_ID_FUW00943, ML_DSP_TKN_ROUTER_MUSEN_DTL)` |
| 3 | SET | `mlRouterYusenDtl = getDispText(SCREEN_ID_FUW00943, ML_DSP_TKN_ROUTER_YUSEN_DTL)` |
| 4 | IF | `famipaFlg` → append 2 linebreaks + `ML_DSP_FAMIPA_DTL`; if not mansion → append mail text; append router + wireless detail |
| 5 | ELSE IF | `TKN_ROUTER_MUSEN_MSKM.equals(bnNet.sendMessageString(TKN_ROUTER_MUSEN_MSKM_11, DATABEAN_GET_VALUE))` → append router + wireless detail |
| 6 | ELSE IF | `TKN_ROUTER_YUSEN_MSKM_MSKM.equals(bnNet.sendMessageString(TKN_ROUTER_YUSEN_MSKM_11, DATABEAN_GET_VALUE))` → append router + wired detail |

**Block 9** — [IFs] `(Mesh WiFi and Wireless LAN details)` (L2632)

> Appends Mesh WiFi and Wireless LAN detail sections if enabled.

| # | Type | Code |
|---|------|------|
| 1 | IF | `MESH_WIFI_MSKM.equals(bnNet.sendMessageString(MESH_WIFI_11, DATABEAN_GET_VALUE))` → append `ML_DSP_MESH_WIFI_TITLE` + `ML_DSP_MESH_WIFI_DTL` |
| 2 | IF | `PLC_MSKM_MSKM.equals(bnNet.sendMessageString(PLC_MSKM_11, DATABEAN_GET_VALUE))` → append `ML_DSP_WIRELESS_LAN_TITLE` + `ML_DSP_WIRELESS_LAN_DTL` |

**Block 10** — [RETURN] (L2648)

| # | Type | Code |
|---|------|------|
| 1 | RETURN | `return serviceName` |

## 7. Glossary

| Term | Type | Business Meaning |
|------|------|------------------|
| `mskmKsnSvc` | Field | Subscription delivery service type — "1" = Home (single dwelling), "2" = Mansion (multi-unit building) |
| `mskmMnsType` | Field | Subscription mansion type — "1" = Mezon (low-rise mansion), "2" = Mansion (high-rise) |
| `svcNet` | Field | Selected service indicator for Net (Internet) — "1" = selected |
| `svcTel` | Field | Selected service indicator for Telephone — "1" = selected |
| `svcTv` | Field | Selected service indicator for Television — "1" = selected |
| `netCourse` | Field | Network speed course code — "100M", "1G", "5G", "10G" |
| `tkHoshikiPtnCd` | Field | Delivery method pattern code — building wiring type code (VDSL="1", VDSLS="2") |
| `tonai_speed_cd` | Field | Building internal speed code — used to determine if delivery method was changed (codes "10240001", "10240002") |
| `netSokuwari` | Field | Instant discount flag for Net service |
| `netChowari` | Field | Long-term discount flag for Net service |
| `netAutoKeizoku` | Field | Auto-renewal flag for Net service contract |
| `netFamipa` | Field | Famipa Pack selection flag — a bundled service pack for home networks |
| `netSecurityPack` | Field | Security Pack selection flag — eo cybersecurity pack |
| `netRemote` | Field | Remote support plan selection flag |
| `netSmalin` | Field | Smartin (smart tablet) selection flag |
| `netStb` | Field | Stick-type STB (Set-Top Box) selection flag |
| `netGh` | Field | GH terminal purchase flag — purchased from GH (G-Hotels/NTT) |
| `netInetsgwl` | Field | Internet gateway selection flag |
| `netNtfmlprm` | Field | Notified premium selection flag |
| `netPremiumPack` | Field | Premium Pack selection flag |
| `netWirelessLan` | Field | Wireless LAN intermediate continuation function flag |
| `netMeshWiFi` | Field | eo Mesh WiFi selection flag |
| `netPc_pln` | Field | PC Plan bundled plan selection |
| `netPcw_pln` | Field | PCW (PC Wireless) Plan bundled plan selection |
| `netTv_pln` | Field | TV Plan bundled plan selection |
| `kshaddOverwriteFlg` | Field | Contract address overwrite flag — "1" = reservation for contract change |
| `telCourse` | Field | Telephone course type — "1" = 1st line (1-bangou service), "2" = 2nd line (2-bangou service) |
| `bmpUm1` / `bmpUm2` | Field | Number portability (BnpUm = Bangou Portability) use flag for 1st/2nd line — "1" = use |
| `bmp_cancel_1` / `bmp_cancel_2` | Field | Number portability cancel flag — "1" = cancel (meaning cancellation of portability is requested) |
| `telHashinTch1` / `telHashinTch2` | Field | Caller ID notification (Hashin-no Tsuuchi) for 1st/2nd line |
| `telHashinDsp1` / `telHashinDsp2` | Field | Caller ID display (Hashin-no Hyoji) for 1st/2nd line |
| `telForwardTel1` / `telForwardTel2` | Field | Call forwarding (Tenso Denwa) service for 1st/2nd line |
| `telEasepack1` / `telEasepack2` | Field | Anshin Phone Pack for 1st/2nd line |
| `telEohtlPackThree1` / `telEohtlPackSeven1` | Field | eo Hikari Denwa Pack 3 / Pack 7 for 1st/2nd line |
| `telHitsuchiKyohi1` / `telHitsuchiKyohi2` | Field | Hitsuchi-denwa rejection service (unsolicited call rejection) for 1st/2nd line |
| `eoTVCourse` | Field | TV course type — "1" = BasicHD/PremiumHD, "3" = Digital+BS + Star Channel Set, "4" = CS Premium, "5" = CS Basic |
| `stbCnt` | Field | Number of Set-Top Boxes for TV service |
| `stbHd` | Field | STB HD type — "1" = BasicHD, "2" = PremiumHD, "3" = Smart Compact, "4" = Smart Basic, other = Smart Premium |
| `guideCnt` | Field | eo Hikari TV Guide subscription count — "0" = unnecessary |
| `contSvcMskmChoice` | Field | Content service subscription flag — boolean true if content is subscribed |
| `contSvcNm` | Field | Content service name |
| `MINEO_SETPLAN_KBN_18` | Field | mineo set plan category — "1" or "2" indicates set discount application |
| `MINEO_SETPLAN_NO_18` | Field | mineo set plan number |
| `KEI_OVERWRITE_TRUE` | Constant | "1" — contract overwrite reservation flag value |
| `SELECT_SVC_NET_CHOICE` | Constant | "1" — Net service selected indicator |
| `SELECT_SVC_TEL_CHOICE` | Constant | "1" — Tel service selected indicator |
| `SELECT_SVC_TV_CHOICE` | Constant | "1" — TV service selected indicator |
| `MSKM_KSN_SVC_HOME` | Constant | "1" — Home subscription type |
| `MSKM_KSN_SVC_MANSION` | Constant | "2" — Mansion subscription type |
| `MSKM_MNS_TYPE_MEZON` | Constant | "1" — Mezon mansion type |
| `MSKM_MNS_TYPE_MANSION` | Constant | "2" — Mansion type |
| `NET_COURSE_100M` | Constant | "100M" — 100Mbps network course |
| `NET_COURSE_1G` | Constant | "1G" — 1Gbps network course |
| `NET_COURSE_5G` | Constant | "5G" — 5Gbps network course |
| `NET_COURSE_10G` | Constant | "10G" — 10Gbps network course |
| `TK_HOSHIKI_PTN_VDSL` | Constant | "1" — VDSL wiring pattern |
| `TK_HOSHIKI_PTN_VDSLS` | Constant | "2" — VDSLS wiring pattern |
| `MT_CD01214_COURCE_CHANGE` | Constant | "10240001,10240002" — delivery method change codes |
| `CD01214_008` | Constant | "10240002" — specific delivery method change code for 10G override |
| `USE_BMP_USE` | Constant | "1" — number portability use flag |
| `BMP_CANCEL_FLG_CNL` | Constant | "1" — number portability cancel flag |
| `GUIDEMG_CNT_UNNECESSARY` | Constant | "0" — guide unnecessary flag |
| RETURN_CODE | Constant | "\r
" — line break character used as separator in output |
| eo Hikari Net | Business term | K-Opticom's fiber optic internet service brand |
| eo Hikari Denwa | Business term | K-Opticom's fiber optic telephone service brand |
| eo Hikari TV | Business term | K-Opticom's fiber optic television service brand |
| Famipa Pack | Business term | Family package pack for home network services |
| Security Pack | Business term | eo cybersecurity security pack |
| Premium Pack | Business term | Premium pack for advanced features |
| GH Terminal | Business term | GH brand terminal (NTT equipment) purchased for eo Hikari service |
| Smartin | Business term | Smart tablet service for eo Hikari customers |
| mesh WiFi | Business term | Mesh Wi-Fi networking system for home coverage |
| mineo | Business term | Mineo mobile carrier set discount program |
| STB | Acronym | Set-Top Box — television decoding device |
| BS | Acronym | Broadcasting Satellite — Japanese satellite TV service |
| CS | Acronym | Communications Satellite — Japanese premium satellite TV service |
| K-Opticom | Business term | Japanese telecommunications provider (now au Hikari), part of KDDI group |
| eo | Business term | K-Opticom's brand prefix for consumer services (eo Hikari, eo Mobile) |
| finMskm | Method | Finalization method for in-store/visiting sales order processing |
| X31SDataBeanAccess | Technical | Data bean access class from the X31 web framework for accessing order data |
| JFUWebCommon.getDispText | Technical | Message resolution utility that maps message keys to localized display text |

---

Sources:
- `source/koptWebR/src/eo/web/webview/FUW00943SF/FUW00943SFLogic.java`
- `source/koptCommon/src/eo/common/constant/JFUStrConst.java`
- `source/koptWebFrontCommon/src/eo/web/webview/CommonInfoCF/CommonInfoCFConst.java`
", "len": 40245}