/**
  * @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);
     }
 }
示例#3
0
 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();
 }
 public function onClear()
 {
     $this->emailCampaignStatisticsConnector->clearMarketingListItemCache();
 }