-- ============================================================
--  Migración 2026-09-03_01 · Órdenes de compra
-- ------------------------------------------------------------
--  Cierra el flujo de Compras: la selección de cotización ya deja
--  una cotizacion_compra 'cerrada' con proveedor ganador, pero no
--  había de dónde generar la orden ni hacer avanzar la solicitud
--  (en_compras / comprada / en_bodega quedaban muertos en el enum).
--
--  Añade:
--    · orden_compra + orden_compra_item
--    · orden_compra_recepcion + orden_compra_recepcion_item
--    · orden_compra_historial  (bitácora de estado, igual que solicitud)
--    · proveedor.nit
--    · 3 pestañas nuevas + permisos del rol Administrador
--
--  Recepción de mercadería: el modelo inserta en movimiento_stock
--  (tipo='entrada', tipo_referencia='orden_compra'); el trigger
--  trg_mov_stock_ai mantiene existencia_bodega (única fuente de verdad).
-- ============================================================
USE tinsa_db;

-- ── proveedor.nit ───────────────────────────────────────────
ALTER TABLE proveedor
  ADD COLUMN nit VARCHAR(30) NULL AFTER nombre;

-- ── orden_compra ────────────────────────────────────────────
CREATE TABLE orden_compra (
  id                      INT UNSIGNED NOT NULL AUTO_INCREMENT,
  numero                  VARCHAR(30)  NOT NULL,
  origen                  ENUM('cotizacion','directa') NOT NULL DEFAULT 'cotizacion',
  id_cotizacion           INT UNSIGNED NULL,
  id_cotizacion_proveedor INT UNSIGNED NULL,
  id_solicitud            INT UNSIGNED NULL,
  id_proveedor            INT UNSIGNED NOT NULL,
  id_sucursal             INT UNSIGNED NULL,
  id_bodega_destino       INT UNSIGNED NULL,
  id_departamento         INT UNSIGNED NULL,
  id_usuario_creo         INT UNSIGNED NOT NULL,
  id_usuario_aprobo       INT UNSIGNED NULL,
  id_usuario_pago         INT UNSIGNED NULL,
  prioridad               ENUM('baja','normal','alta') NOT NULL DEFAULT 'normal',
  estado                  ENUM('borrador','pendiente_aprobacion','aprobada','rechazada',
                               'con_observaciones','enviada','confirmada','recibida_parcial',
                               'recibida','cancelada') NOT NULL DEFAULT 'borrador',
  forma_pago              ENUM('contado','credito') NOT NULL DEFAULT 'credito',
  dias_credito            INT UNSIGNED NOT NULL DEFAULT 0,
  condicion_pago          VARCHAR(150) NULL,
  tiempo_entrega          VARCHAR(100) NULL,
  observaciones           TEXT NULL,
  subtotal                DECIMAL(12,2) NOT NULL DEFAULT 0.00,
  descuento               DECIMAL(12,2) NOT NULL DEFAULT 0.00,
  impuesto                DECIMAL(12,2) NOT NULL DEFAULT 0.00,
  total                   DECIMAL(12,2) NOT NULL DEFAULT 0.00,
  fecha_creacion          DATE NULL,
  fecha_aprobacion        DATETIME NULL,
  fecha_envio             DATETIME NULL,
  fecha_recepcion         DATETIME NULL,
  estado_pago             ENUM('no_aplica','pendiente','pagada') NOT NULL DEFAULT 'pendiente',
  fecha_pago_estimada     DATE NULL,
  fecha_pago              DATETIME NULL,
  referencia_pago         VARCHAR(80) NULL,
  created_at              TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
  updated_at              TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  PRIMARY KEY (id),
  UNIQUE KEY uq_orden_compra_numero (numero),
  UNIQUE KEY uq_orden_compra_cotizacion (id_cotizacion),
  KEY fk_orden_compra_solicitud (id_solicitud),
  KEY fk_orden_compra_proveedor (id_proveedor),
  KEY fk_orden_compra_sucursal (id_sucursal),
  KEY fk_orden_compra_bodega (id_bodega_destino),
  KEY fk_orden_compra_departamento (id_departamento),
  KEY fk_orden_compra_usuario_creo (id_usuario_creo),
  KEY idx_orden_compra_estado (estado),
  KEY idx_orden_compra_pago (estado_pago, fecha_pago_estimada),
  CONSTRAINT fk_orden_compra_cotizacion
    FOREIGN KEY (id_cotizacion) REFERENCES cotizacion_compra (id) ON DELETE SET NULL ON UPDATE CASCADE,
  CONSTRAINT fk_orden_compra_cotizacion_proveedor
    FOREIGN KEY (id_cotizacion_proveedor) REFERENCES cotizacion_compra_proveedor (id) ON DELETE SET NULL ON UPDATE CASCADE,
  CONSTRAINT fk_orden_compra_solicitud
    FOREIGN KEY (id_solicitud) REFERENCES solicitud_compra (id) ON DELETE SET NULL ON UPDATE CASCADE,
  CONSTRAINT fk_orden_compra_proveedor
    FOREIGN KEY (id_proveedor) REFERENCES proveedor (id) ON UPDATE CASCADE,
  CONSTRAINT fk_orden_compra_sucursal
    FOREIGN KEY (id_sucursal) REFERENCES sucursal (id) ON DELETE SET NULL ON UPDATE CASCADE,
  CONSTRAINT fk_orden_compra_bodega
    FOREIGN KEY (id_bodega_destino) REFERENCES bodega (id) ON DELETE SET NULL ON UPDATE CASCADE,
  CONSTRAINT fk_orden_compra_departamento
    FOREIGN KEY (id_departamento) REFERENCES departamento (id) ON DELETE SET NULL ON UPDATE CASCADE,
  CONSTRAINT fk_orden_compra_usuario_creo
    FOREIGN KEY (id_usuario_creo) REFERENCES usuarios (id_usuario) ON UPDATE CASCADE,
  CONSTRAINT fk_orden_compra_usuario_aprobo
    FOREIGN KEY (id_usuario_aprobo) REFERENCES usuarios (id_usuario) ON DELETE SET NULL ON UPDATE CASCADE,
  CONSTRAINT fk_orden_compra_usuario_pago
    FOREIGN KEY (id_usuario_pago) REFERENCES usuarios (id_usuario) ON DELETE SET NULL ON UPDATE CASCADE,
  CONSTRAINT chk_orden_compra_origen_cotizacion
    CHECK (origen <> 'cotizacion' OR id_cotizacion IS NOT NULL)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

-- ── orden_compra_item ───────────────────────────────────────
CREATE TABLE orden_compra_item (
  id                INT UNSIGNED NOT NULL AUTO_INCREMENT,
  id_orden          INT UNSIGNED NOT NULL,
  id_solicitud_item INT UNSIGNED NULL,
  id_producto       INT UNSIGNED NULL,
  descripcion       VARCHAR(255) NOT NULL,
  cantidad          DECIMAL(12,4) NOT NULL,
  unidad_medida     VARCHAR(50) NULL,
  precio_unitario   DECIMAL(12,4) NOT NULL DEFAULT 0.0000,
  descuento_pct     DECIMAL(5,2)  NOT NULL DEFAULT 0.00,
  impuesto_pct      DECIMAL(5,2)  NOT NULL DEFAULT 0.00,
  subtotal          DECIMAL(12,2) NOT NULL DEFAULT 0.00,
  cantidad_recibida DECIMAL(12,4) NOT NULL DEFAULT 0.0000,
  PRIMARY KEY (id),
  KEY fk_orden_compra_item_orden (id_orden),
  KEY fk_orden_compra_item_solicitud_item (id_solicitud_item),
  KEY fk_orden_compra_item_producto (id_producto),
  CONSTRAINT fk_orden_compra_item_orden
    FOREIGN KEY (id_orden) REFERENCES orden_compra (id) ON DELETE CASCADE ON UPDATE CASCADE,
  CONSTRAINT fk_orden_compra_item_solicitud_item
    FOREIGN KEY (id_solicitud_item) REFERENCES solicitud_compra_item (id) ON DELETE SET NULL ON UPDATE CASCADE,
  CONSTRAINT fk_orden_compra_item_producto
    FOREIGN KEY (id_producto) REFERENCES producto (id) ON DELETE SET NULL ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

-- ── orden_compra_recepcion ──────────────────────────────────
CREATE TABLE orden_compra_recepcion (
  id             INT UNSIGNED NOT NULL AUTO_INCREMENT,
  id_orden       INT UNSIGNED NOT NULL,
  fecha          DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
  id_bodega      INT UNSIGNED NOT NULL,
  id_usuario     INT UNSIGNED NULL,
  numero_factura VARCHAR(80) NULL,
  observaciones  TEXT NULL,
  created_at     TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
  PRIMARY KEY (id),
  KEY fk_orden_compra_recepcion_orden (id_orden),
  KEY fk_orden_compra_recepcion_bodega (id_bodega),
  KEY fk_orden_compra_recepcion_usuario (id_usuario),
  CONSTRAINT fk_orden_compra_recepcion_orden
    FOREIGN KEY (id_orden) REFERENCES orden_compra (id) ON DELETE CASCADE ON UPDATE CASCADE,
  CONSTRAINT fk_orden_compra_recepcion_bodega
    FOREIGN KEY (id_bodega) REFERENCES bodega (id) ON UPDATE CASCADE,
  CONSTRAINT fk_orden_compra_recepcion_usuario
    FOREIGN KEY (id_usuario) REFERENCES usuarios (id_usuario) ON DELETE SET NULL ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

-- ── orden_compra_recepcion_item ─────────────────────────────
CREATE TABLE orden_compra_recepcion_item (
  id            INT UNSIGNED NOT NULL AUTO_INCREMENT,
  id_recepcion  INT UNSIGNED NOT NULL,
  id_orden_item INT UNSIGNED NOT NULL,
  cantidad      DECIMAL(12,4) NOT NULL,
  PRIMARY KEY (id),
  KEY fk_orden_compra_recepcion_item_recepcion (id_recepcion),
  KEY fk_orden_compra_recepcion_item_orden_item (id_orden_item),
  CONSTRAINT fk_orden_compra_recepcion_item_recepcion
    FOREIGN KEY (id_recepcion) REFERENCES orden_compra_recepcion (id) ON DELETE CASCADE ON UPDATE CASCADE,
  CONSTRAINT fk_orden_compra_recepcion_item_orden_item
    FOREIGN KEY (id_orden_item) REFERENCES orden_compra_item (id) ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

-- ── orden_compra_historial ──────────────────────────────────
CREATE TABLE orden_compra_historial (
  id              INT UNSIGNED NOT NULL AUTO_INCREMENT,
  id_orden        INT UNSIGNED NOT NULL,
  estado_anterior VARCHAR(30) NULL,
  estado_nuevo    VARCHAR(30) NOT NULL,
  observaciones   TEXT NULL,
  id_usuario      INT UNSIGNED NOT NULL,
  created_at      TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
  PRIMARY KEY (id),
  KEY fk_orden_compra_historial_orden (id_orden),
  KEY fk_orden_compra_historial_usuario (id_usuario),
  CONSTRAINT fk_orden_compra_historial_orden
    FOREIGN KEY (id_orden) REFERENCES orden_compra (id) ON DELETE CASCADE ON UPDATE CASCADE,
  CONSTRAINT fk_orden_compra_historial_usuario
    FOREIGN KEY (id_usuario) REFERENCES usuarios (id_usuario) ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

-- ── Pestañas nuevas (módulo Compras = 2) ────────────────────
INSERT INTO pestanas (id_modulo, nombre, ruta, icono, orden, estado) VALUES
  (2, 'Órdenes de compra',      '/compras/ordenes',              'fa-file-lines',         7, 1),
  (2, 'Aprobación de órdenes',  '/compras/aprobacion-ordenes',   'fa-clipboard-check',    8, 1),
  (2, 'Pagos a proveedores',    '/compras/pagos',                'fa-money-check-dollar', 9, 1);

-- Permisos completos para el rol Administrador (id 1) sobre las 3 pestañas nuevas
INSERT INTO permisos_roles (id_rol, id_pestana, puede_leer, puede_escribir, puede_eliminar)
SELECT 1, p.id, 1, 1, 1
FROM pestanas p
WHERE p.ruta IN ('/compras/ordenes', '/compras/aprobacion-ordenes', '/compras/pagos');
