fix: počítání částek v haléřích z důvodu přesnosti
CI / Generate TypeScript types (push) Successful in 21s
CI / Build server (push) Successful in 25s
CI / Server unit tests (push) Successful in 55s
CI / Build client (push) Successful in 33s
CI / Playwright E2E tests (push) Successful in 1m20s
CI / Build and push Docker image (push) Successful in 35s
CI / Notify (push) Successful in 2s
CI / Generate TypeScript types (push) Successful in 21s
CI / Build server (push) Successful in 25s
CI / Server unit tests (push) Successful in 55s
CI / Build client (push) Successful in 33s
CI / Playwright E2E tests (push) Successful in 1m20s
CI / Build and push Docker image (push) Successful in 35s
CI / Notify (push) Successful in 2s
This commit is contained in:
@@ -28,16 +28,16 @@ const buildPizzaUrl = (pizzaUrl: string) => {
|
||||
return `${baseUrl}/${pizzaUrl}`;
|
||||
}
|
||||
|
||||
// Ceny krabic dle velikosti
|
||||
// Ceny krabic dle velikosti v haléřích
|
||||
const boxPrices: { [key: string]: number } = {
|
||||
"30cm": 13,
|
||||
"35cm": 15,
|
||||
"40cm": 18,
|
||||
"50cm": 25
|
||||
"30cm": 1300,
|
||||
"35cm": 1500,
|
||||
"40cm": 1800,
|
||||
"50cm": 2500
|
||||
}
|
||||
|
||||
// Cena obalu pro salát
|
||||
const SALAT_BOX_PRICE = 13;
|
||||
// Cena obalu pro salát v haléřích
|
||||
const SALAT_BOX_PRICE = 1300;
|
||||
|
||||
/**
|
||||
* Stáhne a scrapne aktuální pizzy ze stránek Pizza Chefie.
|
||||
@@ -79,7 +79,7 @@ export async function downloadPizzy(mock: boolean): Promise<Pizza[]> {
|
||||
a.each((i, elm) => {
|
||||
const varId = Number.parseInt(elm.attribs.href.split('?varianta=')[1].trim());
|
||||
const size = $($(elm).contents().get(0)).text().trim();
|
||||
const price = Number.parseInt($($(elm).contents().get(1)).text().trim().split(" Kč")[0]);
|
||||
const price = Number.parseInt($($(elm).contents().get(1)).text().trim().split(" Kč")[0]) * 100;
|
||||
sizes.push({ varId, size, pizzaPrice: price, boxPrice: boxPrices[size], price: price + boxPrices[size] });
|
||||
})
|
||||
result.push({
|
||||
@@ -119,7 +119,7 @@ export async function downloadSalaty(mock: boolean): Promise<Salat[]> {
|
||||
ingredients.push($(elm).text());
|
||||
});
|
||||
const priceText = $('.cena > span', salatHtml).first().text().trim();
|
||||
const price = Number.parseInt(priceText.split(' Kč')[0]);
|
||||
const price = Number.parseInt(priceText.split(' Kč')[0]) * 100;
|
||||
result.push({ name, ingredients, price: price + SALAT_BOX_PRICE });
|
||||
}
|
||||
return result;
|
||||
|
||||
+220
-220
@@ -661,30 +661,30 @@ const MOCK_PIZZA_LIST = [
|
||||
{
|
||||
varId: 1,
|
||||
size: "30cm",
|
||||
pizzaPrice: 138,
|
||||
boxPrice: 13,
|
||||
price: 151
|
||||
pizzaPrice: 13800,
|
||||
boxPrice: 1300,
|
||||
price: 15100
|
||||
},
|
||||
{
|
||||
varId: 2,
|
||||
size: "35cm",
|
||||
pizzaPrice: 166,
|
||||
boxPrice: 15,
|
||||
price: 181
|
||||
pizzaPrice: 16600,
|
||||
boxPrice: 1500,
|
||||
price: 18100
|
||||
},
|
||||
{
|
||||
varId: 3,
|
||||
size: "40cm",
|
||||
pizzaPrice: 223,
|
||||
boxPrice: 18,
|
||||
price: 241
|
||||
pizzaPrice: 22300,
|
||||
boxPrice: 1800,
|
||||
price: 24100
|
||||
},
|
||||
{
|
||||
varId: 4,
|
||||
size: "50cm",
|
||||
pizzaPrice: 306,
|
||||
boxPrice: 25,
|
||||
price: 331
|
||||
pizzaPrice: 30600,
|
||||
boxPrice: 2500,
|
||||
price: 33100
|
||||
}
|
||||
]
|
||||
},
|
||||
@@ -700,30 +700,30 @@ const MOCK_PIZZA_LIST = [
|
||||
{
|
||||
varId: 6,
|
||||
size: "30cm",
|
||||
pizzaPrice: 142,
|
||||
boxPrice: 13,
|
||||
price: 155
|
||||
pizzaPrice: 14200,
|
||||
boxPrice: 1300,
|
||||
price: 15500
|
||||
},
|
||||
{
|
||||
varId: 7,
|
||||
size: "35cm",
|
||||
pizzaPrice: 172,
|
||||
boxPrice: 15,
|
||||
price: 187
|
||||
pizzaPrice: 17200,
|
||||
boxPrice: 1500,
|
||||
price: 18700
|
||||
},
|
||||
{
|
||||
varId: 8,
|
||||
size: "40cm",
|
||||
pizzaPrice: 233,
|
||||
boxPrice: 18,
|
||||
price: 251
|
||||
pizzaPrice: 23300,
|
||||
boxPrice: 1800,
|
||||
price: 25100
|
||||
},
|
||||
{
|
||||
varId: 9,
|
||||
size: "50cm",
|
||||
pizzaPrice: 316,
|
||||
boxPrice: 25,
|
||||
price: 341
|
||||
pizzaPrice: 31600,
|
||||
boxPrice: 2500,
|
||||
price: 34100
|
||||
}
|
||||
]
|
||||
},
|
||||
@@ -741,30 +741,30 @@ const MOCK_PIZZA_LIST = [
|
||||
{
|
||||
varId: 10,
|
||||
size: "30cm",
|
||||
pizzaPrice: 142,
|
||||
boxPrice: 13,
|
||||
price: 155
|
||||
pizzaPrice: 14200,
|
||||
boxPrice: 1300,
|
||||
price: 15500
|
||||
},
|
||||
{
|
||||
varId: 11,
|
||||
size: "35cm",
|
||||
pizzaPrice: 172,
|
||||
boxPrice: 15,
|
||||
price: 187
|
||||
pizzaPrice: 17200,
|
||||
boxPrice: 1500,
|
||||
price: 18700
|
||||
},
|
||||
{
|
||||
varId: 12,
|
||||
size: "40cm",
|
||||
pizzaPrice: 233,
|
||||
boxPrice: 18,
|
||||
price: 251
|
||||
pizzaPrice: 23300,
|
||||
boxPrice: 1800,
|
||||
price: 25100
|
||||
},
|
||||
{
|
||||
varId: 13,
|
||||
size: "50cm",
|
||||
pizzaPrice: 316,
|
||||
boxPrice: 25,
|
||||
price: 341
|
||||
pizzaPrice: 31600,
|
||||
boxPrice: 2500,
|
||||
price: 34100
|
||||
}
|
||||
]
|
||||
},
|
||||
@@ -780,30 +780,30 @@ const MOCK_PIZZA_LIST = [
|
||||
{
|
||||
varId: 14,
|
||||
size: "30cm",
|
||||
pizzaPrice: 142,
|
||||
boxPrice: 13,
|
||||
price: 155
|
||||
pizzaPrice: 14200,
|
||||
boxPrice: 1300,
|
||||
price: 15500
|
||||
},
|
||||
{
|
||||
varId: 15,
|
||||
size: "35cm",
|
||||
pizzaPrice: 172,
|
||||
boxPrice: 15,
|
||||
price: 187
|
||||
pizzaPrice: 17200,
|
||||
boxPrice: 1500,
|
||||
price: 18700
|
||||
},
|
||||
{
|
||||
varId: 16,
|
||||
size: "40cm",
|
||||
pizzaPrice: 233,
|
||||
boxPrice: 18,
|
||||
price: 251
|
||||
pizzaPrice: 23300,
|
||||
boxPrice: 1800,
|
||||
price: 25100
|
||||
},
|
||||
{
|
||||
varId: 17,
|
||||
size: "50cm",
|
||||
pizzaPrice: 294,
|
||||
boxPrice: 25,
|
||||
price: 319
|
||||
pizzaPrice: 29400,
|
||||
boxPrice: 2500,
|
||||
price: 31900
|
||||
}
|
||||
]
|
||||
},
|
||||
@@ -821,30 +821,30 @@ const MOCK_PIZZA_LIST = [
|
||||
{
|
||||
varId: 22,
|
||||
size: "30cm",
|
||||
pizzaPrice: 162,
|
||||
boxPrice: 13,
|
||||
price: 175
|
||||
pizzaPrice: 16200,
|
||||
boxPrice: 1300,
|
||||
price: 17500
|
||||
},
|
||||
{
|
||||
varId: 23,
|
||||
size: "35cm",
|
||||
pizzaPrice: 186,
|
||||
boxPrice: 15,
|
||||
price: 201
|
||||
pizzaPrice: 18600,
|
||||
boxPrice: 1500,
|
||||
price: 20100
|
||||
},
|
||||
{
|
||||
varId: 24,
|
||||
size: "40cm",
|
||||
pizzaPrice: 263,
|
||||
boxPrice: 18,
|
||||
price: 281
|
||||
pizzaPrice: 26300,
|
||||
boxPrice: 1800,
|
||||
price: 28100
|
||||
},
|
||||
{
|
||||
varId: 25,
|
||||
size: "50cm",
|
||||
pizzaPrice: 346,
|
||||
boxPrice: 25,
|
||||
price: 371
|
||||
pizzaPrice: 34600,
|
||||
boxPrice: 2500,
|
||||
price: 37100
|
||||
}
|
||||
]
|
||||
},
|
||||
@@ -861,30 +861,30 @@ const MOCK_PIZZA_LIST = [
|
||||
{
|
||||
varId: 26,
|
||||
size: "30cm",
|
||||
pizzaPrice: 162,
|
||||
boxPrice: 13,
|
||||
price: 175
|
||||
pizzaPrice: 16200,
|
||||
boxPrice: 1300,
|
||||
price: 17500
|
||||
},
|
||||
{
|
||||
varId: 27,
|
||||
size: "35cm",
|
||||
pizzaPrice: 186,
|
||||
boxPrice: 15,
|
||||
price: 201
|
||||
pizzaPrice: 18600,
|
||||
boxPrice: 1500,
|
||||
price: 20100
|
||||
},
|
||||
{
|
||||
varId: 28,
|
||||
size: "40cm",
|
||||
pizzaPrice: 263,
|
||||
boxPrice: 18,
|
||||
price: 281
|
||||
pizzaPrice: 26300,
|
||||
boxPrice: 1800,
|
||||
price: 28100
|
||||
},
|
||||
{
|
||||
varId: 29,
|
||||
size: "50cm",
|
||||
pizzaPrice: 346,
|
||||
boxPrice: 25,
|
||||
price: 371
|
||||
pizzaPrice: 34600,
|
||||
boxPrice: 2500,
|
||||
price: 37100
|
||||
}
|
||||
]
|
||||
},
|
||||
@@ -902,30 +902,30 @@ const MOCK_PIZZA_LIST = [
|
||||
{
|
||||
varId: 30,
|
||||
size: "30cm",
|
||||
pizzaPrice: 162,
|
||||
boxPrice: 13,
|
||||
price: 175
|
||||
pizzaPrice: 16200,
|
||||
boxPrice: 1300,
|
||||
price: 17500
|
||||
},
|
||||
{
|
||||
varId: 31,
|
||||
size: "35cm",
|
||||
pizzaPrice: 186,
|
||||
boxPrice: 15,
|
||||
price: 201
|
||||
pizzaPrice: 18600,
|
||||
boxPrice: 1500,
|
||||
price: 20100
|
||||
},
|
||||
{
|
||||
varId: 32,
|
||||
size: "40cm",
|
||||
pizzaPrice: 263,
|
||||
boxPrice: 18,
|
||||
price: 281
|
||||
pizzaPrice: 26300,
|
||||
boxPrice: 1800,
|
||||
price: 28100
|
||||
},
|
||||
{
|
||||
varId: 33,
|
||||
size: "50cm",
|
||||
pizzaPrice: 346,
|
||||
boxPrice: 25,
|
||||
price: 371
|
||||
pizzaPrice: 34600,
|
||||
boxPrice: 2500,
|
||||
price: 37100
|
||||
}
|
||||
]
|
||||
},
|
||||
@@ -946,30 +946,30 @@ const MOCK_PIZZA_LIST = [
|
||||
{
|
||||
varId: 34,
|
||||
size: "30cm",
|
||||
pizzaPrice: 162,
|
||||
boxPrice: 13,
|
||||
price: 175
|
||||
pizzaPrice: 16200,
|
||||
boxPrice: 1300,
|
||||
price: 17500
|
||||
},
|
||||
{
|
||||
varId: 35,
|
||||
size: "35cm",
|
||||
pizzaPrice: 186,
|
||||
boxPrice: 15,
|
||||
price: 201
|
||||
pizzaPrice: 18600,
|
||||
boxPrice: 1500,
|
||||
price: 20100
|
||||
},
|
||||
{
|
||||
varId: 36,
|
||||
size: "40cm",
|
||||
pizzaPrice: 263,
|
||||
boxPrice: 18,
|
||||
price: 281
|
||||
pizzaPrice: 26300,
|
||||
boxPrice: 1800,
|
||||
price: 28100
|
||||
},
|
||||
{
|
||||
varId: 37,
|
||||
size: "50cm",
|
||||
pizzaPrice: 346,
|
||||
boxPrice: 25,
|
||||
price: 371
|
||||
pizzaPrice: 34600,
|
||||
boxPrice: 2500,
|
||||
price: 37100
|
||||
}
|
||||
]
|
||||
},
|
||||
@@ -987,30 +987,30 @@ const MOCK_PIZZA_LIST = [
|
||||
{
|
||||
varId: 38,
|
||||
size: "30cm",
|
||||
pizzaPrice: 162,
|
||||
boxPrice: 13,
|
||||
price: 175
|
||||
pizzaPrice: 16200,
|
||||
boxPrice: 1300,
|
||||
price: 17500
|
||||
},
|
||||
{
|
||||
varId: 39,
|
||||
size: "35cm",
|
||||
pizzaPrice: 186,
|
||||
boxPrice: 15,
|
||||
price: 201
|
||||
pizzaPrice: 18600,
|
||||
boxPrice: 1500,
|
||||
price: 20100
|
||||
},
|
||||
{
|
||||
varId: 40,
|
||||
size: "40cm",
|
||||
pizzaPrice: 263,
|
||||
boxPrice: 18,
|
||||
price: 281
|
||||
pizzaPrice: 26300,
|
||||
boxPrice: 1800,
|
||||
price: 28100
|
||||
},
|
||||
{
|
||||
varId: 41,
|
||||
size: "50cm",
|
||||
pizzaPrice: 346,
|
||||
boxPrice: 25,
|
||||
price: 371
|
||||
pizzaPrice: 34600,
|
||||
boxPrice: 2500,
|
||||
price: 37100
|
||||
}
|
||||
]
|
||||
},
|
||||
@@ -1028,30 +1028,30 @@ const MOCK_PIZZA_LIST = [
|
||||
{
|
||||
varId: 42,
|
||||
size: "30cm",
|
||||
pizzaPrice: 172,
|
||||
boxPrice: 13,
|
||||
price: 185
|
||||
pizzaPrice: 17200,
|
||||
boxPrice: 1300,
|
||||
price: 18500
|
||||
},
|
||||
{
|
||||
varId: 43,
|
||||
size: "35cm",
|
||||
pizzaPrice: 212,
|
||||
boxPrice: 15,
|
||||
price: 227
|
||||
pizzaPrice: 21200,
|
||||
boxPrice: 1500,
|
||||
price: 22700
|
||||
},
|
||||
{
|
||||
varId: 44,
|
||||
size: "40cm",
|
||||
pizzaPrice: 293,
|
||||
boxPrice: 18,
|
||||
price: 311
|
||||
pizzaPrice: 29300,
|
||||
boxPrice: 1800,
|
||||
price: 31100
|
||||
},
|
||||
{
|
||||
varId: 45,
|
||||
size: "50cm",
|
||||
pizzaPrice: 376,
|
||||
boxPrice: 25,
|
||||
price: 401
|
||||
pizzaPrice: 37600,
|
||||
boxPrice: 2500,
|
||||
price: 40100
|
||||
}
|
||||
]
|
||||
},
|
||||
@@ -1069,30 +1069,30 @@ const MOCK_PIZZA_LIST = [
|
||||
{
|
||||
varId: 46,
|
||||
size: "30cm",
|
||||
pizzaPrice: 182,
|
||||
boxPrice: 13,
|
||||
price: 195
|
||||
pizzaPrice: 18200,
|
||||
boxPrice: 1300,
|
||||
price: 19500
|
||||
},
|
||||
{
|
||||
varId: 47,
|
||||
size: "35cm",
|
||||
pizzaPrice: 222,
|
||||
boxPrice: 15,
|
||||
price: 237
|
||||
pizzaPrice: 22200,
|
||||
boxPrice: 1500,
|
||||
price: 23700
|
||||
},
|
||||
{
|
||||
varId: 48,
|
||||
size: "40cm",
|
||||
pizzaPrice: 303,
|
||||
boxPrice: 18,
|
||||
price: 321
|
||||
pizzaPrice: 30300,
|
||||
boxPrice: 1800,
|
||||
price: 32100
|
||||
},
|
||||
{
|
||||
varId: 49,
|
||||
size: "50cm",
|
||||
pizzaPrice: 386,
|
||||
boxPrice: 25,
|
||||
price: 411
|
||||
pizzaPrice: 38600,
|
||||
boxPrice: 2500,
|
||||
price: 41100
|
||||
}
|
||||
]
|
||||
},
|
||||
@@ -1114,30 +1114,30 @@ const MOCK_PIZZA_LIST = [
|
||||
{
|
||||
varId: 50,
|
||||
size: "30cm",
|
||||
pizzaPrice: 182,
|
||||
boxPrice: 13,
|
||||
price: 195
|
||||
pizzaPrice: 18200,
|
||||
boxPrice: 1300,
|
||||
price: 19500
|
||||
},
|
||||
{
|
||||
varId: 51,
|
||||
size: "35cm",
|
||||
pizzaPrice: 222,
|
||||
boxPrice: 15,
|
||||
price: 237
|
||||
pizzaPrice: 22200,
|
||||
boxPrice: 1500,
|
||||
price: 23700
|
||||
},
|
||||
{
|
||||
varId: 52,
|
||||
size: "40cm",
|
||||
pizzaPrice: 303,
|
||||
boxPrice: 18,
|
||||
price: 321
|
||||
pizzaPrice: 30300,
|
||||
boxPrice: 1800,
|
||||
price: 32100
|
||||
},
|
||||
{
|
||||
varId: 53,
|
||||
size: "50cm",
|
||||
pizzaPrice: 396,
|
||||
boxPrice: 25,
|
||||
price: 421
|
||||
pizzaPrice: 39600,
|
||||
boxPrice: 2500,
|
||||
price: 42100
|
||||
}
|
||||
]
|
||||
},
|
||||
@@ -1156,30 +1156,30 @@ const MOCK_PIZZA_LIST = [
|
||||
{
|
||||
varId: 54,
|
||||
size: "30cm",
|
||||
pizzaPrice: 182,
|
||||
boxPrice: 13,
|
||||
price: 195
|
||||
pizzaPrice: 18200,
|
||||
boxPrice: 1300,
|
||||
price: 19500
|
||||
},
|
||||
{
|
||||
varId: 55,
|
||||
size: "35cm",
|
||||
pizzaPrice: 222,
|
||||
boxPrice: 15,
|
||||
price: 237
|
||||
pizzaPrice: 22200,
|
||||
boxPrice: 1500,
|
||||
price: 23700
|
||||
},
|
||||
{
|
||||
varId: 56,
|
||||
size: "40cm",
|
||||
pizzaPrice: 303,
|
||||
boxPrice: 18,
|
||||
price: 321
|
||||
pizzaPrice: 30300,
|
||||
boxPrice: 1800,
|
||||
price: 32100
|
||||
},
|
||||
{
|
||||
varId: 57,
|
||||
size: "50cm",
|
||||
pizzaPrice: 396,
|
||||
boxPrice: 25,
|
||||
price: 421
|
||||
pizzaPrice: 39600,
|
||||
boxPrice: 2500,
|
||||
price: 42100
|
||||
}
|
||||
]
|
||||
},
|
||||
@@ -1199,30 +1199,30 @@ const MOCK_PIZZA_LIST = [
|
||||
{
|
||||
varId: 58,
|
||||
size: "30cm",
|
||||
pizzaPrice: 182,
|
||||
boxPrice: 13,
|
||||
price: 195
|
||||
pizzaPrice: 18200,
|
||||
boxPrice: 1300,
|
||||
price: 19500
|
||||
},
|
||||
{
|
||||
varId: 59,
|
||||
size: "35cm",
|
||||
pizzaPrice: 222,
|
||||
boxPrice: 15,
|
||||
price: 237
|
||||
pizzaPrice: 22200,
|
||||
boxPrice: 1500,
|
||||
price: 23700
|
||||
},
|
||||
{
|
||||
varId: 60,
|
||||
size: "40cm",
|
||||
pizzaPrice: 303,
|
||||
boxPrice: 18,
|
||||
price: 321
|
||||
pizzaPrice: 30300,
|
||||
boxPrice: 1800,
|
||||
price: 32100
|
||||
},
|
||||
{
|
||||
varId: 61,
|
||||
size: "50cm",
|
||||
pizzaPrice: 396,
|
||||
boxPrice: 25,
|
||||
price: 421
|
||||
pizzaPrice: 39600,
|
||||
boxPrice: 2500,
|
||||
price: 42100
|
||||
}
|
||||
]
|
||||
},
|
||||
@@ -1241,30 +1241,30 @@ const MOCK_PIZZA_LIST = [
|
||||
{
|
||||
varId: 62,
|
||||
size: "30cm",
|
||||
pizzaPrice: 188,
|
||||
boxPrice: 13,
|
||||
price: 201
|
||||
pizzaPrice: 18800,
|
||||
boxPrice: 1300,
|
||||
price: 20100
|
||||
},
|
||||
{
|
||||
varId: 63,
|
||||
size: "35cm",
|
||||
pizzaPrice: 226,
|
||||
boxPrice: 15,
|
||||
price: 241
|
||||
pizzaPrice: 22600,
|
||||
boxPrice: 1500,
|
||||
price: 24100
|
||||
},
|
||||
{
|
||||
varId: 64,
|
||||
size: "40cm",
|
||||
pizzaPrice: 313,
|
||||
boxPrice: 18,
|
||||
price: 331
|
||||
pizzaPrice: 31300,
|
||||
boxPrice: 1800,
|
||||
price: 33100
|
||||
},
|
||||
{
|
||||
varId: 65,
|
||||
size: "50cm",
|
||||
pizzaPrice: 426,
|
||||
boxPrice: 25,
|
||||
price: 451
|
||||
pizzaPrice: 42600,
|
||||
boxPrice: 2500,
|
||||
price: 45100
|
||||
}
|
||||
]
|
||||
},
|
||||
@@ -1283,30 +1283,30 @@ const MOCK_PIZZA_LIST = [
|
||||
{
|
||||
varId: 66,
|
||||
size: "30cm",
|
||||
pizzaPrice: 188,
|
||||
boxPrice: 13,
|
||||
price: 201
|
||||
pizzaPrice: 18800,
|
||||
boxPrice: 1300,
|
||||
price: 20100
|
||||
},
|
||||
{
|
||||
varId: 67,
|
||||
size: "35cm",
|
||||
pizzaPrice: 226,
|
||||
boxPrice: 15,
|
||||
price: 241
|
||||
pizzaPrice: 22600,
|
||||
boxPrice: 1500,
|
||||
price: 24100
|
||||
},
|
||||
{
|
||||
varId: 68,
|
||||
size: "40cm",
|
||||
pizzaPrice: 313,
|
||||
boxPrice: 18,
|
||||
price: 331
|
||||
pizzaPrice: 31300,
|
||||
boxPrice: 1800,
|
||||
price: 33100
|
||||
},
|
||||
{
|
||||
varId: 69,
|
||||
size: "50cm",
|
||||
pizzaPrice: 426,
|
||||
boxPrice: 25,
|
||||
price: 451
|
||||
pizzaPrice: 42600,
|
||||
boxPrice: 2500,
|
||||
price: 45100
|
||||
}
|
||||
]
|
||||
},
|
||||
@@ -1327,30 +1327,30 @@ const MOCK_PIZZA_LIST = [
|
||||
{
|
||||
varId: 309,
|
||||
size: "30cm",
|
||||
pizzaPrice: 182,
|
||||
boxPrice: 13,
|
||||
price: 195
|
||||
pizzaPrice: 18200,
|
||||
boxPrice: 1300,
|
||||
price: 19500
|
||||
},
|
||||
{
|
||||
varId: 310,
|
||||
size: "35cm",
|
||||
pizzaPrice: 222,
|
||||
boxPrice: 15,
|
||||
price: 237
|
||||
pizzaPrice: 22200,
|
||||
boxPrice: 1500,
|
||||
price: 23700
|
||||
},
|
||||
{
|
||||
varId: 311,
|
||||
size: "40cm",
|
||||
pizzaPrice: 303,
|
||||
boxPrice: 18,
|
||||
price: 321
|
||||
pizzaPrice: 30300,
|
||||
boxPrice: 1800,
|
||||
price: 32100
|
||||
},
|
||||
{
|
||||
varId: 312,
|
||||
size: "50cm",
|
||||
pizzaPrice: 396,
|
||||
boxPrice: 25,
|
||||
price: 421
|
||||
pizzaPrice: 39600,
|
||||
boxPrice: 2500,
|
||||
price: 42100
|
||||
}
|
||||
]
|
||||
},
|
||||
@@ -1369,30 +1369,30 @@ const MOCK_PIZZA_LIST = [
|
||||
{
|
||||
varId: 394,
|
||||
size: "30cm",
|
||||
pizzaPrice: 188,
|
||||
boxPrice: 13,
|
||||
price: 201
|
||||
pizzaPrice: 18800,
|
||||
boxPrice: 1300,
|
||||
price: 20100
|
||||
},
|
||||
{
|
||||
varId: 395,
|
||||
size: "35cm",
|
||||
pizzaPrice: 226,
|
||||
boxPrice: 15,
|
||||
price: 241
|
||||
pizzaPrice: 22600,
|
||||
boxPrice: 1500,
|
||||
price: 24100
|
||||
},
|
||||
{
|
||||
varId: 396,
|
||||
size: "40cm",
|
||||
pizzaPrice: 313,
|
||||
boxPrice: 18,
|
||||
price: 331
|
||||
pizzaPrice: 31300,
|
||||
boxPrice: 1800,
|
||||
price: 33100
|
||||
},
|
||||
{
|
||||
varId: 397,
|
||||
size: "50cm",
|
||||
pizzaPrice: 426,
|
||||
boxPrice: 25,
|
||||
price: 451
|
||||
pizzaPrice: 42600,
|
||||
boxPrice: 2500,
|
||||
price: 45100
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -1434,22 +1434,22 @@ const MOCK_SALAT_LIST = [
|
||||
{
|
||||
name: "Greek",
|
||||
ingredients: ["Salát", "Černé olivy", "Paprika mix", "Červená cibule", "Rajčata", "Okurka salátová", "Jogurtový dresing"],
|
||||
price: 174 + 13,
|
||||
price: (174 + 13) * 100,
|
||||
},
|
||||
{
|
||||
name: "Caesar",
|
||||
ingredients: ["Salát", "Rajčata", "Kuřecí maso", "Krutony", "Parmazán", "Caesar dresing", "Olivový olej"],
|
||||
price: 184 + 13,
|
||||
price: (184 + 13) * 100,
|
||||
},
|
||||
{
|
||||
name: "Šopský salát",
|
||||
ingredients: ["Salátová okurka", "Rajčata", "Paprika mix", "Červená cibule", "Balkánský sýr"],
|
||||
price: 164 + 13,
|
||||
price: (164 + 13) * 100,
|
||||
},
|
||||
{
|
||||
name: "Těstovinový salát",
|
||||
ingredients: ["Penne", "Okurka", "Rajčata", "Paprika mix", "Kuřecí maso", "Jogurtový dresing"],
|
||||
price: 184 + 13,
|
||||
price: (184 + 13) * 100,
|
||||
},
|
||||
]
|
||||
|
||||
|
||||
+1
-1
@@ -342,7 +342,7 @@ export async function finishPizzaDelivery(login: string, bankAccount?: string, b
|
||||
let message = order.pizzaList!.map(item =>
|
||||
item.category === 'salat' ? `Salát ${item.name}` : `Pizza ${item.name} (${item.size})`
|
||||
).join(', ');
|
||||
await generateQr(order.customer, bankAccount, bankAccountHolder, order.totalPrice, message, id);
|
||||
await generateQr(order.customer, bankAccount, bankAccountHolder, order.totalPrice / 100, message, id);
|
||||
order.hasQr = true;
|
||||
// Uložíme nevyřízený QR kód pro persistentní zobrazení
|
||||
await addPendingQr(order.customer, {
|
||||
|
||||
@@ -69,7 +69,7 @@ router.post("/updateMember", async (req: Request, res, next) => {
|
||||
if (!targetLogin) return res.status(400).json({ error: 'Nebyl předán login uživatele' });
|
||||
const patch: Record<string, any> = {};
|
||||
if (amount !== undefined) {
|
||||
if (typeof amount !== 'number' || !Number.isFinite(amount) || amount < 0) {
|
||||
if (!Number.isInteger(amount) || amount < 0) {
|
||||
return res.status(400).json({ error: 'Neplatná částka' });
|
||||
}
|
||||
patch.amount = amount;
|
||||
@@ -83,7 +83,7 @@ router.post("/updateMember", async (req: Request, res, next) => {
|
||||
patch.surchargeText = surchargeText;
|
||||
}
|
||||
if (surchargeAmount !== undefined) {
|
||||
if (typeof surchargeAmount !== 'number' || !Number.isFinite(surchargeAmount) || surchargeAmount < 0) {
|
||||
if (!Number.isInteger(surchargeAmount) || surchargeAmount < 0) {
|
||||
return res.status(400).json({ error: 'Neplatná výše příplatku' });
|
||||
}
|
||||
patch.surchargeAmount = surchargeAmount;
|
||||
@@ -113,19 +113,19 @@ router.post("/updateFees", async (req: Request, res, next) => {
|
||||
const login = getLogin(parseToken(req));
|
||||
const { id, fees, shipping, tip, discountType, discountValue } = req.body ?? {};
|
||||
if (!id) return res.status(400).json({ error: 'Nebylo předáno ID skupiny' });
|
||||
if (fees !== undefined && (typeof fees !== 'number' || !Number.isFinite(fees) || fees < 0)) {
|
||||
if (fees !== undefined && (!Number.isInteger(fees) || fees < 0)) {
|
||||
return res.status(400).json({ error: 'Neplatná výše poplatků' });
|
||||
}
|
||||
if (shipping !== undefined && (typeof shipping !== 'number' || !Number.isFinite(shipping) || shipping < 0)) {
|
||||
if (shipping !== undefined && (!Number.isInteger(shipping) || shipping < 0)) {
|
||||
return res.status(400).json({ error: 'Neplatná výše dopravy' });
|
||||
}
|
||||
if (tip !== undefined && (typeof tip !== 'number' || !Number.isFinite(tip) || tip < 0)) {
|
||||
if (tip !== undefined && (!Number.isInteger(tip) || tip < 0)) {
|
||||
return res.status(400).json({ error: 'Neplatná výše spropitného' });
|
||||
}
|
||||
if (discountType !== undefined && discountType !== '' && !['percent', 'fixed'].includes(discountType)) {
|
||||
return res.status(400).json({ error: 'Neplatný typ slevy' });
|
||||
}
|
||||
if (discountValue !== undefined && (typeof discountValue !== 'number' || !Number.isFinite(discountValue) || discountValue < 0)) {
|
||||
if (discountValue !== undefined && (!Number.isInteger(discountValue) || discountValue < 0)) {
|
||||
return res.status(400).json({ error: 'Neplatná výše slevy' });
|
||||
}
|
||||
try {
|
||||
|
||||
@@ -36,18 +36,13 @@ router.post("/generate", async (req: Request<{}, any, GenerateQrData["body"]>, r
|
||||
if (!recipient.purpose || recipient.purpose.trim().length === 0) {
|
||||
return res.status(400).json({ error: `Příjemce ${recipient.login} nemá vyplněný účel platby` });
|
||||
}
|
||||
if (typeof recipient.amount !== 'number' || recipient.amount <= 0) {
|
||||
if (!Number.isInteger(recipient.amount) || recipient.amount <= 0) {
|
||||
return res.status(400).json({ error: `Příjemce ${recipient.login} má neplatnou částku` });
|
||||
}
|
||||
// Validace max 2 desetinná místa
|
||||
const amountStr = recipient.amount.toString();
|
||||
if (amountStr.includes('.') && amountStr.split('.')[1].length > 2) {
|
||||
return res.status(400).json({ error: `Částka pro ${recipient.login} má více než 2 desetinná místa` });
|
||||
}
|
||||
|
||||
// Vygenerovat QR kód
|
||||
const id = crypto.randomUUID();
|
||||
await generateQr(recipient.login, bankAccount, bankAccountHolder, recipient.amount, recipient.purpose, id);
|
||||
await generateQr(recipient.login, bankAccount, bankAccountHolder, recipient.amount / 100, recipient.purpose, id);
|
||||
|
||||
// Uložit jako nevyřízený QR kód a okamžitě doručit příjemci
|
||||
const pendingQr = {
|
||||
|
||||
@@ -31,8 +31,8 @@ test('saláty mají name a ingredients', async () => {
|
||||
|
||||
test('cena salátu zahrnuje pevný příplatek 13 Kč za obal', async () => {
|
||||
const salaty = await downloadSalaty(false);
|
||||
// Caesar sticker price = 129, box = 13
|
||||
expect(salaty[0].price).toBe(129 + 13);
|
||||
// Řecký sticker price = 119, box = 13
|
||||
expect(salaty[1].price).toBe(119 + 13);
|
||||
// Caesar sticker price = 129, box = 13 → (129 + 13) * 100 haléřů
|
||||
expect(salaty[0].price).toBe((129 + 13) * 100);
|
||||
// Řecký sticker price = 119, box = 13 → (119 + 13) * 100 haléřů
|
||||
expect(salaty[1].price).toBe((119 + 13) * 100);
|
||||
});
|
||||
|
||||
@@ -28,8 +28,8 @@ beforeEach(() => {
|
||||
|
||||
const VALID_BODY = {
|
||||
recipients: [
|
||||
{ login: 'uzivatel1', purpose: 'Pizza Margherita', amount: 149 },
|
||||
{ login: 'uzivatel2', purpose: 'Pizza Diavola', amount: 179 },
|
||||
{ login: 'uzivatel1', purpose: 'Pizza Margherita', amount: 14900 },
|
||||
{ login: 'uzivatel2', purpose: 'Pizza Diavola', amount: 17900 },
|
||||
],
|
||||
bankAccount: '19-2000145399/0800',
|
||||
bankAccountHolder: 'Jan Novák',
|
||||
@@ -76,17 +76,17 @@ test('POST /generate vrátí 400 pro zápornou částku', async () => {
|
||||
expect(res.body.error).toContain('částku');
|
||||
});
|
||||
|
||||
test('POST /generate vrátí 400 pro částku s více než 2 desetinnými místy', async () => {
|
||||
test('POST /generate vrátí 400 pro necelou částku', async () => {
|
||||
const body = {
|
||||
...VALID_BODY,
|
||||
recipients: [{ login: 'uzivatel1', purpose: 'Pizza', amount: 149.999 }],
|
||||
recipients: [{ login: 'uzivatel1', purpose: 'Pizza', amount: 149.5 }],
|
||||
};
|
||||
const res = await request(buildApp())
|
||||
.post('/api/qr/generate')
|
||||
.set('Authorization', TOKEN)
|
||||
.send(body);
|
||||
expect(res.status).toBe(400);
|
||||
expect(res.body.error).toContain('desetinná');
|
||||
expect(res.body.error).toContain('částku');
|
||||
});
|
||||
|
||||
test('POST /generate vrátí 400 pro příjemce bez login', async () => {
|
||||
|
||||
Reference in New Issue
Block a user