netgescon-day0/tests/Feature/NominativiAndFeMatchingTest.php

163 lines
5.2 KiB
PHP

<?php
use App\Models\FatturaElettronica;
use App\Models\Persona;
use App\Models\PersonaUnitaRelazione;
use App\Models\Stabile;
use App\Models\UnitaImmobiliare;
use App\Models\User;
use App\Services\FattureElettroniche\FatturaElettronicaImporter;
use Illuminate\Foundation\Testing\RefreshDatabase;
use Illuminate\Support\Facades\DB;
use Spatie\Permission\Models\Role;
uses(RefreshDatabase::class);
it('nominativi stabile page resolves identical canonical names as unita immobiliare', function () {
$user = User::factory()->create();
Role::firstOrCreate(['name' => 'amministratore', 'guard_name' => 'web']);
$user->assignRole('amministratore');
DB::table('amministratori')->insertOrIgnore([
'id' => 1,
'user_id' => $user->id,
'nome' => 'Mario',
'cognome' => 'Rossi',
'codice_amministratore' => 'ADM0001',
'created_at' => now(),
'updated_at' => now(),
]);
$stabile = Stabile::create([
'codice_stabile' => '0099',
'denominazione' => 'Condominio Test Unitario',
'indirizzo' => 'Via Test 1',
'citta' => 'Roma',
'cap' => '00100',
'provincia' => 'RM',
'codice_fiscale' => '99999990580',
'amministratore_id' => 1,
]);
$unita = UnitaImmobiliare::create([
'stabile_id' => $stabile->id,
'interno' => '1',
'scala' => 'A',
]);
$proprietario = Persona::create([
'cognome' => 'Rossi',
'nome' => 'Mario',
'codice_fiscale' => 'RSSMRA80A01H501U',
]);
$inquilino = Persona::create([
'cognome' => 'Bianchi',
'nome' => 'Luigi',
'codice_fiscale' => 'BNCLGU85B02H501Z',
]);
PersonaUnitaRelazione::create([
'unita_id' => $unita->id,
'persona_id' => $proprietario->id,
'tipo_relazione' => 'proprietario',
'quota_relazione' => 100,
'data_inizio' => '2020-01-01',
'attivo' => 1,
]);
PersonaUnitaRelazione::create([
'unita_id' => $unita->id,
'persona_id' => $inquilino->id,
'tipo_relazione' => 'inquilino',
'quota_relazione' => 100,
'data_inizio' => '2020-01-01',
'attivo' => 1,
]);
$response = $this->actingAs($user)->get("/admin-filament/condomini/nominativi?stabile_id={$stabile->id}");
expect($response->status())->toBeIn([200, 302]);
});
it('fe scanner correctly matches invoices strictly by codice fiscale without arbitrary fallback', function () {
$user = User::factory()->create();
Role::firstOrCreate(['name' => 'amministratore', 'guard_name' => 'web']);
$user->assignRole('amministratore');
DB::table('amministratori')->insertOrIgnore([
'id' => 1,
'user_id' => $user->id,
'nome' => 'Admin',
'cognome' => 'Test',
'codice_amministratore' => 'ADM0001',
'created_at' => now(),
'updated_at' => now(),
]);
$stabile = Stabile::create([
'codice_stabile' => '0098',
'denominazione' => 'Condominio Via Test 10',
'indirizzo' => 'Via Test 10',
'citta' => 'Roma',
'cap' => '00100',
'provincia' => 'RM',
'codice_fiscale' => '88888880581',
'amministratore_id' => 1,
]);
$xmlContentMatching = <<<XML
<?xml version="1.0" encoding="UTF-8"?>
<p:FatturaElettronica versione="FPR12" xmlns:p="http://ivaservizi.agenziaentrate.gov.it/docs/xsd/fatture/v1.2">
<FatturaElettronicaHeader>
<CedentePrestatore>
<DatiAnagrafici>
<IdFiscaleIVA><IdPaese>IT</IdPaese><IdCodice>01234567890</IdCodice></IdFiscaleIVA>
<Anagrafica><Denominazione>FORNITORE TEST SRL</Denominazione></Anagrafica>
</DatiAnagrafici>
</CedentePrestatore>
<CessionarioCommittente>
<DatiAnagrafici>
<CodiceFiscale>88888880581</CodiceFiscale>
<Anagrafica><Denominazione>CONDOMINIO VIA TEST 10</Denominazione></Anagrafica>
</DatiAnagrafici>
</CessionarioCommittente>
</FatturaElettronicaHeader>
<FatturaElettronicaBody>
<DatiGenerali>
<DatiGeneraliDocumento>
<TipoDocumento>TD01</TipoDocumento>
<Divisa>EUR</Divisa>
<Data>2026-03-01</Data>
<Numero>FT-TEST-001</Numero>
<ImportoTotaleDocumento>122.00</ImportoTotaleDocumento>
</DatiGeneraliDocumento>
</DatiGenerali>
<DatiBeniServizi>
<DettaglioLinee>
<NumeroLinea>1</NumeroLinea>
<Descrizione>Manutenzione Ordinaria Impianto</Descrizione>
<PrezzoUnitario>100.00</PrezzoUnitario>
<PrezzoTotale>100.00</PrezzoTotale>
<AliquotaIVA>22.00</AliquotaIVA>
</DettaglioLinee>
<DatiRiepilogo>
<AliquotaIVA>22.00</AliquotaIVA>
<ImponibileImporto>100.00</ImponibileImporto>
<Imposta>22.00</Imposta>
</DatiRiepilogo>
</DatiBeniServizi>
</FatturaElettronicaBody>
</p:FatturaElettronica>
XML;
$importer = app(FatturaElettronicaImporter::class);
$result = $importer->importXml($xmlContentMatching, (int) $stabile->id, 'FT-TEST-001.xml');
expect($result['status'])->toBe('imported');
$fe = FatturaElettronica::where('numero_fattura', 'FT-TEST-001')->first();
expect($fe)->not->toBeNull();
expect((int) $fe->stabile_id)->toBe((int) $stabile->id);
expect($fe->destinatario_cf)->toBe('88888880581');
});