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;
$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))
{
$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."));
function void_bank_trans($type, $type_no, $nested=false)
{
+
if (!$nested)
begin_transaction();
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;
+}
+
+?>