Spaces:
No application file
No application file
File size: 2,996 Bytes
d2897cd |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 |
<?php
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;
}
}
}
}
|