command->info("🏗️ Creazione gestioni condominiali per stabile ID: {$stabile_id}"); // 1. Crea le gestioni condominiali $gestioni = $this->creaGestioniCondominiali($stabile_id); // 2. Crea le tabelle millesimali per la gestione ordinaria 2024 $gestione_ordinaria = $gestioni->where('tipo', 'ORDINARIA')->first(); $this->creaTabelleMillesimali($gestione_ordinaria->id); // 3. Crea le voci di spesa (SALTATA per ora - tabella non presente) // $this->creaVociSpesa($gestione_ordinaria->id); // 4. Crea/verifica le unità immobiliari $this->creaUnitaImmobiliari($stabile_id); // 5. Inserisce i millesimi per ogni unità $this->inserisciMillesimi($gestione_ordinaria->id); $this->command->info("✅ Seeder tabelle millesimali completato!"); } private function creaGestioniCondominiali($stabile_id) { $gestioni = collect([ [ 'stabile_id' => $stabile_id, 'codice' => 'ORD2024', 'descrizione' => 'Gestione Ordinaria 2024', 'tipo' => 'ORDINARIA', 'anno_inizio' => 2024, 'anno_fine' => 2024, 'data_inizio' => Carbon::create(2024, 1, 1), 'data_fine' => Carbon::create(2024, 12, 31), 'stato' => 'ATTIVA' ], [ 'stabile_id' => $stabile_id, 'codice' => 'RISC2024-25', 'descrizione' => 'Gestione Riscaldamento 2024-2025', 'tipo' => 'RISCALDAMENTO', 'anno_inizio' => 2024, 'anno_fine' => 2025, 'data_inizio' => Carbon::create(2024, 10, 15), 'data_fine' => Carbon::create(2025, 4, 15), 'stato' => 'ATTIVA' ], [ 'stabile_id' => $stabile_id, 'codice' => 'STRA2023', 'descrizione' => 'Spesa Straordinaria 2023', 'tipo' => 'STRAORDINARIA', 'anno_inizio' => 2023, 'anno_fine' => 2023, 'data_inizio' => Carbon::create(2023, 1, 1), 'data_fine' => Carbon::create(2023, 12, 31), 'stato' => 'CHIUSA' ], [ 'stabile_id' => $stabile_id, 'codice' => 'STRA2025', 'descrizione' => 'Spesa Straordinaria 2025', 'tipo' => 'STRAORDINARIA', 'anno_inizio' => 2025, 'anno_fine' => 2025, 'data_inizio' => Carbon::create(2025, 1, 1), 'data_fine' => Carbon::create(2025, 12, 31), 'stato' => 'ATTIVA' ] ]); foreach ($gestioni as $gestione_data) { GestioneCondominiale::updateOrCreate( ['stabile_id' => $gestione_data['stabile_id'], 'codice' => $gestione_data['codice']], $gestione_data ); } return GestioneCondominiale::where('stabile_id', $stabile_id)->get(); } private function creaTabelleMillesimali($gestione_id) { // Ottieni la gestione per prendere lo stabile_id $gestione = GestioneCondominiale::find($gestione_id); $tabelle = [ ['codice_tabella' => 'TAB.A', 'nome_tabella' => 'TAB.A', 'denominazione' => 'Tabella di Proprietà', 'tipo_tabella' => 'proprieta', 'tipo_calcolo' => 'millesimi', 'totale_millesimi' => 1000.00], ['codice_tabella' => 'TAB.A1', 'nome_tabella' => 'TAB.A1', 'denominazione' => 'Tabella di Prop. scala A', 'tipo_tabella' => 'proprieta', 'tipo_calcolo' => 'millesimi', 'totale_millesimi' => 1000.00], ['codice_tabella' => 'TAB.A2', 'nome_tabella' => 'TAB.A2', 'denominazione' => 'Tabella di Prop. scala B', 'tipo_tabella' => 'proprieta', 'tipo_calcolo' => 'millesimi', 'totale_millesimi' => 1000.00], ['codice_tabella' => 'TAB.A3', 'nome_tabella' => 'TAB.A3', 'denominazione' => 'Tabella di Prop. scala C', 'tipo_tabella' => 'proprieta', 'tipo_calcolo' => 'millesimi', 'totale_millesimi' => 1000.00], ['codice_tabella' => 'TAB.A4', 'nome_tabella' => 'TAB.A4', 'denominazione' => 'Tabella di Prop. particolare', 'tipo_tabella' => 'custom', 'tipo_calcolo' => 'millesimi', 'totale_millesimi' => 1000.00], ['codice_tabella' => 'TAB.A5', 'nome_tabella' => 'TAB.A5', 'denominazione' => 'Tabella portiere', 'tipo_tabella' => 'portineria', 'tipo_calcolo' => 'millesimi', 'totale_millesimi' => 1000.00], ['codice_tabella' => 'TAB.B1', 'nome_tabella' => 'TAB.B1', 'denominazione' => 'Tabella scale A', 'tipo_tabella' => 'scale', 'tipo_calcolo' => 'millesimi', 'totale_millesimi' => 1000.00], ['codice_tabella' => 'TAB.B2', 'nome_tabella' => 'TAB.B2', 'denominazione' => 'Tabella scala B', 'tipo_tabella' => 'scale', 'tipo_calcolo' => 'millesimi', 'totale_millesimi' => 1000.00], ['codice_tabella' => 'TAB.B3', 'nome_tabella' => 'TAB.B3', 'denominazione' => 'Tabella scala C', 'tipo_tabella' => 'scale', 'tipo_calcolo' => 'millesimi', 'totale_millesimi' => 1000.00], ['codice_tabella' => 'TAB.C1', 'nome_tabella' => 'TAB.C1', 'denominazione' => 'Tabella ascensore scala A', 'tipo_tabella' => 'ascensore', 'tipo_calcolo' => 'millesimi', 'totale_millesimi' => 1000.00], ['codice_tabella' => 'TAB.C2', 'nome_tabella' => 'TAB.C2', 'denominazione' => 'Tabella ascensore scala B', 'tipo_tabella' => 'ascensore', 'tipo_calcolo' => 'millesimi', 'totale_millesimi' => 992.52], ['codice_tabella' => 'TAB.C3', 'nome_tabella' => 'TAB.C3', 'denominazione' => 'Tabella ascensore scala C', 'tipo_tabella' => 'ascensore', 'tipo_calcolo' => 'millesimi', 'totale_millesimi' => 1000.00], ['codice_tabella' => 'RISC.', 'nome_tabella' => 'RISC.', 'denominazione' => 'Riscaldamento', 'tipo_tabella' => 'riscaldamento', 'tipo_calcolo' => 'millesimi', 'totale_millesimi' => 1000.00], ['codice_tabella' => 'RISC.L', 'nome_tabella' => 'RISC.L', 'denominazione' => 'RISCALDAMENTO (in base alle letture)', 'tipo_tabella' => 'riscaldamento', 'tipo_calcolo' => 'parti', 'totale_millesimi' => 0.00], ['codice_tabella' => 'RENDIT', 'nome_tabella' => 'RENDIT', 'denominazione' => 'Rendite condominiali', 'tipo_tabella' => 'custom', 'tipo_calcolo' => 'millesimi', 'totale_millesimi' => 1000.00], ['codice_tabella' => 'QUOTAU', 'nome_tabella' => 'QUOTAU', 'denominazione' => 'Rimborso quota uffici', 'tipo_tabella' => 'custom', 'tipo_calcolo' => 'millesimi', 'totale_millesimi' => 6.00], ['codice_tabella' => 'ACQUA', 'nome_tabella' => 'ACQUA', 'denominazione' => 'Consumi idrici individuali', 'tipo_tabella' => 'custom', 'tipo_calcolo' => 'parti', 'totale_millesimi' => 0.00], ['codice_tabella' => 'REND.A', 'nome_tabella' => 'REND.A', 'denominazione' => 'Contributo immobili uso non abitativo sc.A', 'tipo_tabella' => 'custom', 'tipo_calcolo' => 'millesimi', 'totale_millesimi' => 838.84], ['codice_tabella' => 'REND.B', 'nome_tabella' => 'REND.B', 'denominazione' => 'Contributo immobili uso non abitativo sc.B', 'tipo_tabella' => 'custom', 'tipo_calcolo' => 'millesimi', 'totale_millesimi' => 708.51], ['codice_tabella' => 'REND.C', 'nome_tabella' => 'REND.C', 'denominazione' => 'Contributo immobili uso non abitativo sc.C', 'tipo_tabella' => 'custom', 'tipo_calcolo' => 'millesimi', 'totale_millesimi' => 877.04], ['codice_tabella' => 'RIPARC', 'nome_tabella' => 'RIPARC', 'denominazione' => 'Ripartizioni spese Condominio', 'tipo_tabella' => 'custom', 'tipo_calcolo' => 'millesimi', 'totale_millesimi' => 1000.00], ['codice_tabella' => 'RIPARR', 'nome_tabella' => 'RIPARR', 'denominazione' => 'Ripartizioni spese Riscaldamento', 'tipo_tabella' => 'riscaldamento', 'tipo_calcolo' => 'millesimi', 'totale_millesimi' => 1000.00], ['codice_tabella' => 'RI.ASS', 'nome_tabella' => 'RI.ASS', 'denominazione' => 'RIMBORSI ASSICURATIVI', 'tipo_tabella' => 'custom', 'tipo_calcolo' => 'millesimi', 'totale_millesimi' => 1000.00] ]; foreach ($tabelle as $tabella_data) { $tabella_data['stabile_id'] = $gestione->stabile_id; TabellaMillesimale::updateOrCreate( ['stabile_id' => $gestione->stabile_id, 'codice_tabella' => $tabella_data['codice_tabella']], $tabella_data ); } } private function creaVociSpesa($gestione_id) { // Ottieni le tabelle millesimali per associare le voci $tabelle = TabellaMillesimale::where('gestione_id', $gestione_id)->get()->keyBy('codice'); $voci = [ // TAB.A - Spese generali ['tabella' => 'TAB.A', 'codice_voce' => 'A00', 'descrizione' => 'GESTIONE FISCALE'], ['tabella' => 'TAB.A', 'codice_voce' => 'A01', 'descrizione' => 'Assicurazione fabbricato'], ['tabella' => 'TAB.A', 'codice_voce' => 'A02', 'descrizione' => 'Tassa occ. spazi Via vai (COSAP)'], ['tabella' => 'TAB.A', 'codice_voce' => 'A03', 'descrizione' => 'Quota associativa Prop.Edilizia (ARPE)'], ['tabella' => 'TAB.A', 'codice_voce' => 'A04', 'descrizione' => 'Fondo spese acqua'], ['tabella' => 'TAB.A', 'codice_voce' => 'A05', 'descrizione' => 'Manutenzione ordinaria e Lampade'], ['tabella' => 'TAB.A', 'codice_voce' => 'A06', 'descrizione' => 'DISINFESTAZIONI E DERATTIZZAZIONE'], ['tabella' => 'TAB.A', 'codice_voce' => 'A07', 'descrizione' => 'Fotocopie, cancelleria e telefono'], ['tabella' => 'TAB.A', 'codice_voce' => 'A08', 'descrizione' => 'Spese Postali generali'], ['tabella' => 'TAB.A', 'codice_voce' => 'A09', 'descrizione' => 'Riparazioni / lavori'], ['tabella' => 'TAB.A', 'codice_voce' => 'A10', 'descrizione' => 'Spese e bollo su CCP'], ['tabella' => 'TAB.A', 'codice_voce' => 'A11', 'descrizione' => 'Tasse condominiali (TOSAP, ETC)'], ['tabella' => 'TAB.A', 'codice_voce' => 'A12', 'descrizione' => 'Ritenuta d\'acconto anni precedenti'], ['tabella' => 'TAB.A', 'codice_voce' => 'A13', 'descrizione' => 'Compenso amministratore'], ['tabella' => 'TAB.A', 'codice_voce' => 'A14', 'descrizione' => 'Tasse e Imposte su compensi'], ['tabella' => 'TAB.A', 'codice_voce' => 'A15', 'descrizione' => 'Materiale di pulizia'], ['tabella' => 'TAB.A', 'codice_voce' => 'A16', 'descrizione' => 'Postali Condominiali'], ['tabella' => 'TAB.A', 'codice_voce' => 'A17', 'descrizione' => 'IMU LOCALI CONDOMINIALI'], ['tabella' => 'TAB.A', 'codice_voce' => 'A18', 'descrizione' => 'SPESE CONDOMINIALI LOCALI'], // Continua con le altre voci... // TAB.A5 - Portiere ['tabella' => 'TAB.A5', 'codice_voce' => 'P01', 'descrizione' => 'Salario, 13 mensilita\' e ferie'], ['tabella' => 'TAB.A5', 'codice_voce' => 'P02', 'descrizione' => 'Assicurazione TFR (Sig.Giorgi)'], ['tabella' => 'TAB.A5', 'codice_voce' => 'P03', 'descrizione' => 'Contributi sociali INPS/INAIL'], // RISC. - Riscaldamento ['tabella' => 'RISC.', 'codice_voce' => 'RS1', 'descrizione' => 'Consumo GAS Anno Corrente'], ['tabella' => 'RISC.', 'codice_voce' => 'RS2', 'descrizione' => 'ACEA- Energia elettrica'], ['tabella' => 'RISC.', 'codice_voce' => 'RS3', 'descrizione' => 'Conduzione impianto'], // RENDIT - Rendite ['tabella' => 'RENDIT', 'codice_voce' => 'R01', 'descrizione' => 'Fitto locale condominiale'], ['tabella' => 'RENDIT', 'codice_voce' => 'R02', 'descrizione' => 'Contributo sosta auto Spazio sette'], ]; foreach ($voci as $voce_data) { if (isset($tabelle[$voce_data['tabella']])) { VoceSpesaMillesimale::updateOrCreate([ 'tabella_millesimale_id' => $tabelle[$voce_data['tabella']]->id, 'codice_voce' => $voce_data['codice_voce'] ], [ 'descrizione' => $voce_data['descrizione'], 'attiva' => true ]); } } } private function creaUnitaImmobiliari($stabile_id) { // Le unità dovrebbero esistere già, verifico $count = UnitaImmobiliare::whereHas('palazzina', function ($q) use ($stabile_id) { $q->where('stabile_id', $stabile_id); })->count(); $this->command->info("📋 Trovate {$count} unità immobiliari per lo stabile {$stabile_id}"); } private function inserisciMillesimi($gestione_id) { // Ottieni la gestione per prendere lo stabile_id $gestione = GestioneCondominiale::find($gestione_id); // Ottieni le tabelle millesimali dello stesso stabile $tabelle = TabellaMillesimale::where('stabile_id', $gestione->stabile_id)->get()->keyBy('codice_tabella'); // Dati millesimi dal tuo esempio (solo alcuni per test) $millesimi_data = [ // Scala A ['scala' => 'A', 'interno' => '1', 'nome' => 'PAOLETTI CORRADO', 'TAB.A' => 7.62, 'TAB.A1' => 39.99, 'TAB.A4' => 7.49, 'TAB.A5' => 7.80, 'TAB.B1' => 21.96, 'TAB.C1' => 16.00, 'RISC.' => 7.62, 'RENDIT' => 16.00], ['scala' => 'A', 'interno' => '2', 'nome' => 'CAPONI ALESSIA', 'TAB.A' => 12.17, 'TAB.A1' => 63.90, 'TAB.A4' => 11.98, 'TAB.A5' => 12.49, 'TAB.B1' => 35.09, 'TAB.C1' => 25.56, 'RISC.' => 11.436, 'RENDIT' => 12.17, 'RI.ASS' => 25.56], ['scala' => 'A', 'interno' => '3', 'nome' => 'MAZZITELLI MARIA LAURA', 'TAB.A' => 16.64, 'TAB.A1' => 87.34, 'TAB.A4' => 16.37, 'TAB.A5' => 17.05, 'TAB.B1' => 59.24, 'TAB.C1' => 51.32, 'RISC.' => 19.851, 'RENDIT' => 16.64, 'RI.ASS' => 51.32], // Scala B - alcuni esempi ['scala' => 'B', 'interno' => '1', 'nome' => 'SOC SAVEL', 'TAB.A' => 16.24, 'TAB.A2' => 38.24, 'TAB.A4' => 15.97, 'TAB.A5' => 16.63, 'TAB.B2' => 20.93, 'TAB.C2' => 15.30, 'RISC.' => 21.236, 'RENDIT' => 16.24, 'RI.ASS' => 15.30], ['scala' => 'B', 'interno' => '2', 'nome' => 'CANTONI GIOVANNA', 'TAB.A' => 21.60, 'TAB.A2' => 50.88, 'TAB.A4' => 21.25, 'TAB.A5' => 22.13, 'TAB.B2' => 27.86, 'TAB.C2' => 20.35, 'RISC.' => 30.738, 'RENDIT' => 21.60, 'RI.ASS' => 20.35], // Scala C - alcuni esempi ['scala' => 'C', 'interno' => '1', 'nome' => 'ERRIGO ANTONIO', 'TAB.A' => 24.66, 'TAB.A3' => 76.30, 'TAB.A4' => 24.26, 'TAB.A5' => 25.27, 'TAB.B3' => 42.95, 'TAB.C3' => 29.306, 'RENDIT' => 24.66], ['scala' => 'C', 'interno' => '2', 'nome' => 'ROBILOTTA DONATO ROSARI', 'TAB.A' => 27.07, 'TAB.A3' => 83.76, 'TAB.A4' => 26.63, 'TAB.A5' => 27.74, 'TAB.B3' => 50.28, 'TAB.C3' => 36.27, 'RISC.' => 27.531, 'RENDIT' => 27.07, 'RI.ASS' => 36.27], ]; foreach ($millesimi_data as $unita_data) { // Trova l'unità immobiliare con criteri più flessibili $unita = UnitaImmobiliare::where('stabile_id', $gestione->stabile_id) ->where('scala', $unita_data['scala']) ->where('interno', $unita_data['interno']) ->first(); // Se non trova per interno, prova con pattern più flessibile if (!$unita) { $unita = UnitaImmobiliare::where('stabile_id', $gestione->stabile_id) ->where(function ($q) use ($unita_data) { $q->where('scala', $unita_data['scala']) ->orWhere('palazzina', $unita_data['scala']); }) ->where(function ($q) use ($unita_data) { $q->where('interno', $unita_data['interno']) ->orWhere('interno', 'LIKE', '%' . $unita_data['interno'] . '%'); }) ->first(); } if ($unita) { $this->command->info("📍 Inserisco millesimi per {$unita_data['nome']} - Scala: {$unita_data['scala']}, Interno: {$unita_data['interno']} (ID: {$unita->id})"); // Inserisci i millesimi per ogni tabella foreach ($unita_data as $key => $valore) { if (in_array($key, ['scala', 'interno', 'nome'])) continue; if (isset($tabelle[$key]) && $valore > 0) { \App\Models\DettaglioMillesimi::updateOrCreate([ 'unita_immobiliare_id' => $unita->id, 'tabella_millesimale_id' => $tabelle[$key]->id ], [ 'millesimi' => $valore, 'partecipa' => true ]); $this->command->info(" ✅ {$key}: {$valore} millesimi"); } } } else { $this->command->error("❌ Non trovata unità per {$unita_data['nome']} - Scala: {$unita_data['scala']}, Interno: {$unita_data['interno']}"); } } } }