From 80fe38adcbc31343b770efc4c3ea6b9a880851a5 Mon Sep 17 00:00:00 2001
From: satish <satish.dvnk@vtiger.com>
Date: Wed, 8 Feb 2017 14:59:35 +0530
Subject: [PATCH] Fixes #437 - Issue with Migration script design
 660_to_700.php

---
 modules/Migration/schema/660_to_700.php | 129 ++++++++++++++++--------
 1 file changed, 85 insertions(+), 44 deletions(-)

diff --git a/modules/Migration/schema/660_to_700.php b/modules/Migration/schema/660_to_700.php
index 79e9fd958..1d592c7e2 100644
--- a/modules/Migration/schema/660_to_700.php
+++ b/modules/Migration/schema/660_to_700.php
@@ -348,6 +348,19 @@ if(defined('VTIGER_UPGRADE')) {
 		$db->pquery('ALTER TABLE vtiger_modcomments MODIFY userid INT(19)', array());
 	}
 
+	$columns = $db->getColumnNames('vtiger_emailtemplates');
+	if (!in_array('systemtemplate', $columns)) {
+		$db->pquery('ALTER TABLE vtiger_emailtemplates ADD COLUMN systemtemplate INT(1) NOT NULL DEFAULT 0', array());
+	}
+	if (!in_array('templatepath', $columns)) {
+		$db->pquery('ALTER TABLE vtiger_emailtemplates ADD COLUMN templatepath VARCHAR(100) AFTER templatename', array());
+	}
+	if (!in_array('module', $columns)) {
+		$db->pquery('ALTER TABLE vtiger_emailtemplates ADD COLUMN module VARCHAR(100)', array());
+	}
+	$db->pquery('UPDATE vtiger_emailtemplates SET module=? WHERE templatename IN (?,?,?) AND module IS NULL', array('Events', 'ToDo Reminder', 'Activity Reminder', 'Invite Users'));
+	$db->pquery('UPDATE vtiger_emailtemplates SET module=? WHERE module IS NULL', array('Contacts'));
+
 	$moduleName = 'Calendar';
 	$inviteUsersTemplate = $db->pquery('SELECT 1 FROM vtiger_emailtemplates WHERE subject=?', array('Invitation'));
 	if (!$db->num_rows($inviteUsersTemplate)) {
@@ -453,19 +466,35 @@ if(defined('VTIGER_UPGRADE')) {
 			$blockInstance->addField($fieldInstance);
 		}
 	}
-	$commentIds = array();
+
 	$internalCommentModules = Vtiger_Functions::getPrivateCommentModules();
-	$commentsResult = $db->pquery('SELECT vtiger_modcomments.modcommentsid FROM vtiger_modcomments 
+	$lastMaxCRMId = 0;
+	do {
+		$commentsResult = $db->pquery('SELECT vtiger_modcomments.modcommentsid FROM vtiger_modcomments 
 												LEFT JOIN vtiger_crmentity ON vtiger_crmentity.crmid = vtiger_modcomments.related_to 
 												WHERE vtiger_crmentity.setype NOT IN ('.generateQuestionMarks($internalCommentModules).') 
-												OR vtiger_crmentity.setype IS NULL', $internalCommentModules, array());
-	$commentCount = $db->num_rows($commentsResult);
-	for ($i=0; $i<$commentCount; $i++) {
-		$commentIds[] = $db->query_result($commentsResult, $i, 'modcommentsid');
-	}
-	if (count($commentIds) > 0) {
-		$db->pquery('UPDATE vtiger_modcomments SET is_private = 0 WHERE modcommentsid IN ('.generateQuestionMarks($commentIds).')', $commentIds);
-	}
+												OR vtiger_crmentity.setype IS NULL modcommentsid > ? LIMIT 500', array_merge($internalCommentModules, array($lastMaxCRMId)));
+		if (!$db->num_rows($result)) {
+			break;
+		}
+
+		$commentIds = array();
+		while ($row = $db->fetch_array($commentsResult)) {
+			$commentIds[] = $row['modcommentsid'];
+		}
+
+		if (count($commentIds) > 0) {
+			$db->pquery('UPDATE vtiger_modcomments SET is_private = 0 WHERE modcommentsid IN ('.generateQuestionMarks($commentIds).')', $commentIds);
+		}
+
+		$commentId = end($commentIds);
+		if (intval($commentId) > $lastMaxCRMId) {
+			$lastMaxCRMId = intval($commentId);
+		}
+		$commentsResult = NULL;
+		unset($commentsResult);
+	} while (true);
+	
 	//Start - Add Contact Name to Default filter of project
 	$cvidQuery = $db->pquery('SELECT cvid FROM vtiger_customview where viewname=? AND entitytype=?', array('All', 'Project'));
 	$row = $db->fetch_array($cvidQuery);
@@ -580,7 +609,8 @@ if(defined('VTIGER_UPGRADE')) {
 	if (Vtiger_Utils::CheckTable('vtiger_customerportal_tabs')) {
 		$db->pquery('UPDATE vtiger_customerportal_tabs SET visible=? WHERE tabid IN(?,?)', array(0, getTabid('Contacts'), getTabid('Accounts')));
 		$moduleId = getTabid('ServiceContracts');
-		$sequenceQuery = 'SELECT max(sequence) as sequence FROM vtiger_customerportal_tabs';
+		$db->pquery('DELETE FROM vtiger_customerportal_tabs WHERE tabid=?', array($moduleId));
+		$sequenceQuery = 'SELECT max(sequence) AS sequence FROM vtiger_customerportal_tabs';
 		$seqResult = $db->pquery($sequenceQuery, array());
 		$sequence = $db->query_result($seqResult, 0, 'sequence');
 		$db->pquery('INSERT INTO vtiger_customerportal_tabs(tabid,visible,sequence) VALUES (?,?,?)', array($moduleId, 1, $sequence+11));
@@ -872,8 +902,14 @@ if(defined('VTIGER_UPGRADE')) {
 		}
 	}
 
-	$db->pquery('ALTER TABLE vtiger_crmentityrel ADD INDEX crmid_idx(crmid)', array());
-	$db->pquery('ALTER TABLE vtiger_crmentityrel ADD INDEX relcrmid_idx(relcrmid)', array());
+	$result = $db->pquery('SHOW INDEX FROM vtiger_crmentityrel WHERE key_name=?', array('crmid_idx'));
+	if (!$db->num_rows($result)) {
+		$db->pquery('ALTER TABLE vtiger_crmentityrel ADD INDEX crmid_idx(crmid)', array());
+	}
+	$result = $db->pquery('SHOW INDEX FROM vtiger_crmentityrel WHERE key_name=?', array('relcrmid_idx'));
+	if (!$db->num_rows($result)) {
+		$db->pquery('ALTER TABLE vtiger_crmentityrel ADD INDEX relcrmid_idx(relcrmid)', array());
+	}
 
 	//Start : Inactivate update_log field from ticket module
 	$fieldId = getFieldid(getTabid('HelpDesk'), 'update_log');
@@ -1322,9 +1358,10 @@ if(defined('VTIGER_UPGRADE')) {
 	//Workflows
 	$columns = $db->getColumnNames('com_vtiger_workflows');
 	if (in_array('status', $columns)) {
-		$db->pquery('ALTER TABLE com_vtiger_workflows ADD COLUMN status SET DEFAULT 1', array());
+		$db->pquery('ALTER TABLE com_vtiger_workflows MODIFY COLUMN status INT(11)', array());
+		$db->pquery('ALTER TABLE com_vtiger_workflows ALTER COLUMN status SET DEFAULT 1', array());
+		$db->pquery('UPDATE com_vtiger_workflows SET status=? WHERE status IS NULL', array(1));
 	}
-	$db->pquery('UPDATE com_vtiger_workflows SET status=? WHERE status IS NULL', array(1));
 
 	if (!in_array('workflowname', $columns)) {
 		$db->pquery('ALTER TABLE com_vtiger_workflows ADD COLUMN workflowname VARCHAR(100)', array());
@@ -1472,6 +1509,7 @@ if(defined('VTIGER_UPGRADE')) {
 		}
 
 		$tablesList = array('quoteid' => 'vtiger_quotes', 'purchaseorderid' => 'vtiger_purchaseorder', 'salesorderid' => 'vtiger_salesorder', 'invoiceid' => 'vtiger_invoice');
+		$isResultExists = false;
 
 		$query = 'INSERT INTO vtiger_inventorychargesrel VALUES';
 		foreach ($tablesList as $index => $tableName) {
@@ -1480,6 +1518,7 @@ if(defined('VTIGER_UPGRADE')) {
 
 			$result = $db->pquery($sql, array());
 			while ($rowData = $db->fetch_array($result)) {
+				$isResultExists = true;
 				$recordId = $rowData['id'];
 
 				$taxesList = array();
@@ -1490,25 +1529,36 @@ if(defined('VTIGER_UPGRADE')) {
 				$query .= "($recordId, '".Zend_Json::encode(array(1 => array('value' => $rowData['s_h_amount'], 'taxes' => $taxesList)))."'), ";
 			}
 		}
-		$db->pquery(rtrim($query, ', '), array());
+		if ($isResultExists) {
+			$db->pquery(rtrim($query, ', '), array());
+		}
 	}
 
 	//Updating existing tax tables
 	$taxTablesList = array('vtiger_inventorytaxinfo', 'vtiger_shippingtaxinfo');
 	foreach ($taxTablesList as $taxTable) {
-		$sql = "ALTER TABLE $taxTable ADD (
-					method VARCHAR(10),
-					type VARCHAR(10),
-					compoundon VARCHAR(400),
-					regions TEXT
-				)";
-		$db->pquery($sql, array());
+		$columns = $db->getColumnNames($taxTable);
+		if (!in_array('method', $columns)) {
+			$db->pquery("ALTER TABLE $taxTable ADD COLUMN method VARCHAR(10)", array());
+		}
+		if (!in_array('type', $columns)) {
+			$db->pquery("ALTER TABLE $taxTable ADD COLUMN type VARCHAR(10)", array());
+		}
+		if (!in_array('compoundon', $columns)) {
+			$db->pquery("ALTER TABLE $taxTable ADD COLUMN compoundon VARCHAR(400)", array());
+		}
+		if (!in_array('regions', $columns)) {
+			$db->pquery("ALTER TABLE $taxTable ADD COLUMN regions TEXT", array());
+		}
 
 		$db->pquery("UPDATE $taxTable SET method =?, type=?, compoundon=?, regions=?", array('Simple', 'Fixed', '[]', '[]'));
 	}
 
 	//Updating existing tax tables
-	$db->pquery('ALTER TABLE vtiger_producttaxrel ADD regions TEXT', array());
+	$columns = $db->getColumnNames('vtiger_producttaxrel');
+	if (!in_array('regions', $columns)) {
+		$db->pquery('ALTER TABLE vtiger_producttaxrel ADD COLUMN regions TEXT', array());
+	}
 	$db->pquery('UPDATE vtiger_producttaxrel SET regions=?', array('[]'));
 
 	$modulesList = array('Quotes' => 'vtiger_quotes', 'PurchaseOrder' => 'vtiger_purchaseorder', 'SalesOrder' => 'vtiger_salesorder', 'Invoice' => 'vtiger_invoice');
@@ -1516,7 +1566,10 @@ if(defined('VTIGER_UPGRADE')) {
 
 	foreach ($modulesList as $moduleName => $tableName) {
 		//Updating existing inventory tax tables
-		$db->pquery('ALTER TABLE '.$tableName.' ADD compound_taxes_info TEXT', array());
+		$columns = $db->getColumnNames($tableName);
+		if (!in_array('compound_taxes_info', $columns)) {
+			$db->pquery("ALTER TABLE $tableName ADD COLUMN compound_taxes_info TEXT", array());
+		}
 		$db->pquery('UPDATE '.$tableName.' SET compound_taxes_info=?', array('[]'));
 
 		//creating new field in entity tables
@@ -1662,16 +1715,17 @@ if(defined('VTIGER_UPGRADE')) {
 		$menuEditorModuleModel->addModuleToApp('Quotes', 'MARKETING');
 	}
 
-	$db->pquery('ALTER TABLE vtiger_cvstdfilter DROP FOREIGN KEY fk_1_vtiger_cvstdfilter', array());
 	$db->pquery('ALTER TABLE vtiger_cvstdfilter DROP PRIMARY KEY', array());
 	$db->pquery('ALTER TABLE vtiger_cvstdfilter DROP KEY cvstdfilter_cvid_idx', array());
-	$keyResult = $db->pquery("show index from vtiger_cvstdfilter where key_name ='fk_1_vtiger_cvstdfilter'", array());
-	if ($db->num_rows($keyResult) <= 0) {
-		$db->pquery('ALTER TABLE vtiger_cvstdfilter ADD CONSTRAINT fk_1_vtiger_cvstdfilter FOREIGN KEY (cvid) REFERENCES vtiger_customview(cvid) ON DELETE CASCADE', array());
+
+	$keyResult = $db->pquery("SHOW INDEX FROM vtiger_cvstdfilter WHERE key_name='fk_1_vtiger_cvstdfilter'", array());
+	if ($db->num_rows($keyResult)) {
+		$db->pquery('ALTER TABLE vtiger_cvstdfilter DROP FOREIGN KEY fk_1_vtiger_cvstdfilter', array());
 	}
+	$db->pquery('ALTER TABLE vtiger_cvstdfilter ADD CONSTRAINT fk_1_vtiger_cvstdfilter FOREIGN KEY (cvid) REFERENCES vtiger_customview(cvid) ON DELETE CASCADE', array());
 
-	$keyResult = $db->pquery("show index from vtiger_app2tab where key_name ='vtiger_app2tab_fk_tab'", array());
-	if ($db->num_rows($keyResult) <= 0) {
+	$keyResult = $db->pquery("SHOW INDEX FROM vtiger_app2tab WHERE key_name='vtiger_app2tab_fk_tab'", array());
+	if (!$db->num_rows($keyResult)) {
 		$db->pquery('ALTER TABLE vtiger_app2tab ADD CONSTRAINT vtiger_app2tab_fk_tab FOREIGN KEY(tabid) REFERENCES vtiger_tab(tabid) ON DELETE CASCADE', array());
 	}
 
@@ -1757,19 +1811,6 @@ if(defined('VTIGER_UPGRADE')) {
 
 	$db->pquery('DELETE FROM vtiger_links WHERE linktype=? AND handler_class=?', array('DETAILVIEWBASIC', 'Documents'));
 
-	$columns = $db->getColumnNames('vtiger_emailtemplates');
-	if (!in_array('systemtemplate', $columns)) {
-		$db->pquery('ALTER TABLE vtiger_emailtemplates ADD COLUMN systemtemplate INT(1) NOT NULL DEFAULT 0', array());
-	}
-	if (!in_array('templatepath', $columns)) {
-		$db->pquery('ALTER TABLE vtiger_emailtemplates ADD COLUMN templatepath VARCHAR(100) AFTER templatename', array());
-	}
-	if (!in_array('module', $columns)) {
-		$db->pquery('ALTER TABLE vtiger_emailtemplates ADD COLUMN module VARCHAR(100)', array());
-	}
-	$db->pquery('UPDATE vtiger_emailtemplates SET module=? WHERE templatename IN (?,?,?) AND module IS NULL', array('Events', 'ToDo Reminder', 'Activity Reminder', 'Invite Users'));
-	$db->pquery('UPDATE vtiger_emailtemplates SET module=? WHERE module IS NULL', array('Contacts'));
-
 	$columns = $db->getColumnNames('vtiger_mailmanager_mailrecord');
 	if (!in_array('mfolder', $columns)) {
 		$db->pquery('ALTER TABLE vtiger_mailmanager_mailrecord ADD COLUMN mfolder VARCHAR(250)', array());
-- 
GitLab