netgescon-master/docs/07-SISTEMA-CONTABILE-CONDOMINIALE.md
Michele Windows e68ee85a18 🚀 CHECKPOINT STABILE - Sistema Contabile Avanzato
📋 AGGIUNTE PRINCIPALI:
- Sistema contabile partita doppia con gestioni multiple
- Documentazione implementazione completa
- Models Laravel: GestioneContabile, MovimentoPartitaDoppia
- Controller ContabilitaAvanzataController
- Migration sistema contabile completo
- Scripts automazione e trasferimento
- Manuali utente e checklist implementazione

📊 FILES PRINCIPALI:
- docs/10-IMPLEMENTAZIONE-CONTABILITA-PARTITA-DOPPIA-GESTIONI.md
- SPECIFICHE-SISTEMA-CONTABILE-COMPLETO.md
- netgescon-laravel/database/migrations/2025_07_20_100000_create_complete_accounting_system.php
- netgescon-laravel/app/Models/GestioneContabile.php

 CHECKPOINT SICURO PER ROLLBACK
2025-07-26 15:11:19 +02:00

513 lines
20 KiB
Markdown
Raw Permalink Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 💰 SISTEMA CONTABILE CONDOMINIALE NETGESCON - PARTITA DOPPIA
## 📋 **OVERVIEW**
Sistema contabile in partita doppia specifico per amministrazione condominiale, con gestioni (esercizi) amministrative che non seguono l'anno solare ma le decisioni assembleari.
---
## 🎯 **PRINCIPI CONTABILI CONDOMINIALI**
### 📅 **Gestioni vs Anni Solari**
- **GESTIONE** = Esercizio contabile condominiale
- Inizio: Delibera assemblea (es: 01/01/2024)
- Fine: Approvazione bilancio assemblea successiva (es: 30/04/2025)
- Movimenti post-31/12 possono appartenere alla gestione precedente
- Chiusura solo con approvazione formale bilancio
### 💎 **Partita Doppia Condominiale**
```
📊 DARE = AVERE (sempre bilanciato per gestione)
ESEMPIO Pagamento Fattura:
DARE: Conto Spesa (es: Pulizie Scale) €1.000
AVERE: Conto Banca €1.000
ESEMPIO Incasso Rata:
DARE: Conto Banca €5.000
AVERE: Conto Ricavi (Rate Condominiali) €5.000
```
### 🏢 **Struttura Contabile Gerarchica**
```
🏛️ MASTRO (Categoria principale)
├── 📂 CONTO (Sottocategoria)
│ ├── 📄 SOTTOCONTO (Voce specifica)
│ ├── 📄 SOTTOCONTO
│ └── 📄 SOTTOCONTO
└── 📂 CONTO
```
---
## 🗃️ **SCHEMA DATABASE COMPLETO**
### 1⃣ **Tabella: `gestioni_contabili`**
```sql
CREATE TABLE gestioni_contabili (
id BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
condominio_id BIGINT UNSIGNED NOT NULL,
-- 📅 PERIODO GESTIONE
denominazione VARCHAR(255) NOT NULL, -- "Gestione 2024", "Esercizio 2023-2024"
data_inizio DATE NOT NULL, -- Inizio gestione (delibera assemblea)
data_fine_prevista DATE NOT NULL, -- Fine prevista (solitamente 31/12)
data_chiusura_effettiva DATE NULL, -- Chiusura reale (approvazione bilancio)
-- 📊 STATO GESTIONE
stato ENUM('aperta','chiusa_provvisoria','chiusa_definitiva') DEFAULT 'aperta',
-- 🏛️ ASSEMBLEA APPROVAZIONE
data_assemblea_approvazione DATE NULL,
verbale_approvazione VARCHAR(255),
-- 💰 TOTALI GESTIONE (calcolati automaticamente)
totale_entrate DECIMAL(12,4) DEFAULT 0,
totale_uscite DECIMAL(12,4) DEFAULT 0,
saldo_gestione DECIMAL(12,4) DEFAULT 0,
-- 📋 NOTE E AUDIT
note_gestione TEXT,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
created_by BIGINT UNSIGNED,
FOREIGN KEY (condominio_id) REFERENCES stabili(id) ON DELETE CASCADE,
FOREIGN KEY (created_by) REFERENCES users(id) ON DELETE SET NULL,
INDEX idx_condominio_periodo (condominio_id, data_inizio, data_fine_prevista),
INDEX idx_stato (stato),
INDEX idx_data_chiusura (data_chiusura_effettiva)
) ENGINE=InnoDB COMMENT='Gestioni contabili condominiali (esercizi amministrativi)';
```
### 2⃣ **Tabella: `piano_conti_mastri`**
```sql
CREATE TABLE piano_conti_mastri (
id BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
-- 📊 IDENTIFICAZIONE MASTRO
codice_mastro VARCHAR(10) NOT NULL, -- "100", "200", "300"
denominazione VARCHAR(255) NOT NULL, -- "ENTRATE", "SPESE AMMINISTRATIVE"
tipo_mastro ENUM('ATTIVO','PASSIVO','COSTI','RICAVI') NOT NULL,
-- 🎨 VISUALIZZAZIONE
colore_hex VARCHAR(7) DEFAULT '#6c757d', -- Per dashboard e report
icona VARCHAR(50) DEFAULT 'fas fa-folder', -- FontAwesome icon
ordine_visualizzazione SMALLINT DEFAULT 0,
-- 📋 CONFIGURAZIONE
descrizione TEXT,
attivo BOOLEAN DEFAULT TRUE,
-- 📅 AUDIT
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
UNIQUE KEY uk_codice_mastro (codice_mastro),
INDEX idx_tipo_ordine (tipo_mastro, ordine_visualizzazione),
INDEX idx_attivo (attivo)
) ENGINE=InnoDB COMMENT='Mastri del piano dei conti condominiale';
```
### 3⃣ **Tabella: `piano_conti_conti`**
```sql
CREATE TABLE piano_conti_conti (
id BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
mastro_id BIGINT UNSIGNED NOT NULL,
-- 📂 IDENTIFICAZIONE CONTO
codice_conto VARCHAR(15) NOT NULL, -- "101", "201.1", "301.A"
denominazione VARCHAR(255) NOT NULL, -- "Rate Condominiali", "Pulizie Scale"
-- 🎯 CONFIGURAZIONE CONTABILE
tipo_saldo ENUM('DARE','AVERE') NOT NULL, -- Natura del saldo
ripartizione_automatica BOOLEAN DEFAULT TRUE, -- Se ripartire automaticamente
tabella_millesimale_default VARCHAR(50), -- "GENERALE", "ASCENSORE", etc
-- 🎨 VISUALIZZAZIONE
colore_hex VARCHAR(7), -- Eredita da mastro se NULL
icona VARCHAR(50), -- FontAwesome icon specifica
ordine_visualizzazione SMALLINT DEFAULT 0,
-- 📋 CONFIGURAZIONE
descrizione TEXT,
attivo BOOLEAN DEFAULT TRUE,
-- 📅 AUDIT
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
FOREIGN KEY (mastro_id) REFERENCES piano_conti_mastri(id) ON DELETE CASCADE,
UNIQUE KEY uk_codice_conto (codice_conto),
INDEX idx_mastro_ordine (mastro_id, ordine_visualizzazione),
INDEX idx_ripartizione (ripartizione_automatica),
INDEX idx_attivo (attivo)
) ENGINE=InnoDB COMMENT='Conti del piano dei conti condominiale';
```
### 4⃣ **Tabella: `piano_conti_sottoconti`**
```sql
CREATE TABLE piano_conti_sottoconti (
id BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
conto_id BIGINT UNSIGNED NOT NULL,
-- 📄 IDENTIFICAZIONE SOTTOCONTO
codice_sottoconto VARCHAR(20) NOT NULL, -- "101.01", "201.1.A", "301.ASC.A"
denominazione VARCHAR(255) NOT NULL, -- "Rate Ordinarie", "Pulizia Scale A"
-- 🎯 CONFIGURAZIONE SPECIFICA
ripartizione_specifica VARCHAR(100), -- "SOLO_SCALA_A", "PIANO_1_3", etc
percentuale_ripartizione DECIMAL(5,2), -- Se ripartizione fissa %
importo_fisso DECIMAL(10,2), -- Se importo fisso per unità
-- 📊 NATURA CONTABILE
tipo_saldo ENUM('DARE','AVERE'), -- Eredita da conto se NULL
deducibile_fiscale BOOLEAN DEFAULT FALSE, -- Se deducibile per dichiarazioni
-- 🎨 VISUALIZZAZIONE
ordine_visualizzazione SMALLINT DEFAULT 0,
-- 📋 CONFIGURAZIONE
descrizione TEXT,
attivo BOOLEAN DEFAULT TRUE,
-- 📅 AUDIT
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
FOREIGN KEY (conto_id) REFERENCES piano_conti_conti(id) ON DELETE CASCADE,
UNIQUE KEY uk_codice_sottoconto (codice_sottoconto),
INDEX idx_conto_ordine (conto_id, ordine_visualizzazione),
INDEX idx_ripartizione (ripartizione_specifica),
INDEX idx_attivo (attivo)
) ENGINE=InnoDB COMMENT='Sottoconti specifici del piano dei conti';
```
### 5⃣ **Tabella: `registrazioni_contabili`** ⭐ CUORE DEL SISTEMA
```sql
CREATE TABLE registrazioni_contabili (
id BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
-- 🎯 COLLEGAMENTO GESTIONE (FONDAMENTALE!)
gestione_id BIGINT UNSIGNED NOT NULL,
condominio_id BIGINT UNSIGNED NOT NULL,
-- 📅 DATE MOVIMENTO
data_operazione DATE NOT NULL, -- Data effettiva operazione
data_registrazione DATE NOT NULL, -- Data inserimento contabile
data_competenza DATE NOT NULL, -- Data competenza contabile
data_valuta DATE, -- Data valuta bancaria
-- 📋 IDENTIFICAZIONE MOVIMENTO
numero_registrazione VARCHAR(20) NOT NULL, -- Numerazione progressiva per gestione
causale VARCHAR(500) NOT NULL, -- Descrizione movimento
riferimento_documento VARCHAR(255), -- Numero fattura, ricevuta, etc
-- 💰 IMPORTO TOTALE
importo_totale DECIMAL(12,4) NOT NULL, -- Importo complessivo movimento
-- 🎯 CLASSIFICAZIONE
tipo_movimento ENUM('ENTRATA','USCITA','GIROCONTO') NOT NULL,
categoria_movimento VARCHAR(100), -- "FORNITURA", "RATA", "MANUTENZIONE"
sottocategoria VARCHAR(100), -- Classificazione aggiuntiva
-- 🏦 DATI BANCARI
conto_corrente VARCHAR(50), -- Conto utilizzato
numero_assegno VARCHAR(20), -- Se pagamento con assegno
cro_bonifico VARCHAR(50), -- CRO/TRN bonifico
-- 👥 SOGGETTI COINVOLTI
fornitore_id BIGINT UNSIGNED, -- Collegamento anagrafica fornitori
cliente_id BIGINT UNSIGNED, -- Collegamento anagrafica (per entrate)
-- ⚙️ STATO E CONTROLLI
stato ENUM('bozza','confermata','ripartita','chiusa') DEFAULT 'bozza',
ripartita BOOLEAN DEFAULT FALSE, -- Se già ripartita ai condomini
riconciliata BOOLEAN DEFAULT FALSE, -- Se riconciliata con estratto conto
-- 🔄 RIPARTIZIONE AUTOMATICA
ripartizione_automatica BOOLEAN DEFAULT TRUE,
tabella_millesimale_usata VARCHAR(50), -- Quale tabella millesimale usata
-- 📎 ALLEGATI E NOTE
numero_allegati SMALLINT DEFAULT 0,
note_interne TEXT, -- Note riservate amministratore
note_pubbliche TEXT, -- Note visibili ai condomini
-- 📅 AUDIT COMPLETO
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
created_by BIGINT UNSIGNED NOT NULL,
updated_by BIGINT UNSIGNED,
-- 🔗 FOREIGN KEYS
FOREIGN KEY (gestione_id) REFERENCES gestioni_contabili(id) ON DELETE RESTRICT,
FOREIGN KEY (condominio_id) REFERENCES stabili(id) ON DELETE CASCADE,
FOREIGN KEY (fornitore_id) REFERENCES persone(id) ON DELETE SET NULL,
FOREIGN KEY (cliente_id) REFERENCES persone(id) ON DELETE SET NULL,
FOREIGN KEY (created_by) REFERENCES users(id) ON DELETE RESTRICT,
-- 📊 INDICI OTTIMIZZAZIONE
INDEX idx_gestione_data (gestione_id, data_operazione),
INDEX idx_condominio_gestione (condominio_id, gestione_id),
INDEX idx_numero_gestione (gestione_id, numero_registrazione),
INDEX idx_tipo_categoria (tipo_movimento, categoria_movimento),
INDEX idx_stato_ripartita (stato, ripartita),
INDEX idx_data_competenza (data_competenza),
INDEX idx_fornitore (fornitore_id),
INDEX idx_importo (importo_totale),
-- ✅ CONSTRAINTS
UNIQUE KEY uk_numero_per_gestione (gestione_id, numero_registrazione),
CONSTRAINT chk_importo_positivo CHECK (importo_totale > 0)
) ENGINE=InnoDB COMMENT='Registrazioni contabili in partita doppia per gestione';
```
### 6⃣ **Tabella: `movimenti_contabili`** (DARE/AVERE)
```sql
CREATE TABLE movimenti_contabili (
id BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
registrazione_id BIGINT UNSIGNED NOT NULL,
-- 📊 PARTITA DOPPIA
sottoconto_id BIGINT UNSIGNED NOT NULL, -- A quale sottoconto imputare
-- 💰 IMPORTI DARE/AVERE
importo_dare DECIMAL(12,4) DEFAULT 0, -- Importo in DARE
importo_avere DECIMAL(12,4) DEFAULT 0, -- Importo in AVERE
-- 📋 DETTAGLI MOVIMENTO
descrizione VARCHAR(500), -- Descrizione specifica riga
quantita DECIMAL(10,3), -- Quantità se applicabile
prezzo_unitario DECIMAL(10,4), -- Prezzo unitario se applicabile
-- 🎯 RIPARTIZIONE
da_ripartire BOOLEAN DEFAULT TRUE, -- Se questa riga va ripartita
tabella_millesimale VARCHAR(50), -- Tabella per questa riga specifica
-- 📅 AUDIT
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
-- 🔗 FOREIGN KEYS
FOREIGN KEY (registrazione_id) REFERENCES registrazioni_contabili(id) ON DELETE CASCADE,
FOREIGN KEY (sottoconto_id) REFERENCES piano_conti_sottoconti(id) ON DELETE RESTRICT,
-- 📊 INDICI
INDEX idx_registrazione (registrazione_id),
INDEX idx_sottoconto (sottoconto_id),
INDEX idx_ripartizione (da_ripartire),
-- ✅ CONSTRAINTS PARTITA DOPPIA
CONSTRAINT chk_dare_or_avere CHECK (
(importo_dare > 0 AND importo_avere = 0) OR
(importo_dare = 0 AND importo_avere > 0)
)
) ENGINE=InnoDB COMMENT='Movimenti dare/avere della partita doppia';
```
### 7⃣ **Tabella: `ripartizioni_condomini`** (RISULTATO FINALE)
```sql
CREATE TABLE ripartizioni_condomini (
id BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
registrazione_id BIGINT UNSIGNED NOT NULL,
movimento_id BIGINT UNSIGNED NOT NULL,
unita_immobiliare_id BIGINT UNSIGNED NOT NULL,
-- 💰 IMPORTO RIPARTITO
importo_ripartito DECIMAL(12,4) NOT NULL, -- Quanto spetta a questa unità
-- 📊 CALCOLO RIPARTIZIONE
millesimi_utilizzati DECIMAL(8,4) NOT NULL, -- Millesimi usati per calcolo
tabella_millesimale VARCHAR(50) NOT NULL, -- Quale tabella usata
-- 👥 IMPUTAZIONE
persona_id BIGINT UNSIGNED, -- A chi imputare (proprietario)
tipo_imputazione ENUM('proprietario','inquilino','delegato') DEFAULT 'proprietario',
-- 📅 PERIODO
data_competenza_inizio DATE,
data_competenza_fine DATE,
-- ⚙️ STATO
stato ENUM('calcolata','confermata','fatturata','pagata') DEFAULT 'calcolata',
-- 📅 AUDIT
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
-- 🔗 FOREIGN KEYS
FOREIGN KEY (registrazione_id) REFERENCES registrazioni_contabili(id) ON DELETE CASCADE,
FOREIGN KEY (movimento_id) REFERENCES movimenti_contabili(id) ON DELETE CASCADE,
FOREIGN KEY (unita_immobiliare_id) REFERENCES unita_immobiliari(id) ON DELETE CASCADE,
FOREIGN KEY (persona_id) REFERENCES persone(id) ON DELETE SET NULL,
-- 📊 INDICI
INDEX idx_registrazione (registrazione_id),
INDEX idx_unita (unita_immobiliare_id),
INDEX idx_persona_stato (persona_id, stato),
INDEX idx_data_competenza (data_competenza_inizio, data_competenza_fine),
-- ✅ CONSTRAINTS
CONSTRAINT chk_importo_ripartito_positivo CHECK (importo_ripartito > 0),
CONSTRAINT chk_millesimi_valid CHECK (millesimi_utilizzati > 0 AND millesimi_utilizzati <= 1000)
) ENGINE=InnoDB COMMENT='Ripartizione finale per singola unità immobiliare';
```
---
## 🎯 **PIANO CONTI STANDARD CONDOMINIALE**
### 📊 **Schema MASTRO → CONTO → SOTTOCONTO**
```
🏛️ 100 - ENTRATE
├── 📂 101 - Rate Condominiali
│ ├── 📄 101.01 - Rate Ordinarie
│ ├── 📄 101.02 - Rate Straordinarie
│ ├── 📄 101.03 - Interessi di Mora
│ └── 📄 101.04 - Rate Anni Precedenti
├── 📂 102 - Altri Ricavi
│ ├── 📄 102.01 - Affitti Spazi Comuni
│ ├── 📄 102.02 - Rimborsi Assicurazioni
│ └── 📄 102.03 - Interessi Attivi Bancari
└── 📂 103 - Fondi e Accantonamenti
├── 📄 103.01 - Fondo di Riserva
└── 📄 103.02 - Fondi Specifici
🏛️ 200 - SPESE AMMINISTRATIVE
├── 📂 201 - Pulizie
│ ├── 📄 201.01 - Pulizie Scale Scala A
│ ├── 📄 201.02 - Pulizie Scale Scala B
│ └── 📄 201.03 - Materiali Pulizia
├── 📂 202 - Energia Elettrica
│ ├── 📄 202.01 - Illuminazione Scale
│ └── 📄 202.02 - Forza Motrice Ascensori
└── 📂 203 - Amministrazione
├── 📄 203.01 - Compenso Amministratore
└── 📄 203.02 - Spese Postali e Bancarie
🏛️ 300 - MANUTENZIONI
├── 📂 301 - Ascensori
│ ├── 📄 301.01 - Manutenzione Ordinaria Asc. A
│ ├── 📄 301.02 - Manutenzione Ordinaria Asc. B
│ └── 📄 301.03 - Riparazioni Straordinarie
└── 📂 302 - Impianti
├── 📄 302.01 - Manutenzione Autoclave
└── 📄 302.02 - Manutenzione Citofoni
🏛️ 400 - FONDI E RISERVE
├── 📂 401 - Liquidità
│ ├── 📄 401.01 - C/C Banco BPM
│ └── 📄 401.02 - Cassa Contante
└── 📂 402 - Crediti/Debiti
├── 📄 402.01 - Crediti vs Condomini
└── 📄 402.02 - Debiti vs Fornitori
```
---
## ⚙️ **WORKFLOW REGISTRAZIONE CONTABILE**
### 1⃣ **Inserimento Registrazione**
```php
// Esempio: Pagamento fattura pulizie €1.000 + IVA €220
$registrazione = new RegistrazioneContabile([
'gestione_id' => $gestioneAttiva->id,
'data_operazione' => '2024-03-15',
'causale' => 'Pagamento fattura pulizie marzo 2024',
'importo_totale' => 1220.00,
'tipo_movimento' => 'USCITA'
]);
// Movimenti in partita doppia
$movimenti = [
// DARE: Spesa pulizie
[
'sottoconto_id' => $sottocontoPulizieScalaA->id,
'importo_dare' => 1000.00,
'descrizione' => 'Pulizie scala A marzo 2024'
],
// DARE: IVA
[
'sottoconto_id' => $sottocontoIVA->id,
'importo_dare' => 220.00,
'descrizione' => 'IVA 22% su pulizie'
],
// AVERE: Uscita banca
[
'sottoconto_id' => $sottocontoBanca->id,
'importo_avere' => 1220.00,
'descrizione' => 'Pagamento bonifico'
]
];
```
### 2⃣ **Ripartizione Automatica**
```php
// Sistema calcola ripartizione per ogni unità
foreach ($condominio->unitaImmobiliari as $unita) {
$importoRipartito = ($movimento->importo_dare * $unita->millesimi_generali) / 1000;
RipartizioneCondomino::create([
'registrazione_id' => $registrazione->id,
'unita_immobiliare_id' => $unita->id,
'importo_ripartito' => $importoRipartito,
'millesimi_utilizzati' => $unita->millesimi_generali,
'tabella_millesimale' => 'GENERALE'
]);
}
```
### 3⃣ **Controlli Partita Doppia**
```php
// Verifica quadratura DARE = AVERE
$totaleDare = $registrazione->movimenti()->sum('importo_dare');
$totaleAvere = $registrazione->movimenti()->sum('importo_avere');
if ($totaleDare != $totaleAvere) {
throw new Exception("Partita doppia non bilanciata: DARE €{$totaleDare} ≠ AVERE €{$totaleAvere}");
}
```
---
## 📋 **ISTRUZIONI PER COPILOT**
```
💰 IMPLEMENTAZIONE SISTEMA CONTABILE CONDOMINIALE
MANUALI DA CONSULTARE:
1. /home/michele/netgescon/docs/02-architettura-laravel/09-sistema-contabile/SISTEMA-CONTABILE-PARTITA-DOPPIA.md
2. /home/michele/netgescon/docs/04-DATABASE-STRUTTURE.md
3. /home/michele/netgescon/docs/02-architettura-laravel/03-anagrafica-condomini/ANALISI-ANAGRAFICA.md
PRINCIPI FONDAMENTALI:
1. 📅 GESTIONE = ESERCIZIO CONTABILE (non anno solare)
2. 💰 PARTITA DOPPIA: ogni movimento ha DARE = AVERE
3. 🏗️ STRUTTURA: MASTRO → CONTO → SOTTOCONTO
4. 🔍 CAMPO GESTIONE: ogni registrazione legata a gestione_id
5. 📊 RIPARTIZIONE: automatica per millesimi alle unità
SCHEMA DATABASE:
- gestioni_contabili (esercizi amministrativi)
- piano_conti_mastri (categorie principali)
- piano_conti_conti (sottocategorie)
- piano_conti_sottoconti (voci specifiche)
- registrazioni_contabili (movimenti con gestione_id)
- movimenti_contabili (dare/avere)
- ripartizioni_condomini (risultato finale per unità)
WORKFLOW:
1. Crea gestione contabile
2. Inserisci registrazione con gestione_id
3. Crea movimenti dare/avere bilanciati
4. Sistema calcola ripartizione automatica
5. Genera prospetti per condomini
OBIETTIVO: Zero perdite economiche, controllo totale centesimi, gestioni amministrative reali.
```
Questo sistema garantirà il **controllo totale** di ogni centesimo nelle gestioni condominiali! 💎✨