-- ============================================================
--  Migración 2026-10-14_01 · Paquetes y servicios (cotizaciones automatizadas)
-- ------------------------------------------------------------
--  Nueva pestaña de Ventas: /ventas/paquetes. Administra los paquetes
--  (cotizaciones automatizadas) que ofrece la empresa. Adaptado del
--  "automatizador" del sistema anterior (tablas automatizaciones /
--  auto_variables / auto_formulas / auto_materiales / productos).
--  paquete            el paquete o servicio (p. ej. "Pasamano con cables").
--  paquete_variable   lo que se le pregunta a quien cotiza (número, texto,
--                     selector o lista de valores); genera el formulario.
--  paquete_formula    cálculos intermedios con nombre, en orden; cada uno
--                     puede usar las variables y los cálculos anteriores.
--  paquete_material   qué se cotiza: un producto de la lista de precios y
--                     la fórmula de su cantidad.
--  paquete_producto   lista de precios propia de los paquetes (materiales,
--                     mano de obra, transporte...). id_producto la enlaza
--                     opcionalmente con el inventario (producto).
--  Las fórmulas son expresiones JavaScript que se evalúan en el navegador
--  (public/js/ventas/paquete-calc.js), igual que en el sistema anterior.
--  Los datos del sistema anterior se cargan con
--  database/seeds/2026-10-14_paquetes_sistema_anterior.sql.
-- ============================================================
USE tinsa_db;

CREATE TABLE `paquete_producto` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `nombre` varchar(200) NOT NULL,
  `precio` decimal(10,2) NOT NULL DEFAULT 0.00,
  `unidad` varchar(30) DEFAULT NULL,
  `id_producto` int(10) unsigned DEFAULT NULL,
  `activo` tinyint(1) NOT NULL DEFAULT 1,
  `usuario_modifico` int(10) unsigned DEFAULT NULL,
  `created_at` timestamp NOT NULL DEFAULT current_timestamp(),
  `updated_at` timestamp NOT NULL DEFAULT current_timestamp() ON UPDATE current_timestamp(),
  PRIMARY KEY (`id`),
  KEY `fk_pqp_producto` (`id_producto`),
  KEY `fk_pqp_usuario` (`usuario_modifico`),
  CONSTRAINT `fk_pqp_producto` FOREIGN KEY (`id_producto`) REFERENCES `producto` (`id`) ON DELETE SET NULL ON UPDATE CASCADE,
  CONSTRAINT `fk_pqp_usuario` FOREIGN KEY (`usuario_modifico`) REFERENCES `usuarios` (`id_usuario`) ON DELETE SET NULL ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;

CREATE TABLE `paquete` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `nombre` varchar(150) NOT NULL,
  `descripcion` text DEFAULT NULL,
  `activo` tinyint(1) NOT NULL DEFAULT 1,
  `usuario_modifico` int(10) unsigned DEFAULT NULL,
  `created_at` timestamp NOT NULL DEFAULT current_timestamp(),
  `updated_at` timestamp NOT NULL DEFAULT current_timestamp() ON UPDATE current_timestamp(),
  PRIMARY KEY (`id`),
  KEY `fk_pq_usuario` (`usuario_modifico`),
  CONSTRAINT `fk_pq_usuario` FOREIGN KEY (`usuario_modifico`) REFERENCES `usuarios` (`id_usuario`) ON DELETE SET NULL ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;

CREATE TABLE `paquete_variable` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `id_paquete` int(10) unsigned NOT NULL,
  `nombre` varchar(80) NOT NULL,
  `etiqueta` varchar(120) NOT NULL,
  `tipo` enum('numero','texto','selector','lista') NOT NULL DEFAULT 'numero',
  `unidad` varchar(30) DEFAULT NULL,
  `opciones` text DEFAULT NULL,
  `valor_default` varchar(100) DEFAULT NULL,
  `requerido` tinyint(1) NOT NULL DEFAULT 1,
  `en_titulo` tinyint(1) NOT NULL DEFAULT 0,
  `comentario` varchar(500) DEFAULT NULL,
  `orden` int(11) NOT NULL DEFAULT 0,
  PRIMARY KEY (`id`),
  KEY `idx_pqv_paquete` (`id_paquete`),
  CONSTRAINT `fk_pqv_paquete` FOREIGN KEY (`id_paquete`) REFERENCES `paquete` (`id`) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;

CREATE TABLE `paquete_formula` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `id_paquete` int(10) unsigned NOT NULL,
  `nombre` varchar(100) NOT NULL,
  `formula` text NOT NULL,
  `comentario` varchar(500) DEFAULT NULL,
  `orden` int(11) NOT NULL DEFAULT 0,
  PRIMARY KEY (`id`),
  KEY `idx_pqf_paquete` (`id_paquete`),
  CONSTRAINT `fk_pqf_paquete` FOREIGN KEY (`id_paquete`) REFERENCES `paquete` (`id`) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;

CREATE TABLE `paquete_material` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `id_paquete` int(10) unsigned NOT NULL,
  `id_paquete_producto` int(10) unsigned NOT NULL,
  `clave` varchar(80) NOT NULL,
  `formula_cantidad` text NOT NULL,
  `precio_override` decimal(10,2) DEFAULT NULL,
  `precio_manual` tinyint(1) NOT NULL DEFAULT 0,
  `cantidad_editable` tinyint(1) NOT NULL DEFAULT 0,
  `comentario` varchar(500) DEFAULT NULL,
  `orden` int(11) NOT NULL DEFAULT 0,
  PRIMARY KEY (`id`),
  KEY `idx_pqm_paquete` (`id_paquete`),
  KEY `fk_pqm_producto` (`id_paquete_producto`),
  CONSTRAINT `fk_pqm_paquete` FOREIGN KEY (`id_paquete`) REFERENCES `paquete` (`id`) ON DELETE CASCADE,
  CONSTRAINT `fk_pqm_producto` FOREIGN KEY (`id_paquete_producto`) REFERENCES `paquete_producto` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;

-- Pestaña en el módulo Ventas; de entrada solo el Administrador
INSERT INTO pestanas (id_modulo, nombre, ruta, icono, orden, estado)
SELECT m.id, 'Paquetes y servicios', '/ventas/paquetes', 'fa-boxes-stacked', 3, 1
  FROM modulos m WHERE m.nombre = 'Ventas';

INSERT INTO permisos_roles (id_rol, id_pestana, puede_leer, puede_escribir, puede_eliminar)
SELECT r.id, p.id, 1, 1, 1
  FROM roles r JOIN pestanas p ON p.ruta = '/ventas/paquetes'
 WHERE r.nombre = 'Administrador';
