netgescon-day0/app/Http/Controllers/Admin/GestioneContabileController.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);
}
}
}