/**
  * @param array $contactInfoFields
  * @param array $contactInfoFields
  * @param object $entity
  * @param string $type
  * @param array $expected
  *
  * @dataProvider fieldsDataProvider
  */
 public function testGetQueryContactInformationFields($contactInfoFields, $definition, $entity, $type, $expected)
 {
     $queryDesigner = $this->getMockForAbstractClass('Oro\\Bundle\\QueryDesignerBundle\\Model\\AbstractQueryDesigner');
     $queryDesigner->expects($this->any())->method('getDefinition')->will($this->returnValue($definition));
     $this->helper->expects($this->once())->method('getEntityContactInformationColumns')->will($this->returnValue($contactInfoFields));
     $this->assertEquals($expected, $this->provider->getQueryContactInformationFields($queryDesigner, $entity, $type));
 }
 /**
  * @param mixed $entity
  * @return bool
  */
 public function isApplicable($entity)
 {
     if ($entity instanceof MarketingList) {
         return (bool) $this->fieldsProvider->getMarketingListTypedFields($entity, ContactInformationFieldsProvider::CONTACT_INFORMATION_SCOPE_EMAIL);
     }
     return false;
 }
Пример #3
0
 /**
  * {@inheritdoc}
  */
 protected function isConditionAllowed($context)
 {
     $marketingList = $this->resolveValue($context, $this->marketingList, false);
     $type = $this->resolveValue($context, $this->type, false);
     if (!$marketingList instanceof MarketingList) {
         throw new InvalidArgumentException('Option "marketing_list" must be instance of "OroCRM\\Bundle\\MarketingListBundle\\Entity\\MarketingList"');
     }
     return (bool) $this->fieldsProvider->getMarketingListTypedFields($marketingList, $type);
 }
 /**
  * @param MarketingList $marketingList
  * @param string $email
  * @return QueryBuilder
  */
 protected function getMarketingListEntitiesByEmailQueryBuilder(MarketingList $marketingList, $email)
 {
     $emailFields = $this->contactInformationFieldsProvider->getMarketingListTypedFields($marketingList, ContactInformationFieldsProvider::CONTACT_INFORMATION_SCOPE_EMAIL);
     $qb = $this->getEntitiesQueryBuilder($marketingList);
     $expr = $qb->expr()->orX();
     foreach ($emailFields as $emailField) {
         $parameterName = $emailField . mt_rand();
         $expr->add($qb->expr()->eq($this->fieldHelper->getFieldExpr($marketingList->getEntity(), $qb, $emailField), ':' . $parameterName));
         $qb->setParameter($parameterName, $email);
     }
     $qb->andWhere($expr);
     return $qb;
 }
Пример #5
0
 public function send()
 {
     $this->assertTransport();
     $marketingList = $this->emailCampaign->getMarketingList();
     /** @var EntityManager $manager */
     $manager = $this->registry->getManager();
     foreach ($this->getIterator() as $entity) {
         $to = $this->contactInformationFieldsProvider->getQueryContactInformationFields($marketingList->getSegment(), $entity, ContactInformationFieldsProvider::CONTACT_INFORMATION_SCOPE_EMAIL);
         try {
             $manager->beginTransaction();
             // Do actual send
             $this->transport->send($this->emailCampaign, $entity, [$this->getSenderEmail() => $this->getSenderName()], $to);
             // Mark marketing list item as contacted
             $marketingListItem = $this->marketingListItemConnector->contact($marketingList, $entity->getId());
             // Record email campaign contact statistic
             $statisticsRecord = new EmailCampaignStatistics();
             $statisticsRecord->setEmailCampaign($this->emailCampaign)->setMarketingListItem($marketingListItem);
             $manager->persist($statisticsRecord);
             $manager->flush();
             $manager->commit();
         } catch (\Exception $e) {
             $manager->rollback();
             if ($this->logger) {
                 $this->logger->error(sprintf('Email sending to "%s" failed.', implode(', ', $to)), array('exception' => $e));
             }
         }
     }
     $this->emailCampaign->setSent(true);
     $manager->persist($this->emailCampaign);
     $manager->flush();
 }
 /**
  * {@inheritdoc}
  */
 protected function getPermissionForAttribute($class, $identifier, $attribute)
 {
     /** @var MarketingListStateItemInterface $item */
     $item = $this->doctrineHelper->getEntityRepository($this->className)->find($identifier);
     $entityClass = $item->getMarketingList()->getEntity();
     $entity = $this->doctrineHelper->getEntityRepository($entityClass)->find($item->getEntityId());
     if (!$entity) {
         return self::ACCESS_ABSTAIN;
     }
     $contactInformationFields = $this->contactInformationFieldsProvider->getEntityTypedFields($entityClass, ContactInformationFieldsProvider::CONTACT_INFORMATION_SCOPE_EMAIL);
     $contactInformationValues = $this->contactInformationFieldsProvider->getTypedFieldsValues($contactInformationFields, $entity);
     $qb = $this->getQueryBuilder($contactInformationValues, $item);
     $result = $qb->getQuery()->getScalarResult();
     if (!empty($result)) {
         return self::ACCESS_DENIED;
     }
     return self::ACCESS_ABSTAIN;
 }
 /**
  * @param array $contactInfoFields
  * @param array $definition
  * @param string $type
  * @param array $expected
  *
  * @dataProvider queryFieldsDataProvider
  */
 public function testGetMarketingListTypedFieldsNonManual($contactInfoFields, $definition, $type, $expected)
 {
     $queryDesigner = $this->getMockBuilder('Oro\\Bundle\\QueryDesignerBundle\\Model\\AbstractQueryDesigner')->disableOriginalConstructor()->getMockForAbstractClass();
     $queryDesigner->expects($this->any())->method('getEntity')->will($this->returnValue('\\stdClass'));
     $marketingList = $this->getMockBuilder('OroCRM\\Bundle\\MarketingListBundle\\Entity\\MarketingList')->disableOriginalConstructor()->getMock();
     $marketingList->expects($this->once())->method('isManual')->will($this->returnValue(false));
     $marketingList->expects($this->once())->method('getSegment')->will($this->returnValue($queryDesigner));
     $this->assertGetQueryTypedFieldsCalls($queryDesigner, $definition, $contactInfoFields);
     $this->assertEquals($expected, $this->provider->getMarketingListTypedFields($marketingList, $type));
 }
 /**
  * @param StaticSegment $staticSegment
  * @param QueryBuilder $qb
  * @return void
  */
 public function prepareMarketingListEntities(StaticSegment $staticSegment, QueryBuilder $qb)
 {
     if (!$this->memberClassName) {
         throw new \InvalidArgumentException('Member class name must be provided');
     }
     $marketingList = $staticSegment->getMarketingList();
     $contactInformationFields = $this->contactInformationFieldsProvider->getMarketingListTypedFields($marketingList, ContactInformationFieldsProvider::CONTACT_INFORMATION_SCOPE_EMAIL);
     $expr = $qb->expr()->orX();
     foreach ($contactInformationFields as $contactInformationField) {
         $contactInformationFieldExpr = $this->fieldHelper->getFieldExpr($marketingList->getEntity(), $qb, $contactInformationField);
         $qb->addSelect($contactInformationFieldExpr . ' AS ' . $contactInformationField);
         $expr->add($qb->expr()->eq($contactInformationFieldExpr, sprintf('%s.%s', self::MEMBER_ALIAS, self::MEMBER_EMAIL_FIELD)));
     }
     $organization = $staticSegment->getChannel()->getOrganization();
     $metadata = $this->ownershipMetadataProvider->getMetadata($marketingList->getEntity());
     if ($organization && ($fieldName = $metadata->getOrganizationFieldName())) {
         $aliases = $qb->getRootAliases();
         $qb->andWhere($qb->expr()->eq(sprintf('%s.%s', reset($aliases), $fieldName), ':organization'));
         $qb->setParameter('organization', $organization);
     }
     $qb->leftJoin($this->memberClassName, self::MEMBER_ALIAS, Join::WITH, $qb->expr()->andX($expr, $qb->expr()->eq(sprintf('%s.subscribersList', self::MEMBER_ALIAS), ':subscribersList')))->setParameter('subscribersList', $staticSegment->getSubscribersList()->getId());
 }
 /**
  * @param mixed $identifier
  * @param mixed $className
  * @param mixed $object
  * @param bool $expected
  * @param array $attributes
  * @param string|null $queryResult
  * @dataProvider attributesDataProvider
  */
 public function testVote($identifier, $className, $object, $expected, $attributes, $queryResult = null)
 {
     $this->doctrineHelper->expects($this->any())->method('getSingleEntityIdentifier')->will($this->returnValue($identifier));
     $repository = $this->getMockBuilder('\\Doctrine\\Common\\Persistence\\ObjectRepository')->disableOriginalConstructor()->getMock();
     $repository->expects($this->any())->method('find')->will($this->returnValueMap([[$identifier, $this->getItem()], [2, $object]]));
     $this->doctrineHelper->expects($this->any())->method('getEntityRepository')->will($this->returnValue($repository));
     if (is_object($object)) {
         $this->doctrineHelper->expects($this->any())->method('getEntityClass')->will($this->returnValue(get_class($object)));
     }
     $this->contactInformationFieldsProvider->expects($this->any())->method('getEntityTypedFields')->will($this->returnValue(['email']));
     $this->contactInformationFieldsProvider->expects($this->any())->method('getTypedFieldsValues')->will($this->returnValue(['email']));
     $this->em->expects($this->any())->method('createQueryBuilder')->will($this->returnValue($this->getQueryBuilderMock($queryResult)));
     $this->voter->setClassName($className);
     /** @var TokenInterface $token */
     $token = $this->getMock('Symfony\\Component\\Security\\Core\\Authentication\\Token\\TokenInterface');
     $this->assertEquals($expected, $this->voter->vote($token, $object, $attributes));
 }
Пример #10
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();
 }
 /**
  * @param string $entityClassName
  * @param array  $data
  * @return array
  */
 protected function getContactInformationFieldsValues($entityClassName, array $data)
 {
     $contactInformationFields = $this->contactInformationFieldsProvider->getEntityTypedFields($entityClassName, ContactInformationFieldsProvider::CONTACT_INFORMATION_SCOPE_EMAIL);
     $values = $this->contactInformationFieldsProvider->getTypedFieldsValues($contactInformationFields, $data);
     return array_filter($values);
 }