Skip to content

Commit

Permalink
Capaign events with 0 delay ignore day of week restrictions (#11332)
Browse files Browse the repository at this point in the history
* Add functional test for campaign interval event

* Refactor to use dataproviders and include more test scenarios

* update test to reflect community behaviour

* include error message

* extract condition to method for readability

* Extract condition check to method

* extract condition check to method

* Allow DOW restrictions for all interval types

Co-authored-by: John Linhart <admin@escope.cz>
  • Loading branch information
Robert Parker and escopecz committed Aug 4, 2022
1 parent 52f221e commit 0f0736d
Show file tree
Hide file tree
Showing 4 changed files with 335 additions and 518 deletions.
14 changes: 0 additions & 14 deletions app/bundles/CampaignBundle/Assets/js/campaign.js
Expand Up @@ -170,12 +170,10 @@ Mautic.campaignOnUnload = function(container) {
*/
Mautic.campaignEventOnLoad = function (container, response) {
if (mQuery('#campaignevent_triggerHour').length) {
Mautic.campaignEventShowHideIntervalSettings();
Mautic.campaignEventUpdateIntervalHours();
mQuery('#campaignevent_triggerHour').on('change', Mautic.campaignEventUpdateIntervalHours);
mQuery('#campaignevent_triggerRestrictedStartHour').on('change', Mautic.campaignEventUpdateIntervalHours);
mQuery('#campaignevent_triggerRestrictedStopHour').on('change', Mautic.campaignEventUpdateIntervalHours);
mQuery('#campaignevent_triggerIntervalUnit').on('change', Mautic.campaignEventShowHideIntervalSettings);
mQuery('#campaignevent_triggerRestrictedDaysOfWeek_0').on('change', Mautic.campaignEventSelectDOW);
mQuery('#campaignevent_triggerRestrictedDaysOfWeek_1').on('change', Mautic.campaignEventSelectDOW);
mQuery('#campaignevent_triggerRestrictedDaysOfWeek_2').on('change', Mautic.campaignEventSelectDOW);
Expand Down Expand Up @@ -294,18 +292,6 @@ Mautic.campaignEventUpdateIntervalHours = function () {
}
};

/**
* Show/hide interval settings
*/
Mautic.campaignEventShowHideIntervalSettings = function() {
var unit = mQuery('#campaignevent_triggerIntervalUnit').val();
if (unit === 'i' || unit === 'h') {
mQuery('#interval_settings').addClass('hide');
} else {
mQuery('#interval_settings').removeClass('hide');
}
};

/**
* Update DOW for weekday selection
*/
Expand Down
32 changes: 18 additions & 14 deletions app/bundles/CampaignBundle/Executioner/Scheduler/Mode/Interval.php
Expand Up @@ -56,7 +56,7 @@ public function getExecutionDateTime(Event $event, \DateTime $compareFromDateTim
} catch (\Exception $exception) {
$this->logger->error('CAMPAIGN: Determining interval scheduled failed with "'.$exception->getMessage().'"');

throw new NotSchedulableException();
throw new NotSchedulableException($exception->getMessage());
}

if ($comparedToDateTime > $compareFromDateTime) {
Expand Down Expand Up @@ -146,24 +146,28 @@ public function groupContactsByDate(Event $event, ArrayCollection $contacts, \Da
*/
public function isContactSpecificExecutionDateRequired(Event $event)
{
if (Event::TRIGGER_MODE_INTERVAL !== $event->getTriggerMode()) {
if (!$this->isTriggerModeInterval($event) || $this->isRestrictedToDailyScheduling($event) || $this->hasTimeRelatedRestrictions($event)) {
return false;
}

// Restrict just for daily scheduling
if (!in_array($event->getTriggerIntervalUnit(), ['d', 'm', 'y'])) {
return false;
}
return true;
}

if (
null === $event->getTriggerHour() &&
(null === $event->getTriggerRestrictedStartHour() || null === $event->getTriggerRestrictedStopHour()) &&
empty($event->getTriggerRestrictedDaysOfWeek())
) {
return false;
}
private function isTriggerModeInterval(Event $event): bool
{
return Event::TRIGGER_MODE_INTERVAL === $event->getTriggerMode();
}

return true;
private function isRestrictedToDailyScheduling(Event $event): bool
{
return !in_array($event->getTriggerIntervalUnit(), ['d', 'm', 'y']);
}

private function hasTimeRelatedRestrictions(Event $event): bool
{
return null === $event->getTriggerHour() &&
(null === $event->getTriggerRestrictedStartHour() || null === $event->getTriggerRestrictedStopHour()) &&
empty($event->getTriggerRestrictedDaysOfWeek());
}

/**
Expand Down

0 comments on commit 0f0736d

Please sign in to comment.