netgescon-day0/database/seeders/TabelleMillesimaliCompleteSeeder.php

276 lines
17 KiB
PHP
Executable File

<?php
namespace Database\Seeders;
use Illuminate\Database\Seeder;
use App\Models\GestioneCondominiale;
use App\Models\TabellaMillesimale;
use App\Models\VoceSpesaMillesimale;
use App\Models\UnitaImmobiliare;
use App\Models\DettaglioMillesimi;
use Carbon\Carbon;
class TabelleMillesimaliCompleteSeeder extends Seeder
{
public function run()
{
// Prendi il primo stabile per il test
$stabile_id = 1;
$this->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']}");
}
}
}
}