import { z } from "zod/v4"; import { useZodForm } from "~/lib/zodForm"; import { Form, FormControl, FormField, FormItem, FormLabel, FormMessage, } from "~/components/custom_ui/form"; import Input from "~/components/custom_ui/input"; import { Button } from "~/components/ui/button"; import toast from "react-hot-toast"; import { api } from "~/utils/api"; import { useTranslation } from "~/providers/I18nProvider"; import { differenceInYears, format } from "date-fns"; import { Popover, PopoverContent, PopoverTrigger, } from "~/components/ui/popover"; import { cn } from "~/lib/utils"; import { CalendarIcon } from "lucide-react"; import { Calendar } from "~/components/ui/calendar"; import { MultiSelect, RepackValues, UnpackOptions, } from "~/components/custom_ui/multiselect"; import { it, enUS } from "date-fns/locale"; import { Separator } from "~/components/ui/separator"; import { GetNazioni } from "~/i18n/nazioni"; import { provincie } from "~/i18n/provincie"; import { checkFiscalCodeValidity, getComuneFieldValue } from "~/lib/form_utils"; import { getComuniNames } from "~/i18n/comuni"; import type { UserWithAnagrafica } from "~/server/services/user.service"; import { Switch } from "~/components/ui/switch"; export const ProfileFormAnagrafica = ({ userData, }: { userData: UserWithAnagrafica; }) => { const profileFormSchema = z .object({ data_nascita: z.date().optional(), luogo_nascita: z.string().optional(), sesso: z.string().optional(), nazione_nascita: z.string().optional(), codice_fiscale: z.string().optional(), via_residenza: z.string().optional(), civico_residenza: z.string().optional(), cap_residenza: z.string().optional(), comune_residenza: z.string().optional(), provincia_residenza: z.string().optional(), nazione_residenza: z.string().optional(), azienda: z.boolean(), fatturazione_aziendale: z.boolean(), codice_destinatario: z.string().length(7).nullable(), ragione_sociale: z.string().nullable(), sede_legale: z.string().nullable(), legale_rappresentante: z.string().nullable(), p_iva: z.string().nullable(), }) .superRefine( ( { data_nascita, codice_fiscale, sesso, luogo_nascita, nazione_nascita, cap_residenza, azienda, p_iva, ragione_sociale, sede_legale, legale_rappresentante, fatturazione_aziendale, codice_destinatario, }, refinementContext, ) => { if (azienda) { if (!ragione_sociale || ragione_sociale.length < 1) { refinementContext.issues.push({ code: "custom", message: "Inserisci la ragione sociale", path: ["ragione_sociale"], input: "", }); } if (!sede_legale || sede_legale.length < 1) { refinementContext.issues.push({ code: "custom", message: "Inserisci la sede legale", path: ["sede_legale"], input: "", }); } if (!p_iva || p_iva.length < 1) { refinementContext.issues.push({ code: "custom", message: "Inserisci la partita iva", path: ["p_iva"], input: "", }); } if (!legale_rappresentante || legale_rappresentante.length < 1) { refinementContext.issues.push({ code: "custom", message: "Inserisci il legale rappresentante", path: ["legale_rappresentante"], input: "", }); } } if (fatturazione_aziendale) { if (!codice_destinatario || codice_destinatario.length != 7) { refinementContext.issues.push({ code: "custom", message: "Inserisci il codice destinatario", path: ["codice_destinatario"], input: "", }); } } if (cap_residenza) { if (cap_residenza.length !== 5) { refinementContext.issues.push({ code: "custom", message: "Inserisci un CAP valido", input: "", }); } } if (data_nascita) { const diff = differenceInYears(data_nascita, new Date()); if (diff === 0) { refinementContext.issues.push({ code: "custom", message: "Inserisci una data valida", path: ["data_nascita"], input: "", }); } } if ( codice_fiscale && data_nascita && sesso && luogo_nascita && nazione_nascita ) { { checkFiscalCodeValidity({ path: "codice_fiscale", codiceFiscale: codice_fiscale, cognome: userData.cognome?.toUpperCase() || "", nome: userData.nome?.toUpperCase() || "", dataNascita: data_nascita, sesso, refinementContext, luogoNascita: luogo_nascita, nazioneNascita: nazione_nascita, }); } } }, ); type ProfileFormValues = z.infer; const defaultValues: ProfileFormValues = { data_nascita: userData.data_nascita || new Date(), luogo_nascita: userData.luogo_nascita || "", nazione_nascita: userData.nazione_nascita || "", codice_fiscale: userData.codice_fiscale || "", via_residenza: userData.via_residenza || "", civico_residenza: userData.civico_residenza || "", cap_residenza: userData.cap_residenza || "", comune_residenza: userData.comune_residenza || "", provincia_residenza: userData.provincia_residenza || "", nazione_residenza: userData.nazione_residenza || "", sesso: userData.sesso || "", azienda: userData.azienda || false, ragione_sociale: userData.ragione_sociale || null, sede_legale: userData.sede_legale || null, legale_rappresentante: userData.legale_rappresentante || null, p_iva: userData.p_iva || null, fatturazione_aziendale: userData.fatturazione_aziendale || false, codice_destinatario: userData.codice_destinatario || null, }; const { locale, t } = useTranslation(); z.config(z.locales[locale]()); const form = useZodForm(profileFormSchema, { defaultValues: defaultValues, }); const utils = api.useUtils(); const { mutate } = api.users.editUserAnagrafica.useMutation({ onSuccess: async () => { toast.success(t.profile.aggiornato); await utils.auth.getSession.invalidate(); await utils.users.getUser.invalidate(); await utils.users.getClientProfilo.invalidate(); }, onError: (error) => { toast.error(error.message); }, }); function onSubmit(fields: ProfileFormValues) { mutate({ ...fields, userid: userData.id, idanagrafica: userData.idanagrafica || undefined, }); } const nazioni_options = GetNazioni(); const comuni_options = getComuniNames(); const azienda = form.watch("azienda"); const nazione_nascita = form.watch("nazione_nascita"); const nazione_residenza = form.watch("nazione_residenza"); const fatturazione_aziendale = form.watch("fatturazione_aziendale"); const DatePickerLocale = locale === "it" ? it : enUS; return ( <>
(
{t.anagrafica.dataNascita}
date > new Date() || date < new Date("1900-01-01") } // eslint-disable-next-line jsx-a11y/no-autofocus autoFocus />
)} /> (
{t.anagrafica.nazioneNascita}
{ field.onChange(value.value); await form.trigger("luogo_nascita"); }} placeholder="Seleziona..." isMulti={false} />
)} /> { if (nazione_nascita === "0") { return (
{t.anagrafica.luogoNascita}
{ field.onChange(value.value); await form.trigger("luogo_nascita"); await form.trigger("codice_fiscale"); }} placeholder="Seleziona..." isMulti={false} />
); } return (
{t.anagrafica.luogoNascita}
{ field.onChange(v.target.value); await form.trigger("luogo_nascita"); await form.trigger("codice_fiscale"); }} />
); }} />
(
{t.anagrafica.sesso}
v.value == field.value, )} options={t.anagrafica.sesso_options} onValueChange={(value) => { field.onChange(value.value); }} />
)} /> (
{t.anagrafica.codiceFiscale}
{ field.onChange(v.target.value.toUpperCase()); await form.trigger("codice_fiscale"); }} type="text" className="uppercase" id="codice_fiscale" />
)} /> (
Azienda? { field.onChange(v); if (!v) { form.setValue("ragione_sociale", null); form.setValue("sede_legale", null); form.setValue("p_iva", null); } }} id="azienda" className="data-[state=checked]:bg-neutral-700" />
)} />
{azienda && ( <>
(
{t.anagrafica.ragioneSociale}
)} /> (
{t.anagrafica.sedeLegale}
)} />
(
{t.anagrafica.p_iva}
)} /> (
{t.anagrafica.legale_rappresentante}
)} />
(
Vuoi che la fatturazione sia intestata alla tua azienda? { field.onChange(v); if (!v) { form.setValue("codice_destinatario", null); } }} id="fatturazione_aziendale" className="data-[state=checked]:bg-neutral-700" />
)} /> {fatturazione_aziendale && ( (
Codice destinatario (SDI)
)} /> )} )}
(
{t.recapiti.nazione}
{ form.setValue("provincia_residenza", ""); field.onChange(value.value); await form.trigger("comune_residenza"); }} defaultValue={ field.value ? RepackValues({ options: nazioni_options, values: field.value, }) : undefined } elementName="nazione" isMulti={false} placeholder="Seleziona" />
)} /> (
{t.recapiti.provincia}
{nazione_residenza === "0" ? ( { field.onChange(value.value); }} defaultValue={ field.value ? RepackValues({ options: provincie, values: field.value, }) : undefined } elementName="provincia" isMulti={false} placeholder="Seleziona" /> ) : ( )}
)} />
{ if (nazione_residenza === "0") { return (
{t.recapiti.comune}
{ field.onChange(value.value); await form.trigger("comune_residenza"); }} placeholder="Seleziona..." isMulti={false} />
); } return (
{t.recapiti.comune}
{ field.onChange(v.target.value); await form.trigger("comune_residenza"); }} />
); }} /> (
{t.recapiti.cap}
)} />
(
{t.recapiti.indirizzo}
)} /> (
{t.recapiti.civico}
)} />
); };