netgescon-day0/resources/views/filament/pages/fornitore/ticket-intervento-scheda.blade.php

251 lines
16 KiB
PHP

<x-filament-panels::page>
@php($ticket = $this->intervento->ticket)
<div class="space-y-4">
<div class="rounded-xl border bg-white p-4">
<div class="flex flex-wrap items-start justify-between gap-3">
<div>
<div class="text-lg font-semibold">Intervento ticket #{{ $this->intervento->ticket_id }}</div>
<div class="mt-1 text-sm text-gray-600">{{ $ticket->titolo ?? '-' }} · {{ $ticket->stabile->denominazione ?? '-' }}</div>
<div class="mt-2 text-xs text-gray-500">Fornitore: {{ $this->fornitore->ragione_sociale ?: trim(($this->fornitore->nome ?? '') . ' ' . ($this->fornitore->cognome ?? '')) }}</div>
</div>
<div class="flex flex-wrap gap-2">
<a href="{{ $this->getTicketsUrl() }}" class="inline-flex items-center rounded-md bg-gray-800 px-3 py-1.5 text-xs font-medium text-white hover:bg-gray-700">Torna ai ticket</a>
<a href="{{ $this->getCollaboratoriUrl() }}" class="inline-flex items-center rounded-md bg-primary-600 px-3 py-1.5 text-xs font-medium text-white hover:bg-primary-500">Collaboratori</a>
</div>
</div>
</div>
<div class="grid gap-4 xl:grid-cols-3">
<div class="space-y-4 xl:col-span-2">
<div class="rounded-xl border bg-white p-4">
<div class="text-sm font-semibold">Scheda segnalazione</div>
<div class="mt-3 grid gap-3 md:grid-cols-2">
<div>
<div class="text-xs uppercase tracking-wide text-gray-500">Richiedente</div>
<div class="mt-1 text-sm">{{ $caller['contatto'] ?: '-' }}</div>
</div>
<div>
<div class="text-xs uppercase tracking-wide text-gray-500">Telefono</div>
<div class="mt-1 text-sm">
@if($caller['telefono'] !== '')
<a href="tel:{{ preg_replace('/\s+/', '', (string) $caller['telefono']) }}" class="text-primary-600 hover:underline">{{ $caller['telefono'] }}</a>
@else
-
@endif
</div>
</div>
<div>
<div class="text-xs uppercase tracking-wide text-gray-500">Email</div>
<div class="mt-1 text-sm">
@if($caller['email'] !== '')
<a href="mailto:{{ $caller['email'] }}" class="text-primary-600 hover:underline">{{ $caller['email'] }}</a>
@else
-
@endif
</div>
</div>
<div>
<div class="text-xs uppercase tracking-wide text-gray-500">Origine dato</div>
<div class="mt-1 text-sm">{{ $caller['sorgente'] !== '' ? $caller['sorgente'] : '-' }}</div>
</div>
<div>
<div class="text-xs uppercase tracking-wide text-gray-500">Stato intervento</div>
<div class="mt-1 text-sm">{{ $this->intervento->stato }}</div>
</div>
<div>
<div class="text-xs uppercase tracking-wide text-gray-500">Operatore</div>
<div class="mt-1 text-sm">{{ $this->intervento->operatore_assegnato_label }}</div>
</div>
<div class="md:col-span-2">
<div class="text-xs uppercase tracking-wide text-gray-500">Riferimento stabile</div>
<div class="mt-1 text-sm">{{ $caller['riferimento'] !== '' ? $caller['riferimento'] : '-' }}</div>
</div>
</div>
<div class="mt-4 whitespace-pre-wrap rounded-lg bg-gray-50 p-3 text-sm text-gray-700">{{ $ticket->descrizione }}</div>
</div>
<div class="rounded-xl border bg-white p-4">
<div class="flex flex-wrap items-center justify-between gap-2">
<div class="text-sm font-semibold">Operativo e rapportino</div>
@if($this->intervento->stato === 'assegnato')
<x-filament::button size="sm" wire:click="startIntervento">Prendi in carico</x-filament::button>
@endif
</div>
@if($this->canAssignDipendente())
<div class="mt-4 rounded-lg border border-dashed p-3">
<div class="text-xs uppercase tracking-wide text-gray-500">Assegnazione operatore</div>
<div class="mt-2 flex flex-wrap items-end gap-3">
<label class="block min-w-72 flex-1 text-sm">
<span class="mb-1 block font-medium">Collaboratore incaricato</span>
<select wire:model="dipendenteId" class="w-full rounded-lg border-gray-300">
<option value="">Responsabile fornitore / non assegnato</option>
@foreach($dipendentiOptions as $option)
<option value="{{ $option['id'] }}">{{ $option['label'] }}</option>
@endforeach
</select>
</label>
<x-filament::button color="gray" wire:click="assignDipendente">Salva assegnazione</x-filament::button>
</div>
</div>
@endif
<div class="mt-4 grid gap-3 md:grid-cols-3">
<label class="block text-sm">
<span class="mb-1 block font-medium">Marca apparato</span>
<input type="text" wire:model.defer="apparatoMarca" class="w-full rounded-lg border-gray-300" />
</label>
<label class="block text-sm">
<span class="mb-1 block font-medium">Modello</span>
<input type="text" wire:model.defer="apparatoModello" class="w-full rounded-lg border-gray-300" />
</label>
<label class="block text-sm">
<span class="mb-1 block font-medium">Seriale</span>
<input type="text" wire:model.defer="apparatoSeriale" class="w-full rounded-lg border-gray-300" />
</label>
</div>
<label class="mt-4 block text-sm">
<span class="mb-1 block font-medium">Rapporto intervento</span>
<textarea wire:model.defer="rapportoFornitore" rows="6" class="w-full rounded-lg border-gray-300"></textarea>
</label>
<div class="mt-4 grid gap-3 md:grid-cols-2">
<label class="block text-sm">
<span class="mb-1 block font-medium">Tempo impiegato (minuti)</span>
<input type="number" min="1" max="1440" wire:model.defer="tempoMinuti" class="w-full rounded-lg border-gray-300" />
</label>
<label class="block text-sm">
<span class="mb-1 block font-medium">QR token</span>
<input type="text" wire:model.defer="qrToken" class="w-full rounded-lg border-gray-300" placeholder="Inserisci il codice se scansionato" />
</label>
</div>
<div class="mt-4 grid gap-2 md:grid-cols-3">
@foreach($articoliUtilizzati as $index => $item)
<label class="block text-sm">
<span class="mb-1 block font-medium">Ricambio/attivita {{ $index + 1 }}</span>
<input type="text" wire:model.defer="articoliUtilizzati.{{ $index }}" class="w-full rounded-lg border-gray-300" />
</label>
@endforeach
</div>
<div class="mt-4 grid gap-3 md:grid-cols-2">
<label class="block text-sm">
<span class="mb-1 block font-medium">Foto lavoro</span>
<input type="file" wire:model="fotoLavoro" multiple accept="image/*" class="w-full rounded-lg border-gray-300 text-sm" />
</label>
<label class="block text-sm">
<span class="mb-1 block font-medium">Documenti lavoro</span>
<input type="file" wire:model="documentiLavoro" multiple accept=".pdf,.doc,.docx,.xls,.xlsx,.txt,image/*" class="w-full rounded-lg border-gray-300 text-sm" />
</label>
</div>
<div class="mt-4 grid gap-2 md:grid-cols-2">
@foreach($descrizioneFile as $index => $item)
<label class="block text-sm">
<span class="mb-1 block font-medium">Descrizione file {{ $index + 1 }}</span>
<input type="text" wire:model.defer="descrizioneFile.{{ $index }}" class="w-full rounded-lg border-gray-300" />
</label>
@endforeach
</div>
<div class="mt-4 grid gap-3 md:grid-cols-2">
<label class="block text-sm">
<span class="mb-1 block font-medium">Messaggio veloce allo studio</span>
<textarea wire:model.defer="messaggioVeloce" rows="3" class="w-full rounded-lg border-gray-300"></textarea>
</label>
<div class="grid gap-3">
<label class="block text-sm">
<span class="mb-1 block font-medium">Codice proforma</span>
<input type="text" wire:model.defer="proformaCodice" class="w-full rounded-lg border-gray-300" />
</label>
<label class="block text-sm">
<span class="mb-1 block font-medium">Note proforma</span>
<textarea wire:model.defer="proformaNote" rows="3" class="w-full rounded-lg border-gray-300"></textarea>
</label>
</div>
</div>
<div class="mt-4 flex flex-wrap gap-4 text-sm">
<label class="inline-flex items-center gap-2">
<input type="checkbox" wire:model="richiestaProforma" class="rounded border-gray-300" />
<span>Richiesta proforma</span>
</label>
<label class="inline-flex items-center gap-2">
<input type="checkbox" wire:model="lavoroStandard" class="rounded border-gray-300" />
<span>Lavoro standard gia autorizzato</span>
</label>
</div>
<div class="mt-4 flex flex-wrap gap-2">
<x-filament::button wire:click="saveRapporto">Salva avanzamento</x-filament::button>
<x-filament::button color="gray" wire:click="inviaSollecito">Invia sollecito</x-filament::button>
</div>
</div>
<div class="rounded-xl border bg-white p-4">
<div class="text-sm font-semibold">Comunicazioni ticket</div>
<div class="mt-3 space-y-2">
@forelse($ticket->messages as $msg)
<div class="rounded-lg border p-3 text-sm">
<div class="font-medium">{{ $msg->user->name ?? 'Sistema' }}</div>
<div class="mt-1 whitespace-pre-wrap text-gray-700">{{ $msg->messaggio }}</div>
<div class="mt-1 text-xs text-gray-500">{{ optional($msg->created_at)->format('d/m/Y H:i') }}</div>
</div>
@empty
<div class="text-sm text-gray-500">Nessuna comunicazione disponibile.</div>
@endforelse
</div>
</div>
</div>
<div class="space-y-4">
<div class="rounded-xl border bg-white p-4">
<div class="text-sm font-semibold">Stato operativo</div>
<div class="mt-3 space-y-2 text-sm">
<div><span class="font-medium">Stato:</span> {{ $this->intervento->stato }}</div>
<div><span class="font-medium">Iniziato:</span> {{ optional($this->intervento->iniziato_at)->format('d/m/Y H:i') ?: '-' }}</div>
<div><span class="font-medium">Terminato:</span> {{ optional($this->intervento->terminato_at)->format('d/m/Y H:i') ?: '-' }}</div>
<div><span class="font-medium">Rif. chiusura:</span> {{ $this->intervento->riferimento_chiusura ?: '-' }}</div>
<div><span class="font-medium">QR registrato:</span> {{ $this->intervento->qr_token ?: '-' }}</div>
</div>
</div>
<div class="rounded-xl border bg-white p-4">
<div class="text-sm font-semibold">Allegati ticket</div>
<div class="mt-3 space-y-2">
@forelse($ticket->attachments as $attachment)
<div class="rounded-lg border p-3 text-sm">
<div class="font-medium">{{ $attachment->original_file_name }}</div>
<div class="text-xs text-gray-500">{{ $attachment->description ?: 'Nessuna descrizione' }}</div>
<div class="mt-1 text-xs text-gray-500">Caricato da {{ $attachment->user->name ?? 'Sistema' }} il {{ optional($attachment->created_at)->format('d/m/Y H:i') ?: '-' }}</div>
<a href="{{ route('filament.tickets.attachments.view', ['attachment' => (int) $attachment->id]) }}" target="_blank" class="mt-2 inline-flex text-xs font-medium text-primary-600 hover:underline">Apri allegato</a>
</div>
@empty
<div class="text-sm text-gray-500">Nessun allegato disponibile. Se il ticket e stato creato senza file persistiti, qui non verra mostrato nulla finche non vengono caricati allegati reali.</div>
@endforelse
</div>
</div>
<div class="rounded-xl border bg-white p-4">
<div class="text-sm font-semibold">Storico correlato</div>
<div class="mt-3 space-y-2">
@forelse($storicoRows as $row)
<div class="rounded-lg border p-3 text-sm">
<div class="font-medium">#{{ $row['ticket_id'] }} - {{ $row['titolo'] }}</div>
<div class="text-xs text-gray-500">{{ $row['stato'] }} · {{ $row['updated_at'] }}</div>
@if($row['note'] !== '')
<div class="mt-1 text-xs text-gray-600">{{ \Illuminate\Support\Str::limit($row['note'], 90) }}</div>
@endif
</div>
@empty
<div class="text-sm text-gray-500">Nessuno storico correlato.</div>
@endforelse
</div>
</div>
</div>
</div>
</div>
</x-filament-panels::page>