refactor: clean up unused code and improve type definitions in various components

This commit is contained in:
Marco Pedone 2026-04-10 12:08:33 +02:00
parent d4c28117d7
commit 0e606aa60e
6 changed files with 206 additions and 190 deletions

View file

@ -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<Prezziario, "testo_condizioni">)[];
ordini: Pick<
Ordini,
| "isActive"
| "ordine_id"
| "created_at"
| "packid"
| "amount_cent"
| "userid"
| "type"
>[];
}) => {
const [openOrders, setOpenOrders] = useState(false);
const [openEdit, setOpenEdit] = useState(false);

View file

@ -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 (
<OrdersModal isAdmin={true} ordini={row.original.ordini_servizio}>

View file

@ -50,6 +50,24 @@ export type WithParsedDates<
? WithParsedDates<SetNestedPath<T, Head>, 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<string, unknown>
? {
[K in keyof T & string]:
| (NonNullable<T[K]> extends string | Date ? K : never)
| (NonNullable<T[K]> extends readonly (infer U)[]
? `${K}.${DateConvertiblePaths<U, [...Depth, unknown]>}`
: NonNullable<T[K]> extends Record<string, unknown>
? `${K}.${DateConvertiblePaths<NonNullable<T[K]>, [...Depth, unknown]>}`
: never);
}[keyof T & string]
: never;
// --- Runtime ---
type ParsedPath = string[];
@ -144,7 +162,10 @@ type PluggedQuery<T> = {
* ).execute();
* // rows: { items: { id: number; box_id: number; created_at: Date }[] }[]
*/
export function withParsedDates<const Paths extends readonly string[], T>(
export function withParsedDates<
T,
const Paths extends readonly DateConvertiblePaths<T>[],
>(
query: {
withPlugin(plugin: KyselyPlugin): PluggedQuery<T>;
},

View file

@ -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();
}),

View file

@ -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<ServizioData> => {
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<Users, "username" | "note" | "telefono"> & {
annunci_servizio: ServizioAnnuncioData[];
ordini_servizio: (Ordini & Pick<Prezziario, "testo_condizioni">)[];
ordini_servizio: Pick<
Ordini,
| "isActive"
| "ordine_id"
| "created_at"
| "packid"
| "amount_cent"
| "userid"
| "type"
>[];
};
export const getRichieste = async (): Promise<RichiesteData[]> => {
@ -1161,7 +1170,18 @@ export const getRichieste = async (): Promise<RichiesteData[]> => {
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<RichiesteData[]> => {
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<RichiesteData[]> => {
"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({

View file

@ -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({