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; } } } }