def invalid_account_exist(trace, acc_number) print("Invalid trace: ", trace) print("Account ", acc_number, " exists!\n") exit end def invalid_account_not_exist(trace, acc_number) print("Invalid trace: ", trace) print("Account ", acc_number, " doesn't exist!\n") exit end def valid_OP(trace, accounts, acc_number, amount, balance) if(amount != 0) then print("Invalid trace: ", trace) print("Account open amount is not 0.00!\n") exit elsif(balance != 0) then print("Invalid trace: ", trace) print("Account balance is not 0.00!\n") exit end end def valid_XO(trace, accounts, acc_number, amount, balance) if(amount != 0) print("Invalid trace: ", trace) print("Account open amount is not 0.00!\n") exit elsif(accounts[acc_number] != balance) print("Invalid trace: ", trace) print("Account balance is not correct!\n") exit end end def valid_nonexist_XO(trace, accounts, acc_number, amount, balance) if(amount != 0) print("Invalid trace: ", trace) print("Account open amount is not 0.00!\n") exit elsif(balance != 0) print("Invalid trace: ", trace) print("Account balance is not 0.00!\n") exit end end def valid_CL(trace, accounts, acc_number, amount, balance) if(balance != 0) print("Invalid trace: ", trace) print("Transction amount is not 0.00!\n") exit elsif(accounts[acc_number] != amount) print("Invalid trace: ", trace) print("Account balance is not correct!\n") exit end end def valid_XC(trace, accounts, acc_number, amount, balance) if(amount != 0) print("Invalid trace: ", trace) print("Transction amount is not 0.00!\n") exit elsif(balance != 0) print("Invalid trace: ", trace) print("Account balance is not 0.00!\n") exit end end def valid_DE(trace, accounts, acc_number, amount, balance) if((accounts[acc_number]+amount) != balance) print("Invalid trace: ", trace) print("Current balance ", (accounts[acc_number].to_f)/100, " + ", "deposit amount ", (amount.to_f)/100, " != new balance ", (balance.to_f)/100, "\n"); exit elsif(amount > 999999) print("Invalid trace: ", trace) print("Deposit amount ", amount, " > 9999.99\n") exit else accounts[acc_number]+amount end end def valid_XD(trace, accounts, acc_number, amount, balance) if(acc_number != '00000000') print("Invalid trace: ", trace) print("Account Number is not 00000000!\n") exit elsif(amount != 0) print("Invalid trace: ", trace) print("Transction amount is not 0.00!\n") exit elsif(balance != 0) print("Invalid trace: ", trace) print("Account balance is not 0.00!\n") exit end end def valid_WI(trace, accounts, acc_number, amount, balance) if(accounts[acc_number] < amount) print("Invalid trace: ", trace) print("Account balance is not enough for withdraw!\n"); exit elsif((accounts[acc_number]-amount) != balance) print("Current balance ", (accounts[acc_number].to_f)/100, " - ", "withdraw amount ", (amount.to_f)/100, " != new balance ", (balance.to_f)/100, "\n"); print("Invalid trace: ", trace) exit else accounts[acc_number]-amount end end def valid_WX(trace, accounts, acc_number, amount, balance) if(amount != 0) print("Invalid trace: ", trace) print("Transction amount is not 0.00!\n") exit elsif(accounts[acc_number] != balance) print("Invalid trace: ", trace) print("Account balance is not correct!\n") exit end end def valid_XW(trace, accounts, acc_number, amount, balance) if(acc_number != '00000000') print("Invalid trace: ", trace) print("Account Number is not 00000000!\n") exit elsif(amount != 0) print("Invalid trace: ", trace) print("Transction amount is not 0.00!\n") exit elsif(balance != 0) print("Invalid trace: ", trace) print("Account balance is not 0.00!\n") exit end end trace = File.open(ARGV[0]) accounts = Hash.new() trace.each do |line| break if(line == "\n") @ATM_file, @Trans, @Acc_number, @Amount, @Balance = line.chomp.split(/,/) atm_file = @ATM_file.strip trans = @Trans.strip acc_number = @Acc_number.strip @Amount = @Amount.strip.split(/\./) @Balance = @Balance.strip.split(/\./) amount = (@Amount[0].to_i * 100) + @Amount[1].to_i balance = (@Balance[0].to_i * 100) + @Balance[1].to_i if (accounts.has_key?(acc_number)) case trans when 'OP' invalid_account_exist(line, acc_number) when 'XO' valid_XO(line, accounts,acc_number,amount,balance) when 'CL' valid_CL(line, accounts,acc_number,amount,balance) accounts.delete(acc_number) when 'XC' invalid_account_exist(line, acc_number) when 'WI' accounts[acc_number] = valid_WI(line, accounts,acc_number,amount,balance) when 'WX' valid_WX(line, accounts,acc_number,amount,balance) when 'XW' invalid_account_exist(line, acc_number) when 'DE' accounts[acc_number] = valid_DE(line, accounts,acc_number,amount,balance) when 'XD' invalid_account_exist(line, acc_number) else print("Invalid transaction ", trans, "\n"); exit end else case trans when 'OP' valid_OP(line, accounts,acc_number,amount,balance) accounts[acc_number] = amount when 'XO' valid_nonexist_XO(line, accounts,acc_number,amount,balance) when 'CL' invalid_account_not_exist(line, acc_number) when 'XC' valid_XC(line, accounts,acc_number,amount,balance) when 'WI' invalid_account_not_exist(line, acc_number) when 'WX' invalid_account_not_exist(line, acc_number) when 'XW' valid_XW(line, accounts,acc_number,amount,balance) when 'DE' invalid_account_not_exist(line, acc_number) when 'XD' valid_XD(line, accounts,acc_number,amount,balance) else print("Invalid transaction ", trans, "\n"); exit end end end print("Valid Trace!\n") trace.close