86 lines
3.8 KiB
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;
|
|
}
|
|
}
|