-- Les lignes d'une intervention : ce qui se facture, distinct de la visite.
--
-- POURQUOI CETTE TABLE EXISTE. La table interventions confondait deux notions qui n'ont
-- pas la meme cardinalite :
--
--   une VISITE        quelqu'un se deplace au logement, a une date, a une heure, pour une
--                     duree. Le menage et le retrait de deux jeux de draps se font en UN
--                     SEUL deplacement.
--   une LIGNE facturee ce que le proprietaire paie. Une location de draps couvre DEUX
--                     visites — pose et retrait — mais ne se paie qu'une fois.
--
-- Trois services dans une visite, un service sur deux visites : une seule table ne peut
-- pas porter les deux. Demander le menage et deux jeux de draps produisait cinq lignes la
-- ou le concierge se deplace deux fois.
--
-- ET UN SECOND DEFAUT, plus grave, que la confusion masquait : le prix etait ecrit EN
-- ENTIER pour chaque occurrence. « Location de draps » a 15 € par couchage, deux
-- couchages, moment arrivee et depart, donnait deux interventions de 30 € — soit 60 €
-- pour une seule location. Le montant fige a la demande etait faux.
--
-- Desormais le prix est porte par la ligne, et une seule des deux occurrences le porte.
-- Voir MomentPrestation::occurrenceFacturee() : c'est le DEPART qui facture, decision
-- prise avec l'utilisateur. La ligne de pose porte 0.

CREATE TABLE intervention_lignes (
    id                 BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,
    intervention_id    BIGINT UNSIGNED NOT NULL,
    type_prestation_id BIGINT UNSIGNED NOT NULL,

    quantite           SMALLINT UNSIGNED NOT NULL DEFAULT 1,

    -- prix_cents en ENTIER, comme partout : un prix se compare, se somme et se multiplie
    -- par une quantite ; le centime entier est la seule representation qui ne derive pas.
    --
    -- Zero est une valeur LEGITIME et non un defaut de saisie : c'est celle de la ligne de
    -- pose d'une location facturee au depart. Le travail a lieu, l'argent est ailleurs.
    prix_cents         INT UNSIGNED    NOT NULL DEFAULT 0,

    unite              ENUM('forfait','couchage','heure') NOT NULL DEFAULT 'forfait',

    cree_le            DATETIME        NOT NULL,
    modifie_le         DATETIME        NOT NULL,

    PRIMARY KEY (id),

    -- Une prestation ne figure qu'une fois par visite. La demander deux fois sur le meme
    -- deplacement serait une double saisie, pas un besoin : c'est la quantite qui exprime
    -- « deux jeux de draps ».
    UNIQUE KEY uq_lignes_intervention_type (intervention_id, type_prestation_id),

    -- Sert la lecture principale : les lignes des visites affichees.
    KEY idx_lignes_intervention (intervention_id),

    -- CASCADE ici, contrairement au reste du projet, et c'est justifie : une ligne n'a
    -- aucune existence propre. Elle n'est pas de l'historique qu'on protege, elle est le
    -- detail d'une visite — supprimer la visite doit emporter son detail.
    CONSTRAINT fk_lignes_intervention
        FOREIGN KEY (intervention_id) REFERENCES interventions (id) ON DELETE CASCADE,

    -- RESTRICT sur le type : retirer une prestation du catalogue ne doit pas effacer
    -- silencieusement ce qui a ete facture. L'interface desactive, elle ne supprime pas.
    CONSTRAINT fk_lignes_type
        FOREIGN KEY (type_prestation_id) REFERENCES types_prestation (id)
) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4 COLLATE = utf8mb4_unicode_ci;
