Mieszane pozycje postpaid i prepaid
Sesja stolika może zawierać jednocześnie pozycje postpaid wprowadzone przez kelnera i pozycje prepaid wysłane przez klienta na tym samym rachunku POS. Pozycje dodane przez kelnera przed skanowaniem przez klienta pojawiają się w początkowym snapshocie. Pozycje dodane przez kelnera po skanowaniu przychodzą jako TableOrderSnapshotChanged(POS_LINE_ADDED) razem z ewentualnymi pozycjami prepaid wysłanymi przez klienta, aż do ORDER_CLOSED.
Dwa warianty kompozycji zbudowane z istniejących wiadomości stolika, prepaid i rachunku postpaid pokrywają przestrzeń projektową. POS nie rozgałęzia logiki zależnie od wariantu realizowanego przez aplikację; oba są poprawnymi równoległymi ścieżkami dla tej samej otwartej sesji stolika.
Rozliczenie całego stolika
Ten wariant odpowiada intencji klienta przy finalizacji: „zapłać teraz za wszystko, w tym pozycje dodane przez kelnera”. Powstaje jedna płatność OpenApp i jeden zapis płatności widoczny dla POS.
- OpenApp wysyła
OrderSubmissionRequested(orderContext=TABLE, items=[customer-added])bezpayment. Pozycje dodane przez klienta są wysyłane jako postpaid i dołączają do otwartego rachunku razem z pozycjami kelnera. - OpenApp wysyła
BillPreparationRequested(orderContext=TABLE, checkpoint)bez podzbioruitems. POS zwraca pełny rachunek obejmujący pozycje dodane przez klienta i przez kelnera. - OpenApp wykonuje płatność klienta za pełną kwotę.
- OpenApp wysyła
BillPaymentCompleted(posBillId, payment). POS rejestruje płatność i wysyłaTableOrderSnapshotChanged(ORDER_CLOSED)zgodnie z Płatnością rachunku postpaid.
Przedpłata pozycji klienta i osobne rozliczenie pozostałych
Ten wariant odpowiada intencji klienta: „opłać teraz to, co dodałem” - samodzielnie, z pozostawieniem pozostałych pozycji kelnerowi.
- OpenApp wysyła
OrderSubmissionRequested(orderContext=TABLE, items=[customer-added], payment)z płatnością prepaid klienta za pozycje dodane przez klienta. POS akceptuje pozycje i zwraca paragon bezpośrednio w odpowiedzi. Mechanikę wysłania prepaid opisuje Zamawianie prepaid. - W opcjonalnym albo odroczonym manualnym kroku rozliczenia pozostałej części OpenApp wysyła
BillPreparationRequested(orderContext=TABLE, items=[waiter-line-refs])dla pozostałego podzbioru, a następnieBillPaymentCompleted(posBillId, payment)po opłaceniu reszty przez klienta. Jeśli ten krok zostanie pominięty, kelner obsługuje resztę fizycznie.
Jeśli krok pozostałej części nie powiedzie się po udanym kroku prepaid, OpenApp zwraca tylko pozostałą część; pozycje dodane przez klienta pozostają opłacone i przypisane do rachunku.