import { format } from "date-fns"; import { it } from "date-fns/locale"; import { CalendarIcon, Trash2 } from "lucide-react"; import toast from "react-hot-toast"; import { z } from "zod/v4"; import { Confirm } from "~/components/confirm"; 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, type PaymentType } from "~/i18n/stripe"; import { cn, formatCurrency } from "~/lib/utils"; import { useZodForm } from "~/lib/zodForm"; import OrderTypeEnum from "~/schemas/public/OrderTypeEnum"; import type { Ordini } from "~/schemas/public/Ordini"; import PaymentStatusEnum from "~/schemas/public/PaymentStatusEnum"; import type { Prezziario } from "~/schemas/public/Prezziario"; import { zPrezziarioId } from "~/server/utils/zod_types"; import { api } from "~/utils/api"; type FormProps = { prezziario: Prezziario[]; data: Ordini; close: () => void; }; export const FormEditOrder = ({ prezziario, data, close }: 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), paid_at: z.date().nullable(), 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: { ...data, paymentmethod: (data.paymentmethod as PaymentType) || null, }, }); const utils = api.useUtils(); const { mutate: updateOrder } = api.servizio.updateOrder.useMutation({ onError: (error) => { toast.error(`Errore durante la modifica: ${error.message}`); }, onSuccess: async () => { toast.success("Ordine aggiornato con successo!"); await utils.servizio.invalidate(); }, }); const { mutate: remove } = api.servizio.removeOrder.useMutation({ onError: (error) => { toast.error(`Errore durante la rimozione ordine: ${error.message}`); }, onSuccess: async () => { toast.success("Ordine rimosso con successo!"); await utils.servizio.invalidate(); close(); }, }); const { watch } = form; const scontoWch = watch(["sconto", "amount_cent"]); function onSubmit(fields: FormValues) { updateOrder({ ordineId: data.ordine_id, data: fields, }); } return ( <>
{ const pack = prezziario.find( (p) => p.idprezziario === field.value, ); 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 il servizio รจ pagato
)} /> (
Sconto
)} /> {scontoWch && scontoWch[0] !== 0 ? ( Prezzo scontato:{" "} {formatCurrency( ((1 - scontoWch[0] / 100) * scontoWch[1]) / 100, )} ) : ( Prezzo: {formatCurrency(scontoWch[1] / 100)} )}
{ remove({ ordineId: data.ordine_id }); }} title="Elimina ordine" >
); };