ALTER PROCEDURE [dbo].[sp_cotDespachosPendientes]
(
    @numdoci    INT,
    @numdocf    INT,
    @cliente    INT,
    @codsuc     INT,
    @entregai   DATE,
    @entregaf   DATE,
    @codven     INT,
    @codana     INT
)
AS

-- =====================================================
-- PASO 1: Crear tabla temporal con cantidades despachadas
-- =====================================================
CREATE TABLE #CantidadesDespacho (
    Num_NP BIGINT,
    Cod_bus VARCHAR(30),
    idlinea VARCHAR(20),
    cant_des DECIMAL(18, 4)
)

-- Insertar cantidades despachadas calculadas
INSERT INTO #CantidadesDespacho (Num_NP, Cod_bus, idlinea, cant_des)
SELECT 
    REF.Num_NP,
    REF.Cod_bus,
    REF.idlinea,
    -- Cantidad despachada (excluyendo NC 60,61) - Notas de Crédito (60,61)
    COALESCE(SUM(CASE 
        WHEN REF.Tip_ref NOT IN (60, 61) THEN REF.cantidad 
        ELSE 0 
    END), 0) - 
    COALESCE(SUM(CASE 
        WHEN REF.Tip_ref IN (60, 61) THEN REF.cantidad 
        ELSE 0 
    END), 0) AS cant_des
FROM cotReferencias AS REF
LEFT OUTER JOIN venEncabezado e
    ON REF.Tip_ref = e.codsii
    AND REF.Num_ref = e.numinv
WHERE 
    -- Solo incluir registros donde NO hay factura anticipada o la factura anticipada es válida
    (e.facturaanticipada IS NULL 
     OR e.facturaanticipada = 1 
     OR (e.facturaanticipada = 0 AND e.tip_con = 0 AND e.doc_con = 0))
GROUP BY REF.Num_NP, REF.Cod_bus, REF.idlinea

-- Crear índice para mejorar los JOINs
CREATE CLUSTERED INDEX IX_CantDesp ON #CantidadesDespacho(Num_NP, Cod_bus, idlinea)

-- =====================================================
-- PASO 2: Consulta principal con cantidades precalculadas
-- =====================================================
SELECT
    cotNotaPedido.numdoc AS NP,
    cotNotaPedido.orden_compra AS Orden_de_Compra, 
    venVendedores.nomven AS Vendedor,
    cotNotaPedido.cliente AS RutCliente,
    conCtacte.nomcte AS Cliente,
    cotNotaPedidoDetalle.cod_articulo AS Articulo,
    conAnalisis.descripcion AS Analisis, 
    cotNotaPedidoDetalle.fecha_entrega AS Fecha_Entrega,
    cotNotaPedido.fecha_ingreso,
    cotNotaPedidoDetalle.cantidad AS Cantidad_Solicitada,
    ISNULL(CD.cant_des, 0) AS Cantidad_Despachada,
    cotNotaPedidoDetalle.cantidad - ISNULL(CD.cant_des, 0) AS Saldo,
    cotNotaPedidoDetalle.precio AS Precio,
    (cotNotaPedidoDetalle.cantidad - ISNULL(CD.cant_des, 0)) * cotNotaPedidoDetalle.precio AS Total,
    invArticulos.nomart
FROM cotNotaPedido
INNER JOIN cotNotaPedidoDetalle 
    ON cotNotaPedido.coddoc = cotNotaPedidoDetalle.coddoc 
    AND cotNotaPedido.numdoc = cotNotaPedidoDetalle.numdoc 
INNER JOIN conCtacte 
    ON cotNotaPedido.cliente = conCtacte.rutcte 
INNER JOIN venVendedores 
    ON cotNotaPedido.vendedor = venVendedores.codven 
LEFT JOIN conAnalisis 
    ON cotNotaPedido.analisis = conAnalisis.codigoAnalisis 
    AND conAnalisis.tipoAnalisis = 1 
INNER JOIN invArticulos 
    ON cotNotaPedidoDetalle.cod_articulo = invArticulos.codbus
-- JOIN con la tabla temporal de cantidades despachadas
LEFT JOIN #CantidadesDespacho CD
    ON cotNotaPedido.numdoc = CD.Num_NP
    AND cotNotaPedidoDetalle.cod_articulo = CD.Cod_bus
    AND cotNotaPedidoDetalle.idlinea = CD.idlinea
WHERE (cotNotaPedido.coddoc = 2) 
AND (cotNotaPedido.cliente = @cliente OR @cliente = 0) 
AND (cotNotaPedido.vendedor = @codven OR @codven = 0) 
AND ((cotNotaPedido.numdoc >= @numdoci AND cotNotaPedido.numdoc <= @numdocf) OR @numdoci = 0)
AND (CONVERT(DATE, cotNotaPedido.fecha_ingreso) BETWEEN @entregai AND @entregaf)
AND (cotNotaPedido.estado <> 2) 
AND (cotNotaPedido.estado <> 4)
AND (cotNotaPedidoDetalle.codana = @codana OR @codana = 0)
AND (cotNotaPedido.codloc = @codsuc OR @codsuc = 0)
ORDER BY cotNotaPedido.numdoc

-- Limpiar tabla temporal
DROP TABLE #CantidadesDespacho