/**
  * @param StaticSegment $entity
  */
 protected function onSuccess($entity)
 {
     // Reset originId of static segment if subscribers list was changed to force list creation
     if ($this->oldSubscribersList && $this->oldSubscribersList->getId() != $entity->getSubscribersList()->getId()) {
         $entity->setOriginId(null);
     }
     parent::onSuccess($entity);
 }
 /**
  * @Rest\Post(
  *      "/staticsegment/{id}/status",
  *      requirements={"id"="\d+"}
  * )
  * @ParamConverter("staticSegment", options={"id"="id"})
  * @Rest\QueryParam(
  *      name="id",
  *      requirements="\d+",
  *      nullable=false,
  *      description="Static Segment Id"
  * )
  * @ApiDoc(
  *      description="Update Static Segment status",
  *      resource=false
  * )
  * @AclAncestor("orocrm_mailchimp")
  * @param StaticSegment $staticSegment
  * @return Response
  */
 public function updateStatusAction(StaticSegment $staticSegment)
 {
     $status = $this->getRequest()->get('status');
     $staticSegment->setSyncStatus($status);
     $em = $this->getDoctrine()->getManager();
     $em->persist($staticSegment);
     $em->flush();
     return $this->handleView($this->view('', Codes::HTTP_OK));
 }
 /**
  * @param StaticSegment $value
  * @param UniqueStaticSegmentNameConstraint|Constraint $constraint
  */
 public function validate($value, Constraint $constraint)
 {
     if ($value instanceof StaticSegment && !$value->getOriginId()) {
         $this->transport->init($value->getChannel()->getTransport());
         $segments = $this->transport->getListStaticSegments($value->getSubscribersList());
         foreach ($segments as $segment) {
             if ($segment['name'] == $value->getName()) {
                 $this->context->addViolationAt('name', $constraint->message);
                 break;
             }
         }
     }
 }
 /**
  * {@inheritdoc}
  */
 public function load(ObjectManager $manager)
 {
     $organization = $manager->getRepository('OroOrganizationBundle:Organization')->getFirst();
     foreach ($this->segmentData as $data) {
         $entity = new StaticSegment();
         $entity->setOwner($organization);
         $data['marketingList'] = $this->getReference($data['marketingList']);
         $data['subscribersList'] = $this->getReference($data['subscribersList']);
         $data['channel'] = $this->getReference($data['channel']);
         $this->setEntityPropertyValues($entity, $data, ['reference']);
         $this->setReference($data['reference'], $entity);
         $manager->persist($entity);
     }
     $manager->flush();
 }
 /**
  * @param StaticSegment $staticSegment
  *
  * @throws \InvalidArgumentException
  * @return QueryBuilder
  */
 protected function getIteratorQueryBuilder(StaticSegment $staticSegment)
 {
     $marketingList = $staticSegment->getMarketingList();
     $qb = $this->marketingListProvider->getMarketingListEntitiesQueryBuilder($marketingList, MarketingListProvider::FULL_ENTITIES_MIXIN);
     $this->prepareIteratorPart($qb);
     /** @var From[] $from */
     $from = $qb->getDQLPart('from');
     $entityAlias = $from[0]->getAlias();
     $parts = $this->formatter->extractNamePartsPaths($marketingList->getEntity(), $entityAlias);
     $qb->resetDQLPart('select');
     if (isset($parts['first_name'])) {
         $qb->addSelect(sprintf('%s AS %s', $parts['first_name'], MemberSyncDataConverter::FIRST_NAME_KEY));
     }
     if (isset($parts['last_name'])) {
         $qb->addSelect(sprintf('%s AS %s', $parts['last_name'], MemberSyncDataConverter::LAST_NAME_KEY));
     }
     $this->marketingListQueryBuilderAdapter->prepareMarketingListEntities($staticSegment, $qb);
     return $qb;
 }
 /**
  * @param StaticSegment $staticSegment
  * @param string $segmentStateFilter
  * @param string $method
  * @param string $itemState
  * @param bool $deleteMember
  * @return array
  */
 public function handleMembersUpdate(StaticSegment $staticSegment, $segmentStateFilter, $method, $itemState, $deleteMember = false)
 {
     $itemsToWrite = [];
     $items = $staticSegment->getSegmentMembers()->filter(function (StaticSegmentMember $segmentMember) use($segmentStateFilter) {
         return $segmentMember->getState() === $segmentStateFilter;
     })->toArray();
     if (empty($items)) {
         return [];
     }
     $emails = array_map(function (StaticSegmentMember $segmentMember) {
         return $segmentMember->getMember()->getEmail();
     }, $items);
     $response = $this->transport->{$method}(['id' => $staticSegment->getSubscribersList()->getOriginId(), 'seg_id' => (int) $staticSegment->getOriginId(), 'batch' => array_map(function ($email) {
         return ['email' => $email];
     }, $emails), 'delete_member' => $deleteMember]);
     $this->handleResponse($response, function ($response, LoggerInterface $logger) use($staticSegment) {
         $logger->info(sprintf('Segment #%s [origin_id=%s] Members: [%s] add, [%s] error', $staticSegment->getId(), $staticSegment->getOriginId(), $response['success_count'], $response['error_count']));
     });
     $emailsWithErrors = $this->getArrayData($response, 'errors');
     /** @var StaticSegmentMember[]|ArrayCollection $items */
     $items = new ArrayCollection($items);
     $items->filter(function (StaticSegmentMember $segmentMember) use($emailsWithErrors) {
         return !in_array($segmentMember->getMember()->getEmail(), $emailsWithErrors, true);
     });
     foreach ($items as $item) {
         $item->setState($itemState);
         $this->logger->debug(sprintf('Member with id "%s" and email "%s" got "%s" state', $item->getMember()->getOriginId(), $item->getMember()->getEmail(), $itemState));
         $itemsToWrite[] = $item;
     }
     return $itemsToWrite;
 }
 /**
  * @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());
 }
Exemplo n.º 8
0
 public function testGetSyncedExtendedMergeVars()
 {
     $this->assertEmpty($this->entity->getExtendedMergeVars());
     $var1 = new ExtendedMergeVar();
     $var2 = new ExtendedMergeVar();
     $var1->markSynced();
     $var2->markDropped();
     $this->entity->addExtendedMergeVar($var1);
     $this->entity->addExtendedMergeVar($var2);
     $extendedMergeVars = $this->entity->getSyncedExtendedMergeVars();
     $this->assertCount(1, $extendedMergeVars);
     $this->assertContainsOnly($var1, $extendedMergeVars);
 }
 /**
  * @param MarketingList $marketingList
  * @return StaticSegment
  */
 protected function getStaticSegmentByMarketingList(MarketingList $marketingList)
 {
     $staticSegment = $this->findStaticSegmentByMarketingList($marketingList);
     if (!$staticSegment) {
         $staticSegment = new StaticSegment();
         $staticSegment->setName(mb_substr($marketingList->getName(), 0, 100));
         $staticSegment->setSyncStatus(StaticSegment::STATUS_NOT_SYNCED);
         $staticSegment->setMarketingList($marketingList);
     }
     return $staticSegment;
 }
 /**
  * @param StaticSegment $staticSegment
  */
 protected function handleDroppedMembers(StaticSegment $staticSegment)
 {
     $qb = $this->doctrineHelper->getEntityRepository($this->staticSegmentMember)->createQueryBuilder('smmb');
     $qb->delete($this->staticSegmentMember, 'smmb')->where($qb->expr()->andX($qb->expr()->eq('smmb.staticSegment', $staticSegment->getId()), $qb->expr()->in('smmb.state', ':states')))->setParameter('states', [StaticSegmentMember::STATE_DROP, StaticSegmentMember::STATE_UNSUBSCRIBE_DELETE])->getQuery()->execute();
 }
 /**
  * {@inheritdoc}
  */
 protected function getIteratorQueryBuilder(StaticSegment $staticSegment)
 {
     $marketingList = $staticSegment->getMarketingList();
     if ($marketingList->isManual()) {
         $mixin = MarketingListProvider::MANUAL_RESULT_ENTITIES_MIXIN;
     } else {
         $mixin = MarketingListProvider::RESULT_ENTITIES_MIXIN;
     }
     $qb = clone $this->marketingListProvider->getMarketingListQueryBuilder($marketingList, $mixin);
     $this->marketingListQueryBuilderAdapter->prepareMarketingListEntities($staticSegment, $qb);
     return $qb;
 }