-- ============================================================================
-- ELD TRANSPORTS & ÉNERGIE — ERP GMAO Atelier
-- Fichier : 001_create_gmao_tables.sql
-- Serveur : OVH cluster123 — BDD : eldtranstgbc (MySQL 8.4)
-- Domaine : gmao.eldtransports.com
-- ============================================================================
-- Ce script crée les 4 nouvelles tables du module GMAO.
-- Il NE MODIFIE PAS les 5 tables BC existantes :
--   users, bons_commande, camions, catalogue, catalogue_alertes
--
-- Les clés étrangères pointent vers ces tables existantes.
-- Exécuter une seule fois lors du déploiement initial.
-- ============================================================================


-- ────────────────────────────────────────────────────────────────────────────
-- 0. MIGRATION SÉCURISÉE : ajout du rôle 'mecanicien' dans users.role
-- ────────────────────────────────────────────────────────────────────────────
-- La table users existante a role ENUM('admin','approbateur','chef_atelier').
-- Le GMAO nécessite le rôle 'mecanicien'. Cette modification est la SEULE
-- altération d'une table BC existante, et elle est rétro-compatible :
-- les valeurs existantes restent valides, aucune donnée n'est perdue.
-- Si le rôle 'mecanicien' a déjà été ajouté (via le BC), cette commande
-- est idempotente — MySQL conserve les valeurs existantes.
-- ────────────────────────────────────────────────────────────────────────────
ALTER TABLE `users`
  MODIFY COLUMN `role` ENUM('admin','approbateur','chef_atelier','mecanicien')
  NOT NULL DEFAULT 'chef_atelier'
  COMMENT 'Rôle utilisateur — mecanicien ajouté pour le GMAO';


-- ════════════════════════════════════════════════════════════════════════════
-- TABLE 1 : mecaniciens
-- ════════════════════════════════════════════════════════════════════════════
-- Données métier spécifiques aux mécaniciens de l'atelier.
-- Chaque mécanicien est lié à un compte users (auth partagée avec BC).
-- Stocke : compétences, certifications, taux horaire, disponibilité.
-- ════════════════════════════════════════════════════════════════════════════
CREATE TABLE IF NOT EXISTS `mecaniciens` (

  `id`              INT             AUTO_INCREMENT PRIMARY KEY
                                    COMMENT 'ID interne mécanicien',

  `user_id`         INT             NOT NULL
                                    COMMENT 'FK → users.id — compte d authentification lié',

  `matricule`       VARCHAR(20)     DEFAULT NULL
                                    COMMENT 'Matricule interne ELD (ex: MEC-001)',

  `telephone`       VARCHAR(20)     DEFAULT NULL
                                    COMMENT 'Téléphone portable direct',

  `specialites`     TEXT            DEFAULT NULL
                                    COMMENT 'Spécialités : mécanique PL, électricité, hydraulique, pneumatique...',

  `certifications`  JSON            DEFAULT NULL
                                    COMMENT 'Habilitations et certifications au format JSON :
                                    [{"nom":"ADR","expire":"2026-12-31"},
                                     {"nom":"Habilitation électrique B2V","expire":"2027-06-15"}]',

  `taux_horaire`    DECIMAL(8,2)    DEFAULT 35.00
                                    COMMENT 'Taux horaire brut pour calcul coût main d oeuvre sur OT (€/h)',

  `date_entree`     DATE            DEFAULT NULL
                                    COMMENT 'Date d entrée dans l entreprise',

  `actif`           TINYINT(1)      DEFAULT 1
                                    COMMENT '1=actif, 0=inactif (ne reçoit plus d OT)',

  `notes`           TEXT            DEFAULT NULL
                                    COMMENT 'Notes libres (restrictions médicales, préférences, etc.)',

  `created_at`      TIMESTAMP       DEFAULT CURRENT_TIMESTAMP
                                    COMMENT 'Date de création de la fiche',

  `updated_at`      TIMESTAMP       DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
                                    COMMENT 'Dernière modification',

  -- Contraintes
  UNIQUE KEY `uk_mecaniciens_user`  (`user_id`),
  UNIQUE KEY `uk_mecaniciens_mat`   (`matricule`),

  CONSTRAINT `fk_mecaniciens_user`
    FOREIGN KEY (`user_id`) REFERENCES `users`(`id`)
    ON DELETE CASCADE ON UPDATE CASCADE

) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci
  COMMENT='Fiches métier des mécaniciens — données spécifiques atelier';


-- ════════════════════════════════════════════════════════════════════════════
-- TABLE 2 : ot (Ordres de Travail)
-- ════════════════════════════════════════════════════════════════════════════
-- Cœur du module GMAO : chaque intervention sur un véhicule = 1 OT.
-- Lié à : camions (véhicule), mecaniciens (assignation), bons_commande (achats),
--          users (créateur), et potentiellement à ELD Inspector (email auto).
-- Workflow : ouvert → en_cours → en_attente_pieces → termine → cloture
-- ════════════════════════════════════════════════════════════════════════════
CREATE TABLE IF NOT EXISTS `ot` (

  `id`                    INT             AUTO_INCREMENT PRIMARY KEY
                                          COMMENT 'ID interne OT',

  `numero`                VARCHAR(20)     NOT NULL
                                          COMMENT 'Numéro unique affiché — format OT-YYYYMMDD-XXX',

  -- ── Véhicule concerné ──
  `camion_id`             INT             DEFAULT NULL
                                          COMMENT 'FK → camions.id — véhicule en intervention',

  `km_vehicule`           INT             DEFAULT NULL
                                          COMMENT 'Kilométrage du véhicule au moment de l OT',

  -- ── Classification ──
  `type_intervention`     ENUM('curatif','preventif','amelioratif','reglementaire')
                          NOT NULL DEFAULT 'curatif'
                          COMMENT 'curatif=panne, preventif=planifié, amelioratif=amélioration, reglementaire=CT/tachy/ADR',

  `priorite`              ENUM('critique','haute','normale','basse')
                          NOT NULL DEFAULT 'normale'
                          COMMENT 'Niveau d urgence — critique=camion immobilisé',

  `statut`                ENUM('ouvert','en_cours','en_attente_pieces','termine','cloture','annule')
                          NOT NULL DEFAULT 'ouvert'
                          COMMENT 'Cycle de vie de l OT :
                          ouvert → en_cours → termine → cloture
                          en_attente_pieces = bloqué faute de stock',

  -- ── Description du problème ──
  `titre`                 VARCHAR(255)    NOT NULL
                                          COMMENT 'Titre court du problème (ex: Fuite huile moteur)',

  `description`           TEXT            DEFAULT NULL
                                          COMMENT 'Description détaillée de la panne / intervention',

  `origine`               ENUM('chauffeur','atelier','eld_inspector','preventif')
                          NOT NULL DEFAULT 'atelier'
                          COMMENT 'Source du signalement :
                          chauffeur=signalé par conducteur,
                          atelier=constaté par chef/mécanicien,
                          eld_inspector=email automatique IMAP,
                          preventif=généré par plan de maintenance',

  `signale_par`           VARCHAR(200)    DEFAULT NULL
                                          COMMENT 'Nom de la personne ayant signalé la panne',

  -- ── Assignation ──
  `mecanicien_id`         INT             DEFAULT NULL
                                          COMMENT 'FK → mecaniciens.id — mécanicien assigné',

  -- ── Dates de suivi ──
  `date_creation`         DATETIME        NOT NULL DEFAULT CURRENT_TIMESTAMP
                                          COMMENT 'Date de création de l OT',

  `date_planifiee`        DATE            DEFAULT NULL
                                          COMMENT 'Date planifiée de l intervention (planning atelier)',

  `date_debut`            DATETIME        DEFAULT NULL
                                          COMMENT 'Date/heure de début réel de l intervention',

  `date_fin`              DATETIME        DEFAULT NULL
                                          COMMENT 'Date/heure de fin réelle de l intervention',

  `date_cloture`          DATETIME        DEFAULT NULL
                                          COMMENT 'Date de clôture administrative de l OT',

  -- ── Temps et coûts ──
  `temps_estime_heures`   DECIMAL(5,2)    DEFAULT NULL
                                          COMMENT 'Durée estimée en heures (pour le planning)',

  `temps_reel_heures`     DECIMAL(5,2)    DEFAULT NULL
                                          COMMENT 'Durée réelle pointée par le mécanicien',

  `cout_pieces`           DECIMAL(10,2)   DEFAULT 0.00
                                          COMMENT 'Coût total des pièces utilisées (calculé depuis stock_pieces)',

  `cout_mo`               DECIMAL(10,2)   DEFAULT 0.00
                                          COMMENT 'Coût main d oeuvre = temps_reel × taux_horaire mécanicien',

  `cout_externe`          DECIMAL(10,2)   DEFAULT 0.00
                                          COMMENT 'Coût prestataire externe si sous-traitance',

  `cout_total`            DECIMAL(10,2)   DEFAULT 0.00
                                          COMMENT 'Coût total OT = pieces + MO + externe',

  -- ── Liens avec d autres entités ──
  `bc_ids`                JSON            DEFAULT NULL
                                          COMMENT 'Liste des ID de bons de commande liés :
                                          ["abc123def","xyz789ghi"]
                                          → FK logique vers bons_commande.id',

  `pieces_utilisees`      JSON            DEFAULT NULL
                                          COMMENT 'Pièces sorties du stock pour cet OT :
                                          [{"stock_id":12,"qte":2,"prix_u":45.50},...]',

  -- ── Médias et documents ──
  `photos`                JSON            DEFAULT NULL
                                          COMMENT 'Chemins des photos prises sur l OT :
                                          ["photos_ot/OT-20260325-001/img1.jpg",...]',

  -- ── Commentaires ──
  `commentaire_mecanicien` TEXT           DEFAULT NULL
                                          COMMENT 'Observations du mécanicien pendant l intervention',

  `commentaire_cloture`   TEXT            DEFAULT NULL
                                          COMMENT 'Commentaire de clôture (chef atelier ou admin)',

  -- ── ELD Inspector (email automatique) ──
  `email_source`          TEXT            DEFAULT NULL
                                          COMMENT 'Contenu brut de l email si OT créé via ELD Inspector
                                          (scraping IMAP de panne@eld-transports.com)',

  `email_uid`             VARCHAR(100)    DEFAULT NULL
                                          COMMENT 'UID IMAP de l email source — évite les doublons',

  -- ── Traçabilité ──
  `created_by`            INT             DEFAULT NULL
                                          COMMENT 'FK → users.id — utilisateur ayant créé l OT',

  `cloture_by`            INT             DEFAULT NULL
                                          COMMENT 'FK → users.id — utilisateur ayant clôturé l OT',

  `created_at`            TIMESTAMP       DEFAULT CURRENT_TIMESTAMP,

  `updated_at`            TIMESTAMP       DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,

  -- ── Index et contraintes ──
  UNIQUE KEY `uk_ot_numero`       (`numero`),
  KEY `idx_ot_statut`             (`statut`),
  KEY `idx_ot_camion`             (`camion_id`),
  KEY `idx_ot_mecanicien`         (`mecanicien_id`),
  KEY `idx_ot_date_creation`      (`date_creation`),
  KEY `idx_ot_date_planifiee`     (`date_planifiee`),
  KEY `idx_ot_type`               (`type_intervention`),
  KEY `idx_ot_priorite`           (`priorite`),
  KEY `idx_ot_origine`            (`origine`),
  KEY `idx_ot_email_uid`          (`email_uid`),

  CONSTRAINT `fk_ot_camion`
    FOREIGN KEY (`camion_id`) REFERENCES `camions`(`id`)
    ON DELETE SET NULL ON UPDATE CASCADE,

  CONSTRAINT `fk_ot_mecanicien`
    FOREIGN KEY (`mecanicien_id`) REFERENCES `mecaniciens`(`id`)
    ON DELETE SET NULL ON UPDATE CASCADE,

  CONSTRAINT `fk_ot_created_by`
    FOREIGN KEY (`created_by`) REFERENCES `users`(`id`)
    ON DELETE SET NULL ON UPDATE CASCADE,

  CONSTRAINT `fk_ot_cloture_by`
    FOREIGN KEY (`cloture_by`) REFERENCES `users`(`id`)
    ON DELETE SET NULL ON UPDATE CASCADE

) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci
  COMMENT='Ordres de Travail — interventions sur véhicules de la flotte ELD';


-- ════════════════════════════════════════════════════════════════════════════
-- TABLE 3 : stock_pieces
-- ════════════════════════════════════════════════════════════════════════════
-- Inventaire des pièces détachées de l'atelier.
-- Chaque référence = 1 ligne. Les mouvements (entrée/sortie) sont tracés
-- dans les champs JSON et via les OT liés.
-- Code-barres : existant fournisseur ou généré par le GMAO.
-- ════════════════════════════════════════════════════════════════════════════
CREATE TABLE IF NOT EXISTS `stock_pieces` (

  `id`                    INT             AUTO_INCREMENT PRIMARY KEY
                                          COMMENT 'ID interne pièce',

  `reference`             VARCHAR(100)    NOT NULL
                                          COMMENT 'Référence fabricant ou interne (ex: FIL-HYD-001)',

  `designation`           VARCHAR(255)    NOT NULL
                                          COMMENT 'Nom complet de la pièce (ex: Filtre hydraulique Mann H12110/2)',

  `code_barres`           VARCHAR(128)    DEFAULT NULL
                                          COMMENT 'Code-barres fournisseur ou généré par le GMAO
                                          (EAN-13, Code128, ou interne ELD-XXXXX)',

  `categorie`             VARCHAR(100)    DEFAULT NULL
                                          COMMENT 'Catégorie : Filtration, Freinage, Éclairage, Moteur, Transmission...',

  `emplacement`           VARCHAR(100)    DEFAULT NULL
                                          COMMENT 'Localisation physique dans l atelier (ex: Étagère A3, Bac 12)',

  -- ── Stock et seuils ──
  `quantite`              INT             NOT NULL DEFAULT 0
                                          COMMENT 'Quantité actuellement en stock',

  `seuil_alerte`          INT             NOT NULL DEFAULT 0
                                          COMMENT 'Seuil min de réapprovisionnement — alerte si quantite <= seuil',

  `quantite_max`          INT             DEFAULT NULL
                                          COMMENT 'Stock maximum recommandé (optionnel)',

  `unite`                 VARCHAR(20)     DEFAULT 'pièce'
                                          COMMENT 'Unité de mesure : pièce, litre, mètre, kg...',

  -- ── Prix et fournisseur ──
  `prix_unitaire_ht`      DECIMAL(10,2)   DEFAULT 0.00
                                          COMMENT 'Dernier prix d achat unitaire HT',

  `fournisseur_principal` VARCHAR(255)    DEFAULT NULL
                                          COMMENT 'Fournisseur habituel (ex: ASPARTS, ESCOVI, MCT...)',

  -- ── Compatibilité véhicules ──
  `compatible_vehicules`  JSON            DEFAULT NULL
                                          COMMENT 'Modèles de véhicules compatibles :
                                          ["IVECO Stralis","RENAULT T480","SCANIA R450"]',

  -- ── Historique mouvements ──
  `dernier_mouvement`     DATETIME        DEFAULT NULL
                                          COMMENT 'Date du dernier mouvement (entrée ou sortie)',

  `historique_mouvements` JSON            DEFAULT NULL
                                          COMMENT 'Derniers mouvements (les 50 derniers) :
                                          [{"type":"sortie","qte":2,"ot_id":45,"date":"2026-03-25","par":"Ramtane"},
                                           {"type":"entree","qte":10,"bc_id":"abc123","date":"2026-03-20","par":"Admin"}]',

  -- ── Métadonnées ──
  `actif`                 TINYINT(1)      DEFAULT 1
                                          COMMENT '1=référence active, 0=obsolète/supprimée',

  `notes`                 TEXT            DEFAULT NULL
                                          COMMENT 'Notes libres (équivalences, précautions, etc.)',

  `created_at`            TIMESTAMP       DEFAULT CURRENT_TIMESTAMP,

  `updated_at`            TIMESTAMP       DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,

  -- ── Index ──
  UNIQUE KEY `uk_stock_reference`   (`reference`),
  KEY `idx_stock_code_barres`       (`code_barres`),
  KEY `idx_stock_categorie`         (`categorie`),
  KEY `idx_stock_fournisseur`       (`fournisseur_principal`),
  KEY `idx_stock_alerte`            (`quantite`, `seuil_alerte`)

) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci
  COMMENT='Inventaire des pièces détachées atelier — stock avec seuils et code-barres';


-- ════════════════════════════════════════════════════════════════════════════
-- TABLE 4 : factures_fournisseurs
-- ════════════════════════════════════════════════════════════════════════════
-- Factures reçues des fournisseurs. Chaque facture peut être rapprochée
-- d'un ou plusieurs bons de commande BC existants.
-- Le PDF original est stocké sur le serveur (chemin dans fichier_pdf).
-- L'OCR IA extrait les données du PDF pour pré-remplissage.
-- ════════════════════════════════════════════════════════════════════════════
CREATE TABLE IF NOT EXISTS `factures_fournisseurs` (

  `id`                    INT             AUTO_INCREMENT PRIMARY KEY
                                          COMMENT 'ID interne facture',

  `numero_facture`        VARCHAR(100)    NOT NULL
                                          COMMENT 'Numéro de facture tel qu imprimé par le fournisseur',

  `fournisseur`           VARCHAR(255)    NOT NULL
                                          COMMENT 'Nom du fournisseur (ex: ASPARTS, ESCOVI, MCT, CASSES...)',

  -- ── Dates ──
  `date_facture`          DATE            NOT NULL
                                          COMMENT 'Date d émission de la facture',

  `date_echeance`         DATE            DEFAULT NULL
                                          COMMENT 'Date d échéance de paiement',

  `date_reception`        DATE            DEFAULT NULL
                                          COMMENT 'Date de réception physique de la facture',

  -- ── Montants ──
  `montant_ht`            DECIMAL(10,2)   NOT NULL DEFAULT 0.00
                                          COMMENT 'Montant hors taxes',

  `montant_tva`           DECIMAL(10,2)   DEFAULT 0.00
                                          COMMENT 'Montant de la TVA',

  `montant_ttc`           DECIMAL(10,2)   DEFAULT 0.00
                                          COMMENT 'Montant TTC = HT + TVA',

  `taux_tva`              DECIMAL(4,2)    DEFAULT 20.00
                                          COMMENT 'Taux de TVA applicable (20% par défaut)',

  -- ── Statut et workflow ──
  `statut`                ENUM('recue','validee','rapprochee','payee','litige')
                          NOT NULL DEFAULT 'recue'
                          COMMENT 'Cycle de vie :
                          recue → validee → rapprochee (liée à un BC) → payee
                          litige = écart de montant ou problème',

  -- ── Rapprochement avec BC ──
  `bc_ids`                JSON            DEFAULT NULL
                                          COMMENT 'IDs des bons de commande rapprochés :
                                          ["abc123def","xyz789ghi"]
                                          → FK logique vers bons_commande.id',

  `ecart_montant`         DECIMAL(10,2)   DEFAULT NULL
                                          COMMENT 'Écart entre montant facture et total BC rapproché
                                          (positif = facture > BC, négatif = facture < BC)',

  -- ── Document PDF ──
  `fichier_pdf`           VARCHAR(500)    DEFAULT NULL
                                          COMMENT 'Chemin relatif du fichier PDF uploadé
                                          (ex: factures/2026/03/ESCOVI_FAC-2026-0142.pdf)',

  `ocr_data`              JSON            DEFAULT NULL
                                          COMMENT 'Données extraites par OCR IA (OpenAI GPT-4o) :
                                          {"fournisseur":"ESCOVI","numero":"FAC-2026-0142",
                                           "date":"2026-03-15","montant_ht":1250.00,
                                           "lignes":[{"ref":"FH-123","qte":5,"pu":45.00}],
                                           "confiance":0.95}',

  -- ── Lignes de détail ──
  `lignes`                JSON            DEFAULT NULL
                                          COMMENT 'Détail des lignes de la facture :
                                          [{"reference":"FH-123","designation":"Filtre","qte":5,
                                            "prix_unitaire":45.00,"total":225.00}]',

  -- ── Commentaires et validation ──
  `commentaire`           TEXT            DEFAULT NULL
                                          COMMENT 'Notes / observations sur la facture',

  `validee_par`           INT             DEFAULT NULL
                                          COMMENT 'FK → users.id — qui a validé la facture',

  `validee_at`            DATETIME        DEFAULT NULL
                                          COMMENT 'Date/heure de validation',

  `rapprochee_par`        INT             DEFAULT NULL
                                          COMMENT 'FK → users.id — qui a fait le rapprochement BC',

  `rapprochee_at`         DATETIME        DEFAULT NULL
                                          COMMENT 'Date/heure du rapprochement',

  -- ── Traçabilité ──
  `created_by`            INT             DEFAULT NULL
                                          COMMENT 'FK → users.id — qui a saisi/uploadé la facture',

  `created_at`            TIMESTAMP       DEFAULT CURRENT_TIMESTAMP,

  `updated_at`            TIMESTAMP       DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,

  -- ── Index et contraintes ──
  KEY `idx_fact_fournisseur`     (`fournisseur`),
  KEY `idx_fact_statut`          (`statut`),
  KEY `idx_fact_date`            (`date_facture`),
  KEY `idx_fact_echeance`        (`date_echeance`),
  KEY `idx_fact_numero`          (`numero_facture`),

  CONSTRAINT `fk_fact_validee_par`
    FOREIGN KEY (`validee_par`) REFERENCES `users`(`id`)
    ON DELETE SET NULL ON UPDATE CASCADE,

  CONSTRAINT `fk_fact_rapprochee_par`
    FOREIGN KEY (`rapprochee_par`) REFERENCES `users`(`id`)
    ON DELETE SET NULL ON UPDATE CASCADE,

  CONSTRAINT `fk_fact_created_by`
    FOREIGN KEY (`created_by`) REFERENCES `users`(`id`)
    ON DELETE SET NULL ON UPDATE CASCADE

) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci
  COMMENT='Factures fournisseurs — upload PDF, OCR, rapprochement BC, suivi paiement';


-- ════════════════════════════════════════════════════════════════════════════
-- VUES UTILITAIRES (optionnel — facilite les requêtes courantes)
-- ════════════════════════════════════════════════════════════════════════════

-- Vue : OT en cours avec infos véhicule et mécanicien
CREATE OR REPLACE VIEW `v_ot_en_cours` AS
SELECT
  ot.id,
  ot.numero,
  ot.titre,
  ot.statut,
  ot.priorite,
  ot.type_intervention,
  ot.date_creation,
  ot.date_planifiee,
  ot.temps_estime_heures,
  c.immatriculation   AS camion_immat,
  c.marque             AS camion_marque,
  c.modele             AS camion_modele,
  CONCAT(u_mec.prenom, ' ', u_mec.nom) AS mecanicien_nom,
  CONCAT(u_cre.prenom, ' ', u_cre.nom) AS cree_par_nom
FROM `ot`
LEFT JOIN `camions`     c     ON ot.camion_id     = c.id
LEFT JOIN `mecaniciens` m     ON ot.mecanicien_id  = m.id
LEFT JOIN `users`       u_mec ON m.user_id         = u_mec.id
LEFT JOIN `users`       u_cre ON ot.created_by     = u_cre.id
WHERE ot.statut IN ('ouvert','en_cours','en_attente_pieces');

-- Vue : Alertes stock (pièces sous le seuil)
CREATE OR REPLACE VIEW `v_stock_alertes` AS
SELECT
  sp.id,
  sp.reference,
  sp.designation,
  sp.quantite,
  sp.seuil_alerte,
  sp.fournisseur_principal,
  sp.prix_unitaire_ht,
  (sp.seuil_alerte - sp.quantite) AS deficit
FROM `stock_pieces` sp
WHERE sp.actif = 1
  AND sp.quantite <= sp.seuil_alerte
ORDER BY deficit DESC;

-- Vue : Factures en attente (non payées, non rapprochées)
CREATE OR REPLACE VIEW `v_factures_en_attente` AS
SELECT
  f.id,
  f.numero_facture,
  f.fournisseur,
  f.date_facture,
  f.date_echeance,
  f.montant_ht,
  f.montant_ttc,
  f.statut,
  DATEDIFF(CURDATE(), f.date_echeance) AS jours_retard
FROM `factures_fournisseurs` f
WHERE f.statut IN ('recue','validee')
ORDER BY f.date_echeance ASC;


-- ════════════════════════════════════════════════════════════════════════════
-- FIN DU SCRIPT
-- ════════════════════════════════════════════════════════════════════════════
-- Tables créées : mecaniciens, ot, stock_pieces, factures_fournisseurs
-- Vues créées   : v_ot_en_cours, v_stock_alertes, v_factures_en_attente
-- ════════════════════════════════════════════════════════════════════════════
