-- ============================================================
-- Money+Xfer — Migration v1.8 — Agences & Approvisionnements de Caisse
-- À exécuter sur une base existante (migration cumulative)
-- ============================================================

USE akuxfer;

-- ============================================================
-- TABLE : agences
-- ============================================================
CREATE TABLE IF NOT EXISTS agences (
    id           INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    code         VARCHAR(20)  NOT NULL UNIQUE,
    name         VARCHAR(120) NOT NULL,
    city         VARCHAR(80)  DEFAULT NULL,
    address      TEXT         DEFAULT NULL,
    phone        VARCHAR(30)  DEFAULT NULL,
    email        VARCHAR(160) DEFAULT NULL,
    manager_id   INT UNSIGNED DEFAULT NULL,   -- Responsable de l'agence
    solde        DECIMAL(18,2) NOT NULL DEFAULT 0.00,
    seuil_alerte DECIMAL(18,2) NOT NULL DEFAULT 100000.00, -- Alerte si solde < seuil
    status       ENUM('active','inactive','suspendue') NOT NULL DEFAULT 'active',
    notes        TEXT         DEFAULT NULL,
    created_at   DATETIME     NOT NULL DEFAULT CURRENT_TIMESTAMP,
    updated_at   DATETIME     NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
    FOREIGN KEY (manager_id) REFERENCES users(id) ON DELETE SET NULL,
    INDEX idx_code(code),
    INDEX idx_status(status)
) ENGINE=InnoDB;

-- ============================================================
-- TABLE : approvisionnements (appros de caisse)
-- ============================================================
CREATE TABLE IF NOT EXISTS approvisionnements (
    id              INT UNSIGNED  AUTO_INCREMENT PRIMARY KEY,
    reference       VARCHAR(30)   NOT NULL UNIQUE,
    agence_id       INT UNSIGNED  NOT NULL,
    type            ENUM('entree','sortie') NOT NULL DEFAULT 'entree',
    motif           ENUM('depot_banque','transfert_siege','virement_agence','correction','autre') NOT NULL DEFAULT 'depot_banque',
    montant         DECIMAL(18,2) NOT NULL,
    solde_avant     DECIMAL(18,2) NOT NULL DEFAULT 0,
    solde_apres     DECIMAL(18,2) NOT NULL DEFAULT 0,
    description     TEXT          DEFAULT NULL,
    piece_jointe    VARCHAR(255)  DEFAULT NULL,  -- Scan bon de caisse
    created_by      INT UNSIGNED  NOT NULL,      -- Qui a saisi l'opération
    validated_by    INT UNSIGNED  DEFAULT NULL,  -- Qui a validé
    status          ENUM('en_attente','valide','rejete') NOT NULL DEFAULT 'en_attente',
    validated_at    DATETIME      DEFAULT NULL,
    reject_reason   TEXT          DEFAULT NULL,
    created_at      DATETIME      NOT NULL DEFAULT CURRENT_TIMESTAMP,
    FOREIGN KEY (agence_id)    REFERENCES agences(id) ON DELETE RESTRICT,
    FOREIGN KEY (created_by)   REFERENCES users(id),
    FOREIGN KEY (validated_by) REFERENCES users(id) ON DELETE SET NULL,
    INDEX idx_ref(reference),
    INDEX idx_agence(agence_id),
    INDEX idx_status(status),
    INDEX idx_date(created_at)
) ENGINE=InnoDB;

-- ============================================================
-- Lier les utilisateurs à une agence
-- ============================================================
SET @dbname = DATABASE();

SET @ca = (SELECT COUNT(*) FROM INFORMATION_SCHEMA.COLUMNS
  WHERE TABLE_SCHEMA=@dbname AND TABLE_NAME='users' AND COLUMN_NAME='agence_id');
SET @sa = IF(@ca=0,
  'ALTER TABLE users ADD COLUMN agence_id INT UNSIGNED DEFAULT NULL AFTER role_id',
  'SELECT "agence_id already exists" AS info');
PREPARE st FROM @sa; EXECUTE st; DEALLOCATE PREPARE st;

-- Ajouter la FK après (séparé car IF ne supporte pas multi-statements)
SET @ca2 = (SELECT COUNT(*) FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS
  WHERE TABLE_SCHEMA=@dbname AND TABLE_NAME='users' AND CONSTRAINT_NAME='fk_users_agence');
SET @sa2 = IF(@ca2=0,
  'ALTER TABLE users ADD CONSTRAINT fk_users_agence FOREIGN KEY (agence_id) REFERENCES agences(id) ON DELETE SET NULL',
  'SELECT "fk already exists" AS info');
PREPARE st2 FROM @sa2; EXECUTE st2; DEALLOCATE PREPARE st2;

-- ============================================================
-- Agence siège par défaut
-- ============================================================
INSERT IGNORE INTO agences (code, name, city, address, phone, email, solde, seuil_alerte, status)
VALUES ('SIEGE', 'Siège Brazzaville', 'Brazzaville', 'Brazzaville, République du Congo',
        '+242 06 000 00 00', 'contact@moneyxfer.com', 0.00, 500000.00, 'active');

-- ============================================================
-- Permissions agences & approvisionnements
-- ============================================================
INSERT IGNORE INTO permissions (module, action, label) VALUES
('agences',            'view',     'Voir les agences'),
('agences',            'create',   'Créer une agence'),
('agences',            'edit',     'Modifier une agence'),
('agences',            'delete',   'Supprimer une agence'),
('approvisionnements', 'view',     'Voir les approvisionnements'),
('approvisionnements', 'create',   'Créer un approvisionnement'),
('approvisionnements', 'validate', 'Valider un approvisionnement');

-- Super Admin : tout
INSERT IGNORE INTO role_permissions (role_id, permission_id)
SELECT 1, id FROM permissions WHERE module IN ('agences','approvisionnements');

-- Admin : tout sauf delete agences
INSERT IGNORE INTO role_permissions (role_id, permission_id)
SELECT 2, id FROM permissions WHERE module IN ('agences','approvisionnements')
  AND NOT (module='agences' AND action='delete');

-- Manager : view agences + view/create appros
INSERT IGNORE INTO role_permissions (role_id, permission_id)
SELECT 3, id FROM permissions WHERE
  (module='agences' AND action='view') OR
  (module='approvisionnements' AND action IN ('view','create'));

-- Agent : view agences + create appros
INSERT IGNORE INTO role_permissions (role_id, permission_id)
SELECT 4, id FROM permissions WHERE
  (module='agences' AND action='view') OR
  (module='approvisionnements' AND action='create');
