236 lines
9.5 KiB
Plaintext
Executable File
236 lines
9.5 KiB
Plaintext
Executable File
ora cominciamo a fare sul serio ci sono delle cose da ritoccare menù e altri collegamenti che non funzionano ma finiamo la parte degli archivi e poi procedo con il debug specifico
|
||
questa è un parte essenziale degli archivi dove tutte le anagrafiche finiscono questa è la parte dove andiamo a gestire tutti i nominativi che andremo a gestire e che poi saranno tutti collegati con le loro funzioni o con la loro appartenenza nella struttura generale di Netgescon procediamo a creare anche questa struttura e poi andiamo con le grosse modifiche a gestire la contabilità del sin golo stabile e dell'amministratore
|
||
|
||
ti ricordo le credenziali per accedere a MySQL onde evitare di farti diventare matto con giri strani per trovare i dati che ti servono.
|
||
USER: netgescon_user
|
||
PW: NetGescon2024!
|
||
|
||
## 📚 **SISTEMA ANAGRAFICA UNICA NETGESCON**
|
||
|
||
### 🎯 **Concetto Chiave: Rubrica Centralizzata**
|
||
|
||
Hai progettato un sistema innovativo con:
|
||
- **👤 Una persona = Un record anagrafico**
|
||
- **🔑 Codice univoco 8 caratteri alfanumerici** per identificazione
|
||
- **🏢 Rubrica dello studio unificata** per tutti i condomini
|
||
- **🔗 Relazioni multiple** per collegare persone a unità immobiliari
|
||
|
||
## 🏗️ **Struttura Database Completa**
|
||
|
||
### 📊 **Tabella Principale: `persone`**
|
||
```sql
|
||
CREATE TABLE persone (
|
||
id BIGINT PRIMARY KEY AUTO_INCREMENT,
|
||
codice_interno VARCHAR(8) UNIQUE NOT NULL, -- 🔑 CODICE UNIVOCO 8 CARATTERI
|
||
tipologia ENUM('fisica','giuridica','ditta_individuale') NOT NULL,
|
||
|
||
-- 📋 DATI ANAGRAFICI BASE
|
||
cognome VARCHAR(100) NOT NULL,
|
||
nome VARCHAR(100) NOT NULL,
|
||
codice_fiscale VARCHAR(16) UNIQUE, -- Univoco ma nullable per stranieri
|
||
partita_iva VARCHAR(11),
|
||
data_nascita DATE,
|
||
luogo_nascita_comune_id INT,
|
||
|
||
-- 📍 RESIDENZA
|
||
residenza_via VARCHAR(255),
|
||
residenza_comune_id INT,
|
||
|
||
-- 📞 CONTATTI GERARCHICI
|
||
telefono_principale VARCHAR(20) UNIQUE, -- 🔑 UNIVOCO per identificazione utilizza il cellulare per il telefono fisso potrebbe essere un centralino
|
||
telefono_secondario VARCHAR(20),
|
||
email_principale VARCHAR(255), -- prevedi la possibilità di agganciare più email allo stesso soggetto una preferenziale ma avere la possibilità di più email a disposizione
|
||
email_pec VARCHAR(255), -- anche di questa ma di solito potebbero essere poche
|
||
whatsapp VARCHAR(20),
|
||
|
||
-- ⚙️ PREFERENZE COMUNICAZIONE
|
||
modalita_comunicazione_preferita ENUM('email','sms','whatsapp','telefono','posta'),
|
||
lingua_preferita VARCHAR(10) DEFAULT 'it',
|
||
|
||
-- 🔒 PRIVACY E CONSENSI
|
||
consenso_privacy BOOLEAN DEFAULT FALSE,
|
||
consenso_marketing BOOLEAN DEFAULT FALSE,
|
||
data_consenso_privacy TIMESTAMP,
|
||
|
||
-- 🏢 DATI SOCIETÀ (se giuridica)
|
||
ragione_sociale VARCHAR(255),
|
||
forma_giuridica VARCHAR(50),
|
||
codice fiscale e Partita IVA
|
||
|
||
-- 📅 AUDIT
|
||
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
||
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
|
||
);
|
||
```
|
||
|
||
### 🔗 **Tabella Relazioni: `persone_unita_relazioni`**
|
||
```sql
|
||
CREATE TABLE persone_unita_relazioni (
|
||
id BIGINT PRIMARY KEY AUTO_INCREMENT,
|
||
persona_id BIGINT NOT NULL,
|
||
unita_id BIGINT NOT NULL,
|
||
|
||
-- 👥 TIPI DI RELAZIONE -- questi li metterei come una tabella a parte non voglio per forza vincolare con solo poche opzioni ma magari metterle nella gestione del superAdmin che gestige tutte le tabelle che devono fornire dei dati ma che non possono essere modificate dall'amministratore del condominio (vedi comuni, tabelle fiscali, dati per categorie catastali, dati per ritenute d'accotno ecc....
|
||
tipo_relazione ENUM(
|
||
'proprietario',
|
||
'comproprietario',
|
||
'inquilino',
|
||
'usufruttuario',
|
||
'delegato_assemblea',
|
||
'referente',
|
||
'amministratore_sostegno'
|
||
),
|
||
|
||
quota_relazione DECIMAL(5,2), -- % di proprietà
|
||
data_inizio DATE NOT NULL,
|
||
data_fine DATE, -- NULL = relazione attiva
|
||
attivo BOOLEAN DEFAULT TRUE,
|
||
|
||
-- 📢 PREFERENZE COMUNICAZIONE PER QUESTA UNITÀ
|
||
riceve_comunicazioni BOOLEAN DEFAULT TRUE,
|
||
riceve_convocazioni BOOLEAN DEFAULT TRUE,
|
||
vota_assemblea BOOLEAN DEFAULT TRUE
|
||
);
|
||
```
|
||
|
||
## 🔑 **Sistema Codici Univoci 8 Caratteri**
|
||
|
||
### **Generazione Automatica con Trigger**
|
||
```sql
|
||
DELIMITER $$
|
||
CREATE TRIGGER generate_codice_univoco_persone
|
||
BEFORE INSERT ON persone
|
||
FOR EACH ROW
|
||
BEGIN
|
||
DECLARE codice_temp VARCHAR(8);
|
||
DECLARE codice_exists INT DEFAULT 1;
|
||
|
||
IF NEW.codice_interno IS NULL OR NEW.codice_interno = '' THEN
|
||
WHILE codice_exists > 0 DO
|
||
SET codice_temp = CONCAT(
|
||
SUBSTRING('ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789', FLOOR(1 + (RAND() * 36)), 1),
|
||
SUBSTRING('ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789', FLOOR(1 + (RAND() * 36)), 1),
|
||
SUBSTRING('ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789', FLOOR(1 + (RAND() * 36)), 1),
|
||
SUBSTRING('ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789', FLOOR(1 + (RAND() * 36)), 1),
|
||
SUBSTRING('ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789', FLOOR(1 + (RAND() * 36)), 1),
|
||
SUBSTRING('ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789', FLOOR(1 + (RAND() * 36)), 1),
|
||
SUBSTRING('ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789', FLOOR(1 + (RAND() * 36)), 1),
|
||
SUBSTRING('ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789', FLOOR(1 + (RAND() * 36)), 1)
|
||
);
|
||
|
||
SELECT COUNT(*) INTO codice_exists
|
||
FROM persone
|
||
WHERE codice_interno = codice_temp;
|
||
END WHILE;
|
||
|
||
SET NEW.codice_interno = codice_temp;
|
||
END IF;
|
||
END$$
|
||
DELIMITER ;
|
||
```
|
||
|
||
## 🚫 **Sistema Anti-Duplicazione**
|
||
|
||
### **Controlli Automatici**
|
||
```php
|
||
// Funzione controllo duplicati
|
||
function verificaDuplicati($datiPersona) {
|
||
$duplicati = [];
|
||
|
||
// 1️⃣ CONTROLLO CODICE FISCALE (Critico)
|
||
if ($existing = Persona::where('codice_fiscale', $datiPersona['codice_fiscale'])->first()) {
|
||
$duplicati[] = [
|
||
'tipo' => 'CRITICO',
|
||
'campo' => 'Codice Fiscale',
|
||
'persona_esistente' => $existing,
|
||
'azione' => 'BLOCCA_O_MERGE'
|
||
];
|
||
}
|
||
|
||
// 2️⃣ CONTROLLO TELEFONO PRINCIPALE (Critico) ho indicato un telefono genreico ma l'unico telefono che identifica la persona ormai è il suo cellulare
|
||
if ($existing = Persona::where('telefono_principale', $datiPersona['telefono'])->first()) {
|
||
$duplicati[] = [
|
||
'tipo' => 'CRITICO',
|
||
'campo' => 'Telefono Principale',
|
||
'persona_esistente' => $existing,
|
||
'azione' => 'BLOCCA_O_MERGE'
|
||
];
|
||
}
|
||
|
||
// 3️⃣ CONTROLLO EMAIL (Warning) -- anche questo ne abbiamo uno di riferimento ma potremmo avere anche l'indirizzo generico della società tipo info perciò va bene controllare ma non possiamo essere troppo fiscali
|
||
|
||
if ($existing = Persona::where('email_principale', $datiPersona['email'])->first()) { $duplicati[] = [
|
||
'tipo' => 'WARNING',
|
||
'campo' => 'Email Principale',
|
||
'persona_esistente' => $existing,
|
||
'azione' => 'AVVISA'
|
||
];
|
||
}
|
||
|
||
// 4️⃣ CONTROLLO OMONIMIA (Warning)
|
||
if ($existing = Persona::where('cognome', $datiPersona['cognome'])
|
||
->where('nome', $datiPersona['nome'])
|
||
->where('data_nascita', $datiPersona['data_nascita'])
|
||
->first()) {
|
||
$duplicati[] = [
|
||
'tipo' => 'WARNING',
|
||
'campo' => 'Omonimia Completa',
|
||
'persona_esistente' => $existing,
|
||
'azione' => 'VERIFICA_MANUALE'
|
||
];
|
||
}
|
||
|
||
return $duplicati;
|
||
}
|
||
|
||
|
||
📚 IMPLEMENTAZIONE ANAGRAFICA UNICA NETGESCON
|
||
|
||
Consulta il manuale completo in:
|
||
/home/michele/netgescon/docs/02-architettura-laravel/03-anagrafica-condomini/ANALISI-ANAGRAFICA.md
|
||
|
||
SISTEMA PROGETTATO:
|
||
|
||
1. 👤 RUBRICA CENTRALIZZATA:
|
||
- Una persona = Un record anagrafico
|
||
- Codice univoco 8 caratteri alfanumerici automatico
|
||
- Controlli anti-duplicazione su CF e telefono
|
||
- Relazioni multiple con unità immobiliari
|
||
|
||
2. 🏗️ STRUTTURA DATABASE:
|
||
- Tabella `persone` (anagrafica principale)
|
||
- Tabella `persone_unita_relazioni` (collegamenti)
|
||
- Tabella `rappresentanti_legali` (per società)
|
||
- Tabella `conferme_identita` (validazioni)
|
||
|
||
3. 🔑 IDENTIFICATORI UNIVOCI:
|
||
- codice_interno (8 caratteri alfanumerici)
|
||
- codice_fiscale (univoco, nullable per stranieri)
|
||
- telefono_principale (univoco per identificazione)
|
||
|
||
4. 🚫 ANTI-DUPLICAZIONE:
|
||
- Controlli automatici su CF, telefono, email
|
||
- Sistema merge persone duplicate
|
||
- Audit completo modifiche anagrafiche
|
||
|
||
5. 🔗 COLLEGAMENTO UNIVERSALE:
|
||
- Stesso anagrafico collegabile a N unità
|
||
- Ruoli diversi per unità diverse
|
||
- Preferenze comunicazione per relazione
|
||
|
||
OBIETTIVO: Creare rubrica centralizzata studio che elimina duplicazioni e collega persone a tutte le maschere del sistema.
|
||
|
||
IMPLEMENTA seguendo esattamente lo schema nel manuale!
|
||
```
|
||
|
||
## 📋 **Vantaggi del Sistema**
|
||
|
||
1. **🎯 Zero Duplicazioni**: Una persona esiste una sola volta
|
||
2. **🔍 Ricerca Universale**: Trova persona in qualsiasi schermata e posso vedere in quale struttura è presente e spostarmi agevolmente tra le varie schermate
|
||
3. **📞 Comunicazioni Centralizzate**: Contatti aggiornati ovunque
|
||
4. **👥 Relazioni Multiple**: Una persona può essere proprietaria + delegata + referente
|
||
5. **🏢 Rubrica Studio**: Database unico per tutto lo studio
|
||
6. **🔑 Identificazione Rapida**: Codice 8 caratteri per accesso veloce
|
||
|
||
|