/** * @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; } }
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); }
/** * {@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; }
/** * @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; }
/** * @return \Iterator|null */ protected function getIterator() { return $this->marketingListProvider->getMarketingListEntitiesIterator($this->emailCampaign->getMarketingList()); }
/** * @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); }
/** * @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, [], []); }
/** * @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]]; }