- 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
295 lines
17 KiB
PHP
295 lines
17 KiB
PHP
@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
|