netgescon-day0/app/Console/Commands/BonificaProprietaStabile.php

76 lines
2.8 KiB
PHP
Executable File

<?php
namespace App\Console\Commands;
use Illuminate\Console\Command;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Schema;
class BonificaProprietaStabile extends Command
{
protected $signature = 'netgescon:bonifica-proprieta
{--stabile_id= : ID stabile (netgescon.stabili.id)}
{--dry-run : Non modifica nulla, mostra solo i conteggi}
';
protected $description = 'Bonifica proprieta/locazioni: rimuove righe con soggetto_id NULL e duplicati per la stessa unita/tipo/soggetto.';
public function handle(): int
{
$stabileId = $this->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;
}
}