Jump to content

Obliczanie rabatu dla każdego produktu


foxskav

Recommended Posts

Witam,

Potrzebuje obliczyć wartości rabatów dla każdego z produktów w zamówieniu.

Presta łączy wszystkie wartości i podaje sumę. Niestety dla moich potrzeb to za mało.

Idealnym rozwiązaniem byłoby dodanie do ps_order_detail kolumny z wartością rabatu dla produktu.

Czy jest jakieś rozwiązanie na to?

Pozdrawiam

Edited by foxskav (see edit history)
Link to comment
Share on other sites

  • 2 weeks later...

Na ten moment wiem tyle:

Wszystkie rabaty są przeliczane w koszyku i z koszyka leci cena końcowa.

classes/CartRule.php

W zależności od sposobu naliczanego rabatu odpowiednia funkcja jest odpowiedzialna za to.

 

Udało mi się zdobyć ID koszyka, ID produktu, Cenę po rabacie. Dalej nie wiem jak to zrobić żeby to miało ręce i nogi. Póki co dla testu wysyłam te dane do osobnej tabeli.   

Link to comment
Share on other sites

  • 1 year later...
  • 1 year later...

Tak urzeźbiłem to dawno temu.
Ogólnie robiłem to poprzez php + zapytania mySQL. Najpierw pobierałem wszystkie rabaty do zamówienia. Jedyne zapytanie jakie znalazłem
 

SELECT o_c_r.id_order, c_r_p_r_v.id_item, c_r_p_r.type, c_r_p_r.id_product_rule, c_r_p_r.id_product_rule_group, c_r_p_r_g.id_cart_rule, o_c_r.value, c_r.reduction_percent, c_r.reduction_amount
		FROM 
		ps_order_cart_rule o_c_r
		LEFT JOIN ps_cart_rule c_r ON (o_c_r.id_cart_rule = c_r.id_cart_rule)
		LEFT JOIN ps_cart_rule_product_rule_group c_r_p_r_g ON (c_r.id_cart_rule=c_r_p_r_g.id_cart_rule)
		LEFT JOIN ps_cart_rule_product_rule c_r_p_r ON (c_r_p_r_g.id_product_rule_group=c_r_p_r.id_product_rule_group)
		LEFT JOIN ps_cart_rule_product_rule_value c_r_p_r_v ON (c_r_p_r.id_product_rule = c_r_p_r_v.id_product_rule)
		WHERE o_c_r.id_order = 

Dane te wprowadzałem do tablicy. Później każdy produkt w zamówieniu sprawdzałem czy pasuje według tej tablicy czy pasuje po manufacturers, products, categories ( przy kategoriach też pobierałem wszystkie kategorie produktu do tablicy i porównywałem każda kategorie).
 

Link to comment
Share on other sites

Dzięki, jest to jakiś trop. Chociaż mój cel jest nieco inny. Chcę pozbierać wszystkie produkty z przedziału czasu i korzystając z 'wholesale_price' wyliczać realny zarobek uwzględniając rabaty i reguły cenowe. Ale tak patrząc "na sucho" (bo do komputera siądę dopiero wieczorem) też powyższe może być bardzo przydatne. Jeszcze raz dzięki 

Link to comment
Share on other sites

W prestashop są tak jakby dwa rodzaje rabatów.
1 .Rabaty na produktach, na przykład można ustawić, że przy zakupie 5 sztuk produkt jest tańszy. 
2. Rabat/kody rabatowe na całe zamówienie.

Da się zrobić przeliczenie rabatu koszykowego na produkty, ale nie jest to dobre rozwiązanie, po pierwsze jest problem z zaokrągleniami. Prosty przykład, klient kupił jeden produkt za 1000zł i 100szt. produktu za 1zł. Zrobił rabat na 200zł. Jaki rabat ma dostać produkt kupiony za 1zł?

Moim zdaniem to jest bez sensu, po prostu co innego jest rabat na zamówieniu, a co innego rabat na produkcie. 

Edited by marcin_jaworski (see edit history)
Link to comment
Share on other sites

oczywiscie jak najbardziej sie zgodze. jednak zaokraglenie to najmniejszy problem, grosz w jedna czy druga. to raczej do celow informacyjnych ile w rzeczywistosci sie zarobilo (plus/minus) niz dane ksiegowe ;) wiesz jak to jest.. Klient placi, Klient wymaga. takie cos sobie moj Klient wymyslil i kombinuj ;) nie wazne czy jest do zrobienia czy nie. a wymaganiem jest rozbicie zamowienia na pojedyncze produkty, zsumowanie produktow identycznych, wykaz zarobku itp. bajery...

kiedys jak siedzialem w Presta dniami i nocami moze poszlo by i szybciej, myslenie tez inne, ale od dluzszego czasu w presta w ogole nie siedzialem z racji zmiany branzy, teraz to juz tak hobbistycznie po pracy, po godzinach grzebie i tok myslowy juz nie ten.... dawniej nie takie "przekrety" sie robilo na presta ;) takze kazde najmniejsza wskazowka jest na wage zlota ;)

Edited by design4VIP (see edit history)
Link to comment
Share on other sites

Ok. Jeżeli tych rabatow nie musi widziec kupujacy to w sumie wszystkie potrzebne rzeczy beda w tabeli ps_orders, ps_orders_detail jakos tak. Tam sa kwoty do zaplacenia bez rabatow i z rabatami. Mozesz yo zrobic tworzac modul, ktory korzysta z hooka orderafter, nie pamietam jak dokladnie sie nazywa. Znajdziesz w dokumentacji. Zeby modul byl "ladny"' to chyba lepiej zeby mial swoje tabele w ktorych beda te nowe rabaty.

 

Jezeli to ma byc widoczne na froncie to musisz kombinowac z koszykiem.

 

Link to comment
Share on other sites

nie nie, to tylko ma byc widoczne dla sprzedawcy w module. poukladac to w helpery, formy, tabele itp to juz najmniejszy problem. w sumie to juz mam gotowe wraz z szablonami tabeli itp. zostala kwestia wyciagniecia danych. ps_orders, ps_orders_detail za wiele nie daje bo wszedzie rabaty np. ilsociowe sa juz w tabelach laczone, jak sama nazwa wskazuje sa to "reguly koszyka" wiec presta juz pokracznie wszystko laczy w calosciowe rabaty dla zamowienia a nie rozgranicza na produkty. poniekad ma to jakis sens optymalizacyjny. zawsze to mniej zapytan do bazy danych. ale jak widac... niekiedy psuje pomysly i komplikuje prace ;)

 

a ten hook? pierwsze slysze o takim... ze niby co w nim mialo by sie przed zamowieniem robic? w ktorym miejscu mialby sie wywolywac i przez ktory kontroler? to ma byc Action/Display? co w nim mialo by sie robic przed zamowieniem ? moze chodzilo o OrderConfirmation?

 

 

EDIT

znalazlem cos takiego w OrderDetail::setDetailProductPrice()

teoretycznie to chyba to o co mi chodzi, tylko w odwrotnej kolejnosci ;) moze spotkal ktos fukcje odwrotna do tej i dla tablicy zamowien Order a nie pojedynczego...

 

i jeszcze jedno pytanie, bo juz chyba dzisiaj zagotowalem sie za bardzo i ciezko mi myslec... jak z id_order wyciagnac id_cart z ktorego powstalo zamowienie? nie chodzi mi o zapytanie do bazy, bo jak nie znajde to napisze fukcje gdzie wycigagne konretnie co bede chcial bez smieci. chodzi mi oajas gotowa fukcje do podpiecia. mam $id_order i potrzebuje wyciagniac tylko $id_cart

Edited by design4VIP (see edit history)
Link to comment
Share on other sites

Można w sumie to podczepić pod jakiś hook display Order, ale wtedy to będzie się liczyło wiele razy, wiec chyba lepiej to obliczyć w action po złożeniu zamówienia i gdzieś zapisać.

Z tym id_cart to możesz przejrzeć  klasy Order i Cart tam coś może być. W bazie koszyk jest powiązany poprzez id_order w ps_cart.
Hooki 1.6 https://mypresta.eu/en/art/developer/prestashop-hook-list.html
 

Hooki 1.7 https://devdocs.prestashop.com/1.7/modules/concepts/hooks/list-of-hooks/

Chyba musisz porobić zamówienia i sprawdzać co jak się w bazie zapisuje. Wydaje mi się, że `ps_orders`.`total_discounts` to jest cały rabat koszykowy, a `ps_order_detail`.`reduction_amount`, `ps_order_detail`.`reduction_percent` to chyba będą specyficzne ceny na produktach.

Ja jak robiłem rozbijanie na produkty to było coś takiego
Sekwencja obliczeń
1. Obliczamy udział procentowy kwoty rabatu w wartości produktów objętych rabatem
2. Obniżamy ceny jednostkowe brutto o wyliczony procent rabatu i zaokrąglamy do dwóch miejsc po przecinku

Czyli obliczałem rabat koszykowy ( `ps_orders`.`total_discounts` ) jaki to jest procent od kwoty zamówienia bez  rabatu.
Kwota zamówienia bez rabatu to będzie `ps_orders`.`total_products_wt` (z podatkiem) + `ps_orders`.`total_shipping_tax_incl` i później ten wyliczony procent odejmowałem od kwoty zakupu produktu. To będzie w ps_order_detail.

Link to comment
Share on other sites

Właśnie nie za bardzo wchodzi kwestia forzucania czegoś do tabeli. To byłoby najprostsze i najszybsze rozwiązanie. Ale już jest multum zamówień, które też mają być w wykazach.... Czyli to odpada. Kontrolery ju przeglądałem i za cholerne nie mogę znaleźć czegoś typu getIdCartfromIdOrder() :) ale to najmniejszy pikuś. To sobie wyciągnę z bazy.

A rozbicie i obliczanie tak jak to opisujesz nie za bardzo się nadaje. Przyklad: w koszyku jest 10 produktów z reguła ilościowe (przypisany rabat) i 2 produkty z ceną specyficzna. Tu już za bardzo nie rozdziele procentowo reguły koszyka.... 

Nic, kombinuje dalej. Jak da się wyliczyć w podsumowaniu zamówienia rabaty w jedną stronę to i musi dać się w drugą :)

Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...