From bad96293e666875a090d5f71cd5dd659712fe562 Mon Sep 17 00:00:00 2001
From: Jacek Pyziak
Date: Mon, 16 Mar 2026 00:25:47 +0100
Subject: [PATCH] update
---
.vscode/ftp-kr.sync.cache.json | 4 +-
changelog/2026-03-16.md | 12 +
modules/omnibuseufree/omnibuseufree.php | 514 ++++++------------
.../hook/presta_studio_omnibus_price.tpl | 23 +-
4 files changed, 208 insertions(+), 345 deletions(-)
create mode 100644 changelog/2026-03-16.md
diff --git a/.vscode/ftp-kr.sync.cache.json b/.vscode/ftp-kr.sync.cache.json
index e3a6edaf..ee5308bf 100644
--- a/.vscode/ftp-kr.sync.cache.json
+++ b/.vscode/ftp-kr.sync.cache.json
@@ -386,9 +386,9 @@
},
".htaccess": {
"type": "-",
- "size": 18985,
+ "size": 19570,
"lmtime": 1772451998229,
- "modified": false
+ "modified": true
},
".htaccess.2025-01-27-1738009656": {
"type": "-",
diff --git a/changelog/2026-03-16.md b/changelog/2026-03-16.md
new file mode 100644
index 00000000..1c629e8f
--- /dev/null
+++ b/changelog/2026-03-16.md
@@ -0,0 +1,12 @@
+# 2026-03-16
+
+## Co zrobiono
+- Naprawiono wyświetlanie ceny w fallbacku modułu `omnibuseufree` i dopasowano zaokrąglanie do sposobu prezentacji cen na froncie.
+- Dodano tryb debug uruchamiany parametrem `omnibuseufree_debug=1`, aby podejrzeć wartości wejściowe i wyliczone (`price`, `price_amount`, `regular_price`, fallback, minimalna).
+- Uporządkowano logikę braku historii: gdy brak historii do wyświetlenia, moduł pokazuje cenę regularną (bez promocji).
+- Dodano warunek dla promocji: jeśli w historii z okresu nie ma ceny różnej od bieżącej ceny promocyjnej, moduł traktuje to jako brak historii „sprzed obniżki” i wymusza fallback na cenę regularną.
+- Zweryfikowano na przypadkach testowych poprawne wyjście (w tym przypadki z wcześniejszym błędem 4 067,52 / 4 068,00 oraz z historią zawierającą tylko aktualną cenę promocyjną).
+
+## Zmienione pliki
+- `modules/omnibuseufree/omnibuseufree.php`
+- `modules/omnibuseufree/views/templates/hook/presta_studio_omnibus_price.tpl`
diff --git a/modules/omnibuseufree/omnibuseufree.php b/modules/omnibuseufree/omnibuseufree.php
index 53f03b71..0ddd71a7 100644
--- a/modules/omnibuseufree/omnibuseufree.php
+++ b/modules/omnibuseufree/omnibuseufree.php
@@ -111,7 +111,7 @@ class OmnibusEuFree extends Module
return $tab->delete();
}
- protected function getLastMinimalPrice($id_product = null, $id_product_attribute = 0, $currency = null, $hasDiscountNow = null)
+ protected function getLastMinimalPrice($id_product = null, $id_product_attribute = 0, $currency = null)
{
if (!isset($id_product)) {
throw new Exception('Missing parameter: $id_product');
@@ -119,152 +119,124 @@ class OmnibusEuFree extends Module
if (!isset($currency)) {
$defaultCurrency = Currency::getDefaultCurrency();
- $currency = (int)$defaultCurrency->id;
+ $currency = $defaultCurrency->id;
}
- $info_version = (int) Configuration::get('OMNIBUSEUFREE_INFORMATION_VERSION', null, null, null, 2);
+ $info_version = Configuration::get('OMNIBUSEUFREE_INFORMATION_VERSION', null, null, null, 2);
$NumberOfDays = (int) Configuration::get('OMNIBUSEUFREE_DAYS', null, null, null, 30);
- // Jeżeli v2 ma sens tylko przy rabacie - jeśli nie ma rabatu, nie pokazuj
- if ($info_version === 2) {
- if ($hasDiscountNow === null) {
- // pewne sprawdzenie: porównaj regular vs sale w tej walucie
- $snap = $this->getPricesSnapshot((int)$id_product, (int)$id_product_attribute, (int)$currency);
- $hasDiscountNow = (bool)$snap['has_discount'];
- }
-
- if (!$hasDiscountNow) {
- return [];
- }
-
- // 1) data ostatniego wpisu (bieżący stan)
- $sqlLast = new DbQuery();
- $sqlLast->select('date_add');
- $sqlLast->from('omnibus_eu_free');
- $sqlLast->where('id_product = ' . (int)$id_product);
- $sqlLast->where('id_product_attribute = ' . (int)$id_product_attribute);
- $sqlLast->where('id_currency = ' . (int)$currency);
- $sqlLast->where('is_default_currency = 1');
- $sqlLast->where('is_last = 1');
- $lastRow = Db::getInstance()->getRow($sqlLast);
-
- if (empty($lastRow['date_add'])) {
- return [];
- }
-
- $lastDate = $lastRow['date_add'];
-
- // 2) znajdź ostatni moment przed lastDate, kiedy rabatu NIE było (has_discount=0)
- $sqlPrevNoDisc = new DbQuery();
- $sqlPrevNoDisc->select('MAX(date_add) AS prev_no_disc');
- $sqlPrevNoDisc->from('omnibus_eu_free');
- $sqlPrevNoDisc->where('id_product = ' . (int)$id_product);
- $sqlPrevNoDisc->where('id_product_attribute = ' . (int)$id_product_attribute);
- $sqlPrevNoDisc->where('id_currency = ' . (int)$currency);
- $sqlPrevNoDisc->where('is_default_currency = 1');
- $sqlPrevNoDisc->where('date_add < "' . pSQL($lastDate) . '"');
- $sqlPrevNoDisc->where('has_discount = 0');
- $rowPrev = Db::getInstance()->getRow($sqlPrevNoDisc);
-
- // 3) start rabatu = pierwszy rekord z has_discount=1 po prev_no_disc
- // jeśli nigdy nie było has_discount=0, start = pierwszy rekord w historii z has_discount=1
- if (!empty($rowPrev['prev_no_disc'])) {
- $sqlStart = new DbQuery();
- $sqlStart->select('MIN(date_add) AS disc_start');
- $sqlStart->from('omnibus_eu_free');
- $sqlStart->where('id_product = ' . (int)$id_product);
- $sqlStart->where('id_product_attribute = ' . (int)$id_product_attribute);
- $sqlStart->where('id_currency = ' . (int)$currency);
- $sqlStart->where('is_default_currency = 1');
- $sqlStart->where('has_discount = 1');
- $sqlStart->where('date_add > "' . pSQL($rowPrev['prev_no_disc']) . '"');
- $rowStart = Db::getInstance()->getRow($sqlStart);
- } else {
- $sqlStart = new DbQuery();
- $sqlStart->select('MIN(date_add) AS disc_start');
- $sqlStart->from('omnibus_eu_free');
- $sqlStart->where('id_product = ' . (int)$id_product);
- $sqlStart->where('id_product_attribute = ' . (int)$id_product_attribute);
- $sqlStart->where('id_currency = ' . (int)$currency);
- $sqlStart->where('is_default_currency = 1');
- $sqlStart->where('has_discount = 1');
- $rowStart = Db::getInstance()->getRow($sqlStart);
- }
-
- if (empty($rowStart['disc_start'])) {
- return [];
- }
-
- $discStart = $rowStart['disc_start'];
-
- // okno 30 dni przed startem rabatu
- $startDateTime = (new DateTime($discStart))->modify('-' . $NumberOfDays . ' days')->format('Y-m-d H:i:s');
-
- // minimalna cena REGULARNA w oknie przed rabatem
- $sqlMin = new DbQuery();
- $sqlMin->select('MIN(price_regular) AS price');
- $sqlMin->from('omnibus_eu_free');
- $sqlMin->where('id_product = ' . (int)$id_product);
- $sqlMin->where('id_product_attribute = ' . (int)$id_product_attribute);
- $sqlMin->where('id_currency = ' . (int)$currency);
- $sqlMin->where('is_default_currency = 1');
- $sqlMin->where('date_add >= "' . pSQL($startDateTime) . '"');
- $sqlMin->where('date_add < "' . pSQL($discStart) . '"');
-
- $minRow = Db::getInstance()->getRow($sqlMin);
-
- if (empty($minRow) || !isset($minRow['price']) || $minRow['price'] === null) {
-
- $sqlStartPrice = new DbQuery();
- $sqlStartPrice->select('price_regular AS price');
- $sqlStartPrice->from('omnibus_eu_free');
- $sqlStartPrice->where('id_product = ' . (int)$id_product);
- $sqlStartPrice->where('id_product_attribute = ' . (int)$id_product_attribute);
- $sqlStartPrice->where('id_currency = ' . (int)$currency);
- $sqlStartPrice->where('is_default_currency = 1');
- $sqlStartPrice->where('has_discount = 1');
- $sqlStartPrice->orderBy('date_add ASC, id_omnibuseufree ASC');
-
- $startPriceRow = Db::getInstance()->getRow($sqlStartPrice, false);
-
- return (!empty($startPriceRow) && isset($startPriceRow['price'])) ? $startPriceRow : [];
- }
-
- return (!empty($minRow) && isset($minRow['price'])) ? $minRow : [];
- }
-
- // v1: najniższa z ostatnich X dni (tu możesz liczyć po regularnej albo po sale – zależnie od interpretacji)
$date = new DateTime();
$date->modify('-' . $NumberOfDays . ' days');
$CutOffDate = $date->format('Y-m-d');
$sql = new DbQuery();
- $sql->select('MIN(price_sale) AS price');
+ $sql->select('price');
$sql->from('omnibus_eu_free');
- $sql->where('id_product = ' . (int)$id_product);
- $sql->where('id_product_attribute = ' . (int)$id_product_attribute);
- $sql->where('id_currency = ' . (int)$currency);
- $sql->where('is_default_currency = 1');
+ $sql->where('id_product = ' . (int) $id_product);
+ $sql->where('id_product_attribute = ' . (int) $id_product_attribute);
+ $sql->where('id_currency = ' . (int) $currency);
$sql->where('date_add >= "'.$CutOffDate.' 00:00:00"');
- $row = Db::getInstance()->getRow($sql);
+ if ($info_version == 2) {
+ $sql->where('is_last = 0');
+ }
- return (!empty($row) && isset($row['price'])) ? $row : [];
+ $sql->orderBy('price ASC');
+ $sql->limit(1);
+ $sqlResult = Db::getInstance()->executeS($sql);
+
+ return (!empty($sqlResult)) ? $sqlResult[0] : array();
}
+ protected function hasDifferentHistoricalPrice($id_product, $id_product_attribute, $currency, $currentPrice)
+ {
+ $info_version = Configuration::get('OMNIBUSEUFREE_INFORMATION_VERSION', null, null, null, 2);
+ $numberOfDays = (int) Configuration::get('OMNIBUSEUFREE_DAYS', null, null, null, 30);
+
+ $date = new DateTime();
+ $date->modify('-' . $numberOfDays . ' days');
+ $cutOffDate = $date->format('Y-m-d');
+
+ $sql = new DbQuery();
+ $sql->select('id_omnibuseufree');
+ $sql->from('omnibus_eu_free');
+ $sql->where('id_product = ' . (int) $id_product);
+ $sql->where('id_product_attribute = ' . (int) $id_product_attribute);
+ $sql->where('id_currency = ' . (int) $currency);
+ $sql->where('date_add >= "' . pSQL($cutOffDate . ' 00:00:00') . '"');
+ $sql->where('ABS(price - ' . (float) $currentPrice . ') > 0.000001');
+
+ if ($info_version == 2) {
+ $sql->where('is_last = 0');
+ }
+
+ $sql->limit(1);
+
+ return (bool) Db::getInstance()->getValue($sql);
+ }
+
+ protected function formatDisplayPrice($price, $currency, $precisionOverride = null)
+ {
+ if ($precisionOverride !== null) {
+ $priceDisplayPrecision = (int) $precisionOverride;
+ } else {
+ $priceDisplayPrecision = (int) Configuration::get('PS_PRICE_DISPLAY_PRECISION', null, null, null, _PS_PRICE_DISPLAY_PRECISION_);
+ }
+ $roundedPrice = Tools::ps_round((float) $price, $priceDisplayPrecision);
+
+ return PrestashopCompatibility::formatPrice(_PS_VERSION_, $roundedPrice, $currency);
+ }
public function hookDisplayOmnibusEuFree($params)
{
$currency = $this->context->currency;
- $lastMinimalPrice = $this->getLastMinimalPrice(
- (int)$params['product']['id_product'],
- (int)$params['product']['id_product_attribute'],
- (int)$currency->id,
- (bool)$params['product']['has_discount']
- );
+ $debugEnabled = (bool) Tools::getValue('omnibuseufree_debug');
+ $idProduct = isset($params['product']['id_product']) ? (int) $params['product']['id_product'] : 0;
+ $idProductAttribute = isset($params['product']['id_product_attribute']) ? (int) $params['product']['id_product_attribute'] : 0;
+ $lastMinimalPrice = $this->getLastMinimalPrice($idProduct, $idProductAttribute, $currency->id);
+ $regularPrice = isset($params['product']['regular_price']) ? $params['product']['regular_price'] : null;
+ $displayPrecisionOverride = null;
+ $forcedFallbackNoPreDiscountHistory = false;
+
+ if (isset($params['product']['price_amount']) && is_numeric($params['product']['price_amount'])) {
+ $priceAmount = (float) $params['product']['price_amount'];
+ if (abs($priceAmount - round($priceAmount)) < 0.000001) {
+ $displayPrecisionOverride = 0;
+ }
+ }
+
+ $fallbackPrice = null;
+ if (is_string($regularPrice) && $regularPrice !== '') {
+ // Prefer the already prepared regular (non-discounted) price from product presenter.
+ $fallbackPrice = $regularPrice;
+ } elseif ($idProduct > 0) {
+ // Compute regular (without reduction) price if presenter did not provide it.
+ $useTax = Product::getTaxCalculationMethod((int) $this->context->customer->id) != PS_TAX_EXC;
+ $regularRaw = Product::getPriceStatic($idProduct, $useTax, $idProductAttribute, 6, null, false, false);
+ $fallbackPrice = $this->formatDisplayPrice((float) $regularRaw, $currency, $displayPrecisionOverride);
+ } elseif (isset($params['product']['price_amount']) && is_numeric($params['product']['price_amount'])) {
+ // Last resort if product id is missing in hook params.
+ $fallbackPrice = $this->formatDisplayPrice((float) $params['product']['price_amount'], $currency, $displayPrecisionOverride);
+ } elseif (isset($params['product']['price']) && is_numeric($params['product']['price'])) {
+ $fallbackPrice = $this->formatDisplayPrice((float) $params['product']['price'], $currency, $displayPrecisionOverride);
+ } elseif (isset($params['product']['price']) && is_string($params['product']['price']) && $params['product']['price'] !== '') {
+ $fallbackPrice = $params['product']['price'];
+ }
if (!empty($lastMinimalPrice)) {
- $minimalPrice = PrestashopCompatibility::formatPrice(_PS_VERSION_, $lastMinimalPrice['price'], $currency);
+ if (
+ !empty($params['product']['has_discount']) &&
+ isset($params['product']['price_amount']) &&
+ is_numeric($params['product']['price_amount']) &&
+ !$this->hasDifferentHistoricalPrice($idProduct, $idProductAttribute, $currency->id, (float) $params['product']['price_amount'])
+ ) {
+ $lastMinimalPrice = array();
+ $forcedFallbackNoPreDiscountHistory = true;
+ }
+ }
+
+ if (!empty($lastMinimalPrice)) {
+ $minimalPrice = $this->formatDisplayPrice($lastMinimalPrice['price'], $currency, $displayPrecisionOverride);
}
else {
$minimalPrice = null;
@@ -274,8 +246,27 @@ class OmnibusEuFree extends Module
'OmnibuseufreeInfoVersion' => (int) Configuration::get('OMNIBUSEUFREE_INFORMATION_VERSION', null, null, null, 2),
'OmnibuseufreeProductPriceMin' => $minimalPrice,
'OmnibuseufreeProductPriceCurrent' => $params['product']['price'],
+ 'OmnibuseufreeProductPriceRegular' => $regularPrice,
+ 'OmnibuseufreeProductPriceFallback' => $fallbackPrice,
'OmnibuseufreeProductDiscount' => (bool) $params['product']['has_discount'],
'OmnibuseufreeNumberOfDays' => (int) Configuration::get('OMNIBUSEUFREE_DAYS', null, null, null, 30),
+ 'OmnibuseufreeDebugEnabled' => $debugEnabled,
+ 'OmnibuseufreeDebugData' => [
+ 'marker' => 'omnibuseufree-debug-2026-03-16',
+ 'product_id' => $idProduct,
+ 'product_attribute_id' => $idProductAttribute,
+ 'currency_id' => isset($currency->id) ? (int) $currency->id : null,
+ 'currency_iso' => isset($currency->iso_code) ? (string) $currency->iso_code : '',
+ 'price_display_precision' => (int) Configuration::get('PS_PRICE_DISPLAY_PRECISION', null, null, null, _PS_PRICE_DISPLAY_PRECISION_),
+ 'display_precision_override' => $displayPrecisionOverride === null ? 'null' : (string) $displayPrecisionOverride,
+ 'param_price' => isset($params['product']['price']) ? (string) $params['product']['price'] : null,
+ 'param_price_amount' => isset($params['product']['price_amount']) ? (string) $params['product']['price_amount'] : null,
+ 'param_regular_price' => isset($params['product']['regular_price']) ? (string) $params['product']['regular_price'] : null,
+ 'computed_fallback' => (string) $fallbackPrice,
+ 'computed_minimal' => (string) $minimalPrice,
+ 'has_discount' => !empty($params['product']['has_discount']) ? '1' : '0',
+ 'forced_fallback_no_pre_discount_history' => $forcedFallbackNoPreDiscountHistory ? '1' : '0',
+ ],
]);
return $this->display(__FILE__, '/views/templates/hook/presta_studio_omnibus_price.tpl');
@@ -302,7 +293,7 @@ class OmnibusEuFree extends Module
foreach ($rowValue as $key => $value) {
if (isset($OmnibusData[$rowId]['price']) && $key == 'id_currency') {
$currency = Currency::getCurrencyInstance((int) $value);
- $OmnibusData[$rowId]['price_locale'] = PrestashopCompatibility::formatPrice(_PS_VERSION_, $OmnibusData[$rowId]['price'], $currency);
+ $OmnibusData[$rowId]['price_locale'] = $this->formatDisplayPrice($OmnibusData[$rowId]['price'], $currency);
$OmnibusData[$rowId]['currency_iso_code'] = $currency->iso_code;
}
elseif ($key == 'id_product_attribute') {
@@ -370,7 +361,7 @@ class OmnibusEuFree extends Module
// Skip entirely for products with many combinations.
// hookActionProductSave already handles base price recording.
- // This hook fires once PER combination (168x), so running here is wasteful.
+ // This hook fires once PER combination, so running here is wasteful.
if ($combinationCount > 30) {
return;
}
@@ -502,7 +493,6 @@ class OmnibusEuFree extends Module
array(
'type' => 'text',
'label' => $this->l('Number of days'),
- 'desc' => $this->l('Number of days for front-end lowest price display (Omnibus Directive).'),
'name' => 'OMNIBUSEUFREE_DAYS',
'class' => 'omnibus-input-days',
'maxlength' => '3',
@@ -657,249 +647,91 @@ class OmnibusEuFree extends Module
return $ToChange == 0 ? false : true;
}
- protected function getLastSnapshot($id_product = 0, $id_product_attribute = 0, $id_currency = null)
- {
- $sql = new DbQuery();
- $sql->select('price_regular, price_sale, has_discount, currency_conversion_rate');
- $sql->from('omnibus_eu_free');
- $sql->where('id_product = ' . (int)$id_product);
- $sql->where('id_product_attribute = ' . (int)$id_product_attribute);
- $sql->where('is_last = 1');
- $sql->where('is_default_currency = 1');
-
- if ($id_currency !== null) {
- $sql->where('id_currency = ' . (int)$id_currency);
- }
-
- $sql->limit(1);
- return Db::getInstance()->getRow($sql);
- }
-
- protected function getPricesSnapshot($id_product, $id_product_attribute, $id_currency)
- {
- $context = Context::getContext();
-
- $oldCurrency = $context->currency;
- if ((int)$id_currency > 0) {
- $context->currency = new Currency((int)$id_currency);
- }
-
- // regularna (bez redukcji)
- $regular = (float) Product::getPriceStatic(
- (int)$id_product,
- true,
- (int)$id_product_attribute,
- 6,
- null,
- false,
- false // use_reduction = false
- );
-
- // sprzedażowa (z redukcją)
- $sale = (float) Product::getPriceStatic(
- (int)$id_product,
- true,
- (int)$id_product_attribute,
- 6,
- null,
- false,
- true // use_reduction = true
- );
-
- // przywróć walutę
- $context->currency = $oldCurrency;
-
- $hasDiscount = ($sale > 0 && $regular > 0 && ($sale + 0.0001) < $regular) ? 1 : 0;
- $diff = $hasDiscount ? ($regular - $sale) : 0.0;
-
- return [
- 'regular' => $regular,
- 'sale' => $sale,
- 'has_discount' => $hasDiscount,
- 'diff' => $diff,
- ];
- }
-
-
- protected function normalizeCurrency($currency)
- {
- if (is_array($currency)) {
- return [
- 'id' => (int) ($currency['id_currency'] ?? $currency['id'] ?? 0),
- 'rate' => (float) ($currency['conversion_rate'] ?? $currency['rate'] ?? 0),
- ];
- }
-
- // obiekt Currency
- return [
- 'id' => (int) ($currency->id ?? 0),
- 'rate' => (float) ($currency->conversion_rate ?? 0),
- ];
- }
-
-
protected function addProductPrice($id_product = null)
{
if (!isset($id_product)) {
throw new Exception('Missing parameter: $id_product');
}
- $id_product = (int)$id_product;
+ $product = new Product($id_product);
+ $product_price = $product->getPrice();
- $currencies = Currency::getCurrencies(true, true);
- $defaultCurrency = Currency::getDefaultCurrency();
-
- // snapshot w default walucie do porównania (żeby nie dopisywać non stop)
- $snapDefault = $this->getPricesSnapshot($id_product, 0, (int)$defaultCurrency->id);
-
- if ((float)$snapDefault['sale'] != 0.0) {
- $last = $this->getLastSnapshot($id_product, 0);
+ if($product_price != 0){
+ $omnibus_price = array();
+ $omnibus_price = $this->getLastPrice($id_product, 0);
$check_currency = $this->checkCurrencyConversionRate($id_product, 0);
- $changed =
- empty($last)
- || abs((float)$last['price_regular'] - (float)$snapDefault['regular']) > 0.0001
- || abs((float)$last['price_sale'] - (float)$snapDefault['sale']) > 0.0001
- || (int)$last['has_discount'] !== (int)$snapDefault['has_discount']
- || (bool)$check_currency === true;
-
- if ($changed) {
- $this->clearLastPrice($id_product, 0);
+ if (empty($omnibus_price) || $product_price != $omnibus_price[0]['price'] || (bool) $check_currency == true) {
+ $this->clearLastPrice($id_product);
+ $currencies = Currency::getCurrencies();
+ $defaultCurrency = Currency::getDefaultCurrency();
foreach ($currencies as $currency) {
- $c = $this->normalizeCurrency($currency);
-
- $id_currency = (int)$c['id'];
- $conversion_rate = (float)$c['rate'];
-
- if ($id_currency <= 0) {
- continue;
+ if ($currency['id_currency'] == $defaultCurrency->id) {
+ $isDefaultCurrency = 1;
+ $product_price_currency = $product_price;
+ }
+ else {
+ $isDefaultCurrency = 0;
+ $product_price_currency = Tools::convertPrice($product_price, $currency);
}
- $isDefaultCurrency = ($id_currency === (int)$defaultCurrency->id) ? 1 : 0;
-
- $snap = $this->getPricesSnapshot($id_product, 0, $id_currency);
-
- if ((float)$snap['sale'] <= 0.0) {
- continue;
- }
-
- $this->insertToOmnibusTable(
- $id_product,
- 0,
- $snap,
- $id_currency,
- $isDefaultCurrency,
- $conversion_rate
- );
+ $this->insertToOmnibusTable($id_product, 0, $product_price_currency, $currency['id_currency'], $isDefaultCurrency, $currency['conversion_rate']);
}
}
}
}
-
protected function addProductPriceWithCombinations($id_product = null)
{
- if (!isset($id_product))
- {
- throw new Exception('Missing parameter: $id_product');
- }
-
- $id_product = (int)$id_product;
-
- Product::flushPriceCache();
-
- $defaultCurrency = Currency::getDefaultCurrency();
- $id_default_currency = (int)$defaultCurrency->id;
-
- // Najstabilniejsza lista kombinacji (bez powtórek)
- $attributeRows = Product::getProductAttributesIds($id_product);
- if (empty($attributeRows))
- {
- return;
- }
-
- // Lista walut (aktywnych)
- $currencies = Currency::getCurrencies(true, true);
-
- foreach ($attributeRows as $row)
- {
- $id_product_attribute = (int)$row['id_product_attribute'];
-
- // Snapshot w default walucie do porównania zmian
- $snapDefault = $this->getPricesSnapshot($id_product, $id_product_attribute, $id_default_currency);
-
- if ((float)$snapDefault['sale'] <= 0.0)
- {
- continue;
+ if (!isset($id_product)) {
+ throw new Exception('Missing parameter: $id_product');
}
- $last = $this->getLastSnapshot($id_product, $id_product_attribute);
- $check_currency = $this->checkCurrencyConversionRate($id_product, $id_product_attribute);
+ $product = new Product($id_product);
+ $product_combinations = $product->getAttributeCombinations();
- $changed =
- empty($last)
- || abs((float)$last['price_regular'] - (float)$snapDefault['regular']) > 0.0001
- || abs((float)$last['price_sale'] - (float)$snapDefault['sale']) > 0.0001
- || (int)$last['has_discount'] !== (int)$snapDefault['has_discount']
- || (bool)$check_currency === true;
+ if (!empty($product_combinations)) {
+ $currencies = Currency::getCurrencies();
+ $defaultCurrency = Currency::getDefaultCurrency();
- if (!$changed)
- {
- continue;
+ foreach ($product_combinations as $combination) {
+ $product_price = $product->getPrice(true, $combination['id_product_attribute']);
+
+ if($product_price != 0){
+ $omnibus_price = array();
+ $omnibus_price = $this->getLastPrice($id_product, $combination['id_product_attribute']);
+
+ $check_currency = $this->checkCurrencyConversionRate($id_product, $combination['id_product_attribute']);
+
+ if (empty($omnibus_price) || $product_price != $omnibus_price[0]['price'] || (bool) $check_currency == true) {
+ $this->clearLastPrice($id_product, $combination['id_product_attribute']);
+
+ foreach ($currencies as $currency) {
+ if ($currency['id_currency'] == $defaultCurrency->id) {
+ $isDefaultCurrency = 1;
+ $product_price_currency = $product_price;
+ }
+ else {
+ $isDefaultCurrency = 0;
+ $product_price_currency = Tools::convertPrice($product_price, $currency);
+ }
+
+ $this->insertToOmnibusTable($id_product, $combination['id_product_attribute'], $product_price_currency, $currency['id_currency'], $isDefaultCurrency, $currency['conversion_rate']);
+ }
+ }
+ }
+ }
}
-
- // Zerujemy is_last dla tej kombinacji (dla wszystkich walut)
- $this->clearLastPrice($id_product, $id_product_attribute);
-
- // Wstawiamy nowe snapshoty dla wszystkich walut
- foreach ($currencies as $currency)
- {
- $c = $this->normalizeCurrency($currency);
- $id_currency = (int)$c['id'];
- $conversion_rate = (float)$c['rate'];
-
- if ($id_currency <= 0)
- {
- continue;
- }
-
- $isDefaultCurrency = ($id_currency === $id_default_currency) ? 1 : 0;
-
- $snap = $this->getPricesSnapshot($id_product, $id_product_attribute, $id_currency);
-
- if ((float)$snap['sale'] <= 0.0)
- {
- continue;
- }
-
- $this->insertToOmnibusTable(
- $id_product,
- $id_product_attribute,
- $snap,
- $id_currency,
- $isDefaultCurrency,
- $conversion_rate
- );
- }
- }
}
- protected function insertToOmnibusTable($id_product = 0, $id_product_attribute = 0, $snap = [], $currency = 0, $isDefaultCurrency = 0, $CurrencyConversionRate = 0)
+ protected function insertToOmnibusTable($id_product = 0, $id_product_attribute = 0, $product_price = 0, $currency = 0, $isDefaultCurrency = 0, $CurrencyConversionRate = 0)
{
- return Db::getInstance()->insert('omnibus_eu_free', [
+ $result = Db::getInstance()->insert('omnibus_eu_free', [
'id_product' => (int) $id_product,
'id_product_attribute' => (int) $id_product_attribute,
-
- // zostaw stare price jako "sale" dla kompatybilności szablonu / starego kodu
- 'price' => pSQL($snap['sale']),
-
- 'price_regular' => pSQL($snap['regular']),
- 'price_sale' => pSQL($snap['sale']),
- 'has_discount' => (int) $snap['has_discount'],
- 'discount_diff' => pSQL($snap['diff']),
-
+ 'price' => pSQL($product_price),
'id_currency' => (int) $currency,
'is_default_currency' => (int) $isDefaultCurrency,
'is_last' => 1,
diff --git a/modules/omnibuseufree/views/templates/hook/presta_studio_omnibus_price.tpl b/modules/omnibuseufree/views/templates/hook/presta_studio_omnibus_price.tpl
index 2f0572f1..660c98d1 100644
--- a/modules/omnibuseufree/views/templates/hook/presta_studio_omnibus_price.tpl
+++ b/modules/omnibuseufree/views/templates/hook/presta_studio_omnibus_price.tpl
@@ -21,11 +21,30 @@
{l s='Lowest price in %d days before discount: ' sprintf=[$OmnibuseufreeNumberOfDays] mod='omnibuseufree'}{$OmnibuseufreeProductPriceMin}
{else}
{* when history is empty *}
- {l s='Lowest price in %d days: ' sprintf=[$OmnibuseufreeNumberOfDays] mod='omnibuseufree'}{$OmnibuseufreeProductPriceCurrent}
+ {l s='Lowest price in %d days: ' sprintf=[$OmnibuseufreeNumberOfDays] mod='omnibuseufree'}{$OmnibuseufreeProductPriceFallback|default:$OmnibuseufreeProductPriceCurrent}
{/if}
{else}
{l s='Lowest price in %d days: ' sprintf=[$OmnibuseufreeNumberOfDays] mod='omnibuseufree'}{$OmnibuseufreeProductPriceMin}
{/if}
-{/if}
\ No newline at end of file
+{/if}
+
+{if isset($OmnibuseufreeDebugEnabled) && $OmnibuseufreeDebugEnabled && isset($OmnibuseufreeDebugData)}
+
+
+ OMNIBUS DEBUG
+ marker: {$OmnibuseufreeDebugData.marker}
+ product_id: {$OmnibuseufreeDebugData.product_id}, attr_id: {$OmnibuseufreeDebugData.product_attribute_id}
+ currency: {$OmnibuseufreeDebugData.currency_iso} ({$OmnibuseufreeDebugData.currency_id}), precision: {$OmnibuseufreeDebugData.price_display_precision}
+ precision_override: {$OmnibuseufreeDebugData.display_precision_override}
+ has_discount: {$OmnibuseufreeDebugData.has_discount}
+ param price: {$OmnibuseufreeDebugData.param_price}
+ param price_amount: {$OmnibuseufreeDebugData.param_price_amount}
+ param regular_price: {$OmnibuseufreeDebugData.param_regular_price}
+ computed fallback: {$OmnibuseufreeDebugData.computed_fallback}
+ computed minimal: {$OmnibuseufreeDebugData.computed_minimal}
+ forced_fallback_no_pre_discount_history: {$OmnibuseufreeDebugData.forced_fallback_no_pre_discount_history}
+
+
+{/if}