From 9e495caf29f5564001a373058319fc20651a6105 Mon Sep 17 00:00:00 2001 From: Marco Pedone Date: Thu, 30 Oct 2025 19:39:35 +0100 Subject: [PATCH] feat(forms): Add skip options and expiration date for temporary motivation in service forms --- .../components/servizio/servizio_actions.tsx | 2 +- .../src/forms/FormEditServizioAdmin.tsx | 90 +++++- .../infoalloggi/src/forms/FormNewServizio.tsx | 259 ++++++++++++++---- .../src/forms/FormNewServizioAcquisto.tsx | 150 +++++++--- .../src/schemas/public/Servizio.ts | 8 + 5 files changed, 405 insertions(+), 104 deletions(-) diff --git a/apps/infoalloggi/src/components/servizio/servizio_actions.tsx b/apps/infoalloggi/src/components/servizio/servizio_actions.tsx index e0c7826..4b003bc 100644 --- a/apps/infoalloggi/src/components/servizio/servizio_actions.tsx +++ b/apps/infoalloggi/src/components/servizio/servizio_actions.tsx @@ -303,7 +303,7 @@ const EditPreferenze = () => { Preferenze - + {isLoading ? ( ) : ( diff --git a/apps/infoalloggi/src/forms/FormEditServizioAdmin.tsx b/apps/infoalloggi/src/forms/FormEditServizioAdmin.tsx index 1247a4b..d0daff0 100644 --- a/apps/infoalloggi/src/forms/FormEditServizioAdmin.tsx +++ b/apps/infoalloggi/src/forms/FormEditServizioAdmin.tsx @@ -32,6 +32,9 @@ const Schema = z.object({ isOkConsulenza: z.boolean(), isOkSaldo: z.boolean(), isSent: z.boolean(), + skipPayment: z.boolean(), + skipControlloDoc: z.boolean(), + skipDocMotivazione: z.boolean(), }); export type FormValues = z.infer; @@ -58,6 +61,9 @@ export const FormEditServizio = ({ isOkConsulenza: false, isOkSaldo: false, isSent: false, + skipPayment: false, + skipControlloDoc: false, + skipDocMotivazione: false, }; } const { locale, t } = useTranslation(); @@ -161,10 +167,7 @@ export const FormEditServizio = ({ autoFocus captionLayout="dropdown" defaultMonth={field.value || new Date()} - disabled={(date) => - date > new Date() || date < new Date("1900-01-01") - } - endMonth={new Date()} + endMonth={new Date(2050, 12)} locale={DatePickerLocale} mode="single" onSelect={field.onChange} @@ -266,6 +269,85 @@ export const FormEditServizio = ({ )} /> +
+ ( + +
+ Salta Pagamento + + + + +
+ + Salta la richiesta di pagamento al cliente (per tutti i + pagamenti) + +
+ )} + /> + ( + +
+ + Salta controllo documento + + + + + +
+ + Salta la richiesta del documento del cliente al momento dello + sblocco contatti + +
+ )} + /> + ( + +
+ + Salta documento motivazione + + + + + +
+ + + Salta l'invio del documento di motivazione al cliente al + momento della conferma annuncio + +
+ )} + /> +
diff --git a/apps/infoalloggi/src/forms/FormNewServizio.tsx b/apps/infoalloggi/src/forms/FormNewServizio.tsx index cba4954..4bf05a2 100644 --- a/apps/infoalloggi/src/forms/FormNewServizio.tsx +++ b/apps/infoalloggi/src/forms/FormNewServizio.tsx @@ -1,3 +1,6 @@ +import { format } from "date-fns"; +import { it } from "date-fns/locale"; +import { CalendarIcon } from "lucide-react"; import { z } from "zod/v4"; import { Counter } from "~/components/counter"; import { @@ -12,7 +15,14 @@ import { import { MultiSelect, UnpackOptions } from "~/components/custom_ui/multiselect"; import { Badge } from "~/components/ui/badge"; import { Button } from "~/components/ui/button"; +import { Calendar } from "~/components/ui/calendar"; import { Label } from "~/components/ui/label"; +import { + Popover, + PopoverContent, + PopoverTrigger, +} from "~/components/ui/popover"; +import { Separator } from "~/components/ui/separator"; import { Slider } from "~/components/ui/slider"; import { Switch } from "~/components/ui/switch"; import { cn } from "~/lib/utils"; @@ -39,6 +49,10 @@ const Schema = z reddito: z.string().nullable(), terrazzo: z.boolean(), tipologia: z.custom(), + scadenza_motivazione_transitoria: z.date().nullable(), + skipPayment: z.boolean(), + skipControlloDoc: z.boolean(), + skipDocMotivazione: z.boolean(), }) .superRefine(({ n_adulti }, refinementContext) => { if (n_adulti <= 0) { @@ -87,6 +101,10 @@ export const FormNewServizio = ({ reddito: "", terrazzo: false, tipologia: TipologiaPosizioneEnum.Transitorio, + scadenza_motivazione_transitoria: null, + skipPayment: false, + skipControlloDoc: false, + skipDocMotivazione: false, }; } const { locale, t } = useTranslation(); @@ -381,66 +399,118 @@ export const FormNewServizio = ({ /> {tipologia === TipologiaPosizioneEnum.Transitorio ? ( - { - const existingValue = t.preferenze.motivazioni_mappings.find( - (m) => m.id === field.value, - ); - return ( - +
+ { + const existingValue = t.preferenze.motivazioni_mappings.find( + (m) => m.id === field.value, + ); + return ( + +
+ + {t.preferenze.motivazione_label} + + +
+ {isLimited ? ( +
+

+ {existingValue?.title} +

+

+ La motivazione non può essere modificata. Contatta il + supporto se necessario. +

+
+ ) : ( + <> + { + field.onChange(value.value); + }} + options={t.preferenze.motivazioni_mappings.map( + (option) => ({ + label: option.title, + value: option.id, + }), + )} + placeholder={t.seleziona_placeholder} + /> + + {t.preferenze.motivazione_desc} + + + )} +
+ ); + }} + /> + ( +
- - {t.preferenze.motivazione_label} + + Scadenza motivazione
- {isLimited ? ( -
-

- {existingValue?.title} -

-

- La motivazione non può essere modificata. Contatta il - supporto se necessario. -

-
- ) : ( - <> - { - field.onChange(value.value); - }} - options={t.preferenze.motivazioni_mappings.map( - (option) => ({ - label: option.title, - value: option.id, - }), - )} - placeholder={t.seleziona_placeholder} + + + + + + + + - - {t.preferenze.motivazione_desc} - - - )} + +
- ); - }} - /> + )} + /> +
) : ( + + +
+ ( + +
+ Salta Pagamento + + + + +
+ + Salta la richiesta di pagamento al cliente (per tutti i + pagamenti) + +
+ )} + /> + ( + +
+ + Salta controllo documento + + + + + +
+ + Salta la richiesta del documento del cliente al momento dello + sblocco contatti + +
+ )} + /> + ( + +
+ + Salta documento motivazione + + + + + +
+ + + Salta l'invio del documento di motivazione al cliente al + momento della conferma annuncio + +
+ )} + /> +
diff --git a/apps/infoalloggi/src/forms/FormNewServizioAcquisto.tsx b/apps/infoalloggi/src/forms/FormNewServizioAcquisto.tsx index d63345d..7b7f19d 100644 --- a/apps/infoalloggi/src/forms/FormNewServizioAcquisto.tsx +++ b/apps/infoalloggi/src/forms/FormNewServizioAcquisto.tsx @@ -112,6 +112,7 @@ const FormNewServizioSchema = z.object({ telefono: z.string(), terrazzo: z.boolean(), tipologia: z.custom(), + scadenza_motivazione_transitoria: z.date().nullable(), }); type FormNewServizioValues = z.infer; @@ -140,6 +141,7 @@ export const FormNewServizioAcquisto = ({ permanenza, entromese, motivazione_transitorio, + scadenza_motivazione_transitoria, reddito, azienda, p_iva, @@ -254,6 +256,14 @@ export const FormNewServizioAcquisto = ({ path: ["motivazione_transitorio"], }); } + if (!scadenza_motivazione_transitoria) { + refinementContext.issues.push({ + code: "custom", + input: "", + message: "Inserisci la scadenza della motivazione", + path: ["scadenza_motivazione_transitoria"], + }); + } } else { if (reddito === "" || reddito === null) { refinementContext.issues.push({ @@ -684,54 +694,107 @@ export const FormNewServizioAcquisto = ({ {tipologia === TipologiaPosizioneEnum.Transitorio ? ( - { - const existingValue = t.preferenze.motivazioni_mappings.find( - (m) => m.id === field.value, - ); + <> + { + const existingValue = + t.preferenze.motivazioni_mappings.find( + (m) => m.id === field.value, + ); - return ( - + return ( + +
+ + {t.preferenze.motivazione_label} + + +
+ { + field.onChange(value.value); + }} + options={t.preferenze.motivazioni_mappings.map( + (option) => ({ + label: option.title, + value: option.id, + }), + )} + placeholder={t.seleziona_placeholder} + /> + + + {t.preferenze.motivazione_desc} + +
+ ); + }} + /> + ( +
- - {t.preferenze.motivazione_label} + + Scadenza motivazione
- { - field.onChange(value.value); - }} - options={t.preferenze.motivazioni_mappings.map( - (option) => ({ - label: option.title, - value: option.id, - }), - )} - placeholder={t.seleziona_placeholder} - /> - - - {t.preferenze.motivazione_desc} - + + + + + + + + + +
- ); - }} - /> + )} + /> + ) : ( - date > new Date() || date < new Date("1900-01-01") - } endMonth={new Date()} locale={DatePickerLocale} mode="single" diff --git a/apps/infoalloggi/src/schemas/public/Servizio.ts b/apps/infoalloggi/src/schemas/public/Servizio.ts index ac9dfd7..33f28db 100644 --- a/apps/infoalloggi/src/schemas/public/Servizio.ts +++ b/apps/infoalloggi/src/schemas/public/Servizio.ts @@ -66,6 +66,14 @@ export default interface ServizioTable { doc_personale_retro_ref: ColumnType; doc_motivazione_ref: ColumnType; + + scadenza_motivazione_transitoria: ColumnType; + + skipPayment: ColumnType; + + skipControlloDoc: ColumnType; + + skipDocMotivazione: ColumnType; } export type Servizio = Selectable;