ALTER PROCEDURE [dbo].[sp_invListadoGuias]
(
    @grudoc INT,
    @coddoc INT,
    @fecini VARCHAR(10),
    @fecfin VARCHAR(10),
    @rutcte INT = 0,
    @Filtro VARCHAR(1) = '0',
    @codsuc INT = 0,
    @solotraslado INT = 0,
    @tipotraslado INT = 0,
    @solicitud BIGINT = 0,
    @recepcion BIGINT = 0,
    @guia BIGINT = 0
)	
AS 
BEGIN
    SET NOCOUNT ON;
    
    DECLARE @fechaInicio DATETIME = CONVERT(DATETIME, @fecini, 103);
    DECLARE @fechaFin DATETIME = CONVERT(DATETIME, @fecfin, 103);

    -- CTE para concatenar solicitudes con FOR XML PATH (Compatible SQL 2008+)
    ;WITH SolicitudesConcatenadas AS (
        SELECT 
            sg.coddoc,
            sg.numinv,
            STUFF((
                SELECT ' - ' + CAST(sg2.numsol AS VARCHAR(10))
                FROM invSolicitudGuia sg2
                WHERE sg2.tipo = 1
                    AND sg2.coddoc = sg.coddoc
                    AND sg2.numinv = sg.numinv
                ORDER BY sg2.numsol
                FOR XML PATH(''), TYPE
            ).value('.', 'VARCHAR(1000)'), 1, 3, '') AS solicitudes
        FROM invSolicitudGuia sg
        WHERE sg.tipo = 1
        GROUP BY sg.coddoc, sg.numinv
    ),
    GuiasFiltradas AS (
        SELECT 
            ve.numinv,
            ve.fecdoc,
            ve.fecven,
            ve.rutcte,
            ve.neto,
            ve.iva,
            ve.subtotal,
            ve.descuentos,
            ve.exento,
            ve.total,
            ve.totimpadi,
            ve.totaladi,
            ve.grudoc,
            ve.coddoc,
            ISNULL(ve.flgimp, 'N') AS flgimp,
            ve.doc_con,
            ve.estado,
            ve.url,
            ve.codsii,
            ve.motivo,
            ve.codbod,
            ve.tip_con,
            sc.solicitudes
        FROM venEncabezado ve
        LEFT JOIN SolicitudesConcatenadas sc ON ve.coddoc = sc.coddoc 
            AND ve.numinv = sc.numinv
        WHERE ve.grudoc = 50
            AND ve.fecdoc BETWEEN @fechaInicio AND @fechaFin
            AND (@coddoc = 0 OR ve.coddoc = @coddoc)
            AND (@rutcte = 0 OR ve.rutcte = @rutcte)
            AND (@codsuc = 0 OR ve.codloc = @codsuc)
            AND (@guia = 0 OR ve.numinv = @guia)
            -- Lógica del filtro de motivo
            AND (
                (@Filtro = '1' AND ve.motivo = 1) -- Solo ventas
                OR 
                (@Filtro = '2' AND @tipotraslado = 0 AND ve.motivo <> 1) -- Todos los traslados excepto venta
                OR 
                (@Filtro = '2' AND @tipotraslado <> 0 AND ve.motivo = @tipotraslado) -- Traslado específico
                OR 
                (@Filtro = '0' AND (@tipotraslado = 0 OR ve.motivo = @tipotraslado)) -- Lógica original
            )
            AND (@solicitud = 0 
                OR ' - ' + ISNULL(sc.solicitudes, '') + ' - ' 
                   LIKE '% - ' + CAST(@solicitud AS VARCHAR(20)) + ' - %')
            AND (@recepcion = 0 
                OR EXISTS (
                    SELECT 1 FROM invEncabezado ie
                    WHERE ie.tipref1 = 3 
                        AND ie.docref1 = ve.numinv 
                        AND ie.numinv = @recepcion
                ))
    )
    
    SELECT 
        gf.numinv,
        gf.fecdoc,
        gf.fecven,
        CONVERT(VARCHAR, cc.rutcte) + '-' + CONVERT(VARCHAR, cc.digcte) AS rutcliente,
        COUNT(vd.numlin) AS Total_Lineas,
        gf.neto,
        gf.iva,
        gf.subtotal,
        gf.descuentos,
        gf.exento,
        gf.total,
        gf.totimpadi,
        cc.nomcte,
        gf.totaladi,
        gf.grudoc,
        gf.coddoc,
        vdoc.nomdoc,
        vdoc.alias_doc,
        gf.flgimp,
        gf.doc_con,
        dr.nomdoc AS nomdocref,
        dr.alias_doc AS aliasref,
        dr.grudoc AS gruporef,
        CASE 
            WHEN dr.nomdoc IS NOT NULL 
            THEN dr.nomdoc + '(' + CONVERT(VARCHAR, gf.doc_con) + ')'
            ELSE ''
        END AS factura,
        gf.estado,
        ISNULL(dte.estado_sii, -1) AS estado_sii,
        gf.url,
        gf.codsii,
        CASE gf.motivo 
            WHEN 1 THEN 'CONSTITUYE VENTA'
            WHEN 2 THEN 'VENTAS POR EFECTUAR (NO VENTA)'
            WHEN 3 THEN 'CONSIGNACIONES (NO VENTA)'
            WHEN 4 THEN 'ENTREGA GRATUITA (NO VENTA)'
            WHEN 5 THEN 'TRASLADOS INTERNOS (NO VENTA)'
            WHEN 6 THEN 'OTROS TRASLADOS (NO VENTA)'
            WHEN 7 THEN 'TRASLADO PARA EXPORTACIÓN (NO VENTA)'
            WHEN 8 THEN 'VENTA PARA EXPORTACIÓN (NO VENTA)'
            ELSE ''
        END AS TIPOTRASLADO,
        ISNULL(gf.solicitudes, '0') AS solicitudes,
        ISNULL(CONVERT(VARCHAR(50), enc.numinv), 'N/A') AS entrada,
        ISNULL(CONVERT(VARCHAR(10), enc.fecdoc, 103), 'N/A') AS fechaEntrada,
        gf.codbod AS bodOrigen,
        ISNULL(CONVERT(VARCHAR(50), enc.codbod), 'N/A') AS bodDestino
    FROM GuiasFiltradas gf
    INNER JOIN venDetalle vd ON gf.numinv = vd.numinv 
        AND gf.coddoc = vd.coddoc 
        AND gf.grudoc = vd.grudoc
    INNER JOIN conCtacte cc ON gf.rutcte = cc.rutcte
    INNER JOIN venDocumentos vdoc ON gf.grudoc = vdoc.grudoc 
        AND gf.coddoc = vdoc.coddoc
    LEFT JOIN venDocumentos dr ON gf.tip_con = dr.coddoc 
        AND dr.grudoc = 10
    LEFT JOIN venDTE dte ON CAST(gf.numinv AS VARCHAR) = CAST(dte.numinv AS VARCHAR)
        AND gf.codsii = dte.codsii
    LEFT JOIN invEncabezado enc ON enc.tipref1 = 3 
        AND enc.docref1 = gf.numinv
        AND (@recepcion = 0 OR enc.numinv = @recepcion)
    GROUP BY 
        gf.numinv, gf.fecdoc, gf.fecven, cc.rutcte, cc.digcte, cc.nomcte,
        gf.neto, gf.iva, gf.subtotal, gf.descuentos, gf.exento, gf.total,
        gf.totimpadi, gf.totaladi, gf.grudoc, gf.coddoc, vdoc.nomdoc,
        vdoc.alias_doc, gf.flgimp, gf.doc_con, dr.nomdoc, dr.alias_doc,
        dr.grudoc, gf.estado, gf.motivo, dte.estado_sii, gf.url, gf.codsii,
        gf.solicitudes, enc.numinv, enc.fecdoc, enc.codbod, gf.codbod
    ORDER BY gf.fecdoc DESC, gf.numinv DESC;
    
    RETURN 0;
END