'super-admin', 'guard_name' => 'web']); Role::firstOrCreate(['name' => 'fornitore', 'guard_name' => 'web']); $fornitore236 = Fornitore::query()->find(236); if (! $fornitore236) { $fornitore236 = new Fornitore(); $fornitore236->id = 236; $fornitore236->ragione_sociale = 'NETHOME sas di BARONE M. & C.'; $fornitore236->partita_iva = '10055221005'; $fornitore236->codice_fiscale = '10055221005'; $fornitore236->codice_univoco = 'NETHOME'; $fornitore236->amministratore_id = 13; $fornitore236->operational_config = [ 'accounting_db' => [ 'host' => '192.168.0.36', 'port' => 3307, 'database' => 'arc_nehr', 'username' => 'NETGESCON', ], 'tecnorepair' => [ 'mdb_path' => '/home/michele/netgescon-day0-backup/Miki-Bug-workspace/screenshot/Assistenza gestionale/Archivi/TecnoRepairDB.mdb', ], ]; $fornitore236->save(); } $fornitore392 = Fornitore::query()->find(392); if (! $fornitore392) { $fornitore392 = new Fornitore(); $fornitore392->id = 392; $fornitore392->ragione_sociale = 'NCOM SRL'; $fornitore392->partita_iva = '14001151001'; $fornitore392->codice_univoco = 'NCOMSRL'; $fornitore392->amministratore_id = 13; $fornitore392->save(); } $michele = User::query()->where('email', 'michele@nethome.it')->first(); if (! $michele) { $michele = User::query()->create([ 'name' => 'Michele Barone', 'email' => 'michele@nethome.it', 'password' => bcrypt('password'), ]); } $michele->syncRoles(['super-admin']); $nethomeUser = User::query()->where('email', 'nethomestore@gmail.com')->first(); if (! $nethomeUser) { $nethomeUser = User::query()->create([ 'name' => 'Nethome Store', 'email' => 'nethomestore@gmail.com', 'password' => bcrypt('password'), ]); } $nethomeUser->syncRoles(['fornitore']); $dipendente = FornitoreDipendente::query()->where('email', 'nethomestore@gmail.com')->first(); if (! $dipendente) { FornitoreDipendente::query()->create([ 'email' => 'nethomestore@gmail.com', 'fornitore_id' => 236, 'user_id' => $nethomeUser->id, 'nome' => 'Nethome Store', 'attivo' => true, ]); } AssistenzaTecnorepairScheda::query()->firstOrCreate( ['legacy_numero_scheda' => '1831'], [ 'amministratore_id' => 13, 'fornitore_id' => 236, 'customer_name' => 'BARONE MICHELE', 'product_model' => 'NOTEBOOK ASUS ROG', 'serial_number' => 'ASUS12345', 'status_code' => '21', 'status_label' => 'INGRESSO ACCETTAZIONE', 'status_bucket' => 'in_progress', 'defect_reported' => 'NON SI ACCENDE', 'repair_description' => 'In attesa diagnosi', 'communications' => 'Cliente avvisato', 'metadata' => ['raw' => ['isRiconsegnato' => 0]], ] ); }); it('verifies user and role alignment for super-admin and fornitore', function () { $michele = User::where('email', 'michele@nethome.it')->first(); expect($michele)->not->toBeNull(); $roles = $michele->roles->pluck('name')->all(); expect($roles)->toBe(['super-admin']); $nethomeUser = User::where('email', 'nethomestore@gmail.com')->first(); expect($nethomeUser)->not->toBeNull(); $nethomeRoles = $nethomeUser->roles->pluck('name')->all(); expect($nethomeRoles)->toBe(['fornitore']); $dipendente = FornitoreDipendente::where('email', 'nethomestore@gmail.com')->first(); expect($dipendente)->not->toBeNull() ->and((int) $dipendente->fornitore_id)->toBe(236) ->and((int) $dipendente->user_id)->toBe((int) $nethomeUser->id); }); it('strictly restricts integration settings to Nethome on FornitoreScheda', function () { $michele = User::where('email', 'michele@nethome.it')->first(); Auth::login($michele); // Fornitore 236 (Nethome) $pageNethome = new FornitoreScheda(); $pageNethome->mount(236); expect($pageNethome->isNethomeFornitore())->toBeTrue(); // Can save settings on Nethome $pageNethome->mysqlHost = '192.168.0.36'; $pageNethome->mysqlPort = '3307'; $pageNethome->mysqlDatabase = 'arc_nehr'; $pageNethome->saveNethomeIntegrations(); $fornitore236 = Fornitore::find(236); expect(data_get($fornitore236->operational_config, 'accounting_db.host'))->toBe('192.168.0.36') ->and(data_get($fornitore236->operational_config, 'tecnorepair.mdb_path'))->not->toBeEmpty(); // Fornitore 392 (NCOM SRL - Non Nethome) $pageOther = new FornitoreScheda(); $pageOther->mount(392); expect($pageOther->isNethomeFornitore())->toBeFalse(); // Attempting to save on non-Nethome throws 403 expect(fn() => $pageOther->saveNethomeIntegrations())->toThrow(HttpException::class); expect(fn() => $pageOther->testMysqlConnection())->toThrow(HttpException::class); expect(fn() => $pageOther->sincronizzaContabilitaNethome())->toThrow(HttpException::class); expect(fn() => $pageOther->sincronizzaTecnorepairNethome())->toThrow(HttpException::class); }); it('executes automated repair workflows on AssistenzaTecnorepairScheda', function () { $service = app(TecnoRepairArchiveService::class); $scheda = AssistenzaTecnorepairScheda::firstOrCreate( ['legacy_numero_scheda' => 'TEST-999'], [ 'amministratore_id' => 13, 'fornitore_id' => 236, 'customer_name' => 'TEST CUSTOMER', 'product_model' => 'HP PROBOOK', 'serial_number' => 'HPTEST12345', 'status_code' => '21', 'status_label' => 'INGRESSO ACCETTAZIONE', 'defect_reported' => 'NON SI ACCENDE', ] ); // 1. Workflow Riparato $service->chiudiComeRiparato($scheda, 'Sostituito condensatore e completato collaudo', 'MICHELE BARONE'); $scheda->refresh(); expect($scheda->status_code)->toBe('4') ->and($scheda->status_label)->toBe('RIPARATO') ->and($scheda->status_bucket)->toBe('completed') ->and(data_get($scheda->metadata, 'workflow_status'))->toBe('repaired'); // 2. Workflow Reso Fornitore RMA $service->rendiAFornitoreRma($scheda, 'RMA-TEST-2026', 392, 'Guasto scheda madre'); $scheda->refresh(); expect($scheda->status_code)->toBe('33') ->and($scheda->status_label)->toBe('MANDATO IN GARANZIA AL PRODUTTORE') ->and($scheda->status_bucket)->toBe('in_progress') ->and($scheda->rma_code)->toBe('RMA-TEST-2026'); // 3. Workflow Rottamazione / Ricambi $service->chiudiComeRottamato($scheda, 'Dispositivo non conveniente da riparare', true); $scheda->refresh(); expect($scheda->status_code)->toBe('23') ->and($scheda->status_bucket)->toBe('scrapped') ->and(data_get($scheda->metadata, 'workflow_status'))->toBe('spare_parts'); }); it('mounts PraticheTecnorepair page and renders desktop grid and detail modal', function () { $michele = User::where('email', 'michele@nethome.it')->first(); Auth::login($michele); $page = new PraticheTecnorepair(); $page->mount(); expect($page->fornitoreId)->toBe(236) ->and($page->fornitoreLabel)->toContain('NETHOME') ->and(count($page->rows))->toBeGreaterThan(0) ->and($page->totals['totale'])->toBeGreaterThan(0); // Open first scheda in modal $firstRowId = $page->rows[0]['id']; $page->openScheda($firstRowId); expect($page->selectedSchedaId)->toBe($firstRowId) ->and($page->activeScheda)->not->toBeNull() ->and($page->activeScheda['cliente_nome'])->not->toBeEmpty(); // Verify tabs switching $page->setSchedaTab('riparazione'); expect($page->schedaTab)->toBe('riparazione'); $page->closeScheda(); expect($page->selectedSchedaId)->toBeNull() ->and($page->activeScheda)->toBeNull(); }); it('verifies sync buttons and automatic updates on SerialiCatalogo and ProdottiCatalogo', function () { $michele = User::where('email', 'michele@nethome.it')->first(); Auth::login($michele); // SerialiCatalogo $serialiPage = new SerialiCatalogo(); $serialiPage->mount(); expect($serialiPage->fornitoreId)->toBe(236); expect($serialiPage->getPraticheUrl())->toContain('fornitore/pratiche'); // ProdottiCatalogo $prodottiPage = new ProdottiCatalogo(); $prodottiPage->mount(); expect($prodottiPage->fornitoreId)->toBe(236); expect($prodottiPage->getPraticheUrl())->toContain('fornitore/pratiche'); });