Skocz do zawartości
sokon

Aktualizacja cen i stanów z *.csv

Rekomendowane odpowiedzi

Witam.Podrzucam wstępny projekt (działający) modułu do aktualizacji cen i stanów magazynowych z pliku *.csv. Dodatkowo moduł zapisuje do pliku tekstowego produkty które są w pliku csv a nie ma ich w bazie sklepu (co w wielu przypadkach może być pomocne). Moduł sam będzie informował o nowszych wersjach.Gdyby ktoś chciał aby dostosować moduł do jego indywidualnych potrzeb - zapraszam do kontaktu.

aktcsv.zip

Udostępnij tego posta


Odnośnik do posta
Udostępnij na innych stronach

Nowa wersja 1.1:Dołożony wybór rodzaju numeru w pliku *csv (w/g pomysłu kolegi Vivaldi),Możliwość wyboru separatora jaki znajduje się w pliku CSV,Zerowanie ilości i stanów przed aktualizacją,

aktcsv.zip

Udostępnij tego posta


Odnośnik do posta
Udostępnij na innych stronach

często sprzedaje drobne produkty za 2,3,5zł automatyczna marża w stylu 10% mnie trochę nie ratuje. była by tak szansa dodać 2 opcje naliczania marży cenowej i procentowej np. +5zł i 10% marży w pratyce wyglądało by to tak towar kupiony za 10zł po aktualizacji cena wynosi 16,50zł lub 100zł po aktualizacji 115,5złdruga opcja to ustalanie marży w danym zakresie cenowy np. 0-10zł 100%11-20 50% itd.

Udostępnij tego posta


Odnośnik do posta
Udostępnij na innych stronach

Dla mnie kombinacje z marżą to droga nie w tym kierunku. Jeśli chcesz kombinować marże to nie prościej wrzucić plik csv do arkusza kalkulacyjnego? Wtedy można mieć i 35 modyfikatorów.Sokon zaczął pracę przy bardzo fajnym projekcie. Stąd w zasadzie rzut beretem do integracji z np. WF-MAG, ale... (jak zwykle).Moduł jest nieocenionym pomocnikiem jak ktoś prowadzi sklep gdzie nie ma atrybutów produktów, jednakże w momencie gdy mamy do czynienia z atrybutami (mój przypadek) i gdzie producent stosuje jeden symbol (kod, etc.) dla produktu w różnych rozmiarach sprawa robi się skomplikowana.Nie mam niestety na lokalu postawionej presty do testów a nie chcę kombinować na bazie sklepu i nie bardzo mogę wykonać konieczne testy.Czy moduł aktualizuje również atrybuty produktów?A projekt jestem w stanie wspomóc pewną kwotą $, kwestia tylko dogadania co i jak ewentualnie miałoby to jeszcze robić.

Udostępnij tego posta


Odnośnik do posta
Udostępnij na innych stronach

Nowa wersja (pozwalająca dodawać stałą kwotę do ceny) już się wyświetla jako dostępna w nagłówku zainstalowanego modułu. Oczywiście jest także w załączniku.PS. Mam trochę czasu i chęci wniesienia do projekt Prestashop czegoś od siebie i chętnie mogę rozbudować moduł w dowolny sposób. Integracja z jakimś programem jeśli by się przydała oczywiście także wchodzi w grę jednak w życiu nie pracowałem na WF-Mag... Niestety znam dobrze tylko programy Insert'u.Vivaldi - jeśli chodzi o atrybuty to moduł uwzględnia je w bazie sklepu. Na razie przypisuje ilość dla produktów z atrybutami taką jak dla tego samego produktu bez atrybutów (początkowo moduł tworzyłem dla siebie i tyle mi wystarczało). Jednak Twój przypadek mnie zaciekawił i jestem pewien, że jakieś rozwiązanie da się znaleźć... Daj mi na Priv więcej informacji o wyglądzie Twojego pliku csv, oraz jak Twój dostawca rozróżnia produkty skoro mają takie same numery pomimo różnic. Podeślij też linka do Twojego sklepu - zerknę jak to mniej więcej wygląda u Ciebie...

aktcsv.zip

Udostępnij tego posta


Odnośnik do posta
Udostępnij na innych stronach

Szybki jesteś! 1.2 :)Niestety u mnie lipa... Limit czasu dla skryptów 60 sekund przy czterech produktach w csv (tabela product:1100 pozycji, product_attribute:4300 pozycji) więc coś jest nie tak...Pytanie 1: Do czego potrzebna [nazwa] w pliku csv?Pytanie 2:Produkt A występuje w 3 kolorach i 2 rozmiarach. W bazie ustawiono takie kody produktu dla kombinacji:A_czarny_50A_czarny_100A_niebieski_50A_niebieski_100A_bialy_50A_bialy_100Czy jeśli wrzucę taki plik scv, to czy te dwie pozycję zostaną zaktualizowane? (niestety nie doczekałem końca czasu skryptu)A_czarny_50;text;19.18;2A_bialy_100;text;19.18;4Problemy: Wielu producentów stosuje kod kreskowy. Chcąc by pracownicy mieli łatwiej zakupiłem czytniki kodów. Niestety bardzo często się zdarza, że jest jeden kod dla produktu w kilku rozmiarach. To główny problem. Tam gdzie producent drukuje kod głęboki jest łatwiej.Plik csv z WF-Maga mogę zrobić dowolny. Oczywiście eksportuje tylko indeks_handlowy, ilość i cenę - czyli to co jest mi potrzebne. Oczywiście mam kilka progów jeśli chodzi o narzuty - stosuje metodę arkusza i kilku plików (każdy ze swoim własnym narzutem). Problem jak pisałem wcześniej rozróżnianie.

Udostępnij tego posta


Odnośnik do posta
Udostępnij na innych stronach

Gdzieś się chyba u Ciebie zapętla ten skrypt, niemożliwe, że nie jest w stanie w ciągu 60 s. przemielić 4 produktów z CSVki. Ja mam w bazie sklepu 370 produktów, wszystkie z atrybutami ale plik csv zawiera ponad 23.000 pozycji - skrypt przetwarza to tylko 130-140 sek. trzeba by się przyjrzeć gdzie może się u Ciebie zapętlać. Zerknij czy po uruchomieniu skryptu jest tworzony nowy plik "brakujace.txt" - jeśli nie to by znaczyło, że problem leży gdzieś na samym początku...Ad.1. pole nazwa jest używane do tworzenia pliku z produktami znajdującymi się w pliku csv (czyli u dostawcy) a nie ma ich w bazie sklepu - czyli wynikowy plik "brakujace.txt" zawiera produkty które warto dopisać do bazy sklepu. bardzo ułatwia to pracę jeśli dostawca co chwilę wprowadza nowości (jak np. mój).Ad.2. Tak, przy takiej kombinacji te dwie pozycje zostaną zaktualizowane.A w pliku CSV który udostępnia Twój dostawca też dla tych produktów jest taki sam kod?? Było by to dziwne - bo jak On by rozróżniał te produkty??

Udostępnij tego posta


Odnośnik do posta
Udostępnij na innych stronach

Chyba warto by było pobierać pojedynczy rekord z csv i robić update odpowiednika w SQL.Plik zawiera: PLIK PUSTY - JESZCZE NIE WYGENEROWANY - czyli nie jest tworzony nowy plik.Ad1. Rozumiem. :)Akurat moich dostawców którzy udostępniają pliki csv jest tylu, że można ich policzyć na palcach jednej ręki. Reszta ma to w nosie. Wychodzą z założenia - Twój sklep - Twój problem.edit: csv jest zapisywany do folderu upload, ale nie zostaje przeniesiony do /modules/aktcsv/

Udostępnij tego posta


Odnośnik do posta
Udostępnij na innych stronach

No i się sprawa wyjaśniła ;-)

Skrypt nawet nie zaczyna przetwarzania pliku bo go nie widzi - i tu staje aż do limitu czasu dla skryptu.

Na niektórych serwerach nie przenosi jak powinien - bladego pojęcia nie mam dlaczego...

Sprawdź chmody dla katalogu aktcsv czy skrypt może w nim coś zapisać (ja mam 755) i działa a jeśli to nie kwestia chmodów to znajdź w pliku aktcsv.php linijkę:

<span class="syntaxdefault">move_uploaded_file</span><span class="syntaxkeyword">(</span><span class="syntaxdefault">$f</span><span class="syntaxkeyword">[</span><span class="syntaxstring">'tmp_name'</span><span class="syntaxkeyword">], </span><span class="syntaxstring">'/modules/aktcsv/'</span><span class="syntaxkeyword">.</span><span class="syntaxdefault">$f</span><span class="syntaxkeyword">[</span><span class="syntaxstring">'name'</span><span class="syntaxkeyword">]); </span><span class="syntaxdefault"></span>
i wpisz całą ścieżkę do katalogu. Powinno zadziałać.

 

Co do sposobu pracy modułu - tak wlaśnie robi - pobiera pojednynczą linię, dzieli ją na pola i wyszukuje w sql'u

Udostępnij tego posta


Odnośnik do posta
Udostępnij na innych stronach

Oj... kopia bazy się przyda...Twój moduł właśnie napsuł. Każdy produkt ma różną ilość a każdy atrybut taką samą.edit: Dobra, naprawione. Ale wiem już co jest źle, z tym, że o tym rano - za dużo % dziś. :D

Udostępnij tego posta


Odnośnik do posta
Udostępnij na innych stronach

Podejrzewam, że zgodnie z tym co napisałem kilka postów wyżej:

Na razie przypisuje ilość dla produktów z atrybutami taką jak dla tego samego produktu bez atrybutów (początkowo moduł tworzyłem dla siebie i tyle mi wystarczało).

Ilości produktów zostały przypisane zgodnie z tym co było w pliku csv a ilości każdego z atrybutów danego produktu zostały przypisane takie jakie ma ten produkt...

Udostępnij tego posta


Odnośnik do posta
Udostępnij na innych stronach

No tak, ale moduł przypisał tę sama ilość atrybutów dla wszystkich produktów które znajdują się w bazie, mimo tego, że scv zawierał tylko 4 produkty które posiadają unikatowe kody.

To wyglądało w ten sposób:

Wartość quantity z tabeli ps_product została przepisana do tabeli ps_product_attribute/quantity dla odpowiedników id.

 

Nie wiem czy nie było by lepiej gdyby proces wyglądał następująco:

- zaktualizuj ps_product/quantity jedynie wtedy gdy kod_produktu z csv jest identyczny jak ustawiony przez użytkownika kod w bazie (nr_dostawcy, kod_produktu, EAN) w tabeli ps_product <------------ to w pierwszym kroku.

- zaktualizuj ps_product_attribute/quantity jedynie wtedy gdy kod_produktu z csv jest identyczny jak ustawiony przez użytkownika kod w bazie (kod_produktu, EAN) w tabeli ps_product_attribute <------------ to w drugim kroku. (to wymusza warunek korzystania tylko z kodu_produktu lub EAN)

 

Dzięki temu osiągniemy poprawną aktualizację dla sklepów posiadających unikatowe kody zarówno dla produktów nieposiadających atrybuty jak i posiadających.

 

Aha... skrypt wykonywał się 0.034s (4300 pozycji) :D. Musiałem ręcznie wrzucić plik csv do folderu z modułem, potem "niby" wgrać go na serwer za pomocą funkcji upload modułu - za diabły nie chce kopiować mimo podania całej ścieżki. Pusty plik brakujące.txt nadal nie został utworzony - nadal mam tam tekst.

Udostępnij tego posta


Odnośnik do posta
Udostępnij na innych stronach

Z tym wrzucaniem pliku spróbuj jeszcze dwóch rzeczy (któraś musi pomóc):1. utwórz w głównym katalogu sklepu katalog "tmp" z prawami zapisu (777) na serwerach np. home.pl jest to wymagane...lub 2 nadaj folderowi aktcsv (777)... Oczywiście sposób "siłowy" jaki zastosowałeś się sprawdza...Co do sposobu aktualizacji - faktycznie tak to wygląda. Ze względu na specyfikę bazy produktów w moim sklepie sprawdza się idealnie. Lecz faktycznie "for public" trzeba to przerobić. Dziś sie tym zajmę...Nie bardzo "przyswoiłem" tą część Twojej wypowiedzi (może dlatego, że jest wcześnie rano ;-) ):

- zaktualizuj ps_product_attribute/quantity jedynie wtedy gdy kod_produktu z csv jest identyczny jak ustawiony przez użytkownika kod w bazie (kod_produktu, EAN) w tabeli ps_product_attribute <------------ to w drugim kroku. (to wymusza warunek korzystania tylko z kodu_produktu lub EAN)

Chodzi mi o to, dlaczego wymusza korzystanie tylko z kodu produktu lub EAN? Przecież w tabeli "product_attribute" jest też pole "supplier_reference" czyli można zastosować także nr ref. dostawcy....Czyli wniosek: dla obu tabel można zastosować dokladnie taką samą skladnię zapytania i będzie OK.

Udostępnij tego posta


Odnośnik do posta
Udostępnij na innych stronach

Załączam aktualną wersję (to już trzecia w ciągu tygodnia ;-) )Zmiany w stosunku do poprzedniej wersji:1. Poprawiony sposób aktualizacji stanów magazynowych produktów posiadających atrybuty. (w/g pomysłu Vivaldi)2. Możliwość rezygnacji ze sprawdzania brakujących produktów w bazie.3. Poprawki w kodzie modułu przyspieszające jego działanie.

aktcsv.zip

Udostępnij tego posta


Odnośnik do posta
Udostępnij na innych stronach

Zaobserwowane zmiany:

- plik csv jest przenoszony z ./upload do /modules/aktcsv (zmieniłem w php ../../modules[...] na ../modules[...] )

- plik brakujace.txt jest tworzony również po w/w zmianie.

- sprawdzanie produktów (przy zaznaczonym wyświetla informację, że zablokowano, a odznaczony że zapisał wszystkie brakujące pozycje w ilości 0 - tak jakby odwrotnie)

- robiłem test tylko na produktach z atrybutami z których każdy ma swój własny i unikalny kod_produktu - ale mimo to nic nie zostało zaktualizowane.

csv:

IBO-040czarnyS;produktA_S;19.18;100IBO-040czarnyM;produktA_M;19.18;4IBO-040czarnyL;produktA_L;19.18;20IBO-040czarnyXL;produktA_XL;19.18;40kod_ktorego_nie_ma;Produktu-nie-ma;20.0;1000
Do pliku brakujące.txt nie został dopisany [Produktu-nie-ma].

 

To modyfikuje:

UPDATE `ps_product_attribute` SET `quantity`='100' WHERE `reference`='IBO-040czarnyS'
więc problem jest tu:

$zapytanie = "UPDATE "._DB_PREFIX_."product_attribute SET quantity=$ilosc, WHERE ";$zapytanie .= "$numer='$data[0]'";

 

nie rozumiem... i spać...

 

edit:

to już działa ale wprowadza złe ilości... o_O

$zapytanie = "UPDATE `'._DB_PREFIX_.'product_attribute` SET `quantity`='$ilosc' WHERE ";$zapytanie .= "`$numer`='$data[0]'";

Udostępnij tego posta


Odnośnik do posta
Udostępnij na innych stronach

Przez taki zapis kod jest nieczytelny:

<span class="syntaxdefault">$zapytanie </span><span class="syntaxkeyword">=</span><span class="syntaxdefault"> </span><span class="syntaxstring">"UPDATE "</span><span class="syntaxkeyword">.</span><span class="syntaxdefault">_DB_PREFIX_</span><span class="syntaxkeyword">.</span><span class="syntaxstring">"product_attribute SET quantity=$ilosc, WHERE "</span><span class="syntaxkeyword">;</span><span class="syntaxdefault"> </span>
ja piszę tak (z palca):

<span class="syntaxdefault">$zapytanie </span><span class="syntaxkeyword">= </span><span class="syntaxstring">'UPDATE  `'</span><span class="syntaxkeyword">.</span><span class="syntaxdefault">_DB_PREFIX_</span><span class="syntaxkeyword">.</span><span class="syntaxstring">'product_attribute` SET `quantity` = '</span><span class="syntaxkeyword">.</span><span class="syntaxdefault">$ilosc</span><span class="syntaxkeyword">.</span><span class="syntaxstring">' WHERE '</span><span class="syntaxkeyword">; </span><span class="syntaxdefault"></span>

Udostępnij tego posta


Odnośnik do posta
Udostępnij na innych stronach

ircykk: Nie ściagaj! :P;) z poprzedniej strony...

 

<span class="syntaxdefault">$zapytanie </span><span class="syntaxkeyword">=</span><span class="syntaxdefault"> </span><span class="syntaxstring">'UPDATE `'</span><span class="syntaxkeyword">.</span><span class="syntaxdefault">_DB_PREFIX_</span><span class="syntaxkeyword">.</span><span class="syntaxstring">'product_attribute` SET `quantity` = "'</span><span class="syntaxkeyword">.</span><span class="syntaxdefault">$ilosc</span><span class="syntaxkeyword">.</span><span class="syntaxstring">'" WHERE '</span><span class="syntaxkeyword">;</span><span class="syntaxdefault">$zapytanie </span><span class="syntaxkeyword">.=</span><span class="syntaxdefault"> </span><span class="syntaxstring">'`'</span><span class="syntaxkeyword">.</span><span class="syntaxdefault">$numer</span><span class="syntaxkeyword">.</span><span class="syntaxstring">'`="'</span><span class="syntaxkeyword">.</span><span class="syntaxdefault">$data</span><span class="syntaxkeyword">[</span><span class="syntaxdefault">0</span><span class="syntaxkeyword">].</span><span class="syntaxstring">'" '</span><span class="syntaxkeyword">;</span><span class="syntaxdefault"> </span>
działa... teraz w analogiczny sposób przeróbka podstawy. No i dlaczego nie zlicza zmian i nie dodaje do pliku brakujące?

Udostępnij tego posta


Odnośnik do posta
Udostępnij na innych stronach

Nie zaglądałem na poprzednie :) jeśli się powtórzyło po kimś to przypadek, wiele osób tak zapisuje zmienne :)W pierwszy zapytaniu po ilosc nie powinno być przecinka.

Udostępnij tego posta


Odnośnik do posta
Udostępnij na innych stronach

Dobra, teraz pójdziemy po bandzie...

Załóżmy taką rzecz:

IBO-040czarnyS;produktA_S;19.00;2IBO-040czarnyM;produktA_M;20.00;4IBO-040czarnyL;produktA_L;21.00;20IBO-040czarnyXL;produktA_XL;22.00;40kod_ktorego_nie_ma;Produktu-nie-ma;20.0;1000
cena każdego większego rozmiaru się zmienia. Myślę, że fajnie byłoby gdyby moduł to uwzględniał.

Dowcip w tym, że tabela price zawiera informację o wzwyżce lub zniżce w kwocie brutto.

Do ps_product_attribute/price należy wprowadzić iloczyn kwoty VAT z indeksu id_tax z różnicą kwot z pliku csv i bazy ps_product/price. :D

I byśmy mieli znakomite narzędzie do integracji z dowolnym programem magazynowym :).

 

aktualizacja dla atrybutów, bo nie zliczało:

<span class="syntaxdefault"> </span><span class="syntaxcomment">//  AKTUALIZACJA STANÓW DLA PRODUKTÓW Z ATRYBUTAMI</span><span class="syntaxkeyword">if (</span><span class="syntaxdefault">$atrybuty </span><span class="syntaxkeyword">== </span><span class="syntaxdefault">1</span><span class="syntaxkeyword">)  {</span><span class="syntaxdefault">$zapytanie </span><span class="syntaxkeyword">= </span><span class="syntaxstring">'UPDATE `'</span><span class="syntaxkeyword">.</span><span class="syntaxdefault">_DB_PREFIX_</span><span class="syntaxkeyword">.</span><span class="syntaxstring">'product_attribute` SET `quantity` = "'</span><span class="syntaxkeyword">.</span><span class="syntaxdefault">$ilosc</span><span class="syntaxkeyword">.</span><span class="syntaxstring">'" WHERE '</span><span class="syntaxkeyword">;</span><span class="syntaxdefault">$zapytanie </span><span class="syntaxkeyword">.= </span><span class="syntaxstring">'`'</span><span class="syntaxkeyword">.</span><span class="syntaxdefault">$numer</span><span class="syntaxkeyword">.</span><span class="syntaxstring">'` = "'</span><span class="syntaxkeyword">.</span><span class="syntaxdefault">$data</span><span class="syntaxkeyword">[</span><span class="syntaxdefault">0</span><span class="syntaxkeyword">].</span><span class="syntaxstring">'" '</span><span class="syntaxkeyword">;          </span><span class="syntaxdefault">$db</span><span class="syntaxkeyword">-></span><span class="syntaxdefault">query</span><span class="syntaxkeyword">(</span><span class="syntaxdefault">$zapytanie</span><span class="syntaxkeyword">);      if (</span><span class="syntaxdefault">$db</span><span class="syntaxkeyword">-></span><span class="syntaxdefault">affected_rows </span><span class="syntaxkeyword">== </span><span class="syntaxdefault">1</span><span class="syntaxkeyword">) </span><span class="syntaxdefault">$zmian</span><span class="syntaxkeyword">++;    </span><span class="syntaxcomment">//dokonano zmiany   </span><span class="syntaxkeyword">} </span><span class="syntaxdefault"></span>

Udostępnij tego posta


Odnośnik do posta
Udostępnij na innych stronach

Kurcze - chwilę mnie nie było a tu cała strona nowych postów - czyli jest zainteresowanie ;-))Faktycznie wkradło się kilka błędów (przez pośpiech i zbyt wczesną porę ;-) ) - właśnie wszystkie są poprawiane i za niedługo (kilkadziesiąt minut) bedzie wersja z usuniętymi wszystkimi błędami..Vivaldi napisał:

No i dlaczego nie zlicza zmian i nie dodaje do pliku brakujące?

Do pliku brakujące dodaje tylko w dwóch przypadkach:1. Jeśli w polu "Filtr" będzie coś wpisane - wtedy doda wszystkie pozycje zawierające w nazwie wpisany ciąg znaków2. Jeśli pole jest puste skrypt zamienia wtedy je na " " (jedną spację) czyli doda wszystkie produkty zawierające w nazwie spację... (takie rozwiązanie także bylo dla mnie idealne), jednak faktycznie przerobię to aby przy pustym polu filtr dodawało wszystkie brakujące do pliku nawet jeśli w nazwie nie będzie spacji... No własnie - tu mam zacięcie...Uzywam do filtrowania tych produktów funkcji "Strpos" a ona nie zadziała jeśli szukanym ciągiem będzie "" (nic) - macie jakieś pomysly jak to rozwiązać??Dopisano:Chyba śpiący jestem... przecież jest jeszcze OR :-) - ok. poprawione... zaraz umieszczam nową wersję.

aktcsv.zip

Udostępnij tego posta


Odnośnik do posta
Udostępnij na innych stronach

Jeśli chcesz dodać odpowiedź, zaloguj się lub zarejestruj nowe konto

Jedynie zarejestrowani użytkownicy mogą komentować zawartość tej strony.

Zarejestruj nowe konto

Załóż nowe konto. To bardzo proste!

Zarejestruj się

Zaloguj się

Posiadasz już konto? Zaloguj się poniżej.

Zaloguj się



  • Przeglądający

    Brak zarejestrowanych użytkowników, przeglądających tę stronę.

  • Aktywni użytkownicy

    Nikt jeszcze nie otrzymał reputacji w tym tygodniu.

  • Statystyki forum

    • Tematów
      7 666
    • Postów
      36 875
×