---
# System prepended metadata

title: 107 Strefy dostawy

---

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