# Order Process
```mermaid
graph TD
Home[[Homeview]]-->
action1[Click products]-->
Query1>"GetRestaurants with filters #9721;1"]-->
Locations[["Show same list as nearest <br> cafes or locations with only cafes"]]-->
action2[Select location for pickup]-->
Query2>"GetProductMenu with <br>selected locationID #9721;2"]-->
Products[["Show products #9699;1"]]-->buttonAdd2Basket["addToBasket click"]
Products-->
action3["Click product"]-->
Query3>"GetProductById #9721;3"]-->
Product[["Show single product view"]]-->
buttonAdd2Basket-->
Query31>"GetProductById #9721;3"]-->
cont[["Product configuration <br> continues after queries and views"]]
```
## GraphQL queries
#### ◹ 1 -- GetRestaurants
* Order closest to user current location (same as show nearest)
* Show only restaurant
* Hide filters
* Save selected location ID
Query:
```
query GetRestaurants($lang: Locale!) {
locations(where: {locationType: restaurant}, first: 100, locales: [$lang, en]) {
id
city
coordinates
country
extraData
localizations(includeCurrent: true) {
country
}
image {
url
}
locationType
stage
name
openingHours
postalCode
street
telephoneNumber
exceptions
}
}
```
---
#### ◹ 2 -- GetProductMenu
* Will hide products that are not available in selected location
```
where: { productHidden_none: {id: $locationId}...
```
* Contains exceptions for as key:value pairs if product salesPrice is different from default (locationId:newPrice)
```
productPriceData {
...
priceSalesExceptions
}
```
query:
```
query GetProductMenu($lang: Locale!, $SelectedLocationId: $locationId) {
products(
where: { productHidden_none: {id: $locationId}, active: true, isModifier: false }
orderBy: order_ASC
locales: [$lang, en]
first: 100
) {
productId
id
productName
productPriceData {
priceSales
vatRate
priceSalesExceptions
}
productImage {
url
}
productCategory
productAllergen {
allergensContained
allergensPossible
dietaryCategories
}
}
}
```
#### ◹ 3 -- GetProductById
query:
```
query GetProductById($productId: Int, $lang: Locale!) {
product(
where: { productId: $productId, active: true }
locales: [$lang, en]
) {
productId
id
productName
productPosData {
posUuid
}
productPriceData {
priceSales
vatRate
}
productImage {
url
}
productCategory
productSubCategory
productDescriptionShort
productDescriptionLong
productInfo
productAllergen {
allergensContained
allergensPossible
dietaryCategories
}
productNutrition {
carbs
carbsSugars
energyKilocalories
energyKilojoules
fat
fatSaturated
lactose
productWeight
protein
salt
}
productNutrition100 {
carbs
carbsSugars
energyKilocalories
energyKilojoules
fat
fatSaturated
lactose
productWeight
protein
salt
}
defaultModifiers {
isModifierGroup
productName
allowMultipleSelection
defaultModifiers {
productName
productPosData {
id
}
}
}
optionalModifiers {
isModifierGroup
productName
allowMultipleSelection
defaultModifiers {
productName
productPosData {
id
}
productPriceData {
priceSales
vatRate
}
}
}
productVariations {
productId
id
productName
productImage {
url
}
productPosData {
posUuid
}
productPriceData {
priceSales
vatRate
priceSalesExceptions
}
}
additionalProducts{
productId
id
productName
productImage {
url
}
productPosData {
posUuid
}
productPriceData {
priceSales
vatRate
priceSalesExceptions
}
}
}
}
```
---
## Views
#### ◣1 Menu/Products
1. Some products might not be available in selected location
```
where: { productHidden_none: {id: $locationId}, acti...
```
will hande this problem.
2. Product prices may vary in different location
```
"priceSalesExceptions": {
"clftjm3t49k5b0bulvqxpqxel": "3.9",
"clftjh9se9nxz0bw8lfrracxq": "3.7",
}
```
Need to check if object contains currentLocationId use exception price
---
## Add to basket product customization
```mermaid
graph TD
Prod[[Customize product]]-->
Query3>"GetProductById #9721;3"]-->
check11{"posUuid"}
ProdType1["Single product"]
ProdType2["Product is combination"]
check11-->|notNull| ProdType1
-->cNumOfProd[\"Show: select number of products"\]
check11-->|null| ProdType2
subgraph defaultloop
checkDefault["Loop through defaultModifiers"]-->
check21{"isModifierGroup"}
check21-->|true| defaultAllowMulti{"allowMultipleSelection == false"}
check21-->|false| defaultShowBoolean[\"Show: select true/false"\]
defaultAllowMulti-->|Allow multiple select| showDfltLift[\"Show: product group content list"\]
defaultAllowMulti-->|Allow single select| showDfltLift
defaultSavePOSUuids["Save posUuid(s)"]
defaultShowBoolean-->defaultSavePOSUuids
showDfltLift-->defaultSavePOSUuids
defaultSavePOSUuids-->defaultAffectTotalSum["Selections do not affect end sum"]
end
subgraph optionalloop
checkOptional["Loop through optionaModifiers"]
checkOptional-->check31{"isModifierGroup"}
check31-->|true| optionalAllowMulti{"allowMultipleSelection"}
check31-->|false| optionalShowBoolean[\"Show select true/false"\]
optionalAllowMulti-->|Allow multiple select| showOptLift[\"Show: product group content list"\]
optionalAllowMulti-->|Allow single select| showOptLift
optSavePOSUuids["Save posUuid(s)"]
optionalShowBoolean-->optSavePOSUuids
showOptLift-->optSavePOSUuids
optSavePOSUuids-->optAffectTotalSum["Save prices from optional selections for end sum"]
end
subgraph productVariations
checkVariations["Loop through variations"]-->showVariations[\"Show product variations"\]
end
subgraph additionalProducts
checkAdditional["Loop through additions"]-->showAdditions[\"Show possible additions"\]
end
ProdType2-->checkDefault
defaultAffectTotalSum-->checkOptional
cNumOfProd-->checkVariations
showVariations-->checkAdditional
optAffectTotalSum-->checkAdditional
showAdditions-->ConfirmAdd[["Confirm adding product to basket"]]
```