316 lines
15 KiB
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>N° 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
|