# Business Logic — JBSbatKKRsvTokiHak.isSingleCheckKKIFM112() [227 LOC]

| Field | Value |
|-------|-------|
| Fully Qualified Name | `eo.business.service.JBSbatKKRsvTokiHak` |
| Layer | Service (Batch service component) |
| Module | `service` (Package: `eo.business.service`) |

## 1. Role

### JBSbatKKRsvTokiHak.isSingleCheckKKIFM112()

This method performs **single-item (field-level) validation** on input data for the `TXT-KKIFM112` planned Toki (billing notice) issuance intermediate file. It is part of the `eo Customer Core System` batch processing pipeline responsible for generating and dispatching telecom billing notices (Toki). The method validates 9 key fields extracted from the intermediate file, ensuring each field satisfies three validation dimensions: requiredness (non-null/non-empty), length constraints (character count range), and character attribute constraints (alphanumeric, date, or datetime format). It implements a **gatekeeper pattern** — each field is checked sequentially, and upon the first validation failure, it logs a business error using a specific error code (`EKKB0060TE` for missing, `EKKB0070TE` for length violation, `EKKB0080TE` for attribute violation) and returns `false` immediately, preventing malformed data from propagating into downstream SOD (Service Order Data) dispatch logic. This method serves as the data integrity gate between intermediate file ingestion and service order issuance in the `eo` broadband/telecom service provisioning workflow.

## 2. Processing Pattern (Detailed Business Logic)

```mermaid
flowchart TD
    START(["isSingleCheckKKIFM112(rsMap, itemvalueMap)"])

    START --> S1["SVC_KEI_NO: Retrieve from rsMap"]
    S1 --> S1M{"Required?
null or empty?"}
    S1M -->|Yes| S1E["printBusinessErrorLog
EKKB0060TE"]
    S1E --> S1R["return false"]
    S1M -->|No| S1L{"Length 0-10?
ketasuu2"}
    S1L -->|No| S1E2["printBusinessErrorLog
EKKB0070TE"]
    S1E2 --> S1R
    S1L -->|Yes| S1A{"Alphanumeric?
hannkakuesuuji1"}
    S1A -->|No| S1E3["printBusinessErrorLog
EKKB0080TE"]
    S1E3 --> S1R
    S1A -->|Yes| S2["SK_GENE_ADD_DTM: Retrieve"]

    S2 --> S2M{"Required?
null or empty?"}
    S2M -->|Yes| S2E["printBusinessErrorLog
EKKB0060TE"]
    S2E --> S1R
    S2M -->|No| S2L{"Length 0-17?
ketasuu2"}
    S2L -->|No| S2E2["printBusinessErrorLog
EKKB0070TE"]
    S2E2 --> S1R
    S2L -->|Yes| S2A{"Datetime?
day_hour1"}
    S2A -->|No| S2E3["printBusinessErrorLog
EKKB0080TE"]
    S2E3 --> S1R
    S2A -->|Yes| S3["SVC_KEI_UCWK_NO: Retrieve"]

    S3 --> S3M{"Required?
null or empty?"}
    S3M -->|Yes| S3E["printBusinessErrorLog
EKKB0060TE"]
    S3E --> S1R
    S3M -->|No| S3L{"Length 0-12?
ketasuu2"}
    S3L -->|No| S3E2["printBusinessErrorLog
EKKB0070TE"]
    S3E2 --> S1R
    S3L -->|Yes| S3A{"Alphanumeric?
hannkakuesuuji1"}
    S3A -->|No| S3E3["printBusinessErrorLog
EKKB0080TE"]
    S3E3 --> S1R
    S3A -->|Yes| S4["SKU_GENE_ADD_DTM: Retrieve"]

    S4 --> S4M{"Required?
null or empty?"}
    S4M -->|Yes| S4E["printBusinessErrorLog
EKKB0060TE"]
    S4E --> S1R
    S4M -->|No| S4L{"Length 0-17?
ketasuu2"}
    S4L -->|No| S4E2["printBusinessErrorLog
EKKB0070TE"]
    S4E2 --> S1R
    S4L -->|Yes| S4A{"Datetime?
day_hour1"}
    S4A -->|No| S4E3["printBusinessErrorLog
EKKB0080TE"]
    S4E3 --> S1R
    S4A -->|Yes| S5["SKET_GENE_ADD_DTM: Retrieve"]

    S5 --> S5M{"Required?
null or empty?"}
    S5M -->|Yes| S5E["printBusinessErrorLog
EKKB0060TE"]
    S5E --> S1R
    S5M -->|No| S5L{"Length 0-17?
ketasuu2"}
    S5L -->|No| S5E2["printBusinessErrorLog
EKKB0070TE"]
    S5E2 --> S1R
    S5L -->|Yes| S5A{"Datetime?
day_hour1"}
    S5A -->|No| S5E3["printBusinessErrorLog
EKKB0080TE"]
    S5E3 --> S1R
    S5A -->|Yes| S6["ITNTOKI_STA_YMD: Retrieve"]

    S6 --> S6L{"Length 0-8?
ketasuu2"}
    S6L -->|No| S6E["printBusinessErrorLog
EKKB0070TE"]
    S6E --> S1R
    S6L -->|Yes| S6A{"Date format?
year_month_day1"}
    S6A -->|No| S6E2["printBusinessErrorLog
EKKB0080TE"]
    S6E2 --> S1R
    S6A -->|Yes| S7["ITNTOKI_END_YMD: Retrieve"]

    S7 --> S7L{"Length 0-8?
ketasuu2"}
    S7L -->|No| S7E["printBusinessErrorLog
EKKB0070TE"]
    S7E --> S1R
    S7L -->|Yes| S7A{"Date format?
year_month_day1"}
    S7A -->|No| S7E2["printBusinessErrorLog
EKKB0080TE"]
    S7E2 --> S1R
    S7A -->|Yes| S8["SOD_HAK_SBT_CD: Retrieve"]

    S8 --> S8M{"Required?
null or empty?"}
    S8M -->|Yes| S8E["printBusinessErrorLog
EKKB0060TE"]
    S8E --> S1R
    S8M -->|No| S8L{"Length 0-1?
ketasuu2"}
    S8L -->|No| S8E2["printBusinessErrorLog
EKKB0070TE"]
    S8E2 --> S1R
    S8L -->|Yes| S8A{"Alphanumeric?
hannkakuesuuji1"}
    S8A -->|No| S8E3["printBusinessErrorLog
EKKB0080TE"]
    S8E3 --> S1R
    S8A -->|Yes| S9["ITNTOKI_ADD_CD: Retrieve"]

    S9 --> S9M{"Required?
null or empty?"}
    S9M -->|Yes| S9E["printBusinessErrorLog
EKKB0060TE"]
    S9E --> S1R
    S9M -->|No| S9L{"Length 0-1?
ketasuu2"}
    S9L -->|No| S9E2["printBusinessErrorLog
EKKB0070TE"]
    S9E2 --> S1R
    S9L -->|Yes| S9A{"Alphanumeric?
hannkakuesuuji1"}
    S9A -->|No| S9E3["printBusinessErrorLog
EKKB0080TE"]
    S9E3 --> S1R
    S9A -->|Yes| S10["return true - No errors"]

    S10 --> END(["END"])
```

**Processing flow summary:** The method validates 9 fields in strict sequential order. Each field follows one of two validation patterns:

- **Required + alphanumeric fields** (SVC_KEI_NO, SVC_KEI_UCWK_NO, SOD_HAK_SBT_CD, ITNTOKI_ADD_CD): Check requiredness → check length range → check alphanumeric attribute.
- **Required + datetime fields** (SK_GENE_ADD_DTM, SKU_GENE_ADD_DTM, SKET_GENE_ADD_DTM): Check requiredness → check length range (17 chars for datetime) → check datetime attribute (`day_hour1`).
- **Optional + date fields** (ITNTOKI_STA_YMD, ITNTOKI_END_YMD): Requiredness check was **removed** (DEL START/DEL END block, FST2-2012-0001008) → check length range (8 chars for date) → check date format attribute (`year_month_day1`).

## 3. Parameter Analysis

| No | Parameter Name | Type | Business Description |
|----|---------------|------|---------------------|
| 1 | `rsMap` | `HashMap` | Input data map containing key-value pairs from the TXT-KKIFM112 planned Toki issuance intermediate file or DB extraction results. Each key corresponds to a field name (e.g., `SVC_KEI_NO`, `SK_GENE_ADD_DTM`, `ITNTOKI_STA_YMD`) and each value is the string representation of that field's data. The map is populated prior to this call from either an intermediate text file or a database query result. |
| 2 | `itemvalueMap` | `HashMap` | Error message parameter map containing display-label values for error reporting. Keys use the format `TXT-KKIFM112-.<FIELD_NAME>` (e.g., `TXT-KKIFM112-.SVC_KEI_NO`) and map to human-readable field labels used in error log messages. |

**Instance fields read:**

| Field | Type | Business Description |
|-------|------|---------------------|
| `commonItem` | `JBSbatCommonItem` | Shared common item context providing access to logging infrastructure (`getLogPrint().printBusinessErrorLog`) used throughout the batch service for error reporting. |

## 4. CRUD Operations / Called Services

All method calls within `isSingleCheckKKIFM112` are validation/error-reporting calls. No database CRUD operations or service component (SC) calls are made directly within this method.

| CRUD | SC / CBS | SC Code | Entity / DB | Operation Description |
|------|----------|---------|-------------|----------------------|
| - | `JBSbatCheckUtil.invoke()` | - | - | Field validation utility — performs length check (`ketasuu2`), alphanumeric check (`hannkakuesuuji1`), date format check (`year_month_day1`), and datetime format check (`day_hour1`) on field values. Returns `true` if the value passes all specified checks. |
| - | `JBSbatCommonItem.getLogPrint().printBusinessErrorLog()` | JKKBatOneTimeLogWriter / JKKHttpCommunicator | - | Logs business-level errors to the system log. Three error code categories: `EKKB0060TE` (required field missing), `EKKB0070TE` (field length out of range), `EKKB0080TE` (field character attribute invalid — e.g., non-alphanumeric characters in a numeric field). |

**Note:** This method contains no direct Create/Read/Update/Delete operations on database tables. It is a pure validation method that gates data quality before downstream processing (which handles SOD dispatch, Toki generation, and DB updates).

## 5. Dependency Trace

| # | Caller (Screen/Batch) | Call Chain (Full Path to this Method) | Terminal (SC / CRUD / Entity) |
|---|----------------------|--------------------------------------|-------------------------------|
| 1 | Batch: `JBSbatKKRsvTokiHak` | `JBSbatKKRsvTokiHak.execute()` -> `JBSbatKKRsvTokiHak.isSingleCheckKKIFM112(rsMap, itemvalueMap)` | `printBusinessErrorLog [error logging] EKKB0060TE/EKKB0070TE/EKKB0080TE` |

**Description:** This method is called exclusively by the `execute()` method of the same class (`JBSbatKKRsvTokiHak`), which is the batch processing entry point for the TXT-KKIFM112 planned Toki issuance batch job. The caller invokes this validation method to verify the integrity of the intermediate file data before proceeding with service contract detail updates and SOD (Service Order Data) dispatch operations. The terminal operations from this method are limited to error log writes — there are no DB or SC call chains originating from this method.

## 6. Per-Branch Detail Blocks

### Block 1 — IF (required check) `(L415)` Service Contract Number (SVC_KEI_NO)

Retrieve the service contract number from `rsMap` and validate requiredness.

| # | Type | Code |
|---|------|------|
| 1 | SET | `strValue = (String)rsMap.get("SVC_KEI_NO")` // Retrieve service contract number [-> "SVC_KEI_NO"] |
| 2 | IF | `null == strValue || "".equals(strValue)` // Required check — field must not be null or empty |

### Block 1.1 — IF (required fail) `(L418)`

> If service contract number is missing, log error and abort.

| # | Type | Code |
|---|------|------|
| 1 | CALL | `commonItem.getLogPrint().printBusinessErrorLog("EKKB0060TE", new String[]{(String)itemvalueMap.get("TXT-KKIFM112-.SVC_KEI_NO")})` // Log required field error |
| 2 | RETURN | `return false` // Validation failed |

### Block 1.2 — ELSE IF (length check) `(L424)`

> Validate service contract number character count.

| # | Type | Code |
|---|------|------|
| 1 | IF | `!JBSbatCheckUtil.invoke(strValue, new String[]{"ketasuu2", "0", "10"})` // Length must be 0–10 characters [-> "ketasuu2"] |

### Block 1.2.1 — IF (length fail) `(L426)`

> Log length error and abort.

| # | Type | Code |
|---|------|------|
| 1 | CALL | `commonItem.getLogPrint().printBusinessErrorLog("EKKB0070TE", new String[]{(String)itemvalueMap.get("TXT-KKIFM112-.SVC_KEI_NO")})` // Log length violation |
| 2 | RETURN | `return false` |

### Block 1.3 — ELSE IF (attribute check) `(L432)`

> Validate service contract number contains only alphanumeric characters.

| # | Type | Code |
|---|------|------|
| 1 | IF | `!JBSbatCheckUtil.invoke(strValue, new String[]{"hannkakuesuuji1"})` // Must be alphanumeric [-> "hannkakuesuuji1"] |

### Block 1.3.1 — IF (attribute fail) `(L434)`

> Log attribute error and abort.

| # | Type | Code |
|---|------|------|
| 1 | CALL | `commonItem.getLogPrint().printBusinessErrorLog("EKKB0080TE", new String[]{(String)itemvalueMap.get("TXT-KKIFM112-.SVC_KEI_NO")})` // Log attribute violation |
| 2 | RETURN | `return false` |

### Block 1.4 — ELSE (pass) `(L438)`

> Service contract number passes all checks. Proceed to next field.

| # | Type | Code |
|---|------|------|
| 1 | SET | `strValue = (String)rsMap.get("SK_GENE_ADD_DTM")` // Retrieve generation registration datetime (service contract) |

---

### Block 2 — IF (required check) `(L442)` Generation Registration Datetime (Service Contract) — SK_GENE_ADD_DTM

| # | Type | Code |
|---|------|------|
| 1 | IF | `null == strValue || "".equals(strValue)` // Required check |

### Block 2.1 — IF (required fail) `(L445)`

| # | Type | Code |
|---|------|------|
| 1 | CALL | `commonItem.getLogPrint().printBusinessErrorLog("EKKB0060TE", new String[]{(String)itemvalueMap.get("TXT-KKIFM112-.SK_GENE_ADD_DTM")})` |
| 2 | RETURN | `return false` |

### Block 2.2 — ELSE IF (length check) `(L451)`

> Length must be 0–17 characters (datetime format: YYYYMMDDHHmmsssss).

| # | Type | Code |
|---|------|------|
| 1 | IF | `!JBSbatCheckUtil.invoke(strValue, new String[]{"ketasuu2", "0", "17"})` |

### Block 2.2.1 — IF (length fail) `(L453)`

| # | Type | Code |
|---|------|------|
| 1 | CALL | `commonItem.getLogPrint().printBusinessErrorLog("EKKB0070TE", new String[]{(String)itemvalueMap.get("TXT-KKIFM112-.SK_GENE_ADD_DTM")})` |
| 2 | RETURN | `return false` |

### Block 2.3 — ELSE IF (attribute check) `(L459)`

> Must match datetime format (day_hour1).

| # | Type | Code |
|---|------|------|
| 1 | IF | `!JBSbatCheckUtil.invoke(strValue, new String[]{"day_hour1"})` |

### Block 2.3.1 — IF (attribute fail) `(L461)`

| # | Type | Code |
|---|------|------|
| 1 | CALL | `commonItem.getLogPrint().printBusinessErrorLog("EKKB0080TE", new String[]{(String)itemvalueMap.get("TXT-KKIFM112-.SK_GENE_ADD_DTM")})` |
| 2 | RETURN | `return false` |

### Block 2.4 — ELSE (pass) `(L465)`

| # | Type | Code |
|---|------|------|
| 1 | SET | `strValue = (String)rsMap.get("SVC_KEI_UCWK_NO")` // Retrieve service contract detail number |

---

### Block 3 — IF (required check) `(L469)` Service Contract Detail Number (SVC_KEI_UCWK_NO)

| # | Type | Code |
|---|------|------|
| 1 | IF | `null == strValue || "".equals(strValue)` // Required check |

### Block 3.1 — IF (required fail) `(L472)`

| # | Type | Code |
|---|------|------|
| 1 | CALL | `commonItem.getLogPrint().printBusinessErrorLog("EKKB0060TE", new String[]{(String)itemvalueMap.get("TXT-KKIFM112-.SVC_KEI_UCWK_NO")})` |
| 2 | RETURN | `return false` |

### Block 3.2 — ELSE IF (length check) `(L478)`

> Length must be 0–12 characters.

| # | Type | Code |
|---|------|------|
| 1 | IF | `!JBSbatCheckUtil.invoke(strValue, new String[]{"ketasuu2", "0", "12"})` |

### Block 3.2.1 — IF (length fail) `(L480)`

| # | Type | Code |
|---|------|------|
| 1 | CALL | `commonItem.getLogPrint().printBusinessErrorLog("EKKB0070TE", new String[]{(String)itemvalueMap.get("TXT-KKIFM112-.SVC_KEI_UCWK_NO")})` |
| 2 | RETURN | `return false` |

### Block 3.3 — ELSE IF (attribute check) `(L486)`

> Must be alphanumeric (hannkakuesuuji1).

| # | Type | Code |
|---|------|------|
| 1 | IF | `!JBSbatCheckUtil.invoke(strValue, new String[]{"hannkakuesuuji1"})` |

### Block 3.3.1 — IF (attribute fail) `(L488)`

| # | Type | Code |
|---|------|------|
| 1 | CALL | `commonItem.getLogPrint().printBusinessErrorLog("EKKB0080TE", new String[]{(String)itemvalueMap.get("TXT-KKIFM112-.SVC_KEI_UCWK_NO")})` |
| 2 | RETURN | `return false` |

### Block 3.4 — ELSE (pass) `(L492)`

| # | Type | Code |
|---|------|------|
| 1 | SET | `strValue = (String)rsMap.get("SKU_GENE_ADD_DTM")` // Retrieve generation registration datetime (service contract detail) |

---

### Block 4 — IF (required check) `(L496)` Generation Registration Datetime (Service Contract Detail) — SKU_GENE_ADD_DTM

| # | Type | Code |
|---|------|------|
| 1 | IF | `null == strValue || "".equals(strValue)` // Required check |

### Block 4.1 — IF (required fail) `(L499)`

| # | Type | Code |
|---|------|------|
| 1 | CALL | `commonItem.getLogPrint().printBusinessErrorLog("EKKB0060TE", new String[]{(String)itemvalueMap.get("TXT-KKIFM112-.SKU_GENE_ADD_DTM")})` |
| 2 | RETURN | `return false` |

### Block 4.2 — ELSE IF (length check) `(L505)`

> Length must be 0–17 characters.

| # | Type | Code |
|---|------|------|
| 1 | IF | `!JBSbatCheckUtil.invoke(strValue, new String[]{"ketasuu2", "0", "17"})` |

### Block 4.2.1 — IF (length fail) `(L507)`

| # | Type | Code |
|---|------|------|
| 1 | CALL | `commonItem.getLogPrint().printBusinessErrorLog("EKKB0070TE", new String[]{(String)itemvalueMap.get("TXT-KKIFM112-.SKU_GENE_ADD_DTM")})` |
| 2 | RETURN | `return false` |

### Block 4.3 — ELSE IF (attribute check) `(L513)`

> Must match datetime format (day_hour1).

| # | Type | Code |
|---|------|------|
| 1 | IF | `!JBSbatCheckUtil.invoke(strValue, new String[]{"day_hour1"})` |

### Block 4.3.1 — IF (attribute fail) `(L515)`

| # | Type | Code |
|---|------|------|
| 1 | CALL | `commonItem.getLogPrint().printBusinessErrorLog("EKKB0080TE", new String[]{(String)itemvalueMap.get("TXT-KKIFM112-.SKU_GENE_ADD_DTM")})` |
| 2 | RETURN | `return false` |

### Block 4.4 — ELSE (pass) `(L519)`

| # | Type | Code |
|---|------|------|
| 1 | SET | `strValue = (String)rsMap.get("SKET_GENE_ADD_DTM")` // Retrieve generation registration datetime (service contract detail <eo light phone>) |

---

### Block 5 — IF (required check) `(L523)` Generation Registration Datetime (Service Contract Detail <eo light phone>) — SKET_GENE_ADD_DTM

| # | Type | Code |
|---|------|------|
| 1 | IF | `null == strValue || "".equals(strValue)` // Required check |

### Block 5.1 — IF (required fail) `(L526)`

| # | Type | Code |
|---|------|------|
| 1 | CALL | `commonItem.getLogPrint().printBusinessErrorLog("EKKB0060TE", new String[]{(String)itemvalueMap.get("TXT-KKIFM112-.SKET_GENE_ADD_DTM")})` |
| 2 | RETURN | `return false` |

### Block 5.2 — ELSE IF (length check) `(L532)`

> Length must be 0–17 characters.

| # | Type | Code |
|---|------|------|
| 1 | IF | `!JBSbatCheckUtil.invoke(strValue, new String[]{"ketasuu2", "0", "17"})` |

### Block 5.2.1 — IF (length fail) `(L534)`

| # | Type | Code |
|---|------|------|
| 1 | CALL | `commonItem.getLogPrint().printBusinessErrorLog("EKKB0070TE", new String[]{(String)itemvalueMap.get("TXT-KKIFM112-.SKET_GENE_ADD_DTM")})` |
| 2 | RETURN | `return false` |

### Block 5.3 — ELSE IF (attribute check) `(L540)`

> Must match datetime format (day_hour1).

| # | Type | Code |
|---|------|------|
| 1 | IF | `!JBSbatCheckUtil.invoke(strValue, new String[]{"day_hour1"})` |

### Block 5.3.1 — IF (attribute fail) `(L542)`

| # | Type | Code |
|---|------|------|
| 1 | CALL | `commonItem.getLogPrint().printBusinessErrorLog("EKKB0080TE", new String[]{(String)itemvalueMap.get("TXT-KKIFM112-.SKET_GENE_ADD_DTM")})` |
| 2 | RETURN | `return false` |

### Block 5.4 — ELSE (pass) `(L546)`

| # | Type | Code |
|---|------|------|
| 1 | SET | `strValue = (String)rsMap.get("ITNTOKI_STA_YMD")` // Retrieve relocation Toki start date |

---

### Block 6 — ELSE IF (length check) `(L554)` Relocation Toki Start Date — ITNTOKI_STA_YMD

> **Note:** Requiredness check was removed by DEL START/DEL END (FST2-2012-0001008) — this field is **optional**.

| # | Type | Code |
|---|------|------|
| 1 | IF | `!JBSbatCheckUtil.invoke(strValue, new String[]{"ketasuu2", "0", "8"})` // Length 0–8 (YYYYMMDD), optional field |

### Block 6.1 — IF (length fail) `(L556)`

| # | Type | Code |
|---|------|------|
| 1 | CALL | `commonItem.getLogPrint().printBusinessErrorLog("EKKB0070TE", new String[]{(String)itemvalueMap.get("TXT-KKIFM112-.ITNTOKI_STA_YMD")})` |
| 2 | RETURN | `return false` |

### Block 6.2 — ELSE IF (attribute check) `(L562)`

> Must match date format (year_month_day1).

| # | Type | Code |
|---|------|------|
| 1 | IF | `!JBSbatCheckUtil.invoke(strValue, new String[]{"year_month_day1"})` |

### Block 6.2.1 — IF (attribute fail) `(L564)`

| # | Type | Code |
|---|------|------|
| 1 | CALL | `commonItem.getLogPrint().printBusinessErrorLog("EKKB0080TE", new String[]{(String)itemvalueMap.get("TXT-KKIFM112-.ITNTOKI_STA_YMD")})` |
| 2 | RETURN | `return false` |

### Block 6.3 — ELSE (pass) `(L568)`

| # | Type | Code |
|---|------|------|
| 1 | SET | `strValue = (String)rsMap.get("ITNTOKI_END_YMD")` // Retrieve relocation Toki end date |

---

### Block 7 — ELSE IF (length check) `(L578)` Relocation Toki End Date — ITNTOKI_END_YMD

> **Note:** Requiredness check was removed by DEL START/DEL END (FST2-2012-0001008) — this field is **optional**.

| # | Type | Code |
|---|------|------|
| 1 | IF | `!JBSbatCheckUtil.invoke(strValue, new String[]{"ketasuu2", "0", "8"})` // Length 0–8, optional field |

### Block 7.1 — IF (length fail) `(L580)`

| # | Type | Code |
|---|------|------|
| 1 | CALL | `commonItem.getLogPrint().printBusinessErrorLog("EKKB0070TE", new String[]{(String)itemvalueMap.get("TXT-KKIFM112-.ITNTOKI_END_YMD")})` |
| 2 | RETURN | `return false` |

### Block 7.2 — ELSE IF (attribute check) `(L586)`

> Must match date format (year_month_day1).

| # | Type | Code |
|---|------|------|
| 1 | IF | `!JBSbatCheckUtil.invoke(strValue, new String[]{"year_month_day1"})` |

### Block 7.2.1 — IF (attribute fail) `(L588)`

| # | Type | Code |
|---|------|------|
| 1 | CALL | `commonItem.getLogPrint().printBusinessErrorLog("EKKB0080TE", new String[]{(String)itemvalueMap.get("TXT-KKIFM112-.ITNTOKI_END_YMD")})` |
| 2 | RETURN | `return false` |

### Block 7.3 — ELSE (pass) `(L592)`

| # | Type | Code |
|---|------|------|
| 1 | SET | `strValue = (String)rsMap.get("SOD_HAK_SBT_CD")` // Retrieve SOD issuance type code |

---

### Block 8 — IF (required check) `(L596)` SOD Issuance Type Code (SOD_HAK_SBT_CD)

| # | Type | Code |
|---|------|------|
| 1 | IF | `null == strValue || "".equals(strValue)` // Required check |

### Block 8.1 — IF (required fail) `(L599)`

| # | Type | Code |
|---|------|------|
| 1 | CALL | `commonItem.getLogPrint().printBusinessErrorLog("EKKB0060TE", new String[]{(String)itemvalueMap.get("TXT-KKIFM112-.SOD_HAK_SBT_CD")})` |
| 2 | RETURN | `return false` |

### Block 8.2 — ELSE IF (length check) `(L605)`

> Length must be exactly 0–1 character (single-digit code).

| # | Type | Code |
|---|------|------|
| 1 | IF | `!JBSbatCheckUtil.invoke(strValue, new String[]{"ketasuu2", "0", "1"})` |

### Block 8.2.1 — IF (length fail) `(L607)`

| # | Type | Code |
|---|------|------|
| 1 | CALL | `commonItem.getLogPrint().printBusinessErrorLog("EKKB0070TE", new String[]{(String)itemvalueMap.get("TXT-KKIFM112-.SOD_HAK_SBT_CD")})` |
| 2 | RETURN | `return false` |

### Block 8.3 — ELSE IF (attribute check) `(L613)`

> Must be alphanumeric (hannkakuesuuji1).

| # | Type | Code |
|---|------|------|
| 1 | IF | `!JBSbatCheckUtil.invoke(strValue, new String[]{"hannkakuesuuji1"})` |

### Block 8.3.1 — IF (attribute fail) `(L615)`

| # | Type | Code |
|---|------|------|
| 1 | CALL | `commonItem.getLogPrint().printBusinessErrorLog("EKKB0080TE", new String[]{(String)itemvalueMap.get("TXT-KKIFM112-.SOD_HAK_SBT_CD")})` |
| 2 | RETURN | `return false` |

### Block 8.4 — ELSE (pass) `(L619)`

| # | Type | Code |
|---|------|------|
| 1 | SET | `strValue = (String)rsMap.get("ITNTOKI_ADD_CD")` // Retrieve relocation Toki registration code |

---

### Block 9 — IF (required check) `(L623)` Relocation Toki Registration Code (ITNTOKI_ADD_CD)

| # | Type | Code |
|---|------|------|
| 1 | IF | `null == strValue || "".equals(strValue)` // Required check |

### Block 9.1 — IF (required fail) `(L626)`

| # | Type | Code |
|---|------|------|
| 1 | CALL | `commonItem.getLogPrint().printBusinessErrorLog("EKKB0060TE", new String[]{(String)itemvalueMap.get("TXT-KKIFM112-.ITNTOKI_ADD_CD")})` |
| 2 | RETURN | `return false` |

### Block 9.2 — ELSE IF (length check) `(L632)`

> Length must be exactly 0–1 character (single-digit code).

| # | Type | Code |
|---|------|------|
| 1 | IF | `!JBSbatCheckUtil.invoke(strValue, new String[]{"ketasuu2", "0", "1"})` |

### Block 9.2.1 — IF (length fail) `(L634)`

| # | Type | Code |
|---|------|------|
| 1 | CALL | `commonItem.getLogPrint().printBusinessErrorLog("EKKB0070TE", new String[]{(String)itemvalueMap.get("TXT-KKIFM112-.ITNTOKI_ADD_CD")})` |
| 2 | RETURN | `return false` |

### Block 9.3 — ELSE IF (attribute check) `(L640)`

> Must be alphanumeric (hannkakuesuuji1).

| # | Type | Code |
|---|------|------|
| 1 | IF | `!JBSbatCheckUtil.invoke(strValue, new String[]{"hannkakuesuuji1"})` |

### Block 9.3.1 — IF (attribute fail) `(L642)`

| # | Type | Code |
|---|------|------|
| 1 | CALL | `commonItem.getLogPrint().printBusinessErrorLog("EKKB0080TE", new String[]{(String)itemvalueMap.get("TXT-KKIFM112-.ITNTOKI_ADD_CD")})` |
| 2 | RETURN | `return false` |

### Block 10 — ELSE (all pass) `(L646)`

> All 9 fields have passed their respective validations. Return success.

| # | Type | Code |
|---|------|------|
| 1 | RETURN | `return true` // All validations passed — no errors |

## 7. Glossary

| Term | Type | Business Meaning |
|------|------|------------------|
| `SVC_KEI_NO` | Field | Service Contract Number — the primary identifier for a customer's service contract in the eo telecom system |
| `SK_GENE_ADD_DTM` | Field | Generation Registration DateTime (Service Contract) — the timestamp when a service contract record was created or last modified in the system's generation history |
| `SVC_KEI_UCWK_NO` | Field | Service Contract Detail Number — internal tracking ID for a line item within a service contract |
| `SKU_GENE_ADD_DTM` | Field | Generation Registration DateTime (Service Contract Detail) — the timestamp when a service contract detail/line-item record was created or modified |
| `SKET_GENE_ADD_DTM` | Field | Generation Registration DateTime (Service Contract Detail <eo Light Phone>) — the timestamp for the eo Light Phone variant of a service contract detail record |
| `ITNTOKI_STA_YMD` | Field | Relocation Toki Start Date — the date when a relocated billing notice (Toki) becomes effective (YYYYMMDD format) |
| `ITNTOKI_END_YMD` | Field | Relocation Toki End Date — the date when a relocated billing notice (Toki) ceases to be effective (YYYYMMDD format) |
| `SOD_HAK_SBT_CD` | Field | SOD Issuance Type Code — a single-character code indicating the type of Service Order Data to be dispatched |
| `ITNTOKI_ADD_CD` | Field | Relocation Toki Registration Code — a single-character code specifying the type of relocation registration being processed |
| `rsMap` | Field | Input data map containing key-value pairs from the TXT-KKIFM112 intermediate file or DB result |
| `itemvalueMap` | Field | Error message display-label map with keys like `TXT-KKIFM112-.SVC_KEI_NO` |
| `commonItem` | Field | Shared common item context providing logging and utility access in the batch service |
| `JKBSbatCheckUtil.invoke()` | Utility | Field validation utility performing length checks (`ketasuu2`), alphanumeric checks (`hannkakuesuuji1`), date checks (`year_month_day1`), and datetime checks (`day_hour1`) |
| EKKB0060TE | Error Code | Required field is null or empty — the field must have a value |
| EKKB0070TE | Error Code | Field character length is out of the allowed range |
| EKKB0080TE | Error Code | Field contains invalid characters (e.g., non-alphanumeric in a numeric field, invalid date format) |
| ketasuu2 | Validator | Character count (length) check — validates that a string's length falls within [min, max] range |
| hannkakuesuuji1 | Validator | Alphanumeric-only character check — validates that all characters are letters or digits |
| day_hour1 | Validator | Datetime format check — validates that a string matches a datetime pattern (e.g., YYYYMMDDHHmmss) |
| year_month_day1 | Validator | Date format check — validates that a string matches a date pattern (e.g., YYYYMMDD) |
| Toki (トーキ) | Business term | Billing notice — a telecommunications billing document issued to eo broadband/phone customers |
| SOD | Acronym | Service Order Data — the telecom order fulfillment entity dispatched to downstream systems for service provisioning |
| KKIFM112 | File/Module | TXT-KKIFM112 — the planned Toki (billing notice) issuance intermediate file format; this method is part of the batch processing for this file |
| eo (イーオ) | Business term | Pluto Networks' broadband/telecom service brand; "eo Light Phone" is one of its telecom service offerings |
| FKKBAT | Acronym | One-time log writer component for batch error logging |
| FST2-2012-0001008 | Change ticket | The change ticket that removed the requiredness check for ITNTOKI_STA_YMD and ITNTOKI_END_YMD, making the relocation date fields optional |
| `KK_T_SVKEIUW_EOH_TEL` | DB Table | Service Contract Detail <eo Light Phone> table — stores detail information for eo Light Phone service contracts |
| `KK_T_SVC_KEI_UCWK` | DB Table | Service Contract Detail table — stores line-item level service contract records |
| `KK_T_ODR_HAKKO_JOKEN` | DB Table | Order Issuance Condition table — stores conditions for order (SOD) issuance |
| `KK_T_SVKEI_EXC_CTRL` | DB Table | Service Contract Control table — manages service contract processing control flags |
| `ZM_M_TELNO` | DB Table | Phone Number master table — stores telephone number reference data |
