-- =============================================================
-- update_roles_permisos_hosting_20260828.sql
-- =============================================================
-- Script de actualizacion para hosting ya instalado.
-- Sincroniza modulos, acciones, roles y permisos segun la version
-- actual del sistema. Elimina los modulos de documentos internos
-- que ya no forman parte del proyecto.

SET FOREIGN_KEY_CHECKS = 0;

-- -------------------------------------------------------------
-- 1. Limpieza de modulos obsoletos
-- -------------------------------------------------------------
DELETE p
FROM permisos p
INNER JOIN modulos m ON m.id = p.modulo_id
WHERE m.codigo IN ('documentos_salida', 'documentos_ingreso');

DELETE em
FROM empresa_modulos em
INNER JOIN modulos m ON m.id = em.modulo_id
WHERE m.codigo IN ('documentos_salida', 'documentos_ingreso');

DELETE FROM modulos
WHERE codigo IN ('documentos_salida', 'documentos_ingreso');

-- -------------------------------------------------------------
-- 2. Acciones base
-- -------------------------------------------------------------
INSERT INTO acciones (codigo, nombre, estado, created_at)
VALUES
    ('ver', 'Ver', 1, NOW()),
    ('crear', 'Crear', 1, NOW()),
    ('editar', 'Editar', 1, NOW()),
    ('eliminar', 'Eliminar', 1, NOW()),
    ('anular', 'Anular', 1, NOW())
ON DUPLICATE KEY UPDATE
    nombre = VALUES(nombre),
    estado = 1;

-- -------------------------------------------------------------
-- 3. Modulos base del sistema
-- -------------------------------------------------------------
INSERT INTO modulos (codigo, nombre, categoria, estado, created_at)
VALUES
    ('usuarios', 'Usuarios', 'CORE', 1, NOW()),
    ('empresas', 'Empresas', 'CORE', 1, NOW()),
    ('facturacion', 'Facturacion', 'CORE', 1, NOW()),
    ('auditoria', 'Auditoria', 'CORE', 1, NOW()),
    ('catalogos_sunat', 'Catalogos SUNAT', 'LEGAL', 1, NOW()),
    ('terceros', 'Terceros', 'CORE', 1, NOW()),
    ('productos', 'Productos', 'CORE', 1, NOW()),
    ('inventario', 'Inventario', 'CORE', 1, NOW()),
    ('caja', 'Caja', 'CORE', 1, NOW()),
    ('compras', 'Compras', 'CORE', 1, NOW()),
    ('ventas', 'Ventas', 'CORE', 1, NOW()),
    ('cotizaciones', 'Cotizaciones', 'CORE', 1, NOW()),
    ('guias', 'Guias de remision', 'CORE', 1, NOW()),
    ('reportes', 'Reportes', 'CORE', 1, NOW()),
    ('polleria', 'Polleria', 'VERTICAL', 1, NOW()),
    ('restaurante', 'Restaurante', 'VERTICAL', 1, NOW()),
    ('bodega', 'Bodega', 'VERTICAL', 1, NOW()),
    ('spa', 'Spa', 'VERTICAL', 1, NOW()),
    ('servicios', 'Servicios', 'VERTICAL', 1, NOW()),
    ('ferreteria', 'Ferreteria', 'VERTICAL', 1, NOW())
ON DUPLICATE KEY UPDATE
    nombre = VALUES(nombre),
    categoria = VALUES(categoria),
    estado = 1,
    deleted_at = NULL;

-- -------------------------------------------------------------
-- 4. Asegurar un rol Administrador por empresa
-- -------------------------------------------------------------
INSERT INTO roles (empresa_id, nombre, descripcion, estado, created_at)
SELECT e.id, 'Administrador', 'Acceso total para la empresa', 1, NOW()
FROM empresas e
LEFT JOIN roles r
       ON r.empresa_id = e.id
      AND r.nombre = 'Administrador'
      AND r.deleted_at IS NULL
WHERE e.deleted_at IS NULL
  AND r.id IS NULL;

-- -------------------------------------------------------------
-- 5. Permisos completos para el rol Administrador
-- -------------------------------------------------------------
INSERT IGNORE INTO permisos (rol_id, modulo_id, accion_id, permitido, created_at)
SELECT r.id, m.id, a.id, 1, NOW()
FROM roles r
INNER JOIN modulos m ON m.estado = 1 AND m.deleted_at IS NULL
INNER JOIN acciones a ON a.estado = 1
WHERE r.deleted_at IS NULL
  AND r.nombre = 'Administrador';

-- -------------------------------------------------------------
-- 6. Modulos activos por empresa
-- -------------------------------------------------------------
INSERT INTO empresa_modulos (empresa_id, modulo_id, habilitado, created_at)
SELECT e.id, m.id, 1, NOW()
FROM empresas e
INNER JOIN modulos m
WHERE e.deleted_at IS NULL
  AND m.deleted_at IS NULL
  AND m.codigo IN (
      'usuarios',
      'empresas',
      'facturacion',
      'auditoria',
      'catalogos_sunat',
      'terceros',
      'productos',
      'inventario',
      'caja',
      'compras',
      'ventas',
      'cotizaciones',
      'guias',
      'reportes',
      'polleria',
      'restaurante',
      'bodega',
      'spa',
      'servicios',
      'ferreteria'
  )
ON DUPLICATE KEY UPDATE
    habilitado = VALUES(habilitado),
    updated_at = NOW(),
    deleted_at = NULL;

SET FOREIGN_KEY_CHECKS = 1;

-- Fin del script de actualizacion.
