/**
  * @return array
  */
 public function staticCampaignProvider()
 {
     $emailCampaign = new EmailCampaign();
     $mailchimpEmailCampaign = new EmailCampaign();
     $mailchimpEmailCampaign->setTransport('mailchimp');
     return [[null, null, false], [null, new Campaign(), false], [$emailCampaign, null, false], [$emailCampaign, new Campaign(), false], [$mailchimpEmailCampaign, null, false], [$mailchimpEmailCampaign, new Campaign(), true]];
 }
 /**
  * @param EmailCampaign $emailCampaign
  * @param object  $entity
  * @return EmailCampaignStatistics
  */
 public function getStatisticsRecord(EmailCampaign $emailCampaign, $entity)
 {
     $marketingList = $emailCampaign->getMarketingList();
     $entityId = $this->doctrineHelper->getSingleEntityIdentifier($entity);
     /**
      * Cache was added because there is a case:
      * - 2 email campaigns linked to one marketing list
      * - statistic can created using batches (marketing list item connector will be used)
      *  and flush will be run once per N records creation
      * in this case same Marketing list entity will be received twice for one marketing list
      * and new MarketingListItem for same $marketingList and $entityId will be persisted twice.
      *
      * Marketing list name used as key for cache because Id can be empty and name is unique
      *
      */
     if (empty($this->marketingListItemCache[$marketingList->getName()][$entityId])) {
         // Mark marketing list item as contacted
         $this->marketingListItemCache[$marketingList->getName()][$entityId] = $this->marketingListItemConnector->getMarketingListItem($marketingList, $entityId);
     }
     /** @var MarketingListItem $marketingListItem */
     $marketingListItem = $this->marketingListItemCache[$marketingList->getName()][$entityId];
     $manager = $this->doctrineHelper->getEntityManager($this->entityName);
     $statisticsRecord = null;
     if ($marketingListItem->getId() !== null) {
         $statisticsRecord = $manager->getRepository($this->entityName)->findOneBy(['emailCampaign' => $emailCampaign, 'marketingListItem' => $marketingListItem]);
     }
     if (!$statisticsRecord) {
         $statisticsRecord = new EmailCampaignStatistics();
         $statisticsRecord->setEmailCampaign($emailCampaign)->setMarketingListItem($marketingListItem)->setOwner($emailCampaign->getOwner())->setOrganization($emailCampaign->getOrganization());
         $manager->persist($statisticsRecord);
     }
     return $statisticsRecord;
 }
 /**
  * Checks the object is an instance of a given class.
  *
  * @param EmailCampaign $entity
  * @return bool
  */
 public function isApplicableOnEmailCampaign($entity)
 {
     if ($entity instanceof EmailCampaign && $entity->getTransport() == MailChimpTransport::NAME) {
         $campaign = $this->registry->getManager()->getRepository('OroCRMMailChimpBundle:Campaign')->findOneBy(['emailCampaign' => $entity]);
         return (bool) $campaign;
     } else {
         return false;
     }
 }
Пример #4
0
 public function testGetEntityName()
 {
     $marketingList = new MarketingList();
     $marketingList->setEntity('\\stdClass');
     $campaign = new EmailCampaign();
     $this->assertNull($campaign->getEntityName());
     $campaign->setMarketingList($marketingList);
     $this->assertEquals($marketingList->getEntity(), $campaign->getEntityName());
 }
 public function testPreSet()
 {
     $marketingList = new MarketingList();
     $marketingList->setEntity('\\stdClass');
     $emailCampaign = new EmailCampaign();
     $emailCampaign->setMarketingList($marketingList);
     $this->form->expects($this->once())->method('getData')->will($this->returnValue($emailCampaign));
     $this->form->expects($this->atLeastOnce())->method('add');
     $event = new FormEvent($this->form, []);
     $this->listener->preSet($event);
 }
Пример #6
0
 /**
  * {@inheritdoc}
  */
 public function send(EmailCampaign $campaign, $entity, array $from, array $to)
 {
     $entityId = $this->doctrineHelper->getSingleEntityIdentifier($entity);
     $marketingList = $campaign->getMarketingList();
     /** @var EmailTemplate $template */
     $template = $campaign->getTransportSettings()->getSettingsBag()->get('template');
     list($subjectRendered, $templateRendered) = $this->emailRenderer->compileMessage($template, ['entity' => $entity]);
     $emailModel = new Email();
     $emailModel->setType($template->getType())->setFrom($this->buildFullEmailAddress($from))->setEntityClass($marketingList->getEntity())->setEntityId($entityId)->setTo($to)->setSubject($subjectRendered)->setBody($templateRendered);
     $this->processor->process($emailModel);
 }
 /**
  * @param EmailCampaign $emailCampaign
  * @param object  $entity
  * @return EmailCampaignStatistics
  */
 public function getStatisticsRecord(EmailCampaign $emailCampaign, $entity)
 {
     $marketingList = $emailCampaign->getMarketingList();
     $entityId = $this->doctrineHelper->getSingleEntityIdentifier($entity);
     // Mark marketing list item as contacted
     $marketingListItem = $this->marketingListItemConnector->getMarketingListItem($marketingList, $entityId);
     $manager = $this->doctrineHelper->getEntityManager($this->entityName);
     $statisticsRecord = null;
     if ($marketingListItem->getId() !== null) {
         $statisticsRecord = $manager->getRepository($this->entityName)->findOneBy(['emailCampaign' => $emailCampaign, 'marketingListItem' => $marketingListItem]);
     }
     if (!$statisticsRecord) {
         $statisticsRecord = new EmailCampaignStatistics();
         $statisticsRecord->setEmailCampaign($emailCampaign)->setMarketingListItem($marketingListItem)->setOwner($emailCampaign->getOwner())->setOrganization($emailCampaign->getOrganization());
         $manager->persist($statisticsRecord);
     }
     return $statisticsRecord;
 }
Пример #8
0
 /**
  * @param EmailCampaign $entity
  * @return bool
  */
 protected function isManualSendAllowed(EmailCampaign $entity)
 {
     $sendAllowed = $entity->getSchedule() === EmailCampaign::SCHEDULE_MANUAL && !$entity->isSent();
     if ($sendAllowed) {
         $transportSettings = $entity->getTransportSettings();
         if ($transportSettings) {
             $validator = $this->get('validator');
             $errors = $validator->validate($transportSettings);
             $sendAllowed = count($errors) === 0;
         }
     }
     return $sendAllowed;
 }
Пример #9
0
 /**
  * @return \Iterator|null
  */
 protected function getIterator()
 {
     return $this->marketingListProvider->getMarketingListEntitiesIterator($this->emailCampaign->getMarketingList());
 }
Пример #10
0
 /**
  * @param array $iterable
  *
  * @dataProvider sendDataProvider
  */
 public function testSendError($iterable, $to)
 {
     $segment = new Segment();
     $marketingList = new MarketingList();
     $marketingList->setSegment($segment);
     $campaign = new EmailCampaign();
     $campaign->setMarketingList($marketingList)->setSenderEmail(reset($to));
     $itCount = count($iterable);
     $this->marketingListProvider->expects($this->once())->method('getMarketingListEntitiesIterator')->will($this->returnValue($iterable));
     $manager = $this->getMockBuilder('\\Doctrine\\ORM\\EntityManager')->disableOriginalConstructor()->getMock();
     $this->registry->expects($this->once())->method('getManager')->will($this->returnValue($manager));
     $manager->expects($this->once())->method('persist')->with($campaign);
     $manager->expects($this->atLeastOnce())->method('flush');
     $manager->expects($this->exactly($itCount))->method('beginTransaction');
     $manager->expects($this->exactly($itCount))->method('rollback');
     if ($itCount) {
         $this->contactInformationFieldsProvider->expects($this->exactly($itCount))->method('getQueryContactInformationFields')->with($this->equalTo($segment), $this->isType('object'), $this->equalTo(ContactInformationFieldsProvider::CONTACT_INFORMATION_SCOPE_EMAIL))->will($this->returnValue($to));
         $this->marketingListConnector->expects($this->exactly($itCount))->method('contact')->with($this->equalTo($marketingList), $this->equalTo(self::ENTITY_ID))->will($this->returnCallback(function () {
             throw new \Exception('Error');
         }));
         $this->logger->expects($this->exactly($itCount))->method('error');
     }
     $this->transport->expects($this->exactly($itCount))->method('send');
     $this->transportProvider->expects($this->once())->method('getTransportByName')->will($this->returnValue($this->transport));
     $this->sender->setEmailCampaign($campaign);
     $this->sender->send($campaign);
 }
Пример #11
0
 /**
  * @expectedException \InvalidArgumentException
  * @expectedExceptionMessage Sender email and name is empty
  */
 public function testFromEmpty()
 {
     $entity = new \stdClass();
     $this->helper->expects($this->once())->method('getSingleEntityIdentifier')->will($this->returnValue(1));
     $marketingList = new MarketingList();
     $marketingList->setEntity($entity);
     $template = new EmailTemplate();
     $template->setType('html');
     $settings = new InternalTransportSettings();
     $settings->setTemplate($template);
     $campaign = new EmailCampaign();
     $campaign->setMarketingList($marketingList)->setTransportSettings($settings);
     $this->transport->send($campaign, $entity, [], []);
 }
Пример #12
0
 /**
  * @param array $iterable
  * @param array $to
  * @param object $type
  * @dataProvider sendDataProvider
  */
 public function testSendError($iterable, $to, $type)
 {
     $segment = new Segment();
     $entity = '\\stdClass';
     $marketingList = new MarketingList();
     $marketingList->setSegment($segment);
     $marketingList->setType($type);
     $marketingList->setEntity($entity);
     $campaign = new EmailCampaign();
     $campaign->setMarketingList($marketingList)->setSenderEmail(reset($to));
     $itCount = count($iterable);
     $this->marketingListProvider->expects($this->once())->method('getMarketingListEntitiesIterator')->will($this->returnValue($iterable));
     $manager = $this->getMockBuilder('\\Doctrine\\ORM\\EntityManager')->disableOriginalConstructor()->getMock();
     $this->registry->expects($this->once())->method('getManager')->will($this->returnValue($manager));
     $manager->expects($this->once())->method('persist')->with($campaign);
     $manager->expects($this->atLeastOnce())->method('flush');
     $manager->expects($this->exactly($itCount))->method('beginTransaction');
     $manager->expects($this->exactly($itCount))->method('rollback');
     $fields = ['email'];
     $this->assertFieldsCall($fields, $marketingList);
     if ($itCount) {
         $this->contactInformationFieldsProvider->expects($this->exactly($itCount))->method('getTypedFieldsValues')->with($this->equalTo($fields), $this->isType('object'))->will($this->returnValue($to));
         $this->statisticsConnector->expects($this->exactly($itCount))->method('getStatisticsRecord')->with($this->equalTo($campaign), $this->isInstanceOf('stdClass'))->willThrowException(new \Exception('Error'));
         $this->logger->expects($this->exactly($itCount))->method('error');
     }
     $this->transport->expects($this->exactly($itCount))->method('send');
     $this->transportProvider->expects($this->once())->method('getTransportByName')->will($this->returnValue($this->transport));
     $this->sender->setEmailCampaign($campaign);
     $this->sender->send($campaign);
 }
 /**
  * @return array
  */
 public function attributesDataProvider()
 {
     $emailCampaignNew = new EmailCampaign();
     $emailCampaignSent = new EmailCampaign();
     $emailCampaignSent->setSent(true);
     return [[['VIEW'], $emailCampaignNew, EmailCampaignVoter::ACCESS_ABSTAIN], [['CREATE'], $emailCampaignNew, EmailCampaignVoter::ACCESS_ABSTAIN], [['EDIT'], $emailCampaignNew, EmailCampaignVoter::ACCESS_ABSTAIN], [['DELETE'], $emailCampaignNew, EmailCampaignVoter::ACCESS_ABSTAIN], [['ASSIGN'], $emailCampaignNew, EmailCampaignVoter::ACCESS_ABSTAIN], [['VIEW'], $emailCampaignSent, EmailCampaignVoter::ACCESS_ABSTAIN], [['CREATE'], $emailCampaignSent, EmailCampaignVoter::ACCESS_ABSTAIN], [['EDIT'], $emailCampaignSent, EmailCampaignVoter::ACCESS_DENIED], [['DELETE'], $emailCampaignSent, EmailCampaignVoter::ACCESS_ABSTAIN], [['ASSIGN'], $emailCampaignSent, EmailCampaignVoter::ACCESS_ABSTAIN]];
 }