/************************************************** Component: Transaction Module: Transfer **************************************************/ /* include statements */ #include #include #include #include #include "constants.h" #include "database.h" #include "screen_output.h" #include "getch.h" #include "transfer.h" #define DEBUG_TRANS 0 /* functions */ int tr_TransferFunds(char *cardNumber) { int exit_condition = 0; char ch; int i; int transfer_amount_100x = 0; double transfer_amount = 0.0; int sink_account; char temp[2] = " "; int number_of_accounts; char accountType[MAX_ACCOUNTS+1][MAX_ACCOUNT_TYPE_LENGTH+1]; char accountNumber[MAX_ACCOUNTS+1][MAX_ACCOUNT_NUMBER_LENGTH+1]; char msg[MESSAGE_BUFFER_LENGTH]; char source_account_number[MAX_ACCOUNT_NUMBER_LENGTH+1]; char sink_account_number[MAX_ACCOUNT_NUMBER_LENGTH+1]; // for receipts double availableBalanceR; double totalBalanceR; db_GetNumAccounts(cardNumber, &number_of_accounts); if (number_of_accounts <= 0) { io_DrawTopLine(); printf ("No accounts attached to this card\n"); printf ("Press any key to continue...\n"); io_DrawBottomLine(); getch(); return 1; } else if (number_of_accounts > MAX_ACCOUNTS) { number_of_accounts = MAX_ACCOUNTS; } for (i=0;i= 1 && atoi(temp) <= number_of_accounts) { strcpy(source_account_number, accountNumber[atoi(temp)-1]); do { io_DrawTopLine(); printf ("Select Account to Transfer to:\n\n"); for (i=0;i= 1 && atoi(temp) <= number_of_accounts) { sink_account = atoi(temp); strcpy(sink_account_number, accountNumber[atoi(temp)-1]); transfer_amount_100x = tr_GetTransferAmount(cardNumber, source_account_number); if (transfer_amount_100x == -1) { // user cancelled operation exit_condition = 1; } transfer_amount = (double)transfer_amount_100x / 100; if (transfer_amount > 0) { // HANDLE THE TRANSFER switch(db_WithdrawMoney(cardNumber, source_account_number, transfer_amount)) { case 0: break; default: printf("Error withdrawing - aborting transaction.\n"); } db_DepositCash(cardNumber, sink_account_number, transfer_amount); // PRINT RECEIPT io_DrawTopLine(); printf ("Transfer Receipt:\n"); printf ("Transferred $%10.2lf\n", transfer_amount); printf ("From account: %s\n", source_account_number); printf ("To account: %s\n", sink_account_number); db_GetAccountBalance(cardNumber, source_account_number, &availableBalanceR, &totalBalanceR); printf ("Ending Balances for account: %s\n", source_account_number); printf ("Total Balance: $%10.2lf\n", totalBalanceR); printf ("Available Balance: $%10.2lf\n", availableBalanceR); db_GetAccountBalance(cardNumber, sink_account_number, &availableBalanceR, &totalBalanceR); printf ("Ending Balances for account: %s\n", sink_account_number); printf ("Total Balance: $%10.2lf\n", totalBalanceR); printf ("Available Balance: $%10.2lf\n", availableBalanceR); io_DrawBottomLine(); printf ("Press any key to continue...\n"); getch(); exit_condition = 1; // END RECEIPT } } } else if (ch == 'c') exit_condition = 1; } while (exit_condition != 1); } } else if (ch == 'c') exit_condition = 1; } while (exit_condition != 1); return 0; } long int tr_GetTransferAmount(char *cardNumber, char *source_account_number) { int exit_condition = 0; int T_position = 0; int warn_no_zero_T = 0; int warn_balance_too_low = 0; int correct_value_entered = 0; char account_T[MDD+1]; // amount to deposit into the account char ch; char print1[MDD+1], print2[3]; // hold the split up dollar value int i,j; double availableBalance; double totalBalance; account_T[T_position] = '\0'; do { io_DrawTopLine(); printf ("Enter amount you want to transfer:\n\n"); printf ("e - enter\n"); printf ("b - backspace\n"); printf ("c - cancel\n"); if (warn_no_zero_T == 1) { printf ("Cannot complete. Your transfer amount must be > 0\n"); warn_no_zero_T = 0; } if (warn_balance_too_low ==1) { printf ("Source account has inadequate funds.\n"); warn_balance_too_low = 0; } io_DrawMidLine(); /* Split up string "ab" into two strings "a" and "b" b is of length 2, a is variable. Display as cash. */ j = 0; for (i=0;i<=(int)strlen(account_T);i++) { if ((int)strlen(account_T)-i > 2) print1[i] = account_T[i]; else { print1[i] = '\0'; print2[j] = account_T[i]; j++; } } //print2[j-1] = '\0'; printf ("$%10s.%2s\n", print1, print2); io_DrawBottomLine(); ch = getch(); if (isdigit(ch)) { account_T[T_position] = ch; T_position++; } else if (ch == 'c') { exit_condition = 1; } else if (ch == 'e') { if(db_GetAccountBalance(cardNumber, source_account_number, &availableBalance, &totalBalance)!=0) { io_DrawTopLine(); printf ("Error retrieving account Balance\n"); printf ("Press any key to continue...\n"); io_DrawBottomLine(); getch(); return -1; } if (DEBUG_TRANS == 1) { printf ("transfer desired:[%lf], available balance:[%lf]\n",(double)atoi(account_T), availableBalance*100); printf ("Press any key to continue..."); getch(); } if (atoi(account_T) <= 0) { // do not allow 0 transfers T_position = 0; warn_no_zero_T = 1; } else if ((double)atoi(account_T) > availableBalance*100) { T_position = 0; warn_balance_too_low = 1; } else { /* withdraw allowed */ correct_value_entered = 1; exit_condition = 1; } } else if (ch == 'b') { if (T_position >= 1) { T_position--; } } if (T_position > MDD) { T_position = MDD; } account_T[T_position] = '\0'; } while (exit_condition != 1); if (correct_value_entered == 1) { return atoi(account_T); } else { return -1; } }