create(); $user->assignRole('super-admin'); $this->actingAs($user); $amministratore = Amministratore::create([ 'user_id' => $user->id, 'nome' => 'Admin', 'cognome' => 'Test', 'denominazione' => 'Amministrazione Test', 'codice_fiscale' => '12345678901', ]); $stabile = Stabile::create([ 'amministratore_id' => $amministratore->id, 'codice_stabile' => '9999', 'denominazione' => 'Condominio Test Contabilita', 'codice_fiscale' => '12345678901', 'indirizzo' => 'Via Test 1', 'citta' => 'Roma', 'cap' => '00100', 'provincia' => 'RM', 'codice_destinatario_sdi' => '0000000', ]); $gestione = GestioneContabile::create([ 'tenant_id' => 'default', 'stabile_id' => $stabile->id, 'anno_gestione' => 2026, 'tipo_gestione' => 'ordinaria', 'denominazione' => 'Gestione Ordinaria 2026', 'data_inizio' => '2026-01-01', 'data_fine' => '2026-12-31', 'stato' => 'aperta', 'protocollo_prefix' => 'O2026', ]); // Setup staging operations table Schema::connection('gescon_import')->dropIfExists('operazioni'); Schema::connection('gescon_import')->create('operazioni', function ($table) { $table->id('id_operaz'); $table->string('cod_stabile')->nullable(); $table->string('legacy_year')->nullable(); $table->string('compet')->nullable(); $table->string('gestione')->nullable(); $table->integer('n_stra')->nullable(); $table->integer('n_spe')->nullable(); $table->string('cod_for')->nullable(); $table->string('cod_spe')->nullable(); $table->string('natura2')->nullable(); $table->decimal('importo_euro', 15, 2)->nullable(); $table->decimal('importo_spese', 15, 2)->nullable(); $table->decimal('importo_entrate', 15, 2)->nullable(); $table->string('note')->nullable(); $table->string('natura')->nullable(); $table->date('dt_spe')->nullable(); }); // Seed initial staging operations data DB::connection('gescon_import')->table('operazioni')->insert([ 'id_operaz' => 888, 'cod_stabile' => '9999', 'legacy_year' => '2026', 'compet' => 'C', 'gestione' => 'O', 'n_stra' => 0, 'importo_euro' => 150.00, 'importo_spese' => 150.00, 'importo_entrate' => 0.00, 'note' => 'Original Operation', 'dt_spe' => '2026-07-01', ]); // Run first import to create the domain entry Artisan::call('gescon:import-full', [ '--stabile' => '9999', '--solo' => 'operazioni', ]); // Verify it was created $imported = DB::table('operazioni_contabili')->where('legacy_id', 888)->first(); expect($imported)->not->toBeNull(); expect($imported->descrizione)->toBe('Original Operation'); // Simulate user editing/reconciling this transaction in NetGescon DB::table('operazioni_contabili')->where('id', $imported->id)->update([ 'stato_operazione' => 'reconciled_by_user', ]); // Update staging data in MDB (e.g. amount or note changes at source) DB::connection('gescon_import')->table('operazioni')->where('id_operaz', 888)->update([ 'note' => 'Updated Operation Note', ]); // Run pipeline again WITH --update-only to check if the user modifications and record are preserved Artisan::call('gescon:import-full', [ '--stabile' => '9999', '--solo' => 'operazioni', '--update-only' => true, ]); $reimported = DB::table('operazioni_contabili')->where('legacy_id', 888)->first(); expect($reimported)->not->toBeNull(); // Verify the record was NOT deleted and recreated (which would lose the status edited by user) expect($reimported->id)->toBe($imported->id); expect($reimported->stato_operazione)->toBe('reconciled_by_user'); // Verify the note was updated incrementally expect($reimported->descrizione)->toBe('Updated Operation Note'); // Clean up staging Schema::connection('gescon_import')->dropIfExists('operazioni'); });