From 5462fcf944ac3436b0c54f83150882df1bfce62c Mon Sep 17 00:00:00 2001 From: BOHA Date: Tue, 9 Jun 2026 21:50:05 +0200 Subject: [PATCH] =?UTF-8?q?feat(orders):=20PDF=20footer=20=3D=20issuer=20n?= =?UTF-8?q?ame+email,=20'Zobrazit=20objedn=C3=A1vku'=20button,=20per-curre?= =?UTF-8?q?ncy=20list=20totals?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Issued-order PDF: drop the Vystavil/Schválil signature row; footer now shows 'Vystavil: ' + 'E-mail: ' from the logged-in user (authData). - IssuedOrderDetail PDF button 'Export PDF' -> 'Zobrazit objednávku' (already opens inline like invoices' 'Zobrazit fakturu'). - New /orders/stats + /issued-orders/stats endpoints sum order total (incl VAT) per currency across the active filter; rendered as 'Celkem: …' beneath both the received and issued lists. formatMultiCurrency lifted to a shared util. Co-Authored-By: Claude Opus 4.8 (1M context) --- src/__tests__/issued-orders.test.ts | 25 ++- src/__tests__/order-totals.test.ts | 245 +++++++++++++++++++++++++ src/admin/lib/queries/issued-orders.ts | 27 +++ src/admin/lib/queries/orders.ts | 27 +++ src/admin/pages/Invoices.tsx | 6 +- src/admin/pages/IssuedOrderDetail.tsx | 2 +- src/admin/pages/IssuedOrders.tsx | 40 +++- src/admin/pages/ReceivedOrders.tsx | 39 +++- src/admin/utils/formatters.ts | 14 ++ src/routes/admin/issued-orders-pdf.ts | 44 ++--- src/routes/admin/issued-orders.ts | 20 ++ src/routes/admin/orders.ts | 20 ++ src/services/issued-orders.service.ts | 114 ++++++++---- src/services/orders.service.ts | 88 +++++++-- 14 files changed, 627 insertions(+), 84 deletions(-) create mode 100644 src/__tests__/order-totals.test.ts diff --git a/src/__tests__/issued-orders.test.ts b/src/__tests__/issued-orders.test.ts index becab93..2034973 100644 --- a/src/__tests__/issued-orders.test.ts +++ b/src/__tests__/issued-orders.test.ts @@ -276,6 +276,8 @@ describe("renderIssuedOrderHtml", () => { }, ]; + const issuer = { name: "Jan Novák", email: "jan.novak@firma.cz" }; + it("renders the PO number, items, and both party names (PO direction)", () => { const html = renderIssuedOrderHtml( order, @@ -283,6 +285,7 @@ describe("renderIssuedOrderHtml", () => { { name: "Dodavatel s.r.o." }, { company_name: "Naše firma" }, "cs", + issuer, ); expect(html).toContain("26720001"); expect(html).toContain("Materiál"); @@ -297,8 +300,28 @@ describe("renderIssuedOrderHtml", () => { }); it("strips script tags from notes", () => { - const html = renderIssuedOrderHtml(order, items, null, null, "cs"); + const html = renderIssuedOrderHtml(order, items, null, null, "cs", issuer); expect(html).not.toContain("