From 0b1910ac546b7f4000f0f8dad5c0503bbf36cefe Mon Sep 17 00:00:00 2001 From: Monish Deb Date: Tue, 6 Apr 2021 13:05:59 +0530 Subject: [PATCH 1/1] Add effective end and start date, extend unit test --- Civi/ActionSchedule/RecipientBuilder.php | 6 ++ .../CRM/Core/BAO/ActionScheduleTest.php | 77 +++++++++++++++++-- 2 files changed, 78 insertions(+), 5 deletions(-) diff --git a/Civi/ActionSchedule/RecipientBuilder.php b/Civi/ActionSchedule/RecipientBuilder.php index c52f64adbb..8871a4e6b6 100644 --- a/Civi/ActionSchedule/RecipientBuilder.php +++ b/Civi/ActionSchedule/RecipientBuilder.php @@ -409,6 +409,12 @@ class RecipientBuilder { else { $startDateClauses[] = "DATE_SUB(!casNow, INTERVAL 1 DAY ) <= {$date}"; } + if (!empty($actionSchedule->effective_start_date)) { + $startDateClauses[] = "'{$actionSchedule->effective_start_date}' <= {$date}"; + } + if (!empty($actionSchedule->effective_end_date)) { + $startDateClauses[] = "'{$actionSchedule->effective_end_date}' > {$date}"; + } } elseif ($actionSchedule->absolute_date) { $startDateClauses[] = "DATEDIFF(DATE('!casNow'),'{$actionSchedule->absolute_date}') = 0"; diff --git a/tests/phpunit/CRM/Core/BAO/ActionScheduleTest.php b/tests/phpunit/CRM/Core/BAO/ActionScheduleTest.php index a9396c70d0..afafe4295c 100644 --- a/tests/phpunit/CRM/Core/BAO/ActionScheduleTest.php +++ b/tests/phpunit/CRM/Core/BAO/ActionScheduleTest.php @@ -164,6 +164,8 @@ class CRM_Core_BAO_ActionScheduleTest extends CiviUnitTestCase { 'start_action_offset' => '1', 'start_action_unit' => 'day', 'subject' => '1-Day (non-repeating) (about {activity.activity_type})', + 'effective_start_date' => '2012-06-14 00:00:00', + 'effective_end_date' => '2012-06-15 00:00:00', ]; $this->fixtures['sched_activity_1day_r'] = [ 'name' => 'One_Day_Phone_Call_Notice_R', @@ -194,6 +196,7 @@ class CRM_Core_BAO_ActionScheduleTest extends CiviUnitTestCase { 'start_action_offset' => '1', 'start_action_unit' => 'day', 'subject' => '1-Day (repeating) (about {activity.activity_type})', + 'effective_end_date' => '2012-06-14 16:00:00', ]; $this->fixtures['sched_activity_1day_r_on_abs_date'] = [ 'name' => 'One_Day_Phone_Call_Notice_R', @@ -341,6 +344,7 @@ class CRM_Core_BAO_ActionScheduleTest extends CiviUnitTestCase { 'start_action_offset' => '2', 'start_action_unit' => 'week', 'subject' => 'subject sched_membership_end_2week', + 'effective_start_date' => '2012-05-01 01:00:00', ]; $this->fixtures['sched_on_membership_end_date'] = [ 'name' => 'sched_on_membership_end_date', @@ -518,6 +522,7 @@ class CRM_Core_BAO_ActionScheduleTest extends CiviUnitTestCase { 'start_action_offset' => '1', 'start_action_unit' => 'day', 'subject' => 'subject sched_contact_grad_tomorrow', + 'effective_start_date' => '2013-10-15 20:00:00', ]; $this->fixtures['sched_contact_grad_anniversary'] = [ @@ -1493,9 +1498,15 @@ class CRM_Core_BAO_ActionScheduleTest extends CiviUnitTestCase { 'contact_id' => $membership['contact_id'], 'email' => 'test-member@example.com', ]); - $this->callAPISuccess('contact', 'create', array_merge($this->fixtures['contact'], ['contact_id' => $membership['contact_id']])); - - $this->createScheduleFromFixtures('sched_membership_end_2week', ['entity_value' => $membership['membership_type_id']]); + $this->callAPISuccess('contact', 'create', array_merge($this->fixtures['contact'], ['contact_id' => $membership->contact_id])); + $actionScheduleOn['effective_start_date'] = '2012-06-14 00:00:00'; + $actionScheduleAfter['effective_end_date'] = '2012-06-15 01:00:00'; + + $this->createScheduleFromFixtures('sched_membership_end_2week', [ + 'entity_value' => $membership->membership_type_id, + 'effective_start_date' => '2012-06-14 00:00:00', + 'effective_end_date' => '2012-06-15 01:00:00', + ]); // end_date=2012-06-15 ; schedule is 2 weeks before end_date $this->assertCronRuns([ @@ -1798,7 +1809,9 @@ class CRM_Core_BAO_ActionScheduleTest extends CiviUnitTestCase { $contact = $this->callAPISuccess('Contact', 'create', $this->fixtures['contact_birthdate']); $this->_testObjects['CRM_Contact_DAO_Contact'][] = $contact['id']; $modifiedDate = $this->callAPISuccess('Contact', 'getvalue', ['id' => $contact['id'], 'return' => 'modified_date']); - $this->createScheduleFromFixtures('sched_contact_mod_anniversary'); + $actionSchedule = $this->createScheduleFromFixtures('sched_contact_mod_anniversary'); + $actionSchedule['effective_start_date'] = date('Y-m-d H:i:s', strtotime($contact['values'][$contact['id']]['modified_date'])); + $actionScheduleDao = CRM_Core_BAO_ActionSchedule::add($actionSchedule); $this->assertCronRuns([ [ // On some random day, no email. @@ -1920,9 +1933,13 @@ class CRM_Core_BAO_ActionScheduleTest extends CiviUnitTestCase { $actionScheduleBefore = $this->fixtures['sched_membership_end_2week']; // Send email on end_date/expiry date $actionScheduleOn = $this->fixtures['sched_on_membership_end_date']; + $actionScheduleOn['effective_start_date'] = '2012-06-14 00:00:00'; + $actionScheduleAfter['effective_end_date'] = '2012-06-15 01:00:00'; // Send email 1 day after end_date/grace period $actionScheduleAfter = $this->fixtures['sched_after_1day_membership_end_date']; - $actionScheduleBefore['entity_value'] = $actionScheduleOn['entity_value'] = $actionScheduleAfter['entity_value'] = $membership['membership_type_id']; + $actionScheduleAfter['effective_start_date'] = '2012-06-15 01:00:00'; + $actionScheduleAfter['effective_end_date'] = '2012-06-16 02:00:00'; + $actionScheduleBefore['entity_value'] = $actionScheduleOn['entity_value'] = $actionScheduleAfter['entity_value'] = $membership->membership_type_id; foreach (['actionScheduleBefore', 'actionScheduleOn', 'actionScheduleAfter'] as $value) { $$value = CRM_Core_BAO_ActionSchedule::add($$value); } @@ -2163,6 +2180,56 @@ class CRM_Core_BAO_ActionScheduleTest extends CiviUnitTestCase { 'recipients' => [], ], ]); + + // CASE 2: Create a schedule reminder which was created 1 day after the schdule day, + // so it shouldn't deliver reminders schedule to send 1 week before the event start date + $actionSchedule = $this->fixtures['sched_event_type_start_1week_before']; + $actionSchedule['entity_value'] = CRM_Core_DAO::getFieldValue('CRM_Event_DAO_Event', $participant->event_id, 'event_type_id'); + $actionSchedule['effective_start_date'] = '20120309000000'; + $this->callAPISuccess('action_schedule', 'create', $actionSchedule); + // end_date=2012-06-15 ; schedule is 2 weeks before end_date + $this->assertCronRuns([ + [ + // 2 weeks before + 'time' => '2012-03-02 01:00:00', + 'recipients' => [], + ], + [ + // 1 week before + 'time' => '2012-03-08 01:00:00', + 'recipients' => [], + ], + [ + // And then nothing else + 'time' => '2012-03-16 01:00:00', + 'recipients' => [], + ], + ]); + + // CASE 3: Create a schedule reminder which is created less then a week before the event start date, + // so it should deliver reminders schedule to send 1 week before the event start date, set the effective end date just an hour later the reminder delivery date + $actionSchedule = $this->fixtures['sched_event_type_start_1week_before']; + $actionSchedule['entity_value'] = CRM_Core_DAO::getFieldValue('CRM_Event_DAO_Event', $participant->event_id, 'event_type_id'); + $actionSchedule['effective_end_date'] = '20120309010000'; + $this->callAPISuccess('action_schedule', 'create', $actionSchedule); + // end_date=2012-06-15 ; schedule is 2 weeks before end_date + $this->assertCronRuns([ + [ + // 2 weeks before + 'time' => '2012-03-02 01:00:00', + 'recipients' => [], + ], + [ + // 1 week before + 'time' => '2012-03-08 01:00:00', + 'recipients' => [['test-event@example.com']], + ], + [ + // And then nothing else + 'time' => '2012-03-16 01:00:00', + 'recipients' => [], + ], + ]); } /** -- 2.25.1