netgescon-day0/app/Modules/Contabilita/Services/MovimentoBancaRiconciliazioneService.php

86 lines
3.8 KiB
PHP

<?php
namespace App\Modules\Contabilita\Services;
use App\Models\AffittoCanoneDovuto;
use App\Models\AffittoCanonePagato;
use App\Models\User;
use App\Modules\Contabilita\Models\MovimentoBanca;
use Illuminate\Support\Facades\Schema;
use RuntimeException;
class MovimentoBancaRiconciliazioneService
{
public function registraCanoneAffittoDaMovimento(User $user, MovimentoBanca $movimento, AffittoCanoneDovuto $canone): AffittoCanonePagato
{
$affitto = $canone->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;
}
}