info('Avvio bonifica e allineamento Stabile 0013...'); $stabile = Stabile::where('codice_stabile', '0013')->first(); if (!$stabile) { $this->error('Stabile 0013 non trovato!'); return 1; } // 1. Riallineamento rate e movimenti dalle unita fantasma (338, 339, 340, 341) alle unita canoniche // 339 (0013-A-82) -> 249 (0013-B-8, Scala B Int. 8) $unit249 = UnitaImmobiliare::where('stabile_id', $stabile->id)->where('scala', 'B')->where('interno', '8')->first(); if ($unit249) { if (Schema::hasTable('rate_emesse') && Schema::hasColumn('rate_emesse', 'unita_immobiliare_id')) { DB::table('rate_emesse')->where('unita_immobiliare_id', 339)->update(['unita_immobiliare_id' => $unit249->id]); } if (Schema::hasTable('dettagli_ripartizione_spese') && Schema::hasColumn('dettagli_ripartizione_spese', 'unita_immobiliare_id')) { DB::table('dettagli_ripartizione_spese')->where('unita_immobiliare_id', 339)->update(['unita_immobiliare_id' => $unit249->id]); } } // 340 (0013-A-87) -> 264 (0013-NGOT-103, Scala NGOT Int. 103) $unit264 = UnitaImmobiliare::where('stabile_id', $stabile->id)->where('scala', 'NGOT')->where('interno', '103')->first(); if ($unit264) { if (Schema::hasTable('rate_emesse') && Schema::hasColumn('rate_emesse', 'unita_immobiliare_id')) { DB::table('rate_emesse')->where('unita_immobiliare_id', 340)->update(['unita_immobiliare_id' => $unit264->id]); } if (Schema::hasTable('dettagli_ripartizione_spese') && Schema::hasColumn('dettagli_ripartizione_spese', 'unita_immobiliare_id')) { DB::table('dettagli_ripartizione_spese')->where('unita_immobiliare_id', 340)->update(['unita_immobiliare_id' => $unit264->id]); } } // 2. Eliminazione unita fantasma 338, 339, 340, 341 if (Schema::hasTable('unita_anagrafica_periodo')) { DB::table('unita_anagrafica_periodo')->whereIn('unita_immobiliare_id', [338, 339, 340, 341])->delete(); } if (Schema::hasTable('proprieta')) { DB::table('proprieta')->whereIn('unita_immobiliare_id', [338, 339, 340, 341])->delete(); } if (Schema::hasTable('unita_immobiliare_nominativi')) { DB::table('unita_immobiliare_nominativi')->whereIn('unita_immobiliare_id', [338, 339, 340, 341])->delete(); } if (Schema::hasTable('persone_unita_relazioni')) { DB::table('persone_unita_relazioni')->whereIn('unita_id', [338, 339, 340, 341])->delete(); } if (Schema::hasTable('rubrica_ruoli')) { DB::table('rubrica_ruoli')->whereIn('unita_immobiliare_id', [338, 339, 340, 341])->delete(); } DB::table('unita_immobiliari')->whereIn('id', [338, 339, 340, 341])->delete(); $this->info('Unita fantasma (71, 78, 82, 87) rimosse con successo.'); // 3. Eliminazione anagrafiche corrotte con '?' $badAnagIds = DB::table('anagrafiche') ->where('cognome', 'like', '%?%') ->orWhere('nome', 'like', '%?%') ->orWhere('ragione_sociale', 'like', '%?%') ->pluck('id') ->all(); if (!empty($badAnagIds)) { if (Schema::hasTable('unita_anagrafica_periodo')) { DB::table('unita_anagrafica_periodo')->whereIn('anagrafica_id', $badAnagIds)->delete(); } if (Schema::hasTable('proprieta')) { DB::table('proprieta')->whereIn('anagrafica_id', $badAnagIds)->delete(); } DB::table('anagrafiche')->whereIn('id', $badAnagIds)->delete(); $this->info('Anagrafiche corrotte rimaste bonificate.'); } // 4. Bonifica e allineamento Unità NGGC 163 (ID 267) $unit163 = UnitaImmobiliare::where('stabile_id', $stabile->id)->where('scala', 'NGGC')->where('interno', '163')->first(); if ($unit163) { // Anagrafica Inquilino: Ottaviano Supershop Srls $inqAnag = DB::table('anagrafiche')->where('ragione_sociale', 'like', '%Ottaviano Supershop%')->first() ?? DB::table('anagrafiche')->where('nome', 'like', '%Ottaviano Supershop%')->first(); if (!$inqAnag) { $inqId = DB::table('anagrafiche')->insertGetId([ 'ragione_sociale' => 'Ottaviano Supershop Srls', 'email' => 'amin.siddque@gmail.com', 'tipo' => 'inquilino', 'created_at' => now(), 'updated_at' => now(), ]); } else { $inqId = $inqAnag->id; DB::table('anagrafiche')->where('id', $inqId)->update([ 'ragione_sociale' => 'Ottaviano Supershop Srls', 'email' => 'amin.siddque@gmail.com', 'tipo' => 'inquilino', 'updated_at' => now(), ]); } // Assicura relazione inquilino attiva in UAP $existsInqUap = DB::table('unita_anagrafica_periodo') ->where('unita_immobiliare_id', $unit163->id) ->where('anagrafica_id', $inqId) ->where('ruolo_occupazione', 'inquilino') ->first(); if (!$existsInqUap) { DB::table('unita_anagrafica_periodo')->insert([ 'unita_immobiliare_id' => $unit163->id, 'anagrafica_id' => $inqId, 'ruolo_occupazione' => 'inquilino', 'data_inizio' => '2026-01-01', 'percentuale_spesa' => 100.000, 'sussidiata_da_proprietario' => 0, 'created_at' => now(), 'updated_at' => now(), ]); } // Assicura nominativo inquilino in unita_immobiliare_nominativi if (Schema::hasTable('unita_immobiliare_nominativi')) { DB::table('unita_immobiliare_nominativi')->updateOrInsert( ['unita_immobiliare_id' => $unit163->id, 'ruolo' => 'I'], [ 'stabile_id' => $stabile->id, 'nominativo' => 'Ottaviano Supershop Srls', 'data_inizio' => '2026-01-01', 'percentuale' => 100.00, 'fonte' => 'gescon_bonifica', 'updated_at' => now(), ] ); } $this->info('Unita NGGC 163 allineata con Inquilino Ottaviano Supershop Srls.'); } // 5. Riallineamento Unita 233 (Scala A Int. 1) con dati ufficiali Catasto $unit233 = UnitaImmobiliare::where('stabile_id', $stabile->id)->where('scala', 'A')->where('interno', '1')->first(); if ($unit233) { $unit233->subalterno = '509'; $unit233->categoria_catastale = 'A/2'; $unit233->rendita_catastale = 2524.18; $unit233->piano = '3'; $unit233->numero_vani = 9; $unit233->sezione_urbana = null; $unit233->save(); $this->info('Unita 233 (Scala A Int. 1) allineata con dati Sister Catasto.'); } $this->info('Bonifica Stabile 0013 completata con successo!'); return 0; } }