/** * @param CampaignExecutionEvent $event */ public function onCampaignTriggerAction(CampaignExecutionEvent $event) { $lead = $event->getLead(); if ($this->leadModel->isContactable($lead, 'sms') !== DoNotContact::IS_CONTACTABLE) { return $event->setFailed('mautic.sms.campaign.failed.not_contactable'); } $leadPhoneNumber = $lead->getFieldValue('mobile'); if (empty($leadPhoneNumber)) { $leadPhoneNumber = $lead->getFieldValue('phone'); } if (empty($leadPhoneNumber)) { return $event->setFailed('mautic.sms.campaign.failed.missing_number'); } $smsId = (int) $event->getConfig()['sms']; $sms = $this->smsModel->getEntity($smsId); if ($sms->getId() !== $smsId) { return $event->setFailed('mautic.sms.campaign.failed.missing_entity'); } $smsEvent = new SmsSendEvent($sms->getMessage(), $lead); $smsEvent->setSmsId($smsId); $this->dispatcher->dispatch(SmsEvents::SMS_ON_SEND, $smsEvent); $tokenEvent = $this->dispatcher->dispatch(SmsEvents::TOKEN_REPLACEMENT, new TokenReplacementEvent($smsEvent->getContent(), $lead, ['channel' => ['sms', $sms->getId()]])); $metadata = $this->smsApi->sendSms($leadPhoneNumber, $tokenEvent->getContent()); $defaultFrequencyNumber = $this->coreParametersHelper->getParameter('sms_frequency_number'); $defaultFrequencyTime = $this->coreParametersHelper->getParameter('sms_frequency_time'); /** @var \Mautic\LeadBundle\Entity\FrequencyRuleRepository $frequencyRulesRepo */ $frequencyRulesRepo = $this->leadModel->getFrequencyRuleRepository(); $leadIds = $lead->getId(); $dontSendTo = $frequencyRulesRepo->getAppliedFrequencyRules('sms', $leadIds, $defaultFrequencyNumber, $defaultFrequencyTime); if (!empty($dontSendTo) and $dontSendTo[0]['lead_id'] != $lead->getId()) { $metadata = $this->smsApi->sendSms($leadPhoneNumber, $smsEvent->getContent()); } // If there was a problem sending at this point, it's an API problem and should be requeued if ($metadata === false) { return $event->setResult(false); } $this->smsModel->createStatEntry($sms, $lead); $this->smsModel->getRepository()->upCount($smsId); $event->setChannel('sms', $sms->getId()); $event->setResult(['type' => 'mautic.sms.sms', 'status' => 'mautic.sms.timeline.status.delivered', 'id' => $sms->getId(), 'name' => $sms->getName(), 'content' => $tokenEvent->getContent()]); }
/** * @param array $config * @param Lead $lead * @param MauticFactory $factory * * @return boolean */ public static function send(array $config, Lead $lead, MauticFactory $factory) { /** @var \Mautic\LeadBundle\Model\LeadModel $leadModel */ $leadModel = $factory->getModel('lead.lead'); if ($leadModel->isContactable($lead, 'sms') !== DoNotContact::IS_CONTACTABLE) { return array('failed' => 1); } $leadPhoneNumber = $lead->getFieldValue('mobile'); if (empty($leadPhoneNumber)) { $leadPhoneNumber = $lead->getFieldValue('phone'); } if (empty($leadPhoneNumber)) { return array('failed' => 1); } /** @var \Mautic\SmsBundle\Api\AbstractSmsApi $sms */ $smsApi = $factory->getKernel()->getContainer()->get('mautic.sms.api'); /** @var \Mautic\SmsBundle\Model\SmsModel $smsModel */ $smsModel = $factory->getModel('sms'); $smsId = (int) $config['sms']; /** @var \Mautic\SmsBundle\Entity\Sms $sms */ $sms = $smsModel->getEntity($smsId); if ($sms->getId() !== $smsId) { return array('failed' => 1); } $dispatcher = $factory->getDispatcher(); $event = new SmsSendEvent($sms->getMessage(), $lead); $event->setSmsId($smsId); $dispatcher->dispatch(SmsEvents::SMS_ON_SEND, $event); $metadata = $smsApi->sendSms($leadPhoneNumber, $event->getContent()); // If there was a problem sending at this point, it's an API problem and should be requeued if ($metadata === false) { return false; } return array('type' => 'mautic.sms.sms', 'status' => 'mautic.sms.timeline.status.delivered', 'id' => $sms->getId(), 'name' => $sms->getName(), 'content' => $event->getContent()); }