# Discovery legacy `histo/` vers `syndic/`

Date d'analyse: 2026-05-23.

Portee: reconnaissance uniquement. Aucun controller, model ou view applicatif n'a ete genere. Les fichiers `histo/` ont ete traites comme reference en lecture seule.

## Source de connexion BDD

La configuration locale lue dans `syndic/.env` pointe vers:

- Driver: `MySQLi`
- Host: `localhost`
- Port: `3306`
- Base: `hyqnmzxtest`
- User: `root`

Le mot de passe existe dans `.env` mais n'est pas reproduit ici.

## Schema BDD

La base contient 20 tables. Seules les cles primaires sont declarees dans MySQL; aucune cle etrangere n'est declaree dans `information_schema.KEY_COLUMN_USAGE`. Les relations ci-dessous sont donc deduites des noms de colonnes et des requetes SQL du legacy.

### Tables et colonnes

#### `articles`

PK: `art_id`

| Colonne | Type | Null | Defaut | Cle | Extra |
| --- | --- | --- | --- | --- | --- |
| `art_id` | `int` | NO |  | PRI | auto_increment |
| `art_nom` | `varchar(200)` | NO |  |  |  |
| `art_desc` | `varchar(5000)` | YES | NULL |  |  |
| `art_prix` | `decimal(9,2)` | NO |  |  |  |
| `art_actif` | `tinyint` | NO | 1 |  |  |
| `art_lieu` | `tinyint` | NO | 0 |  |  |

#### `commandes`

PK: `com_id`

| Colonne | Type | Null | Defaut | Cle | Extra |
| --- | --- | --- | --- | --- | --- |
| `com_id` | `int` | NO |  | PRI | auto_increment |
| `com_art` | `smallint` | NO |  |  |  |
| `com_conf` | `smallint` | NO | 0 |  |  |
| `com_tva` | `smallint` | NO | 21 |  |  |
| `com_num` | `int` | NO | 0 |  |  |
| `com_fact` | `int` | NO |  |  |  |
| `com_rem` | `varchar(250)` | YES | NULL |  |  |
| `com_qtite` | `decimal(9,2)` | NO | 0.00 |  |  |
| `com_prix` | `decimal(9,2)` | NO | 0.00 |  |  |
| `com_termes` | `tinyint` | NO | 0 |  |  |

#### `conformites`

PK: `conf_id`

| Colonne | Type | Null | Defaut | Cle | Extra |
| --- | --- | --- | --- | --- | --- |
| `conf_id` | `int` | NO |  | PRI | auto_increment |
| `conf_nom` | `varchar(200)` | NO |  |  |  |
| `conf_desc` | `varchar(1000)` | YES | NULL |  |  |
| `conf_prix` | `decimal(9,2)` | NO |  |  |  |
| `conf_actif` | `tinyint` | NO | 1 |  |  |

#### `contrats`

PK: `cont_id`

| Colonne | Type | Null | Defaut | Cle | Extra |
| --- | --- | --- | --- | --- | --- |
| `cont_id` | `int` | NO |  | PRI | auto_increment |
| `cont_asc` | `smallint` | NO |  |  |  |
| `cont_date_debut` | `date` | NO | 0000-01-01 |  |  |
| `cont_date_fact` | `date` | NO | 0000-01-01 |  |  |
| `cont_visit` | `tinyint` | NO | 4 |  |  |
| `cont_actif` | `tinyint` | NO | 1 |  |  |
| `cont_montant` | `decimal(9,2)` | NO | 0.00 |  |  |
| `cont_tel` | `varchar(150)` | NO | non renseigne |  |  |
| `cont_mois` | `tinyint` | NO | 12 |  |  |
| `cont_rem` | `varchar(2000)` | YES | NULL |  |  |
| `cont_indexation` | `tinyint` | NO | 1 |  |  |
| `cont_omnium` | `tinyint` | NO | 0 |  |  |
| `cont_tech` | `varchar(50)` | NO | Max |  |  |
| `cont_zoho` | `tinyint` | NO | 0 |  |  |
| `cont_secu` | `varchar(150)` | YES | NULL |  |  |
| `cont_dossier` | `varchar(200)` | YES | NULL |  |  |
| `cont_ref` | `varchar(100)` | YES | NULL |  |  |
| `cont_qr` | `tinyint` | NO | 0 |  |  |
| `cont_code` | `varchar(12)` | NO | 000 |  |  |

#### `docs`

PK: `docs_id`

| Colonne | Type | Null | Defaut | Cle | Extra |
| --- | --- | --- | --- | --- | --- |
| `docs_id` | `int` | NO |  | PRI | auto_increment |
| `docs_asc` | `int` | NO |  |  |  |
| `docs_type` | `tinyint` | NO |  |  |  |
| `dcs_date` | `date` | NO |  |  |  |

#### `exceptions`

PK: `exc_id`

| Colonne | Type | Null | Defaut | Cle | Extra |
| --- | --- | --- | --- | --- | --- |
| `exc_id` | `int` | NO |  | PRI | auto_increment |
| `exc_nom` | `varchar(200)` | NO |  |  |  |
| `exc_actif` | `tinyint` | NO | 1 |  |  |

#### `factures`

PK: `fact_id`

| Colonne | Type | Null | Defaut | Cle | Extra |
| --- | --- | --- | --- | --- | --- |
| `fact_id` | `int` | NO |  | PRI | auto_increment |
| `fact_num` | `int` | NO | 0 |  |  |
| `fact_devis` | `int` | NO | 0 |  |  |
| `fact_credit` | `int` | NO | 0 |  |  |
| `fact_credit_date` | `date` | YES | NULL |  |  |
| `fact_credit_aff` | `tinyint` | NO | 0 |  |  |
| `fact_imm` | `int` | NO |  |  |  |
| `fact_syn` | `int` | NO |  |  |  |
| `fact_date_pay` | `date` | YES | NULL |  |  |
| `fact_date` | `date` | YES | NULL |  |  |
| `fact_date_devis` | `date` | YES | NULL |  |  |
| `fact_tot` | `decimal(9,2)` | NO |  |  |  |
| `fact_tva` | `decimal(5,2)` | NO |  |  |  |
| `fact_ref` | `varchar(200)` | YES | NULL |  |  |
| `fact_rem` | `varchar(2000)` | YES | NULL |  |  |
| `fact_debutChantier` | `date` | YES | NULL |  |  |
| `fact_accord_max` | `mediumint` | YES | 0 |  |  |
| `fact_delaiComChantier` | `int` | YES | 0 |  |  |
| `fact_joursChantier` | `int` | YES | 1 |  |  |
| `fact_pay` | `int` | NO | 0 |  |  |
| `fact_fin` | `tinyint` | NO | 0 |  |  |
| `fact_euro` | `tinyint` | NO | 1 |  |  |
| `fact_complet` | `tinyint` | NO | 0 |  |  |
| `fact_trash` | `tinyint` | NO | 0 |  |  |
| `fact_realisee` | `tinyint(1)` | NO | 0 |  |  |
| `fact_tech` | `varchar(100)` | YES | NULL |  |  |

#### `filtres`

PK: `fil_id`

| Colonne | Type | Null | Defaut | Cle | Extra |
| --- | --- | --- | --- | --- | --- |
| `fil_id` | `int` | NO |  | PRI | auto_increment |
| `fil_nom` | `varchar(50)` | NO |  |  |  |

#### `immeubles`

PK: `imm_id`

| Colonne | Type | Null | Defaut | Cle | Extra |
| --- | --- | --- | --- | --- | --- |
| `imm_id` | `int` | NO |  | PRI | auto_increment |
| `imm_actif` | `varchar(20)` | YES | NULL |  |  |
| `imm_prix` | `decimal(10,2)` | YES | NULL |  |  |
| `imm_prix_index` | `decimal(10,2)` | YES | NULL |  |  |
| `imm_accord` | `varchar(20)` | YES | NULL |  |  |
| `imm_nom_norme` | `varchar(200)` | YES | NULL |  |  |
| `imm_nom` | `varchar(200)` | YES | NULL |  |  |
| `imm_acp_nom` | `varchar(100)` | YES | NULL |  |  |
| `imm_acp_tva` | `varchar(50)` | NO | N/A |  |  |
| `imm_echeance` | `date` | YES | NULL |  |  |
| `imm_contrat_date` | `date` | YES | NULL |  |  |
| `imm_contrat_mois` | `int` | NO | 12 |  |  |
| `imm_contrat_ref` | `varchar(50)` | YES | NULL |  |  |
| `imm_adresse` | `varchar(200)` | YES | NULL |  |  |
| `imm_code` | `int` | YES | NULL |  |  |
| `imm_loca` | `varchar(200)` | YES | NULL |  |  |
| `imm_km` | `smallint` | YES | NULL |  |  |
| `imm_syndic` | `int` | NO |  |  |  |
| `imm_contact` | `int` | NO | 0 |  |  |
| `imm_asc_num` | `varchar(200)` | YES | NULL |  |  |
| `imm_charge` | `varchar(50)` | YES | NULL |  |  |
| `imm_construction` | `varchar(50)` | YES | NULL |  |  |
| `imm_secours` | `varchar(50)` | YES | NULL |  |  |
| `imm_tva` | `tinyint` | NO | 6 |  |  |
| `imm_affiche` | `tinyint` | NO | 1 |  |  |
| `imm_caves` | `varchar(100)` | YES | NULL |  |  |
| `imm_paliers` | `smallint` | YES | 0 |  |  |
| `imm_acces` | `varchar(500)` | YES | NULL |  |  |
| `imm_fab` | `varchar(100)` | YES | NULL |  |  |
| `imm_vitesse` | `float(9,2)` | NO | 0.00 |  |  |
| `imm_peppol` | `tinyint(1)` | NO | 0 |  |  |

#### `indices`

PK: `ind_id`

| Colonne | Type | Null | Defaut | Cle | Extra |
| --- | --- | --- | --- | --- | --- |
| `ind_id` | `int` | NO |  | PRI | auto_increment |
| `ind_precedent` | `float` | NO |  |  |  |
| `ind_prochain` | `float` | NO |  |  |  |

#### `interventions`

PK: `int_id`

| Colonne | Type | Null | Defaut | Cle | Extra |
| --- | --- | --- | --- | --- | --- |
| `int_id` | `int` | NO |  | PRI | auto_increment |
| `int_asc` | `int` | NO |  |  |  |
| `int_date` | `date` | NO |  |  |  |
| `int_txt` | `varchar(1000)` | NO |  |  |  |
| `int_public` | `tinyint` | NO | 0 |  |  |
| `int_prive` | `tinyint` | NO | 1 |  |  |
| `int_urgent` | `tinyint` | NO | 0 |  |  |
| `int_afaire` | `tinyint` | NO | 0 |  |  |
| `int_tech` | `tinyint` | NO | 0 |  |  |
| `int_mail` | `tinyint` | NO | 0 |  |  |
| `int_traite` | `tinyint` | NO | 0 |  |  |

#### `lieu`

PK: `lieu_id`

| Colonne | Type | Null | Defaut | Cle | Extra |
| --- | --- | --- | --- | --- | --- |
| `lieu_id` | `tinyint` | NO |  | PRI | auto_increment |
| `lieu_nom` | `varchar(100)` | NO |  |  |  |

#### `mailing`

PK: `mail_id`

| Colonne | Type | Null | Defaut | Cle | Extra |
| --- | --- | --- | --- | --- | --- |
| `mail_id` | `smallint` | NO |  | PRI | auto_increment |
| `mail_nom` | `varchar(100)` | NO |  |  |  |
| `mail_categorie` | `tinyint` | NO | 1 |  |  |
| `mail_txt` | `varchar(5000)` | YES | NULL |  |  |

#### `mailing_backup_20260429`

Backup sans PK declaree.

| Colonne | Type | Null | Defaut |
| --- | --- | --- | --- |
| `mail_id` | `smallint` | NO | 0 |
| `mail_txt` | `varchar(5000)` | YES | NULL |

#### `payements`

PK: `pay_id`

| Colonne | Type | Null | Defaut | Cle | Extra |
| --- | --- | --- | --- | --- | --- |
| `pay_id` | `int` | NO |  | PRI | auto_increment |
| `pay_fact` | `int` | NO |  |  |  |
| `pay_ref` | `int` | NO | 0 |  |  |
| `pay_txt` | `varchar(200)` | YES | NULL |  |  |
| `pay_pourcent` | `decimal(9,2)` | YES | 0.00 |  |  |
| `pay_ordre` | `tinyint` | NO | 1 |  |  |
| `pay_num` | `int` | NO | 0 |  |  |
| `pay_tot` | `decimal(9,2)` | NO | 0.00 |  |  |
| `pay_tech` | `varchar(100)` | YES | NULL |  |  |
| `pay_realisee` | `tinyint(1)` | NO | 0 |  |  |

#### `payements_backup_20260504`

Backup sans PK declaree.

| Colonne | Type | Null | Defaut |
| --- | --- | --- | --- |
| `pay_id` | `int` | NO | 0 |
| `pay_fact` | `int` | NO |  |
| `pay_ref` | `int` | NO | 0 |
| `pay_txt` | `varchar(200)` | YES | NULL |
| `pay_pourcent` | `decimal(9,2)` | YES | 0.00 |
| `pay_ordre` | `tinyint` | NO | 1 |
| `pay_num` | `int` | NO | 0 |
| `pay_tot` | `decimal(9,2)` | NO | 0.00 |

#### `syndicats`

PK: `syn_id`

| Colonne | Type | Null | Defaut | Cle | Extra |
| --- | --- | --- | --- | --- | --- |
| `syn_id` | `int` | NO |  | PRI | auto_increment |
| `syn_ref` | `varchar(20)` | YES | NULL |  |  |
| `syn_nom` | `varchar(200)` | YES | NULL |  |  |
| `syn_contact` | `varchar(50)` | NO |  |  |  |
| `syn_adresse` | `varchar(200)` | YES | NULL |  |  |
| `syn_code` | `int` | NO |  |  |  |
| `syn_loca` | `varchar(50)` | NO |  |  |  |
| `syn_mail` | `varchar(200)` | NO |  |  |  |
| `syn_tel` | `varchar(50)` | YES | NULL |  |  |
| `syn_tva` | `varchar(50)` | NO | N/A |  |  |

#### `taches`

PK: `tach_id`

| Colonne | Type | Null | Defaut | Cle | Extra |
| --- | --- | --- | --- | --- | --- |
| `tach_id` | `int` | NO |  | PRI | auto_increment |
| `tach_tech` | `varchar(50)` | YES | NULL |  |  |
| `tach_txt` | `varchar(500)` | YES | NULL |  |  |
| `tach_etat` | `varchar(50)` | YES | NULL |  |  |
| `tach_date` | `date` | YES | NULL |  |  |
| `tach_code` | `tinyint` | NO | 0 |  |  |
| `tach_type` | `varchar(50)` | YES | Non determine |  |  |
| `tach_uti` | `tinyint` | NO |  |  |  |
| `tach_demande` | `tinyint` | NO |  |  |  |
| `tach_date_fin` | `date` | NO |  |  |  |

#### `techniciens`

PK: `tech_id`

| Colonne | Type | Null | Defaut | Cle | Extra |
| --- | --- | --- | --- | --- | --- |
| `tech_id` | `int` | NO |  | PRI | auto_increment |
| `tech_nom` | `varchar(100)` | NO |  |  |  |
| `tech_actif` | `tinyint(1)` | NO | 1 |  |  |

#### `termes`

PK: `ter_id`

| Colonne | Type | Null | Defaut | Cle | Extra |
| --- | --- | --- | --- | --- | --- |
| `ter_id` | `int` | NO |  | PRI | auto_increment |
| `ter_nom` | `varchar(200)` | NO |  |  |  |
| `ter_actif` | `tinyint` | NO | 1 |  |  |

#### `utilisateurs`

PK: `utiId`

| Colonne | Type | Null | Defaut | Cle | Extra |
| --- | --- | --- | --- | --- | --- |
| `utiId` | `int` | NO |  | PRI | auto_increment |
| `utiTitre` | `varchar(30)` | YES | NULL |  |  |
| `utiNom` | `varchar(50)` | NO |  |  |  |
| `utiAdresse` | `varchar(50)` | NO |  |  |  |
| `utiCode` | `int` | NO |  |  |  |
| `utiLocalite` | `varchar(30)` | NO |  |  |  |
| `utiPays` | `varchar(50)` | NO |  |  |  |
| `utiTVA` | `varchar(20)` | NO |  |  |  |
| `utiMail` | `varchar(50)` | NO |  |  |  |
| `utiPass` | `varchar(30)` | NO | 1235 |  |  |
| `utiPassHash` | `varchar(255)` | YES | NULL |  | ajoute par la migration CI4 |
| `utiDroit` | `tinyint` | NO | 1 |  |  |
| `utiContact` | `varchar(30)` | YES | NULL |  |  |
| `utiGsm` | `varchar(20)` | YES | NULL |  |  |
| `utiTel` | `varchar(20)` | YES | NULL |  |  |

### Relations deduites

- `contrats.cont_asc` -> `immeubles.imm_id`: contrats d'entretien rattaches a un ascenseur/immeuble; utilise dans `historique.php`, `historiqueAsc.php`, `entretiens.php`, `pdfContratsResume.php`, `pdfContratsSecu.php`, `pdfEtiquettes.php`, `pdfQRcode.php`.
- `immeubles.imm_syndic` -> `syndicats.syn_id`: syndic responsable d'un immeuble; utilise dans `pdfEtiquettes.php`.
- `factures.fact_imm` -> `immeubles.imm_id`: immeuble facture; utilise dans `pdfDevis.php`, `chantiers.php`, `comptes.php`.
- `factures.fact_syn` -> `syndicats.syn_id`: syndic facture; utilise dans `pdfDevis.php`, `pdfListeFactures.php`, `comptes.php`.
- `factures.fact_pay` -> `payements.pay_id` quand `fact_pay > 0`: paiement/terme de paiement lie a une facture; utilise dans `chantiers.php` et `pdfDevis.php`.
- `payements.pay_fact` -> `factures.fact_id`: paiement appartenant a une facture; utilise dans `pdfDevis.php` et `chantiers.php`.
- `commandes.com_fact` -> `factures.fact_id`: lignes d'article/devis/facture; utilise dans `pdfDevis.php`.
- `commandes.com_art` -> `articles.art_id` pour les valeurs positives ou nulles; les valeurs negatives semblent representer des lignes speciales/exceptions (`exc_nom($com_art)` inverse le signe).
- `commandes.com_conf` -> `conformites.conf_id`: ligne de conformite jointe a un article; utilise dans `pdfDevis.php`.
- `interventions.int_asc` -> `immeubles.imm_id`: historique, demandes urgentes, a faire, entretiens publics/prives; relation centrale du perimetre technicien.
- `interventions.int_tech` -> `utilisateurs.utiId` par usage: certaines creations stockent `$_SESSION['utiId']` dans `int_tech`; attention le type est `tinyint`.
- `taches.tach_uti` -> `utilisateurs.utiId`: destinataire de la tache.
- `taches.tach_demande` -> `utilisateurs.utiId`: demandeur/createur de la tache.
- `taches.tach_type` -> `filtres.fil_nom`: relation par libelle, pas par id.
- `docs.docs_asc` -> `immeubles.imm_id`: documents associes a l'ascenseur, non exploite directement dans `histo/`.
- `factures.fact_credit` et `factures.fact_devis` sont des numeros metier de credit/devis plus que des FK explicites d'apres `pdfDevis.php`.
- `techniciens.tech_nom`, `factures.fact_tech`, `payements.pay_tech` et `contrats.cont_tech` semblent stocker des noms libres plutot qu'une FK vers `techniciens.tech_id`.

## Mapping fichier `histo/` -> fonctionnalite

### Pages metier

| Fichier | Fonction |
| --- | --- |
| `histo/afaire.php` | Liste les interventions marquees `int_afaire=1` et affiche les demandes a faire par ascenseur. |
| `histo/afaireAjout.php` | Encode une demande "A faire" dans `interventions` et, si un destinataire est choisi, cree aussi une tache de type `A faire`. |
| `histo/afaireFin.php` | Transforme une demande "A faire" en tache pour l'utilisateur 40 puis supprime l'intervention `int_afaire`. |
| `histo/chantiers.php` | Affiche les contrats a preparer et classe les chantiers/devis/factures selon leurs dates et statuts. |
| `histo/cmsIntro.php` | Initialise l'en-tete HTML, demarre la session, supprime les PDF temporaires et affiche le menu selon `utiDroit`. |
| `histo/cmsMenu.php` | Fragment quasi vide, reserve a un ancien menu ou nettoyage. |
| `histo/cmsOption.php` | Fragment de scripts JavaScript communs et fermeture UI. |
| `histo/comptes.php` | Liste les factures non terminees et donne les totaux financiers avec liens PDF pour le profil droit 2. |
| `histo/contratsPret.php` | Marque un contrat comme prepare en passant `contrats.cont_zoho` a 0. |
| `histo/db.php` | Centralise connexion MySQL legacy, controle de session, login, helpers de dates/noms et lookup metier. |
| `histo/entretiens.php` | Liste les contrats actifs avec delai d'entretien calcule et lien vers l'historique de l'ascenseur. |
| `histo/historique.php` | Liste les contrats/ascenseurs actifs pour acceder au detail historique d'un ascenseur. |
| `histo/historiqueAsc.php` | Affiche le detail d'un contrat/ascenseur et separe les historiques urgents, a faire, internes et publics. |
| `histo/index.php` | Page de login qui verifie `utilisateurs.utiMail`/`utiPass`, initialise la session et redirige vers `intro.php`. |
| `histo/interventionAjout.php` | Ajoute une intervention privee et un entretien public pour un contrat, puis cree une tache administrative de mise a jour Drive. |
| `histo/interventionsListe.php` | Liste les interventions dont `int_tech` correspond a l'utilisateur connecte. |
| `histo/intro.php` | Page d'accueil connectee: liste urgences, a faire et taches ouvertes de l'utilisateur courant. |
| `histo/pdfContratsResume.php` | Genere le PDF de resume des contrats en cours. |
| `histo/pdfContratsSecu.php` | Genere le PDF d'etat technique/detail contrat avec caracteristiques ascenseur et historiques public/prive. |
| `histo/pdfDevis.php` | Genere les PDF de devis, facture ou note de credit a partir de `factures`, `commandes`, `articles`, `payements` et textes `mailing`. |
| `histo/pdfEtiquettes.php` | Genere les etiquettes ascenseur/depannage avec coordonnees syndic et caracteristiques de l'ascenseur. |
| `histo/pdfListeFactures.php` | Genere la liste PDF des factures non payees/en cours. |
| `histo/pdfQRcode.php` | Genere une page PDF avec le QR code du dossier numerise d'un ascenseur. |
| `histo/taches.php` | Liste les taches ouvertes assignees a l'utilisateur connecte, filtrables par type. |
| `histo/tachesAjout.php` | Cree une tache avec destinataire, type, date, sujet et commentaire. |
| `histo/tachesConsult.php` | Affiche toutes les taches ouvertes pour consultation/modification, avec filtre par type. |
| `histo/tachesFin.php` | Marque une tache comme terminee (`tach_code=1`, `tach_date_fin=now()`). |
| `histo/tachesModif.php` | Modifie date, sujet, type, destinataire et texte d'une tache existante. |
| `histo/urgent.php` | Liste les demandes urgentes (`int_urgent=1`) et les demandes a faire; l'utilisateur 40 peut cloturer les urgences. |
| `histo/urgentAjout.php` | Encode une panne urgente dans `interventions` et cree une tache `Pannes` si le destinataire n'est ni 0 ni 40. |
| `histo/urgentFin.php` | Cloture une urgence en ajoutant une intervention privee de resolution puis en passant `int_urgent` a 0. |

### Bibliotheques embarquees

| Fichier | Fonction |
| --- | --- |
| `histo/fpdf.php` | Bibliotheque FPDF 1.81 pour construire des PDF. |
| `histo/font/courier.php` | Definition de fonte FPDF Courier normale. |
| `histo/font/courierb.php` | Definition de fonte FPDF Courier gras. |
| `histo/font/courierbi.php` | Definition de fonte FPDF Courier gras italique. |
| `histo/font/courieri.php` | Definition de fonte FPDF Courier italique. |
| `histo/font/helvetica.php` | Definition de fonte FPDF Helvetica normale. |
| `histo/font/helveticab.php` | Definition de fonte FPDF Helvetica gras. |
| `histo/font/helveticabi.php` | Definition de fonte FPDF Helvetica gras italique. |
| `histo/font/helveticai.php` | Definition de fonte FPDF Helvetica italique. |
| `histo/font/symbol.php` | Definition de fonte FPDF Symbol. |
| `histo/font/times.php` | Definition de fonte FPDF Times normale. |
| `histo/font/timesb.php` | Definition de fonte FPDF Times gras. |
| `histo/font/timesbi.php` | Definition de fonte FPDF Times gras italique. |
| `histo/font/timesi.php` | Definition de fonte FPDF Times italique. |
| `histo/font/zapfdingbats.php` | Definition de fonte FPDF ZapfDingbats. |
| `histo/email/banlog.php` | Support PHPMailer-FE pour journaliser/traiter les adresses bannies. |
| `histo/email/class.phpmailer.php` | Bibliotheque PHPMailer legacy. |
| `histo/email/class.smtp.php` | Client SMTP utilise par PHPMailer. |
| `histo/email/default.config.php` | Configuration par defaut PHPMailer-FE. |
| `histo/email/inc.sanitize.php` | Fonctions de sanitisation de formulaires PHPMailer-FE. |
| `histo/email/phpmailer-fe.php` | Moteur PHPMailer-FE de traitement de formulaires email. |
| `histo/email/worxturing.php` | Support captcha/Turing test de PHPMailer-FE. |
| `histo/setasign/Fpdi/autoload.php` | Autoloader FPDI setasign. |
| `histo/setasign/Fpdi/FpdfTpl.php` | Classe FPDI de templates pour FPDF. |
| `histo/setasign/Fpdi/FpdfTplTrait.php` | Trait de gestion des templates FPDF. |
| `histo/setasign/Fpdi/Fpdi.php` | Classe FPDI pour importer des pages PDF dans FPDF. |
| `histo/setasign/Fpdi/FpdiException.php` | Exception specifique FPDI. |
| `histo/setasign/Fpdi/FpdiTrait.php` | Trait principal d'import de pages PDF. |
| `histo/setasign/Fpdi/Tcpdf/Fpdi.php` | Adaptateur FPDI pour TCPDF. |
| `histo/setasign/Fpdi/TcpdfFpdi.php` | Variante FPDI compatible TCPDF. |
| `histo/setasign/Fpdi/Tfpdf/FpdfTpl.php` | Variante template pour tFPDF. |
| `histo/setasign/Fpdi/Tfpdf/Fpdi.php` | Variante FPDI pour tFPDF. |
| `histo/setasign/Fpdi/PdfReader/Page.php` | Representation d'une page PDF lue. |
| `histo/setasign/Fpdi/PdfReader/PageBoundaries.php` | Constantes/gestion des boites de page PDF. |
| `histo/setasign/Fpdi/PdfReader/PdfReader.php` | Lecteur haut niveau de document PDF. |
| `histo/setasign/Fpdi/PdfReader/PdfReaderException.php` | Exception du lecteur PDF. |
| `histo/setasign/Fpdi/PdfReader/DataStructure/Rectangle.php` | Structure rectangle pour dimensions de page PDF. |
| `histo/setasign/Fpdi/PdfParser/PdfParser.php` | Parser PDF bas niveau. |
| `histo/setasign/Fpdi/PdfParser/PdfParserException.php` | Exception du parser PDF. |
| `histo/setasign/Fpdi/PdfParser/StreamReader.php` | Lecteur de flux binaire PDF. |
| `histo/setasign/Fpdi/PdfParser/Tokenizer.php` | Tokenizer PDF bas niveau. |
| `histo/setasign/Fpdi/PdfParser/CrossReference/AbstractReader.php` | Base des lecteurs de table xref PDF. |
| `histo/setasign/Fpdi/PdfParser/CrossReference/CrossReference.php` | Gestion de la table de references croisees PDF. |
| `histo/setasign/Fpdi/PdfParser/CrossReference/CrossReferenceException.php` | Exception xref PDF. |
| `histo/setasign/Fpdi/PdfParser/CrossReference/FixedReader.php` | Lecteur xref a offsets fixes. |
| `histo/setasign/Fpdi/PdfParser/CrossReference/LineReader.php` | Lecteur xref ligne par ligne. |
| `histo/setasign/Fpdi/PdfParser/CrossReference/ReaderInterface.php` | Interface des lecteurs xref. |
| `histo/setasign/Fpdi/PdfParser/Filter/Ascii85.php` | Filtre de decodage PDF ASCII85. |
| `histo/setasign/Fpdi/PdfParser/Filter/Ascii85Exception.php` | Exception du filtre ASCII85. |
| `histo/setasign/Fpdi/PdfParser/Filter/AsciiHex.php` | Filtre de decodage PDF ASCII Hex. |
| `histo/setasign/Fpdi/PdfParser/Filter/FilterException.php` | Exception generique de filtre PDF. |
| `histo/setasign/Fpdi/PdfParser/Filter/FilterInterface.php` | Interface de filtre PDF. |
| `histo/setasign/Fpdi/PdfParser/Filter/Flate.php` | Filtre de decompression Flate. |
| `histo/setasign/Fpdi/PdfParser/Filter/FlateException.php` | Exception du filtre Flate. |
| `histo/setasign/Fpdi/PdfParser/Filter/Lzw.php` | Filtre de decompression LZW. |
| `histo/setasign/Fpdi/PdfParser/Filter/LzwException.php` | Exception du filtre LZW. |
| `histo/setasign/Fpdi/PdfParser/Type/PdfArray.php` | Type PDF tableau. |
| `histo/setasign/Fpdi/PdfParser/Type/PdfBoolean.php` | Type PDF booleen. |
| `histo/setasign/Fpdi/PdfParser/Type/PdfDictionary.php` | Type PDF dictionnaire. |
| `histo/setasign/Fpdi/PdfParser/Type/PdfHexString.php` | Type PDF chaine hexadecimale. |
| `histo/setasign/Fpdi/PdfParser/Type/PdfIndirectObject.php` | Type PDF objet indirect. |
| `histo/setasign/Fpdi/PdfParser/Type/PdfIndirectObjectReference.php` | Type PDF reference d'objet indirect. |
| `histo/setasign/Fpdi/PdfParser/Type/PdfName.php` | Type PDF nom. |
| `histo/setasign/Fpdi/PdfParser/Type/PdfNull.php` | Type PDF null. |
| `histo/setasign/Fpdi/PdfParser/Type/PdfNumeric.php` | Type PDF numerique. |
| `histo/setasign/Fpdi/PdfParser/Type/PdfStream.php` | Type PDF flux. |
| `histo/setasign/Fpdi/PdfParser/Type/PdfString.php` | Type PDF chaine. |
| `histo/setasign/Fpdi/PdfParser/Type/PdfToken.php` | Type PDF token. |
| `histo/setasign/Fpdi/PdfParser/Type/PdfType.php` | Base utilitaire des types PDF. |
| `histo/setasign/Fpdi/PdfParser/Type/PdfTypeException.php` | Exception de typage PDF. |

## Authentification et controle d'acces actuels

### Stockage utilisateurs

Les utilisateurs sont stockes dans la table `utilisateurs`.

Colonnes importantes:

- `utiId`: identifiant utilisateur.
- `utiNom`: nom affiche dans les taches et historiques.
- `utiMail`: login saisi dans `index.php`.
- `utiPass`: mot de passe compare tel quel dans le legacy.
- `utiPassHash`: colonne ajoutee par la migration CI4 pour stocker le hash `password_hash()` utilise par la nouvelle authentification.
- `utiDroit`: niveau d'acces numerique.

Repartition observee localement:

| `utiDroit` | Nombre | Interpretation deduite |
| --- | ---: | --- |
| 1 | 2 | Profil technicien standard dans `histo/`, avec menu `interventionsListe.php`. |
| 2 | 1 | Profil gestion/admin legacy, avec acces menu chantiers et comptes. |
| 4 | 1 | Compte present en base mais refuse par `OpenStreamDB()` car seuls 1 a 3 sont acceptes. |

### Login

Le formulaire de `histo/index.php` poste `mail` et `password`.

Le traitement appelle `droitClient($utiMail, $utiPass)` dans `histo/db.php`, qui execute:

```sql
SELECT utiId, utiDroit
FROM utilisateurs
WHERE utiMail = ? AND utiPass = ?
```

Si `utiId > 0`, la session PHP est demarree et deux valeurs sont stockees:

- `$_SESSION['utiId']`
- `$_SESSION['utiDroit']`

Puis le navigateur est redirige vers `intro.php` via JavaScript. En cas d'echec, redirection vers `https://www.police.be/fr`.

### Protection globale

La fonction `OpenStreamDB()` dans `histo/db.php` est le garde principal. Elle:

1. Inclut `../template/const.php` pour obtenir les identifiants MySQL legacy.
2. Ouvre la connexion MySQL.
3. Demarre la session.
4. Lit `$_SESSION['utiDroit']`.
5. Refuse si `utiDroit > 3` ou `utiDroit < 1`.
6. Redirige vers `https://www.police.be/fr`, supprime `utiDroit`/`utiId`, puis `die()`.

Consequence: une page qui appelle `OpenStreamDB()` est accessible aux droits 1, 2 et 3, sauf si la page ajoute ses propres conditions d'affichage/action. Il n'y a pas de controle centralise par route ni de matrice d'autorisations stricte.

`cmsIntro.php` contient un ancien controle IP/session commente. Il lit aussi `$_SESSION['utiDroit']` dans `$test` pour construire le menu, mais son bloc de redirection est desactive.

### Controle par menu et par page

Menu de `cmsIntro.php`:

- Tous droits 1 a 3: `taches.php`, `entretiens.php`, `urgent.php`.
- Droit 2 uniquement: `chantiers.php`, `comptes.php`.
- Droit 1 uniquement: `interventionsListe.php`.

Restrictions ou comportements additionnels:

- `afaire.php`: lien d'ajout affiche seulement si `utiDroit == 2` ou `utiId == 42`.
- `urgent.php`: liens d'ajout urgence/a faire affiches seulement si `utiDroit == 2` ou `utiId == 42`; lien de cloture urgence affiche seulement si `utiId == 40`.
- `intro.php`: les urgences sont cloturables seulement par `utiId == 40`; les taches affichees sont filtrees sur `tach_uti = $_SESSION['utiId']`.
- `taches.php`: taches ouvertes uniquement pour l'utilisateur connecte; lien vers consultation globale affiche si droit 2.
- `tachesConsult.php`: liste toutes les taches ouvertes et permet d'aller vers `tachesModif.php`; l'acces n'est pas explicitement bloque aux droits 1/3 si l'URL est appelee directement.
- `comptes.php` et `chantiers.php`: visibles dans le menu seulement pour droit 2, mais le code ne refait pas un `if ($test == 2) die()` global; l'acces direct reste protege seulement par `OpenStreamDB()` donc par droits 1 a 3.
- `interventionsListe.php`: visible dans le menu pour droit 1, liste les interventions `int_tech = $_SESSION['utiId']`.

Points importants pour la migration:

- Le role n'est pas un libelle mais un entier `utiDroit`.
- Le controle reel est mele a la connexion DB et a l'affichage HTML.
- Les restrictions fines sont souvent des masquages de liens, pas des verifications serveur completes.
- Les mots de passe semblent en clair ou comparables en clair.

## Perimetre technicien vs autres modules

### Perimetre technicien a reprendre en premier

- Tableau d'accueil technicien: `intro.php`, avec urgences, a faire et taches personnelles.
- Taches personnelles: `taches.php`, `tachesFin.php`.
- Creation/edition de taches si le role cible y a droit: `tachesAjout.php`, `tachesModif.php`, `tachesConsult.php`.
- Demandes urgentes/pannes: `urgent.php`, `urgentAjout.php`, `urgentFin.php`.
- Demandes a faire: `afaire.php`, `afaireAjout.php`, `afaireFin.php`.
- Entretiens et historique ascenseur: `entretiens.php`, `historique.php`, `historiqueAsc.php`, `interventionAjout.php`.
- Historique des interventions par technicien: `interventionsListe.php`.
- QR code/dossier numerise et documents d'ascenseur en lecture: `pdfQRcode.php`, table `docs`, champs `cont_qr`, `cont_dossier`, `cont_secu`.

Note photos: aucun upload photo ni usage `$_FILES` n'a ete trouve dans `histo/`. Le seul usage image dynamique proche du sujet est l'integration d'un QR code PNG `../qrcode/{int_asc}.png` dans `pdfQRcode.php`. Les photos devront donc etre confirmees dans un autre dossier legacy ou ajoutees comme nouveau besoin.

### Modules hors perimetre technicien initial

- Gestion financiere/facturation: `comptes.php`, `pdfListeFactures.php`, `pdfDevis.php`, tables `factures`, `payements`, `commandes`, `articles`, `mailing`.
- Chantiers et preparation contrats: `chantiers.php`, `contratsPret.php`.
- Gestion contrats/administration technique detaillee: PDF contrats, resume contrats, etiquettes, etat technique.
- Gestion syndic/ACP: tables `syndicats`, champs ACP dans `immeubles`; peu d'ecrans syndic/ACP dans `histo/`, probablement ailleurs dans le legacy.
- Bibliotheques PDF/email: a remplacer ou isoler comme services techniques dans la nouvelle app.

### Proposition de regroupement futur par module/role

| Module | Role principal | Legacy source | Tables principales |
| --- | --- | --- | --- |
| Authentification | Tous | `index.php`, `db.php` | `utilisateurs` |
| Tableau technicien | Technicien | `intro.php` | `taches`, `interventions`, `immeubles` |
| Taches | Technicien, admin | `taches*.php` | `taches`, `filtres`, `utilisateurs` |
| Urgences/Pannes | Technicien, dispatch/admin | `urgent*.php` | `interventions`, `taches`, `immeubles`, `utilisateurs` |
| A faire | Technicien, dispatch/admin | `afaire*.php` | `interventions`, `taches`, `immeubles`, `utilisateurs` |
| Entretiens/Historique ascenseur | Technicien, syndic/ACP en lecture future | `entretiens.php`, `historique*.php`, `interventionAjout.php` | `contrats`, `immeubles`, `interventions` |
| Documents ascenseur | Technicien, syndic/ACP | `pdfQRcode.php`, `pdfEtiquettes.php`, `pdfContratsSecu.php` | `docs`, `contrats`, `immeubles`, `syndicats`, `interventions` |
| Chantiers | Admin/gestion | `chantiers.php`, `contratsPret.php` | `contrats`, `factures`, `payements`, `immeubles` |
| Facturation/Devis | Admin/compta | `comptes.php`, `pdfDevis.php`, `pdfListeFactures.php` | `factures`, `payements`, `commandes`, `articles`, `conformites`, `mailing` |
| Syndics/ACP | Syndic, ACP, admin | surtout schema BDD ici | `syndicats`, `immeubles`, `utilisateurs` |

## Generation PDF

Les PDF utilisent `histo/fpdf.php` et `histo/setasign/Fpdi/autoload.php`. Les scripts instancient `new Fpdi()`, importent le template `max_vide.pdf` via `setSourceFile()`, puis ecrivent un fichier PDF local avec `Output('F', $doc)`. `cmsIntro.php` supprime les PDF temporaires du dossier courant sauf `max_vide.pdf`.

PDF identifies:

| Script | Fichier genere | Contenu |
| --- | --- | --- |
| `pdfQRcode.php` | `QRCODE_{imm_nom_norme}.pdf` | Page "Documents numerises" avec QR code `../qrcode/{cont_asc}.png`, adresse et numero d'ascenseur. |
| `pdfEtiquettes.php` | `ETIQUETTES_{imm_nom_norme}.pdf` | Etiquettes de depannage/ascenseur avec logo, adresse, syndic, charge, numero de serie et consignes d'urgence. |
| `pdfContratsSecu.php` | `DETAILS_CONTRAT_{imm_nom_norme}.pdf` | Etat technique/detail contrat: facturation, contrat, dossier securite/technique, caracteristiques ascenseur, historique public et interne. |
| `pdfContratsResume.php` | `contrats_en_cours.pdf` | Liste synthetique des contrats actifs avec date, nombre de visites, montant et dernier entretien. |
| `pdfListeFactures.php` | `Factures_en_cours.pdf` | Liste des factures non payees/en attente avec date, numero, reference, syndic et montant. |
| `pdfDevis.php` | `F_{fact_num}_{imm_nom_norme}.pdf`, `D_{fact_devis}_{imm_nom_norme}.pdf` ou `C_{fact_credit}_{imm_nom_norme}.pdf` | Facture, devis ou note de credit selon les champs de `factures`, avec lignes de `commandes`, articles/conformites, paiements et conditions de vente standard/omnium. |
