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