function it_provide_product_completeness_if_a_family_is_defined($familyRepository, $productValueCompleteChecker, QueryBuilder $qb, AbstractQuery $query, AttributeRequirementInterface $requirement, ProductInterface $product, ChannelInterface $mobile, LocaleInterface $en, FamilyInterface $shirt, CompletenessInterface $completeness, ProductValueInterface $nameValue, AttributeInterface $name)
 {
     $product->getFamily()->willReturn($shirt);
     $product->getCompletenesses()->willReturn([$completeness]);
     $en->getCode()->willReturn('en_US');
     $mobile->getCode()->willReturn('mobile');
     $completeness->getLocale()->willReturn($en);
     $completeness->getChannel()->willReturn($mobile);
     $completeness->getMissingCount()->willReturn(1);
     $familyRepository->getFullRequirementsQB($shirt, 'en_US')->willReturn($qb);
     $qb->getQuery()->willReturn($query);
     $query->getResult()->willReturn([$requirement]);
     $requirement->getChannel()->willReturn($mobile);
     $requirement->getAttribute()->willReturn($name);
     $requirement->isRequired()->willReturn(true);
     $name->getCode()->willReturn('name');
     $name->isLocalizable()->willreturn(true);
     $name->isScopable()->willReturn(false);
     $name->isLocaleSpecific()->willReturn(true);
     $name->hasLocaleSpecific($en)->willReturn(false);
     $product->getValues()->willReturn(new ArrayCollection());
     $productValueCompleteChecker->supportsValue($nameValue);
     $productValueCompleteChecker->isComplete($nameValue, $mobile, $en);
     $this->getProductCompleteness($product, [$mobile], [$en], 'en_US')->shouldReturn(['en_US' => ['channels' => ['mobile' => ['completeness' => $completeness, 'missing' => []]], 'stats' => ['total' => 1, 'complete' => 0]]]);
 }
 /**
  * Is the given product complete for the given channel?
  *
  * @param ProductInterface $product
  * @param Channel          $channel
  *
  * @return bool
  */
 protected function isProductComplete(ProductInterface $product, Channel $channel)
 {
     $completenesses = $product->getCompletenesses()->toArray();
     foreach ($completenesses as $completeness) {
         if ($completeness->getChannel()->getId() === $channel->getId() && $completeness->getRatio() === 100) {
             return true;
         }
     }
     return false;
 }
 /**
  * @param ProductInterface $product
  * @param Channel          $locales
  *
  * @return Locale[]
  */
 public function apply(ProductInterface $product, Channel $channel)
 {
     $exportableLocales = [];
     foreach ($product->getCompletenesses() as $completeness) {
         if ($this->isComplete($completeness) && $this->isInChannel($completeness, $channel)) {
             $exportableLocales[] = $completeness->getLocale();
         }
     }
     return $exportableLocales;
 }
 function it_does_not_send_locales_which_are_not_complete(ProductInterface $product, Channel $channel, AbstractCompleteness $completeness1, AbstractCompleteness $completeness2, Locale $localeFr, Locale $localeEn)
 {
     $product->getCompletenesses()->willReturn([$completeness1, $completeness2]);
     $completeness1->getRatio()->willReturn(100);
     $completeness2->getRatio()->willReturn(90);
     $completeness1->getChannel()->willReturn($channel);
     $completeness1->getLocale()->willReturn($localeEn);
     $completeness2->getChannel()->willReturn($channel);
     $completeness2->getLocale()->willReturn($localeFr);
     $channel->getId()->willReturn(2);
     $this->apply($product, $channel)->shouldReturn([$localeEn]);
 }
 function it_does_not_generate_association_calls_for_given_products_if_associated_product_is_not_complete_nor_enable($webservice, ProductInterface $product, ProductInterface $associatedProduct, Association $association, AssociationType $associationType, Completeness $completeness)
 {
     $webservice->getAssociationsStatus($product)->willReturn(['up_sell' => [], 'cross_sell' => [['sku' => 'sku-011']], 'related' => []]);
     $product->getIdentifier()->willReturn('sku-012');
     $product->getAssociations()->willReturn([$association]);
     $association->getAssociationType()->willReturn($associationType);
     $association->getProducts()->willReturn([$associatedProduct]);
     $associatedProduct->getIdentifier()->willReturn('sku-011');
     $associatedProduct->isEnabled()->willReturn(false);
     $associatedProduct->getCompletenesses()->willReturn([$completeness]);
     $completeness->getRatio()->willReturn(50);
     $associationType->getCode()->willReturn('UPSELL');
     $this->process([$product])->shouldReturn(['remove' => [['type' => 'cross_sell', 'product' => 'sku-012', 'linkedProduct' => 'sku-011', 'identifierType' => 'sku']], 'create' => []]);
 }
 function it_normalizes_product(SerializerInterface $serializer, ProductInterface $product, FamilyInterface $family, Completeness $completeness)
 {
     $serializer->implement('Symfony\\Component\\Serializer\\Normalizer\\NormalizerInterface');
     $this->setSerializer($serializer);
     $product->getFamily()->willReturn($family);
     $product->getGroups()->willReturn([]);
     $product->getValues()->willReturn([]);
     $product->getCompletenesses()->willReturn([$completeness]);
     $product->getCreated()->willReturn(null);
     $product->getUpdated()->willReturn(null);
     $product->isEnabled()->willReturn(true);
     $serializer->normalize($family, 'mongodb_json', [])->willReturn('family normalization');
     $serializer->normalize($completeness, 'mongodb_json', [])->willReturn(['completenessCode' => 'completeness normalization']);
     $this->normalize($product, 'mongodb_json', [])->shouldReturn([ProductNormalizer::FAMILY_FIELD => 'family normalization', ProductNormalizer::COMPLETENESSES_FIELD => array('completenessCode' => 'completeness normalization'), ProductNormalizer::ENABLED_FIELD => true]);
 }
 function it_returns_only_products_in_the_given_channel(ProductInterface $product1, ProductInterface $product2, Channel $channel, ArrayCollection $productCategories1, ArrayCollection $productCategories2, ArrayCollection $completenesses, Category $rootCategory, Category $category1, Category $category2, AbstractCompleteness $completeness1, AbstractCompleteness $completeness2)
 {
     $channel->getCategory()->willReturn($rootCategory);
     $channel->getId()->willReturn(2);
     $rootCategory->getId()->willReturn(1);
     $product1->getCategories()->willReturn($productCategories1);
     $product2->getCategories()->willReturn($productCategories2);
     $product1->getCompletenesses()->willReturn($completenesses);
     $product2->getCompletenesses()->willReturn($completenesses);
     $completenesses->toArray()->willReturn([$completeness1, $completeness2]);
     $completeness1->getChannel()->willReturn($channel);
     $completeness2->getChannel()->willReturn($channel);
     $completeness1->getRatio()->willReturn(100);
     $completeness2->getRatio()->willReturn(100);
     $productCategories1->toArray()->willReturn([$category1]);
     $productCategories2->toArray()->willReturn([$category2]);
     $category1->getRoot()->willReturn(1);
     $category2->getRoot()->willReturn(5);
     $this->apply($channel, [$product1, $product2])->shouldReturn([$product1]);
 }
 /**
  * Returns an array containing all completeness info and missing attributes for a product
  *
  * @param ProductInterface                                    $product
  * @param \Pim\Bundle\CatalogBundle\Entity\ChannelInterface[] $channels
  * @param \Pim\Bundle\CatalogBundle\Entity\LocaleInterface[]  $locales
  * @param string                                              $localeCode
  *
  * @return array
  */
 public function getProductCompleteness(ProductInterface $product, array $channels, array $locales, $localeCode)
 {
     $family = $product->getFamily();
     $getCodes = function ($entities) {
         return array_map(function ($entity) {
             return $entity->getCode();
         }, $entities);
     };
     $channelCodes = $getCodes($channels);
     $localeCodes = $getCodes($locales);
     $channelTemplate = ['channels' => array_fill_keys($channelCodes, ['completeness' => null, 'missing' => []]), 'stats' => ['total' => 0, 'complete' => 0]];
     $completenesses = array_fill_keys($localeCodes, $channelTemplate);
     if (!$family) {
         return $completenesses;
     }
     $allCompletenesses = $product->getCompletenesses();
     foreach ($allCompletenesses as $completeness) {
         $locale = $completeness->getLocale();
         $channel = $completeness->getChannel();
         $compLocaleCode = $locale->getCode();
         if (isset($completenesses[$compLocaleCode])) {
             $completenesses[$compLocaleCode]['channels'][$channel->getCode()]['completeness'] = $completeness;
             $completenesses[$compLocaleCode]['stats']['total']++;
             if (0 === $completeness->getMissingCount()) {
                 $completenesses[$compLocaleCode]['stats']['complete']++;
             }
         }
     }
     $requirements = $this->familyRepository->getFullRequirementsQB($family, $localeCode)->getQuery()->getResult();
     $productValues = $product->getValues();
     foreach ($requirements as $requirement) {
         if ($requirement->isRequired()) {
             $this->addRequirementToCompleteness($completenesses, $requirement, $productValues, $locales);
         }
     }
     return $completenesses;
 }
 /**
  * {@inheritdoc}
  */
 public function schedule(ProductInterface $product)
 {
     foreach ($product->getCompletenesses() as $completeness) {
         $this->manager->remove($completeness);
     }
     $product->getCompletenesses()->clear();
 }
 /**
  * {@inheritdoc}
  */
 public function schedule(ProductInterface $product)
 {
     $product->getCompletenesses()->clear();
 }
 /**
  * @param ProductInterface $product
  *
  * @return bool
  */
 protected function isComplete(ProductInterface $product)
 {
     $isComplete = false;
     $completenesses = $product->getCompletenesses();
     foreach ($completenesses as $completeness) {
         if ($completeness->getRatio() === 100) {
             $isComplete = true;
         }
     }
     return $isComplete;
 }