/**
  * @param array $data
  * @return array
  *
  * Return the untaxed prices to store
  */
 protected function extractPrices(array $data)
 {
     $calculator = new Calculator();
     $calculator->loadTaxRuleWithoutProduct(TaxRuleQuery::create()->findPk($data["tax_rule_id"]), Country::getShopLocation());
     $price = null === $data["price_with_tax"] ? $data["price"] : $calculator->getUntaxedPrice($data["price_with_tax"]);
     $salePrice = null === $data["sale_price_with_tax"] ? $data["sale_price"] : $calculator->getUntaxedPrice($data["sale_price_with_tax"]);
     return [$price, $salePrice];
 }
Exemplo n.º 2
0
 /**
  * @param Cart $cart
  * @param $areaId
  * @return |null
  */
 protected function getSlicePostage(Cart $cart, Country $country)
 {
     $config = self::getConfig();
     $currency = $cart->getCurrency();
     $areaId = $country->getAreaId();
     $query = CustomDeliverySliceQuery::create()->filterByAreaId($areaId);
     if ($config['method'] != CustomDelivery::METHOD_PRICE) {
         $query->filterByWeightMax($cart->getWeight(), Criteria::GREATER_THAN);
         $query->orderByWeightMax(Criteria::ASC);
     }
     if ($config['method'] != CustomDelivery::METHOD_WEIGHT) {
         $total = $cart->getTotalAmount();
         // convert amount to the default currency
         if (0 == $currency->getByDefault()) {
             $total = $total / $currency->getRate();
         }
         $query->filterByPriceMax($total, Criteria::GREATER_THAN);
         $query->orderByPriceMax(Criteria::ASC);
     }
     $slice = $query->findOne();
     $postage = null;
     if (null !== $slice) {
         $postage = new OrderPostage();
         if (0 == $currency->getByDefault()) {
             $price = $slice->getPrice() * $currency->getRate();
         } else {
             $price = $slice->getPrice();
         }
         $price = round($price, 2);
         $postage->setAmount($price);
         $postage->setAmountTax(0);
         // taxed amount
         if (0 !== $config['tax']) {
             $taxRuleI18N = I18n::forceI18nRetrieving($this->getRequest()->getSession()->getLang()->getLocale(), 'TaxRule', $config['tax']);
             $taxRule = TaxRuleQuery::create()->findPk($config['tax']);
             if (null !== $taxRule) {
                 $taxCalculator = new Calculator();
                 $taxCalculator->loadTaxRuleWithoutProduct($taxRule, $country);
                 $postage->setAmount(round($taxCalculator->getTaxedPrice($price), 2));
                 $postage->setAmountTax($postage->getAmount() - $price);
                 $postage->setTaxRuleTitle($taxRuleI18N->getTitle());
             }
         }
     }
     return $postage;
 }
Exemplo n.º 3
0
 /**
  *
  * Calculate tax or untax price for a non existing product.
  *
  * For an existing product, use self::priceCaclulator
  *
  * @return JsonResponse
  */
 public function calculatePrice()
 {
     $return_price = 0;
     $price = floatval($this->getRequest()->query->get('price'));
     $tax_rule_id = intval($this->getRequest()->query->get('tax_rule'));
     $action = $this->getRequest()->query->get('action');
     // With ot without tax
     $taxRule = TaxRuleQuery::create()->findPk($tax_rule_id);
     if (null !== $price && null !== $taxRule) {
         $calculator = new Calculator();
         $calculator->loadTaxRuleWithoutProduct($taxRule, Country::getShopLocation());
         if ($action == 'to_tax') {
             $return_price = $calculator->getTaxedPrice($price);
         } elseif ($action == 'from_tax') {
             $return_price = $calculator->getUntaxedPrice($price);
         } else {
             $return_price = $price;
         }
     }
     return new JsonResponse(array('result' => $this->formatPrice($return_price)));
 }
 /**
  * Copy of default product loop price filter but with tax applied to asked price
  * @param $search
  * @param $minPriceTTC
  * @param $maxPriceTTC
  * @throws \Propel\Runtime\Exception\PropelException
  */
 protected function managePriceFilter(&$search, $minPriceTTC, $maxPriceTTC)
 {
     $categoryId = $this->getCategoryId();
     $taxeRuleQuery = TaxRuleQuery::create();
     $categoryJoin = new Join();
     $categoryJoin->addExplicitCondition(TaxRuleTableMap::TABLE_NAME, 'ID', null, CriteriaSearchCategoryTaxRuleTableMap::TABLE_NAME, 'TAX_RULE_ID', null);
     $categoryJoin->setJoinType(Criteria::LEFT_JOIN);
     $taxeRuleQuery->addJoinObject($categoryJoin, 'category_join')->addJoinCondition('category_join', CriteriaSearchCategoryTaxRuleTableMap::CATEGORY_ID . ' = ' . $categoryId);
     $taxeRule = $taxeRuleQuery->findOne();
     $taxCountry = $this->container->get('thelia.taxEngine')->getDeliveryCountry();
     $calculator = new Calculator();
     $calculator->loadTaxRuleWithoutProduct($taxeRule, $taxCountry);
     $currencyId = $this->getCurrency();
     if (null !== $currencyId) {
         $currency = CurrencyQuery::create()->findOneById($currencyId);
         if (null === $currency) {
             throw new \InvalidArgumentException('Cannot found currency id: `' . $currency . '` in product_sale_elements loop');
         }
     } else {
         $currency = $this->request->getSession()->getCurrency();
     }
     $defaultCurrency = CurrencyQuery::create()->findOneByByDefault(1);
     $defaultCurrencySuffix = '_default_currency';
     if (null !== $minPriceTTC) {
         $minPriceHt = round($calculator->getUntaxedPrice($minPriceTTC), 2);
         $isPSELeftJoinList[] = 'is_min_price';
         $minPriceJoin = new Join();
         $minPriceJoin->addExplicitCondition(ProductSaleElementsTableMap::TABLE_NAME, 'ID', 'is_min_price_ttc', ProductPriceTableMap::TABLE_NAME, 'PRODUCT_SALE_ELEMENTS_ID', 'min_price_ttc_data');
         $minPriceJoin->setJoinType(Criteria::LEFT_JOIN);
         $search->joinProductSaleElements('is_min_price_ttc', Criteria::LEFT_JOIN)->addJoinObject($minPriceJoin, 'is_min_price_ttc_join')->addJoinCondition('is_min_price_ttc_join', '`min_price_ttc_data`.`currency_id` = ?', $currency->getId(), null, \PDO::PARAM_INT);
         if ($defaultCurrency->getId() != $currency->getId()) {
             $minPriceJoinDefaultCurrency = new Join();
             $minPriceJoinDefaultCurrency->addExplicitCondition(ProductSaleElementsTableMap::TABLE_NAME, 'ID', 'is_min_price_ttc', ProductPriceTableMap::TABLE_NAME, 'PRODUCT_SALE_ELEMENTS_ID', 'min_price_ttc_data' . $defaultCurrencySuffix);
             $minPriceJoinDefaultCurrency->setJoinType(Criteria::LEFT_JOIN);
             $search->addJoinObject($minPriceJoinDefaultCurrency, 'is_min_price_ttc_join' . $defaultCurrencySuffix)->addJoinCondition('is_min_price_ttc_join' . $defaultCurrencySuffix, '`min_price_ttc_data' . $defaultCurrencySuffix . '`.`currency_id` = ?', $defaultCurrency->getId(), null, \PDO::PARAM_INT);
             /**
              * In propel we trust : $currency->getRate() always returns a float.
              * Or maybe not : rate value is checked as a float in overloaded getRate method.
              */
             $MinPriceToCompareAsSQL = 'CASE WHEN ISNULL(CASE WHEN `is_min_price_ttc`.PROMO=1 THEN `min_price_ttc_data`.PROMO_PRICE ELSE `min_price_ttc_data`.PRICE END) OR `min_price_ttc_data`.FROM_DEFAULT_CURRENCY = 1 THEN
                 CASE WHEN `is_min_price_ttc`.PROMO=1 THEN `min_price_ttc_data' . $defaultCurrencySuffix . '`.PROMO_PRICE ELSE `min_price_ttc_data' . $defaultCurrencySuffix . '`.PRICE END * ' . $currency->getRate() . '
             ELSE
                 CASE WHEN `is_min_price_ttc`.PROMO=1 THEN `min_price_ttc_data`.PROMO_PRICE ELSE `min_price_ttc_data`.PRICE END
             END';
         } else {
             $MinPriceToCompareAsSQL = 'CASE WHEN `is_min_price_ttc`.PROMO=1 THEN `min_price_ttc_data`.PROMO_PRICE ELSE `min_price_ttc_data`.PRICE END';
         }
         $search->where('ROUND(' . $MinPriceToCompareAsSQL . ', 2)>=?', $minPriceHt, \PDO::PARAM_STR);
     }
     if (null !== $maxPriceTTC) {
         $maxPriceHt = round($calculator->getUntaxedPrice($maxPriceTTC), 2);
         $isPSELeftJoinList[] = 'is_max_price_ttc';
         $maxPriceJoin = new Join();
         $maxPriceJoin->addExplicitCondition(ProductSaleElementsTableMap::TABLE_NAME, 'ID', 'is_max_price_ttc', ProductPriceTableMap::TABLE_NAME, 'PRODUCT_SALE_ELEMENTS_ID', 'max_price_ttc_data');
         $maxPriceJoin->setJoinType(Criteria::LEFT_JOIN);
         $search->joinProductSaleElements('is_max_price_ttc', Criteria::LEFT_JOIN)->addJoinObject($maxPriceJoin, 'is_max_price_ttc_join')->addJoinCondition('is_max_price_ttc_join', '`max_price_ttc_data`.`currency_id` = ?', $currency->getId(), null, \PDO::PARAM_INT);
         if ($defaultCurrency->getId() != $currency->getId()) {
             $maxPriceJoinDefaultCurrency = new Join();
             $maxPriceJoinDefaultCurrency->addExplicitCondition(ProductSaleElementsTableMap::TABLE_NAME, 'ID', 'is_max_price_ttc', ProductPriceTableMap::TABLE_NAME, 'PRODUCT_SALE_ELEMENTS_ID', 'max_price_ttc_data' . $defaultCurrencySuffix);
             $maxPriceJoinDefaultCurrency->setJoinType(Criteria::LEFT_JOIN);
             $search->addJoinObject($maxPriceJoinDefaultCurrency, 'is_max_price_ttc_join' . $defaultCurrencySuffix)->addJoinCondition('is_max_price_ttc_join' . $defaultCurrencySuffix, '`max_price_ttc_data' . $defaultCurrencySuffix . '`.`currency_id` = ?', $defaultCurrency->getId(), null, \PDO::PARAM_INT);
             /**
              * In propel we trust : $currency->getRate() always returns a float.
              * Or maybe not : rate value is checked as a float in overloaded getRate method.
              */
             $MaxPriceToCompareAsSQL = 'CASE WHEN ISNULL(CASE WHEN `is_max_price_ttc`.PROMO=1 THEN `max_price_ttc_data`.PROMO_PRICE ELSE `max_price_ttc_data`.PRICE END) OR `min_price_data`.FROM_DEFAULT_CURRENCY = 1 THEN
                 CASE WHEN `is_max_price_ttc`.PROMO=1 THEN `max_price_ttc_data' . $defaultCurrencySuffix . '`.PROMO_PRICE ELSE `max_price_ttc_data' . $defaultCurrencySuffix . '`.PRICE END * ' . $currency->getRate() . '
             ELSE
                 CASE WHEN `is_max_price_ttc`.PROMO=1 THEN `max_price_ttc_data`.PROMO_PRICE ELSE `max_price_ttc_data`.PRICE END
             END';
         } else {
             $MaxPriceToCompareAsSQL = 'CASE WHEN `is_max_price_ttc`.PROMO=1 THEN `max_price_ttc_data`.PROMO_PRICE ELSE `max_price_ttc_data`.PRICE END';
         }
         $search->where('ROUND(' . $MaxPriceToCompareAsSQL . ', 2)<=?', $maxPriceHt, \PDO::PARAM_STR);
     }
 }