-- ============================================================
--  Migración 2026-09-18_01 · Marbetes (conteos de inventario físico)
-- ------------------------------------------------------------
--  conteo_inventario : una toma de inventario de UNA bodega.
--  conteo_marbete    : un marbete (etiqueta de conteo) por producto.
--                      Guarda foto del sistema al generarlo, conteo,
--                      recuento y el ajuste aplicado al cerrar.
--  El ajuste al cerrar se registra como movimiento_stock tipo 'ajuste'
--  (el trigger mantiene existencia_bodega); el marbete guarda el id del
--  movimiento para poder rastrearlo.
-- ============================================================
USE tinsa_db;

CREATE TABLE conteo_inventario (
  id             INT UNSIGNED NOT NULL AUTO_INCREMENT,
  codigo         VARCHAR(20) NULL,
  id_bodega      INT UNSIGNED NOT NULL,
  descripcion    VARCHAR(200) NULL,
  estado         ENUM('abierto','cerrado','anulado') NOT NULL DEFAULT 'abierto',
  id_usuario     INT UNSIGNED NULL,
  id_usuario_cierre INT UNSIGNED NULL,
  fecha_cierre   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_conteo_codigo (codigo),
  KEY fk_conteo_bodega (id_bodega),
  KEY fk_conteo_usuario (id_usuario),
  KEY fk_conteo_usuario_cierre (id_usuario_cierre),
  CONSTRAINT fk_conteo_bodega FOREIGN KEY (id_bodega) REFERENCES bodega (id) ON UPDATE CASCADE,
  CONSTRAINT fk_conteo_usuario FOREIGN KEY (id_usuario) REFERENCES usuarios (id_usuario) ON DELETE SET NULL ON UPDATE CASCADE,
  CONSTRAINT fk_conteo_usuario_cierre FOREIGN KEY (id_usuario_cierre) REFERENCES usuarios (id_usuario) ON DELETE SET NULL ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

CREATE TABLE conteo_marbete (
  id                  INT UNSIGNED NOT NULL AUTO_INCREMENT,
  id_conteo           INT UNSIGNED NOT NULL,
  numero              INT UNSIGNED NOT NULL,
  id_producto         INT UNSIGNED NOT NULL,
  id_ubicacion_bodega INT UNSIGNED NULL,
  cantidad_sistema    DECIMAL(12,4) NOT NULL DEFAULT 0,
  cantidad_contada    DECIMAL(12,4) NULL,
  cantidad_recuento   DECIMAL(12,4) NULL,
  estado              ENUM('pendiente','contado','anulado') NOT NULL DEFAULT 'pendiente',
  id_usuario_conteo   INT UNSIGNED NULL,
  fecha_conteo        DATETIME NULL,
  cantidad_sistema_cierre DECIMAL(12,4) NULL,
  cantidad_ajuste     DECIMAL(12,4) NULL,
  id_movimiento       INT UNSIGNED NULL,
  adicional           TINYINT(1) NOT NULL DEFAULT 0,
  PRIMARY KEY (id),
  UNIQUE KEY uq_marbete_numero (id_conteo, numero),
  UNIQUE KEY uq_marbete_producto (id_conteo, id_producto),
  KEY fk_marbete_producto (id_producto),
  KEY fk_marbete_ubicacion (id_ubicacion_bodega),
  KEY fk_marbete_usuario (id_usuario_conteo),
  KEY fk_marbete_movimiento (id_movimiento),
  CONSTRAINT fk_marbete_conteo FOREIGN KEY (id_conteo) REFERENCES conteo_inventario (id) ON DELETE CASCADE ON UPDATE CASCADE,
  CONSTRAINT fk_marbete_producto FOREIGN KEY (id_producto) REFERENCES producto (id) ON UPDATE CASCADE,
  CONSTRAINT fk_marbete_ubicacion FOREIGN KEY (id_ubicacion_bodega) REFERENCES ubicacion_bodega (id) ON DELETE SET NULL ON UPDATE CASCADE,
  CONSTRAINT fk_marbete_usuario FOREIGN KEY (id_usuario_conteo) REFERENCES usuarios (id_usuario) ON DELETE SET NULL ON UPDATE CASCADE,
  CONSTRAINT fk_marbete_movimiento FOREIGN KEY (id_movimiento) REFERENCES movimiento_stock (id) ON DELETE SET NULL ON UPDATE CASCADE,
  CONSTRAINT chk_marbete_cant_no_neg CHECK (
    (cantidad_contada IS NULL OR cantidad_contada >= 0) AND (cantidad_recuento IS NULL OR cantidad_recuento >= 0))
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

-- Pestaña + permisos del rol Administrador
INSERT INTO pestanas (id_modulo, nombre, ruta, icono, orden, estado)
VALUES (1, 'Marbetes', '/inventario/marbetes', 'fa-tags', 8, 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 = '/inventario/marbetes';
