Merge pull request #4142 from jitendrapurohit/Webtest4.5.0
[civicrm-core.git] / CRM / Upgrade / Incremental / php / FourFive.php
CommitLineData
296342b1
OB
1<?php
2/*
3 +--------------------------------------------------------------------+
06b69b18 4 | CiviCRM version 4.5 |
296342b1 5 +--------------------------------------------------------------------+
06b69b18 6 | Copyright CiviCRM LLC (c) 2004-2014 |
296342b1
OB
7 +--------------------------------------------------------------------+
8 | This file is a part of CiviCRM. |
9 | |
10 | CiviCRM is free software; you can copy, modify, and distribute it |
11 | under the terms of the GNU Affero General Public License |
12 | Version 3, 19 November 2007. |
13 | |
14 | CiviCRM is distributed in the hope that it will be useful, but |
15 | WITHOUT ANY WARRANTY; without even the implied warranty of |
16 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. |
17 | See the GNU Affero General Public License for more details. |
18 | |
19 | You should have received a copy of the GNU Affero General Public |
20 | License along with this program; if not, contact CiviCRM LLC |
21 | at info[AT]civicrm[DOT]org. If you have questions about the |
22 | GNU Affero General Public License or the licensing of CiviCRM, |
23 | see the CiviCRM license FAQ at http://civicrm.org/licensing |
24 +--------------------------------------------------------------------+
25*/
26
27/**
28 *
29 * @package CRM
06b69b18 30 * @copyright CiviCRM LLC (c) 2004-2014
296342b1
OB
31 * $Id$
32 *
33 */
34class CRM_Upgrade_Incremental_php_FourFive {
35 const BATCH_SIZE = 5000;
36
624e56fa
EM
37 /**
38 * @param $errors
39 *
40 * @return bool
41 */
296342b1
OB
42 function verifyPreDBstate(&$errors) {
43 return TRUE;
44 }
45
46 /**
47 * Compute any messages which should be displayed beforeupgrade
48 *
49 * Note: This function is called iteratively for each upcoming
50 * revision to the database.
51 *
d0f74b53 52 * @param $preUpgradeMessage
296342b1 53 * @param $rev string, a version number, e.g. '4.4.alpha1', '4.4.beta3', '4.4.0'
d0f74b53
EM
54 * @param null $currentVer
55 *
56 * @internal param string $postUpgradeMessage , alterable
296342b1
OB
57 * @return void
58 */
59 function setPreUpgradeMessage(&$preUpgradeMessage, $rev, $currentVer = NULL) {
60 }
61
62 /**
63 * Compute any messages which should be displayed after upgrade
64 *
65 * @param $postUpgradeMessage string, alterable
66 * @param $rev string, an intermediate version; note that setPostUpgradeMessage is called repeatedly with different $revs
67 * @return void
68 */
69 function setPostUpgradeMessage(&$postUpgradeMessage, $rev) {
1421174e 70 if ($rev == '4.5.alpha1') {
e2cd07fc 71 $postUpgradeMessage .= '<br /><br />' . ts('Default versions of the following System Workflow Message Templates have been modified to handle new functionality: <ul><li>Contributions - Receipt (off-line)</li><li>Contributions - Receipt (on-line)</li><li>Contributions - Recurring Start and End Notification</li><li>Contributions - Recurring Updates</li><li>Memberships - Receipt (on-line)</li><li>Memberships - Signup and Renewal Receipts (off-line)</li><li>Pledges - Acknowledgement</li></ul> If you have modified these templates, please review the new default versions and implement updates as needed to your copies (Administer > Communications > Message Templates > System Workflow Messages). (<a href="%1">learn more...</a>)', array(1 => 'http://wiki.civicrm.org/confluence/display/CRMDOC/Updating+System+Workflow+Message+Templates+after+Upgrades+-+method+1+-+kdiff'));
b05a0fb6 72 $postUpgradeMessage .= '<br /><br />' . ts('This release allows you to view and edit multiple-record custom field sets in a table format which will be more usable in some cases. You can try out the format by navigating to Administer > Custom Data & Screens > Custom Fields. Click Settings for a custom field set and change Display Style to "Tab with Tables".');
03390e26 73 $postUpgradeMessage .= '<br /><br />' . ts('This release changes the way that anonymous event registrations match participants with existing contacts. By default, all event participants will be matched with existing individuals using the Unsupervised rule, even if multiple registrations with the same email address are allowed. However, you can now select a different matching rule to use for each event. Please review your events to make sure you choose the appropriate matching rule and collect sufficient information for it to match contacts.');
1421174e 74 }
7c3d751c
DG
75 if ($rev == '4.5.beta2') {
76 $postUpgradeMessage .= '<br /><br />' . ts('If you use CiviMail for newsletters or other communications, check out the new sample CiviMail templates which use responsive design to optimize display on mobile devices (Administer > Communications > Message Templates ).');
77 }
296342b1
OB
78 }
79
624e56fa
EM
80 /**
81 * @param $rev
82 *
83 * @return bool
84 */
296342b1
OB
85 function upgrade_4_5_alpha1($rev) {
86 // task to process sql
3182e644 87 $this->addTask(ts('Migrate honoree information to module_data'), 'migrateHonoreeInfo');
296342b1 88 $this->addTask(ts('Upgrade DB to 4.5.alpha1: SQL'), 'task_4_5_x_runSql', $rev);
8b49cb50
OB
89 $this->addTask(ts('Set default for Individual name fields configuration'), 'addNameFieldOptions');
90
64542f7e
PJ
91 // CRM-14522 - The below schema checking is done as foreign key name
92 // for pdf_format_id column varies for different databases
93 // if DB is been into upgrade for 3.4.2 version, it would have pdf_format_id name for FK
94 // else FK_civicrm_msg_template_pdf_format_id
95 $config = CRM_Core_Config::singleton();
96 $dbUf = DB::parseDSN($config->dsn);
97 $query = "
98SELECT CONSTRAINT_NAME FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS
99WHERE TABLE_NAME = 'civicrm_msg_template'
100AND CONSTRAINT_TYPE = 'FOREIGN KEY'
101AND TABLE_SCHEMA = %1
102";
103 $params = array(1 => array($dbUf['database'], 'String'));
104 $dao = CRM_Core_DAO::executeQuery($query, $params, TRUE, NULL, FALSE, FALSE);
105 if ($dao->fetch()) {
106 if ($dao->CONSTRAINT_NAME == 'FK_civicrm_msg_template_pdf_format_id' ||
107 $dao->CONSTRAINT_NAME == 'pdf_format_id') {
108 $sqlDropFK = "ALTER TABLE `civicrm_msg_template`
109DROP FOREIGN KEY `{$dao->CONSTRAINT_NAME}`,
110DROP KEY `{$dao->CONSTRAINT_NAME}`";
111 CRM_Core_DAO::executeQuery($sqlDropFK, CRM_Core_DAO::$_nullArray, TRUE, NULL, FALSE, FALSE);
112 }
113 }
114
8b49cb50
OB
115 return TRUE;
116 }
117
f49da658
PN
118 /**
119 * @param $rev
120 *
121 * @return bool
122 */
123 function upgrade_4_5_beta9($rev) {
124 $this->addTask(ts('Upgrade DB to 4.5.beta9: SQL'), 'task_4_5_x_runSql', $rev);
125
15ed8da7
PN
126 $entityTable = array(
127 'Participant' => 'civicrm_participant_payment',
17ea44da 128 'Contribution' => 'civicrm_contribution',
15ed8da7
PN
129 'Membership' => 'civicrm_membership',
130 );
f49da658 131
15ed8da7
PN
132 foreach ($entityTable as $label => $tableName) {
133 list($minId, $maxId) = CRM_Core_DAO::executeQuery("SELECT coalesce(min(id),0), coalesce(max(id),0)
134 FROM {$tableName}")->getDatabaseResult()->fetchRow();
135 for ($startId = $minId; $startId <= $maxId; $startId += self::BATCH_SIZE) {
136 $endId = $startId + self::BATCH_SIZE - 1;
137 $title = ts("Upgrade DB to 4.5.beta9: Fix line items for {$label} (%1 => %2)", array(1 => $startId, 2 => $endId));
138 $this->addTask($title, 'task_4_5_0_fixLineItem', $startId, $endId, $label);
139 }
140 }
f49da658
PN
141 return TRUE;
142 }
143
144 /**
145 * (Queue Task Callback)
146 *
147 * Function to update the line items
148 *
149 *
150 * @param CRM_Queue_TaskContext $ctx
151 * @param $startId int, the first/lowest entity ID to convert
152 * @param $endId int, the last/highest entity ID to convert
153 * @param
154 *
155 * @return bool
156 */
157 static function task_4_5_0_fixLineItem(CRM_Queue_TaskContext $ctx, $startId, $endId, $entityTable) {
158
159 $sqlParams = array(
160 1 => array($startId, 'Integer'),
161 2 => array($endId, 'Integer'),
162 );
163 switch ($entityTable) {
15ed8da7 164 case 'Contribution':
f49da658 165 // update all the line item entity_table and entity_id with contribution due to bug CRM-15055
17ea44da
PN
166 CRM_Core_DAO::executeQuery("UPDATE civicrm_line_item li
167 INNER JOIN civicrm_contribution cc ON cc.id = li.contribution_id
168 SET entity_id = li.contribution_id, entity_table = 'civicrm_contribution'
169 WHERE li.contribution_id IS NOT NULL AND li.entity_table <> 'civicrm_participant' AND (cc.id BETWEEN %1 AND %2)", $sqlParams);
f49da658
PN
170
171 // update the civicrm_line_item.contribution_id
17ea44da
PN
172 CRM_Core_DAO::executeQuery("UPDATE civicrm_line_item li
173 INNER JOIN civicrm_contribution cc ON cc.id = li.entity_id
f49da658 174 SET contribution_id = entity_id
17ea44da 175 WHERE li.contribution_id IS NULL AND li.entity_table = 'civicrm_contribution' AND (cc.id BETWEEN %1 AND %2)", $sqlParams);
f49da658
PN
176 break;
177
15ed8da7 178 case 'Participant':
f49da658
PN
179 // update the civicrm_line_item.contribution_id
180 CRM_Core_DAO::executeQuery("UPDATE civicrm_line_item li
181 INNER JOIN civicrm_participant_payment pp ON pp.participant_id = li.entity_id
182 SET li.contribution_id = pp.contribution_id
17ea44da 183 WHERE li.entity_table = 'civicrm_participant' AND li.contribution_id IS NULL AND (pp.id BETWEEN %1 AND %2)", $sqlParams);
f49da658
PN
184 break;
185
15ed8da7 186 case 'Membership':
f49da658
PN
187 $upgrade = new CRM_Upgrade_Form();
188 // update the line item of membership
189 CRM_Core_DAO::executeQuery("UPDATE civicrm_line_item li
190 INNER JOIN civicrm_membership_payment mp ON mp.contribution_id = li.contribution_id
191 INNER JOIN civicrm_membership cm ON mp.membership_id = cm.id
192 INNER JOIN civicrm_price_field_value pv ON pv.id = li.price_field_value_id
193 SET li.entity_table = 'civicrm_membership', li.entity_id = mp.membership_id
194 WHERE li.entity_table = 'civicrm_contribution'
17ea44da 195 AND pv.membership_type_id IS NOT NULL AND cm.membership_type_id = pv.membership_type_id AND (cm.id BETWEEN %1 AND %2)", $sqlParams);
f49da658
PN
196
197 CRM_Core_DAO::executeQuery("UPDATE civicrm_line_item li
198 INNER JOIN civicrm_membership_payment mp ON mp.contribution_id = li.contribution_id
199 INNER JOIN civicrm_price_field_value pv ON pv.id = li.price_field_value_id
200 SET li.entity_table = 'civicrm_membership', li.entity_id = mp.membership_id
201 WHERE li.entity_table = 'civicrm_contribution'
17ea44da 202 AND pv.membership_type_id IS NOT NULL AND (mp.membership_id BETWEEN %1 AND %2)", $sqlParams);
f49da658 203
17ea44da 204 CRM_Core_DAO::executeQuery("INSERT INTO civicrm_line_item (entity_table, entity_id, price_field_id, label,
f49da658
PN
205 qty, unit_price, line_total, price_field_value_id, financial_type_id)
206 SELECT 'civicrm_membership', cm.id, cpf.id price_field_id, cpfv.label, 1 as qty, cpfv.amount, cpfv.amount line_total,
207 cpfv.id price_field_value_id, cpfv.financial_type_id FROM civicrm_membership cm
208 LEFT JOIN civicrm_membership_payment cmp ON cmp.membership_id = cm.id
17ea44da
PN
209 INNER JOIN civicrm_price_field_value cpfv ON cpfv.membership_type_id = cm.membership_type_id
210 INNER JOIN civicrm_price_field cpf ON cpf.id = cpfv.price_field_id
211 INNER JOIN civicrm_price_set cps ON cps.id = cpf.price_set_id
f49da658
PN
212 WHERE cmp.contribution_id IS NULL AND cps.name = 'default_membership_type_amount' AND (cm.id BETWEEN %1 AND %2)", $sqlParams);
213 break;
214 }
215 return TRUE;
216 }
217
8b49cb50
OB
218 /**
219 * Add defaults for the newly introduced name fields configuration in 'contact_edit_options' setting
220 *
d0f74b53
EM
221 * @param CRM_Queue_TaskContext $ctx
222 *
8b49cb50
OB
223 * @return bool TRUE for success
224 */
225 static function addNameFieldOptions(CRM_Queue_TaskContext $ctx) {
226 $query = "SELECT `value` FROM `civicrm_setting` WHERE `group_name` = 'CiviCRM Preferences' AND `name` = 'contact_edit_options'";
227 $dao = CRM_Core_DAO::executeQuery($query);
228 $dao->fetch();
229 $oldValue = unserialize($dao->value);
230
231 $newValue = $oldValue . '12\ 114\ 115\ 116\ 117\ 1';
232
233 $query = "UPDATE `civicrm_setting` SET `value` = %1 WHERE `group_name` = 'CiviCRM Preferences' AND `name` = 'contact_edit_options'";
234 $params = array(1 => array(serialize($newValue), 'String'));
235 CRM_Core_DAO::executeQuery($query, $params);
236
296342b1
OB
237 return TRUE;
238 }
239
3182e644 240 /**
241 * Migrate honoree information to uf_join.module_data as honoree columns (text and title) will be dropped
242 * on DB upgrade
243 *
244 * @param CRM_Queue_TaskContext $ctx
245 *
246 * @return bool TRUE for success
247 */
248 static function migrateHonoreeInfo(CRM_Queue_TaskContext $ctx) {
249 $query = "ALTER TABLE `civicrm_uf_join`
250 ADD COLUMN `module_data` longtext COMMENT 'Json serialized array of data used by the ufjoin.module'";
251 CRM_Core_DAO::executeQuery($query);
252
253 $honorTypes = array_keys(CRM_Core_OptionGroup::values('honor_type'));
254 $ufGroupDAO = new CRM_Core_DAO_UFGroup();
255 $ufGroupDAO->name = 'new_individual';
256 $ufGroupDAO->find(TRUE);
257
258 $query = "SELECT * FROM civicrm_contribution_page";
259 $dao = CRM_Core_DAO::executeQuery($query);
260
261 if ($dao->N) {
262 $domain = new CRM_Core_DAO_Domain;
263 $domain->find(TRUE);
264 while ($dao->fetch()) {
265 $honorParams = array('soft_credit' => array('soft_credit_types' => $honorTypes));
266 if ($domain->locales) {
267 $locales = explode(CRM_Core_DAO::VALUE_SEPARATOR, $domain->locales);
268 foreach ($locales as $locale) {
269 $honor_block_title = "honor_block_title_{$locale}";
270 $honor_block_text = "honor_block_text_{$locale}";
271 $honorParams['soft_credit'] += array(
272 $locale => array(
273 'honor_block_title' => $dao->$honor_block_title,
274 'honor_block_text' => $dao->$honor_block_text,
275 ),
276 );
277 }
278 }
279 else {
280 $honorParams['soft_credit'] += array(
281 'default' => array(
282 'honor_block_title' => $dao->honor_block_title,
283 'honor_block_text' => $dao->honor_block_text,
284 ),
285 );
286 }
287 $ufJoinParam = array(
288 'module' => 'soft_credit',
289 'entity_table' => 'civicrm_contribution_page',
290 'is_active' => $dao->honor_block_is_active,
291 'entity_id' => $dao->id,
292 'uf_group_id' => $ufGroupDAO->id,
293 'module_data' => json_encode($honorParams),
294 );
295 CRM_Core_BAO_UFJoin::create($ufJoinParam);
296 }
297 }
298
299 return TRUE;
300 }
301
296342b1
OB
302 /**
303 * (Queue Task Callback)
304 */
305 static function task_4_5_x_runSql(CRM_Queue_TaskContext $ctx, $rev) {
306 $upgrade = new CRM_Upgrade_Form();
307 $upgrade->processSQL($rev);
308
309 return TRUE;
310 }
311
312 /**
d0f74b53 313 * Syntactic sugar for adding a task which (a) is in this class and (b) has
296342b1
OB
314 * a high priority.
315 *
316 * After passing the $funcName, you can also pass parameters that will go to
317 * the function. Note that all params must be serializable.
318 */
319 protected function addTask($title, $funcName) {
320 $queue = CRM_Queue_Service::singleton()->load(array(
321 'type' => 'Sql',
322 'name' => CRM_Upgrade_Form::QUEUE_NAME,
323 ));
324
325 $args = func_get_args();
326 $title = array_shift($args);
327 $funcName = array_shift($args);
328 $task = new CRM_Queue_Task(
329 array(get_class($this), $funcName),
330 $args,
331 $title
332 );
333 $queue->createItem($task, array('weight' => -1));
334 }
335}