import { format } from "date-fns"; import { CircleCheck, ClipboardPaste, FlaskConical, Pen, Trash2, Wrench, } from "lucide-react"; import Link from "next/link"; import { useState } from "react"; import toast from "react-hot-toast"; import { useDebounce } from "react-use"; import z from "zod"; import { formatCurrency } from "~/lib/utils"; import { useTranslation } from "~/providers/I18nProvider"; import { useServizio, useServizioAnnuncio } from "~/providers/ServizioProvider"; import TipologiaPosizioneEnum from "~/schemas/public/TipologiaPosizioneEnum"; import type { UsersStorageUserStorageId } from "~/schemas/public/UsersStorage"; import { api } from "~/utils/api"; import { Confirm } from "../confirm"; import { Credenza, CredenzaBody, CredenzaClose, CredenzaContent, CredenzaDescription, CredenzaFooter, CredenzaHeader, CredenzaTitle, CredenzaTrigger, } from "../custom_ui/credenza"; import { NumberInput } from "../custom_ui/InputNumber"; import { type ListOption, MultiSelect, UnpackOptions, } from "../custom_ui/multiselect"; import { LoadingPage } from "../loading"; import { Button } from "../ui/button"; import { Card, CardContent, CardDescription, CardFooter, CardHeader, CardTitle, } from "../ui/card"; import { Label } from "../ui/label"; import { Popover, PopoverContent, PopoverTrigger } from "../ui/popover"; import { Switch } from "../ui/switch"; import { UploadModal } from "../upload_modal"; import { DocCombo, DocInfo } from "./shared"; export const AdminLavoraConferma = () => { const { servizio } = useServizio(); const { data } = useServizioAnnuncio(); return ( Lavorazione conferma Consegna status modal
{servizio.tipologia === TipologiaPosizioneEnum.Transitorio && ( )}
); }; const DebugActions = () => { const { servizioId, userId } = useServizio(); const { annuncioId } = useServizioAnnuncio(); const utils = api.useUtils(); const { mutate } = api.servizio.updateServizioAnnunci.useMutation({ onError: (error) => { toast.error(error.message); }, onSuccess: async () => { await utils.servizio.getAllServizioAnnunci.invalidate({ userId: userId, }); await utils.servizio.getServizio.invalidate({ servizioId, }); toast.success("Dati salvati con successo"); }, }); return ( { mutate({ annuncioId, servizioId, data: { user_confirmed_at: null, }, }); }} title="Elimina annuncio" > ); }; const DocSection = () => { const { userId } = useServizio(); const { data, updateServizioAnnunci } = useServizioAnnuncio(); const utils = api.useUtils(); // const { mutate: updateServizio } = api.servizio.UpdateConfermaDoc.useMutation( // { // onError: (error) => { // toast.error(error.message); // }, // onSuccess: async () => { // await utils.servizio.getAllServizioAnnunci.invalidate({ userId }); // await utils.servizio.getServizio.invalidate({ // servizioId, // }); // toast.success("Dati salvati con successo"); // }, // }, // ); const { data: files, isLoading } = api.storage.getAll.useQuery(); const { mutate: setUserStorage } = api.storage.addUserStorageEntry.useMutation({ onSuccess: async () => { await utils.storage.retrieveUserFileData.invalidate({ userId, }); await utils.storage.getAll.invalidate(); }, }); if (isLoading) return ; if (files === undefined) { return

Errore nel caricamento dei documenti

; } return ( Documento di Conferma documento che l'utente vedra alla conferma {data.doc_conferma_ref && (
)}
{ await updateServizioAnnunci({ doc_conferma_added: true, doc_conferma_ref: f.id, }); setUserStorage({ storageId: f.id, userId, }); }} />
); }; const CaparraSchema = z.object({ caparra_causale: z.string().nullable(), caparra_iban: z.string().nullable(), caparra_importo: z.string().nullable(), caparra_intestazione: z.string().nullable(), }); type CaparraObj = z.infer; const parseCaparra = (ingest: string) => { let parsedJson: unknown; try { parsedJson = JSON.parse(ingest); } catch { toast.error( 'Stringa non valida, clicca "copia stringa" nel gestionale e poi questo pulsante', ); return undefined; } const parsed = CaparraSchema.safeParse(parsedJson); if (parsed.success) { return parsed.data; } console.error("Invalid caparra format:", parsed.error); return undefined; }; const Caparra = () => { const { data, updateServizioAnnunci } = useServizioAnnuncio(); const [caparra, setCaparra] = useState({ caparra_causale: data.caparra_causale, caparra_iban: data.caparra_iban, caparra_importo: data.caparra_importo, caparra_intestazione: data.caparra_intestazione, }); const handleSave = async () => { await updateServizioAnnunci({ caparra_causale: caparra?.caparra_causale || null, caparra_iban: caparra?.caparra_iban || null, caparra_importo: caparra?.caparra_importo || null, caparra_intestazione: caparra?.caparra_intestazione || null, }); }; return ( Dati Pagamento Caparra dati per il pagamento della caparra, da mostrare all'utente
{caparra ? (

Intestazione: {caparra.caparra_intestazione}{" "}

IBAN: {caparra.caparra_iban}{" "}

Importo: {caparra.caparra_importo}{" "}

Causale: {caparra.caparra_causale}{" "}

) : (

Inserisci la stringa dal gestionale e elabora

)}
); }; const MotivazioneSection = () => { const { servizioId } = useServizio(); const { t } = useTranslation(); const { data: servizio } = api.servizio.getServizio.useQuery({ servizioId }); if (!servizio) return null; return ( Motivazione di transitorietà Informazioni relative alla motivazione di transitorietà inserite dall'utente

Motivazione specificata: {servizio.motivazione_transitorio ? ( { t.preferenze.motivazioni_mappings.find( (m) => m.id === servizio.motivazione_transitorio, )?.title } ) : ( Non inserita )}

Data scadenza motivazione inserita:{" "} {servizio.scadenza_motivazione_transitoria ? ( format(servizio.scadenza_motivazione_transitoria, "dd/MM/yyyy") ) : ( Non inserita )}

Documento caricato: {servizio.doc_motivazione_ref ? ( ) : ( Non caricato )}

); }; const FileLink = ({ userStorageId, }: { userStorageId: UsersStorageUserStorageId; }) => { const { data: storageId } = api.storage.getStorageIdFromUserStorageId.useQuery({ userStorageId, }); if (!storageId) return null; return ( Vedi documento ); }; const TransitorioSection = () => { const { servizio } = useServizio(); const { data } = useServizioAnnuncio(); const { t } = useTranslation(); const { servizioId, userId } = useServizio(); 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.getUserServizi.invalidate(); await utils.servizio.getAllServizioAnnunci.invalidate({ userId }); }, }); const handlePermanenzaChange = (value: ListOption) => { update({ servizioId, data: { permanenza: value.value !== "" ? parseInt(value.value) : null, }, }); }; const preferenzeDescrizione = data.desc_it?.match(/Permanenza:.*$/m); return (

Permanenza in descrizione: {preferenzeDescrizione ? preferenzeDescrizione[0] : "errore: testo non trovato in descrizione"}

); }; const StabileSection = () => { const { servizio, servizioId, userId } = useServizio(); const { data } = useServizioAnnuncio(); const [value, setValue] = useState(servizio.budget); 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.getUserServizi.invalidate(); await utils.servizio.getAllServizioAnnunci.invalidate({ userId }); }, }); useDebounce( () => { if (value === servizio.budget) return; update({ servizioId, data: { budget: value, }, }); }, 1000, [value], ); return (
Budget (da preferenze servizio): { if (val !== undefined) { setValue(val); } }} stepper={50} suffix=" €" value={value} />

Prezzo in descrizione: {formatCurrency(data.prezzo / 100)}

); }; const SendConferma = () => { const { servizio } = useServizio(); const { data } = useServizioAnnuncio(); const [check, setCheck] = useState(data.hasConfermaAdmin); const utils = api.useUtils(); const { mutate: handleUpdate } = api.servizio.adminUpdateConfermaStatus.useMutation({ onSuccess: async () => { await utils.servizio.getAllServizioAnnunci.invalidate(); await utils.servizio.getServizio.invalidate({ servizioId: servizio.servizio_id, }); toast.success("Status aggiornato con successo"); }, onError: (error) => { toast.error(`Errore durante l'aggiornamento: ${error.message}`); }, }); return ( Lavorazione Conferma controlla i parametri di ricerca prima!

Tipologia servizio: {servizio.tipologia}

{servizio.tipologia === TipologiaPosizioneEnum.Transitorio ? ( ) : ( )}
{ setCheck(c); }} />
); };