-- ============================================================
--  Migración 2026-10-06_01 · Solicitud de cotización de venta
-- ------------------------------------------------------------
--  1. cliente_usuario: un cliente es único pero se asigna a varios
--     usuarios (asesores). Uno es el asesor principal. Solo los
--     usuarios asignados ven el cliente y sus cotizaciones; quien
--     tiene permiso "eliminar" en /ventas/clientes ve todos.
--     Se precarga con los vendedores de cotizaciones existentes y
--     con quien registró al cliente.
--  2. cotizacion_venta gana los datos de la solicitud: solicitante
--     (contacto de la empresa o el propio cliente), proyecto, entrega,
--     condiciones comerciales y tipo de margen. id_usuario_vendedor
--     pasa a ser "asesor comercial".
--  3. cotizacion_venta_material.margen: margen % por línea cuando la
--     cotización usa margen por ítem.
--  4. cotizacion_venta_adjunto: fotos de referencia, planos, CAD…
--     Los archivos viven en storage/cotizaciones_venta/{id}/ (fuera de
--     public/) y se descargan por controlador.
-- ============================================================
USE tinsa_db;

-- ── 1 · Asesores asignados al cliente ──────────────────────
CREATE TABLE `cliente_usuario` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `id_cliente` int(10) unsigned NOT NULL,
  `id_usuario` int(10) unsigned NOT NULL,
  `es_principal` tinyint(1) NOT NULL DEFAULT 0,
  `usuario_asigno` int(10) unsigned DEFAULT NULL,
  `created_at` timestamp NOT NULL DEFAULT current_timestamp(),
  PRIMARY KEY (`id`),
  UNIQUE KEY `uq_cliente_usuario` (`id_cliente`, `id_usuario`),
  KEY `idx_cliente_usuario_usuario` (`id_usuario`),
  KEY `fk_cliente_usuario_asigno` (`usuario_asigno`),
  CONSTRAINT `fk_cliente_usuario_cliente` FOREIGN KEY (`id_cliente`) REFERENCES `cliente` (`id`) ON DELETE CASCADE ON UPDATE CASCADE,
  CONSTRAINT `fk_cliente_usuario_usuario` FOREIGN KEY (`id_usuario`) REFERENCES `usuarios` (`id_usuario`) ON DELETE CASCADE ON UPDATE CASCADE,
  CONSTRAINT `fk_cliente_usuario_asigno` FOREIGN KEY (`usuario_asigno`) REFERENCES `usuarios` (`id_usuario`) ON DELETE SET NULL ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;

-- Precarga: vendedores que ya cotizaron al cliente + quien lo registró
INSERT IGNORE INTO cliente_usuario (id_cliente, id_usuario)
SELECT DISTINCT id_cliente, id_usuario_vendedor FROM cotizacion_venta;

INSERT IGNORE INTO cliente_usuario (id_cliente, id_usuario)
SELECT id, usuario_modifico FROM cliente WHERE usuario_modifico IS NOT NULL;

-- Principal: el vendedor de la cotización más reciente; si no hay, quien lo registró
UPDATE cliente_usuario cu
  JOIN (
        SELECT cv.id_cliente, cv.id_usuario_vendedor
          FROM cotizacion_venta cv
          JOIN (SELECT id_cliente, MAX(id) AS max_id FROM cotizacion_venta GROUP BY id_cliente) u
            ON u.max_id = cv.id
       ) x ON x.id_cliente = cu.id_cliente AND x.id_usuario_vendedor = cu.id_usuario
   SET cu.es_principal = 1;

UPDATE cliente_usuario cu
  JOIN cliente c ON c.id = cu.id_cliente AND c.usuario_modifico = cu.id_usuario
   SET cu.es_principal = 1
 WHERE NOT EXISTS (SELECT 1 FROM (SELECT id_cliente FROM cliente_usuario WHERE es_principal = 1) p
                    WHERE p.id_cliente = cu.id_cliente);

-- ── 2 · Datos de la solicitud ──────────────────────────────
ALTER TABLE `cotizacion_venta`
  ADD COLUMN `id_cliente_contacto` int(10) unsigned DEFAULT NULL AFTER `id_cliente`,
  ADD COLUMN `solicitante_nombre` varchar(150) DEFAULT NULL AFTER `id_cliente_contacto`,
  ADD COLUMN `solicitante_correo` varchar(150) DEFAULT NULL AFTER `solicitante_nombre`,
  ADD COLUMN `solicitante_telefono` varchar(30) DEFAULT NULL AFTER `solicitante_correo`,
  ADD COLUMN `nombre_proyecto` varchar(200) DEFAULT NULL AFTER `fecha_necesidad`,
  ADD COLUMN `descripcion_proyecto` text DEFAULT NULL AFTER `nombre_proyecto`,
  ADD COLUMN `lugar_entrega` varchar(200) DEFAULT NULL AFTER `descripcion_proyecto`,
  ADD COLUMN `direccion_entrega` text DEFAULT NULL AFTER `lugar_entrega`,
  ADD COLUMN `tiempo_entrega` varchar(100) DEFAULT NULL AFTER `direccion_entrega`,
  ADD COLUMN `tiempo_instalacion` varchar(100) DEFAULT NULL AFTER `tiempo_entrega`,
  ADD COLUMN `garantia` varchar(150) DEFAULT NULL AFTER `tiempo_instalacion`,
  ADD COLUMN `validez_oferta_dias` smallint(5) unsigned DEFAULT NULL AFTER `garantia`,
  ADD COLUMN `condiciones_pago` text DEFAULT NULL AFTER `validez_oferta_dias`,
  ADD COLUMN `tipo_margen` enum('global','por_item') NOT NULL DEFAULT 'global' AFTER `condiciones_pago`,
  ADD COLUMN `margen_global` decimal(5,2) DEFAULT NULL AFTER `tipo_margen`,
  ADD KEY `fk_cotizacion_venta_contacto` (`id_cliente_contacto`),
  ADD CONSTRAINT `fk_cotizacion_venta_contacto` FOREIGN KEY (`id_cliente_contacto`) REFERENCES `cliente_contacto` (`id`) ON DELETE SET NULL ON UPDATE CASCADE,
  ADD CONSTRAINT `chk_cv_margen_global` CHECK (`margen_global` IS NULL OR (`margen_global` >= 0 AND `margen_global` < 100));

-- ── 3 · Margen por línea del presupuesto ───────────────────
ALTER TABLE `cotizacion_venta_material`
  ADD COLUMN `margen` decimal(5,2) DEFAULT NULL AFTER `precio_unitario`;

-- ── 4 · Archivos adjuntos ──────────────────────────────────
CREATE TABLE `cotizacion_venta_adjunto` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `id_cotizacion_venta` int(10) unsigned NOT NULL,
  `tipo` enum('imagen','documento','cad','otro') NOT NULL DEFAULT 'documento',
  `nombre_original` varchar(255) NOT NULL,
  `archivo` varchar(255) NOT NULL,
  `mime` varchar(120) DEFAULT NULL,
  `tamano` int(10) unsigned NOT NULL DEFAULT 0,
  `usuario_subio` int(10) unsigned DEFAULT NULL,
  `created_at` timestamp NOT NULL DEFAULT current_timestamp(),
  PRIMARY KEY (`id`),
  KEY `idx_cva_cotizacion` (`id_cotizacion_venta`),
  KEY `fk_cva_usuario` (`usuario_subio`),
  CONSTRAINT `fk_cva_cotizacion` FOREIGN KEY (`id_cotizacion_venta`) REFERENCES `cotizacion_venta` (`id`) ON DELETE CASCADE,
  CONSTRAINT `fk_cva_usuario` FOREIGN KEY (`usuario_subio`) REFERENCES `usuarios` (`id_usuario`) ON DELETE SET NULL ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;
