Skip to content

Commit

Permalink
Add effective end and start date, extend unit test
Browse files Browse the repository at this point in the history
  • Loading branch information
monishdeb committed May 3, 2021
1 parent 41ac307 commit 09c992d
Show file tree
Hide file tree
Showing 2 changed files with 75 additions and 2 deletions.
6 changes: 6 additions & 0 deletions Civi/ActionSchedule/RecipientBuilder.php
Original file line number Diff line number Diff line change
Expand Up @@ -409,6 +409,12 @@ protected function prepareStartDateClauses() {
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";
Expand Down
71 changes: 69 additions & 2 deletions tests/phpunit/CRM/Core/BAO/ActionScheduleTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -153,6 +153,8 @@ public function setUp(): void {
'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',
Expand Down Expand Up @@ -183,6 +185,7 @@ public function setUp(): void {
'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',
Expand Down Expand Up @@ -330,6 +333,7 @@ public function setUp(): void {
'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',
Expand Down Expand Up @@ -507,6 +511,7 @@ public function setUp(): void {
'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'] = [
Expand Down Expand Up @@ -1456,8 +1461,14 @@ public function testMembershipEndDateMatch(): void {
'email' => 'test-member@example.com',
]);
$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]);
$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([
Expand Down Expand Up @@ -1767,7 +1778,9 @@ public function testContactModifiedAnniversary(): void {
$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.
Expand Down Expand Up @@ -1883,8 +1896,12 @@ public function testMembershipOnMultipleReminder(): void {
$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'];
$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);
Expand Down Expand Up @@ -2126,6 +2143,56 @@ public function testEventTypeStartDate(): void {
'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' => [],
],
]);
}

/**
Expand Down

0 comments on commit 09c992d

Please sign in to comment.