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

This commit is contained in:
Ondřej Anděl committed 2026-10-21 09:42:04 +02:00
1 parent 96dc3f0053
commit 9a3987a2fa
13 files changed
+244 -11

No files matched your search

+31
View File
@@ -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.
*