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); } } }