feat: enhance email processing with dynamic filenames and additional email notifications

This commit is contained in:
Marco Pedone 2026-04-14 15:04:59 +02:00
parent 453183ce3b
commit e0353bb6f9

View file

@ -1,4 +1,5 @@
import { TRPCError } from "@trpc/server"; import { TRPCError } from "@trpc/server";
import { format } from "date-fns";
import { z } from "zod/v4"; import { z } from "zod/v4";
import type { EmailsIdEmail } from "~/schemas/public/Emails"; import type { EmailsIdEmail } from "~/schemas/public/Emails";
import type { EventQueueUpdate } from "~/schemas/public/EventQueue"; import type { EventQueueUpdate } from "~/schemas/public/EventQueue";
@ -109,9 +110,9 @@ export const comunicazioniRouter = createTRPCRouter({
try { try {
const ordine = await db const ordine = await db
.selectFrom("ordini") .selectFrom("ordini")
.selectAll() .selectAll("ordini")
.innerJoin("users", "users.id", "ordini.userid") .innerJoin("users", "users.id", "ordini.userid")
.select(["users.email"]) .select(["users.email", "users.username"])
.innerJoin("prezziario", "prezziario.idprezziario", "ordini.packid") .innerJoin("prezziario", "prezziario.idprezziario", "ordini.packid")
.select(["prezziario.testo_condizioni"]) .select(["prezziario.testo_condizioni"])
.where("ordine_id", "=", input.ordineId) .where("ordine_id", "=", input.ordineId)
@ -119,6 +120,10 @@ export const comunicazioniRouter = createTRPCRouter({
throw new Error(`Ordine not found - ordineId: ${input.ordineId}`); 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({ await addEventToQueue({
data: { data: {
tipo: "email", tipo: "email",
@ -131,7 +136,7 @@ export const comunicazioniRouter = createTRPCRouter({
to: ordine.email, to: ordine.email,
attachments: [ attachments: [
{ {
filename: `condizioni_contrattuali_${ordine.created_at.toISOString()}.pdf`, filename: condizioniFilename,
generate: { generate: {
type: "condizioni", type: "condizioni",
stringId: (ordine.testo_condizioni || stringId: (ordine.testo_condizioni ||
@ -141,7 +146,7 @@ export const comunicazioniRouter = createTRPCRouter({
contentType: "application/pdf", contentType: "application/pdf",
}, },
{ {
filename: `ricevuta_cortesia_${ordine.ordine_id}.pdf`, filename: ricevutaFilename,
generate: { generate: {
type: "ricevuta_cortesia", type: "ricevuta_cortesia",
@ -155,7 +160,48 @@ export const comunicazioniRouter = createTRPCRouter({
userId: ordine.userid, 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) { } catch (e) {
throw new TRPCError({ throw new TRPCError({