affitto; if (! $affitto) { throw new RuntimeException('Canone affitto senza contratto collegato.'); } $pagato = AffittoCanonePagato::query() ->where('affitto_id', (int) $canone->affitto_id) ->where('anno', (int) $canone->anno) ->where('mese', (int) $canone->mese) ->first(); if (! $pagato) { $descrizioni = array_filter([ $canone->descrizione_1, $canone->descrizione_2, $canone->descrizione_3, $canone->descrizione_4, ], static fn($value): bool => is_string($value) && trim($value) !== ''); $pagato = new AffittoCanonePagato([ 'affitto_id' => (int) $canone->affitto_id, 'anno' => (int) $canone->anno, 'mese' => (int) $canone->mese, 'mese_descrizione' => $canone->mese_descrizione, 'data_pagamento' => $movimento->data?->toDateString() ?: now()->toDateString(), 'descrizione' => trim(implode(' ยท ', $descrizioni)) ?: ('Incasso canone da banca del ' . ($movimento->data?->format('d/m/Y') ?? now()->format('d/m/Y'))), 'fitto' => $canone->fitto, 'istat_percentuale' => $canone->istat_percentuale, 'istat_importo' => $canone->istat_importo, 'descrizione_1' => $canone->descrizione_1, 'descrizione_2' => $canone->descrizione_2, 'importo_1' => $canone->importo_1, 'importo_2' => $canone->importo_2, 'bollo' => $canone->bollo, 'totale' => $canone->totale, ]); } else { $pagato->data_pagamento = $pagato->data_pagamento ?: ($movimento->data?->toDateString() ?: now()->toDateString()); $pagato->descrizione = is_string($pagato->descrizione ?? null) && trim((string) $pagato->descrizione) !== '' ? $pagato->descrizione : 'Incasso canone da banca'; } $pagato->save(); $matchData = is_array($movimento->match_data ?? null) ? $movimento->match_data : []; $matchData['riconciliato_operativo'] = true; $matchData['riconciliazione_tipo'] = 'affitto_canone'; $matchData['riconciliazione_label'] = 'Canone affitto chiuso'; $matchData['riconciliazione_at'] = now()->toDateTimeString(); $matchData['riconciliato_da'] = (int) $user->id; $matchData['affitto_canone_dovuto_id'] = (int) $canone->id; $matchData['affitto_canone_pagato_id'] = (int) $pagato->id; $matchData['affitto_id'] = (int) $canone->affitto_id; if (Schema::hasColumn('contabilita_movimenti_banca', 'rubrica_mittente_id') && (int) ($affitto->rubrica_inquilino_id ?? 0) > 0) { $movimento->rubrica_mittente_id = (int) $affitto->rubrica_inquilino_id; } if (Schema::hasColumn('contabilita_movimenti_banca', 'da_confermare')) { $movimento->da_confermare = false; } if (Schema::hasColumn('contabilita_movimenti_banca', 'match_data')) { $movimento->match_data = $matchData; } $movimento->save(); return $pagato; } }