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
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:
@@ -2,7 +2,7 @@ import { useContext, useEffect, useRef, useState } from 'react';
|
|||||||
import { Alert, Badge, Button, Card, Form, Modal, Table } from 'react-bootstrap';
|
import { Alert, Badge, Button, Card, Form, Modal, Table } from 'react-bootstrap';
|
||||||
import { FontAwesomeIcon } from '@fortawesome/react-fontawesome';
|
import { FontAwesomeIcon } from '@fortawesome/react-fontawesome';
|
||||||
import { faTrashCan } from '@fortawesome/free-regular-svg-icons';
|
import { faTrashCan } from '@fortawesome/free-regular-svg-icons';
|
||||||
import { faBasketShopping, faGear, faLock, faLockOpen, faSearch, faUserPlus } from '@fortawesome/free-solid-svg-icons';
|
import { faBasketShopping, faCircleCheck, faGear, faLock, faLockOpen, faSearch, faUserPlus } from '@fortawesome/free-solid-svg-icons';
|
||||||
import {
|
import {
|
||||||
ClientData, GroupState, MealSlot, OrderGroup, OrderGroupMember,
|
ClientData, GroupState, MealSlot, OrderGroup, OrderGroupMember,
|
||||||
getData, createGroup, deleteGroup, addGroupMember, removeGroupMember, updateGroupMember, setGroupState, updateGroupTimes,
|
getData, createGroup, deleteGroup, addGroupMember, removeGroupMember, updateGroupMember, setGroupState, updateGroupTimes,
|
||||||
@@ -306,6 +306,9 @@ export default function OrderGroupsPage() {
|
|||||||
{memberLogin === group.creatorLogin && (
|
{memberLogin === group.creatorLogin && (
|
||||||
<FontAwesomeIcon icon={faBasketShopping} className="ms-1 buyer-icon" title="Zakladatel / objednávající" />
|
<FontAwesomeIcon icon={faBasketShopping} className="ms-1 buyer-icon" title="Zakladatel / objednávající" />
|
||||||
)}
|
)}
|
||||||
|
{member.paid && (
|
||||||
|
<FontAwesomeIcon icon={faCircleCheck} className="ms-1 text-success" title="Zaplaceno" />
|
||||||
|
)}
|
||||||
</span>
|
</span>
|
||||||
</td>
|
</td>
|
||||||
<td>
|
<td>
|
||||||
|
|||||||
@@ -131,11 +131,22 @@ export async function setGroupState(login: string, groupId: string, newState: Gr
|
|||||||
await removePendingQrsByGroupId(memberLogins, groupId);
|
await removePendingQrsByGroupId(memberLogins, groupId);
|
||||||
group.orderedAt = undefined;
|
group.orderedAt = undefined;
|
||||||
group.deliveryAt = undefined;
|
group.deliveryAt = undefined;
|
||||||
|
for (const ml of memberLogins) {
|
||||||
|
group.members[ml] = { ...group.members[ml], paid: undefined };
|
||||||
|
}
|
||||||
}
|
}
|
||||||
group.state = newState;
|
group.state = newState;
|
||||||
return saveExtraData(data, date);
|
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> {
|
export async function updateGroupTimes(login: string, groupId: string, orderedAt?: string, deliveryAt?: string, date?: Date): Promise<ClientData> {
|
||||||
const data = await getExtraData(date);
|
const data = await getExtraData(date);
|
||||||
const group = findGroup(data, groupId);
|
const group = findGroup(data, groupId);
|
||||||
|
|||||||
+4
-1
@@ -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).
|
* 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 key = getPendingQrKey(login);
|
||||||
const existing = await storage.getData<PendingQr[]>(key) ?? [];
|
const existing = await storage.getData<PendingQr[]>(key) ?? [];
|
||||||
|
const dismissed = existing.find(qr => qr.id === id);
|
||||||
const filtered = existing.filter(qr => qr.id !== id);
|
const filtered = existing.filter(qr => qr.id !== id);
|
||||||
await storage.setData(key, filtered);
|
await storage.setData(key, filtered);
|
||||||
|
return dismissed;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
import express, { Request } from "express";
|
import express, { Request } from "express";
|
||||||
import { getLogin } from "../auth";
|
import { getLogin } from "../auth";
|
||||||
import { createPizzaDay, deletePizzaDay, getPizzaList, getSalatList, addPizzaOrder, addSalatOrder, removePizzaOrder, lockPizzaDay, unlockPizzaDay, finishPizzaOrder, finishPizzaDelivery, updatePizzaDayNote, updatePizzaFee, dismissPendingQr } from "../pizza";
|
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 { parseToken } from "../utils";
|
||||||
import { getWebsocket } from "../websocket";
|
import { getWebsocket } from "../websocket";
|
||||||
import { AddPizzaData, DismissQrData, FinishDeliveryData, RemovePizzaData, UpdatePizzaDayNoteData, UpdatePizzaFeeData } from "../../../types";
|
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" });
|
return res.status(400).json({ error: "Nebyl předán identifikátor QR kódu" });
|
||||||
}
|
}
|
||||||
try {
|
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({});
|
res.status(200).json({});
|
||||||
} catch (e: any) { next(e) }
|
} catch (e: any) { next(e) }
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -715,6 +715,9 @@ OrderGroupMember:
|
|||||||
surchargeAmount:
|
surchargeAmount:
|
||||||
description: Výše příplatku v Kč
|
description: Výše příplatku v Kč
|
||||||
type: number
|
type: number
|
||||||
|
paid:
|
||||||
|
description: Příznak, zda člen uhradil svůj podíl objednávky
|
||||||
|
type: boolean
|
||||||
|
|
||||||
OrderGroup:
|
OrderGroup:
|
||||||
description: Skupina uživatelů objednávajících z jednoho místa
|
description: Skupina uživatelů objednávajících z jednoho místa
|
||||||
|
|||||||
Reference in New Issue
Block a user