The INSMASTR program is a comprehensive, enterprise-grade Insurance Management System that handles all core insurance operations in batch mode. This mission-critical application processes three primary types of insurance transactions:
The program operates as a high-performance batch processor, reading sequential input files, executing complex business logic, updating DB2 database tables, and generating comprehensive output files with detailed error logging and statistical reporting.
Program Constants (Lines 211-225):
01 WS-PROGRAM-CONSTANTS.
05 WS-PROGRAM-NAME PIC X(08) VALUE 'INSMASTR'.
05 WS-VERSION PIC X(05) VALUE '03.00'.
05 WS-RELEASE-DATE PIC X(10) VALUE '2024-01-15'.
Maintenance History (Lines 26-31):
| Date | Programmer | Description |
|---|---|---|
| 2024-01-15 | JOHN DOE | Initial Version |
| 2024-01-20 | JANE SMITH | Added Fraud Detection Engine |
| 2024-01-25 | BOB JONES | Enhanced Premium Calculation |
Main Entry Point:
0000-MAIN-CONTROL section (lines 853-879)Processing Modes (Lines 260-285): The program supports four distinct processing modes controlled via JCL PARM parameter from SYSIN:
01 WS-CONTROL-FLAGS.
05 WS-PROCESSING-MODE PIC X(10).
88 PROCESS-POLICIES-ONLY VALUE 'POLICY'.
88 PROCESS-RENEWALS-ONLY VALUE 'RENEWAL'.
88 PROCESS-CLAIMS-ONLY VALUE 'CLAIM'.
88 PROCESS-ALL-FILES VALUE 'ALL'.
| Mode | PARM Value | Description | Files Processed |
|---|---|---|---|
| POLICY | POLICY | Process policy applications only | POLFILE input, POLOUT output |
| RENEWAL | RENEWAL | Process renewals only | RENFILE input, RENOUT output |
| CLAIM | CLAIM | Process claims only | CLMFILE input, CLMOUT output |
| ALL | ALL or blank | Process all transaction types sequentially | All input and output files |
Default Behavior (Lines 889-893): If no parameter is provided or SYSIN is empty, the program defaults to 'ALL' mode for comprehensive processing.
The INSMASTR program is organized into 39 distinct sections across 3,228 lines of code, following a hierarchical numbering scheme:
Division Structure:
Section Numbering Scheme:
0000-XXXX: Main Control (1 section)
1000-XXXX: Initialization routines (5 sections)
2000-XXXX: Policy processing (10 sections)
3000-XXXX: Renewal processing (7 sections)
4000-XXXX: Claims processing (9 sections)
7000-XXXX: Transaction management (1 section)
8000-XXXX: Error handling (1 section)
9000-XXXX: Finalization and cleanup (5 sections)
Main Control Logic (Lines 853-879):
0000-MAIN-CONTROL SECTION.
PERFORM 1000-INITIALIZE-PROGRAM
EVALUATE TRUE
WHEN PROCESS-POLICIES-ONLY
PERFORM 2000-PROCESS-POLICIES
WHEN PROCESS-RENEWALS-ONLY
PERFORM 3000-PROCESS-RENEWALS
WHEN PROCESS-CLAIMS-ONLY
PERFORM 4000-PROCESS-CLAIMS
WHEN PROCESS-ALL-FILES
PERFORM 2000-PROCESS-POLICIES
PERFORM 3000-PROCESS-RENEWALS
PERFORM 4000-PROCESS-CLAIMS
WHEN OTHER
DISPLAY 'INVALID PROCESSING MODE: ' WS-PROCESSING-MODE
MOVE 8 TO RETURN-CODE
END-EVALUATE
PERFORM 9000-FINALIZE-PROGRAM
GOBACK.
Section: 2130-CALCULATE-RISK-SCORE (Lines 1388-1444)
This algorithm evaluates five distinct risk factors to calculate a composite risk score from 0-100, which directly influences premium pricing and customer risk classification.
Algorithm Structure:
* Initialize risk score
MOVE ZERO TO WS-RISK-SCORE
* Factor 1: Age-Based Risk
IF WS-CUSTOMER-AGE < 25
ADD 20 TO WS-RISK-SCORE
END-IF
IF WS-CUSTOMER-AGE > 65
ADD 30 TO WS-RISK-SCORE
ELSE IF WS-CUSTOMER-AGE > 55
ADD 15 TO WS-RISK-SCORE
END-IF
* Factor 2: Gender-Based Risk
IF POL-GENDER = 'M'
ADD 5 TO WS-RISK-SCORE
END-IF
* Factor 3: Smoker Status
IF POL-SMOKER-FLAG = 'Y'
ADD 25 TO WS-RISK-SCORE
END-IF
* Factor 4: Pre-existing Medical Conditions
IF POL-PRE-EXISTING-CONDITIONS = 'Y'
ADD 20 TO WS-RISK-SCORE
END-IF
* Factor 5: Occupation-Based Risk (Table Lookup)
SET OCC-IDX TO 1
SEARCH WS-OCCUPATION-ENTRY
AT END
ADD 10 TO WS-RISK-SCORE * Default if not found
WHEN WS-OCCUPATION-NAME(OCC-IDX) = POL-OCCUPATION
ADD WS-OCCUPATION-RISK(OCC-IDX) TO WS-RISK-SCORE
END-SEARCH
* Apply bounds (0-100)
IF WS-RISK-SCORE > 100
MOVE 100 TO WS-RISK-SCORE
END-IF
IF WS-RISK-SCORE < 0
MOVE 0 TO WS-RISK-SCORE
END-IF
Risk Factor Breakdown:
| Factor | Condition | Points | Business Rationale |
|---|---|---|---|
| Age | < 25 years | +20 | Young drivers/policyholders higher risk |
| 56-65 years | +15 | Pre-senior increased risk | |
| > 65 years | +30 | Senior age highest risk category | |
| Gender | Male | +5 | Statistical risk difference |
| Smoking | Smoker | +25 | Significant health risk factor |
| Pre-existing | Has conditions | +20 | Known health issues |
| Occupation | Variable | +10 to +60 | Job-specific risk (table-driven) |
Example Calculation:
Risk Profile Classification (Lines 1582-1589):
EVALUATE TRUE
WHEN WS-RISK-SCORE < 30
MOVE 'LOW' TO HV-CUST-RISK-PROFILE
WHEN WS-RISK-SCORE < 70
MOVE 'MEDIUM' TO HV-CUST-RISK-PROFILE
WHEN OTHER
MOVE 'HIGH' TO HV-CUST-RISK-PROFILE
END-EVALUATE
Section: 2140-CALCULATE-POLICY-PREMIUM (Lines 1450-1551)
This sophisticated algorithm calculates insurance premiums using a multi-step process incorporating coverage amount, insurance type, customer demographics, risk factors, deductibles, and applicable discounts.
Formula:
Base Premium = Coverage Amount × Insurance Type Base Rate
Adjusted for Deductible = Base × (1 - (Deductible/Coverage × 0.3))
Age-Adjusted = Adjusted × Age Factor (from table)
Risk-Adjusted = Age-Adjusted + (Age-Adjusted × Risk Score / 100)
After Discounts = Risk-Adjusted - Total Discounts
Tax Amount = After Discounts × State Tax Rate
Final Premium = After Discounts + Tax Amount + $25 Processing Fee
Step-by-Step Implementation:
Step 1: Calculate Base Premium by Insurance Type (Lines 1454-1473):
EVALUATE TRUE
WHEN POL-TYPE-HEALTH
COMPUTE WS-BASE-PREMIUM =
POL-COVERAGE-AMOUNT * WS-HEALTH-BASE-RATE * 0.0040
WHEN POL-TYPE-LIFE
COMPUTE WS-BASE-PREMIUM =
POL-COVERAGE-AMOUNT * WS-LIFE-BASE-RATE * 0.0020
WHEN POL-TYPE-AUTO
COMPUTE WS-BASE-PREMIUM =
POL-COVERAGE-AMOUNT * WS-AUTO-BASE-RATE * 0.0080
WHEN POL-TYPE-PROPERTY
COMPUTE WS-BASE-PREMIUM =
POL-COVERAGE-AMOUNT * WS-PROPERTY-BASE-RATE * 0.0030
WHEN POL-TYPE-DENTAL
COMPUTE WS-BASE-PREMIUM =
POL-COVERAGE-AMOUNT * WS-DENTAL-BASE-RATE * 0.0015
WHEN POL-TYPE-VISION
COMPUTE WS-BASE-PREMIUM =
POL-COVERAGE-AMOUNT * WS-VISION-BASE-RATE * 0.0010
END-EVALUATE
Insurance Type Base Rates (Lines 624-630):
| Insurance Type | Base Rate | Example Premium ($100k coverage) |
|---|---|---|
| Health | 0.0040 | $400 |
| Life | 0.0020 | $200 |
| Auto | 0.0080 | $800 |
| Property | 0.0030 | $300 |
| Dental | 0.0015 | $150 |
| Vision | 0.0010 | $100 |
Step 2: Apply Deductible Adjustment (Lines 1478-1481):
IF POL-DEDUCTIBLE > 0
COMPUTE WS-BASE-PREMIUM = WS-BASE-PREMIUM *
(1 - (POL-DEDUCTIBLE / POL-COVERAGE-AMOUNT) * 0.3)
END-IF
Logic: Higher deductible reduces premium by up to 30% based on deductible/coverage ratio
Step 3: Apply Age Factor (Lines 1486-1495):
SET AGE-IDX TO 1
SEARCH WS-AGE-RATE-ENTRY
AT END
MOVE 1.000 TO WS-AGE-FACTOR
WHEN WS-CUSTOMER-AGE >= WS-AGE-RANGE-LOW(AGE-IDX)
AND WS-CUSTOMER-AGE <= WS-AGE-RANGE-HIGH(AGE-IDX)
MOVE WS-AGE-RATE-FACTOR(AGE-IDX) TO WS-AGE-FACTOR
END-SEARCH
COMPUTE WS-BASE-PREMIUM = WS-BASE-PREMIUM * WS-AGE-FACTOR
Age Rate Table (Lines 1059-1085):
| Age Range | Factor | Impact |
|---|---|---|
| 18-25 | 0.800 | 20% discount (young, healthy) |
| 26-35 | 1.000 | Baseline |
| 36-45 | 1.200 | 20% increase |
| 46-55 | 1.500 | 50% increase |
| 56-65 | 2.000 | 100% increase |
| 66-75 | 3.000 | 200% increase |
| 76-85 | 4.000 | 300% increase |
Step 4: Apply Risk Adjustment (Lines 1500-1501):
COMPUTE WS-RISK-ADJUSTMENT = WS-BASE-PREMIUM * (WS-RISK-SCORE / 100)
ADD WS-RISK-ADJUSTMENT TO WS-BASE-PREMIUM
Logic: Risk score directly increases premium proportionally (50 risk score = 50% increase)
Step 5: Calculate Discounts (Lines 1506-1518):
* Annual Payment Discount (5%)
IF POL-PAYMENT-FREQUENCY = 'A'
COMPUTE WS-PREPAY-DISCOUNT = WS-BASE-PREMIUM * 0.05
ADD WS-PREPAY-DISCOUNT TO WS-TOTAL-DISCOUNT
END-IF
* Large Coverage Discount (10% for > $500,000)
IF POL-COVERAGE-AMOUNT > 500000
COMPUTE WS-TEMP-AMOUNT = WS-BASE-PREMIUM * 0.10
ADD WS-TEMP-AMOUNT TO WS-TOTAL-DISCOUNT
END-IF
SUBTRACT WS-TOTAL-DISCOUNT FROM WS-BASE-PREMIUM
Step 6: Apply State Tax (Lines 1523-1534):
SET STATE-IDX TO 1
SEARCH WS-STATE-RATE-ENTRY
AT END
MOVE 0.08 TO WS-STATE-TAX-RATE * Default 8%
WHEN WS-STATE-CODE(STATE-IDX) = POL-STATE
COMPUTE WS-STATE-TAX-RATE = WS-STATE-TAX-PCT(STATE-IDX) / 100
END-SEARCH
COMPUTE WS-TAX-AMOUNT = WS-BASE-PREMIUM * WS-STATE-TAX-RATE
ADD WS-TAX-AMOUNT TO WS-BASE-PREMIUM
State Rate Table Sample (Lines 1091-1105):
| State | Base Rate | Tax % |
|---|---|---|
| NY | $110.00 | 8.875% |
| CA | $105.00 | 8.250% |
| TX | $95.00 | 6.250% |
| FL | $98.00 | 7.000% |
Step 7: Add Processing Fee and Finalize (Lines 1539-1544):
ADD 25.00 TO WS-BASE-PREMIUM * Standard processing fee
MOVE WS-BASE-PREMIUM TO WS-FINAL-PREMIUM
Complete Example:
Calculation:
Section: 4140-FRAUD-DETECTION (Lines 2454-2561)
This multi-component fraud detection system analyzes claims using five distinct fraud indicators, calculating a composite score that determines claim routing (auto-approve, manual review, or fraud investigation).
Detection Components:
Component 1: Claim Frequency Analysis (Lines 2460-2474):
EXEC SQL
SELECT COUNT(*)
INTO :WS-ROW-COUNT
FROM CLAIM_TABLE
WHERE CUSTOMER_NUMBER = :CLM-CUSTOMER-NUMBER
AND CLAIM_DATE >= CURRENT_DATE - 30 DAYS
END-EXEC
EVALUATE TRUE
WHEN WS-ROW-COUNT > 3
ADD 25 TO WS-FRAUD-SCORE * High frequency red flag
WHEN WS-ROW-COUNT > 1
ADD 10 TO WS-FRAUD-SCORE * Moderate frequency warning
END-EVALUATE
Rationale: Multiple claims in 30 days is statistically suspicious
Component 2: Claim Amount Analysis (Lines 2479-2485):
EVALUATE TRUE
WHEN CLM-CLAIM-AMOUNT > 50000
ADD 15 TO WS-FRAUD-SCORE * Very high amount
WHEN CLM-CLAIM-AMOUNT > 25000
ADD 10 TO WS-FRAUD-SCORE * High amount
END-EVALUATE
Rationale: Large claims warrant extra scrutiny due to financial impact
Component 3: Provider History Check (Lines 2490-2508):
EXEC SQL
SELECT FRAUD_SCORE, ACTIVE_FLAG
INTO :HV-PROV-FRAUD-SCORE, :HV-PROV-ACTIVE-FLAG
FROM PROVIDER_TABLE
WHERE PROVIDER_CODE = :CLM-PROVIDER-CODE
END-EXEC
IF SQLCODE = 0
IF HV-PROV-FRAUD-SCORE > 50
ADD 20 TO WS-FRAUD-SCORE * Suspicious provider
END-IF
IF HV-PROV-ACTIVE-FLAG = 'N'
ADD 30 TO WS-FRAUD-SCORE * Inactive provider (major red flag)
END-IF
END-IF
Rationale: Provider fraud history strongly correlates with claim fraud
Component 4: Pattern Detection (Lines 2513-2526):
EXEC SQL
SELECT COUNT(*)
INTO :WS-ROW-COUNT
FROM CLAIM_TABLE
WHERE CUSTOMER_NUMBER = :CLM-CUSTOMER-NUMBER
AND CLAIM_TYPE = :CLM-CLAIM-TYPE
AND CLAIM_AMOUNT = :CLM-CLAIM-AMOUNT
AND CLAIM_DATE >= CURRENT_DATE - 90 DAYS
END-EXEC
IF WS-ROW-COUNT > 0
ADD 20 TO WS-FRAUD-SCORE * Duplicate claim pattern
END-IF
Rationale: Identical claims (same type and exact amount) suggest fraud scheme
Component 5: Timing Analysis (Lines 2531-2535):
MOVE FUNCTION DAY-OF-WEEK(CLM-INCIDENT-DATE) TO WS-TEMP-NUMERIC
IF WS-TEMP-NUMERIC = 1 OR WS-TEMP-NUMERIC = 7
ADD 5 TO WS-FRAUD-SCORE * Weekend incident (minor indicator)
END-IF
Rationale: Weekend claims statistically show slight fraud increase
Fraud Score Decision Logic (Lines 2542-2561):
EVALUATE TRUE
WHEN WS-FRAUD-SCORE >= WS-FRAUD-THRESHOLD (70)
* High risk - fraud investigation required
MOVE 'Y' TO HV-FRAUD-FLAG
MOVE 'Y' TO HV-INVESTIGATION-FLAG
MOVE 'UNDER REVIEW' TO HV-CLAIM-STATUS
MOVE 'FRAUD INVESTIGATION' TO HV-APPROVAL-STATUS
WHEN WS-FRAUD-SCORE >= 50
* Medium risk - manual review required
MOVE 'N' TO HV-FRAUD-FLAG
MOVE 'Y' TO HV-INVESTIGATION-FLAG
MOVE 'PENDING' TO HV-CLAIM-STATUS
MOVE 'MANUAL REVIEW' TO HV-APPROVAL-STATUS
WHEN WS-FRAUD-SCORE < 50
* Low risk - normal processing
MOVE 'N' TO HV-FRAUD-FLAG
MOVE 'N' TO HV-INVESTIGATION-FLAG
MOVE 'PROCESSING' TO HV-CLAIM-STATUS
IF CLM-CLAIM-AMOUNT <= WS-AUTO-APPROVE-LIMIT (5000)
MOVE 'AUTO-APPROVED' TO HV-APPROVAL-STATUS
ELSE
MOVE 'PENDING APPROVAL' TO HV-APPROVAL-STATUS
END-IF
END-EVALUATE
Fraud Thresholds (Lines 224-225):
05 WS-FRAUD-THRESHOLD PIC 9(03) VALUE 70.
05 WS-AUTO-APPROVE-LIMIT PIC 9(05) VALUE 5000.
Fraud Score Interpretation:
| Score Range | Classification | Action | Processing Time |
|---|---|---|---|
| 0-49 | Low Risk | Auto-process (if ≤$5k) or standard approval | Fast |
| 50-69 | Medium Risk | Route to senior claims adjuster | 2-3 days |
| 70+ | High Risk | Route to fraud investigation unit | 7-14 days |
Example Fraud Scenario:
Renewal Premium Discounts (Section 3130-CALCULATE-RENEWAL-PREMIUM, Lines 1948-2045)
Loyalty Discount (Lines 1991-1998):
* 1% per year, maximum 15%
IF REN-LOYALTY-YEARS > 0
COMPUTE WS-LOYALTY-DISCOUNT = WS-BASE-PREMIUM *
(REN-LOYALTY-YEARS * 0.01)
IF WS-LOYALTY-DISCOUNT > (WS-BASE-PREMIUM * 0.15)
COMPUTE WS-LOYALTY-DISCOUNT = WS-BASE-PREMIUM * 0.15
END-IF
ADD WS-LOYALTY-DISCOUNT TO WS-TOTAL-DISCOUNT
END-IF
No-Claims Discount (Lines 2003-2011):
* 2% per claim-free year, maximum 20%
IF REN-NO-CLAIMS-YEARS > 0
COMPUTE WS-NO-CLAIMS-DISCOUNT = WS-BASE-PREMIUM *
(REN-NO-CLAIMS-YEARS * 0.02)
IF WS-NO-CLAIMS-DISCOUNT > (WS-BASE-PREMIUM * 0.20)
COMPUTE WS-NO-CLAIMS-DISCOUNT = WS-BASE-PREMIUM * 0.20
END-IF
ADD WS-NO-CLAIMS-DISCOUNT TO WS-TOTAL-DISCOUNT
END-IF
Multi-Policy Discount (Lines 2016-2030):
* 10% if customer has multiple active policies
IF REN-MULTI-POLICY-FLAG = 'Y'
EXEC SQL
SELECT COUNT(*)
INTO :WS-POLICY-COUNT
FROM POLICY_TABLE
WHERE CUSTOMER_NUMBER = :REN-CUSTOMER-NUMBER
AND POLICY_STATUS = 'ACTIVE'
END-EXEC
IF WS-POLICY-COUNT > 1
COMPUTE WS-MULTI-POLICY-DISCOUNT = WS-BASE-PREMIUM * 0.10
ADD WS-MULTI-POLICY-DISCOUNT TO WS-TOTAL-DISCOUNT
END-IF
END-IF
Discount Summary Table:
| Discount Type | Formula | Maximum | Example (10 years, $1000 premium) |
|---|---|---|---|
| Loyalty | 1% per year | 15% | 10% = $100 |
| No-Claims | 2% per year | 20% | 20% = $200 (if 10 years no claims) |
| Multi-Policy | 10% flat | 10% | 10% = $100 |
| Total Possible | Cumulative | 45% | $400 maximum discount |
All 39 Sections Mapped:
| Section | Lines | Description |
|---|---|---|
| 0000-MAIN-CONTROL | 853-879 | Program entry point; evaluates processing mode; orchestrates main flow |
| Section | Lines | Description |
|---|---|---|
| 1000-INITIALIZE-PROGRAM | 885-948 | Master initialization; accepts SYSIN mode; initializes variables; calls subordinate init sections |
| 1100-OPEN-FILES | 954-1014 | Opens all files based on processing mode; handles file status errors |
| 1200-CONNECT-DB2 | 1020-1049 | Establishes DB2 connection; sets isolation level CS; sets lock timeout 30 seconds |
| 1300-INITIALIZE-RATE-TABLES | 1055-1123 | Loads age, state, and occupation rate tables into memory |
| 1400-WRITE-REPORT-HEADERS | 1129-1133 | Writes report headers with program info and current date |
| Section | Lines | Description |
|---|---|---|
| 2000-PROCESS-POLICIES | 1139-1168 | Main policy loop; reads POLFILE until EOF; commits every 500 records |
| 2100-PROCESS-POLICY-RECORD | 1179-1240 | Orchestrates individual policy processing; calls validation, calculation, database operations |
| 2110-VALIDATE-POLICY-INPUT | 1246-1329 | Validates customer number, name, age, SSN, insurance type, coverage, email |
| 2111-CALCULATE-CUSTOMER-AGE | 1335-1351 | Calculates age from DOB accounting for birthday occurrence |
| 2120-CHECK-DUPLICATE-POLICY | 1358-1382 | SQL COUNT(*) to check for existing active policy |
| 2130-CALCULATE-RISK-SCORE | 1388-1444 | Calculates 5-factor risk score (age, gender, smoker, conditions, occupation) |
| 2140-CALCULATE-POLICY-PREMIUM | 1450-1551 | Multi-step premium calculation with base rate, age factor, risk adjustment, discounts, tax |
| 2150-CREATE-UPDATE-CUSTOMER | 1557-1641 | MERGE operation to insert new customer or update existing |
| 2160-INSERT-POLICY-RECORD | 1645-1733 | Generates policy number from POLICY_SEQ; inserts policy record |
| 2170-WRITE-POLICY-OUTPUT | 1739-1766 | Writes pipe-delimited success record to POLOUT |
| Section | Lines | Description |
|---|---|---|
| 3000-PROCESS-RENEWALS | 1766-1794 | Main renewal loop; reads RENFILE until EOF; commits every 500 records |
| 3100-PROCESS-RENEWAL-RECORD | 1806-1862 | Orchestrates individual renewal processing |
| 3110-VALIDATE-RENEWAL-INPUT | 1868-1899 | Validates policy number, renewal term (12/24/36), renewal type (ST/UP/DN/MY) |
| 3120-GET-EXISTING-POLICY | 1905-1942 | SELECT to retrieve existing policy details; verifies ACTIVE status |
| 3130-CALCULATE-RENEWAL-PREMIUM | 1948-2045 | Renewal premium with loyalty, no-claims, multi-policy discounts |
| 3140-CREATE-RENEWAL-POLICY | 2051-2145 | Creates new policy record for renewal with new policy number |
| 3150-UPDATE-OLD-POLICY | 2145-2165 | Updates old policy status to 'RENEWED'; links to new policy |
| 3160-WRITE-RENEWAL-OUTPUT | 2171-2197 | Writes renewal confirmation to RENOUT |
| Section | Lines | Description |
|---|---|---|
| 4000-PROCESS-CLAIMS | 2197-2225 | Main claims loop; reads CLMFILE until EOF; commits every 500 records |
| 4100-PROCESS-CLAIM-RECORD | 2237-2310 | Orchestrates individual claim processing |
| 4110-VALIDATE-CLAIM-INPUT | 2316-2377 | Validates claim number, policy number, amount, type, dates |
| 4120-GET-CLAIM-POLICY | 2383-2430 | SELECT to retrieve policy for claim; verifies active status and coverage dates |
| 4130-CHECK-DUPLICATE-CLAIM | 2436-2454 | SQL COUNT(*) to check for duplicate claim number |
| 4140-FRAUD-DETECTION | 2454-2561 | 5-component fraud analysis with frequency, amount, provider, pattern, timing checks |
| 4150-CALCULATE-CLAIM-PAYMENT | 2567-2671 | Payment calculation: deductible application, copay, out-of-pocket max |
| 4160-INSERT-CLAIM-RECORD | 2675-2761 | Generates claim ID from CLAIM_SEQ; inserts claim record |
| 4170-UPDATE-POLICY-USAGE | 2767-2806 | Updates policy: increments deductible met, OOP met, claims count |
| 4180-WRITE-CLAIM-OUTPUT | 2811-2852 | Writes claim decision to CLMOUT |
| Section | Lines | Description |
|---|---|---|
| 7000-COMMIT-WORK | 2852-2867 | Executes DB2 COMMIT; resets commit counter; handles commit errors |
| Section | Lines | Description |
|---|---|---|
| 8000-ERROR-HANDLER | 2873-2941 | Central error handler; determines severity; formats error message; writes to ERRFILE; displays on console; rolls back DB errors; aborts if critical |
| Section | Lines | Description |
|---|---|---|
| 9000-FINALIZE-PROGRAM | 2947-2973 | Master finalization routine; calls final commit, summary, close, disconnect |
| 9100-WRITE-SUMMARY-REPORT | 2979-3097 | Writes comprehensive summary report with statistics by function and overall |
| 9200-CLOSE-FILES | 3103-3169 | Closes all open files; handles close errors as warnings |
| 9300-DISCONNECT-DB2 | 3175-3197 | Disconnects from DB2 with RELEASE ALL |
| 9999-ABORT-PROGRAM | 3203-3228 | Abnormal termination for critical errors; rolls back; closes files; STOP RUN with RC=16 |
Dependency Map:
Connection and Setup (3 operations):
SELECT Operations (10 operations): 4. Get policy number from POLICY_SEQ (Lines 1645-1649, 2055-2059) 5. Check duplicate policy COUNT() (Lines 1358-1365) 6. Get existing policy for renewal (Lines 1906-1920) 7. Count active policies for multi-policy discount (Lines 2019-2026) 8. Get claim ID from CLAIM_SEQ (Lines 2675-2679) 9. Get policy for claim (Lines 2389-2407) 10. Check duplicate claim COUNT() (Lines 2437-2442) 11. Fraud: Claim frequency last 30 days (Lines 2460-2466) 12. Fraud: Provider history (Lines 2491-2496) 13. Fraud: Pattern detection 90 days (Lines 2513-2521)
INSERT Operations (3 operations): 14. Insert policy record (Lines 1697-1719) 15. Insert renewal policy (Lines 2084-2115) 16. Insert claim record (Lines 2685-2747)
UPDATE Operations (2 operations): 17. Update old policy status to RENEWED (Lines 2146-2153) 18. Update policy usage (deductible met, claims count) (Lines 2774-2785)
MERGE Operations (1 operation): 19. Merge customer (insert new or update existing) (Lines 1597-1629)
Transaction Management (4 operations): 20. COMMIT WORK (Lines 2855-2857) 21. ROLLBACK WORK (Lines 2929-2931, 3206-3208) 22. RELEASE ALL (Line 3181) 23. CONNECT RESET (Line 3186)
POLICY_TABLE (6 operations):
CUSTOMER_TABLE (1 operation):
CLAIM_TABLE (4 operations):
PROVIDER_TABLE (1 operation):
Sequences (2 operations):
Commit Strategy (Lines 220, 2852-2867):
* Constant definition
05 WS-COMMIT-FREQUENCY PIC 9(04) VALUE 500.
* Commit logic
7000-COMMIT-WORK SECTION.
EXEC SQL
COMMIT WORK
END-EXEC
IF SQLCODE NOT = 0
MOVE 'COMMIT FAILED' TO WS-ERROR-MESSAGE
MOVE 7001 TO WS-ERROR-CODE
PERFORM 8000-ERROR-HANDLER
ELSE
DISPLAY 'COMMIT SUCCESSFUL - RECORDS: ' WS-COMMIT-COUNT
MOVE ZERO TO WS-COMMIT-COUNT
END-IF.
Commit Triggers:
Commit Pattern in Processing Loops (Example from Lines 1165-1167):
ADD 1 TO WS-COMMIT-COUNT
IF WS-COMMIT-COUNT >= WS-COMMIT-FREQUENCY
PERFORM 7000-COMMIT-WORK
END-IF
SQLCODE Handling Pattern:
EXEC SQL
[SQL OPERATION]
END-EXEC
IF SQLCODE NOT = 0
MOVE [ERROR CODE] TO WS-ERROR-CODE
MOVE '[ERROR MESSAGE]' TO WS-ERROR-MESSAGE
PERFORM 8000-ERROR-HANDLER
END-IF
Special SQLCODE Values:
Automatic Rollback (Lines 2928-2933):
IF SQLCODE NOT = 0 AND SQLCODE NOT = 100
EXEC SQL
ROLLBACK WORK
END-EXEC
MOVE ZERO TO WS-COMMIT-COUNT
END-IF
Generic Processing Pattern:
PERFORM UNTIL [file]-END-OF-FILE
READ [INPUT-FILE] INTO [WS-INPUT-AREA]
EVALUATE [file-status]
WHEN '00'
ADD 1 TO [READ-COUNT]
ADD 1 TO WS-TOTAL-READ-COUNT
PERFORM [PROCESS-RECORD-SECTION]
WHEN '10'
SET [file]-END-OF-FILE TO TRUE
WHEN OTHER
MOVE '[FILE READ ERROR]' TO WS-ERROR-MESSAGE
MOVE [ERROR-CODE] TO WS-ERROR-CODE
PERFORM 8000-ERROR-HANDLER
END-EVALUATE
IF WS-COMMIT-COUNT >= WS-COMMIT-FREQUENCY
PERFORM 7000-COMMIT-WORK
END-IF
END-PERFORM
Record Type Handling (Header/Detail/Trailer):
EVALUATE TRUE
WHEN POL-HEADER
CONTINUE * Skip header records
WHEN POL-TRAILER
CONTINUE * Skip trailer records
WHEN POL-DETAIL
* Process detail record
[processing logic]
END-EVALUATE
Output Format: Pipe-delimited for easy parsing and downstream processing
Policy Output Example (Lines 1739-1758):
STRING 'POLICY|'
WS-POLICY-NUMBER '|'
POL-CUSTOMER-NUMBER '|'
POL-CUSTOMER-NAME '|'
POL-INSURANCE-TYPE '|'
HV-POLICY-START-DATE '|'
HV-POLICY-END-DATE '|'
WS-FINAL-PREMIUM '|'
WS-RISK-SCORE '|'
'SUCCESS|'
WS-CURR-TIMESTAMP
DELIMITED BY SIZE INTO POLICY-OUTPUT-RECORD
END-STRING
WRITE POLICY-OUTPUT-RECORD
Output Example:
POLICY|123456789012345|1234567890|JOHN DOE|HEALTH|2024-01-15|2025-01-15|758.53|055|SUCCESS|2024-01-15-10.30.45.123456
Error Record Format (Lines 2900-2906):
STRING 'ERROR|'
WS-ERROR-CODE '|'
WS-ERROR-SEVERITY '|'
WS-ERROR-MESSAGE '|'
'SQLCODE=' SQLCODE '|'
WS-ERROR-TIMESTAMP
DELIMITED BY SIZE INTO ERROR-RECORD
END-STRING
WRITE ERROR-RECORD
Error Examples:
ERROR|2114|SEVERE|INVALID SSN|SQLCODE=0|2024-01-15-10.30.45.123456
ERROR|2162|SEVERE|POLICY INSERT FAILED|SQLCODE=-803|2024-01-15-10.30.46.789012
ERROR|4140|SEVERE|FRAUD INVESTIGATION|SQLCODE=0|2024-01-15-10.30.47.234567
Report Header (Lines 1130-1133):
MOVE '1' TO RPT-CC * New page
WRITE REPORT-RECORD FROM WS-REPORT-HEADER-1
MOVE ' ' TO RPT-CC * Single space
WRITE REPORT-RECORD FROM WS-REPORT-HEADER-2
Summary Report (Lines 2979-3097): Includes:
Report Example:
INSURANCE MANAGEMENT SYSTEM - PROCESSING SUMMARY
================================================
PROGRAM: INSMASTR VERSION 03.00
DATE: 2024-01-15 TIME: 10:45:23
PROCESSING MODE: ALL
POLICY PROCESSING:
RECORDS READ: 1,250
RECORDS PROCESSED: 1,200
ERRORS: 50
RENEWAL PROCESSING:
RECORDS READ: 850
RECORDS PROCESSED: 820
ERRORS: 30
CLAIMS PROCESSING:
RECORDS READ: 2,500
RECORDS PROCESSED: 2,400
ERRORS: 100
TOTAL SUMMARY:
RECORDS READ: 4,600
RECORDS PROCESSED: 4,420
ERRORS: 180
COMMITS: 9
RETURN CODE: 4 (PARTIAL SUCCESS)
Complete Error Code Catalog:
| Code | Message | Source | Action |
|---|---|---|---|
| 1101 | POLICY INPUT FILE OPEN ERROR | 1100-OPEN-FILES | Abort |
| 1102 | RENEWAL INPUT FILE OPEN ERROR | 1100-OPEN-FILES | Abort |
| 1103 | CLAIMS INPUT FILE OPEN ERROR | 1100-OPEN-FILES | Abort |
| 1104 | POLICY OUTPUT FILE OPEN ERROR | 1100-OPEN-FILES | Abort |
| 1105 | RENEWAL OUTPUT FILE OPEN ERROR | 1100-OPEN-FILES | Abort |
| 1106 | CLAIMS OUTPUT FILE OPEN ERROR | 1100-OPEN-FILES | Abort |
| 1107 | ERROR FILE OPEN ERROR | 1100-OPEN-FILES | Abort |
| 1108 | REPORT FILE OPEN ERROR | 1100-OPEN-FILES | Abort |
| 1201 | DB2 CONNECTION FAILED | 1200-CONNECT-DB2 | Abort |
| 1202 | SET ISOLATION LEVEL FAILED | 1200-CONNECT-DB2 | Abort |
| 1203 | SET LOCK TIMEOUT FAILED | 1200-CONNECT-DB2 | Abort |
| Code | Message | Source | Action |
|---|---|---|---|
| 2001 | POLICY FILE READ ERROR | 2000-PROCESS-POLICIES | Skip record |
| 2111 | INVALID CUSTOMER NUMBER | 2110-VALIDATE-POLICY-INPUT | Reject |
| 2112 | CUSTOMER NAME REQUIRED | 2110-VALIDATE-POLICY-INPUT | Reject |
| 2113 | AGE OUTSIDE VALID RANGE (18-85) | 2110-VALIDATE-POLICY-INPUT | Reject |
| 2114 | INVALID SSN | 2110-VALIDATE-POLICY-INPUT | Reject |
| 2115 | INVALID INSURANCE TYPE | 2110-VALIDATE-POLICY-INPUT | Reject |
| 2116 | INVALID COVERAGE AMOUNT | 2110-VALIDATE-POLICY-INPUT | Reject |
| 2117 | INVALID EMAIL FORMAT | 2110-VALIDATE-POLICY-INPUT | Reject |
| 2118 | INVALID PAYMENT FREQUENCY | 2110-VALIDATE-POLICY-INPUT | Reject |
| 2119 | INVALID PAYMENT METHOD | 2110-VALIDATE-POLICY-INPUT | Reject |
| 2121 | ACTIVE POLICY ALREADY EXISTS | 2120-CHECK-DUPLICATE-POLICY | Reject |
| 2122 | DATABASE ERROR CHECKING DUPLICATE | 2120-CHECK-DUPLICATE-POLICY | Rollback |
| 2151 | CUSTOMER MERGE FAILED | 2150-CREATE-UPDATE-CUSTOMER | Rollback |
| 2161 | POLICY NUMBER GENERATION FAILED | 2160-INSERT-POLICY-RECORD | Rollback |
| 2162 | POLICY INSERT FAILED | 2160-INSERT-POLICY-RECORD | Rollback |
| 2171 | POLICY OUTPUT WRITE FAILED | 2170-WRITE-POLICY-OUTPUT | Warning |
| Code | Message | Source | Action |
|---|---|---|---|
| 3001 | RENEWAL FILE READ ERROR | 3000-PROCESS-RENEWALS | Skip record |
| 3111 | INVALID POLICY NUMBER | 3110-VALIDATE-RENEWAL-INPUT | Reject |
| 3112 | INVALID RENEWAL TERM | 3110-VALIDATE-RENEWAL-INPUT | Reject |
| 3113 | INVALID RENEWAL TYPE | 3110-VALIDATE-RENEWAL-INPUT | Reject |
| 3114 | INVALID REQUESTED COVERAGE | 3110-VALIDATE-RENEWAL-INPUT | Reject |
| 3121 | POLICY NOT FOUND | 3120-GET-EXISTING-POLICY | Reject |
| 3122 | ERROR RETRIEVING POLICY | 3120-GET-EXISTING-POLICY | Rollback |
| 3123 | POLICY NOT ACTIVE FOR RENEWAL | 3120-GET-EXISTING-POLICY | Reject |
| 3141 | RENEWAL POLICY NUMBER GENERATION FAILED | 3140-CREATE-RENEWAL-POLICY | Rollback |
| 3142 | RENEWAL POLICY INSERT FAILED | 3140-CREATE-RENEWAL-POLICY | Rollback |
| 3151 | OLD POLICY UPDATE FAILED | 3150-UPDATE-OLD-POLICY | Rollback |
| 3161 | RENEWAL OUTPUT WRITE FAILED | 3160-WRITE-RENEWAL-OUTPUT | Warning |
| Code | Message | Source | Action |
|---|---|---|---|
| 4001 | CLAIMS FILE READ ERROR | 4000-PROCESS-CLAIMS | Skip record |
| 4111 | CLAIM NUMBER REQUIRED | 4110-VALIDATE-CLAIM-INPUT | Reject |
| 4112 | INVALID POLICY NUMBER | 4110-VALIDATE-CLAIM-INPUT | Reject |
| 4113 | INVALID CLAIM AMOUNT | 4110-VALIDATE-CLAIM-INPUT | Reject |
| 4114 | INVALID CLAIM TYPE | 4110-VALIDATE-CLAIM-INPUT | Reject |
| 4115 | FUTURE INCIDENT DATE NOT ALLOWED | 4110-VALIDATE-CLAIM-INPUT | Reject |
| 4116 | CLAIM DATE BEFORE INCIDENT DATE | 4110-VALIDATE-CLAIM-INPUT | Reject |
| 4117 | INVALID PROVIDER CODE | 4110-VALIDATE-CLAIM-INPUT | Reject |
| 4121 | POLICY NOT FOUND FOR CLAIM | 4120-GET-CLAIM-POLICY | Reject |
| 4122 | ERROR RETRIEVING POLICY FOR CLAIM | 4120-GET-CLAIM-POLICY | Rollback |
| 4123 | POLICY NOT ACTIVE | 4120-GET-CLAIM-POLICY | Reject |
| 4124 | INCIDENT OUTSIDE POLICY PERIOD | 4120-GET-CLAIM-POLICY | Reject |
| 4131 | DUPLICATE CLAIM NUMBER | 4130-CHECK-DUPLICATE-CLAIM | Reject |
| 4132 | ERROR CHECKING DUPLICATE CLAIM | 4130-CHECK-DUPLICATE-CLAIM | Rollback |
| 4161 | CLAIM ID GENERATION FAILED | 4160-INSERT-CLAIM-RECORD | Rollback |
| 4162 | CLAIM INSERT FAILED | 4160-INSERT-CLAIM-RECORD | Rollback |
| 4171 | POLICY USAGE UPDATE FAILED | 4170-UPDATE-POLICY-USAGE | Rollback |
| 4181 | CLAIM OUTPUT WRITE FAILED | 4180-WRITE-CLAIM-OUTPUT | Warning |
| Code | Message | Source | Action |
|---|---|---|---|
| 7001 | COMMIT FAILED | 7000-COMMIT-WORK | Rollback |
| Code | Message | Source | Action |
|---|---|---|---|
| 9201 | ERROR CLOSING FILES | 9200-CLOSE-FILES | Warning |
| 9301 | DB2 DISCONNECT ERROR | 9300-DISCONNECT-DB2 | Warning |
Severity Determination (Lines 2882-2893):
EVALUATE WS-ERROR-CODE
WHEN 1101 THRU 1999
MOVE 'CRITICAL' TO WS-ERROR-SEVERITY
SET ERROR-CRITICAL TO TRUE
WHEN 2001 THRU 2999
MOVE 'SEVERE' TO WS-ERROR-SEVERITY
SET ERROR-SEVERE TO TRUE
WHEN 3001 THRU 3999
MOVE 'SEVERE' TO WS-ERROR-SEVERITY
SET ERROR-SEVERE TO TRUE
WHEN 4001 THRU 4999
MOVE 'SEVERE' TO WS-ERROR-SEVERITY
SET ERROR-SEVERE TO TRUE
WHEN 7001 THRU 7999
MOVE 'SEVERE' TO WS-ERROR-SEVERITY
SET ERROR-SEVERE TO TRUE
WHEN OTHER
MOVE 'WARNING' TO WS-ERROR-SEVERITY
SET ERROR-WARNING TO TRUE
END-EVALUATE
Severity Impact:
| Severity | Meaning | Impact | Return Code |
|---|---|---|---|
| WARNING | Non-critical issue | Processing continues; error logged | 4 (partial success) |
| SEVERE | Business rule violation or data error | Record rejected; processing continues with next record | 8 (if all fail) |
| CRITICAL | System failure | Automatic rollback; program abort | 12 or 16 |
Central Error Handler Flow (8000-ERROR-HANDLER, Lines 2873-2941):
Automatic Rollback Triggers (Lines 2928-2933):
IF SQLCODE NOT = 0 AND SQLCODE NOT = 100
EXEC SQL
ROLLBACK WORK
END-EXEC
MOVE ZERO TO WS-COMMIT-COUNT
DISPLAY 'DATABASE CHANGES ROLLED BACK'
END-IF
Abort Program Section (9999-ABORT-PROGRAM, Lines 3203-3228):
9999-ABORT-PROGRAM SECTION.
DISPLAY '***********************************************'
DISPLAY '* PROGRAM ABORTED DUE TO CRITICAL ERROR *'
DISPLAY '***********************************************'
DISPLAY 'ERROR CODE: ' WS-ERROR-CODE
DISPLAY 'ERROR MESSAGE: ' WS-ERROR-MESSAGE
* Rollback all uncommitted changes
EXEC SQL
ROLLBACK WORK
END-EXEC
* Attempt to close files gracefully
PERFORM 9200-CLOSE-FILES
* Disconnect from DB2
PERFORM 9300-DISCONNECT-DB2
* Set critical failure return code
MOVE 16 TO RETURN-CODE
DISPLAY 'PROGRAM TERMINATED WITH RETURN CODE 16'
STOP RUN.
Abort Conditions:
Parameter Specification:
//SYSIN DD *
ALL
/*
Valid Values:
POLICY - Process policies onlyRENEWAL - Process renewals onlyCLAIM - Process claims onlyALL - Process all types (default)Parameter Handling (Lines 889-893):
ACCEPT WS-PROCESSING-MODE FROM SYSIN
IF WS-PROCESSING-MODE = SPACES
MOVE 'ALL' TO WS-PROCESSING-MODE
END-IF
DISPLAY 'PROCESSING MODE: ' WS-PROCESSING-MODE
Policy Input File (POLFILE) - 800 bytes (Lines 313-383):
| Field | Position | Length | Type | Description |
|---|---|---|---|---|
| Record Type | 1-2 | 2 | X | HD=Header, DT=Detail, TR=Trailer |
| Customer Number | 3-12 | 10 | 9 | Unique customer ID |
| Customer Name | 13-62 | 50 | X | Full name |
| Date of Birth | 63-72 | 10 | X | YYYY-MM-DD format |
| Gender | 73 | 1 | X | M/F/O |
| Marital Status | 74 | 1 | X | S/M/D/W |
| SSN | 75-83 | 9 | 9 | Social Security Number |
| Address Street1 | 84-133 | 50 | X | |
| Address Street2 | 134-183 | 50 | X | |
| Address City | 184-213 | 30 | X | |
| Address State | 214-215 | 2 | X | Two-letter state code |
| Address ZIP | 216-225 | 10 | X | ZIP or ZIP+4 |
| Address Country | 226-228 | 3 | X | Default USA |
| Phone Primary | 229-243 | 15 | X | |
| Phone Secondary | 244-258 | 15 | X | |
| 259-308 | 50 | X | Must contain @ | |
| Insurance Type | 309-318 | 10 | X | HEALTH/LIFE/AUTO/PROPERTY/DENTAL/VISION |
| Coverage Amount | 319-329 | 11 | 9(9)V99 | Maximum coverage |
| Deductible | 330-338 | 9 | 9(7)V99 | Annual deductible |
| Copay Percentage | 339-340 | 2 | 99 | Patient copay % |
| Out-of-Pocket Max | 341-349 | 9 | 9(7)V99 | Annual OOP max |
| Payment Frequency | 350 | 1 | X | M/Q/S/A |
| Payment Method | 351-352 | 2 | X | CH/CC/DC/EF |
| Smoker Flag | 353 | 1 | X | Y/N |
| Pre-existing Conditions | 354 | 1 | X | Y/N |
| Occupation | 355-384 | 30 | X | |
| Annual Income | 385-395 | 11 | 9(9)V99 | |
| Beneficiary Name | 396-445 | 50 | X | |
| Beneficiary Relation | 446-465 | 20 | X | |
| Agent Code | 466-475 | 10 | X | |
| Promo Code | 476-485 | 10 | X | |
| Referral Source | 486-495 | 10 | X | |
| Special Notes | 496-595 | 100 | X | |
| Filler | 596-800 | 205 | X | Reserved |
Renewal Input File (RENFILE) - 600 bytes (Lines 389-438):
| Field | Position | Length | Type | Description |
|---|---|---|---|---|
| Record Type | 1-2 | 2 | X | HD/DT/TR |
| Policy Number | 3-17 | 15 | 9 | Existing policy to renew |
| Customer Number | 18-27 | 10 | 9 | |
| Customer Name | 28-77 | 50 | X | |
| Renewal Type | 78-79 | 2 | X | ST/UP/DN/MY |
| Current Expiry Date | 80-89 | 10 | X | YYYY-MM-DD |
| Renewal Term Months | 90-91 | 2 | 99 | 12, 24, or 36 |
| Requested Coverage | 92-102 | 11 | 9(9)V99 | New coverage if changing |
| Requested Deductible | 103-111 | 9 | 9(7)V99 | New deductible if changing |
| Add Riders | 112 | 1 | X | Y/N |
| Rider Codes (5x) | 113-162 | 50 | X(10)×5 | |
| Payment Method | 163-164 | 2 | X | CH/CC/DC/EF |
| Auto Renewal Flag | 165 | 1 | X | Y/N |
| Loyalty Years | 166-167 | 2 | 99 | Years with company |
| No Claims Years | 168-169 | 2 | 99 | Years without claims |
| Multi Policy Flag | 170 | 1 | X | Y/N |
| Discount Codes (5x) | 171-280 | 110 | varies | Code (10) + Pct (4) ×5 |
| Filler | 281-600 | 320 | X | Reserved |
Claims Input File (CLMFILE) - 900 bytes (Lines 444-523):
| Field | Position | Length | Type | Description |
|---|---|---|---|---|
| Record Type | 1-2 | 2 | X | HD/DT/TR |
| Claim Number | 3-17 | 15 | X | External claim ID |
| Policy Number | 18-32 | 15 | 9 | |
| Customer Number | 33-42 | 10 | 9 | |
| Customer Name | 43-92 | 50 | X | |
| Claim Type | 93-102 | 10 | X | MEDICAL/HOSPITAL/EMERGENCY/DENTAL/VISION/AUTO/PROPERTY |
| Incident Date | 103-112 | 10 | X | YYYY-MM-DD |
| Claim Date | 113-122 | 10 | X | YYYY-MM-DD |
| Report Date | 123-132 | 10 | X | YYYY-MM-DD |
| Claim Amount | 133-143 | 11 | 9(9)V99 | Total claim amount |
| Currency Code | 144-146 | 3 | X | USD |
| Provider Code | 147-156 | 10 | X | |
| Provider Name | 157-206 | 50 | X | |
| Provider Type | 207-216 | 10 | X | Hospital/Clinic/Doctor/Lab |
| Network Flag | 217 | 1 | X | Y/N |
| Provider Tax ID | 218-232 | 15 | X | |
| Diagnosis Code | 233-242 | 10 | X | ICD-10 |
| Diagnosis Desc | 243-292 | 50 | X | |
| Procedure Code | 293-302 | 10 | X | CPT |
| Procedure Desc | 303-352 | 50 | X | |
| DRG Code | 353-357 | 5 | X | |
| Admission Date | 358-367 | 10 | X | YYYY-MM-DD |
| Discharge Date | 368-377 | 10 | X | YYYY-MM-DD |
| Length of Stay | 378-380 | 3 | 999 | Days |
| Emergency Flag | 381 | 1 | X | Y/N |
| Police Report No | 382-401 | 20 | X | For auto claims |
| Other Party Info | 402-501 | 100 | X | For auto claims |
| Damage Estimate | 502-510 | 9 | 9(7)V99 | For auto claims |
| Rental Needed | 511 | 1 | X | Y/N |
| Document Flags | 512-516 | 5 | X | Receipt/Invoice/Rx/Xray/Lab |
| Pre-Auth Code | 517-531 | 15 | X | |
| Referral Code | 532-546 | 15 | X | |
| Override Code | 547-556 | 10 | X | |
| Filler | 557-900 | 344 | X | Reserved |
All output files use pipe-delimited format (|) for easy parsing
Policy Output (POLOUT) - 500 bytes (Lines 1739-1758):
POLICY|{PolicyNum}|{CustNum}|{Name}|{Type}|{StartDate}|{EndDate}|{Coverage}|{Premium}|{RiskScore}|{Status}|{Timestamp}
Example:
POLICY|123456789012345|1234567890|JOHN DOE|HEALTH|2024-01-15|2025-01-15|100000.00|758.53|055|SUCCESS|2024-01-15-10.30.45.123456
Renewal Output (RENOUT) - 500 bytes:
RENEWAL|{OldPolicyNum}|{NewPolicyNum}|{CustNum}|{Name}|{OldPremium}|{NewPremium}|{Discount%}|{Status}|{Timestamp}
Claims Output (CLMOUT) - 500 bytes:
CLAIM|{ClaimID}|{ClaimNum}|{PolicyNum}|{Type}|{ClaimAmt}|{ApprovedAmt}|{InsurancePays}|{PatientPays}|{FraudScore}|{Status}|{Timestamp}
Return Code Values (Set in Lines 2957-2972):
EVALUATE TRUE
WHEN WS-TOTAL-ERROR-COUNT = ZERO
MOVE 0 TO RETURN-CODE * Perfect success
WHEN WS-TOTAL-PROCESS-COUNT = ZERO
MOVE 8 TO RETURN-CODE * All records failed
WHEN WS-TOTAL-ERROR-COUNT > ZERO
MOVE 4 TO RETURN-CODE * Partial success
END-EVALUATE
| Return Code | Meaning | Condition |
|---|---|---|
| 0 | Success | All records processed without errors |
| 4 | Warning / Partial Success | Some records had errors, others succeeded |
| 8 | Error | All records failed OR invalid processing mode |
| 12 | Critical | Cannot open required files |
| 16 | Abend | Critical system error requiring abort |