131 lines
5.8 KiB
PHP
131 lines
5.8 KiB
PHP
<?php
|
|
|
|
namespace App\Http\Controllers\Admin;
|
|
|
|
use App\Http\Controllers\Controller;
|
|
use App\Models\GestioneContabile;
|
|
use App\Models\Stabile;
|
|
use Illuminate\Http\Request;
|
|
use Illuminate\Support\Facades\Auth;
|
|
|
|
class GestioneContabileController extends Controller
|
|
{
|
|
/** Crea una nuova gestione per uno stabile */
|
|
public function store(Request $request, Stabile $stabile)
|
|
{
|
|
$data = $request->validate([
|
|
'anno_gestione' => ['required', 'integer', 'min:2000', 'max:2100'],
|
|
'tipo_gestione' => ['required', 'in:ordinaria,riscaldamento,straordinaria'],
|
|
'denominazione' => ['nullable', 'string', 'max:200'],
|
|
'data_inizio' => ['nullable', 'date'],
|
|
'data_fine' => ['nullable', 'date', 'after_or_equal:data_inizio'],
|
|
'numero_straordinaria' => ['nullable', 'integer', 'min:0'],
|
|
'codice_archivio_legacy' => ['nullable', 'string', 'max:1000'],
|
|
'mesi' => ['array'],
|
|
// Straordinaria plan
|
|
'stra_importo_totale' => ['nullable', 'numeric', 'min:0'],
|
|
'stra_numero_rate' => ['nullable', 'integer', 'min:1', 'max:120'],
|
|
'stra_prima_scadenza' => ['nullable', 'date'],
|
|
'stra_periodicita' => ['nullable', 'in:mensile,bimestrale,trimestrale,quadrimestrale,semestrale,annuale']
|
|
]);
|
|
|
|
$tenantId = (string) (Auth::user()->tenant_id ?? 'default');
|
|
$anno = (int)$data['anno_gestione'];
|
|
$tipo = $data['tipo_gestione'];
|
|
|
|
$gestione = new GestioneContabile();
|
|
$gestione->fill([
|
|
'tenant_id' => $tenantId,
|
|
'stabile_id' => $stabile->id,
|
|
'anno_gestione' => $anno,
|
|
'tipo_gestione' => $tipo,
|
|
'numero_straordinaria' => $data['numero_straordinaria'] ?? null,
|
|
'denominazione' => $data['denominazione'] ?? (ucfirst($tipo) . " {$anno}"),
|
|
'data_inizio' => $data['data_inizio'] ?? sprintf('%04d-01-01', $anno),
|
|
'data_fine' => $data['data_fine'] ?? sprintf('%04d-12-31', $anno),
|
|
'stato' => 'aperta',
|
|
'protocollo_prefix' => strtoupper(substr($tipo, 0, 1)) . $anno,
|
|
'gestione_attiva' => true,
|
|
'codice_archivio_legacy' => $data['codice_archivio_legacy'] ?? null,
|
|
]);
|
|
|
|
// Mesi rate per tipo (solo ordinaria/riscaldamento)
|
|
if (in_array($tipo, ['ordinaria', 'riscaldamento'], true)) {
|
|
$gestione->setMesiFromCheckboxes($tipo, $data['mesi'] ?? []);
|
|
}
|
|
|
|
// Piano straordinario separato
|
|
if ($tipo === 'straordinaria') {
|
|
$gestione->piano_straordinario = [
|
|
'importo_totale' => (float)($data['stra_importo_totale'] ?? 0),
|
|
'numero_rate' => (int)($data['stra_numero_rate'] ?? 0),
|
|
'prima_scadenza' => $data['stra_prima_scadenza'] ?? null,
|
|
'periodicita' => $data['stra_periodicita'] ?? 'mensile',
|
|
];
|
|
}
|
|
|
|
$gestione->save();
|
|
|
|
return back()->with('success', 'Gestione creata correttamente.');
|
|
}
|
|
|
|
/** Aggiorna o toggla proprietà veloci */
|
|
public function update(Request $request, Stabile $stabile, GestioneContabile $gestione)
|
|
{
|
|
$this->authorizeGestione($stabile, $gestione);
|
|
|
|
// Toggle rapido stato
|
|
if ($request->get('toggle') === 'stato') {
|
|
$gestione->stato = $gestione->stato === 'aperta' ? 'chiusa' : 'aperta';
|
|
$gestione->gestione_attiva = $gestione->stato === 'aperta';
|
|
$gestione->save();
|
|
return back()->with('success', 'Stato gestione aggiornato.');
|
|
}
|
|
|
|
$data = $request->validate([
|
|
'denominazione' => ['nullable', 'string', 'max:200'],
|
|
'data_inizio' => ['nullable', 'date'],
|
|
'data_fine' => ['nullable', 'date', 'after_or_equal:data_inizio'],
|
|
'mesi' => ['array'],
|
|
'stra_importo_totale' => ['nullable', 'numeric', 'min:0'],
|
|
'stra_numero_rate' => ['nullable', 'integer', 'min:1', 'max:120'],
|
|
'stra_prima_scadenza' => ['nullable', 'date'],
|
|
'stra_periodicita' => ['nullable', 'in:mensile,bimestrale,trimestrale,quadrimestrale,semestrale,annuale']
|
|
]);
|
|
|
|
$gestione->fill([
|
|
'denominazione' => $data['denominazione'] ?? $gestione->denominazione,
|
|
'data_inizio' => $data['data_inizio'] ?? $gestione->data_inizio,
|
|
'data_fine' => $data['data_fine'] ?? $gestione->data_fine,
|
|
]);
|
|
|
|
if ($gestione->isOrdinaria() || $gestione->isRiscaldamento()) {
|
|
$gestione->setMesiFromCheckboxes($gestione->tipo_gestione, $data['mesi'] ?? []);
|
|
} elseif ($gestione->isStraordinaria()) {
|
|
$gestione->piano_straordinario = array_merge($gestione->piano_straordinario ?? [], [
|
|
'importo_totale' => isset($data['stra_importo_totale']) ? (float)$data['stra_importo_totale'] : ($gestione->piano_straordinario['importo_totale'] ?? 0),
|
|
'numero_rate' => isset($data['stra_numero_rate']) ? (int)$data['stra_numero_rate'] : ($gestione->piano_straordinario['numero_rate'] ?? 0),
|
|
'prima_scadenza' => $data['stra_prima_scadenza'] ?? ($gestione->piano_straordinario['prima_scadenza'] ?? null),
|
|
'periodicita' => $data['stra_periodicita'] ?? ($gestione->piano_straordinario['periodicita'] ?? 'mensile'),
|
|
]);
|
|
}
|
|
|
|
$gestione->save();
|
|
return back()->with('success', 'Gestione aggiornata.');
|
|
}
|
|
|
|
public function destroy(Stabile $stabile, GestioneContabile $gestione)
|
|
{
|
|
$this->authorizeGestione($stabile, $gestione);
|
|
$gestione->delete();
|
|
return back()->with('success', 'Gestione eliminata.');
|
|
}
|
|
|
|
private function authorizeGestione(Stabile $stabile, GestioneContabile $gestione): void
|
|
{
|
|
if ($gestione->stabile_id !== $stabile->id) {
|
|
abort(404);
|
|
}
|
|
}
|
|
}
|