Spaces:
No application file
No application file
namespace Mautic\LeadBundle\Controller; | |
use Mautic\EmailBundle\Model\EmailModel; | |
use Mautic\LeadBundle\Entity\DoNotContact; | |
use Mautic\LeadBundle\Entity\Lead; | |
use Mautic\LeadBundle\Form\Type\ContactFrequencyType; | |
use Mautic\LeadBundle\Model\LeadModel; | |
use Symfony\Component\Form\Form; | |
use Symfony\Component\HttpFoundation\RequestStack; | |
trait FrequencyRuleTrait | |
{ | |
protected $leadLists; | |
protected $dncChannels; | |
/** | |
* @var bool | |
*/ | |
protected $isPublicView = false; | |
private \Mautic\LeadBundle\Model\DoNotContact $doNotContactModel; | |
private ?RequestStack $requestStack = null; | |
/** | |
* @param array $viewParameters | |
* @param bool $isPublic | |
* @param bool $isPreferenceCenter | |
* | |
* @return true|Form | |
*/ | |
protected function getFrequencyRuleForm($lead, &$viewParameters = [], &$data = null, $isPublic = false, $action = null, $isPreferenceCenter = false) | |
{ | |
/** @var LeadModel $model */ | |
$model = $this->getModel('lead'); | |
$leadChannels = $model->getContactChannels($lead); | |
$allChannels = $model->getPreferenceChannels(); | |
$leadLists = $model->getLists($lead, true, true, $isPublic, $isPreferenceCenter); | |
$viewParameters = array_merge( | |
$viewParameters, | |
[ | |
'leadsLists' => $leadLists, | |
'channels' => $allChannels, | |
'leadChannels' => $leadChannels, | |
] | |
); | |
// find the email | |
$currentChannelId = null; | |
if (!empty($viewParameters['idHash'])) { | |
$emailModel = $this->getModel('email'); | |
\assert($emailModel instanceof EmailModel); | |
if ($stat = $emailModel->getEmailStatus($viewParameters['idHash'])) { | |
if ($email = $stat->getEmail()) { | |
$currentChannelId = $email->getId(); | |
} | |
} | |
} | |
if (null == $data) { | |
$data = $this->getFrequencyRuleFormData($lead, $allChannels, $leadChannels, $isPublic, null, $isPreferenceCenter); | |
} | |
/** @var Form $form */ | |
$form = $this->formFactory->create( | |
ContactFrequencyType::class, | |
$data, | |
[ | |
'action' => $action, | |
'channels' => $allChannels, | |
'public_view' => $isPublic, | |
'preference_center_only' => $isPreferenceCenter, | |
'allow_extra_fields' => true, | |
] | |
); | |
$request = $this->requestStack->getCurrentRequest(); | |
\assert(null !== $request); | |
$method = $request->getMethod(); | |
if ('GET' !== $method) { | |
if (!$this->isFormCancelled($form)) { | |
if ($this->isFormValid($form)) { | |
$this->persistFrequencyRuleFormData($lead, $form->getData(), $allChannels, $leadChannels, $currentChannelId); | |
return true; | |
} | |
} | |
} | |
return $form; | |
} | |
/** | |
* @param bool $isPublic | |
*/ | |
protected function getFrequencyRuleFormData(Lead $lead, array $allChannels = null, $leadChannels = null, $isPublic = false, $frequencyRules = null, $isPreferenceCenter = false): array | |
{ | |
$data = []; | |
/** @var LeadModel $model */ | |
$model = $this->getModel('lead'); | |
if (null === $allChannels) { | |
$allChannels = $model->getPreferenceChannels(); | |
} | |
if (null === $leadChannels) { | |
$leadChannels = $model->getContactChannels($lead); | |
} | |
if (null === $frequencyRules) { | |
$frequencyRules = $model->getFrequencyRules($lead); | |
} | |
foreach ($allChannels as $channel) { | |
if (isset($frequencyRules[$channel])) { | |
$frequencyRule = $frequencyRules[$channel]; | |
$data['lead_channels']['frequency_number_'.$channel] = $frequencyRule['frequency_number']; | |
$data['lead_channels']['frequency_time_'.$channel] = $frequencyRule['frequency_time']; | |
if ($frequencyRule['pause_from_date']) { | |
$data['lead_channels']['contact_pause_start_date_'.$channel] = new \DateTime($frequencyRule['pause_from_date']); | |
} | |
if ($frequencyRule['pause_to_date']) { | |
$data['lead_channels']['contact_pause_end_date_'.$channel] = new \DateTime($frequencyRule['pause_to_date']); | |
} | |
if (!empty($frequencyRule['preferred_channel'])) { | |
$data['lead_channels']['preferred_channel'] = $channel; | |
} | |
} | |
} | |
$data['global_categories'] = $frequencyRules['global_categories'] ?? $model->getLeadCategories( | |
$lead | |
); | |
$this->leadLists = $model->getLists($lead, false, false, $isPublic, $isPreferenceCenter); | |
$data['lead_lists'] = []; | |
foreach ($this->leadLists as $leadList) { | |
$data['lead_lists'][] = $leadList->getId(); | |
} | |
$data['lead_channels']['subscribed_channels'] = $leadChannels; | |
$this->isPublicView = $isPublic; | |
return $data; | |
} | |
/** | |
* @param int $currentChannelId | |
*/ | |
protected function persistFrequencyRuleFormData(Lead $lead, array $formData, array $allChannels, $leadChannels, $currentChannelId = null) | |
{ | |
/** @var LeadModel $leadModel */ | |
$leadModel = $this->getModel('lead.lead'); | |
$dncModel = $this->doNotContactModel; | |
\assert($dncModel instanceof \Mautic\LeadBundle\Model\DoNotContact); | |
$request = $this->requestStack->getCurrentRequest(); | |
\assert(null !== $request); | |
// iF subscribed_channels are enabled in form, then touch DNC | |
if (isset($request->request->get('lead_contact_frequency_rules')['lead_channels'])) { | |
foreach ($formData['lead_channels']['subscribed_channels'] as $contactChannel) { | |
if (!isset($leadChannels[$contactChannel])) { | |
$contactable = $dncModel->isContactable($lead, $contactChannel); | |
if (DoNotContact::UNSUBSCRIBED == $contactable || DoNotContact::MANUAL == $contactable) { | |
$dncModel->removeDncForContact($lead->getId(), $contactChannel); | |
} | |
} | |
} | |
$dncChannels = array_diff($allChannels, $formData['lead_channels']['subscribed_channels']); | |
foreach ($dncChannels as $channel) { | |
if ($currentChannelId) { | |
$channel = [$channel => $currentChannelId]; | |
} | |
$dncModel->addDncForContact($lead->getId(), $channel, ($this->isPublicView) ? DoNotContact::UNSUBSCRIBED : DoNotContact::MANUAL, 'user'); | |
} | |
} | |
$leadModel->setFrequencyRules($lead, $formData, $this->leadLists); | |
} | |
public function setDoNotContactModel(\Mautic\LeadBundle\Model\DoNotContact $doNotContactModel): void | |
{ | |
$this->doNotContactModel = $doNotContactModel; | |
} | |
/** | |
* The name is different, so it won't collide with other setters. | |
*/ | |
public function setRequestStackObject(RequestStack $requestStack): void | |
{ | |
$this->requestStack = $requestStack; | |
} | |
} | |