/**
  * Get the untaxed price and, if the product is in sale, promo price of a product.
  *
  * @param ProductGetPricesEvent $event
  */
 public function getPrices(ProductGetPricesEvent $event)
 {
     $product = ProductQuery::create()->findPk($event->getProductId());
     if (null === $product) {
         throw new \InvalidArgumentException('No product given');
     }
     $currency = CurrencyQuery::create()->findPk($event->getCurrencyId());
     if (null === $currency) {
         $currency = CurrencyQuery::create()->findOneByByDefault(true);
     }
     // get the base prices given in the event
     // or, by default, the prices of the product's default PSE
     if (null !== $event->getBasePrices()) {
         $price = $event->getBasePrices()->getPrice();
         $promoPrice = $event->getBasePrices()->getPromoPrice();
     } else {
         $prices = $product->getDefaultSaleElements()->getPricesByCurrency($currency);
         $price = $prices->getPrice();
         $promoPrice = $prices->getPromoPrice();
     }
     // adjust the prices with the configured price delta from legacy attributes
     $legacyProductAttributeValues = LegacyProductAttributeValueQuery::create()->filterByProductId($product->getId())->filterByAttributeAvId(array_values($event->getLegacyProductAttributes()), Criteria::IN)->find();
     /** @var LegacyProductAttributeValue $legacyProductAttributeValue */
     foreach ($legacyProductAttributeValues as $legacyProductAttributeValue) {
         $legacyProductAttributeValuePrice = $legacyProductAttributeValue->getPriceForCurrency($event->getCurrencyId());
         if ($legacyProductAttributeValuePrice === null) {
             continue;
         }
         $price += $legacyProductAttributeValuePrice->getDelta();
         $promoPrice += $legacyProductAttributeValuePrice->getDelta();
     }
     $event->setPrices(new ProductPriceTools($price, $promoPrice));
 }
 /**
  * Create or update the configuration for a legacy product attribute value.
  *
  * @param int $productId Product id.
  * @param int $attributeAvId Attribute value id.
  * @param int $currencyId Currency id.
  * @param float|null $priceDelta Price difference added (or removed) by the attribute value.
  *
  * @throws PropelException
  */
 protected function createOrUpdateLegacyProductAttributeValue($productId, $attributeAvId, $currencyId, $priceDelta = null)
 {
     if ($priceDelta === null) {
         return;
     }
     $legacyProductAttributeValue = LegacyProductAttributeValueQuery::create()->findPk([$productId, $attributeAvId]);
     if ($legacyProductAttributeValue === null) {
         $legacyProductAttributeValue = (new LegacyProductAttributeValue())->setProductId($productId)->setAttributeAvId($attributeAvId);
     }
     $legacyProductAttributeValuePriceDelta = LegacyProductAttributeValuePriceQuery::create()->findPk([$productId, $attributeAvId, $currencyId]);
     if ($legacyProductAttributeValuePriceDelta === null) {
         $legacyProductAttributeValuePriceDelta = (new LegacyProductAttributeValuePrice())->setProductId($productId)->setAttributeAvId($attributeAvId)->setCurrencyId($currencyId);
     }
     if ($priceDelta !== null) {
         $legacyProductAttributeValuePriceDelta->setDelta($priceDelta);
     }
     Propel::getConnection()->beginTransaction();
     try {
         $legacyProductAttributeValue->save();
         $legacyProductAttributeValuePriceDelta->save();
     } catch (PropelException $e) {
         Propel::getConnection()->rollBack();
         throw $e;
     }
     Propel::getConnection()->commit();
 }
 /**
  * Performs an INSERT on the database, given a LegacyProductAttributeValue or Criteria object.
  *
  * @param mixed               $criteria Criteria or LegacyProductAttributeValue object containing data that is used to create the INSERT statement.
  * @param ConnectionInterface $con the ConnectionInterface connection to use
  * @return mixed           The new primary key.
  * @throws PropelException Any exceptions caught during processing will be
  *         rethrown wrapped into a PropelException.
  */
 public static function doInsert($criteria, ConnectionInterface $con = null)
 {
     if (null === $con) {
         $con = Propel::getServiceContainer()->getWriteConnection(LegacyProductAttributeValueTableMap::DATABASE_NAME);
     }
     if ($criteria instanceof Criteria) {
         $criteria = clone $criteria;
         // rename for clarity
     } else {
         $criteria = $criteria->buildCriteria();
         // build Criteria from LegacyProductAttributeValue object
     }
     // Set the correct dbName
     $query = LegacyProductAttributeValueQuery::create()->mergeWith($criteria);
     try {
         // use transaction because $criteria could contain info
         // for more than one table (I guess, conceivably)
         $con->beginTransaction();
         $pk = $query->doInsert($con);
         $con->commit();
     } catch (PropelException $e) {
         $con->rollBack();
         throw $e;
     }
     return $pk;
 }
 /**
  * Removes this object from datastore and sets delete attribute.
  *
  * @param      ConnectionInterface $con
  * @return void
  * @throws PropelException
  * @see LegacyProductAttributeValue::setDeleted()
  * @see LegacyProductAttributeValue::isDeleted()
  */
 public function delete(ConnectionInterface $con = null)
 {
     if ($this->isDeleted()) {
         throw new PropelException("This object has already been deleted.");
     }
     if ($con === null) {
         $con = Propel::getServiceContainer()->getWriteConnection(LegacyProductAttributeValueTableMap::DATABASE_NAME);
     }
     $con->beginTransaction();
     try {
         $deleteQuery = ChildLegacyProductAttributeValueQuery::create()->filterByPrimaryKey($this->getPrimaryKey());
         $ret = $this->preDelete($con);
         if ($ret) {
             $deleteQuery->delete($con);
             $this->postDelete($con);
             $con->commit();
             $this->setDeleted(true);
         } else {
             $con->commit();
         }
     } catch (Exception $e) {
         $con->rollBack();
         throw $e;
     }
 }