Spaces:
No application file
No application file
namespace Mautic\ChannelBundle\Model; | |
use Mautic\LeadBundle\Entity\DoNotContact as DNC; | |
use Mautic\LeadBundle\Entity\Lead; | |
use Mautic\LeadBundle\Model\DoNotContact; | |
use Mautic\LeadBundle\Model\LeadModel; | |
use Symfony\Contracts\Translation\TranslatorInterface; | |
class ChannelActionModel | |
{ | |
public function __construct( | |
private LeadModel $contactModel, | |
private DoNotContact $doNotContact, | |
private TranslatorInterface $translator | |
) { | |
} | |
/** | |
* Update channels and frequency rules. | |
*/ | |
public function update(array $contactIds, array $subscribedChannels): void | |
{ | |
$contacts = $this->contactModel->getLeadsByIds($contactIds); | |
foreach ($contacts as $contact) { | |
if (!$this->contactModel->canEditContact($contact)) { | |
continue; | |
} | |
$this->addChannels($contact, $subscribedChannels); | |
$this->removeChannels($contact, $subscribedChannels); | |
} | |
} | |
/** | |
* Add contact's channels. | |
* Only resubscribe if the contact did not opt out themselves. | |
*/ | |
private function addChannels(Lead $contact, array $subscribedChannels): void | |
{ | |
$contactChannels = $this->contactModel->getContactChannels($contact); | |
foreach ($subscribedChannels as $subscribedChannel) { | |
if (!array_key_exists($subscribedChannel, $contactChannels)) { | |
$contactable = $this->doNotContact->isContactable($contact, $subscribedChannel); | |
if (DNC::UNSUBSCRIBED !== $contactable) { | |
$this->doNotContact->removeDncForContact($contact->getId(), $subscribedChannel); | |
} | |
} | |
} | |
} | |
/** | |
* Remove contact's channels. | |
*/ | |
private function removeChannels(Lead $contact, array $subscribedChannels): void | |
{ | |
$allChannels = $this->contactModel->getPreferenceChannels(); | |
$dncChannels = array_diff($allChannels, $subscribedChannels); | |
foreach ($dncChannels as $channel) { | |
$this->doNotContact->addDncForContact( | |
$contact->getId(), | |
$channel, | |
DNC::MANUAL, | |
$this->translator->trans('mautic.lead.event.donotcontact_manual') | |
); | |
} | |
} | |
} | |