Automatycza aktualizacja kursu

Przydatne skrypty, programy itp, do współpracy z programem KQS.store

Automatycza aktualizacja kursu

przez sq5be » 2010 mar 25, Cz 11:32

Witam

Mam potrzebę zrobienia skryptu który będzie codziennie aktualizował ceny w sklepie przeliczane z kursu średniego NBP z USD.
Zamysł jest następujący:
1. skrypt będzie odpalany z crone
2. skrypt pobierze aktualny kurs z xml w nbp
--- teraz pytanie do was --->
3. skrypt obliczy zmianę kursu oraz zaktualizuje ceny produtów w bazie (tabela:produkty, pole:cena, cena_prom) , któych waluta została ustawiona na USD (pole: waluta_id), - z tego co zauważylem to w bazie przechowywane są ceny prodktów zawsze w walucie podstawowej czyli pln
4. skrypt ustawi aktualny kurs w bazie (tabela: waluta, pole: kurs)

Zasadnicze pytanie: czy to wystarczy? Może ktoś coś takiego już zrobił?

Zdrówka życzę :)
 
Autor tematu
Posty: 29
Dołączył(a): 2009 wrz 16, Śr 13:36
Podziękował : 0 razy
Otrzymał podziękowań: 0 razy

Re: Automatycza aktualizacja kursu

przez junki » 2010 mar 25, Cz 15:05

da się to zrobić ale nie jest takie proste.

info poszło na pw
Avatar użytkownika
 
Posty: 1288
Dołączył(a): 2008 kwi 08, Wt 15:13
Lokalizacja: Olkusz
Podziękował : 0 razy
Otrzymał podziękowań: 0 razy

Re: Automatycza aktualizacja kursu

przez sq5be » 2010 mar 25, Cz 15:30

bas napisał(a):Powinno wystarczyć wstawienie przez skrypt aktualnego kursu. Reszta cen zależnych od danej waluty zostanie automatycznie przeliczona przez oprogramowanie sklepu.

Nie tak, się nie uda. Sklep momencie jak wstawiasz wartość kursu przelicza wszystkie ceny produktów w pln i ponownie zapisuje w bazie.
 
Autor tematu
Posty: 29
Dołączył(a): 2009 wrz 16, Śr 13:36
Podziękował : 0 razy
Otrzymał podziękowań: 0 razy

Re: Automatycza aktualizacja kursu

przez sq5be » 2010 mar 25, Cz 16:08

junki napisał(a):da się to zrobić ale nie jest takie proste.


OK, troszę się pobawiłem i daje wam efekt. Tylko prośba, bądźcie ostrożni i najpierw wszystko sobie potestujcie i posprawdzajcie. Skrypt najlepiej umieścić poza sklepem. Specjalnie zakomentowałem wiersze z poleceniami update, żebyście sami sobie odkomentowali jak już będziecie pewni, że nie robicie sobie 'kuku'. O backupie bazy sklepu przed uruchomieniem skryptu nawet nie wspominam. Ja mam podpiety ten skrypt do crona. Skrypt pobiera kursu dla USD ale oczywiscie zmiana tego na Euro nie jest problemem. Pamietajcie też, że nazwa waluty w sklepie musi być USD. Aha i jeżeli macie inny prefiks niż kqs_ dla tabel to musicie sobie poprawic zapytania sql. Powinno się dorobić do skryptu trochę zabezpieczeń ale to pozostawiam innym, mam nadzieję, że się podzielicie efektami.

NIE BIORE ZADNEJ ODPOWIEDZIALNOSCI ZA DZIALANIE TEGO SKRYPTU:
<?php
function connection(){
global $conn;
if($conn) {
return $conn;
} else {
//zamiast localhost,dbuser,dbpass,dbname trzeba wspisac wlasciwe wartosci
$conn=mysql_connect("localhost","dbuser","dbpass");
if (!$conn || !mysql_select_db("dbname",$conn)) {
return 0;
} else {
return $conn;

}
}
}

function sql($query) {
if(!($conn = connection())) {
return 0;
} else {
$result=mysql_query($query,$conn);
if(!$result) {
print("<div style=\"font: 10pt Verdana, Tahoma, Arial, Helvetica, sans-serif;\"><hr color=\"black\">Wystąpił błąd<br>[\"$query\"]<br>[".mysql_error()."]<hr color=\"black\"></div>");
} else {
return $result;
}
}
}

// Początek pobierania linku do kursu walut w formacie XML...
$connect = fsockopen('www.nbp.pl', 80, $errno, $errstr, 10);
if (!$connect) {
die($errstr.' ('.$errno.')');
} else {
fwrite($connect, 'GET /kursy/KursyA.html HTTP/1.1'."\r\n".'Host: Odnośnik widoczny tylko dla zalogowanych użytkowników - Zarejestruj się.\r\n".'Connection: close'."\r\n\r\n") or die('Błąd przy wysyłaniu żądania');
}
$link = '';
while(!feof($connect)) {
$link .= fread($connect, 4096);
}
fclose($connect);
// Koniec pobierania linku do kursu walut w formacie XML

// Wycinanie linku
$link = '/kursy/'.substr(strstr($link, 'xml/'), '0', '19');
// Koniec. Link w zmiennej $link.

// Pobieranie arkusza XML
$connect = fsockopen('www.nbp.pl', 80, $errno, $errstr, 10);
if (!$connect) {
die($errstr.' ('.$errno.')');
} else {
fwrite($connect, 'GET '.$link.' HTTP/1.1'."\r\n".'Host: Odnośnik widoczny tylko dla zalogowanych użytkowników - Zarejestruj się.\r\n".'Connection: close'."\r\n\r\n");
}
$info = '';
while (!feof($connect)) {
$info .= fgets($connect, 4096);
}
fclose($connect);
$info = explode("\r\n\r\n", $info);
$info = $info[1];
$p = xml_parser_create();
xml_parse_into_struct($p, $info, $vals, $index);
xml_parser_free($p);
$waluta = array();
foreach($index['NAZWA_WALUTY'] as $value) {
$waluta[$vals[$value+6]['value']]['name'] = $vals[$value]['value'];
$waluta[$vals[$value+6]['value']]['ratio'] = $vals[$value+3]['value'];
$waluta[$vals[$value+6]['value']]['kurs'] = $vals[$value+9]['value'];
}
//
$kursik=strtr($waluta['USD']['kurs'],',','.');
$kurs_pln=round($kursik,4);
echo $waluta['USD']['name'].' <b>(USD)</b>: <b>'.$kurs_pln.'</b><br>';
if ($kurs_pln>0) {
$result=sql("select kurs,numer from kqs_waluta where nazwa='USD';");
$row=mysql_fetch_row($result);
//echo 'Poprzedni kurs: '.$row[0].'<br>';
$ratio=$kurs_pln/$row[0];
//echo 'Współczynnik zmiany: '.$ratio;
$id_waluty=$row[1];

$result=sql("select numer,cena,cena_prom from kqs_produkty where waluta_id=$id_waluty;");
while($row=mysql_fetch_row($result)) {
//$nowa_cena=$row[1]*$ratio;
$nowa_cena=round($row[1]*$ratio,2);
$nowa_cena_prom=round($row[2]*$ratio,2);

//sql("update kqs_produkty set cena='".$nowa_cena."', cena_prom='".$nowa_cena_prom."' where numer='".$row[0]."';");
}
//sql("update kqs_waluta set kurs='".$kurs_pln."' where nazwa='USD';");
}

?>
 
Autor tematu
Posty: 29
Dołączył(a): 2009 wrz 16, Śr 13:36
Podziękował : 0 razy
Otrzymał podziękowań: 0 razy

Re: Automatycza aktualizacja kursu

przez sq5be » 2010 mar 25, Cz 16:21

bas napisał(a):Dla produktów, które chcesz mieć przeliczane dajesz odrębną walutę i tylko te są przeliczane.
Produkty które masz w pln przeciez nie zależą od usd, eur czy innych, to czemu miałby je sklep przeliczać?
Mam u siebie takie rozwiązanie i jakoś działa. No chyba, że nie zrozumiałem istoty problemu.

Wszystkie ceny produktow sa przechowywane w PLN, jezeli ustalisz jakas inna walute dla produktu to panelu admina masz wyswietlona cene w tej wlasnie walucie ale w bazie ona jest przechowywana w pln.
Zmiana wartosci kursu w bazie bez przeliczenia cen produktow (oczywiscie tylko tych ktore maja przypisana inna walute niz pln) nie wystarczy.
 
Autor tematu
Posty: 29
Dołączył(a): 2009 wrz 16, Śr 13:36
Podziękował : 0 razy
Otrzymał podziękowań: 0 razy


Użytkownicy przeglądający ten dział: Brak zidentyfikowanych użytkowników i 3 gości
cron