# 107 Strefy dostawy ## Wymagania biznesowe ### 1. Restauracja musi określić Obszary dostawy (na miejscu, odbiór osobisty, w dostawie) #### API: - [ ] przetrzymujemy dostępne typy "dostawy" (niezależne od resturacji) (na miejscu, odbiór osobisty, w dostawie) - [ ] Query zwracające listę dostępnych typów dla restauracji - [ ] przetrzymujemy włączone typy dostawy na restaurację RestaurantDeliveryType (typ, cena opakowania) - [ ] Mutacja zapis wybranych typów dostaw dla restauracji - [ ] Rozszerzyć typ restauracji o relację - [ ] możliwość określenia obszarów dostawy dowiązanych do RestaurantDeliveryType (obszar - polygon(postgis?) lub promień w metrach, cena) - [ ] Rozserzyć typ restauracji o relację - [ ] Mutacja przyjmująca arraykę obiektów ```javascript= [ { distance: 4000, price: 20.0, delivery_type: 'ZonedDelivery' } ] ``` ##### Pytania - Czas dostawy - czy chcemy go jakkolwiek określać? (może restaurator?) - Czy chcemy włączać/wyłączać dostępne typy dostawy dla restauracji? ### 2. Użytkownik tworząc zamówienie wybiera sposób dostawy #### API: - [ ] User może zdefiniować adres (rozbity na poszczególne pola - ulica, kod, ...) - [ ] Rozserzyć typ usera o zapisane adresy (edycja) - [ ] Mutacja zapisująca/update-ująca zdefiniowany adres klienta - [ ] Rozwiązujemy i zapisujemy adres usera asynchronicznie do koordynatów - [ ] Możliwość dodania zapisanego adresu do rezerwacji - [ ] Rozszerzenie mutacji create/updateReservation - [ ] Sprawdzamy do którego zdefiniowanego obszaru dostawy należy adres i dodajemy opłatę do fees rezerwacji - [ ] W rezerwacji zapisujemy parametry dostawy (typ, adres(jsonb), dodatkowe opłaty) - [ ] Rozszerzyć query moich rezerwacji o dodatkowe pola (dodatkowy Type) ```ruby reservation[:metadata] = { delivery_address: (delivery_address from DeliveryAddresses) delivery_comment: 'blah blah blah' } ``` ##### Pytania: - Czy chcemy zapisywać kilka adresów klienta? do wyboru później? ## Rozwiązanie - User wybiera adres dostawy - W DB zapisujemy pełen adres ```plantuml @startuml class Delivery { + name + zoneable? :bool + fees[] ? } class ZonedDelivery {} class OnPremiseDelivery {} class TakeAway {} note top of Delivery : STI Ober-Class Delivery <|-- ZonedDelivery Delivery <|-- OnPremiseDelivery Delivery <|-- TakeAwayDelivery class DeliveryTypeRestaurants { + restaurant_id + type:Delivery STI + packaging_price: Float } class DeliveryZone { + delivery_type_restaurant_id + price: Float + definition: TEXT? + distance:int } DeliveryTypeRestaurants ||--|{ DeliveryZone note right on link if DeliveryTypeRestaurant is zoneable? end note class User { + addresses[] } class DeliveryAddress { + address_1 + address_2 + city + zip_code + country_code: ISO-3166-1-alpha-2 + lat: decimal + long: decimal + delivery_notes:text } User ||--|{ DeliveryAddress @enduml ``` ```csvpreview {header="true"} restaurant_id,type,packaging_price 1,"ZonedDelivery",5.0 1,"OnPremiseDelivery",0 1,"TakeAway",5.0 ``` # Definiowanie DeliveryTypes i DeliveryZones ```plantuml @startuml autonumber actor Front control Backend Front -> Backend : Tworzy adres dostawy Front -> Backend : Wchodzi na Restaurację i wybiera zamówienie note over Front, Backend #aqua **POST /graphql** <color #F0F>//graph query// end note Front -> Backend : Wybiera tryb dostawy Front -> Backend : Wybiera adres dostawy jeśli tryb dostawy==ZonedDelivery Backend -> Front : Zwraca informację o cenie (Fee) @enduml ```