/* ============================================================
   MASTER INSTALL SQL - blitech_facturation_dev
   ============================================================ */

-- 000_database.sql
DROP DATABASE IF EXISTS blitech_facturation_dev;

CREATE DATABASE blitech_facturation_dev
  CHARACTER SET utf8mb4
  COLLATE utf8mb4_unicode_ci;

USE blitech_facturation_dev;


-- 010_reset_schema.sql
USE blitech_facturation_dev;


DROP TABLE IF EXISTS import_lignes_factures;     -- si elle existe
DROP TABLE IF EXISTS import_factures;            -- si elle existe


/* ============================================================
   100_entites.sql
   ============================================================ */

USE blitech_facturation_dev;

CREATE TABLE entites (
  -- Identifiant technique
  id             CHAR(36)     NOT NULL,

  -- Code interne court
  code           VARCHAR(50)  NOT NULL,          -- ex : 'BLITECH', 'WAKAN'

  -- Nom affiché sur les docs
  nom_affichage  VARCHAR(255) NOT NULL,          -- ex : 'Blitech', 'Association Wakan'

  -- Identité juridique
  raison_sociale  VARCHAR(255) DEFAULT NULL,     -- nom légal complet si différent
  forme_juridique VARCHAR(100) DEFAULT NULL,     -- ex : 'EI', 'SASU', 'Association loi 1901'

  siret    VARCHAR(32)  DEFAULT NULL,      -- SIREN ou SIRET
  siren    VARCHAR(32)  DEFAULT NULL,      -- SIREN ou SIRET
  rcs_numero     VARCHAR(32) DEFAULT NULL,      -- ex : 'RCS Nanterre 789 062 171'
  rcs_ville      VARCHAR(150) DEFAULT NULL,      -- ex : 'Nanterre'
  rna            VARCHAR(20)  DEFAULT NULL,      -- ex : 'W123456789' pour une asso

  -- TVA
  num_tva_intracom VARCHAR(32) DEFAULT NULL,     -- numéro de TVA intracom si assujetti
  regime_tva       VARCHAR(50) DEFAULT NULL,
  -- ex : 'assujetti', 'franchise_293B' (permet d'afficher "TVA non applicable, art. 293 B CGI")

  -- Coordonnées postales et contact
  adresse        VARCHAR(255) DEFAULT NULL,
  cp             VARCHAR(10)  DEFAULT NULL,
  ville          VARCHAR(100) DEFAULT NULL,
  email          VARCHAR(255) DEFAULT NULL,
  telephone      VARCHAR(30)  DEFAULT NULL,
  site_web       VARCHAR(255) DEFAULT NULL,

  -- Logo (chemin relatif dans ton arborescence web)
  logo_path      VARCHAR(255) DEFAULT NULL,      -- ex : 'public/assets/logos/blitech.png'

  -- Bloc "mentions légales" génériques
  mentions_legales     TEXT    DEFAULT NULL,

  -- Conditions de règlement (pénalités + indemnité forfaitaire 40 €)
  conditions_reglement TEXT    DEFAULT NULL,

  -- Coordonnées bancaires
  iban           VARCHAR(34)  DEFAULT NULL,      -- longueur max IBAN
  bic            VARCHAR(11)  DEFAULT NULL,      -- longueur max BIC

  -- Libellé complémentaire (RNA, sous-titre, slogan…)
  libelle_complementaire VARCHAR(255) DEFAULT NULL,

  -- Bloc signature / émetteur (peut contenir plusieurs lignes)
  emetteur_facture TEXT     DEFAULT NULL,

  date_creation   DATETIME     NOT NULL DEFAULT CURRENT_TIMESTAMP,

  PRIMARY KEY (id),
  UNIQUE KEY uniq_entites_code (code)
) ENGINE=InnoDB
  DEFAULT CHARSET=utf8mb4
  COLLATE=utf8mb4_unicode_ci;


INSERT INTO entites (
    id,
    code,
    nom_affichage,
    raison_sociale,
    forme_juridique,
    siret,
    siren,
    rcs_numero,
    rcs_ville,
    rna,
    num_tva_intracom,
    regime_tva,
    adresse,
    cp,
    ville,
    email,
    telephone,
    site_web,
    logo_path,
    mentions_legales,
    conditions_reglement,
    iban,
    bic,
    libelle_complementaire,
    emetteur_facture
)
VALUES (
    UUID(),
    'BLI',
    'BliTech',
    'Blitech',
    'Entreprise Individuelle',
    '78906217100010',          -- à renseigner
    '789062171',          -- à renseigner
    NULL,          -- à renseigner
    'Nanterre',
    NULL,               -- RNA si association, ici probablement NULL
    NULL,               -- TVA intracom si existant
    NULL,               -- régime TVA
    '17 Avenue Louvois',
    '92190',
    'Meudon',
    'arney@blitech.fr',
    '06 31 40 45 55',
    'www.blitech.fr',
    '/var/www/html/facturation_dev/public/assets/img/logo75.png',
    'Blitech, entreprise individuelle établie au 17 Avenue Louvois, 92190 Meudon. Siren : ',              -- mentions
    null,              -- conditions de règlement
    'FR7630004008830001015945506',              -- IBAN
    'BNPFRPPXXX',              -- BIC
    'Consultant informatique', 
    'Arney-David Bader pour Blitech'
),(
   UUID(),
    'WAK',
    'Wakan',
    'Association Wakan',
    'Association loi 1901',
    NULL,          -- à renseigner
    NULL,          -- à renseigner
    NULL,          -- à renseigner
    'Nanterre',
    'W923010886',               -- RNA si association
    NULL,               -- TVA intracom si existant
    NULL,               -- régime TVA
    '49 bis Rue de la Belgique',
    '92190',
    'Meudon',
    'wakan.meudon@gmail.com',
    '06 73 96 15 73',
    'wakan-meudon.fr',
    null,
    'Wakan, association loi 1901, enregistré au Répertoire National des Associations sous le numéro W923010886 - 17 
Avenue Louvois, 92190 Meudo',              -- mentions
    null,              -- conditions de règlement
    'FR7610278060720002220460145',              -- IBAN
    'CMCIFR2A',              -- BIC
    NULL, 
    'Elsa SIBIEUDE pour Wakan'
),(
  UUID(),   -- id
  'ESI',    -- code
  'Elsa SIBIEUDE',  -- nom_affichage
  'Ostéopathe', -- raison_sociale
  'Entreprise individuelle',  -- forme juridique
  NULL, -- siret
  NULL, -- siren
  NULL, -- rcs_numero
  'Nanterre', -- rcs_ville
  NULL, -- RNA
  NULL, -- num_tva_intracom
  NULL, -- regime_tva
  '17 Avenue Louvois', -- adresse
  '92190', -- cp
  'Meudon', -- ville
  'elsa.sibieude@gmail.com', -- email
  '06 73 96 15 73',  -- telephone
  null, -- site_web
  null, -- logo_path 
  null, -- mentions_legales
  null, -- conditions_reglement
  null, -- iban
  null, -- bic
  null, -- libelle_complementaire
  'Elsa Sibieude'  -- emetteur_facture
);


/* ============================================================
   120_clients.sql
   ============================================================ */

USE blitech_facturation_dev;

CREATE TABLE clients (
  id            CHAR(36)     NOT NULL,
  id_entite     CHAR(36)     NOT NULL,

  -- numéro client interne (formaté via compteur 'client' par entité)
  no_client     VARCHAR(20)  NOT NULL,

  -- type client
  type_client   VARCHAR(20)  NOT NULL,      -- 'Particulier' / 'Professionnel'

  -- identité
  titre         VARCHAR(20)  DEFAULT NULL,  -- Mme / M
  prenom        VARCHAR(100) DEFAULT NULL,
  nom           VARCHAR(100) DEFAULT NULL,
  raison_sociale VARCHAR(255) DEFAULT NULL, -- si professionnel

  -- identifiants pro
  rcs           VARCHAR(150) DEFAULT NULL,
  siren_siret   VARCHAR(32)  DEFAULT NULL,
  siren         VARCHAR(9)   DEFAULT NULL,  -- si tu veux isoler le SIREN

  -- coordonnées
  adresse       VARCHAR(255) DEFAULT NULL,
  cp            VARCHAR(10)  DEFAULT NULL,
  ville         VARCHAR(100) DEFAULT NULL,
  telephone     VARCHAR(30)  DEFAULT NULL,
  email         VARCHAR(255) DEFAULT NULL,

  remarques     TEXT         DEFAULT NULL,

  date_creation DATETIME     NOT NULL DEFAULT CURRENT_TIMESTAMP,

  PRIMARY KEY (id),

  CONSTRAINT fk_clients_entite
    FOREIGN KEY (id_entite) REFERENCES entites(id)
      ON DELETE RESTRICT
      ON UPDATE CASCADE,

  UNIQUE KEY uniq_client_entite_num (id_entite, no_client)
) ENGINE=InnoDB
  DEFAULT CHARSET=utf8mb4
  COLLATE=utf8mb4_unicode_ci;

DROP TABLE import_clients_blitech;
CREATE TABLE import_clients_blitech (
    id INT AUTO_INCREMENT PRIMARY KEY,
    no_client_txt      VARCHAR(10),
    type_client_txt    VARCHAR(50),
    titre_txt          VARCHAR(20),
    prenom_txt         VARCHAR(100),
    nom_txt            VARCHAR(100),
    rcs_txt            VARCHAR(32),
    raison_sociale_txt VARCHAR(128),
    adresse_txt        VARCHAR(255),
    cp_txt             VARCHAR(10),
    ville_txt          VARCHAR(100),
    telephone_txt      VARCHAR(16),
    email_txt          VARCHAR(255),
    remarques_txt      TEXT
);

LOAD DATA LOCAL INFILE '/var/www/html/facturation_dev/sql/clients_blitech.txt'
INTO TABLE import_clients_blitech
CHARACTER SET utf8mb4
FIELDS TERMINATED BY ';'
OPTIONALLY ENCLOSED BY '"'
LINES TERMINATED BY '\n'
IGNORE 1 LINES;

SET @id_blitech = (SELECT id FROM entites WHERE code = 'BLITECH');

INSERT INTO clients (
    id,
    id_entite,
    no_client,
    type_client,
    titre,
    prenom,
    nom,
    raison_sociale,
    rcs,
    adresse,
    cp,
    ville,
    telephone,
    email,
    remarques
)
SELECT
    UUID() AS id,
    @id_blitech AS id_entite,
    TRIM(no_client_txt),
    TRIM(type_client_txt),
    NULLIF(TRIM(titre_txt), ''),
    NULLIF(TRIM(prenom_txt), ''),
    NULLIF(TRIM(nom_txt), ''),
    NULLIF(TRIM(raison_sociale_txt), ''),
    NULLIF(TRIM(rcs_txt), ''),
    NULLIF(TRIM(adresse_txt), ''),
    NULLIF(TRIM(cp_txt), ''),
    NULLIF(TRIM(ville_txt), ''),
    NULLIF(TRIM(telephone_txt), ''),
    NULLIF(TRIM(email_txt), ''),
    NULLIF(TRIM(remarques_txt), '')
FROM import_clients_blitech;

SELECT MAX(CAST(no_client AS UNSIGNED)) FROM clients WHERE id_entite = @id_blitech;



/* ============================================================
   130_contacts.sql
   ============================================================ */

USE blitech_facturation_dev;

CREATE TABLE contacts (
  id           CHAR(36)     NOT NULL,
  id_client    CHAR(36)     NOT NULL,

  titre        VARCHAR(20)  DEFAULT NULL,
  prenom       VARCHAR(100) DEFAULT NULL,
  nom          VARCHAR(100) DEFAULT NULL,
  fonction     VARCHAR(100) DEFAULT NULL,

  telephone    VARCHAR(30)  DEFAULT NULL,
  email        VARCHAR(255) DEFAULT NULL,

  remarques    TEXT         DEFAULT NULL,

  est_principal TINYINT(1)  NOT NULL DEFAULT 0,

  date_creation DATETIME    NOT NULL DEFAULT CURRENT_TIMESTAMP,

  PRIMARY KEY (id),

  CONSTRAINT fk_contacts_client
    FOREIGN KEY (id_client) REFERENCES clients(id)
      ON DELETE CASCADE
      ON UPDATE CASCADE
) ENGINE=InnoDB
  DEFAULT CHARSET=utf8mb4
  COLLATE=utf8mb4_unicode_ci;


/* ============================================================
   200_articles.sql
   ============================================================ */

USE blitech_facturation_dev;

CREATE TABLE articles (
  id              CHAR(36)     NOT NULL,
  id_entite       CHAR(36)     NOT NULL,

  code            VARCHAR(50)  DEFAULT NULL,  -- 'ATELIER_100', etc.
  libelle         VARCHAR(255) NOT NULL,
  description     TEXT         DEFAULT NULL,

  prix_unitaire_ht DECIMAL(10,2) NOT NULL,
  tva_taux         DECIMAL(5,2)  NOT NULL DEFAULT 0.00,

  actif           TINYINT(1)   NOT NULL DEFAULT 1,

  date_creation   DATETIME     NOT NULL DEFAULT CURRENT_TIMESTAMP,

  PRIMARY KEY (id),

  CONSTRAINT fk_articles_entite
    FOREIGN KEY (id_entite) REFERENCES entites(id)
      ON DELETE RESTRICT
      ON UPDATE CASCADE,

  UNIQUE KEY uniq_articles_entite_code (id_entite, code)
) ENGINE=InnoDB
  DEFAULT CHARSET=utf8mb4
  COLLATE=utf8mb4_unicode_ci;


/* ============================================================
   300_abonnements.sql
   ============================================================ */

USE blitech_facturation_dev;

CREATE TABLE abonnements (
  id           CHAR(36)     NOT NULL,
  id_entite    CHAR(36)     NOT NULL,
  id_client    CHAR(36)     NOT NULL,
  id_contact   CHAR(36)     DEFAULT NULL,

  libelle      VARCHAR(255) NOT NULL,
  description  TEXT         DEFAULT NULL,

  periodicite  VARCHAR(20)  NOT NULL,  -- 'mensuelle', ...
  date_debut   DATE         NOT NULL,
  date_fin     DATE         DEFAULT NULL,
  nb_occurrences INT        DEFAULT NULL,

  actif        TINYINT(1)   NOT NULL DEFAULT 1,
  date_creation DATETIME    NOT NULL DEFAULT CURRENT_TIMESTAMP,

  PRIMARY KEY (id),

  CONSTRAINT fk_abonnements_entite
    FOREIGN KEY (id_entite) REFERENCES entites(id)
      ON DELETE RESTRICT
      ON UPDATE CASCADE,

  CONSTRAINT fk_abonnements_client
    FOREIGN KEY (id_client) REFERENCES clients(id)
      ON DELETE RESTRICT
      ON UPDATE CASCADE,

  CONSTRAINT fk_abonnements_contact
    FOREIGN KEY (id_contact) REFERENCES contacts(id)
      ON DELETE SET NULL
      ON UPDATE CASCADE
) ENGINE=InnoDB
  DEFAULT CHARSET=utf8mb4
  COLLATE=utf8mb4_unicode_ci;


/* ============================================================
   310_abonnements_lignes.sql
   ============================================================ */

USE blitech_facturation_dev;

CREATE TABLE abonnements_lignes (
  id                   CHAR(36)     NOT NULL,
  id_abonnement        CHAR(36)     NOT NULL,
  id_article           CHAR(36)     DEFAULT NULL,

  libelle              VARCHAR(255) NOT NULL,
  description          TEXT         DEFAULT NULL,

  quantite_defaut      DECIMAL(10,2) DEFAULT NULL, -- NULL = à saisir (ex: heures)
  prix_unitaire_ht     DECIMAL(10,2) NOT NULL,
  tva_taux             DECIMAL(5,2)  NOT NULL DEFAULT 0.00,

  jour_prestation_defaut TINYINT    DEFAULT NULL,  -- ex: 21 pour le 21 du mois

  ordre                INT          NOT NULL DEFAULT 1,

  PRIMARY KEY (id),

  CONSTRAINT fk_abonnements_lignes_abonnement
    FOREIGN KEY (id_abonnement) REFERENCES abonnements(id)
      ON DELETE CASCADE
      ON UPDATE CASCADE,

  CONSTRAINT fk_abonnements_lignes_article
    FOREIGN KEY (id_article) REFERENCES articles(id)
      ON DELETE SET NULL
      ON UPDATE CASCADE
) ENGINE=InnoDB
  DEFAULT CHARSET=utf8mb4
  COLLATE=utf8mb4_unicode_ci;


/* ============================================================
   350_devis.sql
   ============================================================ */

USE blitech_facturation_dev;

CREATE TABLE devis (
  id            CHAR(36)     NOT NULL,
  id_entite     CHAR(36)     NOT NULL,
  id_client     CHAR(36)     NOT NULL,
  id_contact    CHAR(36)     DEFAULT NULL,

  no_devis      VARCHAR(50)  NOT NULL,      -- ex: 'DEV_2025-001'
  date_devis    DATE         NOT NULL,
  date_validite DATE         DEFAULT NULL,  -- ex: date_devis + 30 jours

  statut        VARCHAR(20)  NOT NULL DEFAULT 'brouillon',
  -- 'brouillon', 'envoye', 'accepte', 'refuse', 'expire', ...

  conditions_reglement TEXT  DEFAULT NULL,
  commentaire          TEXT  DEFAULT NULL,

  date_creation DATETIME     NOT NULL DEFAULT CURRENT_TIMESTAMP,

  PRIMARY KEY (id),

  CONSTRAINT fk_devis_entite
    FOREIGN KEY (id_entite) REFERENCES entites(id)
      ON DELETE RESTRICT
      ON UPDATE CASCADE,

  CONSTRAINT fk_devis_client
    FOREIGN KEY (id_client) REFERENCES clients(id)
      ON DELETE RESTRICT
      ON UPDATE CASCADE,

  CONSTRAINT fk_devis_contact
    FOREIGN KEY (id_contact) REFERENCES contacts(id)
      ON DELETE SET NULL
      ON UPDATE CASCADE,

  UNIQUE KEY uniq_devis_entite_num (id_entite, no_devis)
) ENGINE=InnoDB
  DEFAULT CHARSET=utf8mb4
  COLLATE=utf8mb4_unicode_ci;


/* ============================================================
   360_lignes_devis.sql
   ============================================================ */

USE blitech_facturation_dev;

CREATE TABLE lignes_devis (
  id                  CHAR(36)     NOT NULL,
  id_devis            CHAR(36)     NOT NULL,

  id_article          CHAR(36)     DEFAULT NULL,

  libelle             VARCHAR(255) NOT NULL,
  description         TEXT         DEFAULT NULL,

  date_prestation_prevue DATE      DEFAULT NULL,

  quantite            DECIMAL(10,2) NOT NULL DEFAULT 1.00,
  prix_unitaire_ht    DECIMAL(10,2) NOT NULL,
  tva_taux            DECIMAL(5,2)  NOT NULL DEFAULT 0.00,

  ordre               INT           NOT NULL DEFAULT 1,

  PRIMARY KEY (id),

  CONSTRAINT fk_lignes_devis_devis
    FOREIGN KEY (id_devis) REFERENCES devis(id)
      ON DELETE CASCADE
      ON UPDATE CASCADE,

  CONSTRAINT fk_lignes_devis_article
    FOREIGN KEY (id_article) REFERENCES articles(id)
      ON DELETE SET NULL
      ON UPDATE CASCADE
) ENGINE=InnoDB
  DEFAULT CHARSET=utf8mb4
  COLLATE=utf8mb4_unicode_ci;


/* ============================================================
   400_factures.sql
   ============================================================ */

USE blitech_facturation_dev;

CREATE TABLE import_factures (
    id INT AUTO_INCREMENT PRIMARY KEY,
    no_client_txt VARCHAR(10),
    date_facture_txt VARCHAR(12),
    date_echeance_txt VARCHAR(12),
    libelle_txt VARCHAR(255),
    no_facture_txt VARCHAR(10),
    ttc_ht_txt VARCHAR(10),
    t_ht_txt VARCHAR(16),
    t_ttc_txt VARCHAR(16),
    etat_txt VARCHAR(50)
);
LOAD DATA LOCAL INFILE '/var/www/html/facturation_dev/sql/factures.txt'
INTO TABLE import_factures
CHARACTER SET utf8mb4
FIELDS TERMINATED BY ';'
OPTIONALLY ENCLOSED BY '"'
LINES TERMINATED BY '\n'
IGNORE 1 LINES;

UPDATE import_factures
SET no_facture_txt = REPLACE(REPLACE(TRIM(no_facture_txt), '\r',''), '\n','');


CREATE TABLE factures (
  id            CHAR(36)     NOT NULL,
  id_entite     CHAR(36)     NOT NULL,
  id_client     CHAR(36)     NOT NULL,
  id_contact    CHAR(36)     DEFAULT NULL,

  -- Devis d'origine (optionnel)
  id_devis_source CHAR(36)   DEFAULT NULL,

  no_facture    VARCHAR(32)  NOT NULL,      -- ex: 'BLI_240731_001_JUL_QG' ou '250914_019'
  mode_generation VARCHAR(20) NOT NULL,     -- 'ponctuelle', 'abonnement', 'atelier'

  date_facture  DATE         NOT NULL,
  date_echeance DATE         DEFAULT NULL,

  periode_debut DATE         DEFAULT NULL,
  periode_fin   DATE         DEFAULT NULL,

  commentaire   TEXT         DEFAULT NULL,

  date_creation DATETIME     NOT NULL DEFAULT CURRENT_TIMESTAMP,

  PRIMARY KEY (id),

  CONSTRAINT fk_factures_entite
    FOREIGN KEY (id_entite) REFERENCES entites(id)
      ON DELETE RESTRICT
      ON UPDATE CASCADE,

  CONSTRAINT fk_factures_client
    FOREIGN KEY (id_client) REFERENCES clients(id)
      ON DELETE RESTRICT
      ON UPDATE CASCADE,

  CONSTRAINT fk_factures_contact
    FOREIGN KEY (id_contact) REFERENCES contacts(id)
      ON DELETE SET NULL
      ON UPDATE CASCADE,

  CONSTRAINT fk_factures_devis_source
    FOREIGN KEY (id_devis_source) REFERENCES devis(id)
      ON DELETE SET NULL
      ON UPDATE CASCADE,

  UNIQUE KEY uniq_factures_entite_num (id_entite, no_facture)
) ENGINE=InnoDB
  DEFAULT CHARSET=utf8mb4
  COLLATE=utf8mb4_unicode_ci;

INSERT INTO factures (
    id, id_entite, id_client, id_contact, id_devis_source,
    no_facture, mode_generation,
    date_facture, date_echeance,
    periode_debut, periode_fin, commentaire
)
SELECT
    UUID(),
    (SELECT id FROM entites WHERE code='BLITECH'),
    c.id,
    NULL,
    NULL,
    TRIM(f.no_facture_txt),
    'historique',
    STR_TO_DATE(f.date_facture_txt, '%d/%m/%Y'),
    STR_TO_DATE(f.date_echeance_txt, '%d/%m/%Y'),
    NULL, NULL,
    NULL
FROM import_factures f
JOIN clients c ON c.no_client = f.no_client_txt;

SELECT COUNT(*) FROM factures;
SELECT no_facture FROM factures ORDER BY date_facture LIMIT 10;


/* ============================================================
   410_lignes_factures.sql
   ============================================================ */

USE blitech_facturation_dev;

CREATE TABLE import_lignes_factures (
    id INT AUTO_INCREMENT PRIMARY KEY,
    lib_presta VARCHAR(255),
    date_txt VARCHAR(16),
    qte_txt VARCHAR(16),
    prix_txt VARCHAR(16),
    ttc_ht_txt VARCHAR(16),
    uht_txt VARCHAR(16),
    uttc_txt VARCHAR(16),
    tht_txt VARCHAR(16),
    tttc_txt VARCHAR(16),
    etat_txt VARCHAR(16),
    nfac_txt VARCHAR(16)
);

LOAD DATA LOCAL INFILE '/var/www/html/facturation_dev/sql/lignes_factures_copy.txt'
INTO TABLE import_lignes_factures
CHARACTER SET utf8mb4
FIELDS TERMINATED BY ';'
OPTIONALLY ENCLOSED BY '"'
LINES TERMINATED BY '\n'
IGNORE 1 LINES;

UPDATE import_lignes_factures
SET nfac_txt = REPLACE(REPLACE(TRIM(nfac_txt), '\r',''), '\n','');

CREATE TABLE lignes_factures (
  id              CHAR(36)     NOT NULL,
  id_facture      CHAR(36)     NOT NULL,

  id_abonnement   CHAR(36)     DEFAULT NULL,
  id_article      CHAR(36)     DEFAULT NULL,

  libelle         VARCHAR(255) NOT NULL,
  description     TEXT         DEFAULT NULL,

  date_prestation DATE         NOT NULL,

  quantite        DECIMAL(10,2) NOT NULL DEFAULT 1.00,
  prix_unitaire_ht DECIMAL(10,2) NOT NULL,
  tva_taux         DECIMAL(5,2)  NOT NULL DEFAULT 0.00,

  ordre           INT           NOT NULL DEFAULT 1,

  PRIMARY KEY (id),

  CONSTRAINT fk_lignes_factures_facture
    FOREIGN KEY (id_facture) REFERENCES factures(id)
      ON DELETE CASCADE
      ON UPDATE CASCADE,

  CONSTRAINT fk_lignes_factures_abonnement
    FOREIGN KEY (id_abonnement) REFERENCES abonnements(id)
      ON DELETE SET NULL
      ON UPDATE CASCADE,

  CONSTRAINT fk_lignes_factures_article
    FOREIGN KEY (id_article) REFERENCES articles(id)
      ON DELETE SET NULL
      ON UPDATE CASCADE
) ENGINE=InnoDB
  DEFAULT CHARSET=utf8mb4
  COLLATE=utf8mb4_unicode_ci;

/* ============================================================
   Insertion dans lignes_factures 
   ============================================================ */


TRUNCATE TABLE lignes_factures;

SET lc_time_names = 'fr_FR';

TRUNCATE TABLE import_lignes_factures;

LOAD DATA LOCAL INFILE '/var/www/html/facturation_dev/sql/lignes_factures_copy.txt'
INTO TABLE import_lignes_factures
CHARACTER SET utf8mb4
FIELDS TERMINATED BY ';'
OPTIONALLY ENCLOSED BY '"'
LINES TERMINATED BY '\n'
IGNORE 1 LINES
(
  lib_presta,
  date_txt,
  qte_txt,
  prix_txt,
  ttc_ht_txt,
  uht_txt,
  uttc_txt,
  tht_txt,
  tttc_txt,
  etat_txt,
  nfac_txt
);

select * from import_lignes_factures limit 5;
UPDATE import_lignes_factures SET nfac_txt = REPLACE(REPLACE(TRIM(nfac_txt), '\r', ''), '\n', '');

SELECT
  ilf.nfac_txt,
  HEX(ilf.nfac_txt) AS hex_import
FROM import_lignes_factures ilf
LIMIT 10;

SELECT
  f.no_facture,
  HEX(f.no_facture) AS hex_facture
FROM factures f
LIMIT 10;


SET lc_time_names = 'fr_FR';

INSERT INTO lignes_factures (
    id,
    id_facture,
    id_abonnement,
    id_article,
    libelle,
    description,
    date_prestation,
    quantite,
    prix_unitaire_ht,
    tva_taux,
    ordre
)
SELECT
    UUID() AS id,
    f.id   AS id_facture,
    NULL   AS id_abonnement,
    NULL   AS id_article,
    NULLIF(TRIM(ilf.lib_presta), '') AS libelle,
    NULL   AS description,

    -- JJ.MM.AAAA => DATE
    STR_TO_DATE(TRIM(ilf.date_txt), '%d.%m.%Y') AS date_prestation,

    -- QTE : '4,00' -> 4.00
    CAST(
        REPLACE(
          REPLACE(
            REPLACE(TRIM(ilf.qte_txt), ' ', ''),
          '€',''),
        ',','.')
      AS DECIMAL(10,2)
    ) AS quantite,

    -- UHT : ' 72,25 € ' -> 72.25
    CAST(
        REPLACE(
          REPLACE(
            REPLACE(TRIM(ilf.uht_txt), ' ', ''),
          '€',''),
        ',','.')
      AS DECIMAL(10,2)
    ) AS prix_unitaire_ht,

    20.00 AS tva_taux,
    1     AS ordre
FROM import_lignes_factures ilf
JOIN factures f
  ON f.no_facture = ilf.nfac_txt;

SELECT COUNT(*) AS nb_lignes
FROM lignes_factures;

SELECT
  f.no_facture,
  lf.libelle,
  lf.date_prestation,
  lf.quantite,
  lf.prix_unitaire_ht
FROM lignes_factures lf
JOIN factures f ON f.id = lf.id_facture
ORDER BY f.no_facture, lf.date_prestation, lf.libelle
LIMIT 20;


/* ============================================================
   110_compteurs.sql  (créé après clients)
   ============================================================ */

USE blitech_facturation_dev;

CREATE TABLE compteurs (
  id             CHAR(36)     NOT NULL,

  -- Entité (toujours renseignée)
  id_entite      CHAR(36)     NOT NULL,

  -- Client : NULL => compteur "global" pour l'entité.
  -- Non-NULL => compteur spécifique à ce client.
  id_client      CHAR(36)     DEFAULT NULL,

  -- Type : 'facture', 'devis', 'client', 'abonnement', ...
  type_compteur  VARCHAR(50)  NOT NULL,

  -- Année (NULL si on ne segmente pas par année)
  annee          INT          DEFAULT NULL,

  -- Dernier numéro attribué
  dernier_numero INT          NOT NULL DEFAULT 0,

  -- Date de mise à jour
  date_maj       DATETIME     NOT NULL DEFAULT CURRENT_TIMESTAMP,

  PRIMARY KEY (id),

  CONSTRAINT fk_compteurs_entite
    FOREIGN KEY (id_entite) REFERENCES entites(id)
      ON DELETE CASCADE
      ON UPDATE CASCADE,

  CONSTRAINT fk_compteurs_client
    FOREIGN KEY (id_client) REFERENCES clients(id)
      ON DELETE CASCADE
      ON UPDATE CASCADE,

  UNIQUE KEY uniq_compteur_scope (id_entite, type_compteur, annee, id_client)
) ENGINE=InnoDB
  DEFAULT CHARSET=utf8mb4
  COLLATE=utf8mb4_unicode_ci;


/* ============================================================
   800_vue_export_factures.sql
   (vue adaptée au nouveau schéma)
   ============================================================ */

USE blitech_facturation_dev;

CREATE VIEW vue_export_factures AS
SELECT
    lf.libelle                      AS Lib_presta,
    lf.date_prestation              AS `DATE`,
    lf.quantite                     AS QTE,
    lf.prix_unitaire_ht             AS PRIX,
    'HT'                            AS `TTC/HT`,

    -- UHT : prix unitaire hors taxe
    lf.prix_unitaire_ht             AS UHT,

    -- UTTC : prix unitaire TTC
    ROUND(lf.prix_unitaire_ht * (1 + lf.tva_taux / 100), 2) AS UTTC,

    -- THT : total HT de la facture (somme de toutes les lignes)
    (
        SELECT
            SUM(lf2.quantite * lf2.prix_unitaire_ht)
        FROM lignes_factures lf2
        WHERE lf2.id_facture = lf.id_facture
    )                               AS THT,

    -- TTTC : total TTC de la facture
    (
        SELECT
            SUM(lf2.quantite * lf2.prix_unitaire_ht * (1 + lf2.tva_taux / 100))
        FROM lignes_factures lf2
        WHERE lf2.id_facture = lf.id_facture
    )                               AS TTTC,

    f.id                            AS Facture_ID,
    f.no_facture                    AS NFac,
    f.date_facture                  AS Date_facture,
    f.periode_debut                 AS Periode_debut,
    f.periode_fin                   AS Periode_fin
FROM lignes_factures lf
JOIN factures f ON f.id = lf.id_facture;


/* ============================================================
   900_init_data.sql
   (exemple minimal, à adapter avec de "vrais" UUID)
   ============================================================ */

USE blitech_facturation_dev;

-- Exemple : insertion de 2 entités (remplace les IDs par de vrais UUID stables)
-- Tu peux commenter ou adapter ce bloc selon ta situation réelle

/*
INSERT INTO entites (
  id, code, nom_affichage, raison_sociale, forme_juridique,
  siren_siret, rcs_numero, rcs_ville, rna,
  num_tva_intracom, regime_tva,
  adresse, cp, ville, email, telephone, site_web,
  logo_path, mentions_legales, conditions_reglement,
  iban, bic, libelle_complementaire, emetteur_facture
) VALUES
  ('00000000-0000-4000-8000-000000000001',
   'BLITECH',
   'Blitech',
   'Blitech',
   'EI',
   'XXXXXXXXX00000',
   'RCS Nanterre XXXXXXXX',
   'Nanterre',
   NULL,
   NULL, 'assujetti',
   'Adresse Blitech', '92190', 'Meudon', 'contact@blitech.fr', '06.00.00.00.00', NULL,
   'public/assets/logos/blitech.png',
   'Mentions légales Blitech...',
   'Paiement à 30 jours. Pénalités de retard et indemnité forfaitaire de 40 €.',
   'FR76XXXXXXXXXXXXXXXXXXXXXXX',
   'XXXXXXXXXXX',
   NULL,
   'Blitech – Arney-David BADER'
  ),
  ('00000000-0000-4000-8000-000000000002',
   'WAKAN',
   'Association Wakan',
   'Association Wakan',
   'Association loi 1901',
   NULL,
   NULL,
   NULL,
   'W123456789',
   NULL, 'franchise_293B',
   'Adresse Wakan', '92190', 'Meudon', 'contact@wakan.fr', '06.00.00.00.01', NULL,
   'public/assets/logos/wakan.png',
   'Mentions légales Wakan...',
   'Paiement à 30 jours. Pénalités de retard et indemnité forfaitaire de 40 €.',
   'FR76YYYYYYYYYYYYYYYYYYYYY',
   'YYYYYYYYYYY',
   'RNA : W123456789',
   'Association Wakan – Présidente ...'
  );
*/

