Files
grzanieplus.pl/plugins/stPriceHistoryPlugin/lib/stPriceHistoryFrontend.php
2025-03-12 17:06:23 +01:00

384 lines
16 KiB
PHP

<?php
/**
* Obsługa danych związanych z hiustorią cen produktów price-history
*
* @author Marek Jakubowicz m@sote.pl
*/
/**
* Odczyt danych z historii cen po stronie Frontend
*/
class stPriceHistoryFrontend
{
/**
* Sprawdz konfigurację historii cen i
typ, czy jest włączona opcja full.
* @return bool - true - jeśli opcja jest fullo, false - simple/inna
*/
public function isFullMode()
{
// // Odczytanie konfiguracji
// $product_config = stConfig::getInstance('stProduct');
// $price_history_type=$product_config->get('price_history_type');
// if ($price_history_type=='full')
// {
// return true;
// } else return false;
// po zmianach w STX-1439 system zawsze zwaraca full
return 'full';
}
/**
* Funkcja wywoływana po frontendzie z obliczaniem danych do prezentacji histrii cen na wykresie i w tabelce
* Przeniesienie (separacja od pakietu) z stProduct actions.class.php
*
* @param $this_object object Obiekt $this z stProductActions (action.class.php)
* @return Symfony Action View
*/
public function frontendPriceHistory($this_object)
{
$product_exists = false;
$today = date("Y-m-d");
if ($this_object->getRequest()->hasParameter('product_id'))
{
// podano parametr id
$product_id = intval($this_object->getRequest()->getParameter('product_id'));
if (is_int($product_id))
{
// sprawdź czy jest produkt o podanym ID - kazdy parametr URL musi byc sprawdzamy.
$c = new Criteria();
$c->add(ProductPeer::ID, $product_id);
$product = ProductPeer::doSelectOne($c);
if (! empty($product))
{
// produkt o podanym id istnieje
$product_exists=true;
} else {
// nie ma produktu o podanym id
}
} else
{
// podany paramter nie jest typu integer - niedozwolone wywolanie
// nie ma takiego produktu
}
$this_object->product_exists = $product_exists;
if (! $product_exists)
{
$this_object->getResponse()->setStatusCode(404);
$this_object->getResponse()->setHttpHeader('Status', '404 Not Found');
return $this_object->forward('stErrorFrontend', 'error404');
}
// produkt istnieje
$this_object->product_id=$product_id;
$this_object->product_name = $product->getName();
// ustal date -30 dni
$date_from_calc = date('Y-m-d', strtotime('-30 day', strtotime(date('Y-m-d'))));
$config = stConfig::getInstance('stProduct');
$date_from_config=$config->get("product_price_history_date");
// przekaz informacje, czy pokazywac dodatkowe info dla obnizki czy zawsze
$price_history_show_change = $config->get('price_history_show_change');
if ($price_history_show_change == 'down')
{
$this_object->price_history_show_change = 'down';
} else {
$this_object->price_history_show_change = 'all';
}
// sprawdz date z konfiguracji
if ($date_from_config>=$date_from_calc)
{
$date_from = $date_from_config;
} else
{
$date_from = $date_from_calc;
}
// Sprawdz czy date_from jest starsze niz data dodania produktu, jesli tak zastap wartosc data dodania.
// Nie mozna pokazywac danych starszych niz data dodania produktu.
$product_created_at = $product->getCreatedAt();
$product_created_at = date("Y-m-d",strtotime($product_created_at)); // STX-1432 poprawienie daty - do porównania data brana jest bez czasu
if ($date_from<$product_created_at)
{
$date_from = $product_created_at;
}
// $date_from zawiera teraz informację od kiedy będa pokazywane dane
// odczytaj domyśłną walutę. Historia pokazywana jest tylko w domyślnej walucie
$c = new Criteria();
$c->add(CurrencyPeer::MAIN, 1, Criteria::EQUAL);
$curr = CurrencyPeer::doSelectOne($c);
$this_object->currency_default = $curr->getShortcut();
$this_object->currency_default_object = $curr;
// odczytaj dane z historii cen produktu product_price_history
$c = new Criteria();
$c->add(ProductPriceHistoryPeer::PRODUCT_ID, $product_id);
$c->add(ProductPriceHistoryPeer::CREATED_AT, $date_from, Criteria::GREATER_EQUAL);
$c->addDescendingOrderByColumn(ProductPriceHistoryPeer::CREATED_AT);
$product_price_history = ProductPriceHistoryPeer::doSelect($c);
$results = array();
$results_stat = array();
if (! empty($product_price_history))
{
// są wpisy w tabeli product_price_history dla danego produktu z data wieksza równą $date_from
$price_brutto_previous = null; // cena poprzedniego rekordu
foreach ($product_price_history as $price_history)
{
$this_object->date_from = $date_from;
$data=array();
$data['created_at'] = date("Y-m-d",strtotime($price_history->getCreatedAt()));
$data['price_netto'] = $price_history->getPriceNetto();
$data['price_brutto'] = $price_history->getPriceBrutto();
$result = array(
"created_at"=>date("d-m-Y",strtotime($data['created_at'])),
"price_netto"=>$data['price_netto'],
"price_brutto"=>$data['price_brutto']
);
// pokazuj dane w tabelce, jeśli są różne, pomijaj takie same wpisy dla kolejnych rekordow
if ($price_brutto_previous!=$data['price_brutto'])
{
$results[]=$result; // dane do tabelki
}
$price_brutto_previous = $data['price_brutto']; // zapamiętaj cen rekordu do porównania z kolejnej iteracji
$results_stat[$data['created_at']]=$result; // dane do wykresu
}
// ostatnie wartość $data to najstarszy wpis, powielamy dodajac zakres od daty zliczania do pierwszej zmiany
// ma to znaczenie dla produktow, ktore po aktywacji historii cen nie zmienialy dlugo ceny
// sprawdzamy czy date_from jest starsza nie ostatni wpis, jesli tak do dodajemy na koncu wpis z aktualna cena
if ($date_from<$data['created_at'])
{
// $results_extra=array(
// "created_at"=>date("d-m-Y",strtotime($date_from)),
// "price_netto"=>$data['price_netto'],
// "price_brutto"=>$data['price_brutto']
// );
// // jesli jest tylko jeden wpis w product_price_history dla danego produktu
// // to zostaw tylko result_extra z poczatkową data, gdyz inaczej beda 2 wpisy z ta sama cena i roznymi datami
// if (sizeof($results)==1)
// {
// $results=array();
// }
// $results[] = $results_extra;
// $results_stat[$date_from] = $results_extra;
} else {
$date_from = $data['created_at'];
}
} else {
// nie ma wpisów dla produktu z data wieksza równą niż date_from
// odczytaj dane produktu i zwróć w $results;
$data['price_netto'] = $product->getPriceNetto();
$data['price_brutto'] = $product->getPriceBrutto();
$results_product_today=array(
"created_at"=>date("d-m-Y",strtotime($date_from)),
"price_netto"=>$data['price_netto'],
"price_brutto"=>$data['price_brutto'],
);
// odczytaj cenę z last i zapisz jako kolejny element
$yesterday_table = date('d-m-Y', strtotime('-1 day', strtotime(date('d-m-Y'))));
$yesterday_stat = date('Y-m-d', strtotime('-1 day', strtotime(date('d-m-Y'))));
$price_history_last = new stPriceHistoryLast($product->getId());
$results_product_last=array(
"created_at"=>$yesterday_table,
"price_netto"=>$price_history_last->getPriceNetto(),
"price_brutto"=>$price_history_last->getPriceBrutto(),
);
// zapisz wyniki
if (($price_history_last->getProduct()) && ($price_history_last->getPriceBrutto()!=$data['price_brutto'])) {
// dane do tabelki
$results[]=$results_product_last;
// dane do wykresu
// wpis z wczoraj
$results_product_last['created_at']=$yesterday_stat; // podmiana formatu daty na format jaki jest w bazie Y-m-d
$results_stat[$results_product_last['created_at']]=$results_product_last;
// wpis na poczatku okresu odczytu
$results_from = $results_product_last;
$results_from['created_at']=$date_from;
$results_stat[$results_from['created_at']]=$results_from;
} else {
$results[]=$results_product_today;
}
}
// Sprawdz dane do tabelki, jesli dzisiajsza cena nie zgadza sie, uaktualnij ja lub dodaj wpis z dzisiejsza data
/*
$results -> Array
(
[0] => Array
(
[created_at] => 05-12-2022
[price_netto] => 433.17
[price_brutto] => 532.80
)
[1] => Array
(
[created_at] => 04-12-2022
[price_netto] => 406.50
[price_brutto] => 500
)
*/
// end
$last_result = $results[0];
$today_db = date('d-m-Y'); // format daty odczytywany w z bazy jest inny
if ($last_result['created_at']==$today_db)
{
$results[0]['price_netto']=$product->getPriceNetto();
$results[0]['price_brutto']=$product->getPriceBrutto();
} else
{
// Sprawdz czy ostatnia cena jest rozna od dzisiejszej. Jesli tak do ddoaj rekord z aktualną ceną.
$today_price_brutto = $product->getPriceBrutto();
$today_price_netto = $product->getPriceNetto();
// $result[0] - pierwszy wpis na liście, reprezentujący ostatnią zmianę ceny
if ($results[0]['price_brutto']!=$today_price_brutto)
{
// dodaj wpis na początku - przesuń inne elementy
$item_today = array('created_at'=>$today_db,
'price_netto'=>$today_price_netto,
'price_brutto'=>$today_price_brutto
);
array_unshift($results , $item_today);
}
}
$this_object->results = $results; // przekaż do template - dane to tabelki
$price_stat = $data['price_brutto']; // domyślna ostatnia wartość z tabelki lub cena produktu
// dane do wykresu
// zakres od $date_from do dzisiaj, każdy rekord to 1 dzień z aktualną ceną na ten dzień
$now = time(); // or your date as well
$check_date = strtotime($date_from);
$datediff = $now - $check_date;
$days = round($datediff / (60 * 60 * 24));
if ($days>30) $days = 30; // zabezpieczenie gdyby danych było więcej, np. z powodu błędu
$results_data_lable = array();
$results_data_value = array();
for ($d=0;$d<=$days;$d++)
{
$day_stat = date('Y-m-d', strtotime('+'.$d.' day', strtotime($date_from)));
// quick fix: jeśli sa wpisy w historii cen to pokazuje sie cena jeden dzien do przodu
// Wynika to z warunku $d<=$days, ale jak zmienimy na <, to wykre będzie pusty jesli
// nigdy nie zmieniano ceny produktu
if ($day_stat<=$today)
{
if (! empty($results_stat[$day_stat]))
{
$data=array();
$data['price_netto'] = $results_stat[$day_stat]['price_netto'];
$data['price_brutto'] = $results_stat[$day_stat]['price_brutto'];
}
$day_stat = date('d-m', strtotime($day_stat));
$results_data_label[]=$day_stat;
$results_data_value[]=$data['price_brutto'];
}
}
// podmień ostatni wpis z dzisiajszą datą -> ostatni wpis, na aktualną cenę produktu
$last_value = sizeof($results_data_value)-1;
$results_data_value[$last_value]=$product->getPriceBrutto();
// end
$this_object->results_data_label = json_encode(array_values($results_data_label)); // dane do wykresu
$this_object->results_data_value = json_encode(array_values($results_data_value)); // dane do wykresu
} else
{
// nieprawidlowy produkt podany w id
$this_object->product_id=null;
}
$this_object->smarty = new stSmarty($this_object->getModuleName());
// Dodatkowe informacje o najniższej cenie przed zmianą/obniżką
// odczytaj czy produkt miał zmirnianą cenę w górę czy w dół
// jeśli nie ma wartości, oznacza top że produkt nie miał zmienionej ceny od wydania STX-1301 (SOTESHOP 8.1.5)
if(!@$product){
$this_object->getResponse()->setStatusCode(404);
$this_object->getResponse()->setHttpHeader('Status', '404 Not Found');
return $this_object->forward('stErrorFrontend', 'error404');
}
// $price_history_change = $product->getOptPriceHistoryChange(); // odczytanie danych z st_Product pole opt
$price_history_min = new stPriceHistoryMin($product->getId());
$price_history_change = $price_history_min->getPriceChange(); // głowne dane z tabeli _min
$price_history_min_date = $price_history_min->getDatePreviousMinPrice(); // data najnizszej ceny 30 dni przed zmianą
$price_history_change_date = $price_history_min->getDateLastPriceChange(); // data ostatniej zmiany
$this_object->price_history_min_date = $price_history_min_date;
$this_object->price_history_change_date = $price_history_change_date;
$this_object->price_history_change=NULL;
$this_object->previous_min_price = NULL; // wartość dla sytuacji, kiedy nie ma zapisanej ceny min
if (! is_null($price_history_change))
{
$previous_min_price = $price_history_min->getMinProductPriceBrutto();
if ($previous_min_price>0)
{
$this_object->previous_min_price = $previous_min_price;
if ($price_history_change=='up')
{
$this_object->price_history_change = 'up';
} elseif ($price_history_change=='down')
{
$this_object->price_history_change = 'down';
}
} else
{
// jest wpist w st_product w polu opt_price_history_change, ale nie ma wpisu z ceną w st_product_price_history_min
$this_object->price_history_change = NULL;
}
}
}
}