* @copyright 2019 Futurenext srl * @license https://www.zakeke.com/privacy/#general_conditions */ class ZakekePriceModuleFrontController extends ModuleFrontController { /** @var float */ protected $productPrice; /** @var float */ protected $zakekePrice; /** @var float */ protected $zakekeFinalPrice; /** @var float */ protected $finalPrice; /** @var bool */ protected $isInStock; public function init() { parent::init(); $id_product = (int)Tools::getValue('id_product'); if (!$id_product) { $this->errors[] = $this->module->l('id_product must be not empty.'); return; } $product = new Product($id_product, true, $this->context->language->id, $this->context->shop->id); if (!Validate::isLoadedObject($product)) { $this->errors[] = $this->module->l('Product not found.'); return; } elseif (!$product->isAssociatedToShop() || !$product->active || !$product->checkAccess( isset($this->context->customer->id) && $this->context->customer->id ? (int)$this->context->customer->id : 0 ) ) { $this->errors[] = $this->module->l('Permission denied.'); return; } $qty = max((int)Tools::getValue('qty', 1), 1); $totalQty = max((int)Tools::getValue('total_qty', $qty), $qty); $idProductAttribute = 0; if (_PS_VERSION_ < 1.7) { $groups = array(); foreach (Tools::getAllValues() as $key => $value) { if (Tools::substr($key, 0, 6) == 'group_') { $groups[Tools::substr($key, 6)] = $value; } } if (!empty($groups)) { $idProductAttribute = (int)ZakekeCompatibility::getIdProductAttributeByIdAttributes( $id_product, $groups, true ); } } else { $groups = Tools::getValue('group'); if (!empty($groups)) { $idProductAttribute = (int)Product::getIdProductAttributesByIdAttributes( $id_product, $groups, true ); } } $priceDisplay = Product::getTaxCalculationMethod((int)$this->context->cookie->id_customer); $tax = (!$priceDisplay || $priceDisplay == 2) && !Tax::excludeTaxeOption(); $this->productPrice = $product->getPrice($tax, $idProductAttribute, 6, null, false, true, $totalQty) * $qty; $this->zakekePrice = 0.0; $zakekePercentPrice = (float)Tools::getValue('zakeke-percent-price', 0.0); if ($zakekePercentPrice > 0.0) { $productPriceWT = $product->getPrice(false, $idProductAttribute, 6, null, false, true, $totalQty) * $qty; $this->zakekePrice += $productPriceWT * ($zakekePercentPrice / 100); } $this->zakekePrice += (float)Tools::getValue('zakeke-price', 0.0); $this->zakekeFinalPrice = 0.0; if ($this->zakekePrice >= 0.0) { if ($tax) { // retrieve address information $address = Address::initialize(null, true); if (!(!empty($address->vat_number) && $address->id_country != Configuration::get('VATNUMBER_COUNTRY') && Configuration::get('VATNUMBER_MANAGEMENT'))) { // Add Tax $taxManager = TaxManagerFactory::getManager( $address, Product::getIdTaxRulesGroupByIdProduct((int)$id_product, $this->context) ); $taxCalculator = $taxManager->getTaxCalculator(); $this->zakekeFinalPrice = $taxCalculator->addTaxes($this->zakekePrice); $this->zakekeFinalPrice = Tools::ps_round($this->zakekeFinalPrice, 2); } } else { $this->zakekeFinalPrice = $this->zakekePrice; } } if (_PS_VERSION_ >= 1.7) { $context = Context::getContext(); $id_group = $context->customer->id_default_group; $id_currency = (int) $context->currency->id; $ids = Address::getCountryAndState((int) $context->cart->{Configuration::get('PS_TAX_ADDRESS_TYPE')}); $id_country = $ids['id_country'] ? (int) $ids['id_country'] : (int) Configuration::get('PS_COUNTRY_DEFAULT'); $specific_price = SpecificPrice::getSpecificPrice( (int) $id_product, $context->shop->id, $id_currency, $id_country, $id_group, $totalQty, null, 0, 0, $totalQty ); if ($specific_price && $specific_price['reduction_type'] != 'amount') { $this->zakekeFinalPrice -= $this->zakekeFinalPrice * $specific_price['reduction']; } } $this->finalPrice = Tools::ps_round($this->productPrice + $this->zakekeFinalPrice, 2); $this->isInStock = $product->checkQty($qty); } public function display() { $this->displayAjax(); } public function displayAjax() { ob_end_clean(); header('Content-Type: application/json'); if (!$this->errors) { $this->ajaxDie(json_encode(array( 'success' => true, 'zakekePrice' => $this->zakekePrice, 'zakekeFinalPrice' => $this->zakekeFinalPrice, 'price' => $this->productPrice, 'finalPrice' => $this->finalPrice, 'isInStock' => $this->isInStock ))); } else { $this->ajaxDie(json_encode(array( 'hasError' => true, 'errors' => $this->errors ))); } } }