diff --git a/server/src/routes/pizzaDayRoutes.ts b/server/src/routes/pizzaDayRoutes.ts index 435dfe2..6e2c909 100644 --- a/server/src/routes/pizzaDayRoutes.ts +++ b/server/src/routes/pizzaDayRoutes.ts @@ -135,7 +135,10 @@ router.post("/dismissQr", async (req: Request<{}, any, DismissQrData["body"]>, r try { const dismissed = await dismissPendingQr(login, req.body.id); if (dismissed?.groupId) { - const updatedExtra = await markGroupMemberPaid(login, dismissed.groupId); + // Platbu zapisujeme ke dni, ke kterému se QR kód vztahuje, ne k dnešnímu dni – + // jinak by se při potvrzení platby jiný den příznak zapsal do špatných dat (a zelené zatržítko by se neobjevilo). + const orderDate = new Date(`${dismissed.date}T00:00:00`); + const updatedExtra = await markGroupMemberPaid(login, dismissed.groupId, orderDate); if (updatedExtra) getWebsocket().emit("message", updatedExtra); } res.status(200).json({}); diff --git a/server/src/tests/groups.test.ts b/server/src/tests/groups.test.ts index fe68e1e..ed02def 100644 --- a/server/src/tests/groups.test.ts +++ b/server/src/tests/groups.test.ts @@ -1,6 +1,6 @@ import { resetMemoryStorage } from '../storage/memory'; import { getStores, addStore } from '../stores'; -import { createGroup, deleteGroup, addGroupMember, removeGroupMember, updateGroupMember, setGroupState, setGroupBoltTracking } from '../groups'; +import { createGroup, deleteGroup, addGroupMember, removeGroupMember, updateGroupMember, setGroupState, setGroupBoltTracking, markGroupMemberPaid } from '../groups'; import { GroupState } from '../../../types/gen/types.gen'; const CREATOR = 'tomas'; @@ -202,3 +202,36 @@ describe('setGroupState', () => { expect(d.groups![0].boltTrackingToken).toBeUndefined(); }); }); + +describe('markGroupMemberPaid', () => { + test('označí člena jako zaplaceného pro daný den', async () => { + const d = await createGroup(CREATOR, STORE, TODAY); + const groupId = d.groups![0].id; + const result = await markGroupMemberPaid(CREATOR, groupId, TODAY); + expect(result).not.toBeNull(); + expect(result!.groups![0].members[CREATOR].paid).toBe(true); + }); + + test('vrátí null pro neexistující skupinu', async () => { + const result = await markGroupMemberPaid(CREATOR, 'nonexistent', TODAY); + expect(result).toBeNull(); + }); + + // Regrese: potvrzení platby jiný den, než vznikla objednávka, se musí zapsat + // ke dni objednávky – jinak se příznak ztratí a zelené zatržítko se nezobrazí. + test('zapíše platbu ke dni objednávky i při potvrzení jiný den', async () => { + const orderDay = new Date('2025-01-10'); + const d = await createGroup(CREATOR, STORE, orderDay); + const groupId = d.groups![0].id; + + // Uživatel potvrzuje platbu jiný den, ale předáváme datum objednávky. + const result = await markGroupMemberPaid(CREATOR, groupId, orderDay); + expect(result).not.toBeNull(); + expect(result!.groups![0].members[CREATOR].paid).toBe(true); + + // Skupina pod jiným dnem neexistuje – ověříme, že tam příznak omylem nevznikl. + const otherDay = new Date('2025-01-15'); + const onOtherDay = await markGroupMemberPaid(CREATOR, groupId, otherDay); + expect(onOtherDay).toBeNull(); + }); +});