/**
  * @param ProductPrice|object $value
  * @param ProductPriceAllowedUnits $constraint
  *
  * {@inheritdoc}
  */
 public function validate($value, Constraint $constraint)
 {
     $priceProduct = $value->getProduct();
     $priceUnit = $value->getUnit();
     if (!$priceProduct) {
         $this->context->addViolationAt('product', $constraint->notExistingProductMessage);
         return;
     }
     $unitPrecisions = $priceProduct->getUnitPrecisions();
     $availableUnits = [];
     foreach ($unitPrecisions as $unitPrecision) {
         $availableUnits[] = $unitPrecision->getUnit();
     }
     if (!in_array($priceUnit, $availableUnits)) {
         if ($priceUnit instanceof ProductUnit && $priceUnit->getCode()) {
             $this->context->addViolationAt('unit', $constraint->notAllowedUnitMessage, ['%product%' => $priceProduct->getSku(), '%unit%' => $priceUnit->getCode()]);
         } else {
             $this->context->addViolationAt('unit', $constraint->notExistingUnitMessage);
         }
     }
 }
 /**
  * @param ProductPrice $entity
  * @return string
  */
 protected function getEntityHashByUniqueFields(ProductPrice $entity)
 {
     return md5(implode(':', [$entity->getProduct()->getId(), $entity->getPriceList()->getId(), $entity->getQuantity(), $entity->getUnit()->getCode(), $entity->getPrice()->getCurrency()]));
 }
 /**
  * @param ProductPrice $productPrice
  * @return string
  */
 protected function getHash(ProductPrice $productPrice)
 {
     return md5(sprintf('%s_%s_%s_%s_%s', $productPrice->getProduct()->getId(), $productPrice->getPriceList()->getId(), (double) $productPrice->getQuantity(), $productPrice->getUnit()->getCode(), $productPrice->getPrice()->getCurrency()));
 }