feat: zadávání cen
CI / Generate TypeScript types (push) Successful in 10s
CI / Server unit tests (push) Successful in 28s
CI / Build server (push) Successful in 37s
CI / Build client (push) Successful in 45s
CI / Playwright E2E tests (push) Successful in 2m15s
CI / Build and push Docker image (push) Successful in 45s
CI / Notify (push) Successful in 2s
CI / Generate TypeScript types (push) Successful in 10s
CI / Server unit tests (push) Successful in 28s
CI / Build server (push) Successful in 37s
CI / Build client (push) Successful in 45s
CI / Playwright E2E tests (push) Successful in 2m15s
CI / Build and push Docker image (push) Successful in 45s
CI / Notify (push) Successful in 2s
This commit is contained in:
1 parent
96dc3f0053
commit
9a3987a2fa
13 files changed
+244
-11
No files matched your search
@@ -590,6 +590,37 @@ export async function updateNote(login: string, trusted: boolean, note?: string,
|
||||
});
|
||||
}
|
||||
|
||||
/** Volby, u kterých nemá smysl zadávat cenu ručně — cena je dána objednávkou nebo se neobědvá. */
|
||||
export const CHOICES_WITHOUT_PRICE: LunchChoice[] = [LunchChoice.OBJEDNAVAM, LunchChoice.PIZZA, LunchChoice.NEOBEDVAM, LunchChoice.ROZHODUJI];
|
||||
|
||||
/**
|
||||
* Nastaví nebo odstraní cenu oběda u aktuálně vybrané možnosti uživatele.
|
||||
*
|
||||
* @param login login uživatele
|
||||
* @param trusted příznak, zda se jedná o ověřeného uživatele
|
||||
* @param price cena v haléřích, při nevyplnění se cena odstraní
|
||||
* @param date datum, ke kterému se volba vztahuje
|
||||
*/
|
||||
export async function updatePrice(login: string, trusted: boolean, price?: number, date?: Date) {
|
||||
if (price != null && (!Number.isInteger(price) || price < 0)) {
|
||||
throw new Error(`Neplatná cena: ${price}`);
|
||||
}
|
||||
const usedDate = date ?? getToday();
|
||||
const snapshot = await getClientData(usedDate);
|
||||
validateTrusted(snapshot, login, trusted);
|
||||
return storage.updateData<ClientData>(getDataKey(usedDate), (current) => {
|
||||
const data = current ?? getEmptyData(date);
|
||||
const userEntry = Object.entries(data.choices ?? {}).find(entry => entry[1][login] != null);
|
||||
if (!userEntry) throw new Error("Cenu lze zadat jen k vybrané volbě");
|
||||
if (CHOICES_WITHOUT_PRICE.includes(userEntry[0] as LunchChoice)) {
|
||||
throw new Error("K této volbě nelze zadat cenu");
|
||||
}
|
||||
if (price == null) delete userEntry[1][login].price;
|
||||
else userEntry[1][login].price = price;
|
||||
return data;
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* Aktualizuje preferovaný čas odchodu strávníka.
|
||||
*
|
||||
|
||||
Reference in new issue
Block a user