2026-03-08 01:02:57 +01:00
|
|
|
import { CircleCheck, CircleSlash, ReceiptText } from "lucide-react";
|
2025-08-28 18:27:07 +02:00
|
|
|
import Link from "next/link";
|
2026-03-08 01:02:57 +01:00
|
|
|
import type { Dispatch, SetStateAction } from "react";
|
2025-08-04 17:45:44 +02:00
|
|
|
import {
|
2025-08-28 18:27:07 +02:00
|
|
|
Credenza,
|
|
|
|
|
CredenzaBody,
|
|
|
|
|
CredenzaClose,
|
|
|
|
|
CredenzaContent,
|
|
|
|
|
CredenzaDescription,
|
|
|
|
|
CredenzaFooter,
|
|
|
|
|
CredenzaHeader,
|
|
|
|
|
CredenzaTitle,
|
2025-08-04 17:45:44 +02:00
|
|
|
} from "~/components/custom_ui/credenza";
|
|
|
|
|
import { Button } from "~/components/ui/button";
|
2026-03-08 01:02:57 +01:00
|
|
|
import { FormEditOrder } from "~/forms/FormEditOrdine";
|
|
|
|
|
import { formatCurrency } from "~/lib/utils";
|
2025-08-28 18:27:07 +02:00
|
|
|
import type { OrdiniOrdineId } from "~/schemas/public/Ordini";
|
|
|
|
|
import PaymentStatusEnum from "~/schemas/public/PaymentStatusEnum";
|
2026-03-08 01:02:57 +01:00
|
|
|
import type { Prezziario } from "~/schemas/public/Prezziario";
|
2025-08-28 18:27:07 +02:00
|
|
|
import { api } from "~/utils/api";
|
2025-08-04 17:45:44 +02:00
|
|
|
|
2026-03-08 01:02:57 +01:00
|
|
|
export const AdminWrapperOrdiniModal = ({
|
|
|
|
|
ordineId,
|
|
|
|
|
setSelected,
|
|
|
|
|
}: {
|
|
|
|
|
ordineId: OrdiniOrdineId | null;
|
|
|
|
|
setSelected: Dispatch<SetStateAction<OrdiniOrdineId | null>>;
|
|
|
|
|
}) => {
|
|
|
|
|
const { data: prezzi, isLoading } = api.prezziario.getPrezziario.useQuery();
|
|
|
|
|
if (isLoading || !ordineId || !prezzi) return null;
|
|
|
|
|
return (
|
|
|
|
|
<AdminOrdiniModal
|
|
|
|
|
ordineId={ordineId}
|
|
|
|
|
prezzi={prezzi}
|
|
|
|
|
setSelected={setSelected}
|
|
|
|
|
/>
|
|
|
|
|
);
|
|
|
|
|
};
|
|
|
|
|
const AdminOrdiniModal = ({
|
|
|
|
|
prezzi,
|
|
|
|
|
setSelected,
|
2025-08-28 18:27:07 +02:00
|
|
|
ordineId,
|
2025-08-04 17:45:44 +02:00
|
|
|
}: {
|
2026-03-08 01:02:57 +01:00
|
|
|
prezzi: Prezziario[];
|
|
|
|
|
setSelected: Dispatch<SetStateAction<OrdiniOrdineId | null>>;
|
2025-08-28 18:27:07 +02:00
|
|
|
ordineId: OrdiniOrdineId;
|
2025-08-04 17:45:44 +02:00
|
|
|
}) => {
|
2026-03-08 01:02:57 +01:00
|
|
|
const { data } = api.servizio.getOrdineById.useQuery({
|
|
|
|
|
ordineId,
|
2025-08-28 18:27:07 +02:00
|
|
|
});
|
2025-08-04 17:45:44 +02:00
|
|
|
|
2026-03-08 01:02:57 +01:00
|
|
|
if (!data) return null;
|
|
|
|
|
|
|
|
|
|
return (
|
|
|
|
|
<Credenza
|
|
|
|
|
onOpenChange={(b) => {
|
|
|
|
|
if (!b) setSelected(null);
|
|
|
|
|
}}
|
|
|
|
|
open={ordineId !== null}
|
|
|
|
|
>
|
|
|
|
|
<CredenzaContent className="max-h-[90vh] max-w-2xl sm:max-w-4xl">
|
|
|
|
|
<CredenzaHeader>
|
|
|
|
|
<CredenzaTitle>Dettagli Ordine</CredenzaTitle>
|
|
|
|
|
<CredenzaDescription>
|
|
|
|
|
Visualizza i dettagli e i pagamenti associati.
|
|
|
|
|
</CredenzaDescription>
|
|
|
|
|
</CredenzaHeader>
|
|
|
|
|
<CredenzaBody className="max-h-[80vh] space-y-2 overflow-auto pb-5">
|
|
|
|
|
<p>Id Ordine: {data.ordine_id}</p>
|
2026-03-09 17:33:02 +01:00
|
|
|
{data.isActive && (
|
|
|
|
|
<Link
|
|
|
|
|
href={`/servizio/ricevuta-cortesia/${data.ordine_id}`}
|
|
|
|
|
target="_blank"
|
|
|
|
|
>
|
|
|
|
|
<Button variant="outline">
|
|
|
|
|
Ricevuta di cortesia <ReceiptText />
|
|
|
|
|
</Button>
|
|
|
|
|
</Link>
|
|
|
|
|
)}
|
2026-03-08 01:02:57 +01:00
|
|
|
<FormEditOrder
|
|
|
|
|
close={() => setSelected(null)}
|
|
|
|
|
data={data}
|
|
|
|
|
prezziario={prezzi}
|
|
|
|
|
/>
|
|
|
|
|
</CredenzaBody>
|
|
|
|
|
</CredenzaContent>
|
|
|
|
|
</Credenza>
|
|
|
|
|
);
|
|
|
|
|
};
|
2025-08-04 17:45:44 +02:00
|
|
|
|
2026-03-08 01:02:57 +01:00
|
|
|
export const UserOrdiniModal = ({
|
|
|
|
|
setSelected,
|
|
|
|
|
ordineId,
|
|
|
|
|
}: {
|
|
|
|
|
setSelected: (ordineId: OrdiniOrdineId | null) => void;
|
|
|
|
|
ordineId: OrdiniOrdineId;
|
|
|
|
|
}) => {
|
2025-08-28 18:27:07 +02:00
|
|
|
const { data } = api.servizio.getOrdineById.useQuery({
|
|
|
|
|
ordineId,
|
|
|
|
|
});
|
|
|
|
|
if (!data) return null;
|
2025-08-04 17:45:44 +02:00
|
|
|
|
2025-08-28 18:27:07 +02:00
|
|
|
return (
|
|
|
|
|
<Credenza
|
|
|
|
|
onOpenChange={(b) => {
|
2026-03-08 01:02:57 +01:00
|
|
|
if (!b) setSelected(null);
|
2025-08-28 18:27:07 +02:00
|
|
|
}}
|
2026-03-08 01:02:57 +01:00
|
|
|
open={ordineId !== null}
|
2025-08-28 18:27:07 +02:00
|
|
|
>
|
2025-09-09 10:36:43 +02:00
|
|
|
<CredenzaContent className="max-h-[90vh] max-w-2xl sm:max-w-4xl">
|
2025-08-28 18:27:07 +02:00
|
|
|
<CredenzaHeader>
|
|
|
|
|
<CredenzaTitle>Dettagli Ordine</CredenzaTitle>
|
|
|
|
|
<CredenzaDescription>
|
|
|
|
|
Visualizza i dettagli e i pagamenti associati.
|
|
|
|
|
</CredenzaDescription>
|
|
|
|
|
</CredenzaHeader>
|
|
|
|
|
<CredenzaBody className="max-h-[80vh] space-y-2 overflow-auto pb-5">
|
|
|
|
|
<p>Id Ordine: {data.ordine_id}</p>
|
|
|
|
|
<p>
|
2026-03-08 01:02:57 +01:00
|
|
|
Data Ordine: {new Date(data.created_at).toLocaleDateString("it-IT")}
|
2025-08-28 18:27:07 +02:00
|
|
|
</p>
|
|
|
|
|
<p>Tipologia: {data.type.toString()}</p>
|
|
|
|
|
<p>Pack ID: {data.packid}</p>
|
|
|
|
|
<p className="flex items-center gap-2">
|
|
|
|
|
Stato:{" "}
|
|
|
|
|
{data.isActive ? (
|
|
|
|
|
<span className="inline-flex items-center gap-1 text-green-500">
|
|
|
|
|
<CircleCheck className="size-5" />
|
|
|
|
|
Attivo
|
|
|
|
|
</span>
|
|
|
|
|
) : (
|
|
|
|
|
<span className="inline-flex items-center gap-1">
|
|
|
|
|
<CircleSlash className="size-5" />
|
|
|
|
|
Non Attivo
|
|
|
|
|
</span>
|
|
|
|
|
)}
|
|
|
|
|
</p>
|
2026-03-08 01:02:57 +01:00
|
|
|
<p>
|
|
|
|
|
Importo: {formatCurrency(data.amount_cent / 100)}{" "}
|
|
|
|
|
{data.sconto > 0 && <span>({data.sconto}%)</span>}
|
|
|
|
|
</p>
|
2025-08-28 18:27:07 +02:00
|
|
|
{data.isActive &&
|
2026-03-08 01:02:57 +01:00
|
|
|
data.paymentstatus === PaymentStatusEnum.success && (
|
2025-08-28 18:27:07 +02:00
|
|
|
<div>
|
|
|
|
|
<Link
|
2026-03-04 19:12:01 +01:00
|
|
|
href={`/servizio/ricevuta-cortesia/${data.ordine_id}`}
|
2025-08-28 18:27:07 +02:00
|
|
|
target="_blank"
|
|
|
|
|
>
|
2025-11-03 10:59:45 +01:00
|
|
|
<Button variant="outline">
|
2025-08-28 18:27:07 +02:00
|
|
|
Ricevuta di cortesia <ReceiptText />
|
|
|
|
|
</Button>
|
|
|
|
|
</Link>
|
|
|
|
|
</div>
|
|
|
|
|
)}
|
|
|
|
|
</CredenzaBody>
|
2026-03-08 01:02:57 +01:00
|
|
|
<CredenzaFooter className="flex w-full sm:justify-end">
|
2025-08-28 18:27:07 +02:00
|
|
|
<CredenzaClose asChild>
|
|
|
|
|
<Button variant="ghost">Chiudi</Button>
|
|
|
|
|
</CredenzaClose>
|
|
|
|
|
</CredenzaFooter>
|
|
|
|
|
</CredenzaContent>
|
|
|
|
|
</Credenza>
|
|
|
|
|
);
|
2025-08-04 17:45:44 +02:00
|
|
|
};
|