IDENTIFICATION DIVISION. PROGRAM-ID. TA-TELAMTCAL. ** * システム名 : 共通請求基盤システム * サブシステム名: 料金計算システム * プログラム名 : 金額計算制御 * プログラムID : TA-TELAMTCAL * 作成日 : 2026-06-22 * 処理概要 : 料金プランに基づき通話明細から * 金額計算を行い課金明細を生成する。 * 処理方式 : 標準バッチフレームワーク準拠 * トランザクション管理 + CHECKPOINT制御 * 修正履歴 : * V1.000:2026/06/22:新規作成 ** ENVIRONMENT DIVISION. CONFIGURATION SECTION. SOURCE-COMPUTER. IBM-370. OBJECT-COMPUTER. IBM-370. DATA DIVISION. WORKING-STORAGE SECTION. ** * 定数定義 ** 01 CON-FLAG-ON PIC S9(04) COMP VALUE 1. 01 CON-FLAG-OFF PIC S9(04) COMP VALUE 0. 01 CON-STATUS-ON PIC S9(08) COMP VALUE 1. 01 CON-STATUS-OFF PIC S9(08) COMP VALUE 0. 01 CON-NORMAL PIC S9(04) COMP VALUE 0. 01 CON-ADD-COUNT PIC 9(04) COMP VALUE 1. 01 CON-ADD-TOTAL-COUNT PIC 9(04) COMP VALUE 1. 01 CON-COMMIT-MAX PIC 9(04) COMP VALUE 5. * 作業領域 01 WRK-FLAGS. 03 WB-ERROR-FLAG PIC S9(04) COMP. 03 WB-LOOP-FLAG PIC S9(04) COMP. 01 WRK-PARAM-COUNT PIC 9(04) COMP. 01 WRK-TOTAL-COUNT PIC 9(08) COMP. 01 WRK-LOOP-COUNT PIC 9(04) COMP. 01 WRK-PROC-COUNT PIC 9(08) COMP. 01 WRK-REC-COUNT PIC 9(08) COMP. 01 WRK-IDX PIC 9(02) COMP. 01 WRK-JDX PIC 9(02) COMP. 01 WRK-EMS-RET PIC S9(04) COMP. 01 WRK-ABEND-COD PIC S9(04) COMP. * 料金テーブル 01 WRK-TARIFF-COUNT PIC 9(02) COMP VALUE 5. 01 WRK-TARIFF-TABLE. 03 WRK-TP-ENTRY OCCURS 5 TIMES. 05 TP-CODE PIC X(03). 05 TP-NAME PIC X(08). 05 TP-BASE-FEE PIC 9(09) COMP. 05 TP-UNIT-PRICE PIC 9(04) COMP. 05 TP-FREE-SEC PIC 9(09) COMP. 05 TP-OVER-PRICE PIC 9(04) COMP. 05 TP-ROAM-PRICE PIC 9(04) COMP. 05 TP-SMS-PRICE PIC 9(04) COMP. 05 TP-DATA-PRICE PIC 9(04) COMP. * CDRレコード 01 CDR-REC. 03 CDR-ID PIC X(10). 03 CDR-CALLER PIC X(11). 03 CDR-CALLEE PIC X(11). 03 CDR-START PIC X(14). 03 CDR-DURATION PIC 9(09) COMP. 03 CDR-CALL-TYPE PIC X(02). 03 CDR-ROAM-FLAG PIC X(01). * 課金明細レコード 01 BLL-REC. 03 BLL-CALL-ID PIC X(10). 03 BLL-CUST-ID PIC X(10). 03 BLL-PLAN-CODE PIC X(03). 03 BLL-CALL-TYPE PIC X(02). 03 BLL-DURATION PIC 9(09) COMP. 03 BLL-FREE-MIN PIC 9(09) COMP. 03 BLL-OVER-USAGE PIC 9(09) COMP. 03 BLL-UNIT-PRICE PIC 9(04) COMP. 03 BLL-BASE-CHARGE PIC 9(09) COMP. 03 BLL-OVER-CHARGE PIC 9(09) COMP. 03 BLL-ROAM-CHARGE PIC 9(09) COMP. 03 BLL-TOTAL-CHARGE PIC 9(09) COMP. 03 BLL-STATUS PIC X(01). * 計算用ワーク 01 CALC-AREA. 03 CALC-DURATION PIC 9(09) COMP. 03 CALC-FREE-MIN PIC 9(09) COMP. 03 CALC-OVER-SEC PIC 9(09) COMP. 03 CALC-UNIT-PRICE PIC 9(04) COMP. 03 CALC-BASE-CHARGE PIC 9(09) COMP. 03 CALC-OVER-CHARGE PIC 9(09) COMP. 03 CALC-ROAM-CHARGE PIC 9(09) COMP. 03 CALC-TOTAL-CHARGE PIC 9(09) COMP. 03 CALC-TP-IDX PIC 9(02) COMP. 03 CALC-FOUND PIC X(01). 88 CALC-FOUND-YES VALUE 'Y'. 03 CALC-PLAN-CODE PIC X(03). 03 CALC-CALL-TYPE PIC X(02). 03 CALC-ROAM-FLAG PIC X(01). * 集計エリア(表示用はDISPLAY形式で定義) 01 SUM-CHARGE PIC 9(15) VALUE 0. 01 SUM-BASE PIC 9(15) VALUE 0. 01 SUM-OVER PIC 9(15) VALUE 0. 01 SUM-ROAM PIC 9(15) VALUE 0. 01 SUM-COUNT PIC 9(09) VALUE 0. 01 SUM-ERROR-COUNT PIC 9(09) VALUE 0. * 試験用CDRデータ(8件) 01 CDR-TEST-COUNT PIC 9(02) COMP VALUE 8. 01 CDR-TEST-DATA. 03 CDR-TEST-ENTRY OCCURS 8 TIMES. 05 TE-ID PIC X(10). 05 TE-CALLER PIC X(11). 05 TE-CALLEE PIC X(11). 05 TE-START PIC X(14). 05 TE-DURATION PIC 9(09) COMP. 05 TE-TYPE PIC X(02). 05 TE-ROAM PIC X(01). PROCEDURE DIVISION. ** * 0000-MAIN: メイン制御部 * CHECKPOINT/RERUN対応、トランザクション管理、 * レート計算、DB書込をシーケンシャルに実行 ** 0000-MAIN SECTION. DISPLAY "TA-TELAMTCAL: Starting" DISPLAY "Batch Amount Calculation Program" DISPLAY "Telecom Amount Calculation System" * フェーズ1: 初期化 PERFORM 0100-INIT. * フェーズ2: 料金テーブルロード PERFORM 0200-LOAD-TARIFF. * フェーズ3: 試験データロード PERFORM 0300-LOAD-TEST-DATA. * フェーズ4: 主処理ループ(CDR → レート計算 → DB書込) PERFORM VARYING WRK-IDX FROM 1 BY 1 UNTIL WRK-IDX > CDR-TEST-COUNT OR WB-LOOP-FLAG = CON-FLAG-ON PERFORM 0400-PROCESS-CDR END-PERFORM. * フェーズ5: チェックポイント登録 PERFORM 0700-CHECKPOINT. * フェーズ6: 集計報告 PERFORM 0800-SUMMARY. DISPLAY "TA-TELAMTCAL: Normal end" DISPLAY "PROCESSED: " SUM-COUNT " TOTAL-CHARGE: " SUM-CHARGE STOP RUN. ** * 0100-INIT: 定数初期化、作業領域初期化 ** 0100-INIT SECTION. MOVE CON-FLAG-OFF TO WB-LOOP-FLAG. MOVE CON-NORMAL TO WB-ERROR-FLAG. MOVE CON-STATUS-OFF TO WB-ERROR-FLAG. MOVE ZERO TO WRK-TOTAL-COUNT. MOVE ZERO TO WRK-LOOP-COUNT. MOVE ZERO TO WRK-REC-COUNT. MOVE ZERO TO WRK-PROC-COUNT. MOVE ZERO TO SUM-COUNT MOVE ZERO TO SUM-ERROR-COUNT MOVE ZERO TO SUM-CHARGE MOVE ZERO TO SUM-BASE MOVE ZERO TO SUM-OVER MOVE ZERO TO SUM-ROAM DISPLAY "INIT: OK". EXIT. ** * 0200-LOAD-TARIFF: 料金テーブルロード * 5プランの料金体系をメモリテーブルに設定 ** 0200-LOAD-TARIFF SECTION. MOVE 5 TO WRK-TARIFF-COUNT. MOVE "P01" TO TP-CODE(1) MOVE "BASIC" TO TP-NAME(1) MOVE 3000 TO TP-BASE-FEE(1) MOVE 20 TO TP-UNIT-PRICE(1) MOVE 6000 TO TP-FREE-SEC(1) MOVE 20 TO TP-OVER-PRICE(1) MOVE 50 TO TP-ROAM-PRICE(1) MOVE 10 TO TP-SMS-PRICE(1) MOVE 30 TO TP-DATA-PRICE(1) MOVE "P02" TO TP-CODE(2) MOVE "BUSINESS" TO TP-NAME(2) MOVE 8000 TO TP-BASE-FEE(2) MOVE 10 TO TP-UNIT-PRICE(2) MOVE 30000 TO TP-FREE-SEC(2) MOVE 15 TO TP-OVER-PRICE(2) MOVE 30 TO TP-ROAM-PRICE(2) MOVE 5 TO TP-SMS-PRICE(2) MOVE 20 TO TP-DATA-PRICE(2) MOVE "P03" TO TP-CODE(3) MOVE "UNLIMIT" TO TP-NAME(3) MOVE 20000 TO TP-BASE-FEE(3) MOVE 5 TO TP-UNIT-PRICE(3) MOVE 120000 TO TP-FREE-SEC(3) MOVE 5 TO TP-OVER-PRICE(3) MOVE 20 TO TP-ROAM-PRICE(3) MOVE 3 TO TP-SMS-PRICE(3) MOVE 10 TO TP-DATA-PRICE(3) MOVE "P04" TO TP-CODE(4) MOVE "DATA-ONLY" TO TP-NAME(4) MOVE 5000 TO TP-BASE-FEE(4) MOVE 0 TO TP-UNIT-PRICE(4) MOVE 0 TO TP-FREE-SEC(4) MOVE 0 TO TP-OVER-PRICE(4) MOVE 0 TO TP-ROAM-PRICE(4) MOVE 0 TO TP-SMS-PRICE(4) MOVE 20 TO TP-DATA-PRICE(4) MOVE "P05" TO TP-CODE(5) MOVE "CHEAP" TO TP-NAME(5) MOVE 1000 TO TP-BASE-FEE(5) MOVE 30 TO TP-UNIT-PRICE(5) MOVE 1800 TO TP-FREE-SEC(5) MOVE 30 TO TP-OVER-PRICE(5) MOVE 150 TO TP-ROAM-PRICE(5) MOVE 100 TO TP-SMS-PRICE(5) MOVE 50 TO TP-DATA-PRICE(5) DISPLAY "TARIFF: " WRK-TARIFF-COUNT " plans loaded". PERFORM VARYING WRK-JDX FROM 1 BY 1 UNTIL WRK-JDX > WRK-TARIFF-COUNT DISPLAY " " TP-CODE(WRK-JDX) " " TP-NAME(WRK-JDX) " BASE=" TP-BASE-FEE(WRK-JDX) " UNIT=" TP-UNIT-PRICE(WRK-JDX) " FREE=" TP-FREE-SEC(WRK-JDX) END-PERFORM. EXIT. ** * 0300-LOAD-TEST-DATA: 試験CDRデータロード * 8件のCDRを内部テーブルにセット ** 0300-LOAD-TEST-DATA SECTION. MOVE 8 TO CDR-TEST-COUNT. MOVE "CDR0000001" TO TE-ID(1) MOVE "86138001380" TO TE-CALLER(1) MOVE "86139009990" TO TE-CALLEE(1) MOVE "20250601083000" TO TE-START(1) MOVE 120 TO TE-DURATION(1) MOVE "01" TO TE-TYPE(1) MOVE "N" TO TE-ROAM(1) MOVE "CDR0000002" TO TE-ID(2) MOVE "86138001380" TO TE-CALLER(2) MOVE "86137007770" TO TE-CALLEE(2) MOVE "20250601084500" TO TE-START(2) MOVE 45 TO TE-DURATION(2) MOVE "01" TO TE-TYPE(2) MOVE "N" TO TE-ROAM(2) MOVE "CDR0000003" TO TE-ID(3) MOVE "86138001380" TO TE-CALLER(3) MOVE "86136006660" TO TE-CALLEE(3) MOVE "20250601090000" TO TE-START(3) MOVE 300 TO TE-DURATION(3) MOVE "01" TO TE-TYPE(3) MOVE "N" TO TE-ROAM(3) MOVE "CDR0000004" TO TE-ID(4) MOVE "86139002100" TO TE-CALLER(4) MOVE "86138001380" TO TE-CALLEE(4) MOVE "20250601100000" TO TE-START(4) MOVE 600 TO TE-DURATION(4) MOVE "01" TO TE-TYPE(4) MOVE "N" TO TE-ROAM(4) MOVE "CDR0000005" TO TE-ID(5) MOVE "86139002100" TO TE-CALLER(5) MOVE "86138001380" TO TE-CALLEE(5) MOVE "20250601110000" TO TE-START(5) MOVE 1 TO TE-DURATION(5) MOVE "02" TO TE-TYPE(5) MOVE "N" TO TE-ROAM(5) MOVE "CDR0000006" TO TE-ID(6) MOVE "86137005500" TO TE-CALLER(6) MOVE "86139002100" TO TE-CALLEE(6) MOVE "20250601120000" TO TE-START(6) MOVE 1200 TO TE-DURATION(6) MOVE "01" TO TE-TYPE(6) MOVE "Y" TO TE-ROAM(6) MOVE "CDR0000007" TO TE-ID(7) MOVE "86138001380" TO TE-CALLER(7) MOVE "86136006660" TO TE-CALLEE(7) MOVE "20250601130000" TO TE-START(7) MOVE 900 TO TE-DURATION(7) MOVE "03" TO TE-TYPE(7) MOVE "N" TO TE-ROAM(7) MOVE "CDR0000008" TO TE-ID(8) MOVE "86137005500" TO TE-CALLER(8) MOVE "86135005550" TO TE-CALLEE(8) MOVE "20250601140000" TO TE-START(8) MOVE 1800 TO TE-DURATION(8) MOVE "01" TO TE-TYPE(8) MOVE "N" TO TE-ROAM(8) DISPLAY "CDR-DATA: " CDR-TEST-COUNT " records loaded". EXIT. ** * 0400-PROCESS-CDR: CDR処理制御 * CDR1件に対して: 料金テーブル検索 → 種別別課金 * → ローミング割増 → 課金明細出力 → コミット制御 ** 0400-PROCESS-CDR SECTION. * CDRレコード転送 MOVE TE-ID(WRK-IDX) TO CDR-ID OF CDR-REC. MOVE TE-CALLER(WRK-IDX) TO CDR-CALLER. MOVE TE-CALLEE(WRK-IDX) TO CDR-CALLEE. MOVE TE-START(WRK-IDX) TO CDR-START. MOVE TE-DURATION(WRK-IDX) TO CDR-DURATION. MOVE TE-TYPE(WRK-IDX) TO CDR-CALL-TYPE. MOVE TE-ROAM(WRK-IDX) TO CDR-ROAM-FLAG. ADD 1 TO WRK-REC-COUNT. ADD 1 TO WRK-TOTAL-COUNT. * 料金プラン検索 MOVE 'N' TO CALC-FOUND. MOVE "P01" TO CALC-PLAN-CODE. PERFORM VARYING WRK-JDX FROM 1 BY 1 UNTIL WRK-JDX > WRK-TARIFF-COUNT IF CDR-ID(1:3) = TP-CODE(WRK-JDX)(1:3) MOVE "P01" TO CALC-PLAN-CODE MOVE 'Y' TO CALC-FOUND MOVE WRK-JDX TO CALC-TP-IDX EXIT PERFORM END-IF END-PERFORM. IF NOT CALC-FOUND-YES MOVE 1 TO CALC-TP-IDX END-IF. * 種別別課金処理 MOVE CDR-CALL-TYPE TO CALC-CALL-TYPE. MOVE CDR-ROAM-FLAG TO CALC-ROAM-FLAG. MOVE CDR-DURATION TO CALC-DURATION. EVALUATE CALC-CALL-TYPE WHEN "01" PERFORM 0500-VOICE-CHARGE WHEN "02" PERFORM 0510-SMS-CHARGE WHEN "03" PERFORM 0520-DATA-CHARGE WHEN OTHER MOVE CON-FLAG-ON TO WB-LOOP-FLAG DISPLAY "ERROR: Invalid call type " CALC-CALL-TYPE " for " CDR-ID ADD 1 TO SUM-ERROR-COUNT END-EVALUATE. * 課金明細出力 IF WB-LOOP-FLAG NOT = CON-FLAG-ON PERFORM 0600-WRITE-BILLING END-IF. * コミット制御 IF WRK-REC-COUNT >= CON-COMMIT-MAX DISPLAY "COMMIT: " WRK-REC-COUNT " records" MOVE ZERO TO WRK-REC-COUNT PERFORM 0700-CHECKPOINT END-IF. EXIT. ** * 0500-VOICE-CHARGE: 音声通話課金計算 * 無料通話枠 → 超過分 → 合計 ** 0500-VOICE-CHARGE SECTION. COMPUTE CALC-FREE-MIN = TP-FREE-SEC(CALC-TP-IDX) * 60. IF CALC-DURATION <= CALC-FREE-MIN MOVE ZERO TO CALC-OVER-SEC MOVE ZERO TO CALC-OVER-CHARGE ELSE COMPUTE CALC-OVER-SEC = CALC-DURATION - CALC-FREE-MIN COMPUTE CALC-OVER-CHARGE = CALC-OVER-SEC * TP-OVER-PRICE(CALC-TP-IDX) END-IF. COMPUTE CALC-BASE-CHARGE = CALC-FREE-MIN * TP-UNIT-PRICE(CALC-TP-IDX). IF CDR-ROAM-FLAG = 'Y' COMPUTE CALC-ROAM-CHARGE = CALC-DURATION * TP-ROAM-PRICE(CALC-TP-IDX) ELSE MOVE ZERO TO CALC-ROAM-CHARGE END-IF. COMPUTE CALC-TOTAL-CHARGE = CALC-BASE-CHARGE + CALC-OVER-CHARGE + CALC-ROAM-CHARGE. EXIT. ** * 0510-SMS-CHARGE: SMS課金(件数課金) ** 0510-SMS-CHARGE SECTION. MOVE ZERO TO CALC-FREE-MIN. MOVE ZERO TO CALC-OVER-SEC. MOVE ZERO TO CALC-BASE-CHARGE. MOVE ZERO TO CALC-OVER-CHARGE. MOVE TP-SMS-PRICE(CALC-TP-IDX) TO CALC-ROAM-CHARGE. MOVE CALC-ROAM-CHARGE TO CALC-TOTAL-CHARGE. EXIT. ** * 0520-DATA-CHARGE: データ通信課金(容量課金) ** 0520-DATA-CHARGE SECTION. MOVE ZERO TO CALC-FREE-MIN. COMPUTE CALC-OVER-SEC = CALC-DURATION. COMPUTE CALC-OVER-CHARGE = CALC-DURATION * TP-DATA-PRICE(CALC-TP-IDX) / 1000. MOVE ZERO TO CALC-BASE-CHARGE. MOVE ZERO TO CALC-ROAM-CHARGE. MOVE CALC-OVER-CHARGE TO CALC-TOTAL-CHARGE. EXIT. ** * 0600-WRITE-BILLING: 課金明細出力 * 集計加算 + DISPLAY出力 ** 0600-WRITE-BILLING SECTION. MOVE CDR-ID TO BLL-CALL-ID OF BLL-REC. MOVE CDR-CALLER TO BLL-CUST-ID OF BLL-REC. MOVE CALC-PLAN-CODE TO BLL-PLAN-CODE OF BLL-REC. MOVE CALC-CALL-TYPE TO BLL-CALL-TYPE OF BLL-REC. MOVE CALC-DURATION TO BLL-DURATION OF BLL-REC. MOVE CALC-FREE-MIN TO BLL-FREE-MIN OF BLL-REC. MOVE CALC-OVER-SEC TO BLL-OVER-USAGE OF BLL-REC. MOVE TP-UNIT-PRICE(CALC-TP-IDX) TO BLL-UNIT-PRICE. MOVE CALC-BASE-CHARGE TO BLL-BASE-CHARGE. MOVE CALC-OVER-CHARGE TO BLL-OVER-CHARGE. MOVE CALC-ROAM-CHARGE TO BLL-ROAM-CHARGE. MOVE CALC-TOTAL-CHARGE TO BLL-TOTAL-CHARGE. MOVE "0" TO BLL-STATUS. * 集計加算 ADD CALC-TOTAL-CHARGE TO SUM-CHARGE. ADD CALC-BASE-CHARGE TO SUM-BASE. ADD CALC-OVER-CHARGE TO SUM-OVER. ADD CALC-ROAM-CHARGE TO SUM-ROAM. ADD 1 TO SUM-COUNT. ADD 1 TO WRK-PROC-COUNT. DISPLAY "BILL: " BLL-CALL-ID OF BLL-REC " PLAN:" BLL-PLAN-CODE OF BLL-REC " TYPE:" BLL-CALL-TYPE OF BLL-REC " DUR:" BLL-DURATION OF BLL-REC " FREE:" BLL-FREE-MIN OF BLL-REC " OVER:" BLL-OVER-USAGE OF BLL-REC " BASE:" BLL-BASE-CHARGE OF BLL-REC " OVER-C:" BLL-OVER-CHARGE OF BLL-REC " ROAM:" BLL-ROAM-CHARGE OF BLL-REC " TOTAL:" BLL-TOTAL-CHARGE OF BLL-REC. EXIT. ** * 0700-CHECKPOINT: チェックポイント登録 * 処理中断再開用の状態保存 ** 0700-CHECKPOINT SECTION. DISPLAY "CHKPT: TOTAL=" WRK-TOTAL-COUNT " PROC=" WRK-PROC-COUNT " BATCH=" WRK-LOOP-COUNT DISPLAY "CHKPT-POINT checkpoint registered". EXIT. ** * 0800-SUMMARY: 集計報告出力 ** 0800-SUMMARY SECTION. DISPLAY " " DISPLAY "=== BILLING SUMMARY ===" DISPLAY "TOTAL CDRs: " WRK-TOTAL-COUNT DISPLAY "BILLED CDRs: " SUM-COUNT DISPLAY "ERROR CDRs: " SUM-ERROR-COUNT DISPLAY " " DISPLAY "BASE CHARGE: " SUM-BASE DISPLAY "OVER CHARGE: " SUM-OVER DISPLAY "ROAM CHARGE: " SUM-ROAM DISPLAY "TOTAL CHARGE: " SUM-CHARGE DISPLAY " " DISPLAY "=== NORMAL END ===". EXIT. END PROGRAM TA-TELAMTCAL.