import { format } from "date-fns"; import { it } from "date-fns/locale"; import { CalendarIcon } from "lucide-react"; import toast from "react-hot-toast"; import { z } from "zod/v4"; import { CredenzaBody, CredenzaClose, CredenzaFooter, } from "~/components/custom_ui/credenza"; import { Form, FormControl, FormDescription, FormField, FormItem, FormLabel, FormMessage, } from "~/components/custom_ui/form"; import { MultiSelect } from "~/components/custom_ui/multiselect"; import { Button } from "~/components/ui/button"; import { Calendar } from "~/components/ui/calendar"; import { Popover, PopoverContent, PopoverTrigger, } from "~/components/ui/popover"; import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue, } from "~/components/ui/select"; import { Switch } from "~/components/ui/switch"; import { PAYMENT_TYPES } from "~/i18n/stripe"; import { cn, formatCurrency } from "~/lib/utils"; import { useZodForm } from "~/lib/zodForm"; import OrderTypeEnum from "~/schemas/public/OrderTypeEnum"; import PaymentStatusEnum from "~/schemas/public/PaymentStatusEnum"; import type { Prezziario } from "~/schemas/public/Prezziario"; import type { ServizioServizioId } from "~/schemas/public/Servizio"; import type { UsersId } from "~/schemas/public/Users"; import { zPrezziarioId } from "~/server/utils/zod_types"; import { api } from "~/utils/api"; type FormProps = { prezziario: Prezziario[]; servizioId: ServizioServizioId; userId: UsersId; setOpen: React.Dispatch>; }; export const FormNewOrder = ({ prezziario, servizioId, userId, setOpen, }: FormProps) => { const schema = z.object({ packid: zPrezziarioId, isActive: z.boolean(), type: z.enum(OrderTypeEnum), created_at: z.date(), amount_cent: z.number(), sconto: z.number().min(0).max(100), paymentmethod: z.enum(PAYMENT_TYPES).nullable(), paymentstatus: z.enum(PaymentStatusEnum).nullable(), }); type FormValues = z.infer; z.config(z.locales.it()); const form = useZodForm(schema, { defaultValues: { sconto: 0, amount_cent: 0, isActive: false, paymentmethod: null, paymentstatus: null, }, }); const utils = api.useUtils(); const { mutate: createOrder } = api.servizio.createOrdine.useMutation({ onError: (error) => { toast.error(`Errore nella creazione dell'ordine: ${error.message}`); }, onSuccess: async () => { toast.success("Ordine creato con successo"); await utils.servizio.invalidate(); setOpen(false); form.reset(); }, }); const { watch } = form; const scontoWch = watch(["sconto", "amount_cent"]); function onSubmit(fields: FormValues) { createOrder({ data: { ...fields, servizio_id: servizioId, userid: userId }, }); } return ( <>
(
Servizio
{ const selected = zPrezziarioId.safeParse(value.value); if (selected.success) { field.onChange(selected.data); const selectedPrezzo = prezziario.find( (p) => p.idprezziario === selected.data, ); if (selectedPrezzo) { form.setValue( "amount_cent", selectedPrezzo.prezzo_cent, ); } } else { console.error( "Invalid packid selected", value.value, ); } }} options={prezziario.map((p) => ({ label: `${p.idprezziario} - ${p.nome_it} (${formatCurrency(p.prezzo_cent / 100)})`, value: p.idprezziario, }))} placeholder="Seleziona..." />
)} /> (
Tipologia
)} /> (
Data Ordine
)} /> (
Pagato
Imposta se attivo
)} />
(
Stato Pagameto
)} /> (
Metodo di Pagamento
)} />
(
Sconto
)} /> {scontoWch && scontoWch[0] !== 0 ? ( Prezzo scontato:{" "} {formatCurrency( ((1 - scontoWch[0] / 100) * scontoWch[1]) / 100, )} ) : ( Prezzo: {formatCurrency(scontoWch[1] / 100)} )}
); };