netgescon-day0/app/Modules/Contabilita/Views/index.blade.php

316 lines
15 KiB
PHP

@extends('modules.layouts.base')
@php
$moduleTitle = 'Contabilità';
$moduleIcon = 'fas fa-calculator';
$moduleBreadcrumb = 'Moduli > Contabilità';
@endphp
@section('module-actions')
<div class="btn-group" role="group">
@can('contabilita_create')
<a href="{{ route('contabilita.create') }}" class="btn btn-module-primary">
<i class="fas fa-plus me-1"></i>
Nuova Registrazione
</a>
@endcan
@can('contabilita_export')
<form method="POST" action="{{ route('contabilita.export') }}" style="display: inline;">
@csrf
<button type="submit" class="btn netgescon-btn netgescon-netgescon-btn netgescon-netgescon-btn netgescon-netgescon-btn netgescon-netgescon-btn netgescon-btn-outline-success">
<i class="fas fa-file-export me-1"></i>
Esporta
</button>
</form>
@endcan
<button type="button" class="btn netgescon-btn netgescon-netgescon-btn netgescon-netgescon-btn netgescon-netgescon-btn netgescon-netgescon-btn netgescon-btn-outline-secondary dropdown-toggle" data-bs-toggle="dropdown">
<i class="fas fa-cog"></i>
</button>
<ul class="dropdown-menu">
@can('contabilita_settings')
<li><a class="dropdown-item" href="#"><i class="fas fa-cog me-2"></i>Impostazioni</a></li>
@endcan
<li><a class="dropdown-item" href="#"><i class="fas fa-question-circle me-2"></i>Aiuto</a></li>
</ul>
</div>
@endsection
@section('module-content')
<div class="grid md:grid-cols-12 gap-4 mb-4">
<!-- Statistiche Rapide -->
<div class="col-xl-3 col-md-6 mb-3">
<div class="module-stats-card">
<div class="card-body text-center">
<div class="module-stats-number text-primary">{{ number_format($stats['total_entries']) }}</div>
<div class="module-stats-label">Registrazioni Totali</div>
</div>
</div>
</div>
<div class="col-xl-3 col-md-6 mb-3">
<div class="module-stats-card">
<div class="card-body text-center">
<div class="module-stats-number text-success">{{ number_format($stats['confirmed_entries']) }}</div>
<div class="module-stats-label">Confermate</div>
</div>
</div>
</div>
<div class="col-xl-3 col-md-6 mb-3">
<div class="module-stats-card">
<div class="card-body text-center">
<div class="module-stats-number text-info">{{ number_format($stats['this_month']) }}</div>
<div class="module-stats-label">Questo Mese</div>
</div>
</div>
</div>
<div class="col-xl-3 col-md-6 mb-3">
<div class="module-stats-card">
<div class="card-body text-center">
<div class="module-stats-number text-warning">{{ number_format($stats['total_movements']) }}</div>
<div class="module-stats-label">Movimenti</div>
</div>
</div>
</div>
</div>
<!-- Filtri di Ricerca -->
<div class="module-card mb-4">
<div class="module-card-header">
<h6 class="module-card-title mb-0">
<i class="fas fa-search me-2"></i>Filtri di Ricerca
</h6>
</div>
<div class="module-card-body">
<form method="GET" action="{{ route('contabilita.index') }}">
<div class="grid md:grid-cols-12 gap-4 g-3">
<div class="col-md-4">
<label for="search" class="form-label">Ricerca Generale</label>
<input type="text"
class="netgescon-input"
id="search"
name="search"
value="{{ request('search') }}"
placeholder="Descrizione, numero documento..."
data-bs-toggle="tooltip"
title="Ricerca nei campi principali">
</div>
<div class="col-md-3">
<label for="status" class="form-label">Stato</label>
<select class="form-select" id="status" name="status">
<option value="">Tutti gli stati</option>
<option value="draft" {{ request('status') == 'draft' ? 'selected' : '' }}>Bozza</option>
<option value="confirmed" {{ request('status') == 'confirmed' ? 'selected' : '' }}>Confermata</option>
<option value="cancelled" {{ request('status') == 'cancelled' ? 'selected' : '' }}>Annullata</option>
</select>
</div>
<div class="col-md-3">
<label for="gestione_id" class="form-label">Gestione</label>
<select class="form-select" id="gestione_id" name="gestione_id">
<option value="">Tutte le gestioni</option>
@foreach($gestioni as $gestione)
<option value="{{ $gestione->id_gestione }}" {{ request('gestione_id') == $gestione->id_gestione ? 'selected' : '' }}>
{{ $gestione->anno_gestione }} - {{ $gestione->tipo_gestione }}
</option>
@endforeach
</select>
</div>
<div class="col-md-2 flex items-end">
<div class="btn-group w-100">
<button type="submit" class="btn netgescon-btn netgescon-netgescon-btn netgescon-netgescon-btn netgescon-netgescon-btn netgescon-netgescon-btn netgescon-btn-primary">
<i class="fas fa-search"></i> Filtra
</button>
<a href="{{ route('contabilita.index') }}" class="btn netgescon-btn netgescon-netgescon-btn netgescon-netgescon-btn netgescon-netgescon-btn netgescon-netgescon-btn netgescon-btn-outline-secondary">
<i class="fas fa-times"></i>
</a>
</div>
</div>
</div>
</form>
</div>
</div>
<!-- Tabella Registrazioni -->
<div class="module-card">
<div class="module-card-header flex justify-between items-center">
<h6 class="module-card-title mb-0">
<i class="fas fa-list me-2"></i>Elenco Registrazioni Contabili
</h6>
<small class="text-gray-500">{{ $entries->total() }} registrazioni trovate</small>
</div>
<div class="module-card-body p-0">
@if($entries->count() > 0)
<div class="table-responsive">
<table class="table table-hover mb-0">
<thead class="table-light">
<tr>
<th>Data</th>
<th> Documento</th>
<th>Descrizione</th>
<th>Gestione</th>
<th>Stato</th>
<th>Creato da</th>
<th width="150">Azioni</th>
</tr>
</thead>
<tbody>
@foreach($entries as $entry)
<tr>
<td>
<strong>{{ \Carbon\Carbon::parse($entry->entry_date)->format('d/m/Y') }}</strong>
</td>
<td>
@if($entry->document_number)
<span class="badge bg-gray-100 text-gray-900">{{ $entry->document_number }}</span>
@else
<span class="text-gray-500">-</span>
@endif
</td>
<td>
<div class="text-truncate" style="max-width: 300px;"
data-bs-toggle="tooltip"
title="{{ $entry->description }}">
{{ Str::limit($entry->description, 50) }}
</div>
@if($entry->document_type != 'REG')
<small class="text-gray-500">({{ $entry->document_type }})</small>
@endif
</td>
<td>
<small class="text-gray-500">
{{ $entry->anno_gestione }} - {{ $entry->tipo_gestione }}
</small>
</td>
<td>
@switch($entry->status)
@case('confirmed')
<span class="netgescon-badge netgescon-badge-success">Confermata</span>
@break
@case('draft')
<span class="netgescon-badge netgescon-badge-warning">Bozza</span>
@break
@case('cancelled')
<span class="netgescon-badge netgescon-badge-danger">Annullata</span>
@break
@default
<span class="badge bg-gray-100 text-gray-900">{{ ucfirst($entry->status) }}</span>
@endswitch
</td>
<td>
<small class="text-gray-500">
{{ $entry->created_by_name ?? 'N/A' }}
<br>
<span data-bs-toggle="tooltip"
title="{{ $entry->created_at }}">
{{ \Carbon\Carbon::parse($entry->created_at)->format('d/m H:i') }}
</span>
</small>
</td>
<td>
<div class="btn-group btn-group-sm">
@can('contabilita_view')
<a href="{{ route('contabilita.show', $entry->id) }}"
class="btn netgescon-btn netgescon-netgescon-btn netgescon-netgescon-btn netgescon-netgescon-btn netgescon-netgescon-btn netgescon-btn-outline-primary btn-sm"
data-bs-toggle="tooltip"
title="Visualizza">
<i class="fas fa-eye"></i>
</a>
@endcan
@can('contabilita_edit')
<a href="{{ route('contabilita.edit', $entry->id) }}"
class="btn netgescon-btn netgescon-netgescon-btn netgescon-netgescon-btn netgescon-netgescon-btn netgescon-netgescon-btn netgescon-btn-outline-warning btn-sm"
data-bs-toggle="tooltip"
title="Modifica">
<i class="fas fa-edit"></i>
</a>
@endcan
@can('contabilita_delete')
<form method="POST"
action="{{ route('contabilita.destroy', $entry->id) }}"
style="display: inline;"
onsubmit="return confirm('Sei sicuro di voler eliminare questa registrazione?')">
@csrf
@method('DELETE')
<button type="submit"
class="btn netgescon-btn netgescon-netgescon-btn netgescon-netgescon-btn netgescon-netgescon-btn netgescon-netgescon-btn netgescon-btn-outline-danger btn-sm"
data-bs-toggle="tooltip"
title="Elimina">
<i class="fas fa-trash"></i>
</button>
</form>
@endcan
</div>
</td>
</tr>
@endforeach
</tbody>
</table>
</div>
<!-- Pagination -->
@if($entries->hasPages())
<div class="card-footer bg-gray-100">
<div class="flex justify-between items-center">
<div class="text-gray-500 small">
Showing {{ $entries->firstItem() }} to {{ $entries->lastItem() }} of {{ $entries->total() }} results
</div>
{{ $entries->links() }}
</div>
</div>
@endif
@else
<!-- Empty State -->
<div class="module-empty-state">
<div class="text-center py-5">
<i class="fas fa-calculator fa-3x text-gray-500 mb-3"></i>
<h4 class="text-gray-500">Nessuna registrazione trovata</h4>
<p class="text-gray-500 mb-4">
@if(request()->hasAny(['search', 'status', 'gestione_id']))
Prova a modificare i filtri di ricerca o
<a href="{{ route('contabilita.index') }}">rimuovi tutti i filtri</a>.
@else
Non ci sono ancora registrazioni contabili da visualizzare.
@endif
</p>
@can('contabilita_create')
<a href="{{ route('contabilita.create') }}" class="btn btn-module-primary">
<i class="fas fa-plus me-1"></i>
Crea la prima registrazione
</a>
@endcan
</div>
</div>
@endif
</div>
</div>
@endsection
@push('scripts')
<script>
document.addEventListener('DOMContentLoaded', function() {
// Inizializza tooltip
var tooltipTriggerList = [].slice.call(document.querySelectorAll('[data-bs-toggle="tooltip"]'));
var tooltipList = tooltipTriggerList.map(function (tooltipTriggerEl) {
return new bootstrap.Tooltip(tooltipTriggerEl);
});
// Auto-submit form su cambio select
document.querySelectorAll('select[name="status"], select[name="gestione_id"]').forEach(function(select) {
select.addEventListener('change', function() {
this.form.submit();
});
});
});
</script>
@endpush