/** Výčtový typ pro restaurace, pro které umíme získat a parsovat obědové menu. */ export enum Restaurants { SLADOVNICKA = 'sladovnicka', // UMOTLIKU = 'uMotliku', TECHTOWER = 'techTower', ZASTAVKAUMICHALA = 'zastavkaUmichala', } export type FoodChoices = { trusted: boolean, options: number[], departureTime?: string, note?: string, } // TODO okomentovat / rozdělit export type Choices = { [location in LocationKey]?: { [login: string]: FoodChoices } } /** Velikost konkrétní pizzy */ export type PizzaSize = { varId: number, // unikátní ID varianty pizzy size: string, // velikost pizzy, např. "30cm" pizzaPrice: number, // cena samotné pizzy boxPrice: number, // cena krabice price: number, // celková cena (pizza + krabice) } /** Jedna konkrétní pizza */ export type Pizza = { name: string, // název pizzy ingredients: string[], // seznam ingrediencí sizes: PizzaSize[], // dostupné velikosti pizzy } /** Objednávka jedné konkrétní pizzy */ export type PizzaOrder = { varId: number, // unikátní ID varianty pizzy name: string, // název pizzy size: string, // velikost pizzy jako string (30cm) price: number, // cena pizzy v Kč, včetně krabice } /** Celková objednávka jednoho člověka */ export type Order = { customer: string, // jméno objednatele pizzaList: PizzaOrder[], // seznam objednaných pizz fee?: { text?: string, price: number }, // příplatek (např. za extra ingredience) totalPrice: number, // celková cena všech objednaných pizz, krabic a příplatků hasQr?: boolean, // true, pokud je k objednávce vygenerován QR kód pro platbu note?: string, // volitelná uživatelská poznámka k objednávce } /** Stav pizza dne */ export enum PizzaDayState { NOT_CREATED, // Pizza day nebyl založen CREATED, // Pizza day je založen LOCKED, // Objednávky uzamčeny ORDERED, // Pizzy objednány DELIVERED // Pizzy doručeny } /** Informace o pizza day pro dnešní den */ interface PizzaDay { state: PizzaDayState, // stav pizza dne creator: string, // jméno zakladatele orders: Order[], // seznam objednávek jednotlivých lidí } /** Týdenní menu jednotlivých restaurací. */ export type WeekMenu = { [dayIndex: number]: { [restaurant in Restaurants]?: DayMenu } } /** Data vztahující se k jednomu konkrétnímu dni. */ export type DayData = { date: string, // datum dne isWeekend: boolean, // příznak, zda je datum víkend weekIndex: number, // index dne v týdnu (0-6) choices: Choices, // seznam voleb uživatelů menus?: { [restaurant in Restaurants]?: DayMenu }, // menu jednotlivých restaurací pizzaDay?: PizzaDay, // pizza day pro dnešní den, pokud existuje pizzaList?: Pizza[], // seznam dostupných pizz pro dnešní den pizzaListLastUpdate?: Date, // datum a čas poslední aktualizace pizz } /** Veškerá data pro zobrazení na klientovi. */ export type ClientData = DayData & { todayWeekIndex?: number, // index dnešního dne v týdnu (0-6) } /** Nabídka jídel jednoho podniku pro jeden konkrétní den. */ export type DayMenu = { lastUpdate: number, // UNIX timestamp poslední aktualizace menu closed: boolean, // příznak, zda je daný podnik v tento den zavřený food: Food[], // seznam jídel v menu } /** Jídlo z obědového menu restaurace. */ export type Food = { amount?: string, // množství standardní porce, např. 0,33l nebo 150g name: string, // název/popis jídla price: string, // cena ve formátu '135 Kč' isSoup: boolean, // příznak, zda se jedná o polévku } // TODO tohle je dost špatné pojmenování, vzhledem k tomu co to obsahuje export enum Locations { SLADOVNICKA = 'Sladovnická', // UMOTLIKU = 'U Motlíků', TECHTOWER = 'TechTower', ZASTAVKAUMICHALA = 'Zastávka u Michala', SPSE = 'SPŠE', PIZZA = 'Pizza day', OBJEDNAVAM = 'Budu objednávat', NEOBEDVAM = 'Mám vlastní/neobědvám', ROZHODUJI = 'Rozhoduji se', } // TODO totéž export type LocationKey = keyof typeof Locations; export enum UdalostEnum { ZAHAJENA_PIZZA = "Zahájen pizza day", OBJEDNANA_PIZZA = "Objednána pizza", JDEME_OBED = "Jdeme oběd", } export type NotififaceInput = { udalost: UdalostEnum, user: string, } export type NotifikaceData = { input: NotififaceInput, gotify?: boolean, teams?: boolean, ntfy?: boolean, } export type GotifyServer = { server: string; api_keys: string[]; } /** Čas preferovaného odchodu na oběd. */ export enum DepartureTime { T10_00 = "10:00", T10_15 = "10:15", T10_30 = "10:30", T10_45 = "10:45", T11_00 = "11:00", T11_15 = "11:15", T11_30 = "11:30", T11_45 = "11:45", T12_00 = "12:00", T12_15 = "12:15", T12_30 = "12:30", T12_45 = "12:45", T13_00 = "13:00", } export enum FeatureRequest { CUSTOM_QR = "Ruční generování QR kódů mimo Pizza day (např. při objednávání)", FAVORITES = "Možnost označovat si jídla jako oblíbená (taková jídla by se uživateli následně zvýrazňovala)", SINGLE_PAYMENT = "Možnost úhrady v podniku za všechny jednou osobou a následné generování QR ostatním", NO_WEEKENDS = "Zrušení \"užívejte víkend\", místo toho umožnit zpětně náhled na uplynulý týden", QR_FOREVER = "Umožnění zobrazení vygenerovaného QR kódu i po následující dny (dokud ho uživatel ručně \"nezavře\", např. tlačítkem \"Zaplatil jsem\")", PIZZA_PICTURES = "Zobrazování náhledů (fotografií) pizz v rámci Pizza day", STATISTICS = "Statistiky (nejoblíbenější podnik, nejpopulárnější jídla, nejobjednávanější pizzy, nejčastější uživatelé, ...)", RESPONSIVITY = "Vylepšení responzivního designu", SECURITY = "Zvýšení zabezpečení aplikace", SAFETY = "Zvýšená ochrana proti chybám uživatele (potvrzovací dialogy, překliky, ...)", UI = "Celkové vylepšení UI/UX", DEVELOPMENT = "Zlepšení dokumentace/postupů pro ostatní vývojáře" } export type EasterEgg = { path: string; url: string; startOffset: number; endOffset: number; duration: number; width?: string; zIndex?: number; position?: "absolute"; animationName?: string; animationDuration?: string; animationTimingFunction?: string; } // TODO aktuálně se k ničemu nepoužívá export type AnimationPosition = { left?: string, startLeft?: string, "--start-left"?: string, right?: string, startRight?: string, "--start-right"?: string, top?: string, startTop?: string, "--start-top"?: string, bottom?: string, startBottom?: string, "--start-bottom"?: string, endLeft?: string, "--end-left"?: string, endRight?: string, "--end-right"?: string, endTop?: string, "--end-top"?: string, endBottom?: string, "--end-bottom"?: string, rotate?: string, }