Merge pull request #2842 from totten/master-api-rollback-soft-errors
[civicrm-core.git] / CRM / Upgrade / Incremental / php / FourFive.php
1 <?php
2 /*
3 +--------------------------------------------------------------------+
4 | CiviCRM version 4.5 |
5 +--------------------------------------------------------------------+
6 | Copyright CiviCRM LLC (c) 2004-2014 |
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
30 * @copyright CiviCRM LLC (c) 2004-2014
31 * $Id$
32 *
33 */
34 class CRM_Upgrade_Incremental_php_FourFive {
35 const BATCH_SIZE = 5000;
36
37 /**
38 * @param $errors
39 *
40 * @return bool
41 */
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 *
52 * @param $preUpgradeMessage
53 * @param $rev string, a version number, e.g. '4.4.alpha1', '4.4.beta3', '4.4.0'
54 * @param null $currentVer
55 *
56 * @internal param string $postUpgradeMessage , alterable
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) {
70 if ($rev == '4.5.alpha1') {
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>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'));
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".');
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.');
74 }
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 }
78 }
79
80 /**
81 * @param $rev
82 *
83 * @return bool
84 */
85 function upgrade_4_5_alpha1($rev) {
86 // task to process sql
87 $this->addTask(ts('Migrate honoree information to module_data'), 'migrateHonoreeInfo');
88 $this->addTask(ts('Upgrade DB to 4.5.alpha1: SQL'), 'task_4_5_x_runSql', $rev);
89 $this->addTask(ts('Set default for Individual name fields configuration'), 'addNameFieldOptions');
90
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 = "
98 SELECT CONSTRAINT_NAME FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS
99 WHERE TABLE_NAME = 'civicrm_msg_template'
100 AND CONSTRAINT_TYPE = 'FOREIGN KEY'
101 AND 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`
109 DROP FOREIGN KEY `{$dao->CONSTRAINT_NAME}`,
110 DROP KEY `{$dao->CONSTRAINT_NAME}`";
111 CRM_Core_DAO::executeQuery($sqlDropFK, CRM_Core_DAO::$_nullArray, TRUE, NULL, FALSE, FALSE);
112 }
113 }
114
115 return TRUE;
116 }
117
118 /**
119 * Add defaults for the newly introduced name fields configuration in 'contact_edit_options' setting
120 *
121 * @param CRM_Queue_TaskContext $ctx
122 *
123 * @return bool TRUE for success
124 */
125 static function addNameFieldOptions(CRM_Queue_TaskContext $ctx) {
126 $query = "SELECT `value` FROM `civicrm_setting` WHERE `group_name` = 'CiviCRM Preferences' AND `name` = 'contact_edit_options'";
127 $dao = CRM_Core_DAO::executeQuery($query);
128 $dao->fetch();
129 $oldValue = unserialize($dao->value);
130
131 $newValue = $oldValue . '12\ 114\ 115\ 116\ 117\ 1';
132
133 $query = "UPDATE `civicrm_setting` SET `value` = %1 WHERE `group_name` = 'CiviCRM Preferences' AND `name` = 'contact_edit_options'";
134 $params = array(1 => array(serialize($newValue), 'String'));
135 CRM_Core_DAO::executeQuery($query, $params);
136
137 return TRUE;
138 }
139
140 /**
141 * Migrate honoree information to uf_join.module_data as honoree columns (text and title) will be dropped
142 * on DB upgrade
143 *
144 * @param CRM_Queue_TaskContext $ctx
145 *
146 * @return bool TRUE for success
147 */
148 static function migrateHonoreeInfo(CRM_Queue_TaskContext $ctx) {
149 $query = "ALTER TABLE `civicrm_uf_join`
150 ADD COLUMN `module_data` longtext COMMENT 'Json serialized array of data used by the ufjoin.module'";
151 CRM_Core_DAO::executeQuery($query);
152
153 $honorTypes = array_keys(CRM_Core_OptionGroup::values('honor_type'));
154 $ufGroupDAO = new CRM_Core_DAO_UFGroup();
155 $ufGroupDAO->name = 'new_individual';
156 $ufGroupDAO->find(TRUE);
157
158 $query = "SELECT * FROM civicrm_contribution_page";
159 $dao = CRM_Core_DAO::executeQuery($query);
160
161 if ($dao->N) {
162 $domain = new CRM_Core_DAO_Domain;
163 $domain->find(TRUE);
164 while ($dao->fetch()) {
165 $honorParams = array('soft_credit' => array('soft_credit_types' => $honorTypes));
166 if ($domain->locales) {
167 $locales = explode(CRM_Core_DAO::VALUE_SEPARATOR, $domain->locales);
168 foreach ($locales as $locale) {
169 $honor_block_title = "honor_block_title_{$locale}";
170 $honor_block_text = "honor_block_text_{$locale}";
171 $honorParams['soft_credit'] += array(
172 $locale => array(
173 'honor_block_title' => $dao->$honor_block_title,
174 'honor_block_text' => $dao->$honor_block_text,
175 ),
176 );
177 }
178 }
179 else {
180 $honorParams['soft_credit'] += array(
181 'default' => array(
182 'honor_block_title' => $dao->honor_block_title,
183 'honor_block_text' => $dao->honor_block_text,
184 ),
185 );
186 }
187 $ufJoinParam = array(
188 'module' => 'soft_credit',
189 'entity_table' => 'civicrm_contribution_page',
190 'is_active' => $dao->honor_block_is_active,
191 'entity_id' => $dao->id,
192 'uf_group_id' => $ufGroupDAO->id,
193 'module_data' => json_encode($honorParams),
194 );
195 CRM_Core_BAO_UFJoin::create($ufJoinParam);
196 }
197 }
198
199 return TRUE;
200 }
201
202 /**
203 * (Queue Task Callback)
204 */
205 static function task_4_5_x_runSql(CRM_Queue_TaskContext $ctx, $rev) {
206 $upgrade = new CRM_Upgrade_Form();
207 $upgrade->processSQL($rev);
208
209 return TRUE;
210 }
211
212 /**
213 * Syntactic sugar for adding a task which (a) is in this class and (b) has
214 * a high priority.
215 *
216 * After passing the $funcName, you can also pass parameters that will go to
217 * the function. Note that all params must be serializable.
218 */
219 protected function addTask($title, $funcName) {
220 $queue = CRM_Queue_Service::singleton()->load(array(
221 'type' => 'Sql',
222 'name' => CRM_Upgrade_Form::QUEUE_NAME,
223 ));
224
225 $args = func_get_args();
226 $title = array_shift($args);
227 $funcName = array_shift($args);
228 $task = new CRM_Queue_Task(
229 array(get_class($this), $funcName),
230 $args,
231 $title
232 );
233 $queue->createItem($task, array('weight' => -1));
234 }
235 }