feat: potvrzení o úhradě objednávky
CI / Generate TypeScript types (push) Successful in 9s
CI / Generate TypeScript types (pull_request) Successful in 9s
CI / Server unit tests (push) Successful in 21s
CI / Build client (push) Successful in 33s
CI / Server unit tests (pull_request) Successful in 20s
CI / Build server (pull_request) Successful in 35s
CI / Build client (pull_request) Successful in 47s
CI / Build server (push) Successful in 3m9s
CI / Playwright E2E tests (pull_request) Successful in 1m18s
CI / Build and push Docker image (pull_request) Has been skipped
CI / Notify (pull_request) Has been skipped
CI / Playwright E2E tests (push) Successful in 6m51s
CI / Build and push Docker image (push) Has been skipped
CI / Notify (push) Successful in 16s

This commit is contained in:
2026-05-07 09:09:47 +02:00
parent 5f03471541
commit 1efe2b8f7d
5 changed files with 28 additions and 3 deletions
+11
View File
@@ -131,11 +131,22 @@ export async function setGroupState(login: string, groupId: string, newState: Gr
await removePendingQrsByGroupId(memberLogins, groupId);
group.orderedAt = undefined;
group.deliveryAt = undefined;
for (const ml of memberLogins) {
group.members[ml] = { ...group.members[ml], paid: undefined };
}
}
group.state = newState;
return saveExtraData(data, date);
}
export async function markGroupMemberPaid(login: string, groupId: string, date?: Date): Promise<ClientData | null> {
const data = await getExtraData(date);
const group = findGroup(data, groupId);
if (!group || !group.members[login]) return null;
group.members[login] = { ...group.members[login], paid: true };
return saveExtraData(data, date);
}
export async function updateGroupTimes(login: string, groupId: string, orderedAt?: string, deliveryAt?: string, date?: Date): Promise<ClientData> {
const data = await getExtraData(date);
const group = findGroup(data, groupId);
+4 -1
View File
@@ -449,12 +449,15 @@ export async function getPendingQrs(login: string): Promise<PendingQr[]> {
/**
* Označí QR kód jako uhrazený (odstraní ho ze seznamu nevyřízených).
* Vrátí odstraněný QR kód, pokud byl nalezen.
*/
export async function dismissPendingQr(login: string, id: string): Promise<void> {
export async function dismissPendingQr(login: string, id: string): Promise<PendingQr | undefined> {
const key = getPendingQrKey(login);
const existing = await storage.getData<PendingQr[]>(key) ?? [];
const dismissed = existing.find(qr => qr.id === id);
const filtered = existing.filter(qr => qr.id !== id);
await storage.setData(key, filtered);
return dismissed;
}
/**
+6 -1
View File
@@ -1,6 +1,7 @@
import express, { Request } from "express";
import { getLogin } from "../auth";
import { createPizzaDay, deletePizzaDay, getPizzaList, getSalatList, addPizzaOrder, addSalatOrder, removePizzaOrder, lockPizzaDay, unlockPizzaDay, finishPizzaOrder, finishPizzaDelivery, updatePizzaDayNote, updatePizzaFee, dismissPendingQr } from "../pizza";
import { markGroupMemberPaid } from "../groups";
import { parseToken } from "../utils";
import { getWebsocket } from "../websocket";
import { AddPizzaData, DismissQrData, FinishDeliveryData, RemovePizzaData, UpdatePizzaDayNoteData, UpdatePizzaFeeData } from "../../../types";
@@ -132,7 +133,11 @@ router.post("/dismissQr", async (req: Request<{}, any, DismissQrData["body"]>, r
return res.status(400).json({ error: "Nebyl předán identifikátor QR kódu" });
}
try {
await dismissPendingQr(login, req.body.id);
const dismissed = await dismissPendingQr(login, req.body.id);
if (dismissed?.groupId) {
const updatedExtra = await markGroupMemberPaid(login, dismissed.groupId);
if (updatedExtra) getWebsocket().emit("message", updatedExtra);
}
res.status(200).json({});
} catch (e: any) { next(e) }
});