Spaces:
No application file
No application file
namespace Mautic\ChannelBundle\PreferenceBuilder; | |
use Doctrine\Common\Collections\ArrayCollection; | |
use Mautic\CampaignBundle\Entity\Event; | |
use Mautic\CampaignBundle\Entity\LeadEventLog; | |
use Mautic\LeadBundle\Entity\DoNotContact; | |
use Psr\Log\LoggerInterface; | |
class PreferenceBuilder | |
{ | |
/** | |
* @var ChannelPreferences[] | |
*/ | |
private array $channels = []; | |
public function __construct( | |
ArrayCollection $logs, | |
private Event $event, | |
array $channels, | |
private LoggerInterface $logger | |
) { | |
$this->buildRules($logs, $channels); | |
} | |
/** | |
* @return ChannelPreferences[] | |
*/ | |
public function getChannelPreferences() | |
{ | |
return $this->channels; | |
} | |
public function removeLogFromAllChannels(LeadEventLog $log): void | |
{ | |
foreach ($this->channels as $channelPreferences) { | |
$channelPreferences->removeLog($log); | |
} | |
} | |
/** | |
* @param string $channel | |
* @param int $priority | |
*/ | |
private function addChannelRule($channel, array $rule, LeadEventLog $log, $priority): void | |
{ | |
$channelPreferences = $this->getChannelPreferenceObject($channel, $priority); | |
if (DoNotContact::IS_CONTACTABLE !== $rule['dnc']) { | |
$log->appendToMetadata( | |
[ | |
$channel => [ | |
'failed' => 1, | |
'dnc' => $rule['dnc'], | |
], | |
] | |
); | |
return; | |
} | |
$this->logger->debug("MARKETING MESSAGE: Set $channel as priority $priority for contact ID #".$log->getLead()->getId()); | |
$channelPreferences->addLog($log, $priority); | |
} | |
/** | |
* @param string $channel | |
* | |
* @return ChannelPreferences | |
*/ | |
private function getChannelPreferenceObject($channel, $priority) | |
{ | |
if (!isset($this->channels[$channel])) { | |
$this->channels[$channel] = new ChannelPreferences($this->event); | |
} | |
$this->channels[$channel]->addPriority($priority); | |
return $this->channels[$channel]; | |
} | |
private function buildRules(ArrayCollection $logs, array $channels): void | |
{ | |
/** @var LeadEventLog $log */ | |
foreach ($logs as $log) { | |
$channelRules = $log->getLead()->getChannelRules(); | |
$allChannels = $channels; | |
$priority = 1; | |
// Build priority based on channel rules | |
foreach ($channelRules as $channel => $rule) { | |
$this->addChannelRule($channel, $rule, $log, $priority); | |
++$priority; | |
unset($allChannels[$channel]); | |
} | |
// Add the rest of the channels as least priority | |
foreach ($allChannels as $channel => $messageSettings) { | |
$this->addChannelRule($channel, ['dnc' => DoNotContact::IS_CONTACTABLE], $log, $priority); | |
++$priority; | |
} | |
} | |
} | |
} | |