Commit | Line | Data |
---|---|---|
6a488035 TO |
1 | <?php |
2 | /* | |
3 | +--------------------------------------------------------------------+ | |
06b69b18 | 4 | | CiviCRM version 4.5 | |
6a488035 | 5 | +--------------------------------------------------------------------+ |
06b69b18 | 6 | | Copyright CiviCRM LLC (c) 2004-2014 | |
6a488035 TO |
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 and the CiviCRM Licensing Exception. | | |
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 and the CiviCRM Licensing Exception along | | |
21 | | with this program; if not, contact CiviCRM LLC | | |
22 | | at info[AT]civicrm[DOT]org. If you have questions about the | | |
23 | | GNU Affero General Public License or the licensing of CiviCRM, | | |
24 | | see the CiviCRM license FAQ at http://civicrm.org/licensing | | |
25 | +--------------------------------------------------------------------+ | |
26 | */ | |
27 | ||
28 | /** | |
29 | * | |
30 | * @package CRM | |
06b69b18 | 31 | * @copyright CiviCRM LLC (c) 2004-2014 |
6a488035 TO |
32 | * $Id$ |
33 | * | |
34 | */ | |
35 | class CRM_Upgrade_ThreeZero_ThreeZero extends CRM_Upgrade_Form { | |
624e56fa EM |
36 | /** |
37 | * @param $errorMessage | |
38 | * | |
39 | * @return bool | |
40 | */ | |
6a488035 TO |
41 | function verifyPreDBState(&$errorMessage) { |
42 | $latestVer = CRM_Utils_System::version(); | |
43 | ||
44 | $errorMessage = ts('Pre-condition failed for upgrade to %1.', array(1 => $latestVer)); | |
45 | // check table, if the db is 3.0 | |
46 | if (CRM_Core_DAO::checkTableExists('civicrm_navigation') && | |
47 | CRM_Core_DAO::checkTableExists('civicrm_participant_status_type') | |
48 | ) { | |
49 | $errorMessage = ts("Database check failed - it looks like you have already upgraded to the latest version (v%1) of the database. OR If you think this message is wrong, it is very likely that this a partially upgraded db and you will need to reload the correct db on which upgrade was never tried.", array(1 => $latestVer)); | |
50 | return FALSE; | |
51 | } | |
52 | // check table-column, if the db is 3.0 | |
53 | if (CRM_Core_DAO::checkFieldExists('civicrm_menu', 'domain_id') && | |
54 | CRM_Core_DAO::checkFieldExists('civicrm_event', 'created_id') && | |
55 | CRM_Core_DAO::checkFieldExists('civicrm_event', 'is_template') && | |
56 | CRM_Core_DAO::checkFieldExists('civicrm_uf_field', 'is_reserved') && | |
57 | CRM_Core_DAO::checkFieldExists('civicrm_contact', 'email_greeting_id') && | |
58 | CRM_Core_DAO::checkFieldExists('civicrm_payment_processor_type', 'payment_type') | |
59 | ) { | |
60 | ||
61 | $errorMessage = ts("Database check failed - it looks like you have already upgraded to the latest version (v%1) of the database. OR If you think this message is wrong, it is very likely that this a partially upgraded db and you will need to reload the correct db on which upgrade was never tried.", array(1 => $latestVer)); | |
62 | return FALSE; | |
63 | } | |
64 | ||
65 | //check previous version table e.g 2.2.* | |
66 | if (!CRM_Core_DAO::checkTableExists('civicrm_cache') || | |
67 | !CRM_Core_DAO::checkTableExists('civicrm_pcp_block') || | |
68 | !CRM_Core_DAO::checkTableExists('civicrm_menu') || | |
69 | !CRM_Core_DAO::checkTableExists('civicrm_discount') || | |
70 | !CRM_Core_DAO::checkTableExists('civicrm_pcp') || | |
71 | !CRM_Core_DAO::checkTableExists('civicrm_pledge_block') || | |
72 | !CRM_Core_DAO::checkTableExists('civicrm_contribution_soft') | |
73 | ) { | |
74 | ||
75 | $errorMessage .= ' Few important tables were found missing.'; | |
76 | return FALSE; | |
77 | } | |
78 | ||
79 | // check fields which MUST be present if a proper 2.2.* db | |
80 | if (!CRM_Core_DAO::checkFieldExists('civicrm_activity', 'due_date_time') || | |
81 | !CRM_Core_DAO::checkFieldExists('civicrm_contact', 'greeting_type_id') || | |
82 | !CRM_Core_DAO::checkFieldExists('civicrm_contribution', 'check_number') | |
83 | ) { | |
84 | // db looks to have stuck somewhere between 2.1 & 2.2 | |
85 | $errorMessage .= ' Few important fields were found missing in some of the tables.'; | |
86 | return FALSE; | |
87 | } | |
88 | ||
89 | return TRUE; | |
90 | } | |
91 | ||
624e56fa EM |
92 | /** |
93 | * @param $rev | |
94 | */ | |
6a488035 TO |
95 | function upgrade($rev) { |
96 | ||
97 | // fix CRM-5270: if civicrm_report_instance.description is localised, | |
98 | // recreate it based on the first locale’s description_xx_YY contents | |
99 | // and drop all the description_xx_YY columns | |
100 | if (!CRM_Core_DAO::checkFieldExists('civicrm_report_instance', 'description')) { | |
101 | $domain = new CRM_Core_DAO_Domain; | |
102 | $domain->find(TRUE); | |
103 | $locales = explode(CRM_Core_DAO::VALUE_SEPARATOR, $domain->locales); | |
104 | ||
105 | CRM_Core_DAO::executeQuery("ALTER TABLE civicrm_report_instance ADD description VARCHAR(255)"); | |
106 | CRM_Core_DAO::executeQuery("UPDATE civicrm_report_instance SET description = description_{$locales[0]}"); | |
107 | ||
108 | CRM_Core_DAO::executeQuery("DROP TRIGGER IF EXISTS civicrm_report_instance_before_insert"); | |
109 | foreach ($locales as $locale) { | |
110 | CRM_Core_DAO::executeQuery("DROP VIEW civicrm_report_instance_$locale"); | |
111 | CRM_Core_DAO::executeQuery("ALTER TABLE civicrm_report_instance DROP description_$locale"); | |
112 | } | |
113 | } | |
114 | ||
115 | //We execute some part of php after sql and then again sql | |
116 | //So using conditions for skipping some part of sql CRM-4575 | |
117 | ||
118 | $upgrade = new CRM_Upgrade_Form(); | |
119 | //Run the SQL file (1) | |
120 | $upgrade->processSQL($rev); | |
121 | //replace with ; in report instance | |
10824d34 | 122 | $sql = "UPDATE civicrm_report_instance |
6a488035 TO |
123 | SET form_values = REPLACE(form_values,'#',';') "; |
124 | CRM_Core_DAO::executeQuery($sql, CRM_Core_DAO::$_nullArray); | |
125 | ||
126 | //delete unnecessary activities | |
127 | $bulkEmailID = CRM_Core_OptionGroup::getValue('activity_type', 'Bulk Email', 'name'); | |
128 | ||
129 | if ($bulkEmailID) { | |
130 | ||
131 | $mailingActivityIds = array(); | |
10824d34 | 132 | $query = " |
133 | SELECT max( ca.id ) as aid, | |
6a488035 TO |
134 | ca.source_record_id sid |
135 | FROM civicrm_activity ca | |
10824d34 | 136 | WHERE ca.activity_type_id = %1 |
6a488035 TO |
137 | GROUP BY ca.source_record_id"; |
138 | ||
139 | $params = array(1 => array($bulkEmailID, 'Integer')); | |
140 | $dao = CRM_Core_DAO::executeQuery($query, $params); | |
141 | ||
142 | while ($dao->fetch()) { | |
143 | $updateQuery = " | |
10824d34 | 144 | UPDATE civicrm_activity_target cat, civicrm_activity ca |
145 | SET cat.activity_id = {$dao->aid} | |
6a488035 | 146 | WHERE ca.source_record_id IS NOT NULL AND |
10824d34 | 147 | ca.activity_type_id = %1 AND |
148 | ca.id <> {$dao->aid} AND | |
149 | ca.source_record_id = {$dao->sid} AND | |
6a488035 TO |
150 | ca.id = cat.activity_id"; |
151 | ||
152 | $updateParams = array(1 => array($bulkEmailID, 'Integer')); | |
153 | CRM_Core_DAO::executeQuery($updateQuery, $updateParams); | |
154 | ||
10824d34 | 155 | $deleteQuery = " |
156 | DELETE ca.* | |
157 | FROM civicrm_activity ca | |
158 | WHERE ca.source_record_id IS NOT NULL AND | |
159 | ca.activity_type_id = %1 AND | |
160 | ca.id <> {$dao->aid} AND | |
6a488035 TO |
161 | ca.source_record_id = {$dao->sid}"; |
162 | ||
163 | $deleteParams = array(1 => array($bulkEmailID, 'Integer')); | |
164 | CRM_Core_DAO::executeQuery($deleteQuery, $deleteParams); | |
165 | } | |
166 | } | |
167 | ||
168 | //CRM-4453 | |
169 | //lets insert column in civicrm_aprticipant table | |
170 | $query = " | |
10824d34 | 171 | ALTER TABLE `civicrm_participant` |
6a488035 TO |
172 | ADD `fee_currency` VARCHAR( 64 ) CHARACTER SET utf8 COLLATE utf8_unicode_ci NULL COMMENT '3 character string, value derived from config setting.' AFTER `discount_id`"; |
173 | CRM_Core_DAO::executeQuery($query); | |
174 | ||
175 | //get currency from contribution table if exists/default | |
176 | //insert currency when fee_amount != NULL or event is paid. | |
177 | $query = " | |
10824d34 | 178 | SELECT civicrm_participant.id |
6a488035 | 179 | FROM civicrm_participant |
10824d34 | 180 | LEFT JOIN civicrm_event |
6a488035 | 181 | ON ( civicrm_participant.event_id = civicrm_event.id ) |
10824d34 | 182 | WHERE civicrm_participant.fee_amount IS NOT NULL OR |
6a488035 TO |
183 | civicrm_event.is_monetary = 1"; |
184 | ||
185 | $participant = CRM_Core_DAO::executeQuery($query); | |
186 | while ($participant->fetch()) { | |
187 | $query = " | |
10824d34 | 188 | SELECT civicrm_contribution.currency |
189 | FROM civicrm_contribution, | |
6a488035 | 190 | civicrm_participant_payment |
10824d34 | 191 | WHERE civicrm_contribution.id = civicrm_participant_payment.contribution_id AND |
6a488035 TO |
192 | civicrm_participant_payment.participant_id = {$participant->id}"; |
193 | ||
194 | $currencyID = CRM_Core_DAO::singleValueQuery($query); | |
195 | if (!$currencyID) { | |
196 | $config = CRM_Core_Config::singleton(); | |
197 | $currencyID = $config->defaultCurrency; | |
198 | } | |
199 | ||
200 | //finally update participant record. | |
201 | CRM_Core_DAO::setFieldValue('CRM_Event_DAO_Participant', $participant->id, 'fee_currency', $currencyID); | |
202 | } | |
203 | ||
204 | //CRM-4575 | |
205 | //check whether {contact.name} is set in mailing labels | |
206 | $mailingFormat = self::getPreference('mailing_format'); | |
207 | $addNewAddressee = TRUE; | |
208 | ||
209 | if (strpos($mailingFormat, '{contact.contact_name}') === FALSE) { | |
210 | $addNewAddressee = FALSE; | |
211 | } | |
212 | else { | |
213 | //else compare individual name format with default individual addressee. | |
214 | $individualNameFormat = self::getPreference('individual_name_format'); | |
215 | ||
216 | $defaultAddressee = CRM_Core_OptionGroup::values('addressee', FALSE, FALSE, FALSE, | |
217 | " AND v.filter = 1 AND v.is_default = 1", 'label' | |
218 | ); | |
219 | ||
220 | if (array_search($individualNameFormat, $defaultAddressee) !== FALSE) { | |
221 | $addNewAddressee = FALSE; | |
222 | } | |
223 | } | |
224 | ||
225 | $docURL = CRM_Utils_System::docURL2('Update Greetings and Address Data for Contacts', FALSE, NULL, NULL, 'color: white; text-decoration: underline;', "wiki"); | |
226 | ||
227 | if ($addNewAddressee) { | |
228 | //otherwise insert new token in addressee and set as a default | |
229 | $addresseeGroupId = CRM_Core_DAO::getFieldValue('CRM_Core_DAO_OptionGroup', | |
230 | 'addressee', | |
231 | 'id', | |
232 | 'name' | |
233 | ); | |
234 | ||
235 | $optionValueParams = array( | |
236 | 'label' => $individualNameFormat, | |
237 | 'is_active' => 1, | |
238 | 'contactOptions' => 1, | |
239 | 'filter' => 1, | |
240 | 'is_default' => 1, | |
241 | 'reset_default_for' => array('filter' => "0, 1"), | |
242 | ); | |
243 | ||
244 | $action = CRM_Core_Action::ADD; | |
245 | $addresseeGroupParams = array('name' => 'addressee'); | |
246 | $fieldValues = array('option_group_id' => $addresseeGroupId); | |
247 | $weight = CRM_Utils_Weight::getDefaultWeight('CRM_Core_DAO_OptionValue', $fieldValues); | |
248 | ||
249 | $optionValueParams['weight'] = $weight; | |
250 | $addresseeToken = CRM_Core_OptionValue::addOptionValue($optionValueParams, $addresseeGroupParams, | |
251 | $action, $optionId = NULL | |
252 | ); | |
253 | ||
254 | $afterUpgradeMessage = ts("During this upgrade, Postal Addressee values have been stored for each contact record using the system default format - %2.You will need to run the included command-line script to update your Individual contact records to use the \"Individual Name Format\" previously specified for your site %1", array(1 => $docURL, 2 => array_pop($defaultAddressee))); | |
255 | } | |
256 | else { | |
257 | $afterUpgradeMessage = ts("Email Greeting, Postal Greeting and Postal Addressee values have been stored for all contact records based on the system default formats. If you want to use a different format for any of these contact fields - you can run the provided command line script to update contacts to a different format %1 ", array(1 => $docURL)); | |
258 | } | |
259 | ||
260 | //replace contact.contact_name with contact.addressee in civicrm_preference.mailing_format | |
261 | $updateQuery = " | |
10824d34 | 262 | UPDATE civicrm_preferences |
263 | SET `mailing_format` = | |
6a488035 TO |
264 | replace(`mailing_format`, '{contact.contact_name}','{contact.addressee}')"; |
265 | ||
266 | CRM_Core_DAO::executeQuery($updateQuery); | |
267 | ||
268 | //drop column individual_name_format | |
269 | $alterQuery = " | |
270 | ALTER TABLE `civicrm_preferences` | |
271 | DROP `individual_name_format`"; | |
272 | ||
273 | CRM_Core_DAO::executeQuery($alterQuery); | |
274 | ||
275 | //set status message for default greetings | |
276 | $template = CRM_Core_Smarty::singleton(); | |
277 | $template->assign('afterUpgradeMessage', $afterUpgradeMessage); | |
278 | } | |
279 | ||
280 | /** | |
281 | * Load a preference | |
282 | * | |
283 | * This is replaces the defunct CRM_Core_BAO_Preferences::value() | |
284 | */ | |
285 | static | |
286 | function getPreference($name) { | |
287 | $sql = "SELECT $name FROM civicrm_preferences WHERE domain_id = %1 AND is_domain = 1 AND contact_id IS NULL"; | |
288 | $params = array( | |
289 | 1 => array(CRM_Core_Config::domainID(), 'Integer'), | |
290 | ); | |
291 | return CRM_Core_DAO::singleValueQuery($sql, $params); | |
292 | } | |
293 | } | |
294 |