-
-
-
-
{data.packName}
-
Cod: “{data.packid}”
-
- {formatCurrency(data.amount_cent / 100)}{" "}
- {data.sconto > 0 && (
- (Sconto: {data.sconto}%)
- )}
-
-
{data.packDesc}
-
-
+
+
+
+ {data.packName}
+ Cod: “{data.packid}”
+
+
+
+ {formatCurrency(data.amount_cent / 100)}{" "}
+ {data.sconto > 0 && (
+ (Sconto: {data.sconto}%)
+ )}
+
+ {data.packDesc}
= ({
+ {saldoPreview && (
+
+
{saldoPreview.nome_it}
+
+
+ {formatCurrency(saldoPreview.prezzo_cent / 100)}
+
+
+ {formatCurrency(0)}
+
+
+
+ Il Saldo non è dovuto in questo momento, ma al termine della
+ ricerca.
+
+
+ Il saldo verrà aggiornato in base ai parametri del servizio.
+
+
+ )}
+
+
-
-
+
+
);
};
@@ -125,6 +157,7 @@ export const getServerSideProps = (async (context) => {
props: {
stripeDisabled: flag || false,
data: result.data,
+ saldoPreview: null,
},
};
}
@@ -147,10 +180,21 @@ export const getServerSideProps = (async (context) => {
console.error("Error preparing payment", result.message);
return redirectTo500;
}
+ let saldoPreview: Prezziario | null = null;
+ if (type === OrderTypeEnum.Acconto) {
+ const saldoResult = await helper.trpc.pagamenti.previewSaldo.fetch({
+ servizioId: parsedServizioId.data,
+ });
+ if (saldoResult.success) {
+ saldoPreview = saldoResult.pack;
+ }
+ }
+
return {
props: {
stripeDisabled: flag || false,
data: result.data,
+ saldoPreview,
},
};
}) satisfies GetServerSideProps
;
diff --git a/apps/infoalloggi/src/server/api/routers/pagamenti.ts b/apps/infoalloggi/src/server/api/routers/pagamenti.ts
index 2892f16..022a90e 100644
--- a/apps/infoalloggi/src/server/api/routers/pagamenti.ts
+++ b/apps/infoalloggi/src/server/api/routers/pagamenti.ts
@@ -6,6 +6,7 @@ import {
getPagamentoDataForCheckout,
type PreparedPaymentData,
preparePayment,
+ previewSaldo,
} from "~/server/controllers/pagamenti.controller";
import { db } from "~/server/db";
@@ -69,6 +70,15 @@ export const pagamentiRouter = createTRPCRouter({
servizioId: input.servizioId,
});
}),
+ previewSaldo: protectedProcedure
+ .input(
+ z.object({
+ servizioId: zServizioId,
+ }),
+ )
+ .query(async ({ input }) => {
+ return await previewSaldo(input.servizioId);
+ }),
preparePaymentRinnovi: protectedProcedure
.input(
z.object({
diff --git a/apps/infoalloggi/src/server/controllers/pagamenti.controller.ts b/apps/infoalloggi/src/server/controllers/pagamenti.controller.ts
index 87b5c7a..ecda41d 100644
--- a/apps/infoalloggi/src/server/controllers/pagamenti.controller.ts
+++ b/apps/infoalloggi/src/server/controllers/pagamenti.controller.ts
@@ -130,7 +130,11 @@ export const preparePayment = async (
}
if (!servizio.isOkSaldo) {
//find saldo pack based on servizio tipologia and permanenza/budget, if tipologia posizione
- const saldo = await SaldoSolver(servizio);
+ const saldo = await SaldoSolver({
+ tipologia: servizio.tipologia,
+ permanenza: servizio.permanenza,
+ budget: servizio.budget,
+ });
if (!saldo.success) {
return {
success: false,
@@ -592,3 +596,22 @@ export const getPacksPerServizio = async (
}),
};
};
+
+export const previewSaldo = async (
+ servizioId: ServizioServizioId,
+): Promise<{ success: false; message: string } | GetPackResult> => {
+ const servizio = await getServizioById(servizioId);
+ if (!servizio) {
+ return {
+ success: false,
+ message: "Servizio non trovato",
+ };
+ }
+ const saldo = await SaldoSolver({
+ tipologia: servizio.tipologia,
+ permanenza: servizio.permanenza,
+ budget: servizio.budget,
+ });
+
+ return saldo;
+};
diff --git a/apps/infoalloggi/src/server/controllers/servizio.controller.ts b/apps/infoalloggi/src/server/controllers/servizio.controller.ts
index bd3e91d..252a8e3 100644
--- a/apps/infoalloggi/src/server/controllers/servizio.controller.ts
+++ b/apps/infoalloggi/src/server/controllers/servizio.controller.ts
@@ -1394,6 +1394,8 @@ export const getOrdineRicevutaData = async ({
"ordini.sconto",
"ordini.created_at",
"ordini.paymentmethod",
+ "ordini.type",
+ "ordini.servizio_id",
])
.innerJoin("prezziario", "prezziario.idprezziario", "ordini.packid")
.select("prezziario.nome_it")
@@ -1427,6 +1429,30 @@ export const getOrdineRicevutaData = async ({
const parsedComune = parseDBComune(anagrafica.comune_residenza, comuni);
const parsedNazione = parseDBNazione(anagrafica.nazione_residenza, nazioni);
+ let previewSaldo: Prezziario | null = null;
+
+ if (data.type === OrderTypeEnum.Acconto && data.servizio_id) {
+ const servizio = await getServizioById(data.servizio_id);
+ if (servizio) {
+ const saldo = await SaldoSolver({
+ tipologia: servizio.tipologia,
+ permanenza: servizio.permanenza,
+ budget: servizio.budget,
+ });
+ if (saldo.success) {
+ previewSaldo = saldo.pack;
+ } else {
+ console.error(
+ `Errore nel calcolo del saldo per il servizio ${data.servizio_id}: ${saldo.message}, procedura getOrdineRicevutaData`,
+ );
+ }
+ } else {
+ console.error(
+ `Servizio non trovato per ordine ${ordineId} con servizio_id ${data.servizio_id}, procedura getOrdineRicevutaData`,
+ );
+ }
+ }
+
return {
clienteIndirizzo: `${anagrafica.via_residenza} ${anagrafica.civico_residenza}\n${parsedComune?.nome} (${anagrafica.provincia_residenza}) ${anagrafica.cap_residenza}\n${parsedNazione?.nome}`,
clienteNome: anagrafica.username,
@@ -1439,6 +1465,7 @@ export const getOrdineRicevutaData = async ({
ordineId: data.ordine_id,
paymentMethod: (data.paymentmethod || "manual") as PaymentType,
+ previewSaldo,
};
} catch (e) {
throw new TRPCError({