Newer
Older
<?php
/*+********************************************************************************
* The contents of this file are subject to the vtiger CRM Public License Version 1.0
* ("License"); You may not use this file except in compliance with the License
* The Original Code is: vtiger CRM Open Source
* The Initial Developer of the Original Code is vtiger.
* Portions created by vtiger are Copyright (C) vtiger.
* All Rights Reserved.
*********************************************************************************/
if (defined('VTIGER_UPGRADE')) {
global $current_user;
$db = PearDatabase::getInstance();

Satish
committed
//START::Workflow task's template path
$pathsList = array();
$taskResult = $db->pquery('SELECT classname FROM com_vtiger_workflow_tasktypes', array());
while($rowData = $db->fetch_row($taskResult)) {

Satish
committed
$className = $rowData['classname'];
if ($className) {
$pathsList[$className] = vtemplate_path("Tasks/$className.tpl", 'Settings:Workflows');
}
}
if ($pathsList) {
$taskUpdateQuery = 'UPDATE com_vtiger_workflow_tasktypes SET templatepath = CASE';

Satish
committed
foreach ($pathsList as $className => $templatePath) {
$taskUpdateQuery .= " WHEN classname='$className' THEN '$templatePath'";

Satish
committed
}
$taskUpdateQuery .= ' ELSE templatepath END';
$db->pquery($taskUpdateQuery, array());

Satish
committed
}
//END::Workflow task's template path

Satish
committed
//START::Duplication Prevention
$vtigerFieldColumns = $db->getColumnNames('vtiger_field');
if (!in_array('isunique', $vtigerFieldColumns)) {
$db->pquery('ALTER TABLE vtiger_field ADD COLUMN isunique BOOLEAN DEFAULT 0');
}
$vtigerTabColumns = $db->getColumnNames('vtiger_tab');
if (!in_array('issyncable', $vtigerTabColumns)) {
$db->pquery('ALTER TABLE vtiger_tab ADD COLUMN issyncable BOOLEAN DEFAULT 0');
}
if (!in_array('allowduplicates', $vtigerTabColumns)) {
$db->pquery('ALTER TABLE vtiger_tab ADD COLUMN allowduplicates BOOLEAN DEFAULT 1');
}
if (!in_array('sync_action_for_duplicates', $vtigerTabColumns)) {
$db->pquery('ALTER TABLE vtiger_tab ADD COLUMN sync_action_for_duplicates INT(1) DEFAULT 1');
}
//START - Enable prevention for Accounts module

Satish
committed
$accounts = 'Accounts';
$db->pquery('UPDATE vtiger_field SET isunique=? WHERE fieldname=? AND tabid=(SELECT tabid FROM vtiger_tab WHERE name=?)', array(1, 'accountname', $accounts));
$db->pquery('UPDATE vtiger_tab SET allowduplicates=? WHERE name=?', array(0, $accounts));
//End - Enable prevention for Accounts module
$db->pquery('UPDATE vtiger_tab SET issyncable=1', array());
$em = new VTEventsManager($db);
$em->registerHandler('vtiger.entity.beforesave', 'modules/Vtiger/handlers/CheckDuplicateHandler.php', 'CheckDuplicateHandler');
$em = new VTEventsManager($db);
$em->registerHandler('vtiger.entity.beforerestore', 'modules/Vtiger/handlers/CheckDuplicateHandler.php', 'CheckDuplicateHandler');
echo '<br>Succecssfully handled duplications<br>';
//END::Duplication Prevention
//START::Webform Attachements
if (!Vtiger_Utils::CheckTable('vtiger_webform_file_fields')) {
$db->pquery('CREATE TABLE IF NOT EXISTS vtiger_webform_file_fields(id INT(19) NOT NULL AUTO_INCREMENT, webformid INT(19) NOT NULL, fieldname VARCHAR(100) NOT NULL, fieldlabel VARCHAR(100) NOT NULL, required INT(1) NOT NULL DEFAULT 0, PRIMARY KEY (id), KEY fk_vtiger_webforms (webformid), CONSTRAINT fk_vtiger_webforms FOREIGN KEY (webformid) REFERENCES vtiger_webforms (id) ON DELETE CASCADE) ENGINE=InnoDB DEFAULT CHARSET=UTF8;', array());
}
$operationResult = $db->pquery('SELECT 1 FROM vtiger_ws_operation WHERE name=?', array('add_related'));
if (!$db->num_rows($operationResult)) {
$operationId = vtws_addWebserviceOperation('add_related', 'include/Webservices/AddRelated.php', 'vtws_add_related', 'POST');
vtws_addWebserviceOperationParam($operationId, 'sourceRecordId', 'string', 1);
vtws_addWebserviceOperationParam($operationId, 'relatedRecordId', 'string', 2);
vtws_addWebserviceOperationParam($operationId, 'relationIdLabel', 'string', 3);
}
echo '<br>Succecssfully added Webforms attachements<br>';
//END::Webform Attachements
//START::Tag fields are pointed to cf table for the modules Assets, Services etc..
$fieldName = 'tags';
$moduleModels = Vtiger_Module_Model::getAll();
foreach ($moduleModels as $moduleModel) {
$baseTableId = $moduleModel->basetableid;
if ($baseTableId) {
$baseTableName = $moduleModel->basetable;
$customTableName = $baseTableName.'cf';
$customTableColumns = $db->getColumnNames($customTableName);
if (in_array($fieldName, $customTableColumns)) {
$fieldModel = Vtiger_Field_Model::getInstance($fieldName, $moduleModel);
$db->pquery("UPDATE vtiger_field SET tablename=? WHERE fieldid=?", array($baseTableName, $fieldModel->id));
$db->pquery("ALTER TABLE $baseTableName ADD COLUMN $fieldName VARCHAR(1)", array());
$db->pquery("UPDATE $baseTableName, $customTableName SET $baseTableName.tags=$customTableName.tags WHERE $baseTableName.$baseTableId=$customTableName.$baseTableId", array());
$db->pquery("ALTER TABLE $customTableName DROP COLUMN $fieldName", array());
}
}
}
echo '<br>Succecssfully generalized tag fields<br>';
//END::Tag fields are pointed to cf table for the modules Assets, Services etc..
//START::Follow & unfollow features
$em = new VTEventsManager($db);
$em->registerHandler('vtiger.entity.aftersave', 'modules/Vtiger/handlers/FollowRecordHandler.php', 'FollowRecordHandler');
//END::Follow & unfollow features
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
//START::Reordering Timezones
$fieldName = 'time_zone';
$userModuleModel = Vtiger_Module_Model::getInstance('Users');
$fieldModel = Vtiger_Field_Model::getInstance($fieldName, $userModuleModel);
if ($fieldModel) {
$picklistValues = $fieldModel->getPicklistValues();
$utcTimezones = preg_grep('/\(UTC\)/', $picklistValues);
asort($utcTimezones);
$utcPlusTimezones = preg_grep('/\(UTC\+/', $picklistValues);
asort($utcPlusTimezones);
$utcMinusTimezones = preg_grep('/\(UTC\-/', $picklistValues);
arsort($utcMinusTimezones);
$timeZones = array_merge($utcMinusTimezones, $utcTimezones, $utcPlusTimezones);
$originalPicklistValues = array_flip(Vtiger_Util_Helper::getPickListValues($fieldName));
$orderedPicklists = array();
$i = 0;
foreach ($timeZones as $timeZone => $value) {
$orderedPicklists[$originalPicklistValues[$timeZone]] = $i++;
}
ksort($orderedPicklists);
$moduleModel = new Settings_Picklist_Module_Model();
$moduleModel->updateSequence($fieldName, $orderedPicklists);
echo '<br>Succecssfully reordered timezones<br>';
}
//END::Reordering Timezones
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
//START::Differentiate custom modules from Vtiger modules
$vtigerTabColumns = $db->getColumnNames('vtiger_tab');
if (!in_array('source', $vtigerTabColumns)) {
$db->pquery('ALTER TABLE vtiger_tab ADD COLUMN source VARCHAR(255) DEFAULT "custom"', array());
}
$db->pquery('UPDATE vtiger_tab SET source=NULL', array());
$pkgModules = array();
$pkgFolder = 'pkg/vtiger/modules';
$pkgHandle = opendir($pkgFolder);
if ($pkgHandle) {
while (($pkgModuleName = readdir($pkgHandle)) !== false) {
$pkgModules[$pkgModuleName] = $pkgModuleName;
$moduleHandle = opendir("$pkgFolder/$pkgModuleName");
while (($innerModuleName = readdir($moduleHandle)) !== false) {
if (is_dir("$pkgFolder/$pkgModuleName/$innerModuleName")) {
$pkgModules[$innerModuleName] = $innerModuleName;
}
}
closedir($moduleHandle);
}
closedir($pkgHandle);
$pkgModules = array_keys($pkgModules);
}
$db->pquery('UPDATE vtiger_tab SET source="custom" WHERE version IS NOT NULL AND name NOT IN ('.generateQuestionMarks($pkgModules).')', $pkgModules);
echo '<br>Succecssfully added source column vtiger tab table<br>';
//END::Differentiate custom modules from Vtiger modules

Satish
committed
//START::Google calendar sync settings
if (!Vtiger_Utils::CheckTable('vtiger_google_event_calendar_mapping')) {
$db->pquery('CREATE TABLE vtiger_google_event_calendar_mapping (event_id VARCHAR(255) DEFAULT NULL, calendar_id VARCHAR(255) DEFAULT NULL, user_id INT(11) NOT NULL) ENGINE=InnoDB DEFAULT CHARSET=utf8', array());

Satish
committed
echo '<br>Succecssfully vtiger_google_event_calendar_mapping table created<br>';
}
//END::Google calendar sync settings
//START::Centralize user field table for easy query with context of user across module
$generalUserFieldTable = 'vtiger_crmentity_user_field';
if (!Vtiger_Utils::CheckTable($generalUserFieldTable)) {
Vtiger_Utils::CreateTable($generalUserFieldTable,
'(`recordid` INT(19) NOT NULL,
`userid` INT(19) NOT NULL,
`starred` VARCHAR(100) DEFAULT NULL)', true);
}
if (Vtiger_Utils::CheckTable($generalUserFieldTable)) {
$indexRes = $db->pquery("SHOW INDEX FROM $generalUserFieldTable WHERE NON_UNIQUE=? AND KEY_NAME=?", array('1', 'record_user_idx'));
if ($db->num_rows($indexRes) < 2) {
$db->pquery('ALTER TABLE vtiger_crmentity_user_field ADD CONSTRAINT record_user_idx UNIQUE KEY(recordid, userid)', array());
}
$checkUserFieldConstraintExists = $db->pquery('SELECT DISTINCT 1 FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS WHERE table_name=? AND CONSTRAINT_SCHEMA=?', array($generalUserFieldTable, $db->dbName));
if ($db->num_rows($checkUserFieldConstraintExists) < 1) {
$db->pquery('ALTER TABLE vtiger_crmentity_user_field ADD CONSTRAINT `fk_vtiger_crmentity_user_field_recordid` FOREIGN KEY (`recordid`) REFERENCES `vtiger_crmentity`(`crmid`) ON DELETE CASCADE', array());
}
}
$migratedTables = array();
$userTableResult = $db->pquery('SELECT vtiger_tab.tabid, vtiger_tab.name, tablename, fieldid FROM vtiger_field INNER JOIN vtiger_tab ON vtiger_tab.tabid=vtiger_field.tabid WHERE fieldname=?', array('starred'));
while ($row = $db->fetch_array($userTableResult)) {
$fieldId = $row['fieldid'];
$moduleName = $row['name'];
$oldTableName = $row['tablename'];
$db->pquery('UPDATE vtiger_field SET tablename=? WHERE fieldid=? AND tablename=?', array($generalUserFieldTable, $fieldId, $oldTableName));
echo "Updated starred field for module $moduleName to point generic table => $generalUserFieldTable<br>";
if (Vtiger_Utils::CheckTable($oldTableName)) {
if (!in_array($oldTableName, $migratedTables)) {
if ($oldTableName != $generalUserFieldTable) {
//Insert entries from module specific table to generic table for follow up records
$db->pquery("INSERT INTO $generalUserFieldTable (recordid, userid, starred) (SELECT recordid,userid,starred FROM $oldTableName INNER JOIN vtiger_crmentity ON $oldTableName.recordid = vtiger_crmentity.crmid)", array());
echo "entries moved from $oldTableName to $generalUserFieldTable table<br>";
//Drop module specific user table
$db->pquery("DROP TABLE $oldTableName", array());
echo "module specific user field table $oldTableName has been dropped<br>";
array_push($migratedTables, $oldTableName);
}
}
}
}
echo '<br>Succesfully centralize user field table for easy query with context of user across module<br>';
//END::Centralize user field table for easy query with context of user across module
//START::Adding new parent TOOLS in menu
$appsList = array('Tools' => array('Rss', 'Portal', 'EmailTemplates', 'RecycleBin'));
foreach ($appsList as $appName => $appModules) {
$menuInstance = Vtiger_Menu::getInstance($appName);
foreach ($appModules as $moduleName) {
$moduleModel = Vtiger_Module_Model::getInstance($moduleName);
if ($moduleModel) {
Settings_MenuEditor_Module_Model::addModuleToApp($moduleName, $appName);
$menuInstance->addModule($moduleModel);

Satish
committed
}
$tabResult1 = $db->pquery('SELECT tabid, name, parent FROM vtiger_tab WHERE presence IN (?, ?) AND source=?', array(0, 2, 'custom'));
while ($row = $db->fetch_row($tabResult1)) {
$parentFromDb = $row['parent'];
if ($parentFromDb) {
$moduleName = $row['name'];
$parentTabs = explode(',', $parentFromDb);
foreach ($parentTabs as $parentTab) {
Settings_MenuEditor_Module_Model::addModuleToApp($moduleName, $parentTab);
}
$menuTab = $parentTabs[0];
$menuInstance = Vtiger_Menu::getInstance($menuTab);
if ($menuInstance) {
$moduleModel = Vtiger_Module_Model::getInstance($moduleName);
$menuInstance->addModule($moduleModel);
}
}
$tabResult2 = $db->pquery('SELECT tabid, name FROM vtiger_tab', array());
$moduleTabIds = array();
while ($row = $db->fetch_array($tabResult2)) {
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
$moduleTabIds[$row['name']] = $row['tabid'];
}
$defSequenceList = array(
'MARKETING' => array( $moduleTabIds['Campaigns'],
$moduleTabIds['Leads'],
$moduleTabIds['Contacts'],
$moduleTabIds['Accounts'],
),
'SALES' => array( $moduleTabIds['Potentials'],
$moduleTabIds['Quotes'],
$moduleTabIds['Products'],
$moduleTabIds['Services'],
$moduleTabIds['SMSNotifier'],
$moduleTabIds['Contacts'],
$moduleTabIds['Accounts']
),
'SUPPORT' => array( $moduleTabIds['HelpDesk'],
$moduleTabIds['Faq'],
$moduleTabIds['ServiceContracts'],
$moduleTabIds['Assets'],
$moduleTabIds['SMSNotifier'],
$moduleTabIds['Contacts'],
$moduleTabIds['Accounts']
),
'INVENTORY' => array( $moduleTabIds['Products'],
$moduleTabIds['Services'],
$moduleTabIds['PriceBooks'],
$moduleTabIds['Invoice'],
$moduleTabIds['SalesOrder'],
$moduleTabIds['PurchaseOrder'],
$moduleTabIds['Vendors'],
$moduleTabIds['Contacts'],
$moduleTabIds['Accounts']
),
'PROJECT' => array( $moduleTabIds['Project'],
$moduleTabIds['ProjectTask'],
$moduleTabIds['ProjectMilestone'],
$moduleTabIds['Contacts'],
$moduleTabIds['Accounts']
),
'TOOLS' => array( $moduleTabIds['EmailTemplates'],
$moduleTabIds['Rss'],
$moduleTabIds['Portal'],
$moduleTabIds['RecycleBin']
)
);
$db->pquery('DELETE FROM vtiger_app2tab WHERE appname=? AND tabid IN (?, ?, ?)', array('SUPPORT', $moduleTabIds['Project'], $moduleTabIds['ProjectTask'], $moduleTabIds['ProjectMilestone']));
$db->pquery('DELETE FROM vtiger_app2tab WHERE appname=? AND tabid=?', array('INVENTORY', $moduleTabIds['Assets']));
foreach ($defSequenceList as $appName => $tabIdsList) {
$appTabResult1 = $db->pquery('SELECT tabid FROM vtiger_app2tab WHERE appname=? AND tabid NOT IN ('.generateQuestionMarks($tabIdsList).')', array($appName, $tabIdsList));
while ($row = $db->fetch_array($appTabResult1)) {
$defSequenceList[$appName][] = $row['tabid'];
}
}
foreach ($defSequenceList as $appName => $tabIdsList) {
foreach ($tabIdsList as $seq => $tabId) {
$appTabResult2 = $db->pquery('SELECT 1 FROM vtiger_app2tab WHERE tabid=? AND appname=?', array($tabId, $appName));
$params = array($seq+1, $tabId, $appName);
if ($db->num_rows($appTabResult2)) {
$query = 'UPDATE vtiger_app2tab SET sequence=? WHERE tabid=? AND appname=?';
} else {
$query = 'INSERT INTO vtiger_app2tab(sequence,tabid,appname) VALUES(?,?,?)';
}
$db->pquery($query, $params);
}
}
echo '<br>Succesfully added RSS, Email Templates for new parent TOOLS<br>';
//END::Adding new parent TOOLS in menu
//START::Supporting to store dashboard size
$dashboardWidgetColumns = $db->getColumnNames('vtiger_module_dashboard_widgets');
if (!in_array('size', $dashboardWidgetColumns)) {
$db->pquery('ALTER TABLE vtiger_module_dashboard_widgets ADD COLUMN size VARCHAR(50)', array());
}
//END::Supporting to store dashboard size
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
//START:Profile save failures because of Reports module
$query = 'SELECT DISTINCT profileid FROM vtiger_profile';
$result = $adb->pquery($query, array());
$tabIdsList = array(getTabid('Reports'));
$actionIdPerms = array( 0 => 1,//Save
1 => 1,//EditView
2 => 1,//Delete
3 => 0,//Index
4 => 0,//DetailView
7 => 1);//CreateView
for ($i=0; $i<$adb->num_rows($result); $i++) {
$profileId = $adb->query_result($result, $i, 'profileid');
foreach ($tabIdsList as $tabId) {
foreach ($actionIdPerms as $actionId => $permission) {
$isExist = $adb->pquery('SELECT 1 FROM vtiger_profile2standardpermissions WHERE profileid=? AND tabid=? AND operation=?', array($profileId, $tabId, $actionId));
if ($adb->num_rows($isExist)) {
$query = 'UPDATE vtiger_profile2standardpermissions SET permissions=? WHERE profileid=? AND tabid=? AND operation=?';
} else {
$query = 'INSERT INTO vtiger_profile2standardpermissions(permissions, profileid, tabid, operation) VALUES (?, ?, ?, ?)';
}
$db->pquery($query, array($actionIdPerms[$actionId], $profileId, $tabId, $actionId));
}
}
}
//END:Profile save failures because of Reports module
//Update existing package modules
Install_Utils_Model::installModules();
echo '<br>Succecssfully vtiger version updated to <b>7.1.0</b><br>';