From cf786ee07ae4417227a7d62c9df49aab5bf5819d Mon Sep 17 00:00:00 2001 From: Janusz Dobrowolski Date: Fri, 29 Apr 2011 13:52:59 +0200 Subject: [PATCH] Additional checks on bank transaction entry/delete to avoid overdraft in following transactions. --- admin/db/voiding_db.inc | 8 +++-- gl/bank_transfer.php | 11 ++++++- gl/gl_bank.php | 10 +++++- gl/includes/db/gl_db_bank_trans.inc | 48 ++++++++++++++++++++++++++++- 4 files changed, 72 insertions(+), 5 deletions(-) diff --git a/admin/db/voiding_db.inc b/admin/db/voiding_db.inc index 17d7a8d..832b450 100644 --- a/admin/db/voiding_db.inc +++ b/admin/db/voiding_db.inc @@ -29,17 +29,21 @@ function void_transaction($type, $type_no, $date_, $memo_) void_journal_trans($type, $type_no); break; - case ST_BANKPAYMENT : // it's a payment case ST_BANKDEPOSIT : // it's a deposit case ST_BANKTRANSFER : // it's a transfer + if (!check_void_bank_trans($type, $type_no)) + return false; + case ST_BANKPAYMENT : // it's a payment if (!exists_bank_trans($type, $type_no)) return false; void_bank_trans($type, $type_no); break; + case ST_CUSTPAYMENT : // it's a customer payment + if (!check_void_bank_trans($type, $type_no)) + return false; case ST_SALESINVOICE : // it's a customer invoice case ST_CUSTCREDIT : // it's a customer credit note - case ST_CUSTPAYMENT : // it's a customer payment case ST_CUSTDELIVERY : // it's a customer dispatch if (!exists_customer_trans($type, $type_no)) return false; diff --git a/gl/bank_transfer.php b/gl/bank_transfer.php index 89ba5fc..1f7cbe3 100644 --- a/gl/bank_transfer.php +++ b/gl/bank_transfer.php @@ -132,12 +132,21 @@ function check_valid_entries() $limit = get_bank_account_limit($_POST['FromBankAccount'], $_POST['DatePaid']); - if ($limit != null && ($limit < (input_num('charge') + input_num('amount')))) + $amnt_tr = input_num('charge') + input_num('amount'); + + if ($limit != null && ($limit < $amnt_tr))) { display_error(sprintf(_("The total bank amount exceeds allowed limit (%s) for source account."), price_format($limit))); set_focus('amount'); return false; } + if ($trans = check_bank_account_history(-$amnt_tr, $_POST['FromBankAccount'], $_POST['DatePaid'])) { + + display_error(sprintf(_("The bank transaction would result in exceed of authorized overdraft limit for transaction: %s #%s on %s."), + $systypes_array[$trans['type']], $trans['trans_no'], sql2date($trans['trans_date']))); + set_focus('amount'); + $input_error = 1; + } if (isset($_POST['charge']) && !check_num('charge', 0)) { diff --git a/gl/gl_bank.php b/gl/gl_bank.php index 8ad2aab..eeae098 100644 --- a/gl/gl_bank.php +++ b/gl/gl_bank.php @@ -226,13 +226,21 @@ if (isset($_POST['Process'])) $limit = get_bank_account_limit($_POST['bank_account'], $_POST['date_']); - if ($limit != null && (($limit - $_SESSION['pay_items']->original_amount) < $_SESSION['pay_items']->gl_items_total())) + $amnt_chg = -$_SESSION['pay_items']->gl_items_total()-$_SESSION['pay_items']->original_amount; + + if ($limit != null && ($limit + $amnt_chg < 0)) { display_error(sprintf(_("The total bank amount exceeds allowed limit (%s)."), price_format($limit-$_SESSION['pay_items']->original_amount))); set_focus('code_id'); $input_error = 1; } + if ($trans = check_bank_account_history($amnt_chg, $_POST['bank_account'], $_POST['date_'])) { + display_error(sprintf(_("The bank transaction would result in exceed of authorized overdraft limit for transaction: %s #%s on %s."), + $systypes_array[$trans['type']], $trans['trans_no'], sql2date($trans['trans_date']))); + set_focus('amount'); + $input_error = 1; + } if (!$Refs->is_valid($_POST['ref'])) { display_error( _("You must enter a reference.")); diff --git a/gl/includes/db/gl_db_bank_trans.inc b/gl/includes/db/gl_db_bank_trans.inc index a0aab62..f393d5f 100644 --- a/gl/includes/db/gl_db_bank_trans.inc +++ b/gl/includes/db/gl_db_bank_trans.inc @@ -126,6 +126,7 @@ function get_gl_trans_value($account, $type, $trans_no) function void_bank_trans($type, $type_no, $nested=false) { + if (!$nested) begin_transaction(); @@ -150,4 +151,49 @@ function void_bank_trans($type, $type_no, $nested=false) commit_transaction(); } -?> \ No newline at end of file +/** +* Check account history to find transaction which would exceed authorized overdraft for given account. +* Returns null or transaction in conflict. +* $delta_amount - tested change in bank balance at $date. +**/ +function check_bank_account_history($delta_amount, $bank_account, $date, $user=null) +{ + if ($delta_amount >= 0) + return null; // amount increese is always safe + + $balance = get_bank_account_limit($bank_account, $date, $user); + + if (!isset($balance)) + return null; // unlimited account + + $date = date2sql($date); + $balance+= $delta_amount; + + $sql = "SELECT * FROM ".TB_PREF."bank_trans WHERE bank_act=".db_escape($bank_account)." AND trans_date > '$date' ORDER BY trans_date ASC, id ASC"; + + $history = db_query($sql, "cannot retrieve cash account history"); + + while ($trans = db_fetch($history)) { + $balance += $trans['amount']; + if ($balance < 0) + return $trans; + } + + return null; +} + +/** +* Check bank transfer, deposit or customer deposit before voiding. +**/ +function check_void_bank_trans($type, $type_no) +{ + $moves = get_bank_trans($type, $type_no); + while ($trans = db_fetch($moves)) { + if ($trans['amount'] > 0) { // skip transfer input part + return check_bank_account_history(-$trans['amount'], $trans['bank_act'], sql2date($trans['trans_date'])) == null; + } + } + return true; +} + +?> -- 2.30.2