Code Coverage
 
Lines
Functions and Methods
Classes and Traits
Total
0.00% covered (danger)
0.00%
0 / 358
0.00% covered (danger)
0.00%
0 / 11
CRAP
n/a
0 / 0
zeroBSCRM_database_check
0.00% covered (danger)
0.00%
0 / 1
0.00% covered (danger)
0.00%
0 / 1
2
zeroBSCRM_createTables
0.00% covered (danger)
0.00%
0 / 191
0.00% covered (danger)
0.00%
0 / 1
30
zeroBSCRM_checkTablesExist
0.00% covered (danger)
0.00%
0 / 10
0.00% covered (danger)
0.00%
0 / 1
20
zeroBSCRM_db_runDelta
0.00% covered (danger)
0.00%
0 / 6
0.00% covered (danger)
0.00%
0 / 1
20
zeroBSCRM_DB_canInnoDB
0.00% covered (danger)
0.00%
0 / 8
0.00% covered (danger)
0.00%
0 / 1
56
jpcrm_database_engine
0.00% covered (danger)
0.00%
0 / 5
0.00% covered (danger)
0.00%
0 / 1
12
zeroBSCRM_database_getVersion
0.00% covered (danger)
0.00%
0 / 1
0.00% covered (danger)
0.00%
0 / 1
2
jpcrm_database_server_has_ability
0.00% covered (danger)
0.00%
0 / 9
0.00% covered (danger)
0.00%
0 / 1
20
jpcrm_create_notifications_table
0.00% covered (danger)
0.00%
0 / 11
0.00% covered (danger)
0.00%
0 / 1
20
zeroBSCRM_database_reset
0.00% covered (danger)
0.00%
0 / 31
0.00% covered (danger)
0.00%
0 / 1
110
zeroBSCRM_database_nuke
0.00% covered (danger)
0.00%
0 / 54
0.00% covered (danger)
0.00%
0 / 1
56
1<?php
2/*
3 * Jetpack CRM
4 * https://jetpackcrm.com
5 * V1.20
6 *
7 * Copyright 2020 Automattic
8 *
9 * Date: 01/11/16
10 */
11
12defined( 'ZEROBSCRM_PATH' ) || exit( 0 );
13
14/*
15======================================================
16    Table Creation
17    ====================================================== */
18
19global $wpdb, $ZBSCRM_t;
20// Table names
21// phpcs:disable WordPress.NamingConventions.ValidVariableName.VariableNotSnakeCase
22$ZBSCRM_t['contacts']              = $wpdb->prefix . 'zbs_contacts';
23$ZBSCRM_t['customfields']          = $wpdb->prefix . 'zbs_customfields';
24$ZBSCRM_t['meta']                  = $wpdb->prefix . 'zbs_meta';
25$ZBSCRM_t['tags']                  = $wpdb->prefix . 'zbs_tags';
26$ZBSCRM_t['taglinks']              = $wpdb->prefix . 'zbs_tags_links';
27$ZBSCRM_t['settings']              = $wpdb->prefix . 'zbs_settings';
28$ZBSCRM_t['segments']              = $wpdb->prefix . 'zbs_segments';
29$ZBSCRM_t['segmentsconditions']    = $wpdb->prefix . 'zbs_segments_conditions';
30$ZBSCRM_t['adminlog']              = $wpdb->prefix . 'zbs_admlog';
31$ZBSCRM_t['temphash']              = $wpdb->prefix . 'zbs_temphash';
32$ZBSCRM_t['objlinks']              = $wpdb->prefix . 'zbs_object_links';
33$ZBSCRM_t['aka']                   = $wpdb->prefix . 'zbs_aka';
34$ZBSCRM_t['externalsources']       = $wpdb->prefix . 'zbs_externalsources';
35$ZBSCRM_t['tracking']              = $wpdb->prefix . 'zbs_tracking';
36$ZBSCRM_t['logs']                  = $wpdb->prefix . 'zbs_logs';
37$ZBSCRM_t['system_mail_templates'] = $wpdb->prefix . 'zbs_sys_email';
38$ZBSCRM_t['system_mail_hist']      = $wpdb->prefix . 'zbs_sys_email_hist';
39$ZBSCRM_t['cronmanagerlogs']       = $wpdb->prefix . 'zbs_sys_cronmanagerlogs';
40$ZBSCRM_t['companies']             = $wpdb->prefix . 'zbs_companies';
41$ZBSCRM_t['quotes']                = $wpdb->prefix . 'zbs_quotes';
42$ZBSCRM_t['quotetemplates']        = $wpdb->prefix . 'zbs_quotes_templates';
43$ZBSCRM_t['invoices']              = $wpdb->prefix . 'zbs_invoices';
44$ZBSCRM_t['transactions']          = $wpdb->prefix . 'zbs_transactions';
45$ZBSCRM_t['lineitems']             = $wpdb->prefix . 'zbs_lineitems';
46$ZBSCRM_t['forms']                 = $wpdb->prefix . 'zbs_forms';
47$ZBSCRM_t['events']                = $wpdb->prefix . 'zbs_events';
48$ZBSCRM_t['eventreminders']        = $wpdb->prefix . 'zbs_event_reminders';
49$ZBSCRM_t['tax']                   = $wpdb->prefix . 'zbs_tax_table';
50$ZBSCRM_t['security_log']          = $wpdb->prefix . 'zbs_security_log';
51$ZBSCRM_t['automation-workflows']  = $wpdb->prefix . 'zbs_workflows';
52$ZBSCRM_t['notifications']         = $wpdb->prefix . 'zbs_notifications';
53// phpcs:enable WordPress.NamingConventions.ValidVariableName.VariableNotSnakeCase
54
55/**
56 * Core-fired Database structure check
57 * ... currently used to check tables exist
58 */
59function zeroBSCRM_database_check() {
60
61    #} Check + create
62    zeroBSCRM_checkTablesExist();
63}
64
65/**
66 * creates the ZBS Database Tables
67 */
68function zeroBSCRM_createTables() {
69
70    global $wpdb, $ZBSCRM_t;
71
72    // Require upgrade.php so we can use dbDelta
73    require_once ABSPATH . 'wp-admin/includes/upgrade.php';
74
75    // Where available we force InnoDB
76    $storageEngineLine = '';
77    if ( zeroBSCRM_DB_canInnoDB() ) {
78        $storageEngineLine = 'ENGINE = InnoDB';
79    }
80
81    // Collation & Character Set
82    $collation    = 'utf8_general_ci';
83    $characterSet = 'utf8';
84
85    // We'll collect any errors as we go, exposing, if there are any, on system status page
86    global $zbsDB_lastError, $zbsDB_creationErrors;
87
88    // we log the last error before we start, in case another plugin has left an error in the buffer
89    $zbsDB_lastError = '';
90    if ( isset( $wpdb->last_error ) ) {
91        $zbsDB_lastError = $wpdb->last_error;
92    }
93    $zbsDB_creationErrors = array();
94
95    // Contacts
96    $sql = 'CREATE TABLE IF NOT EXISTS ' . $ZBSCRM_t['contacts'] . '(
97    `ID` INT NOT NULL AUTO_INCREMENT,
98    `zbs_site` INT NULL DEFAULT NULL,
99    `zbs_team` INT NULL DEFAULT NULL,
100    `zbs_owner` INT NOT NULL,
101    `zbsc_status` VARCHAR(100) NULL,
102    `zbsc_email` VARCHAR(200) NULL,
103    `zbsc_prefix` VARCHAR(30) NULL,
104    `zbsc_fname` VARCHAR(100) NULL,
105    `zbsc_lname` VARCHAR(100) NULL,
106    `zbsc_addr1` VARCHAR(200) NULL,
107    `zbsc_addr2` VARCHAR(200) NULL,
108    `zbsc_city` VARCHAR(200) NULL,
109    `zbsc_county` VARCHAR(200) NULL,
110    `zbsc_country` VARCHAR(200) NULL,
111    `zbsc_postcode` VARCHAR(50) NULL,
112    `zbsc_secaddr1` VARCHAR(200) NULL,
113    `zbsc_secaddr2` VARCHAR(200) NULL,
114    `zbsc_seccity` VARCHAR(200) NULL,
115    `zbsc_seccounty` VARCHAR(200) NULL,
116    `zbsc_seccountry` VARCHAR(200) NULL,
117    `zbsc_secpostcode` VARCHAR(50) NULL,
118    `zbsc_hometel` VARCHAR(40) NULL,
119    `zbsc_worktel` VARCHAR(40) NULL,
120    `zbsc_mobtel` VARCHAR(40) NULL,    
121    `zbsc_wpid` INT NULL DEFAULT NULL,
122    `zbsc_avatar` VARCHAR(300) NULL,
123    `zbsc_tw` VARCHAR(100) NULL,
124    `zbsc_li` VARCHAR(300) NULL,
125    `zbsc_fb` VARCHAR(200) NULL,
126    `zbsc_created` INT(14) NOT NULL,
127    `zbsc_lastupdated` INT(14) NOT NULL,
128    `zbsc_lastcontacted` INT(14) NULL DEFAULT NULL,
129    PRIMARY KEY (`ID`),
130    INDEX (`zbsc_email`, `zbsc_wpid`),
131    KEY `zbsc_status` (`zbsc_status`) USING BTREE)
132    ' . $storageEngineLine . '
133    DEFAULT CHARACTER SET = ' . $characterSet . '
134    COLLATE = ' . $collation . ';';
135    zeroBSCRM_db_runDelta( $sql );
136
137    // Custom Fields
138    $sql = 'CREATE TABLE IF NOT EXISTS ' . $ZBSCRM_t['customfields'] . '(
139    `ID` INT NOT NULL AUTO_INCREMENT,
140    `zbs_site` INT NULL DEFAULT NULL,
141    `zbs_team` INT NULL DEFAULT NULL,
142    `zbs_owner` INT NOT NULL,
143    `zbscf_objtype` INT(4) NOT NULL,
144    `zbscf_objid` INT(32) NOT NULL,
145    `zbscf_objkey` VARCHAR(100) NOT NULL,
146    `zbscf_objval` VARCHAR(2000) NULL DEFAULT NULL,
147    `zbscf_created` INT(14) NOT NULL,
148    `zbscf_lastupdated` INT(14) NOT NULL,
149    PRIMARY KEY (`ID`),
150    INDEX `TYPEIDKEY` (`zbscf_objtype` ASC, `zbscf_objid` ASC, `zbscf_objkey` ASC))
151    ' . $storageEngineLine . '
152    DEFAULT CHARACTER SET = ' . $characterSet . '
153    COLLATE = ' . $collation . ';';
154    zeroBSCRM_db_runDelta( $sql );
155
156    // Tags
157    $sql = 'CREATE TABLE IF NOT EXISTS ' . $ZBSCRM_t['tags'] . '(
158    `ID` INT NOT NULL AUTO_INCREMENT,
159    `zbs_site` INT NULL DEFAULT NULL,
160    `zbs_team` INT NULL DEFAULT NULL,
161    `zbs_owner` INT NOT NULL,
162    `zbstag_objtype` INT NOT NULL,
163    `zbstag_name` VARCHAR(200) NOT NULL,
164    `zbstag_slug` VARCHAR(200) NOT NULL,
165    `zbstag_created` INT(14) NOT NULL,
166    `zbstag_lastupdated` INT(14) NOT NULL,
167    PRIMARY KEY (`ID`))
168    ' . $storageEngineLine . '
169    DEFAULT CHARACTER SET = ' . $characterSet . '
170    COLLATE = ' . $collation . ';';
171    zeroBSCRM_db_runDelta( $sql );
172
173    // Tag Relationships (Links)
174    $sql = 'CREATE TABLE IF NOT EXISTS ' . $ZBSCRM_t['taglinks'] . '(
175    `ID` INT NOT NULL AUTO_INCREMENT,
176    `zbs_site` INT NULL DEFAULT NULL,
177    `zbs_team` INT NULL DEFAULT NULL,
178    `zbs_owner` INT NOT NULL,
179    `zbstl_objtype` INT(4) NOT NULL,
180    `zbstl_objid` INT NOT NULL,
181    `zbstl_tagid` INT NOT NULL,
182    PRIMARY KEY (`ID`),
183    INDEX (`zbstl_objid`),
184    INDEX (`zbstl_tagid`),
185    KEY `zbstl_tagid+zbstl_objtype` (`zbstl_tagid`,`zbstl_objtype`) USING BTREE)
186    ' . $storageEngineLine . '
187    DEFAULT CHARACTER SET = ' . $characterSet . '
188    COLLATE = ' . $collation . ';';
189    zeroBSCRM_db_runDelta( $sql );
190
191    // Settings
192    $sql = 'CREATE TABLE IF NOT EXISTS ' . $ZBSCRM_t['settings'] . '(
193    `ID` INT NOT NULL AUTO_INCREMENT,
194    `zbs_site` INT NULL DEFAULT NULL,
195    `zbs_team` INT NULL DEFAULT NULL,
196    `zbs_owner` INT NOT NULL,
197    `zbsset_key` VARCHAR(100) NOT NULL DEFAULT -1,
198    `zbsset_val` LONGTEXT NULL DEFAULT NULL,
199    `zbsset_created` INT(14) NOT NULL,
200    `zbsset_lastupdated` INT(14) NOT NULL,
201    PRIMARY KEY (`ID`),
202    INDEX `zbsset_key` (`zbsset_key`),
203    INDEX (`zbs_owner`))
204    ' . $storageEngineLine . '
205    DEFAULT CHARACTER SET = ' . $characterSet . '
206    COLLATE = ' . $collation . ';';
207    zeroBSCRM_db_runDelta( $sql );
208
209    // Meta Key-Value pairs
210    $sql = 'CREATE TABLE IF NOT EXISTS ' . $ZBSCRM_t['meta'] . '(
211    `ID` INT NOT NULL AUTO_INCREMENT,
212    `zbs_site` INT NULL DEFAULT NULL,
213    `zbs_team` INT NULL DEFAULT NULL,
214    `zbs_owner` INT NOT NULL,
215    `zbsm_objtype` INT NOT NULL,
216    `zbsm_objid` INT NOT NULL,
217    `zbsm_key` VARCHAR(255) NOT NULL,
218    `zbsm_val` LONGTEXT NULL DEFAULT NULL,
219    `zbsm_created` INT(14) NOT NULL,
220    `zbsm_lastupdated` INT(14) NOT NULL,
221    PRIMARY KEY (`ID`),
222    KEY `zbsm_objid+zbsm_key+zbsm_objtype` (`zbsm_objid`,`zbsm_key`,`zbsm_objtype`) USING BTREE)
223    ' . $storageEngineLine . '
224    DEFAULT CHARACTER SET = ' . $characterSet . '
225    COLLATE = ' . $collation . ';';
226    zeroBSCRM_db_runDelta( $sql );
227
228    #} Segments
229    $sql = 'CREATE TABLE IF NOT EXISTS ' . $ZBSCRM_t['segments'] . "(
230    `ID` INT NOT NULL AUTO_INCREMENT,
231    `zbs_site` INT NULL DEFAULT NULL,
232    `zbs_team` INT NULL DEFAULT NULL,
233    `zbs_owner` INT NOT NULL,
234    `zbsseg_name` VARCHAR(120) CHARACTER SET 'utf8' COLLATE 'utf8_general_ci' NOT NULL,
235    `zbsseg_slug` VARCHAR(45) NOT NULL,
236    `zbsseg_matchtype` VARCHAR(10) NOT NULL,
237    `zbsseg_created` INT(14) NOT NULL,
238    `zbsseg_lastupdated` INT(14) NOT NULL,
239    `zbsseg_compilecount` INT NULL DEFAULT 0,
240    `zbsseg_lastcompiled` INT(14) NOT NULL,
241    PRIMARY KEY (`ID`))
242    " . $storageEngineLine . '
243    DEFAULT CHARACTER SET = ' . $characterSet . '
244    COLLATE = ' . $collation . ';';
245    zeroBSCRM_db_runDelta( $sql );
246
247    // Segments: Conditions
248    $sql = 'CREATE TABLE IF NOT EXISTS ' . $ZBSCRM_t['segmentsconditions'] . "(
249    `ID` INT NOT NULL AUTO_INCREMENT,
250    `zbscondition_segmentid` INT NOT NULL,
251    `zbscondition_type` VARCHAR(50) CHARACTER SET 'utf8' COLLATE 'utf8_general_ci' NOT NULL,
252    `zbscondition_op` VARCHAR(50) NULL,
253    `zbscondition_val` VARCHAR(250) CHARACTER SET 'utf8' COLLATE 'utf8_general_ci' NULL,
254    `zbscondition_val_secondary` VARCHAR(250) CHARACTER SET 'utf8' COLLATE 'utf8_general_ci' NULL,
255    PRIMARY KEY (`ID`))
256    " . $storageEngineLine . '
257    DEFAULT CHARACTER SET = ' . $characterSet . '
258    COLLATE = ' . $collation . ';';
259    zeroBSCRM_db_runDelta( $sql );
260
261    // Admin Logs
262    $sql = 'CREATE TABLE IF NOT EXISTS ' . $ZBSCRM_t['adminlog'] . '(
263    `ID` INT NOT NULL AUTO_INCREMENT,
264    `zbs_site` INT NULL DEFAULT NULL,
265    `zbs_team` INT NULL DEFAULT NULL,
266    `zbs_owner` INT NOT NULL,
267    `zbsadmlog_status` INT(3) NOT NULL,
268    `zbsadmlog_cat` VARCHAR(20) NULL DEFAULT NULL,
269    `zbsadmlog_str` VARCHAR(500) NULL DEFAULT NULL,
270    `zbsadmlog_time` INT(14) NULL DEFAULT NULL,
271    PRIMARY KEY (`ID`))
272    ' . $storageEngineLine . '
273    DEFAULT CHARACTER SET = ' . $characterSet . '
274    COLLATE = ' . $collation . ';';
275    zeroBSCRM_db_runDelta( $sql );
276
277    // Temporary Hashes
278    $sql = 'CREATE TABLE IF NOT EXISTS ' . $ZBSCRM_t['temphash'] . '(
279    `ID` INT NOT NULL AUTO_INCREMENT,
280    `zbs_site` INT NULL DEFAULT NULL,
281    `zbs_team` INT NULL DEFAULT NULL,
282    `zbs_owner` INT NOT NULL,
283    `zbstemphash_status` INT NULL DEFAULT -1,
284    `zbstemphash_objtype` VARCHAR(50) NOT NULL,
285    `zbstemphash_objid` INT NULL DEFAULT NULL,
286    `zbstemphash_objhash` VARCHAR(256) NULL DEFAULT NULL,
287    `zbstemphash_created` INT(14) NOT NULL,
288    `zbstemphash_lastupdated` INT(14) NOT NULL,
289    `zbstemphash_expiry` INT(14) NOT NULL,
290    PRIMARY KEY (`ID`))
291    ' . $storageEngineLine . '
292    DEFAULT CHARACTER SET = ' . $characterSet . '
293    COLLATE = ' . $collation . ';';
294    zeroBSCRM_db_runDelta( $sql );
295
296    // Object Relationships (Links)
297    $sql = 'CREATE TABLE IF NOT EXISTS ' . $ZBSCRM_t['objlinks'] . '(
298    `ID` INT NOT NULL AUTO_INCREMENT,
299    `zbs_site` INT NULL DEFAULT NULL,
300    `zbs_team` INT NULL DEFAULT NULL,
301    `zbs_owner` INT NOT NULL,
302    `zbsol_objtype_from` INT(4) NOT NULL,
303    `zbsol_objtype_to` INT(4) NOT NULL,
304    `zbsol_objid_from` INT NOT NULL,
305    `zbsol_objid_to` INT NOT NULL,
306    PRIMARY KEY (`ID`),
307    INDEX (`zbsol_objid_from`),
308    INDEX (`zbsol_objid_to`))
309    ' . $storageEngineLine . '
310    DEFAULT CHARACTER SET = ' . $characterSet . '
311    COLLATE = ' . $collation . ';';
312    zeroBSCRM_db_runDelta( $sql );
313
314    #} AKA (Aliases)
315    $sql = 'CREATE TABLE IF NOT EXISTS ' . $ZBSCRM_t['aka'] . "(
316    `ID` INT NOT NULL AUTO_INCREMENT,
317    `aka_type` INT NULL,
318    `aka_id` INT NOT NULL,
319    `aka_alias` VARCHAR(200) CHARACTER SET 'utf8' COLLATE 'utf8_general_ci' NOT NULL,
320    `aka_created` INT(14) NULL,
321    `aka_lastupdated` INT(14) NULL,
322    PRIMARY KEY (`ID`),
323    INDEX (`aka_id`, `aka_alias`))
324    " . $storageEngineLine . '
325    DEFAULT CHARACTER SET = ' . $characterSet . '
326    COLLATE = ' . $collation . ';';
327    zeroBSCRM_db_runDelta( $sql );
328
329    #} External sources
330    // NOTE:! Modified in 2.97.5 migration
331    $sql = 'CREATE TABLE IF NOT EXISTS ' . $ZBSCRM_t['externalsources'] . "(
332    `ID` INT NOT NULL AUTO_INCREMENT,
333    `zbs_site` INT NULL DEFAULT NULL,
334    `zbs_team` INT NULL DEFAULT NULL,
335    `zbs_owner` INT NOT NULL,
336    `zbss_objtype` INT(3) NOT NULL DEFAULT '-1',
337    `zbss_objid` INT(32) NOT NULL,
338    `zbss_source` VARCHAR(20) NOT NULL,
339    `zbss_uid` VARCHAR(300) NOT NULL,
340    `zbss_origin` VARCHAR(400) NULL DEFAULT NULL,
341    `zbss_created` INT(14) NOT NULL,
342    `zbss_lastupdated` INT(14) NOT NULL,
343    PRIMARY KEY (`ID`),
344    INDEX (`zbss_objid`),
345    INDEX (`zbss_origin`),
346    KEY `zbss_uid+zbss_source+zbss_objtype` (`zbss_uid`,`zbss_source`,`zbss_objtype`) USING BTREE)
347    " . $storageEngineLine . '
348    DEFAULT CHARACTER SET = ' . $characterSet . '
349    COLLATE = ' . $collation . ';';
350    zeroBSCRM_db_runDelta( $sql );
351
352    #} Tracking (web hit info)
353    $sql = 'CREATE TABLE IF NOT EXISTS ' . $ZBSCRM_t['tracking'] . '(
354    `ID` INT NOT NULL AUTO_INCREMENT,
355    `zbs_site` INT NULL DEFAULT NULL,
356    `zbs_team` INT NULL DEFAULT NULL,
357    `zbs_owner` INT NOT NULL,
358    `zbst_contactid` INT NOT NULL,
359    `zbst_action` VARCHAR(50) NOT NULL,
360    `zbst_action_detail` LONGTEXT NOT NULL,
361    `zbst_referrer` VARCHAR(300) NOT NULL,
362    `zbst_utm_source` VARCHAR(200) NOT NULL,
363    `zbst_utm_medium` VARCHAR(200) NOT NULL,
364    `zbst_utm_name` VARCHAR(200) NOT NULL,
365    `zbst_utm_term` VARCHAR(200) NOT NULL,
366    `zbst_utm_content` VARCHAR(200) NOT NULL,
367    `zbst_created` INT(14) NOT NULL,
368    `zbst_lastupdated` INT(14) NOT NULL,
369    PRIMARY KEY (`ID`))
370    ' . $storageEngineLine . '
371    DEFAULT CHARACTER SET = ' . $characterSet . '
372    COLLATE = ' . $collation . ';';
373    zeroBSCRM_db_runDelta( $sql );
374
375    #} Logs
376    $sql = 'CREATE TABLE IF NOT EXISTS ' . $ZBSCRM_t['logs'] . '(
377    `ID` INT NOT NULL AUTO_INCREMENT,
378    `zbs_site` INT NULL DEFAULT NULL,
379    `zbs_team` INT NULL DEFAULT NULL,
380    `zbs_owner` INT NOT NULL,
381    `zbsl_objtype` INT NOT NULL,
382    `zbsl_objid` INT NOT NULL,
383    `zbsl_type` VARCHAR(200) NOT NULL,
384    `zbsl_shortdesc` VARCHAR(300) NULL,
385    `zbsl_longdesc` LONGTEXT NULL,
386    `zbsl_pinned` INT(1) NULL,
387    `zbsl_created` INT(14) NOT NULL,
388    `zbsl_lastupdated` INT(14) NOT NULL,
389    PRIMARY KEY (`ID`),
390    INDEX (`zbsl_objid`),
391    INDEX `zbsl_created` (`zbsl_created`) USING BTREE)
392    ' . $storageEngineLine . '
393    DEFAULT CHARACTER SET = ' . $characterSet . '
394    COLLATE = ' . $collation . ';';
395    zeroBSCRM_db_runDelta( $sql );
396
397    // System Email Templates
398    $sql = 'CREATE TABLE IF NOT EXISTS ' . $ZBSCRM_t['system_mail_templates'] . "(
399    `ID` INT NOT NULL AUTO_INCREMENT,
400    `zbs_site` INT NULL DEFAULT NULL,
401    `zbs_team` INT NULL DEFAULT NULL,
402    `zbs_owner` INT NOT NULL,
403    `zbsmail_active` INT NOT NULL,
404    `zbsmail_id` INT NOT NULL,
405    `zbsmail_deliverymethod` VARCHAR(200) NOT NULL,
406    `zbsmail_fromname` VARCHAR(200) NULL,
407    `zbsmail_fromaddress` VARCHAR(200) NULL,
408    `zbsmail_replyto` VARCHAR(200) NULL,
409    `zbsmail_ccto` VARCHAR(200) NULL,
410    `zbsmail_bccto` VARCHAR(200) NULL,
411    `zbsmail_subject` VARCHAR(200) CHARACTER SET 'utf8' COLLATE 'utf8_general_ci' NULL DEFAULT NULL,
412    `zbsmail_body` LONGTEXT NULL DEFAULT NULL,
413    `zbsmail_created` INT(14) NOT NULL,
414    `zbsmail_lastupdated` INT(14) NOT NULL,
415    PRIMARY KEY (`ID`))
416    " . $storageEngineLine . '
417    DEFAULT CHARACTER SET = ' . $characterSet . '
418    COLLATE = ' . $collation . ';';
419    zeroBSCRM_db_runDelta( $sql );
420
421    // System Email History
422    $sql = 'CREATE TABLE IF NOT EXISTS ' . $ZBSCRM_t['system_mail_hist'] . '(
423    `ID` INT NOT NULL AUTO_INCREMENT,
424    `zbs_site` int(11) DEFAULT NULL,
425    `zbs_team` int(11) DEFAULT NULL,
426    `zbs_owner` int(11) NOT NULL,
427    `zbsmail_type` int(11) NOT NULL,
428    `zbsmail_sender_thread` int(11) NOT NULL,
429    `zbsmail_sender_email` varchar(200) NOT NULL,
430    `zbsmail_sender_wpid` int(11) NOT NULL,
431    `zbsmail_sender_mailbox_id` int(11) NOT NULL,
432    `zbsmail_sender_mailbox_name` varchar(200) DEFAULT NULL,
433    `zbsmail_receiver_email` varchar(200) NOT NULL,
434    `zbsmail_sent` int(11) NOT NULL,
435    `zbsmail_target_objid` int(11) NOT NULL,
436    `zbsmail_assoc_objid` int(11) NOT NULL,
437    `zbsmail_subject` varchar(200) DEFAULT NULL,
438    `zbsmail_content` longtext,
439    `zbsmail_hash` varchar(128) DEFAULT NULL,
440    `zbsmail_status` varchar(120) DEFAULT NULL,
441    `zbsmail_sender_maildelivery_key` varchar(200) DEFAULT NULL,
442    `zbsmail_starred` int(11) DEFAULT NULL,
443    `zbsmail_opened` int(11) NOT NULL,
444    `zbsmail_clicked` int(11) NOT NULL,
445    `zbsmail_firstopened` int(14) NOT NULL,
446    `zbsmail_lastopened` int(14) NOT NULL,
447    `zbsmail_lastclicked` int(14) NOT NULL,
448    `zbsmail_created` int(14) NOT NULL,
449    PRIMARY KEY (`ID`),
450    INDEX (`zbsmail_sender_wpid`),
451    INDEX (`zbsmail_sender_mailbox_id`))
452    ' . $storageEngineLine . '
453    DEFAULT CHARACTER SET = ' . $characterSet . '
454    COLLATE = ' . $collation . ';';
455    zeroBSCRM_db_runDelta( $sql );
456
457    // cron Manager Logs
458    $sql = 'CREATE TABLE IF NOT EXISTS ' . $ZBSCRM_t['cronmanagerlogs'] . '(
459    `ID` INT NOT NULL AUTO_INCREMENT,
460    `zbs_site` int(11) DEFAULT NULL,
461    `zbs_team` int(11) DEFAULT NULL,
462    `zbs_owner` int(11) NOT NULL,
463    `job` VARCHAR(100) NOT NULL,
464    `jobstatus` INT(3) NULL,
465    `jobstarted` INT(14) NOT NULL,
466    `jobfinished` INT(14) NOT NULL,
467    `jobnotes` LONGTEXT NULL,
468    PRIMARY KEY (`ID`))
469    ' . $storageEngineLine . '
470    DEFAULT CHARACTER SET = ' . $characterSet . '
471    COLLATE = ' . $collation . ';';
472    zeroBSCRM_db_runDelta( $sql );
473
474    // Tax Table
475    $sql = 'CREATE TABLE IF NOT EXISTS ' . $ZBSCRM_t['tax'] . '(
476    `ID` INT NOT NULL AUTO_INCREMENT,
477    `zbs_site` int(11) DEFAULT NULL,
478    `zbs_team` int(11) DEFAULT NULL,
479    `zbs_owner` int(11) NOT NULL,
480    `zbsc_tax_name` VARCHAR(100) NULL,
481    `zbsc_rate` DECIMAL(20,10) NOT NULL DEFAULT 0.0000000000,
482    `zbsc_created` INT(14) NOT NULL,
483    `zbsc_lastupdated` INT(14) NOT NULL,
484    PRIMARY KEY (`ID`))
485    ' . $storageEngineLine . '
486    DEFAULT CHARACTER SET = ' . $characterSet . '
487    COLLATE = ' . $collation . ';';
488    zeroBSCRM_db_runDelta( $sql );
489
490    // Companies (DB3.0+)
491    $sql = 'CREATE TABLE IF NOT EXISTS ' . $ZBSCRM_t['companies'] . '(
492    `ID` INT NOT NULL AUTO_INCREMENT,
493    `zbs_site` INT NULL DEFAULT NULL,
494    `zbs_team` INT NULL DEFAULT NULL,
495    `zbs_owner` INT NOT NULL,
496    `zbsco_status` VARCHAR(50) NULL DEFAULT NULL,
497    `zbsco_name` VARCHAR(100) NULL DEFAULT NULL,
498    `zbsco_email` VARCHAR(200) NULL DEFAULT NULL,
499    `zbsco_addr1` VARCHAR(200) NULL DEFAULT NULL,
500    `zbsco_addr2` VARCHAR(200) NULL DEFAULT NULL,
501    `zbsco_city` VARCHAR(200) NULL DEFAULT NULL,
502    `zbsco_county` VARCHAR(200) NULL DEFAULT NULL,
503    `zbsco_country` VARCHAR(200) NULL DEFAULT NULL,
504    `zbsco_postcode` VARCHAR(50) NULL DEFAULT NULL,
505    `zbsco_secaddr1` VARCHAR(200) NULL DEFAULT NULL,
506    `zbsco_secaddr2` VARCHAR(200) NULL DEFAULT NULL,
507    `zbsco_seccity` VARCHAR(200) NULL DEFAULT NULL,
508    `zbsco_seccounty` VARCHAR(200) NULL DEFAULT NULL,
509    `zbsco_seccountry` VARCHAR(200) NULL DEFAULT NULL,
510    `zbsco_secpostcode` VARCHAR(50) NULL DEFAULT NULL,
511    `zbsco_maintel` VARCHAR(40) NULL DEFAULT NULL,
512    `zbsco_sectel` VARCHAR(40) NULL DEFAULT NULL,
513    `zbsco_wpid` INT NULL DEFAULT NULL,
514    `zbsco_avatar` VARCHAR(300) NULL DEFAULT NULL,
515    `zbsco_tw` VARCHAR(100) NULL,
516    `zbsco_li` VARCHAR(300) NULL,
517    `zbsco_fb` VARCHAR(200) NULL,
518    `zbsco_created` INT(14) NOT NULL,
519    `zbsco_lastupdated` INT(14) NOT NULL,
520    `zbsco_lastcontacted` INT(14) NULL DEFAULT NULL,
521    PRIMARY KEY (`ID`),
522    INDEX `wpid` (`zbsco_wpid` ASC),
523    INDEX `name` (`zbsco_name` ASC),
524    INDEX `email` (`zbsco_email` ASC),
525    INDEX `created` (`zbsco_created` ASC))
526    ' . $storageEngineLine . '
527    DEFAULT CHARACTER SET = ' . $characterSet . '
528    COLLATE = ' . $collation . ';';
529    zeroBSCRM_db_runDelta( $sql );
530
531    // Tasks (DB3.0+)
532    $sql = 'CREATE TABLE IF NOT EXISTS ' . $ZBSCRM_t['events'] . '(
533    `ID` INT NOT NULL AUTO_INCREMENT,
534    `zbs_site` INT NULL DEFAULT NULL,
535    `zbs_team` INT NULL DEFAULT NULL,
536    `zbs_owner` INT NOT NULL,
537    `zbse_title` VARCHAR(255) NULL DEFAULT NULL,
538    `zbse_desc` LONGTEXT NULL DEFAULT NULL,
539    `zbse_start` INT(14) NOT NULL,
540    `zbse_end` INT(14) NOT NULL,
541    `zbse_complete` TINYINT(1) NOT NULL DEFAULT -1,
542    `zbse_show_on_portal` TINYINT(1) NOT NULL DEFAULT -1,
543    `zbse_show_on_cal` TINYINT(1) NOT NULL DEFAULT -1,
544    `zbse_created` INT(14) NOT NULL,
545    `zbse_lastupdated` INT(14) NULL DEFAULT NULL,
546    PRIMARY KEY (`ID`),
547    INDEX `title` (`zbse_title` ASC),
548    INDEX `startint` (`zbse_start` ASC),
549    INDEX `endint` (`zbse_end` ASC),
550    INDEX `created` (`zbse_created` ASC))
551    ' . $storageEngineLine . '
552    DEFAULT CHARACTER SET = ' . $characterSet . '
553    COLLATE = ' . $collation . ';';
554    zeroBSCRM_db_runDelta( $sql );
555
556    // Task Reminders (DB3.0+)
557    $sql = 'CREATE TABLE IF NOT EXISTS ' . $ZBSCRM_t['eventreminders'] . '(
558    `ID` INT NOT NULL AUTO_INCREMENT,
559    `zbs_site` INT NULL DEFAULT NULL,
560    `zbs_team` INT NULL DEFAULT NULL,
561    `zbs_owner` INT NOT NULL,
562    `zbser_event` INT NOT NULL,
563    `zbser_remind_at` INT NOT NULL DEFAULT -1,
564    `zbser_sent` TINYINT NOT NULL DEFAULT -1,
565    `zbser_created` INT(14) NOT NULL,
566    `zbser_lastupdated` INT(14) NULL DEFAULT NULL,
567    PRIMARY KEY (`ID`))
568    ' . $storageEngineLine . '
569    DEFAULT CHARACTER SET = ' . $characterSet . '
570    COLLATE = ' . $collation . ';';
571    zeroBSCRM_db_runDelta( $sql );
572
573    // Forms
574    $sql = 'CREATE TABLE IF NOT EXISTS ' . $ZBSCRM_t['forms'] . '(
575    `ID` INT NOT NULL AUTO_INCREMENT,
576    `zbs_site` INT NULL DEFAULT NULL,
577    `zbs_team` INT NULL DEFAULT NULL,
578    `zbs_owner` INT NOT NULL,
579    `zbsf_title` VARCHAR(200) NULL DEFAULT NULL,
580    `zbsf_style` VARCHAR(20) NOT NULL,
581    `zbsf_views` INT(10) NULL DEFAULT 0,
582    `zbsf_conversions` INT(10) NULL DEFAULT 0,
583    `zbsf_label_header` VARCHAR(200) NULL DEFAULT NULL,
584    `zbsf_label_subheader` VARCHAR(200) NULL DEFAULT NULL,
585    `zbsf_label_firstname` VARCHAR(200) NULL DEFAULT NULL,
586    `zbsf_label_lastname` VARCHAR(200) NULL DEFAULT NULL,
587    `zbsf_label_email` VARCHAR(200) NULL DEFAULT NULL,
588    `zbsf_label_message` VARCHAR(200) NULL DEFAULT NULL,
589    `zbsf_label_button` VARCHAR(200) NULL DEFAULT NULL,
590    `zbsf_label_successmsg` VARCHAR(200) NULL DEFAULT NULL,
591    `zbsf_label_spammsg` VARCHAR(200) NULL DEFAULT NULL,
592    `zbsf_include_terms_check` TINYINT(1) NOT NULL DEFAULT -1,
593    `zbsf_terms_url` VARCHAR(300) NULL DEFAULT NULL,
594    `zbsf_redir_url` VARCHAR(300) NULL DEFAULT NULL,
595    `zbsf_font` VARCHAR(100) NULL DEFAULT NULL,
596    `zbsf_colour_bg` VARCHAR(100) NULL DEFAULT NULL,
597    `zbsf_colour_font` VARCHAR(100) NULL DEFAULT NULL,
598    `zbsf_colour_emphasis` VARCHAR(100) NULL DEFAULT NULL,
599    `zbsf_created` INT(14) NOT NULL,
600    `zbsf_lastupdated` INT(14) NOT NULL,
601    PRIMARY KEY (`ID`),
602    INDEX `title` (`zbsf_title` ASC),
603    INDEX `created` (`zbsf_created` ASC))
604    ' . $storageEngineLine . '
605    DEFAULT CHARACTER SET = ' . $characterSet . '
606    COLLATE = ' . $collation . ';';
607    zeroBSCRM_db_runDelta( $sql );
608
609    // Invoices
610    $sql = 'CREATE TABLE IF NOT EXISTS ' . $ZBSCRM_t['invoices'] . '(
611    `ID` INT NOT NULL AUTO_INCREMENT,
612    `zbs_site` INT NULL DEFAULT NULL,
613    `zbs_team` INT NULL DEFAULT NULL,
614    `zbs_owner` INT NOT NULL,
615    `zbsi_id_override` VARCHAR(128) NULL DEFAULT NULL,
616    `zbsi_parent` INT NULL DEFAULT NULL,
617    `zbsi_status` VARCHAR(50) NOT NULL,
618    `zbsi_hash` VARCHAR(64) NULL DEFAULT NULL,
619    `zbsi_send_attachments` TINYINT(1) NOT NULL DEFAULT -1,
620    `zbsi_pdf_template` VARCHAR(128) NULL DEFAULT NULL,
621    `zbsi_portal_template` VARCHAR(128) NULL DEFAULT NULL,
622    `zbsi_email_template` VARCHAR(128) NULL DEFAULT NULL,
623    `zbsi_invoice_frequency` INT(4) NULL DEFAULT -1,
624    `zbsi_currency` VARCHAR(4) NOT NULL DEFAULT -1,
625    `zbsi_pay_via` INT(4) NULL DEFAULT NULL,
626    `zbsi_logo_url` VARCHAR(300) NULL DEFAULT NULL,
627    `zbsi_address_to_objtype` INT(2) NOT NULL DEFAULT -1,
628    `zbsi_addressed_from` VARCHAR(600) NULL DEFAULT NULL,
629    `zbsi_addressed_to` VARCHAR(600) NULL DEFAULT NULL,
630    `zbsi_allow_partial` TINYINT(1) NOT NULL DEFAULT -1,
631    `zbsi_allow_tip` TINYINT(1) NOT NULL DEFAULT -1,
632    `zbsi_hours_or_quantity` TINYINT(1) NOT NULL DEFAULT 1,
633    `zbsi_date` INT(14) NOT NULL,
634    `zbsi_due_date` INT(14) NULL DEFAULT NULL,
635    `zbsi_paid_date` INT(14) NULL DEFAULT -1,
636    `zbsi_hash_viewed` INT(14) NULL DEFAULT -1,
637    `zbsi_hash_viewed_count` INT(10) NULL DEFAULT 0,
638    `zbsi_portal_viewed` INT(14) NULL DEFAULT -1,
639    `zbsi_portal_viewed_count` INT(10) NULL DEFAULT 0,
640    `zbsi_net` DECIMAL(18,2) NOT NULL DEFAULT 0.00,
641    `zbsi_discount` DECIMAL(18,2) NULL DEFAULT 0.00,
642    `zbsi_discount_type` VARCHAR(20) NULL DEFAULT NULL,
643    `zbsi_shipping` DECIMAL(18,2) NULL DEFAULT 0.00,
644    `zbsi_shipping_taxes` VARCHAR(40) NULL DEFAULT NULL,
645    `zbsi_shipping_tax` DECIMAL(18,2) NULL DEFAULT 0.00,
646    `zbsi_taxes` VARCHAR(40) NULL DEFAULT NULL,
647    `zbsi_tax` DECIMAL(18,2) NULL DEFAULT 0.00,
648    `zbsi_total` DECIMAL(18,2) NOT NULL DEFAULT 0.00,
649    `zbsi_created` INT(14) NOT NULL,
650    `zbsi_lastupdated` INT(14) NOT NULL,
651    PRIMARY KEY (`ID`),
652    INDEX `idoverride` (`zbsi_id_override` ASC),
653    INDEX `parent` (`zbsi_parent` ASC),
654    INDEX `status` (`zbsi_status` ASC),
655    INDEX `hash` (`zbsi_hash` ASC),
656    INDEX `created` (`zbsi_created` ASC))
657    ' . $storageEngineLine . '
658    DEFAULT CHARACTER SET = ' . $characterSet . '
659    COLLATE = ' . $collation . ';';
660    zeroBSCRM_db_runDelta( $sql );
661
662    // Line Items (DB3.0+)
663    $sql = 'CREATE TABLE IF NOT EXISTS ' . $ZBSCRM_t['lineitems'] . '(
664    `ID` INT NOT NULL AUTO_INCREMENT,
665    `zbs_site` INT NULL DEFAULT NULL,
666    `zbs_team` INT NULL DEFAULT NULL,
667    `zbs_owner` INT NOT NULL,
668    `zbsli_order` INT NULL DEFAULT NULL,
669    `zbsli_title` VARCHAR(300) NULL DEFAULT NULL,
670    `zbsli_desc` VARCHAR(300) NULL DEFAULT NULL,
671    `zbsli_quantity` decimal(18,2) NULL DEFAULT NULL,
672    `zbsli_price` DECIMAL(18,2) NOT NULL DEFAULT 0.00,
673    `zbsli_currency` VARCHAR(4) NOT NULL DEFAULT -1,
674    `zbsli_net` DECIMAL(18,2) NOT NULL DEFAULT 0.00,
675    `zbsli_discount` DECIMAL(18,2) NULL DEFAULT 0.00,
676    `zbsli_fee` DECIMAL(18,2) NULL DEFAULT 0.00,
677    `zbsli_shipping` DECIMAL(18,2) NULL DEFAULT 0.00,
678    `zbsli_shipping_taxes` VARCHAR(40) NULL DEFAULT NULL,
679    `zbsli_shipping_tax` DECIMAL(18,2) NULL DEFAULT 0.00,
680    `zbsli_taxes` VARCHAR(40) NULL DEFAULT NULL,
681    `zbsli_tax` DECIMAL(18,2) NULL DEFAULT 0.00,
682    `zbsli_total` DECIMAL(18,2) NOT NULL DEFAULT 0.00,
683    `zbsli_created` INT(14) NOT NULL,
684    `zbsli_lastupdated` INT(14) NOT NULL,
685    PRIMARY KEY (`ID`),
686    INDEX `order` (`zbsli_order` ASC),
687    INDEX `created` (`zbsli_created` ASC))
688    ' . $storageEngineLine . '
689    DEFAULT CHARACTER SET = ' . $characterSet . '
690    COLLATE = ' . $collation . ';';
691    zeroBSCRM_db_runDelta( $sql );
692
693    // Quotes (DB3.0+)
694    $sql = 'CREATE TABLE IF NOT EXISTS ' . $ZBSCRM_t['quotes'] . '(
695    `ID` INT NOT NULL AUTO_INCREMENT,
696    `zbs_site` INT NULL DEFAULT NULL,
697    `zbs_team` INT NULL DEFAULT NULL,
698    `zbs_owner` INT NOT NULL,
699    `zbsq_id_override` VARCHAR(128) NULL DEFAULT NULL,
700    `zbsq_title` VARCHAR(255) NULL DEFAULT NULL,
701    `zbsq_currency` VARCHAR(4) NOT NULL DEFAULT -1,
702    `zbsq_value` DECIMAL(18,2) NULL DEFAULT 0.00,
703    `zbsq_date` INT(14) NOT NULL,
704    `zbsq_template` VARCHAR(200) NULL DEFAULT NULL,
705    `zbsq_content` LONGTEXT NULL DEFAULT NULL,
706    `zbsq_notes` LONGTEXT NULL DEFAULT NULL,
707    `zbsq_hash` VARCHAR(64) NULL DEFAULT NULL,
708    `zbsq_send_attachments` TINYINT(1) NOT NULL DEFAULT -1,
709    `zbsq_lastviewed` INT(14) NULL DEFAULT -1,
710    `zbsq_viewed_count` INT(10) NULL DEFAULT 0,
711    `zbsq_accepted` INT(14) NULL DEFAULT -1,
712    `zbsq_acceptedsigned` VARCHAR(200) NULL DEFAULT NULL,
713    `zbsq_acceptedip` VARCHAR(64) NULL DEFAULT NULL,
714    `zbsq_created` INT(14) NOT NULL,
715    `zbsq_lastupdated` INT(14) NOT NULL,
716    PRIMARY KEY (`ID`),
717    INDEX `title` (`zbsq_title` ASC),
718    INDEX `dateint` (`zbsq_date` ASC),
719    INDEX `hash` (`zbsq_hash` ASC),
720    INDEX `created` (`zbsq_created` ASC),
721    INDEX `accepted` (`zbsq_accepted` ASC))
722    ' . $storageEngineLine . '
723    DEFAULT CHARACTER SET = ' . $characterSet . '
724    COLLATE = ' . $collation . ';';
725    zeroBSCRM_db_runDelta( $sql );
726
727    // Quote Templates (DB3.0+)
728    $sql = 'CREATE TABLE IF NOT EXISTS ' . $ZBSCRM_t['quotetemplates'] . '(
729    `ID` INT NOT NULL AUTO_INCREMENT,
730    `zbs_site` INT NULL DEFAULT NULL,
731    `zbs_team` INT NULL DEFAULT NULL,
732    `zbs_owner` INT NOT NULL,
733    `zbsqt_title` VARCHAR(255) NULL DEFAULT NULL,
734    `zbsqt_value` DECIMAL(18,2) NULL DEFAULT 0.00,
735    `zbsqt_date_str` VARCHAR(20) NULL DEFAULT NULL,
736    `zbsqt_date` INT(14) NULL DEFAULT NULL,
737    `zbsqt_content` LONGTEXT NULL DEFAULT NULL,
738    `zbsqt_notes` LONGTEXT NULL DEFAULT NULL,
739    `zbsqt_currency` VARCHAR(4) NOT NULL DEFAULT -1,
740    `zbsqt_created` INT(14) NOT NULL,
741    `zbsqt_lastupdated` INT(14) NOT NULL,
742    PRIMARY KEY (`ID`),
743    INDEX `title` (`zbsqt_title` ASC),
744    INDEX `created` (`zbsqt_created` ASC))
745    ' . $storageEngineLine . '
746    DEFAULT CHARACTER SET = ' . $characterSet . '
747    COLLATE = ' . $collation . ';';
748    zeroBSCRM_db_runDelta( $sql );
749
750    // Transactions (DB3.0+)
751    $sql = 'CREATE TABLE IF NOT EXISTS ' . $ZBSCRM_t['transactions'] . '(
752    `ID` INT NOT NULL AUTO_INCREMENT,
753    `zbs_site` INT NULL DEFAULT NULL,
754    `zbs_team` INT NULL DEFAULT NULL,
755    `zbs_owner` INT NOT NULL,
756    `zbst_status` VARCHAR(50) NOT NULL,
757    `zbst_type` VARCHAR(50) DEFAULT NULL,
758    `zbst_ref` VARCHAR(120) NOT NULL,
759    `zbst_origin` VARCHAR(100) NULL DEFAULT NULL,
760    `zbst_parent` INT NULL DEFAULT NULL,
761    `zbst_hash` VARCHAR(64) NULL DEFAULT NULL,
762    `zbst_title` VARCHAR(200) NULL DEFAULT NULL,
763    `zbst_desc` VARCHAR(200) NULL DEFAULT NULL,
764    `zbst_date` INT(14) NULL DEFAULT NULL,
765    `zbst_customer_ip` VARCHAR(45) NULL DEFAULT NULL,
766    `zbst_currency` VARCHAR(4) NOT NULL DEFAULT -1,
767    `zbst_net` DECIMAL(18,2) NOT NULL DEFAULT 0.00,
768    `zbst_fee` DECIMAL(18,2) NOT NULL DEFAULT 0.00,
769    `zbst_discount` DECIMAL(18,2) NULL DEFAULT 0.00,
770    `zbst_shipping` DECIMAL(18,2) NULL DEFAULT 0.00,
771    `zbst_shipping_taxes` VARCHAR(40) NULL DEFAULT NULL,
772    `zbst_shipping_tax` DECIMAL(18,2) NULL DEFAULT 0.00,
773    `zbst_taxes` VARCHAR(40) NULL DEFAULT NULL,
774    `zbst_tax` DECIMAL(18,2) NULL DEFAULT 0.00,
775    `zbst_total` DECIMAL(18,2) NOT NULL DEFAULT 0.00,
776    `zbst_date_paid` INT(14) NULL DEFAULT NULL,
777    `zbst_date_completed` INT(14) NULL DEFAULT NULL,
778    `zbst_created` INT(14) NOT NULL,
779    `zbst_lastupdated` INT(14) NOT NULL,
780    PRIMARY KEY (`ID`),
781    INDEX `status` (`zbst_status` ASC),
782    INDEX `ref` (`zbst_ref` ASC),
783    INDEX `transtype` (`zbst_type` ASC),
784    INDEX `transorigin` (`zbst_origin` ASC),
785    INDEX `parent` (`zbst_parent` ASC),
786    INDEX `hash` (`zbst_hash` ASC),
787    INDEX `date` (`zbst_date` ASC),
788    INDEX `title` (`zbst_title` ASC),
789    INDEX `created` (`zbst_created` ASC))
790    ' . $storageEngineLine . '
791    DEFAULT CHARACTER SET = ' . $characterSet . '
792    COLLATE = ' . $collation . ';';
793    zeroBSCRM_db_runDelta( $sql );
794
795    // Security logs (used to stop repeat brute-forcing quote/inv hashes etc.)
796    $sql = 'CREATE TABLE IF NOT EXISTS ' . $ZBSCRM_t['security_log'] . '(
797    `ID` INT NOT NULL AUTO_INCREMENT,
798    `zbs_site` INT NULL DEFAULT NULL,
799    `zbs_team` INT NULL DEFAULT NULL,
800    `zbs_owner` INT NOT NULL,
801    `zbssl_reqtype` VARCHAR(20) NOT NULL,
802    `zbssl_ip` VARCHAR(200) NULL DEFAULT NULL,
803    `zbssl_reqhash` VARCHAR(128) NULL DEFAULT NULL,
804    `zbssl_reqid` INT(11) NULL DEFAULT NULL,
805    `zbssl_loggedin_id` INT(11) NULL DEFAULT NULL,
806    `zbssl_reqstatus` INT(1) NULL DEFAULT NULL,
807    `zbssl_reqtime` INT(14) NULL DEFAULT NULL,
808    PRIMARY KEY (`ID`))
809    ' . $storageEngineLine . '
810    DEFAULT CHARACTER SET = ' . $characterSet . '
811    COLLATE = ' . $collation . ';';
812    zeroBSCRM_db_runDelta( $sql );
813
814    // Add table to store automation workflows.
815    // phpcs:disable WordPress.NamingConventions.ValidVariableName.VariableNotSnakeCase
816    $sql = 'CREATE TABLE IF NOT EXISTS ' . $ZBSCRM_t['automation-workflows'] . '(
817    `id` INT NOT NULL AUTO_INCREMENT,
818    `zbs_site` INT NOT NULL,
819    `zbs_team` INT NOT NULL,
820    `zbs_owner` INT NOT NULL,
821    `name` VARCHAR(255) NOT NULL,
822    `description` VARCHAR(600) NULL DEFAULT NULL,
823    `category` VARCHAR(255) NOT NULL,
824    `triggers` LONGTEXT NOT NULL,
825    `initial_step` VARCHAR(255) NOT NULL,
826    `steps` LONGTEXT NOT NULL,
827    `active` TINYINT(1) NOT NULL DEFAULT 0,
828    `version` INT(14) NOT NULL DEFAULT 1,
829    `created_at` INT(14) DEFAULT NULL,
830    `updated_at` INT(14) DEFAULT NULL,
831    PRIMARY KEY (`id`),
832    INDEX `name` (`name` ASC),
833    INDEX `active` (`active` ASC),
834    INDEX `category` (`category` ASC),
835    INDEX `created_at` (`created_at` ASC)
836    ) ' . $storageEngineLine . '
837    DEFAULT CHARACTER SET = ' . $characterSet . '
838    COLLATE = ' . $collation . ';';
839    // phpcs:enable WordPress.NamingConventions.ValidVariableName.VariableNotSnakeCase
840    zeroBSCRM_db_runDelta( $sql );
841
842    // Notifications Table - Use the dedicated function
843    jpcrm_create_notifications_table();
844
845    // As of v5.0, if we've created via the above SQL, we're at DAL3 :)
846    // so on fresh installs, immitate the fact that we've 'completed' DAL1->DAL2->DAL3 Migration chain
847    update_option(
848        'zbs_db_migration_253',
849        array(
850            'completed' => time(),
851            'started'   => time(),
852        ),
853        false
854    );
855    update_option(
856        'zbs_db_migration_300',
857        array(
858            'completed' => time(),
859            'started'   => time(),
860        ),
861        false
862    );
863
864    // if any errors, log to wp option (potentially can't save to our zbs settings table because may not exist)
865    // phpcs:ignore WordPress.NamingConventions.ValidVariableName.VariableNotSnakeCase
866    $errors = $zbsDB_creationErrors;
867    if ( is_array( $errors ) ) {
868        if ( count( $errors ) > 0 ) {
869            update_option(
870                'zbs_db_creation_errors',
871                array(
872                    'lasttried' => time(),
873                    'errors'    => $errors,
874                ),
875                false
876            );
877        } else {
878            delete_option( 'zbs_db_creation_errors' ); // successful run kills the alert
879        }
880    }
881
882    // no longer needed
883    unset( $zbsDB_lastError, $zbsDB_creationErrors );
884
885    // return any errors encountered
886    return $errors;
887}
888
889#} Check existence & Create func
890#} WH NOTE: This could be more efficient (once we have a bunch of tabs)
891function zeroBSCRM_checkTablesExist() {
892
893    global $ZBSCRM_t, $wpdb;
894
895    $create = false;
896
897    // then we cycle through our tables :) - means all keys NEED to be kept up to date :)
898    // No need to add to this ever now :)
899    foreach ( $ZBSCRM_t as $table_name ) { // phpcs:ignore WordPress.NamingConventions.ValidVariableName.VariableNotSnakeCase
900        $existing_tables = $wpdb->get_results( "SHOW TABLES LIKE '" . $table_name . "'" ); // phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery,WordPress.DB.DirectDatabaseQuery.NoCaching,WordPress.DB.PreparedSQL.NotPrepared
901        if ( count( $existing_tables ) < 1 ) {
902            $create = true;
903            break;
904        }
905    }
906
907    if ( $create ) {
908        zeroBSCRM_createTables();
909    }
910
911    // hooked in by extensions
912    do_action( 'zbs_db_check' );
913
914    return $create;
915}
916
917/**
918 * Attempts to run $sql through dbDelta, adding any errors to the stack as it encounters them
919 */
920function zeroBSCRM_db_runDelta( $sql = '' ) {
921
922    global $wpdb, $zbsDB_lastError, $zbsDB_creationErrors;
923
924    // Ensure dbDelta is available (can be missing outside of admin load order)
925    if ( ! function_exists( 'dbDelta' ) ) {
926        require_once ABSPATH . 'wp-admin/includes/upgrade.php';
927    }
928
929    // enact
930    dbDelta( $sql );
931
932    // catch any (new) errors
933    if ( isset( $wpdb->last_error ) && $wpdb->last_error !== $zbsDB_lastError ) {
934
935        // add to the stack
936        $zbsDB_creationErrors[] = $wpdb->last_error;
937
938        // clock it as latest error
939        $zbsDB_lastError = $wpdb->last_error;
940
941    }
942}
943
944/**
945 * returns availability of InnoDB MySQL Storage Engine
946 *
947 *  gh-470, some users on some installs did not have InnoDB
948 *  Used in table creation to force InnoDB use where possible,
949 *  ... and also used to expose availability via System Status UI
950 *
951 * @return bool (if InnoDB available)
952 */
953function zeroBSCRM_DB_canInnoDB() {
954
955    if ( jpcrm_database_engine() === 'sqlite' ) {
956        return false;
957    }
958
959    global $wpdb;
960
961    // attempt to cycle through MySQL's ENGINES & discern InnoDB
962    $availableStorageEngines = $wpdb->get_results( 'SHOW ENGINES' );
963    if ( is_array( $availableStorageEngines ) ) {
964        foreach ( $availableStorageEngines as $engine ) {
965
966            if ( is_object( $engine ) && isset( $engine->Engine ) && $engine->Engine == 'InnoDB' ) {
967                return true;
968            }
969        }
970    }
971
972    return false;
973}
974
975/**
976 * Get info about the database engine.
977 *
978 * @param boolean $pretty Retrieve a user-friendly label instead of a slug.
979 *
980 * @return string
981 */
982function jpcrm_database_engine( $pretty = false ) {
983    global $zbs;
984
985    if ( ! $zbs ) {
986        return 'unknown';
987    }
988
989    if ( $pretty ) {
990        return $zbs->database_server_info['db_engine_label'];
991    }
992    return $zbs->database_server_info['db_engine'];
993}
994
995/**
996 * Get the database version.
997 *
998 * @return string
999 */
1000function zeroBSCRM_database_getVersion() {
1001    global $zbs;
1002    return $zbs->database_server_info['raw_version'];
1003}
1004
1005function jpcrm_database_server_has_ability( $ability_name ) {
1006    global $zbs;
1007    $db_server_version = zeroBSCRM_database_getVersion();
1008    $db_engine         = $zbs->database_server_info['db_engine'];
1009
1010    if ( $ability_name === 'fulltext_index' ) {
1011        if ( $db_engine === 'sqlite' ) {
1012            return false;
1013        } elseif ( $db_engine === 'mariadb' ) {
1014            // first stable 10.x release
1015            return version_compare( $db_server_version, '10.0.10', '>=' );
1016        } else {
1017            // https://dev.mysql.com/doc/refman/5.6/en/mysql-nutshell.html
1018            return version_compare( $db_server_version, '5.6', '>=' );
1019        }
1020    }
1021
1022    return false;
1023}
1024
1025/**
1026 * Create just the notifications table
1027 *
1028 * @since 5.6.0
1029 * @return bool True if table was created successfully, false otherwise
1030 */
1031function jpcrm_create_notifications_table() {
1032    // phpcs:ignore WordPress.NamingConventions.ValidVariableName.VariableNotSnakeCase
1033    global $wpdb, $ZBSCRM_t;
1034
1035    // Get database settings
1036    // phpcs:ignore WordPress.NamingConventions.ValidVariableName.VariableNotSnakeCase
1037    $storageEngineLine = zeroBSCRM_DB_canInnoDB() ? 'ENGINE=InnoDB' : '';
1038    // phpcs:ignore WordPress.NamingConventions.ValidVariableName.VariableNotSnakeCase
1039    $characterSet = $wpdb->charset ? $wpdb->charset : 'utf8';
1040    $collation    = $wpdb->collate ? $wpdb->collate : 'utf8_general_ci';
1041
1042    // Table creation SQL
1043    // phpcs:disable
1044    $sql = 'CREATE TABLE IF NOT EXISTS ' . $ZBSCRM_t['notifications'] . "(
1045        `id` INT(32) UNSIGNED NOT NULL AUTO_INCREMENT,
1046        `zbs_site` INT NULL DEFAULT NULL,
1047        `zbs_team` INT NULL DEFAULT NULL,
1048        `zbs_owner` INT NOT NULL,
1049        `zbsnotify_recipient_id` INT(32) NOT NULL,
1050        `zbsnotify_sender_id` INT(32) NOT NULL,
1051        `zbsnotify_unread` TINYINT(1) NOT NULL DEFAULT '1',
1052        `zbsnotify_emailed` TINYINT(1) NOT NULL DEFAULT '0',
1053        `zbsnotify_type` VARCHAR(255) NOT NULL DEFAULT '',
1054        `zbsnotify_parameters` TEXT NOT NULL,
1055        `zbsnotify_reference_id` INT(32) NOT NULL,
1056        `zbsnotify_created_at` INT(18) NOT NULL,
1057        PRIMARY KEY (`id`))
1058        " . $storageEngineLine . '
1059        DEFAULT CHARACTER SET = ' . $characterSet . "
1060        COLLATE = " . $collation . ";";
1061        // phpcs:enable
1062
1063    // Run the query
1064    zeroBSCRM_db_runDelta( $sql );
1065
1066    // Check if table was created successfully - the table name is set as a global variable so OK to put directly in the SQL
1067    // phpcs:ignore WordPress.NamingConventions.ValidVariableName.VariableNotSnakeCase
1068    $table_name = $ZBSCRM_t['notifications'];
1069    // phpcs:disable
1070    $table_exists = $wpdb->get_var( "SHOW TABLES LIKE '$table_name'" ) === $table_name;
1071    // phpcs:enable
1072
1073    return $table_exists;
1074}
1075
1076/*
1077======================================================
1078    / Table Creation
1079    ====================================================== */
1080
1081/*
1082======================================================
1083    Uninstall Funcs
1084    ====================================================== */
1085
1086/**
1087 * dangerous, brutal, savage.
1088 *
1089 * This one removes all data except settings & migrations
1090 * see zeroBSCRM_database_nuke for the full show.
1091 *
1092 * @param bool $check_permissions (default true) whether to check current user can manage_options.
1093 * @return void
1094 */
1095function zeroBSCRM_database_reset( $check_permissions = true ) {
1096
1097    if ( $check_permissions && ! current_user_can( 'manage_options' ) ) {
1098        return;
1099    }
1100
1101        #} Brutal Reset of DB settings & removal of tables
1102        global $wpdb, $ZBSCRM_t;
1103
1104        #} DAL 2.0 CPTs
1105        $post_types = array( 'zerobs_transaction', 'zerobs_customer', 'zerobs_invoice', 'zerobs_company', 'zerobs_event', 'zerobs_log', 'zerobs_quote', 'zerobs_ticket', 'zerobs_quo_template' );
1106    foreach ( $post_types as $post_type ) {
1107        $wpdb->query( "DELETE FROM $wpdb->posts WHERE `post_type` = '$post_type'" );
1108    }
1109
1110        #} DAL 2.0 Taxonomies
1111        $taxonomies = array( 'zerobscrm_tickettag', 'zerobscrm_transactiontag', 'zerobscrm_customertag', 'zerobscrm_worktag' );
1112    foreach ( $taxonomies as $tax ) {
1113        $wpdb->query( "DELETE FROM $wpdb->term_taxonomy WHERE `taxonomy` = '$tax'" );
1114    }
1115        $wpdb->query( "UPDATE $wpdb->term_taxonomy SET count = 0 WHERE `taxonomy` = 'zerobscrm_transactiontag'" );
1116
1117        #} Floating Meta
1118        $post_meta = array( 'zbs_woo_unique_ID', 'zbs_paypal_unique_ID', 'zbs_woo_unique_inv_ID', 'zbs_stripe_unique_inv_ID', 'zbs_transaction_meta', 'zbs_customer_meta', 'zbs_customer_ext_str', 'zbs_customer_ext_woo', 'zbs_event_meta', 'zbs_event_actions' );
1119    foreach ( $post_meta as $meta ) {
1120        $wpdb->query( "DELETE FROM $wpdb->postmeta WHERE `meta_key` = '$meta'" );
1121    }
1122        $wpdb->query( "DELETE FROM $wpdb->postmeta WHERE `meta_key` LIKE 'zbs_obj_ext_%';" );
1123
1124        #} WP Options - Not settings/migrations, just data related options
1125        $options = array(
1126            'zbs_woo_first_import_complete',
1127            'zbs_transaction_stripe_hist',
1128            'zbs_transaction_paypal_hist',
1129            'zbs_pp_latest',
1130            'zbscrmcsvimpresumeerrors',
1131            'zbs_stripe_last_charge_added',
1132            'zbs_stripe_pages_imported',
1133            'zbs_stripe_total_pages',
1134        );
1135        foreach ( $options as $option ) {
1136            $wpdb->query( $wpdb->prepare( "DELETE FROM $wpdb->options WHERE `option_name` = %s", array( $option ) ) );
1137        }
1138
1139    // phpcs:disable Generic.WhiteSpace.ScopeIndent.Incorrect,Generic.WhiteSpace.ScopeIndent.IncorrectExact,WordPress.DB.DirectDatabaseQuery.DirectQuery,WordPress.DB.DirectDatabaseQuery.NoCaching
1140    // DAL 3.0 tables.
1141    $ZBSCRM_t['totaltrans'] = $wpdb->prefix . 'zbs_global_total_trans'; // phpcs:ignore WordPress.NamingConventions.ValidVariableName.VariableNotSnakeCase
1142
1143    foreach ( $ZBSCRM_t as $k => $v ) { // phpcs:ignore WordPress.NamingConventions.ValidVariableName.VariableNotSnakeCase
1144
1145            // Do not truncate the settings.
1146            if ( $k !== 'settings' ) {
1147                // Copy how maybe_create_table() looks for existing tables.
1148                if ( $wpdb->get_var( $wpdb->prepare( 'SHOW TABLES LIKE %s', $wpdb->esc_like( $v ) ) ) !== $v ) {
1149                    continue;
1150                }
1151
1152                $wpdb->query( 'TRUNCATE TABLE ' . $v ); // phpcs:ignore WordPress.DB.PreparedSQL.NotPrepared
1153                }
1154    }
1155    // phpcs:enable WordPress.DB.DirectDatabaseQuery.DirectQuery,WordPress.DB.DirectDatabaseQuery.NoCaching
1156}
1157
1158// dangerous, brutal, savage removal of all ZBS signs
1159/*
1160        ___________________    . , ; .
1161        (___________________|~~~~~X.;' .
1162                            ' `" ' `
1163                    TNT
1164*/
1165function zeroBSCRM_database_nuke() {
1166
1167    if ( current_user_can( 'manage_options' ) ) {
1168
1169        #} Brutal Reset of DB settings & removal of tables
1170        global $wpdb, $ZBSCRM_t;
1171
1172        #} Deactivate Extensions
1173        zeroBSCRM_extensions_deactivateAll();
1174
1175        #} DAL 2.0 CPTs
1176        $post_types = array( 'zerobs_transaction', 'zerobs_customer', 'zerobs_invoice', 'zerobs_company', 'zerobs_event', 'zerobs_log', 'zerobs_quote', 'zerobs_ticket', 'zerobs_quo_template' );
1177        foreach ( $post_types as $post_type ) {
1178            $wpdb->query( "DELETE FROM $wpdb->posts WHERE `post_type` = '$post_type'" );
1179        }
1180
1181        #} DAL 2.0 Taxonomies
1182        $taxonomies = array( 'zerobscrm_tickettag', 'zerobscrm_transactiontag', 'zerobscrm_customertag', 'zerobscrm_worktag' );
1183        foreach ( $taxonomies as $tax ) {
1184            $wpdb->query( "DELETE FROM $wpdb->term_taxonomy WHERE `taxonomy` = '$tax'" );
1185        }
1186        $wpdb->query( "UPDATE $wpdb->term_taxonomy SET count = 0 WHERE `taxonomy` = 'zerobscrm_transactiontag'" );
1187
1188        #} Floating Meta
1189        $post_meta = array( 'zbs_woo_unique_ID', 'zbs_paypal_unique_ID', 'zbs_woo_unique_inv_ID', 'zbs_stripe_unique_inv_ID', 'zbs_transaction_meta', 'zbs_customer_meta', 'zbs_customer_ext_str', 'zbs_customer_ext_woo', 'zbs_event_meta', 'zbs_event_actions' );
1190        foreach ( $post_meta as $meta ) {
1191            $wpdb->query( "DELETE FROM $wpdb->postmeta WHERE `meta_key` = '$meta'" );
1192        }
1193        $wpdb->query( "DELETE FROM $wpdb->postmeta WHERE `meta_key` LIKE 'zbs_obj_ext_%';" );
1194
1195        #} WP Options - this tries to capture all, as from pre v3 we were not using formal naming conventions
1196        $options = array(
1197            'zbs_woo_first_import_complete',
1198            'zbs_transaction_stripe_hist',
1199            'zbs_transaction_paypal_hist',
1200            'zbs_pp_latest',
1201            'zbsmigrations',
1202            'zbs_teleactive',
1203            'zbs_update_avail',
1204            'zbscptautodraftclear',
1205            'zbs_wizard_run',
1206            'zbscrmcsvimpresumeerrors',
1207            'zbs_crm_api_key',
1208            'zbs_crm_api_secret',
1209            'zbs-global-perf-test',
1210            'zbsmc2indexes',
1211            'zbs_stripe_last_charge_added',
1212            'zbs_stripe_pages_imported',
1213            'zbs_stripe_total_pages',
1214            'widget_zbs_form_widget',
1215            'zerobscrmsettings',
1216            'zbsmigrationpreloadcatch',
1217            'zbs_db_migration_253',
1218            'zerobscrmsettings_bk',
1219            'zbs_db_migration_300_pre_exts',
1220            'zbs_db_migration_300_cftrans',
1221            'zbs_db_migration_300_errstack',
1222            'zbs_db_migration_300_cf',
1223            'zbs_db_migration_300',
1224            'zbs_children_processed',
1225            'zbs_pp_latest',
1226            '  _transient_timeout_zbs-nag-extension-update-now',
1227            '_transient_zbs-nag-extension-update-now',
1228        );
1229        foreach ( $options as $option ) {
1230            $wpdb->query( $wpdb->prepare( "DELETE FROM $wpdb->options WHERE `option_name` = %s", array( $option ) ) );
1231        }
1232
1233        #} WP options - catchalls (be careful to only cull zbs settings here)
1234        $wpdb->query( "DELETE FROM {$wpdb->options} WHERE `option_name` LIKE 'zbsmigration%'" );
1235        $wpdb->query( "DELETE FROM {$wpdb->options} WHERE `option_name` LIKE '%zbs-db2%'" );
1236        $wpdb->query( "DELETE FROM {$wpdb->options} WHERE `option_name` LIKE '%zbs-db3%'" );
1237
1238        #} DROP all DAL 3.0 tables
1239        $ZBSCRM_t['totaltrans'] = $wpdb->prefix . 'zbs_global_total_trans';
1240        foreach ( $ZBSCRM_t as $k => $v ) {
1241            $wpdb->query( 'DROP TABLE ' . $v );
1242        }
1243    }
1244}
1245
1246/*
1247======================================================
1248    / Uninstall Funcs
1249    ====================================================== */