-- ═══════════════════════════════════════════════════════════════════════
-- 2026-10-19_02 · Ingreso de compras desde el JSON del DTE del proveedor
--
-- Pedido del usuario: "en inventario y bodega alguna forma de ingresar una
-- compra a través de JSON". Decisiones del usuario:
--   * el JSON es el DTE que manda el proveedor (formato de Hacienda);
--   * se aplica como RECEPCIÓN de una orden de compra abierta del proveedor
--     o, si no hay, como COMPRA DIRECTA con entrada a bodega;
--   * las líneas que no coinciden se emparejan a mano con un producto y el
--     sistema RECUERDA la equivalencia por proveedor (con factor de unidades).
--
-- Respaldo previo: backups/tinsa_db_pre-compras-dte_2026-10-19.sql
-- Reversa: database/rollback/2026-10-19_02_compras_dte.sql
-- ═══════════════════════════════════════════════════════════════════════

ALTER TABLE proveedor ADD COLUMN nrc VARCHAR(20) DEFAULT NULL AFTER nit;

CREATE TABLE compra_dte (
  id                 INT(10) UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
  codigo_generacion  CHAR(36) NOT NULL,
  numero_control     VARCHAR(31) NOT NULL,
  tipo_dte           CHAR(2) NOT NULL,
  fecha_emision      DATE NOT NULL,
  id_proveedor       INT(10) UNSIGNED NOT NULL,
  emisor_nombre      VARCHAR(250) NOT NULL,
  emisor_nit         VARCHAR(20) DEFAULT NULL,
  emisor_nrc         VARCHAR(20) DEFAULT NULL,
  modo               ENUM('orden','directa') NOT NULL,
  id_orden           INT(10) UNSIGNED DEFAULT NULL,
  id_recepcion       INT(10) UNSIGNED DEFAULT NULL,
  id_bodega          INT(10) UNSIGNED NOT NULL,
  total_gravada      DECIMAL(14,2) NOT NULL DEFAULT 0,
  iva                DECIMAL(14,2) NOT NULL DEFAULT 0,
  total_pagar        DECIMAL(14,2) NOT NULL DEFAULT 0,
  json_original      LONGTEXT NOT NULL,
  observaciones      VARCHAR(500) DEFAULT NULL,
  id_usuario         INT(10) UNSIGNED DEFAULT NULL,
  created_at         TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
  UNIQUE KEY uq_compra_dte_codigo (codigo_generacion),
  KEY fk_compra_dte_proveedor (id_proveedor),
  KEY fk_compra_dte_orden (id_orden),
  CONSTRAINT fk_compra_dte_proveedor FOREIGN KEY (id_proveedor) REFERENCES proveedor (id) ON UPDATE CASCADE,
  CONSTRAINT fk_compra_dte_orden FOREIGN KEY (id_orden) REFERENCES orden_compra (id) ON UPDATE CASCADE,
  CONSTRAINT fk_compra_dte_recepcion FOREIGN KEY (id_recepcion) REFERENCES orden_compra_recepcion (id) ON DELETE SET NULL ON UPDATE CASCADE,
  CONSTRAINT fk_compra_dte_bodega FOREIGN KEY (id_bodega) REFERENCES bodega (id) ON UPDATE CASCADE,
  CONSTRAINT fk_compra_dte_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;

CREATE TABLE compra_dte_item (
  id                 INT(10) UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
  id_compra          INT(10) UNSIGNED NOT NULL,
  num_item           SMALLINT UNSIGNED NOT NULL,
  codigo             VARCHAR(60) DEFAULT NULL,
  descripcion        VARCHAR(1000) NOT NULL,
  cantidad           DECIMAL(14,4) NOT NULL,
  precio_unitario    DECIMAL(14,6) NOT NULL DEFAULT 0,
  descuento          DECIMAL(14,2) NOT NULL DEFAULT 0,
  monto              DECIMAL(14,2) NOT NULL DEFAULT 0,
  omitido            TINYINT(1) NOT NULL DEFAULT 0 COMMENT 'servicio, flete u otra línea que no entra a bodega',
  id_producto        INT(10) UNSIGNED DEFAULT NULL,
  id_orden_item      INT(10) UNSIGNED DEFAULT NULL,
  factor             DECIMAL(12,4) NOT NULL DEFAULT 1 COMMENT 'unidades de inventario por unidad del DTE',
  cantidad_ingresada DECIMAL(14,4) NOT NULL DEFAULT 0 COMMENT 'en unidades de inventario',
  costo_unitario     DECIMAL(14,6) NOT NULL DEFAULT 0 COMMENT 'por unidad de inventario',
  KEY fk_compra_dte_item_compra (id_compra),
  CONSTRAINT fk_compra_dte_item_compra FOREIGN KEY (id_compra) REFERENCES compra_dte (id) ON DELETE CASCADE ON UPDATE CASCADE,
  CONSTRAINT fk_compra_dte_item_producto FOREIGN KEY (id_producto) REFERENCES producto (id) ON DELETE SET NULL ON UPDATE CASCADE,
  CONSTRAINT fk_compra_dte_item_oc FOREIGN KEY (id_orden_item) REFERENCES orden_compra_item (id) ON DELETE SET NULL ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

-- Equivalencias recordadas: línea del proveedor (código o descripción) → producto
CREATE TABLE proveedor_producto_equivalencia (
  id            INT(10) UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
  id_proveedor  INT(10) UNSIGNED NOT NULL,
  clave         VARCHAR(255) NOT NULL COMMENT 'c:CODIGO o d:descripción normalizada',
  id_producto   INT(10) UNSIGNED DEFAULT NULL COMMENT 'null = la línea se omite (servicio, flete)',
  factor        DECIMAL(12,4) NOT NULL DEFAULT 1,
  usos          INT(10) UNSIGNED NOT NULL DEFAULT 1,
  updated_at    TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  UNIQUE KEY uq_equivalencia (id_proveedor, clave),
  CONSTRAINT fk_equiv_proveedor FOREIGN KEY (id_proveedor) REFERENCES proveedor (id) ON DELETE CASCADE ON UPDATE CASCADE,
  CONSTRAINT fk_equiv_producto FOREIGN KEY (id_producto) REFERENCES producto (id) ON DELETE CASCADE ON UPDATE CASCADE,
  CONSTRAINT chk_equiv_factor CHECK (factor > 0)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

INSERT INTO pestanas (id_modulo, nombre, ruta, icono, orden, estado) VALUES
  (1, 'Compras por DTE', '/compras/dte', 'fa-file-import', 12, 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 = '/compras/dte';
