Merge pull request #5059 from totten/master-validation
[civicrm-core.git] / CRM / Upgrade / Incremental / php / FourSix.php
1 <?php
2 /*
3 +--------------------------------------------------------------------+
4 | CiviCRM version 4.6.alpha1 |
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_FourSix {
35 const BATCH_SIZE = 5000;
36
37 /**
38 * @param $errors
39 *
40 * @return bool
41 */
42 public 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 string $rev
54 * a version number, e.g. '4.4.alpha1', '4.4.beta3', '4.4.0'.
55 * @param null $currentVer
56 *
57 * @return void
58 */
59 public function setPreUpgradeMessage(&$preUpgradeMessage, $rev, $currentVer = NULL) {
60 }
61
62 /**
63 * Compute any messages which should be displayed after upgrade
64 *
65 * @param string $postUpgradeMessage
66 * alterable.
67 * @param string $rev
68 * an intermediate version; note that setPostUpgradeMessage is called repeatedly with different $revs.
69 * @return void
70 */
71 public function setPostUpgradeMessage(&$postUpgradeMessage, $rev) {
72 if ($rev == '4.6.alpha1') {
73 $postUpgradeMessage .= '<br /><br />' . ts('Default versions of the following System Workflow Message Templates have been modified to handle new functionality: <ul><li>Events - Registration Confirmation and Receipt (on-line)</li><li>Events - Registration Confirmation and Receipt (off-line)</li><li>Contributions - Receipt (on-line)</li><li>Contributions - Receipt (off-line)</li><li>Memberships - Receipt (on-line)</li><li>Memberships - Signup and Renewal Receipts (off-line)</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).');
74 }
75 if ($rev == '4.6.alpha3') {
76 $postUpgradeMessage .= '<br /><br />' . ts('A new permission has been added for editing message templates. Previously, users needed the "administer CiviCRM" permission. Now, users need the new permission called "edit message templates." Please check your CMS permissions to ensure that users who should be able to edit message templates are assigned this new permission.');
77 }
78 }
79
80
81 /**
82 * (Queue Task Callback)
83 */
84 public static function task_4_6_x_runSql(CRM_Queue_TaskContext $ctx, $rev) {
85 $upgrade = new CRM_Upgrade_Form();
86 $upgrade->processSQL($rev);
87
88 return TRUE;
89 }
90
91 /**
92 * Syntactic sugar for adding a task which (a) is in this class and (b) has
93 * a high priority.
94 *
95 * After passing the $funcName, you can also pass parameters that will go to
96 * the function. Note that all params must be serializable.
97 */
98 protected function addTask($title, $funcName) {
99 $queue = CRM_Queue_Service::singleton()->load(array(
100 'type' => 'Sql',
101 'name' => CRM_Upgrade_Form::QUEUE_NAME,
102 ));
103
104 $args = func_get_args();
105 $title = array_shift($args);
106 $funcName = array_shift($args);
107 $task = new CRM_Queue_Task(
108 array(get_class($this), $funcName),
109 $args,
110 $title
111 );
112 $queue->createItem($task, array('weight' => -1));
113 }
114
115 function upgrade_4_6_alpha3($rev) {
116 // task to process sql
117 $this->addTask(ts('Add and update reference_date column for Schedule Reminders'), 'updateReferenceDate');
118 }
119
120 // CRM-15728, Add new column reference_date to civicrm_action_log in order to track
121 // actual action_start_date for membership entity for only those schedule reminders which are not repeatable
122 static function updateReferenceDate(CRM_Queue_TaskContext $ctx) {
123 //Add column civicrm_action_log.reference_date if not exists
124 $sql = "SELECT count(*) FROM information_schema.columns WHERE table_schema = database() AND table_name = 'civicrm_action_log' AND COLUMN_NAME = 'reference_date' ";
125 $res = CRM_Core_DAO::singleValueQuery($sql);
126
127 if ($res <= 0) {
128 $query = "ALTER TABLE `civicrm_action_log`
129 ADD COLUMN `reference_date` date COMMENT 'Stores the date from the entity which triggered this reminder action (e.g. membership.end_date for most membership renewal reminders)'";
130 CRM_Core_DAO::executeQuery($query);
131 }
132
133 //Retrieve schedule reminders for membership entity and is not repeatable and no absolute date chosen
134 $query = "SELECT schedule.* FROM civicrm_action_schedule schedule
135 LEFT JOIN civicrm_action_mapping mapper ON mapper.id = schedule.mapping_id AND
136 mapper.entity = 'civicrm_membership' AND
137 schedule.is_repeat = 0 AND
138 schedule.start_action_date IS NOT NULL";
139
140 // construct basic where clauses
141 $where = array(
142 'reminder.action_date_time >= DATE_SUB(reminder.action_date_time, INTERVAL 9 MONTH)'
143 ); //choose reminder older then 9 months
144 $dao = CRM_Core_DAO::executeQuery($query);
145 while($dao->fetch()) {
146
147 $referenceColumn = str_replace('membership_', "m.", $dao->start_action_date);
148 $value = implode(', ', explode(CRM_Core_DAO::VALUE_SEPARATOR, trim($dao->entity_value, CRM_Core_DAO::VALUE_SEPARATOR)));
149 if (!empty($value)) {
150 $where[] = "m.membership_type_id IN ({$value})";
151 }
152 else {
153 $where[] = "m.membership_type_id IS NULL";
154 }
155
156 //Create new action_log records where action_start_date changes and exclude reminders for additional contacts
157 //and select contacts are active
158 $sql = "UPDATE civicrm_action_log reminder
159 LEFT JOIN civicrm_membership m
160 ON reminder.entity_id = m.id AND
161 reminder.entity_table = 'civicrm_membership' AND
162 ( m.is_override IS NULL OR m.is_override = 0 )
163 INNER JOIN civicrm_contact c
164 ON c.id = e.contact_id AND
165 c.is_deleted = 0 AND c.is_deceased = 0
166 SET reminder.reference_date = {$referenceColumn}
167 WHERE " . implode(" AND ", $where);
168 CRM_Core_DAO::executeQuery($sql);
169 }
170
171 return TRUE;
172 }
173 }