/** * 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; } }