Refactor: Update Zod schemas and replace custom types with imported schemas across various files

- Replaced custom Zod types with imported schemas in stripe router and user router.
- Updated payment controller to use new enum imports for order types and payment statuses.
- Refactored payment tests to utilize the new enum structure.
- Removed deprecated zod_types file and created new zod_chat_types file for chat-related schemas.
- Adjusted service files to align with the new order type enums and schemas.
- Enhanced the Caratteristiche type definition using Zod for better validation.

Co-authored-by: Copilot <copilot@github.com>
This commit is contained in:
Marco Pedone 2026-04-28 20:32:19 +02:00
parent d17ac87917
commit 60e4b187bf
93 changed files with 846 additions and 899 deletions

View file

@ -1,6 +1,6 @@
const { makeKyselyHook } = require("kanel-kysely"); const { makeKyselyHook } = require("kanel-kysely");
const { makePgTsGenerator } = require("kanel"); const { makePgTsGenerator } = require("kanel");
const { generateZodSchemas, makeGenerateZodSchemas } = require("kanel-zod"); const { generateZodSchemas, makeGenerateZodSchemas, defaultZodTypeMap } = require("kanel-zod");
const ignoredTables = ["schema_migrations"]; const ignoredTables = ["schema_migrations"];
/** /**
@ -98,7 +98,52 @@ function kanelKyselyZodCompatibilityHook(path, lines) {
return line; return line;
}); });
} }
/**@type {import("kanel").PostRenderHook} */
function zodCaratteristicheHook(path, lines) {
if (path.includes("src\\schemas\\public\\Annunci.ts")) {
return lines.map(line => {
if (line.includes("kanel-types")) {
return "import { CaratteristicheSchema, type Caratteristiche } from '../../utils/kanel-types';"
}
if (line.includes("caratteristiche: z.unknown().optional().nullable()")) {
return line.replace("caratteristiche: z.unknown().optional().nullable()", "caratteristiche: CaratteristicheSchema.optional().nullable()")
}
if (line.includes("caratteristiche: z.unknown().nullable()")) {
return line.replace("caratteristiche: z.unknown().nullable()", "caratteristiche: CaratteristicheSchema.nullable()")
}
return line;
})
}
return lines
}
/**@type {import("kanel").PostRenderHook} */
function zodUpdateInsertionDatesFix(path, lines) {
//z.date() -> z.union([z.date(), z.string()]).pipe(z.coerce.date())
let insideUpdateOrInsert = false;
return lines.map(line => {
if (line.includes("export const") && line.includes("UpdateSchema")) {
insideUpdateOrInsert = true;
}
if (line.includes("export const") && line.includes("New")) {
insideUpdateOrInsert = true;
}
if (insideUpdateOrInsert && line.includes("z.date()")) {
console.log(`Fixing line in ${path}: ${line}`);
return line.replace("z.date()", "z.union([z.date(), z.string()]).pipe(z.coerce.date())");
}
if (line.includes("import")) {
insideUpdateOrInsert = false;
}
return line;
})
}
/** @type {import('kanel').Config} */ /** @type {import('kanel').Config} */
module.exports = { module.exports = {
connection: { connection: {
@ -129,17 +174,17 @@ module.exports = {
}), }),
makeKyselyHook(), makeKyselyHook(),
makeGenerateZodSchemas({ makeGenerateZodSchemas({
castToSchema: false castToSchema: false,
zodTypeMap: {
...defaultZodTypeMap,
"pg_catalog.numeric": "z.number()",
}
}), }),
], ],
}), }),
], ],
postRenderHooks: [kanelKyselyZodCompatibilityHook], postRenderHooks: [kanelKyselyZodCompatibilityHook, zodCaratteristicheHook, zodUpdateInsertionDatesFix],
preDeleteOutputFolder: true, preDeleteOutputFolder: true,
typescriptConfig: {
enumStyle: "enum",
},
}; };

View file

@ -14,7 +14,8 @@ import {
import { Tabs, TabsContent, TabsList, TabsTrigger } from "~/components/ui/tabs"; import { Tabs, TabsContent, TabsList, TabsTrigger } from "~/components/ui/tabs";
import { cn } from "~/lib/utils"; import { cn } from "~/lib/utils";
import { useTranslation } from "~/providers/I18nProvider"; import { useTranslation } from "~/providers/I18nProvider";
import TipologiaPosizioneEnum from "~/schemas/public/TipologiaPosizioneEnum"; import type TipologiaPosizioneEnum from "~/schemas/public/TipologiaPosizioneEnum";
import { tipologiaPosizioneEnum } from "~/schemas/public/TipologiaPosizioneEnum";
import { api } from "~/utils/api"; import { api } from "~/utils/api";
export const PricingChoice = () => { export const PricingChoice = () => {
@ -63,7 +64,7 @@ export const PricingChoice = () => {
t.pricing_cmp.breve_option5, t.pricing_cmp.breve_option5,
]} ]}
pricingData={pricingBreve} pricingData={pricingBreve}
tipo={TipologiaPosizioneEnum.Transitorio} tipo={tipologiaPosizioneEnum.enum.Transitorio}
title={t.prezzi.titolo_transitori} title={t.prezzi.titolo_transitori}
/> />
</TabsContent> </TabsContent>
@ -77,7 +78,7 @@ export const PricingChoice = () => {
t.pricing_cmp.stabile_option3, t.pricing_cmp.stabile_option3,
]} ]}
pricingData={pricingStabile} pricingData={pricingStabile}
tipo={TipologiaPosizioneEnum.Stabile} tipo={tipologiaPosizioneEnum.enum.Stabile}
title={t.prezzi.titolo_stabile} title={t.prezzi.titolo_stabile}
/> />
</TabsContent> </TabsContent>
@ -192,7 +193,7 @@ export const PricingComponent = ({
Contratto Contratto
</h2> </h2>
{tipo === TipologiaPosizioneEnum.Transitorio ? ( {tipo === tipologiaPosizioneEnum.enum.Transitorio ? (
<div className="flex flex-col justify-center leading-none"> <div className="flex flex-col justify-center leading-none">
<span <span
className="font-semibold text-2xl xs:text-3xl sm:text-6xl" className="font-semibold text-2xl xs:text-3xl sm:text-6xl"

View file

@ -43,9 +43,10 @@ import { cn } from "~/lib/utils";
import { useTranslation } from "~/providers/I18nProvider"; import { useTranslation } from "~/providers/I18nProvider";
import { useServizio, useServizioAnnuncio } from "~/providers/ServizioProvider"; import { useServizio, useServizioAnnuncio } from "~/providers/ServizioProvider";
import type { AnnunciId } from "~/schemas/public/Annunci"; import type { AnnunciId } from "~/schemas/public/Annunci";
import OrderTypeEnum from "~/schemas/public/OrderTypeEnum"; import { orderTypeEnum } from "~/schemas/public/OrderTypeEnum";
import type { ServizioServizioId } from "~/schemas/public/Servizio"; import type { ServizioServizioId } from "~/schemas/public/Servizio";
import StatusConfermaEnum from "~/schemas/public/StatusConfermaEnum"; import type StatusConfermaEnum from "~/schemas/public/StatusConfermaEnum";
import { statusConfermaEnum } from "~/schemas/public/StatusConfermaEnum";
import type { ServizioAnnuncioData } from "~/server/controllers/servizio.controller"; import type { ServizioAnnuncioData } from "~/server/controllers/servizio.controller";
import { api } from "~/utils/api"; import { api } from "~/utils/api";
import { Confirm } from "../confirm"; import { Confirm } from "../confirm";
@ -220,7 +221,7 @@ export const AnnuncioConfermaPopover = ({
{status_conferma === null ? <CircleCheck /> : <Circle />} {status_conferma === null ? <CircleCheck /> : <Circle />}
Non in conferma Non in conferma
</Button> </Button>
{Object.values(StatusConfermaEnum).map((status) => ( {statusConfermaEnum.options.map((status) => (
<Button <Button
className="justify-start rounded-none last:rounded-b-md" className="justify-start rounded-none last:rounded-b-md"
key={status} key={status}
@ -387,7 +388,7 @@ const PostConfermaSection = () => {
{!consulenzaPaid && {!consulenzaPaid &&
servizio.ordini.some( servizio.ordini.some(
(o) => o.type === OrderTypeEnum.Consulenza && !o.isActive, (o) => o.type === orderTypeEnum.enum.Consulenza && !o.isActive,
) && ) &&
data.contratto_tipo && <SaldoConsulenzaButton />} data.contratto_tipo && <SaldoConsulenzaButton />}
@ -445,7 +446,7 @@ export const SaldoButton = ({
return ( return (
<Link <Link
className="w-full sm:w-fit" className="w-full sm:w-fit"
href={`/servizio/pagamento?servizioId=${servizioId}&type=${OrderTypeEnum.Saldo}`} href={`/servizio/pagamento?servizioId=${servizioId}&type=${orderTypeEnum.enum.Saldo}`}
> >
<Button <Button
aria-label={locale === "it" ? "Procedi al saldo" : "Proceed to payment"} aria-label={locale === "it" ? "Procedi al saldo" : "Proceed to payment"}
@ -472,7 +473,7 @@ const SaldoConsulenzaButton = ({
return ( return (
<Link <Link
className="w-full sm:w-fit" className="w-full sm:w-fit"
href={`/servizio/pagamento?servizioId=${servizioId}&type=${OrderTypeEnum.Consulenza}`} href={`/servizio/pagamento?servizioId=${servizioId}&type=${orderTypeEnum.enum.Consulenza}`}
> >
<Button <Button
aria-label={ aria-label={

View file

@ -49,7 +49,8 @@ import { useZodForm } from "~/lib/zodForm";
import { useTranslation } from "~/providers/I18nProvider"; import { useTranslation } from "~/providers/I18nProvider";
import { useServizio } from "~/providers/ServizioProvider"; import { useServizio } from "~/providers/ServizioProvider";
import type { Servizio } from "~/schemas/public/Servizio"; import type { Servizio } from "~/schemas/public/Servizio";
import TipologiaPosizioneEnum from "~/schemas/public/TipologiaPosizioneEnum"; import { tipologiaPosizioneEnum } from "~/schemas/public/TipologiaPosizioneEnum";
import type { UsersId } from "~/schemas/public/Users"; import type { UsersId } from "~/schemas/public/Users";
import { api } from "~/utils/api"; import { api } from "~/utils/api";
import { DEFAULT_SERVIZIO_INTERRUZIONE_DURATION_DAYS } from "~/utils/config"; import { DEFAULT_SERVIZIO_INTERRUZIONE_DURATION_DAYS } from "~/utils/config";
@ -71,7 +72,7 @@ const Schema = z
pianoterra: z.boolean(), pianoterra: z.boolean(),
reddito: z.string().nullable(), reddito: z.string().nullable(),
terrazzo: z.boolean(), terrazzo: z.boolean(),
tipologia: z.enum(TipologiaPosizioneEnum), tipologia: tipologiaPosizioneEnum,
scadenza_motivazione_transitoria: z.date().nullable(), scadenza_motivazione_transitoria: z.date().nullable(),
skipPayment: z.boolean(), skipPayment: z.boolean(),
skipControlloDoc: z.boolean(), skipControlloDoc: z.boolean(),
@ -127,7 +128,7 @@ const FormServizio = ({
pianoterra: false, pianoterra: false,
reddito: "", reddito: "",
terrazzo: false, terrazzo: false,
tipologia: TipologiaPosizioneEnum.Transitorio, tipologia: tipologiaPosizioneEnum.enum.Transitorio,
scadenza_motivazione_transitoria: null, scadenza_motivazione_transitoria: null,
skipPayment: false, skipPayment: false,
skipControlloDoc: true, skipControlloDoc: true,
@ -179,14 +180,14 @@ const FormServizio = ({
) : ( ) : (
<MultiSelect <MultiSelect
defaultValue={ defaultValue={
field.value === TipologiaPosizioneEnum.Transitorio field.value === tipologiaPosizioneEnum.enum.Transitorio
? { ? {
label: "Transitorio", label: "Transitorio",
value: TipologiaPosizioneEnum.Transitorio, value: tipologiaPosizioneEnum.enum.Transitorio,
} }
: { : {
label: "Stabile", label: "Stabile",
value: TipologiaPosizioneEnum.Stabile, value: tipologiaPosizioneEnum.enum.Stabile,
} }
} }
elementId="select-tipologia" elementId="select-tipologia"
@ -200,11 +201,11 @@ const FormServizio = ({
options={[ options={[
{ {
label: "Transitorio", label: "Transitorio",
value: TipologiaPosizioneEnum.Transitorio, value: tipologiaPosizioneEnum.enum.Transitorio,
}, },
{ {
label: "Stabile", label: "Stabile",
value: TipologiaPosizioneEnum.Stabile, value: tipologiaPosizioneEnum.enum.Stabile,
}, },
]} ]}
placeholder={t.seleziona_placeholder} placeholder={t.seleziona_placeholder}
@ -297,14 +298,14 @@ const FormServizio = ({
/> />
<FormField <FormField
control={form.control} control={form.control}
disabled={tipologia !== TipologiaPosizioneEnum.Transitorio} disabled={tipologia !== tipologiaPosizioneEnum.enum.Transitorio}
name="permanenza" name="permanenza"
render={({ field }) => ( render={({ field }) => (
<FormItem className="w-full"> <FormItem className="w-full">
<div className="flex flex-wrap items-center gap-x-2"> <div className="flex flex-wrap items-center gap-x-2">
<FormLabel <FormLabel
className={cn( className={cn(
tipologia !== TipologiaPosizioneEnum.Transitorio && tipologia !== tipologiaPosizioneEnum.enum.Transitorio &&
"opacity-50", "opacity-50",
)} )}
htmlFor="permanenza" htmlFor="permanenza"
@ -331,7 +332,7 @@ const FormServizio = ({
} }
disabled={ disabled={
isLimited || isLimited ||
tipologia !== TipologiaPosizioneEnum.Transitorio tipologia !== tipologiaPosizioneEnum.enum.Transitorio
} }
elementId="permanenza" elementId="permanenza"
elementName="permanenza" elementName="permanenza"
@ -348,7 +349,7 @@ const FormServizio = ({
placeholder="Seleziona..." placeholder="Seleziona..."
/> />
</FormControl> </FormControl>
{tipologia === TipologiaPosizioneEnum.Transitorio && {tipologia === tipologiaPosizioneEnum.enum.Transitorio &&
!isLimited && ( !isLimited && (
<FormDescription> <FormDescription>
{t.parametri.permanenza_desc} {t.parametri.permanenza_desc}
@ -438,7 +439,7 @@ const FormServizio = ({
)} )}
/> />
{tipologia === TipologiaPosizioneEnum.Transitorio ? ( {tipologia === tipologiaPosizioneEnum.enum.Transitorio ? (
<div className="items-top flex w-full flex-col justify-between gap-4 sm:flex-row"> <div className="items-top flex w-full flex-col justify-between gap-4 sm:flex-row">
<FormField <FormField
control={form.control} control={form.control}

View file

@ -16,14 +16,14 @@ import {
} from "~/components/ui/dialog"; } from "~/components/ui/dialog";
import { FormRinnovo } from "~/forms/FormRinnovo"; import { FormRinnovo } from "~/forms/FormRinnovo";
import { useRinnovo } from "~/providers/RinnovoProvider"; import { useRinnovo } from "~/providers/RinnovoProvider";
import OrderTypeEnum from "~/schemas/public/OrderTypeEnum"; import { orderTypeEnum } from "~/schemas/public/OrderTypeEnum";
import type { UsersId } from "~/schemas/public/Users"; import type { UsersId } from "~/schemas/public/Users";
import { api } from "~/utils/api"; import { api } from "~/utils/api";
export const Rinnovo = () => { export const Rinnovo = () => {
const { rinnovo, isAdmin } = useRinnovo(); const { rinnovo, isAdmin } = useRinnovo();
const hasPaid = rinnovo.ordini const hasPaid = rinnovo.ordini
.filter((o) => o.type === OrderTypeEnum.Rinnovo) .filter((o) => o.type === orderTypeEnum.enum.Rinnovo)
.find((o) => o.isActive); .find((o) => o.isActive);
return ( return (
<div className="w-full space-y-8"> <div className="w-full space-y-8">
@ -78,7 +78,7 @@ export const Rinnovo = () => {
<Link <Link
aria-label="Attiva Servizio" aria-label="Attiva Servizio"
className="w-full" className="w-full"
href={`/servizio/pagamento?rinnovoId=${rinnovo.id}&type=${OrderTypeEnum.Rinnovo}`} href={`/servizio/pagamento?rinnovoId=${rinnovo.id}&type=${orderTypeEnum.enum.Rinnovo}`}
> >
<Button className="w-full text-lg" variant="info"> <Button className="w-full text-lg" variant="info">
<span>Procedi al pagamento</span> <span>Procedi al pagamento</span>

View file

@ -26,7 +26,7 @@ import {
ServizioProvider, ServizioProvider,
useServizio, useServizio,
} from "~/providers/ServizioProvider"; } from "~/providers/ServizioProvider";
import OrderTypeEnum from "~/schemas/public/OrderTypeEnum"; import { orderTypeEnum } from "~/schemas/public/OrderTypeEnum";
import type { Rinnovi } from "~/schemas/public/Rinnovi"; import type { Rinnovi } from "~/schemas/public/Rinnovi";
import type { UsersId } from "~/schemas/public/Users"; import type { UsersId } from "~/schemas/public/Users";
import type { ServizioData } from "~/server/controllers/servizio.controller"; import type { ServizioData } from "~/server/controllers/servizio.controller";
@ -460,7 +460,7 @@ const Main = () => {
// se non ok acconto, mostra invito a completare pagamento acconto o ad attivare se acconto già inserito // se non ok acconto, mostra invito a completare pagamento acconto o ad attivare se acconto già inserito
if (!servizio.isOkAcconto || servizio.decorrenza === null) { if (!servizio.isOkAcconto || servizio.decorrenza === null) {
const acconti = servizio.ordini.filter( const acconti = servizio.ordini.filter(
(o) => o.type === OrderTypeEnum.Acconto, (o) => o.type === orderTypeEnum.enum.Acconto,
); );
const activeAcconto = acconti.find((a) => a.isActive); const activeAcconto = acconti.find((a) => a.isActive);
@ -535,7 +535,7 @@ const Main = () => {
<Link <Link
aria-label="Attiva Servizio" aria-label="Attiva Servizio"
className="w-full" className="w-full"
href={`/servizio/pagamento?servizioId=${servizio.servizio_id}&type=${OrderTypeEnum.Acconto}`} href={`/servizio/pagamento?servizioId=${servizio.servizio_id}&type=${orderTypeEnum.enum.Acconto}`}
> >
<Button className="w-full text-lg" variant="info"> <Button className="w-full text-lg" variant="info">
<span>Procedi al pagamento</span> <span>Procedi al pagamento</span>

View file

@ -52,7 +52,7 @@ import { useServizio } from "~/providers/ServizioProvider";
import type { AnnunciId } from "~/schemas/public/Annunci"; import type { AnnunciId } from "~/schemas/public/Annunci";
import type { Ordini } from "~/schemas/public/Ordini"; import type { Ordini } from "~/schemas/public/Ordini";
import type { ServizioServizioId } from "~/schemas/public/Servizio"; import type { ServizioServizioId } from "~/schemas/public/Servizio";
import TipologiaPosizioneEnum from "~/schemas/public/TipologiaPosizioneEnum"; import { tipologiaPosizioneEnum } from "~/schemas/public/TipologiaPosizioneEnum";
import type { UsersId } from "~/schemas/public/Users"; import type { UsersId } from "~/schemas/public/Users";
import { api } from "~/utils/api"; import { api } from "~/utils/api";
import { Confirm } from "../confirm"; import { Confirm } from "../confirm";
@ -121,9 +121,9 @@ const ServizioPrezzo = () => {
<Button <Button
className={cn( className={cn(
"flex-1 text-white hover:text-white dark:text-white dark:hover:text-white", "flex-1 text-white hover:text-white dark:text-white dark:hover:text-white",
servizio.tipologia === TipologiaPosizioneEnum.Transitorio && servizio.tipologia === tipologiaPosizioneEnum.enum.Transitorio &&
"border-transitorio bg-transitorio hover:border-transitorio/90 hover:bg-transitorio/90 dark:border-transitorio dark:bg-transitorio dark:hover:border-transitorio/90 dark:hover:bg-transitorio/90", "border-transitorio bg-transitorio hover:border-transitorio/90 hover:bg-transitorio/90 dark:border-transitorio dark:bg-transitorio dark:hover:border-transitorio/90 dark:hover:bg-transitorio/90",
servizio.tipologia === TipologiaPosizioneEnum.Stabile && servizio.tipologia === tipologiaPosizioneEnum.enum.Stabile &&
"border-stabile bg-stabile hover:border-stabile/90 hover:bg-stabile/90 dark:border-stabile dark:bg-stabile dark:hover:border-stabile/90 dark:hover:bg-stabile/90", "border-stabile bg-stabile hover:border-stabile/90 hover:bg-stabile/90 dark:border-stabile dark:bg-stabile dark:hover:border-stabile/90 dark:hover:bg-stabile/90",
)} )}
variant="outline" variant="outline"
@ -185,7 +185,7 @@ const ServizioPrezzo = () => {
<span className="font-medium">{packs.saldo.message}</span> <span className="font-medium">{packs.saldo.message}</span>
)} )}
</div> </div>
{servizio.tipologia === TipologiaPosizioneEnum.Stabile && ( {servizio.tipologia === tipologiaPosizioneEnum.enum.Stabile && (
<div className="flex flex-1 flex-col gap-2 rounded-md bg-secondary/50 p-2"> <div className="flex flex-1 flex-col gap-2 rounded-md bg-secondary/50 p-2">
<> <>
<span className="font-medium"> <span className="font-medium">

View file

@ -14,9 +14,10 @@ import type {
SearchFiltro, SearchFiltro,
} from "~/components/ui/dataTable-toolbar"; } from "~/components/ui/dataTable-toolbar";
import { formatCurrency } from "~/lib/utils"; import { formatCurrency } from "~/lib/utils";
import OrderTypeEnum from "~/schemas/public/OrderTypeEnum"; import { orderTypeEnum } from "~/schemas/public/OrderTypeEnum";
import type { OrdiniOrdineId } from "~/schemas/public/Ordini"; import type { OrdiniOrdineId } from "~/schemas/public/Ordini";
import PaymentStatusEnum from "~/schemas/public/PaymentStatusEnum"; import type PaymentStatusEnum from "~/schemas/public/PaymentStatusEnum";
import { paymentStatusEnum } from "~/schemas/public/PaymentStatusEnum";
import type { UsersId } from "~/schemas/public/Users"; import type { UsersId } from "~/schemas/public/Users";
import type { Ordini_w_Utente } from "~/server/services/ordini.service"; import type { Ordini_w_Utente } from "~/server/services/ordini.service";
@ -29,11 +30,11 @@ type PaymentsTableProps = {
const StatusMapping = (status: PaymentStatusEnum | null) => { const StatusMapping = (status: PaymentStatusEnum | null) => {
switch (status) { switch (status) {
case PaymentStatusEnum.success: case paymentStatusEnum.enum.success:
return "Successo"; return "Successo";
case PaymentStatusEnum.processing: case paymentStatusEnum.enum.processing:
return "In lavorazione"; return "In lavorazione";
case PaymentStatusEnum.failed: case paymentStatusEnum.enum.failed:
return "Errore"; return "Errore";
default: default:
return "Non completato"; return "Non completato";
@ -78,10 +79,10 @@ export const OrdiniTable = ({
]; ];
const type_options = [ const type_options = [
{ label: "Acconto", value: OrderTypeEnum.Acconto }, { label: "Acconto", value: orderTypeEnum.enum.Acconto },
{ label: "Saldo", value: OrderTypeEnum.Saldo }, { label: "Saldo", value: orderTypeEnum.enum.Saldo },
{ label: "Consulenza", value: OrderTypeEnum.Consulenza }, { label: "Consulenza", value: orderTypeEnum.enum.Consulenza },
{ label: "Altro", value: OrderTypeEnum.Altro }, { label: "Altro", value: orderTypeEnum.enum.Altro },
]; ];
const [selectedOrdine, setSelectedOrdine] = useState<OrdiniOrdineId | null>( const [selectedOrdine, setSelectedOrdine] = useState<OrdiniOrdineId | null>(

View file

@ -9,9 +9,9 @@ import type {
SearchFiltro, SearchFiltro,
} from "~/components/ui/dataTable-toolbar"; } from "~/components/ui/dataTable-toolbar";
import { cn, formatCurrency } from "~/lib/utils"; import { cn, formatCurrency } from "~/lib/utils";
import OrderTypeEnum from "~/schemas/public/OrderTypeEnum"; import { orderTypeEnum } from "~/schemas/public/OrderTypeEnum";
import type { Prezziario } from "~/schemas/public/Prezziario"; import type { Prezziario } from "~/schemas/public/Prezziario";
import TipologiaPosizioneEnum from "~/schemas/public/TipologiaPosizioneEnum"; import { tipologiaPosizioneEnum } from "~/schemas/public/TipologiaPosizioneEnum";
export const PrezzarioTable = ({ export const PrezzarioTable = ({
data, data,
@ -24,12 +24,12 @@ export const PrezzarioTable = ({
}) => { }) => {
const tabledata = data; const tabledata = data;
const tipologia_options = Object.values(OrderTypeEnum).map((value) => ({ const tipologia_options = orderTypeEnum.options.map((value) => ({
label: value, label: value,
value: value, value: value,
})); }));
const cat_options = Object.values(TipologiaPosizioneEnum).map((value) => ({ const cat_options = tipologiaPosizioneEnum.options.map((value) => ({
label: value, label: value,
value: value, value: value,
})); }));

View file

@ -58,9 +58,9 @@ import {
import { UserAvatar } from "~/components/user_avatar"; import { UserAvatar } from "~/components/user_avatar";
import { MutationPageRestore } from "~/lib/tableUtils"; import { MutationPageRestore } from "~/lib/tableUtils";
import { cn } from "~/lib/utils"; import { cn } from "~/lib/utils";
import OrderTypeEnum from "~/schemas/public/OrderTypeEnum"; import { orderTypeEnum } from "~/schemas/public/OrderTypeEnum";
import StatusConfermaEnum from "~/schemas/public/StatusConfermaEnum"; import { statusConfermaEnum } from "~/schemas/public/StatusConfermaEnum";
import TipologiaPosizioneEnum from "~/schemas/public/TipologiaPosizioneEnum"; import { tipologiaPosizioneEnum } from "~/schemas/public/TipologiaPosizioneEnum";
import type { RichiesteData } from "~/server/controllers/servizio.controller"; import type { RichiesteData } from "~/server/controllers/servizio.controller";
import { api } from "~/utils/api"; import { api } from "~/utils/api";
import { DEFAULT_SERVIZIO_DURATION_DAYS } from "~/utils/config"; import { DEFAULT_SERVIZIO_DURATION_DAYS } from "~/utils/config";
@ -91,8 +91,8 @@ export const RichiesteTable = ({ data }: RichiesteTableProps) => {
]; ];
const type_options = [ const type_options = [
{ label: "Transitorio", value: TipologiaPosizioneEnum.Transitorio }, { label: "Transitorio", value: tipologiaPosizioneEnum.enum.Transitorio },
{ label: "Stabile", value: TipologiaPosizioneEnum.Stabile }, { label: "Stabile", value: tipologiaPosizioneEnum.enum.Stabile },
]; ];
type Column = (typeof tabledata)[number]; type Column = (typeof tabledata)[number];
@ -282,7 +282,7 @@ export const RichiesteTable = ({ data }: RichiesteTableProps) => {
<Badge <Badge
className={cn( className={cn(
"px-1.5", "px-1.5",
tipologia === TipologiaPosizioneEnum.Transitorio tipologia === tipologiaPosizioneEnum.enum.Transitorio
? "border-transitorio bg-transitorio/15" ? "border-transitorio bg-transitorio/15"
: "border-stabile bg-stabile/15", : "border-stabile bg-stabile/15",
)} )}
@ -333,7 +333,7 @@ export const RichiesteTable = ({ data }: RichiesteTableProps) => {
} }
if (!row.original.isOkAcconto || !row.original.decorrenza) { if (!row.original.isOkAcconto || !row.original.decorrenza) {
const acconti = row.original.ordini_servizio.filter( const acconti = row.original.ordini_servizio.filter(
(o) => o.type === OrderTypeEnum.Acconto, (o) => o.type === orderTypeEnum.enum.Acconto,
); );
const activeAcconto = acconti.find((a) => a.isActive); const activeAcconto = acconti.find((a) => a.isActive);
@ -395,7 +395,8 @@ export const RichiesteTable = ({ data }: RichiesteTableProps) => {
if ( if (
//hasConsulanzaDaPagare //hasConsulanzaDaPagare
row.original.ordini_servizio.some( row.original.ordini_servizio.some(
(o) => o.type === OrderTypeEnum.Consulenza && !o.isActive, (o) =>
o.type === orderTypeEnum.enum.Consulenza && !o.isActive,
) )
) { ) {
badgeClass = badgeClass =
@ -420,7 +421,8 @@ export const RichiesteTable = ({ data }: RichiesteTableProps) => {
} }
const annuncioCaparraVersata = row.original.annunci_servizio.filter( const annuncioCaparraVersata = row.original.annunci_servizio.filter(
(a) => a.status_conferma === StatusConfermaEnum["Caparra versata"], (a) =>
a.status_conferma === statusConfermaEnum.enum["Caparra versata"],
); );
if (annuncioCaparraVersata.length > 0) { if (annuncioCaparraVersata.length > 0) {
if (row.original.isOkSaldo) { if (row.original.isOkSaldo) {
@ -445,7 +447,8 @@ export const RichiesteTable = ({ data }: RichiesteTableProps) => {
} }
const annuncioConfermato = row.original.annunci_servizio.filter( const annuncioConfermato = row.original.annunci_servizio.filter(
(a) => (a) =>
a.status_conferma === StatusConfermaEnum["Conferma accettata"], a.status_conferma ===
statusConfermaEnum.enum["Conferma accettata"],
); );
if (annuncioConfermato.length > 0) { if (annuncioConfermato.length > 0) {
badgeClass = "border-yellow-500 bg-yellow-500/10 text-yellow-600"; badgeClass = "border-yellow-500 bg-yellow-500/10 text-yellow-600";
@ -460,7 +463,8 @@ export const RichiesteTable = ({ data }: RichiesteTableProps) => {
} }
const annuncioAttesaConferma = row.original.annunci_servizio.filter( const annuncioAttesaConferma = row.original.annunci_servizio.filter(
(a) => a.status_conferma === StatusConfermaEnum["Inviato conferma"], (a) =>
a.status_conferma === statusConfermaEnum.enum["Inviato conferma"],
); );
if (annuncioAttesaConferma.length > 0) { if (annuncioAttesaConferma.length > 0) {
badgeClass = "border-blue-500 bg-blue-500/10 text-blue-500"; badgeClass = "border-blue-500 bg-blue-500/10 text-blue-500";

View file

@ -17,9 +17,12 @@ import {
SelectValue, SelectValue,
} from "~/components/ui/select"; } from "~/components/ui/select";
import { useZodForm } from "~/lib/zodForm"; import { useZodForm } from "~/lib/zodForm";
import type { Banlist, BanlistId } from "~/schemas/public/Banlist"; import {
import BanType from "~/schemas/public/BanType"; type Banlist,
import { zBanlistId, zBanType } from "~/server/utils/zod_types"; type BanlistId,
banlistId,
} from "~/schemas/public/Banlist";
import { banType } from "~/schemas/public/BanType";
type FormProps = { type FormProps = {
initialValues: Banlist | null; initialValues: Banlist | null;
@ -33,8 +36,8 @@ export const FormBanlist = ({
del, del,
}: FormProps) => { }: FormProps) => {
const Schema = z.object({ const Schema = z.object({
id: zBanlistId, id: banlistId,
type: zBanType, type: banType,
value: z.string(), value: z.string(),
}); });
type FormValues = z.infer<typeof Schema>; type FormValues = z.infer<typeof Schema>;
@ -44,7 +47,7 @@ export const FormBanlist = ({
if (!initialValues) { if (!initialValues) {
defaultValues = { defaultValues = {
id: 0 as BanlistId, id: 0 as BanlistId,
type: BanType.email, type: banType.enum.email,
value: "", value: "",
}; };
} else { } else {
@ -93,7 +96,7 @@ export const FormBanlist = ({
</SelectTrigger> </SelectTrigger>
</FormControl> </FormControl>
<SelectContent id="select-color"> <SelectContent id="select-color">
{Object.values(BanType).map((option) => ( {banType.options.map((option) => (
<SelectItem key={option} value={option}> <SelectItem key={option} value={option}>
{option} {option}
</SelectItem> </SelectItem>

View file

@ -59,8 +59,8 @@ import { cn } from "~/lib/utils";
import { useZodForm } from "~/lib/zodForm"; import { useZodForm } from "~/lib/zodForm";
import { StatusBadge } from "~/pages/area-riservata/admin/edit-annuncio/[id]"; import { StatusBadge } from "~/pages/area-riservata/admin/edit-annuncio/[id]";
import { useTranslation } from "~/providers/I18nProvider"; import { useTranslation } from "~/providers/I18nProvider";
import { annunciId } from "~/schemas/public/Annunci";
import type { AnnunciWithMedia } from "~/server/controllers/annunci.controller"; import type { AnnunciWithMedia } from "~/server/controllers/annunci.controller";
import { zAnnuncioId } from "~/server/utils/zod_types";
import { api } from "~/utils/api"; import { api } from "~/utils/api";
import type { Caratteristiche } from "~/utils/kanel-types"; import type { Caratteristiche } from "~/utils/kanel-types";
@ -85,7 +85,7 @@ export const AnnuncioEditForm = ({ data }: { data: AnnunciWithMedia }) => {
email: z.email().nullable(), email: z.email().nullable(),
homepage: z.boolean().nullable(), homepage: z.boolean().nullable(),
//BASE //BASE
id: zAnnuncioId, id: annunciId,
// DATI IMMOBILE // DATI IMMOBILE
indirizzo: z.string().nullable(), indirizzo: z.string().nullable(),

View file

@ -37,11 +37,13 @@ import { Switch } from "~/components/ui/switch";
import { PAYMENT_TYPES, type PaymentType } from "~/i18n/stripe"; import { PAYMENT_TYPES, type PaymentType } from "~/i18n/stripe";
import { cn, formatCurrency } from "~/lib/utils"; import { cn, formatCurrency } from "~/lib/utils";
import { useZodForm } from "~/lib/zodForm"; import { useZodForm } from "~/lib/zodForm";
import OrderTypeEnum from "~/schemas/public/OrderTypeEnum"; import { orderTypeEnum } from "~/schemas/public/OrderTypeEnum";
import type { Ordini } from "~/schemas/public/Ordini"; import type { Ordini } from "~/schemas/public/Ordini";
import PaymentStatusEnum from "~/schemas/public/PaymentStatusEnum"; import { paymentStatusEnum } from "~/schemas/public/PaymentStatusEnum";
import type { Prezziario } from "~/schemas/public/Prezziario"; import {
import { zPrezziarioId } from "~/server/utils/zod_types"; type Prezziario,
prezziarioIdprezziario,
} from "~/schemas/public/Prezziario";
import { api } from "~/utils/api"; import { api } from "~/utils/api";
type FormProps = { type FormProps = {
@ -52,15 +54,15 @@ type FormProps = {
export const FormEditOrder = ({ prezziario, data, close }: FormProps) => { export const FormEditOrder = ({ prezziario, data, close }: FormProps) => {
const schema = z.object({ const schema = z.object({
packid: zPrezziarioId, packid: prezziarioIdprezziario,
isActive: z.boolean(), isActive: z.boolean(),
type: z.enum(OrderTypeEnum), type: orderTypeEnum,
created_at: z.date(), created_at: z.date(),
amount_cent: z.number(), amount_cent: z.number(),
sconto: z.number().min(0).max(100), sconto: z.number().min(0).max(100),
paid_at: z.date().nullable(), paid_at: z.date().nullable(),
paymentmethod: z.enum(PAYMENT_TYPES).nullable(), paymentmethod: z.enum(PAYMENT_TYPES).nullable(),
paymentstatus: z.enum(PaymentStatusEnum).nullable(), paymentstatus: paymentStatusEnum.nullable(),
}); });
type FormValues = z.infer<typeof schema>; type FormValues = z.infer<typeof schema>;
@ -137,7 +139,7 @@ export const FormEditOrder = ({ prezziario, data, close }: FormProps) => {
elementName="packid" elementName="packid"
isMulti={false} isMulti={false}
onValueChange={(value) => { onValueChange={(value) => {
const selected = zPrezziarioId.safeParse( const selected = prezziarioIdprezziario.safeParse(
value.value, value.value,
); );
if (selected.success) { if (selected.success) {
@ -191,7 +193,7 @@ export const FormEditOrder = ({ prezziario, data, close }: FormProps) => {
</SelectTrigger> </SelectTrigger>
</FormControl> </FormControl>
<SelectContent> <SelectContent>
{Object.values(OrderTypeEnum).map((option) => ( {orderTypeEnum.options.map((option) => (
<SelectItem key={option} value={option}> <SelectItem key={option} value={option}>
{option} {option}
</SelectItem> </SelectItem>
@ -301,7 +303,7 @@ export const FormEditOrder = ({ prezziario, data, close }: FormProps) => {
</SelectTrigger> </SelectTrigger>
</FormControl> </FormControl>
<SelectContent> <SelectContent>
{Object.values(PaymentStatusEnum).map((option) => ( {paymentStatusEnum.options.map((option) => (
<SelectItem key={option} value={option}> <SelectItem key={option} value={option}>
{option} {option}
</SelectItem> </SelectItem>

View file

@ -12,11 +12,11 @@ import {
import { Button } from "~/components/ui/button"; import { Button } from "~/components/ui/button";
import Input from "~/components/ui/input"; import Input from "~/components/ui/input";
import { useZodForm } from "~/lib/zodForm"; import { useZodForm } from "~/lib/zodForm";
import type { import {
Etichette, type Etichette,
EtichetteIdEtichetta, type EtichetteIdEtichetta,
etichetteIdEtichetta,
} from "~/schemas/public/Etichette"; } from "~/schemas/public/Etichette";
import { zEtichettaId } from "~/server/utils/zod_types";
type FormProps = { type FormProps = {
initialValues: Etichette | null; initialValues: Etichette | null;
@ -30,7 +30,7 @@ export const FormEtichette = ({
}: FormProps) => { }: FormProps) => {
const Schema = z.object({ const Schema = z.object({
color_hex: z.string().max(7), color_hex: z.string().max(7),
id_etichetta: zEtichettaId, id_etichetta: etichetteIdEtichetta,
title: z.string(), title: z.string(),
}); });
type FormValues = z.infer<typeof Schema>; type FormValues = z.infer<typeof Schema>;

View file

@ -36,12 +36,14 @@ import { Switch } from "~/components/ui/switch";
import { PAYMENT_TYPES } from "~/i18n/stripe"; import { PAYMENT_TYPES } from "~/i18n/stripe";
import { cn, formatCurrency } from "~/lib/utils"; import { cn, formatCurrency } from "~/lib/utils";
import { useZodForm } from "~/lib/zodForm"; import { useZodForm } from "~/lib/zodForm";
import OrderTypeEnum from "~/schemas/public/OrderTypeEnum"; import { orderTypeEnum } from "~/schemas/public/OrderTypeEnum";
import PaymentStatusEnum from "~/schemas/public/PaymentStatusEnum"; import { paymentStatusEnum } from "~/schemas/public/PaymentStatusEnum";
import type { Prezziario } from "~/schemas/public/Prezziario"; import {
type Prezziario,
prezziarioIdprezziario,
} from "~/schemas/public/Prezziario";
import type { ServizioServizioId } from "~/schemas/public/Servizio"; import type { ServizioServizioId } from "~/schemas/public/Servizio";
import type { UsersId } from "~/schemas/public/Users"; import type { UsersId } from "~/schemas/public/Users";
import { zPrezziarioId } from "~/server/utils/zod_types";
import { api } from "~/utils/api"; import { api } from "~/utils/api";
type FormProps = { type FormProps = {
@ -58,14 +60,14 @@ export const FormNewOrder = ({
setOpen, setOpen,
}: FormProps) => { }: FormProps) => {
const schema = z.object({ const schema = z.object({
packid: zPrezziarioId, packid: prezziarioIdprezziario,
isActive: z.boolean(), isActive: z.boolean(),
type: z.enum(OrderTypeEnum), type: orderTypeEnum,
created_at: z.date(), created_at: z.date(),
amount_cent: z.number(), amount_cent: z.number(),
sconto: z.number().min(0).max(100), sconto: z.number().min(0).max(100),
paymentmethod: z.enum(PAYMENT_TYPES).nullable(), paymentmethod: z.enum(PAYMENT_TYPES).nullable(),
paymentstatus: z.enum(PaymentStatusEnum).nullable(), paymentstatus: paymentStatusEnum.nullable(),
}); });
type FormValues = z.infer<typeof schema>; type FormValues = z.infer<typeof schema>;
@ -123,7 +125,9 @@ export const FormNewOrder = ({
elementName="packid" elementName="packid"
isMulti={false} isMulti={false}
onValueChange={(value) => { onValueChange={(value) => {
const selected = zPrezziarioId.safeParse(value.value); const selected = prezziarioIdprezziario.safeParse(
value.value,
);
if (selected.success) { if (selected.success) {
field.onChange(selected.data); field.onChange(selected.data);
const selectedPrezzo = prezziario.find( const selectedPrezzo = prezziario.find(
@ -173,7 +177,7 @@ export const FormNewOrder = ({
</SelectTrigger> </SelectTrigger>
</FormControl> </FormControl>
<SelectContent id="select-color"> <SelectContent id="select-color">
{Object.values(OrderTypeEnum).map((option) => ( {orderTypeEnum.options.map((option) => (
<SelectItem key={option} value={option}> <SelectItem key={option} value={option}>
{option} {option}
</SelectItem> </SelectItem>
@ -275,7 +279,7 @@ export const FormNewOrder = ({
</SelectTrigger> </SelectTrigger>
</FormControl> </FormControl>
<SelectContent id="select-paymentstatus"> <SelectContent id="select-paymentstatus">
{Object.values(PaymentStatusEnum).map((option) => ( {paymentStatusEnum.options.map((option) => (
<SelectItem key={option} value={option}> <SelectItem key={option} value={option}>
{option} {option}
</SelectItem> </SelectItem>

View file

@ -22,12 +22,12 @@ import { Switch } from "~/components/ui/switch";
import { Textarea } from "~/components/ui/textarea"; import { Textarea } from "~/components/ui/textarea";
import { FieldResetButton } from "~/forms/comps"; import { FieldResetButton } from "~/forms/comps";
import { useZodForm } from "~/lib/zodForm"; import { useZodForm } from "~/lib/zodForm";
import OrderTypeEnum from "~/schemas/public/OrderTypeEnum"; import { orderTypeEnum } from "~/schemas/public/OrderTypeEnum";
import type { import type {
Prezziario, Prezziario,
PrezziarioIdprezziario, PrezziarioIdprezziario,
} from "~/schemas/public/Prezziario"; } from "~/schemas/public/Prezziario";
import TipologiaPosizioneEnum from "~/schemas/public/TipologiaPosizioneEnum"; import { tipologiaPosizioneEnum } from "~/schemas/public/TipologiaPosizioneEnum";
import { api } from "~/utils/api"; import { api } from "~/utils/api";
type FormPrezzoProps = { type FormPrezzoProps = {
@ -56,8 +56,8 @@ export const FormPrezzo = ({
prezzo_cent: z.number().min(0), prezzo_cent: z.number().min(0),
sconto: z.number().min(0).max(100), sconto: z.number().min(0).max(100),
testo_condizioni: z.string().nullable(), testo_condizioni: z.string().nullable(),
order_type: z.enum(OrderTypeEnum).nullable(), order_type: orderTypeEnum.nullable(),
service_type: z.enum(TipologiaPosizioneEnum).nullable(), service_type: tipologiaPosizioneEnum.nullable(),
service_variant: z.number().nullable(), service_variant: z.number().nullable(),
}) })
.superRefine(({ testo_condizioni }, ctx) => { .superRefine(({ testo_condizioni }, ctx) => {
@ -297,7 +297,7 @@ export const FormPrezzo = ({
</SelectTrigger> </SelectTrigger>
</FormControl> </FormControl>
<SelectContent id="select-order_type"> <SelectContent id="select-order_type">
{Object.values(OrderTypeEnum).map((option) => ( {orderTypeEnum.options.map((option) => (
<SelectItem key={option} value={option}> <SelectItem key={option} value={option}>
{option} {option}
</SelectItem> </SelectItem>
@ -336,13 +336,11 @@ export const FormPrezzo = ({
</SelectTrigger> </SelectTrigger>
</FormControl> </FormControl>
<SelectContent id="select-service_type"> <SelectContent id="select-service_type">
{Object.values(TipologiaPosizioneEnum).map( {tipologiaPosizioneEnum.options.map((option) => (
(option) => (
<SelectItem key={option} value={option}> <SelectItem key={option} value={option}>
{option} {option}
</SelectItem> </SelectItem>
), ))}
)}
</SelectContent> </SelectContent>
</Select> </Select>
</FormControl> </FormControl>

View file

@ -59,13 +59,10 @@ import { cn } from "~/lib/utils";
import { useZodForm } from "~/lib/zodForm"; import { useZodForm } from "~/lib/zodForm";
import { useCatasto } from "~/providers/CatastoProvider"; import { useCatasto } from "~/providers/CatastoProvider";
import { useTranslation } from "~/providers/I18nProvider"; import { useTranslation } from "~/providers/I18nProvider";
import type { Servizio, ServizioUpdate } from "~/schemas/public/Servizio"; import type { Servizio } from "~/schemas/public/Servizio";
import TipologiaPosizioneEnum from "~/schemas/public/TipologiaPosizioneEnum"; import { tipologiaPosizioneEnum } from "~/schemas/public/TipologiaPosizioneEnum";
import type { Users, UsersId } from "~/schemas/public/Users"; import type { Users, UsersId } from "~/schemas/public/Users";
import type { import type { UsersAnagrafica } from "~/schemas/public/UsersAnagrafica";
UsersAnagrafica,
UsersAnagraficaUpdate,
} from "~/schemas/public/UsersAnagrafica";
import { api } from "~/utils/api"; import { api } from "~/utils/api";
type InitialData = { type InitialData = {
@ -105,7 +102,7 @@ const schema = z.object({
sesso: z.string(), sesso: z.string(),
telefono: z.string(), telefono: z.string(),
terrazzo: z.boolean(), terrazzo: z.boolean(),
tipologia: z.custom<TipologiaPosizioneEnum>(), tipologia: tipologiaPosizioneEnum,
scadenza_motivazione_transitoria: z.date().nullable(), scadenza_motivazione_transitoria: z.date().nullable(),
skipPayment: z.boolean(), skipPayment: z.boolean(),
}); });
@ -228,7 +225,7 @@ export const FormServizioAcquisto = ({
}); });
} }
if (tipologia === TipologiaPosizioneEnum.Transitorio) { if (tipologia === tipologiaPosizioneEnum.enum.Transitorio) {
if ( if (
motivazione_transitorio === "" || motivazione_transitorio === "" ||
motivazione_transitorio === null motivazione_transitorio === null
@ -324,7 +321,8 @@ export const FormServizioAcquisto = ({
}); });
function onSubmit(fields: FormServizioAcquistoValues) { function onSubmit(fields: FormServizioAcquistoValues) {
const a: UsersAnagraficaUpdate = { mutate({
anagrafica: {
cap_residenza: fields.cap_recapiti, cap_residenza: fields.cap_recapiti,
civico_residenza: fields.civico_recapiti, civico_residenza: fields.civico_recapiti,
codice_fiscale: fields.codice_fiscale, codice_fiscale: fields.codice_fiscale,
@ -338,8 +336,8 @@ export const FormServizioAcquisto = ({
sesso: fields.sesso, sesso: fields.sesso,
userid: userId, userid: userId,
via_residenza: fields.indirizzo_recapiti, via_residenza: fields.indirizzo_recapiti,
}; },
const s: ServizioUpdate = { servizio: {
animali: fields.animali, animali: fields.animali,
arredato: fields.arredato, arredato: fields.arredato,
ascensore: fields.ascensore, ascensore: fields.ascensore,
@ -357,23 +355,17 @@ export const FormServizioAcquisto = ({
terrazzo: fields.terrazzo, terrazzo: fields.terrazzo,
tipologia: fields.tipologia, tipologia: fields.tipologia,
skipPayment: fields.skipPayment, skipPayment: fields.skipPayment,
scadenza_motivazione_transitoria: fields.scadenza_motivazione_transitoria, scadenza_motivazione_transitoria:
}; fields.scadenza_motivazione_transitoria,
const u: Pick< },
Users, servizioId: initialData.servizio.servizio_id,
"nome" | "cognome" | "email" | "telefono" | "username" user: {
> = {
cognome: fields.cognome, cognome: fields.cognome,
email: fields.email, email: fields.email,
nome: fields.nome, nome: fields.nome,
telefono: fields.telefono.replace(/\s/g, ""), telefono: fields.telefono.replace(/\s/g, ""),
username: `${fields.cognome.trim()} ${fields.nome.trim()}`, username: `${fields.cognome.trim()} ${fields.nome.trim()}`,
}; },
mutate({
anagrafica: a,
servizio: s,
servizioId: initialData.servizio.servizio_id,
user: u,
userId, userId,
}); });
} }
@ -445,14 +437,14 @@ export const FormServizioAcquisto = ({
) : ( ) : (
<MultiSelect <MultiSelect
defaultValue={ defaultValue={
field.value === TipologiaPosizioneEnum.Transitorio field.value === tipologiaPosizioneEnum.enum.Transitorio
? { ? {
label: "Transitorio", label: "Transitorio",
value: TipologiaPosizioneEnum.Transitorio, value: tipologiaPosizioneEnum.enum.Transitorio,
} }
: { : {
label: "Stabile", label: "Stabile",
value: TipologiaPosizioneEnum.Stabile, value: tipologiaPosizioneEnum.enum.Stabile,
} }
} }
elementId="select-tipologia" elementId="select-tipologia"
@ -466,11 +458,11 @@ export const FormServizioAcquisto = ({
options={[ options={[
{ {
label: "Transitorio", label: "Transitorio",
value: TipologiaPosizioneEnum.Transitorio, value: tipologiaPosizioneEnum.enum.Transitorio,
}, },
{ {
label: "Stabile", label: "Stabile",
value: TipologiaPosizioneEnum.Stabile, value: tipologiaPosizioneEnum.enum.Stabile,
}, },
]} ]}
placeholder={t.seleziona_placeholder} placeholder={t.seleziona_placeholder}
@ -552,14 +544,15 @@ export const FormServizioAcquisto = ({
/> />
<FormField <FormField
control={form.control} control={form.control}
disabled={tipologia !== TipologiaPosizioneEnum.Transitorio} disabled={tipologia !== tipologiaPosizioneEnum.enum.Transitorio}
name="permanenza" name="permanenza"
render={({ field }) => ( render={({ field }) => (
<FormItem className="w-full"> <FormItem className="w-full">
<div className="flex flex-wrap items-center gap-x-2"> <div className="flex flex-wrap items-center gap-x-2">
<FormLabel <FormLabel
className={cn( className={cn(
tipologia !== TipologiaPosizioneEnum.Transitorio && tipologia !==
tipologiaPosizioneEnum.enum.Transitorio &&
"opacity-50", "opacity-50",
)} )}
htmlFor="permanenza" htmlFor="permanenza"
@ -581,7 +574,7 @@ export const FormServizioAcquisto = ({
: undefined : undefined
} }
disabled={ disabled={
tipologia !== TipologiaPosizioneEnum.Transitorio tipologia !== tipologiaPosizioneEnum.enum.Transitorio
} }
elementId="permanenza" elementId="permanenza"
elementName="permanenza" elementName="permanenza"
@ -597,7 +590,7 @@ export const FormServizioAcquisto = ({
placeholder="Seleziona..." placeholder="Seleziona..."
/> />
</FormControl> </FormControl>
{tipologia === TipologiaPosizioneEnum.Transitorio && ( {tipologia === tipologiaPosizioneEnum.enum.Transitorio && (
<FormDescription> <FormDescription>
{t.parametri.permanenza_desc} {t.parametri.permanenza_desc}
</FormDescription> </FormDescription>
@ -682,7 +675,7 @@ export const FormServizioAcquisto = ({
/> />
</div> </div>
{tipologia === TipologiaPosizioneEnum.Transitorio ? ( {tipologia === tipologiaPosizioneEnum.enum.Transitorio ? (
<div className="items-top flex w-full flex-col justify-between gap-4 sm:flex-row"> <div className="items-top flex w-full flex-col justify-between gap-4 sm:flex-row">
<FormField <FormField
control={form.control} control={form.control}

View file

@ -130,7 +130,7 @@ export const useLiveChat = (chatId: ChatsChatid, userData: Session) => {
lastEventId === false ? skipToken : { chatId, lastEventId }, lastEventId === false ? skipToken : { chatId, lastEventId },
{ {
onData({ data }) { onData({ data }) {
addMessages([data]); addMessages([data as Message]);
setRead({ chatId }); setRead({ chatId });
}, },
@ -148,9 +148,11 @@ export const useLiveChat = (chatId: ChatsChatid, userData: Session) => {
{ {
onData(event) { onData(event) {
if (event.eventType === "edit") { if (event.eventType === "edit") {
updateMessage(event.data.messageId, { message: event.data.message }); updateMessage(event.data.messageId as MessagesMessageid, {
message: event.data.message,
});
} else if (event.eventType === "delete") { } else if (event.eventType === "delete") {
deleteMessage(event.data); deleteMessage(event.data as MessagesMessageid);
} else if (event.eventType === "read_receipt") { } else if (event.eventType === "read_receipt") {
// Mark all messages sent by this user as read // Mark all messages sent by this user as read
setMessages((current) => setMessages((current) =>
@ -172,7 +174,8 @@ export const useLiveChat = (chatId: ChatsChatid, userData: Session) => {
api.chatSSE.onTyping.useSubscription( api.chatSSE.onTyping.useSubscription(
{ chatId, username: userData.username, userId: userData.id }, { chatId, username: userData.username, userId: userData.id },
{ {
onData(typers: TypingData) { onData(data) {
const typers = data as TypingData;
setTypingStatus(typers.filter((n) => n.userId !== userData.id)); setTypingStatus(typers.filter((n) => n.userId !== userData.id));
}, },
}, },

View file

@ -62,7 +62,9 @@ import { cn, redirectTo500 } from "~/lib/utils";
import { AnnuncioContext, useAnnuncio } from "~/providers/AnnuncioProvider"; import { AnnuncioContext, useAnnuncio } from "~/providers/AnnuncioProvider";
import { useTranslation } from "~/providers/I18nProvider"; import { useTranslation } from "~/providers/I18nProvider";
import { buildRicercaUrl } from "~/providers/RicercaProvider"; import { buildRicercaUrl } from "~/providers/RicercaProvider";
import TipologiaPosizioneEnum from "~/schemas/public/TipologiaPosizioneEnum"; import {
tipologiaPosizioneEnum,
} from "~/schemas/public/TipologiaPosizioneEnum";
import type { AnnuncioData } from "~/server/controllers/annunci.controller"; import type { AnnuncioData } from "~/server/controllers/annunci.controller";
import { generateSSGHelper } from "~/server/utils/ssgHelper"; import { generateSSGHelper } from "~/server/utils/ssgHelper";
import { api } from "~/utils/api"; import { api } from "~/utils/api";
@ -228,8 +230,8 @@ const Pricing = ({ isDesktop }: { isDesktop: boolean }) => {
const { prezzo, tipo } = useAnnuncio(); const { prezzo, tipo } = useAnnuncio();
const tipologia = const tipologia =
tipo === "Transitorio" tipo === "Transitorio"
? TipologiaPosizioneEnum.Transitorio ? tipologiaPosizioneEnum.enum.Transitorio
: TipologiaPosizioneEnum.Stabile; : tipologiaPosizioneEnum.enum.Stabile;
const { data: prezziario, isLoading } = const { data: prezziario, isLoading } =
api.prezziario.getPrezziPerTipologia.useQuery({ api.prezziario.getPrezziPerTipologia.useQuery({
tipologia, tipologia,
@ -252,7 +254,7 @@ const Pricing = ({ isDesktop }: { isDesktop: boolean }) => {
]; ];
const cta = const cta =
tipologia === TipologiaPosizioneEnum.Transitorio tipologia === tipologiaPosizioneEnum.enum.Transitorio
? t.pricing_cmp.cta_breve ? t.pricing_cmp.cta_breve
: t.pricing_cmp.cta_stabile; : t.pricing_cmp.cta_stabile;
@ -264,7 +266,7 @@ const Pricing = ({ isDesktop }: { isDesktop: boolean }) => {
let opzioni: string[] = []; let opzioni: string[] = [];
let pricingData: PricingData = []; let pricingData: PricingData = [];
if (tipologia === TipologiaPosizioneEnum.Stabile) { if (tipologia === tipologiaPosizioneEnum.enum.Stabile) {
//se stabile, mostra il prezzo basato sul canone in default //se stabile, mostra il prezzo basato sul canone in default
const idx = prezzo > 70000 ? 2 : prezzo > 50000 ? 1 : 0; const idx = prezzo > 70000 ? 2 : prezzo > 50000 ? 1 : 0;
const opzione = opzioniS[idx]; const opzione = opzioniS[idx];
@ -282,12 +284,12 @@ const Pricing = ({ isDesktop }: { isDesktop: boolean }) => {
} }
const style = const style =
tipologia === TipologiaPosizioneEnum.Transitorio tipologia === tipologiaPosizioneEnum.enum.Transitorio
? "border-transitorio bg-transitorio" ? "border-transitorio bg-transitorio"
: "border-stabile bg-stabile"; : "border-stabile bg-stabile";
const title = const title =
tipologia === TipologiaPosizioneEnum.Transitorio tipologia === tipologiaPosizioneEnum.enum.Transitorio
? t.prezzi.titolo_transitori ? t.prezzi.titolo_transitori
: t.prezzi.titolo_stabile; : t.prezzi.titolo_stabile;
@ -313,7 +315,7 @@ const Pricing = ({ isDesktop }: { isDesktop: boolean }) => {
<Button <Button
className={cn( className={cn(
"w-full text-white", "w-full text-white",
tipologia === TipologiaPosizioneEnum.Transitorio tipologia === tipologiaPosizioneEnum.enum.Transitorio
? "bg-transitorio" ? "bg-transitorio"
: "bg-stabile", : "bg-stabile",
)} )}

View file

@ -2,9 +2,9 @@ import type { NextApiRequest, NextApiResponse } from "next";
import type Stripe from "stripe"; import type Stripe from "stripe";
import { env } from "~/env"; import { env } from "~/env";
import stripe from "~/lib/stripe"; import stripe from "~/lib/stripe";
import { ordiniOrdineId } from "~/schemas/public/Ordini";
import { appRouter } from "~/server/api/root"; import { appRouter } from "~/server/api/root";
import { addApiAuthToContext, createTRPCContext, t } from "~/server/api/trpc"; import { addApiAuthToContext, createTRPCContext, t } from "~/server/api/trpc";
import { zOrdineId } from "~/server/utils/zod_types";
/** /**
* /api/stripe-webhook * /api/stripe-webhook
@ -51,7 +51,7 @@ const handler = async (
throw new Error("No metadata in payment intent"); throw new Error("No metadata in payment intent");
} }
const metadataOrdineId = metadata.ordineId; const metadataOrdineId = metadata.ordineId;
const ordineId = zOrdineId.safeParse(metadataOrdineId); const ordineId = ordiniOrdineId.safeParse(metadataOrdineId);
if (!metadata.ordineId || !ordineId.success) { if (!metadata.ordineId || !ordineId.success) {
throw new Error("No ordineId or userId in metadata"); throw new Error("No ordineId or userId in metadata");
} }
@ -71,7 +71,7 @@ const handler = async (
throw new Error("No metadata in payment intent"); throw new Error("No metadata in payment intent");
} }
const metadataOrdineId = metadata.ordineId; const metadataOrdineId = metadata.ordineId;
const ordineId = zOrdineId.safeParse(metadataOrdineId); const ordineId = ordiniOrdineId.safeParse(metadataOrdineId);
if (!metadata.ordineId || !ordineId.success) { if (!metadata.ordineId || !ordineId.success) {
throw new Error("No ordineId or userId in metadata"); throw new Error("No ordineId or userId in metadata");
} }

View file

@ -6,9 +6,8 @@ import { Badge } from "~/components/ui/badge";
import { AnnuncioEditForm } from "~/forms/FormEditAnnuncio"; import { AnnuncioEditForm } from "~/forms/FormEditAnnuncio";
import { cn, redirectTo500 } from "~/lib/utils"; import { cn, redirectTo500 } from "~/lib/utils";
import type { NextPageWithLayout } from "~/pages/_app"; import type { NextPageWithLayout } from "~/pages/_app";
import type { AnnunciId } from "~/schemas/public/Annunci"; import { type AnnunciId, annunciId } from "~/schemas/public/Annunci";
import { generateSSGHelper } from "~/server/utils/ssgHelper"; import { generateSSGHelper } from "~/server/utils/ssgHelper";
import { zAnnuncioId } from "~/server/utils/zod_types";
import { api } from "~/utils/api"; import { api } from "~/utils/api";
type AnnuncioEditProps = { type AnnuncioEditProps = {
@ -43,7 +42,7 @@ const AnnuncioEdit: NextPageWithLayout<AnnuncioEditProps> = ({
export const getServerSideProps = (async (context) => { export const getServerSideProps = (async (context) => {
const annuncioId = context.params?.id && parseInt(String(context.params.id)); const annuncioId = context.params?.id && parseInt(String(context.params.id));
const check = zAnnuncioId.safeParse(annuncioId); const check = annunciId.safeParse(annuncioId);
if (!check.success) { if (!check.success) {
return redirectTo500; return redirectTo500;
} }

View file

@ -2,9 +2,8 @@ import type { GetServerSideProps } from "next";
import { AllegatiComp } from "~/components/area-riservata/allegati"; import { AllegatiComp } from "~/components/area-riservata/allegati";
import { AreaRiservataLayoutUserView } from "~/components/Layout"; import { AreaRiservataLayoutUserView } from "~/components/Layout";
import type { NextPageWithLayout } from "~/pages/_app"; import type { NextPageWithLayout } from "~/pages/_app";
import type { UsersId } from "~/schemas/public/Users"; import { type UsersId, usersId } from "~/schemas/public/Users";
import { TrpcAuthedFetchingIstance } from "~/server/utils/ssgHelper"; import { TrpcAuthedFetchingIstance } from "~/server/utils/ssgHelper";
import { zUserId } from "~/server/utils/zod_types";
type AllegatiProps = { type AllegatiProps = {
userId: UsersId; userId: UsersId;
@ -32,7 +31,7 @@ export const getServerSideProps = (async (context) => {
}; };
} }
const parsed = zUserId.safeParse(userId); const parsed = usersId.safeParse(userId);
if (!parsed.success) { if (!parsed.success) {
return { return {

View file

@ -25,11 +25,10 @@ import { FormEditQueueMail } from "~/forms/FormEditQueueMail";
import { FormAddCodaEmail } from "~/forms/FormNewMail"; import { FormAddCodaEmail } from "~/forms/FormNewMail";
import type { NextPageWithLayout } from "~/pages/_app"; import type { NextPageWithLayout } from "~/pages/_app";
import { useEnforcedSession } from "~/providers/SessionProvider"; import { useEnforcedSession } from "~/providers/SessionProvider";
import type { UsersId } from "~/schemas/public/Users"; import { usersId, type UsersId } from "~/schemas/public/Users";
import type { Email_EventData } from "~/server/controllers/event_queue.controller"; import type { Email_EventData } from "~/server/controllers/event_queue.controller";
import { TrpcAuthedFetchingIstance } from "~/server/utils/ssgHelper"; import { TrpcAuthedFetchingIstance } from "~/server/utils/ssgHelper";
import { zUserId } from "~/server/utils/zod_types";
import { api } from "~/utils/api"; import { api } from "~/utils/api";
type ComunicazioniUserProps = { type ComunicazioniUserProps = {
@ -106,7 +105,7 @@ export const getServerSideProps = (async (context) => {
}; };
} }
const parsed = zUserId.safeParse(userId); const parsed = usersId.safeParse(userId);
if (!parsed.success) { if (!parsed.success) {
return { return {

View file

@ -36,9 +36,8 @@ import { ProfileFormAccount } from "~/forms/FormProfilo_Account";
import { ProfileFormAnagrafica } from "~/forms/FormProfilo_Anagrafica"; import { ProfileFormAnagrafica } from "~/forms/FormProfilo_Anagrafica";
import type { NextPageWithLayout } from "~/pages/_app"; import type { NextPageWithLayout } from "~/pages/_app";
import { CatastoProvider } from "~/providers/CatastoProvider"; import { CatastoProvider } from "~/providers/CatastoProvider";
import type { UsersId } from "~/schemas/public/Users"; import { type UsersId, usersId } from "~/schemas/public/Users";
import { TrpcAuthedFetchingIstance } from "~/server/utils/ssgHelper"; import { TrpcAuthedFetchingIstance } from "~/server/utils/ssgHelper";
import { zUserId } from "~/server/utils/zod_types";
import { api } from "~/utils/api"; import { api } from "~/utils/api";
type EditUserProps = { type EditUserProps = {
@ -262,7 +261,7 @@ export const getServerSideProps = (async (context) => {
}; };
} }
const parsed = zUserId.safeParse(userId); const parsed = usersId.safeParse(userId);
if (!parsed.success) { if (!parsed.success) {
return { return {

View file

@ -6,10 +6,12 @@ import { FormServizioAcquisto } from "~/forms/FormServizioAcquisto";
import { redirectTo500 } from "~/lib/utils"; import { redirectTo500 } from "~/lib/utils";
import type { NextPageWithLayout } from "~/pages/_app"; import type { NextPageWithLayout } from "~/pages/_app";
import { CatastoProvider } from "~/providers/CatastoProvider"; import { CatastoProvider } from "~/providers/CatastoProvider";
import type { ServizioServizioId } from "~/schemas/public/Servizio"; import {
type ServizioServizioId,
servizioServizioId,
} from "~/schemas/public/Servizio";
import type { UsersId } from "~/schemas/public/Users"; import type { UsersId } from "~/schemas/public/Users";
import { TrpcAuthedFetchingIstance } from "~/server/utils/ssgHelper"; import { TrpcAuthedFetchingIstance } from "~/server/utils/ssgHelper";
import { zServizioId } from "~/server/utils/zod_types";
import { api } from "~/utils/api"; import { api } from "~/utils/api";
type OnboardUserProps = { type OnboardUserProps = {
@ -60,7 +62,7 @@ export const getServerSideProps = (async (context) => {
return redirectTo500; return redirectTo500;
} }
const parsed = zServizioId.safeParse(id); const parsed = servizioServizioId.safeParse(id);
if (!parsed.success) { if (!parsed.success) {
console.error("Error parsing servizioId", parsed.error); console.error("Error parsing servizioId", parsed.error);
return redirectTo500; return redirectTo500;

View file

@ -6,9 +6,8 @@ import { Status500 } from "~/components/status-page";
import { OrdiniTable } from "~/components/tables/orders-table"; import { OrdiniTable } from "~/components/tables/orders-table";
import type { NextPageWithLayout } from "~/pages/_app"; import type { NextPageWithLayout } from "~/pages/_app";
import type { OrdiniOrdineId } from "~/schemas/public/Ordini"; import type { OrdiniOrdineId } from "~/schemas/public/Ordini";
import type { UsersId } from "~/schemas/public/Users"; import { type UsersId, usersId } from "~/schemas/public/Users";
import { TrpcAuthedFetchingIstance } from "~/server/utils/ssgHelper"; import { TrpcAuthedFetchingIstance } from "~/server/utils/ssgHelper";
import { zUserId } from "~/server/utils/zod_types";
import { api } from "~/utils/api"; import { api } from "~/utils/api";
type OrdiniUserProps = { type OrdiniUserProps = {
@ -54,7 +53,7 @@ export const getServerSideProps = (async (context) => {
}; };
} }
const parsed = zUserId.safeParse(userId); const parsed = usersId.safeParse(userId);
if (!parsed.success) { if (!parsed.success) {
return { return {

View file

@ -6,9 +6,8 @@ import { NewRinnovoModal } from "~/components/servizio/rinnovo";
import { ServizioList } from "~/components/servizio/servizio"; import { ServizioList } from "~/components/servizio/servizio";
import { AnnunciRichiesti } from "~/components/servizio/servizio_annunci_accordions"; import { AnnunciRichiesti } from "~/components/servizio/servizio_annunci_accordions";
import type { NextPageWithLayout } from "~/pages/_app"; import type { NextPageWithLayout } from "~/pages/_app";
import type { UsersId } from "~/schemas/public/Users"; import { type UsersId, usersId } from "~/schemas/public/Users";
import { TrpcAuthedFetchingIstance } from "~/server/utils/ssgHelper"; import { TrpcAuthedFetchingIstance } from "~/server/utils/ssgHelper";
import { zUserId } from "~/server/utils/zod_types";
import { api } from "~/utils/api"; import { api } from "~/utils/api";
type RicercaUserProps = { type RicercaUserProps = {
@ -52,7 +51,7 @@ export const getServerSideProps = (async (context) => {
}; };
} }
const parsed = zUserId.safeParse(userId); const parsed = usersId.safeParse(userId);
if (!parsed.success) { if (!parsed.success) {
return { return {

View file

@ -6,10 +6,9 @@ import { Status500 } from "~/components/status-page";
import { redirectTo500 } from "~/lib/utils"; import { redirectTo500 } from "~/lib/utils";
import type { NextPageWithLayout } from "~/pages/_app"; import type { NextPageWithLayout } from "~/pages/_app";
import { RinnovoProvider } from "~/providers/RinnovoProvider"; import { RinnovoProvider } from "~/providers/RinnovoProvider";
import type { RinnoviId } from "~/schemas/public/Rinnovi"; import { type RinnoviId, rinnoviId } from "~/schemas/public/Rinnovi";
import type { UsersId } from "~/schemas/public/Users"; import { type UsersId, usersId } from "~/schemas/public/Users";
import { TrpcAuthedFetchingIstance } from "~/server/utils/ssgHelper"; import { TrpcAuthedFetchingIstance } from "~/server/utils/ssgHelper";
import { zRinnovoId, zUserId } from "~/server/utils/zod_types";
import { api } from "~/utils/api"; import { api } from "~/utils/api";
type RinnovoUserProps = { type RinnovoUserProps = {
@ -53,18 +52,18 @@ export const getServerSideProps = (async (context) => {
if (typeof rinnovo_id !== "string" || typeof user_id !== "string") { if (typeof rinnovo_id !== "string" || typeof user_id !== "string") {
console.error("Error: rinnovoId or userId is not a string"); console.error("Error: rinnovoId or userId is not a string");
return redirectTo500 return redirectTo500;
} }
const parsedUserId = zUserId.safeParse(user_id); const parsedUserId = usersId.safeParse(user_id);
if (!parsedUserId.success) { if (!parsedUserId.success) {
console.error("Error parsing userId", parsedUserId.error); console.error("Error parsing userId", parsedUserId.error);
return redirectTo500 return redirectTo500;
} }
const parsedRinnovoId = zRinnovoId.safeParse(rinnovo_id); const parsedRinnovoId = rinnoviId.safeParse(rinnovo_id);
if (!parsedRinnovoId.success) { if (!parsedRinnovoId.success) {
console.error("Error parsing rinnovoId", parsedRinnovoId.error); console.error("Error parsing rinnovoId", parsedRinnovoId.error);
return redirectTo500 return redirectTo500;
} }
const rinnovoId = parsedRinnovoId.data; const rinnovoId = parsedRinnovoId.data;
const userId = parsedUserId.data; const userId = parsedUserId.data;
@ -86,7 +85,7 @@ export const getServerSideProps = (async (context) => {
}; };
} }
return redirectTo500 return redirectTo500;
}) satisfies GetServerSideProps<RinnovoUserProps>; }) satisfies GetServerSideProps<RinnovoUserProps>;
RinnovoUser.getLayout = function getLayout(page) { RinnovoUser.getLayout = function getLayout(page) {

View file

@ -6,10 +6,12 @@ import { AnnunciRichiesti } from "~/components/servizio/servizio_annunci_accordi
import { Status500 } from "~/components/status-page"; import { Status500 } from "~/components/status-page";
import { redirectTo500 } from "~/lib/utils"; import { redirectTo500 } from "~/lib/utils";
import type { NextPageWithLayout } from "~/pages/_app"; import type { NextPageWithLayout } from "~/pages/_app";
import type { ServizioServizioId } from "~/schemas/public/Servizio"; import {
import type { UsersId } from "~/schemas/public/Users"; type ServizioServizioId,
servizioServizioId,
} from "~/schemas/public/Servizio";
import { type UsersId, usersId } from "~/schemas/public/Users";
import { TrpcAuthedFetchingIstance } from "~/server/utils/ssgHelper"; import { TrpcAuthedFetchingIstance } from "~/server/utils/ssgHelper";
import { zServizioId, zUserId } from "~/server/utils/zod_types";
import { api } from "~/utils/api"; import { api } from "~/utils/api";
type ServizioUserProps = { type ServizioUserProps = {
@ -55,13 +57,13 @@ export const getServerSideProps = (async (context) => {
console.error("Error: servizioId or userId is not a string"); console.error("Error: servizioId or userId is not a string");
return redirectTo500; return redirectTo500;
} }
const parsedUserId = zUserId.safeParse(user_id); const parsedUserId = usersId.safeParse(user_id);
if (!parsedUserId.success) { if (!parsedUserId.success) {
console.error("Error parsing userId", parsedUserId.error); console.error("Error parsing userId", parsedUserId.error);
return redirectTo500; return redirectTo500;
} }
const parsedServizioId = zServizioId.safeParse(servizio_id); const parsedServizioId = servizioServizioId.safeParse(servizio_id);
if (!parsedServizioId.success) { if (!parsedServizioId.success) {
console.error("Error parsing servizioId", parsedServizioId.error); console.error("Error parsing servizioId", parsedServizioId.error);
return redirectTo500; return redirectTo500;

View file

@ -8,9 +8,8 @@ import { redirectTo500 } from "~/lib/utils";
import type { NextPageWithLayout } from "~/pages/_app"; import type { NextPageWithLayout } from "~/pages/_app";
import { RinnovoProvider } from "~/providers/RinnovoProvider"; import { RinnovoProvider } from "~/providers/RinnovoProvider";
import { useEnforcedSession } from "~/providers/SessionProvider"; import { useEnforcedSession } from "~/providers/SessionProvider";
import type { RinnoviId } from "~/schemas/public/Rinnovi"; import { type RinnoviId, rinnoviId } from "~/schemas/public/Rinnovi";
import { TrpcAuthedFetchingIstance } from "~/server/utils/ssgHelper"; import { TrpcAuthedFetchingIstance } from "~/server/utils/ssgHelper";
import { zRinnovoId } from "~/server/utils/zod_types";
import { api } from "~/utils/api"; import { api } from "~/utils/api";
type RinnovoPageProps = { type RinnovoPageProps = {
@ -61,7 +60,7 @@ export const getServerSideProps = (async (context) => {
return redirectTo500; return redirectTo500;
} }
const parsedRinnovoId = zRinnovoId.safeParse(rinnovo_id); const parsedRinnovoId = rinnoviId.safeParse(rinnovo_id);
if (!parsedRinnovoId.success) { if (!parsedRinnovoId.success) {
console.error("Error parsing rinnovoId", parsedRinnovoId.error); console.error("Error parsing rinnovoId", parsedRinnovoId.error);
return redirectTo500; return redirectTo500;

View file

@ -11,9 +11,8 @@ import { Card } from "~/components/ui/card";
import { replaceWithBr } from "~/lib/newlineToBr"; import { replaceWithBr } from "~/lib/newlineToBr";
import { formatCurrency, redirectTo500 } from "~/lib/utils"; import { formatCurrency, redirectTo500 } from "~/lib/utils";
import type { NextPageWithLayout } from "~/pages/_app"; import type { NextPageWithLayout } from "~/pages/_app";
import type { AnnunciId } from "~/schemas/public/Annunci"; import { type AnnunciId, annunciId } from "~/schemas/public/Annunci";
import { generateSSGHelper } from "~/server/utils/ssgHelper"; import { generateSSGHelper } from "~/server/utils/ssgHelper";
import { zAnnuncioId } from "~/server/utils/zod_types";
import { api } from "~/utils/api"; import { api } from "~/utils/api";
type PageProps = { type PageProps = {
@ -237,7 +236,7 @@ export const getServerSideProps = (async (context) => {
return redirectTo500; return redirectTo500;
} }
const parsed = zAnnuncioId.safeParse(parseInt(id)); const parsed = annunciId.safeParse(parseInt(id));
if (!parsed.success) { if (!parsed.success) {
console.error("Error parsing ordineId", parsed.error); console.error("Error parsing ordineId", parsed.error);
return redirectTo500; return redirectTo500;

View file

@ -7,9 +7,11 @@ import { Status500 } from "~/components/status-page";
import { redirectTo500 } from "~/lib/utils"; import { redirectTo500 } from "~/lib/utils";
import type { NextPageWithLayout } from "~/pages/_app"; import type { NextPageWithLayout } from "~/pages/_app";
import { useEnforcedSession } from "~/providers/SessionProvider"; import { useEnforcedSession } from "~/providers/SessionProvider";
import type { ServizioServizioId } from "~/schemas/public/Servizio"; import {
type ServizioServizioId,
servizioServizioId,
} from "~/schemas/public/Servizio";
import { TrpcAuthedFetchingIstance } from "~/server/utils/ssgHelper"; import { TrpcAuthedFetchingIstance } from "~/server/utils/ssgHelper";
import { zServizioId } from "~/server/utils/zod_types";
import { api } from "~/utils/api"; import { api } from "~/utils/api";
type ServizioPageProps = { type ServizioPageProps = {
@ -59,7 +61,7 @@ export const getServerSideProps = (async (context) => {
return redirectTo500; return redirectTo500;
} }
const parsedServizioId = zServizioId.safeParse(servizio_id); const parsedServizioId = servizioServizioId.safeParse(servizio_id);
if (!parsedServizioId.success) { if (!parsedServizioId.success) {
console.error("Error parsing servizioId", parsedServizioId.error); console.error("Error parsing servizioId", parsedServizioId.error);
return redirectTo500; return redirectTo500;

View file

@ -12,7 +12,7 @@ import { Badge } from "~/components/ui/badge";
import { Separator } from "~/components/ui/separator"; import { Separator } from "~/components/ui/separator";
import { cn } from "~/lib/utils"; import { cn } from "~/lib/utils";
import { useTranslation } from "~/providers/I18nProvider"; import { useTranslation } from "~/providers/I18nProvider";
import TipologiaPosizioneEnum from "~/schemas/public/TipologiaPosizioneEnum"; import { tipologiaPosizioneEnum } from "~/schemas/public/TipologiaPosizioneEnum";
import { generateSSGHelper } from "~/server/utils/ssgHelper"; import { generateSSGHelper } from "~/server/utils/ssgHelper";
import { api } from "~/utils/api"; import { api } from "~/utils/api";
@ -72,7 +72,7 @@ const Prezzi: NextPage = () => {
]} ]}
pricingData={pricingTransitorio} pricingData={pricingTransitorio}
statico statico
tipo={TipologiaPosizioneEnum.Transitorio} tipo={tipologiaPosizioneEnum.enum.Transitorio}
title={t.prezzi.titolo_transitori} title={t.prezzi.titolo_transitori}
/> />
@ -109,7 +109,7 @@ const Prezzi: NextPage = () => {
]} ]}
pricingData={pricingStabile} pricingData={pricingStabile}
statico statico
tipo={TipologiaPosizioneEnum.Stabile} tipo={tipologiaPosizioneEnum.enum.Stabile}
title={t.prezzi.titolo_stabile} title={t.prezzi.titolo_stabile}
/> />
<p>{t.prezzi.desc_stabile}</p> <p>{t.prezzi.desc_stabile}</p>

View file

@ -5,8 +5,8 @@ import { AreaRiservataLayout } from "~/components/Layout";
import { Button } from "~/components/ui/button"; import { Button } from "~/components/ui/button";
import { formatCurrency, redirectTo500 } from "~/lib/utils"; import { formatCurrency, redirectTo500 } from "~/lib/utils";
import type { NextPageWithLayout } from "~/pages/_app"; import type { NextPageWithLayout } from "~/pages/_app";
import { ordiniOrdineId } from "~/schemas/public/Ordini";
import { TrpcAuthedFetchingIstance } from "~/server/utils/ssgHelper"; import { TrpcAuthedFetchingIstance } from "~/server/utils/ssgHelper";
import { zOrdineId } from "~/server/utils/zod_types";
type BonificoManualeProps = { type BonificoManualeProps = {
titolo: string; titolo: string;
@ -81,7 +81,7 @@ export const getServerSideProps = (async (context) => {
return redirectTo500; return redirectTo500;
} }
const parsed = zOrdineId.safeParse(id); const parsed = ordiniOrdineId.safeParse(id);
if (!parsed.success) { if (!parsed.success) {
console.error("Error parsing ordineId", parsed.error); console.error("Error parsing ordineId", parsed.error);
return redirectTo500; return redirectTo500;

View file

@ -4,9 +4,11 @@ import { LoadingPage } from "~/components/loading";
import { Status500 } from "~/components/status-page"; import { Status500 } from "~/components/status-page";
import { redirectTo500 } from "~/lib/utils"; import { redirectTo500 } from "~/lib/utils";
import type { NextPageWithLayout } from "~/pages/_app"; import type { NextPageWithLayout } from "~/pages/_app";
import type { TestiEStringheStingaId } from "~/schemas/public/TestiEStringhe"; import {
type TestiEStringheStingaId,
testiEStringheStingaId,
} from "~/schemas/public/TestiEStringhe";
import { generateSSGHelper } from "~/server/utils/ssgHelper"; import { generateSSGHelper } from "~/server/utils/ssgHelper";
import { zTestiEStringheStingaId } from "~/server/utils/zod_types";
import { api } from "~/utils/api"; import { api } from "~/utils/api";
type CondizioniProps = { type CondizioniProps = {
@ -57,7 +59,7 @@ export const getServerSideProps = (async (context) => {
return redirectTo500; return redirectTo500;
} }
const parsed = zTestiEStringheStingaId.safeParse(id); const parsed = testiEStringheStingaId.safeParse(id);
if (!parsed.success) { if (!parsed.success) {
console.error("Error parsing paymentId", parsed.error); console.error("Error parsing paymentId", parsed.error);
return redirectTo500; return redirectTo500;

View file

@ -7,8 +7,9 @@ import { getStorageUrl } from "~/lib/storage_utils";
import { redirectTo500 } from "~/lib/utils"; import { redirectTo500 } from "~/lib/utils";
import type { NextPageWithLayout } from "~/pages/_app"; import type { NextPageWithLayout } from "~/pages/_app";
import { useTranslation } from "~/providers/I18nProvider"; import { useTranslation } from "~/providers/I18nProvider";
import { annunciId } from "~/schemas/public/Annunci";
import { servizioServizioId } from "~/schemas/public/Servizio";
import { TrpcAuthedFetchingIstance } from "~/server/utils/ssgHelper"; import { TrpcAuthedFetchingIstance } from "~/server/utils/ssgHelper";
import { zAnnuncioId, zServizioId } from "~/server/utils/zod_types";
import { api } from "~/utils/api"; import { api } from "~/utils/api";
type ContrattoViewerProps = { type ContrattoViewerProps = {
@ -76,8 +77,8 @@ export const getServerSideProps = (async (context) => {
}; };
} }
const parsedServizioId = zServizioId.safeParse(servizioId); const parsedServizioId = servizioServizioId.safeParse(servizioId);
const parsedAnnuncioId = zAnnuncioId.safeParse(parseInt(annuncioId)); const parsedAnnuncioId = annunciId.safeParse(parseInt(annuncioId));
if (!parsedServizioId.success || !parsedAnnuncioId.success) { if (!parsedServizioId.success || !parsedAnnuncioId.success) {
return { return {

View file

@ -7,8 +7,9 @@ import { getStorageUrl } from "~/lib/storage_utils";
import { redirectTo500 } from "~/lib/utils"; import { redirectTo500 } from "~/lib/utils";
import type { NextPageWithLayout } from "~/pages/_app"; import type { NextPageWithLayout } from "~/pages/_app";
import { useTranslation } from "~/providers/I18nProvider"; import { useTranslation } from "~/providers/I18nProvider";
import { annunciId } from "~/schemas/public/Annunci";
import { servizioServizioId } from "~/schemas/public/Servizio";
import { TrpcAuthedFetchingIstance } from "~/server/utils/ssgHelper"; import { TrpcAuthedFetchingIstance } from "~/server/utils/ssgHelper";
import { zAnnuncioId, zServizioId } from "~/server/utils/zod_types";
import { api } from "~/utils/api"; import { api } from "~/utils/api";
type ContrattoViewerProps = { type ContrattoViewerProps = {
@ -72,8 +73,8 @@ export const getServerSideProps = (async (context) => {
}; };
} }
const parsedServizioId = zServizioId.safeParse(servizioId); const parsedServizioId = servizioServizioId.safeParse(servizioId);
const parsedAnnuncioId = zAnnuncioId.safeParse(parseInt(annuncioId)); const parsedAnnuncioId = annunciId.safeParse(parseInt(annuncioId));
if (!parsedServizioId.success || !parsedAnnuncioId.success) { if (!parsedServizioId.success || !parsedAnnuncioId.success) {
return { return {

View file

@ -8,9 +8,11 @@ import { redirectTo500 } from "~/lib/utils";
import type { NextPageWithLayout } from "~/pages/_app"; import type { NextPageWithLayout } from "~/pages/_app";
import { CatastoProvider } from "~/providers/CatastoProvider"; import { CatastoProvider } from "~/providers/CatastoProvider";
import { useTranslation } from "~/providers/I18nProvider"; import { useTranslation } from "~/providers/I18nProvider";
import type { ServizioServizioId } from "~/schemas/public/Servizio"; import {
type ServizioServizioId,
servizioServizioId,
} from "~/schemas/public/Servizio";
import { TrpcAuthedFetchingIstance } from "~/server/utils/ssgHelper"; import { TrpcAuthedFetchingIstance } from "~/server/utils/ssgHelper";
import { zServizioId } from "~/server/utils/zod_types";
import { api } from "~/utils/api"; import { api } from "~/utils/api";
type OnboardServizioProps = { type OnboardServizioProps = {
@ -69,7 +71,7 @@ export const getServerSideProps = (async (context) => {
return redirectTo500; return redirectTo500;
} }
const parsed = zServizioId.safeParse(id); const parsed = servizioServizioId.safeParse(id);
if (!parsed.success) { if (!parsed.success) {
console.error("Error parsing servizioId", parsed.error); console.error("Error parsing servizioId", parsed.error);
return redirectTo500; return redirectTo500;

View file

@ -4,8 +4,8 @@ import { AreaRiservataLayout } from "~/components/Layout";
import stripe from "~/lib/stripe"; import stripe from "~/lib/stripe";
import { redirectTo500 } from "~/lib/utils"; import { redirectTo500 } from "~/lib/utils";
import type { NextPageWithLayout } from "~/pages/_app"; import type { NextPageWithLayout } from "~/pages/_app";
import { ordiniOrdineId } from "~/schemas/public/Ordini";
import { TrpcAuthedFetchingIstance } from "~/server/utils/ssgHelper"; import { TrpcAuthedFetchingIstance } from "~/server/utils/ssgHelper";
import { zOrdineId } from "~/server/utils/zod_types";
type PagamentoPageProps = { type PagamentoPageProps = {
clientSecret: string | null; clientSecret: string | null;
@ -52,7 +52,7 @@ export const getServerSideProps = (async (context) => {
return redirectTo500; return redirectTo500;
} }
const parsed = zOrdineId.safeParse(id); const parsed = ordiniOrdineId.safeParse(id);
if (!parsed.success) { if (!parsed.success) {
console.error("Error parsing ordineId", parsed.error); console.error("Error parsing ordineId", parsed.error);
return redirectTo500; return redirectTo500;

View file

@ -8,8 +8,8 @@ import { Button } from "~/components/ui/button";
import stripe from "~/lib/stripe"; import stripe from "~/lib/stripe";
import { redirectTo500 } from "~/lib/utils"; import { redirectTo500 } from "~/lib/utils";
import { useTranslation } from "~/providers/I18nProvider"; import { useTranslation } from "~/providers/I18nProvider";
import OrderTypeEnum from "~/schemas/public/OrderTypeEnum"; import { orderTypeEnum } from "~/schemas/public/OrderTypeEnum";
import PaymentStatusEnum from "~/schemas/public/PaymentStatusEnum"; import { paymentStatusEnum } from "~/schemas/public/PaymentStatusEnum";
import { TrpcAuthedFetchingIstance } from "~/server/utils/ssgHelper"; import { TrpcAuthedFetchingIstance } from "~/server/utils/ssgHelper";
enum AcquistoStatusEnum { enum AcquistoStatusEnum {
@ -60,12 +60,12 @@ export const getServerSideProps = (async (context) => {
let resultStatus: AcquistoStatusEnum; let resultStatus: AcquistoStatusEnum;
if (paymentIntent.status === "succeeded") { if (paymentIntent.status === "succeeded") {
if (payment.paymentstatus !== PaymentStatusEnum.success) { if (payment.paymentstatus !== paymentStatusEnum.enum.success) {
resultStatus = AcquistoStatusEnum.internal_error; resultStatus = AcquistoStatusEnum.internal_error;
} }
resultStatus = AcquistoStatusEnum.success; resultStatus = AcquistoStatusEnum.success;
} else if (paymentIntent.status === "processing") { } else if (paymentIntent.status === "processing") {
if (payment.paymentstatus !== PaymentStatusEnum.processing) { if (payment.paymentstatus !== paymentStatusEnum.enum.processing) {
resultStatus = AcquistoStatusEnum.internal_error; resultStatus = AcquistoStatusEnum.internal_error;
} }
resultStatus = AcquistoStatusEnum.processing; resultStatus = AcquistoStatusEnum.processing;
@ -75,7 +75,7 @@ export const getServerSideProps = (async (context) => {
return { return {
props: { props: {
redirectUrl: redirectUrl:
payment.type === OrderTypeEnum.Rinnovo payment.type === orderTypeEnum.enum.Rinnovo
? `/area-riservata/rinnovo/${payment.rinnovo_id}` ? `/area-riservata/rinnovo/${payment.rinnovo_id}`
: `/area-riservata/servizio/${payment.servizio_id}`, : `/area-riservata/servizio/${payment.servizio_id}`,
status: resultStatus, status: resultStatus,

View file

@ -2,7 +2,6 @@ import { ArrowRight, ExternalLink } from "lucide-react";
import type { GetServerSideProps } from "next"; import type { GetServerSideProps } from "next";
import Link from "next/link"; import Link from "next/link";
import { useRouter } from "next/router"; import { useRouter } from "next/router";
import z from "zod";
import { AreaRiservataLayout } from "~/components/Layout"; import { AreaRiservataLayout } from "~/components/Layout";
import { Button } from "~/components/ui/button"; import { Button } from "~/components/ui/button";
import { import {
@ -16,11 +15,12 @@ import {
import { formatCurrency, redirectTo500 } from "~/lib/utils"; import { formatCurrency, redirectTo500 } from "~/lib/utils";
import type { NextPageWithLayout } from "~/pages/_app"; import type { NextPageWithLayout } from "~/pages/_app";
import { useTranslation } from "~/providers/I18nProvider"; import { useTranslation } from "~/providers/I18nProvider";
import OrderTypeEnum from "~/schemas/public/OrderTypeEnum"; import { orderTypeEnum } from "~/schemas/public/OrderTypeEnum";
import type { Prezziario } from "~/schemas/public/Prezziario"; import type { Prezziario } from "~/schemas/public/Prezziario";
import { rinnoviId } from "~/schemas/public/Rinnovi";
import { servizioServizioId } from "~/schemas/public/Servizio";
import type { PreparedPaymentData } from "~/server/controllers/pagamenti.controller"; import type { PreparedPaymentData } from "~/server/controllers/pagamenti.controller";
import { TrpcAuthedFetchingIstance } from "~/server/utils/ssgHelper"; import { TrpcAuthedFetchingIstance } from "~/server/utils/ssgHelper";
import { zRinnovoId, zServizioId } from "~/server/utils/zod_types";
type PreviewPurchaseProps = { type PreviewPurchaseProps = {
stripeDisabled: boolean; stripeDisabled: boolean;
@ -128,20 +128,20 @@ export const getServerSideProps = (async (context) => {
console.error("Error: payment type is not a string"); console.error("Error: payment type is not a string");
return redirectTo500; return redirectTo500;
} }
const parsedType = z.enum(OrderTypeEnum).safeParse(payment_type); const parsedType = orderTypeEnum.safeParse(payment_type);
if (!parsedType.success) { if (!parsedType.success) {
console.error("Error parsing payment type", parsedType.error); console.error("Error parsing payment type", parsedType.error);
return redirectTo500; return redirectTo500;
} }
const type = parsedType.data; const type = parsedType.data;
if (type === OrderTypeEnum.Rinnovo) { if (type === orderTypeEnum.enum.Rinnovo) {
const id = context.query?.rinnovoId; const id = context.query?.rinnovoId;
if (typeof id !== "string") { if (typeof id !== "string") {
console.error("Error: rinnovoId is not a string"); console.error("Error: rinnovoId is not a string");
return redirectTo500; return redirectTo500;
} }
const parsedRinnovoId = zRinnovoId.safeParse(id); const parsedRinnovoId = rinnoviId.safeParse(id);
if (!parsedRinnovoId.success) { if (!parsedRinnovoId.success) {
console.error("Error parsing rinnovoId", parsedRinnovoId.error); console.error("Error parsing rinnovoId", parsedRinnovoId.error);
return redirectTo500; return redirectTo500;
@ -168,7 +168,7 @@ export const getServerSideProps = (async (context) => {
console.error("Error: servizioId is not a string"); console.error("Error: servizioId is not a string");
return redirectTo500; return redirectTo500;
} }
const parsedServizioId = zServizioId.safeParse(id); const parsedServizioId = servizioServizioId.safeParse(id);
if (!parsedServizioId.success) { if (!parsedServizioId.success) {
console.error("Error parsing servizioId", parsedServizioId.error); console.error("Error parsing servizioId", parsedServizioId.error);
return redirectTo500; return redirectTo500;
@ -183,7 +183,7 @@ export const getServerSideProps = (async (context) => {
return redirectTo500; return redirectTo500;
} }
let saldoPreview: Prezziario | null = null; let saldoPreview: Prezziario | null = null;
if (type === OrderTypeEnum.Acconto) { if (type === orderTypeEnum.enum.Acconto) {
const saldoResult = await helper.trpc.pagamenti.previewSaldo.fetch({ const saldoResult = await helper.trpc.pagamenti.previewSaldo.fetch({
servizioId: parsedServizioId.data, servizioId: parsedServizioId.data,
}); });

View file

@ -7,9 +7,8 @@ import { Status500 } from "~/components/status-page";
import { Button } from "~/components/ui/button"; import { Button } from "~/components/ui/button";
import { redirectTo500 } from "~/lib/utils"; import { redirectTo500 } from "~/lib/utils";
import type { NextPageWithLayout } from "~/pages/_app"; import type { NextPageWithLayout } from "~/pages/_app";
import type { OrdiniOrdineId } from "~/schemas/public/Ordini"; import { type OrdiniOrdineId, ordiniOrdineId } from "~/schemas/public/Ordini";
import { generateSSGHelper } from "~/server/utils/ssgHelper"; import { generateSSGHelper } from "~/server/utils/ssgHelper";
import { zOrdineId } from "~/server/utils/zod_types";
import { api } from "~/utils/api"; import { api } from "~/utils/api";
const PDFViewer = dynamic( const PDFViewer = dynamic(
@ -131,7 +130,7 @@ export const getServerSideProps = (async (context) => {
return redirectTo500; return redirectTo500;
} }
const parsed = zOrdineId.safeParse(id); const parsed = ordiniOrdineId.safeParse(id);
if (!parsed.success) { if (!parsed.success) {
console.error("Error parsing ordineId", parsed.error); console.error("Error parsing ordineId", parsed.error);
return redirectTo500; return redirectTo500;

View file

@ -77,7 +77,12 @@ export const ServizioAnnuncioProvider = ({
await mutateAsync({ await mutateAsync({
annuncioId: data.id, annuncioId: data.id,
servizioId, servizioId,
data: upd, data: {
...upd,
open_contatti_at: upd.open_contatti_at
? new Date(upd.open_contatti_at)
: null,
},
}); });
}; };

View file

@ -1,4 +1,4 @@
import type { Caratteristiche } from '../../utils/kanel-types.ts'; import { CaratteristicheSchema, type Caratteristiche } from '../../utils/kanel-types';
import type { ColumnType, Selectable, Insertable, Updateable } from 'kysely'; import type { ColumnType, Selectable, Insertable, Updateable } from 'kysely';
import { z } from 'zod'; import { z } from 'zod';
@ -143,7 +143,7 @@ export const AnnunciSchema = z.object({
prezzo: z.number(), prezzo: z.number(),
anno: z.string().nullable(), anno: z.string().nullable(),
classe: z.string().nullable(), classe: z.string().nullable(),
mq: z.string().nullable(), mq: z.number().nullable(),
piano: z.string().nullable(), piano: z.string().nullable(),
piano_palazzo: z.number().nullable(), piano_palazzo: z.number().nullable(),
unita_condominio: z.number().nullable(), unita_condominio: z.number().nullable(),
@ -161,7 +161,7 @@ export const AnnunciSchema = z.object({
desc_en: z.string().nullable(), desc_en: z.string().nullable(),
stato: z.string().nullable(), stato: z.string().nullable(),
web: z.boolean().nullable(), web: z.boolean().nullable(),
caratteristiche: z.unknown().nullable(), caratteristiche: CaratteristicheSchema.nullable(),
homepage: z.boolean().nullable(), homepage: z.boolean().nullable(),
external_videos: z.string().array().nullable(), external_videos: z.string().array().nullable(),
email: z.string().nullable(), email: z.string().nullable(),
@ -198,7 +198,7 @@ export const NewAnnunciSchema = z.object({
prezzo: z.number().optional(), prezzo: z.number().optional(),
anno: z.string().optional().nullable(), anno: z.string().optional().nullable(),
classe: z.string().optional().nullable(), classe: z.string().optional().nullable(),
mq: z.string().optional().nullable(), mq: z.number().optional().nullable(),
piano: z.string().optional().nullable(), piano: z.string().optional().nullable(),
piano_palazzo: z.number().optional().nullable(), piano_palazzo: z.number().optional().nullable(),
unita_condominio: z.number().optional().nullable(), unita_condominio: z.number().optional().nullable(),
@ -216,17 +216,17 @@ export const NewAnnunciSchema = z.object({
desc_en: z.string().optional().nullable(), desc_en: z.string().optional().nullable(),
stato: z.string().optional().nullable(), stato: z.string().optional().nullable(),
web: z.boolean().optional().nullable(), web: z.boolean().optional().nullable(),
caratteristiche: z.unknown().optional().nullable(), caratteristiche: CaratteristicheSchema.optional().nullable(),
homepage: z.boolean().optional().nullable(), homepage: z.boolean().optional().nullable(),
external_videos: z.string().array().optional().nullable(), external_videos: z.string().array().optional().nullable(),
email: z.string().optional().nullable(), email: z.string().optional().nullable(),
creato_il: z.date().optional().nullable(), creato_il: z.union([z.date(), z.string()]).pipe(z.coerce.date()).optional().nullable(),
modificato_il: z.date().optional().nullable(), modificato_il: z.union([z.date(), z.string()]).pipe(z.coerce.date()).optional().nullable(),
consegna: z.number().optional().nullable(), consegna: z.number().optional().nullable(),
disponibile_da: z.date().optional().nullable(), disponibile_da: z.union([z.date(), z.string()]).pipe(z.coerce.date()).optional().nullable(),
permanenza: z.number().array().optional().nullable(), permanenza: z.number().array().optional().nullable(),
persone: z.string().array().optional().nullable(), persone: z.string().array().optional().nullable(),
media_updated_at: z.date().optional().nullable(), media_updated_at: z.union([z.date(), z.string()]).pipe(z.coerce.date()).optional().nullable(),
tipo_locatore: z.string().optional().nullable(), tipo_locatore: z.string().optional().nullable(),
}); });
@ -253,7 +253,7 @@ export const AnnunciUpdateSchema = z.object({
prezzo: z.number().optional(), prezzo: z.number().optional(),
anno: z.string().optional().nullable(), anno: z.string().optional().nullable(),
classe: z.string().optional().nullable(), classe: z.string().optional().nullable(),
mq: z.string().optional().nullable(), mq: z.number().optional().nullable(),
piano: z.string().optional().nullable(), piano: z.string().optional().nullable(),
piano_palazzo: z.number().optional().nullable(), piano_palazzo: z.number().optional().nullable(),
unita_condominio: z.number().optional().nullable(), unita_condominio: z.number().optional().nullable(),
@ -271,16 +271,16 @@ export const AnnunciUpdateSchema = z.object({
desc_en: z.string().optional().nullable(), desc_en: z.string().optional().nullable(),
stato: z.string().optional().nullable(), stato: z.string().optional().nullable(),
web: z.boolean().optional().nullable(), web: z.boolean().optional().nullable(),
caratteristiche: z.unknown().optional().nullable(), caratteristiche: CaratteristicheSchema.optional().nullable(),
homepage: z.boolean().optional().nullable(), homepage: z.boolean().optional().nullable(),
external_videos: z.string().array().optional().nullable(), external_videos: z.string().array().optional().nullable(),
email: z.string().optional().nullable(), email: z.string().optional().nullable(),
creato_il: z.date().optional().nullable(), creato_il: z.union([z.date(), z.string()]).pipe(z.coerce.date()).optional().nullable(),
modificato_il: z.date().optional().nullable(), modificato_il: z.union([z.date(), z.string()]).pipe(z.coerce.date()).optional().nullable(),
consegna: z.number().optional().nullable(), consegna: z.number().optional().nullable(),
disponibile_da: z.date().optional().nullable(), disponibile_da: z.union([z.date(), z.string()]).pipe(z.coerce.date()).optional().nullable(),
permanenza: z.number().array().optional().nullable(), permanenza: z.number().array().optional().nullable(),
persone: z.string().array().optional().nullable(), persone: z.string().array().optional().nullable(),
media_updated_at: z.date().optional().nullable(), media_updated_at: z.union([z.date(), z.string()]).pipe(z.coerce.date()).optional().nullable(),
tipo_locatore: z.string().optional().nullable(), tipo_locatore: z.string().optional().nullable(),
}); });

View file

@ -1,12 +1,11 @@
import { z } from 'zod'; import { z } from 'zod';
/** Represents the enum public.BanType */ /** Represents the enum public.BanType */
enum BanType { type BanType =
ip = 'ip', | 'ip'
email = 'email', | 'email'
phone = 'phone', | 'phone'
cf = 'cf', | 'cf';
};
export default BanType; export default BanType;

View file

@ -33,14 +33,14 @@ export const ChatsSchema = z.object({
export const NewChatsSchema = z.object({ export const NewChatsSchema = z.object({
chatid: chatsChatid.optional(), chatid: chatsChatid.optional(),
created_at: z.date(), created_at: z.union([z.date(), z.string()]).pipe(z.coerce.date()),
user_ref: usersId, user_ref: usersId,
tags: z.string().array().optional().nullable(), tags: z.string().array().optional().nullable(),
}); });
export const ChatsUpdateSchema = z.object({ export const ChatsUpdateSchema = z.object({
chatid: chatsChatid.optional(), chatid: chatsChatid.optional(),
created_at: z.date().optional(), created_at: z.union([z.date(), z.string()]).pipe(z.coerce.date()).optional(),
user_ref: usersId.optional(), user_ref: usersId.optional(),
tags: z.string().array().optional().nullable(), tags: z.string().array().optional().nullable(),
}); });

View file

@ -34,13 +34,13 @@ export const EmailsSchema = z.object({
export const NewEmailsSchema = z.object({ export const NewEmailsSchema = z.object({
id_email: emailsIdEmail.optional(), id_email: emailsIdEmail.optional(),
user_id: usersId, user_id: usersId,
created_at: z.date().optional(), created_at: z.union([z.date(), z.string()]).pipe(z.coerce.date()).optional(),
data: z.unknown(), data: z.unknown(),
}); });
export const EmailsUpdateSchema = z.object({ export const EmailsUpdateSchema = z.object({
id_email: emailsIdEmail.optional(), id_email: emailsIdEmail.optional(),
user_id: usersId.optional(), user_id: usersId.optional(),
created_at: z.date().optional(), created_at: z.union([z.date(), z.string()]).pipe(z.coerce.date()).optional(),
data: z.unknown().optional(), data: z.unknown().optional(),
}); });

View file

@ -32,14 +32,14 @@ export const EventQueueSchema = z.object({
export const NewEventQueueSchema = z.object({ export const NewEventQueueSchema = z.object({
event_id: eventQueueEventId.optional(), event_id: eventQueueEventId.optional(),
lock_expires: z.date(), lock_expires: z.union([z.date(), z.string()]).pipe(z.coerce.date()),
data: z.unknown().optional().nullable(), data: z.unknown().optional().nullable(),
status: z.string().optional(), status: z.string().optional(),
}); });
export const EventQueueUpdateSchema = z.object({ export const EventQueueUpdateSchema = z.object({
event_id: eventQueueEventId.optional(), event_id: eventQueueEventId.optional(),
lock_expires: z.date().optional(), lock_expires: z.union([z.date(), z.string()]).pipe(z.coerce.date()).optional(),
data: z.unknown().optional().nullable(), data: z.unknown().optional().nullable(),
status: z.string().optional(), status: z.string().optional(),
}); });

View file

@ -1,11 +1,10 @@
import { z } from 'zod'; import { z } from 'zod';
/** Represents the enum public.GenericStatusEnum */ /** Represents the enum public.GenericStatusEnum */
enum GenericStatusEnum { type GenericStatusEnum =
pending = 'pending', | 'pending'
success = 'success', | 'success'
failed = 'failed', | 'failed';
};
export default GenericStatusEnum; export default GenericStatusEnum;

View file

@ -48,7 +48,7 @@ export const NewMessagesSchema = z.object({
messageid: messagesMessageid.optional(), messageid: messagesMessageid.optional(),
chatid: chatsChatid, chatid: chatsChatid,
message: z.string(), message: z.string(),
time: z.date(), time: z.union([z.date(), z.string()]).pipe(z.coerce.date()),
isread: z.boolean().optional(), isread: z.boolean().optional(),
sender: usersId, sender: usersId,
reply_to_id: messagesMessageid.optional().nullable(), reply_to_id: messagesMessageid.optional().nullable(),
@ -59,7 +59,7 @@ export const MessagesUpdateSchema = z.object({
messageid: messagesMessageid.optional(), messageid: messagesMessageid.optional(),
chatid: chatsChatid.optional(), chatid: chatsChatid.optional(),
message: z.string().optional(), message: z.string().optional(),
time: z.date().optional(), time: z.union([z.date(), z.string()]).pipe(z.coerce.date()).optional(),
isread: z.boolean().optional(), isread: z.boolean().optional(),
sender: usersId.optional(), sender: usersId.optional(),
reply_to_id: messagesMessageid.optional().nullable(), reply_to_id: messagesMessageid.optional().nullable(),

View file

@ -1,13 +1,12 @@
import { z } from 'zod'; import { z } from 'zod';
/** Represents the enum public.OrderTypeEnum */ /** Represents the enum public.OrderTypeEnum */
enum OrderTypeEnum { type OrderTypeEnum =
Acconto = 'Acconto', | 'Acconto'
Saldo = 'Saldo', | 'Saldo'
Consulenza = 'Consulenza', | 'Consulenza'
Altro = 'Altro', | 'Altro'
Rinnovo = 'Rinnovo', | 'Rinnovo';
};
export default OrderTypeEnum; export default OrderTypeEnum;

View file

@ -69,14 +69,14 @@ export const OrdiniSchema = z.object({
export const NewOrdiniSchema = z.object({ export const NewOrdiniSchema = z.object({
ordine_id: ordiniOrdineId.optional(), ordine_id: ordiniOrdineId.optional(),
userid: usersId, userid: usersId,
created_at: z.date().optional(), created_at: z.union([z.date(), z.string()]).pipe(z.coerce.date()).optional(),
packid: prezziarioIdprezziario, packid: prezziarioIdprezziario,
servizio_id: servizioServizioId.optional().nullable(), servizio_id: servizioServizioId.optional().nullable(),
type: orderTypeEnum, type: orderTypeEnum,
isActive: z.boolean().optional(), isActive: z.boolean().optional(),
amount_cent: z.number(), amount_cent: z.number(),
paymentmethod: z.string().optional().nullable(), paymentmethod: z.string().optional().nullable(),
paid_at: z.date().optional().nullable(), paid_at: z.union([z.date(), z.string()]).pipe(z.coerce.date()).optional().nullable(),
intent_id: z.string().optional().nullable(), intent_id: z.string().optional().nullable(),
paymentstatus: paymentStatusEnum.optional().nullable(), paymentstatus: paymentStatusEnum.optional().nullable(),
sconto: z.number().optional(), sconto: z.number().optional(),
@ -86,14 +86,14 @@ export const NewOrdiniSchema = z.object({
export const OrdiniUpdateSchema = z.object({ export const OrdiniUpdateSchema = z.object({
ordine_id: ordiniOrdineId.optional(), ordine_id: ordiniOrdineId.optional(),
userid: usersId.optional(), userid: usersId.optional(),
created_at: z.date().optional(), created_at: z.union([z.date(), z.string()]).pipe(z.coerce.date()).optional(),
packid: prezziarioIdprezziario.optional(), packid: prezziarioIdprezziario.optional(),
servizio_id: servizioServizioId.optional().nullable(), servizio_id: servizioServizioId.optional().nullable(),
type: orderTypeEnum.optional(), type: orderTypeEnum.optional(),
isActive: z.boolean().optional(), isActive: z.boolean().optional(),
amount_cent: z.number().optional(), amount_cent: z.number().optional(),
paymentmethod: z.string().optional().nullable(), paymentmethod: z.string().optional().nullable(),
paid_at: z.date().optional().nullable(), paid_at: z.union([z.date(), z.string()]).pipe(z.coerce.date()).optional().nullable(),
intent_id: z.string().optional().nullable(), intent_id: z.string().optional().nullable(),
paymentstatus: paymentStatusEnum.optional().nullable(), paymentstatus: paymentStatusEnum.optional().nullable(),
sconto: z.number().optional(), sconto: z.number().optional(),

View file

@ -1,11 +1,10 @@
import { z } from 'zod'; import { z } from 'zod';
/** Represents the enum public.PaymentStatusEnum */ /** Represents the enum public.PaymentStatusEnum */
enum PaymentStatusEnum { type PaymentStatusEnum =
processing = 'processing', | 'processing'
success = 'success', | 'success'
failed = 'failed', | 'failed';
};
export default PaymentStatusEnum; export default PaymentStatusEnum;

View file

@ -42,7 +42,7 @@ export const NewPotenzialiSchema = z.object({
id: potenzialiId.optional(), id: potenzialiId.optional(),
name: z.string(), name: z.string(),
descrizione: z.string().optional().nullable(), descrizione: z.string().optional().nullable(),
created_at: z.date().optional(), created_at: z.union([z.date(), z.string()]).pipe(z.coerce.date()).optional(),
userid: usersId.optional().nullable(), userid: usersId.optional().nullable(),
potenziali_group_id: potenzialiGroupsId, potenziali_group_id: potenzialiGroupsId,
}); });
@ -51,7 +51,7 @@ export const PotenzialiUpdateSchema = z.object({
id: potenzialiId.optional(), id: potenzialiId.optional(),
name: z.string().optional(), name: z.string().optional(),
descrizione: z.string().optional().nullable(), descrizione: z.string().optional().nullable(),
created_at: z.date().optional(), created_at: z.union([z.date(), z.string()]).pipe(z.coerce.date()).optional(),
userid: usersId.optional().nullable(), userid: usersId.optional().nullable(),
potenziali_group_id: potenzialiGroupsId.optional(), potenziali_group_id: potenzialiGroupsId.optional(),
}); });

View file

@ -24,12 +24,12 @@ export const RatelimiterSchema = z.object({
export const NewRatelimiterSchema = z.object({ export const NewRatelimiterSchema = z.object({
key: z.string(), key: z.string(),
request_timestamp: z.date(), request_timestamp: z.union([z.date(), z.string()]).pipe(z.coerce.date()),
request_count: z.number(), request_count: z.number(),
}); });
export const RatelimiterUpdateSchema = z.object({ export const RatelimiterUpdateSchema = z.object({
key: z.string().optional(), key: z.string().optional(),
request_timestamp: z.date().optional(), request_timestamp: z.union([z.date(), z.string()]).pipe(z.coerce.date()).optional(),
request_count: z.number().optional(), request_count: z.number().optional(),
}); });

View file

@ -41,16 +41,16 @@ export const NewRinnoviSchema = z.object({
id: rinnoviId.optional(), id: rinnoviId.optional(),
userId: usersId, userId: usersId,
codice: z.string(), codice: z.string(),
decorrenza: z.date(), decorrenza: z.union([z.date(), z.string()]).pipe(z.coerce.date()),
gestionale_id: z.string().optional().nullable(), gestionale_id: z.string().optional().nullable(),
scadenza: z.date(), scadenza: z.union([z.date(), z.string()]).pipe(z.coerce.date()),
}); });
export const RinnoviUpdateSchema = z.object({ export const RinnoviUpdateSchema = z.object({
id: rinnoviId.optional(), id: rinnoviId.optional(),
userId: usersId.optional(), userId: usersId.optional(),
codice: z.string().optional(), codice: z.string().optional(),
decorrenza: z.date().optional(), decorrenza: z.union([z.date(), z.string()]).pipe(z.coerce.date()).optional(),
gestionale_id: z.string().optional().nullable(), gestionale_id: z.string().optional().nullable(),
scadenza: z.date().optional(), scadenza: z.union([z.date(), z.string()]).pipe(z.coerce.date()).optional(),
}); });

View file

@ -120,7 +120,7 @@ export const ServizioSchema = z.object({
export const NewServizioSchema = z.object({ export const NewServizioSchema = z.object({
servizio_id: servizioServizioId.optional(), servizio_id: servizioServizioId.optional(),
user_id: usersId, user_id: usersId,
created_at: z.date().optional(), created_at: z.union([z.date(), z.string()]).pipe(z.coerce.date()).optional(),
tipologia: tipologiaPosizioneEnum, tipologia: tipologiaPosizioneEnum,
arredato: z.boolean().optional(), arredato: z.boolean().optional(),
budget: z.number(), budget: z.number(),
@ -135,7 +135,7 @@ export const NewServizioSchema = z.object({
pianoterra: z.boolean().optional(), pianoterra: z.boolean().optional(),
motivazione_transitorio: z.string().optional().nullable(), motivazione_transitorio: z.string().optional().nullable(),
reddito: z.string().optional().nullable(), reddito: z.string().optional().nullable(),
decorrenza: z.date().optional().nullable(), decorrenza: z.union([z.date(), z.string()]).pipe(z.coerce.date()).optional().nullable(),
isInterrotto: z.boolean().optional(), isInterrotto: z.boolean().optional(),
entromese: z.number().optional().nullable(), entromese: z.number().optional().nullable(),
permanenza: z.number().optional().nullable(), permanenza: z.number().optional().nullable(),
@ -143,7 +143,7 @@ export const NewServizioSchema = z.object({
isOkSaldo: z.boolean().optional(), isOkSaldo: z.boolean().optional(),
isOkConsulenza: z.boolean().optional(), isOkConsulenza: z.boolean().optional(),
doc_motivazione_ref: usersStorageUserStorageId.optional().nullable(), doc_motivazione_ref: usersStorageUserStorageId.optional().nullable(),
scadenza_motivazione_transitoria: z.date().optional().nullable(), scadenza_motivazione_transitoria: z.union([z.date(), z.string()]).pipe(z.coerce.date()).optional().nullable(),
skipPayment: z.boolean().optional(), skipPayment: z.boolean().optional(),
skipControlloDoc: z.boolean().optional(), skipControlloDoc: z.boolean().optional(),
skipDocMotivazione: z.boolean().optional(), skipDocMotivazione: z.boolean().optional(),
@ -155,7 +155,7 @@ export const NewServizioSchema = z.object({
export const ServizioUpdateSchema = z.object({ export const ServizioUpdateSchema = z.object({
servizio_id: servizioServizioId.optional(), servizio_id: servizioServizioId.optional(),
user_id: usersId.optional(), user_id: usersId.optional(),
created_at: z.date().optional(), created_at: z.union([z.date(), z.string()]).pipe(z.coerce.date()).optional(),
tipologia: tipologiaPosizioneEnum.optional(), tipologia: tipologiaPosizioneEnum.optional(),
arredato: z.boolean().optional(), arredato: z.boolean().optional(),
budget: z.number().optional(), budget: z.number().optional(),
@ -170,7 +170,7 @@ export const ServizioUpdateSchema = z.object({
pianoterra: z.boolean().optional(), pianoterra: z.boolean().optional(),
motivazione_transitorio: z.string().optional().nullable(), motivazione_transitorio: z.string().optional().nullable(),
reddito: z.string().optional().nullable(), reddito: z.string().optional().nullable(),
decorrenza: z.date().optional().nullable(), decorrenza: z.union([z.date(), z.string()]).pipe(z.coerce.date()).optional().nullable(),
isInterrotto: z.boolean().optional(), isInterrotto: z.boolean().optional(),
entromese: z.number().optional().nullable(), entromese: z.number().optional().nullable(),
permanenza: z.number().optional().nullable(), permanenza: z.number().optional().nullable(),
@ -178,7 +178,7 @@ export const ServizioUpdateSchema = z.object({
isOkSaldo: z.boolean().optional(), isOkSaldo: z.boolean().optional(),
isOkConsulenza: z.boolean().optional(), isOkConsulenza: z.boolean().optional(),
doc_motivazione_ref: usersStorageUserStorageId.optional().nullable(), doc_motivazione_ref: usersStorageUserStorageId.optional().nullable(),
scadenza_motivazione_transitoria: z.date().optional().nullable(), scadenza_motivazione_transitoria: z.union([z.date(), z.string()]).pipe(z.coerce.date()).optional().nullable(),
skipPayment: z.boolean().optional(), skipPayment: z.boolean().optional(),
skipControlloDoc: z.boolean().optional(), skipControlloDoc: z.boolean().optional(),
skipDocMotivazione: z.boolean().optional(), skipDocMotivazione: z.boolean().optional(),

View file

@ -70,12 +70,12 @@ export const NewServizioAnnunciSchema = z.object({
servizio_annunci_id: servizioAnnunciServizioAnnunciId.optional(), servizio_annunci_id: servizioAnnunciServizioAnnunciId.optional(),
servizio_id: servizioServizioId, servizio_id: servizioServizioId,
annunci_id: annunciId, annunci_id: annunciId,
created_at: z.date().optional(), created_at: z.union([z.date(), z.string()]).pipe(z.coerce.date()).optional(),
open_contatti_at: z.date().optional().nullable(), open_contatti_at: z.union([z.date(), z.string()]).pipe(z.coerce.date()).optional().nullable(),
doc_contratto_ref: z.string().optional().nullable(), doc_contratto_ref: z.string().optional().nullable(),
gestionale_id: z.number().optional().nullable(), gestionale_id: z.number().optional().nullable(),
contratto_decorrenza: z.date().optional().nullable(), contratto_decorrenza: z.union([z.date(), z.string()]).pipe(z.coerce.date()).optional().nullable(),
contratto_scadenza: z.date().optional().nullable(), contratto_scadenza: z.union([z.date(), z.string()]).pipe(z.coerce.date()).optional().nullable(),
contratto_tipo: z.string().optional().nullable(), contratto_tipo: z.string().optional().nullable(),
doc_registrazione_ref: z.string().optional().nullable(), doc_registrazione_ref: z.string().optional().nullable(),
doc_contratto_added: z.boolean().optional(), doc_contratto_added: z.boolean().optional(),
@ -88,12 +88,12 @@ export const ServizioAnnunciUpdateSchema = z.object({
servizio_annunci_id: servizioAnnunciServizioAnnunciId.optional(), servizio_annunci_id: servizioAnnunciServizioAnnunciId.optional(),
servizio_id: servizioServizioId.optional(), servizio_id: servizioServizioId.optional(),
annunci_id: annunciId.optional(), annunci_id: annunciId.optional(),
created_at: z.date().optional(), created_at: z.union([z.date(), z.string()]).pipe(z.coerce.date()).optional(),
open_contatti_at: z.date().optional().nullable(), open_contatti_at: z.union([z.date(), z.string()]).pipe(z.coerce.date()).optional().nullable(),
doc_contratto_ref: z.string().optional().nullable(), doc_contratto_ref: z.string().optional().nullable(),
gestionale_id: z.number().optional().nullable(), gestionale_id: z.number().optional().nullable(),
contratto_decorrenza: z.date().optional().nullable(), contratto_decorrenza: z.union([z.date(), z.string()]).pipe(z.coerce.date()).optional().nullable(),
contratto_scadenza: z.date().optional().nullable(), contratto_scadenza: z.union([z.date(), z.string()]).pipe(z.coerce.date()).optional().nullable(),
contratto_tipo: z.string().optional().nullable(), contratto_tipo: z.string().optional().nullable(),
doc_registrazione_ref: z.string().optional().nullable(), doc_registrazione_ref: z.string().optional().nullable(),
doc_contratto_added: z.boolean().optional(), doc_contratto_added: z.boolean().optional(),

View file

@ -1,11 +1,10 @@
import { z } from 'zod'; import { z } from 'zod';
/** Represents the enum public.StatusConfermaEnum */ /** Represents the enum public.StatusConfermaEnum */
enum StatusConfermaEnum { type StatusConfermaEnum =
'Inviato conferma' = 'Inviato conferma', | 'Inviato conferma'
'Conferma accettata' = 'Conferma accettata', | 'Conferma accettata'
'Caparra versata' = 'Caparra versata', | 'Caparra versata';
};
export default StatusConfermaEnum; export default StatusConfermaEnum;

View file

@ -1,10 +1,9 @@
import { z } from 'zod'; import { z } from 'zod';
/** Represents the enum public.TipologiaPosizioneEnum */ /** Represents the enum public.TipologiaPosizioneEnum */
enum TipologiaPosizioneEnum { type TipologiaPosizioneEnum =
Transitorio = 'Transitorio', | 'Transitorio'
Stabile = 'Stabile', | 'Stabile';
};
export default TipologiaPosizioneEnum; export default TipologiaPosizioneEnum;

View file

@ -37,14 +37,14 @@ export const NewUserInvitesSchema = z.object({
id: userInvitesId.optional(), id: userInvitesId.optional(),
email: z.string(), email: z.string(),
token: z.string(), token: z.string(),
expires_at: z.date(), expires_at: z.union([z.date(), z.string()]).pipe(z.coerce.date()),
created_at: z.date().optional().nullable(), created_at: z.union([z.date(), z.string()]).pipe(z.coerce.date()).optional().nullable(),
}); });
export const UserInvitesUpdateSchema = z.object({ export const UserInvitesUpdateSchema = z.object({
id: userInvitesId.optional(), id: userInvitesId.optional(),
email: z.string().optional(), email: z.string().optional(),
token: z.string().optional(), token: z.string().optional(),
expires_at: z.date().optional(), expires_at: z.union([z.date(), z.string()]).pipe(z.coerce.date()).optional(),
created_at: z.date().optional().nullable(), created_at: z.union([z.date(), z.string()]).pipe(z.coerce.date()).optional().nullable(),
}); });

View file

@ -87,9 +87,9 @@ export const NewUsersSchema = z.object({
password: z.string(), password: z.string(),
nome: z.string(), nome: z.string(),
cognome: z.string(), cognome: z.string(),
created_at: z.date().optional(), created_at: z.union([z.date(), z.string()]).pipe(z.coerce.date()).optional(),
reset_password_token: z.string().optional().nullable(), reset_password_token: z.string().optional().nullable(),
reset_password_expires: z.date().optional().nullable(), reset_password_expires: z.union([z.date(), z.string()]).pipe(z.coerce.date()).optional().nullable(),
telefono: z.string(), telefono: z.string(),
isAdminMade: z.boolean().optional().nullable(), isAdminMade: z.boolean().optional().nullable(),
salt: z.string(), salt: z.string(),
@ -110,9 +110,9 @@ export const UsersUpdateSchema = z.object({
password: z.string().optional(), password: z.string().optional(),
nome: z.string().optional(), nome: z.string().optional(),
cognome: z.string().optional(), cognome: z.string().optional(),
created_at: z.date().optional(), created_at: z.union([z.date(), z.string()]).pipe(z.coerce.date()).optional(),
reset_password_token: z.string().optional().nullable(), reset_password_token: z.string().optional().nullable(),
reset_password_expires: z.date().optional().nullable(), reset_password_expires: z.union([z.date(), z.string()]).pipe(z.coerce.date()).optional().nullable(),
telefono: z.string().optional(), telefono: z.string().optional(),
isAdminMade: z.boolean().optional().nullable(), isAdminMade: z.boolean().optional().nullable(),
salt: z.string().optional(), salt: z.string().optional(),

View file

@ -69,7 +69,7 @@ export const NewUsersAnagraficaSchema = z.object({
idanagrafica: usersAnagraficaIdanagrafica.optional(), idanagrafica: usersAnagraficaIdanagrafica.optional(),
userid: usersId, userid: usersId,
luogo_nascita: z.string().optional().nullable(), luogo_nascita: z.string().optional().nullable(),
data_nascita: z.date().optional().nullable(), data_nascita: z.union([z.date(), z.string()]).pipe(z.coerce.date()).optional().nullable(),
nazione_nascita: z.string().optional().nullable(), nazione_nascita: z.string().optional().nullable(),
codice_fiscale: z.string().optional().nullable(), codice_fiscale: z.string().optional().nullable(),
via_residenza: z.string().optional().nullable(), via_residenza: z.string().optional().nullable(),
@ -87,7 +87,7 @@ export const UsersAnagraficaUpdateSchema = z.object({
idanagrafica: usersAnagraficaIdanagrafica.optional(), idanagrafica: usersAnagraficaIdanagrafica.optional(),
userid: usersId.optional(), userid: usersId.optional(),
luogo_nascita: z.string().optional().nullable(), luogo_nascita: z.string().optional().nullable(),
data_nascita: z.date().optional().nullable(), data_nascita: z.union([z.date(), z.string()]).pipe(z.coerce.date()).optional().nullable(),
nazione_nascita: z.string().optional().nullable(), nazione_nascita: z.string().optional().nullable(),
codice_fiscale: z.string().optional().nullable(), codice_fiscale: z.string().optional().nullable(),
via_residenza: z.string().optional().nullable(), via_residenza: z.string().optional().nullable(),

View file

@ -1,5 +1,6 @@
import { z } from "zod/v4"; import { z } from "zod/v4";
import type { AnnunciUpdate } from "~/schemas/public/Annunci"; import { AnnunciUpdateSchema, annunciId } from "~/schemas/public/Annunci";
import { servizioServizioId } from "~/schemas/public/Servizio";
import { import {
adminProcedure, adminProcedure,
apiProcedure, apiProcedure,
@ -30,13 +31,10 @@ import {
} from "~/server/services/cache.service"; } from "~/server/services/cache.service";
import { NewMail } from "~/server/services/mailer"; import { NewMail } from "~/server/services/mailer";
import { TypstGenerate } from "~/server/services/typst.service"; import { TypstGenerate } from "~/server/services/typst.service";
import { zAnnuncioId, zServizioId } from "~/server/utils/zod_types";
export const annunciRouter = createTRPCRouter({ export const annunciRouter = createTRPCRouter({
editAnnuncio: adminProcedure editAnnuncio: adminProcedure
.input( .input(z.object({ annuncioId: annunciId, data: AnnunciUpdateSchema }))
z.object({ annuncioId: zAnnuncioId, data: z.custom<AnnunciUpdate>() }),
)
.mutation(async ({ input }) => { .mutation(async ({ input }) => {
await invalidateCache( await invalidateCache(
`${SCHEDA_ANNUNCIO_CACHE_PREFIX}${input.annuncioId}`, `${SCHEDA_ANNUNCIO_CACHE_PREFIX}${input.annuncioId}`,
@ -65,7 +63,7 @@ export const annunciRouter = createTRPCRouter({
getAnnuncioFull: adminProcedure getAnnuncioFull: adminProcedure
.input( .input(
z.object({ z.object({
id: zAnnuncioId, id: annunciId,
}), }),
) )
.query(async ({ input }) => { .query(async ({ input }) => {
@ -78,7 +76,7 @@ export const annunciRouter = createTRPCRouter({
getAnnuncioById_rawImgUrls: publicProcedure getAnnuncioById_rawImgUrls: publicProcedure
.input( .input(
z.object({ z.object({
id: zAnnuncioId, id: annunciId,
}), }),
) )
.query(async ({ input }) => { .query(async ({ input }) => {
@ -87,7 +85,7 @@ export const annunciRouter = createTRPCRouter({
getSchedaAnnuncioData: adminProcedure getSchedaAnnuncioData: adminProcedure
.input( .input(
z.object({ z.object({
id: zAnnuncioId, id: annunciId,
}), }),
) )
.query(async ({ input }) => { .query(async ({ input }) => {
@ -96,7 +94,7 @@ export const annunciRouter = createTRPCRouter({
getSchedaAnnuncioPdf: adminProcedure getSchedaAnnuncioPdf: adminProcedure
.input( .input(
z.object({ z.object({
id: zAnnuncioId, id: annunciId,
}), }),
) )
.mutation(async ({ input }) => { .mutation(async ({ input }) => {
@ -130,7 +128,7 @@ export const annunciRouter = createTRPCRouter({
}), }),
getProprietarioData: protectedProcedure getProprietarioData: protectedProcedure
.input(z.object({ annuncioId: zAnnuncioId, servizioId: zServizioId })) .input(z.object({ annuncioId: annunciId, servizioId: servizioServizioId }))
.query(async ({ input }) => { .query(async ({ input }) => {
return await getProprietarioDataHandler({ return await getProprietarioDataHandler({
annuncioId: input.annuncioId, annuncioId: input.annuncioId,
@ -192,7 +190,7 @@ export const annunciRouter = createTRPCRouter({
getIncrociAnnuncio: protectedProcedure getIncrociAnnuncio: protectedProcedure
.input( .input(
z.object({ z.object({
annuncioId: zAnnuncioId, annuncioId: annunciId,
}), }),
) )
.query(async ({ input }) => { .query(async ({ input }) => {

View file

@ -1,5 +1,6 @@
import { z } from "zod/v4"; import { z } from "zod/v4";
import { zPassword } from "~/hooks/usePassword"; import { zPassword } from "~/hooks/usePassword";
import { usersId } from "~/schemas/public/Users";
import { import {
adminProcedure, adminProcedure,
createTRPCRouter, createTRPCRouter,
@ -20,7 +21,6 @@ import {
pwResetSendLinkHandler, pwResetSendLinkHandler,
resetPasswordFromTokenHandler, resetPasswordFromTokenHandler,
} from "~/server/services/auth.service"; } from "~/server/services/auth.service";
import { zUserId } from "~/server/utils/zod_types";
// Create a new ratelimiter, that allows 10 requests per 10 seconds // Create a new ratelimiter, that allows 10 requests per 10 seconds
/* /*
@ -66,7 +66,7 @@ export const authRouter = createTRPCRouter({
}), }),
genPswResetToken: adminProcedure genPswResetToken: adminProcedure
.input(z.object({ id: zUserId })) .input(z.object({ id: usersId }))
.mutation(async ({ input }) => { .mutation(async ({ input }) => {
return await genPasswordResetToken({ id: input.id }); return await genPasswordResetToken({ id: input.id });
}), }),
@ -97,7 +97,7 @@ export const authRouter = createTRPCRouter({
PasswordOverride: adminProcedure PasswordOverride: adminProcedure
.input( .input(
z.object({ z.object({
id: zUserId, id: usersId,
password: z.string(), password: z.string(),
}), }),
) )
@ -128,7 +128,7 @@ export const authRouter = createTRPCRouter({
swapUser: adminProcedure swapUser: adminProcedure
.input( .input(
z.object({ z.object({
id: zUserId, id: usersId,
}), }),
) )
.mutation(async ({ ctx, input }) => { .mutation(async ({ ctx, input }) => {

View file

@ -1,4 +1,6 @@
import { z } from "zod/v4"; import { z } from "zod/v4";
import { banlistId } from "~/schemas/public/Banlist";
import { banType } from "~/schemas/public/BanType";
import { adminProcedure, createTRPCRouter } from "~/server/api/trpc"; import { adminProcedure, createTRPCRouter } from "~/server/api/trpc";
import { db } from "~/server/db"; import { db } from "~/server/db";
import { import {
@ -7,13 +9,12 @@ import {
removeBan, removeBan,
updateBan, updateBan,
} from "~/server/services/banlist.service"; } from "~/server/services/banlist.service";
import { zBanlistId, zBanType } from "~/server/utils/zod_types";
export const banlistRouter = createTRPCRouter({ export const banlistRouter = createTRPCRouter({
addBan: adminProcedure addBan: adminProcedure
.input( .input(
z.object({ z.object({
type: zBanType, type: banType,
value: z.string(), value: z.string(),
}), }),
) )
@ -30,7 +31,7 @@ export const banlistRouter = createTRPCRouter({
removeBan: adminProcedure removeBan: adminProcedure
.input( .input(
z.object({ z.object({
id: zBanlistId, id: banlistId,
}), }),
) )
.mutation(async ({ input }) => { .mutation(async ({ input }) => {
@ -42,8 +43,8 @@ export const banlistRouter = createTRPCRouter({
updateBan: adminProcedure updateBan: adminProcedure
.input( .input(
z.object({ z.object({
id: zBanlistId, id: banlistId,
type: zBanType, type: banType,
value: z.string(), value: z.string(),
}), }),
) )

View file

@ -1,5 +1,7 @@
import { z } from "zod/v4"; import { z } from "zod/v4";
import type { BannersIdbanner } from "~/schemas/public/Banners"; import {
bannersIdbanner,
} from "~/schemas/public/Banners";
import { import {
adminProcedure, adminProcedure,
createTRPCRouter, createTRPCRouter,
@ -24,7 +26,7 @@ export const bannersRouter = createTRPCRouter({
cta_text: z.string().nullable(), cta_text: z.string().nullable(),
has_cta: z.boolean(), has_cta: z.boolean(),
hide_duration: z.number().nullable(), hide_duration: z.number().nullable(),
idbanner: z.custom<BannersIdbanner>(), idbanner: bannersIdbanner,
is_active: z.boolean(), is_active: z.boolean(),
is_unskippable: z.boolean(), is_unskippable: z.boolean(),
show_private: z.boolean(), show_private: z.boolean(),
@ -40,7 +42,7 @@ export const bannersRouter = createTRPCRouter({
return await getAllBanners({ db }); return await getAllBanners({ db });
}), }),
deleteBanner: adminProcedure deleteBanner: adminProcedure
.input(z.object({ idbanner: z.custom<BannersIdbanner>() })) .input(z.object({ idbanner: bannersIdbanner }))
.mutation(async ({ input }) => { .mutation(async ({ input }) => {
return await deleteBanner({ db, input }); return await deleteBanner({ db, input });
}), }),
@ -53,7 +55,7 @@ export const bannersRouter = createTRPCRouter({
cta_text: z.string().nullable(), cta_text: z.string().nullable(),
has_cta: z.boolean(), has_cta: z.boolean(),
hide_duration: z.number().nullable(), hide_duration: z.number().nullable(),
idbanner: z.custom<BannersIdbanner>(), idbanner: bannersIdbanner,
is_active: z.boolean(), is_active: z.boolean(),
is_unskippable: z.boolean(), is_unskippable: z.boolean(),
show_private: z.boolean(), show_private: z.boolean(),

View file

@ -1,4 +1,8 @@
import { z } from "zod/v4"; import { z } from "zod/v4";
import { chatsChatid } from "~/schemas/public/Chats";
import { etichetteIdEtichetta } from "~/schemas/public/Etichette";
import { messagesMessageid } from "~/schemas/public/Messages";
import { usersId } from "~/schemas/public/Users";
import { import {
adminProcedure, adminProcedure,
createTRPCRouter, createTRPCRouter,
@ -19,16 +23,10 @@ import {
} from "~/server/controllers/etichette.controller"; } from "~/server/controllers/etichette.controller";
import { retrieveChatMessageFiles } from "~/server/controllers/storage.controller"; import { retrieveChatMessageFiles } from "~/server/controllers/storage.controller";
import { db } from "~/server/db"; import { db } from "~/server/db";
import {
zChatId,
zEtichettaId,
zMessageId,
zUserId,
} from "~/server/utils/zod_types";
export const chatRouter = createTRPCRouter({ export const chatRouter = createTRPCRouter({
addEtichettaToChat: protectedProcedure addEtichettaToChat: protectedProcedure
.input(z.object({ chatId: zChatId, etichettaId: zEtichettaId })) .input(z.object({ chatId: chatsChatid, etichettaId: etichetteIdEtichetta }))
.mutation(async ({ input }) => { .mutation(async ({ input }) => {
return await addChatEtichette({ return await addChatEtichette({
chatid: input.chatId, chatid: input.chatId,
@ -39,7 +37,7 @@ export const chatRouter = createTRPCRouter({
deleteChat: adminProcedure deleteChat: adminProcedure
.input( .input(
z.object({ z.object({
chatId: zChatId, chatId: chatsChatid,
}), }),
) )
.mutation(async ({ input }) => { .mutation(async ({ input }) => {
@ -50,7 +48,7 @@ export const chatRouter = createTRPCRouter({
return await getActiveInfos(); return await getActiveInfos();
}), }),
getChatEtichette: protectedProcedure getChatEtichette: protectedProcedure
.input(z.object({ chatId: zChatId })) .input(z.object({ chatId: chatsChatid }))
.query(async ({ input }) => { .query(async ({ input }) => {
return await getChatEtichette({ return await getChatEtichette({
chatid: input.chatId, chatid: input.chatId,
@ -58,7 +56,7 @@ export const chatRouter = createTRPCRouter({
}); });
}), }),
getChatIdByUser: adminProcedure getChatIdByUser: adminProcedure
.input(z.object({ userId: zUserId })) .input(z.object({ userId: usersId }))
.query(async ({ input }) => { .query(async ({ input }) => {
return await getChatByUserIdHandler({ userId: input.userId }); return await getChatByUserIdHandler({ userId: input.userId });
}), }),
@ -66,7 +64,7 @@ export const chatRouter = createTRPCRouter({
getChatInfobyId: protectedProcedure getChatInfobyId: protectedProcedure
.input( .input(
z.object({ z.object({
chatId: zChatId, chatId: chatsChatid,
}), }),
) )
.query(async ({ input }) => { .query(async ({ input }) => {
@ -81,14 +79,14 @@ export const chatRouter = createTRPCRouter({
getUserInfosByChat: protectedProcedure getUserInfosByChat: protectedProcedure
.input( .input(
z.object({ z.object({
chatId: zChatId, chatId: chatsChatid,
}), }),
) )
.query(async ({ input }) => { .query(async ({ input }) => {
return await getUserByChatHandler({ chatId: input.chatId }); return await getUserByChatHandler({ chatId: input.chatId });
}), }),
removeEtichettaFromChat: protectedProcedure removeEtichettaFromChat: protectedProcedure
.input(z.object({ chatId: zChatId, etichettaId: zEtichettaId })) .input(z.object({ chatId: chatsChatid, etichettaId: etichetteIdEtichetta }))
.mutation(async ({ input }) => { .mutation(async ({ input }) => {
return await removeChatEtichette({ return await removeChatEtichette({
chatid: input.chatId, chatid: input.chatId,
@ -97,7 +95,7 @@ export const chatRouter = createTRPCRouter({
}); });
}), }),
getMessageAttachments: protectedProcedure getMessageAttachments: protectedProcedure
.input(z.object({ messageId: zMessageId })) .input(z.object({ messageId: messagesMessageid }))
.query(async ({ input }) => { .query(async ({ input }) => {
return await retrieveChatMessageFiles({ messageId: input.messageId }); return await retrieveChatMessageFiles({ messageId: input.messageId });
}), }),

View file

@ -3,7 +3,13 @@ import { TRPCError, tracked } from "@trpc/server";
import { sql } from "kysely"; import { sql } from "kysely";
import { jsonObjectFrom } from "kysely/helpers/postgres"; import { jsonObjectFrom } from "kysely/helpers/postgres";
import { z } from "zod/v4"; import { z } from "zod/v4";
import type { MessagesMessageid } from "~/schemas/public/Messages"; import { chatsChatid } from "~/schemas/public/Chats";
import {
type MessagesMessageid,
messagesMessageid,
} from "~/schemas/public/Messages";
import { usersId } from "~/schemas/public/Users";
import { usersStorageUserStorageId } from "~/schemas/public/UsersStorage";
import { import {
adminProcedure, adminProcedure,
createTRPCRouter, createTRPCRouter,
@ -22,11 +28,7 @@ import {
MessageUpdateEventSchema, MessageUpdateEventSchema,
SidebarUpdateSchema, SidebarUpdateSchema,
TypingDataSchema, TypingDataSchema,
zChatId, } from "~/server/utils/zod_chat_types";
zMessageId,
zUserId,
zUserStorageId,
} from "~/server/utils/zod_types";
import { getKeydbClient, getSubClient } from "~/utils/keydb"; import { getKeydbClient, getSubClient } from "~/utils/keydb";
import { withUserColorStr } from "~/utils/kysely-helper"; import { withUserColorStr } from "~/utils/kysely-helper";
@ -43,7 +45,7 @@ export type TypingData = z.infer<typeof TypingDataSchema>;
export const chatSSERouter = createTRPCRouter({ export const chatSSERouter = createTRPCRouter({
createChat: protectedProcedure createChat: protectedProcedure
.input(z.object({ userId: zUserId })) .input(z.object({ userId: usersId }))
.mutation(async ({ input }) => { .mutation(async ({ input }) => {
const newChat = await add({ const newChat = await add({
db, db,
@ -56,16 +58,16 @@ export const chatSSERouter = createTRPCRouter({
getChat: protectedProcedure getChat: protectedProcedure
.input( .input(
z.object({ z.object({
chatId: zChatId, chatId: chatsChatid,
cursor: zMessageId.nullish(), cursor: messagesMessageid.nullish(),
take: z.number().min(1).max(50).nullish(), take: z.number().min(1).max(50).nullish(),
targetMsgId: zMessageId.nullish(), targetMsgId: messagesMessageid.nullish(),
}), }),
) )
.output( .output(
z.object({ z.object({
items: z.array(MessageDataSchema), items: z.array(MessageDataSchema),
nextCursor: zMessageId.nullable(), nextCursor: messagesMessageid.nullable(),
}), }),
) )
.query(async ({ input, ctx }) => { .query(async ({ input, ctx }) => {
@ -248,14 +250,14 @@ export const chatSSERouter = createTRPCRouter({
sendMessage: protectedProcedure sendMessage: protectedProcedure
.input( .input(
z.object({ z.object({
chatId: zChatId, chatId: chatsChatid,
message: z.string(), message: z.string(),
sender: zUserId, sender: usersId,
is_forwarded: z.boolean().default(false), is_forwarded: z.boolean().default(false),
reply_to_id: zMessageId.nullable().default(null), reply_to_id: messagesMessageid.nullable().default(null),
attachments: z attachments: z
.object({ .object({
userStorageId: zUserStorageId, userStorageId: usersStorageUserStorageId,
storageId: z.string(), storageId: z.string(),
}) })
.array() .array()
@ -364,7 +366,7 @@ export const chatSSERouter = createTRPCRouter({
return payload; return payload;
}), }),
deleteMessage: adminProcedure deleteMessage: adminProcedure
.input(z.object({ chatId: zChatId, messageId: zMessageId })) .input(z.object({ chatId: chatsChatid, messageId: messagesMessageid }))
.mutation(async ({ input }) => { .mutation(async ({ input }) => {
try { try {
await db await db
@ -390,7 +392,11 @@ export const chatSSERouter = createTRPCRouter({
editMessage: adminProcedure editMessage: adminProcedure
.input( .input(
z.object({ chatId: zChatId, message: z.string(), messageId: zMessageId }), z.object({
chatId: chatsChatid,
message: z.string(),
messageId: messagesMessageid,
}),
) )
.mutation(async ({ input }) => { .mutation(async ({ input }) => {
try { try {
@ -419,7 +425,7 @@ export const chatSSERouter = createTRPCRouter({
} }
}), }),
onMessageUpdates: publicProcedure onMessageUpdates: publicProcedure
.input(z.object({ chatId: zChatId.nullable() })) .input(z.object({ chatId: chatsChatid.nullable() }))
.output( .output(
zAsyncIterable({ zAsyncIterable({
yield: MessageUpdateEventSchema, yield: MessageUpdateEventSchema,
@ -488,9 +494,9 @@ export const chatSSERouter = createTRPCRouter({
toggleTyping: publicProcedure toggleTyping: publicProcedure
.input( .input(
z.object({ z.object({
chatId: zChatId, chatId: chatsChatid,
isTyping: z.boolean(), isTyping: z.boolean(),
userId: zUserId, userId: usersId,
username: z.string(), username: z.string(),
}), }),
) )
@ -525,7 +531,7 @@ export const chatSSERouter = createTRPCRouter({
onMessage: publicProcedure onMessage: publicProcedure
.input( .input(
z.object({ z.object({
chatId: zChatId.nullable(), chatId: chatsChatid.nullable(),
lastEventId: z.string().nullish(), lastEventId: z.string().nullish(),
}), }),
) )
@ -551,7 +557,7 @@ export const chatSSERouter = createTRPCRouter({
(() => { (() => {
if (!input.lastEventId) return null; if (!input.lastEventId) return null;
const parsed = zMessageId.safeParse(input.lastEventId); const parsed = messagesMessageid.safeParse(input.lastEventId);
if (!parsed.success) { if (!parsed.success) {
return null; return null;
} }
@ -651,9 +657,9 @@ export const chatSSERouter = createTRPCRouter({
onTyping: publicProcedure onTyping: publicProcedure
.input( .input(
z.object({ z.object({
chatId: zChatId.nullable(), chatId: chatsChatid.nullable(),
username: z.string(), username: z.string(),
userId: zUserId, userId: usersId,
}), }),
) )
.output( .output(
@ -714,7 +720,7 @@ export const chatSSERouter = createTRPCRouter({
} }
}), }),
setRead: protectedProcedure setRead: protectedProcedure
.input(z.object({ chatId: zChatId })) .input(z.object({ chatId: chatsChatid }))
.mutation(async ({ input, ctx }) => { .mutation(async ({ input, ctx }) => {
const didUpdate = await setReadMessage({ const didUpdate = await setReadMessage({
chatId: input.chatId, chatId: input.chatId,

View file

@ -1,9 +1,14 @@
import { TRPCError } from "@trpc/server"; import { TRPCError } from "@trpc/server";
import { format } from "date-fns"; import { format } from "date-fns";
import { z } from "zod/v4"; import { z } from "zod/v4";
import type { EmailsIdEmail } from "~/schemas/public/Emails"; import { emailsIdEmail } from "~/schemas/public/Emails";
import type { EventQueueUpdate } from "~/schemas/public/EventQueue"; import {
EventQueueUpdateSchema,
eventQueueEventId,
} from "~/schemas/public/EventQueue";
import { ordiniOrdineId } from "~/schemas/public/Ordini";
import type { TestiEStringheStingaId } from "~/schemas/public/TestiEStringhe"; import type { TestiEStringheStingaId } from "~/schemas/public/TestiEStringhe";
import { usersId } from "~/schemas/public/Users";
import { import {
adminProcedure, adminProcedure,
createTRPCRouter, createTRPCRouter,
@ -27,11 +32,10 @@ import {
import type { MailsTemplates } from "~/server/services/mail-templates"; import type { MailsTemplates } from "~/server/services/mail-templates";
import { NewMail } from "~/server/services/mailer"; import { NewMail } from "~/server/services/mailer";
import { CONDIZIONI_DEFAULT } from "~/server/services/prezziario.service"; import { CONDIZIONI_DEFAULT } from "~/server/services/prezziario.service";
import { zEventId, zOrdineId, zUserId } from "~/server/utils/zod_types";
export const comunicazioniRouter = createTRPCRouter({ export const comunicazioniRouter = createTRPCRouter({
getEmails: protectedProcedure getEmails: protectedProcedure
.input(z.object({ userId: zUserId })) .input(z.object({ userId: usersId }))
.query(async ({ input }) => { .query(async ({ input }) => {
return await getEmails({ return await getEmails({
userId: input.userId, userId: input.userId,
@ -40,7 +44,7 @@ export const comunicazioniRouter = createTRPCRouter({
deleteEmail: adminProcedure deleteEmail: adminProcedure
.input( .input(
z.object({ z.object({
id_email: z.custom<EmailsIdEmail>(), id_email: emailsIdEmail,
}), }),
) )
.mutation(async ({ input }) => { .mutation(async ({ input }) => {
@ -49,7 +53,7 @@ export const comunicazioniRouter = createTRPCRouter({
}); });
}), }),
deleteAllUserEmails: adminProcedure deleteAllUserEmails: adminProcedure
.input(z.object({ userId: zUserId })) .input(z.object({ userId: usersId }))
.mutation(async ({ input }) => { .mutation(async ({ input }) => {
return await deleteAllUserEmails({ return await deleteAllUserEmails({
userId: input.userId, userId: input.userId,
@ -103,7 +107,7 @@ export const comunicazioniRouter = createTRPCRouter({
sendRicevutaECondizioniEmail: adminProcedure sendRicevutaECondizioniEmail: adminProcedure
.input( .input(
z.object({ z.object({
ordineId: zOrdineId, ordineId: ordiniOrdineId,
}), }),
) )
.mutation(async ({ input }) => { .mutation(async ({ input }) => {
@ -212,7 +216,7 @@ export const comunicazioniRouter = createTRPCRouter({
} }
}), }),
getUserQueuedEmails: protectedProcedure getUserQueuedEmails: protectedProcedure
.input(z.object({ userId: zUserId })) .input(z.object({ userId: usersId }))
.query(async ({ input }) => { .query(async ({ input }) => {
return await userEmailQueue(input.userId); return await userEmailQueue(input.userId);
}), }),
@ -220,7 +224,7 @@ export const comunicazioniRouter = createTRPCRouter({
.input( .input(
z.object({ z.object({
lock_expires: z.date(), lock_expires: z.date(),
userId: zUserId, userId: usersId,
template: z.custom<MailsTemplates>(), template: z.custom<MailsTemplates>(),
subject: z.string(), subject: z.string(),
}), }),
@ -263,7 +267,7 @@ export const comunicazioniRouter = createTRPCRouter({
removeFromUserEmailQueue: adminProcedure removeFromUserEmailQueue: adminProcedure
.input( .input(
z.object({ z.object({
eventId: zEventId, eventId: eventQueueEventId,
}), }),
) )
.mutation(async ({ input }) => { .mutation(async ({ input }) => {
@ -271,15 +275,15 @@ export const comunicazioniRouter = createTRPCRouter({
}), }),
clearUserEmailQueue: adminProcedure clearUserEmailQueue: adminProcedure
.input(z.object({ userId: zUserId })) .input(z.object({ userId: usersId }))
.mutation(async ({ input }) => { .mutation(async ({ input }) => {
return await clearUserEmailQueue(input.userId); return await clearUserEmailQueue(input.userId);
}), }),
updateEvent: adminProcedure updateEvent: adminProcedure
.input( .input(
z.object({ z.object({
eventId: zEventId, eventId: eventQueueEventId,
data: z.custom<EventQueueUpdate>(), data: EventQueueUpdateSchema,
}), }),
) )
.mutation(async ({ input }) => { .mutation(async ({ input }) => {

View file

@ -1,5 +1,7 @@
import { TRPCError } from "@trpc/server"; import { TRPCError } from "@trpc/server";
import { z } from "zod/v4"; import { z } from "zod/v4";
import { etichetteIdEtichetta } from "~/schemas/public/Etichette";
import { usersId } from "~/schemas/public/Users";
import { adminProcedure, createTRPCRouter } from "~/server/api/trpc"; import { adminProcedure, createTRPCRouter } from "~/server/api/trpc";
import { import {
addEtichetta, addEtichetta,
@ -8,7 +10,6 @@ import {
updateEtichetta, updateEtichetta,
} from "~/server/controllers/etichette.controller"; } from "~/server/controllers/etichette.controller";
import { db } from "~/server/db"; import { db } from "~/server/db";
import { zEtichettaId, zUserId } from "~/server/utils/zod_types";
export const etichetteRouter = createTRPCRouter({ export const etichetteRouter = createTRPCRouter({
addEtichetta: adminProcedure addEtichetta: adminProcedure
@ -29,7 +30,7 @@ export const etichetteRouter = createTRPCRouter({
return await getAllEtichette({ db }); return await getAllEtichette({ db });
}), }),
removeEtichetta: adminProcedure removeEtichetta: adminProcedure
.input(z.object({ id_etichetta: zEtichettaId })) .input(z.object({ id_etichetta: etichetteIdEtichetta }))
.mutation(async ({ input }) => { .mutation(async ({ input }) => {
return await removeEtichetta({ return await removeEtichetta({
db, db,
@ -40,7 +41,7 @@ export const etichetteRouter = createTRPCRouter({
.input( .input(
z.object({ z.object({
color_hex: z.string().max(7), color_hex: z.string().max(7),
id_etichetta: zEtichettaId, id_etichetta: etichetteIdEtichetta,
title: z.string(), title: z.string(),
}), }),
) )
@ -55,8 +56,8 @@ export const etichetteRouter = createTRPCRouter({
addUserEtichetta: adminProcedure addUserEtichetta: adminProcedure
.input( .input(
z.object({ z.object({
userId: zUserId, userId: usersId,
etichettaId: zEtichettaId, etichettaId: etichetteIdEtichetta,
}), }),
) )
.mutation(async ({ input }) => { .mutation(async ({ input }) => {
@ -78,8 +79,8 @@ export const etichetteRouter = createTRPCRouter({
removeUserEtichetta: adminProcedure removeUserEtichetta: adminProcedure
.input( .input(
z.object({ z.object({
userId: zUserId, userId: usersId,
etichettaId: zEtichettaId, etichettaId: etichetteIdEtichetta,
}), }),
) )
.mutation(async ({ input }) => { .mutation(async ({ input }) => {

View file

@ -1,11 +1,11 @@
import { z } from "zod/v4"; import { z } from "zod/v4";
import { usersId } from "~/schemas/public/Users";
import { adminProcedure, createTRPCRouter } from "~/server/api/trpc"; import { adminProcedure, createTRPCRouter } from "~/server/api/trpc";
import { import {
exportUserToFIC, exportUserToFIC,
getClientFromCF, getClientFromCF,
} from "~/server/controllers/fic.controller"; } from "~/server/controllers/fic.controller";
import { zUserId } from "~/server/utils/zod_types";
export const fattureRouter = createTRPCRouter({ export const fattureRouter = createTRPCRouter({
getClientFromCF: adminProcedure getClientFromCF: adminProcedure
@ -20,7 +20,7 @@ export const fattureRouter = createTRPCRouter({
addToFIC: adminProcedure addToFIC: adminProcedure
.input( .input(
z.object({ z.object({
userId: zUserId, userId: usersId,
}), }),
) )
.mutation(async ({ input }) => { .mutation(async ({ input }) => {

View file

@ -1,4 +1,5 @@
import { z } from "zod/v4"; import { z } from "zod/v4";
import { flagsId } from "~/schemas/public/Flags";
import { import {
adminProcedure, adminProcedure,
createTRPCRouter, createTRPCRouter,
@ -12,13 +13,12 @@ import {
RemoveFlagHandler, RemoveFlagHandler,
} from "~/server/controllers/flags.controller"; } from "~/server/controllers/flags.controller";
import { db } from "~/server/db"; import { db } from "~/server/db";
import { zFlagsId } from "~/server/utils/zod_types";
export const flagsRouter = createTRPCRouter({ export const flagsRouter = createTRPCRouter({
AddFlag: adminProcedure AddFlag: adminProcedure
.input( .input(
z.object({ z.object({
id: zFlagsId, id: flagsId,
value: z.boolean(), value: z.boolean(),
}), }),
) )
@ -28,7 +28,7 @@ export const flagsRouter = createTRPCRouter({
EditFlag: adminProcedure EditFlag: adminProcedure
.input( .input(
z.object({ z.object({
id: zFlagsId, id: flagsId,
value: z.boolean(), value: z.boolean(),
}), }),
) )
@ -49,7 +49,7 @@ export const flagsRouter = createTRPCRouter({
.input( .input(
z.object({ z.object({
id: zFlagsId, id: flagsId,
}), }),
) )
.mutation(async ({ input }) => { .mutation(async ({ input }) => {

View file

@ -1,6 +1,8 @@
import { TRPCError } from "@trpc/server"; import { TRPCError } from "@trpc/server";
import z from "zod/v4"; import z from "zod/v4";
import { env } from "~/env"; import { env } from "~/env";
import { annunciId } from "~/schemas/public/Annunci";
import { usersId } from "~/schemas/public/Users";
import { createTRPCRouter, protectedProcedure } from "~/server/api/trpc"; import { createTRPCRouter, protectedProcedure } from "~/server/api/trpc";
import { db } from "~/server/db"; import { db } from "~/server/db";
import { import {
@ -12,15 +14,14 @@ import {
} from "~/server/services/interests.service"; } from "~/server/services/interests.service";
import { NewMail } from "~/server/services/mailer"; import { NewMail } from "~/server/services/mailer";
import { findUser_byId_MINI } from "~/server/services/user.service"; import { findUser_byId_MINI } from "~/server/services/user.service";
import { zAnnuncioId, zUserId } from "~/server/utils/zod_types";
export const intrestsRouter = createTRPCRouter({ export const intrestsRouter = createTRPCRouter({
addIntrest: protectedProcedure addIntrest: protectedProcedure
.input( .input(
z.object({ z.object({
annuncioId: zAnnuncioId, annuncioId: annunciId,
/**Optional */ /**Optional */
userId: zUserId.optional(), userId: usersId.optional(),
}), }),
) )
.mutation(async ({ ctx, input }) => { .mutation(async ({ ctx, input }) => {
@ -72,7 +73,7 @@ export const intrestsRouter = createTRPCRouter({
getUserInterests: protectedProcedure getUserInterests: protectedProcedure
.input( .input(
z.object({ z.object({
userId: zUserId.optional(), userId: usersId.optional(),
}), }),
) )
.query(async ({ input, ctx }) => { .query(async ({ input, ctx }) => {
@ -81,7 +82,7 @@ export const intrestsRouter = createTRPCRouter({
getUserInterestsAnnunci: protectedProcedure getUserInterestsAnnunci: protectedProcedure
.input( .input(
z.object({ z.object({
userId: zUserId.optional(), userId: usersId.optional(),
}), }),
) )
.query(async ({ input, ctx }) => { .query(async ({ input, ctx }) => {
@ -90,8 +91,8 @@ export const intrestsRouter = createTRPCRouter({
hasUserInterest: protectedProcedure hasUserInterest: protectedProcedure
.input( .input(
z.object({ z.object({
annuncioId: zAnnuncioId, annuncioId: annunciId,
userId: zUserId.optional(), userId: usersId.optional(),
}), }),
) )
.query(async ({ ctx, input }) => { .query(async ({ ctx, input }) => {
@ -103,8 +104,8 @@ export const intrestsRouter = createTRPCRouter({
removeIntrest: protectedProcedure removeIntrest: protectedProcedure
.input( .input(
z.object({ z.object({
annuncioId: zAnnuncioId, annuncioId: annunciId,
userId: zUserId.optional(), userId: usersId.optional(),
}), }),
) )
.mutation(async ({ ctx, input }) => { .mutation(async ({ ctx, input }) => {

View file

@ -1,6 +1,7 @@
import { TRPCError } from "@trpc/server"; import { TRPCError } from "@trpc/server";
import { z } from "zod"; import { z } from "zod";
import { env } from "~/env"; import { env } from "~/env";
import { usersId } from "~/schemas/public/Users";
import { import {
adminProcedure, adminProcedure,
createTRPCRouter, createTRPCRouter,
@ -14,14 +15,13 @@ import {
} from "~/server/controllers/invites.controller"; } from "~/server/controllers/invites.controller";
import { db } from "~/server/db"; import { db } from "~/server/db";
import { findUser_byEmail, getUser } from "~/server/services/user.service"; import { findUser_byEmail, getUser } from "~/server/services/user.service";
import { zUserId } from "~/server/utils/zod_types";
export const inviteRouter = createTRPCRouter({ export const inviteRouter = createTRPCRouter({
// Admin sends invite // Admin sends invite
sendInvite: adminProcedure sendInvite: adminProcedure
.input( .input(
z.object({ z.object({
id: zUserId, id: usersId,
}), }),
) )
.mutation(async ({ input }) => { .mutation(async ({ input }) => {

View file

@ -1,6 +1,9 @@
import { TRPCError } from "@trpc/server"; import { TRPCError } from "@trpc/server";
import { z } from "zod/v4"; import { z } from "zod/v4";
import OrderTypeEnum from "~/schemas/public/OrderTypeEnum"; import { orderTypeEnum } from "~/schemas/public/OrderTypeEnum";
import { ordiniOrdineId } from "~/schemas/public/Ordini";
import { rinnoviId } from "~/schemas/public/Rinnovi";
import { servizioServizioId } from "~/schemas/public/Servizio";
import { createTRPCRouter, protectedProcedure } from "~/server/api/trpc"; import { createTRPCRouter, protectedProcedure } from "~/server/api/trpc";
import { import {
getPagamentoDataForCheckout, getPagamentoDataForCheckout,
@ -13,7 +16,6 @@ import {
import { db } from "~/server/db"; import { db } from "~/server/db";
import { TypstGenerate } from "~/server/services/typst.service"; import { TypstGenerate } from "~/server/services/typst.service";
import { zOrdineId, zRinnovoId, zServizioId } from "~/server/utils/zod_types";
import { zResult } from "~/utils/result"; import { zResult } from "~/utils/result";
// Create a new ratelimiter, that allows 10 requests per 10 seconds // Create a new ratelimiter, that allows 10 requests per 10 seconds
/* /*
@ -45,13 +47,13 @@ export const pagamentiRouter = createTRPCRouter({
preparePayment: protectedProcedure preparePayment: protectedProcedure
.input( .input(
z.object({ z.object({
servizioId: zServizioId, servizioId: servizioServizioId,
type: z.enum(OrderTypeEnum), type: orderTypeEnum,
}), }),
) )
.output(zResult<PreparedPaymentData, PreparePaymentError>()) .output(zResult<PreparedPaymentData, PreparePaymentError>())
.query(async ({ input }) => { .query(async ({ input }) => {
if (input.type === OrderTypeEnum.Rinnovo) { if (input.type === orderTypeEnum.enum.Rinnovo) {
return { return {
ok: false, ok: false,
error: { error: {
@ -68,7 +70,7 @@ export const pagamentiRouter = createTRPCRouter({
previewSaldo: protectedProcedure previewSaldo: protectedProcedure
.input( .input(
z.object({ z.object({
servizioId: zServizioId, servizioId: servizioServizioId,
}), }),
) )
.query(async ({ input }) => { .query(async ({ input }) => {
@ -77,24 +79,24 @@ export const pagamentiRouter = createTRPCRouter({
preparePaymentRinnovi: protectedProcedure preparePaymentRinnovi: protectedProcedure
.input( .input(
z.object({ z.object({
rinnovoId: zRinnovoId, rinnovoId: rinnoviId,
}), }),
) )
.output(zResult<PreparedPaymentData, PreparePaymentError>()) .output(zResult<PreparedPaymentData, PreparePaymentError>())
.query(async ({ input }) => { .query(async ({ input }) => {
return await preparePayment({ return await preparePayment({
type: OrderTypeEnum.Rinnovo, type: orderTypeEnum.enum.Rinnovo,
rinnovoId: input.rinnovoId, rinnovoId: input.rinnovoId,
}); });
}), }),
getPagamentoDataForCheckout: protectedProcedure getPagamentoDataForCheckout: protectedProcedure
.input(z.object({ ordineId: zOrdineId })) .input(z.object({ ordineId: ordiniOrdineId }))
.query(async ({ input }) => { .query(async ({ input }) => {
return await getPagamentoDataForCheckout(input.ordineId); return await getPagamentoDataForCheckout(input.ordineId);
}), }),
getRicevutaCortesiaPdf: protectedProcedure getRicevutaCortesiaPdf: protectedProcedure
.input(z.object({ ordineId: zOrdineId })) .input(z.object({ ordineId: ordiniOrdineId }))
.mutation(async ({ input }) => { .mutation(async ({ input }) => {
try { try {
const ricData = await getRicevutaData(input.ordineId); const ricData = await getRicevutaData(input.ordineId);
@ -111,7 +113,7 @@ export const pagamentiRouter = createTRPCRouter({
} }
}), }),
getRicevutaCortesiaPdfQuery: protectedProcedure getRicevutaCortesiaPdfQuery: protectedProcedure
.input(z.object({ ordineId: zOrdineId })) .input(z.object({ ordineId: ordiniOrdineId }))
.query(async ({ input }) => { .query(async ({ input }) => {
try { try {
const ricData = await getRicevutaData(input.ordineId); const ricData = await getRicevutaData(input.ordineId);

View file

@ -1,10 +1,11 @@
import z from "zod"; import z from "zod";
import type { import {
NewPotenziali, NewPotenzialiSchema,
PotenzialiId, PotenzialiUpdateSchema,
PotenzialiUpdate, potenzialiId,
} from "~/schemas/public/Potenziali"; } from "~/schemas/public/Potenziali";
import type { PotenzialiGroupsId } from "~/schemas/public/PotenzialiGroups";
import { potenzialiGroupsId } from "~/schemas/public/PotenzialiGroups";
import { adminProcedure, createTRPCRouter } from "~/server/api/trpc"; import { adminProcedure, createTRPCRouter } from "~/server/api/trpc";
import { import {
addPotenziale, addPotenziale,
@ -18,30 +19,6 @@ import {
updatePotenziali, updatePotenziali,
} from "~/server/services/potenziali.service"; } from "~/server/services/potenziali.service";
const zPotenzialiId = z.custom<PotenzialiId>(
(val) => typeof val === "string" && val.length > 0,
{ message: "Invalid PotenzialiId" },
);
const zNewPotenziali = z.custom<NewPotenziali>(
(val) => {
return typeof val === "object" && val !== null;
},
{ message: "Invalid NewPotenziali" },
);
const zPotenzialiUpdate = z.custom<PotenzialiUpdate>(
(val) => {
return typeof val === "object" && val !== null;
},
{ message: "Invalid PotenzialiUpdate" },
);
const zPotenzialiGroupId = z.custom<PotenzialiGroupsId>(
(val) => typeof val === "string" && val.length > 0,
{ message: "Invalid PotenzialiGroupsId" },
);
export const potenzialiRouter = createTRPCRouter({ export const potenzialiRouter = createTRPCRouter({
getPotenziali: adminProcedure.query(async () => { getPotenziali: adminProcedure.query(async () => {
return await getPotenziali(); return await getPotenziali();
@ -52,7 +29,7 @@ export const potenzialiRouter = createTRPCRouter({
addPotenziale: adminProcedure addPotenziale: adminProcedure
.input( .input(
z.object({ z.object({
data: zNewPotenziali, data: NewPotenzialiSchema,
}), }),
) )
.mutation(async ({ input }) => { .mutation(async ({ input }) => {
@ -70,8 +47,8 @@ export const potenzialiRouter = createTRPCRouter({
updatePotenziale: adminProcedure updatePotenziale: adminProcedure
.input( .input(
z.object({ z.object({
potenzialiId: zPotenzialiId, potenzialiId: potenzialiId,
data: zPotenzialiUpdate, data: PotenzialiUpdateSchema,
}), }),
) )
.mutation(async ({ input }) => { .mutation(async ({ input }) => {
@ -80,7 +57,7 @@ export const potenzialiRouter = createTRPCRouter({
deletePotenziale: adminProcedure deletePotenziale: adminProcedure
.input( .input(
z.object({ z.object({
potenzialiId: zPotenzialiId, potenzialiId: potenzialiId,
}), }),
) )
.mutation(async ({ input }) => { .mutation(async ({ input }) => {
@ -100,7 +77,7 @@ export const potenzialiRouter = createTRPCRouter({
deletePotenzialeGroup: adminProcedure deletePotenzialeGroup: adminProcedure
.input( .input(
z.object({ z.object({
potenzialiGroupId: zPotenzialiGroupId, potenzialiGroupId: potenzialiGroupsId,
}), }),
) )
.mutation(async ({ input }) => { .mutation(async ({ input }) => {

View file

@ -1,9 +1,10 @@
import { z } from "zod/v4"; import { z } from "zod/v4";
import type { import {
NewPrezziario, NewPrezziarioSchema,
PrezziarioUpdate, PrezziarioUpdateSchema,
prezziarioIdprezziario,
} from "~/schemas/public/Prezziario"; } from "~/schemas/public/Prezziario";
import TipologiaPosizioneEnum from "~/schemas/public/TipologiaPosizioneEnum"; import { tipologiaPosizioneEnum } from "~/schemas/public/TipologiaPosizioneEnum";
import { import {
adminProcedure, adminProcedure,
createTRPCRouter, createTRPCRouter,
@ -18,7 +19,6 @@ import {
getPrezziarioConsulenza, getPrezziarioConsulenza,
updatePrezziario, updatePrezziario,
} from "~/server/services/prezziario.service"; } from "~/server/services/prezziario.service";
import { zPrezziarioId } from "~/server/utils/zod_types";
// Create a new ratelimiter, that allows 10 requests per 10 seconds // Create a new ratelimiter, that allows 10 requests per 10 seconds
/* /*
const ratelimit = new RateLimiterHandler({ const ratelimit = new RateLimiterHandler({
@ -31,7 +31,7 @@ export const prezziarioRouter = createTRPCRouter({
addPrezziario: adminProcedure addPrezziario: adminProcedure
.input( .input(
z.object({ z.object({
data: z.custom<NewPrezziario>(), data: NewPrezziarioSchema,
}), }),
) )
.mutation(async ({ input }) => { .mutation(async ({ input }) => {
@ -43,7 +43,7 @@ export const prezziarioRouter = createTRPCRouter({
getPrezziPerTipologia: publicProcedure getPrezziPerTipologia: publicProcedure
.input( .input(
z.object({ z.object({
tipologia: z.custom<TipologiaPosizioneEnum>(), tipologia: tipologiaPosizioneEnum,
}), }),
) )
.query(async ({ input }) => { .query(async ({ input }) => {
@ -60,11 +60,11 @@ export const prezziarioRouter = createTRPCRouter({
}), }),
stabile: await getPrezziarioByTipologia({ stabile: await getPrezziarioByTipologia({
db, db,
tipologia: TipologiaPosizioneEnum.Stabile, tipologia: tipologiaPosizioneEnum.enum.Stabile,
}), }),
transitorio: await getPrezziarioByTipologia({ transitorio: await getPrezziarioByTipologia({
db, db,
tipologia: TipologiaPosizioneEnum.Transitorio, tipologia: tipologiaPosizioneEnum.enum.Transitorio,
}), }),
}; };
}), }),
@ -72,8 +72,8 @@ export const prezziarioRouter = createTRPCRouter({
updatePrezziario: adminProcedure updatePrezziario: adminProcedure
.input( .input(
z.object({ z.object({
data: z.custom<PrezziarioUpdate>(), data: PrezziarioUpdateSchema,
idprezziario: zPrezziarioId, idprezziario: prezziarioIdprezziario,
}), }),
) )
.mutation(async ({ input }) => { .mutation(async ({ input }) => {

View file

@ -1,14 +1,24 @@
import z from "zod"; import z from "zod";
import type { NewOrdini, OrdiniUpdate } from "~/schemas/public/Ordini"; import { annunciId } from "~/schemas/public/Annunci";
import type { import {
NewRinnovi, NewOrdiniSchema,
Rinnovi, OrdiniUpdateSchema,
RinnoviUpdate, ordiniOrdineId,
} from "~/schemas/public/Ordini";
import {
NewRinnoviSchema,
type Rinnovi,
RinnoviUpdateSchema,
rinnoviId,
} from "~/schemas/public/Rinnovi"; } from "~/schemas/public/Rinnovi";
import type { NewServizio, ServizioUpdate } from "~/schemas/public/Servizio"; import {
import type { ServizioAnnunciUpdate } from "~/schemas/public/ServizioAnnunci"; NewServizioSchema,
import type { Users } from "~/schemas/public/Users"; ServizioUpdateSchema,
import type { UsersAnagraficaUpdate } from "~/schemas/public/UsersAnagrafica"; servizioServizioId,
} from "~/schemas/public/Servizio";
import { ServizioAnnunciUpdateSchema } from "~/schemas/public/ServizioAnnunci";
import { type Users, usersId } from "~/schemas/public/Users";
import { UsersAnagraficaUpdateSchema } from "~/schemas/public/UsersAnagrafica";
import { import {
adminProcedure, adminProcedure,
createTRPCRouter, createTRPCRouter,
@ -54,21 +64,14 @@ import {
updateServizio, updateServizio,
updateServizioAnnuncio, updateServizioAnnuncio,
} from "~/server/services/servizio.service"; } from "~/server/services/servizio.service";
import {
zAnnuncioId,
zOrdineId,
zRinnovoId,
zServizioId,
zUserId,
} from "~/server/utils/zod_types";
export const servizioRouter = createTRPCRouter({ export const servizioRouter = createTRPCRouter({
AnnuncioServizioTipologiaMatch: protectedProcedure AnnuncioServizioTipologiaMatch: protectedProcedure
.input( .input(
z.object({ z.object({
annuncioId: zAnnuncioId, annuncioId: annunciId,
tipologia: z.string(), tipologia: z.string(),
userId: zUserId, userId: usersId,
}), }),
) )
.query(async ({ input }) => { .query(async ({ input }) => {
@ -81,7 +84,7 @@ export const servizioRouter = createTRPCRouter({
addServizio: adminProcedure addServizio: adminProcedure
.input( .input(
z.object({ z.object({
data: z.custom<NewServizio>(), data: NewServizioSchema,
}), }),
) )
.mutation(async ({ input }) => { .mutation(async ({ input }) => {
@ -90,8 +93,8 @@ export const servizioRouter = createTRPCRouter({
addServizioAnnunci: adminProcedure addServizioAnnunci: adminProcedure
.input( .input(
z.object({ z.object({
annunci: z.array(zAnnuncioId), annunci: annunciId.array(),
servizioId: zServizioId, servizioId: servizioServizioId,
}), }),
) )
.mutation(async ({ input }) => { .mutation(async ({ input }) => {
@ -103,7 +106,7 @@ export const servizioRouter = createTRPCRouter({
deleteServizio: adminProcedure deleteServizio: adminProcedure
.input( .input(
z.object({ z.object({
servizioId: zServizioId, servizioId: servizioServizioId,
}), }),
) )
.mutation(async ({ input }) => { .mutation(async ({ input }) => {
@ -113,7 +116,7 @@ export const servizioRouter = createTRPCRouter({
getAcquistoData: protectedProcedure getAcquistoData: protectedProcedure
.input( .input(
z.object({ z.object({
servizioId: zServizioId, servizioId: servizioServizioId,
}), }),
) )
.query(async ({ input }) => { .query(async ({ input }) => {
@ -125,7 +128,7 @@ export const servizioRouter = createTRPCRouter({
getServizioData: protectedProcedure getServizioData: protectedProcedure
.input( .input(
z.object({ z.object({
servizioId: zServizioId, servizioId: servizioServizioId,
}), }),
) )
.query(async ({ input }) => { .query(async ({ input }) => {
@ -134,7 +137,7 @@ export const servizioRouter = createTRPCRouter({
getAnnunciAvailableToAdd: adminProcedure getAnnunciAvailableToAdd: adminProcedure
.input( .input(
z.object({ z.object({
servizioId: zServizioId, servizioId: servizioServizioId,
}), }),
) )
.query(async ({ input }) => { .query(async ({ input }) => {
@ -144,7 +147,7 @@ export const servizioRouter = createTRPCRouter({
getCompatibileAnnunci: protectedProcedure getCompatibileAnnunci: protectedProcedure
.input( .input(
z.object({ z.object({
servizioId: zServizioId, servizioId: servizioServizioId,
adminOverride: z.boolean().optional(), adminOverride: z.boolean().optional(),
}), }),
) )
@ -154,7 +157,7 @@ export const servizioRouter = createTRPCRouter({
getOrdineById: protectedProcedure getOrdineById: protectedProcedure
.input( .input(
z.object({ z.object({
ordineId: zOrdineId, ordineId: ordiniOrdineId,
}), }),
) )
.query(async ({ input }) => { .query(async ({ input }) => {
@ -164,7 +167,7 @@ export const servizioRouter = createTRPCRouter({
getOrdini: protectedProcedure getOrdini: protectedProcedure
.input( .input(
z.object({ z.object({
userId: zUserId.optional(), userId: usersId.optional(),
}), }),
) )
.query(async ({ input }) => { .query(async ({ input }) => {
@ -174,14 +177,14 @@ export const servizioRouter = createTRPCRouter({
isOnboardAvailable: protectedProcedure isOnboardAvailable: protectedProcedure
.input( .input(
z.object({ z.object({
servizioId: zServizioId, servizioId: servizioServizioId,
}), }),
) )
.output( .output(
z.discriminatedUnion("available", [ z.discriminatedUnion("available", [
z.object({ z.object({
available: z.literal(true), available: z.literal(true),
userId: zUserId, userId: usersId,
}), }),
z.object({ z.object({
available: z.literal(false), available: z.literal(false),
@ -204,8 +207,8 @@ export const servizioRouter = createTRPCRouter({
getServizioContratto: protectedProcedure getServizioContratto: protectedProcedure
.input( .input(
z.object({ z.object({
annuncioId: zAnnuncioId, annuncioId: annunciId,
servizioId: zServizioId, servizioId: servizioServizioId,
}), }),
) )
.query(async ({ input }) => { .query(async ({ input }) => {
@ -219,8 +222,8 @@ export const servizioRouter = createTRPCRouter({
getServizioRegistrazione: protectedProcedure getServizioRegistrazione: protectedProcedure
.input( .input(
z.object({ z.object({
annuncioId: zAnnuncioId, annuncioId: annunciId,
servizioId: zServizioId, servizioId: servizioServizioId,
}), }),
) )
.query(async ({ input }) => { .query(async ({ input }) => {
@ -235,7 +238,7 @@ export const servizioRouter = createTRPCRouter({
interruzioneServizio: protectedProcedure interruzioneServizio: protectedProcedure
.input( .input(
z.object({ z.object({
servizioId: zServizioId, servizioId: servizioServizioId,
isAdmin: z.boolean(), isAdmin: z.boolean(),
}), }),
) )
@ -246,13 +249,13 @@ export const servizioRouter = createTRPCRouter({
processServizioOnboard: protectedProcedure processServizioOnboard: protectedProcedure
.input( .input(
z.object({ z.object({
anagrafica: z.custom<UsersAnagraficaUpdate>(), anagrafica: UsersAnagraficaUpdateSchema,
servizio: z.custom<ServizioUpdate>(), servizio: ServizioUpdateSchema,
servizioId: zServizioId, servizioId: servizioServizioId,
user: z.custom< user: z.custom<
Pick<Users, "nome" | "cognome" | "email" | "telefono" | "username"> Pick<Users, "nome" | "cognome" | "email" | "telefono" | "username">
>(), >(),
userId: zUserId, userId: usersId,
}), }),
) )
.mutation(async ({ input }) => { .mutation(async ({ input }) => {
@ -263,7 +266,7 @@ export const servizioRouter = createTRPCRouter({
attivazioneSenzaPagamento: protectedProcedure attivazioneSenzaPagamento: protectedProcedure
.input( .input(
z.object({ z.object({
ordineId: zOrdineId, ordineId: ordiniOrdineId,
}), }),
) )
.mutation(async ({ input }) => { .mutation(async ({ input }) => {
@ -272,7 +275,7 @@ export const servizioRouter = createTRPCRouter({
AdminAttivaServizio_Ufficio: protectedProcedure AdminAttivaServizio_Ufficio: protectedProcedure
.input( .input(
z.object({ z.object({
servizioId: zServizioId, servizioId: servizioServizioId,
}), }),
) )
.mutation(async ({ input }) => { .mutation(async ({ input }) => {
@ -282,8 +285,8 @@ export const servizioRouter = createTRPCRouter({
removeAnnuncioServizio: protectedProcedure removeAnnuncioServizio: protectedProcedure
.input( .input(
z.object({ z.object({
annuncioId: zAnnuncioId, annuncioId: annunciId,
servizioId: zServizioId, servizioId: servizioServizioId,
}), }),
) )
.mutation(async ({ input }) => { .mutation(async ({ input }) => {
@ -292,7 +295,7 @@ export const servizioRouter = createTRPCRouter({
removeOrder: adminProcedure removeOrder: adminProcedure
.input( .input(
z.object({ z.object({
ordineId: zOrdineId, ordineId: ordiniOrdineId,
}), }),
) )
.mutation(async ({ input }) => { .mutation(async ({ input }) => {
@ -302,7 +305,7 @@ export const servizioRouter = createTRPCRouter({
getPacksSolution: protectedProcedure getPacksSolution: protectedProcedure
.input( .input(
z.object({ z.object({
servizioId: zServizioId, servizioId: servizioServizioId,
}), }),
) )
.query(async ({ input }) => { .query(async ({ input }) => {
@ -311,8 +314,8 @@ export const servizioRouter = createTRPCRouter({
unlockServizioContatti: protectedProcedure unlockServizioContatti: protectedProcedure
.input( .input(
z.object({ z.object({
annuncioId: zAnnuncioId, annuncioId: annunciId,
servizioId: zServizioId, servizioId: servizioServizioId,
}), }),
) )
.mutation(async ({ input }) => { .mutation(async ({ input }) => {
@ -324,7 +327,7 @@ export const servizioRouter = createTRPCRouter({
createOrdine: adminProcedure createOrdine: adminProcedure
.input( .input(
z.object({ z.object({
data: z.custom<NewOrdini>(), data: NewOrdiniSchema,
}), }),
) )
.mutation(async ({ input }) => { .mutation(async ({ input }) => {
@ -333,8 +336,8 @@ export const servizioRouter = createTRPCRouter({
updateOrder: adminProcedure updateOrder: adminProcedure
.input( .input(
z.object({ z.object({
data: z.custom<OrdiniUpdate>(), data: OrdiniUpdateSchema,
ordineId: zOrdineId, ordineId: ordiniOrdineId,
}), }),
) )
.mutation(async ({ input }) => { .mutation(async ({ input }) => {
@ -347,8 +350,8 @@ export const servizioRouter = createTRPCRouter({
updateServizio: protectedProcedure updateServizio: protectedProcedure
.input( .input(
z.object({ z.object({
data: z.custom<ServizioUpdate>(), data: ServizioUpdateSchema,
servizioId: zServizioId, servizioId: servizioServizioId,
}), }),
) )
.mutation(async ({ input }) => { .mutation(async ({ input }) => {
@ -360,9 +363,9 @@ export const servizioRouter = createTRPCRouter({
updateServizioAnnunci: protectedProcedure updateServizioAnnunci: protectedProcedure
.input( .input(
z.object({ z.object({
annuncioId: zAnnuncioId, annuncioId: annunciId,
data: z.custom<ServizioAnnunciUpdate>(), data: ServizioAnnunciUpdateSchema,
servizioId: zServizioId, servizioId: servizioServizioId,
}), }),
) )
.mutation(async ({ input }) => { .mutation(async ({ input }) => {
@ -376,7 +379,7 @@ export const servizioRouter = createTRPCRouter({
getAllServiziData: protectedProcedure getAllServiziData: protectedProcedure
.input( .input(
z.object({ z.object({
userId: zUserId, userId: usersId,
}), }),
) )
.query(async ({ input }) => { .query(async ({ input }) => {
@ -407,7 +410,7 @@ export const servizioRouter = createTRPCRouter({
createRinnovo: adminProcedure createRinnovo: adminProcedure
.input( .input(
z.object({ z.object({
data: z.custom<NewRinnovi>(), data: NewRinnoviSchema,
}), }),
) )
.mutation(async ({ input }) => { .mutation(async ({ input }) => {
@ -416,8 +419,8 @@ export const servizioRouter = createTRPCRouter({
updateRinnovo: adminProcedure updateRinnovo: adminProcedure
.input( .input(
z.object({ z.object({
data: z.custom<RinnoviUpdate>(), data: RinnoviUpdateSchema,
rinnovoId: zRinnovoId, rinnovoId: rinnoviId,
}), }),
) )
.mutation(async ({ input }) => { .mutation(async ({ input }) => {
@ -429,7 +432,7 @@ export const servizioRouter = createTRPCRouter({
getRinnovo: protectedProcedure getRinnovo: protectedProcedure
.input( .input(
z.object({ z.object({
rinnovoId: zRinnovoId, rinnovoId: rinnoviId,
}), }),
) )
.query(async ({ input }) => { .query(async ({ input }) => {
@ -438,7 +441,7 @@ export const servizioRouter = createTRPCRouter({
removeRinnovo: adminProcedure removeRinnovo: adminProcedure
.input( .input(
z.object({ z.object({
rinnovoId: zRinnovoId, rinnovoId: rinnoviId,
}), }),
) )
.mutation(async ({ input }) => { .mutation(async ({ input }) => {

View file

@ -1,6 +1,7 @@
import { TRPCError } from "@trpc/server"; import { TRPCError } from "@trpc/server";
import z from "zod"; import z from "zod";
import type { NewUsersStorage } from "~/schemas/public/UsersStorage"; import { usersId } from "~/schemas/public/Users";
import { NewUsersStorageSchema } from "~/schemas/public/UsersStorage";
import { import {
adminProcedure, adminProcedure,
createTRPCRouter, createTRPCRouter,
@ -20,7 +21,6 @@ import {
editFile, editFile,
getFileInfo, getFileInfo,
} from "~/server/services/storage.service"; } from "~/server/services/storage.service";
import { zUserId } from "~/server/utils/zod_types";
export const storageRouter = createTRPCRouter({ export const storageRouter = createTRPCRouter({
getFileInfos: protectedProcedure getFileInfos: protectedProcedure
@ -43,7 +43,7 @@ export const storageRouter = createTRPCRouter({
}); });
}), }),
deleteUserStorageEntry: protectedProcedure deleteUserStorageEntry: protectedProcedure
.input(z.object({ storageId: z.string(), userId: zUserId })) .input(z.object({ storageId: z.string(), userId: usersId }))
.mutation(async ({ input }) => { .mutation(async ({ input }) => {
return await deleteUserStorageEntry(input); return await deleteUserStorageEntry(input);
}), }),
@ -56,7 +56,7 @@ export const storageRouter = createTRPCRouter({
return "ok"; return "ok";
}), }),
retrieveUserFileData: protectedProcedure retrieveUserFileData: protectedProcedure
.input(z.object({ userId: zUserId })) .input(z.object({ userId: usersId }))
.query(async ({ input }) => { .query(async ({ input }) => {
return await retrieveUserFiles(input); return await retrieveUserFiles(input);
}), }),
@ -69,7 +69,7 @@ export const storageRouter = createTRPCRouter({
}); });
}), }),
addUserStorageEntry: protectedProcedure addUserStorageEntry: protectedProcedure
.input(z.custom<NewUsersStorage>()) .input(NewUsersStorageSchema)
.mutation(async ({ input }) => { .mutation(async ({ input }) => {
return await addUserStorage(input); return await addUserStorage(input);
}), }),

View file

@ -1,4 +1,5 @@
import { z } from "zod/v4"; import { z } from "zod/v4";
import { testiEStringheStingaId } from "~/schemas/public/TestiEStringhe";
import { import {
adminProcedure, adminProcedure,
createTRPCRouter, createTRPCRouter,
@ -13,13 +14,12 @@ import {
newStringa, newStringa,
updateStringhe, updateStringhe,
} from "~/server/services/testi_stringhe.service"; } from "~/server/services/testi_stringhe.service";
import { zTestiEStringheStingaId } from "~/server/utils/zod_types";
export const stringsRouter = createTRPCRouter({ export const stringsRouter = createTRPCRouter({
getStringa: publicProcedure getStringa: publicProcedure
.input( .input(
z.object({ z.object({
stringaId: zTestiEStringheStingaId, stringaId: testiEStringheStingaId,
}), }),
) )
.query(async ({ input }) => { .query(async ({ input }) => {
@ -37,7 +37,7 @@ export const stringsRouter = createTRPCRouter({
deleteStringa: adminProcedure deleteStringa: adminProcedure
.input( .input(
z.object({ z.object({
stringaId: zTestiEStringheStingaId, stringaId: testiEStringheStingaId,
}), }),
) )
.mutation(async ({ input }) => { .mutation(async ({ input }) => {
@ -49,7 +49,7 @@ export const stringsRouter = createTRPCRouter({
newStringa: adminProcedure newStringa: adminProcedure
.input( .input(
z.object({ z.object({
stringaId: zTestiEStringheStingaId, stringaId: testiEStringheStingaId,
stringaValue: z.string().nullable(), stringaValue: z.string().nullable(),
}), }),
) )
@ -64,7 +64,7 @@ export const stringsRouter = createTRPCRouter({
updateStringa: adminProcedure updateStringa: adminProcedure
.input( .input(
z.object({ z.object({
stringaId: zTestiEStringheStingaId, stringaId: testiEStringheStingaId,
stringaValue: z.string().nullable(), stringaValue: z.string().nullable(),
}), }),
) )

View file

@ -1,4 +1,5 @@
import { z } from "zod/v4"; import { z } from "zod/v4";
import { ordiniOrdineId } from "~/schemas/public/Ordini";
import { import {
adminProcedure, adminProcedure,
createTRPCRouter, createTRPCRouter,
@ -10,7 +11,6 @@ import {
whIntentFailedHandler, whIntentFailedHandler,
whIntentSucceededHandler, whIntentSucceededHandler,
} from "~/server/controllers/stripe.controller"; } from "~/server/controllers/stripe.controller";
import { zOrdineId } from "~/server/utils/zod_types";
export const stripeRouter = createTRPCRouter({ export const stripeRouter = createTRPCRouter({
health: adminProcedure.query(async () => { health: adminProcedure.query(async () => {
@ -20,7 +20,7 @@ export const stripeRouter = createTRPCRouter({
whIntentCreated: protectedApiProcedure whIntentCreated: protectedApiProcedure
.input( .input(
z.object({ z.object({
ordineId: zOrdineId, ordineId: ordiniOrdineId,
pIntentId: z.string(), pIntentId: z.string(),
}), }),
) )
@ -41,7 +41,7 @@ export const stripeRouter = createTRPCRouter({
whIntentSucceeded: protectedApiProcedure whIntentSucceeded: protectedApiProcedure
.input( .input(
z.object({ z.object({
ordineId: zOrdineId, ordineId: ordiniOrdineId,
pIntentId: z.string(), pIntentId: z.string(),
pm_id: z.string(), pm_id: z.string(),
}), }),

View file

@ -1,6 +1,6 @@
import { z } from "zod/v4"; import { z } from "zod/v4";
import type { UsersUpdate } from "~/schemas/public/Users"; import { UsersUpdateSchema, usersId } from "~/schemas/public/Users";
import type { UsersAnagraficaUpdate } from "~/schemas/public/UsersAnagrafica"; import { UsersAnagraficaUpdateSchema } from "~/schemas/public/UsersAnagrafica";
import { import {
adminProcedure, adminProcedure,
createTRPCRouter, createTRPCRouter,
@ -18,13 +18,12 @@ import {
} from "~/server/controllers/user.controller"; } from "~/server/controllers/user.controller";
import { db } from "~/server/db"; import { db } from "~/server/db";
import { getClientProfilo } from "~/server/services/user.service"; import { getClientProfilo } from "~/server/services/user.service";
import { zUserId } from "~/server/utils/zod_types";
export const usersRouter = createTRPCRouter({ export const usersRouter = createTRPCRouter({
getUser: protectedProcedure getUser: protectedProcedure
.input( .input(
z.object({ z.object({
id: zUserId, id: usersId,
}), }),
) )
.query(async ({ input }) => { .query(async ({ input }) => {
@ -49,7 +48,7 @@ export const usersRouter = createTRPCRouter({
getClientProfilo: protectedProcedure getClientProfilo: protectedProcedure
.input( .input(
z.object({ z.object({
userId: zUserId, userId: usersId,
}), }),
) )
.query(async ({ input }) => { .query(async ({ input }) => {
@ -61,7 +60,7 @@ export const usersRouter = createTRPCRouter({
blockUser: adminProcedure blockUser: adminProcedure
.input( .input(
z.object({ z.object({
id: zUserId, id: usersId,
}), }),
) )
.mutation(async ({ input }) => { .mutation(async ({ input }) => {
@ -70,7 +69,7 @@ export const usersRouter = createTRPCRouter({
deleteUser: adminProcedure deleteUser: adminProcedure
.input( .input(
z.object({ z.object({
id: zUserId, id: usersId,
}), }),
) )
.mutation(async ({ input }) => { .mutation(async ({ input }) => {
@ -79,8 +78,8 @@ export const usersRouter = createTRPCRouter({
editUser: protectedProcedure editUser: protectedProcedure
.input( .input(
z.object({ z.object({
id: zUserId, id: usersId,
data: z.custom<UsersUpdate>(), data: UsersUpdateSchema,
}), }),
) )
.mutation(async ({ input }) => { .mutation(async ({ input }) => {
@ -89,8 +88,8 @@ export const usersRouter = createTRPCRouter({
editUserAnagrafica: protectedProcedure editUserAnagrafica: protectedProcedure
.input( .input(
z.object({ z.object({
userId: zUserId, userId: usersId,
data: z.custom<UsersAnagraficaUpdate>(), data: UsersAnagraficaUpdateSchema,
}), }),
) )
.mutation(async ({ input }) => { .mutation(async ({ input }) => {
@ -106,7 +105,7 @@ export const usersRouter = createTRPCRouter({
genIntestazione: adminProcedure genIntestazione: adminProcedure
.input( .input(
z.object({ z.object({
userId: zUserId, userId: usersId,
}), }),
) )
.mutation(async ({ input }) => { .mutation(async ({ input }) => {

View file

@ -12,8 +12,8 @@ import type { CreateNextContextOptions } from "@trpc/server/adapters/next";
import superjson from "superjson"; import superjson from "superjson";
import z, { ZodError } from "zod/v4"; import z, { ZodError } from "zod/v4";
import { env } from "~/env"; import { env } from "~/env";
import { usersId } from "~/schemas/public/Users";
import { verifyToken } from "~/server/auth/jwt"; import { verifyToken } from "~/server/auth/jwt";
import { zUserId } from "~/server/utils/zod_types";
import { TOKEN_CONFIG } from "../auth/configs"; import { TOKEN_CONFIG } from "../auth/configs";
/** /**
@ -25,7 +25,7 @@ import { TOKEN_CONFIG } from "../auth/configs";
*/ */
export const sessionSchema = z.object({ export const sessionSchema = z.object({
email: z.email(), email: z.email(),
id: zUserId, id: usersId,
isAdmin: z.boolean(), isAdmin: z.boolean(),
isBlocked: z.boolean(), isBlocked: z.boolean(),
nome: z.string(), nome: z.string(),

View file

@ -1,6 +1,7 @@
import { assert, describe, expect, it } from "vitest"; import { assert, describe, expect, it } from "vitest";
import type { PrezziarioIdprezziario } from "~/schemas/public/Prezziario"; import type { PrezziarioIdprezziario } from "~/schemas/public/Prezziario";
import TipologiaPosizioneEnum from "~/schemas/public/TipologiaPosizioneEnum"; import type TipologiaPosizioneEnum from "~/schemas/public/TipologiaPosizioneEnum";
import { tipologiaPosizioneEnum } from "~/schemas/public/TipologiaPosizioneEnum";
import { import {
AccontoSolver, AccontoSolver,
SaldoSolver, SaldoSolver,
@ -22,7 +23,7 @@ type TestCase = {
const testCases: TestCase[] = [ const testCases: TestCase[] = [
{ {
input: { input: {
tipologia: TipologiaPosizioneEnum.Transitorio, tipologia: tipologiaPosizioneEnum.enum.Transitorio,
permanenza: 0, permanenza: 0,
budget: 500, budget: 500,
}, },
@ -32,7 +33,7 @@ const testCases: TestCase[] = [
}, },
{ {
input: { input: {
tipologia: TipologiaPosizioneEnum.Transitorio, tipologia: tipologiaPosizioneEnum.enum.Transitorio,
permanenza: 1, permanenza: 1,
budget: 500, budget: 500,
}, },
@ -42,7 +43,7 @@ const testCases: TestCase[] = [
}, },
{ {
input: { input: {
tipologia: TipologiaPosizioneEnum.Transitorio, tipologia: tipologiaPosizioneEnum.enum.Transitorio,
permanenza: 2, permanenza: 2,
budget: 500, budget: 500,
}, },
@ -52,7 +53,7 @@ const testCases: TestCase[] = [
}, },
{ {
input: { input: {
tipologia: TipologiaPosizioneEnum.Transitorio, tipologia: tipologiaPosizioneEnum.enum.Transitorio,
permanenza: 3, permanenza: 3,
budget: 500, budget: 500,
}, },
@ -62,7 +63,7 @@ const testCases: TestCase[] = [
}, },
{ {
input: { input: {
tipologia: TipologiaPosizioneEnum.Transitorio, tipologia: tipologiaPosizioneEnum.enum.Transitorio,
permanenza: 4, permanenza: 4,
budget: 500, budget: 500,
}, },
@ -73,7 +74,7 @@ const testCases: TestCase[] = [
{ {
input: { input: {
tipologia: TipologiaPosizioneEnum.Stabile, tipologia: tipologiaPosizioneEnum.enum.Stabile,
permanenza: null, permanenza: null,
budget: 500, budget: 500,
}, },
@ -83,7 +84,7 @@ const testCases: TestCase[] = [
}, },
{ {
input: { input: {
tipologia: TipologiaPosizioneEnum.Stabile, tipologia: tipologiaPosizioneEnum.enum.Stabile,
permanenza: null, permanenza: null,
budget: 600, budget: 600,
}, },
@ -93,7 +94,7 @@ const testCases: TestCase[] = [
}, },
{ {
input: { input: {
tipologia: TipologiaPosizioneEnum.Stabile, tipologia: tipologiaPosizioneEnum.enum.Stabile,
permanenza: null, permanenza: null,
budget: 800, budget: 800,
}, },

View file

@ -2,7 +2,8 @@ import { TRPCError } from "@trpc/server";
import { add, format, intervalToDuration } from "date-fns"; import { add, format, intervalToDuration } from "date-fns";
import { PaymentMethodToString, type PaymentType } from "~/i18n/stripe"; import { PaymentMethodToString, type PaymentType } from "~/i18n/stripe";
import { parseDBComune, parseDBNazione } from "~/lib/catasto"; import { parseDBComune, parseDBNazione } from "~/lib/catasto";
import OrderTypeEnum from "~/schemas/public/OrderTypeEnum"; import type OrderTypeEnum from "~/schemas/public/OrderTypeEnum";
import { orderTypeEnum } from "~/schemas/public/OrderTypeEnum";
import type { OrdiniOrdineId } from "~/schemas/public/Ordini"; import type { OrdiniOrdineId } from "~/schemas/public/Ordini";
import type { import type {
Prezziario, Prezziario,
@ -10,7 +11,8 @@ import type {
} from "~/schemas/public/Prezziario"; } from "~/schemas/public/Prezziario";
import type { RinnoviId } from "~/schemas/public/Rinnovi"; import type { RinnoviId } from "~/schemas/public/Rinnovi";
import type { ServizioServizioId } from "~/schemas/public/Servizio"; import type { ServizioServizioId } from "~/schemas/public/Servizio";
import TipologiaPosizioneEnum from "~/schemas/public/TipologiaPosizioneEnum"; import type TipologiaPosizioneEnum from "~/schemas/public/TipologiaPosizioneEnum";
import { tipologiaPosizioneEnum } from "~/schemas/public/TipologiaPosizioneEnum";
import { getComuni, getNazioni } from "~/server/controllers/catasto.controller"; import { getComuni, getNazioni } from "~/server/controllers/catasto.controller";
import type { RicevutaProps } from "~/server/services/typst.service"; import type { RicevutaProps } from "~/server/services/typst.service";
import type { Result } from "~/utils/result"; import type { Result } from "~/utils/result";
@ -31,14 +33,15 @@ export type PreparedPaymentData = {
packDesc: string; packDesc: string;
condizioni: string; condizioni: string;
}; };
type preparePaymentInput = type preparePaymentInput =
| { | {
servizioId: ServizioServizioId; servizioId: ServizioServizioId;
type: Exclude<OrderTypeEnum, OrderTypeEnum.Rinnovo>; type: Exclude<OrderTypeEnum, "Rinnovo">;
} }
| { | {
rinnovoId: RinnoviId; rinnovoId: RinnoviId;
type: OrderTypeEnum.Rinnovo; type: "Rinnovo";
}; };
export type PreparePaymentError = export type PreparePaymentError =
@ -51,10 +54,10 @@ export const preparePayment = async (
): Promise<Result<PreparedPaymentData, PreparePaymentError>> => { ): Promise<Result<PreparedPaymentData, PreparePaymentError>> => {
try { try {
switch (props.type) { switch (props.type) {
case OrderTypeEnum.Acconto: case "Acconto":
case OrderTypeEnum.Saldo: case "Saldo":
case OrderTypeEnum.Consulenza: case "Consulenza":
case OrderTypeEnum.Altro: { case "Altro": {
const { servizioId, type } = props; const { servizioId, type } = props;
const servizio = await getServizioById(servizioId); const servizio = await getServizioById(servizioId);
const inactiveOrders = await db const inactiveOrders = await db
@ -66,7 +69,7 @@ export const preparePayment = async (
.execute(); .execute();
switch (type) { switch (type) {
case OrderTypeEnum.Acconto: { case orderTypeEnum.enum.Acconto: {
if (!servizio.isOkAcconto) { if (!servizio.isOkAcconto) {
const acconto = await AccontoSolver(servizio.tipologia); const acconto = await AccontoSolver(servizio.tipologia);
if (!acconto.success) { if (!acconto.success) {
@ -82,7 +85,7 @@ export const preparePayment = async (
// servizio sta aspettando attivazione acconto // servizio sta aspettando attivazione acconto
const preExistingAcconto = inactiveOrders.find( const preExistingAcconto = inactiveOrders.find(
(ordine) => ordine.type === OrderTypeEnum.Acconto, (ordine) => ordine.type === orderTypeEnum.enum.Acconto,
); );
if (preExistingAcconto) { if (preExistingAcconto) {
@ -107,7 +110,7 @@ export const preparePayment = async (
servizio_id: servizioId, servizio_id: servizioId,
amount_cent: acconto.pack.prezzo_cent, amount_cent: acconto.pack.prezzo_cent,
packid: acconto.pack.idprezziario, packid: acconto.pack.idprezziario,
type: OrderTypeEnum.Acconto, type: orderTypeEnum.enum.Acconto,
userid: servizio.user_id, userid: servizio.user_id,
}); });
return { return {
@ -133,7 +136,7 @@ export const preparePayment = async (
}, },
}; };
} }
case OrderTypeEnum.Saldo: { case orderTypeEnum.enum.Saldo: {
if (!servizio.isOkAcconto) { if (!servizio.isOkAcconto) {
return { return {
ok: false, ok: false,
@ -162,7 +165,7 @@ export const preparePayment = async (
} }
const preExistingSaldo = inactiveOrders.find( const preExistingSaldo = inactiveOrders.find(
(ordine) => ordine.type === OrderTypeEnum.Saldo, (ordine) => ordine.type === orderTypeEnum.enum.Saldo,
); );
if (preExistingSaldo) { if (preExistingSaldo) {
// saldo già creato, procedere con questo // saldo già creato, procedere con questo
@ -185,7 +188,7 @@ export const preparePayment = async (
servizio_id: servizioId, servizio_id: servizioId,
amount_cent: saldo.pack.prezzo_cent, amount_cent: saldo.pack.prezzo_cent,
packid: saldo.pack.idprezziario, packid: saldo.pack.idprezziario,
type: OrderTypeEnum.Saldo, type: orderTypeEnum.enum.Saldo,
userid: servizio.user_id, userid: servizio.user_id,
}); });
return { return {
@ -211,7 +214,7 @@ export const preparePayment = async (
}; };
} }
case OrderTypeEnum.Consulenza: { case orderTypeEnum.enum.Consulenza: {
if (!servizio.isOkAcconto || !servizio.isOkSaldo) { if (!servizio.isOkAcconto || !servizio.isOkSaldo) {
return { return {
ok: false, ok: false,
@ -224,7 +227,7 @@ export const preparePayment = async (
} }
if (!servizio.isOkConsulenza) { if (!servizio.isOkConsulenza) {
const existingConsulenza = inactiveOrders.find( const existingConsulenza = inactiveOrders.find(
(ordine) => ordine.type === OrderTypeEnum.Consulenza, (ordine) => ordine.type === orderTypeEnum.enum.Consulenza,
); );
if (existingConsulenza) { if (existingConsulenza) {
// consulenza già creato, procedere con questo // consulenza già creato, procedere con questo
@ -275,9 +278,9 @@ export const preparePayment = async (
}, },
}; };
} }
case OrderTypeEnum.Altro: { case orderTypeEnum.enum.Altro: {
const existingAltro = inactiveOrders.find( const existingAltro = inactiveOrders.find(
(ordine) => ordine.type === OrderTypeEnum.Altro, (ordine) => ordine.type === orderTypeEnum.enum.Altro,
); );
if (existingAltro) { if (existingAltro) {
// altro già creato, procedere con questo // altro già creato, procedere con questo
@ -323,14 +326,15 @@ export const preparePayment = async (
); );
} }
} }
case OrderTypeEnum.Rinnovo: {
case "Rinnovo": {
const { rinnovoId } = props; const { rinnovoId } = props;
const ordiniRinnovo = await db const ordiniRinnovo = await db
.selectFrom("ordini") .selectFrom("ordini")
.selectAll() .selectAll()
.where("rinnovo_id", "=", rinnovoId) .where("rinnovo_id", "=", rinnovoId)
.where("type", "=", OrderTypeEnum.Rinnovo) .where("type", "=", orderTypeEnum.enum.Rinnovo)
.execute(); .execute();
const alreadyPaid = ordiniRinnovo.some((ordine) => ordine.isActive); const alreadyPaid = ordiniRinnovo.some((ordine) => ordine.isActive);
@ -397,7 +401,7 @@ export const preparePayment = async (
rinnovo_id: rinnovoId, rinnovo_id: rinnovoId,
amount_cent: pack.pack.prezzo_cent, amount_cent: pack.pack.prezzo_cent,
packid: pack.pack.idprezziario, packid: pack.pack.idprezziario,
type: OrderTypeEnum.Rinnovo, type: orderTypeEnum.enum.Rinnovo,
userid: rinnovo.userId, userid: rinnovo.userId,
}); });
return { return {
@ -480,13 +484,13 @@ export const AccontoSolver = async (
tipologia: TipologiaPosizioneEnum, tipologia: TipologiaPosizioneEnum,
): Promise<GetPackResult | GetPackError> => { ): Promise<GetPackResult | GetPackError> => {
switch (tipologia) { switch (tipologia) {
case TipologiaPosizioneEnum.Transitorio: { case tipologiaPosizioneEnum.enum.Transitorio: {
const pack = await db const pack = await db
.selectFrom("prezziario") .selectFrom("prezziario")
.selectAll() .selectAll()
.where("isActive", "=", true) .where("isActive", "=", true)
.where("order_type", "=", OrderTypeEnum.Acconto) .where("order_type", "=", orderTypeEnum.enum.Acconto)
.where("service_type", "=", TipologiaPosizioneEnum.Transitorio) .where("service_type", "=", tipologiaPosizioneEnum.enum.Transitorio)
.limit(1) .limit(1)
.executeTakeFirst(); .executeTakeFirst();
@ -499,13 +503,13 @@ export const AccontoSolver = async (
}; };
} }
case TipologiaPosizioneEnum.Stabile: { case tipologiaPosizioneEnum.enum.Stabile: {
const pack = await db const pack = await db
.selectFrom("prezziario") .selectFrom("prezziario")
.selectAll() .selectAll()
.where("isActive", "=", true) .where("isActive", "=", true)
.where("order_type", "=", OrderTypeEnum.Acconto) .where("order_type", "=", orderTypeEnum.enum.Acconto)
.where("service_type", "=", TipologiaPosizioneEnum.Stabile) .where("service_type", "=", tipologiaPosizioneEnum.enum.Stabile)
.limit(1) .limit(1)
.executeTakeFirst(); .executeTakeFirst();
@ -532,7 +536,7 @@ export const SaldoSolver = async ({
budget: number; budget: number;
}): Promise<GetPackResult | GetPackError> => { }): Promise<GetPackResult | GetPackError> => {
switch (tipologia) { switch (tipologia) {
case TipologiaPosizioneEnum.Transitorio: { case tipologiaPosizioneEnum.enum.Transitorio: {
if (permanenza === null) { if (permanenza === null) {
return { return {
success: false, success: false,
@ -544,8 +548,8 @@ export const SaldoSolver = async ({
.selectFrom("prezziario") .selectFrom("prezziario")
.selectAll() .selectAll()
.where("isActive", "=", true) .where("isActive", "=", true)
.where("order_type", "=", OrderTypeEnum.Saldo) .where("order_type", "=", orderTypeEnum.enum.Saldo)
.where("service_type", "=", TipologiaPosizioneEnum.Transitorio) .where("service_type", "=", tipologiaPosizioneEnum.enum.Transitorio)
.where("service_variant", "=", permanenza) .where("service_variant", "=", permanenza)
.limit(1) .limit(1)
.executeTakeFirst(); .executeTakeFirst();
@ -556,14 +560,14 @@ export const SaldoSolver = async ({
return { success: true, pack }; return { success: true, pack };
} }
case TipologiaPosizioneEnum.Stabile: { case tipologiaPosizioneEnum.enum.Stabile: {
const budget_step = budget > 700 ? 2 : budget > 500 ? 1 : 0; const budget_step = budget > 700 ? 2 : budget > 500 ? 1 : 0;
const pack = await db const pack = await db
.selectFrom("prezziario") .selectFrom("prezziario")
.selectAll() .selectAll()
.where("isActive", "=", true) .where("isActive", "=", true)
.where("order_type", "=", OrderTypeEnum.Saldo) .where("order_type", "=", orderTypeEnum.enum.Saldo)
.where("service_type", "=", TipologiaPosizioneEnum.Stabile) .where("service_type", "=", tipologiaPosizioneEnum.enum.Stabile)
.where("service_variant", "=", budget_step) .where("service_variant", "=", budget_step)
.limit(1) .limit(1)
.executeTakeFirst(); .executeTakeFirst();
@ -607,8 +611,8 @@ export const RinnovoSolver = async (
.selectFrom("prezziario") .selectFrom("prezziario")
.selectAll() .selectAll()
.where("isActive", "=", true) .where("isActive", "=", true)
.where("order_type", "=", OrderTypeEnum.Rinnovo) .where("order_type", "=", orderTypeEnum.enum.Rinnovo)
.where("service_type", "=", TipologiaPosizioneEnum.Transitorio) .where("service_type", "=", tipologiaPosizioneEnum.enum.Transitorio)
.where("service_variant", "=", rinnovoPermanenzaVariant(permanenza)) .where("service_variant", "=", rinnovoPermanenzaVariant(permanenza))
.limit(1) .limit(1)
.executeTakeFirst(); .executeTakeFirst();
@ -713,7 +717,7 @@ export const getRicevutaData = async (
let previewSaldo: Prezziario | null = null; let previewSaldo: Prezziario | null = null;
if (ordine.type === OrderTypeEnum.Acconto && ordine.servizio_id) { if (ordine.type === orderTypeEnum.enum.Acconto && ordine.servizio_id) {
const servizio = await getServizioById(ordine.servizio_id); const servizio = await getServizioById(ordine.servizio_id);
if (servizio) { if (servizio) {
const saldo = await SaldoSolver({ const saldo = await SaldoSolver({

View file

@ -2,11 +2,11 @@ import { TRPCError } from "@trpc/server";
import { add, format } from "date-fns"; import { add, format } from "date-fns";
import { env } from "~/env"; import { env } from "~/env";
import stripe from "~/lib/stripe"; import stripe from "~/lib/stripe";
import OrderTypeEnum from "~/schemas/public/OrderTypeEnum"; import { orderTypeEnum } from "~/schemas/public/OrderTypeEnum";
import type { Ordini, OrdiniOrdineId } from "~/schemas/public/Ordini"; import type { Ordini, OrdiniOrdineId } from "~/schemas/public/Ordini";
import PaymentStatusEnum from "~/schemas/public/PaymentStatusEnum"; import { paymentStatusEnum } from "~/schemas/public/PaymentStatusEnum";
import type { TestiEStringheStingaId } from "~/schemas/public/TestiEStringhe"; import type { TestiEStringheStingaId } from "~/schemas/public/TestiEStringhe";
import TipologiaPosizioneEnum from "~/schemas/public/TipologiaPosizioneEnum"; import { tipologiaPosizioneEnum } from "~/schemas/public/TipologiaPosizioneEnum";
import { db } from "~/server/db"; import { db } from "~/server/db";
import { NewMail } from "~/server/services/mailer"; import { NewMail } from "~/server/services/mailer";
import { CONDIZIONI_DEFAULT } from "~/server/services/prezziario.service"; import { CONDIZIONI_DEFAULT } from "~/server/services/prezziario.service";
@ -45,7 +45,7 @@ export const whIntentCreatedHandler = async ({
.updateTable("ordini") .updateTable("ordini")
.set({ .set({
intent_id: pIntentId, intent_id: pIntentId,
paymentstatus: PaymentStatusEnum.processing, paymentstatus: paymentStatusEnum.enum.processing,
}) })
.where("ordine_id", "=", ordineId) .where("ordine_id", "=", ordineId)
.returning("ordine_id") .returning("ordine_id")
@ -76,7 +76,7 @@ export const whIntentSucceededHandler = async ({
.set({ .set({
paid_at: new Date(), paid_at: new Date(),
paymentmethod: paymentMethod.type, paymentmethod: paymentMethod.type,
paymentstatus: PaymentStatusEnum.success, paymentstatus: paymentStatusEnum.enum.success,
isActive: true, isActive: true,
}) })
.where("intent_id", "=", pIntentId) .where("intent_id", "=", pIntentId)
@ -103,7 +103,7 @@ export const whIntentSucceededHandler = async ({
const lock_expires = add(new Date(), { seconds: 30 }); // Lock for 30 sec const lock_expires = add(new Date(), { seconds: 30 }); // Lock for 30 sec
switch (ordine.type) { switch (ordine.type) {
case OrderTypeEnum.Acconto: { case orderTypeEnum.enum.Acconto: {
if (!ordine.servizio_id) { if (!ordine.servizio_id) {
throw new Error( throw new Error(
`No servizio_id for ordine_id: ${ordine.ordine_id}`, `No servizio_id for ordine_id: ${ordine.ordine_id}`,
@ -187,7 +187,7 @@ export const whIntentSucceededHandler = async ({
break; break;
} }
case OrderTypeEnum.Saldo: { case orderTypeEnum.enum.Saldo: {
if (!ordine.servizio_id) { if (!ordine.servizio_id) {
throw new Error( throw new Error(
`No servizio_id for ordine_id: ${ordine.ordine_id}`, `No servizio_id for ordine_id: ${ordine.ordine_id}`,
@ -208,7 +208,7 @@ export const whIntentSucceededHandler = async ({
.where("servizio_id", "=", ordine.servizio_id) .where("servizio_id", "=", ordine.servizio_id)
.set({ .set({
isOkConsulenza: isOkConsulenza:
servizio.tipologia === TipologiaPosizioneEnum.Transitorio, servizio.tipologia === tipologiaPosizioneEnum.enum.Transitorio,
isOkSaldo: true, isOkSaldo: true,
}) })
.execute(); .execute();
@ -243,7 +243,7 @@ export const whIntentSucceededHandler = async ({
} }
break; break;
} }
case OrderTypeEnum.Rinnovo: { case orderTypeEnum.enum.Rinnovo: {
// nessuna azione aggiuntiva richiesta // nessuna azione aggiuntiva richiesta
if (utente.comms_enabled) { if (utente.comms_enabled) {
await addEventToQueue({ await addEventToQueue({
@ -276,7 +276,7 @@ export const whIntentSucceededHandler = async ({
} }
break; break;
} }
case OrderTypeEnum.Consulenza: { case orderTypeEnum.enum.Consulenza: {
if (!ordine.servizio_id) { if (!ordine.servizio_id) {
throw new Error( throw new Error(
`No servizio_id for ordine_id: ${ordine.ordine_id}`, `No servizio_id for ordine_id: ${ordine.ordine_id}`,
@ -321,7 +321,7 @@ export const whIntentSucceededHandler = async ({
} }
break; break;
} }
case OrderTypeEnum.Altro: case orderTypeEnum.enum.Altro:
break; break;
} }
await addEventToQueue({ await addEventToQueue({
@ -391,10 +391,10 @@ export const whIntentFailedHandler = async ({
const userId = await db const userId = await db
.updateTable("ordini") .updateTable("ordini")
.set({ .set({
paymentstatus: PaymentStatusEnum.failed, paymentstatus: paymentStatusEnum.enum.failed,
}) })
.returning("userid") .returning("userid")
.where("paymentstatus", "=", PaymentStatusEnum.processing) .where("paymentstatus", "=", paymentStatusEnum.enum.processing)
.where("intent_id", "=", pIntentId) .where("intent_id", "=", pIntentId)
.execute(); .execute();

View file

@ -1,5 +1,5 @@
import { TRPCError } from "@trpc/server"; import { TRPCError } from "@trpc/server";
import OrderTypeEnum from "~/schemas/public/OrderTypeEnum"; import { orderTypeEnum } from "~/schemas/public/OrderTypeEnum";
import type { import type {
NewPrezziario, NewPrezziario,
Prezziario, Prezziario,
@ -7,7 +7,8 @@ import type {
PrezziarioUpdate, PrezziarioUpdate,
} from "~/schemas/public/Prezziario"; } from "~/schemas/public/Prezziario";
import type { TestiEStringheStingaId } from "~/schemas/public/TestiEStringhe"; import type { TestiEStringheStingaId } from "~/schemas/public/TestiEStringhe";
import TipologiaPosizioneEnum from "~/schemas/public/TipologiaPosizioneEnum"; import type TipologiaPosizioneEnum from "~/schemas/public/TipologiaPosizioneEnum";
import { tipologiaPosizioneEnum } from "~/schemas/public/TipologiaPosizioneEnum";
import { db, type Querier } from "~/server/db"; import { db, type Querier } from "~/server/db";
export const CONDIZIONI_DEFAULT = "CONDIZIONI_CERCHI" as TestiEStringheStingaId; export const CONDIZIONI_DEFAULT = "CONDIZIONI_CERCHI" as TestiEStringheStingaId;
@ -132,7 +133,7 @@ export const getPrezziarioByTipologia = async ({
const acconto = await trx const acconto = await trx
.selectFrom("prezziario") .selectFrom("prezziario")
.select(["idprezziario", "prezzo_cent", "nome_it", "nome_en", "sconto"]) .select(["idprezziario", "prezzo_cent", "nome_it", "nome_en", "sconto"])
.where("order_type", "=", OrderTypeEnum.Acconto) .where("order_type", "=", orderTypeEnum.enum.Acconto)
.where("service_type", "=", tipologia) .where("service_type", "=", tipologia)
.where("isActive", "=", true) .where("isActive", "=", true)
.executeTakeFirst(); .executeTakeFirst();
@ -146,7 +147,7 @@ export const getPrezziarioByTipologia = async ({
const saldi = await trx const saldi = await trx
.selectFrom("prezziario") .selectFrom("prezziario")
.select(["idprezziario", "prezzo_cent", "nome_it", "nome_en", "sconto"]) .select(["idprezziario", "prezzo_cent", "nome_it", "nome_en", "sconto"])
.where("order_type", "=", OrderTypeEnum.Saldo) .where("order_type", "=", orderTypeEnum.enum.Saldo)
.where("service_type", "=", tipologia) .where("service_type", "=", tipologia)
.where("isActive", "=", true) .where("isActive", "=", true)
.orderBy("service_variant", "asc") .orderBy("service_variant", "asc")
@ -178,9 +179,9 @@ export const getPrezziarioConsulenza = async ({ db }: { db: Querier }) => {
const prezzi = await trx const prezzi = await trx
.selectFrom("prezziario") .selectFrom("prezziario")
.select(["idprezziario", "prezzo_cent", "nome_it", "nome_en", "sconto"]) .select(["idprezziario", "prezzo_cent", "nome_it", "nome_en", "sconto"])
.where("order_type", "=", OrderTypeEnum.Consulenza) .where("order_type", "=", orderTypeEnum.enum.Consulenza)
.where("isActive", "=", true) .where("isActive", "=", true)
.where("service_type", "=", TipologiaPosizioneEnum.Stabile) .where("service_type", "=", tipologiaPosizioneEnum.enum.Stabile)
.orderBy("prezzo_cent", "asc") .orderBy("prezzo_cent", "asc")
.execute(); .execute();

View file

@ -1,6 +1,6 @@
import { TRPCError } from "@trpc/server"; import { TRPCError } from "@trpc/server";
import { jsonArrayFrom } from "kysely/helpers/postgres"; import { jsonArrayFrom } from "kysely/helpers/postgres";
import OrderTypeEnum from "~/schemas/public/OrderTypeEnum"; import { orderTypeEnum } from "~/schemas/public/OrderTypeEnum";
import type { import type {
NewRinnovi, NewRinnovi,
RinnoviId, RinnoviId,
@ -72,7 +72,7 @@ export const createRinnovo = async (data: NewRinnovi) => {
const ordineData: NewRinnovoOrdini = { const ordineData: NewRinnovoOrdini = {
rinnovo_id: rinnovo.id, rinnovo_id: rinnovo.id,
userid: rinnovo.userId, userid: rinnovo.userId,
type: OrderTypeEnum.Rinnovo, type: orderTypeEnum.enum.Rinnovo,
amount_cent: pack.pack.prezzo_cent, amount_cent: pack.pack.prezzo_cent,
packid: pack.pack.idprezziario, packid: pack.pack.idprezziario,
isActive: false, isActive: false,

View file

@ -1,6 +1,6 @@
import { TRPCError } from "@trpc/server"; import { TRPCError } from "@trpc/server";
import type { AnnunciId } from "~/schemas/public/Annunci"; import type { AnnunciId } from "~/schemas/public/Annunci";
import OrderTypeEnum from "~/schemas/public/OrderTypeEnum"; import { orderTypeEnum } from "~/schemas/public/OrderTypeEnum";
import type { import type {
NewServizio, NewServizio,
ServizioServizioId, ServizioServizioId,
@ -24,7 +24,7 @@ export const addServizio = async (data: NewServizio) => {
.selectFrom("prezziario") .selectFrom("prezziario")
.selectAll() .selectAll()
.where("isActive", "=", true) .where("isActive", "=", true)
.where("order_type", "=", OrderTypeEnum.Acconto) .where("order_type", "=", orderTypeEnum.enum.Acconto)
.where("service_type", "=", data.tipologia) .where("service_type", "=", data.tipologia)
.limit(1) .limit(1)
.executeTakeFirst(); .executeTakeFirst();
@ -37,7 +37,7 @@ export const addServizio = async (data: NewServizio) => {
.values({ .values({
servizio_id: servizio.servizio_id, servizio_id: servizio.servizio_id,
userid: servizio.user_id, userid: servizio.user_id,
type: OrderTypeEnum.Acconto, type: orderTypeEnum.enum.Acconto,
amount_cent: acconto.prezzo_cent, amount_cent: acconto.prezzo_cent,
packid: acconto.idprezziario, packid: acconto.idprezziario,
isActive: false, isActive: false,

View file

@ -0,0 +1,49 @@
import { z } from "zod/v4";
import { chatsChatid } from "~/schemas/public/Chats";
import { MessagesSchema, messagesMessageid } from "~/schemas/public/Messages";
import { usersId } from "~/schemas/public/Users";
export const MessageDataSchema = MessagesSchema.omit({
time: true,
}).extend({
time: z.string(),
sender_nome: z.string(),
sender_isAdmin: z.boolean(),
color_str: z.string(),
has_attachments: z.boolean(),
reply_source: MessagesSchema.pick({
messageid: true,
message: true,
sender: true,
})
.extend({
nome: z.string(),
color_str: z.string(),
})
.nullable(),
});
export const TypingDataSchema = z.array(
z.object({
userId: usersId,
username: z.string(),
}),
);
export const SidebarUpdateSchema = z.object({
chatId: chatsChatid,
lastMessage: z.string(),
senderName: z.string(),
});
export const MessageUpdateEventSchema = z.discriminatedUnion("eventType", [
z.object({
eventType: z.literal("edit"),
data: z.object({ messageId: messagesMessageid, message: z.string() }),
}),
z.object({
eventType: z.literal("delete"),
data: messagesMessageid,
}),
z.object({ eventType: z.literal("read_receipt"), data: z.null() }), // all unread messages in this chat are now read
]);

View file

@ -1,162 +0,0 @@
import { z } from "zod/v4";
import type { AnnunciId } from "~/schemas/public/Annunci";
import type { BanlistId } from "~/schemas/public/Banlist";
import BanType from "~/schemas/public/BanType";
import type { ChatsChatid } from "~/schemas/public/Chats";
import type { ComuniId } from "~/schemas/public/Comuni";
import type { EtichetteIdEtichetta } from "~/schemas/public/Etichette";
import type { EventQueueEventId } from "~/schemas/public/EventQueue";
import type { FlagsId } from "~/schemas/public/Flags";
import type { MessagesMessageid } from "~/schemas/public/Messages";
import type { NazioniId } from "~/schemas/public/Nazioni";
import type { OrdiniOrdineId } from "~/schemas/public/Ordini";
import type { PrezziarioIdprezziario } from "~/schemas/public/Prezziario";
import type { ProvincieId } from "~/schemas/public/Provincie";
import type { RinnoviId } from "~/schemas/public/Rinnovi";
import type { ServizioServizioId } from "~/schemas/public/Servizio";
import type { TestiEStringheStingaId } from "~/schemas/public/TestiEStringhe";
import type { UsersId } from "~/schemas/public/Users";
import type { UsersStorageUserStorageId } from "~/schemas/public/UsersStorage";
export const zUserId = z.custom<UsersId>(
(val) => typeof val === "string",
"falied to validate UserId",
);
export const zAnnuncioId = z.custom<AnnunciId>(
(val) => typeof val === "number",
"falied to validate AnnuncioId",
);
export const zChatId = z.custom<ChatsChatid>(
(val) => typeof val === "string",
"falied to validate ChatId",
);
export const zMessageId = z.custom<MessagesMessageid>(
(val) => typeof val === "string",
"falied to validate MessageId",
);
export const zPrezziarioId = z.custom<PrezziarioIdprezziario>(
(val) => typeof val === "string",
"falied to validate PrezziarioId",
);
export const zFlagsId = z.custom<FlagsId>(
(val) => typeof val === "string",
"falied to validate FlagsId",
);
export const zEtichettaId = z.custom<EtichetteIdEtichetta>(
(val) => typeof val === "number",
"falied to validate EtichettaId",
);
export const zOrdineId = z.custom<OrdiniOrdineId>(
(val) => typeof val === "string",
"falied to validate OrdineId",
);
export const zTestiEStringheStingaId = z.custom<TestiEStringheStingaId>(
(val) => typeof val === "string",
"falied to validate TestiEStringheStingaId",
);
// export const zEventDataTypes = z.custom<EventDataTypes>(
// (val) => typeof val === "object",
// "falied to validate EventDataTypes",
// );
export const zUserStorageId = z.custom<UsersStorageUserStorageId>(
(val) => typeof val === "string",
"falied to validate UserStorageId",
);
export const zBanlistId = z.custom<BanlistId>(
(val) => typeof val === "number",
"falied to validate BanlistId",
);
export const zBanType = z.enum(BanType, {
error: "failed to validate BanType",
});
export const zServizioId = z.custom<ServizioServizioId>(
(val) => typeof val === "string",
"falied to validate ServizioId",
);
export const zComuneId = z.custom<ComuniId>(
(val) => typeof val === "number",
"falied to validate ComuneId",
);
export const zProvincieId = z.custom<ProvincieId>(
(val) => typeof val === "number",
"falied to validate ProvinciaId",
);
export const zNazioneId = z.custom<NazioniId>(
(val) => typeof val === "number",
"falied to validate NazioneId",
);
export const zRinnovoId = z.custom<RinnoviId>(
(val) => typeof val === "string",
"falied to validate RinnovoId",
);
export const zEventId = z.custom<EventQueueEventId>(
(val) => typeof val === "number",
"falied to validate EventId",
);
export const MessageDataSchema = z.object({
messageid: zMessageId,
message: z.string(),
chatid: zChatId,
time: z.string(),
sender_nome: z.string(),
sender_isAdmin: z.boolean(),
sender: zUserId,
isread: z.boolean(),
color_str: z.string(),
is_forwarded: z.boolean(),
reply_to_id: zMessageId.nullable(),
has_attachments: z.boolean(),
reply_source: z
.object({
messageid: zMessageId,
message: z.string(),
nome: z.string(),
sender: zUserId,
color_str: z.string(),
})
.nullable(),
});
export const TypingDataSchema = z.array(
z.object({
userId: zUserId,
username: z.string(),
}),
);
export const SidebarUpdateSchema = z.object({
chatId: zChatId,
lastMessage: z.string(),
senderName: z.string(),
});
export const MessageUpdateEventSchema = z.discriminatedUnion("eventType", [
z.object({
eventType: z.literal("edit"),
data: z.object({ messageId: zMessageId, message: z.string() }),
}),
z.object({
eventType: z.literal("delete"),
data: zMessageId,
}),
z.object({ eventType: z.literal("read_receipt"), data: z.null() }), // all unread messages in this chat are now read
]);

View file

@ -1,62 +1,65 @@
export type Caratteristiche = { import z from "zod";
Scheda_Tv: string | null;
Scheda_Grado: string | null; export type Caratteristiche = z.infer<typeof CaratteristicheSchema>;
Scheda_Piano: string | null; export const CaratteristicheSchema = z.object({
Scheda_Arredi: string | null; Scheda_Tv: z.string().nullable(),
Scheda_Balconi: string | null; Scheda_Grado: z.string().nullable(),
Scheda_Infissi: string | null; Scheda_Piano: z.string().nullable(),
Scheda_Pulizie: string | null; Scheda_Arredi: z.string().nullable(),
Scheda_Taverna: string | null; Scheda_Balconi: z.string().nullable(),
Scheda_Cauzione: string | null; Scheda_Infissi: z.string().nullable(),
Scheda_Giardino: string | null; Scheda_Pulizie: z.string().nullable(),
Scheda_Internet: string | null; Scheda_Taverna: z.string().nullable(),
Scheda_Panorama: string | null; Scheda_Cauzione: z.string().nullable(),
Scheda_Persiana: string | null; Scheda_Giardino: z.string().nullable(),
Scheda_Terrazzi: string | null; Scheda_Internet: z.string().nullable(),
Scheda_Categoria: string | null; Scheda_Panorama: z.string().nullable(),
Scheda_Magazzino: string | null; Scheda_Persiana: z.string().nullable(),
Scheda_Pavimento: string | null; Scheda_Terrazzi: z.string().nullable(),
Scheda_Posizione: string | null; Scheda_Categoria: z.string().nullable(),
Scheda_AcquaCalda: string | null; Scheda_Magazzino: z.string().nullable(),
Scheda_LatiLiberi: string | null; Scheda_Pavimento: z.string().nullable(),
Scheda_Serramenti: string | null; Scheda_Posizione: z.string().nullable(),
Scheda_TipoCucina: string | null; Scheda_AcquaCalda: z.string().nullable(),
Scheda_PostiSedere: string | null; Scheda_LatiLiberi: z.string().nullable(),
Scheda_TipoRegistr: string | null; Scheda_Serramenti: z.string().nullable(),
Scheda_TotalePiani: string | null; Scheda_TipoCucina: z.string().nullable(),
Scheda_Appartamenti: string | null; Scheda_PostiSedere: z.string().nullable(),
Scheda_Destinazione: string | null; Scheda_TipoRegistr: z.string().nullable(),
Scheda_IncassoAnnuo: string | null; Scheda_TotalePiani: z.string().nullable(),
Scheda_NumeroCamere: string | null; Scheda_Appartamenti: z.string().nullable(),
Scheda_Orientamento: string | null; Scheda_Destinazione: z.string().nullable(),
Scheda_TipoGestione: string | null; Scheda_IncassoAnnuo: z.string().nullable(),
Scheda_TipoImpianto: string | null; Scheda_NumeroCamere: z.string().nullable(),
Scheda_CantinaSolaio: string | null; Scheda_Orientamento: z.string().nullable(),
Scheda_NumeroVetrine: string | null; Scheda_TipoGestione: z.string().nullable(),
Scheda_OrariApertura: string | null; Scheda_TipoImpianto: z.string().nullable(),
Scheda_Riscaldamento: string | null; Scheda_CantinaSolaio: z.string().nullable(),
Scheda_StatoImmobile: string | null; Scheda_NumeroVetrine: z.string().nullable(),
Scheda_TipoContratto: string | null; Scheda_OrariApertura: z.string().nullable(),
Scheda_TipoSoggiorno: string | null; Scheda_Riscaldamento: z.string().nullable(),
Scheda_ElettricitaGas: string | null; Scheda_StatoImmobile: z.string().nullable(),
Scheda_PavimentoBagno: string | null; Scheda_TipoContratto: z.string().nullable(),
Scheda_PavimentoNotte: string | null; Scheda_TipoSoggiorno: z.string().nullable(),
Scheda_Raffrescamento: string | null; Scheda_ElettricitaGas: z.string().nullable(),
Scheda_AccessoDisabili: string | null; Scheda_PavimentoBagno: z.string().nullable(),
Scheda_AffittoMuriAnno: string | null; Scheda_PavimentoNotte: z.string().nullable(),
Scheda_FonteEnergetica: string | null; Scheda_Raffrescamento: z.string().nullable(),
Scheda_PavimentoCucina: string | null; Scheda_AccessoDisabili: z.string().nullable(),
Scheda_PavimentoGiorno: string | null; Scheda_AffittoMuriAnno: z.string().nullable(),
Scheda_TipoSaracinesca: string | null; Scheda_FonteEnergetica: z.string().nullable(),
Scheda_AccoglienzaBimbi: string | null; Scheda_PavimentoCucina: z.string().nullable(),
Scheda_CambioBiancheria: string | null; Scheda_PavimentoGiorno: z.string().nullable(),
Scheda_CanoniAnticipati: string | null; Scheda_TipoSaracinesca: z.string().nullable(),
Scheda_NumeroDipendenti: string | null; Scheda_AccoglienzaBimbi: z.string().nullable(),
Scheda_SpazioParcheggio: string | null; Scheda_CambioBiancheria: z.string().nullable(),
Scheda_ScadenzaContratto: string | null; Scheda_CanoniAnticipati: z.string().nullable(),
Scheda_TipoRiscaldamento: string | null; Scheda_NumeroDipendenti: z.string().nullable(),
Scheda_SpCondominialiAnno: string | null; Scheda_SpazioParcheggio: z.string().nullable(),
Scheda_IndiceEdificabilita: string | null; Scheda_ScadenzaContratto: z.string().nullable(),
Scheda_OneriUrbanizzazione: string | null; Scheda_TipoRiscaldamento: z.string().nullable(),
Scheda_PossibilitàAcquistoMuri: string | null; Scheda_SpCondominialiAnno: z.string().nullable(),
}; Scheda_IndiceEdificabilita: z.string().nullable(),
Scheda_OneriUrbanizzazione: z.string().nullable(),
Scheda_PossibilitàAcquistoMuri: z.string().nullable(),
});