-- =============================================================================
-- 09 — COMPRAS: órdenes de compra + recepciones + facturas de proveedor + ctas ctes
-- =============================================================================

-- ÓRDENES DE COMPRA (lo que VOS le pedís al proveedor)
CREATE TABLE IF NOT EXISTS ordenes_compra (
    id              INT AUTO_INCREMENT PRIMARY KEY,
    id_proveedor    INT NOT NULL,
    numero_oc       VARCHAR(40) UNIQUE,             -- número correlativo o lo que uses
    estado          ENUM('borrador','enviada','confirmada','parcial','recibida','cancelada') DEFAULT 'borrador',
    fecha_creacion  TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    fecha_envio     TIMESTAMP NULL,
    fecha_entrega_estimada DATE,
    fecha_entrega_real     TIMESTAMP NULL,
    subtotal        DECIMAL(12,2) DEFAULT 0,
    iva             DECIMAL(12,2) DEFAULT 0,
    total           DECIMAL(12,2) DEFAULT 0,
    notas           TEXT,
    id_usuario_alta INT,
    FOREIGN KEY (id_proveedor) REFERENCES proveedores(id),
    INDEX (id_proveedor, fecha_creacion),
    INDEX (estado, fecha_entrega_estimada)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

CREATE TABLE IF NOT EXISTS ordenes_compra_items (
    id              INT AUTO_INCREMENT PRIMARY KEY,
    id_orden_compra INT NOT NULL,
    id_insumo       INT NOT NULL,
    cantidad        DECIMAL(12,3) NOT NULL,         -- en unidad de COMPRA
    precio_unit     DECIMAL(12,4) NOT NULL,
    subtotal        DECIMAL(12,2),
    -- Para tracking de recepciones parciales:
    cantidad_recibida DECIMAL(12,3) DEFAULT 0,
    FOREIGN KEY (id_orden_compra) REFERENCES ordenes_compra(id) ON DELETE CASCADE,
    FOREIGN KEY (id_insumo)       REFERENCES insumos(id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

-- RECEPCIONES: cuando llega la mercadería del proveedor
-- Una OC puede tener varias recepciones (parciales). Cada recepción es la que dispara
-- los movimientos de stock_entrada.
CREATE TABLE IF NOT EXISTS recepciones (
    id              INT AUTO_INCREMENT PRIMARY KEY,
    id_orden_compra INT NOT NULL,
    id_proveedor    INT NOT NULL,
    numero_remito   VARCHAR(60),                    -- el del proveedor
    fecha_recepcion TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    id_usuario_recibe INT,
    notas           TEXT,
    fotos_urls      JSON,                            -- URLs de fotos de la mercadería
    FOREIGN KEY (id_orden_compra) REFERENCES ordenes_compra(id),
    FOREIGN KEY (id_proveedor)    REFERENCES proveedores(id),
    INDEX (id_orden_compra),
    INDEX (fecha_recepcion)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

CREATE TABLE IF NOT EXISTS recepciones_items (
    id              INT AUTO_INCREMENT PRIMARY KEY,
    id_recepcion    INT NOT NULL,
    id_insumo       INT NOT NULL,
    cantidad        DECIMAL(12,3) NOT NULL,
    costo_unit      DECIMAL(12,4),                  -- por si el proveedor cambió el precio
    lote            VARCHAR(60),                     -- útil para trazabilidad
    fecha_vencimiento DATE NULL,
    FOREIGN KEY (id_recepcion) REFERENCES recepciones(id) ON DELETE CASCADE,
    FOREIGN KEY (id_insumo)    REFERENCES insumos(id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

-- FACTURAS DE PROVEEDOR (lo que vos le pagás)
CREATE TABLE IF NOT EXISTS facturas_proveedor (
    id              INT AUTO_INCREMENT PRIMARY KEY,
    id_proveedor    INT NOT NULL,
    id_orden_compra INT NULL,                        -- puede no estar atada a una OC
    tipo_comprobante VARCHAR(10),                    -- A, B, C, FA, etc.
    numero          VARCHAR(40),                     -- el número de la factura
    fecha_emision   DATE NOT NULL,
    fecha_vencimiento DATE,
    subtotal        DECIMAL(12,2),
    iva             DECIMAL(12,2),
    percepciones    DECIMAL(12,2) DEFAULT 0,
    total           DECIMAL(12,2),
    saldo_pendiente DECIMAL(12,2),                   -- decrementa con pagos parciales
    estado          ENUM('pendiente','parcial','pagada','anulada') DEFAULT 'pendiente',
    archivo_pdf_url VARCHAR(255),
    notas           TEXT,
    fecha_carga     TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    FOREIGN KEY (id_proveedor)    REFERENCES proveedores(id),
    FOREIGN KEY (id_orden_compra) REFERENCES ordenes_compra(id),
    INDEX (id_proveedor, fecha_emision),
    INDEX (estado, fecha_vencimiento)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

-- PAGOS A PROVEEDORES
CREATE TABLE IF NOT EXISTS pagos_proveedor (
    id              INT AUTO_INCREMENT PRIMARY KEY,
    id_proveedor    INT NOT NULL,
    fecha           DATE NOT NULL,
    monto           DECIMAL(12,2) NOT NULL,
    forma_pago      ENUM('efectivo','transferencia','cheque','tarjeta','otros') NOT NULL,
    referencia      VARCHAR(120),                    -- nro de transferencia, cheque, etc.
    notas           TEXT,
    id_usuario      INT,
    fecha_carga     TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    FOREIGN KEY (id_proveedor) REFERENCES proveedores(id),
    INDEX (id_proveedor, fecha)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

-- Asociación pago ↔ facturas (1 pago puede cubrir varias facturas, 1 factura recibir varios pagos)
CREATE TABLE IF NOT EXISTS pagos_proveedor_facturas (
    id_pago_proveedor INT NOT NULL,
    id_factura        INT NOT NULL,
    monto_aplicado    DECIMAL(12,2) NOT NULL,
    PRIMARY KEY (id_pago_proveedor, id_factura),
    FOREIGN KEY (id_pago_proveedor) REFERENCES pagos_proveedor(id)    ON DELETE CASCADE,
    FOREIGN KEY (id_factura)        REFERENCES facturas_proveedor(id) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
