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'); });