Skocz do zawartości
bunnyb

Koszt dostawy zależny od wagi oraz wartości zamówienia

Rekomendowane odpowiedzi

Witam.

 

Mam problem z konfiguracją kosztów wysyłki, które niestety zależne są od wagi oraz wartości zamówienia. Szukam rozwiązania od tygodni, ale na razie bez rezultatu.

 

Dla dwóch opcji wysyłki - "kurier przelew" oraz "kurier pobranie" - ustawione są zakresy wagowe i ich koszty. Kruczek polega na tym, aby dla każdego zakresu wagowego ustawić różny koszt darmowej dostawy.

 

A mianowicie:

Kurier przelew - koszt 15zł; darmowa dostawa od 250zł ( paczka do 30kg )

Kurier pobranie- koszt 20zł; darmowa dostawa od 500zł ( paczka do 30kg )

 

Koszt dostawy dla kilku paczek:

koszt dostawy - koszt dostawy jednej paczki * ilość paczek

darmowa dostawa - wartość zamówienia dla darmowej dostawy * ilość paczek

 

 

Kurier przelew:

 

0-30kg - wysyłka 15zł; darmowa dostawa - od 250zł

30-60kg - wysyłka 30zł; darmowa dostawa - od 500zł

60-90kg - wysyłka 45zł; darmowa dostawa - od 750zł

90-120kg - wysyłka 60zł; darmowa dostawa - od 1000zł

...

itd. do 300kg

 

Kurier pobranie:

 

0-30kg - wysyłka 20zł; darmowa dostawa - od 500zł

30-60kg - wysyłka 40zł; darmowa dostawa - od 1000zł

60-90kg - wysyłka 60zł; darmowa dostawa - od 1500zł

90-120kg - wysyłka 80zł; darmowa dostawa - od 2000zł

...

itd. do 300kg

 

Czy takie rozwiązanie jest w ogóle możliwe? Może gdzieś w kodzie źródłowym da się wstawić na twardo kilka warunków typu "if"? Czy konieczny jest moduł na zamówienie?

Ja wypróbowałem już każdą opcję w prestashop, w tym różne reguły i ustawienia koszyka. Jeśli ktoś ma jakieś propozycje będę bardzo wdzięczny.

Udostępnij tego posta


Odnośnik do posta
Udostępnij na innych stronach

to jeszcze napisz jaka wersja presty bo są znaczne różnice między 1.4 i 1.5

ale generalnie i tak wszystko sprowadza się do modyfikacji core ;) czy to modułem czy przez override

Udostępnij tego posta


Odnośnik do posta
Udostępnij na innych stronach

to jeszcze napisz jaka wersja presty bo są znaczne różnice między 1.4 i 1.5

ale generalnie i tak wszystko sprowadza się do modyfikacji core ;) czy to modułem czy przez override

O kurcze. A miałem to napisać na samym początku i wyleciało z głowy. :lol:

 

Prestashop 1.5.3.1

Udostępnij tego posta


Odnośnik do posta
Udostępnij na innych stronach

Witam.

 

Dałem zlecenie na rozwiązanie powyższego problemu w odpowiednim dziale. Niestety nie ma chętnych na wykonanie zlecenia. Dlatego sam napisałem trochę kodu, ale i tak potrzebuję pomocy, żeby to w końcu skończyć. Pomysły mile widziane.

 

Ustaliłem gdzie w kodzie ustalany jest koszt wysyłki i tam się podpiąłem: classes/Cart.php, funkcja getTotalShippingCost(...).

 

W moim przypadku dla wyłączonych podatków jest to linia 2410. Dodałem za nią taki kod:

 

<span class="syntaxdefault">
                </span><span class="syntaxcomment"># Domyślna ilość paczek 30-kilogramowych
</span><span class="syntaxdefault">                $parcelCount </span><span class="syntaxkeyword">=</span><span class="syntaxdefault"> 1</span><span class="syntaxkeyword">;
</span><span class="syntaxdefault">                
                </span><span class="syntaxcomment"># Pobiera calkowitą wartość zamówienia dla samych produktów oraz całkowitą wagę
</span><span class="syntaxdefault">                $wholeOrder </span><span class="syntaxkeyword">=</span><span class="syntaxdefault"> $this</span><span class="syntaxkeyword">-></span><span class="syntaxdefault">getOrderTotal</span><span class="syntaxkeyword">(</span><span class="syntaxdefault">false</span><span class="syntaxkeyword">,</span><span class="syntaxdefault"> Cart</span><span class="syntaxkeyword">::</span><span class="syntaxdefault">ONLY_PRODUCTS</span><span class="syntaxkeyword">);
</span><span class="syntaxdefault">                $wholeWeight </span><span class="syntaxkeyword">=</span><span class="syntaxdefault"> $this</span><span class="syntaxkeyword">-></span><span class="syntaxdefault">getTotalWeight</span><span class="syntaxkeyword">();
</span><span class="syntaxdefault">                                
                </span><span class="syntaxcomment"># Ustala ilość 30-kilogramowych paczek                
</span><span class="syntaxdefault">                if </span><span class="syntaxkeyword">((</span><span class="syntaxdefault">$wholeWeight </span><span class="syntaxkeyword">/</span><span class="syntaxdefault"> 30</span><span class="syntaxkeyword">)</span><span class="syntaxdefault"> </span><span class="syntaxkeyword">></span><span class="syntaxdefault"> 0</span><span class="syntaxkeyword">)
</span><span class="syntaxdefault">                    if </span><span class="syntaxkeyword">((</span><span class="syntaxdefault">$wholeWeight </span><span class="syntaxkeyword">%</span><span class="syntaxdefault"> 30</span><span class="syntaxkeyword">)</span><span class="syntaxdefault"> </span><span class="syntaxkeyword">==</span><span class="syntaxdefault"> 0</span><span class="syntaxkeyword">)
</span><span class="syntaxdefault">                        $parcelCount </span><span class="syntaxkeyword">=</span><span class="syntaxdefault"> intval</span><span class="syntaxkeyword">(</span><span class="syntaxdefault">$wholeWeight </span><span class="syntaxkeyword">/</span><span class="syntaxdefault"> 30</span><span class="syntaxkeyword">);
</span><span class="syntaxdefault">                    else
                        $parcelCount </span><span class="syntaxkeyword">=</span><span class="syntaxdefault"> intval</span><span class="syntaxkeyword">(</span><span class="syntaxdefault">$wholeWeight </span><span class="syntaxkeyword">/</span><span class="syntaxdefault"> 30</span><span class="syntaxkeyword">)</span><span class="syntaxdefault"> </span><span class="syntaxkeyword">+</span><span class="syntaxdefault"> 1</span><span class="syntaxkeyword">;
</span><span class="syntaxdefault">                
                </span><span class="syntaxcomment"># Ustala liczbę darmowych paczek
</span><span class="syntaxdefault">                $freeCount </span><span class="syntaxkeyword">=</span><span class="syntaxdefault"> intval</span><span class="syntaxkeyword">(</span><span class="syntaxdefault">$wholeOrder </span><span class="syntaxkeyword">/</span><span class="syntaxdefault"> 250</span><span class="syntaxkeyword">);
</span><span class="syntaxdefault">                
                </span><span class="syntaxcomment"># Zwraca koszt wysyłki z uwzględnieniem darmowych paczek                
</span><span class="syntaxdefault">                if </span><span class="syntaxkeyword">(</span><span class="syntaxdefault">$parcelCount </span><span class="syntaxkeyword">></span><span class="syntaxdefault"> $freeCount</span><span class="syntaxkeyword">)
</span><span class="syntaxdefault">                $total_shipping </span><span class="syntaxkeyword">*=</span><span class="syntaxdefault"> </span><span class="syntaxkeyword">(</span><span class="syntaxdefault">$parcelCount </span><span class="syntaxkeyword">-</span><span class="syntaxdefault"> $freeCount</span><span class="syntaxkeyword">);
</span><span class="syntaxdefault"> </span>

Koszt wysyłki jest obliczany tak jak potrzebuję, jednak tylko dla jednego przewoźnika. Linię 

<span class="syntaxdefault">$freeCount </span><span class="syntaxkeyword">=</span><span class="syntaxdefault"> intval</span><span class="syntaxkeyword">(</span><span class="syntaxdefault">$wholeOrder </span><span class="syntaxkeyword">/</span><span class="syntaxdefault"> 250</span><span class="syntaxkeyword">);</span><span class="syntaxdefault"> </span>
 

potrzebuję rozbić na 2 "if'y" - dla "Kurier przelew" oraz "Kurier pobranie". A to dlatego, że dla "Kurier pobranie" linia będzie miała postać:

<span class="syntaxdefault">$freeCount </span><span class="syntaxkeyword">=</span><span class="syntaxdefault"> intval</span><span class="syntaxkeyword">(</span><span class="syntaxdefault">$wholeOrder </span><span class="syntaxkeyword">/</span><span class="syntaxdefault"> 500</span><span class="syntaxkeyword">);</span><span class="syntaxdefault"> </span>
.

Stąd moje pytanie - jak w tym miejscu w kodzie pobrać identyfikator aktualnie zaznaczonej opcji wysyłki?

 

 

Drugi problem występuje w 4 kroku przy wyborze wysyłki. Tutaj dla każdej opcji wysyłki wyświetlane są jednostkowe koszty wysyłki ustalone w BO. Natomiast musi być wyświetlany koszt zwracany przez zmienioną funkcję getTotalShippingCost().

 

Drugie pytanie więc brzmi - jak w pliku order-carrier.tpl podmienić jednostkowy koszt na wynik funkcji getTotalShippingCost()?

 

Dziękuję za wszelkie sugestie.

Udostępnij tego posta


Odnośnik do posta
Udostępnij na innych stronach

Udało mi się to w końcu rozwiązać. Dodałem poniższy kod do funkcji 'getDeliveryOptionList()' w pliku Cart.php.

 

<span class="syntaxdefault">if </span><span class="syntaxkeyword">(</span><span class="syntaxdefault">$data</span><span class="syntaxkeyword">[</span><span class="syntaxstring">'price_with_tax'</span><span class="syntaxkeyword">]</span><span class="syntaxdefault"> </span><span class="syntaxkeyword">==</span><span class="syntaxdefault"> 13.5 </span><span class="syntaxkeyword">||</span><span class="syntaxdefault"> $data</span><span class="syntaxkeyword">[</span><span class="syntaxstring">'price_with_tax'</span><span class="syntaxkeyword">]</span><span class="syntaxdefault"> </span><span class="syntaxkeyword">==</span><span class="syntaxdefault"> 17</span><span class="syntaxkeyword">)
</span><span class="syntaxdefault">                </span><span class="syntaxkeyword">{
</span><span class="syntaxdefault">                    </span><span class="syntaxcomment"># Domyślna ilość paczek 30-kilogramowych
</span><span class="syntaxdefault">                    $parcelCount </span><span class="syntaxkeyword">=</span><span class="syntaxdefault"> 1</span><span class="syntaxkeyword">;
</span><span class="syntaxdefault">                    
                    </span><span class="syntaxcomment"># Pobiera calkowitą wartość zamówienia dla samych produktów oraz całkowitą wagę
</span><span class="syntaxdefault">                    $wholeOrder </span><span class="syntaxkeyword">=</span><span class="syntaxdefault"> $this</span><span class="syntaxkeyword">-></span><span class="syntaxdefault">getOrderTotal</span><span class="syntaxkeyword">(</span><span class="syntaxdefault">false</span><span class="syntaxkeyword">,</span><span class="syntaxdefault"> Cart</span><span class="syntaxkeyword">::</span><span class="syntaxdefault">ONLY_PRODUCTS</span><span class="syntaxkeyword">);
</span><span class="syntaxdefault">                    $wholeWeight </span><span class="syntaxkeyword">=</span><span class="syntaxdefault"> $this</span><span class="syntaxkeyword">-></span><span class="syntaxdefault">getTotalWeight</span><span class="syntaxkeyword">();
</span><span class="syntaxdefault">                                    
                    </span><span class="syntaxcomment"># Ustala ilość 30-kilogramowych paczek                
</span><span class="syntaxdefault">                    if </span><span class="syntaxkeyword">((</span><span class="syntaxdefault">$wholeWeight </span><span class="syntaxkeyword">/</span><span class="syntaxdefault"> 30</span><span class="syntaxkeyword">)</span><span class="syntaxdefault"> </span><span class="syntaxkeyword">></span><span class="syntaxdefault"> 0</span><span class="syntaxkeyword">)
</span><span class="syntaxdefault">                        if </span><span class="syntaxkeyword">((</span><span class="syntaxdefault">$wholeWeight </span><span class="syntaxkeyword">%</span><span class="syntaxdefault"> 30</span><span class="syntaxkeyword">)</span><span class="syntaxdefault"> </span><span class="syntaxkeyword">==</span><span class="syntaxdefault"> 0</span><span class="syntaxkeyword">)
</span><span class="syntaxdefault">                            $parcelCount </span><span class="syntaxkeyword">=</span><span class="syntaxdefault"> intval</span><span class="syntaxkeyword">(</span><span class="syntaxdefault">$wholeWeight </span><span class="syntaxkeyword">/</span><span class="syntaxdefault"> 30</span><span class="syntaxkeyword">);
</span><span class="syntaxdefault">                        else
                            $parcelCount </span><span class="syntaxkeyword">=</span><span class="syntaxdefault"> intval</span><span class="syntaxkeyword">(</span><span class="syntaxdefault">$wholeWeight </span><span class="syntaxkeyword">/</span><span class="syntaxdefault"> 30</span><span class="syntaxkeyword">)</span><span class="syntaxdefault"> </span><span class="syntaxkeyword">+</span><span class="syntaxdefault"> 1</span><span class="syntaxkeyword">;
</span><span class="syntaxdefault">                    
                    </span><span class="syntaxcomment"># Ustala liczbę darmowych paczek
</span><span class="syntaxdefault">                    if </span><span class="syntaxkeyword">(</span><span class="syntaxdefault">$data</span><span class="syntaxkeyword">[</span><span class="syntaxstring">'price_with_tax'</span><span class="syntaxkeyword">]</span><span class="syntaxdefault"> </span><span class="syntaxkeyword">==</span><span class="syntaxdefault"> 13.5</span><span class="syntaxkeyword">)
</span><span class="syntaxdefault">                        $freeCount </span><span class="syntaxkeyword">=</span><span class="syntaxdefault"> intval</span><span class="syntaxkeyword">(</span><span class="syntaxdefault">$wholeOrder </span><span class="syntaxkeyword">/</span><span class="syntaxdefault"> 250</span><span class="syntaxkeyword">);</span><span class="syntaxdefault">                
                    else if </span><span class="syntaxkeyword">(</span><span class="syntaxdefault">$data</span><span class="syntaxkeyword">[</span><span class="syntaxstring">'price_with_tax'</span><span class="syntaxkeyword">]</span><span class="syntaxdefault"> </span><span class="syntaxkeyword">==</span><span class="syntaxdefault"> 17</span><span class="syntaxkeyword">)
</span><span class="syntaxdefault">                        $freeCount </span><span class="syntaxkeyword">=</span><span class="syntaxdefault"> intval</span><span class="syntaxkeyword">(</span><span class="syntaxdefault">$wholeOrder </span><span class="syntaxkeyword">/</span><span class="syntaxdefault"> 500</span><span class="syntaxkeyword">);
</span><span class="syntaxdefault">                    
                    </span><span class="syntaxcomment"># Zwraca koszt wysyłki z uwzględnieniem darmowych paczek                
</span><span class="syntaxdefault">                    if </span><span class="syntaxkeyword">(</span><span class="syntaxdefault">$parcelCount </span><span class="syntaxkeyword">></span><span class="syntaxdefault"> $freeCount</span><span class="syntaxkeyword">)
</span><span class="syntaxdefault">                    </span><span class="syntaxkeyword">{
</span><span class="syntaxdefault">                        $delivery_option_list</span><span class="syntaxkeyword">[</span><span class="syntaxdefault">$id_address</span><span class="syntaxkeyword">][</span><span class="syntaxdefault">$key</span><span class="syntaxkeyword">][</span><span class="syntaxstring">'total_price_with_tax'</span><span class="syntaxkeyword">]</span><span class="syntaxdefault"> </span><span class="syntaxkeyword">=</span><span class="syntaxdefault"> $data</span><span class="syntaxkeyword">[</span><span class="syntaxstring">'price_with_tax'</span><span class="syntaxkeyword">]</span><span class="syntaxdefault"> </span><span class="syntaxkeyword">*</span><span class="syntaxdefault"> </span><span class="syntaxkeyword">(</span><span class="syntaxdefault">$parcelCount </span><span class="syntaxkeyword">-</span><span class="syntaxdefault"> $freeCount</span><span class="syntaxkeyword">);
</span><span class="syntaxdefault">                        $delivery_option_list</span><span class="syntaxkeyword">[</span><span class="syntaxdefault">$id_address</span><span class="syntaxkeyword">][</span><span class="syntaxdefault">$key</span><span class="syntaxkeyword">][</span><span class="syntaxstring">'total_price_without_tax'</span><span class="syntaxkeyword">]</span><span class="syntaxdefault"> </span><span class="syntaxkeyword">=</span><span class="syntaxdefault"> $data</span><span class="syntaxkeyword">[</span><span class="syntaxstring">'price_without_tax'</span><span class="syntaxkeyword">]</span><span class="syntaxdefault"> </span><span class="syntaxkeyword">*</span><span class="syntaxdefault"> </span><span class="syntaxkeyword">(</span><span class="syntaxdefault">$parcelCount </span><span class="syntaxkeyword">-</span><span class="syntaxdefault"> $freeCount</span><span class="syntaxkeyword">);
</span><span class="syntaxdefault">                    </span><span class="syntaxkeyword">}
</span><span class="syntaxdefault">                    else
                    </span><span class="syntaxkeyword">{
</span><span class="syntaxdefault">                        $delivery_option_list</span><span class="syntaxkeyword">[</span><span class="syntaxdefault">$id_address</span><span class="syntaxkeyword">][</span><span class="syntaxdefault">$key</span><span class="syntaxkeyword">][</span><span class="syntaxstring">'total_price_with_tax'</span><span class="syntaxkeyword">]</span><span class="syntaxdefault"> </span><span class="syntaxkeyword">=</span><span class="syntaxdefault"> $total_price_with_tax</span><span class="syntaxkeyword">;
</span><span class="syntaxdefault">                        $delivery_option_list</span><span class="syntaxkeyword">[</span><span class="syntaxdefault">$id_address</span><span class="syntaxkeyword">][</span><span class="syntaxdefault">$key</span><span class="syntaxkeyword">][</span><span class="syntaxstring">'total_price_without_tax'</span><span class="syntaxkeyword">]</span><span class="syntaxdefault"> </span><span class="syntaxkeyword">=</span><span class="syntaxdefault"> $total_price_without_tax</span><span class="syntaxkeyword">;
</span><span class="syntaxdefault">                    </span><span class="syntaxkeyword">}
</span><span class="syntaxdefault">                    $delivery_option_list</span><span class="syntaxkeyword">[</span><span class="syntaxdefault">$id_address</span><span class="syntaxkeyword">][</span><span class="syntaxdefault">$key</span><span class="syntaxkeyword">][</span><span class="syntaxstring">'position'</span><span class="syntaxkeyword">]</span><span class="syntaxdefault"> </span><span class="syntaxkeyword">=</span><span class="syntaxdefault"> $position </span><span class="syntaxkeyword">/</span><span class="syntaxdefault"> count</span><span class="syntaxkeyword">(</span><span class="syntaxdefault">$value</span><span class="syntaxkeyword">[</span><span class="syntaxstring">'carrier_list'</span><span class="syntaxkeyword">]);
</span><span class="syntaxdefault">                </span><span class="syntaxkeyword">}</span><span class="syntaxdefault"> </span>

Teraz potrzebne są kolejne zmiany, aby zmodyfikowany koszt wysyłki był wyświetlany w pozostałych miejscach. Czyli w historii zamówień w panelu klienta, w wysyłanych mailach oraz w BO w szczegółach zamówienia.

Udostępnij tego posta


Odnośnik do posta
Udostępnij na innych stronach

Jeśli chcesz dodać odpowiedź, zaloguj się

Komentowanie zawartości tej strony możliwe jest po zalogowaniu



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 819
    • Postów
      37 172
×