Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /// THIS IS A COMMENT
- /// PLF QUIZ 3: FILE MAINTENANCE (CHECK BALANCE)
- /// BY: CHRISTIAN BARON NAMQUI
- /// MAINFRAME TRAINEE
- /// AUTHOR'S NOTE: PLEASE OPEN FILE USING NOTEPAD++ AND SET LANGUAGE TO "COBOL" FOR EASIER READING
- /// END COMMENT
- /// THIS IS A COMMENT
- /// ASSUME MASTER-FILE AND TRANSCATION FILE ARE SORTED BY ACCOUNT #
- /// ASSUME ALL ENTRIES IN THE TRANSACTION FILE ARE VALID
- /// NO NEGATIVE VALUES WILL BE ALLOWED IN THE MASTER FILE
- /// ASSUME ALL ACCOUNT NUMBERS ARE GREATER THAN 0
- /// LINES THAT START WITH "//" ARE COMMENTS AND ARE NOT PART OF THE CODE
- /// END COMMENT
- START
- OPEN MASTER-FILE
- CREATE NEW-MASTER-FILE
- CREATE LOG
- OPEN NEW-MASTER-FILE
- OPEN LOG
- OPEN TRANS-FILE
- // DECLARE VARIABLES
- ACCUM-ACCT-BALANCE = 0
- GRAND-TOTAL-BALANCE = 0
- ACCT-NO = 0
- CUST-NAME = ""
- TRANS-AMT = 0
- FLAG-DELETE = FALSE
- M-INDEX = 0
- T-INDEX = 0
- M-ANUM = 0
- T-ANUM = 0
- LOG-LINE-CTR = 0
- LOG-PAGE-CTR = 0
- REMARK = ""
- DEPOSITS = 0
- CHECKS = 0
- CHECK-CHG = 0
- BAD-CHECKS = 0
- BAD-CHECK-CHG = 0
- NO-DEPOSITS = 0
- NO-CHECKS = 0
- NO-BAD-CHECKS = 0
- NO-OPEN-ACCTS = 0
- NO-CLOSED-ACCTS = 0
- WRITTEN = 0
- CREATED-ACCT-NO = 0
- CREATED-ACCUM-BAL = 0
- CREATED-ACCT-NAME = ""
- // END VARIABLE DECLARATION
- PERFORM PRINT-LOG-HEADERS
- // START MAIN LOOP
- // LOOP ENDS WHEN BOTH FILES REACH THEIR END
- DO WHILE !EOF(MASTER-FILE) || !EOF(TRANS-FILE)
- // RESET DEFAULT VALUES
- ACCT-NO = 0
- CUST-NAME = ""
- TRANS-AMT = 0
- REMARK = ""
- // INITIALIZE FIRST READING
- IF M-INDEX == 0 && T-INDEX == 0
- READ MASTER-FILE
- READ TRANS-FILE
- M-INDEX = 1
- T-INDEX = 1
- M-ANUM = MASTER-FILE[M-INDEX](ACCOUNT NUMBER)
- T-ANUM =TRANS-FILE[T-INDEX](ACCOUNT NUMBER)
- ENDIF
- // SEPARATE LOOP USING CASE BLOCKS. I WON'T BE USING THE "CASE" NOTATION, JUST THE USUAL IF ELSE IF
- // LOGGING OCCURS FOR EVERY TRASACNTION. NOTE: INVALID TRANSACTIONS ARE NOT LOGGED
- // WITH THE EXCEPTION OF OVERDRAWN CHECKS SINCE THEY ARE CHRAGED 3$ FOR EACH OCCURENCE
- // CASE WHEN M-ANUM > T-ANUM
- // THIS MEANS ONLY A TRANSACTION CODE OF '2' IS VALID
- // HOWEVER A SPECIAL CASE MAY BE CONSIDERED WHEN A NEW ACCOUNT IS CREATED AND IS UPDATED IN THE NEXT ITERATION
- // TO TAKE THIS INTO ACCOUNT WE STORE THAT DATA INTO TEMPORARY FIELDS AND
- // DEFER WRITING THEM TO THE MASTER FILE
- // THUS WE DISCARD ALL OTHER TRANSACTIONS OF ANY OTHER TYPE
- IF M-ANUM > T-ANUM
- ACCT-NO = T-ANUM
- CUST-NAME = TRANS-FILE[T-INDEX](CUSTOMER NAME)
- TRANS-AMT = TRANS-FILE[T-INDEX](TRANSACTION AMOUNT)
- IF T-ANUM > CREATED-ACCT-NO
- // FIRST CHECK FOR ANY DEFERRED WRITING INTO THE NEW MASTER FILE FROM CREATED ACCOUNTS
- // THE TRANSACTIONS PERTAINING TO THIS ACCOUNT WERE ALREADY LOGGED SO NO NEED TO LOG
- IF CREATED-ACCT-NAME IS NOT EMPTY
- GRAND-TOTAL-BALANCE = GRAND-TOTAL-BALANCE + ACCUM-ACCT-BALANCE
- WRITE-TO(NEW-MASTER-FILE) CREATED-ACCT-NO " " CREATED-ACCT-NAME " " CREATED-ACCUM-ACCT-BAL
- ENDIF
- IF TRANS-FILE[T-INDEX](TRANSACTION CODE) == 2
- ACCUM-ACCT-BALANCE = TRANS-AMT
- CREATED-ACCT-NO = ACCT-NO
- CREATED-ACCUM-BAL = TRANS-AMT
- CREATED-ACCT-NAME = CUST-NAME
- WRITTEN = WRITTEN + 1
- REMARK = "NEW ACCOUNT " ACCT-NO " CREATED"
- NO-OPEN-ACCTS = NO-OPEN-ACCTS + 1
- ENDIF
- ELSE
- IF TRANS-FILE[T-INDEX](TRANSACTION CODE) == 0
- CREATED-ACCUM-ACCT-BAL = CREATED-ACCUM-ACCT-BAL + TRANS-AMT
- DEPOSIT = DEPOSIT + TRANS-AMT
- NO-DEPOSITS = NO-DEPOSITS + 1
- REMARK = "DEPOSIT SUCCESSFUL"
- ELSE IF TRANS-FILE[T-INDEX](TRANSACTION CODE) == 1
- // IF THE CHECK IS VALID WE CHARGE THEM 1$ AND DEDUCT THE WITHRAWN AMOUNT FROM THE ACCUMULATED BALANCE
- // IF ITS NOT VALID, MEANING THE AMOUNT WITHRAWN EXCEEDS THE CURRENT BALANCE WE DEDUCT 3$ AND WE DON'T PROCESS THE TRANSACTION
- // IF THE CURRENT BALANCE IS LESS THAN 3$ WE ZERO IT OUT AND ENTER IT TO THE LOG
- IF ACCUM-ACCT-BALANCE > = TRANS-AMT + 1
- CREATED-ACCUM-BAL = CREATED-ACCUM-BAL - (TRANS-AMT + 1)
- REMARK = "CHECK PROCESSING SUCCESSFUL"
- CHECK = CHECK + TRANS-AMT
- CHECK-CHG = CHECK-CHG + 1
- NO-CHECKS = NO-CHECKS + 1
- ELSE IF ACCUM-ACCT-BALANCE > = 3 && ACCUM-ACCT-BALANCE < TRANS-AMT + 1
- CREATED-ACCUM-BAL = CREATED-ACCUM-BAL - 3
- BAD-CHECKS = BAD-CHECKS + TRANS-AMT
- BAD-CHECK-CHG = BAD-CHECK-CHG + 3
- NO-BAD-CHECKS = NO-BAD-CHECKS + 1
- REMARK = "INSUFFICIENT FUNDS CHECK. PENALTY OF 3$ HAS BEEN CHARGED"
- ELSE
- BAD-CHECK-CHG = BAD-CHECK-CHG + CREATED-ACCUM-BAL
- CREATED-ACCUM-BAL = 0
- BAD-CHECKS = BAD-CHECKS + TRANS-AMT
- NO-BAD-CHECKS = NO-BAD-CHECKS + 1
- REMARK = "INSUFFICIENT FUNDS FOR CHECK. PENALTY OF 3$ CANNOT BE CHARGED ACCOUNT ZEROED OUT"
- ENDIF
- ELSE IF TRANS-FILE[T-INDEX](TRANSACTION CODE) == 3
- FLAG-DELETE = TRUE
- NO-CLOSED-ACCTS = NO-CLOSED-ACCTS + 1
- REMARK = "ACCOUNT WITH ACCOUNT NUMBER: " ACCT-NO " HAS BEEN CLOSED"
- CREATED-ACCT-NAME = ""
- CREATED-ACCT-NO = 0
- CREATED-ACCT-BAL = 0
- ENDIF
- ENDIF
- ACCUM-ACCT-BALANCE = CREATED-ACCUM-ACCT-BAL
- PERFORM WRITE-TO-LOG
- PERFORM INC-T-ANUM
- // CASE WHEN M-ANUM < T-ANUM
- // THIS MEANS THERE ARE NO MORE TRANSACTIONS FOR THE CURRENT ACCOUNT NUMBER
- ELSE IF M-ANUM < T-ANUM
- // FIRST CHECK FOR ANY DEFERRED WRITING INTO THE NEW MASTER FILE FROM CREATED ACCOUNTS
- // THE TRANSACTIONS PERTAINING TO THIS ACCOUN WERE ALREADY LOGGED SO NO NEED TO LOG
- IF CREATED-ACCT-NAME IS NOT EMPTY
- GRAND-TOTAL-BALANCE = GRAND-TOTAL-BALANCE + ACCUM-ACCT-BALANCE
- WRITE-TO(NEW-MASTER-FILE) CREATED-ACCT-NO " " CREATED-ACCT-NAME " " CREATED-ACCUM-ACCT-BAL
- ENDIF
- // NEXT CHECK IF THERES AN ACCUMULATED VALUE FROM PREVIOUS TRANSACTIONS
- // TO BE WRITTEN INTO THE MASTER FILE
- IF ACCUM-ACCT-BALANCE == 0
- // IF THE DELETE FLAG IS TRUE THEN WE CONTINUE WITH THE LOOP
- // WITHOUT WRITING TO THE MASTER FILE
- IF FLAG-DELETE
- ACCUM-ACCT-BALANCE = 0
- FLAG-DELETE = FALSE
- CYCLE
- ELSE
- ACCT-NO = M-ANUM
- CUST-NAME = MASTER-FILE[M-INDEX](ACCOUNT NAME)
- WRITE-TO(NEW-MASTER-FILE) ACCT-NO " " CUST-NAME " " ACCUM-ACCT-BALANCE
- WRITTEN = WRITTEN + 1
- ACCUM-ACCT-BALANCE = 0
- GRAND-TOTAL-BALANCE = GRAND-TOTAL-BALANCE + ACCUM-ACCT-BALANCE
- // NO LOGS ARE NEEDED FOR THIS SECTION SINCE NO TRANSACTION WAS MADE HERE
- // THIS IS JUST WHERE WE PRINT THE ACCUMULATED VALUES
- ENDIF
- PERFORM INC-M-ANUM
- // IF THERE ARE NO PREVIOUS VALUES THEN JUST PRINT OUT THE CURRENT LINE
- ELSE
- ACCT-NO = M-ANUM
- CUST-NAME = MASTER-FILE[M-INDEX](ACCOUNT NAME)
- TRANS-AMT = MASTER-FILE[M-INDEX](PRESENT BALANCE)
- ACCUM-ACCT-BALANCE = TRANS-AMT
- WRITE-TO(NEW-MASTER-FILE) ACCT-NO " " CUST-NAME " " ACCUM-ACCT-BALANCE
- WRITTEN = WRITTEN + 1
- GRAND-TOTAL-BALANCE = GRAND-TOTAL-BALANCE + ACCUM-ACCT-BALANCE
- PERFORM INC-M-ANUM
- // CASE WHEN M-ANUM = T-ANUM
- // THIS MEANS A TRANSACTION CODE OF '2' IS INVALID
- // THUS WE DISCARD ALL OTHER TRANSACTIONS OF THIS TYPE
- ELSE
- // FIRST CHECK FOR ANY DEFERRED WRITING INTO THE NEW MASTER FILE FROM CREATED ACCOUNTS
- // THE TRANSACTIONS PERTAINING TO THIS ACCOUN WERE ALREADY LOGGED SO NO NEED TO LOG
- IF CREATED-ACCT-NAME IS NOT EMPTY
- GRAND-TOTAL-BALANCE = GRAND-TOTAL-BALANCE + ACCUM-ACCT-BALANCE
- WRITE-TO(NEW-MASTER-FILE) CREATED-ACCT-NO " " CREATED-ACCT-NAME " " CREATED-ACCUM-ACCT-BAL
- ENDIF
- // IF THE ACCUM-ACCT-BALANCE IS EMPTY, THIS MEANS THERE WAS NO TRANSACTION BEFORE THIS ITERATION
- // THUS WE SET ITS STARTING VALUE AT THE CURRENT BALANCE
- IF ACCUM-ACCT-BALANCE == 0
- ACCUM-ACCT-BALANCE = MASTER-FILE[M-INDEX](CURRENT BALANCE)
- ENDIF
- ACCT-NO = M-ANUM
- CUST-NAME = MASTER-FILE[M-INDEX](ACCOUNT NAME)
- TRANS-AMT = TRANS-FILE[T-INDEX](TRANSACTION AMOUNT)
- IF TRANS-FILE[T-INDEX](TRANSACTION CODE) == 0
- ACCUM-ACCT-BALANCE = ACCUM-ACCT-BALANCE + TRANS-AMT
- DEPOSIT = DEPOSIT + TRANS-AMT
- NO-DEPOSITS = NO-DEPOSITS + 1
- REMARK = "DEPOSIT SUCCESSFUL"
- ELSE IF TRANS-FILE[T-INDEX](TRANSACTION CODE) == 1
- // IF THE CHECK IS VALID WE CHARGE THEM 1$ AND DEDUCT THE WITHRAWN AMOUNT FROM THE ACCUMULATED BALANCE
- // IF ITS NOT VALID, MEANING THE AMOUNT WITHRAWN EXCEEDS THE CURRENT BALANCE WE DEDUCT 3$ AND WE DON'T PROCESS THE TRANSACTION
- // IF THE CURRENT BALANCE IS LESS THAN 3$ WE ZERO IT OUT AND ENTER IT TO THE LOG
- IF ACCUM-ACCT-BALANCE > = TRANS-AMT + 1
- ACCUM-ACCT-BALANCE = ACCUM-ACCT-BALANCE - (TRANS-AMT + 1)
- REMARK = "CHECK PROCESSING SUCCESSFUL"
- CHECK = CHECK + TRANS-AMT
- CHECK-CHG = CHECK-CHG + 1
- NO-CHECKS = NO-CHECKS + 1
- ELSE IF ACCUM-ACCT-BALANCE > = 3 && ACCUM-ACCT-BALANCE < TRANS-AMT + 1
- ACCUM-ACCT-BALANCE = ACCUM-ACCT-BALANCE - 3
- BAD-CHECKS = BAD-CHECKS + TRANS-AMT
- BAD-CHECK-CHG = BAD-CHECK-CHG + 3
- NO-BAD-CHECKS = NO-BAD-CHECKS + 1
- REMARK = "INSUFFICIENT FUNDS FOR CHECK. PENALTY OF 3$ HAS BEEN CHARGED"
- ELSE
- BAD-CHECK-CHG = BAD-CHECK-CHG + ACCUM-ACCT-BALANCE
- ACCUM-ACCT-BALANCE = 0
- BAD-CHECKS = BAD-CHECKS + TRANS-AMT
- NO-BAD-CHECKS = NO-BAD-CHECKS + 1
- REMARK = "INSUFFICIENT FUNDS FOR CHECK. PENALTY OF 3$ CANNOT BE CHARGED. ONLY " ACCUM-ACCT-BALANCE "$ WAS CHARGED"
- ENDIF
- ELSE IF TRANS-FILE[T-INDEX](TRANSACTION CODE) == 3
- FLAG-DELETE = TRUE
- NO-CLOSED-ACCTS = NO-CLOSED-ACCTS + 1
- REMARK = "ACCOUNT WITH ACCOUNT NUMBER: " ACCT-NO " HAS BEEN CLOSED"
- ENDIF
- // LOG EACH TRANSACTION HERE. REMARKS ARE GENERATED AT EACH OF THE TRANSACTION CASE BLOCKS
- PERFORM WRITE-TO-LOG
- ENDIF
- // ONLY READ NEXT VALUE FROM TRANSACTION FILE
- // IN THE NEXT ITERATION SINCE T-ANUM AND M-ANUM WERE EQUAL IN THIS ITERATION
- // THE ONLY POSSIBLE CASES FOR THE NEXT ITERATION ARE T-ANUM > M-ANUM OR T-ANUM == M-ANUM
- // IN T-ANUM > M-ANUM IT WILL CHECK IF PREV-ACCT-NO IS EMPTY, IF IT ISN'T IT PRINTS THAT OUT
- PERFORM INC-T-ANUM
- ENDIF
- ENDDO
- // PRINT GRAND TOTALS
- LOG-LINE-CTR = TRANS-LOG-LINE-CTR + 1
- IF TRANS-LOG-LINE-CTR > 56
- PERFORM PRINT-TRANS-LOG-HEADERS
- TRANS-LOG-LINE-CTR = 1
- ENDIF
- WRITE-TO(LOG) "GRAND-TOTAL: " GRAND-TOTAL-BALANCE
- // PRINT STATISTICS
- LOG-LINE-CTR = TRANS-LOG-LINE-CTR + 1
- IF TRANS-LOG-LINE-CTR > 40
- PERFORM PRINT-TRANS-LOG-HEADERS
- TRANS-LOG-LINE-CTR = 1
- ENDIF
- WRITE-TO(LOG) "Total amount of deposits collected : " DEPOSITS
- WRITE-TO(LOG) "Total amount of processed checks : " CHECKS
- WRITE-TO(LOG) "Total check processing charges collected : " CHECK-CHG
- WRITE-TO(LOG) "Total amount of bad checks : 99999.99" BAD-CHECKS
- WRITE-TO(LOG) "Total amount of bad check charges : " BAD-CHECK-CHG
- WRITE-TO(LOG) NEW LINE
- WRITE-TO(LOG) "Run Statistics: "
- WRITE-TO(LOG) "Total number of deposits made : " NO-DEPOSITS
- WRITE-TO(LOG) "Total number of checks processed : " NO-CHECKS
- WRITE-TO(LOG) "Total number of overdrawn checks : " NO-BAD-CHECKS
- WRITE-TO(LOG) "Total number new accounts opened : " NO-OPEN-ACCTS
- WRITE-TO(LOG) "Total number of accounts closed : " NO-CLOSED-ACCTS
- WRITE-TO(LOG) NEW LINE
- WRITE-TO(LOG) " transaction records read : " T-INDEX
- WRITE-TO(LOG) "Total masterfile records read : " M-INDEX
- WRITE-TO(LOG) "Total masterfile records written : " WRITTEN
- SAVE NEW-MASTER-FILE AS MASTER-FILE
- CLOSE MASTER-FILE
- CLOSE NEW-MASTER-FILE
- CLOSE TRANS-FILE
- END
- INC-T-ANUM.
- IF (!EOF(TRANS-FILE))
- READ TRANS-FILE
- IF (EOF(TRANS-FILE))
- T-ANUM = 100000000
- ELSE
- T-INDEX = T-INDEX + 1
- T-ANUM =TRANS-FILE[T-INDEX](ACCOUNT NUMBER)
- ENDIF
- INC-T-ANUM END.
- INC-M-ANUM.
- IF (!EOF(MASTER-FILE))
- READ MASTER-FILE
- IF (EOF(MASTER-FILE))
- M-ANUM = 100000000
- ELSE
- M-INDEX = M-INDEX + 1
- M-ANUM = MASTER-FILE[M-INDEX](ACCOUNT NUMBER)
- ENDIF
- INC-M-ANUM END.
- PRINT-LOG-HEADERS.
- LOG-PAGE-CTR = LOG-PAGE-CTR + 1
- WRITE-TO(LOG) " XYZ Banking Corporation Page: " LOG-PAGE-CTR
- WRITE-TO(LOG) NEW LINE
- WRITE-TO(LOG) "Account Balancing Run Report"
- WRITE-TO(LOG) NEW LINE
- WRITE-TO(LOG) "Acct Acct Updated Trans Remarks"
- WRITE-TO(LOG) "Number Name Balance Code"
- LOG-LINE-CTR = TRANS-LOG-LINE-CTR + 7
- PRINT-LOG-HEADERS END.
- WRITE-TO-LOG
- LOG-LINE-CTR = TRANS-LOG-LINE-CTR + 1
- IF TRANS-LOG-LINE-CTR > 56
- PERFORM PRINT-TRANS-LOG-HEADERS
- TRANS-LOG-LINE-CTR = 1
- ENDIF
- WRITE-TO(LOG) ACCT-NO " " CUST-NAME " " ACCUM-ACCT-BALANCE " " TRANS-FILE[T-INDEX](TRANSACTION CODE) " " REMARK
- WRITE-TO-LOG END.
Add Comment
Please, Sign In to add comment