1<?php 2/********************************************************************** 3 Copyright (C) FrontAccounting, LLC. 4 Released under the terms of the GNU General Public License, GPL, 5 as published by the Free Software Foundation, either version 3 6 of the License, or (at your option) any later version. 7 This program is distributed in the hope that it will be useful, 8 but WITHOUT ANY WARRANTY; without even the implied warranty of 9 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 10 See the License here <http://www.gnu.org/licenses/gpl-3.0.html>. 11***********************************************************************/ 12include_once($path_to_root . "/includes/db/references_db.inc"); 13//--------------------------------------------------------------------------------------------- 14// 15// For now (2.3) the references system has somewhat inconsistent design scheme. 16// Most transactions store references in respective table, but this is not the case 17// for journal entries. All references regardless of type are stored also in refs table. 18// Reference uniquness now can be checked with is_new_reference() for all transactions. 19// In near future this should be fixed either with removing reference fields 20// in transaction tables, or adding ref in bank transaction/journal and removing refs table. 21// 22 23class references 24{ 25 // 26 // Get reference from refs table for given transaction. 27 // Used for transactions which do not hold references (journal and bank). 28 // 29 function get($type, $id) 30 { 31 return get_reference($type, $id); 32 } 33 // 34 // Check if reference is used for any non voided transaction (used for ST_JOURNALENTRY type) 35 // 36 function exists($type, $reference) 37 { 38 return (find_reference($type, $reference) != null); 39 } 40 // 41 // Get default reference on new transaction creation. 42 // 43 function get_next($type) 44 { 45 return get_next_reference($type); 46 } 47 // 48 // Check reference is valid before add/update transaction. 49 // 50 function is_valid($reference) 51 { 52 return strlen(trim($reference)) > 0; 53 } 54 // 55 // Save reference (and prepare next) on write transaction. 56 // 57 function save($type, $id, $reference) 58 { 59 update_reference($type, $id, $reference); // store in refs table 60 if ($reference == $this->get_next($type)) { // if reference was bigger or not changed from default 61 $next = $this->_increment($reference); // increment default 62 save_next_reference($type, $next); 63 } 64 } 65 // 66 // Restore previous reference (if possible) after voiding transaction. 67 // 68 function restore_last($type, $id) 69 { 70 $reference = get_reference($type, $id); 71 $prev = $this->_increment($this->get_next($type), true); //decrement 72 if ($reference==$prev) { 73 save_next_reference($type, $prev); 74 } 75 } 76 //----------------------------------------------------------------------- 77 // 78 // Increments (or decrements if $back==true) reference template 79 // 80 function _increment($reference, $back=false) 81 { 82 // New method done by Pete. So f.i. WA036 will increment to WA037 and so on. 83 // If $reference contains at least one group of digits, 84 // extract first didgits group and add 1, then put all together. 85 // NB. preg_match returns 1 if the regex matches completely 86 // also $result[0] holds entire string, 1 the first captured, 2 the 2nd etc. 87 // 88 if (preg_match('/^(\D*?)(\d+)(.*)/', $reference, $result) == 1) 89 { 90 list($all, $prefix, $number, $postfix) = $result; 91 $dig_count = strlen($number); // How many digits? eg. 0003 = 4 92 $fmt = '%0' . $dig_count . 'd'; // Make a format string - leading zeroes 93 $val = intval($number + ($back ? ($number<1 ? 0 : -1) : 1)); 94 $nextval = sprintf($fmt, $val); // Add one on, and put prefix back on 95 96 return $prefix.$nextval.$postfix; 97 } 98 else 99 return $reference; 100 } 101} 102 103//---------------------------------------------------------------------------- 104 105function is_new_reference($ref, $type) 106{ 107 $db_info = get_systype_db_info($type); 108 $db_name = $db_info[0]; 109 $db_type = $db_info[1]; 110 $db_trans = $db_info[2]; 111 $db_ref = $db_info[3]; 112 113 $ref = db_escape(trim($ref)); 114 $type = db_escape($type); 115 116 if ($db_ref == null) { // journal or bank trans store references in refs table 117 $db_name = TB_PREF."refs"; 118 $db_type = 'type'; 119 $db_trans = 'id'; 120 $db_ref = 'reference'; 121 } 122 123 if ($db_type != null) { 124 $sql = "SELECT $db_ref FROM $db_name 125 LEFT JOIN ".TB_PREF."voided v ON 126 $db_name.$db_type=v.type AND $db_name.$db_trans=v.id 127 WHERE $db_name.$db_ref=$ref AND ISNULL(v.id) 128 AND $db_name.$db_type=$type"; 129 } else { 130 $sql = "SELECT $db_ref FROM $db_name 131 LEFT JOIN ".TB_PREF."voided v ON 132 v.type=$type AND $db_name.$db_trans=v.id 133 WHERE $db_ref=$ref AND ISNULL(v.id)"; 134 } 135 136 $result = db_query($sql, "could not test for unique reference"); 137 138 return (db_num_rows($result) == 0); 139 140} 141 142 143?>