ALTER PROCEDURE [dbo].[sp_cotDespachosPendientesUniNegAnalisis] 
(@numdoci INT,
@numdocf INT,
@cliente INT,
@codsuc INT,
@entregai DATE,
@entregaf DATE,
@codven INT,
@codana INT,
@coduni INT,
@tipo INT = 0,
@codfam VARCHAR(50) = '',
@codsub VARCHAR(50) = '',
@codbusini VARCHAR(50) = '0',
@codbusfin VARCHAR(50) = 'ZZZZZZZZZZ')
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: Ejecutar consultas principales con la tabla temporal
-- =====================================================

IF @tipo = 1
BEGIN
    SELECT
        cotNotaPedido.numdoc AS NP,
        cotNotaPedido.orden_compra AS Orden_de_Compra,
        venVendedores.codven,
        venVendedores.nomven AS Vendedor,
        cotNotaPedido.Cliente AS Rut,
        conCtacte.nomcte AS Cliente,
        cotNotaPedidoDetalle.cod_articulo AS Articulo,
        invArticulos.codalt,
        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.Total AS Total,
        invArticulos.nomart,
        cotNotaPedidoDetalle.codcen,
        cotNotaPedidoDetalle.codana,
        analisisdetalle.codigoAnalisis AS codanadetalle,
        ISNULL(analisisdetalle.descripcion, 'SIN ANALISIS') AS analisisdetalle,
        uninegdetalle.idUniNeg AS coduninegdetalle,
        uninegdetalle.descripcion AS uninegdetalle,
        CONVERT(VARCHAR, cotNotaPedido.Cliente) + '-' + conCtacte.digcte AS RutCliente,
        cotNotaPedidoDetalle.descuento AS descuento,
        cotNotaPedidoDetalle.porcdescuento AS porcdescuento
    FROM cotNotaPedido
    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
    INNER JOIN invArticulos
        ON cotNotaPedidoDetalle.cod_articulo = invArticulos.codbus
    LEFT JOIN conAnalisis AS analisisdetalle
        ON cotNotaPedidoDetalle.codana = analisisdetalle.codigoAnalisis
    LEFT JOIN conUnidadNegocio AS uninegdetalle
        ON cotNotaPedidoDetalle.codcen = uninegdetalle.idUniNeg
    -- 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 (CONVERT(DATE, cotNotaPedido.fecha_ingreso) BETWEEN @entregai AND @entregaf)
    AND (cotNotaPedido.analisis = @codana OR @codana = 0)
    AND (cotNotaPedido.costo = @coduni OR @coduni = 0)
    AND (invArticulos.codfam = @codfam OR @codfam = '')
    AND (invArticulos.codsub = @codsub OR @codsub = '')
    AND (cotNotaPedido.codloc = @codsuc OR @codsuc = 0)
    ORDER BY cotNotaPedido.numdoc
END

IF @tipo = 2
BEGIN
    SELECT
        cotNotaPedido.numdoc AS NP,
        cotNotaPedido.orden_compra AS Orden_de_Compra,
        venVendedores.codven,
        venVendedores.nomven AS Vendedor,
        cotNotaPedido.Cliente AS Rut,
        conCtacte.nomcte AS Cliente,
        cotNotaPedidoDetalle.cod_articulo AS Articulo,
        invArticulos.codalt,
        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,
        cotNotaPedidoDetalle.codcen,
        cotNotaPedidoDetalle.codana,
        analisisdetalle.codigoAnalisis AS codanadetalle,
        ISNULL(analisisdetalle.descripcion, 'SIN ANALISIS') AS analisisdetalle,
        uninegdetalle.idUniNeg AS coduninegdetalle,
        uninegdetalle.descripcion AS uninegdetalle,
        CONVERT(VARCHAR, cotNotaPedido.Cliente) + '-' + conCtacte.digcte AS RutCliente,
        cotNotaPedidoDetalle.descuento AS descuento,
        cotNotaPedidoDetalle.porcdescuento AS porcdescuento
    FROM cotNotaPedido
    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
    INNER JOIN invArticulos
        ON cotNotaPedidoDetalle.cod_articulo = invArticulos.codbus
    LEFT JOIN conAnalisis AS analisisdetalle
        ON cotNotaPedidoDetalle.codana = analisisdetalle.codigoAnalisis
    LEFT JOIN conUnidadNegocio AS uninegdetalle
        ON cotNotaPedidoDetalle.codcen = uninegdetalle.idUniNeg
    -- 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 (CONVERT(DATE, cotNotaPedido.fecha_ingreso) BETWEEN @entregai AND @entregaf)
    AND (cotNotaPedido.analisis = @codana OR @codana = 0)
    AND (cotNotaPedido.costo = @coduni OR @coduni = 0)
    AND (invArticulos.codfam = @codfam OR @codfam = '')
    AND (invArticulos.codsub = @codsub OR @codsub = '')
    AND (cotNotaPedido.codloc = @codsuc OR @codsuc = 0)
    AND (cotNotaPedido.estado <> 2 AND cotNotaPedido.estado <> 4)
    ORDER BY cotNotaPedido.numdoc
END

-- Limpiar tabla temporal
DROP TABLE #CantidadesDespacho