From e0353bb6f954b5688951abfbc305a7476864a1ff Mon Sep 17 00:00:00 2001 From: Marco Pedone Date: Tue, 14 Apr 2026 15:04:59 +0200 Subject: [PATCH] feat: enhance email processing with dynamic filenames and additional email notifications --- .../src/server/api/routers/comunicazioni.ts | 56 +++++++++++++++++-- 1 file changed, 51 insertions(+), 5 deletions(-) diff --git a/apps/infoalloggi/src/server/api/routers/comunicazioni.ts b/apps/infoalloggi/src/server/api/routers/comunicazioni.ts index 9f7ac7a..b7639e0 100644 --- a/apps/infoalloggi/src/server/api/routers/comunicazioni.ts +++ b/apps/infoalloggi/src/server/api/routers/comunicazioni.ts @@ -1,4 +1,5 @@ import { TRPCError } from "@trpc/server"; +import { format } from "date-fns"; import { z } from "zod/v4"; import type { EmailsIdEmail } from "~/schemas/public/Emails"; import type { EventQueueUpdate } from "~/schemas/public/EventQueue"; @@ -109,9 +110,9 @@ export const comunicazioniRouter = createTRPCRouter({ try { const ordine = await db .selectFrom("ordini") - .selectAll() + .selectAll("ordini") .innerJoin("users", "users.id", "ordini.userid") - .select(["users.email"]) + .select(["users.email", "users.username"]) .innerJoin("prezziario", "prezziario.idprezziario", "ordini.packid") .select(["prezziario.testo_condizioni"]) .where("ordine_id", "=", input.ordineId) @@ -119,6 +120,10 @@ export const comunicazioniRouter = createTRPCRouter({ throw new Error(`Ordine not found - ordineId: ${input.ordineId}`); }); + const condizioniFilename = `condizioni_contrattuali_${ordine.created_at.toISOString()}.pdf`; + const ricevutaFilename = `ricevuta_cortesia_${ordine.username.replace(/\s+/g, "-")}-${format(ordine.created_at, "dd-MM-yyyy")}.pdf`; + const lock_expires = new Date(Date.now() + 3000); // Lock for 30 sec + await addEventToQueue({ data: { tipo: "email", @@ -131,7 +136,7 @@ export const comunicazioniRouter = createTRPCRouter({ to: ordine.email, attachments: [ { - filename: `condizioni_contrattuali_${ordine.created_at.toISOString()}.pdf`, + filename: condizioniFilename, generate: { type: "condizioni", stringId: (ordine.testo_condizioni || @@ -141,7 +146,7 @@ export const comunicazioniRouter = createTRPCRouter({ contentType: "application/pdf", }, { - filename: `ricevuta_cortesia_${ordine.ordine_id}.pdf`, + filename: ricevutaFilename, generate: { type: "ricevuta_cortesia", @@ -155,7 +160,48 @@ export const comunicazioniRouter = createTRPCRouter({ userId: ordine.userid, }, }, - lock_expires: new Date(Date.now() + 3000), // Lock for 30 sec + lock_expires, + }); + await addEventToQueue({ + data: { + tipo: "email", + data: { + template: { + mailType: "generic", + props: { + title: "Nuovo pagamento ricevuto", + testo: `È stato ricevuto un nuovo pagamento.`, + }, + }, + mail: { + subject: "Ric pagamento", + to: "web@infoalloggi.it", + attachments: [ + { + filename: ricevutaFilename, + + generate: { + type: "ricevuta_cortesia", + ordineId: ordine.ordine_id, + }, + encoding: "base64", + contentType: "application/pdf", + }, + { + filename: condizioniFilename, + generate: { + type: "condizioni", + stringId: (ordine.testo_condizioni || + CONDIZIONI_DEFAULT) as TestiEStringheStingaId, + }, + encoding: "base64", + contentType: "application/pdf", + }, + ], + }, + }, + }, + lock_expires, }); } catch (e) { throw new TRPCError({