netgescon-day0/tests/Feature/CatastoHubDbDrivenTest.php

238 lines
8.7 KiB
PHP

<?php
use App\Models\User;
use App\Models\UnitaImmobiliare;
use App\Models\Stabile;
use App\Models\FeCassettoServiceConfig;
use App\Filament\Pages\Condomini\CatastoHub;
use App\Services\SisterCatastoService;
use App\Support\StabileContext;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\DB;
beforeEach(function () {
DB::table('amministratori')->insertOrIgnore(['id' => 1, 'nome' => 'Admin Test', 'cognome' => 'Test', 'created_at' => now(), 'updated_at' => now()]);
});
test('catasto hub mounts and loads Stabile 0013 with genuine DB data and no Milizie fallbacks', function () {
$user = User::first();
if (! $user) {
$user = User::factory()->create();
}
expect($user)->not->toBeNull();
try {
if (method_exists($user, 'assignRole')) {
\Spatie\Permission\Models\Role::firstOrCreate(['name' => 'admin', 'guard_name' => 'web']);
$user->assignRole('admin');
}
} catch (\Throwable $e) {}
Auth::login($user);
$stabile0013 = Stabile::firstOrCreate(
['codice_stabile' => '0013'],
[
'amministratore_id' => 1,
'denominazione' => 'OTTAVIANO 105 - GIULIO CESARE 171',
'indirizzo' => 'VIA OTTAVIANO 105 - V.LE G. CESARE 171',
'cap' => '00192',
'citta' => 'ROMA',
'provincia' => 'RM',
'foglio' => '403',
'particella_catasto' => '60',
'codice_comune_catasto' => 'H501',
'codice_fiscale' => '80212560587',
'attivo' => 1,
]
);
$unit233 = UnitaImmobiliare::firstOrCreate(
['stabile_id' => $stabile0013->id, 'codice_unita' => '0013-A-1'],
[
'scala' => 'A',
'interno' => '1',
'piano' => '3',
'subalterno' => '509',
'categoria_catastale' => 'A/2',
'rendita_catastale' => 2375.70,
'sezione_urbana' => 'H501',
'numero_vani' => 9,
'stato' => 'attiva',
]
);
StabileContext::setActiveStabileId($user, $stabile0013->id);
request()->merge(['unita_id' => $unit233->id]);
$page = new CatastoHub();
$page->mount();
expect($page->stabileAttivo)->not->toBeNull()
->and($page->stabileAttivo->codice_stabile)->toBe('0013')
->and($page->stabileAttivo->foglio)->toBe('403')
->and($page->stabileAttivo->particella_catasto)->toBe('60');
expect($page->legacyData)->toBeArray()
->and($page->legacyData['foglio'])->toBe('403')
->and($page->legacyData['particella'])->toBe('60')
->and($page->legacyData['subalterno'])->toBe('509')
->and($page->legacyData['rendita'])->toBe('2.375,70');
// Sincronizzazione geometria da DB
$page->interrogaGeometriaStabile();
expect($page->stabileSubalterni)->toBeArray();
// Verify subalterno 509 exists in geometry and address does NOT contain "Viale delle Milizie"
$sub509 = collect($page->stabileSubalterni)->firstWhere('sub', '509');
expect($sub509)->not->toBeNull()
->and($sub509['indirizzo_completo'])->toContain('OTTAVIANO')
->and($sub509['indirizzo_completo'])->not->toContain('Viale delle Milizie');
});
test('sister catasto service resolves authentic credentials and builds correct api endpoints', function () {
$service = new SisterCatastoService();
$creds = $service->resolveCredentials();
expect($creds)->toBeArray()
->and($creds['passwordScript'])->toBe('nethomestore_dfgr345gd')
->and($creds['base_url'])->toContain('thenetworksolution.it');
$urlMash = $service->buildSisterUrl($creds['base_url'], 'mashIntestati.php');
$urlRicerca = $service->buildSisterUrl($creds['base_url'], 'ricercaImmobile.php');
$urlComuni = $service->buildSisterUrl($creds['base_url'], 'comuni.php');
expect($urlMash)->toBe('https://thenetworksolution.it/sister/mashIntestati.php')
->and($urlRicerca)->toBe('https://thenetworksolution.it/sister/ricercaImmobile.php')
->and($urlComuni)->toBe('https://thenetworksolution.it/sister/comuni.php');
});
test('unita immobiliare page and catasto hub sort units naturally starting with Scala A Int 1 Spadavecchia', function () {
$user = User::first() ?? User::factory()->create();
try {
if (method_exists($user, 'assignRole')) {
\Spatie\Permission\Models\Role::firstOrCreate(['name' => 'admin', 'guard_name' => 'web']);
$user->assignRole('admin');
}
} catch (\Throwable $e) {}
Auth::login($user);
$stabile0013 = Stabile::firstOrCreate(
['codice_stabile' => '0013'],
[
'amministratore_id' => 1,
'denominazione' => 'OTTAVIANO 105 - GIULIO CESARE 171',
'indirizzo' => 'VIA OTTAVIANO 105',
'cap' => '00192',
'citta' => 'ROMA',
'provincia' => 'RM',
'codice_fiscale' => '80212560587',
'foglio' => '403',
'particella_catasto' => '60',
'attivo' => 1,
]
);
$unitA1 = UnitaImmobiliare::firstOrCreate(
['stabile_id' => $stabile0013->id, 'codice_unita' => '0013-A-1'],
['scala' => 'A', 'interno' => '1', 'piano' => '3', 'subalterno' => '509', 'stato' => 'attiva']
);
$unitA2 = UnitaImmobiliare::firstOrCreate(
['stabile_id' => $stabile0013->id, 'codice_unita' => '0013-A-2'],
['scala' => 'A', 'interno' => '2', 'piano' => '0', 'subalterno' => '11', 'stato' => 'attiva']
);
$unitA10 = UnitaImmobiliare::firstOrCreate(
['stabile_id' => $stabile0013->id, 'codice_unita' => '0013-A-10'],
['scala' => 'A', 'interno' => '10', 'piano' => '0', 'subalterno' => '19', 'stato' => 'attiva']
);
$anag = DB::table('anagrafiche')->insertGetId([
'cognome' => 'SPADAVECCHIA',
'nome' => 'ALDO',
'tipo' => 'proprietario',
'codice_univoco' => 'SPAD0001',
'created_at' => now(),
'updated_at' => now(),
]);
DB::table('unita_anagrafica_periodo')->insertOrIgnore([
'unita_immobiliare_id' => $unitA1->id,
'anagrafica_id' => $anag,
'ruolo_occupazione' => 'condomino',
'data_inizio' => '1970-01-01',
'percentuale_spesa' => 100.00,
'created_at' => now(),
'updated_at' => now(),
]);
StabileContext::setActiveStabileId($user, $stabile0013->id);
request()->merge(['unita_id' => $unitA1->id]);
$uiPage = new \App\Filament\Pages\UnitaImmobiliarePage();
$uiPage->mount();
$options = $uiPage->getUnitaOptions();
$firstKey = array_key_first($options);
expect($firstKey)->toBe($unitA1->id)
->and($options[$firstKey])->toContain('Scala A - Int. 1');
$catPage = new CatastoHub();
$catPage->mount();
expect($catPage->unitaList)->not->toBeEmpty()
->and($catPage->unitaList[0]['id'])->toBe($unitA1->id)
->and($catPage->unitaList[0]['scala'])->toBe('A')
->and($catPage->unitaList[0]['interno'])->toBe('1');
});
test('unita NGGC 163 has Ottaviano Supershop Srls configured as active inquilino', function () {
$stabile0013 = Stabile::firstOrCreate(
['codice_stabile' => '0013'],
[
'amministratore_id' => 1,
'denominazione' => 'OTTAVIANO 105 - GIULIO CESARE 171',
'indirizzo' => 'VIA OTTAVIANO 105',
'cap' => '00192',
'citta' => 'ROMA',
'provincia' => 'RM',
'codice_fiscale' => '80212560587',
'foglio' => '403',
'particella_catasto' => '60',
'attivo' => 1,
]
);
$u163 = UnitaImmobiliare::firstOrCreate(
['stabile_id' => $stabile0013->id, 'codice_unita' => '0013-NGGC-163'],
['scala' => 'NGGC', 'interno' => '163', 'stato' => 'attiva']
);
$inqAnagId = DB::table('anagrafiche')->insertGetId([
'ragione_sociale' => 'Ottaviano Supershop Srls',
'tipo' => 'inquilino',
'codice_univoco' => 'OTTAV001',
'created_at' => now(),
'updated_at' => now(),
]);
DB::table('unita_anagrafica_periodo')->insertOrIgnore([
'unita_immobiliare_id' => $u163->id,
'anagrafica_id' => $inqAnagId,
'ruolo_occupazione' => 'inquilino',
'data_inizio' => '2026-01-01',
'percentuale_spesa' => 100.00,
'created_at' => now(),
'updated_at' => now(),
]);
$inqUap = DB::table('unita_anagrafica_periodo as uap')
->join('anagrafiche as a', 'a.id', '=', 'uap.anagrafica_id')
->where('uap.unita_immobiliare_id', $u163->id)
->where('uap.ruolo_occupazione', 'inquilino')
->select('a.ragione_sociale', 'a.nome')
->first();
expect($inqUap)->not->toBeNull()
->and($inqUap->ragione_sociale ?? $inqUap->nome)->toContain('Ottaviano Supershop');
});