/** * @dataProvider existingDataProvider * @param bool $existing */ public function testGetStatisticsRecordExisting($existing) { $entity = new \stdClass(); $entityId = 1; $entityClass = get_class($entity); $marketingList = $this->getMockBuilder('OroCRM\\Bundle\\MarketingListBundle\\Entity\\MarketingList')->disableOriginalConstructor()->getMock(); $emailCampaign = $this->getMockBuilder('OroCRM\\Bundle\\CampaignBundle\\Entity\\EmailCampaign')->disableOriginalConstructor()->getMock(); $emailCampaign->expects($this->once())->method('getMarketingList')->will($this->returnValue($marketingList)); $this->doctrineHelper->expects($this->once())->method('getSingleEntityIdentifier')->with($entity)->will($this->returnValue($entityId)); $marketingListItem = $this->getMockBuilder('OroCRM\\Bundle\\MarketingListBundle\\Entity\\MarketingListItem')->disableOriginalConstructor()->getMock(); $marketingListItem->expects($this->any())->method('getId')->willReturn(42); $this->marketingListItemConnector->expects($this->once())->method('getMarketingListItem')->with($marketingList, $entityId)->will($this->returnValue($marketingListItem)); $statisticsRecord = new EmailCampaignStatistics(); $repository = $this->getMockBuilder('\\Doctrine\\Common\\Persistence\\ObjectRepository')->disableOriginalConstructor()->getMock(); $manager = $this->getMockBuilder('\\Doctrine\\Common\\Persistence\\ObjectManager')->disableArgumentCloning()->getMock(); $manager->expects($this->once())->method('getRepository')->with($entityClass)->will($this->returnValue($repository)); $this->doctrineHelper->expects($this->once())->method('getEntityManager')->with($entityClass)->will($this->returnValue($manager)); if ($existing) { $repository->expects($this->once())->method('findOneBy')->with(['emailCampaign' => $emailCampaign, 'marketingListItem' => $marketingListItem])->will($this->returnValue($statisticsRecord)); } else { $repository->expects($this->once())->method('findOneBy')->with(['emailCampaign' => $emailCampaign, 'marketingListItem' => $marketingListItem])->will($this->returnValue(null)); $manager->expects($this->once())->method('persist')->with($this->isInstanceOf('OroCRM\\Bundle\\CampaignBundle\\Entity\\EmailCampaignStatistics')); } $this->connector->setEntityName($entityClass); $actualRecord = $this->connector->getStatisticsRecord($emailCampaign, $entity); if (!$existing) { $this->assertEquals($emailCampaign, $actualRecord->getEmailCampaign(), 'unexpected email campaign'); $this->assertEquals($marketingListItem, $actualRecord->getMarketingListItem(), 'unexpected marketing list item campaign'); } else { $this->assertEquals($statisticsRecord, $actualRecord); } }
/** * @param MemberActivity $memberActivity */ protected function updateStatistics(MemberActivity $memberActivity) { $mailChimpCampaign = $memberActivity->getCampaign(); $emailCampaign = $mailChimpCampaign->getEmailCampaign(); $marketingList = $mailChimpCampaign->getStaticSegment()->getMarketingList(); $relatedEntities = $this->getMarketingListEntitiesByEmail($marketingList, $memberActivity->getEmail()); $em = $this->registry->getManager(); foreach ($relatedEntities as $relatedEntity) { $emailCampaignStatistics = $this->campaignStatisticsConnector->getStatisticsRecord($emailCampaign, $relatedEntity); $this->incrementStatistics($memberActivity, $emailCampaignStatistics); $em->persist($emailCampaignStatistics); } }
public function send() { if (!$this->assertTransport()) { return; } $marketingList = $this->emailCampaign->getMarketingList(); if (is_null($marketingList)) { return; } $iterator = $this->getIterator(); if (is_null($iterator)) { return; } /** @var EntityManager $manager */ $manager = $this->registry->getManager(); $emailFields = $this->contactInformationFieldsProvider->getMarketingListTypedFields($marketingList, ContactInformationFieldsProvider::CONTACT_INFORMATION_SCOPE_EMAIL); foreach ($iterator as $entity) { $to = $this->contactInformationFieldsProvider->getTypedFieldsValues($emailFields, $entity); $to = array_unique($to); try { $manager->beginTransaction(); // Do actual send $this->transport->send($this->emailCampaign, $entity, [$this->getSenderEmail() => $this->getSenderName()], $to); $statisticsRecord = $this->statisticsConnector->getStatisticsRecord($this->emailCampaign, $entity); // Mark marketing list item as contacted $statisticsRecord->getMarketingListItem()->contact(); $manager->flush($statisticsRecord); $manager->commit(); } catch (\Exception $e) { $manager->rollback(); if ($this->logger) { $this->logger->error(sprintf('Email sending to "%s" failed.', implode(', ', $to)), ['exception' => $e]); } } } $this->emailCampaign->setSent(true); $manager->persist($this->emailCampaign); $manager->flush(); }