384 lines
16 KiB
PHP
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;
|
|
}
|
|
}
|
|
}
|
|
} |