-- Les interventions : une prestation demandee sur un bien, a une date.
--
-- LE POINT CENTRAL DE CETTE TABLE est la colonne « modification ».
--
-- Un proprietaire peut modifier sa demande, mais le changement ne prend effet qu'a
-- la validation du concierge. Les colonnes de cette table portent donc toujours
-- l'etat CONFIRME — celui sur lequel le concierge s'est engage et qui figure a son
-- planning — et « modification » porte le changement DEMANDE, non encore applique.
--
-- Sans cette separation, un client pourrait deplacer a lui seul une intervention
-- deja planifiee et assignee : le prestataire se presenterait au mauvais moment. Le
-- concierge voit donc un ecart (« demande 14h, actuellement 10h ») et decide.
--
-- Format : du JSON, comme journal_audit.details. Ce n'est pas de la donnee qu'on
-- interroge, seulement un jeu de valeurs en attente que l'on lit en entier ou pas du
-- tout. Une seconde table de revisions serait plus lourde pour le meme service.
--
-- prix_cents est FIGE a la validation. Le tarif du bien peut changer ensuite : ce qui
-- a ete valide a un prix reste a ce prix, sinon une facture emise varierait
-- retroactivement.
--
-- assigne_a designe un prestataire OU le concierge lui-meme — d'ou l'absence de
-- contrainte sur le role : c'est le controleur qui verifie que la personne assignee
-- appartient au perimetre.

CREATE TABLE interventions (
    id                 BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,
    reference          CHAR(26)        NOT NULL,
    bien_id            BIGINT UNSIGNED NOT NULL,
    type_prestation_id BIGINT UNSIGNED NOT NULL,

    statut ENUM('demandee','validee','refusee','annulee','terminee') NOT NULL DEFAULT 'demandee',

    -- L'etat CONFIRME. Un proprietaire ne le modifie jamais directement.
    date_prevue        DATE            NOT NULL,
    heure_debut        TIME            NULL,
    duree_minutes      SMALLINT UNSIGNED NULL,
    quantite           SMALLINT UNSIGNED NOT NULL DEFAULT 1,
    prix_cents         INT UNSIGNED    NULL,
    assigne_a          BIGINT UNSIGNED NULL,

    note               TEXT            NULL,
    note_concierge     TEXT            NULL,

    -- Le changement demande et non encore applique. NULL = rien en attente.
    modification       TEXT            NULL,

    demande_par        BIGINT UNSIGNED NULL,
    validee_par        BIGINT UNSIGNED NULL,
    validee_le         DATETIME        NULL,
    cree_le            DATETIME        NOT NULL,
    modifie_le         DATETIME        NOT NULL,

    PRIMARY KEY (id),
    UNIQUE KEY uq_interventions_reference (reference),

    -- Sert le planning d'un bien : ses interventions sur une fenetre de dates.
    KEY idx_interventions_bien_date (bien_id, date_prevue),

    -- Sert le tableau de bord : ce qui attend une validation, au plus tot.
    KEY idx_interventions_statut (statut, date_prevue),

    -- Sert l'agenda d'un intervenant : son travail du jour, dans l'ordre.
    KEY idx_interventions_assigne (assigne_a, date_prevue, heure_debut),

    CONSTRAINT fk_interventions_bien
        FOREIGN KEY (bien_id) REFERENCES biens (id) ON DELETE CASCADE,
    CONSTRAINT fk_interventions_type
        FOREIGN KEY (type_prestation_id) REFERENCES types_prestation (id),
    CONSTRAINT fk_interventions_assigne
        FOREIGN KEY (assigne_a) REFERENCES utilisateurs (id) ON DELETE SET NULL,
    CONSTRAINT fk_interventions_demande_par
        FOREIGN KEY (demande_par) REFERENCES utilisateurs (id) ON DELETE SET NULL,
    CONSTRAINT fk_interventions_validee_par
        FOREIGN KEY (validee_par) REFERENCES utilisateurs (id) ON DELETE SET NULL
) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4 COLLATE = utf8mb4_unicode_ci;
