-- LE CLIENT DEVIENT UNE ENTITE, et c'est la correction d'une erreur de conception initiale.
--
-- Le modele liait un bien a des COMPTES UTILISATEUR de type proprietaire. Trois choses ne
-- rentraient pas dans ce moule :
--
--   un foyer a plusieurs comptes   Monsieur, Madame, les enfants. Trois comptes pour un
--                                  seul client, et rien ne disait qu'ils allaient ensemble ;
--   un client peut n'avoir aucun   celui qui delegue tout a sa conciergerie n'ouvre jamais
--   compte                         l'application. Il n'existait donc pas, alors qu'il est
--                                  le client ;
--   le contrat n'avait pas de      il lie la conciergerie au CLIENT, pas a un compte de
--   support                        connexion.
--
-- Le client est desormais l'interlocuteur commercial ; les comptes utilisateur ne sont que
-- des acces qu'on lui ouvre, en nombre quelconque, y compris aucun.

CREATE TABLE clients (
    id           BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,
    reference    CHAR(26)        NOT NULL,

    -- Le concierge dont ce client releve. NOT NULL : un client sans conciergerie n'a pas
    -- d'existence ici, et c'est ce rattachement qui borne ce que chaque concierge voit.
    concierge_id BIGINT UNSIGNED NOT NULL,

    -- « Mr et Mme Martin », « SCI des Cimes ». Le nom du CLIENT, qui n'est pas celui d'une
    -- personne : c'est ce qui manquait quand on ne disposait que de comptes individuels.
    nom          VARCHAR(160)    NOT NULL,

    -- Les coordonnees du client lui-meme, indispensables justement quand il n'a aucun
    -- compte : sans elles, un client sans acces serait injoignable depuis l'application.
    email        VARCHAR(190)    NULL,
    telephone    VARCHAR(30)     NULL,

    notes        TEXT            NULL,

    -- On ne supprime pas un client : ses biens, ses interventions et ses contrats le
    -- referenceront pendant des annees.
    actif        TINYINT(1)      NOT NULL DEFAULT 1,

    cree_le      DATETIME        NOT NULL,
    modifie_le   DATETIME        NOT NULL,

    PRIMARY KEY (id),
    UNIQUE KEY uq_clients_reference (reference),
    KEY idx_clients_concierge (concierge_id),
    KEY idx_clients_nom (nom),

    -- RESTRICT et non CASCADE : desactiver un concierge ne doit pas emporter ses clients,
    -- et une suppression accidentelle doit echouer bruyamment plutot que vider la base.
    CONSTRAINT fk_clients_concierge FOREIGN KEY (concierge_id)
        REFERENCES utilisateurs (id) ON DELETE RESTRICT
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

-- LES CONTRATS, EN HISTORIQUE et non en trois colonnes sur le client.
--
-- Un renouvellement ne doit pas ecraser les conditions precedentes : « quel contrat
-- couvrait cette prestation de l'ete dernier » est exactement la question qui se pose
-- devant une facture contestee, et trois colonnes y repondent « celles d'aujourd'hui ».
CREATE TABLE contrats (
    id                  BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,
    reference           CHAR(26)        NOT NULL,
    client_id           BIGINT UNSIGNED NOT NULL,

    debut               DATE            NOT NULL,

    -- NULL = sans terme fixe. Avec tacite_reconduction, « fin » porte l'echeance de la
    -- periode en cours : le contrat se prolonge au-dela, sauf denonciation.
    fin                 DATE            NULL,
    tacite_reconduction TINYINT(1)      NOT NULL DEFAULT 0,

    notes               TEXT            NULL,
    cree_le             DATETIME        NOT NULL,
    modifie_le          DATETIME        NOT NULL,

    PRIMARY KEY (id),
    UNIQUE KEY uq_contrats_reference (reference),
    KEY idx_contrats_client (client_id, debut),

    -- CASCADE : l'historique contractuel d'un client supprime n'a plus d'objet. Mais un
    -- client ne se supprime pas en pratique — il se desactive.
    CONSTRAINT fk_contrats_client FOREIGN KEY (client_id)
        REFERENCES clients (id) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

-- UN COMPTE PROPRIETAIRE APPARTIENT A UN CLIENT.
--
-- NULL pour tous les autres roles, et pour un proprietaire qu'on n'a pas encore rattache.
-- C'est ce qui remplace bien_proprietaire : l'acces d'un proprietaire ne passe plus par
-- les biens un par un, mais par son client — qui les porte tous.
ALTER TABLE utilisateurs
    ADD COLUMN client_id BIGINT UNSIGNED NULL AFTER concierge_id,
    ADD KEY idx_utilisateurs_client (client_id);

ALTER TABLE utilisateurs
    ADD CONSTRAINT fk_utilisateurs_client FOREIGN KEY (client_id)
        REFERENCES clients (id) ON DELETE SET NULL;
