From 0e606aa60eb984b940603274bb0785169e7d263f Mon Sep 17 00:00:00 2001 From: Marco Pedone Date: Fri, 10 Apr 2026 12:08:33 +0200 Subject: [PATCH] refactor: clean up unused code and improve type definitions in various components --- .../components/servizio/servizio_actions.tsx | 12 +- .../src/components/tables/richieste-table.tsx | 4 + .../src/lib/dateParserJsonKysely.ts | 23 +- .../src/server/api/routers/prezziario.ts | 12 - .../server/controllers/servizio.controller.ts | 320 ++++++++++-------- .../src/server/controllers/user.controller.ts | 25 -- 6 files changed, 206 insertions(+), 190 deletions(-) diff --git a/apps/infoalloggi/src/components/servizio/servizio_actions.tsx b/apps/infoalloggi/src/components/servizio/servizio_actions.tsx index e9ceac1..16c9025 100644 --- a/apps/infoalloggi/src/components/servizio/servizio_actions.tsx +++ b/apps/infoalloggi/src/components/servizio/servizio_actions.tsx @@ -51,7 +51,6 @@ import { useTranslation } from "~/providers/I18nProvider"; import { useServizio } from "~/providers/ServizioProvider"; import type { AnnunciId } from "~/schemas/public/Annunci"; import type { Ordini } from "~/schemas/public/Ordini"; -import type { Prezziario } from "~/schemas/public/Prezziario"; import type { ServizioServizioId } from "~/schemas/public/Servizio"; import TipologiaPosizioneEnum from "~/schemas/public/TipologiaPosizioneEnum"; import type { UsersId } from "~/schemas/public/Users"; @@ -246,7 +245,16 @@ export const OrdersModal = ({ }: { children: React.ReactNode; isAdmin: boolean; - ordini: (Ordini & Pick)[]; + ordini: Pick< + Ordini, + | "isActive" + | "ordine_id" + | "created_at" + | "packid" + | "amount_cent" + | "userid" + | "type" + >[]; }) => { const [openOrders, setOpenOrders] = useState(false); const [openEdit, setOpenEdit] = useState(false); diff --git a/apps/infoalloggi/src/components/tables/richieste-table.tsx b/apps/infoalloggi/src/components/tables/richieste-table.tsx index 93acf24..ca169a4 100644 --- a/apps/infoalloggi/src/components/tables/richieste-table.tsx +++ b/apps/infoalloggi/src/components/tables/richieste-table.tsx @@ -305,6 +305,7 @@ export const RichiesteTable = ({ data }: RichiesteTableProps) => { const activeAcconto = acconti.find((a) => a.isActive); + //hasActiveAcconto if (activeAcconto) { badgeClass = "border-yellow-500 bg-yellow-500/10 text-yellow-600"; contents = ( @@ -359,6 +360,7 @@ export const RichiesteTable = ({ data }: RichiesteTableProps) => { return; } if ( + //hasConsulanzaDaPagare row.original.ordini_servizio.some( (o) => o.type === OrderTypeEnum.Consulenza && !o.isActive, ) @@ -557,9 +559,11 @@ export const RichiesteTable = ({ data }: RichiesteTableProps) => { { accessorKey: "ordini", cell: ({ row }) => { + //paidOrdiniCount const paidOrders = row.original.ordini_servizio.filter( (o) => o.isActive, ).length; + //unpaidOrdiniCount const unpaidOrders = row.original.ordini_servizio.length - paidOrders; return ( diff --git a/apps/infoalloggi/src/lib/dateParserJsonKysely.ts b/apps/infoalloggi/src/lib/dateParserJsonKysely.ts index db8bc39..50452a7 100644 --- a/apps/infoalloggi/src/lib/dateParserJsonKysely.ts +++ b/apps/infoalloggi/src/lib/dateParserJsonKysely.ts @@ -50,6 +50,24 @@ export type WithParsedDates< ? WithParsedDates, Tail> : T; +/** Extracts dot-separated paths leading to a `string` or `Date` leaf, auto-traversing arrays. */ +type DateConvertiblePaths< + T, + Depth extends unknown[] = [], +> = Depth["length"] extends 5 + ? never + : T extends Record + ? { + [K in keyof T & string]: + | (NonNullable extends string | Date ? K : never) + | (NonNullable extends readonly (infer U)[] + ? `${K}.${DateConvertiblePaths}` + : NonNullable extends Record + ? `${K}.${DateConvertiblePaths, [...Depth, unknown]>}` + : never); + }[keyof T & string] + : never; + // --- Runtime --- type ParsedPath = string[]; @@ -144,7 +162,10 @@ type PluggedQuery = { * ).execute(); * // rows: { items: { id: number; box_id: number; created_at: Date }[] }[] */ -export function withParsedDates( +export function withParsedDates< + T, + const Paths extends readonly DateConvertiblePaths[], +>( query: { withPlugin(plugin: KyselyPlugin): PluggedQuery; }, diff --git a/apps/infoalloggi/src/server/api/routers/prezziario.ts b/apps/infoalloggi/src/server/api/routers/prezziario.ts index af24ea5..2b1f428 100644 --- a/apps/infoalloggi/src/server/api/routers/prezziario.ts +++ b/apps/infoalloggi/src/server/api/routers/prezziario.ts @@ -37,18 +37,6 @@ export const prezziarioRouter = createTRPCRouter({ .mutation(async ({ input }) => { return await addPrezziario({ db, input: input.data }); }), - // deletePrezziario: adminProcedure - // .input( - // z.object({ - // idprezziario: zPrezziarioId, - // }), - // ) - // .mutation(async ({ input }) => { - // return await deletePrezziario({ - // db, - // prezziarioId: input.idprezziario, - // }); - // }), getPrezziario: publicProcedure.query(async () => { return await getPrezziario(); }), diff --git a/apps/infoalloggi/src/server/controllers/servizio.controller.ts b/apps/infoalloggi/src/server/controllers/servizio.controller.ts index d81869c..86e87c1 100644 --- a/apps/infoalloggi/src/server/controllers/servizio.controller.ts +++ b/apps/infoalloggi/src/server/controllers/servizio.controller.ts @@ -31,11 +31,7 @@ import { import { db } from "~/server/db"; import { NewMail, type NewMailProps } from "~/server/services/mailer"; import { getUser } from "~/server/services/user.service"; -import { - parseNullableDateString, - withImages, - withVideos, -} from "~/utils/kysely-helper"; +import { withImages, withVideos } from "~/utils/kysely-helper"; import { GetUserInterests } from "../services/interests.service"; import { getServizioById } from "../services/servizio.service"; import type { AnnuncioRicerca } from "./annunci.controller"; @@ -487,8 +483,6 @@ export const getAllServizioAnnunci = async ( "annunci.modificato_il", "annunci.created_at", "annunci.open_contatti_at", - "annunci.user_confirmed_at", - "annunci.accettato_conferma_at", "annunci.contratto_decorrenza", "annunci.contratto_scadenza", "annunci.disponibile_da", @@ -511,144 +505,138 @@ export const getServizioDataById = async ( servizioId: ServizioServizioId, ): Promise => { try { - const data = await db - .selectFrom("servizio") - .leftJoin( - "users_anagrafica", - "servizio.user_id", - "users_anagrafica.userid", - ) - .selectAll("servizio") - .select((eb) => [ - jsonObjectFrom( - eb - .selectFrom("users_storage") - .select([ - "users_storage.storageId as storageId", - "users_anagrafica.doc_personale_fronte_ref as ref", - ]) - .whereRef( - "users_storage.user_storage_id", - "=", - "users_anagrafica.doc_personale_fronte_ref", - ), - ).as("doc_personale_fronte"), - jsonObjectFrom( - eb - .selectFrom("users_storage") - .select([ - "users_storage.storageId as storageId", - "users_anagrafica.doc_personale_retro_ref as ref", - ]) - .whereRef( - "users_storage.user_storage_id", - "=", - "users_anagrafica.doc_personale_retro_ref", - ), - ).as("doc_personale_retro"), - jsonObjectFrom( - eb - .selectFrom("users_storage") - .select([ - "users_storage.storageId as storageId", - "servizio.doc_motivazione_ref as ref", - ]) - .whereRef( - "users_storage.user_storage_id", - "=", - "servizio.doc_motivazione_ref", - ), - ).as("doc_motivazione"), - jsonArrayFrom( - eb - .selectFrom("servizio_annunci") - .selectAll("servizio_annunci") - .innerJoin("annunci", "annunci.id", "servizio_annunci.annunci_id") - .select((_eb) => [ - "annunci.id", - "annunci.codice", - "annunci.comune", - "annunci.provincia", - "annunci.prezzo", - "annunci.consegna", - "annunci.numero_camere", - "annunci.mq", - "annunci.tipo", - "annunci.titolo_it", - "annunci.titolo_en", - "annunci.desc_en", - "annunci.desc_it", - "annunci.modificato_il", - "annunci.stato", - "annunci.external_videos", - "annunci.media_updated_at", - "annunci.homepage", - "annunci.web", - "annunci.disponibile_da", - "annunci.persone", - "annunci.permanenza", - withImages(), - withVideos(), - ]) - //ignora annunci che non sono disponibili - //.where("annunci.web", "=", true) - //.where("annunci.stato", "!=", "Sospeso") - .orderBy("servizio_annunci.status_conferma", (ob) => - ob.asc().nullsLast(), - ) - .orderBy("servizio_annunci.open_contatti_at", (ob) => - ob.asc().nullsLast(), - ) - .orderBy("servizio_annunci.created_at", "asc") - .whereRef( - "servizio_annunci.servizio_id", - "=", - "servizio.servizio_id", - ), - ).as("annunci"), - jsonArrayFrom( - eb - .selectFrom("ordini") - .selectAll("ordini") - .innerJoin("prezziario", "prezziario.idprezziario", "ordini.packid") - .select("prezziario.testo_condizioni") - .whereRef("ordini.servizio_id", "=", "servizio.servizio_id") - .orderBy("ordini.created_at", "desc"), - ).as("ordini"), - ]) - .orderBy("servizio.created_at", "desc") - .where("servizio.servizio_id", "=", servizioId) - .executeTakeFirst(); + const data = await withParsedDates( + db + .selectFrom("servizio") + .leftJoin( + "users_anagrafica", + "servizio.user_id", + "users_anagrafica.userid", + ) + .selectAll("servizio") + .select((eb) => [ + jsonObjectFrom( + eb + .selectFrom("users_storage") + .select([ + "users_storage.storageId as storageId", + "users_anagrafica.doc_personale_fronte_ref as ref", + ]) + .whereRef( + "users_storage.user_storage_id", + "=", + "users_anagrafica.doc_personale_fronte_ref", + ), + ).as("doc_personale_fronte"), + jsonObjectFrom( + eb + .selectFrom("users_storage") + .select([ + "users_storage.storageId as storageId", + "users_anagrafica.doc_personale_retro_ref as ref", + ]) + .whereRef( + "users_storage.user_storage_id", + "=", + "users_anagrafica.doc_personale_retro_ref", + ), + ).as("doc_personale_retro"), + jsonObjectFrom( + eb + .selectFrom("users_storage") + .select([ + "users_storage.storageId as storageId", + "servizio.doc_motivazione_ref as ref", + ]) + .whereRef( + "users_storage.user_storage_id", + "=", + "servizio.doc_motivazione_ref", + ), + ).as("doc_motivazione"), + jsonArrayFrom( + eb + .selectFrom("servizio_annunci") + .selectAll("servizio_annunci") + .innerJoin("annunci", "annunci.id", "servizio_annunci.annunci_id") + .select((_eb) => [ + "annunci.id", + "annunci.codice", + "annunci.comune", + "annunci.provincia", + "annunci.prezzo", + "annunci.consegna", + "annunci.numero_camere", + "annunci.mq", + "annunci.tipo", + "annunci.titolo_it", + "annunci.titolo_en", + "annunci.desc_en", + "annunci.desc_it", + "annunci.modificato_il", + "annunci.stato", + "annunci.external_videos", + "annunci.media_updated_at", + "annunci.homepage", + "annunci.web", + "annunci.disponibile_da", + "annunci.persone", + "annunci.permanenza", + withImages(), + withVideos(), + ]) + //ignora annunci che non sono disponibili + //.where("annunci.web", "=", true) + //.where("annunci.stato", "!=", "Sospeso") + .orderBy("servizio_annunci.status_conferma", (ob) => + ob.asc().nullsLast(), + ) + .orderBy("servizio_annunci.open_contatti_at", (ob) => + ob.asc().nullsLast(), + ) + .orderBy("servizio_annunci.created_at", "asc") + .whereRef( + "servizio_annunci.servizio_id", + "=", + "servizio.servizio_id", + ), + ).as("annunci"), + jsonArrayFrom( + eb + .selectFrom("ordini") + .selectAll("ordini") + .innerJoin( + "prezziario", + "prezziario.idprezziario", + "ordini.packid", + ) + .select("prezziario.testo_condizioni") + .whereRef("ordini.servizio_id", "=", "servizio.servizio_id") + .orderBy("ordini.created_at", "desc"), + ).as("ordini"), + ]) + .orderBy("servizio.created_at", "desc") + .where("servizio.servizio_id", "=", servizioId), + [ + "annunci.created_at", + "annunci.open_contatti_at", + "annunci.contratto_decorrenza", + "annunci.contratto_scadenza", + "annunci.modificato_il", + "annunci.disponibile_da", + "annunci.media_updated_at", + "ordini.created_at", + "ordini.paid_at", + ], + ).executeTakeFirst(); if (!data) { throw new TRPCError({ code: "NOT_FOUND", message: "Servizio not found", }); } - const formattedData = { - ...data, - annunci: data.annunci.map((annuncio) => ({ - ...annuncio, - created_at: new Date(annuncio.created_at), - open_contatti_at: parseNullableDateString(annuncio.open_contatti_at), - contratto_decorrenza: parseNullableDateString( - annuncio.contratto_decorrenza, - ), - contratto_scadenza: parseNullableDateString( - annuncio.contratto_scadenza, - ), - modificato_il: parseNullableDateString(annuncio.modificato_il), - disponibile_da: parseNullableDateString(annuncio.disponibile_da), - media_updated_at: parseNullableDateString(annuncio.media_updated_at), - })), - ordini: data.ordini.map((ordine) => ({ - ...ordine, - created_at: new Date(ordine.created_at), - paid_at: ordine.paid_at ? new Date(ordine.paid_at) : null, - })), - }; - return formattedData; + return data; } catch (e) { throw new TRPCError({ code: "NOT_FOUND", @@ -1149,10 +1137,31 @@ export const getCompatibileAnnunci = async ({ } }; -export type RichiesteData = Servizio & +export type RichiesteData = Pick< + Servizio, + | "servizio_id" + | "user_id" + | "isInterrotto" + | "isOkAcconto" + | "isOkSaldo" + | "decorrenza" + | "tipologia" + | "onboardOk" + | "isOkConsulenza" + | "interruzioneDays" +> & Pick & { annunci_servizio: ServizioAnnuncioData[]; - ordini_servizio: (Ordini & Pick)[]; + ordini_servizio: Pick< + Ordini, + | "isActive" + | "ordine_id" + | "created_at" + | "packid" + | "amount_cent" + | "userid" + | "type" + >[]; }; export const getRichieste = async (): Promise => { @@ -1161,7 +1170,18 @@ export const getRichieste = async (): Promise => { db .selectFrom("servizio") .innerJoin("users", "users.id", "servizio.user_id") - .selectAll("servizio") + .select([ + "servizio.servizio_id", + "servizio.user_id", + "servizio.isInterrotto", + "servizio.isOkAcconto", + "servizio.isOkSaldo", + "servizio.decorrenza", + "servizio.tipologia", + "servizio.onboardOk", + "servizio.isOkConsulenza", + "servizio.interruzioneDays", + ]) .select(["users.username", "users.note", "users.telefono"]) .select((eb) => [ jsonArrayFrom( @@ -1213,13 +1233,15 @@ export const getRichieste = async (): Promise => { jsonArrayFrom( eb .selectFrom("ordini") - .selectAll("ordini") - .innerJoin( - "prezziario", - "prezziario.idprezziario", + .select([ + "ordini.isActive", + "ordini.ordine_id", + "ordini.created_at", "ordini.packid", - ) - .select("prezziario.testo_condizioni") + "ordini.amount_cent", + "ordini.userid", + "ordini.type", + ]) .whereRef("ordini.servizio_id", "=", "servizio.servizio_id") .orderBy("ordini.created_at", "desc"), ).as("ordini_servizio"), @@ -1229,16 +1251,14 @@ export const getRichieste = async (): Promise => { "annunci_servizio.created_at", "annunci_servizio.open_contatti_at", "annunci_servizio.disponibile_da", - "annunci_servizio.user_confirmed_at", - "annunci_servizio.accettato_conferma_at", "annunci_servizio.contratto_decorrenza", "annunci_servizio.contratto_scadenza", "annunci_servizio.modificato_il", "annunci_servizio.media_updated_at", "ordini_servizio.created_at", - "ordini_servizio.paid_at", ], ).execute(); + return data; } catch (e) { throw new TRPCError({ diff --git a/apps/infoalloggi/src/server/controllers/user.controller.ts b/apps/infoalloggi/src/server/controllers/user.controller.ts index ee1f60f..169dd3b 100644 --- a/apps/infoalloggi/src/server/controllers/user.controller.ts +++ b/apps/infoalloggi/src/server/controllers/user.controller.ts @@ -46,31 +46,6 @@ export const editAnagraficaHandler = async ({ }); } - // if (anagraficaId) { - // return await db - // .updateTable("users_anagrafica") - // .set({ - // ...rest, - // }) - // .where("userid", "=", userId) - // .returningAll() - // .executeTakeFirst(); - // } - // const searched = await db - // .selectFrom("users_anagrafica") - // .select("idanagrafica") - // .where("userid", "=", userId) - // .executeTakeFirst(); - // if (searched) { - // return await db - // .updateTable("users_anagrafica") - // .set({ - // ...rest, - // }) - // .where("userid", "=", userId) - // .returningAll() - // .executeTakeFirst(); - // } return await db .insertInto("users_anagrafica") .values({