Tags support related changes.
[fa-stable.git] / sql / alter2.2.php
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 ***********************************************************************/
12
13 class fa2_2 {
14         var $version = '2.2';   // version installed
15         var $description = 'Version 2.2';
16         var $sql = 'alter2.2.sql';
17         //
18         //      Install procedure. All additional changes 
19         //      not included in sql file should go here.
20         //
21         function install($pref, $force) 
22         {
23                 global $db, $systypes_array;
24                 // set item category dflt accounts to values from company GL setup
25                 $prefs = get_company_prefs();
26                 $sql = "UPDATE {$pref}stock_category SET "
27                         ."dflt_sales_act = '" . $prefs['default_inv_sales_act'] . "',"
28                         ."dflt_cogs_act = '". $prefs['default_cogs_act'] . "',"
29                         ."dflt_inventory_act = '" . $prefs['default_inventory_act'] . "',"
30                         ."dflt_adjustment_act = '" . $prefs['default_adj_act'] . "',"
31                         ."dflt_assembly_act = '" . $prefs['default_assembly_act']."'";
32                 if (db_query($sql)==false) {
33                         display_error("Cannot update category default GL accounts"
34                         .':<br>'. db_error_msg($db));
35                         return false;
36                 }
37                 // add all references to refs table for easy searching via journal interface
38                 foreach($systypes_array as $typeno => $typename) {
39                         $info = get_systype_db_info($typeno);
40                         if ($info == null || $info[3] == null) continue;
41                         $tbl = str_replace(TB_PREF, $pref, $info[0]);
42                         $sql = "SELECT {$info[2]} as id,{$info[3]} as ref FROM $tbl";
43                         if ($info[1])
44                                 $sql .= " WHERE {$info[1]}=$typeno";
45                         $result = db_query($sql);
46                         if (db_num_rows($result)) {
47                                 while ($row = db_fetch($result)) {
48                                         $res2 = db_query("INSERT INTO {$pref}refs VALUES("
49                                                 . $row['id'].",".$typeno.",'".$row['ref']."')");
50                                         if (!$res2) {
51                                                 display_error(_("Cannot copy references from $tbl")
52                                                         .':<br>'. db_error_msg($db));
53                                                 return false;
54                                         }
55                                 }
56                         }
57                 }
58 /* FIX          // restore/init audit_trail data 
59                 $datatbl = array (
60                         "gl_trans"=> array("type", "type_no","tran_date"),
61                         "purch_orders" => array("order_no", "'18'", "ord_date"), 
62                         "sales_orders" => array("order_no", "'30'", "ord_date"),
63                         "workorders" => array("id", "'26'", "date_") );
64                 foreach ( $datatbl as $tblname => $tbl) {
65                   $sql = "SELECT {$tbl[0]} as type, {$tbl[1]} as trans, {$tbl[2]} as dat"
66                         . " FROM {$pref}{$tblname}";
67                   $result = db_query($sql);
68                   if (db_num_rows($result)) {
69                         $user = ;
70                         $year = ;
71                         while ($row = db_fetch($result)) {
72                                 $sql2 = "INSERT INTO ".$pref."audit_trail"
73                                 ." (type, trans_no, user, fiscal_year, gl_date, gl_seq) VALUES ("
74                                 . "{$row['type']},{$row['trans']},$user,$year,{$row['dat']},0)";
75                                 $res2 = db_query($sql2);
76                                 if (!$res2) {
77                                         display_error(_("Cannot init audit_trail data")
78                                                 .':<br>'. db_error_msg($db));
79                                         return false;
80                                 }
81                         }
82                   }
83                 }
84 */
85         
86         if (!($ret = db_query("SELECT MAX(`order_no`) FROM `{$pref}sales_orders`")) ||
87                 !db_num_rows($ret))
88         {
89                 display_error(_('Cannot query max sales order number.'));
90                 return false;
91         } 
92         $row = db_fetch($ret);
93         $max_order = $row[0];
94         $next_ref = $max_order+1;
95         $sql = "UPDATE `{$pref}sys_types` 
96                 SET `type_no`='$max_order', 
97                         `next_reference`='$next_ref'
98                 WHERE `type_id`=30";
99         if(!db_query($sql))
100         {
101                 display_error(_('Cannot store next sales order reference.'));
102                 return false;
103         }
104
105         return convert_roles($pref);
106         }
107         //
108         //      Checking before install
109         //
110         function pre_check($pref)
111         {
112                 global $security_groups;
113                 return isset($security_groups); // true when ok, fail otherwise
114         }
115         //
116         //      Test if patch was applied before.
117         //
118         function installed($pref) {
119                 $n = 15; // number of features to be installed
120                 if (check_table($pref, 'company', 'custom1_name')) $n--;
121                 if (!check_table($pref, 'company', 'profit_loss_year_act')) $n--;
122                 if (!check_table($pref, 'company', 'login_tout')) $n--;
123                 if (!check_table($pref, 'stock_category', 'dflt_no_sale')) $n--;
124                 if (!check_table($pref, 'users', 'sticky_doc_date')) $n--;
125                 if (!check_table($pref, 'users', 'startup_tab')) $n--;
126                 if (!check_table($pref, 'cust_branch', 'inactive')) $n--;
127                 if (!check_table($pref, 'chart_class', 'ctype')) $n--;
128                 if (!check_table($pref, 'audit_trail')) $n--;
129                 if (!check_table($pref, 'currencies', 'auto_update')) $n--;
130                 if (!check_table($pref, 'stock_master','no_sale')) $n--;
131                 if (!check_table($pref, 'suppliers', 'supp_ref')) $n--;
132                 if (!check_table($pref, 'users', 'role_id')) $n--;
133                 if (!check_table($pref, 'sales_orders', 'reference')) $n--;
134                 if (!check_table($pref, 'tags')) $n--;
135                 return $n == 0 ? true : 15 - $n;
136         }
137 };
138
139 /*
140         Conversion of old security roles stored into $security_groups table
141 */
142 function convert_roles($pref) 
143 {
144                 global $security_groups, $security_headings, $security_areas, $path_to_root;
145                 include_once($path_to_root."/includes/access_levels.inc");
146
147         $trans_sec = array(
148                 1 => array('SA_CHGPASSWD', 'SA_SETUPDISPLAY', 'SA_BANKTRANSVIEW',
149                         'SA_ITEMSTRANSVIEW','SA_SUPPTRANSVIEW', 'SA_SALESORDER',
150                         'SA_SALESALLOC', 'SA_SALESTRANSVIEW'),
151                 2 => array('SA_DIMTRANSVIEW', 'SA_STANDARDCOST', 'SA_ITEMSTRANSVIEW',
152                         'SA_ITEMSSTATVIEW', 'SA_SALESPRICE', 'SA_MANUFTRANSVIEW',
153                         'SA_WORKORDERANALYTIC', 'SA_WORKORDERCOST', 'SA_SUPPTRANSVIEW',
154                         'SA_SUPPLIERALLOC', 'SA_STEMPLATE', 'SA_SALESTRANSVIEW',
155                         'SA_SALESINVOICE', 'SA_SALESDELIVERY', 'SA_CUSTPAYMREP',
156                         'SA_CUSTBULKREP', 'SA_PRICEREP', 'SA_SALESBULKREP', 'SA_SALESMANREP',
157                         'SA_SALESBULKREP', 'SA_CUSTSTATREP', 'SA_SUPPLIERANALYTIC',
158                         'SA_SUPPPAYMREP', 'SA_SUPPBULKREP', 'SA_ITEMSVALREP', 'SA_ITEMSANALYTIC',
159                         'SA_BOMREP', 'SA_MANUFBULKREP', 'SA_DIMENSIONREP', 'SA_BANKREP', 'SA_GLREP',
160                         'SA_GLANALYTIC', 'SA_TAXREP', 'SA_SALESANALYTIC'),
161                 3 => array('SA_GLACCOUNTGROUP', 'SA_GLACCOUNTCLASS','SA_PAYMENT', 
162                         'SA_DEPOSIT', 'SA_JOURNALENTRY', 'SA_INVENTORYMOVETYPE',
163                         'SA_LOCATIONTRANSFER', 'SA_INVENTORYADJUSTMENT', 'SA_WORKCENTRES',
164                         'SA_MANUFISSUE', 'SA_SUPPLIERALLOC', 'SA_CUSTOMER', 'SA_CRSTATUS',
165                         'SA_SALESMAN', 'SA_SALESAREA', 'SA_SALESALLOC', 'SA_SALESCREDITINV',
166                         'SA_SALESPAYMNT', 'SA_SALESCREDIT', 'SA_SALESGROUP', 'SA_SRECURRENT',
167                         'SA_TAXRATES', 'SA_ITEMTAXTYPE', 'SA_TAXGROUPS', 'SA_QUICKENTRY'),
168                 4 => array('SA_REORDER', 'SA_PURCHASEPRICING', 'SA_PURCHASEORDER'),
169                 5 => array('SA_VIEWPRINTTRANSACTION', 'SA_BANKTRANSFER', 'SA_SUPPLIER',
170                         'SA_SUPPLIERINVOICE', 'SA_SUPPLIERPAYMNT', 'SA_SUPPLIERCREDIT'),
171                 8 => array('SA_ATTACHDOCUMENT', 'SA_RECONCILE', 'SA_GLANALYTIC',
172                         'SA_TAXREP', 'SA_BANKTRANSVIEW', 'SA_GLTRANSVIEW'),
173                 9 => array('SA_FISCALYEARS', 'SA_CURRENCY', 'SA_EXCHANGERATE', 
174                         'SA_BOM'),
175                 10 => array('SA_PAYTERMS', 'SA_GLSETUP', 'SA_SETUPCOMPANY',
176                         'SA_FORMSETUP', 'SA_DIMTRANSVIEW', 'SA_DIMENSION', 'SA_BANKACCOUNT',
177                         'SA_GLACCOUNT', 'SA_BUDGETENTRY', 'SA_MANUFRECEIVE',
178                         'SA_MANUFRELEASE', 'SA_WORKORDERENTRY', 'SA_MANUFTRANSVIEW',
179                         'SA_WORKORDERCOST'),
180                 11 => array('SA_ITEMCATEGORY', 'SA_ITEM', 'SA_UOM', 'SA_INVENTORYLOCATION',
181                          'SA_GRN', 'SA_FORITEMCODE', 'SA_SALESKIT'),
182                 14 => array('SA_SHIPPING', 'SA_VOIDTRANSACTION', 'SA_SALESTYPES'),
183                 15 => array('SA_PRINTERS', 'SA_PRINTPROFILE', 'SA_BACKUP', 'SA_USERS',
184                         'SA_POSSETUP'),
185                 20 => array('SA_CREATECOMPANY', 'SA_CREATELANGUAGE', 'SA_CREATEMODULES',
186                         'SA_SOFTWAREUPGRADE', 'SA_SECROLES')
187                 );
188                 $new_ids = array();
189                 foreach ($security_groups as $role_id => $areas) {
190                         $area_set = array();
191                         $sections = array();
192                         foreach ($areas as $a) {
193                          if (isset($trans_sec[$a]))
194                                 foreach ($trans_sec[$a] as $id) {
195                                  if ($security_areas[$id][0] != 0)
196 //                                      error_log('invalid area id: '.$a.':'.$id);
197                                         $area_set[] = $security_areas[$id][0];
198                                         $sections[$security_areas[$id][0]&~0xff] = 1;
199                                 }
200                         }
201                         $sections  = array_keys($sections);
202                         sort($sections); sort($area_set);
203                         import_security_role($pref, $security_headings[$role_id], $sections, $area_set);
204                         $new_ids[$role_id] = db_insert_id();
205                 }
206                 $result = get_users(true);
207                 $users = array();
208                 while($row = db_fetch($result)) { // complete old user ids and roles
209                         $users[$row['role_id']][] = $row['id'];
210                 }
211                 foreach($users as $old_id => $uids)
212                         foreach( $uids as $id) {
213                                 $sql = "UPDATE {$pref}users set role_id=".$new_ids[$old_id].
214                                         " WHERE id=$id";
215                                 $ret = db_query($sql, 'cannot update users roles');
216                                 if(!$ret) return false;
217                         }
218                 return true;
219 }
220
221 function import_security_role($pref, $name, $sections, $areas)
222 {
223         $sql = "INSERT INTO {$pref}security_roles (role, description, sections, areas)
224         VALUES (".db_escape('FA 2.1 '.$name).",".db_escape($name).","
225         .db_escape(implode(';',$sections)).",".db_escape(implode(';',$areas)).")";
226
227         db_query($sql, "could not add new security role");
228 }
229
230 $install = new fa2_2;
231
232 ?>