netgescon-day0/tests/Feature/UnitaEstrattoContoAtomicoTest.php

136 lines
5.2 KiB
PHP

<?php
use App\Filament\Pages\UnitaImmobiliarePage;
use App\Models\Stabile;
use App\Models\UnitaImmobiliare;
use App\Models\User;
use App\Services\Gescon\GesconEstrattoContoService;
use Illuminate\Support\Facades\DB;
use Livewire\Livewire;
test('gescon estratto conto service computes exact benchmark data for unit A-1', function () {
DB::table('amministratori')->insertOrIgnore([
'id' => 1,
'nome' => 'Admin',
'cognome' => 'Test',
'created_at' => now(),
'updated_at' => now(),
]);
$stabile = Stabile::firstOrCreate(
['codice_stabile' => '0013'],
[
'amministratore_id' => 1,
'denominazione' => 'Condominio Via Ottaviano 105',
'indirizzo' => 'Via Ottaviano 105',
'citta' => 'Roma',
'cap' => '00192',
'provincia' => 'RM',
]
);
$unita = UnitaImmobiliare::firstOrCreate(
['codice_unita' => '0013-A-1'],
[
'stabile_id' => $stabile->id,
'scala' => 'A',
'interno' => '1',
'denominazione' => 'SPADAVECCHIA ALDO',
]
);
$service = app(GesconEstrattoContoService::class);
$ec = $service->getEstrattoConto($unita, 'C', true);
expect($ec)->toBeArray()
->and($ec['totali']['totale_dovuto'])->toBe(1267.96)
->and($ec['totali']['totale_straordinarie_residuo'])->toBe(1267.96)
->and($ec['totali']['totale_ordinaria_corrente_residuo'])->toBe(0.0)
->and($ec['totali']['totale_ordinarie_pregresse_residuo'])->toBe(0.0)
->and($ec['has_riscaldamento'])->toBeFalse();
// Verifica straordinaria 2022 citofono rata 401
$citofono2022 = collect($ec['gestioni_straordinarie'])->first(fn ($g) => $g['anno'] === 2022 && $g['num_spesa'] === 3);
expect($citofono2022)->not->toBeNull();
$rata401 = collect($citofono2022['rate'])->first(fn ($r) => $r['rif'] === '401');
expect($rata401)->not->toBeNull()
->and($rata401['dovuto'])->toBe(296.71)
->and($rata401['pagato'])->toBe(180.00);
// Verifica straordinaria 2026 passerella (1/2026)
$passerella2026 = collect($ec['gestioni_straordinarie'])->first(fn ($g) => $g['anno'] === 2026 && $g['num_spesa'] === 1);
expect($passerella2026)->not->toBeNull()
->and($passerella2026['num_rate'])->toBe(4)
->and($passerella2026['rate'][0]['pagato'])->toBe(482.80)
->and($passerella2026['rate'][0]['data_pagamento'])->toBe('30/04/2026')
->and($passerella2026['rate'][1]['residuo'])->toBe(482.80)
->and($passerella2026['rate'][2]['residuo'])->toBe(482.80)
->and($passerella2026['residuo'])->toBe(965.60);
// Verifica straordinaria 2026 cornicione (2/2026)
$cornicione2026 = collect($ec['gestioni_straordinarie'])->first(fn ($g) => $g['anno'] === 2026 && $g['num_spesa'] === 2);
expect($cornicione2026)->not->toBeNull()
->and($cornicione2026['rate'][0]['pagato'])->toBe(209.51)
->and($cornicione2026['rate'][1]['residuo'])->toBe(92.85)
->and($cornicione2026['rate'][2]['residuo'])->toBe(209.51)
->and($cornicione2026['residuo'])->toBe(302.36);
// Verifica somma esatta al centesimo: 965.60 + 302.36 = 1267.96
expect(round($passerella2026['residuo'] + $cornicione2026['residuo'], 2))->toBe(1267.96);
// Verifica inquilino (Kiwa Cermet SpA)
$ecInq = $service->getEstrattoConto($unita, 'I', true);
expect($ecInq['totali']['totale_dovuto'])->toBe(731.30)
->and($ecInq['soggetto']['ruolo'])->toBe('I');
});
test('unita immobiliare page renders atomic estratto conto and handles refresh', function () {
DB::table('amministratori')->insertOrIgnore([
'id' => 1,
'nome' => 'Admin',
'cognome' => 'Test',
'created_at' => now(),
'updated_at' => now(),
]);
$user = User::factory()->create();
if (method_exists($user, 'assignRole')) {
\Spatie\Permission\Models\Role::firstOrCreate(['name' => 'admin', 'guard_name' => 'web']);
$user->assignRole('admin');
}
$stabile = Stabile::firstOrCreate(
['codice_stabile' => '0013'],
[
'amministratore_id' => 1,
'denominazione' => 'Condominio Via Ottaviano 105',
'indirizzo' => 'Via Ottaviano 105',
'citta' => 'Roma',
'cap' => '00192',
'provincia' => 'RM',
]
);
$unita = UnitaImmobiliare::firstOrCreate(
['codice_unita' => '0013-A-1'],
[
'stabile_id' => $stabile->id,
'scala' => 'A',
'interno' => '1',
'denominazione' => 'SPADAVECCHIA ALDO',
]
);
Livewire::actingAs($user)
->test(UnitaImmobiliarePage::class, ['unita_id' => $unita->id])
->call('setTab', 'estratto_conto')
->assertSet('tab', 'estratto_conto')
->assertSee('Estratto Conto Atomico')
->assertSee('1.267,96')
->assertSee('RIPRISTINO PASSERELLA E TETTO')
->assertSee('482,80')
->assertSee('401')
->call('refreshEstrattoContoMdb')
->assertHasNoErrors();
});