/** * @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; }
/** * {@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; }
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)); }
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); }