From 7015248a60286e557e3513f9283a5fed8ddd6c57 Mon Sep 17 00:00:00 2001 From: eileen Date: Fri, 4 Jan 2019 18:52:55 +1300 Subject: [PATCH] Add routine for updating smartgroups, currently handling datepicker conversion --- CRM/Upgrade/Incremental/Base.php | 14 ++ CRM/Upgrade/Incremental/SmartGroups.php | 165 ++++++++++++++++++ CRM/Upgrade/Incremental/php/FiveEleven.php | 25 +-- .../CRM/Upgrade/Incremental/BaseTest.php | 19 ++ 4 files changed, 207 insertions(+), 16 deletions(-) create mode 100644 CRM/Upgrade/Incremental/SmartGroups.php diff --git a/CRM/Upgrade/Incremental/Base.php b/CRM/Upgrade/Incremental/Base.php index d66c596be9..5a7770673b 100644 --- a/CRM/Upgrade/Incremental/Base.php +++ b/CRM/Upgrade/Incremental/Base.php @@ -195,6 +195,20 @@ class CRM_Upgrade_Incremental_Base { } + /** + * Do any relevant smart group updates. + * + * @param CRM_Queue_TaskContext $ctx + * @param string $version + * + * @return bool + */ + public function updateSmartGroups($ctx, $version) { + $groupUpdateObject = new CRM_Upgrade_Incremental_SmartGroups($version); + $groupUpdateObject->updateGroups(); + return TRUE; + } + /** * Drop a column from a table if it exist. * diff --git a/CRM/Upgrade/Incremental/SmartGroups.php b/CRM/Upgrade/Incremental/SmartGroups.php new file mode 100644 index 0000000000..c22daf3941 --- /dev/null +++ b/CRM/Upgrade/Incremental/SmartGroups.php @@ -0,0 +1,165 @@ +upgradeVersion; + } + + /** + * @param string $upgradeVersion + */ + public function setUpgradeVersion($upgradeVersion) { + $this->upgradeVersion = $upgradeVersion; + } + + /** + * CRM_Upgrade_Incremental_MessageTemplates constructor. + * + * @param string $upgradeVersion + */ + public function __construct($upgradeVersion) { + $this->setUpgradeVersion($upgradeVersion); + } + + /** + * Get any conversions required for saved smart groups. + * + * @return array + */ + public function getSmartGroupConversions() { + return [ + [ + 'version' => '5.11.alpha1', + 'upgrade_descriptors' => [ts('Upgrade grant smart groups to datepicker format')], + 'actions' => [ + 'function' => 'datepickerConversion', + 'fields' => [ + 'grant_application_received_date', + 'grant_decision_date', + 'grant_money_transfer_date', + 'grant_due_date' + ] + ] + ] + ]; + } + + /** + * Convert any + * @param array $fields + */ + public function datePickerConversion($fields) { + $fieldPossibilities = []; + foreach ($fields as $field) { + $fieldPossibilities[] = $field; + $fieldPossibilities[] = $field . '_high'; + $fieldPossibilities[] = $field . '_low'; + } + + foreach ($fields as $field) { + $savedSearches = civicrm_api3('SavedSearch', 'get', [ + 'options' => ['limit' => 0], + 'form_values' => ['LIKE' => "%{$field}%"], + ])['values']; + foreach ($savedSearches as $savedSearch) { + $formValues = $savedSearch['form_values']; + foreach ($formValues as $index => $formValue) { + if (in_array($formValue[0], $fieldPossibilities)) { + $formValues[$index][2] = $this->getConvertedDateValue($formValue[2]); + } + } + if ($formValues !== $savedSearch['form_values']) { + civicrm_api3('SavedSearch', 'create', ['id' => $savedSearch['id'], 'form_values' => $formValues]); + } + } + } + } + + /** + * Update message templates. + */ + public function updateGroups() { + $conversions = $this->getSmartGroupConversionsToApply(); + foreach ($conversions as $conversion) { + $function = $conversion['function']; + $this->{$function}($conversion['fields']); + } + } + + /** + * Get any required template updates. + * + * @return array + */ + public function getSmartGroupConversionsToApply() { + $conversions = $this->getSmartGroupConversions(); + $return = []; + foreach ($conversions as $conversion) { + if ($conversion['version'] === $this->getUpgradeVersion()) { + $return[] = $conversion['actions']; + } + } + return $return; + } + + /** + * Get converted date value. + * + * @param string $dateValue + * + * @return string + * $dateValue + */ + protected function getConvertedDateValue($dateValue) { + if (date('Y-m-d', strtotime($dateValue)) !== $dateValue + && date('Y-m-d H:i:s', strtotime($dateValue)) !== $dateValue + ) { + $dateValue = date('Y-m-d H:i:s', strtotime(CRM_Utils_Date::processDate($dateValue))); + } + return $dateValue; + } + +} diff --git a/CRM/Upgrade/Incremental/php/FiveEleven.php b/CRM/Upgrade/Incremental/php/FiveEleven.php index e498501404..1335f4ed35 100644 --- a/CRM/Upgrade/Incremental/php/FiveEleven.php +++ b/CRM/Upgrade/Incremental/php/FiveEleven.php @@ -67,21 +67,14 @@ class CRM_Upgrade_Incremental_php_FiveEleven extends CRM_Upgrade_Incremental_Bas * (change the x in the function name): */ - // /** - // * Upgrade function. - // * - // * @param string $rev - // */ - // public function upgrade_5_0_x($rev) { - // $this->addTask(ts('Upgrade DB to %1: SQL', array(1 => $rev)), 'runSql', $rev); - // $this->addTask('Do the foo change', 'taskFoo', ...); - // // Additional tasks here... - // // Note: do not use ts() in the addTask description because it adds unnecessary strings to transifex. - // // The above is an exception because 'Upgrade DB to %1: SQL' is generic & reusable. - // } - - // public static function taskFoo(CRM_Queue_TaskContext $ctx, ...) { - // return TRUE; - // } + /** + * Upgrade function. + * + * @param string $rev + */ + public function upgrade_5_11_alpha1($rev) { + $this->addTask(ts('Upgrade DB to %1: SQL', array(1 => $rev)), 'runSql', $rev); + $this->addTask('Update smart groups where jcalendar fields have been converted to datepicker', 'updateSmartGroups', $rev); + } } diff --git a/tests/phpunit/CRM/Upgrade/Incremental/BaseTest.php b/tests/phpunit/CRM/Upgrade/Incremental/BaseTest.php index fc8e00a9fc..7137e61e94 100644 --- a/tests/phpunit/CRM/Upgrade/Incremental/BaseTest.php +++ b/tests/phpunit/CRM/Upgrade/Incremental/BaseTest.php @@ -80,4 +80,23 @@ class CRM_Upgrade_Incremental_BaseTest extends CiviUnitTestCase { ], $messages); } + /** + * Test converting a datepicker field. + */ + public function testSmartGroupDatePickerConversion() { + $this->callAPISuccess('SavedSearch', 'create', [ + 'form_values' => [ + ['grant_application_received_date_high', '=', '01/20/2019'], + ['grant_due_date_low', '=', '01/22/2019'], + ] + ]); + $smartGroupConversionObject = new CRM_Upgrade_Incremental_SmartGroups('5.11.alpha1'); + $smartGroupConversionObject->updateGroups(); + $savedSearch = $this->callAPISuccessGetSingle('SavedSearch', []); + $this->assertEquals('grant_application_received_date_high', $savedSearch['form_values'][0][0]); + $this->assertEquals('2019-01-20 00:00:00', $savedSearch['form_values'][0][2]); + $this->assertEquals('grant_due_date_low', $savedSearch['form_values'][1][0]); + $this->assertEquals('2019-01-22 00:00:00', $savedSearch['form_values'][1][2]); + } + } -- 2.25.1