first commit
This commit is contained in:
384
plugins/stPriceHistoryPlugin/lib/stPriceHistoryFrontend.php
Normal file
384
plugins/stPriceHistoryPlugin/lib/stPriceHistoryFrontend.php
Normal file
@@ -0,0 +1,384 @@
|
||||
<?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;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user