+ $balance += $balance_offset;
+ if (floatcmp($balance, -$delta_amount) < 0)
+ return array('amount' => $balance + $delta_amount, 'trans_date'=> date2sql($date));
+
+ $balance += $delta_amount;
+
+ $sql = "SELECT sum(amount) as amount, trans_date, trans_no, type
+ FROM ".TB_PREF."bank_trans
+ WHERE bank_act=".db_escape($bank_account);
+ if ($date)
+ {
+ $date = date2sql($date);
+ $sql .= " AND trans_date > '$date'";
+ }
+ $sql .= " GROUP BY trans_date ORDER BY trans_date ASC";
+
+ $history = db_query($sql, "cannot retrieve cash account history");
+
+ while ($trans = db_fetch($history)) {
+ $balance += $trans['amount'];
+ if (round2($balance, user_price_dec()) < 0)
+ {
+ $trans['amount'] = $balance;
+ 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;
+}
+
+function update_reconcile_date($type, $trans_no, $date=NULL)
+{
+ $sql = "UPDATE ".TB_PREF."bank_trans SET reconciled=".($date ? "'".date2sql($date)."'" : 'NULL')
+ ." WHERE type=" . db_escape($type). " AND trans_no=".db_escape($trans_no);
+
+ db_query($sql, "Can't change reconciliation status");
+}