import { add } from "date-fns"; import { Bug, ChevronDown, ClockAlert, Cog, Euro, ExternalLink, Logs, Plus, Search, SlidersHorizontal, Trash2, } from "lucide-react"; import Link from "next/link"; import { useRouter } from "next/router"; import { useState } from "react"; import toast from "react-hot-toast"; import { Credenza, CredenzaBody, CredenzaContent, CredenzaDescription, CredenzaHeader, CredenzaTitle, CredenzaTrigger, } from "~/components/custom_ui/credenza"; import { MultiSelect } from "~/components/custom_ui/multiselect"; import { LoadingPage } from "~/components/loading"; import { AlertDialog, AlertDialogAction, AlertDialogCancel, AlertDialogContent, AlertDialogDescription, AlertDialogFooter, AlertDialogHeader, AlertDialogTitle, AlertDialogTrigger, } from "~/components/ui/alert-dialog"; import { Button } from "~/components/ui/button"; import { Collapsible, CollapsibleContent, CollapsibleTrigger, } from "~/components/ui/collapsible"; import { Dialog, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogTitle, DialogTrigger, } from "~/components/ui/dialog"; import { type FormValues as EditFormValues, FormEditServizio, } from "~/forms/FormEditServizioAdmin"; import { FormNewOrder } from "~/forms/FormNewOrdine"; import { FormNewServizio, type FormValues } from "~/forms/FormNewServizio"; import { cn, formatCurrency } from "~/lib/utils"; import { useTranslation } from "~/providers/I18nProvider"; import { useServizio } from "~/providers/ServizioProvider"; import type { AnnunciId } from "~/schemas/public/Annunci"; import type { ServizioServizioId } from "~/schemas/public/Servizio"; import TipologiaPosizioneEnum from "~/schemas/public/TipologiaPosizioneEnum"; import type { UsersId } from "~/schemas/public/Users"; import { api } from "~/utils/api"; import { Confirm } from "../confirm"; import { Separator } from "../ui/separator"; import { Table, TableBody, TableCell, TableHead, TableHeader, TableRow, } from "../ui/table"; export const ServizioInfos = () => { return (
); }; const ServizioActions = () => { const { isAdmin } = useServizio(); return ( Azioni Servizio Azioni disponibili per questo servizio
{isAdmin && (
Azioni Admin
)} {isAdmin && (
Azioni Utente
)}
); }; const AdminActions = () => { const { servizio, isAdmin, userId } = useServizio(); if (!isAdmin) return null; return (
); }; const UserActions = ({ className }: { className?: string }) => { const { servizio, isAdmin } = useServizio(); const canUserEdit = servizio.isOkAcconto && servizio.decorrenza !== null; /*&& new Date() <= add(new Date(servizio.decorrenza), { days: 60 }) && !servizio.annunci.some((a) => a.user_confirmed_at !== null) && !servizio.isInterrotto && !servizio.annunci.some((a) => a.user_confirmed_at !== null);*/ if (isAdmin || canUserEdit) { return (
); } return null; }; const ServizioPrezzo = () => { const { servizio } = useServizio(); const { t } = useTranslation(); const { data: packs } = api.servizio.getPacksSolution.useQuery({ servizioId: servizio.servizio_id, }); if (!packs) return null; return ( Prezzi Servizio Prezzi disponibili per questo servizio
{t.servizio.prezzi.sub}
{packs.acconto.success ? ( <> {packs.acconto.pack.nome_it} {packs.acconto.pack.desc_it} {formatCurrency(packs.acconto.pack.prezzo_cent / 100)} COD: {packs.acconto.pack.idprezziario} ) : ( {packs.acconto.message} )}
{packs.saldo.success ? ( <> {packs.saldo.pack.nome_it} {packs.saldo.pack.desc_it} {formatCurrency(packs.saldo.pack.prezzo_cent / 100)} COD: {packs.saldo.pack.idprezziario} ) : ( {packs.saldo.message} )}
{servizio.tipologia === TipologiaPosizioneEnum.Stabile && (
<> {t.servizio.prezzi.consulenza} {t.servizio.prezzi.consulenza_desc} {t.servizio.prezzi.gotoprezzi}
)}
); }; const ServizioOrders = () => { const { isAdmin, servizio } = useServizio(); const [openOrders, setOpenOrders] = useState(false); const [openEdit, setOpenEdit] = useState(false); const swapToEdit = () => { setOpenOrders(false); setOpenEdit(true); }; const swapToOrders = () => { setOpenEdit(false); setOpenOrders(true); }; return ( <> Ordini Servizio Ordini disponibili per questo servizio {isAdmin && ( )}
Data ID Importo Status {servizio.ordini.length === 0 && ( )} {servizio.ordini.map((ordine) => ( {ordine.created_at.toLocaleDateString("it-IT")} {ordine.packid} {formatCurrency(ordine.amount_cent / 100)} {ordine.isActive ? "Attivo" : "Non attivo"} ))}
Nessun ordine disponibile
Nuovo Ordine nuovo ); }; const AddOrderDialogContent = ({ swapBack }: { swapBack: () => void }) => { const { servizioId, userId } = useServizio(); const { data, isLoading } = api.prezziario.getPrezziario.useQuery(); if (isLoading) return ; if (!data) return ( <> Errore nel caricamento del prezziario. ); return ( ); }; export const ServizioPacksInfos = () => { const { servizio } = useServizio(); const { t } = useTranslation(); const { data: packs } = api.servizio.getPacksSolution.useQuery({ servizioId: servizio.servizio_id, }); if (!packs) return null; return ( {t.servizio.prezzi.sub}
{packs.acconto.success ? ( <> {packs.acconto.pack.nome_it} {packs.acconto.pack.desc_it} {formatCurrency(packs.acconto.pack.prezzo_cent / 100)} COD: {packs.acconto.pack.idprezziario} ) : ( {packs.acconto.message} )}
{packs.saldo.success ? ( <> {packs.saldo.pack.nome_it} {packs.saldo.pack.desc_it} {formatCurrency(packs.saldo.pack.prezzo_cent / 100)} COD: {packs.saldo.pack.idprezziario} ) : ( {packs.saldo.message} )}
{servizio.tipologia === TipologiaPosizioneEnum.Stabile && (
<> {t.servizio.prezzi.consulenza} {t.servizio.prezzi.consulenza_desc} {t.servizio.prezzi.gotoprezzi}
)}
); }; const AddAnnuncio = ({ servizioId, }: { servizioId: ServizioServizioId; userId: UsersId; }) => { const { data: codici, isLoading: loading } = api.servizio.getAnnunciAvailableToAdd.useQuery({ servizioId, }); const [selectedAnnunci, setSelectedAnnunci] = useState< { value: AnnunciId; label: string }[] >([]); const [openModal, setOpenModal] = useState(false); const utils = api.useUtils(); const { mutate } = api.servizio.addServizioAnnunci.useMutation({ onError: (error) => { console.error(error); toast.error("Errore durante l'aggiunta dell'annuncio"); }, onSuccess: async () => { await utils.servizio.invalidate(); toast.success("Annuncio aggiunto"); setOpenModal(false); setSelectedAnnunci([]); }, }); return ( { if (selectedAnnunci.length !== 0) { e.preventDefault(); // Prevent closing the dialog if there are selected announcements } }} > Aggiungi annuncio Salva un annuncio nella ricerca dell'utente
{loading ? ( ) : ( { setSelectedAnnunci( value.map((v) => ({ label: v.label, value: parseInt(v.value) as AnnunciId, })), ); }} options={ codici?.map((cod) => ({ label: `${cod.codice} - ${cod.titolo_it}`, value: cod.id.toString(), })) || [] } placeholder="" /> )}
); }; const InterruzioneServizio = () => { const { servizio, isAdmin } = useServizio(); const { t } = useTranslation(); const beforeInterruzioneLimit = servizio.decorrenza != null && new Date() <= add(servizio.decorrenza, { days: 14, }); const utils = api.useUtils(); const { mutate } = api.servizio.interruzioneServizio.useMutation({ onError: (error) => { console.error(error); toast.error("Errore durante la richiesta di interruzione"); }, onSuccess: async () => { await utils.servizio.invalidate(); toast.success("Interruzione richiesta"); }, }); return ( {t.servizio.interruzione.title} {t.servizio.interruzione.description} {t.annulla} mutate({ servizioId: servizio.servizio_id })} > {t.conferma} ); }; const EditParametri = () => { const { servizioId, isAdmin, servizio } = useServizio(); const { t } = useTranslation(); const [openEditParametri, setOpenEditParametri] = useState(false); const utils = api.useUtils(); const { mutate: update } = api.servizio.updateServizio.useMutation({ onError: (error) => { toast.error(error.message); }, onSuccess: async () => { toast.success("Servizio modificato con successo"); await utils.servizio.invalidate(); setOpenEditParametri(false); }, }); function onSubmit(fields: FormValues) { update({ data: { ...fields, }, servizioId, }); } return ( {t.servizio.parametri.title} {t.servizio.parametri.title} ); }; const EditServizioAdmin = () => { const { servizioId, userId, servizio } = useServizio(); const [open, setOpen] = useState(false); const utils = api.useUtils(); const router = useRouter(); const { mutate: update } = api.servizio.updateServizio.useMutation({ onError: (error) => { toast.error(error.message); }, onSuccess: async () => { toast.success("Servizio modificato con successo"); await utils.servizio.invalidate(); setOpen(false); }, }); const { mutate: remove } = api.servizio.deleteServizio.useMutation({ onError: (error) => { toast.error(error.message); }, onMutate: async () => { await router.push(`/area-riservata/admin/user-view/ricerca/${userId}`); }, onSuccess: async () => { toast.success("Servizio rimosso con successo"); await utils.servizio.invalidate(); }, }); function onSubmit(fields: EditFormValues) { update({ data: { ...fields, }, servizioId, }); } return ( Modifica Servizio Admin Modifica {(() => { const { annunci, ...rest } = servizio; return
{JSON.stringify(rest, null, 2)}
; })()}
{ remove({ servizioId }); }} title="Elimina servizio" >
); };