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([['channels' => [['completeness' => $completeness, 'missing' => []]], 'stats' => ['total' => 1, 'complete' => 0], 'locale' => 'en_US']]); }
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]); }
/** * 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(); }
/** * Returns completenesses filled * * @param array $completenesses * @param ProductInterface $product * @param array $locales * @param string $localeCode * * @return array */ protected function fillCompletenessesTemplate(array $completenesses, ProductInterface $product, array $locales, $localeCode) { $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]['locale'] = $compLocaleCode; $completenesses[$compLocaleCode]['stats']['total']++; if (0 === $completeness->getMissingCount()) { $completenesses[$compLocaleCode]['stats']['complete']++; } } } $requirements = $this->familyRepository->getFullRequirementsQB($product->getFamily(), $localeCode)->getQuery()->getResult(); $productValues = $product->getValues(); foreach ($requirements as $requirement) { if ($requirement->isRequired()) { $this->addRequirementToCompleteness($completenesses, $requirement, $productValues, $locales); } } return $completenesses; }