Reference recover afer voiding of last transaction in sequence.
authorJanusz Dobrowolski <janusz@frontaccounting.eu>
Fri, 30 Apr 2010 13:08:38 +0000 (13:08 +0000)
committerJanusz Dobrowolski <janusz@frontaccounting.eu>
Fri, 30 Apr 2010 13:08:38 +0000 (13:08 +0000)
admin/db/voiding_db.inc
includes/db/references_db.inc
includes/references.inc

index 55a7308f8565640c387d806af670ba5ea30cea40..6bda4029584ec4eb5512211a5c018f7d0e0e1434 100644 (file)
@@ -16,6 +16,7 @@ include_once($path_to_root . "/manufacturing/includes/manufacturing_db.inc");
 
 function void_transaction($type, $type_no, $date_, $memo_)
 {
+       global $Refs;
        $void_entry = get_voided_entry($type, $type_no);
 
        if ($void_entry != null)
@@ -108,6 +109,7 @@ function void_transaction($type, $type_no, $date_, $memo_)
        // 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;
 }
 
index e5212c656f4c8b3573749efa0f6f8edf4b361f8c..71314463339be1294347e99fa546e718c371e5e4 100644 (file)
@@ -53,8 +53,12 @@ function delete_reference($type, $id)
 
 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");
 
index 420e960e805d0169280c8d8dafd73dcd25656398..671db9346e2a3b4267a71041ed958d798863a301 100644 (file)
@@ -37,7 +37,7 @@ class references
                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);
@@ -53,6 +53,17 @@ class references
        {
                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);
+               }
+       }
        
        //------------------------------------
 
@@ -60,8 +71,10 @@ class references
        {
                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,
@@ -74,14 +87,14 @@ class references
                        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;
        }
-       
        //------------------------------------
 }