76 lines
2.8 KiB
PHP
76 lines
2.8 KiB
PHP
<?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;
|
|
}
|
|
}
|