option('stabile_id') ? (int)$this->option('stabile_id') : null; $dry = (bool)$this->option('dry-run'); if (!$stabileId) { $this->error('Specifica --stabile_id'); return 1; } if (!Schema::hasTable('proprieta') || !Schema::hasTable('unita_immobiliari')) { $this->warn('Tabelle richieste non presenti (proprieta/unita_immobiliari).'); return 0; } $unitaIds = DB::table('unita_immobiliari')->where('stabile_id', $stabileId)->pluck('id')->all(); if (empty($unitaIds)) { $this->info('Nessuna unita trovata per questo stabile.'); return 0; } // 1) Rimuovi righe con soggetto_id NULL (tipicamente inquilini importati male) $nullQuery = DB::table('proprieta') ->whereIn('unita_immobiliare_id', $unitaIds) ->whereNull('soggetto_id'); $nullCount = (int)$nullQuery->count(); $this->info("Righe proprieta con soggetto_id NULL: {$nullCount}"); if (!$dry && $nullCount > 0) { $nullQuery->delete(); } // 2) Duplicati: stessa unita_immobiliare_id + tipo_diritto + soggetto_id $dupGroups = DB::table('proprieta') ->selectRaw('unita_immobiliare_id, tipo_diritto, soggetto_id, COUNT(*) as cnt, MIN(id) as keep_id') ->whereIn('unita_immobiliare_id', $unitaIds) ->whereNotNull('soggetto_id') ->groupBy('unita_immobiliare_id', 'tipo_diritto', 'soggetto_id') ->havingRaw('COUNT(*) > 1') ->get(); $dupTotal = (int)$dupGroups->sum(fn($g) => max(0, ((int)$g->cnt) - 1)); $this->info("Duplicati (righe extra da rimuovere): {$dupTotal}"); if (!$dry && $dupTotal > 0) { foreach ($dupGroups as $g) { DB::table('proprieta') ->where('unita_immobiliare_id', $g->unita_immobiliare_id) ->where('tipo_diritto', $g->tipo_diritto) ->where('soggetto_id', $g->soggetto_id) ->where('id', '!=', $g->keep_id) ->delete(); } } $this->info($dry ? 'Dry-run completato.' : 'Bonifica completata.'); return 0; } }