-- ============================================================
--  Migración 2026-09-07_01 · Devoluciones al proveedor (compras)
-- ------------------------------------------------------------
--  Devolver mercadería recibida de una orden de compra: saca el
--  stock (movimiento_stock tipo 'salida', tipo_referencia
--  'devolucion_compra' — el trigger trg_mov_stock_ai baja
--  existencia_bodega y bloquea negativos), descuenta del pago de
--  esa recepción si sigue pendiente, o registra saldo a favor con
--  el proveedor si esa entrega ya se pagó.
--
--  Cada devolución cuelga de UNA recepción concreta (de qué entrega
--  se devuelve), para que la plata cuadre contra el monto de esa
--  recepción.
-- ============================================================
USE tinsa_db;

ALTER TABLE orden_compra_item
  ADD COLUMN cantidad_devuelta DECIMAL(12,4) NOT NULL DEFAULT 0.0000 AFTER cantidad_recibida;

CREATE TABLE orden_compra_devolucion (
  id                  INT UNSIGNED NOT NULL AUTO_INCREMENT,
  numero              VARCHAR(30) NOT NULL,
  id_orden            INT UNSIGNED NOT NULL,
  id_recepcion        INT UNSIGNED NULL,
  fecha               DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
  id_bodega           INT UNSIGNED NOT NULL,
  id_usuario          INT UNSIGNED NULL,
  motivo              ENUM('defectuoso','equivocado','exceso','danado_transito','otro') NOT NULL DEFAULT 'defectuoso',
  observaciones       TEXT NULL,
  numero_nota_credito VARCHAR(80) NULL,
  monto               DECIMAL(12,2) NOT NULL DEFAULT 0.00,
  efecto_pago         ENUM('descuenta_pago','saldo_a_favor','no_aplica') NOT NULL DEFAULT 'no_aplica',
  saldo_a_favor       DECIMAL(12,2) NOT NULL DEFAULT 0.00,
  created_at          TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
  PRIMARY KEY (id),
  UNIQUE KEY uq_orden_compra_devolucion_numero (numero),
  KEY fk_ocd_orden (id_orden),
  KEY fk_ocd_recepcion (id_recepcion),
  KEY fk_ocd_bodega (id_bodega),
  KEY fk_ocd_usuario (id_usuario),
  CONSTRAINT fk_ocd_orden
    FOREIGN KEY (id_orden) REFERENCES orden_compra (id) ON DELETE CASCADE ON UPDATE CASCADE,
  CONSTRAINT fk_ocd_recepcion
    FOREIGN KEY (id_recepcion) REFERENCES orden_compra_recepcion (id) ON DELETE SET NULL ON UPDATE CASCADE,
  CONSTRAINT fk_ocd_bodega
    FOREIGN KEY (id_bodega) REFERENCES bodega (id) ON UPDATE CASCADE,
  CONSTRAINT fk_ocd_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 orden_compra_devolucion_item (
  id            INT UNSIGNED NOT NULL AUTO_INCREMENT,
  id_devolucion INT UNSIGNED NOT NULL,
  id_orden_item INT UNSIGNED NOT NULL,
  cantidad      DECIMAL(12,4) NOT NULL,
  PRIMARY KEY (id),
  KEY fk_ocdi_devolucion (id_devolucion),
  KEY fk_ocdi_orden_item (id_orden_item),
  CONSTRAINT fk_ocdi_devolucion
    FOREIGN KEY (id_devolucion) REFERENCES orden_compra_devolucion (id) ON DELETE CASCADE ON UPDATE CASCADE,
  CONSTRAINT fk_ocdi_orden_item
    FOREIGN KEY (id_orden_item) REFERENCES orden_compra_item (id) ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
