argument('amministratore_id'); $mdb = (string) $this->option('mdb'); $this->info("Inizio sincronizzazione Anagrafica Unica e Fornitori per Amministratore ID {$adminId}..."); // 1. Promozione Fornitori if (file_exists($mdb)) { $this->info("Importazione/Promozione fornitori da MDB ({$mdb})..."); Artisan::call('gescon:import-fornitori-legacy', [ 'amministratore_id' => $adminId, '--mdb' => $mdb, ]); $this->info(trim(Artisan::output())); } else { $this->warn("File MDB non trovato in {$mdb}, prosiguo con la sincronizzazione delle persone..."); } // 2. Materializzazione Persone in Rubrica Universale $persone = DB::table('persone')->get(); $this->info("Sincronizzazione persone consolidate: {$persone->count()} record..."); $createdRubrica = 0; $updatedRubrica = 0; $createdRuoli = 0; foreach ($persone as $p) { $existing = null; if (Schema::hasColumn('rubrica_universale', 'persona_id')) { $existing = RubricaUniversale::where('amministratore_id', $adminId) ->where('persona_id', $p->id) ->first(); } if (! $existing && ! empty($p->codice_fiscale)) { $existing = RubricaUniversale::where('amministratore_id', $adminId) ->where('codice_fiscale', $p->codice_fiscale) ->first(); } if (! $existing && ! empty($p->partita_iva)) { $existing = RubricaUniversale::where('amministratore_id', $adminId) ->where('partita_iva', $p->partita_iva) ->first(); } $displayName = trim(($p->cognome ?? '') . ' ' . ($p->nome ?? '')); if ($displayName === '' && ! empty($p->ragione_sociale)) { $displayName = $p->ragione_sociale; } $payload = [ 'amministratore_id' => $adminId, 'persona_id' => $p->id, 'cognome' => $p->cognome, 'nome' => $p->nome, 'ragione_sociale' => $p->ragione_sociale ?: ($displayName !== '' ? $displayName : 'Persona Consolidata #' . $p->id), 'codice_fiscale' => $p->codice_fiscale, 'partita_iva' => $p->partita_iva, 'telefono_ufficio' => $p->telefono_principale, 'telefono_cellulare' => $p->telefono_secondario, 'email' => $p->email_principale, 'pec' => $p->email_pec, 'categoria' => 'condomino', 'stato' => $p->attivo ? 'attivo' : 'inattivo', 'tipo_contatto' => ($p->tipologia === 'giuridica' || ! empty($p->partita_iva)) ? 'persona_giuridica' : 'persona_fisica', 'note' => $p->note, ]; if (! Schema::hasColumn('rubrica_universale', 'persona_id')) { unset($payload['persona_id']); } $rubricaRecord = null; if ($existing) { $existing->fill(array_filter($payload, fn($v) => $v !== null && $v !== '')); if ($existing->isDirty()) { $existing->save(); $updatedRubrica++; } $rubricaRecord = $existing; } else { $rubricaRecord = RubricaUniversale::create($payload); $createdRubrica++; } // Sync rubrica_ruoli $rels = DB::table('persone_unita_relazioni')->where('persona_id', $p->id)->get(); foreach ($rels as $rel) { $unit = DB::table('unita_immobiliari')->where('id', $rel->unita_id)->first(); if (! $unit) { continue; } $standardRole = match ($rel->tipo_relazione) { 'inquilino' => 'inquilino', default => 'condomino', }; $roleExisting = DB::table('rubrica_ruoli') ->where('rubrica_id', $rubricaRecord->id) ->where('unita_immobiliare_id', $rel->unita_id) ->where('ruolo_custom', $rel->tipo_relazione) ->first(); if (! $roleExisting) { DB::table('rubrica_ruoli')->insert([ 'rubrica_id' => $rubricaRecord->id, 'stabile_id' => $unit->stabile_id, 'unita_immobiliare_id' => $rel->unita_id, 'ruolo_standard' => $standardRole, 'ruolo_custom' => $rel->tipo_relazione, 'is_attivo' => $rel->attivo, 'created_at' => now(), 'updated_at' => now(), ]); $createdRuoli++; } } } $this->info("✅ Sincronizzazione anagrafica completata! Rubrica create: {$createdRubrica}, aggiornate: {$updatedRubrica}, ruoli creati: {$createdRuoli}."); return self::SUCCESS; } }