function void_transaction($type, $type_no, $date_, $memo_)
{
+ global $Refs;
$void_entry = get_voided_entry($type, $type_no);
if ($void_entry != null)
// only add an entry if it's actually been voided
add_audit_trail($type, $type_no, $date_, _("Voided.")."\n".$memo_);
add_voided_entry($type, $type_no, $date_, $memo_);
+ $Refs->restore_last($type, $type_no);
return true;
}
function find_reference($type, $reference)
{
- $sql = "SELECT id FROM ".TB_PREF."refs WHERE type=".db_escape($type)
- ." AND reference=".db_escape($reference);
+ // ignore refs references for voided transactions
+ $sql = "SELECT r.id FROM ".TB_PREF."refs r LEFT JOIN ".TB_PREF."voided v ON"
+ ." r.type=v.type AND r.id=v.id"
+ ." WHERE r.type=".db_escape($type)
+ ." AND reference=".db_escape($reference)
+ ." AND ISNULL(`memo_`)";
$result = db_query($sql, "could not query reference table");
if ($reference != 'auto')
$this->save_last($reference, $type);
}
-
+ // check if reference is used for any non voided transaction (used for ST_JOURNALENTRY type)
function exists($type, $reference)
{
return (find_reference($type, $reference) != null);
{
return get_next_reference($type);
}
+ //
+ // Restore previous reference if voided trans ref was the last one.
+ //
+ function restore_last($type, $id)
+ {
+ $reference = $this->get($type, $id);
+ $last = $this->increment($this->get_next($type), true); //decrement
+ if ($reference==$last) {
+ save_next_reference($type, $last);
+ }
+ }
//------------------------------------
{
return strlen(trim($reference)) > 0;
}
-
- function increment($reference)
+ //
+ // Increments (or decrements if $back==true) reference template
+ //
+ function increment($reference, $back=false)
{
// New method done by Pete. So f.i. WA036 will increment to WA037 and so on.
// If $reference contains at least one group of digits,
list($all, $prefix, $number, $postfix) = $result;
$dig_count = strlen($number); // How many digits? eg. 0003 = 4
$fmt = '%0' . $dig_count . 'd'; // Make a format string - leading zeroes
- $nextval = sprintf($fmt, intval($number + 1)); // Add one on, and put prefix back on
+ $val = intval($number + ($back ? ($number<1 ? 0 : -1) : 1));
+ $nextval = sprintf($fmt, $val); // Add one on, and put prefix back on
return $prefix.$nextval.$postfix;
}
else
return $reference;
}
-
//------------------------------------
}