-- Referentiel des types de piece, configurable par les administrateurs.
--
-- En base et non dans une enumeration PHP, parce que le vocabulaire varie d'un
-- portefeuille a l'autre : « dependance », « pool house », « cave a ski » n'ont
-- pas a passer par une migration. C'est l'inverse du choix fait pour TypeBien et
-- Couchage, qui sont fermes — la difference etant qu'ajouter un type de piece ne
-- change aucune logique, alors qu'ajouter un type de lit ajoute une colonne.
--
-- est_chambre est le seul drapeau structurant : il commande l'affichage des
-- champs douche / baignoire / WC et des couchages. Ainsi un administrateur peut
-- creer « Chambre parentale » ou « Mezzanine » et obtenir ces champs, sans
-- toucher au code. Plusieurs types peuvent donc etre des chambres.
--
-- On ne supprime pas un type utilise : actif = 0 le retire des listes de choix
-- sans casser les pieces existantes. Meme regle que pour les comptes.

CREATE TABLE types_piece (
    id          BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,
    reference   CHAR(26)        NOT NULL,
    libelle     VARCHAR(60)     NOT NULL,
    est_chambre TINYINT(1)      NOT NULL DEFAULT 0,

    -- Ordre d'affichage impose, pour que la liste des pieces d'un bien se lise
    -- toujours dans le meme ordre : les pieces de vie, puis les chambres, puis
    -- les annexes. Un tri alphabetique melangerait tout.
    ordre       SMALLINT        NOT NULL DEFAULT 100,
    actif       TINYINT(1)      NOT NULL DEFAULT 1,
    cree_le     DATETIME        NOT NULL,
    modifie_le  DATETIME        NOT NULL,

    PRIMARY KEY (id),
    UNIQUE KEY uq_types_piece_reference (reference),
    UNIQUE KEY uq_types_piece_libelle (libelle),
    KEY idx_types_piece_ordre (actif, ordre, libelle)
) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4 COLLATE = utf8mb4_unicode_ci;

-- Amorcage. Les references ULID sont fixes ici, faute de pouvoir en generer en
-- SQL : ce sont des valeurs valides au format Crockford, et elles n'ont pas a
-- etre imprevisibles pour un referentiel public.
INSERT INTO types_piece (reference, libelle, est_chambre, ordre, cree_le, modifie_le) VALUES
    ('0AAAAAAAAAAAAAAAAAAAAAAAA1', 'Sejour',            0,  10, NOW(), NOW()),
    ('0AAAAAAAAAAAAAAAAAAAAAAAA2', 'Salon',             0,  20, NOW(), NOW()),
    ('0AAAAAAAAAAAAAAAAAAAAAAAA3', 'Cuisine',           0,  30, NOW(), NOW()),
    ('0AAAAAAAAAAAAAAAAAAAAAAAA4', 'Salle a manger',    0,  40, NOW(), NOW()),
    ('0AAAAAAAAAAAAAAAAAAAAAAAA5', 'Chambre',           1,  50, NOW(), NOW()),
    ('0AAAAAAAAAAAAAAAAAAAAAAAA6', 'Mezzanine',         1,  60, NOW(), NOW()),
    ('0AAAAAAAAAAAAAAAAAAAAAAAA7', 'Salle de bain',     0,  70, NOW(), NOW()),
    ('0AAAAAAAAAAAAAAAAAAAAAAAA8', 'Salle d''eau',      0,  80, NOW(), NOW()),
    ('0AAAAAAAAAAAAAAAAAAAAAAAA9', 'WC',               0,  90, NOW(), NOW()),
    ('0AAAAAAAAAAAAAAAAAAAAAAAAA', 'Balcon',            0, 100, NOW(), NOW()),
    ('0AAAAAAAAAAAAAAAAAAAAAAAAB', 'Terrasse',          0, 110, NOW(), NOW()),
    ('0AAAAAAAAAAAAAAAAAAAAAAAAC', 'Buanderie',         0, 120, NOW(), NOW()),
    ('0AAAAAAAAAAAAAAAAAAAAAAAAD', 'Garage',            0, 130, NOW(), NOW()),
    ('0AAAAAAAAAAAAAAAAAAAAAAAAE', 'Dependance',        0, 140, NOW(), NOW());
