# Eo / Web / Webview / Crw03409sf

## Overview

The `CRW03409SF` module is the **retention prevention inquiry response view logic** for the e-Consumer Core Base System (`eo`). It serves as a central hub screen for customer service agents to handle inquiries related to subscription cancellation prevention. When a customer initiates a cancellation, this screen consolidates all necessary tools — inquiry management, messaging, customer information editing, escalation, and various external system links — into a single tabbed interface.

The module extends `JCCWebBusinessLogic` from the X31 web framework and coordinates data fetching, tab navigation, popup screen display, and inquiry lifecycle operations. It is invoked through two XML configurations: `WEBGAMEN_CRW034090PJP.xml` (screen definition) and `x31business_logic_CRW03409SF.xml` (business logic wiring).

## Key Classes and Interfaces

### CRW03409SFLogic

**Source**: [`CRW03409SFLogic.java`](source/koptWebB/src/eo/web/webview/CRW03409SF/CRW03409SFLogic.java)

The sole class in this module, `CRW03409SFLogic` is the view-side business logic controller for the retention prevention inquiry response screen. It extends `JCCWebBusinessLogic` and implements 36 methods covering every interaction on the page.

**Purpose and design role:**

This class acts as a **navigation and coordination hub**. Rather than encapsulating deep business logic itself, it delegates most operations to shared utility classes in `eo.web.webview.common.JCRWebCommon` and other common modules. Its primary responsibilities are:

1. **Screen initialization** — fetching inquiry data from the business tier, mapping it into form beans, and populating all display fields.
2. **Popup screen orchestration** — opening subordinate screens (inquiry input, cancellation, escalation, etc.) as popups, passing along necessary screen context and form data.
3. **Inquiry lifecycle management** — executing accept, reject, close, forced acquisition, and restart operations on inquiries.
4. **Tab-based navigation** — managing transitions between specialized tabs (MYBOX, Queue BOX, mail, inquiry history) within the page.

**Key constants:**

| Constant | Value Purpose |
|---|---|
| `SENYO_TAB_ID` | The screen ID for this inquiry response main page (`JCRScreenConst.SCREEN_ID_CRW03409`) |
| `SENYO_TAB_NAME` | The display name for this page |

#### Screen Initialization

**`init()`** (lines 103–276)

The primary entry point. Executes on the initial display of the page and performs a multi-step initialization:

1. **Retains screen information** via `JCRWebCommon.getScreenInfo(this)`.
2. **Initializes button/link states** by calling `JCRWebCommon.resetButtonStatus()` on both the service form bean and the common info bean.
3. **Clears all display list arrays** — campaign messages, connection device info, advance info, phone info, and billing info lists are all reset.
4. **Sets operation date and business parameter IDs** — operational date, machinery business parameter, advance business parameter, electricity/phone business parameter, campaign business parameter, area business parameter, and address book business parameter are all injected into the form bean.
5. **Loads inquiry response main common info** — calls `JCRWebCommon.setToiawaseMainCommonInfo(this, bean)` to populate shared screen items across tabs (v12.01.00).
6. **Early exit check** — if `SVC_KEI_NO` (service contract number) or `SYSID` is not set in the incoming data, the method sets the next screen ID and returns `true` without fetching data. This handles the case where the page is opened without a specific inquiry context.
7. **Service data fetching** — uses the `CRSV0084_CRSV0084OPDBMapper` mapping class to extract inquiry data from the database. This includes customer information, contract details, billing information, and more. The mapper calls are batched: `setCRSV008401SC` through `setCRSV008411SC`, plus additional mapping for specialized tabs (items 13–19) added in v12.00.00.
8. **Business fee calculation** — computes `JIM_FEE_RSLT` by calling `JCRWebCommon.getJimFee()` with the settlement code, fee amount, and temporary payment amount.
9. **Date format normalization** — replaces `20991231` placeholder dates with "blank" representations via `JZMWebCommon.replaceTendymd()` for end dates, cancellation dates, and various other date fields.
10. **Transfers main data** — calls `getMainData()` to push the status name into the dedicated tab status field.
11. **Sets the next screen ID** to `SENYO_TAB_ID` in the common info bean.

**`getMainData()`** (lines 1863–1871)

A private helper that transfers the inquiry response main screen data into the specialized tab. It reads the `SHINSA_STA_NM` (approval status name) field and sets it as the `STATUS` field for the dedicated tab. This is called at the end of `init()`.

#### Popup Screen Flows

The majority of methods in this class follow a consistent pattern: they set up screen context (parent screen ID and next screen ID) in the common info bean and then call one of the `copyBeanTo*` helper methods on `JCRWebCommon` to prepare data for the popup.

| Method | Popup Screen | Description |
|---|---|---|
| [`openCrw00101Ins()`](source/koptWebB/src/eo/web/webview/CRW03409SF/CRW03409SFLogic.java:781) | CRW00101 (Inquiry input) | Opens the inquiry input popup. Copies form data via `copyBeanToToiawaseIns()`. |
| [`openCrw00101Upd()`](source/koptWebB/src/eo/web/webview/CRW03409SF/CRW03409SFLogic.java:836) | CRW00101 (Inquiry update) | Opens the inquiry update popup. Uses `copyBeanToToiawaseUpd()`. |
| [`openCrw04001()`](source/koptWebB/src/eo/web/webview/CRW03409SF/CRW03409SFLogic.java:891) | CRW04001 (Escalation execution) | Opens the escalation execution popup. Uses `copyBeanToEscalation()`. |
| [`openCrw03901()`](source/koptWebB/src/eo/web/webview/CRW03409SF/CRW03409SFLogic.java:1003) | CRW03901 (Inquiry cancellation) | Opens the cancellation registration popup. Uses `copyBeanToCancel()`. |
| [`openCrw02603()`](source/koptWebB/src/eo/web/webview/CRW03409SF/CRW03409SFLogic.java:1058) | CRW02602 / CRW02604 (Customer edit) | Conditionally opens either the non-customer edit screen or the customer edit screen based on whether `PROSCST_NO` or `SVC_KEI_NO` is set. Uses `copyBeanToProscstUpd()`. |
| [`openCrw00401()`](source/koptWebB/src/eo/web/webview/CRW03409SF/CRW03409SFLogic.java:1130) | CRW00401 (Hotvoice registration) | Opens the Hotvoice registration popup. Uses `copyBeanToHotvoice()`. |
| [`openCrw04101()`](source/koptWebB/src/eo/web/webview/CRW03409SF/CRW03409SFLogic.java:1185) | CRW04101 (Document delivery) | Opens the document delivery registration popup. Uses `copyBeanToSendSiryo()`. |
| [`openCrw02401()`](source/koptWebB/src/eo/web/webview/CRW03409SF/CRW03409SFLogic.java:1240) | CRW02401 (Customer info list) | Navigates to the customer information list inquiry screen. Uses `copyBeanToProscstSearch()`. |
| [`openCrw00601()`](source/koptWebB/src/eo/web/webview/CRW03409SF/CRW03409SFLogic.java:1295) | CRW00601 (Memo registration) | Opens the memo registration popup. Uses `copyBeanToMemo()`. |
| [`openCrw00701()`](source/koptWebB/src/eo/web/webview/CRW03409SF/CRW03409SFLogic.java:1350) | CRW00701 (Mail reply) | Opens the mail reply popup. Uses `copyBeanToMailHensin()`. |
| [`openCrw00801()`](source/koptWebB/src/eo/web/webview/CRW03409SF/CRW03409SFLogic.java:1405) | CRW00801 (Mail forward) | Opens the mail forward popup. Uses `copyBeanToMailTenso()`. |
| [`openCrw10901()`](source/koptWebB/src/eo/web/webview/CRW03409SF/CRW03409SFLogic.java:2243) | CRW10901 (SMS send) | Opens the SMS send popup (added v53.00.00). Uses `copyBeanToSmsSend()`. |

#### Link and Navigation Flows

These methods handle special link clicks that open external systems or trigger specific page transitions.

| Method | Target | Description |
|---|---|---|
| [`clickLinkSeikyYm()`](source/koptWebB/src/eo/web/webview/CRW03409SF/CRW03409SFLogic.java:286) | CHW00105 (Billing detail) | Opens billing detail as a popup. Reads the selected row index from the billing list, then constructs a parameter map with `seikyKeiNo`, `saikenYm` (billing period), and `seikyNo`. |
| [`clickLinkMyboxCnt()`](source/koptWebB/src/eo/web/webview/CRW03409SF/CRW03409SFLogic.java:362) | CRW01301 (MYBOX list) | Opens the MYBOX list popup. Uses `copyBeanToMyBOX()`. |
| [`clickLinkQueboxCnt()`](source/koptWebB/src/eo/web/webview/CRW03409SF/CRW03409SFLogic.java:417) | CRW01401 (Queue BOX list) | Opens the queue list popup. Uses `copyBeanToQueBOX()`. |
| [`clickLinkMailCnt()`](source/koptWebB/src/eo/web/webview/CRW03409SF/CRW03409SFLogic.java:472) | CRW10301 (Simple mail send) | Opens the simple mail send popup. Uses `copyBeanToSendMail()`. |
| [`clickLinkMskmshoNoUk()`](source/koptWebB/src/eo/web/webview/CRW03409SF/CRW03409SFLogic.java:1805) | External image system (URL) | Opens the application form number (receipt) in an external image system. Constructs a URL from `JZDStrConst.PROP_KEY_MSKMSHO_SANSHO_URL` template with the application form number and one-time password. Sets `IMG_SYS_URL` and `IMG_SYS_DSP_FLG` in the form bean. |
| [`clickLinkTrank()`](source/koptWebB/src/eo/web/webview/CRW03409SF/CRW03409SFLogic.java:2121) | KKW00196 (Member rank) | Opens the member rank screen (added v26.00.00). Uses `clickLinkTrank()` helper from `JCRWebCommon`. |
| [`clickLinkVcms()`](source/koptWebB/src/eo/web/webview/CRW03409SF/CRW03409SFLogic.java:2182) | KKW00198 (Lease contract) | Opens the lease contract screen (added v53.00.00). Uses `clickLinkVcms()` helper from `JCRWebCommon`. |
| [`executeCis()`](source/koptWebB/src/eo/web/webview/CRW03409SF/CRW03409SFLogic.java:2063) | External power CIS | Handles the power CIS button click (added v16.00.00 for new electricity support). Delegates to `JCRWebCommon.executeCis()`. |

#### Inquiry Lifecycle Operations

These methods change the state of an inquiry. Each one calls a service via `JCRWebCommon.exec*()` and then performs a full page `refresh()`.

| Method | Operation | Service Call |
|---|---|---|
| [`accept()`](source/koptWebB/src/eo/web/webview/CRW03409SF/CRW03409SFLogic.java:1517) | Accept inquiry | `JCRWebCommon.execAccept()` |
| [`reject()`](source/koptWebB/src/eo/web/webview/CRW03409SF/CRW03409SFLogic.java:1460) | Reject inquiry | `JCRWebCommon.execReject()` |
| [`closeToiawase()`](source/koptWebB/src/eo/web/webview/CRW03409SF/CRW03409SFLogic.java:946) | Close inquiry | `JCRWebCommon.execClose()` |
| [`getKyosei()`](source/koptWebB/src/eo/web/webview/CRW03409SF/CRW03409SFLogic.java:1574) | Forced acquisition | `JCRWebCommon.execGetKyosei()` |
| [`restart()`](source/koptWebB/src/eo/web/webview/CRW03409SF/CRW03409SFLogic.java:1631) | Restart inquiry | `JCRWebCommon.execRestart()` |

Each of these methods takes `bean` and `commoninfoBean` as the `paramBean` array when calling the service, ensuring both the inquiry data and the screen context are passed to the business tier.

#### Reissue Workflows

Added in v13.00.00 (ANK-2433-00-00), these methods handle ID registration certificate reissue — a feature for customers who have lost their login credentials.

| Method | Description |
|---|---|
| [`clickSaihakko()`](source/koptWebB/src/eo/web/webview/CRW03409SF/CRW03409SFLogic.java:1883) | Validates that the user is a master member (individual or corporate) before allowing reissue. Uses the `CRSV0281_CRSV0281OPDBMapper` mapping class to check membership type. If not a master member, shows error `EKB1040_JW`. Otherwise, sets `CRW03410_OPN_FLG = true` and enables the reissue info output screen. |
| [`openCrw03410()`](source/koptWebB/src/eo/web/webview/CRW03409SF/CRW03409SFLogic.java:1994) | Opens the ID registration certificate reissue info output screen. Passes `url_info`, `web_accss_nskey`, `web_accss_nskey_pwd`, and `yk_kigen_dtm` (access expiration datetime) as parameters. Sets `CRW03410_OPN_FLG = false` to prevent unauthorized access. |

#### Tab Navigation

| Method | Description |
|---|---|
| [`clickTab()`](source/koptWebB/src/eo/web/webview/CRW03409SF/CRW03409SFLogic.java:700) | Handles tab transitions. First refreshes MYBOX/Queue BOX/mail counts via `JCRWebCommon.getMyboxQueboxMailCnt()`. Reads the clicked tab ID from `CURRENTTAB`. If the clicked tab is the main inquiry response tab (`SENYO_TAB_ID`), it calls `init()` to reinitialize. Otherwise, it sets parent screen IDs for all subordinate screens (MYBOX, Queue BOX, mail, inquiry input, escalation, cancellation, customer edit, Hotvoice, document delivery, customer list, memo, mail reply, mail forward, etc.) and copies form data to the target tab via `copyBeanToNextTab()`. |
| [`transferToMain()`](source/koptWebB/src/eo/web/webview/CRW03409SF/CRW03409SFLogic.java:1755) | Returns to the inquiry response main screen. Copies form data via `copyBeanToInitMain()`. |
| [`refresh()`](source/koptWebB/src/eo/web/webview/CRW03409SF/CRW03409SFLogic.java:1688) | Full page refresh. Calls `JCRWebCommon.getScreenInfo()`, then `JCRWebCommon.refreshPage()` to reload all data. If the previous screen was the document delivery screen (`CRW04101`), displays a success message (`EKB4390__I`) and redirects back to the main tab. Finally calls `init()` to reinitialize the entire page. |
| [`insertEasyMemo()`](source/koptWebB/src/eo/web/webview/CRW03409SF/CRW03409SFLogic.java:647) | Updates the quick memo. Calls `JCRWebCommon.execInsertEasyMemo()` and then `refresh()` to show the updated data. |
| [`display()`](source/koptWebB/src/eo/web/webview/CRW03409SF/CRW03409SFLogic.java:528) | Retrieves MYBOX, Queue BOX, and mail counts. Called when the display button is pressed. Passes `bean` and `commoninfoBean` to `JCRWebCommon.getMyboxQueboxMailCnt()`. |
| [`execute()`](source/koptWebB/src/eo/web/webview/CRW03409SF/CRW03409SFLogic.java:583) | Opens external system screens as popups. Calls `JCRWebCommon.execute()` (which was refactored in v12.00.00 to remove the manual mapping class usage and `getOnetPwd()` call). |
| [`receiveMessageWeb()`](source/koptWebB/src/eo/web/webview/CRW03409SF/CRW03409SFLogic.java:88) | Overrides the parent class method. The generated implementation always returns `false` and is not used in practice. |

## How It Works

### Typical Request Flow: Initial Page Load

When an agent navigates to the inquiry response page:

```mermaid
flowchart TD
    A["Agent navigates
to inquiry screen"] --> B["receiveMessageWeb()
Returns false (no-op)"]
    B --> C["init() triggered
by framework"]
    C --> D["Screen info acquired
via JCRWebCommon"]
    D --> E["Button/link states
reset"]
    E --> F{"SVC_KEI_NO and SYSID
present?"}
    F -->|No| G["Set next screen ID
Return true"]
    F -->|Yes| H["Fetch user case ID
CRSV0084"]
    H --> I["Execute CRSV0084
mapping class
12+ set operations"]
    I --> J["invokeService()
to business tier"]
    J --> K["Execute 13+ get
operations on mapper"]
    K --> L["Calculate business
fee (getJimFee)"]
    L --> M["Normalize dates
(replaceTendymd)"]
    M --> N["getMainData()
transfer to tab"]
    N --> O["Set next screen ID
Return true"]
    G --> P["Screen renders"]
    O --> P
```

### Inquiry Lifecycle Flow

Once on the page, an agent may move an inquiry through its lifecycle:

```mermaid
flowchart LR
    NEW["New / Pending"] --> ACCEPT["accept()
execAccept service
→ refresh()"]
    ACCEPT --> REJECT["reject()
execReject service
→ refresh()"]
    ACCEPT --> KYOSEI["getKyosei()
execGetKyosei service
→ refresh()"]
    ACCEPT --> RESTART["restart()
execRestart service
→ refresh()"]
    ACCEPT --> CLOSE["closeToiawase()
execClose service
→ refresh()"]
```

After any state transition, the `refresh()` method reloads the entire page to reflect the new state. If the page was last visited from the document delivery screen, a success message is shown before refreshing.

### Popup Screen Launch Flow

When an agent clicks a link (e.g., "Open Inquiry Input"), the pattern is consistent:

1. Retrieve `bean` (service form) and `commoninfoBean` (common info).
2. Set the parent screen ID on the target popup screen.
3. Call the appropriate `copyBeanTo*()` helper from `JCRWebCommon` to extract and prepare the data.
4. Set `screenInfo` with the target screen ID and prepared data.
5. Set `NEXT_SCREEN_ID` and `NEXT_SCREEN_NAME` in the common info bean.
6. Return `true` to trigger the popup.

### Tab Navigation Flow

Clicking a tab within the page:

1. Refresh MYBOX/Queue BOX/mail counts.
2. Read `CURRENTTAB` from the form bean to determine the target tab.
3. If the target is the main tab, call `init()` to reinitialize.
4. Otherwise, set parent screen IDs on all subordinate screens and copy form data to the target tab.
5. Return `true` to navigate.

## Data Model

This module does not define its own data model classes. Instead, it operates on the `X31SDataBeanAccess` and `X31SDataBeanAccessArray` objects provided by the X31 framework. The data flows through the system via:

**Service Form Bean** (`X31SDataBeanAccess bean`):

Holds all form fields for the inquiry response page. Key fields accessed include:

| Field (constant reference) | Purpose |
|---|---|
| `CRW03407SFConst.SVC_KEI_NO` | Service contract number (inquiry identifier) |
| `CRW03407SFConst.SYSID` | System ID |
| `CRW03407SFConst.SHINSA_STA_NM` | Approval status name |
| `CRW03407SFConst.STATUS` | Status (dedicated tab transfer field) |
| `CRW03407SFConst.ICJKN_SETTE_CD` | Settlement code |
| `CRW03407SFConst.JIM_FEE` | Business fee amount |
| `CRW03407SFConst.TMP_PAY_PRC_AMNT` | Temporary payment amount |
| `CRW03407SFConst.JIM_FEE_RSLT` | Calculated business fee result |
| `CRW03407SFConst.OPE_DATE` | Operation date |
| `CRW03407SFConst.KEI_CHGE_MSKMSHO_NO` | Application form number (receipt) |
| `CRW03407SFConst.ONET_PWD` | One-time password for external systems |
| `CRW03407SFConst.IMG_SYS_URL` | External image system URL |
| `CRW03407SFConst.IMG_SYS_DSP_FLG` | Image system display flag |
| `CRW03407SFConst.DSP_FLG` | Display flag |
| `CRW03407SFConst.SLCT_DETAIL_INDEX` | Selected detail row index |
| `CRW03407SFConst.SEIKY_KEI_NO` | Billing detail number |
| `CRW03407SFConst.CRW03410_OPN_FLG` | CRW03410 popup open flag |
| `CRW03407SFConst.URL_INFO` | URL info for reissue |
| `CRW03407SFConst.WEB_ACCSS_NSKEY` | Web access namespace key |
| `CRW03407SFConst.WEB_ACCSS_NSKEY_PWD` | Web access namespace key password |
| `CRW03407SFConst.YK_KIGEN_DTM` | Access expiration datetime |

**Common Info Bean** (`X31SDataBeanAccess commoninfoBean`):

Holds shared screen context, primarily `NEXT_SCREEN_ID` and `NEXT_SCREEN_NAME` to control navigation.

**Mapping Data Maps**:

During `init()`, data is passed to the `CRSV0084_CRSV0084OPDBMapper` via `HashMap<String, Object>` for service execution. The mapper's `set*` methods populate input parameters, and `get*` methods retrieve results back into the form bean.

## Dependencies and Integration

### Inbound Dependencies

This module is used by:

- **`WEBGAMEN_CRW034090PJP.xml`** — Screen definition that wires the CRW03409SFLogic to the UI.
- **`x31business_logic_CRW03409SF.xml`** — X31 business logic configuration.

### External Module Dependencies

| Package | Role |
|---|---|
| `eo.web.webview.CRW03407SF` | Provides constants used throughout (form field IDs, list array keys) — the base inquiry screen module this builds on |
| `eo.web.webview.CRW01201SF` | Provides `CURRENTTAB` constant for tab identification |
| `eo.web.webview.CommonInfoCF` | Provides `NEXT_SCREEN_ID` and `NEXT_SCREEN_NAME` constants for navigation |
| `eo.web.webview.common.JCRWebCommon` | **Primary delegate** — all service calls, data copying, screen info setting, and common operations |
| `eo.web.webview.common.JCCWebCommon` | Base screen info acquisition, message handling, external system execution |
| `eo.web.webview.common.JCCWebBusinessLogic` | Parent class providing `getServiceFormBean()`, `getCommonInfoBean()`, `invokeService()` |
| `eo.web.webview.common.JCHCommonConst` | Screen parameter constants (e.g., billing link parameters) |
| `eo.web.webview.common.JACScreenConst` | Screen ID constants for subordinate screens |
| `eo.web.webview.common.JKKScreenConst` | Screen ID constants for KKW subsystem screens |
| `eo.web.webview.common.JZDWebCommon` | Application constant retrieval (external URLs) |
| `eo.web.webview.common.JZMWebCommon` | Date normalization (`replaceTendymd`) |
| `eo.common.util.JCRUtilCommon` | Null-checking utility |
| `eo.common.constant` | System-wide string and model constants |
| `eo.web.webview.mapping` | Database mapping classes (`CRSV0084`, `CRSV0281`) |
| `eo.business.service` | Business tier services (called indirectly via `invokeService`) |
| `eo.ejb.common` | EJB common utilities |

## Cross-Module Relationships

The module builds on top of `CRW03407SF` (the base inquiry response screen), inheriting its data model and extending it with tab-based functionality specific to retention prevention. Many constant references in the code resolve to `CRW03407SFConst`, indicating this module shares the same underlying inquiry data schema.

## Notes for Developers

### Framework Conventions

- **Six-section method template**: Every public method follows the X31 framework convention of documenting sections (1) retained information, (2) service form bean setup, (3) service call, (4) service result, (5) retained info setup, (6) common info bean setup. Many sections are marked "なし" (none) when no action is needed.
- **Delegation pattern**: This module rarely contains business logic directly. It delegates to `JCRWebCommon`, `JCCWebCommon`, `JZMWebCommon`, `JZDWebCommon`, and other common utility classes. When extending functionality, look for existing helpers before writing new code.
- **Popup navigation**: All popup screens are controlled by setting `NEXT_SCREEN_ID` and `NEXT_SCREEN_NAME` in the common info bean. The framework then automatically opens the popup for the specified screen ID.
- **Form bean access**: Use `X31CWebConst.DATABEAN_GET_VALUE` and `DATABEAN_SET_VALUE` constants for all bean access. Never directly access bean internals.

### Page Refresh Behavior

Methods that change inquiry state (`accept`, `reject`, `close`, `getKyosei`, `restart`, `insertEasyMemo`) all call `refresh()` at the end to reload the page. Be aware that `refresh()` fully reinitializes the page via `init()`, so any unsaved local form data will be lost.

### Tab Initialization Quirk

In `clickTab()`, clicking the main tab (`SENYO_TAB_ID`) triggers `init()` — a full reinitialization — rather than just showing the tab. This means tab navigation to the main tab will re-fetch all data from the service tier.

### Date Handling

The `20991231` placeholder date pattern is used throughout the system to represent "no end date." The `JZMWebCommon.replaceTendymd()` method converts these to blank representations for display. This applies to service end dates, cancellation dates, and various list item dates.

### Dynamic Screen Routing

`openCrw02603()` demonstrates conditional screen routing: if no `PROSCST_NO` and no `SVC_KEI_NO` are present, it opens the non-customer edit screen (`CRW02602`). Otherwise, it opens the customer edit screen (`CRW02604`). This pattern of checking for the presence of key identifiers to determine screen flow is used throughout.

### Version History Highlights

- **v6.00.00**: Renamed "Status" tab to "Status (dedicated tab)" in mapping.
- **v10.00.00**: Added dedicated tab support.
- **v12.00.00**: Added links to inquiry history screen (log analysis system link).
- **v12.01.00**: Commonized screen items across tabs; refactored `execute()` to use `JCRWebCommon.execute()` directly.
- **v13.00.00**: Added ID registration certificate reissue workflow.
- **v16.00.00**: Added new electricity support (power CIS button).
- **v26.00.00**: Added premium support measures (member rank link).
- **v36.00.00**: Performance improvements.
- **v48.00.00**: Television service business introduction support.
- **v53.00.00**: CX strategy WG response (end of September lease separation) — added SMS send popup and lease contract screen link.

### Mapping Class Usage

Two mapping classes are used directly in this module:

- **`CRSV0084_CRSV0084OPDBMapper`** — Used in `init()` to fetch inquiry data. Contains 12+ `set` methods for input parameters and 13 `get` methods for output. Handles customer info, contract data, billing, campaign info, and specialized tab data.
- **`CRSV0281_CRSV0281OPDBMapper`** — Used in `clickSaihakko()` to validate membership type for ID certificate reissue. Contains a single `ADDWEBACCESSNSKEYCC` operation.

### Security and Validation

The `clickSaihakko()` method includes a membership type check that validates the user is a master member (individual or corporate) before allowing ID certificate reissue. Non-master members receive error `EKB1040_JW`. This is a critical security gate — always check the result map's `err_info` flag.
