-- ============================================================
--  Migración 2026-09-25_04 · Traslados entre bodegas
-- ------------------------------------------------------------
--  Ciclo completo: solicitud → aprobación → documento de salida (baja de
--  stock en la bodega origen) → confirmación de entrada (alta de stock en
--  la bodega destino, con las MISMAS cantidades del documento de salida —
--  no se vuelve a capturar nada al recibir).
--
--  Los movimientos de stock usan el tipo 'traslado' que ya existía en
--  movimiento_stock (con tipo_referencia 'origen'/'destino'), el mismo que
--  usaba el traslado manual directo que se quitó de Movimientos —
--  fn_stock_delta y el CHECK chk_mov_traslado_dir ya lo soportan sin
--  cambios. id_referencia de cada movimiento apunta al id del traslado.
-- ============================================================
USE tinsa_db;

CREATE TABLE traslado_bodega (
  id                    INT UNSIGNED NOT NULL AUTO_INCREMENT,
  numero                VARCHAR(30) NOT NULL,
  id_bodega_origen      INT UNSIGNED NOT NULL,
  id_bodega_destino     INT UNSIGNED NOT NULL,
  id_usuario_solicito   INT UNSIGNED NOT NULL,
  id_usuario_aprobo     INT UNSIGNED NULL,
  id_usuario_envio      INT UNSIGNED NULL,
  id_usuario_recibio    INT UNSIGNED NULL,
  estado                ENUM('borrador','pendiente_aprobacion','aprobado','rechazado','enviado','recibido','cancelado')
                          NOT NULL DEFAULT 'borrador',
  motivo                TEXT NULL,
  observaciones_rechazo    TEXT NULL,
  observaciones_envio      TEXT NULL,
  observaciones_recepcion  TEXT NULL,
  fecha_envio_aprobacion   DATETIME NULL,
  fecha_aprobacion         DATETIME NULL,
  fecha_envio              DATETIME NULL,
  fecha_recepcion          DATETIME 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_traslado_numero (numero),
  KEY fk_tb_bodega_origen (id_bodega_origen),
  KEY fk_tb_bodega_destino (id_bodega_destino),
  KEY fk_tb_usuario_solicito (id_usuario_solicito),
  KEY fk_tb_usuario_aprobo (id_usuario_aprobo),
  KEY fk_tb_usuario_envio (id_usuario_envio),
  KEY fk_tb_usuario_recibio (id_usuario_recibio),
  CONSTRAINT fk_tb_bodega_origen  FOREIGN KEY (id_bodega_origen)  REFERENCES bodega (id) ON UPDATE CASCADE,
  CONSTRAINT fk_tb_bodega_destino FOREIGN KEY (id_bodega_destino) REFERENCES bodega (id) ON UPDATE CASCADE,
  CONSTRAINT fk_tb_usuario_solicito FOREIGN KEY (id_usuario_solicito) REFERENCES usuarios (id_usuario) ON UPDATE CASCADE,
  CONSTRAINT fk_tb_usuario_aprobo   FOREIGN KEY (id_usuario_aprobo)   REFERENCES usuarios (id_usuario) ON DELETE SET NULL ON UPDATE CASCADE,
  CONSTRAINT fk_tb_usuario_envio    FOREIGN KEY (id_usuario_envio)    REFERENCES usuarios (id_usuario) ON DELETE SET NULL ON UPDATE CASCADE,
  CONSTRAINT fk_tb_usuario_recibio  FOREIGN KEY (id_usuario_recibio)  REFERENCES usuarios (id_usuario) ON DELETE SET NULL ON UPDATE CASCADE,
  CONSTRAINT chk_tb_bodegas_distintas CHECK (id_bodega_origen <> id_bodega_destino)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

CREATE TABLE traslado_bodega_item (
  id                   INT UNSIGNED NOT NULL AUTO_INCREMENT,
  id_traslado          INT UNSIGNED NOT NULL,
  id_producto          INT UNSIGNED NOT NULL,
  cantidad_solicitada  DECIMAL(12,4) NOT NULL,
  cantidad_enviada     DECIMAL(12,4) NOT NULL DEFAULT 0,
  PRIMARY KEY (id),
  UNIQUE KEY uq_tbi_traslado_producto (id_traslado, id_producto),
  KEY fk_tbi_producto (id_producto),
  CONSTRAINT fk_tbi_traslado FOREIGN KEY (id_traslado) REFERENCES traslado_bodega (id) ON DELETE CASCADE ON UPDATE CASCADE,
  CONSTRAINT fk_tbi_producto FOREIGN KEY (id_producto) REFERENCES producto (id) ON UPDATE CASCADE,
  CONSTRAINT chk_tbi_solicitada_pos CHECK (cantidad_solicitada > 0),
  CONSTRAINT chk_tbi_enviada_no_neg CHECK (cantidad_enviada >= 0)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

CREATE TABLE traslado_bodega_historial (
  id               INT UNSIGNED NOT NULL AUTO_INCREMENT,
  id_traslado      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_tbh_traslado (id_traslado),
  KEY fk_tbh_usuario (id_usuario),
  CONSTRAINT fk_tbh_traslado FOREIGN KEY (id_traslado) REFERENCES traslado_bodega (id) ON DELETE CASCADE ON UPDATE CASCADE,
  CONSTRAINT fk_tbh_usuario  FOREIGN KEY (id_usuario)  REFERENCES usuarios (id_usuario) ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

-- Pestañas + permisos del rol Administrador
INSERT INTO pestanas (id_modulo, nombre, ruta, icono, orden, estado) VALUES
  (1, 'Traslados entre bodegas',  '/inventario/traslados',            'fa-truck-ramp-box', 9, 1),
  (1, 'Aprobación de traslados',  '/inventario/aprobacion-traslados', 'fa-clipboard-check', 10, 1);

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 ('/inventario/traslados', '/inventario/aprobacion-traslados');
