'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'); }); it('mounts LavorazioniOperative with unified KPI cards and renders in-page Scheda TAB without modal', function () { $michele = User::where('email', 'michele@nethome.it')->first(); Auth::login($michele); $page = new LavorazioniOperative(); $page->mount(); expect($page->fornitoreId)->toBe(236) ->and($page->mainTab)->toBe('elenco') ->and($page->totals['tutte'])->toBeGreaterThan(0) ->and(count($page->rows))->toBeGreaterThan(0); // Find TecnoRepair row $tecnorepairRow = collect($page->rows)->firstWhere('row_type', 'tecnorepair'); expect($tecnorepairRow)->not->toBeNull(); // Open detail -> must activate in-page TAB 'scheda', NOT a modal! $page->openRowDetail('tecnorepair', (int) $tecnorepairRow['id']); expect($page->mainTab)->toBe('scheda') ->and($page->detailModal)->toBeNull() // Confirms no modal popup is used ->and($page->activeScheda)->not->toBeNull() ->and($page->activeScheda['customer_name'])->not->toBeEmpty() ->and($page->schedaSubTab)->toBe('entrata'); // Test sub-tabs navigation $page->setSchedaSubTab('riparazione'); expect($page->schedaSubTab)->toBe('riparazione'); // Test pattern unlock dot toggling $initialDot = $page->unlockPattern[0]; $page->togglePatternDot(0); expect($page->unlockPattern[0])->toBe($initialDot === 1 ? 0 : 1); // Test saving modifications $testDefect = 'TEST DIFETTO AGGIORNATO ' . uniqid(); $page->schedaForm['difetto_segnalato'] = $testDefect; $page->saveActiveScheda(); $reloaded = AssistenzaTecnorepairScheda::find((int) $tecnorepairRow['id']); expect($reloaded->defect_reported)->toBe($testDefect); // Test close -> back to elenco tab $page->closeScheda(); expect($page->mainTab)->toBe('elenco'); });