Implementate tutte le viste UI per gestione ripartizioni spese e rate
- Aggiunte viste complete per ripartizioni-spesa: create, edit, show - Aggiunte viste complete per piani-rateizzazione: index, create, edit, show - Aggiunte viste complete per rate: index, create, edit, show - Interfacce responsive con Bootstrap 5 e componenti interattivi - Tabelle DataTables con filtri avanzati e ricerca - Form validation completa con Select2 e date picker - Grafici Chart.js per statistiche e monitoraggio - Funzionalità AJAX per calcoli automatici e aggiornamenti - Design mobile-first con sidebar navigation aggiornata - Tutte le viste pronte per integrazione con controller esistenti
This commit is contained in:
parent
15e0be69ee
commit
c23b711039
335
resources/views/admin/piani-rateizzazione/create.blade.php
Normal file
335
resources/views/admin/piani-rateizzazione/create.blade.php
Normal file
|
|
@ -0,0 +1,335 @@
|
||||||
|
@extends('layouts.app')
|
||||||
|
|
||||||
|
@section('title', 'Nuovo Piano di Rateizzazione')
|
||||||
|
|
||||||
|
@section('content')
|
||||||
|
<div class="container-fluid">
|
||||||
|
<div class="row">
|
||||||
|
<div class="col-12">
|
||||||
|
<div class="card">
|
||||||
|
<div class="card-header">
|
||||||
|
<h3 class="card-title">Nuovo Piano di Rateizzazione</h3>
|
||||||
|
<div class="card-tools">
|
||||||
|
<a href="{{ route('admin.piani-rateizzazione.index') }}" class="btn btn-default btn-sm">
|
||||||
|
<i class="fas fa-arrow-left"></i> Torna all'elenco
|
||||||
|
</a>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<form action="{{ route('admin.piani-rateizzazione.store') }}" method="POST">
|
||||||
|
@csrf
|
||||||
|
<div class="card-body">
|
||||||
|
<div class="row">
|
||||||
|
<div class="col-md-6">
|
||||||
|
<div class="form-group">
|
||||||
|
<label for="denominazione">Denominazione *</label>
|
||||||
|
<input type="text" class="form-control @error('denominazione') is-invalid @enderror"
|
||||||
|
id="denominazione" name="denominazione"
|
||||||
|
value="{{ old('denominazione') }}" required>
|
||||||
|
@error('denominazione')
|
||||||
|
<div class="invalid-feedback">{{ $message }}</div>
|
||||||
|
@enderror
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="col-md-6">
|
||||||
|
<div class="form-group">
|
||||||
|
<label for="ripartizione_id">Ripartizione Spesa *</label>
|
||||||
|
<select class="form-control select2 @error('ripartizione_id') is-invalid @enderror"
|
||||||
|
id="ripartizione_id" name="ripartizione_id" required>
|
||||||
|
<option value="">Seleziona una ripartizione</option>
|
||||||
|
@foreach($ripartizioni as $ripartizione)
|
||||||
|
<option value="{{ $ripartizione->id }}"
|
||||||
|
{{ old('ripartizione_id', request('ripartizione_id')) == $ripartizione->id ? 'selected' : '' }}>
|
||||||
|
{{ $ripartizione->voceSpesa->codice }} - {{ $ripartizione->stabile->denominazione }}
|
||||||
|
(€ {{ number_format($ripartizione->importo_totale, 2, ',', '.') }})
|
||||||
|
</option>
|
||||||
|
@endforeach
|
||||||
|
</select>
|
||||||
|
@error('ripartizione_id')
|
||||||
|
<div class="invalid-feedback">{{ $message }}</div>
|
||||||
|
@enderror
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="row">
|
||||||
|
<div class="col-md-4">
|
||||||
|
<div class="form-group">
|
||||||
|
<label for="numero_rate">Numero Rate *</label>
|
||||||
|
<input type="number" min="2" max="36"
|
||||||
|
class="form-control @error('numero_rate') is-invalid @enderror"
|
||||||
|
id="numero_rate" name="numero_rate"
|
||||||
|
value="{{ old('numero_rate', 6) }}" required>
|
||||||
|
@error('numero_rate')
|
||||||
|
<div class="invalid-feedback">{{ $message }}</div>
|
||||||
|
@enderror
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="col-md-4">
|
||||||
|
<div class="form-group">
|
||||||
|
<label for="importo_totale">Importo Totale *</label>
|
||||||
|
<div class="input-group">
|
||||||
|
<input type="number" step="0.01" min="0"
|
||||||
|
class="form-control @error('importo_totale') is-invalid @enderror"
|
||||||
|
id="importo_totale" name="importo_totale"
|
||||||
|
value="{{ old('importo_totale') }}" required>
|
||||||
|
<div class="input-group-append">
|
||||||
|
<span class="input-group-text">€</span>
|
||||||
|
</div>
|
||||||
|
@error('importo_totale')
|
||||||
|
<div class="invalid-feedback">{{ $message }}</div>
|
||||||
|
@enderror
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="col-md-4">
|
||||||
|
<div class="form-group">
|
||||||
|
<label for="tipo_scadenza">Tipo Scadenza *</label>
|
||||||
|
<select class="form-control @error('tipo_scadenza') is-invalid @enderror"
|
||||||
|
id="tipo_scadenza" name="tipo_scadenza" required>
|
||||||
|
<option value="mensile" {{ old('tipo_scadenza', 'mensile') == 'mensile' ? 'selected' : '' }}>Mensile</option>
|
||||||
|
<option value="bimestrale" {{ old('tipo_scadenza') == 'bimestrale' ? 'selected' : '' }}>Bimestrale</option>
|
||||||
|
<option value="trimestrale" {{ old('tipo_scadenza') == 'trimestrale' ? 'selected' : '' }}>Trimestrale</option>
|
||||||
|
<option value="semestrale" {{ old('tipo_scadenza') == 'semestrale' ? 'selected' : '' }}>Semestrale</option>
|
||||||
|
<option value="personalizzata" {{ old('tipo_scadenza') == 'personalizzata' ? 'selected' : '' }}>Personalizzata</option>
|
||||||
|
</select>
|
||||||
|
@error('tipo_scadenza')
|
||||||
|
<div class="invalid-feedback">{{ $message }}</div>
|
||||||
|
@enderror
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="row">
|
||||||
|
<div class="col-md-4">
|
||||||
|
<div class="form-group">
|
||||||
|
<label for="data_inizio">Data Inizio *</label>
|
||||||
|
<input type="date" class="form-control @error('data_inizio') is-invalid @enderror"
|
||||||
|
id="data_inizio" name="data_inizio"
|
||||||
|
value="{{ old('data_inizio', date('Y-m-d')) }}" required>
|
||||||
|
@error('data_inizio')
|
||||||
|
<div class="invalid-feedback">{{ $message }}</div>
|
||||||
|
@enderror
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="col-md-4">
|
||||||
|
<div class="form-group">
|
||||||
|
<label for="data_fine">Data Fine</label>
|
||||||
|
<input type="date" class="form-control @error('data_fine') is-invalid @enderror"
|
||||||
|
id="data_fine" name="data_fine"
|
||||||
|
value="{{ old('data_fine') }}" readonly>
|
||||||
|
@error('data_fine')
|
||||||
|
<div class="invalid-feedback">{{ $message }}</div>
|
||||||
|
@enderror
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="col-md-4">
|
||||||
|
<div class="form-group">
|
||||||
|
<label for="stato">Stato</label>
|
||||||
|
<select class="form-control @error('stato') is-invalid @enderror"
|
||||||
|
id="stato" name="stato">
|
||||||
|
<option value="bozza" {{ old('stato', 'bozza') == 'bozza' ? 'selected' : '' }}>Bozza</option>
|
||||||
|
<option value="attivo" {{ old('stato') == 'attivo' ? 'selected' : '' }}>Attivo</option>
|
||||||
|
<option value="sospeso" {{ old('stato') == 'sospeso' ? 'selected' : '' }}>Sospeso</option>
|
||||||
|
</select>
|
||||||
|
@error('stato')
|
||||||
|
<div class="invalid-feedback">{{ $message }}</div>
|
||||||
|
@enderror
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="row">
|
||||||
|
<div class="col-md-6">
|
||||||
|
<div class="form-group">
|
||||||
|
<label for="tasso_interesse">Tasso Interesse (%)</label>
|
||||||
|
<input type="number" step="0.01" min="0" max="100"
|
||||||
|
class="form-control @error('tasso_interesse') is-invalid @enderror"
|
||||||
|
id="tasso_interesse" name="tasso_interesse"
|
||||||
|
value="{{ old('tasso_interesse', 0) }}">
|
||||||
|
@error('tasso_interesse')
|
||||||
|
<div class="invalid-feedback">{{ $message }}</div>
|
||||||
|
@enderror
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="col-md-6">
|
||||||
|
<div class="form-group">
|
||||||
|
<label for="spese_gestione">Spese Gestione (€)</label>
|
||||||
|
<input type="number" step="0.01" min="0"
|
||||||
|
class="form-control @error('spese_gestione') is-invalid @enderror"
|
||||||
|
id="spese_gestione" name="spese_gestione"
|
||||||
|
value="{{ old('spese_gestione', 0) }}">
|
||||||
|
@error('spese_gestione')
|
||||||
|
<div class="invalid-feedback">{{ $message }}</div>
|
||||||
|
@enderror
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="row">
|
||||||
|
<div class="col-12">
|
||||||
|
<div class="form-group">
|
||||||
|
<label for="note">Note</label>
|
||||||
|
<textarea class="form-control @error('note') is-invalid @enderror"
|
||||||
|
id="note" name="note" rows="3"
|
||||||
|
placeholder="Note aggiuntive sul piano di rateizzazione...">{{ old('note') }}</textarea>
|
||||||
|
@error('note')
|
||||||
|
<div class="invalid-feedback">{{ $message }}</div>
|
||||||
|
@enderror
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<!-- Anteprima Rate -->
|
||||||
|
<div class="row" id="anteprima-rate" style="display: none;">
|
||||||
|
<div class="col-12">
|
||||||
|
<div class="card">
|
||||||
|
<div class="card-header">
|
||||||
|
<h5>Anteprima Rate</h5>
|
||||||
|
</div>
|
||||||
|
<div class="card-body">
|
||||||
|
<div class="table-responsive">
|
||||||
|
<table class="table table-bordered table-sm" id="tabella-anteprima">
|
||||||
|
<thead>
|
||||||
|
<tr>
|
||||||
|
<th>Rata</th>
|
||||||
|
<th>Data Scadenza</th>
|
||||||
|
<th>Importo</th>
|
||||||
|
<th>Interessi</th>
|
||||||
|
<th>Spese</th>
|
||||||
|
<th>Totale</th>
|
||||||
|
</tr>
|
||||||
|
</thead>
|
||||||
|
<tbody>
|
||||||
|
<!-- Popolato via JavaScript -->
|
||||||
|
</tbody>
|
||||||
|
</table>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="card-footer">
|
||||||
|
<button type="button" class="btn btn-info" id="btn-anteprima">
|
||||||
|
<i class="fas fa-eye"></i> Anteprima Rate
|
||||||
|
</button>
|
||||||
|
<button type="submit" class="btn btn-primary">
|
||||||
|
<i class="fas fa-save"></i> Salva Piano
|
||||||
|
</button>
|
||||||
|
<a href="{{ route('admin.piani-rateizzazione.index') }}" class="btn btn-default">
|
||||||
|
<i class="fas fa-times"></i> Annulla
|
||||||
|
</a>
|
||||||
|
</div>
|
||||||
|
</form>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
@endsection
|
||||||
|
|
||||||
|
@section('scripts')
|
||||||
|
<script>
|
||||||
|
$(document).ready(function() {
|
||||||
|
// Initialize Select2
|
||||||
|
$('.select2').select2({
|
||||||
|
theme: 'bootstrap4',
|
||||||
|
width: '100%'
|
||||||
|
});
|
||||||
|
|
||||||
|
// Auto-fill importo_totale quando si seleziona una ripartizione
|
||||||
|
$('#ripartizione_id').on('change', function() {
|
||||||
|
var selectedOption = $(this).find('option:selected');
|
||||||
|
if (selectedOption.val()) {
|
||||||
|
// Estrai importo dal testo dell'opzione
|
||||||
|
var text = selectedOption.text();
|
||||||
|
var matches = text.match(/€\s*([\d.,]+)/);
|
||||||
|
if (matches) {
|
||||||
|
var importo = matches[1].replace(/\./g, '').replace(',', '.');
|
||||||
|
$('#importo_totale').val(importo);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
// Calcola data fine automaticamente
|
||||||
|
function calcolaDataFine() {
|
||||||
|
var dataInizio = $('#data_inizio').val();
|
||||||
|
var numeroRate = parseInt($('#numero_rate').val());
|
||||||
|
var tipoScadenza = $('#tipo_scadenza').val();
|
||||||
|
|
||||||
|
if (dataInizio && numeroRate && tipoScadenza) {
|
||||||
|
var data = new Date(dataInizio);
|
||||||
|
var mesi = 0;
|
||||||
|
|
||||||
|
switch(tipoScadenza) {
|
||||||
|
case 'mensile': mesi = numeroRate; break;
|
||||||
|
case 'bimestrale': mesi = numeroRate * 2; break;
|
||||||
|
case 'trimestrale': mesi = numeroRate * 3; break;
|
||||||
|
case 'semestrale': mesi = numeroRate * 6; break;
|
||||||
|
default: mesi = numeroRate;
|
||||||
|
}
|
||||||
|
|
||||||
|
data.setMonth(data.getMonth() + mesi);
|
||||||
|
$('#data_fine').val(data.toISOString().split('T')[0]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
$('#data_inizio, #numero_rate, #tipo_scadenza').on('change', calcolaDataFine);
|
||||||
|
|
||||||
|
// Anteprima rate
|
||||||
|
$('#btn-anteprima').click(function() {
|
||||||
|
var numeroRate = parseInt($('#numero_rate').val());
|
||||||
|
var importoTotale = parseFloat($('#importo_totale').val());
|
||||||
|
var dataInizio = $('#data_inizio').val();
|
||||||
|
var tipoScadenza = $('#tipo_scadenza').val();
|
||||||
|
var tassoInteresse = parseFloat($('#tasso_interesse').val()) || 0;
|
||||||
|
var speseGestione = parseFloat($('#spese_gestione').val()) || 0;
|
||||||
|
|
||||||
|
if (!numeroRate || !importoTotale || !dataInizio) {
|
||||||
|
alert('Compila tutti i campi obbligatori per vedere l\'anteprima');
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
var importoRata = importoTotale / numeroRate;
|
||||||
|
var interessiRata = (importoTotale * tassoInteresse / 100) / numeroRate;
|
||||||
|
var speseRata = speseGestione / numeroRate;
|
||||||
|
var totaleRata = importoRata + interessiRata + speseRata;
|
||||||
|
|
||||||
|
var tbody = $('#tabella-anteprima tbody');
|
||||||
|
tbody.empty();
|
||||||
|
|
||||||
|
var dataCorrente = new Date(dataInizio);
|
||||||
|
var mesiIncremento = 1;
|
||||||
|
|
||||||
|
switch(tipoScadenza) {
|
||||||
|
case 'bimestrale': mesiIncremento = 2; break;
|
||||||
|
case 'trimestrale': mesiIncremento = 3; break;
|
||||||
|
case 'semestrale': mesiIncremento = 6; break;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (var i = 1; i <= numeroRate; i++) {
|
||||||
|
var row = '<tr>' +
|
||||||
|
'<td>' + i + '</td>' +
|
||||||
|
'<td>' + dataCorrente.toLocaleDateString('it-IT') + '</td>' +
|
||||||
|
'<td>€ ' + importoRata.toFixed(2) + '</td>' +
|
||||||
|
'<td>€ ' + interessiRata.toFixed(2) + '</td>' +
|
||||||
|
'<td>€ ' + speseRata.toFixed(2) + '</td>' +
|
||||||
|
'<td><strong>€ ' + totaleRata.toFixed(2) + '</strong></td>' +
|
||||||
|
'</tr>';
|
||||||
|
tbody.append(row);
|
||||||
|
|
||||||
|
dataCorrente.setMonth(dataCorrente.getMonth() + mesiIncremento);
|
||||||
|
}
|
||||||
|
|
||||||
|
$('#anteprima-rate').show();
|
||||||
|
});
|
||||||
|
});
|
||||||
|
</script>
|
||||||
|
@endsection
|
||||||
294
resources/views/admin/piani-rateizzazione/edit.blade.php
Normal file
294
resources/views/admin/piani-rateizzazione/edit.blade.php
Normal file
|
|
@ -0,0 +1,294 @@
|
||||||
|
@extends('layouts.app')
|
||||||
|
|
||||||
|
@section('title', 'Modifica Piano di Rateizzazione')
|
||||||
|
|
||||||
|
@section('content')
|
||||||
|
<div class="container-fluid">
|
||||||
|
<div class="row">
|
||||||
|
<div class="col-12">
|
||||||
|
<div class="card">
|
||||||
|
<div class="card-header">
|
||||||
|
<h3 class="card-title">Modifica Piano di Rateizzazione</h3>
|
||||||
|
<div class="card-tools">
|
||||||
|
<a href="{{ route('admin.piani-rateizzazione.show', $piano->id) }}" class="btn btn-info btn-sm">
|
||||||
|
<i class="fas fa-eye"></i> Visualizza
|
||||||
|
</a>
|
||||||
|
<a href="{{ route('admin.piani-rateizzazione.index') }}" class="btn btn-default btn-sm">
|
||||||
|
<i class="fas fa-arrow-left"></i> Torna all'elenco
|
||||||
|
</a>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<form action="{{ route('admin.piani-rateizzazione.update', $piano->id) }}" method="POST">
|
||||||
|
@csrf
|
||||||
|
@method('PUT')
|
||||||
|
<div class="card-body">
|
||||||
|
<div class="row">
|
||||||
|
<div class="col-md-6">
|
||||||
|
<div class="form-group">
|
||||||
|
<label for="denominazione">Denominazione *</label>
|
||||||
|
<input type="text" class="form-control @error('denominazione') is-invalid @enderror"
|
||||||
|
id="denominazione" name="denominazione"
|
||||||
|
value="{{ old('denominazione', $piano->denominazione) }}" required>
|
||||||
|
@error('denominazione')
|
||||||
|
<div class="invalid-feedback">{{ $message }}</div>
|
||||||
|
@enderror
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="col-md-6">
|
||||||
|
<div class="form-group">
|
||||||
|
<label for="ripartizione_id">Ripartizione Spesa *</label>
|
||||||
|
<select class="form-control select2 @error('ripartizione_id') is-invalid @enderror"
|
||||||
|
id="ripartizione_id" name="ripartizione_id" required>
|
||||||
|
<option value="">Seleziona una ripartizione</option>
|
||||||
|
@foreach($ripartizioni as $ripartizione)
|
||||||
|
<option value="{{ $ripartizione->id }}"
|
||||||
|
{{ old('ripartizione_id', $piano->ripartizione_id) == $ripartizione->id ? 'selected' : '' }}>
|
||||||
|
{{ $ripartizione->voceSpesa->codice }} - {{ $ripartizione->stabile->denominazione }}
|
||||||
|
(€ {{ number_format($ripartizione->importo_totale, 2, ',', '.') }})
|
||||||
|
</option>
|
||||||
|
@endforeach
|
||||||
|
</select>
|
||||||
|
@error('ripartizione_id')
|
||||||
|
<div class="invalid-feedback">{{ $message }}</div>
|
||||||
|
@enderror
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="row">
|
||||||
|
<div class="col-md-4">
|
||||||
|
<div class="form-group">
|
||||||
|
<label for="numero_rate">Numero Rate *</label>
|
||||||
|
<input type="number" min="2" max="36"
|
||||||
|
class="form-control @error('numero_rate') is-invalid @enderror"
|
||||||
|
id="numero_rate" name="numero_rate"
|
||||||
|
value="{{ old('numero_rate', $piano->numero_rate) }}" required>
|
||||||
|
@error('numero_rate')
|
||||||
|
<div class="invalid-feedback">{{ $message }}</div>
|
||||||
|
@enderror
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="col-md-4">
|
||||||
|
<div class="form-group">
|
||||||
|
<label for="importo_totale">Importo Totale *</label>
|
||||||
|
<div class="input-group">
|
||||||
|
<input type="number" step="0.01" min="0"
|
||||||
|
class="form-control @error('importo_totale') is-invalid @enderror"
|
||||||
|
id="importo_totale" name="importo_totale"
|
||||||
|
value="{{ old('importo_totale', $piano->importo_totale) }}" required>
|
||||||
|
<div class="input-group-append">
|
||||||
|
<span class="input-group-text">€</span>
|
||||||
|
</div>
|
||||||
|
@error('importo_totale')
|
||||||
|
<div class="invalid-feedback">{{ $message }}</div>
|
||||||
|
@enderror
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="col-md-4">
|
||||||
|
<div class="form-group">
|
||||||
|
<label for="tipo_scadenza">Tipo Scadenza *</label>
|
||||||
|
<select class="form-control @error('tipo_scadenza') is-invalid @enderror"
|
||||||
|
id="tipo_scadenza" name="tipo_scadenza" required>
|
||||||
|
<option value="mensile" {{ old('tipo_scadenza', $piano->tipo_scadenza) == 'mensile' ? 'selected' : '' }}>Mensile</option>
|
||||||
|
<option value="bimestrale" {{ old('tipo_scadenza', $piano->tipo_scadenza) == 'bimestrale' ? 'selected' : '' }}>Bimestrale</option>
|
||||||
|
<option value="trimestrale" {{ old('tipo_scadenza', $piano->tipo_scadenza) == 'trimestrale' ? 'selected' : '' }}>Trimestrale</option>
|
||||||
|
<option value="semestrale" {{ old('tipo_scadenza', $piano->tipo_scadenza) == 'semestrale' ? 'selected' : '' }}>Semestrale</option>
|
||||||
|
<option value="personalizzata" {{ old('tipo_scadenza', $piano->tipo_scadenza) == 'personalizzata' ? 'selected' : '' }}>Personalizzata</option>
|
||||||
|
</select>
|
||||||
|
@error('tipo_scadenza')
|
||||||
|
<div class="invalid-feedback">{{ $message }}</div>
|
||||||
|
@enderror
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="row">
|
||||||
|
<div class="col-md-4">
|
||||||
|
<div class="form-group">
|
||||||
|
<label for="data_inizio">Data Inizio *</label>
|
||||||
|
<input type="date" class="form-control @error('data_inizio') is-invalid @enderror"
|
||||||
|
id="data_inizio" name="data_inizio"
|
||||||
|
value="{{ old('data_inizio', $piano->data_inizio->format('Y-m-d')) }}" required>
|
||||||
|
@error('data_inizio')
|
||||||
|
<div class="invalid-feedback">{{ $message }}</div>
|
||||||
|
@enderror
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="col-md-4">
|
||||||
|
<div class="form-group">
|
||||||
|
<label for="data_fine">Data Fine</label>
|
||||||
|
<input type="date" class="form-control @error('data_fine') is-invalid @enderror"
|
||||||
|
id="data_fine" name="data_fine"
|
||||||
|
value="{{ old('data_fine', $piano->data_fine ? $piano->data_fine->format('Y-m-d') : '') }}" readonly>
|
||||||
|
@error('data_fine')
|
||||||
|
<div class="invalid-feedback">{{ $message }}</div>
|
||||||
|
@enderror
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="col-md-4">
|
||||||
|
<div class="form-group">
|
||||||
|
<label for="stato">Stato</label>
|
||||||
|
<select class="form-control @error('stato') is-invalid @enderror"
|
||||||
|
id="stato" name="stato">
|
||||||
|
<option value="bozza" {{ old('stato', $piano->stato) == 'bozza' ? 'selected' : '' }}>Bozza</option>
|
||||||
|
<option value="attivo" {{ old('stato', $piano->stato) == 'attivo' ? 'selected' : '' }}>Attivo</option>
|
||||||
|
<option value="sospeso" {{ old('stato', $piano->stato) == 'sospeso' ? 'selected' : '' }}>Sospeso</option>
|
||||||
|
<option value="completato" {{ old('stato', $piano->stato) == 'completato' ? 'selected' : '' }}>Completato</option>
|
||||||
|
<option value="annullato" {{ old('stato', $piano->stato) == 'annullato' ? 'selected' : '' }}>Annullato</option>
|
||||||
|
</select>
|
||||||
|
@error('stato')
|
||||||
|
<div class="invalid-feedback">{{ $message }}</div>
|
||||||
|
@enderror
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="row">
|
||||||
|
<div class="col-md-6">
|
||||||
|
<div class="form-group">
|
||||||
|
<label for="tasso_interesse">Tasso Interesse (%)</label>
|
||||||
|
<input type="number" step="0.01" min="0" max="100"
|
||||||
|
class="form-control @error('tasso_interesse') is-invalid @enderror"
|
||||||
|
id="tasso_interesse" name="tasso_interesse"
|
||||||
|
value="{{ old('tasso_interesse', $piano->tasso_interesse) }}">
|
||||||
|
@error('tasso_interesse')
|
||||||
|
<div class="invalid-feedback">{{ $message }}</div>
|
||||||
|
@enderror
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="col-md-6">
|
||||||
|
<div class="form-group">
|
||||||
|
<label for="spese_gestione">Spese Gestione (€)</label>
|
||||||
|
<input type="number" step="0.01" min="0"
|
||||||
|
class="form-control @error('spese_gestione') is-invalid @enderror"
|
||||||
|
id="spese_gestione" name="spese_gestione"
|
||||||
|
value="{{ old('spese_gestione', $piano->spese_gestione) }}">
|
||||||
|
@error('spese_gestione')
|
||||||
|
<div class="invalid-feedback">{{ $message }}</div>
|
||||||
|
@enderror
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="row">
|
||||||
|
<div class="col-12">
|
||||||
|
<div class="form-group">
|
||||||
|
<label for="note">Note</label>
|
||||||
|
<textarea class="form-control @error('note') is-invalid @enderror"
|
||||||
|
id="note" name="note" rows="3"
|
||||||
|
placeholder="Note aggiuntive sul piano di rateizzazione...">{{ old('note', $piano->note) }}</textarea>
|
||||||
|
@error('note')
|
||||||
|
<div class="invalid-feedback">{{ $message }}</div>
|
||||||
|
@enderror
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<!-- Rate esistenti -->
|
||||||
|
@if($piano->rate->count() > 0)
|
||||||
|
<div class="row">
|
||||||
|
<div class="col-12">
|
||||||
|
<div class="card">
|
||||||
|
<div class="card-header">
|
||||||
|
<h5>Rate Esistenti</h5>
|
||||||
|
</div>
|
||||||
|
<div class="card-body">
|
||||||
|
<div class="table-responsive">
|
||||||
|
<table class="table table-bordered table-striped">
|
||||||
|
<thead>
|
||||||
|
<tr>
|
||||||
|
<th>Numero</th>
|
||||||
|
<th>Data Scadenza</th>
|
||||||
|
<th>Importo</th>
|
||||||
|
<th>Stato</th>
|
||||||
|
<th>Data Pagamento</th>
|
||||||
|
<th>Importo Pagato</th>
|
||||||
|
</tr>
|
||||||
|
</thead>
|
||||||
|
<tbody>
|
||||||
|
@foreach($piano->rate as $rata)
|
||||||
|
<tr>
|
||||||
|
<td>{{ $rata->numero_rata }}</td>
|
||||||
|
<td>{{ $rata->data_scadenza->format('d/m/Y') }}</td>
|
||||||
|
<td>€ {{ number_format($rata->importo, 2, ',', '.') }}</td>
|
||||||
|
<td>
|
||||||
|
<span class="badge badge-{{ $rata->stato == 'pagata' ? 'success' : ($rata->stato == 'scaduta' ? 'danger' : 'warning') }}">
|
||||||
|
{{ ucfirst($rata->stato) }}
|
||||||
|
</span>
|
||||||
|
</td>
|
||||||
|
<td>{{ $rata->data_pagamento ? $rata->data_pagamento->format('d/m/Y') : '-' }}</td>
|
||||||
|
<td>€ {{ number_format($rata->importo_pagato, 2, ',', '.') }}</td>
|
||||||
|
</tr>
|
||||||
|
@endforeach
|
||||||
|
</tbody>
|
||||||
|
</table>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
@endif
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="card-footer">
|
||||||
|
<button type="submit" class="btn btn-primary">
|
||||||
|
<i class="fas fa-save"></i> Aggiorna Piano
|
||||||
|
</button>
|
||||||
|
<a href="{{ route('admin.piani-rateizzazione.show', $piano->id) }}" class="btn btn-info">
|
||||||
|
<i class="fas fa-eye"></i> Visualizza
|
||||||
|
</a>
|
||||||
|
<a href="{{ route('admin.piani-rateizzazione.index') }}" class="btn btn-default">
|
||||||
|
<i class="fas fa-times"></i> Annulla
|
||||||
|
</a>
|
||||||
|
</div>
|
||||||
|
</form>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
@endsection
|
||||||
|
|
||||||
|
@section('scripts')
|
||||||
|
<script>
|
||||||
|
$(document).ready(function() {
|
||||||
|
// Initialize Select2
|
||||||
|
$('.select2').select2({
|
||||||
|
theme: 'bootstrap4',
|
||||||
|
width: '100%'
|
||||||
|
});
|
||||||
|
|
||||||
|
// Calcola data fine automaticamente
|
||||||
|
function calcolaDataFine() {
|
||||||
|
var dataInizio = $('#data_inizio').val();
|
||||||
|
var numeroRate = parseInt($('#numero_rate').val());
|
||||||
|
var tipoScadenza = $('#tipo_scadenza').val();
|
||||||
|
|
||||||
|
if (dataInizio && numeroRate && tipoScadenza) {
|
||||||
|
var data = new Date(dataInizio);
|
||||||
|
var mesi = 0;
|
||||||
|
|
||||||
|
switch(tipoScadenza) {
|
||||||
|
case 'mensile': mesi = numeroRate; break;
|
||||||
|
case 'bimestrale': mesi = numeroRate * 2; break;
|
||||||
|
case 'trimestrale': mesi = numeroRate * 3; break;
|
||||||
|
case 'semestrale': mesi = numeroRate * 6; break;
|
||||||
|
default: mesi = numeroRate;
|
||||||
|
}
|
||||||
|
|
||||||
|
data.setMonth(data.getMonth() + mesi);
|
||||||
|
$('#data_fine').val(data.toISOString().split('T')[0]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
$('#data_inizio, #numero_rate, #tipo_scadenza').on('change', calcolaDataFine);
|
||||||
|
});
|
||||||
|
</script>
|
||||||
|
@endsection
|
||||||
152
resources/views/admin/piani-rateizzazione/index.blade.php
Normal file
152
resources/views/admin/piani-rateizzazione/index.blade.php
Normal file
|
|
@ -0,0 +1,152 @@
|
||||||
|
@extends('layouts.app')
|
||||||
|
|
||||||
|
@section('title', 'Piani di Rateizzazione')
|
||||||
|
|
||||||
|
@section('content')
|
||||||
|
<div class="container-fluid">
|
||||||
|
<div class="row">
|
||||||
|
<div class="col-12">
|
||||||
|
<div class="card">
|
||||||
|
<div class="card-header">
|
||||||
|
<h3 class="card-title">Piani di Rateizzazione</h3>
|
||||||
|
<div class="card-tools">
|
||||||
|
<a href="{{ route('admin.piani-rateizzazione.create') }}" class="btn btn-primary btn-sm">
|
||||||
|
<i class="fas fa-plus"></i> Nuovo Piano
|
||||||
|
</a>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="card-body">
|
||||||
|
<div class="table-responsive">
|
||||||
|
<table class="table table-bordered table-striped" id="piani-table">
|
||||||
|
<thead>
|
||||||
|
<tr>
|
||||||
|
<th>ID</th>
|
||||||
|
<th>Denominazione</th>
|
||||||
|
<th>Ripartizione</th>
|
||||||
|
<th>Stabile</th>
|
||||||
|
<th>Numero Rate</th>
|
||||||
|
<th>Importo Totale</th>
|
||||||
|
<th>Stato</th>
|
||||||
|
<th>Data Inizio</th>
|
||||||
|
<th>Azioni</th>
|
||||||
|
</tr>
|
||||||
|
</thead>
|
||||||
|
<tbody>
|
||||||
|
@foreach($piani as $piano)
|
||||||
|
<tr>
|
||||||
|
<td>{{ $piano->id }}</td>
|
||||||
|
<td>{{ $piano->denominazione }}</td>
|
||||||
|
<td>
|
||||||
|
<a href="{{ route('admin.ripartizioni-spesa.show', $piano->ripartizione->id) }}" class="text-info">
|
||||||
|
{{ $piano->ripartizione->voceSpesa->codice }}
|
||||||
|
</a>
|
||||||
|
</td>
|
||||||
|
<td>{{ $piano->ripartizione->stabile->denominazione }}</td>
|
||||||
|
<td>{{ $piano->numero_rate }}</td>
|
||||||
|
<td>€ {{ number_format($piano->importo_totale, 2, ',', '.') }}</td>
|
||||||
|
<td>
|
||||||
|
<span class="badge badge-{{ $piano->stato == 'attivo' ? 'success' : ($piano->stato == 'completato' ? 'primary' : ($piano->stato == 'sospeso' ? 'warning' : 'secondary')) }}">
|
||||||
|
{{ ucfirst($piano->stato) }}
|
||||||
|
</span>
|
||||||
|
</td>
|
||||||
|
<td>{{ $piano->data_inizio->format('d/m/Y') }}</td>
|
||||||
|
<td>
|
||||||
|
<div class="btn-group">
|
||||||
|
<a href="{{ route('admin.piani-rateizzazione.show', $piano->id) }}" class="btn btn-sm btn-info">
|
||||||
|
<i class="fas fa-eye"></i>
|
||||||
|
</a>
|
||||||
|
@can('update', $piano)
|
||||||
|
<a href="{{ route('admin.piani-rateizzazione.edit', $piano->id) }}" class="btn btn-sm btn-primary">
|
||||||
|
<i class="fas fa-edit"></i>
|
||||||
|
</a>
|
||||||
|
@endcan
|
||||||
|
@can('delete', $piano)
|
||||||
|
<form action="{{ route('admin.piani-rateizzazione.destroy', $piano->id) }}" method="POST" style="display: inline;">
|
||||||
|
@csrf
|
||||||
|
@method('DELETE')
|
||||||
|
<button type="submit" class="btn btn-sm btn-danger" onclick="return confirm('Sei sicuro di voler eliminare questo piano?')">
|
||||||
|
<i class="fas fa-trash"></i>
|
||||||
|
</button>
|
||||||
|
</form>
|
||||||
|
@endcan
|
||||||
|
</div>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
@endforeach
|
||||||
|
</tbody>
|
||||||
|
</table>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<!-- Statistiche -->
|
||||||
|
<div class="row">
|
||||||
|
<div class="col-lg-3 col-6">
|
||||||
|
<div class="small-box bg-info">
|
||||||
|
<div class="inner">
|
||||||
|
<h3>{{ $piani->count() }}</h3>
|
||||||
|
<p>Piani Totali</p>
|
||||||
|
</div>
|
||||||
|
<div class="icon">
|
||||||
|
<i class="fas fa-calendar-alt"></i>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="col-lg-3 col-6">
|
||||||
|
<div class="small-box bg-success">
|
||||||
|
<div class="inner">
|
||||||
|
<h3>{{ $piani->where('stato', 'attivo')->count() }}</h3>
|
||||||
|
<p>Piani Attivi</p>
|
||||||
|
</div>
|
||||||
|
<div class="icon">
|
||||||
|
<i class="fas fa-play"></i>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="col-lg-3 col-6">
|
||||||
|
<div class="small-box bg-primary">
|
||||||
|
<div class="inner">
|
||||||
|
<h3>{{ $piani->where('stato', 'completato')->count() }}</h3>
|
||||||
|
<p>Piani Completati</p>
|
||||||
|
</div>
|
||||||
|
<div class="icon">
|
||||||
|
<i class="fas fa-check"></i>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="col-lg-3 col-6">
|
||||||
|
<div class="small-box bg-warning">
|
||||||
|
<div class="inner">
|
||||||
|
<h3>€ {{ number_format($piani->sum('importo_totale'), 0, ',', '.') }}</h3>
|
||||||
|
<p>Importo Totale</p>
|
||||||
|
</div>
|
||||||
|
<div class="icon">
|
||||||
|
<i class="fas fa-euro-sign"></i>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
@endsection
|
||||||
|
|
||||||
|
@section('scripts')
|
||||||
|
<script>
|
||||||
|
$(document).ready(function() {
|
||||||
|
$('#piani-table').DataTable({
|
||||||
|
responsive: true,
|
||||||
|
lengthChange: false,
|
||||||
|
autoWidth: false,
|
||||||
|
order: [[0, 'desc']],
|
||||||
|
language: {
|
||||||
|
url: '//cdn.datatables.net/plug-ins/1.10.25/i18n/Italian.json'
|
||||||
|
}
|
||||||
|
});
|
||||||
|
});
|
||||||
|
</script>
|
||||||
|
@endsection
|
||||||
455
resources/views/admin/piani-rateizzazione/show.blade.php
Normal file
455
resources/views/admin/piani-rateizzazione/show.blade.php
Normal file
|
|
@ -0,0 +1,455 @@
|
||||||
|
@extends('layouts.app')
|
||||||
|
|
||||||
|
@section('title', 'Dettaglio Piano di Rateizzazione')
|
||||||
|
|
||||||
|
@section('content')
|
||||||
|
<div class="container-fluid">
|
||||||
|
<div class="row">
|
||||||
|
<div class="col-12">
|
||||||
|
<div class="card">
|
||||||
|
<div class="card-header">
|
||||||
|
<h3 class="card-title">Dettaglio Piano di Rateizzazione</h3>
|
||||||
|
<div class="card-tools">
|
||||||
|
@can('update', $piano)
|
||||||
|
<a href="{{ route('admin.piani-rateizzazione.edit', $piano->id) }}" class="btn btn-primary btn-sm">
|
||||||
|
<i class="fas fa-edit"></i> Modifica
|
||||||
|
</a>
|
||||||
|
@endcan
|
||||||
|
<a href="{{ route('admin.piani-rateizzazione.index') }}" class="btn btn-default btn-sm">
|
||||||
|
<i class="fas fa-arrow-left"></i> Torna all'elenco
|
||||||
|
</a>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="card-body">
|
||||||
|
<div class="row">
|
||||||
|
<div class="col-md-6">
|
||||||
|
<div class="info-box">
|
||||||
|
<span class="info-box-icon bg-primary"><i class="fas fa-calendar-alt"></i></span>
|
||||||
|
<div class="info-box-content">
|
||||||
|
<span class="info-box-text">Denominazione</span>
|
||||||
|
<span class="info-box-number">{{ $piano->denominazione }}</span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="col-md-6">
|
||||||
|
<div class="info-box">
|
||||||
|
<span class="info-box-icon bg-info"><i class="fas fa-receipt"></i></span>
|
||||||
|
<div class="info-box-content">
|
||||||
|
<span class="info-box-text">Ripartizione Spesa</span>
|
||||||
|
<span class="info-box-number">
|
||||||
|
<a href="{{ route('admin.ripartizioni-spesa.show', $piano->ripartizione->id) }}" class="text-info">
|
||||||
|
{{ $piano->ripartizione->voceSpesa->codice }}
|
||||||
|
</a>
|
||||||
|
</span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="row">
|
||||||
|
<div class="col-md-3">
|
||||||
|
<div class="info-box">
|
||||||
|
<span class="info-box-icon bg-success"><i class="fas fa-list-ol"></i></span>
|
||||||
|
<div class="info-box-content">
|
||||||
|
<span class="info-box-text">Numero Rate</span>
|
||||||
|
<span class="info-box-number">{{ $piano->numero_rate }}</span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="col-md-3">
|
||||||
|
<div class="info-box">
|
||||||
|
<span class="info-box-icon bg-warning"><i class="fas fa-euro-sign"></i></span>
|
||||||
|
<div class="info-box-content">
|
||||||
|
<span class="info-box-text">Importo Totale</span>
|
||||||
|
<span class="info-box-number">€ {{ number_format($piano->importo_totale, 2, ',', '.') }}</span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="col-md-3">
|
||||||
|
<div class="info-box">
|
||||||
|
<span class="info-box-icon bg-secondary"><i class="fas fa-clock"></i></span>
|
||||||
|
<div class="info-box-content">
|
||||||
|
<span class="info-box-text">Tipo Scadenza</span>
|
||||||
|
<span class="info-box-number">{{ ucfirst($piano->tipo_scadenza) }}</span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="col-md-3">
|
||||||
|
<div class="info-box">
|
||||||
|
<span class="info-box-icon bg-{{ $piano->stato == 'attivo' ? 'success' : ($piano->stato == 'completato' ? 'primary' : ($piano->stato == 'sospeso' ? 'warning' : 'secondary')) }}">
|
||||||
|
<i class="fas fa-{{ $piano->stato == 'attivo' ? 'play' : ($piano->stato == 'completato' ? 'check' : ($piano->stato == 'sospeso' ? 'pause' : 'stop')) }}"></i>
|
||||||
|
</span>
|
||||||
|
<div class="info-box-content">
|
||||||
|
<span class="info-box-text">Stato</span>
|
||||||
|
<span class="info-box-number">{{ ucfirst($piano->stato) }}</span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="row">
|
||||||
|
<div class="col-md-4">
|
||||||
|
<div class="form-group">
|
||||||
|
<label>Data Inizio</label>
|
||||||
|
<p class="form-control-plaintext">{{ $piano->data_inizio->format('d/m/Y') }}</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="col-md-4">
|
||||||
|
<div class="form-group">
|
||||||
|
<label>Data Fine</label>
|
||||||
|
<p class="form-control-plaintext">{{ $piano->data_fine ? $piano->data_fine->format('d/m/Y') : 'Non definita' }}</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="col-md-4">
|
||||||
|
<div class="form-group">
|
||||||
|
<label>Stabile</label>
|
||||||
|
<p class="form-control-plaintext">{{ $piano->ripartizione->stabile->denominazione }}</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="row">
|
||||||
|
<div class="col-md-6">
|
||||||
|
<div class="form-group">
|
||||||
|
<label>Tasso Interesse</label>
|
||||||
|
<p class="form-control-plaintext">{{ $piano->tasso_interesse ?? 0 }}%</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="col-md-6">
|
||||||
|
<div class="form-group">
|
||||||
|
<label>Spese Gestione</label>
|
||||||
|
<p class="form-control-plaintext">€ {{ number_format($piano->spese_gestione ?? 0, 2, ',', '.') }}</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
@if($piano->note)
|
||||||
|
<div class="row">
|
||||||
|
<div class="col-12">
|
||||||
|
<div class="form-group">
|
||||||
|
<label>Note</label>
|
||||||
|
<p class="form-control-plaintext">{{ $piano->note }}</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
@endif
|
||||||
|
|
||||||
|
<div class="row">
|
||||||
|
<div class="col-12">
|
||||||
|
<div class="form-group">
|
||||||
|
<label>Audit</label>
|
||||||
|
<div class="table-responsive">
|
||||||
|
<table class="table table-sm">
|
||||||
|
<tr>
|
||||||
|
<th>Creato il:</th>
|
||||||
|
<td>{{ $piano->created_at->format('d/m/Y H:i:s') }}</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<th>Ultima modifica:</th>
|
||||||
|
<td>{{ $piano->updated_at->format('d/m/Y H:i:s') }}</td>
|
||||||
|
</tr>
|
||||||
|
</table>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<!-- Rate -->
|
||||||
|
<div class="row">
|
||||||
|
<div class="col-12">
|
||||||
|
<div class="card">
|
||||||
|
<div class="card-header">
|
||||||
|
<h3 class="card-title">Rate del Piano</h3>
|
||||||
|
<div class="card-tools">
|
||||||
|
@if($piano->stato == 'bozza')
|
||||||
|
<button type="button" class="btn btn-success btn-sm" id="btn-genera-rate">
|
||||||
|
<i class="fas fa-cogs"></i> Genera Rate
|
||||||
|
</button>
|
||||||
|
@endif
|
||||||
|
<button type="button" class="btn btn-info btn-sm" data-toggle="modal" data-target="#modal-statistiche">
|
||||||
|
<i class="fas fa-chart-bar"></i> Statistiche
|
||||||
|
</button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="card-body">
|
||||||
|
@if($piano->rate->count() > 0)
|
||||||
|
<div class="table-responsive">
|
||||||
|
<table class="table table-bordered table-striped" id="rate-table">
|
||||||
|
<thead>
|
||||||
|
<tr>
|
||||||
|
<th>Numero</th>
|
||||||
|
<th>Data Scadenza</th>
|
||||||
|
<th>Importo</th>
|
||||||
|
<th>Interessi</th>
|
||||||
|
<th>Spese</th>
|
||||||
|
<th>Totale</th>
|
||||||
|
<th>Stato</th>
|
||||||
|
<th>Data Pagamento</th>
|
||||||
|
<th>Importo Pagato</th>
|
||||||
|
<th>Note</th>
|
||||||
|
<th>Azioni</th>
|
||||||
|
</tr>
|
||||||
|
</thead>
|
||||||
|
<tbody>
|
||||||
|
@foreach($piano->rate as $rata)
|
||||||
|
<tr class="{{ $rata->data_scadenza->isPast() && $rata->stato != 'pagata' ? 'table-danger' : '' }}">
|
||||||
|
<td>{{ $rata->numero_rata }}</td>
|
||||||
|
<td>{{ $rata->data_scadenza->format('d/m/Y') }}</td>
|
||||||
|
<td>€ {{ number_format($rata->importo, 2, ',', '.') }}</td>
|
||||||
|
<td>€ {{ number_format($rata->importo_interessi, 2, ',', '.') }}</td>
|
||||||
|
<td>€ {{ number_format($rata->importo_spese, 2, ',', '.') }}</td>
|
||||||
|
<td><strong>€ {{ number_format($rata->importo_totale, 2, ',', '.') }}</strong></td>
|
||||||
|
<td>
|
||||||
|
<span class="badge badge-{{ $rata->stato == 'pagata' ? 'success' : ($rata->stato == 'scaduta' ? 'danger' : 'warning') }}">
|
||||||
|
{{ ucfirst($rata->stato) }}
|
||||||
|
</span>
|
||||||
|
</td>
|
||||||
|
<td>{{ $rata->data_pagamento ? $rata->data_pagamento->format('d/m/Y') : '-' }}</td>
|
||||||
|
<td>€ {{ number_format($rata->importo_pagato, 2, ',', '.') }}</td>
|
||||||
|
<td>{{ $rata->note ?? '-' }}</td>
|
||||||
|
<td>
|
||||||
|
<div class="btn-group">
|
||||||
|
<a href="{{ route('admin.rate.show', $rata->id) }}" class="btn btn-sm btn-info">
|
||||||
|
<i class="fas fa-eye"></i>
|
||||||
|
</a>
|
||||||
|
<a href="{{ route('admin.rate.edit', $rata->id) }}" class="btn btn-sm btn-primary">
|
||||||
|
<i class="fas fa-edit"></i>
|
||||||
|
</a>
|
||||||
|
@if($rata->stato != 'pagata')
|
||||||
|
<button type="button" class="btn btn-sm btn-success" onclick="marcaPagata({{ $rata->id }})">
|
||||||
|
<i class="fas fa-check"></i>
|
||||||
|
</button>
|
||||||
|
@endif
|
||||||
|
</div>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
@endforeach
|
||||||
|
</tbody>
|
||||||
|
<tfoot>
|
||||||
|
<tr class="table-info">
|
||||||
|
<th>Totale</th>
|
||||||
|
<th>-</th>
|
||||||
|
<th>€ {{ number_format($piano->rate->sum('importo'), 2, ',', '.') }}</th>
|
||||||
|
<th>€ {{ number_format($piano->rate->sum('importo_interessi'), 2, ',', '.') }}</th>
|
||||||
|
<th>€ {{ number_format($piano->rate->sum('importo_spese'), 2, ',', '.') }}</th>
|
||||||
|
<th>€ {{ number_format($piano->rate->sum('importo_totale'), 2, ',', '.') }}</th>
|
||||||
|
<th>-</th>
|
||||||
|
<th>-</th>
|
||||||
|
<th>€ {{ number_format($piano->rate->sum('importo_pagato'), 2, ',', '.') }}</th>
|
||||||
|
<th colspan="2">-</th>
|
||||||
|
</tr>
|
||||||
|
</tfoot>
|
||||||
|
</table>
|
||||||
|
</div>
|
||||||
|
@else
|
||||||
|
<div class="alert alert-info">
|
||||||
|
<i class="fas fa-info-circle"></i> Nessuna rata trovata per questo piano.
|
||||||
|
@if($piano->stato == 'bozza')
|
||||||
|
Clicca su "Genera Rate" per creare le rate automaticamente.
|
||||||
|
@endif
|
||||||
|
</div>
|
||||||
|
@endif
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<!-- Progress Bar -->
|
||||||
|
@if($piano->rate->count() > 0)
|
||||||
|
<div class="row">
|
||||||
|
<div class="col-12">
|
||||||
|
<div class="card">
|
||||||
|
<div class="card-header">
|
||||||
|
<h3 class="card-title">Progresso Pagamenti</h3>
|
||||||
|
</div>
|
||||||
|
<div class="card-body">
|
||||||
|
@php
|
||||||
|
$ratePagate = $piano->rate->where('stato', 'pagata')->count();
|
||||||
|
$totalRate = $piano->rate->count();
|
||||||
|
$percentuale = $totalRate > 0 ? ($ratePagate / $totalRate) * 100 : 0;
|
||||||
|
@endphp
|
||||||
|
<div class="progress mb-3">
|
||||||
|
<div class="progress-bar bg-success" role="progressbar" style="width: {{ $percentuale }}%" aria-valuenow="{{ $percentuale }}" aria-valuemin="0" aria-valuemax="100">
|
||||||
|
{{ round($percentuale, 1) }}%
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<p class="text-muted">Rate pagate: {{ $ratePagate }} su {{ $totalRate }}</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
@endif
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<!-- Modal Statistiche -->
|
||||||
|
<div class="modal fade" id="modal-statistiche" tabindex="-1" role="dialog">
|
||||||
|
<div class="modal-dialog modal-lg" role="document">
|
||||||
|
<div class="modal-content">
|
||||||
|
<div class="modal-header">
|
||||||
|
<h4 class="modal-title">Statistiche Piano di Rateizzazione</h4>
|
||||||
|
<button type="button" class="close" data-dismiss="modal">
|
||||||
|
<span>×</span>
|
||||||
|
</button>
|
||||||
|
</div>
|
||||||
|
<div class="modal-body">
|
||||||
|
<div class="row">
|
||||||
|
<div class="col-md-6">
|
||||||
|
<canvas id="chart-stati-rate"></canvas>
|
||||||
|
</div>
|
||||||
|
<div class="col-md-6">
|
||||||
|
<canvas id="chart-importi-rate"></canvas>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
@endsection
|
||||||
|
|
||||||
|
@section('scripts')
|
||||||
|
<script src="https://cdn.jsdelivr.net/npm/chart.js"></script>
|
||||||
|
<script>
|
||||||
|
$(document).ready(function() {
|
||||||
|
// Initialize DataTable
|
||||||
|
$('#rate-table').DataTable({
|
||||||
|
responsive: true,
|
||||||
|
lengthChange: false,
|
||||||
|
autoWidth: false,
|
||||||
|
order: [[0, 'asc']],
|
||||||
|
language: {
|
||||||
|
url: '//cdn.datatables.net/plug-ins/1.10.25/i18n/Italian.json'
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
// Genera rate
|
||||||
|
$('#btn-genera-rate').click(function() {
|
||||||
|
if (confirm('Sei sicuro di voler generare le rate? Eventuali rate esistenti verranno sovrascritte.')) {
|
||||||
|
$.ajax({
|
||||||
|
url: '{{ route("admin.piani-rateizzazione.genera-rate", $piano->id) }}',
|
||||||
|
type: 'POST',
|
||||||
|
data: {
|
||||||
|
_token: '{{ csrf_token() }}'
|
||||||
|
},
|
||||||
|
success: function(response) {
|
||||||
|
if (response.success) {
|
||||||
|
location.reload();
|
||||||
|
} else {
|
||||||
|
alert('Errore nella generazione delle rate: ' + response.message);
|
||||||
|
}
|
||||||
|
},
|
||||||
|
error: function() {
|
||||||
|
alert('Errore nella generazione delle rate');
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
// Charts for modal
|
||||||
|
$('#modal-statistiche').on('shown.bs.modal', function() {
|
||||||
|
// Chart Stati Rate
|
||||||
|
var ctxStati = document.getElementById('chart-stati-rate').getContext('2d');
|
||||||
|
new Chart(ctxStati, {
|
||||||
|
type: 'doughnut',
|
||||||
|
data: {
|
||||||
|
labels: ['Da Pagare', 'Pagate', 'Scadute'],
|
||||||
|
datasets: [{
|
||||||
|
data: [
|
||||||
|
{{ $piano->rate->where('stato', 'da_pagare')->count() }},
|
||||||
|
{{ $piano->rate->where('stato', 'pagata')->count() }},
|
||||||
|
{{ $piano->rate->where('stato', 'scaduta')->count() }}
|
||||||
|
],
|
||||||
|
backgroundColor: ['#ffc107', '#28a745', '#dc3545']
|
||||||
|
}]
|
||||||
|
},
|
||||||
|
options: {
|
||||||
|
responsive: true,
|
||||||
|
plugins: {
|
||||||
|
title: {
|
||||||
|
display: true,
|
||||||
|
text: 'Stati Rate'
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
// Chart Importi Rate
|
||||||
|
var ctxImporti = document.getElementById('chart-importi-rate').getContext('2d');
|
||||||
|
new Chart(ctxImporti, {
|
||||||
|
type: 'line',
|
||||||
|
data: {
|
||||||
|
labels: [
|
||||||
|
@foreach($piano->rate as $rata)
|
||||||
|
'{{ $rata->numero_rata }}',
|
||||||
|
@endforeach
|
||||||
|
],
|
||||||
|
datasets: [{
|
||||||
|
label: 'Importo Totale (€)',
|
||||||
|
data: [
|
||||||
|
@foreach($piano->rate as $rata)
|
||||||
|
{{ $rata->importo_totale }},
|
||||||
|
@endforeach
|
||||||
|
],
|
||||||
|
borderColor: '#007bff',
|
||||||
|
backgroundColor: 'rgba(0, 123, 255, 0.1)',
|
||||||
|
fill: true
|
||||||
|
}, {
|
||||||
|
label: 'Importo Pagato (€)',
|
||||||
|
data: [
|
||||||
|
@foreach($piano->rate as $rata)
|
||||||
|
{{ $rata->importo_pagato }},
|
||||||
|
@endforeach
|
||||||
|
],
|
||||||
|
borderColor: '#28a745',
|
||||||
|
backgroundColor: 'rgba(40, 167, 69, 0.1)',
|
||||||
|
fill: true
|
||||||
|
}]
|
||||||
|
},
|
||||||
|
options: {
|
||||||
|
responsive: true,
|
||||||
|
plugins: {
|
||||||
|
title: {
|
||||||
|
display: true,
|
||||||
|
text: 'Andamento Pagamenti'
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
function marcaPagata(id) {
|
||||||
|
if (confirm('Sei sicuro di voler marcare questa rata come pagata?')) {
|
||||||
|
$.ajax({
|
||||||
|
url: '{{ route("admin.rate.marca-pagata", ":id") }}'.replace(':id', id),
|
||||||
|
type: 'POST',
|
||||||
|
data: {
|
||||||
|
_token: '{{ csrf_token() }}'
|
||||||
|
},
|
||||||
|
success: function(response) {
|
||||||
|
if (response.success) {
|
||||||
|
location.reload();
|
||||||
|
} else {
|
||||||
|
alert('Errore: ' + response.message);
|
||||||
|
}
|
||||||
|
},
|
||||||
|
error: function() {
|
||||||
|
alert('Errore nella marcatura del pagamento');
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
@endsection
|
||||||
264
resources/views/admin/rate/create.blade.php
Normal file
264
resources/views/admin/rate/create.blade.php
Normal file
|
|
@ -0,0 +1,264 @@
|
||||||
|
@extends('layouts.app')
|
||||||
|
|
||||||
|
@section('title', 'Nuova Rata')
|
||||||
|
|
||||||
|
@section('content')
|
||||||
|
<div class="container-fluid">
|
||||||
|
<div class="row">
|
||||||
|
<div class="col-12">
|
||||||
|
<div class="card">
|
||||||
|
<div class="card-header">
|
||||||
|
<h3 class="card-title">Nuova Rata</h3>
|
||||||
|
<div class="card-tools">
|
||||||
|
<a href="{{ route('admin.rate.index') }}" class="btn btn-default btn-sm">
|
||||||
|
<i class="fas fa-arrow-left"></i> Torna all'elenco
|
||||||
|
</a>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<form action="{{ route('admin.rate.store') }}" method="POST">
|
||||||
|
@csrf
|
||||||
|
<div class="card-body">
|
||||||
|
<div class="row">
|
||||||
|
<div class="col-md-6">
|
||||||
|
<div class="form-group">
|
||||||
|
<label for="piano_id">Piano di Rateizzazione *</label>
|
||||||
|
<select class="form-control select2 @error('piano_id') is-invalid @enderror"
|
||||||
|
id="piano_id" name="piano_id" required>
|
||||||
|
<option value="">Seleziona un piano</option>
|
||||||
|
@foreach($piani as $piano)
|
||||||
|
<option value="{{ $piano->id }}" {{ old('piano_id', request('piano_id')) == $piano->id ? 'selected' : '' }}>
|
||||||
|
{{ $piano->denominazione }} - {{ $piano->ripartizione->stabile->denominazione }}
|
||||||
|
</option>
|
||||||
|
@endforeach
|
||||||
|
</select>
|
||||||
|
@error('piano_id')
|
||||||
|
<div class="invalid-feedback">{{ $message }}</div>
|
||||||
|
@enderror
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="col-md-6">
|
||||||
|
<div class="form-group">
|
||||||
|
<label for="numero_rata">Numero Rata *</label>
|
||||||
|
<input type="number" min="1" max="999"
|
||||||
|
class="form-control @error('numero_rata') is-invalid @enderror"
|
||||||
|
id="numero_rata" name="numero_rata"
|
||||||
|
value="{{ old('numero_rata') }}" required>
|
||||||
|
@error('numero_rata')
|
||||||
|
<div class="invalid-feedback">{{ $message }}</div>
|
||||||
|
@enderror
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="row">
|
||||||
|
<div class="col-md-6">
|
||||||
|
<div class="form-group">
|
||||||
|
<label for="data_scadenza">Data Scadenza *</label>
|
||||||
|
<input type="date" class="form-control @error('data_scadenza') is-invalid @enderror"
|
||||||
|
id="data_scadenza" name="data_scadenza"
|
||||||
|
value="{{ old('data_scadenza') }}" required>
|
||||||
|
@error('data_scadenza')
|
||||||
|
<div class="invalid-feedback">{{ $message }}</div>
|
||||||
|
@enderror
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="col-md-6">
|
||||||
|
<div class="form-group">
|
||||||
|
<label for="importo">Importo *</label>
|
||||||
|
<div class="input-group">
|
||||||
|
<input type="number" step="0.01" min="0"
|
||||||
|
class="form-control @error('importo') is-invalid @enderror"
|
||||||
|
id="importo" name="importo"
|
||||||
|
value="{{ old('importo') }}" required>
|
||||||
|
<div class="input-group-append">
|
||||||
|
<span class="input-group-text">€</span>
|
||||||
|
</div>
|
||||||
|
@error('importo')
|
||||||
|
<div class="invalid-feedback">{{ $message }}</div>
|
||||||
|
@enderror
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="row">
|
||||||
|
<div class="col-md-6">
|
||||||
|
<div class="form-group">
|
||||||
|
<label for="importo_interessi">Importo Interessi</label>
|
||||||
|
<div class="input-group">
|
||||||
|
<input type="number" step="0.01" min="0"
|
||||||
|
class="form-control @error('importo_interessi') is-invalid @enderror"
|
||||||
|
id="importo_interessi" name="importo_interessi"
|
||||||
|
value="{{ old('importo_interessi', 0) }}">
|
||||||
|
<div class="input-group-append">
|
||||||
|
<span class="input-group-text">€</span>
|
||||||
|
</div>
|
||||||
|
@error('importo_interessi')
|
||||||
|
<div class="invalid-feedback">{{ $message }}</div>
|
||||||
|
@enderror
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="col-md-6">
|
||||||
|
<div class="form-group">
|
||||||
|
<label for="importo_spese">Importo Spese</label>
|
||||||
|
<div class="input-group">
|
||||||
|
<input type="number" step="0.01" min="0"
|
||||||
|
class="form-control @error('importo_spese') is-invalid @enderror"
|
||||||
|
id="importo_spese" name="importo_spese"
|
||||||
|
value="{{ old('importo_spese', 0) }}">
|
||||||
|
<div class="input-group-append">
|
||||||
|
<span class="input-group-text">€</span>
|
||||||
|
</div>
|
||||||
|
@error('importo_spese')
|
||||||
|
<div class="invalid-feedback">{{ $message }}</div>
|
||||||
|
@enderror
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="row">
|
||||||
|
<div class="col-md-6">
|
||||||
|
<div class="form-group">
|
||||||
|
<label for="importo_totale">Importo Totale</label>
|
||||||
|
<div class="input-group">
|
||||||
|
<input type="number" step="0.01" min="0"
|
||||||
|
class="form-control @error('importo_totale') is-invalid @enderror"
|
||||||
|
id="importo_totale" name="importo_totale"
|
||||||
|
value="{{ old('importo_totale') }}" readonly>
|
||||||
|
<div class="input-group-append">
|
||||||
|
<span class="input-group-text">€</span>
|
||||||
|
</div>
|
||||||
|
@error('importo_totale')
|
||||||
|
<div class="invalid-feedback">{{ $message }}</div>
|
||||||
|
@enderror
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="col-md-6">
|
||||||
|
<div class="form-group">
|
||||||
|
<label for="stato">Stato</label>
|
||||||
|
<select class="form-control @error('stato') is-invalid @enderror"
|
||||||
|
id="stato" name="stato">
|
||||||
|
<option value="da_pagare" {{ old('stato', 'da_pagare') == 'da_pagare' ? 'selected' : '' }}>Da Pagare</option>
|
||||||
|
<option value="pagata" {{ old('stato') == 'pagata' ? 'selected' : '' }}>Pagata</option>
|
||||||
|
<option value="scaduta" {{ old('stato') == 'scaduta' ? 'selected' : '' }}>Scaduta</option>
|
||||||
|
<option value="sospesa" {{ old('stato') == 'sospesa' ? 'selected' : '' }}>Sospesa</option>
|
||||||
|
</select>
|
||||||
|
@error('stato')
|
||||||
|
<div class="invalid-feedback">{{ $message }}</div>
|
||||||
|
@enderror
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="row">
|
||||||
|
<div class="col-md-6">
|
||||||
|
<div class="form-group">
|
||||||
|
<label for="data_pagamento">Data Pagamento</label>
|
||||||
|
<input type="date" class="form-control @error('data_pagamento') is-invalid @enderror"
|
||||||
|
id="data_pagamento" name="data_pagamento"
|
||||||
|
value="{{ old('data_pagamento') }}">
|
||||||
|
@error('data_pagamento')
|
||||||
|
<div class="invalid-feedback">{{ $message }}</div>
|
||||||
|
@enderror
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="col-md-6">
|
||||||
|
<div class="form-group">
|
||||||
|
<label for="importo_pagato">Importo Pagato</label>
|
||||||
|
<div class="input-group">
|
||||||
|
<input type="number" step="0.01" min="0"
|
||||||
|
class="form-control @error('importo_pagato') is-invalid @enderror"
|
||||||
|
id="importo_pagato" name="importo_pagato"
|
||||||
|
value="{{ old('importo_pagato', 0) }}">
|
||||||
|
<div class="input-group-append">
|
||||||
|
<span class="input-group-text">€</span>
|
||||||
|
</div>
|
||||||
|
@error('importo_pagato')
|
||||||
|
<div class="invalid-feedback">{{ $message }}</div>
|
||||||
|
@enderror
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="row">
|
||||||
|
<div class="col-12">
|
||||||
|
<div class="form-group">
|
||||||
|
<label for="note">Note</label>
|
||||||
|
<textarea class="form-control @error('note') is-invalid @enderror"
|
||||||
|
id="note" name="note" rows="3"
|
||||||
|
placeholder="Note aggiuntive sulla rata...">{{ old('note') }}</textarea>
|
||||||
|
@error('note')
|
||||||
|
<div class="invalid-feedback">{{ $message }}</div>
|
||||||
|
@enderror
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="card-footer">
|
||||||
|
<button type="submit" class="btn btn-primary">
|
||||||
|
<i class="fas fa-save"></i> Salva Rata
|
||||||
|
</button>
|
||||||
|
<a href="{{ route('admin.rate.index') }}" class="btn btn-default">
|
||||||
|
<i class="fas fa-times"></i> Annulla
|
||||||
|
</a>
|
||||||
|
</div>
|
||||||
|
</form>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
@endsection
|
||||||
|
|
||||||
|
@section('scripts')
|
||||||
|
<script>
|
||||||
|
$(document).ready(function() {
|
||||||
|
// Initialize Select2
|
||||||
|
$('.select2').select2({
|
||||||
|
theme: 'bootstrap4',
|
||||||
|
width: '100%'
|
||||||
|
});
|
||||||
|
|
||||||
|
// Calcola importo totale automaticamente
|
||||||
|
function calcolaImportoTotale() {
|
||||||
|
var importo = parseFloat($('#importo').val()) || 0;
|
||||||
|
var interessi = parseFloat($('#importo_interessi').val()) || 0;
|
||||||
|
var spese = parseFloat($('#importo_spese').val()) || 0;
|
||||||
|
var totale = importo + interessi + spese;
|
||||||
|
|
||||||
|
$('#importo_totale').val(totale.toFixed(2));
|
||||||
|
}
|
||||||
|
|
||||||
|
$('#importo, #importo_interessi, #importo_spese').on('input', calcolaImportoTotale);
|
||||||
|
|
||||||
|
// Gestione stato pagata
|
||||||
|
$('#stato').on('change', function() {
|
||||||
|
var stato = $(this).val();
|
||||||
|
if (stato === 'pagata') {
|
||||||
|
$('#data_pagamento').val(new Date().toISOString().split('T')[0]);
|
||||||
|
$('#importo_pagato').val($('#importo_totale').val());
|
||||||
|
} else {
|
||||||
|
$('#data_pagamento').val('');
|
||||||
|
$('#importo_pagato').val('0');
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
// Auto-fill importo pagato quando si cambia data pagamento
|
||||||
|
$('#data_pagamento').on('change', function() {
|
||||||
|
if ($(this).val() && $('#importo_pagato').val() == '0') {
|
||||||
|
$('#importo_pagato').val($('#importo_totale').val());
|
||||||
|
}
|
||||||
|
});
|
||||||
|
});
|
||||||
|
</script>
|
||||||
|
@endsection
|
||||||
273
resources/views/admin/rate/edit.blade.php
Normal file
273
resources/views/admin/rate/edit.blade.php
Normal file
|
|
@ -0,0 +1,273 @@
|
||||||
|
@extends('layouts.app')
|
||||||
|
|
||||||
|
@section('title', 'Modifica Rata')
|
||||||
|
|
||||||
|
@section('content')
|
||||||
|
<div class="container-fluid">
|
||||||
|
<div class="row">
|
||||||
|
<div class="col-12">
|
||||||
|
<div class="card">
|
||||||
|
<div class="card-header">
|
||||||
|
<h3 class="card-title">Modifica Rata</h3>
|
||||||
|
<div class="card-tools">
|
||||||
|
<a href="{{ route('admin.rate.show', $rata->id) }}" class="btn btn-info btn-sm">
|
||||||
|
<i class="fas fa-eye"></i> Visualizza
|
||||||
|
</a>
|
||||||
|
<a href="{{ route('admin.rate.index') }}" class="btn btn-default btn-sm">
|
||||||
|
<i class="fas fa-arrow-left"></i> Torna all'elenco
|
||||||
|
</a>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<form action="{{ route('admin.rate.update', $rata->id) }}" method="POST">
|
||||||
|
@csrf
|
||||||
|
@method('PUT')
|
||||||
|
<div class="card-body">
|
||||||
|
<div class="row">
|
||||||
|
<div class="col-md-6">
|
||||||
|
<div class="form-group">
|
||||||
|
<label for="piano_id">Piano di Rateizzazione *</label>
|
||||||
|
<select class="form-control select2 @error('piano_id') is-invalid @enderror"
|
||||||
|
id="piano_id" name="piano_id" required>
|
||||||
|
<option value="">Seleziona un piano</option>
|
||||||
|
@foreach($piani as $piano)
|
||||||
|
<option value="{{ $piano->id }}"
|
||||||
|
{{ old('piano_id', $rata->piano_id) == $piano->id ? 'selected' : '' }}>
|
||||||
|
{{ $piano->denominazione }} - {{ $piano->ripartizione->stabile->denominazione }}
|
||||||
|
</option>
|
||||||
|
@endforeach
|
||||||
|
</select>
|
||||||
|
@error('piano_id')
|
||||||
|
<div class="invalid-feedback">{{ $message }}</div>
|
||||||
|
@enderror
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="col-md-6">
|
||||||
|
<div class="form-group">
|
||||||
|
<label for="numero_rata">Numero Rata *</label>
|
||||||
|
<input type="number" min="1" max="999"
|
||||||
|
class="form-control @error('numero_rata') is-invalid @enderror"
|
||||||
|
id="numero_rata" name="numero_rata"
|
||||||
|
value="{{ old('numero_rata', $rata->numero_rata) }}" required>
|
||||||
|
@error('numero_rata')
|
||||||
|
<div class="invalid-feedback">{{ $message }}</div>
|
||||||
|
@enderror
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="row">
|
||||||
|
<div class="col-md-6">
|
||||||
|
<div class="form-group">
|
||||||
|
<label for="data_scadenza">Data Scadenza *</label>
|
||||||
|
<input type="date" class="form-control @error('data_scadenza') is-invalid @enderror"
|
||||||
|
id="data_scadenza" name="data_scadenza"
|
||||||
|
value="{{ old('data_scadenza', $rata->data_scadenza->format('Y-m-d')) }}" required>
|
||||||
|
@error('data_scadenza')
|
||||||
|
<div class="invalid-feedback">{{ $message }}</div>
|
||||||
|
@enderror
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="col-md-6">
|
||||||
|
<div class="form-group">
|
||||||
|
<label for="importo">Importo *</label>
|
||||||
|
<div class="input-group">
|
||||||
|
<input type="number" step="0.01" min="0"
|
||||||
|
class="form-control @error('importo') is-invalid @enderror"
|
||||||
|
id="importo" name="importo"
|
||||||
|
value="{{ old('importo', $rata->importo) }}" required>
|
||||||
|
<div class="input-group-append">
|
||||||
|
<span class="input-group-text">€</span>
|
||||||
|
</div>
|
||||||
|
@error('importo')
|
||||||
|
<div class="invalid-feedback">{{ $message }}</div>
|
||||||
|
@enderror
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="row">
|
||||||
|
<div class="col-md-6">
|
||||||
|
<div class="form-group">
|
||||||
|
<label for="importo_interessi">Importo Interessi</label>
|
||||||
|
<div class="input-group">
|
||||||
|
<input type="number" step="0.01" min="0"
|
||||||
|
class="form-control @error('importo_interessi') is-invalid @enderror"
|
||||||
|
id="importo_interessi" name="importo_interessi"
|
||||||
|
value="{{ old('importo_interessi', $rata->importo_interessi) }}">
|
||||||
|
<div class="input-group-append">
|
||||||
|
<span class="input-group-text">€</span>
|
||||||
|
</div>
|
||||||
|
@error('importo_interessi')
|
||||||
|
<div class="invalid-feedback">{{ $message }}</div>
|
||||||
|
@enderror
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="col-md-6">
|
||||||
|
<div class="form-group">
|
||||||
|
<label for="importo_spese">Importo Spese</label>
|
||||||
|
<div class="input-group">
|
||||||
|
<input type="number" step="0.01" min="0"
|
||||||
|
class="form-control @error('importo_spese') is-invalid @enderror"
|
||||||
|
id="importo_spese" name="importo_spese"
|
||||||
|
value="{{ old('importo_spese', $rata->importo_spese) }}">
|
||||||
|
<div class="input-group-append">
|
||||||
|
<span class="input-group-text">€</span>
|
||||||
|
</div>
|
||||||
|
@error('importo_spese')
|
||||||
|
<div class="invalid-feedback">{{ $message }}</div>
|
||||||
|
@enderror
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="row">
|
||||||
|
<div class="col-md-6">
|
||||||
|
<div class="form-group">
|
||||||
|
<label for="importo_totale">Importo Totale</label>
|
||||||
|
<div class="input-group">
|
||||||
|
<input type="number" step="0.01" min="0"
|
||||||
|
class="form-control @error('importo_totale') is-invalid @enderror"
|
||||||
|
id="importo_totale" name="importo_totale"
|
||||||
|
value="{{ old('importo_totale', $rata->importo_totale) }}" readonly>
|
||||||
|
<div class="input-group-append">
|
||||||
|
<span class="input-group-text">€</span>
|
||||||
|
</div>
|
||||||
|
@error('importo_totale')
|
||||||
|
<div class="invalid-feedback">{{ $message }}</div>
|
||||||
|
@enderror
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="col-md-6">
|
||||||
|
<div class="form-group">
|
||||||
|
<label for="stato">Stato</label>
|
||||||
|
<select class="form-control @error('stato') is-invalid @enderror"
|
||||||
|
id="stato" name="stato">
|
||||||
|
<option value="da_pagare" {{ old('stato', $rata->stato) == 'da_pagare' ? 'selected' : '' }}>Da Pagare</option>
|
||||||
|
<option value="pagata" {{ old('stato', $rata->stato) == 'pagata' ? 'selected' : '' }}>Pagata</option>
|
||||||
|
<option value="scaduta" {{ old('stato', $rata->stato) == 'scaduta' ? 'selected' : '' }}>Scaduta</option>
|
||||||
|
<option value="sospesa" {{ old('stato', $rata->stato) == 'sospesa' ? 'selected' : '' }}>Sospesa</option>
|
||||||
|
</select>
|
||||||
|
@error('stato')
|
||||||
|
<div class="invalid-feedback">{{ $message }}</div>
|
||||||
|
@enderror
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="row">
|
||||||
|
<div class="col-md-6">
|
||||||
|
<div class="form-group">
|
||||||
|
<label for="data_pagamento">Data Pagamento</label>
|
||||||
|
<input type="date" class="form-control @error('data_pagamento') is-invalid @enderror"
|
||||||
|
id="data_pagamento" name="data_pagamento"
|
||||||
|
value="{{ old('data_pagamento', $rata->data_pagamento ? $rata->data_pagamento->format('Y-m-d') : '') }}">
|
||||||
|
@error('data_pagamento')
|
||||||
|
<div class="invalid-feedback">{{ $message }}</div>
|
||||||
|
@enderror
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="col-md-6">
|
||||||
|
<div class="form-group">
|
||||||
|
<label for="importo_pagato">Importo Pagato</label>
|
||||||
|
<div class="input-group">
|
||||||
|
<input type="number" step="0.01" min="0"
|
||||||
|
class="form-control @error('importo_pagato') is-invalid @enderror"
|
||||||
|
id="importo_pagato" name="importo_pagato"
|
||||||
|
value="{{ old('importo_pagato', $rata->importo_pagato) }}">
|
||||||
|
<div class="input-group-append">
|
||||||
|
<span class="input-group-text">€</span>
|
||||||
|
</div>
|
||||||
|
@error('importo_pagato')
|
||||||
|
<div class="invalid-feedback">{{ $message }}</div>
|
||||||
|
@enderror
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="row">
|
||||||
|
<div class="col-12">
|
||||||
|
<div class="form-group">
|
||||||
|
<label for="note">Note</label>
|
||||||
|
<textarea class="form-control @error('note') is-invalid @enderror"
|
||||||
|
id="note" name="note" rows="3"
|
||||||
|
placeholder="Note aggiuntive sulla rata...">{{ old('note', $rata->note) }}</textarea>
|
||||||
|
@error('note')
|
||||||
|
<div class="invalid-feedback">{{ $message }}</div>
|
||||||
|
@enderror
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="card-footer">
|
||||||
|
<button type="submit" class="btn btn-primary">
|
||||||
|
<i class="fas fa-save"></i> Aggiorna Rata
|
||||||
|
</button>
|
||||||
|
<a href="{{ route('admin.rate.show', $rata->id) }}" class="btn btn-info">
|
||||||
|
<i class="fas fa-eye"></i> Visualizza
|
||||||
|
</a>
|
||||||
|
<a href="{{ route('admin.rate.index') }}" class="btn btn-default">
|
||||||
|
<i class="fas fa-times"></i> Annulla
|
||||||
|
</a>
|
||||||
|
</div>
|
||||||
|
</form>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
@endsection
|
||||||
|
|
||||||
|
@section('scripts')
|
||||||
|
<script>
|
||||||
|
$(document).ready(function() {
|
||||||
|
// Initialize Select2
|
||||||
|
$('.select2').select2({
|
||||||
|
theme: 'bootstrap4',
|
||||||
|
width: '100%'
|
||||||
|
});
|
||||||
|
|
||||||
|
// Calcola importo totale automaticamente
|
||||||
|
function calcolaImportoTotale() {
|
||||||
|
var importo = parseFloat($('#importo').val()) || 0;
|
||||||
|
var interessi = parseFloat($('#importo_interessi').val()) || 0;
|
||||||
|
var spese = parseFloat($('#importo_spese').val()) || 0;
|
||||||
|
var totale = importo + interessi + spese;
|
||||||
|
|
||||||
|
$('#importo_totale').val(totale.toFixed(2));
|
||||||
|
}
|
||||||
|
|
||||||
|
$('#importo, #importo_interessi, #importo_spese').on('input', calcolaImportoTotale);
|
||||||
|
|
||||||
|
// Gestione stato pagata
|
||||||
|
$('#stato').on('change', function() {
|
||||||
|
var stato = $(this).val();
|
||||||
|
if (stato === 'pagata') {
|
||||||
|
if (!$('#data_pagamento').val()) {
|
||||||
|
$('#data_pagamento').val(new Date().toISOString().split('T')[0]);
|
||||||
|
}
|
||||||
|
if ($('#importo_pagato').val() == '0') {
|
||||||
|
$('#importo_pagato').val($('#importo_totale').val());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
// Auto-fill importo pagato quando si cambia data pagamento
|
||||||
|
$('#data_pagamento').on('change', function() {
|
||||||
|
if ($(this).val() && $('#importo_pagato').val() == '0') {
|
||||||
|
$('#importo_pagato').val($('#importo_totale').val());
|
||||||
|
}
|
||||||
|
});
|
||||||
|
});
|
||||||
|
</script>
|
||||||
|
@endsection
|
||||||
286
resources/views/admin/rate/index.blade.php
Normal file
286
resources/views/admin/rate/index.blade.php
Normal file
|
|
@ -0,0 +1,286 @@
|
||||||
|
@extends('layouts.app')
|
||||||
|
|
||||||
|
@section('title', 'Gestione Rate')
|
||||||
|
|
||||||
|
@section('content')
|
||||||
|
<div class="container-fluid">
|
||||||
|
<div class="row">
|
||||||
|
<div class="col-12">
|
||||||
|
<div class="card">
|
||||||
|
<div class="card-header">
|
||||||
|
<h3 class="card-title">Gestione Rate</h3>
|
||||||
|
<div class="card-tools">
|
||||||
|
<a href="{{ route('admin.rate.create') }}" class="btn btn-primary btn-sm">
|
||||||
|
<i class="fas fa-plus"></i> Nuova Rata
|
||||||
|
</a>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="card-body">
|
||||||
|
<!-- Filtri -->
|
||||||
|
<div class="row mb-3">
|
||||||
|
<div class="col-md-3">
|
||||||
|
<select class="form-control" id="filtro-stato">
|
||||||
|
<option value="">Tutti gli stati</option>
|
||||||
|
<option value="da_pagare">Da Pagare</option>
|
||||||
|
<option value="pagata">Pagata</option>
|
||||||
|
<option value="scaduta">Scaduta</option>
|
||||||
|
<option value="sospesa">Sospesa</option>
|
||||||
|
</select>
|
||||||
|
</div>
|
||||||
|
<div class="col-md-3">
|
||||||
|
<select class="form-control" id="filtro-piano">
|
||||||
|
<option value="">Tutti i piani</option>
|
||||||
|
@foreach($piani as $piano)
|
||||||
|
<option value="{{ $piano->id }}">{{ $piano->denominazione }}</option>
|
||||||
|
@endforeach
|
||||||
|
</select>
|
||||||
|
</div>
|
||||||
|
<div class="col-md-3">
|
||||||
|
<input type="month" class="form-control" id="filtro-mese" placeholder="Filtra per mese">
|
||||||
|
</div>
|
||||||
|
<div class="col-md-3">
|
||||||
|
<button type="button" class="btn btn-secondary" id="btn-reset-filtri">
|
||||||
|
<i class="fas fa-sync"></i> Reset Filtri
|
||||||
|
</button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="table-responsive">
|
||||||
|
<table class="table table-bordered table-striped" id="rate-table">
|
||||||
|
<thead>
|
||||||
|
<tr>
|
||||||
|
<th>ID</th>
|
||||||
|
<th>Piano</th>
|
||||||
|
<th>Numero Rata</th>
|
||||||
|
<th>Data Scadenza</th>
|
||||||
|
<th>Importo</th>
|
||||||
|
<th>Interessi</th>
|
||||||
|
<th>Spese</th>
|
||||||
|
<th>Totale</th>
|
||||||
|
<th>Stato</th>
|
||||||
|
<th>Pagato</th>
|
||||||
|
<th>Residuo</th>
|
||||||
|
<th>Azioni</th>
|
||||||
|
</tr>
|
||||||
|
</thead>
|
||||||
|
<tbody>
|
||||||
|
@foreach($rate as $rata)
|
||||||
|
<tr class="{{ $rata->data_scadenza->isPast() && $rata->stato != 'pagata' ? 'table-danger' : '' }}">
|
||||||
|
<td>{{ $rata->id }}</td>
|
||||||
|
<td>
|
||||||
|
<a href="{{ route('admin.piani-rateizzazione.show', $rata->piano->id) }}" class="text-info">
|
||||||
|
{{ $rata->piano->denominazione }}
|
||||||
|
</a>
|
||||||
|
</td>
|
||||||
|
<td>{{ $rata->numero_rata }}</td>
|
||||||
|
<td>{{ $rata->data_scadenza->format('d/m/Y') }}</td>
|
||||||
|
<td>€ {{ number_format($rata->importo, 2, ',', '.') }}</td>
|
||||||
|
<td>€ {{ number_format($rata->importo_interessi, 2, ',', '.') }}</td>
|
||||||
|
<td>€ {{ number_format($rata->importo_spese, 2, ',', '.') }}</td>
|
||||||
|
<td><strong>€ {{ number_format($rata->importo_totale, 2, ',', '.') }}</strong></td>
|
||||||
|
<td>
|
||||||
|
<span class="badge badge-{{ $rata->stato == 'pagata' ? 'success' : ($rata->stato == 'scaduta' ? 'danger' : ($rata->stato == 'sospesa' ? 'warning' : 'info')) }}">
|
||||||
|
{{ ucfirst($rata->stato) }}
|
||||||
|
</span>
|
||||||
|
</td>
|
||||||
|
<td>€ {{ number_format($rata->importo_pagato, 2, ',', '.') }}</td>
|
||||||
|
<td>€ {{ number_format($rata->importo_totale - $rata->importo_pagato, 2, ',', '.') }}</td>
|
||||||
|
<td>
|
||||||
|
<div class="btn-group">
|
||||||
|
<a href="{{ route('admin.rate.show', $rata->id) }}" class="btn btn-sm btn-info">
|
||||||
|
<i class="fas fa-eye"></i>
|
||||||
|
</a>
|
||||||
|
@can('update', $rata)
|
||||||
|
<a href="{{ route('admin.rate.edit', $rata->id) }}" class="btn btn-sm btn-primary">
|
||||||
|
<i class="fas fa-edit"></i>
|
||||||
|
</a>
|
||||||
|
@endcan
|
||||||
|
@if($rata->stato != 'pagata')
|
||||||
|
<button type="button" class="btn btn-sm btn-success" onclick="marcaPagata({{ $rata->id }})">
|
||||||
|
<i class="fas fa-check"></i>
|
||||||
|
</button>
|
||||||
|
@endif
|
||||||
|
@can('delete', $rata)
|
||||||
|
<form action="{{ route('admin.rate.destroy', $rata->id) }}" method="POST" style="display: inline;">
|
||||||
|
@csrf
|
||||||
|
@method('DELETE')
|
||||||
|
<button type="submit" class="btn btn-sm btn-danger" onclick="return confirm('Sei sicuro di voler eliminare questa rata?')">
|
||||||
|
<i class="fas fa-trash"></i>
|
||||||
|
</button>
|
||||||
|
</form>
|
||||||
|
@endcan
|
||||||
|
</div>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
@endforeach
|
||||||
|
</tbody>
|
||||||
|
</table>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<!-- Statistiche -->
|
||||||
|
<div class="row">
|
||||||
|
<div class="col-lg-3 col-6">
|
||||||
|
<div class="small-box bg-info">
|
||||||
|
<div class="inner">
|
||||||
|
<h3>{{ $rate->count() }}</h3>
|
||||||
|
<p>Rate Totali</p>
|
||||||
|
</div>
|
||||||
|
<div class="icon">
|
||||||
|
<i class="fas fa-calendar-check"></i>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="col-lg-3 col-6">
|
||||||
|
<div class="small-box bg-success">
|
||||||
|
<div class="inner">
|
||||||
|
<h3>{{ $rate->where('stato', 'pagata')->count() }}</h3>
|
||||||
|
<p>Rate Pagate</p>
|
||||||
|
</div>
|
||||||
|
<div class="icon">
|
||||||
|
<i class="fas fa-check"></i>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="col-lg-3 col-6">
|
||||||
|
<div class="small-box bg-danger">
|
||||||
|
<div class="inner">
|
||||||
|
<h3>{{ $rate->where('stato', 'scaduta')->count() }}</h3>
|
||||||
|
<p>Rate Scadute</p>
|
||||||
|
</div>
|
||||||
|
<div class="icon">
|
||||||
|
<i class="fas fa-exclamation-triangle"></i>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="col-lg-3 col-6">
|
||||||
|
<div class="small-box bg-warning">
|
||||||
|
<div class="inner">
|
||||||
|
<h3>€ {{ number_format($rate->sum('importo_totale'), 0, ',', '.') }}</h3>
|
||||||
|
<p>Importo Totale</p>
|
||||||
|
</div>
|
||||||
|
<div class="icon">
|
||||||
|
<i class="fas fa-euro-sign"></i>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<!-- Rate in scadenza -->
|
||||||
|
@if($rateInScadenza->count() > 0)
|
||||||
|
<div class="row">
|
||||||
|
<div class="col-12">
|
||||||
|
<div class="card card-warning">
|
||||||
|
<div class="card-header">
|
||||||
|
<h3 class="card-title">Rate in Scadenza (prossimi 30 giorni)</h3>
|
||||||
|
</div>
|
||||||
|
<div class="card-body">
|
||||||
|
<div class="table-responsive">
|
||||||
|
<table class="table table-bordered table-striped table-sm">
|
||||||
|
<thead>
|
||||||
|
<tr>
|
||||||
|
<th>Piano</th>
|
||||||
|
<th>Rata</th>
|
||||||
|
<th>Data Scadenza</th>
|
||||||
|
<th>Importo</th>
|
||||||
|
<th>Giorni alla scadenza</th>
|
||||||
|
<th>Azioni</th>
|
||||||
|
</tr>
|
||||||
|
</thead>
|
||||||
|
<tbody>
|
||||||
|
@foreach($rateInScadenza as $rata)
|
||||||
|
<tr>
|
||||||
|
<td>{{ $rata->piano->denominazione }}</td>
|
||||||
|
<td>{{ $rata->numero_rata }}</td>
|
||||||
|
<td>{{ $rata->data_scadenza->format('d/m/Y') }}</td>
|
||||||
|
<td>€ {{ number_format($rata->importo_totale, 2, ',', '.') }}</td>
|
||||||
|
<td>{{ $rata->data_scadenza->diffInDays(now()) }}</td>
|
||||||
|
<td>
|
||||||
|
<a href="{{ route('admin.rate.show', $rata->id) }}" class="btn btn-sm btn-info">
|
||||||
|
<i class="fas fa-eye"></i>
|
||||||
|
</a>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
@endforeach
|
||||||
|
</tbody>
|
||||||
|
</table>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
@endif
|
||||||
|
</div>
|
||||||
|
@endsection
|
||||||
|
|
||||||
|
@section('scripts')
|
||||||
|
<script>
|
||||||
|
$(document).ready(function() {
|
||||||
|
var table = $('#rate-table').DataTable({
|
||||||
|
responsive: true,
|
||||||
|
lengthChange: false,
|
||||||
|
autoWidth: false,
|
||||||
|
order: [[3, 'desc']],
|
||||||
|
language: {
|
||||||
|
url: '//cdn.datatables.net/plug-ins/1.10.25/i18n/Italian.json'
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
// Filtri
|
||||||
|
$('#filtro-stato').on('change', function() {
|
||||||
|
var stato = $(this).val();
|
||||||
|
table.column(8).search(stato).draw();
|
||||||
|
});
|
||||||
|
|
||||||
|
$('#filtro-piano').on('change', function() {
|
||||||
|
var piano = $(this).val();
|
||||||
|
table.column(1).search(piano).draw();
|
||||||
|
});
|
||||||
|
|
||||||
|
$('#filtro-mese').on('change', function() {
|
||||||
|
var mese = $(this).val();
|
||||||
|
if (mese) {
|
||||||
|
var anno = mese.split('-')[0];
|
||||||
|
var meseNum = mese.split('-')[1];
|
||||||
|
table.column(3).search(meseNum + '/' + anno).draw();
|
||||||
|
} else {
|
||||||
|
table.column(3).search('').draw();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
$('#btn-reset-filtri').on('click', function() {
|
||||||
|
$('#filtro-stato, #filtro-piano, #filtro-mese').val('');
|
||||||
|
table.search('').columns().search('').draw();
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
function marcaPagata(id) {
|
||||||
|
if (confirm('Sei sicuro di voler marcare questa rata come pagata?')) {
|
||||||
|
$.ajax({
|
||||||
|
url: '{{ route("admin.rate.marca-pagata", ":id") }}'.replace(':id', id),
|
||||||
|
type: 'POST',
|
||||||
|
data: {
|
||||||
|
_token: '{{ csrf_token() }}'
|
||||||
|
},
|
||||||
|
success: function(response) {
|
||||||
|
if (response.success) {
|
||||||
|
location.reload();
|
||||||
|
} else {
|
||||||
|
alert('Errore: ' + response.message);
|
||||||
|
}
|
||||||
|
},
|
||||||
|
error: function() {
|
||||||
|
alert('Errore nella marcatura del pagamento');
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
@endsection
|
||||||
351
resources/views/admin/rate/show.blade.php
Normal file
351
resources/views/admin/rate/show.blade.php
Normal file
|
|
@ -0,0 +1,351 @@
|
||||||
|
@extends('layouts.app')
|
||||||
|
|
||||||
|
@section('title', 'Dettaglio Rata')
|
||||||
|
|
||||||
|
@section('content')
|
||||||
|
<div class="container-fluid">
|
||||||
|
<div class="row">
|
||||||
|
<div class="col-12">
|
||||||
|
<div class="card">
|
||||||
|
<div class="card-header">
|
||||||
|
<h3 class="card-title">Dettaglio Rata</h3>
|
||||||
|
<div class="card-tools">
|
||||||
|
@can('update', $rata)
|
||||||
|
<a href="{{ route('admin.rate.edit', $rata->id) }}" class="btn btn-primary btn-sm">
|
||||||
|
<i class="fas fa-edit"></i> Modifica
|
||||||
|
</a>
|
||||||
|
@endcan
|
||||||
|
@if($rata->stato != 'pagata')
|
||||||
|
<button type="button" class="btn btn-success btn-sm" onclick="marcaPagata({{ $rata->id }})">
|
||||||
|
<i class="fas fa-check"></i> Marca Pagata
|
||||||
|
</button>
|
||||||
|
@endif
|
||||||
|
<a href="{{ route('admin.rate.index') }}" class="btn btn-default btn-sm">
|
||||||
|
<i class="fas fa-arrow-left"></i> Torna all'elenco
|
||||||
|
</a>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="card-body">
|
||||||
|
<div class="row">
|
||||||
|
<div class="col-md-6">
|
||||||
|
<div class="info-box">
|
||||||
|
<span class="info-box-icon bg-primary"><i class="fas fa-calendar-alt"></i></span>
|
||||||
|
<div class="info-box-content">
|
||||||
|
<span class="info-box-text">Piano di Rateizzazione</span>
|
||||||
|
<span class="info-box-number">
|
||||||
|
<a href="{{ route('admin.piani-rateizzazione.show', $rata->piano->id) }}" class="text-primary">
|
||||||
|
{{ $rata->piano->denominazione }}
|
||||||
|
</a>
|
||||||
|
</span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="col-md-6">
|
||||||
|
<div class="info-box">
|
||||||
|
<span class="info-box-icon bg-info"><i class="fas fa-list-ol"></i></span>
|
||||||
|
<div class="info-box-content">
|
||||||
|
<span class="info-box-text">Numero Rata</span>
|
||||||
|
<span class="info-box-number">{{ $rata->numero_rata }}</span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="row">
|
||||||
|
<div class="col-md-3">
|
||||||
|
<div class="info-box">
|
||||||
|
<span class="info-box-icon bg-secondary"><i class="fas fa-calendar"></i></span>
|
||||||
|
<div class="info-box-content">
|
||||||
|
<span class="info-box-text">Data Scadenza</span>
|
||||||
|
<span class="info-box-number">{{ $rata->data_scadenza->format('d/m/Y') }}</span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="col-md-3">
|
||||||
|
<div class="info-box">
|
||||||
|
<span class="info-box-icon bg-success"><i class="fas fa-euro-sign"></i></span>
|
||||||
|
<div class="info-box-content">
|
||||||
|
<span class="info-box-text">Importo</span>
|
||||||
|
<span class="info-box-number">€ {{ number_format($rata->importo, 2, ',', '.') }}</span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="col-md-3">
|
||||||
|
<div class="info-box">
|
||||||
|
<span class="info-box-icon bg-warning"><i class="fas fa-percentage"></i></span>
|
||||||
|
<div class="info-box-content">
|
||||||
|
<span class="info-box-text">Interessi</span>
|
||||||
|
<span class="info-box-number">€ {{ number_format($rata->importo_interessi, 2, ',', '.') }}</span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="col-md-3">
|
||||||
|
<div class="info-box">
|
||||||
|
<span class="info-box-icon bg-danger"><i class="fas fa-file-invoice"></i></span>
|
||||||
|
<div class="info-box-content">
|
||||||
|
<span class="info-box-text">Spese</span>
|
||||||
|
<span class="info-box-number">€ {{ number_format($rata->importo_spese, 2, ',', '.') }}</span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="row">
|
||||||
|
<div class="col-md-4">
|
||||||
|
<div class="info-box">
|
||||||
|
<span class="info-box-icon bg-primary"><i class="fas fa-calculator"></i></span>
|
||||||
|
<div class="info-box-content">
|
||||||
|
<span class="info-box-text">Importo Totale</span>
|
||||||
|
<span class="info-box-number">€ {{ number_format($rata->importo_totale, 2, ',', '.') }}</span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="col-md-4">
|
||||||
|
<div class="info-box">
|
||||||
|
<span class="info-box-icon bg-{{ $rata->stato == 'pagata' ? 'success' : ($rata->stato == 'scaduta' ? 'danger' : ($rata->stato == 'sospesa' ? 'warning' : 'info')) }}">
|
||||||
|
<i class="fas fa-{{ $rata->stato == 'pagata' ? 'check' : ($rata->stato == 'scaduta' ? 'times' : ($rata->stato == 'sospesa' ? 'pause' : 'clock')) }}"></i>
|
||||||
|
</span>
|
||||||
|
<div class="info-box-content">
|
||||||
|
<span class="info-box-text">Stato</span>
|
||||||
|
<span class="info-box-number">{{ ucfirst($rata->stato) }}</span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="col-md-4">
|
||||||
|
<div class="info-box">
|
||||||
|
<span class="info-box-icon bg-success"><i class="fas fa-money-bill"></i></span>
|
||||||
|
<div class="info-box-content">
|
||||||
|
<span class="info-box-text">Importo Pagato</span>
|
||||||
|
<span class="info-box-number">€ {{ number_format($rata->importo_pagato, 2, ',', '.') }}</span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="row">
|
||||||
|
<div class="col-md-6">
|
||||||
|
<div class="form-group">
|
||||||
|
<label>Data Pagamento</label>
|
||||||
|
<p class="form-control-plaintext">{{ $rata->data_pagamento ? $rata->data_pagamento->format('d/m/Y') : 'Non pagata' }}</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="col-md-6">
|
||||||
|
<div class="form-group">
|
||||||
|
<label>Importo Residuo</label>
|
||||||
|
<p class="form-control-plaintext">€ {{ number_format($rata->importo_totale - $rata->importo_pagato, 2, ',', '.') }}</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="row">
|
||||||
|
<div class="col-md-6">
|
||||||
|
<div class="form-group">
|
||||||
|
<label>Ripartizione Spesa</label>
|
||||||
|
<p class="form-control-plaintext">
|
||||||
|
<a href="{{ route('admin.ripartizioni-spesa.show', $rata->piano->ripartizione->id) }}" class="text-info">
|
||||||
|
{{ $rata->piano->ripartizione->voceSpesa->codice }} - {{ $rata->piano->ripartizione->voceSpesa->descrizione }}
|
||||||
|
</a>
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="col-md-6">
|
||||||
|
<div class="form-group">
|
||||||
|
<label>Stabile</label>
|
||||||
|
<p class="form-control-plaintext">{{ $rata->piano->ripartizione->stabile->denominazione }}</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
@if($rata->note)
|
||||||
|
<div class="row">
|
||||||
|
<div class="col-12">
|
||||||
|
<div class="form-group">
|
||||||
|
<label>Note</label>
|
||||||
|
<p class="form-control-plaintext">{{ $rata->note }}</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
@endif
|
||||||
|
|
||||||
|
<div class="row">
|
||||||
|
<div class="col-12">
|
||||||
|
<div class="form-group">
|
||||||
|
<label>Audit</label>
|
||||||
|
<div class="table-responsive">
|
||||||
|
<table class="table table-sm">
|
||||||
|
<tr>
|
||||||
|
<th>Creato il:</th>
|
||||||
|
<td>{{ $rata->created_at->format('d/m/Y H:i:s') }}</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<th>Ultima modifica:</th>
|
||||||
|
<td>{{ $rata->updated_at->format('d/m/Y H:i:s') }}</td>
|
||||||
|
</tr>
|
||||||
|
</table>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<!-- Progresso Pagamento -->
|
||||||
|
<div class="row">
|
||||||
|
<div class="col-12">
|
||||||
|
<div class="card">
|
||||||
|
<div class="card-header">
|
||||||
|
<h3 class="card-title">Progresso Pagamento</h3>
|
||||||
|
</div>
|
||||||
|
<div class="card-body">
|
||||||
|
@php
|
||||||
|
$percentuale = $rata->importo_totale > 0 ? ($rata->importo_pagato / $rata->importo_totale) * 100 : 0;
|
||||||
|
@endphp
|
||||||
|
<div class="progress mb-3">
|
||||||
|
<div class="progress-bar bg-{{ $percentuale == 100 ? 'success' : ($percentuale > 0 ? 'warning' : 'danger') }}"
|
||||||
|
role="progressbar" style="width: {{ $percentuale }}%"
|
||||||
|
aria-valuenow="{{ $percentuale }}" aria-valuemin="0" aria-valuemax="100">
|
||||||
|
{{ round($percentuale, 1) }}%
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="row">
|
||||||
|
<div class="col-md-4">
|
||||||
|
<p class="text-muted">Importo Totale: <strong>€ {{ number_format($rata->importo_totale, 2, ',', '.') }}</strong></p>
|
||||||
|
</div>
|
||||||
|
<div class="col-md-4">
|
||||||
|
<p class="text-muted">Importo Pagato: <strong>€ {{ number_format($rata->importo_pagato, 2, ',', '.') }}</strong></p>
|
||||||
|
</div>
|
||||||
|
<div class="col-md-4">
|
||||||
|
<p class="text-muted">Importo Residuo: <strong>€ {{ number_format($rata->importo_totale - $rata->importo_pagato, 2, ',', '.') }}</strong></p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<!-- Storico Pagamenti -->
|
||||||
|
@if($rata->stato == 'pagata' || $rata->importo_pagato > 0)
|
||||||
|
<div class="row">
|
||||||
|
<div class="col-12">
|
||||||
|
<div class="card">
|
||||||
|
<div class="card-header">
|
||||||
|
<h3 class="card-title">Storico Pagamenti</h3>
|
||||||
|
</div>
|
||||||
|
<div class="card-body">
|
||||||
|
<div class="table-responsive">
|
||||||
|
<table class="table table-bordered table-striped">
|
||||||
|
<thead>
|
||||||
|
<tr>
|
||||||
|
<th>Data</th>
|
||||||
|
<th>Importo</th>
|
||||||
|
<th>Tipo</th>
|
||||||
|
<th>Note</th>
|
||||||
|
</tr>
|
||||||
|
</thead>
|
||||||
|
<tbody>
|
||||||
|
@if($rata->data_pagamento)
|
||||||
|
<tr>
|
||||||
|
<td>{{ $rata->data_pagamento->format('d/m/Y') }}</td>
|
||||||
|
<td>€ {{ number_format($rata->importo_pagato, 2, ',', '.') }}</td>
|
||||||
|
<td>
|
||||||
|
<span class="badge badge-success">Pagamento</span>
|
||||||
|
</td>
|
||||||
|
<td>{{ $rata->note ?? 'Pagamento completo' }}</td>
|
||||||
|
</tr>
|
||||||
|
@endif
|
||||||
|
</tbody>
|
||||||
|
</table>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
@endif
|
||||||
|
|
||||||
|
<!-- Altre Rate del Piano -->
|
||||||
|
<div class="row">
|
||||||
|
<div class="col-12">
|
||||||
|
<div class="card">
|
||||||
|
<div class="card-header">
|
||||||
|
<h3 class="card-title">Altre Rate del Piano</h3>
|
||||||
|
</div>
|
||||||
|
<div class="card-body">
|
||||||
|
<div class="table-responsive">
|
||||||
|
<table class="table table-bordered table-striped table-sm">
|
||||||
|
<thead>
|
||||||
|
<tr>
|
||||||
|
<th>Numero</th>
|
||||||
|
<th>Data Scadenza</th>
|
||||||
|
<th>Importo</th>
|
||||||
|
<th>Stato</th>
|
||||||
|
<th>Azioni</th>
|
||||||
|
</tr>
|
||||||
|
</thead>
|
||||||
|
<tbody>
|
||||||
|
@foreach($rata->piano->rate as $altraRata)
|
||||||
|
<tr class="{{ $altraRata->id == $rata->id ? 'table-active' : '' }}">
|
||||||
|
<td>{{ $altraRata->numero_rata }}</td>
|
||||||
|
<td>{{ $altraRata->data_scadenza->format('d/m/Y') }}</td>
|
||||||
|
<td>€ {{ number_format($altraRata->importo_totale, 2, ',', '.') }}</td>
|
||||||
|
<td>
|
||||||
|
<span class="badge badge-{{ $altraRata->stato == 'pagata' ? 'success' : ($altraRata->stato == 'scaduta' ? 'danger' : 'warning') }}">
|
||||||
|
{{ ucfirst($altraRata->stato) }}
|
||||||
|
</span>
|
||||||
|
</td>
|
||||||
|
<td>
|
||||||
|
@if($altraRata->id != $rata->id)
|
||||||
|
<a href="{{ route('admin.rate.show', $altraRata->id) }}" class="btn btn-sm btn-info">
|
||||||
|
<i class="fas fa-eye"></i>
|
||||||
|
</a>
|
||||||
|
@else
|
||||||
|
<span class="badge badge-primary">Attuale</span>
|
||||||
|
@endif
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
@endforeach
|
||||||
|
</tbody>
|
||||||
|
</table>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
@endsection
|
||||||
|
|
||||||
|
@section('scripts')
|
||||||
|
<script>
|
||||||
|
function marcaPagata(id) {
|
||||||
|
if (confirm('Sei sicuro di voler marcare questa rata come pagata?')) {
|
||||||
|
$.ajax({
|
||||||
|
url: '{{ route("admin.rate.marca-pagata", ":id") }}'.replace(':id', id),
|
||||||
|
type: 'POST',
|
||||||
|
data: {
|
||||||
|
_token: '{{ csrf_token() }}'
|
||||||
|
},
|
||||||
|
success: function(response) {
|
||||||
|
if (response.success) {
|
||||||
|
location.reload();
|
||||||
|
} else {
|
||||||
|
alert('Errore: ' + response.message);
|
||||||
|
}
|
||||||
|
},
|
||||||
|
error: function() {
|
||||||
|
alert('Errore nella marcatura del pagamento');
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
@endsection
|
||||||
203
resources/views/admin/ripartizioni-spesa/create.blade.php
Normal file
203
resources/views/admin/ripartizioni-spesa/create.blade.php
Normal file
|
|
@ -0,0 +1,203 @@
|
||||||
|
@extends('layouts.app')
|
||||||
|
|
||||||
|
@section('title', 'Nuova Ripartizione Spesa')
|
||||||
|
|
||||||
|
@section('content')
|
||||||
|
<div class="container-fluid">
|
||||||
|
<div class="row">
|
||||||
|
<div class="col-12">
|
||||||
|
<div class="card">
|
||||||
|
<div class="card-header">
|
||||||
|
<h3 class="card-title">Nuova Ripartizione Spesa</h3>
|
||||||
|
<div class="card-tools">
|
||||||
|
<a href="{{ route('admin.ripartizioni-spesa.index') }}" class="btn btn-default btn-sm">
|
||||||
|
<i class="fas fa-arrow-left"></i> Torna all'elenco
|
||||||
|
</a>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<form action="{{ route('admin.ripartizioni-spesa.store') }}" method="POST">
|
||||||
|
@csrf
|
||||||
|
<div class="card-body">
|
||||||
|
<div class="row">
|
||||||
|
<div class="col-md-6">
|
||||||
|
<div class="form-group">
|
||||||
|
<label for="voce_spesa_id">Voce di Spesa *</label>
|
||||||
|
<select class="form-control select2 @error('voce_spesa_id') is-invalid @enderror"
|
||||||
|
id="voce_spesa_id" name="voce_spesa_id" required>
|
||||||
|
<option value="">Seleziona una voce di spesa</option>
|
||||||
|
@foreach($voci_spesa as $voce)
|
||||||
|
<option value="{{ $voce->id }}" {{ old('voce_spesa_id') == $voce->id ? 'selected' : '' }}>
|
||||||
|
{{ $voce->codice }} - {{ $voce->descrizione }}
|
||||||
|
</option>
|
||||||
|
@endforeach
|
||||||
|
</select>
|
||||||
|
@error('voce_spesa_id')
|
||||||
|
<div class="invalid-feedback">{{ $message }}</div>
|
||||||
|
@enderror
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="col-md-6">
|
||||||
|
<div class="form-group">
|
||||||
|
<label for="stabile_id">Stabile *</label>
|
||||||
|
<select class="form-control select2 @error('stabile_id') is-invalid @enderror"
|
||||||
|
id="stabile_id" name="stabile_id" required>
|
||||||
|
<option value="">Seleziona uno stabile</option>
|
||||||
|
@foreach($stabili as $stabile)
|
||||||
|
<option value="{{ $stabile->id }}" {{ old('stabile_id') == $stabile->id ? 'selected' : '' }}>
|
||||||
|
{{ $stabile->denominazione }}
|
||||||
|
</option>
|
||||||
|
@endforeach
|
||||||
|
</select>
|
||||||
|
@error('stabile_id')
|
||||||
|
<div class="invalid-feedback">{{ $message }}</div>
|
||||||
|
@enderror
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="row">
|
||||||
|
<div class="col-md-6">
|
||||||
|
<div class="form-group">
|
||||||
|
<label for="tabella_millesimale_id">Tabella Millesimale *</label>
|
||||||
|
<select class="form-control select2 @error('tabella_millesimale_id') is-invalid @enderror"
|
||||||
|
id="tabella_millesimale_id" name="tabella_millesimale_id" required>
|
||||||
|
<option value="">Seleziona una tabella millesimale</option>
|
||||||
|
@foreach($tabelle_millesimali as $tabella)
|
||||||
|
<option value="{{ $tabella->id }}" {{ old('tabella_millesimale_id') == $tabella->id ? 'selected' : '' }}>
|
||||||
|
{{ $tabella->descrizione }}
|
||||||
|
</option>
|
||||||
|
@endforeach
|
||||||
|
</select>
|
||||||
|
@error('tabella_millesimale_id')
|
||||||
|
<div class="invalid-feedback">{{ $message }}</div>
|
||||||
|
@enderror
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="col-md-6">
|
||||||
|
<div class="form-group">
|
||||||
|
<label for="importo_totale">Importo Totale *</label>
|
||||||
|
<div class="input-group">
|
||||||
|
<input type="number" step="0.01" min="0"
|
||||||
|
class="form-control @error('importo_totale') is-invalid @enderror"
|
||||||
|
id="importo_totale" name="importo_totale"
|
||||||
|
value="{{ old('importo_totale') }}" required>
|
||||||
|
<div class="input-group-append">
|
||||||
|
<span class="input-group-text">€</span>
|
||||||
|
</div>
|
||||||
|
@error('importo_totale')
|
||||||
|
<div class="invalid-feedback">{{ $message }}</div>
|
||||||
|
@enderror
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="row">
|
||||||
|
<div class="col-md-4">
|
||||||
|
<div class="form-group">
|
||||||
|
<label for="data_ripartizione">Data Ripartizione *</label>
|
||||||
|
<input type="date" class="form-control @error('data_ripartizione') is-invalid @enderror"
|
||||||
|
id="data_ripartizione" name="data_ripartizione"
|
||||||
|
value="{{ old('data_ripartizione', date('Y-m-d')) }}" required>
|
||||||
|
@error('data_ripartizione')
|
||||||
|
<div class="invalid-feedback">{{ $message }}</div>
|
||||||
|
@enderror
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="col-md-4">
|
||||||
|
<div class="form-group">
|
||||||
|
<label for="stato">Stato</label>
|
||||||
|
<select class="form-control @error('stato') is-invalid @enderror"
|
||||||
|
id="stato" name="stato">
|
||||||
|
<option value="bozza" {{ old('stato', 'bozza') == 'bozza' ? 'selected' : '' }}>Bozza</option>
|
||||||
|
<option value="definitiva" {{ old('stato') == 'definitiva' ? 'selected' : '' }}>Definitiva</option>
|
||||||
|
<option value="annullata" {{ old('stato') == 'annullata' ? 'selected' : '' }}>Annullata</option>
|
||||||
|
</select>
|
||||||
|
@error('stato')
|
||||||
|
<div class="invalid-feedback">{{ $message }}</div>
|
||||||
|
@enderror
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="col-md-4">
|
||||||
|
<div class="form-group">
|
||||||
|
<label for="anno_competenza">Anno Competenza *</label>
|
||||||
|
<input type="number" min="2000" max="2099"
|
||||||
|
class="form-control @error('anno_competenza') is-invalid @enderror"
|
||||||
|
id="anno_competenza" name="anno_competenza"
|
||||||
|
value="{{ old('anno_competenza', date('Y')) }}" required>
|
||||||
|
@error('anno_competenza')
|
||||||
|
<div class="invalid-feedback">{{ $message }}</div>
|
||||||
|
@enderror
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="row">
|
||||||
|
<div class="col-12">
|
||||||
|
<div class="form-group">
|
||||||
|
<label for="note">Note</label>
|
||||||
|
<textarea class="form-control @error('note') is-invalid @enderror"
|
||||||
|
id="note" name="note" rows="3"
|
||||||
|
placeholder="Note aggiuntive sulla ripartizione...">{{ old('note') }}</textarea>
|
||||||
|
@error('note')
|
||||||
|
<div class="invalid-feedback">{{ $message }}</div>
|
||||||
|
@enderror
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="card-footer">
|
||||||
|
<button type="submit" class="btn btn-primary">
|
||||||
|
<i class="fas fa-save"></i> Salva Ripartizione
|
||||||
|
</button>
|
||||||
|
<a href="{{ route('admin.ripartizioni-spesa.index') }}" class="btn btn-default">
|
||||||
|
<i class="fas fa-times"></i> Annulla
|
||||||
|
</a>
|
||||||
|
</div>
|
||||||
|
</form>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
@endsection
|
||||||
|
|
||||||
|
@section('scripts')
|
||||||
|
<script>
|
||||||
|
$(document).ready(function() {
|
||||||
|
// Initialize Select2
|
||||||
|
$('.select2').select2({
|
||||||
|
theme: 'bootstrap4',
|
||||||
|
width: '100%'
|
||||||
|
});
|
||||||
|
|
||||||
|
// Handle stabile change to filter tabelle millesimali
|
||||||
|
$('#stabile_id').on('change', function() {
|
||||||
|
var stabileId = $(this).val();
|
||||||
|
var tabellaSelect = $('#tabella_millesimale_id');
|
||||||
|
|
||||||
|
if (stabileId) {
|
||||||
|
$.ajax({
|
||||||
|
url: '{{ route("admin.stabili.tabelle-millesimali", ":id") }}'.replace(':id', stabileId),
|
||||||
|
type: 'GET',
|
||||||
|
success: function(data) {
|
||||||
|
tabellaSelect.empty();
|
||||||
|
tabellaSelect.append('<option value="">Seleziona una tabella millesimale</option>');
|
||||||
|
$.each(data, function(index, tabella) {
|
||||||
|
tabellaSelect.append('<option value="' + tabella.id + '">' + tabella.descrizione + '</option>');
|
||||||
|
});
|
||||||
|
}
|
||||||
|
});
|
||||||
|
} else {
|
||||||
|
tabellaSelect.empty();
|
||||||
|
tabellaSelect.append('<option value="">Seleziona una tabella millesimale</option>');
|
||||||
|
}
|
||||||
|
});
|
||||||
|
});
|
||||||
|
</script>
|
||||||
|
@endsection
|
||||||
253
resources/views/admin/ripartizioni-spesa/edit.blade.php
Normal file
253
resources/views/admin/ripartizioni-spesa/edit.blade.php
Normal file
|
|
@ -0,0 +1,253 @@
|
||||||
|
@extends('layouts.app')
|
||||||
|
|
||||||
|
@section('title', 'Modifica Ripartizione Spesa')
|
||||||
|
|
||||||
|
@section('content')
|
||||||
|
<div class="container-fluid">
|
||||||
|
<div class="row">
|
||||||
|
<div class="col-12">
|
||||||
|
<div class="card">
|
||||||
|
<div class="card-header">
|
||||||
|
<h3 class="card-title">Modifica Ripartizione Spesa</h3>
|
||||||
|
<div class="card-tools">
|
||||||
|
<a href="{{ route('admin.ripartizioni-spesa.show', $ripartizione->id) }}" class="btn btn-info btn-sm">
|
||||||
|
<i class="fas fa-eye"></i> Visualizza
|
||||||
|
</a>
|
||||||
|
<a href="{{ route('admin.ripartizioni-spesa.index') }}" class="btn btn-default btn-sm">
|
||||||
|
<i class="fas fa-arrow-left"></i> Torna all'elenco
|
||||||
|
</a>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<form action="{{ route('admin.ripartizioni-spesa.update', $ripartizione->id) }}" method="POST">
|
||||||
|
@csrf
|
||||||
|
@method('PUT')
|
||||||
|
<div class="card-body">
|
||||||
|
<div class="row">
|
||||||
|
<div class="col-md-6">
|
||||||
|
<div class="form-group">
|
||||||
|
<label for="voce_spesa_id">Voce di Spesa *</label>
|
||||||
|
<select class="form-control select2 @error('voce_spesa_id') is-invalid @enderror"
|
||||||
|
id="voce_spesa_id" name="voce_spesa_id" required>
|
||||||
|
<option value="">Seleziona una voce di spesa</option>
|
||||||
|
@foreach($voci_spesa as $voce)
|
||||||
|
<option value="{{ $voce->id }}"
|
||||||
|
{{ old('voce_spesa_id', $ripartizione->voce_spesa_id) == $voce->id ? 'selected' : '' }}>
|
||||||
|
{{ $voce->codice }} - {{ $voce->descrizione }}
|
||||||
|
</option>
|
||||||
|
@endforeach
|
||||||
|
</select>
|
||||||
|
@error('voce_spesa_id')
|
||||||
|
<div class="invalid-feedback">{{ $message }}</div>
|
||||||
|
@enderror
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="col-md-6">
|
||||||
|
<div class="form-group">
|
||||||
|
<label for="stabile_id">Stabile *</label>
|
||||||
|
<select class="form-control select2 @error('stabile_id') is-invalid @enderror"
|
||||||
|
id="stabile_id" name="stabile_id" required>
|
||||||
|
<option value="">Seleziona uno stabile</option>
|
||||||
|
@foreach($stabili as $stabile)
|
||||||
|
<option value="{{ $stabile->id }}"
|
||||||
|
{{ old('stabile_id', $ripartizione->stabile_id) == $stabile->id ? 'selected' : '' }}>
|
||||||
|
{{ $stabile->denominazione }}
|
||||||
|
</option>
|
||||||
|
@endforeach
|
||||||
|
</select>
|
||||||
|
@error('stabile_id')
|
||||||
|
<div class="invalid-feedback">{{ $message }}</div>
|
||||||
|
@enderror
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="row">
|
||||||
|
<div class="col-md-6">
|
||||||
|
<div class="form-group">
|
||||||
|
<label for="tabella_millesimale_id">Tabella Millesimale *</label>
|
||||||
|
<select class="form-control select2 @error('tabella_millesimale_id') is-invalid @enderror"
|
||||||
|
id="tabella_millesimale_id" name="tabella_millesimale_id" required>
|
||||||
|
<option value="">Seleziona una tabella millesimale</option>
|
||||||
|
@foreach($tabelle_millesimali as $tabella)
|
||||||
|
<option value="{{ $tabella->id }}"
|
||||||
|
{{ old('tabella_millesimale_id', $ripartizione->tabella_millesimale_id) == $tabella->id ? 'selected' : '' }}>
|
||||||
|
{{ $tabella->descrizione }}
|
||||||
|
</option>
|
||||||
|
@endforeach
|
||||||
|
</select>
|
||||||
|
@error('tabella_millesimale_id')
|
||||||
|
<div class="invalid-feedback">{{ $message }}</div>
|
||||||
|
@enderror
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="col-md-6">
|
||||||
|
<div class="form-group">
|
||||||
|
<label for="importo_totale">Importo Totale *</label>
|
||||||
|
<div class="input-group">
|
||||||
|
<input type="number" step="0.01" min="0"
|
||||||
|
class="form-control @error('importo_totale') is-invalid @enderror"
|
||||||
|
id="importo_totale" name="importo_totale"
|
||||||
|
value="{{ old('importo_totale', $ripartizione->importo_totale) }}" required>
|
||||||
|
<div class="input-group-append">
|
||||||
|
<span class="input-group-text">€</span>
|
||||||
|
</div>
|
||||||
|
@error('importo_totale')
|
||||||
|
<div class="invalid-feedback">{{ $message }}</div>
|
||||||
|
@enderror
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="row">
|
||||||
|
<div class="col-md-4">
|
||||||
|
<div class="form-group">
|
||||||
|
<label for="data_ripartizione">Data Ripartizione *</label>
|
||||||
|
<input type="date" class="form-control @error('data_ripartizione') is-invalid @enderror"
|
||||||
|
id="data_ripartizione" name="data_ripartizione"
|
||||||
|
value="{{ old('data_ripartizione', $ripartizione->data_ripartizione->format('Y-m-d')) }}" required>
|
||||||
|
@error('data_ripartizione')
|
||||||
|
<div class="invalid-feedback">{{ $message }}</div>
|
||||||
|
@enderror
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="col-md-4">
|
||||||
|
<div class="form-group">
|
||||||
|
<label for="stato">Stato</label>
|
||||||
|
<select class="form-control @error('stato') is-invalid @enderror"
|
||||||
|
id="stato" name="stato">
|
||||||
|
<option value="bozza" {{ old('stato', $ripartizione->stato) == 'bozza' ? 'selected' : '' }}>Bozza</option>
|
||||||
|
<option value="definitiva" {{ old('stato', $ripartizione->stato) == 'definitiva' ? 'selected' : '' }}>Definitiva</option>
|
||||||
|
<option value="annullata" {{ old('stato', $ripartizione->stato) == 'annullata' ? 'selected' : '' }}>Annullata</option>
|
||||||
|
</select>
|
||||||
|
@error('stato')
|
||||||
|
<div class="invalid-feedback">{{ $message }}</div>
|
||||||
|
@enderror
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="col-md-4">
|
||||||
|
<div class="form-group">
|
||||||
|
<label for="anno_competenza">Anno Competenza *</label>
|
||||||
|
<input type="number" min="2000" max="2099"
|
||||||
|
class="form-control @error('anno_competenza') is-invalid @enderror"
|
||||||
|
id="anno_competenza" name="anno_competenza"
|
||||||
|
value="{{ old('anno_competenza', $ripartizione->anno_competenza) }}" required>
|
||||||
|
@error('anno_competenza')
|
||||||
|
<div class="invalid-feedback">{{ $message }}</div>
|
||||||
|
@enderror
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="row">
|
||||||
|
<div class="col-12">
|
||||||
|
<div class="form-group">
|
||||||
|
<label for="note">Note</label>
|
||||||
|
<textarea class="form-control @error('note') is-invalid @enderror"
|
||||||
|
id="note" name="note" rows="3"
|
||||||
|
placeholder="Note aggiuntive sulla ripartizione...">{{ old('note', $ripartizione->note) }}</textarea>
|
||||||
|
@error('note')
|
||||||
|
<div class="invalid-feedback">{{ $message }}</div>
|
||||||
|
@enderror
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
@if($ripartizione->dettagli->count() > 0)
|
||||||
|
<div class="row">
|
||||||
|
<div class="col-12">
|
||||||
|
<div class="card">
|
||||||
|
<div class="card-header">
|
||||||
|
<h5>Dettagli Ripartizione</h5>
|
||||||
|
</div>
|
||||||
|
<div class="card-body">
|
||||||
|
<div class="table-responsive">
|
||||||
|
<table class="table table-bordered table-striped">
|
||||||
|
<thead>
|
||||||
|
<tr>
|
||||||
|
<th>Unità Immobiliare</th>
|
||||||
|
<th>Millesimi</th>
|
||||||
|
<th>Importo</th>
|
||||||
|
<th>Stato</th>
|
||||||
|
</tr>
|
||||||
|
</thead>
|
||||||
|
<tbody>
|
||||||
|
@foreach($ripartizione->dettagli as $dettaglio)
|
||||||
|
<tr>
|
||||||
|
<td>{{ $dettaglio->unitaImmobiliare->denominazione }}</td>
|
||||||
|
<td>{{ $dettaglio->millesimi }}</td>
|
||||||
|
<td>€ {{ number_format($dettaglio->importo, 2, ',', '.') }}</td>
|
||||||
|
<td>
|
||||||
|
<span class="badge badge-{{ $dettaglio->stato == 'pagato' ? 'success' : ($dettaglio->stato == 'sospeso' ? 'warning' : 'info') }}">
|
||||||
|
{{ ucfirst($dettaglio->stato) }}
|
||||||
|
</span>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
@endforeach
|
||||||
|
</tbody>
|
||||||
|
</table>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
@endif
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="card-footer">
|
||||||
|
<button type="submit" class="btn btn-primary">
|
||||||
|
<i class="fas fa-save"></i> Aggiorna Ripartizione
|
||||||
|
</button>
|
||||||
|
<a href="{{ route('admin.ripartizioni-spesa.show', $ripartizione->id) }}" class="btn btn-info">
|
||||||
|
<i class="fas fa-eye"></i> Visualizza
|
||||||
|
</a>
|
||||||
|
<a href="{{ route('admin.ripartizioni-spesa.index') }}" class="btn btn-default">
|
||||||
|
<i class="fas fa-times"></i> Annulla
|
||||||
|
</a>
|
||||||
|
</div>
|
||||||
|
</form>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
@endsection
|
||||||
|
|
||||||
|
@section('scripts')
|
||||||
|
<script>
|
||||||
|
$(document).ready(function() {
|
||||||
|
// Initialize Select2
|
||||||
|
$('.select2').select2({
|
||||||
|
theme: 'bootstrap4',
|
||||||
|
width: '100%'
|
||||||
|
});
|
||||||
|
|
||||||
|
// Handle stabile change to filter tabelle millesimali
|
||||||
|
$('#stabile_id').on('change', function() {
|
||||||
|
var stabileId = $(this).val();
|
||||||
|
var tabellaSelect = $('#tabella_millesimale_id');
|
||||||
|
|
||||||
|
if (stabileId) {
|
||||||
|
$.ajax({
|
||||||
|
url: '{{ route("admin.stabili.tabelle-millesimali", ":id") }}'.replace(':id', stabileId),
|
||||||
|
type: 'GET',
|
||||||
|
success: function(data) {
|
||||||
|
tabellaSelect.empty();
|
||||||
|
tabellaSelect.append('<option value="">Seleziona una tabella millesimale</option>');
|
||||||
|
$.each(data, function(index, tabella) {
|
||||||
|
tabellaSelect.append('<option value="' + tabella.id + '">' + tabella.descrizione + '</option>');
|
||||||
|
});
|
||||||
|
}
|
||||||
|
});
|
||||||
|
} else {
|
||||||
|
tabellaSelect.empty();
|
||||||
|
tabellaSelect.append('<option value="">Seleziona una tabella millesimale</option>');
|
||||||
|
}
|
||||||
|
});
|
||||||
|
});
|
||||||
|
</script>
|
||||||
|
@endsection
|
||||||
186
resources/views/admin/ripartizioni-spesa/index.blade.php
Normal file
186
resources/views/admin/ripartizioni-spesa/index.blade.php
Normal file
|
|
@ -0,0 +1,186 @@
|
||||||
|
@extends('layouts.app')
|
||||||
|
|
||||||
|
@section('title', 'Ripartizioni Spesa')
|
||||||
|
|
||||||
|
@section('content')
|
||||||
|
<div class="container-fluid">
|
||||||
|
<div class="row">
|
||||||
|
<div class="col-12">
|
||||||
|
<div class="card">
|
||||||
|
<div class="card-header d-flex justify-content-between align-items-center">
|
||||||
|
<h3 class="card-title">
|
||||||
|
<i class="fas fa-chart-pie"></i> Ripartizioni Spesa
|
||||||
|
</h3>
|
||||||
|
<a href="{{ route('admin.ripartizioni-spesa.create') }}" class="btn btn-primary">
|
||||||
|
<i class="fas fa-plus"></i> Nuova Ripartizione
|
||||||
|
</a>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="card-body">
|
||||||
|
<!-- Filtri -->
|
||||||
|
<div class="row mb-3">
|
||||||
|
<div class="col-12">
|
||||||
|
<form method="GET" action="{{ route('admin.ripartizioni-spesa.index') }}" class="row g-3">
|
||||||
|
<div class="col-md-3">
|
||||||
|
<label for="stabile_id" class="form-label">Stabile</label>
|
||||||
|
<select name="stabile_id" id="stabile_id" class="form-control">
|
||||||
|
<option value="">Tutti gli stabili</option>
|
||||||
|
@foreach($stabili as $stabile)
|
||||||
|
<option value="{{ $stabile->id }}" {{ request('stabile_id') == $stabile->id ? 'selected' : '' }}>
|
||||||
|
{{ $stabile->denominazione }}
|
||||||
|
</option>
|
||||||
|
@endforeach
|
||||||
|
</select>
|
||||||
|
</div>
|
||||||
|
<div class="col-md-3">
|
||||||
|
<label for="voce_spesa_id" class="form-label">Voce di Spesa</label>
|
||||||
|
<select name="voce_spesa_id" id="voce_spesa_id" class="form-control">
|
||||||
|
<option value="">Tutte le voci</option>
|
||||||
|
@foreach($vociSpesa as $voceSpesa)
|
||||||
|
<option value="{{ $voceSpesa->id }}" {{ request('voce_spesa_id') == $voceSpesa->id ? 'selected' : '' }}>
|
||||||
|
{{ $voceSpesa->denominazione }}
|
||||||
|
</option>
|
||||||
|
@endforeach
|
||||||
|
</select>
|
||||||
|
</div>
|
||||||
|
<div class="col-md-2">
|
||||||
|
<label for="stato" class="form-label">Stato</label>
|
||||||
|
<select name="stato" id="stato" class="form-control">
|
||||||
|
<option value="">Tutti gli stati</option>
|
||||||
|
<option value="bozza" {{ request('stato') == 'bozza' ? 'selected' : '' }}>Bozza</option>
|
||||||
|
<option value="confermata" {{ request('stato') == 'confermata' ? 'selected' : '' }}>Confermata</option>
|
||||||
|
</select>
|
||||||
|
</div>
|
||||||
|
<div class="col-md-2">
|
||||||
|
<label for="data_da" class="form-label">Da</label>
|
||||||
|
<input type="date" name="data_da" id="data_da" class="form-control" value="{{ request('data_da') }}">
|
||||||
|
</div>
|
||||||
|
<div class="col-md-2">
|
||||||
|
<label class="form-label"> </label>
|
||||||
|
<div class="btn-group d-block">
|
||||||
|
<button type="submit" class="btn btn-outline-primary">
|
||||||
|
<i class="fas fa-search"></i> Filtra
|
||||||
|
</button>
|
||||||
|
<a href="{{ route('admin.ripartizioni-spesa.index') }}" class="btn btn-outline-secondary">
|
||||||
|
<i class="fas fa-times"></i> Reset
|
||||||
|
</a>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</form>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<!-- Tabella Ripartizioni -->
|
||||||
|
<div class="table-responsive">
|
||||||
|
<table class="table table-striped">
|
||||||
|
<thead>
|
||||||
|
<tr>
|
||||||
|
<th>Codice</th>
|
||||||
|
<th>Voce di Spesa</th>
|
||||||
|
<th>Descrizione</th>
|
||||||
|
<th>Importo</th>
|
||||||
|
<th>Data</th>
|
||||||
|
<th>Stato</th>
|
||||||
|
<th>Azioni</th>
|
||||||
|
</tr>
|
||||||
|
</thead>
|
||||||
|
<tbody>
|
||||||
|
@forelse($ripartizioni as $ripartizione)
|
||||||
|
<tr>
|
||||||
|
<td><code>{{ $ripartizione->codice_ripartizione }}</code></td>
|
||||||
|
<td>
|
||||||
|
<strong>{{ $ripartizione->voceSpesa->denominazione }}</strong>
|
||||||
|
<br><small class="text-muted">{{ $ripartizione->voceSpesa->stabile->denominazione }}</small>
|
||||||
|
</td>
|
||||||
|
<td>{{ $ripartizione->descrizione }}</td>
|
||||||
|
<td>
|
||||||
|
<span class="text-success">€ {{ number_format($ripartizione->importo_totale, 2, ',', '.') }}</span>
|
||||||
|
</td>
|
||||||
|
<td>{{ $ripartizione->data_ripartizione->format('d/m/Y') }}</td>
|
||||||
|
<td>
|
||||||
|
@switch($ripartizione->stato)
|
||||||
|
@case('bozza')
|
||||||
|
<span class="badge bg-warning">Bozza</span>
|
||||||
|
@break
|
||||||
|
@case('confermata')
|
||||||
|
<span class="badge bg-success">Confermata</span>
|
||||||
|
@break
|
||||||
|
@endswitch
|
||||||
|
</td>
|
||||||
|
<td>
|
||||||
|
<div class="btn-group" role="group">
|
||||||
|
<a href="{{ route('admin.ripartizioni-spesa.show', $ripartizione) }}"
|
||||||
|
class="btn btn-sm btn-outline-primary" title="Visualizza">
|
||||||
|
<i class="fas fa-eye"></i>
|
||||||
|
</a>
|
||||||
|
@if($ripartizione->stato == 'bozza')
|
||||||
|
<a href="{{ route('admin.ripartizioni-spesa.edit', $ripartizione) }}"
|
||||||
|
class="btn btn-sm btn-outline-warning" title="Modifica">
|
||||||
|
<i class="fas fa-edit"></i>
|
||||||
|
</a>
|
||||||
|
<form method="POST" action="{{ route('admin.ripartizioni-spesa.conferma', $ripartizione) }}"
|
||||||
|
style="display: inline;">
|
||||||
|
@csrf
|
||||||
|
<button type="submit" class="btn btn-sm btn-outline-success" title="Conferma">
|
||||||
|
<i class="fas fa-check"></i>
|
||||||
|
</button>
|
||||||
|
</form>
|
||||||
|
<form method="POST" action="{{ route('admin.ripartizioni-spesa.destroy', $ripartizione) }}"
|
||||||
|
style="display: inline;"
|
||||||
|
onsubmit="return confirm('Sei sicuro di voler eliminare questa ripartizione?')">
|
||||||
|
@csrf
|
||||||
|
@method('DELETE')
|
||||||
|
<button type="submit" class="btn btn-sm btn-outline-danger" title="Elimina">
|
||||||
|
<i class="fas fa-trash"></i>
|
||||||
|
</button>
|
||||||
|
</form>
|
||||||
|
@endif
|
||||||
|
</div>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
@empty
|
||||||
|
<tr>
|
||||||
|
<td colspan="7" class="text-center">
|
||||||
|
<div class="py-4">
|
||||||
|
<i class="fas fa-chart-pie fa-3x text-muted mb-3"></i>
|
||||||
|
<p class="text-muted">Nessuna ripartizione trovata</p>
|
||||||
|
<a href="{{ route('admin.ripartizioni-spesa.create') }}" class="btn btn-primary">
|
||||||
|
<i class="fas fa-plus"></i> Crea la prima ripartizione
|
||||||
|
</a>
|
||||||
|
</div>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
@endforelse
|
||||||
|
</tbody>
|
||||||
|
</table>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<!-- Paginazione -->
|
||||||
|
@if($ripartizioni->hasPages())
|
||||||
|
<div class="d-flex justify-content-center">
|
||||||
|
{{ $ripartizioni->appends(request()->query())->links() }}
|
||||||
|
</div>
|
||||||
|
@endif
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
@endsection
|
||||||
|
|
||||||
|
@section('scripts')
|
||||||
|
<script>
|
||||||
|
// Auto-submit form when select changes
|
||||||
|
document.getElementById('stabile_id').addEventListener('change', function() {
|
||||||
|
this.form.submit();
|
||||||
|
});
|
||||||
|
|
||||||
|
document.getElementById('voce_spesa_id').addEventListener('change', function() {
|
||||||
|
this.form.submit();
|
||||||
|
});
|
||||||
|
|
||||||
|
document.getElementById('stato').addEventListener('change', function() {
|
||||||
|
this.form.submit();
|
||||||
|
});
|
||||||
|
</script>
|
||||||
|
@endsection
|
||||||
429
resources/views/admin/ripartizioni-spesa/show.blade.php
Normal file
429
resources/views/admin/ripartizioni-spesa/show.blade.php
Normal file
|
|
@ -0,0 +1,429 @@
|
||||||
|
@extends('layouts.app')
|
||||||
|
|
||||||
|
@section('title', 'Dettaglio Ripartizione Spesa')
|
||||||
|
|
||||||
|
@section('content')
|
||||||
|
<div class="container-fluid">
|
||||||
|
<div class="row">
|
||||||
|
<div class="col-12">
|
||||||
|
<div class="card">
|
||||||
|
<div class="card-header">
|
||||||
|
<h3 class="card-title">Dettaglio Ripartizione Spesa</h3>
|
||||||
|
<div class="card-tools">
|
||||||
|
@can('update', $ripartizione)
|
||||||
|
<a href="{{ route('admin.ripartizioni-spesa.edit', $ripartizione->id) }}" class="btn btn-primary btn-sm">
|
||||||
|
<i class="fas fa-edit"></i> Modifica
|
||||||
|
</a>
|
||||||
|
@endcan
|
||||||
|
<a href="{{ route('admin.ripartizioni-spesa.index') }}" class="btn btn-default btn-sm">
|
||||||
|
<i class="fas fa-arrow-left"></i> Torna all'elenco
|
||||||
|
</a>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="card-body">
|
||||||
|
<div class="row">
|
||||||
|
<div class="col-md-6">
|
||||||
|
<div class="info-box">
|
||||||
|
<span class="info-box-icon bg-info"><i class="fas fa-receipt"></i></span>
|
||||||
|
<div class="info-box-content">
|
||||||
|
<span class="info-box-text">Voce di Spesa</span>
|
||||||
|
<span class="info-box-number">{{ $ripartizione->voceSpesa->codice }} - {{ $ripartizione->voceSpesa->descrizione }}</span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="col-md-6">
|
||||||
|
<div class="info-box">
|
||||||
|
<span class="info-box-icon bg-success"><i class="fas fa-building"></i></span>
|
||||||
|
<div class="info-box-content">
|
||||||
|
<span class="info-box-text">Stabile</span>
|
||||||
|
<span class="info-box-number">{{ $ripartizione->stabile->denominazione }}</span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="row">
|
||||||
|
<div class="col-md-4">
|
||||||
|
<div class="info-box">
|
||||||
|
<span class="info-box-icon bg-warning"><i class="fas fa-table"></i></span>
|
||||||
|
<div class="info-box-content">
|
||||||
|
<span class="info-box-text">Tabella Millesimale</span>
|
||||||
|
<span class="info-box-number">{{ $ripartizione->tabellaMillesimale->descrizione }}</span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="col-md-4">
|
||||||
|
<div class="info-box">
|
||||||
|
<span class="info-box-icon bg-primary"><i class="fas fa-euro-sign"></i></span>
|
||||||
|
<div class="info-box-content">
|
||||||
|
<span class="info-box-text">Importo Totale</span>
|
||||||
|
<span class="info-box-number">€ {{ number_format($ripartizione->importo_totale, 2, ',', '.') }}</span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="col-md-4">
|
||||||
|
<div class="info-box">
|
||||||
|
<span class="info-box-icon bg-{{ $ripartizione->stato == 'definitiva' ? 'success' : ($ripartizione->stato == 'annullata' ? 'danger' : 'secondary') }}">
|
||||||
|
<i class="fas fa-{{ $ripartizione->stato == 'definitiva' ? 'check' : ($ripartizione->stato == 'annullata' ? 'times' : 'edit') }}"></i>
|
||||||
|
</span>
|
||||||
|
<div class="info-box-content">
|
||||||
|
<span class="info-box-text">Stato</span>
|
||||||
|
<span class="info-box-number">{{ ucfirst($ripartizione->stato) }}</span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="row">
|
||||||
|
<div class="col-md-6">
|
||||||
|
<div class="form-group">
|
||||||
|
<label>Data Ripartizione</label>
|
||||||
|
<p class="form-control-plaintext">{{ $ripartizione->data_ripartizione->format('d/m/Y') }}</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="col-md-6">
|
||||||
|
<div class="form-group">
|
||||||
|
<label>Anno Competenza</label>
|
||||||
|
<p class="form-control-plaintext">{{ $ripartizione->anno_competenza }}</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
@if($ripartizione->note)
|
||||||
|
<div class="row">
|
||||||
|
<div class="col-12">
|
||||||
|
<div class="form-group">
|
||||||
|
<label>Note</label>
|
||||||
|
<p class="form-control-plaintext">{{ $ripartizione->note }}</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
@endif
|
||||||
|
|
||||||
|
<div class="row">
|
||||||
|
<div class="col-12">
|
||||||
|
<div class="form-group">
|
||||||
|
<label>Audit</label>
|
||||||
|
<div class="table-responsive">
|
||||||
|
<table class="table table-sm">
|
||||||
|
<tr>
|
||||||
|
<th>Creato il:</th>
|
||||||
|
<td>{{ $ripartizione->created_at->format('d/m/Y H:i:s') }}</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<th>Ultima modifica:</th>
|
||||||
|
<td>{{ $ripartizione->updated_at->format('d/m/Y H:i:s') }}</td>
|
||||||
|
</tr>
|
||||||
|
</table>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<!-- Dettagli Ripartizione -->
|
||||||
|
<div class="row">
|
||||||
|
<div class="col-12">
|
||||||
|
<div class="card">
|
||||||
|
<div class="card-header">
|
||||||
|
<h3 class="card-title">Dettagli Ripartizione per Unità Immobiliare</h3>
|
||||||
|
<div class="card-tools">
|
||||||
|
@if($ripartizione->stato == 'bozza')
|
||||||
|
<button type="button" class="btn btn-success btn-sm" id="btn-calcola-ripartizione">
|
||||||
|
<i class="fas fa-calculator"></i> Calcola Ripartizione
|
||||||
|
</button>
|
||||||
|
@endif
|
||||||
|
<button type="button" class="btn btn-info btn-sm" data-toggle="modal" data-target="#modal-riepilogo">
|
||||||
|
<i class="fas fa-chart-pie"></i> Riepilogo
|
||||||
|
</button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="card-body">
|
||||||
|
@if($ripartizione->dettagli->count() > 0)
|
||||||
|
<div class="table-responsive">
|
||||||
|
<table class="table table-bordered table-striped" id="dettagli-table">
|
||||||
|
<thead>
|
||||||
|
<tr>
|
||||||
|
<th>Unità Immobiliare</th>
|
||||||
|
<th>Proprietario</th>
|
||||||
|
<th>Millesimi</th>
|
||||||
|
<th>Importo</th>
|
||||||
|
<th>Stato</th>
|
||||||
|
<th>Pagato</th>
|
||||||
|
<th>Data Pagamento</th>
|
||||||
|
<th>Note</th>
|
||||||
|
<th>Azioni</th>
|
||||||
|
</tr>
|
||||||
|
</thead>
|
||||||
|
<tbody>
|
||||||
|
@foreach($ripartizione->dettagli as $dettaglio)
|
||||||
|
<tr>
|
||||||
|
<td>{{ $dettaglio->unitaImmobiliare->denominazione }}</td>
|
||||||
|
<td>{{ $dettaglio->unitaImmobiliare->proprietario ?? 'N/A' }}</td>
|
||||||
|
<td>{{ $dettaglio->millesimi }}</td>
|
||||||
|
<td>€ {{ number_format($dettaglio->importo, 2, ',', '.') }}</td>
|
||||||
|
<td>
|
||||||
|
<span class="badge badge-{{ $dettaglio->stato == 'pagato' ? 'success' : ($dettaglio->stato == 'sospeso' ? 'warning' : 'info') }}">
|
||||||
|
{{ ucfirst($dettaglio->stato) }}
|
||||||
|
</span>
|
||||||
|
</td>
|
||||||
|
<td>€ {{ number_format($dettaglio->importo_pagato, 2, ',', '.') }}</td>
|
||||||
|
<td>{{ $dettaglio->data_pagamento ? $dettaglio->data_pagamento->format('d/m/Y') : '-' }}</td>
|
||||||
|
<td>{{ $dettaglio->note ?? '-' }}</td>
|
||||||
|
<td>
|
||||||
|
<div class="btn-group">
|
||||||
|
<button type="button" class="btn btn-sm btn-primary" onclick="editDettaglio({{ $dettaglio->id }})">
|
||||||
|
<i class="fas fa-edit"></i>
|
||||||
|
</button>
|
||||||
|
@if($dettaglio->stato != 'pagato')
|
||||||
|
<button type="button" class="btn btn-sm btn-success" onclick="marcaPagato({{ $dettaglio->id }})">
|
||||||
|
<i class="fas fa-check"></i>
|
||||||
|
</button>
|
||||||
|
@endif
|
||||||
|
</div>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
@endforeach
|
||||||
|
</tbody>
|
||||||
|
<tfoot>
|
||||||
|
<tr class="table-info">
|
||||||
|
<th colspan="2">Totale</th>
|
||||||
|
<th>{{ $ripartizione->dettagli->sum('millesimi') }}</th>
|
||||||
|
<th>€ {{ number_format($ripartizione->dettagli->sum('importo'), 2, ',', '.') }}</th>
|
||||||
|
<th>-</th>
|
||||||
|
<th>€ {{ number_format($ripartizione->dettagli->sum('importo_pagato'), 2, ',', '.') }}</th>
|
||||||
|
<th colspan="3">-</th>
|
||||||
|
</tr>
|
||||||
|
</tfoot>
|
||||||
|
</table>
|
||||||
|
</div>
|
||||||
|
@else
|
||||||
|
<div class="alert alert-info">
|
||||||
|
<i class="fas fa-info-circle"></i> Nessun dettaglio di ripartizione trovato.
|
||||||
|
@if($ripartizione->stato == 'bozza')
|
||||||
|
Clicca su "Calcola Ripartizione" per generare i dettagli.
|
||||||
|
@endif
|
||||||
|
</div>
|
||||||
|
@endif
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<!-- Piani di Rateizzazione -->
|
||||||
|
@if($ripartizione->pianiRateizzazione->count() > 0)
|
||||||
|
<div class="row">
|
||||||
|
<div class="col-12">
|
||||||
|
<div class="card">
|
||||||
|
<div class="card-header">
|
||||||
|
<h3 class="card-title">Piani di Rateizzazione</h3>
|
||||||
|
<div class="card-tools">
|
||||||
|
<a href="{{ route('admin.piani-rateizzazione.create', ['ripartizione_id' => $ripartizione->id]) }}" class="btn btn-primary btn-sm">
|
||||||
|
<i class="fas fa-plus"></i> Nuovo Piano
|
||||||
|
</a>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="card-body">
|
||||||
|
<div class="table-responsive">
|
||||||
|
<table class="table table-bordered table-striped">
|
||||||
|
<thead>
|
||||||
|
<tr>
|
||||||
|
<th>Denominazione</th>
|
||||||
|
<th>Numero Rate</th>
|
||||||
|
<th>Importo Totale</th>
|
||||||
|
<th>Stato</th>
|
||||||
|
<th>Data Inizio</th>
|
||||||
|
<th>Azioni</th>
|
||||||
|
</tr>
|
||||||
|
</thead>
|
||||||
|
<tbody>
|
||||||
|
@foreach($ripartizione->pianiRateizzazione as $piano)
|
||||||
|
<tr>
|
||||||
|
<td>{{ $piano->denominazione }}</td>
|
||||||
|
<td>{{ $piano->numero_rate }}</td>
|
||||||
|
<td>€ {{ number_format($piano->importo_totale, 2, ',', '.') }}</td>
|
||||||
|
<td>
|
||||||
|
<span class="badge badge-{{ $piano->stato == 'attivo' ? 'success' : ($piano->stato == 'completato' ? 'primary' : 'secondary') }}">
|
||||||
|
{{ ucfirst($piano->stato) }}
|
||||||
|
</span>
|
||||||
|
</td>
|
||||||
|
<td>{{ $piano->data_inizio->format('d/m/Y') }}</td>
|
||||||
|
<td>
|
||||||
|
<div class="btn-group">
|
||||||
|
<a href="{{ route('admin.piani-rateizzazione.show', $piano->id) }}" class="btn btn-sm btn-info">
|
||||||
|
<i class="fas fa-eye"></i>
|
||||||
|
</a>
|
||||||
|
<a href="{{ route('admin.piani-rateizzazione.edit', $piano->id) }}" class="btn btn-sm btn-primary">
|
||||||
|
<i class="fas fa-edit"></i>
|
||||||
|
</a>
|
||||||
|
</div>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
@endforeach
|
||||||
|
</tbody>
|
||||||
|
</table>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
@endif
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<!-- Modal Riepilogo -->
|
||||||
|
<div class="modal fade" id="modal-riepilogo" tabindex="-1" role="dialog">
|
||||||
|
<div class="modal-dialog modal-lg" role="document">
|
||||||
|
<div class="modal-content">
|
||||||
|
<div class="modal-header">
|
||||||
|
<h4 class="modal-title">Riepilogo Ripartizione</h4>
|
||||||
|
<button type="button" class="close" data-dismiss="modal">
|
||||||
|
<span>×</span>
|
||||||
|
</button>
|
||||||
|
</div>
|
||||||
|
<div class="modal-body">
|
||||||
|
<div class="row">
|
||||||
|
<div class="col-md-6">
|
||||||
|
<canvas id="chart-stati"></canvas>
|
||||||
|
</div>
|
||||||
|
<div class="col-md-6">
|
||||||
|
<canvas id="chart-importi"></canvas>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
@endsection
|
||||||
|
|
||||||
|
@section('scripts')
|
||||||
|
<script src="https://cdn.jsdelivr.net/npm/chart.js"></script>
|
||||||
|
<script>
|
||||||
|
$(document).ready(function() {
|
||||||
|
// Initialize DataTable
|
||||||
|
$('#dettagli-table').DataTable({
|
||||||
|
responsive: true,
|
||||||
|
lengthChange: false,
|
||||||
|
autoWidth: false,
|
||||||
|
language: {
|
||||||
|
url: '//cdn.datatables.net/plug-ins/1.10.25/i18n/Italian.json'
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
// Calcola ripartizione
|
||||||
|
$('#btn-calcola-ripartizione').click(function() {
|
||||||
|
if (confirm('Sei sicuro di voler calcolare la ripartizione? Eventuali dettagli esistenti verranno sovrascritti.')) {
|
||||||
|
$.ajax({
|
||||||
|
url: '{{ route("admin.ripartizioni-spesa.calcola", $ripartizione->id) }}',
|
||||||
|
type: 'POST',
|
||||||
|
data: {
|
||||||
|
_token: '{{ csrf_token() }}'
|
||||||
|
},
|
||||||
|
success: function(response) {
|
||||||
|
if (response.success) {
|
||||||
|
location.reload();
|
||||||
|
} else {
|
||||||
|
alert('Errore nel calcolo della ripartizione: ' + response.message);
|
||||||
|
}
|
||||||
|
},
|
||||||
|
error: function() {
|
||||||
|
alert('Errore nel calcolo della ripartizione');
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
// Charts for modal
|
||||||
|
$('#modal-riepilogo').on('shown.bs.modal', function() {
|
||||||
|
// Chart Stati
|
||||||
|
var ctxStati = document.getElementById('chart-stati').getContext('2d');
|
||||||
|
new Chart(ctxStati, {
|
||||||
|
type: 'doughnut',
|
||||||
|
data: {
|
||||||
|
labels: ['Da Pagare', 'Pagato', 'Sospeso'],
|
||||||
|
datasets: [{
|
||||||
|
data: [
|
||||||
|
{{ $ripartizione->dettagli->where('stato', 'da_pagare')->count() }},
|
||||||
|
{{ $ripartizione->dettagli->where('stato', 'pagato')->count() }},
|
||||||
|
{{ $ripartizione->dettagli->where('stato', 'sospeso')->count() }}
|
||||||
|
],
|
||||||
|
backgroundColor: ['#17a2b8', '#28a745', '#ffc107']
|
||||||
|
}]
|
||||||
|
},
|
||||||
|
options: {
|
||||||
|
responsive: true,
|
||||||
|
plugins: {
|
||||||
|
title: {
|
||||||
|
display: true,
|
||||||
|
text: 'Stati Pagamento'
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
// Chart Importi
|
||||||
|
var ctxImporti = document.getElementById('chart-importi').getContext('2d');
|
||||||
|
new Chart(ctxImporti, {
|
||||||
|
type: 'bar',
|
||||||
|
data: {
|
||||||
|
labels: ['Totale', 'Pagato', 'Residuo'],
|
||||||
|
datasets: [{
|
||||||
|
label: 'Importi (€)',
|
||||||
|
data: [
|
||||||
|
{{ $ripartizione->dettagli->sum('importo') }},
|
||||||
|
{{ $ripartizione->dettagli->sum('importo_pagato') }},
|
||||||
|
{{ $ripartizione->dettagli->sum('importo') - $ripartizione->dettagli->sum('importo_pagato') }}
|
||||||
|
],
|
||||||
|
backgroundColor: ['#007bff', '#28a745', '#dc3545']
|
||||||
|
}]
|
||||||
|
},
|
||||||
|
options: {
|
||||||
|
responsive: true,
|
||||||
|
plugins: {
|
||||||
|
title: {
|
||||||
|
display: true,
|
||||||
|
text: 'Analisi Importi'
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
function editDettaglio(id) {
|
||||||
|
// Implementa modifica dettaglio
|
||||||
|
console.log('Edit dettaglio:', id);
|
||||||
|
}
|
||||||
|
|
||||||
|
function marcaPagato(id) {
|
||||||
|
if (confirm('Sei sicuro di voler marcare questo dettaglio come pagato?')) {
|
||||||
|
$.ajax({
|
||||||
|
url: '{{ route("admin.ripartizioni-spesa.marca-pagato", ":id") }}'.replace(':id', id),
|
||||||
|
type: 'POST',
|
||||||
|
data: {
|
||||||
|
_token: '{{ csrf_token() }}'
|
||||||
|
},
|
||||||
|
success: function(response) {
|
||||||
|
if (response.success) {
|
||||||
|
location.reload();
|
||||||
|
} else {
|
||||||
|
alert('Errore: ' + response.message);
|
||||||
|
}
|
||||||
|
},
|
||||||
|
error: function() {
|
||||||
|
alert('Errore nella marcatura del pagamento');
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
@endsection
|
||||||
Loading…
Reference in New Issue
Block a user