IDENTIFICATION DIVISION. PROGRAM-ID. TAMAIN. DATA DIVISION. WORKING-STORAGE SECTION. 01 CON-FLAG-ON PIC S9(04) COMP VALUE 1. 01 CON-NORMAL PIC S9(04) COMP VALUE 0. 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-COMMIT-MAX PIC 9(04) COMP VALUE 5. 01 WB-ERROR-FLAG PIC S9(04) COMP. 01 WB-LOOP-FLAG PIC S9(04) COMP. 01 WB-REC-COUNT PIC 9(08) COMP. 01 WRK-IDX PIC 9(02) COMP. 01 WRK-JDX PIC 9(02) COMP. 01 CALC-DURATION PIC 9(09) COMP. 01 CALC-FREE-MIN PIC 9(09) COMP. 01 CALC-OVER-SEC PIC 9(09) COMP. 01 CALC-UNIT-PRICE PIC 9(04) COMP. 01 CALC-BASE-CHARGE PIC 9(09) COMP. 01 CALC-OVER-CHARGE PIC 9(09) COMP. 01 CALC-ROAM-CHARGE PIC 9(09) COMP. 01 CALC-TOTAL-CHARGE PIC 9(09) COMP. 01 CALC-TP-IDX PIC 9(02) COMP. 01 CALC-FOUND PIC X(01). 88 CALC-FOUND-YES VALUE 'Y'. 01 CALC-CALL-TYPE PIC X(02). 01 CALC-ROAM-FLAG PIC X(01). 01 SUM-COUNT PIC 9(09) VALUE 0. 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-ERROR-COUNT PIC 9(09) VALUE 0. 01 CDR-ID PIC X(10). 01 CDR-CALLER PIC X(11). 01 CDR-CALLEE PIC X(11). 01 CDR-START PIC X(14). 01 CDR-DURATION PIC 9(09) COMP. 01 CDR-CALL-TYPE PIC X(02). 01 CDR-ROAM-FLAG PIC X(01). 01 COMMONMEMORY GLOBAL EXTERNAL. 03 CM-TARIFF-TABLE. 05 CM-TP-ENTRY OCCURS 5 TIMES. 10 CTP-CODE PIC X(03). 10 CTP-NAME PIC X(08). 10 CTP-BASE-FEE PIC 9(09) COMP. 10 CTP-UNIT-PRICE PIC 9(04) COMP. 10 CTP-FREE-SEC PIC 9(09) COMP. 10 CTP-OVER-PRICE PIC 9(04) COMP. 10 CTP-ROAM-PRICE PIC 9(04) COMP. 10 CTP-SMS-PRICE PIC 9(04) COMP. 10 CTP-DATA-PRICE PIC 9(04) COMP. 03 CM-TARIFF-COUNT PIC 9(02) COMP. 03 CM-TEST-COUNT PIC 9(02) COMP. 03 CM-TEST-DATA. 05 CMT-ENTRY OCCURS 8 TIMES. 10 CMT-ID PIC X(10). 10 CMT-CALLER PIC X(11). 10 CMT-CALLEE PIC X(11). 10 CMT-START PIC X(14). 10 CMT-DURATION PIC 9(09) COMP. 10 CMT-TYPE PIC X(02). 10 CMT-ROAM PIC X(01). 03 CM-COMMIT-COUNT PIC 9(04) COMP. 03 CM-PROC-COUNT PIC 9(08) COMP. LINKAGE SECTION. 01 LK-STATUS PIC S9(08) COMP. PROCEDURE DIVISION USING LK-STATUS. 0000-MAIN SECTION. MOVE CON-STATUS-OFF TO LK-STATUS 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 MOVE ZERO TO WB-REC-COUNT MOVE CON-FLAG-OFF TO WB-LOOP-FLAG MOVE CON-NORMAL TO WB-ERROR-FLAG DISPLAY "TAMAIN: tariff=" CM-TARIFF-COUNT " cdrs=" CM-TEST-COUNT " processing..." PERFORM VARYING WRK-IDX FROM 1 BY 1 UNTIL WRK-IDX > CM-TEST-COUNT OR WB-LOOP-FLAG = CON-FLAG-ON MOVE CMT-ID(WRK-IDX) TO CDR-ID MOVE CMT-CALLER(WRK-IDX) TO CDR-CALLER MOVE CMT-CALLEE(WRK-IDX) TO CDR-CALLEE MOVE CMT-START(WRK-IDX) TO CDR-START MOVE CMT-DURATION(WRK-IDX) TO CDR-DURATION MOVE CMT-TYPE(WRK-IDX) TO CDR-CALL-TYPE MOVE CMT-ROAM(WRK-IDX) TO CDR-ROAM-FLAG ADD 1 TO WB-REC-COUNT PERFORM 1000-RATE-CALC IF WB-ERROR-FLAG = CON-NORMAL PERFORM 2000-WRITE-BILLING ELSE ADD 1 TO SUM-ERROR-COUNT END-IF IF WB-REC-COUNT >= CM-COMMIT-COUNT DISPLAY "COMMIT: " WB-REC-COUNT " recs" MOVE ZERO TO WB-REC-COUNT END-IF END-PERFORM. DISPLAY "TAMAIN: billed=" SUM-COUNT " errors=" SUM-ERROR-COUNT " total=" SUM-CHARGE GOBACK. 1000-RATE-CALC SECTION. MOVE CDR-CALL-TYPE TO CALC-CALL-TYPE MOVE CDR-ROAM-FLAG TO CALC-ROAM-FLAG MOVE CDR-DURATION TO CALC-DURATION MOVE 'N' TO CALC-FOUND MOVE 1 TO CALC-TP-IDX PERFORM VARYING WRK-JDX FROM 1 BY 1 UNTIL WRK-JDX > CM-TARIFF-COUNT IF CDR-ID(1:3) = CTP-CODE(WRK-JDX)(1:3) MOVE WRK-JDX TO CALC-TP-IDX MOVE 'Y' TO CALC-FOUND EXIT PERFORM END-IF END-PERFORM EVALUATE CALC-CALL-TYPE WHEN "01" COMPUTE CALC-FREE-MIN = CTP-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 * CTP-OVER-PRICE(CALC-TP-IDX) END-IF COMPUTE CALC-BASE-CHARGE = CALC-FREE-MIN * CTP-UNIT-PRICE(CALC-TP-IDX) IF CDR-ROAM-FLAG = 'Y' COMPUTE CALC-ROAM-CHARGE = CALC-DURATION * CTP-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 WHEN "02" 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 CTP-SMS-PRICE(CALC-TP-IDX) TO CALC-ROAM-CHARGE MOVE CALC-ROAM-CHARGE TO CALC-TOTAL-CHARGE WHEN "03" MOVE ZERO TO CALC-FREE-MIN MOVE ZERO TO CALC-BASE-CHARGE MOVE ZERO TO CALC-ROAM-CHARGE COMPUTE CALC-OVER-CHARGE = CALC-DURATION * CTP-DATA-PRICE(CALC-TP-IDX) / 1000 MOVE CALC-OVER-CHARGE TO CALC-TOTAL-CHARGE WHEN OTHER MOVE CON-FLAG-ON TO WB-LOOP-FLAG DISPLAY "ERROR: type=" CALC-CALL-TYPE END-EVALUATE EXIT. 2000-WRITE-BILLING SECTION. 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 CM-PROC-COUNT DISPLAY "BILL: " CDR-ID " TYPE:" CDR-CALL-TYPE " DUR:" CDR-DURATION " TOTAL:" CALC-TOTAL-CHARGE EXIT. END PROGRAM TAMAIN.