/**
  * Returns an array containing all completeness info and missing attributes for a product
  *
  * @param ProductInterface $product
  * @param array            $channels
  * @param array            $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);
     };
     $channelTemplate = array_fill_keys($getCodes($channels), array('completeness' => null, 'missing' => array()));
     $localeCodes = $getCodes($locales);
     $completenesses = array_fill_keys($localeCodes, $channelTemplate);
     if (!$family) {
         return $completenesses;
     }
     $allCompletenesses = $product->getCompletenesses();
     foreach ($allCompletenesses as $completeness) {
         $locale = $completeness->getLocale();
         $channel = $completeness->getChannel();
         $completenesses[$locale->getCode()][$channel->getCode()]['completeness'] = $completeness;
     }
     $requirements = $this->familyRepository->getFullRequirementsQB($family, $localeCode)->getQuery()->getResult();
     $productValues = $product->getValues();
     foreach ($requirements as $requirement) {
         if ($requirement->isRequired()) {
             $this->addRequirementToCompleteness($completenesses, $requirement, $productValues, $localeCodes);
         }
     }
     return $completenesses;
 }
 /**
  * {@inheritdoc}
  */
 public function findCommonAttributeIds(array $productIds)
 {
     $results = $this->findValuesCommonAttributeIds($productIds);
     $familyIds = $this->findFamiliesFromProductIds($productIds);
     if (!empty($familyIds)) {
         $families = $this->familyRepository->findAttributeIdsFromFamilies($familyIds);
     }
     $attIds = null;
     foreach ($results as $result) {
         $familyAttr = isset($result['_id']['family']) ? $families[$result['_id']['family']] : array();
         $prodAttIds = array_unique(array_merge($result['attribute'], $familyAttr));
         if (null === $attIds) {
             $attIds = $prodAttIds;
         } else {
             $attIds = array_intersect($attIds, $prodAttIds);
         }
     }
     return $attIds;
 }
 /**
  * Generate family requirements information to be used to
  * calculate completenesses.
  *
  * @param ProductInterface $product
  * @param Channel          $channel
  *
  * @return array
  */
 protected function getFamilyRequirements(ProductInterface $product = null, Channel $channel = null)
 {
     $selectFamily = null;
     if (null !== $product) {
         $selectFamily = $product->getFamily();
     }
     $families = $this->familyRepository->getFullFamilies($selectFamily, $channel);
     $familyRequirements = array();
     foreach ($families as $family) {
         $reqsByChannels = array();
         $channels = array();
         foreach ($family->getAttributeRequirements() as $attributeReq) {
             $channel = $attributeReq->getChannel();
             $channels[$channel->getCode()] = $channel;
             if (!isset($reqsByChannels[$channel->getCode()])) {
                 $reqsByChannels[$channel->getCode()] = array();
             }
             $reqsByChannels[$channel->getCode()][] = $attributeReq;
         }
         $familyRequirements[$family->getId()] = $this->getFieldsNames($channels, $reqsByChannels);
     }
     return $familyRequirements;
 }
 /**
  * Get choices
  *
  * @return array
  */
 public function getChoices()
 {
     return $this->repository->getChoices(['localeCode' => $this->userContext->getCurrentLocaleCode()]);
 }