Spree - Cash on Delivery

Witam.
Poszukuję informacji lub gem-a, które pomogłyby zrealizować funkcjonalność w Spree 2.4 jak w temacie, tzn. możliwość wysłania zamówienia, niezależnie od stanu płatności.

Gem jaki znalazłem spree_cash_on_delivery-0.0.1.gem ustawia automatycznie płatność jako opłaconą co umożliwia wysyłkę, natomiast chciałbym aby wysyłka i płatność były niezależne.

Pozdrawiam

Nie jestem specjalistą spree, ale wydaje mi się, że coś takiego będzie wymagało nieco grubszej walki z maszyną stanową checkoutu. W dokumentacji wypisują wszystkie stany po kolei tutaj. Dodatkowo możesz stworzyć dekorator klasy Spree::Order i tam zmienić kolejność stanów, zobacz sobie więcej tutaj. Wydaje mi się, że kod poniżej powinien zrobić swoje zadanie, ale jak zaznaczyłem wcześniej nie jestem ekspertem.

checkout_flow do
  go_to_state :address
  go_to_state :delivery
  go_to_state :confirm, if: ->(order) { order.confirmation_required? }
  go_to_state :complete
end

Dzięki, ale chyba sam nieprecyzjnie zadałem pytanie, bo chodziło mi o zaplecze sklepu, a nie proces checkoutu. Tzn. kiedy przy checkoucie klient wybierze za pobraniem i zamówienie zostanie złożone w sklepie, to od strony zaplecza nie mogę wysłać zamówienia (Ship), dopóki nie zrobię zatwierdzenia płatności (capture -> status paid).

Trochę walczyłem z COD-em w Spree akurat właśnie w 2.4. Na zachodzie taka forma płatności nie istnieje dlatego trochę ciężko się czegoś dowiedzieć na ten temat z netu. Ja ostatecznie implementację zarzuciłem bo klient sam zrezygnował z takich płatności (w cholerę przy tym grzebania i ogólnie strata kasy i czasu ze względu na tych co nie odbierają takich zamówień), ale zdążyłem dojść do obejścia.

Ogólnie musisz sobie to ogarnąć łącząc obecną tam już płatność czekiem - czyli klient zamawia a Ty udajesz że zapłacone gotówką i potem sobie jakoś zaznaczysz, że przyszedł przelew.

Jeśli ten trop wydaje Ci się OK to spróbuję w wolnej chwili wygrzebać kod który mi to robił (chyba mam to nawet jako engine)

1 Like

Przyszedłem po odpowiedź a tu to:

@pjar: Niestety i ja mam potrzebę “cash on delivery”. Więc gdybyś zopen-source’ował gdzieś ten Engine byłoby super. :slight_smile:

Na tą chwilę wydaje mi się, że najlepiej będzie utworzyć nową klasę PaymentMethod z metodą np.“cash_on_delivery?” zwracającą zawsze true, a potem przeciążyć methodę determine_state w modelu Shipment i dodać dodatkowy warunek na sprawdzenie czy można wysłać, bazując na tym co zwróci PaymentMethod przypisany do danego zamówienia.