+ update_reference($type, $id, $reference); // store in refs table
+ if ($reference == $this->get_next($type)) { // if reference was bigger or not changed from default
+ $next = $this->_increment($reference); // increment default
+ save_next_reference($type, $next);
+ }
+ }
+ //
+ // Restore previous reference (if possible) after voiding transaction.
+ //
+ function restore_last($type, $id)
+ {
+ $reference = get_reference($type, $id);
+ $prev = $this->_increment($this->get_next($type), true); //decrement
+ if ($reference==$prev) {
+ save_next_reference($type, $prev);
+ }
+ }
+ //-----------------------------------------------------------------------
+ //
+ // 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,
+ // extract first didgits group and add 1, then put all together.
+ // NB. preg_match returns 1 if the regex matches completely
+ // also $result[0] holds entire string, 1 the first captured, 2 the 2nd etc.
+ //
+ if (preg_match('/^(\D*?)(\d+)(.*)/', $reference, $result) == 1)
+ {
+ 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
+ $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;
+ }