# 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
```