---
tags: 
  - note
type: "note"
univers: PRO
projects:
  - "[[90_ARCHIVES/CLOS/PRO/BUDGET-DGE-2026]]"
date: "[[01_JOURNAL/2026/2026-07-29]]"
priority: 10
---

# Schema Relationnel - Base de Donnees Financiere

## Table des Matières

1. [Introduction](../03_NOTES/#introduction)
2. [Diagramme Entité-Association](../03_NOTES/#diagramme-entité-association)
3. [Tables de Référence](../03_NOTES/#tables-de-référence)
4. [Tables Principales](../03_NOTES/#tables-principales)
5. [Relations entre les Tables](../03_NOTES/#relations-entre-les-tables)
6. [Remarques et Recommandations](../03_NOTES/#remarques-et-recommandations)

---

## Introduction

Ce document decrit le schema relationnel d'une base de donnees destinee a gerer les donnees financieres issues d'un outil de gestion de marches publics. La base est concue a partir de 9 fichiers CSV contenant des informations sur les tiers, les marches, les commandes, les engagements, les liquidations, les services faits, les tranches, les acomptes et les factures.

### Contexte

- **Source** : Fichiers CSV exportes depuis un outil de gestion financiere
- **Objectif** : Creer une base relationnelle pour analyser et suivre les depenses, engagements et paiements
- **SGBD** : SQLite (pour une implementation locale et portable)

### Fichiers Source

| Fichier | Description | Nombre de colonnes |
|--------|-------------|-------------------|
| `Execution_TIERS.csv` | Entreprises/fournisseurs | 14 |
| `Execution_COMMANDES.csv` | Commandes passees | 8 |
| `Execution_ENGAGEMENTS.csv` | Engagements budgetaires | 19 |
| `Execution_LIQUIDATIONS.csv` | Liquidations (paiements) | 29 |
| `Execution_SERVICES-FAITS.csv` | Services executes (peuvent etre rejetes) | 11 |
| `Execution_TRANCHES.csv` | Classification des depenses | 10 |
| `Execution_DEMANDES-PAIEMENT_FACTURES.csv` | Factures emises | 17 |
| `Marches_MARCHES.csv` | Liste des marches | 12 |
| `Marches_ACOMPTES.csv` | Acomptes verses | 10 |

---

## Diagramme Entité-Association

```mermaid
erDiagram
    %%% TABLES DE REFERENCE %%%
    DIRECTIONS ||--o{ TIERS : "gère"
    DIRECTIONS ||--o{ MARCHES : "gère"
    DIRECTIONS ||--o{ TRANCHES : "gère"
    DIRECTIONS ||--o{ ENGAGEMENTS : "gère"
    DIRECTIONS ||--o{ SERVICES_FAITS : "gère"
    DIRECTIONS ||--o{ FACTURES : "gère"
    DIRECTIONS ||--o{ LIQUIDATIONS : "gère"

    OPERATIONS ||--o{ TRANCHES : "utilise"
    OPERATIONS ||--o{ ENGAGEMENTS : "utilise"

    FAMILLES_DEPENSES ||--o{ ENGAGEMENTS : "classifie"

    %%% TABLES PRINCIPALES %%%
    TIERS ||--o{ MARCHES : "passe"
    TIERS ||--o{ COMMANDES : "passe"
    TIERS ||--o{ ENGAGEMENTS : "concerné"
    TIERS ||--o{ LIQUIDATIONS : "bénéficiaire"
    TIERS ||--o{ FACTURES : "émet"
    TIERS ||--o{ SERVICES_FAITS : "réalise"

    MARCHES ||--o{ COMMANDES : "contient"
    MARCHES ||--o{ ACOMPTES : "a"

    COMMANDES ||--o{ SERVICES_FAITS : "lié à"
    COMMANDES ||--o{ ACOMPTES : "associé à"

    TRANCHES ||--o{ ENGAGEMENTS : "contient"

    ENGAGEMENTS ||--o{ LIQUIDATIONS : "liquidé par"
    ENGAGEMENTS ||--o{ SERVICES_FAITS : "couvre"

    ACOMPTES ||--o{ LIQUIDATIONS : "utilisé dans"
```


Vision siplifiée

```mermaid
erDiagram
    %%% TABLES DE REFERENCE %%%
    %% DIRECTIONS ||--o{ TIERS : "gère"
    %% DIRECTIONS ||--o{ MARCHES : "gère"
    %% DIRECTIONS ||--o{ TRANCHES : "gère"
    %% DIRECTIONS ||--o{ ENGAGEMENTS : "gère"
    %% DIRECTIONS ||--o{ SERVICES_FAITS : "gère"
    %% DIRECTIONS ||--o{ FACTURES : "gère"
    %% DIRECTIONS ||--o{ LIQUIDATIONS : "gère"

    OPERATIONS ||--o{ TRANCHES : "utilise"
    OPERATIONS ||--o{ ENGAGEMENTS : "utilise"

    FAMILLES_DEPENSES ||--o{ ENGAGEMENTS : "classifie"

    %%% TABLES PRINCIPALES %%%
    TIERS ||--o{ MARCHES : "passe"
    TIERS ||--o{ COMMANDES : "passe"
    TIERS ||--o{ ENGAGEMENTS : "concerné"
    TIERS ||--o{ LIQUIDATIONS : "bénéficiaire"
    TIERS ||--o{ FACTURES : "émet"
    TIERS ||--o{ SERVICES_FAITS : "réalise"

    MARCHES ||--o{ COMMANDES : "contient"
    MARCHES ||--o{ ACOMPTES : "a"

    COMMANDES ||--o{ SERVICES_FAITS : "lié à"
    COMMANDES ||--o{ ACOMPTES : "associé à"

    TRANCHES ||--o{ ENGAGEMENTS : "contient"

    ENGAGEMENTS ||--o{ LIQUIDATIONS : "liquidé par"
    ENGAGEMENTS ||--o{ SERVICES_FAITS : "couvre"

    ACOMPTES ||--o{ LIQUIDATIONS : "utilisé dans"
```


---

## Tables de Référence

Ces tables contiennent des listes de valeurs predefinies utilisees comme cles etrangeres dans les tables principales.

---

### 1. DIRECTIONS

**Role** : Table de reference pour les Centres de Responsabilite (CdR). Chaque direction gere un ensemble de marches, commandes, engagements, etc.

**Description** : Une direction represent un service ou departement responsable de la gestion d'un marche ou d'une operation financiere.

| Colonne | Type | PK | NN | Description |
|---------|------|----|----|-------------|
| `code` | VARCHAR(50) | ✅ | ✅ | Code unique de la direction (ex: "DIR-FIN", "DIR-TECH") |
| `libelle` | VARCHAR(255) | | | Nom complet de la direction |

**Remarques** :
- Cette table est creee a partir des valeurs uniques de `CdR` trouvees dans les fichiers CSV
- Utilisee comme cle etrangere dans : TIERS, MARCHES, TRANCHES, ENGAGEMENTS, SERVICES_FAITS, FACTURES, LIQUIDATIONS

**Recommandations** :
- Indexer la colonne `code` pour les performances
- Limiter la taille de `code` a 50 caracteres pour la normalisation

---

### 2. OPERATIONS

**Role** : Table de reference pour les types doperations. Liste predefinie des operations possibles.

**Description** : Une operation represent un type d'action ou de processus dans le cadre de la gestion financiere.

| Colonne | Type | PK | NN | Description |
|---------|------|----|----|-------------|
| `code` | VARCHAR(50) | ✅ | ✅ | Code unique de loperation |
| `libelle` | VARCHAR(255) | | | Description de loperation |

**Remarques** :
- Extrait des valeurs uniques de la colonne `Operation` dans les fichiers `Execution_ENGAGEMENTS.csv` et `Execution_TRANCHES.csv`
- Utilisee comme cle etrangere dans : TRANCHES, ENGAGEMENTS

**Recommandations** :
- Maintenir cette table a jour avec toutes les operations possibles
- Utiliser des codes courts et descriptifs

---

### 3. FAMILLES_DEPENSES

**Role** : Table de reference pour les familles de depenses. Classification budgetaire.

**Description** : Une famille de depenses permet de categoriser les engagements et les tranches selon leur nature.

| Colonne | Type | PK | NN | Description |
|---------|------|----|----|-------------|
| `code` | VARCHAR(50) | ✅ | ✅ | Code unique de la famille |
| `libelle` | VARCHAR(255) | | | Description de la famille |

**Remarques** :
- Extrait des valeurs uniques de la colonne `Famille` dans le fichier `Execution_ENGAGEMENTS.csv`
- Utilisee comme cle etrangere dans : ENGAGEMENTS

**Recommandations** :
- Definir une hierarchie de families si necessaire (ex: avec un champ `parent_code`)

---

## Tables Principales

---

### 4. TIERS

**Role** : Table principale des entreprises, fournisseurs et prestataires.

**Fichier source** : `Execution_TIERS.csv`

**Description** : Contient toutes les informations sur les entites externes (fournisseurs, prestataires, etc.) avec lesquelles des transactions financieres sont effectues.

| Colonne | Type | PK | NN | FK | Description |
|---------|------|----|----|----|-------------|
| `code` | VARCHAR(50) | ✅ | ✅ | | **Cle primaire** - Identifiant unique du tiers |
| `libelle` | VARCHAR(100) | | | | Nom court du tiers |
| `nom_raison_sociale` | VARCHAR(255) | | | | Nom complet ou raison sociale |
| `complement_nom` | VARCHAR(255) | | | | Complement de nom (si applicable) |
| `adresse` | VARCHAR(255) | | | | Adresse postale |
| `commune` | VARCHAR(100) | | | | Commune |
| `type` | VARCHAR(50) | | | | Type de tiers (ex: "Fournisseur", "Prestataire") |
| `direction_code` | VARCHAR(50) | | | ✅ → DIRECTIONS(code) | Direction associee (CdR) |
| `etranger` | BOOLEAN | | | | Indique si le tiers est etranger |
| `collectif` | BOOLEAN | | | | Indique si le tiers est un groupement |
| `siret` | VARCHAR(50) | | | | Numero SIRET |
| `rib` | VARCHAR(100) | | | | Releve dIdentite Bancaire |
| `bloque` | BOOLEAN | | | | Indique si le tiers est bloque |
| `motif_bloquage` | VARCHAR(255) | | | | Motif du blocage (si bloque = TRUE) |

**Remarques** :
- Cette table est referencee par presque toutes les autres tables (MARCHES, COMMANDES, ENGAGEMENTS, LIQUIDATIONS, FACTURES, SERVICES_FAITS)
- Le champ `code` est utilise comme cle etrangere dans les autres tables
- Les champs `etranger` et `bloque` sont des booleens pour faciliter les filtres

**Recommandations** :
- Ajouter un index sur `direction_code` pour les requetes par direction
- Valider le format du SIRET (14 chiffres) et du RIB
- Considerer l'ajout d'un champ `date_creation` et `date_modification`

---

### 5. MARCHES

**Role** : Table principale des marches (contrats).

**Fichier source** : `Marches_MARCHES.csv`

**Description** : Contient les informations principales sur les marches passes avec les fournisseurs.

| Colonne | Type | PK | NN | FK | Description |
|---------|------|----|----|----|-------------|
| `numero` | VARCHAR(50) | ✅ | ✅ | | **Cle primaire** - Numero unique du marche |
| `categorie` | VARCHAR(100) | | | | Categorie du marche |
| `libelle` | VARCHAR(255) | | | | Libelle ou titre du marche |
| `montant_ht` | DECIMAL(15,2) | | | | Montant Hors Taxes |
| `montant_ttc` | DECIMAL(15,2) | | | | Montant Toutes Taxes Comprises |
| `montant_realise` | DECIMAL(15,2) | | | | Montant effectivement realise |
| `etat` | VARCHAR(50) | | | | Etat du marche (ex: "En cours", "Termine", "Annule") |
| `tier_code` | VARCHAR(50) | | ✅ | ✅ → TIERS(code) | Fournisseur associe au marche |
| `direction_code` | VARCHAR(50) | | ✅ | ✅ → DIRECTIONS(code) | Direction gestionnaire (CdR) |
| `date_fin_execution` | DATE | | | | Date de fin prevue ou effective |

**Remarques** :
- Un marche peut contenir plusieurs commandes (relation 1:N avec COMMANDES)
- Un marche peut avoir plusieurs acomptes (relation 1:N avec ACOMPTES)
- Les montants sont stores en DECIMAL(15,2) pour eviter les erreurs de precision

**Recommandations** :
- Ajouter un champ `date_debut` pour le suivi temporel
- Considerer l'ajout d'un champ `reference_externe` pour les references fournisseur
- Indexer `tier_code` et `direction_code` pour les performances

---

### 6. COMMANDES

**Role** : Table des commandes passees dans le cadre des marches.

**Fichier source** : `Execution_COMMANDES.csv`

**Description** : Contient les commandes emises aux fournisseurs pour l'execution des marches.

| Colonne | Type | PK | NN | FK | Description |
|---------|------|----|----|----|-------------|
| `numero` | VARCHAR(50) | ✅ | ✅ | | **Cle primaire** - Numero unique de la commande |
| `tier_code` | VARCHAR(50) | | ✅ | ✅ → TIERS(code) | Fournisseur |
| `marche_numero` | VARCHAR(50) | | ✅ | ✅ → MARCHES(numero) | Marche associe |
| `objet` | VARCHAR(255) | | | | Objet ou description de la commande |
| `etat` | VARCHAR(50) | | | | Etat de la commande |
| `montant_ht` | DECIMAL(15,2) | | | | Montant Hors Taxes |
| `montant_ttc` | DECIMAL(15,2) | | | | Montant Toutes Taxes Comprises |

**Remarques** :
- Une commande est liee a un marche et un tiers
- Une commande peut avoir plusieurs services faits (relation 1:N)
- Une commande peut etre associee a un acompte

**Recommandations** :
- Ajouter un champ `date_commande` pour le suivi temporel
- Ajouter un champ `date_livraison_prevue`
- Indexer `marche_numero` pour les requetes par marche

---

### 7. ACOMPTES

**Role** : Table des acomptes verses dans le cadre des marches.

**Fichier source** : `Marches_ACOMPTES.csv`

**Description** : Contient les informations sur les acomptes (paiements partiels) effectues pour les marches.

| Colonne | Type | PK | NN | FK | Description |
|---------|------|----|----|----|-------------|
| `marche_numero` | VARCHAR(50) | ✅ | ✅ | ✅ → MARCHES(numero) | **Cle composite** - Marche associe |
| `numero` | VARCHAR(50) | ✅ | ✅ | | **Cle composite** - Numero unique de l'acompte dans le marche |
| `objet` | VARCHAR(255) | | | | Objet de l'acompte |
| `type` | VARCHAR(50) | | | | Type d'acompte |
| `etat` | VARCHAR(50) | | | | Etat de l'acompte |
| `commande_numero` | VARCHAR(50) | | | ✅ → COMMANDES(numero) | Commande associee (si applicable) |
| `date_prestations` | DATE | | | | Date des prestations effectuées |
| `net_a_payer` | DECIMAL(15,2) | | | | Montant net a payer |
| `mandat_ord_ht` | DECIMAL(15,2) | | | | Montant mandat/ordonnancement HT |
| `mandat_ord_ttc` | DECIMAL(15,2) | | | | Montant mandat/ordonnancement TTC |

**Remarques** :
- **Cle primaire composite** : `(marche_numero, numero)` pour garantir l'unicite dans le contexte d'un marche
- Un acompte peut etre lie a une commande
- Un acompte peut etre reference dans une liquidation (via `acompte_marche_numero` et `acompte_numero`)

**Recommandations** :
- Ajouter un champ `date_paiement`
- Considerer l'ajout d'un champ `reference_mandat` pour la traceabilite

---

### 8. TRANCHES

**Role** : Table de classification des depenses (tranches budgetaires).

**Fichier source** : `Execution_TRANCHES.csv`

**Description** : Contient les informations sur les tranches de depenses, qui representent une classification hierarchique des engagements budgetaires.

| Colonne | Type | PK | NN | FK | Description |
|---------|------|----|----|----|-------------|
| `numero` | VARCHAR(50) | ✅ | ✅ | | **Cle primaire** - Identifiant unique de la tranche |
| `description` | VARCHAR(255) | | | | Description de la tranche |
| `statut` | VARCHAR(50) | | | | Statut de la tranche |
| `etat` | VARCHAR(50) | | | | Etat de la tranche |
| `operation_code` | VARCHAR(50) | | ✅ | ✅ → OPERATIONS(code) | Operation associee |
| `direction_gestionnaire_code` | VARCHAR(50) | | ✅ | ✅ → DIRECTIONS(code) | Direction gestionnaire (CdR) |
| `direction_engagement_code` | VARCHAR(50) | | ✅ | ✅ → DIRECTIONS(code) | Direction d'engagement (CdR) |
| `montant_pre_affecte` | DECIMAL(15,2) | | | | Montant pre-affecte |
| `montant_affecte` | DECIMAL(15,2) | | | | Montant affecte |
| `montant_engage` | DECIMAL(15,2) | | | | Montant engage |
| `montant_liquide` | DECIMAL(15,2) | | | | Montant liquide |

**Remarques** :
- Une tranche peut contenir plusieurs engagements (relation 1:N)
- Les montants representent differentes etapes du cycle budgetaire (pre-affectation, affectation, engagement, liquidation)

**Recommandations** :
- Verifier que `montant_pre_affecte >= montant_affecte >= montant_engage >= montant_liquide`
- Ajouter un champ `date_creation` et `date_modification`

---

### 9. ENGAGEMENTS

**Role** : Table des engagements budgetaires et juridiques.

**Fichier source** : `Execution_ENGAGEMENTS.csv`

**Description** : Contient les engagements pris dans le cadre de l'execution des marches. Un engagement represent une reservation budgetaire pour une depense future.

| Colonne | Type | PK | NN | FK | Description |
|---------|------|----|----|----|-------------|
| `numero` | VARCHAR(50) | ✅ | ✅ | | **Cle primaire** - Numero unique de l'engagement |
| `direction_code` | VARCHAR(50) | | ✅ | ✅ → DIRECTIONS(code) | Direction associee (CdR) |
| `objet` | VARCHAR(255) | | | | Objet de l'engagement |
| `date_creation` | DATE | | | | Date de creation de l'engagement |
| `etat` | VARCHAR(50) | | | | Etat de l'engagement |
| `tier_code` | VARCHAR(50) | | ✅ | ✅ → TIERS(code) | Tiers concerne |
| `famille_code` | VARCHAR(50) | | ✅ | ✅ → FAMILLES_DEPENSES(code) | Famille de depenses |
| `operation_code` | VARCHAR(50) | | ✅ | ✅ → OPERATIONS(code) | Operation associee |
| `tranche_numero` | VARCHAR(50) | | ✅ | ✅ → TRANCHES(numero) | Tranche associee |
| `montant_engage_ttc` | DECIMAL(15,2) | | | | Montant engage TTC |
| `montant_engage_budgetaire` | DECIMAL(15,2) | | | | Montant engage (budgetaire) |
| `date_effet` | DATE | | | | Date d'effet de l'engagement |
| `date_caducite` | DATE | | | | Date de caducite |
| `date_dernier_mandat` | DATE | | | | Date du dernier mandat |
| `ttc_en_cours_liquidation` | DECIMAL(15,2) | | | | TTC en cours de liquidation |
| `ttc_ordonnance` | DECIMAL(15,2) | | | | TTC ordonnance |
| `ttc_reste_a_realiser` | DECIMAL(15,2) | | | | TTC reste a realiser |
| `ttc_realise` | DECIMAL(15,2) | | | | TTC realise |

**Remarques** :
- Un engagement est lie a une tranche, un tiers, une direction, une famille et une operation
- Un engagement peut etre liquide par une ou plusieurs liquidations
- Un engagement peut couvrir un ou plusieurs services faits
- Les champs `ttc_*` permettent de suivre l'avancement financier

**Recommandations** :
- Verifier que `montant_engage_ttc = ttc_en_cours_liquidation + ttc_ordonnance + ttc_reste_a_realiser + ttc_realise`
- Indexer `direction_code`, `tier_code`, `famille_code`, `operation_code`, `tranche_numero`
- Ajouter des contraintes de validation sur les dates (ex: `date_creation <= date_effet`)

---

### 10. SERVICES_FAITS

**Role** : Table des services effectivement realises (peuvent etre rejetes).

**Fichier source** : `Execution_SERVICES-FAITS.csv`

**Description** : Contient les informations sur les services qui ont ete efectivement executes. Certains services peuvent etre rejetes (en cas d'erreur de forme ou de rejet de facture).

| Colonne | Type | PK | NN | FK | Description |
|---------|------|----|----|----|-------------|
| `id` | INTEGER | ✅ | ✅ | | **Cle primaire auto-incrementée** |
| `objet` | VARCHAR(255) | | | | Objet du service |
| `date_prestations` | DATE | | | | Date des prestations effectuées |
| `direction_gestionnaire_code` | VARCHAR(50) | | ✅ | ✅ → DIRECTIONS(code) | Direction gestionnaire (CdR) |
| `etat` | VARCHAR(50) | | | | Etat (peut inclure "rejeté") |
| `tier_code` | VARCHAR(50) | | ✅ | ✅ → TIERS(code) | Tiers realisateur |
| `engagement_numero` | VARCHAR(50) | | | ✅ → ENGAGEMENTS(numero) | Engagement associe |
| `commande_numero` | VARCHAR(50) | | | ✅ → COMMANDES(numero) | Commande associee |
| `montant` | DECIMAL(15,2) | | | | Montant du service |
| `constateur` | VARCHAR(100) | | | | Personne ayant constate le service |
| `certificateur` | VARCHAR(100) | | | | Personne ayant certifie le service |
| `reference_a_rappeler` | VARCHAR(255) | | | | Reference originale (conservée pour traceabilite) |

**Remarques** :
- Le champ `id` est une cle primaire auto-incrementée pour eviter les problemes avec `reference_a_rappeler` (qui peut etre ambigu)
- Un service fait peut etre lie a un engagement et/ou une commande
- Le champ `etat` peut contenir la valeur "rejeté" pour les services non valides
- Le champ `reference_a_rappeler` est conserve mais n'est pas utilise comme cle

**Recommandations** :
- Ajouter un champ `date_validation` pour les services valides
- Ajouter un champ `motif_rejet` pour les services rejetes
- Indexer `engagement_numero` et `commande_numero`

---

### 11. FACTURES

**Role** : Table des factures emises par les entreprises (peuvent etre rejetees).

**Fichier source** : `Execution_DEMANDES-PAIEMENT_FACTURES.csv`

**Description** : Contient les informations sur les factures emises par les fournisseurs. Certaines factures peuvent etre rejetees (en cas d'erreur ou de non-conformite).

| Colonne | Type | PK | NN | FK | Description |
|---------|------|----|----|----|-------------|
| `annee` | INTEGER | ✅ | ✅ | | **Cle composite** - Annee de la facture |
| `numero` | VARCHAR(50) | ✅ | ✅ | | **Cle composite** - Numero unique de la facture dans l'annee |
| `type` | VARCHAR(50) | | | | Type de facture |
| `reference_externe` | VARCHAR(100) | | | | Reference fournisseur |
| `direction_gestionnaire_code` | VARCHAR(50) | | ✅ | ✅ → DIRECTIONS(code) | Direction gestionnaire (CdR) |
| `jours_depuis_reception` | INTEGER | | | | Nombre de jours depuis la reception |
| `date_reception` | DATE | | | | Date de reception de la facture |
| `objet` | VARCHAR(255) | | | | Objet de la facture |
| `commentaire` | TEXT | | | | Commentaires éventuels |
| `tier_code` | VARCHAR(50) | | ✅ | ✅ → TIERS(code) | Fournisseur emetteur |
| `etat` | VARCHAR(50) | | | | Etat (peut inclure "rejetée") |
| `montant_ttc` | DECIMAL(15,2) | | | | Montant TTC de la facture |
| `date_premiere_liquidation` | DATE | | | | Date de la premiere liquidation |
| `identifiant_cpp` | VARCHAR(100) | | | | Identifiant dans le systeme CPP |
| `cadre_facturation` | VARCHAR(100) | | | | Cadre de facturation |
| `erreur_import_cpp` | BOOLEAN | | | | Indique une erreur lors de l'import depuis CPP |
| `reference_a_rappeler` | VARCHAR(255) | | | | Reference originale (conservée pour traceabilite) |

**Remarques** :
- **Cle primaire composite** : `(annee, numero)` pour garantir l'unicite dans le temps
- Le champ `etat` peut contenir la valeur "rejetée" pour les factures non valides
- Le champ `reference_a_rappeler` peut correspondre partiellement au numero d'engagement (mais n'est pas utilise comme cle etrangere)
- Pas de lien direct avec SERVICES_FAITS (comme indique par l'utilisateur)

**Recommandations** :
- Ajouter un champ `date_emission` (date de la facture par le fournisseur)
- Ajouter un champ `date_echeance` pour le suivi des paiements
- Ajouter un champ `motif_rejet` pour les factures rejetees
- Indexer `tier_code`, `direction_gestionnaire_code`, `date_reception`

---

### 12. LIQUIDATIONS

**Role** : Table des liquidations (paiements effectues).

**Fichier source** : `Execution_LIQUIDATIONS.csv`

**Description** : Contient les informations sur les paiements effectues (liquidations). Une liquidation correspond au paiement effectif d'une depense.

| Colonne | Type | PK | NN | FK | Description |
|---------|------|----|----|----|-------------|
| `numero` | VARCHAR(50) | ✅ | ✅ | | **Cle primaire** - Numero unique de la liquidation |
| `direction_code` | VARCHAR(50) | | ✅ | ✅ → DIRECTIONS(code) | Direction associee (CdR) |
| `objet` | VARCHAR(255) | | | | Objet de la liquidation |
| `engagement_numero` | VARCHAR(50) | | ✅ | ✅ → ENGAGEMENTS(numero) | Engagement liquide |
| `reception` | VARCHAR(50) | | | | Type de reception |
| `etat` | VARCHAR(50) | | | | Etat de la liquidation |
| `montant_ht` | DECIMAL(15,2) | | | | Montant Hors Taxes |
| `montant_tva` | DECIMAL(15,2) | | | | Montant TVA |
| `montant_ttc` | DECIMAL(15,2) | | | | Montant Toutes Taxes Comprises |
| `montant_paye` | DECIMAL(15,2) | | | | Montant effectivement paye |
| `mandat_titre_annulation` | VARCHAR(100) | | | | Mandat ou titre d'annulation |
| `montant_annule` | DECIMAL(15,2) | | | | Montant annule |
| `tier_code` | VARCHAR(50) | | ✅ | ✅ → TIERS(code) | Tiers beneficiaire |
| `raison_sociale` | VARCHAR(255) | | | | Raison sociale (denormalisee pour facilite) |
| `reference_externe` | VARCHAR(100) | | | | Reference externe |
| `code_regroupement` | VARCHAR(50) | | | | Code de regroupement |
| `numero_piece` | VARCHAR(50) | | | | Numero de piece comptable |
| `numero_bordereau` | VARCHAR(50) | | | | Numero de bordereau journal |
| `date_paiement_proposee` | DATE | | | | Date de paiement proposee |
| `date_piece` | DATE | | | | Date de la piece |
| `date_prise_en_charge` | DATE | | | | Date de prise en charge |
| `date_paiement` | DATE | | | | Date effective de paiement |
| `numero_inventaire` | VARCHAR(50) | | | | Numero d'inventaire |
| `reference_bancaire` | VARCHAR(100) | | | | Reference bancaire |
| `imputation_comptable` | VARCHAR(100) | | | | Imputation comptable |
| `acompte_marche_numero` | VARCHAR(50) | | | | **Partie 1** - Marche de l'acompte |
| `acompte_numero` | VARCHAR(50) | | | ✅ → ACOMPTES(marche_numero, numero) | **Partie 2** - Numero de l'acompte |

**Remarques** :
- Une liquidation est liee a un engagement (obligatoire)
- Une liquidation peut etre liee a un acompte (via la cle composite `acompte_marche_numero` + `acompte_numero`)
- Le champ `raison_sociale` est denormalise (duplique depuis TIERS) pour faciliter les requetes
- Les champs `montant_*` permettent de suivre le detail financier

**Recommandations** :
- Verifier que `montant_ttc = montant_ht + montant_tva`
- Ajouter des contraintes de validation sur les dates
- Indexer `engagement_numero`, `tier_code`, `direction_code`, `date_paiement`
- Considerer la creation d'une table separate pour les imputations comptables

---

## Relations entre les Tables

### Diagramme des Dependances

```
DIRECTIONS
    │
    ├── TIERS
    │   │
    │   ├── MARCHES
    │   │   │
    │   │   ├── COMMANDES
    │   │   │   │
    │   │   │   └── SERVICES_FAITS
    │   │   │
    │   │   └── ACOMPTES
    │   │       └── LIQUIDATIONS
    │   │
    │   ├── ENGAGEMENTS
    │   │   │
    │   │   ├── LIQUIDATIONS
    │   │   └── SERVICES_FAITS
    │   │
    │   ├── FACTURES
    │   └── LIQUIDATIONS
    │
    ├── MARCHES
    ├── TRANCHES
    │   └── ENGAGEMENTS
    ├── SERVICES_FAITS
    └── LIQUIDATIONS

OPERATIONS
    │
    ├── TRANCHES
    └── ENGAGEMENTS

FAMILLES_DEPENSES
    └── ENGAGEMENTS
```

### Resume des Relations

| Table Source | Table Cible | Cardinalite | Cle Etangere |
|--------------|-------------|-------------|--------------|
| DIRECTIONS | TIERS | 1:N | `direction_code` |
| DIRECTIONS | MARCHES | 1:N | `direction_code` |
| DIRECTIONS | TRANCHES | 1:N | `direction_gestionnaire_code`, `direction_engagement_code` |
| DIRECTIONS | ENGAGEMENTS | 1:N | `direction_code` |
| DIRECTIONS | SERVICES_FAITS | 1:N | `direction_gestionnaire_code` |
| DIRECTIONS | FACTURES | 1:N | `direction_gestionnaire_code` |
| DIRECTIONS | LIQUIDATIONS | 1:N | `direction_code` |
| OPERATIONS | TRANCHES | 1:N | `operation_code` |
| OPERATIONS | ENGAGEMENTS | 1:N | `operation_code` |
| FAMILLES_DEPENSES | ENGAGEMENTS | 1:N | `famille_code` |
| TIERS | MARCHES | 1:N | `tier_code` |
| TIERS | COMMANDES | 1:N | `tier_code` |
| TIERS | ENGAGEMENTS | 1:N | `tier_code` |
| TIERS | LIQUIDATIONS | 1:N | `tier_code` |
| TIERS | FACTURES | 1:N | `tier_code` |
| TIERS | SERVICES_FAITS | 1:N | `tier_code` |
| MARCHES | COMMANDES | 1:N | `marche_numero` |
| MARCHES | ACOMPTES | 1:N | `marche_numero` |
| COMMANDES | SERVICES_FAITS | 1:N | `commande_numero` |
| COMMANDES | ACOMPTES | 1:N | `commande_numero` |
| TRANCHES | ENGAGEMENTS | 1:N | `tranche_numero` |
| ENGAGEMENTS | LIQUIDATIONS | 1:N | `engagement_numero` |
| ENGAGEMENTS | SERVICES_FAITS | 1:N | `engagement_numero` |
| ACOMPTES | LIQUIDATIONS | 1:N | `acompte_marche_numero` + `acompte_numero` |

---

## Remarques et Recommandations

### Remarques Generales

1. **Encodage des Donnees** :
   - Les fichiers CSV utilisent le point-virgule (`;`) comme separateur
   - Les fichiers peuvent contenir des caracteres speciaux (accents, etc.)
   - Il est necessaire de nettoyer les donnees avant import (normalisation des encodages)

2. **Champ "Reference a rappeler"** :
   - Ce champ est present dans plusieurs tables mais **n'est pas utilise comme cle primaire ou etrangere**
   - Sa signification varie selon les tables (parfois UUID, parfois reference a un engagement)
   - Il est conserve comme champ de donnees pour la traceabilite

3. **Services Faits et Factures Rejetees** :
   - Les tables `SERVICES_FAITS` et `FACTURES` peuvent contenir des enregistrements avec `etat = "rejeté(e)"`
   - Il est important de prevoir des requetes pour identifier et analyser ces rejets

4. **Lien entre FACTURES et SERVICES_FAITS** :
   - **Pas de lien direct** entre ces deux tables (comme indique par l'utilisateur)
   - Si un lien doit etre etabli plus tard, il faudra ajouter un champ de reference

5. **Cle Composite pour ACOMPTES** :
   - La cle primaire de `ACOMPTES` est composite : `(marche_numero, numero)`
   - Cela permet d'avoir plusieurs acomptes avec le meme numero dans des marches differentes

6. **Cle Composite pour FACTURES** :
   - La cle primaire de `FACTURES` est composite : `(annee, numero)`
   - Cela garantit l'unicite des numeros de facture dans une annee donnee

7. **Cle Auto-incrementée pour SERVICES_FAITS** :
   - La table `SERVICES_FAITS` utilise une cle primaire auto-incrementée (`id`)
   - Cela evite les problemes avec le champ `reference_a_rappeler` qui peut etre ambigu

---

### Recommandations d'Implementation

#### Pour la Base de Donnees

1. **Indexation** :
   - Creer des index sur toutes les cles etrangeres pour ameliorer les performances
   - Creer des index sur les colonnes utilisees frequemment dans les requetes WHERE

2. **Contraintes** :
   - Ajouter des contraintes CHECK pour valider les valeurs (ex: `montant_ttc >= 0`)
   - Ajouter des contraintes NOT NULL sur les champs obligatoires

3. **Normalisation** :
   - Le schema est deja normalise a la 3e forme normale (3NF)
   - Les tables de reference (DIRECTIONS, OPERATIONS, FAMILLES_DEPENSES) evitent la duplication

4. **Denormalisation** :
   - Le champ `raison_sociale` dans `LIQUIDATIONS` est denormalise pour faciliter les requetes
   - Cela peut etre optimise si les performances le necessitent

#### Pour l'Import des Donnees

1. **Ordre d'Import** :
   - Importer d'abord les tables de reference (DIRECTIONS, OPERATIONS, FAMILLES_DEPENSES)
   - Puis les tables principales dans l'ordre des dependances :
     1. TIERS
     2. MARCHES
     3. COMMANDES
     4. TRANCHES
     5. ACOMPTES
     6. ENGAGEMENTS
     7. SERVICES_FAITS
     8. FACTURES
     9. LIQUIDATIONS

2. **Nettoyage des Donnees** :
   - Normaliser les chaines de caracteres (supprimer les espaces, normaliser la casse)
   - Convertir les valeurs monetaires en format numerique
   - Convertir les dates au format ISO (YYYY-MM-DD)
   - Gerer les valeurs manquantes (NULL vs chaines vides)

3. **Validation** :
   - Verifier que toutes les cles etrangeres existent avant l'insertion
   - Journaliser les erreurs d'import pour analyse

#### Pour les Requetes

1. **Requetes de Base** :
   - Selection simple par cle primaire
   - Selection avec filtrage par etat, date, montants

2. **Requetes avec Jointures** :
   - Utiliser des jointures INNER pour les relations obligatoires
   - Utiliser des jointures LEFT pour les relations optionnelles

3. **Requetes d'Aggregation** :
   - Calculer des totaux par direction, tiers, marche, etc.
   - Utiliser GROUP BY et les fonctions d'agregation (SUM, COUNT, AVG)

4. **Requetes de Suivi** :
   - Suivre l'avancement des engagements (ttc_realise / ttc_engage)
   - Identifier les retards de paiement
   - Detecter les anomalies (montants negatifs, dates incoherentes)

---

### Exemples de Contraintes SQL

```sql
-- Exemple de contrainte CHECK pour les montants
CONSTRAINT chk_montant_positif CHECK (montant_ttc >= 0)

-- Exemple de contrainte CHECK pour les dates
CONSTRAINT chk_dates_engagement CHECK (date_creation <= date_effet)

-- Exemple de contrainte UNIQUE
CONSTRAINT uq_tiers_code UNIQUE (code)
```

---

### Exemples de Requetes de Validation

```sql
-- Verifier l'integrite des cles etrangeres
SELECT COUNT(*) FROM ENGAGEMENTS WHERE tranche_numero NOT IN (SELECT numero FROM TRANCHES);

-- Verifier les montants negatifs
SELECT * FROM FACTURES WHERE montant_ttc < 0;

-- Verifier les dates incoherentes
SELECT * FROM ENGAGEMENTS WHERE date_creation > date_effet;
```

---

## Annexes

### A. Correspondance Fichiers CSV ↔ Tables

| Fichier CSV | Table | Cle Primaire |
|------------|-------|--------------|
| `Execution_TIERS.csv` | TIERS | `code` |
| `Execution_COMMANDES.csv` | COMMANDES | `numero` |
| `Execution_ENGAGEMENTS.csv` | ENGAGEMENTS | `numero` |
| `Execution_LIQUIDATIONS.csv` | LIQUIDATIONS | `numero` |
| `Execution_SERVICES-FAITS.csv` | SERVICES_FAITS | `id` (auto) |
| `Execution_TRANCHES.csv` | TRANCHES | `numero` |
| `Execution_DEMANDES-PAIEMENT_FACTURES.csv` | FACTURES | `(annee, numero)` |
| `Marches_MARCHES.csv` | MARCHES | `numero` |
| `Marches_ACOMPTES.csv` | ACOMPTES | `(marche_numero, numero)` |

### B. Champs Ignores ou Renommes

| Fichier CSV | Champ Original | Action | Raison |
|-------------|----------------|--------|--------|
| Tous | "Référence à rappeler" | Renomme en `reference_a_rappeler` | Normalisation |
| Tous | Champs avec accents | Renommes sans accents | Compatibilite SQL |
| Tous | Espaces dans les noms | Renommes avec underscores | Convention SQL |

### C. Types de Donnees

| Type SQL | Utilisation | Exemple |
|----------|--------------|---------|
| VARCHAR(n) | Textes | `libelle`, `code` |
| INTEGER | Entiers | `annee`, `jours_depuis_reception` |
| DECIMAL(15,2) | Montants | `montant_ttc`, `montant_ht` |
| DATE | Dates | `date_creation`, `date_paiement` |
| BOOLEAN | Vrai/Faux | `etranger`, `bloque` |
| TEXT | Textes longs | `commentaire` |
| SERIAL | Cle auto-incrementée | `id` (SERVICES_FAITS) |

---

*Document genere le 29/07/2026 pour le projet Budget Pilotage Financier Marches*
