Commit | Line | Data |
---|---|---|
e8cca51a | 1 | <?php\r |
2 | /*\r | |
3 | +--------------------------------------------------------------------+\r | |
39de6fd5 | 4 | | CiviCRM version 4.6 |\r |
e8cca51a | 5 | +--------------------------------------------------------------------+\r |
39de6fd5 | 6 | | Copyright CiviCRM LLC (c) 2004-2014 |\r |
e8cca51a | 7 | +--------------------------------------------------------------------+\r |
8 | | This file is a part of CiviCRM. |\r | |
9 | | |\r | |
10 | | CiviCRM is free software; you can copy, modify, and distribute it |\r | |
11 | | under the terms of the GNU Affero General Public License |\r | |
12 | | Version 3, 19 November 2007 and the CiviCRM Licensing Exception. |\r | |
13 | | |\r | |
14 | | CiviCRM is distributed in the hope that it will be useful, but |\r | |
15 | | WITHOUT ANY WARRANTY; without even the implied warranty of |\r | |
16 | | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. |\r | |
17 | | See the GNU Affero General Public License for more details. |\r | |
18 | | |\r | |
19 | | You should have received a copy of the GNU Affero General Public |\r | |
20 | | License and the CiviCRM Licensing Exception along |\r | |
21 | | with this program; if not, contact CiviCRM LLC |\r | |
22 | | at info[AT]civicrm[DOT]org. If you have questions about the |\r | |
23 | | GNU Affero General Public License or the licensing of CiviCRM, |\r | |
24 | | see the CiviCRM license FAQ at http://civicrm.org/licensing |\r | |
25 | +--------------------------------------------------------------------+\r | |
26 | */\r | |
27 | \r | |
28 | /**\r | |
29 | *\r | |
30 | * @package CRM\r | |
39de6fd5 | 31 | * @copyright CiviCRM LLC (c) 2004-2014\r |
e8cca51a | 32 | * $Id$\r |
33 | *\r | |
34 | */\r | |
35 | \r | |
36 | require_once 'packages/When/When.php';\r | |
37 | \r | |
38 | class CRM_Core_BAO_RecurringEntity extends CRM_Core_DAO_RecurringEntity {\r | |
39 | \r | |
7da04cde | 40 | const RUNNING = 1;\r |
e8cca51a | 41 | public $schedule = array();\r |
42 | public $scheduleId = NULL;\r | |
43 | public $scheduleFormValues = array();\r | |
44 | \r | |
45 | public $dateColumns = array();\r | |
46 | public $overwriteColumns = array();\r | |
47 | public $intervalDateColumns = array();\r | |
48 | public $excludeDates = array();\r | |
49 | \r | |
50 | public $linkedEntities = array();\r | |
51 | \r | |
52 | public $isRecurringEntityRecord = TRUE;\r | |
53 | \r | |
54 | protected $recursion = NULL;\r | |
76d111d1 | 55 | protected $recursion_start_date = NULL;\r |
e8cca51a | 56 | \r |
57 | public static $_entitiesToBeDeleted = array();\r | |
58 | \r | |
59 | public static $status = NULL;\r | |
60 | \r | |
61 | static $_recurringEntityHelper =\r | |
62 | array(\r | |
63 | 'civicrm_event' => array(\r | |
64 | 'helper_class' => 'CRM_Event_DAO_Event',\r | |
65 | 'delete_func' => 'delete',\r | |
66 | 'pre_delete_func' => 'CRM_Event_Form_ManageEvent_Repeat::checkRegistrationForEvents'\r | |
67 | ),\r | |
68 | 'civicrm_activity' => array(\r | |
69 | 'helper_class' => 'CRM_Activity_DAO_Activity',\r | |
70 | 'delete_func' => 'delete',\r | |
71 | 'pre_delete_func' => ''\r | |
72 | )\r | |
73 | );\r | |
74 | \r | |
75 | static $_dateColumns =\r | |
76 | array(\r | |
77 | 'civicrm_event' => array(\r | |
78 | 'dateColumns' => array('start_date'),\r | |
79 | 'excludeDateRangeColumns' => array('start_date', 'end_date'),\r | |
80 | 'intervalDateColumns' => array('end_date')\r | |
81 | ),\r | |
82 | 'civicrm_activity' => array(\r | |
83 | 'dateColumns' => array('activity_date_time'),\r | |
84 | )\r | |
85 | );\r | |
86 | \r | |
87 | static $_tableDAOMapper =\r | |
88 | array(\r | |
89 | 'civicrm_event' => 'CRM_Event_DAO_Event',\r | |
90 | 'civicrm_price_set_entity' => 'CRM_Price_DAO_PriceSetEntity',\r | |
91 | 'civicrm_uf_join' => 'CRM_Core_DAO_UFJoin',\r | |
92 | 'civicrm_tell_friend' => 'CRM_Friend_DAO_Friend',\r | |
93 | 'civicrm_pcp_block' => 'CRM_PCP_DAO_PCPBlock',\r | |
94 | 'civicrm_activity' => 'CRM_Activity_DAO_Activity',\r | |
95 | 'civicrm_activity_contact' => 'CRM_Activity_DAO_ActivityContact',\r | |
96 | );\r | |
97 | \r | |
98 | static $_updateSkipFields =\r | |
99 | array(\r | |
100 | 'civicrm_event' => array('start_date', 'end_date'),\r | |
101 | 'civicrm_tell_friend' => array('entity_id'),\r | |
102 | 'civicrm_pcp_block' => array('entity_id'),\r | |
103 | 'civicrm_activity' => array('activity_date_time'),\r | |
104 | );\r | |
105 | \r | |
106 | static $_linkedEntitiesInfo =\r | |
107 | array(\r | |
108 | 'civicrm_tell_friend' => array(\r | |
109 | 'entity_id_col' => 'entity_id',\r | |
110 | 'entity_table_col' => 'entity_table'\r | |
111 | ),\r | |
112 | 'civicrm_price_set_entity' => array(\r | |
113 | 'entity_id_col' => 'entity_id',\r | |
114 | 'entity_table_col' => 'entity_table',\r | |
115 | 'is_multirecord' => TRUE,\r | |
116 | ),\r | |
117 | 'civicrm_uf_join' => array(\r | |
118 | 'entity_id_col' => 'entity_id',\r | |
119 | 'entity_table_col' => 'entity_table',\r | |
120 | 'is_multirecord' => TRUE,\r | |
121 | ),\r | |
122 | 'civicrm_pcp_block' => array(\r | |
123 | 'entity_id_col' => 'entity_id',\r | |
124 | 'entity_table_col' => 'entity_table'\r | |
125 | ),\r | |
126 | );\r | |
127 | \r | |
128 | static function getStatus() {\r | |
129 | return self::$status;\r | |
130 | }\r | |
131 | \r | |
132 | static function setStatus($status) {\r | |
133 | self::$status = $status;\r | |
134 | }\r | |
135 | /**\r | |
100fef9d | 136 | * Save records in civicrm_recujrring_entity table\r |
e8cca51a | 137 | *\r |
138 | * @param array $params reference array contains the values submitted by the form\r | |
139 | *\r | |
140 | * @access public\r | |
141 | * @static\r | |
142 | *\r | |
143 | * @return object\r | |
144 | */\r | |
145 | static function add(&$params) {\r | |
146 | if (CRM_Utils_Array::value('id', $params)) {\r | |
147 | CRM_Utils_Hook::pre('edit', 'RecurringEntity', $params['id'], $params);\r | |
148 | }\r | |
149 | else {\r | |
150 | CRM_Utils_Hook::pre('create', 'RecurringEntity', NULL, $params);\r | |
151 | }\r | |
152 | \r | |
153 | $daoRecurringEntity = new CRM_Core_DAO_RecurringEntity();\r | |
154 | $daoRecurringEntity->copyValues($params);\r | |
155 | $daoRecurringEntity->find(TRUE);\r | |
156 | $result = $daoRecurringEntity->save();\r | |
157 | \r | |
158 | if (CRM_Utils_Array::value('id', $params)) {\r | |
159 | CRM_Utils_Hook::post('edit', 'RecurringEntity', $daoRecurringEntity->id, $daoRecurringEntity);\r | |
160 | }\r | |
161 | else {\r | |
162 | CRM_Utils_Hook::post('create', 'RecurringEntity', $daoRecurringEntity->id, $daoRecurringEntity);\r | |
163 | }\r | |
164 | return $result;\r | |
165 | }\r | |
166 | \r | |
167 | /**\r | |
168 | * Wrapper for the function add() to add entry in recurring entity\r | |
169 | *\r | |
170 | * @param int $parentId Parent entity id\r | |
171 | * @param int $entityId Child entity id\r | |
172 | * @param String $entityTable Name of the entity table\r | |
173 | *\r | |
174 | * @access public\r | |
175 | * @static\r | |
176 | *\r | |
177 | * @return object\r | |
178 | */\r | |
179 | static function quickAdd($parentId, $entityId, $entityTable) {\r | |
180 | $params =\r | |
181 | array(\r | |
182 | 'parent_id' => $parentId,\r | |
183 | 'entity_id' => $entityId,\r | |
184 | 'entity_table' => $entityTable\r | |
185 | );\r | |
186 | return self::add($params);\r | |
187 | }\r | |
188 | \r | |
189 | /**\r | |
190 | * This function updates the mode column in the civicrm_recurring_entity table\r | |
191 | *\r | |
192 | * @param int $mode Mode of the entity to cascade changes across parent/child relations eg 1 - only this entity, 2 - this and the following entities, 3 - All the entity\r | |
193 | *\r | |
194 | * @access public\r | |
195 | *\r | |
196 | * @return void\r | |
197 | */\r | |
198 | function mode($mode) {\r | |
199 | if ($this->entity_id && $this->entity_table) {\r | |
200 | if ($this->find(TRUE)) {\r | |
201 | $this->mode = $mode;\r | |
202 | }\r | |
203 | else {\r | |
204 | $this->parent_id = $this->entity_id;\r | |
205 | $this->mode = $mode;\r | |
206 | }\r | |
207 | $this->save();\r | |
208 | }\r | |
209 | }\r | |
210 | \r | |
211 | /**\r | |
212 | * This function generates all new entities based on object vars\r | |
213 | *\r | |
214 | * @return array\r | |
215 | */\r | |
216 | function generate() {\r | |
217 | $this->generateRecursiveDates();\r | |
218 | \r | |
219 | return $this->generateEntities();\r | |
220 | }\r | |
221 | \r | |
222 | /**\r | |
223 | * This function builds a "When" object based on schedule/reminder params\r | |
224 | *\r | |
225 | * @return object When object\r | |
226 | */\r | |
227 | function generateRecursion() {\r | |
228 | // return if already generated\r | |
229 | if (is_a($this->recursion, 'When')) {\r | |
230 | return $this->recursion;\r | |
231 | }\r | |
232 | \r | |
233 | if ($this->scheduleId) {\r | |
234 | // get params by ID\r | |
235 | $this->schedule = $this->getScheduleParams($this->scheduleId);\r | |
236 | }\r | |
237 | else if (!empty($this->scheduleFormValues)) {\r | |
238 | $this->schedule = $this->mapFormValuesToDB($this->scheduleFormValues);\r | |
239 | }\r | |
240 | \r | |
241 | if (!empty($this->schedule)) {\r | |
242 | $this->recursion = $this->getRecursionFromSchedule($this->schedule);\r | |
243 | }\r | |
244 | return $this->recursion;\r | |
245 | }\r | |
246 | \r | |
247 | /**\r | |
248 | * Generate new DAOs and along with entries in civicrm_recurring_entity table\r | |
249 | *\r | |
250 | * @return array\r | |
251 | */\r | |
252 | function generateEntities() {\r | |
253 | self::setStatus(self::RUNNING);\r | |
254 | \r | |
255 | $newEntities = array();\r | |
256 | $findCriteria = array();\r | |
257 | if (!empty($this->recursionDates)) {\r | |
258 | if ($this->entity_id) {\r | |
259 | $findCriteria = array('id' => $this->entity_id);\r | |
260 | \r | |
261 | // save an entry with initiating entity-id & entity-table\r | |
262 | if ($this->entity_table && !$this->find(TRUE)) {\r | |
263 | $this->parent_id = $this->entity_id;\r | |
264 | $this->save();\r | |
265 | }\r | |
266 | }\r | |
267 | if (empty($findCriteria)) {\r | |
268 | CRM_Core_Error::fatal("Find criteria missing to generate form. Make sure entity_id and table is set.");\r | |
269 | }\r | |
270 | \r | |
271 | $count = 0;\r | |
272 | foreach ($this->recursionDates as $key => $dateCols) {\r | |
273 | $newCriteria = $dateCols;\r | |
274 | foreach ($this->overwriteColumns as $col => $val) {\r | |
275 | $newCriteria[$col] = $val;\r | |
276 | }\r | |
277 | // create main entities\r | |
278 | $obj = CRM_Core_BAO_RecurringEntity::copyCreateEntity($this->entity_table,\r | |
279 | $findCriteria,\r | |
280 | $newCriteria,\r | |
281 | $this->isRecurringEntityRecord\r | |
282 | );\r | |
283 | \r | |
284 | if (is_a($obj, 'CRM_Core_DAO') && $obj->id) {\r | |
285 | $newCriteria = array();\r | |
286 | $newEntities[$this->entity_table][$count] = $obj->id;\r | |
287 | \r | |
288 | foreach ($this->linkedEntities as $linkedInfo) {\r | |
289 | foreach ($linkedInfo['linkedColumns'] as $col) {\r | |
290 | $newCriteria[$col] = $obj->id;\r | |
291 | }\r | |
292 | // create linked entities\r | |
293 | $linkedObj = CRM_Core_BAO_RecurringEntity::copyCreateEntity($linkedInfo['table'],\r | |
294 | $linkedInfo['findCriteria'],\r | |
295 | $newCriteria,\r | |
296 | CRM_Utils_Array::value('isRecurringEntityRecord', $linkedInfo, TRUE)\r | |
297 | );\r | |
298 | \r | |
299 | if (is_a($linkedObj, 'CRM_Core_DAO') && $linkedObj->id) {\r | |
300 | $newEntities[$linkedInfo['table']][$count] = $linkedObj->id;\r | |
301 | }\r | |
302 | }\r | |
303 | }\r | |
304 | $count++;\r | |
305 | }\r | |
306 | }\r | |
307 | \r | |
308 | self::$status = NULL;\r | |
309 | return $newEntities;\r | |
310 | }\r | |
311 | \r | |
312 | /**\r | |
313 | * This function iterates through when object criterias and\r | |
314 | * generates recursive dates based on that\r | |
315 | *\r | |
316 | * @return array array of dates\r | |
317 | */\r | |
318 | function generateRecursiveDates() {\r | |
319 | $this->generateRecursion();\r | |
320 | \r | |
321 | $recursionDates = array();\r | |
322 | if (is_a($this->recursion, 'When')) {\r | |
323 | $initialCount = CRM_Utils_Array::value('start_action_offset', $this->schedule);\r | |
324 | \r | |
325 | $exRangeStart = $exRangeEnd = NULL;\r | |
326 | if (!empty($this->excludeDateRangeColumns)) {\r | |
327 | $exRangeStart = $this->excludeDateRangeColumns[0];\r | |
328 | $exRangeEnd = $this->excludeDateRangeColumns[1];\r | |
329 | }\r | |
330 | \r | |
331 | $count = 1;\r | |
332 | while ($result = $this->recursion->next()) {\r | |
76d111d1 | 333 | $skip = FALSE;\r |
334 | if ($result == $this->recursion_start_date) {\r | |
335 | // skip the recursion-start-date from the list we going to generate\r | |
336 | $skip = TRUE;\r | |
337 | }\r | |
e8cca51a | 338 | $baseDate = CRM_Utils_Date::processDate($result->format('Y-m-d H:i:s'));\r |
339 | \r | |
340 | foreach ($this->dateColumns as $col) {\r | |
341 | $recursionDates[$count][$col] = $baseDate;\r | |
342 | }\r | |
343 | foreach ($this->intervalDateColumns as $col => $interval) {\r | |
344 | $newDate = new DateTime($baseDate);\r | |
345 | $newDate->add($interval);\r | |
346 | $recursionDates[$count][$col] = CRM_Utils_Date::processDate($newDate->format('Y-m-d H:i:s'));\r | |
347 | }\r | |
348 | if ($exRangeStart) {\r | |
349 | $exRangeStartDate = CRM_Utils_Date::processDate($recursionDates[$count][$exRangeStart], NULL, FALSE, 'Ymd');\r | |
350 | $exRangeEndDate = CRM_Utils_Date::processDate($recursionDates[$count][$exRangeEnd], NULL, FALSE, 'Ymd');\r | |
351 | }\r | |
352 | \r | |
e8cca51a | 353 | foreach ($this->excludeDates as $exDate) {\r |
354 | $exDate = CRM_Utils_Date::processDate($exDate, NULL, FALSE, 'Ymd');\r | |
355 | if (!$exRangeStart) {\r | |
356 | if ($exDate == $result->format('Ymd')) {\r | |
357 | $skip = TRUE;\r | |
358 | break;\r | |
359 | }\r | |
360 | }\r | |
361 | else {\r | |
362 | if (($exDate == $exRangeStartDate) ||\r | |
363 | ($exRangeEndDate && ($exDate > $exRangeStartDate) && ($exDate <= $exRangeEndDate))\r | |
364 | ) {\r | |
365 | $skip = TRUE;\r | |
366 | break;\r | |
367 | }\r | |
368 | }\r | |
369 | }\r | |
370 | \r | |
371 | if ($skip) {\r | |
372 | unset($recursionDates[$count]);\r | |
373 | if ($initialCount && ($initialCount > 0)) {\r | |
374 | // lets increase the counter, so we get correct number of occurrences\r | |
375 | $initialCount++;\r | |
376 | $this->recursion->count($initialCount);\r | |
377 | }\r | |
378 | continue;\r | |
379 | }\r | |
380 | $count++;\r | |
381 | }\r | |
382 | }\r | |
383 | $this->recursionDates = $recursionDates;\r | |
384 | \r | |
385 | return $recursionDates;\r | |
386 | }\r | |
387 | \r | |
388 | /**\r | |
389 | * This function gets all the children for a particular parent entity\r | |
390 | *\r | |
391 | * @param int $parentId Parent entity id\r | |
392 | * @param string $entityTable Name of the entity table\r | |
393 | * @param boolean $includeParent If true parent id is included in result set and vice versa\r | |
394 | * @param int $mode 1. retrieve only one entity. 2. retrieve all future entities in the repeating set. 3. all entities in the repeating set.\r | |
395 | * @param int $initiatorId the instance where this function is invoked from\r | |
396 | *\r | |
397 | * @access public\r | |
398 | * @static\r | |
399 | *\r | |
400 | * @return array an array of child ids\r | |
401 | */\r | |
402 | static public function getEntitiesForParent($parentId, $entityTable, $includeParent = TRUE, $mode = 3, $initiatorId = NULL) {\r | |
403 | $entities = array();\r | |
404 | if (empty($parentId) || empty($entityTable)) {\r | |
405 | return $entities;\r | |
406 | }\r | |
407 | \r | |
408 | if (!$initiatorId) {\r | |
409 | $initiatorId = $parentId;\r | |
410 | }\r | |
411 | \r | |
412 | $queryParams = array(\r | |
413 | 1 => array($parentId, 'Integer'),\r | |
414 | 2 => array($entityTable, 'String'),\r | |
415 | 3 => array($initiatorId, 'Integer'),\r | |
416 | );\r | |
417 | \r | |
418 | if (!$mode) {\r | |
419 | $mode = CRM_Core_DAO::singleValueQuery("SELECT mode FROM civicrm_recurring_entity WHERE entity_id = %3 AND entity_table = %2", $queryParams);\r | |
420 | }\r | |
421 | \r | |
422 | $query = "SELECT *\r | |
423 | FROM civicrm_recurring_entity\r | |
424 | WHERE parent_id = %1 AND entity_table = %2";\r | |
425 | if (!$includeParent) {\r | |
426 | $query .= " AND entity_id != " . ($initiatorId ? "%3" : "%1");\r | |
427 | }\r | |
428 | \r | |
429 | if ($mode == '1') { // MODE = SINGLE\r | |
430 | $query .= " AND entity_id = %3";\r | |
431 | }\r | |
432 | else if ($mode == '2') { // MODE = FUTURE\r | |
433 | $recurringEntityID = CRM_Core_DAO::singleValueQuery("SELECT id FROM civicrm_recurring_entity WHERE entity_id = %3 AND entity_table = %2", $queryParams);\r | |
434 | if ($recurringEntityID) {\r | |
435 | $query .= $includeParent ? " AND id >= %4" : " AND id > %4";\r | |
436 | $query .= " ORDER BY id ASC"; // FIXME: change to order by dates\r | |
437 | $queryParams[4] = array($recurringEntityID, 'Integer');\r | |
438 | }\r | |
439 | else {\r | |
440 | // something wrong, return empty\r | |
441 | return array();\r | |
442 | }\r | |
443 | }\r | |
444 | \r | |
445 | $dao = CRM_Core_DAO::executeQuery($query, $queryParams);\r | |
446 | while ($dao->fetch()) {\r | |
447 | $entities["{$dao->entity_table}_{$dao->entity_id}"]['table'] = $dao->entity_table;\r | |
448 | $entities["{$dao->entity_table}_{$dao->entity_id}"]['id'] = $dao->entity_id;\r | |
449 | }\r | |
450 | return $entities;\r | |
451 | }\r | |
452 | \r | |
453 | /**\r | |
454 | * This function when passed an entity id checks if it has parent and\r | |
455 | * returns all other entities that are connected to same parent.\r | |
456 | *\r | |
457 | * @param int $entityId entity id\r | |
458 | * @param string $entityTable Entity table name\r | |
459 | * @param boolean $includeParent Include parent in result set\r | |
460 | * @param int $mode 1. retrieve only one entity. 2. retrieve all future entities in the repeating set. 3. all entities in the repeating set.\r | |
461 | *\r | |
462 | * @access public\r | |
463 | * @static\r | |
464 | *\r | |
465 | * @return array array of connected ids\r | |
466 | */\r | |
467 | static public function getEntitiesFor($entityId, $entityTable, $includeParent = TRUE, $mode = 3) {\r | |
468 | $parentId = self::getParentFor($entityId, $entityTable);\r | |
469 | if ($parentId) {\r | |
470 | return self::getEntitiesForParent($parentId, $entityTable, $includeParent, $mode, $entityId);\r | |
471 | }\r | |
472 | return array();\r | |
473 | }\r | |
474 | \r | |
475 | /**\r | |
476 | * This function gets the parent for the entity id passed to it\r | |
477 | *\r | |
478 | * @param int $entityId entity ID\r | |
479 | * @param string $entityTable Entity table name\r | |
480 | * @param boolean $includeParent Include parent in result set\r | |
481 | *\r | |
482 | * @access public\r | |
483 | * @static\r | |
484 | *\r | |
485 | * @return int unsigned $parentId Parent ID\r | |
486 | */\r | |
487 | static public function getParentFor($entityId, $entityTable, $includeParent = TRUE) {\r | |
488 | if (empty($entityId) || empty($entityTable)) {\r | |
489 | return NULL;\r | |
490 | }\r | |
491 | \r | |
492 | $query = "\r | |
493 | SELECT parent_id\r | |
494 | FROM civicrm_recurring_entity\r | |
495 | WHERE entity_id = %1 AND entity_table = %2";\r | |
496 | if (!$includeParent) {\r | |
497 | $query .= " AND parent_id != %1";\r | |
498 | }\r | |
499 | $parentId =\r | |
500 | CRM_Core_DAO::singleValueQuery($query,\r | |
501 | array(\r | |
502 | 1 => array($entityId, 'Integer'),\r | |
503 | 2 => array($entityTable, 'String'),\r | |
504 | )\r | |
505 | );\r | |
506 | return $parentId;\r | |
507 | }\r | |
508 | \r | |
509 | /**\r | |
510 | * This function copies the information from parent entity and creates other entities with same information\r | |
511 | *\r | |
512 | * @param string $entityTable Entity table name\r | |
513 | * @param array $fromCriteria array of all the fields & values on which basis to copy\r | |
514 | * @param array $newParams array of all the fields & values to be copied besides the other fields\r | |
515 | * @param boolean $createRecurringEntity if to create a record in recurring_entity table\r | |
516 | *\r | |
517 | * @access public\r | |
518 | * @static\r | |
519 | *\r | |
520 | * @return object\r | |
521 | */\r | |
522 | static public function copyCreateEntity($entityTable, $fromCriteria, $newParams, $createRecurringEntity = TRUE) {\r | |
523 | $daoName = self::$_tableDAOMapper[$entityTable];\r | |
524 | if (!$daoName) {\r | |
525 | CRM_Core_Error::fatal("DAO Mapper missing for $entityTable.");\r | |
526 | }\r | |
527 | $newObject = CRM_Core_DAO::copyGeneric($daoName, $fromCriteria, $newParams);\r | |
528 | \r | |
529 | if (is_a($newObject, 'CRM_Core_DAO') && $newObject->id && $createRecurringEntity) {\r | |
530 | $object = new $daoName( );\r | |
531 | foreach ($fromCriteria as $key => $value) {\r | |
532 | $object->$key = $value;\r | |
533 | }\r | |
534 | $object->find(TRUE);\r | |
535 | \r | |
536 | CRM_Core_BAO_RecurringEntity::quickAdd($object->id, $newObject->id, $entityTable);\r | |
537 | }\r | |
538 | return $newObject;\r | |
539 | }\r | |
540 | \r | |
541 | /**\r | |
542 | * This function acts as a listener to dao->update whenever there is an update,\r | |
543 | * and propagates any changes to all related entities present in recurring entity table\r | |
544 | *\r | |
545 | * @param object $event An object of /Civi/Core/DAO/Event/PostUpdate containing dao object that was just updated\r | |
546 | *\r | |
547 | * @access public\r | |
548 | * @static\r | |
549 | *\r | |
550 | * @return void\r | |
551 | */\r | |
552 | static public function triggerUpdate($event) {\r | |
553 | // if DB version is earlier than 4.6 skip any processing\r | |
554 | static $currentVer = NULL;\r | |
555 | if (!$currentVer) {\r | |
556 | $currentVer = CRM_Core_BAO_Domain::version();\r | |
557 | }\r | |
558 | if (version_compare($currentVer, '4.6.alpha1') < 0) {\r | |
559 | return;\r | |
560 | }\r | |
561 | \r | |
562 | static $processedEntities = array();\r | |
563 | $obj =& $event->object;\r | |
564 | if (empty($obj->id) || empty($obj->__table)) {\r | |
565 | return FALSE;\r | |
566 | }\r | |
567 | $key = "{$obj->__table}_{$obj->id}";\r | |
568 | \r | |
569 | if (array_key_exists($key, $processedEntities)) {\r | |
570 | // already processed\r | |
571 | return NULL;\r | |
572 | }\r | |
573 | \r | |
574 | // get related entities\r | |
575 | $repeatingEntities = self::getEntitiesFor($obj->id, $obj->__table, FALSE, NULL);\r | |
576 | if (empty($repeatingEntities)) {\r | |
577 | // return if its not a recurring entity parent\r | |
578 | return NULL;\r | |
579 | }\r | |
580 | // mark being processed\r | |
581 | $processedEntities[$key] = 1;\r | |
582 | \r | |
583 | // to make sure we not copying to source itself\r | |
584 | unset($repeatingEntities[$key]);\r | |
585 | \r | |
586 | foreach($repeatingEntities as $key => $val) {\r | |
587 | $entityID = $val['id'];\r | |
588 | $entityTable = $val['table'];\r | |
589 | \r | |
590 | $processedEntities[$key] = 1;\r | |
591 | \r | |
592 | if (array_key_exists($entityTable, self::$_tableDAOMapper)) {\r | |
593 | $daoName = self::$_tableDAOMapper[$entityTable];\r | |
594 | \r | |
595 | $skipData = array();\r | |
596 | if (array_key_exists($entityTable, self::$_updateSkipFields)) {\r | |
597 | $skipFields = self::$_updateSkipFields[$entityTable];\r | |
598 | foreach ($skipFields as $sfield) {\r | |
599 | $skipData[$sfield] = NULL;\r | |
600 | }\r | |
601 | }\r | |
602 | \r | |
603 | $updateDAO = CRM_Core_DAO::cascadeUpdate($daoName, $obj->id, $entityID, $skipData);\r | |
604 | CRM_Core_DAO::freeResult();\r | |
605 | }\r | |
606 | else {\r | |
607 | CRM_Core_Error::fatal("DAO Mapper missing for $entityTable.");\r | |
608 | }\r | |
609 | }\r | |
610 | // done with processing. lets unset static var.\r | |
611 | unset($processedEntities);\r | |
612 | }\r | |
613 | \r | |
614 | /**\r | |
615 | * This function acts as a listener to dao->save,\r | |
616 | * and creates entries for linked entities in recurring entity table\r | |
617 | *\r | |
618 | * @param object $event An object of /Civi/Core/DAO/Event/PostUpdate containing dao object that was just inserted\r | |
619 | *\r | |
620 | * @access public\r | |
621 | * @static\r | |
622 | *\r | |
623 | * @return void\r | |
624 | */\r | |
625 | static public function triggerInsert($event) {\r | |
626 | $obj =& $event->object;\r | |
627 | if (!array_key_exists($obj->__table, self::$_linkedEntitiesInfo)) {\r | |
628 | return FALSE;\r | |
629 | }\r | |
630 | \r | |
631 | // if DB version is earlier than 4.6 skip any processing\r | |
632 | static $currentVer = NULL;\r | |
633 | if (!$currentVer) {\r | |
634 | $currentVer = CRM_Core_BAO_Domain::version();\r | |
635 | }\r | |
636 | if (version_compare($currentVer, '4.6.alpha1') < 0) {\r | |
637 | return;\r | |
638 | }\r | |
639 | \r | |
640 | static $processedEntities = array();\r | |
641 | if (empty($obj->id) || empty($obj->__table)) {\r | |
642 | return FALSE;\r | |
643 | }\r | |
644 | $key = "{$obj->__table}_{$obj->id}";\r | |
645 | \r | |
646 | if (array_key_exists($key, $processedEntities)) {\r | |
647 | // already being processed. Exit recursive calls.\r | |
648 | return NULL;\r | |
649 | }\r | |
650 | \r | |
651 | if (self::getStatus() == self::RUNNING) {\r | |
652 | // if recursion->generate() is doing some work, lets not intercept\r | |
653 | return NULL;\r | |
654 | }\r | |
655 | \r | |
656 | // mark being processed\r | |
657 | $processedEntities[$key] = 1;\r | |
658 | \r | |
659 | // get related entities for table being saved\r | |
660 | $hasaRecurringRecord = self::getParentFor($obj->id, $obj->__table);\r | |
661 | \r | |
662 | if (empty($hasaRecurringRecord)) {\r | |
663 | // check if its a linked entity\r | |
664 | if (array_key_exists($obj->__table, self::$_linkedEntitiesInfo) &&\r | |
665 | !CRM_Utils_Array::value('is_multirecord', self::$_linkedEntitiesInfo[$obj->__table])) {\r | |
666 | $linkedDAO = new self::$_tableDAOMapper[$obj->__table]();\r | |
667 | $linkedDAO->id = $obj->id;\r | |
668 | if ($linkedDAO->find(TRUE)) {\r | |
669 | $idCol = self::$_linkedEntitiesInfo[$obj->__table]['entity_id_col'];\r | |
670 | $tableCol = self::$_linkedEntitiesInfo[$obj->__table]['entity_table_col'];\r | |
671 | \r | |
672 | $pEntityID = $linkedDAO->$idCol;\r | |
673 | $pEntityTable = $linkedDAO->$tableCol;\r | |
674 | \r | |
675 | // find all parent recurring entity set\r | |
676 | $pRepeatingEntities = self::getEntitiesFor($pEntityID, $pEntityTable);\r | |
677 | \r | |
678 | if (!empty($pRepeatingEntities)) {\r | |
679 | // for each parent entity in the set, find out a similar linked entity,\r | |
680 | // if doesn't exist create one, and also create entries in recurring_entity table\r | |
681 | \r | |
682 | foreach($pRepeatingEntities as $key => $val) {\r | |
683 | if (array_key_exists($key, $processedEntities)) {\r | |
684 | // this graph is already being processed\r | |
685 | return NULL;\r | |
686 | }\r | |
687 | $processedEntities[$key] = 1;\r | |
688 | }\r | |
689 | \r | |
690 | // start with first entry with just itself\r | |
691 | CRM_Core_BAO_RecurringEntity::quickAdd($obj->id, $obj->id, $obj->__table);\r | |
692 | \r | |
693 | foreach($pRepeatingEntities as $key => $val) {\r | |
694 | $rlinkedDAO = new self::$_tableDAOMapper[$obj->__table]();\r | |
695 | $rlinkedDAO->$idCol = $val['id'];\r | |
696 | $rlinkedDAO->$tableCol = $val['table'];\r | |
697 | if ($rlinkedDAO->find(TRUE)) {\r | |
698 | CRM_Core_BAO_RecurringEntity::quickAdd($obj->id, $rlinkedDAO->id, $obj->__table);\r | |
699 | }\r | |
700 | else {\r | |
701 | // linked entity doesn't exist. lets create them\r | |
702 | $newCriteria = array(\r | |
703 | $idCol => $val['id'],\r | |
704 | $tableCol => $val['table']\r | |
705 | );\r | |
706 | $linkedObj = CRM_Core_BAO_RecurringEntity::copyCreateEntity($obj->__table,\r | |
707 | array('id' => $obj->id),\r | |
708 | $newCriteria,\r | |
709 | TRUE\r | |
710 | );\r | |
711 | if ($linkedObj->id) {\r | |
712 | CRM_Core_BAO_RecurringEntity::quickAdd($obj->id, $linkedObj->id, $obj->__table);\r | |
713 | }\r | |
714 | }\r | |
715 | }\r | |
716 | }\r | |
717 | }\r | |
718 | }\r | |
719 | }\r | |
720 | \r | |
721 | // done with processing. lets unset static var.\r | |
722 | unset($processedEntities);\r | |
723 | }\r | |
724 | \r | |
725 | /**\r | |
726 | * This function acts as a listener to dao->delete, and deletes an entry from recurring_entity table\r | |
727 | *\r | |
728 | * @param object $event An object of /Civi/Core/DAO/Event/PostUpdate containing dao object that was just deleted\r | |
729 | *\r | |
730 | * @access public\r | |
731 | * @static\r | |
732 | *\r | |
733 | * @return void\r | |
734 | */\r | |
735 | static public function triggerDelete($event) {\r | |
736 | $obj =& $event->object;\r | |
737 | \r | |
738 | // if DB version is earlier than 4.6 skip any processing\r | |
739 | static $currentVer = NULL;\r | |
740 | if (!$currentVer) {\r | |
741 | $currentVer = CRM_Core_BAO_Domain::version();\r | |
742 | }\r | |
743 | if (version_compare($currentVer, '4.6.alpha1') < 0) {\r | |
744 | return;\r | |
745 | }\r | |
746 | \r | |
747 | static $processedEntities = array();\r | |
748 | if (empty($obj->id) || empty($obj->__table) || !$event->result) {\r | |
749 | return FALSE;\r | |
750 | }\r | |
751 | $key = "{$obj->__table}_{$obj->id}";\r | |
752 | \r | |
753 | if (array_key_exists($key, $processedEntities)) {\r | |
754 | // already processed\r | |
755 | return NULL;\r | |
756 | }\r | |
757 | \r | |
758 | // mark being processed\r | |
759 | $processedEntities[$key] = 1;\r | |
760 | \r | |
761 | $parentID = self::getParentFor($obj->id, $obj->__table);\r | |
762 | if ($parentID) {\r | |
763 | CRM_Core_BAO_RecurringEntity::delEntity($obj->id, $obj->__table, TRUE);\r | |
764 | }\r | |
765 | }\r | |
766 | \r | |
767 | /**\r | |
768 | * This function deletes main entity and related linked entities from recurring-entity table\r | |
769 | *\r | |
770 | * @param int $entityId Entity id\r | |
771 | * @param string $entityTable Name of the entity table\r | |
772 | *\r | |
773 | * @access public\r | |
774 | * @static\r | |
775 | *\r | |
776 | * @return boolean|object Returns either boolean value or CRM_Core_DAO_RecurringEntity object\r | |
777 | */\r | |
778 | static public function delEntity($entityId, $entityTable, $isDelLinkedEntities = FALSE) {\r | |
779 | if (empty($entityId) || empty($entityTable)) {\r | |
780 | return FALSE;\r | |
781 | }\r | |
782 | $dao = new CRM_Core_DAO_RecurringEntity();\r | |
783 | $dao->entity_id = $entityId;\r | |
784 | $dao->entity_table = $entityTable;\r | |
785 | if ($dao->find(TRUE)) {\r | |
786 | // make sure its not a linked entity thats being deleted\r | |
787 | if ($isDelLinkedEntities && !array_key_exists($entityTable, self::$_linkedEntitiesInfo)) {\r | |
788 | // delete all linked entities from recurring entity table\r | |
789 | foreach (self::$_linkedEntitiesInfo as $linkedTable => $linfo) {\r | |
790 | $daoName = self::$_tableDAOMapper[$linkedTable];\r | |
791 | if (!$daoName) {\r | |
792 | CRM_Core_Error::fatal("DAO Mapper missing for $linkedTable.");\r | |
793 | }\r | |
794 | \r | |
795 | $linkedDao = new $daoName();\r | |
796 | $linkedDao->$linfo['entity_id_col'] = $entityId;\r | |
797 | $linkedDao->$linfo['entity_table_col'] = $entityTable;\r | |
798 | $linkedDao->find();\r | |
799 | while ($linkedDao->fetch()) {\r | |
800 | CRM_Core_BAO_RecurringEntity::delEntity($linkedDao->id, $linkedTable, FALSE);\r | |
801 | }\r | |
802 | }\r | |
803 | }\r | |
804 | // delete main entity\r | |
805 | return $dao->delete();\r | |
806 | }\r | |
807 | return FALSE;\r | |
808 | }\r | |
809 | \r | |
810 | /**\r | |
811 | * This function maps values posted from form to civicrm_action_schedule columns\r | |
812 | *\r | |
813 | * @param array $formParams and array of form values posted\r | |
814 | *\r | |
815 | * @return array\r | |
816 | */\r | |
817 | function mapFormValuesToDB($formParams = array()) {\r | |
818 | $dbParams = array();\r | |
819 | if (CRM_Utils_Array::value('used_for', $formParams)) {\r | |
820 | $dbParams['used_for'] = $formParams['used_for'];\r | |
821 | }\r | |
822 | \r | |
823 | if (CRM_Utils_Array::value('entity_id', $formParams)) {\r | |
824 | $dbParams['entity_value'] = $formParams['entity_id'];\r | |
825 | }\r | |
826 | \r | |
827 | if (CRM_Utils_Array::value('repetition_start_date', $formParams)) {\r | |
5cdeded4 | 828 | if (CRM_Utils_Array::value('repetition_start_date_display', $formParams)) {\r |
829 | $repetitionStartDate = $formParams['repetition_start_date_display'];\r | |
830 | }\r | |
831 | else {\r | |
832 | $repetitionStartDate = $formParams['repetition_start_date'];\r | |
833 | }\r | |
e8cca51a | 834 | if (CRM_Utils_Array::value('repetition_start_date_time', $formParams)) {\r |
835 | $repetitionStartDate = $repetitionStartDate . " " . $formParams['repetition_start_date_time'];\r | |
836 | }\r | |
837 | $repetition_start_date = new DateTime($repetitionStartDate);\r | |
e8cca51a | 838 | $dbParams['start_action_date'] = CRM_Utils_Date::processDate($repetition_start_date->format('Y-m-d H:i:s'));\r |
839 | }\r | |
840 | \r | |
841 | if (CRM_Utils_Array::value('repetition_frequency_unit', $formParams)) {\r | |
842 | $dbParams['repetition_frequency_unit'] = $formParams['repetition_frequency_unit'];\r | |
843 | }\r | |
844 | \r | |
845 | if (CRM_Utils_Array::value('repetition_frequency_interval', $formParams)) {\r | |
846 | $dbParams['repetition_frequency_interval'] = $formParams['repetition_frequency_interval'];\r | |
847 | }\r | |
848 | \r | |
849 | //For Repeats on:(weekly case)\r | |
850 | if ($formParams['repetition_frequency_unit'] == 'week') {\r | |
851 | if (CRM_Utils_Array::value('start_action_condition', $formParams)) {\r | |
852 | $repeats_on = CRM_Utils_Array::value('start_action_condition', $formParams);\r | |
853 | $dbParams['start_action_condition'] = implode(",", array_keys($repeats_on));\r | |
854 | }\r | |
855 | }\r | |
856 | \r | |
857 | //For Repeats By:(monthly case)\r | |
858 | if ($formParams['repetition_frequency_unit'] == 'month') {\r | |
859 | if ($formParams['repeats_by'] == 1) {\r | |
860 | if (CRM_Utils_Array::value('limit_to', $formParams)) {\r | |
861 | $dbParams['limit_to'] = $formParams['limit_to'];\r | |
862 | }\r | |
863 | }\r | |
864 | if ($formParams['repeats_by'] == 2) {\r | |
865 | if (CRM_Utils_Array::value('entity_status_1', $formParams) && CRM_Utils_Array::value('entity_status_2', $formParams)) {\r | |
866 | $dbParams['entity_status'] = $formParams['entity_status_1']." ".$formParams['entity_status_2'];\r | |
867 | }\r | |
868 | }\r | |
869 | }\r | |
870 | \r | |
871 | //For "Ends" - After:\r | |
872 | if ($formParams['ends'] == 1) {\r | |
873 | if (CRM_Utils_Array::value('start_action_offset', $formParams)) {\r | |
874 | $dbParams['start_action_offset'] = $formParams['start_action_offset'];\r | |
875 | }\r | |
876 | }\r | |
877 | \r | |
878 | //For "Ends" - On:\r | |
879 | if ($formParams['ends'] == 2) {\r | |
880 | if (CRM_Utils_Array::value('repeat_absolute_date', $formParams)) {\r | |
881 | $dbParams['absolute_date'] = CRM_Utils_Date::processDate($formParams['repeat_absolute_date']);\r | |
882 | }\r | |
883 | }\r | |
884 | return $dbParams;\r | |
885 | }\r | |
886 | \r | |
887 | /**\r | |
888 | * This function gets all the columns of civicrm_action_schedule table based on id(primary key)\r | |
889 | *\r | |
890 | * @param int $scheduleReminderId primary key of civicrm_action_schedule table\r | |
891 | *\r | |
892 | * @access public\r | |
893 | * @static\r | |
894 | *\r | |
895 | * @return object\r | |
896 | */\r | |
897 | static public function getScheduleReminderDetailsById($scheduleReminderId) {\r | |
898 | $query = "SELECT *\r | |
899 | FROM civicrm_action_schedule WHERE 1";\r | |
900 | if ($scheduleReminderId) {\r | |
901 | $query .= "\r | |
902 | AND id = %1";\r | |
903 | }\r | |
904 | $dao = CRM_Core_DAO::executeQuery($query,\r | |
905 | array(\r | |
906 | 1 => array($scheduleReminderId, 'Integer')\r | |
907 | )\r | |
908 | );\r | |
909 | $dao->fetch();\r | |
910 | return $dao;\r | |
911 | }\r | |
912 | \r | |
913 | /**\r | |
914 | * This function is a wrapper of getScheduleReminderDetailsById function\r | |
915 | *\r | |
916 | * @param int $scheduleReminderId primary key of civicrm_action_schedule table\r | |
917 | *\r | |
918 | * @return array\r | |
919 | */\r | |
920 | function getScheduleParams($scheduleReminderId) {\r | |
921 | $scheduleReminderDetails = array();\r | |
922 | if ($scheduleReminderId) {\r | |
923 | //Get all the details from schedule reminder table\r | |
924 | $scheduleReminderDetails = self::getScheduleReminderDetailsById($scheduleReminderId);\r | |
925 | $scheduleReminderDetails = (array) $scheduleReminderDetails;\r | |
926 | }\r | |
927 | return $scheduleReminderDetails;\r | |
928 | }\r | |
929 | \r | |
930 | /**\r | |
931 | * This function takes criterias saved in civicrm_action_schedule table\r | |
932 | * and creates recursion rule\r | |
933 | *\r | |
934 | * @param array $scheduleReminderDetails array of repeat criterias saved in civicrm_action_schedule table\r | |
935 | *\r | |
936 | * @return object When object\r | |
937 | */\r | |
938 | function getRecursionFromSchedule($scheduleReminderDetails = array()) {\r | |
939 | $r = new When();\r | |
940 | //If there is some data for this id\r | |
941 | if ($scheduleReminderDetails['repetition_frequency_unit']) {\r | |
942 | if ($scheduleReminderDetails['start_action_date']) {\r | |
943 | $currDate = date('Y-m-d H:i:s', strtotime($scheduleReminderDetails['start_action_date']));\r | |
944 | }\r | |
945 | else {\r | |
946 | $currDate = date("Y-m-d H:i:s");\r | |
947 | }\r | |
948 | $start = new DateTime($currDate);\r | |
76d111d1 | 949 | $this->recursion_start_date = $start;\r |
e8cca51a | 950 | if ($scheduleReminderDetails['repetition_frequency_unit']) {\r |
951 | $repetition_frequency_unit = $scheduleReminderDetails['repetition_frequency_unit'];\r | |
952 | if ($repetition_frequency_unit == "day") {\r | |
953 | $repetition_frequency_unit = "dai";\r | |
954 | }\r | |
955 | $repetition_frequency_unit = $repetition_frequency_unit.'ly';\r | |
956 | $r->recur($start, $repetition_frequency_unit);\r | |
957 | }\r | |
958 | \r | |
959 | if ($scheduleReminderDetails['repetition_frequency_interval']) {\r | |
960 | $r->interval($scheduleReminderDetails['repetition_frequency_interval']);\r | |
961 | }\r | |
962 | else {\r | |
963 | $r->errors[] = 'Repeats every: is a required field';\r | |
964 | }\r | |
965 | \r | |
966 | //week\r | |
967 | if ($scheduleReminderDetails['repetition_frequency_unit'] == 'week') {\r | |
968 | if ($scheduleReminderDetails['start_action_condition']) {\r | |
969 | $startActionCondition = $scheduleReminderDetails['start_action_condition'];\r | |
970 | $explodeStartActionCondition = explode(',', $startActionCondition);\r | |
971 | $buildRuleArray = array();\r | |
972 | foreach($explodeStartActionCondition as $key => $val) {\r | |
973 | $buildRuleArray[] = strtoupper(substr($val, 0, 2));\r | |
974 | }\r | |
975 | $r->wkst('MO')->byday($buildRuleArray);\r | |
976 | }\r | |
977 | }\r | |
978 | \r | |
979 | //month\r | |
980 | if ($scheduleReminderDetails['repetition_frequency_unit'] == 'month') {\r | |
981 | if ($scheduleReminderDetails['entity_status']) {\r | |
982 | $startActionDate = explode(" ", $scheduleReminderDetails['entity_status']);\r | |
983 | switch ($startActionDate[0]) {\r | |
984 | case 'first':\r | |
985 | $startActionDate1 = 1;\r | |
986 | break;\r | |
987 | case 'second':\r | |
988 | $startActionDate1 = 2;\r | |
989 | break;\r | |
990 | case 'third':\r | |
991 | $startActionDate1 = 3;\r | |
992 | break;\r | |
993 | case 'fourth':\r | |
994 | $startActionDate1 = 4;\r | |
995 | break;\r | |
996 | case 'last':\r | |
997 | $startActionDate1 = -1;\r | |
998 | break;\r | |
999 | }\r | |
1000 | $concatStartActionDateBits = $startActionDate1.strtoupper(substr($startActionDate[1], 0, 2));\r | |
1001 | $r->byday(array($concatStartActionDateBits));\r | |
1002 | }\r | |
1003 | else if ($scheduleReminderDetails['limit_to']) {\r | |
1004 | $r->bymonthday(array($scheduleReminderDetails['limit_to']));\r | |
1005 | }\r | |
1006 | }\r | |
1007 | \r | |
1008 | //Ends\r | |
1009 | if ($scheduleReminderDetails['start_action_offset']) {\r | |
1010 | if ($scheduleReminderDetails['start_action_offset'] > 30) {\r | |
1011 | $r->errors[] = 'Occurrences should be less than or equal to 30';\r | |
1012 | }\r | |
1013 | $r->count($scheduleReminderDetails['start_action_offset']);\r | |
1014 | }\r | |
1015 | \r | |
1016 | if (CRM_Utils_Array::value('absolute_date', $scheduleReminderDetails)) {\r | |
1017 | $absoluteDate = CRM_Utils_Date::setDateDefaults($scheduleReminderDetails['absolute_date']);\r | |
1018 | $endDate = new DateTime($absoluteDate[0].' '.$absoluteDate[1]);\r | |
6353746f | 1019 | $endDate->modify('+1 day');\r |
e8cca51a | 1020 | $r->until($endDate);\r |
1021 | }\r | |
1022 | \r | |
1023 | if (!$scheduleReminderDetails['start_action_offset'] && !$scheduleReminderDetails['absolute_date']) {\r | |
1024 | $r->errors[] = 'Ends: is a required field';\r | |
1025 | }\r | |
1026 | }\r | |
1027 | else {\r | |
1028 | $r->errors[] = 'Repeats: is a required field';\r | |
1029 | }\r | |
1030 | return $r;\r | |
1031 | }\r | |
1032 | \r | |
1033 | \r | |
1034 | /**\r | |
1035 | * This function gets time difference between the two datetime object\r | |
1036 | *\r | |
1037 | * @param DateTime $startDate Start Date\r | |
1038 | * @param DateTime $endDate End Date\r | |
1039 | *\r | |
1040 | * @access public\r | |
1041 | * @static\r | |
1042 | *\r | |
1043 | * @return object DateTime object which contain time difference\r | |
1044 | */\r | |
1045 | static public function getInterval($startDate, $endDate) {\r | |
1046 | if ($startDate && $endDate) {\r | |
1047 | $startDate = new DateTime($startDate);\r | |
1048 | $endDate = new DateTime($endDate);\r | |
1049 | return $startDate->diff($endDate);\r | |
1050 | }\r | |
1051 | }\r | |
1052 | \r | |
1053 | /**\r | |
1054 | * This function gets all columns from civicrm_action_schedule on the basis of event id\r | |
1055 | *\r | |
1056 | * @param int $entityId Entity ID\r | |
1057 | * @param string $used_for Specifies for which entity type it's used for\r | |
1058 | *\r | |
1059 | * @access public\r | |
1060 | * @static\r | |
1061 | *\r | |
1062 | * @return object\r | |
1063 | */\r | |
1064 | public static function getReminderDetailsByEntityId($entityId, $used_for) {\r | |
1065 | if ($entityId) {\r | |
1066 | $query = "\r | |
1067 | SELECT *\r | |
1068 | FROM civicrm_action_schedule\r | |
1069 | WHERE entity_value = %1";\r | |
1070 | if ($used_for) {\r | |
1071 | $query .= " AND used_for = %2";\r | |
1072 | }\r | |
1073 | $params = array(\r | |
1074 | 1 => array($entityId, 'Integer'),\r | |
1075 | 2 => array($used_for, 'String')\r | |
1076 | );\r | |
1077 | $dao = CRM_Core_DAO::executeQuery($query, $params);\r | |
1078 | $dao->fetch();\r | |
1079 | }\r | |
1080 | return $dao;\r | |
1081 | }\r | |
1082 | \r | |
1083 | /**\r | |
c490a46a CW |
1084 | * Update mode column in civicrm_recurring_entity table for event related tabs\r |
1085 | *\r | |
1086 | * @param int $entityId event id\r | |
1087 | * @param string $linkedEntityTable Linked entity table name for this event\r | |
1088 | * @return array\r | |
1089 | */\r | |
e8cca51a | 1090 | public static function updateModeLinkedEntity($entityId, $linkedEntityTable, $mainEntityTable) {\r |
1091 | $result = array();\r | |
1092 | if ( $entityId && $linkedEntityTable && $mainEntityTable ) {\r | |
1093 | if (CRM_Utils_Array::value($linkedEntityTable, self::$_tableDAOMapper)) {\r | |
1094 | $dao = self::$_tableDAOMapper[$linkedEntityTable];\r | |
1095 | }\r | |
1096 | else {\r | |
1097 | CRM_Core_Session::setStatus('Could not update mode for linked entities');\r | |
1098 | return;\r | |
1099 | }\r | |
1100 | $entityTable = $linkedEntityTable;\r | |
1101 | $params = array(\r | |
1102 | 'entity_id' => $entityId,\r | |
1103 | 'entity_table' => $mainEntityTable\r | |
1104 | );\r | |
1105 | $defaults = array();\r | |
1106 | CRM_Core_DAO::commonRetrieve($dao, $params, $defaults);\r | |
1107 | if (CRM_Utils_Array::value('id', $defaults)) {\r | |
1108 | $result['entityId'] = $defaults['id'];\r | |
1109 | $result['entityTable'] = $entityTable;\r | |
1110 | }\r | |
1111 | }\r | |
1112 | return $result;\r | |
1113 | }\r | |
1114 | }\r |