SET TERM ^ ;

CREATE OR ALTER procedure REP_UTILIDAD_VENTAS (
    TIPO integer,
    DETALLE char(1),
    FECINI date,
    FECFIN date,
    ARTINI varchar(15),
    ARTFIN varchar(15),
    GRPINI varchar(3),
    GRPFIN varchar(3),
    ORDEN char(1),
    AGRUPA char(1),
    ULTIMO char(1),
    CEROS char(1),
    SUBEMPRESA integer)
returns (
    ARTICULO varchar(15),
    DESCRIPCION varchar(60),
    CODGRUPO varchar(2),
    NOMGRUPO varchar(30),
    CODSUBG varchar(3),
    NOMSUBG varchar(30),
    CODMARC varchar(3),
    NOMMARC varchar(30),
    UNIDAD varchar(8),
    CANTIDAD numeric(18,4),
    BASE numeric(18,4),
    COSTO numeric(18,4),
    UTILIDAD numeric(18,4),
    PORC numeric(9,2),
    IVA numeric(18,4),
    IVAPOR numeric(9,2),
    CONSUMO numeric(18,4),
    PREFIJO varchar(4),
    NUMERO varchar(6),
    FECHA date,
    TIPODOC integer,
    PART float)
AS
DECLARE VARIABLE COSTOUNIT NUMERIC(18,4);
DECLARE VARIABLE CANTDET NUMERIC(18,4);
DECLARE VARIABLE TOTAL NUMERIC(18,2);
declare variable CODINI VARCHAR(15);
declare variable CODFIN VARCHAR(15);
declare variable DESINI VARCHAR(15);
declare variable DESFIN VARCHAR(15);
declare variable MARINI VARCHAR(3);
declare variable MARFIN VARCHAR(3);
declare variable UOM VARCHAR(20);
declare variable ULTCOS NUMERIC(18,2);
declare variable FACCOST NUMERIC(18,4);
declare variable IDREP INTEGER;
declare variable ID integer;
declare variable ITEM integer;
BEGIN
if (ORDEN = 'C') then
    BEGIN
    CODINI = ARTINI;
    CODFIN = ARTFIN;
    DESINI = '';
    DESFIN = 'zz';
    END
ELSE
    BEGIN
    DESINI = ARTINI;
    DESFIN = ARTFIN;
    CODINI = '';
    CODFIN = 'zz';
    END
if (AGRUPA = 'G') then
    BEGIN
    MARINI = '';
    MARFIN = 'zz';
    END
ELSE
    if (AGRUPA = 'M') then
        BEGIN
        MARINI = GRPINI;
        MARFIN = GRPFIN;
        GRPINI = '';
        GRPFIN = 'zz';
        END
    ELSE
        BEGIN
        MARINI = '';
        MARFIN = 'zz';
        GRPINI = '';
        GRPFIN = 'zz';
        END
EXECUTE PROCEDURE lee_configuracion ('FACTURACION', 'ARTICULOS', 'SUGERIR PRECIOS CON PORCENTAJE DE MARGEN O UTILIDAD') returning_values (:UOM);
IDREP = GEN_ID(id_reputilidad, 1);
if (DETALLE = 'N') then
    BEGIN
    if (BIN_AND(TIPO, 1) <> 0) then
        BEGIN
        TIPODOC = 31;
        FOR SELECT MAX(D.ARTI_COD), SUM(FADE_CANT * FADE_FACTOR), SUM((FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO)*FACT_FACTOR), SUM(FADE_IVAMONTO*FACT_FACTOR), SUM(FADE_CONSUMO)
            FROM FACTURAS_DETALLE D, FACTURAS F, PREFIJOS P, ARTICULO A
            WHERE F.FACT_ID = D.FACT_ID AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 31 AND D.ARTI_COD = A.arti_cod AND
            A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
            A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND FACT_FECHA >= :FECINI AND FACT_FECHA <= :FECFIN AND
            (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
            FACT_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) and substring(a.arti_cod from 1 FOR 2) <> '.t'
            GROUP BY D.ARTI_COD
            INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :CONSUMO
            DO
            BEGIN
            COSTO = 0;
            FOR SELECT FADE_CANT * FADE_FACTOR, FACT_FECHA, F.FACT_ID, FADE_ITEM FROM FACTURAS_DETALLE D, FACTURAS F, PREFIJOS P
                WHERE F.FACT_ID = D.FACT_ID AND FACT_FECHA >= :FECINI AND FACT_FECHA <= :FECFIN AND
                FACT_ANULADO = 'N' AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 31 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
                and D.ARTI_COD = :articulo  INTO :cantdet, :fecha, :id, :item
                DO
                BEGIN
                if (EXISTS (SELECT COST_SALP / COST_SALC FROM COSTOS C, MOVIMIENTO_ARTICULO M
                    WHERE COST_IDMOV = MVAR_CONS AND MVAR_TIPODOC = 31 AND MVAR_IDREF = :ID AND COST_SALC <> 0 AND MVAR_ITEM = :ITEM)) then
                    SELECT COST_SALP / COST_SALC, COST_ULTIMO FROM COSTOS C, MOVIMIENTO_ARTICULO M
                    WHERE COST_IDMOV = MVAR_CONS AND MVAR_TIPODOC = 31 AND MVAR_IDREF = :ID AND COST_SALC <> 0 AND MVAR_ITEM = :ITEM INTO :costounit, :ultcos;
                else
                    EXECUTE PROCEDURE costo_promedio_y_ultimo(:ARTICULO, :FECHA) returning_values (:costounit, :ultcos);
                if (costounit IS NULL) then
                    costounit = 0;
                if (ultcos IS NULL) then
                    ultcos = 0;

                /* EL FACTOR */
                FACCOST = 1;
                SELECT FIRST 1 FACO_FACTOR FROM factor_costo WHERE FACO_FECINI <= :FECHA AND FACO_FECFIN >= :FECHA INTO :FACCOST;
                ULTCOS = ULTCOS * FACCOST;
                COSTOUNIT = COSTOUNIT * FACCOST;

                if (ULTIMO = 'S') then
                    COSTO = COSTO + ultcos * cantdet;
                else
                    COSTO = COSTO + costounit * cantdet;
                END
            if (CANTIDAD IS NULL) then
                CANTIDAD = 0;
            if (BASE IS NULL) then
                BASE = 0;
            if (IVA IS NULL) then
                IVA = 0;
            if (CONSUMO IS NULL) then
                CONSUMO = 0;
            INSERT INTO REP_UTILIDAD(ID, TIPO, CODIGO, BASE, IVA, CONSUMO, COSTO, CANT) VALUES (:IDREP, 31, :articulo, :base, :iva, :consumo, :costo, :cantidad);
            if (CEROS = 'S') then
                INSERT INTO REPORTES_AUX (REPA_ID, REPA_USER, REPA_ARTICULO) VALUES (2, USER, :ARTICULO);
            END /* FOR */
        SELECT SUM(BASE-COSTO) FROM REP_UTILIDAD WHERE id = :IDREP AND TIPO = 31 INTO :TOTAL;
        FOR SELECT ARTI_COD, ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD, TAIV_PORC FROM ARTICULO A, TARIFA_IVA T
            WHERE A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
            A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND
            (A.MARC_COD <= :MARFIN))) AND substring(a.arti_cod from 1 FOR 2) <> '.t' AND A.taiv_cod = T.taiv_cod
            INTO :ARTICULO, :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC, :ivapor
            DO
            BEGIN
            EXECUTE procedure nombres_grupos_inventario (CODGRUPO, CODSUBG, CODMARC)
                returning_values (NOMGRUPO, NOMSUBG, NOMMARC);
            BASE = 0;
            IVA = 0;
            CONSUMO = 0;
            COSTO = 0;
            UTILIDAD = 0;
            PORC = 0;
            PART = 0;
            SELECT BASE, IVA, CONSUMO, COSTO, CANT FROM rep_utilidad WHERE ID = :IDREP AND TIPO = 31 AND CODIGO = :articulo
                INTO :BASE, :IVA, :consumo,  :costo, :cantidad;
            UTILIDAD = BASE - COSTO;
            if (UOM = 'UTILIDAD') then
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
            else
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
            EXECUTE PROCEDURE PORCENTAJE (utilidad,  TOTAL, 'S') returning_values (part);
            if ((CEROS = 'S') or (BASE <> 0) or (COSTO <> 0)) then
                SUSPEND;
            END /* FOR */
            BEGIN
            COSTO = 0;
            END
        END
    if (BIN_AND(TIPO, 2) <> 0) then
        BEGIN
        TIPODOC = 32;
        FOR SELECT MAX(D.ARTI_COD), SUM(RVDE_CANT * RVDE_FACTOR), SUM(RVDE_TOTAL-RVDE_IVAMONTO-RVDE_CONSUMO), SUM(RVDE_IVAMONTO), SUM(RVDE_CONSUMO)
            FROM REMISIONES_VENTA_DETALLE D, REMISIONES_VENTA R, PREFIJOS P, ARTICULO A
            WHERE R.REVT_ID = D.REVT_ID AND P.PREF_PRE = R.PREF_PRE AND P.TIDO_COD = 32 AND D.ARTI_COD = A.arti_cod AND
            A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
            A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND REVT_FECHA >= :FECINI AND REVT_FECHA <= :FECFIN AND
            (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
            REVT_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            GROUP BY D.ARTI_COD
            INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :CONSUMO
            DO
            BEGIN
            COSTO = 0;
            FOR SELECT RVDE_CANT * RVDE_FACTOR, REVT_FECHA, F.REVT_ID, RVDE_ITEM FROM remisiones_venta_detalle D, remisiones_venta F, PREFIJOS P
                WHERE F.revt_id = D.revt_id AND REVT_FECHA >= :FECINI AND REVT_FECHA <= :FECFIN AND
                REVT_ANULADO = 'N' AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 32 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
                and D.ARTI_COD = :articulo  INTO :cantdet, :fecha, :id, :item
                DO
                BEGIN
                if (EXISTS (SELECT COST_SALP / COST_SALC FROM COSTOS C, MOVIMIENTO_ARTICULO M
                    WHERE COST_IDMOV = MVAR_CONS AND MVAR_TIPODOC = 32 AND MVAR_IDREF = :ID AND COST_SALC <> 0 AND MVAR_ITEM = :ITEM)) then
                    SELECT COST_SALP / COST_SALC, cost_ultimo FROM COSTOS C, MOVIMIENTO_ARTICULO M
                    WHERE COST_IDMOV = MVAR_CONS AND MVAR_TIPODOC = 32 AND MVAR_IDREF = :ID AND COST_SALC <> 0 AND MVAR_ITEM = :ITEM INTO :costounit, :ultcos;
                else
                    EXECUTE PROCEDURE costo_promedio_y_ultimo(:ARTICULO, :FECHA) returning_values (:costounit, :ultcos);
                if (costounit IS NULL) then
                    costounit = 0;
                if (ultcos IS NULL) then
                    ultcos = 0;
                /* EL FACTOR */
                FACCOST = 1;
                SELECT FIRST 1 FACO_FACTOR FROM factor_costo WHERE FACO_FECINI <= :FECHA AND FACO_FECFIN >= :FECHA INTO :FACCOST;
                ULTCOS = ULTCOS * FACCOST;
                COSTOUNIT = COSTOUNIT * FACCOST;

                if (ULTIMO = 'S') then
                    COSTO = COSTO + ultcos * cantdet;
                else
                    COSTO = COSTO + costounit * cantdet;
                END
            EXECUTE procedure nombres_grupos_inventario (CODGRUPO, CODSUBG, CODMARC)
                returning_values (NOMGRUPO, NOMSUBG, NOMMARC);
            if (CANTIDAD IS NULL) then
                CANTIDAD = 0;
            if (BASE IS NULL) then
                BASE = 0;
            if (IVA IS NULL) then
                IVA = 0;
            if (CONSUMO IS NULL) then
                CONSUMO = 0;
            UTILIDAD = BASE - COSTO;
            if (UOM = 'UTILIDAD') then
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
            else
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
            if (CEROS = 'S') then
                INSERT INTO REPORTES_AUX (REPA_ID, REPA_USER, REPA_ARTICULO) VALUES (2, USER, :ARTICULO);
            INSERT INTO REP_UTILIDAD(ID, TIPO, CODIGO, BASE, IVA, CONSUMO, COSTO, CANT)
                VALUES (:IDREP, 32, :articulo, :base, :iva, :consumo, :costo, :cantidad);
            END /* FOR */
        SELECT SUM(BASE-COSTO) FROM REP_UTILIDAD WHERE id = :IDREP AND TIPO = 32 INTO :TOTAL;
        FOR SELECT ARTI_COD, ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD, TAIV_PORC FROM ARTICULO A, TARIFA_IVA T
            WHERE A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
            A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND
            (A.MARC_COD <= :MARFIN))) AND substring(a.arti_cod from 1 FOR 2) <> '.t' AND A.taiv_cod = T.taiv_cod
            INTO :ARTICULO, :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC, :ivapor
            DO
            BEGIN
            EXECUTE procedure nombres_grupos_inventario (CODGRUPO, CODSUBG, CODMARC)
                returning_values (NOMGRUPO, NOMSUBG, NOMMARC);
            BASE = 0;
            IVA = 0;
            CONSUMO = 0;
            COSTO = 0;
            UTILIDAD = 0;
            PORC = 0;
            SELECT BASE, IVA, CONSUMO, COSTO, CANT FROM rep_utilidad WHERE ID = :IDREP AND TIPO = 32 AND CODIGO = :articulo
                INTO :BASE, :IVA, :consumo,  :costo, :cantidad;
            UTILIDAD = BASE - COSTO;
            if (UOM = 'UTILIDAD') then
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
            else
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
            EXECUTE PROCEDURE PORCENTAJE (utilidad,  TOTAL, 'S') returning_values (part);
            if ((CEROS = 'S') or (BASE <> 0) or (COSTO <> 0)) then
                SUSPEND;
            END /* FOR */
        END
    if (BIN_AND(TIPO, 4) <> 0) then
        BEGIN
        TIPODOC = 33;
        FOR SELECT MAX(D.ARTI_COD), SUM(DVDE_CANT * DVDE_FACTOR), SUM((DVDE_TOTAL-DVDE_IVAMONTO-DVDE_CONSUMO)*DEVT_FACTOR), SUM(DVDE_IVAMONTO*DEVT_FACTOR), SUM(DVDE_CONSUMO)
            FROM devoluciones_ventas_detalle D, DEVOLUCIONES_VENTAS V, PREFIJOS P, ARTICULO A
            WHERE V.DEVT_ID = D.DEVT_ID AND P.PREF_PRE = V.PREF_PRE AND P.TIDO_COD = 33 AND D.ARTI_COD = A.arti_cod AND
            A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
            A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND DEVT_FECHA >= :FECINI AND DEVT_FECHA <= :FECFIN AND
            (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
            DEVT_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            GROUP BY D.ARTI_COD
            INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :CONSUMO
            DO
            BEGIN
            COSTO = 0;
            FOR SELECT DVDE_CANT * DVDE_FACTOR, DEVT_FECHA, F.DEVT_ID, DVDE_ITEM FROM devoluciones_ventas_detalle D, devoluciones_ventas F, PREFIJOS P
                WHERE F.devt_id = D.devt_id AND DEVT_FECHA >= :FECINI AND DEVT_FECHA <= :FECFIN AND
                DEVT_ANULADO = 'N' AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 33 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
                and D.ARTI_COD = :articulo  INTO :cantdet, :fecha, :id, :item
                DO
                BEGIN
                if (EXISTS (SELECT COST_ENTP / COST_ENTC FROM COSTOS C, MOVIMIENTO_ARTICULO M
                    WHERE COST_IDMOV = MVAR_CONS AND MVAR_TIPODOC = 33 AND MVAR_IDREF = :ID AND COST_ENTC <> 0 AND MVAR_ITEM = :ITEM)) then
                    SELECT COST_ENTP / COST_ENTC, COST_ULTIMO FROM COSTOS C, MOVIMIENTO_ARTICULO M
                        WHERE COST_IDMOV = MVAR_CONS AND MVAR_TIPODOC = 33 AND MVAR_IDREF = :ID AND COST_ENTC <> 0 AND MVAR_ITEM = :ITEM INTO :costounit, :ultcos;
                else
                    EXECUTE PROCEDURE costo_promedio_y_ultimo(:ARTICULO, :FECHA) returning_values (:costounit, :ultcos);
                if (costounit IS NULL) then
                    costounit = 0;
                if (ultcos IS NULL) then
                    ultcos = 0;
                /* EL FACTOR */
                FACCOST = 1;
                SELECT FIRST 1 FACO_FACTOR FROM factor_costo WHERE FACO_FECINI <= :FECHA AND FACO_FECFIN >= :FECHA INTO :FACCOST;
                ULTCOS = ULTCOS * FACCOST;
                COSTOUNIT = COSTOUNIT * FACCOST;

                if (ULTIMO = 'S') then
                    COSTO = COSTO + ultcos * cantdet;
                else
                    COSTO = COSTO + costounit * cantdet;
                END
            EXECUTE procedure nombres_grupos_inventario (CODGRUPO, CODSUBG, CODMARC)
                returning_values (NOMGRUPO, NOMSUBG, NOMMARC);
            if (CANTIDAD IS NULL) then
                CANTIDAD = 0;
            else
                CANTIDAD = CANTIDAD * -1;
            if (BASE IS NULL) then
                BASE = 0;
            else
                BASE = BASE * -1;
            if (IVA IS NULL) then
                IVA = 0;
            else
                IVA = IVA * -1;
            if (CONSUMO IS NULL) then
                CONSUMO = 0;
            else
                CONSUMO = CONSUMO * -1;
            COSTO = costo * -1;
            UTILIDAD = BASE - COSTO;
            if (UOM = 'UTILIDAD') then
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
            else
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
            if (CEROS = 'S') then
                INSERT INTO REPORTES_AUX (REPA_ID, REPA_USER, REPA_ARTICULO) VALUES (2, USER, :ARTICULO);
            INSERT INTO REP_UTILIDAD(ID, TIPO, CODIGO, BASE, IVA, CONSUMO, COSTO, CANT)
                VALUES (:IDREP, 33, :articulo, :base, :iva, :consumo, :costo, :cantidad);
            END /* FOR */
        SELECT SUM(BASE-COSTO) FROM REP_UTILIDAD WHERE id = :IDREP AND TIPO = 33 INTO :TOTAL;
        FOR SELECT ARTI_COD, ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD, TAIV_PORC FROM ARTICULO A, TARIFA_IVA T
            WHERE A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
            A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND
            (A.MARC_COD <= :MARFIN))) AND substring(a.arti_cod from 1 FOR 2) <> '.t' AND A.taiv_cod = T.taiv_cod
            INTO :ARTICULO, :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC, :ivapor
            DO
            BEGIN
            EXECUTE procedure nombres_grupos_inventario (CODGRUPO, CODSUBG, CODMARC)
                returning_values (NOMGRUPO, NOMSUBG, NOMMARC);
            BASE = 0;
            IVA = 0;
            CONSUMO = 0;
            COSTO = 0;
            UTILIDAD = 0;
            PORC = 0;
            SELECT BASE, IVA, CONSUMO, COSTO, CANT FROM rep_utilidad WHERE ID = :IDREP AND TIPO = 33 AND CODIGO = :articulo
                INTO :BASE, :IVA, :consumo,  :costo, :cantidad;
            UTILIDAD = BASE - COSTO;
            if (UOM = 'UTILIDAD') then
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
            else
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
            EXECUTE PROCEDURE PORCENTAJE (utilidad,  TOTAL, 'S') returning_values (part);
            if ((CEROS = 'S') or (BASE <> 0) or (COSTO <> 0)) then
                SUSPEND;
            END /* FOR */
        END
    if (BIN_AND(TIPO, 8) <> 0) then
        BEGIN
        TIPODOC = 34;
        /* BORRA LA TABLA AUXILIAR */
        DELETE FROM reportes_aux WHERE REPA_ID = 2 AND REPA_USER = USER;

        FOR SELECT MAX(D.ARTI_COD), SUM(PEDE_CANT * PEDE_FACTOR), SUM((PEDE_TOTAL-PEDE_IVAMONTO-PEDE_CONSUMO)*PEDI_FACTOR), SUM(PEDE_IVAMONTO*PEDI_FACTOR), SUM(PEDE_CONSUMO)
            FROM PEDIDOS_DETALLE D, PEDIDOS P, PREFIJOS R, ARTICULO A
            WHERE P.PEDI_ID = D.PEDI_ID AND P.PREF_PRE = R.PREF_PRE AND R.TIDO_COD = 34 AND D.ARTI_COD = A.arti_cod AND
            A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
            A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND PEDI_FECHA >= :FECINI AND PEDI_FECHA <= :FECFIN AND
            (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
            PEDI_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            GROUP BY D.ARTI_COD
            INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :CONSUMO
            DO
            BEGIN
            COSTO = 0;
            FOR SELECT PEDE_CANT * PEDE_FACTOR, PEDI_FECHA FROM pedidos_detalle D, pedidos F, PREFIJOS P
                WHERE F.pedi_id = D.pedi_id AND PEDI_FECHA >= :FECINI AND PEDI_FECHA <= :FECFIN AND
                PEDI_ANULADO = 'N' AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 31 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
                and D.ARTI_COD = :articulo  INTO :cantdet, :fecha
                DO
                BEGIN
                EXECUTE PROCEDURE costo_promedio_y_ultimo(:ARTICULO, :FECHA) returning_values (:costounit, :ultcos);
                /* EL FACTOR */
                FACCOST = 1;
                SELECT FIRST 1 FACO_FACTOR FROM factor_costo WHERE FACO_FECINI <= :FECHA AND FACO_FECFIN >= :FECHA INTO :FACCOST;
                ULTCOS = ULTCOS * FACCOST;
                COSTOUNIT = COSTOUNIT * FACCOST;

                if (ULTIMO = 'S') then
                    COSTO = COSTO + ultcos * cantdet;
                else
                    COSTO = COSTO + costounit * cantdet;
                END
            EXECUTE procedure nombres_grupos_inventario (CODGRUPO, CODSUBG, CODMARC)
                returning_values (NOMGRUPO, NOMSUBG, NOMMARC);
            if (CANTIDAD IS NULL) then
                CANTIDAD = 0;
            if (BASE IS NULL) then
                BASE = 0;
            if (IVA IS NULL) then
                IVA = 0;
            if (CONSUMO IS NULL) then
                CONSUMO = 0;
            UTILIDAD = BASE - COSTO;
            if (UOM = 'UTILIDAD') then
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
            else
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
            if (CEROS = 'S') then
                INSERT INTO REPORTES_AUX (REPA_ID, REPA_USER, REPA_ARTICULO) VALUES (2, USER, :ARTICULO);
            INSERT INTO REP_UTILIDAD(ID, TIPO, CODIGO, BASE, IVA, CONSUMO, COSTO, CANT)
                VALUES (:IDREP, 34, :articulo, :base, :iva, :consumo, :costo, :cantidad);
            END /* FOR */
        SELECT SUM(BASE-COSTO) FROM REP_UTILIDAD WHERE id = :IDREP AND TIPO = 34 INTO :TOTAL;
        FOR SELECT ARTI_COD, ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD, TAIV_PORC FROM ARTICULO A, TARIFA_IVA T
            WHERE A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
            A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND
            (A.MARC_COD <= :MARFIN))) AND substring(a.arti_cod from 1 FOR 2) <> '.t' AND A.taiv_cod = T.taiv_cod
            INTO :ARTICULO, :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC, :ivapor
            DO
            BEGIN
            EXECUTE procedure nombres_grupos_inventario (CODGRUPO, CODSUBG, CODMARC)
                returning_values (NOMGRUPO, NOMSUBG, NOMMARC);
            BASE = 0;
            IVA = 0;
            CONSUMO = 0;
            COSTO = 0;
            UTILIDAD = 0;
            PORC = 0;
            SELECT BASE, IVA, CONSUMO, COSTO, CANT FROM rep_utilidad WHERE ID = :IDREP AND TIPO = 34 AND CODIGO = :articulo
                INTO :BASE, :IVA, :consumo,  :costo, :cantidad;
            UTILIDAD = BASE - COSTO;
            if (UOM = 'UTILIDAD') then
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
            else
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
            EXECUTE PROCEDURE PORCENTAJE (utilidad,  TOTAL, 'S') returning_values (part);
            if ((CEROS = 'S') or (BASE <> 0) or (COSTO <> 0)) then
                SUSPEND;
            END /* FOR */
        END
    if (BIN_AND(TIPO, 16) <> 0) then
        BEGIN
        TIPODOC = 35;
        FOR SELECT MAX(D.ARTI_COD), SUM(CTDE_CANT * CTDE_FACTOR), SUM((CTDE_TOTAL-CTDE_IVAMONTO-CTDE_CONSUMO)*COTI_FACTOR), SUM(CTDE_IVAMONTO), SUM(CTDE_CONSUMO)
            FROM COTIZACIONES_DETALLE D, COTIZACIONES C, PREFIJOS P, ARTICULO A
            WHERE C.COTI_ID = D.COTI_ID AND P.PREF_PRE = C.PREF_PRE AND P.TIDO_COD = 35 AND D.ARTI_COD = A.arti_cod AND
            A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
            A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND COTI_FECHA >= :FECINI AND COTI_FECHA <= :FECFIN AND
            (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
            COTI_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            GROUP BY D.ARTI_COD
            INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :CONSUMO
            DO
            BEGIN
            COSTO = 0;
            FOR SELECT CTDE_CANT * CTDE_FACTOR, COTI_FECHA FROM cotizaciones_detalle D, cotizaciones F, PREFIJOS P
                WHERE F.coti_id = D.coti_id AND COTI_FECHA >= :FECINI AND COTI_FECHA <= :FECFIN AND
                COTI_ANULADO = 'N' AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 35 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
                and D.ARTI_COD = :articulo  INTO :cantdet, :fecha
                DO
                BEGIN
                EXECUTE PROCEDURE costo_promedio_y_ultimo(:ARTICULO, :FECHA) returning_values (:costounit, :ultcos);
                /* EL FACTOR */
                FACCOST = 1;
                SELECT FIRST 1 FACO_FACTOR FROM factor_costo WHERE FACO_FECINI <= :FECHA AND FACO_FECFIN >= :FECHA INTO :FACCOST;
                ULTCOS = ULTCOS * FACCOST;
                COSTOUNIT = COSTOUNIT * FACCOST;

                if (ULTIMO = 'S') then
                    COSTO = COSTO + ultcos * cantdet;
                else
                    COSTO = COSTO + costounit * cantdet;
                END
            EXECUTE procedure nombres_grupos_inventario (CODGRUPO, CODSUBG, CODMARC)
                returning_values (NOMGRUPO, NOMSUBG, NOMMARC);
            if (CANTIDAD IS NULL) then
                CANTIDAD = 0;
            if (BASE IS NULL) then
                BASE = 0;
            if (IVA IS NULL) then
                IVA = 0;
            if (CONSUMO IS NULL) then
                CONSUMO = 0;
            UTILIDAD = BASE - COSTO;
            if (UOM = 'UTILIDAD') then
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
            else
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
            if (CEROS = 'S') then
                INSERT INTO REPORTES_AUX (REPA_ID, REPA_USER, REPA_ARTICULO) VALUES (2, USER, :ARTICULO);
            INSERT INTO REP_UTILIDAD(ID, TIPO, CODIGO, BASE, IVA, CONSUMO, COSTO, CANT)
                VALUES (:IDREP, 35, :articulo, :base, :iva, :consumo, :costo, :cantidad);
            END /* FOR */
        SELECT SUM(BASE-COSTO) FROM REP_UTILIDAD WHERE id = :IDREP AND TIPO = 35 INTO :TOTAL;
        FOR SELECT ARTI_COD, ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD, TAIV_PORC FROM ARTICULO A, TARIFA_IVA T
            WHERE A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
            A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND
            (A.MARC_COD <= :MARFIN))) AND substring(a.arti_cod from 1 FOR 2) <> '.t' AND A.taiv_cod = T.taiv_cod
            INTO :ARTICULO, :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC, :ivapor
            DO
            BEGIN
            EXECUTE procedure nombres_grupos_inventario (CODGRUPO, CODSUBG, CODMARC)
                returning_values (NOMGRUPO, NOMSUBG, NOMMARC);
            BASE = 0;
            IVA = 0;
            CONSUMO = 0;
            COSTO = 0;
            UTILIDAD = 0;
            PORC = 0;
            SELECT BASE, IVA, CONSUMO, COSTO, CANT FROM rep_utilidad WHERE ID = :IDREP AND TIPO = 35 AND CODIGO = :articulo
                INTO :BASE, :IVA, :consumo,  :costo, :cantidad;
            UTILIDAD = BASE - COSTO;
            if (UOM = 'UTILIDAD') then
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
            else
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
            EXECUTE PROCEDURE PORCENTAJE (utilidad,  TOTAL, 'S') returning_values (part);
            if ((CEROS = 'S') or (BASE <> 0) or (COSTO <> 0)) then
                SUSPEND;
            END /* FOR */
        END
    END
ELSE
  if (DETALLE = 'G') then
    BEGIN
    if (BIN_AND(TIPO, 1) <> 0) then
        BEGIN
        TIPODOC = 31;
        FOR SELECT MAX(a.grup_cod), SUM((FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO)*FACT_FACTOR), SUM(FADE_IVAMONTO*FACT_FACTOR), SUM(FADE_CONSUMO)
            FROM FACTURAS_DETALLE D, FACTURAS F, PREFIJOS P, ARTICULO A
            WHERE F.FACT_ID = D.FACT_ID AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 31 AND D.ARTI_COD = A.arti_cod AND
            A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
            A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND FACT_FECHA >= :FECINI AND FACT_FECHA <= :FECFIN AND
            (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
            FACT_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) and substring(a.arti_cod from 1 FOR 2) <> '.t'
            GROUP BY a.grup_cod
            INTO :codgrupo, :BASE, :IVA, :CONSUMO
            DO
            BEGIN
            COSTO = 0;
            FOR SELECT D.fact_id, D.fade_item, D.arti_cod, FADE_CANT * FADE_FACTOR, FACT_FECHA
                FROM FACTURAS_DETALLE D, FACTURAS F, PREFIJOS P, ARTICULO A
                WHERE F.FACT_ID = D.FACT_ID AND D.arti_cod = A.arti_cod AND FACT_FECHA >= :FECINI AND FACT_FECHA <= :FECFIN AND
                FACT_ANULADO = 'N' AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 31 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
                and a.grup_cod = :codgrupo INTO :id, :item, :ARTICULO, cantdet, :fecha
                DO
                BEGIN
                if (EXISTS (SELECT COST_SALP / COST_SALC FROM COSTOS C, MOVIMIENTO_ARTICULO M
                    WHERE COST_IDMOV = MVAR_CONS AND MVAR_TIPODOC = 31 AND MVAR_IDREF = :ID AND COST_SALC <> 0 AND MVAR_ITEM = :ITEM)) then
                    SELECT COST_SALP / COST_SALC, COST_ULTIMO FROM COSTOS C, MOVIMIENTO_ARTICULO M
                        WHERE COST_IDMOV = MVAR_CONS AND MVAR_TIPODOC = 31 AND MVAR_IDREF = :ID AND COST_SALC <> 0 AND MVAR_ITEM = :ITEM INTO :costounit, :ultcos;
                else
                    EXECUTE PROCEDURE costo_promedio_y_ultimo(:ARTICULO, :FECHA) returning_values (:costounit, :ultcos);
                if (costounit IS NULL) then
                    costounit = 0;
                if (ultcos IS NULL) then
                    ultcos = 0;
                /* EL FACTOR */
                FACCOST = 1;
                SELECT FIRST 1 FACO_FACTOR FROM factor_costo WHERE FACO_FECINI <= :FECHA AND FACO_FECFIN >= :FECHA INTO :FACCOST;
                ULTCOS = ULTCOS * FACCOST;
                COSTOUNIT = COSTOUNIT * FACCOST;

                if (ULTIMO = 'S') then
                    COSTO = COSTO + ultcos * cantdet;
                else
                    COSTO = COSTO + costounit * cantdet;
                END
            CANTIDAD = 0;
            if (BASE IS NULL) then
                BASE = 0;
            if (IVA IS NULL) then
                IVA = 0;
            if (CONSUMO IS NULL) then
                CONSUMO = 0;
            INSERT INTO REP_UTILIDAD(ID, TIPO, CODIGO, BASE, IVA, CONSUMO, COSTO, CANT)
                VALUES (:IDREP, 31, :codgrupo, :base, :iva, :consumo, :costo, :cantidad);
            if (CEROS = 'S') then
                INSERT INTO REPORTES_AUX (REPA_ID, REPA_USER, REPA_ARTICULO) VALUES (2, USER, :codgrupo);
            END /* FOR */
        SELECT SUM(BASE-COSTO) FROM REP_UTILIDAD WHERE id = :IDREP AND TIPO = 31 INTO :TOTAL;
        FOR SELECT GRUP_COD, GRUP_NOM FROM GRUPO
            WHERE GRUP_COD >= :GRPINI AND GRUP_COD <= :grpfin
            INTO :ARTICULO, :DESCRIPCION
            DO
            BEGIN
            BASE = 0;
            IVA = 0;
            CONSUMO = 0;
            COSTO = 0;
            UTILIDAD = 0;
            PORC = 0;
            PART = 0;
            SELECT BASE, IVA, CONSUMO, COSTO, CANT FROM rep_utilidad WHERE ID = :IDREP AND TIPO = 31 AND CODIGO = :articulo
                INTO :BASE, :IVA, :consumo,  :costo, :cantidad;
            UTILIDAD = BASE - COSTO;
            if (UOM = 'UTILIDAD') then
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
            else
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
            EXECUTE PROCEDURE PORCENTAJE (utilidad,  TOTAL, 'S') returning_values (part);
            if ((CEROS = 'S') or (BASE <> 0) or (COSTO <> 0)) then
                SUSPEND;
            END /* FOR */
            BEGIN
            COSTO = 0;
            END
        END
    if (BIN_AND(TIPO, 2) <> 0) then
        BEGIN
        TIPODOC = 32;
        FOR SELECT MAX(a.grup_cod), SUM(RVDE_TOTAL-RVDE_IVAMONTO-RVDE_CONSUMO), SUM(RVDE_IVAMONTO), SUM(RVDE_CONSUMO)
            FROM REMISIONES_VENTA_DETALLE D, REMISIONES_VENTA R, PREFIJOS P, ARTICULO A
            WHERE R.REVT_ID = D.REVT_ID AND P.PREF_PRE = R.PREF_PRE AND P.TIDO_COD = 32 AND D.ARTI_COD = A.arti_cod AND
            A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
            A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND REVT_FECHA >= :FECINI AND REVT_FECHA <= :FECFIN AND
            (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
            REVT_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            GROUP BY a.grup_cod
            INTO :codgrupo, :BASE, :IVA, :CONSUMO
            DO
            BEGIN
            COSTO = 0;
            FOR SELECT D.arti_cod, RVDE_CANT * RVDE_FACTOR, REVT_FECHA, F.REVT_ID, RVDE_ITEM
                FROM remisiones_venta_detalle D, remisiones_venta F, PREFIJOS P, ARTICULO A
                WHERE F.revt_id = D.revt_id AND A.arti_cod = D.arti_cod AND REVT_FECHA >= :FECINI AND REVT_FECHA <= :FECFIN AND
                REVT_ANULADO = 'N' AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 32 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
                and a.grup_cod = :codgrupo INTO :ARTICULO, cantdet, :fecha, :ID, :ITEM
                DO
                BEGIN
                if (EXISTS (SELECT COST_SALP / COST_SALC FROM COSTOS C, MOVIMIENTO_ARTICULO M
                    WHERE COST_IDMOV = MVAR_CONS AND MVAR_TIPODOC = 32 AND MVAR_IDREF = :ID AND COST_SALC <> 0 AND MVAR_ITEM = :ITEM)) then
                    SELECT COST_SALP / COST_SALC, COST_ULTIMO FROM COSTOS C, MOVIMIENTO_ARTICULO M
                        WHERE COST_IDMOV = MVAR_CONS AND MVAR_TIPODOC = 32 AND MVAR_IDREF = :ID AND COST_SALC <> 0 AND MVAR_ITEM = :ITEM INTO :costounit, :ultcos;
                else
                    EXECUTE PROCEDURE costo_promedio_y_ultimo(:ARTICULO, :FECHA) returning_values (:costounit, :ultcos);
                if (costounit IS NULL) then
                    costounit = 0;
                if (ultcos IS NULL) then
                    ultcos = 0;
                /* EL FACTOR */
                FACCOST = 1;
                SELECT FIRST 1 FACO_FACTOR FROM factor_costo WHERE FACO_FECINI <= :FECHA AND FACO_FECFIN >= :FECHA INTO :FACCOST;
                ULTCOS = ULTCOS * FACCOST;
                COSTOUNIT = COSTOUNIT * FACCOST;

                if (ULTIMO = 'S') then
                    COSTO = COSTO + ultcos * cantdet;
                else
                    COSTO = COSTO + costounit * cantdet;
                END
            CANTIDAD = 0;
            if (BASE IS NULL) then
                BASE = 0;
            if (IVA IS NULL) then
                IVA = 0;
            if (CONSUMO IS NULL) then
                CONSUMO = 0;
            UTILIDAD = BASE - COSTO;
            if (UOM = 'UTILIDAD') then
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
            else
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
            if (CEROS = 'S') then
                INSERT INTO REPORTES_AUX (REPA_ID, REPA_USER, REPA_ARTICULO) VALUES (2, USER, :codgrupo);
            INSERT INTO REP_UTILIDAD(ID, TIPO, CODIGO, BASE, IVA, CONSUMO, COSTO, CANT)
                VALUES (:IDREP, 32, :codgrupo, :base, :iva, :consumo, :costo, :cantidad);
            END /* FOR */
        SELECT SUM(BASE-COSTO) FROM REP_UTILIDAD WHERE id = :IDREP AND TIPO = 32 INTO :TOTAL;
        FOR SELECT GRUP_COD, GRUP_NOM FROM GRUPO
            WHERE GRUP_COD >= :GRPINI AND GRUP_COD <= :grpfin
            INTO :ARTICULO, :DESCRIPCION
            DO
            BEGIN
            BASE = 0;
            IVA = 0;
            CONSUMO = 0;
            COSTO = 0;
            UTILIDAD = 0;
            PORC = 0;
            SELECT BASE, IVA, CONSUMO, COSTO, CANT FROM rep_utilidad WHERE ID = :IDREP AND TIPO = 32 AND CODIGO = :articulo
                INTO :BASE, :IVA, :consumo,  :costo, :cantidad;
            UTILIDAD = BASE - COSTO;
            if (UOM = 'UTILIDAD') then
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
            else
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
            EXECUTE PROCEDURE PORCENTAJE (utilidad,  TOTAL, 'S') returning_values (part);
            if ((CEROS = 'S') or (BASE <> 0) or (COSTO <> 0)) then
                SUSPEND;
            END /* FOR */
        END
    if (BIN_AND(TIPO, 4) <> 0) then
        BEGIN
        TIPODOC = 33;
        FOR SELECT MAX(a.grup_cod), SUM((DVDE_TOTAL-DVDE_IVAMONTO-DVDE_CONSUMO)*DEVT_FACTOR), SUM(DVDE_IVAMONTO*DEVT_FACTOR), SUM(DVDE_CONSUMO)
            FROM devoluciones_ventas_detalle D, DEVOLUCIONES_VENTAS V, PREFIJOS P, ARTICULO A
            WHERE V.DEVT_ID = D.DEVT_ID AND P.PREF_PRE = V.PREF_PRE AND P.TIDO_COD = 33 AND D.ARTI_COD = A.arti_cod AND
            A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
            A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND DEVT_FECHA >= :FECINI AND DEVT_FECHA <= :FECFIN AND
            (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
            DEVT_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            GROUP BY a.grup_cod
            INTO :codgrupo, :BASE, :IVA, :CONSUMO
            DO
            BEGIN
            COSTO = 0;
            FOR SELECT D.arti_cod, DVDE_CANT * DVDE_FACTOR, DEVT_FECHA, F.devt_id, D.dvde_item FROM devoluciones_ventas_detalle D, devoluciones_ventas F, PREFIJOS P, ARTICULO A
                WHERE A.arti_cod = D.arti_cod AND F.devt_id = D.devt_id AND DEVT_FECHA >= :FECINI AND DEVT_FECHA <= :FECFIN AND
                DEVT_ANULADO = 'N' AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 33 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
                and a.grup_cod = :codgrupo INTO :ARTICULO, cantdet, :fecha, :ID, :ITEM
                DO
                BEGIN
                if (EXISTS (SELECT COST_ENTP / COST_ENTC FROM COSTOS C, MOVIMIENTO_ARTICULO M
                    WHERE COST_IDMOV = MVAR_CONS AND MVAR_TIPODOC = 33 AND MVAR_IDREF = :ID AND COST_ENTC <> 0 AND MVAR_ITEM = :ITEM)) then
                    SELECT COST_ENTP / COST_ENTC, COST_ULTIMO FROM COSTOS C, MOVIMIENTO_ARTICULO M
                        WHERE COST_IDMOV = MVAR_CONS AND MVAR_TIPODOC = 33 AND MVAR_IDREF = :ID AND COST_ENTC <> 0 AND MVAR_ITEM = :ITEM INTO :costounit, :ultcos;
                else
                    EXECUTE PROCEDURE costo_promedio_y_ultimo(:ARTICULO, :FECHA) returning_values (:costounit, :ultcos);
                if (costounit IS NULL) then
                    costounit = 0;
                if (ultcos IS NULL) then
                    ultcos = 0;
                /* EL FACTOR */
                FACCOST = 1;
                SELECT FIRST 1 FACO_FACTOR FROM factor_costo WHERE FACO_FECINI <= :FECHA AND FACO_FECFIN >= :FECHA INTO :FACCOST;
                ULTCOS = ULTCOS * FACCOST;
                COSTOUNIT = COSTOUNIT * FACCOST;

                if (ULTIMO = 'S') then
                    COSTO = COSTO + ultcos * cantdet;
                else
                    COSTO = COSTO + costounit * cantdet;
                END
            CANTIDAD = 0;
            if (BASE IS NULL) then
                BASE = 0;
            else
                BASE = BASE * -1;
            if (IVA IS NULL) then
                IVA = 0;
            else
                IVA = IVA * -1;
            if (CONSUMO IS NULL) then
                CONSUMO = 0;
            else
                CONSUMO = CONSUMO * -1;
            COSTO = costo * -1;
            UTILIDAD = BASE - COSTO;
            if (UOM = 'UTILIDAD') then
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
            else
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
            if (CEROS = 'S') then
                INSERT INTO REPORTES_AUX (REPA_ID, REPA_USER, REPA_ARTICULO) VALUES (2, USER, :codgrupo);
            INSERT INTO REP_UTILIDAD(ID, TIPO, CODIGO, BASE, IVA, CONSUMO, COSTO, CANT)
                VALUES (:IDREP, 33, :codgrupo, :base, :iva, :consumo, :costo, :cantidad);
            END /* FOR */
        SELECT SUM(BASE-COSTO) FROM REP_UTILIDAD WHERE id = :IDREP AND TIPO = 33 INTO :TOTAL;
        FOR SELECT GRUP_COD, GRUP_NOM FROM GRUPO
            WHERE GRUP_COD >= :GRPINI AND GRUP_COD <= :grpfin
            INTO :ARTICULO, :DESCRIPCION
            DO
            BEGIN
            BASE = 0;
            IVA = 0;
            CONSUMO = 0;
            COSTO = 0;
            UTILIDAD = 0;
            PORC = 0;
            SELECT BASE, IVA, CONSUMO, COSTO, CANT FROM rep_utilidad WHERE ID = :IDREP AND TIPO = 33 AND CODIGO = :articulo
                INTO :BASE, :IVA, :consumo,  :costo, :cantidad;
            UTILIDAD = BASE - COSTO;
            if (UOM = 'UTILIDAD') then
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
            else
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
            EXECUTE PROCEDURE PORCENTAJE (utilidad,  TOTAL, 'S') returning_values (part);
            if ((CEROS = 'S') or (BASE <> 0) or (COSTO <> 0)) then
                SUSPEND;
            END /* FOR */
        END
    if (BIN_AND(TIPO, 8) <> 0) then
        BEGIN
        TIPODOC = 34;
        /* BORRA LA TABLA AUXILIAR */
        DELETE FROM reportes_aux WHERE REPA_ID = 2 AND REPA_USER = USER;

        FOR SELECT MAX(a.grup_cod), SUM((PEDE_TOTAL-PEDE_IVAMONTO-PEDE_CONSUMO)*PEDI_FACTOR), SUM(PEDE_IVAMONTO*PEDI_FACTOR), SUM(PEDE_CONSUMO)
            FROM PEDIDOS_DETALLE D, PEDIDOS P, PREFIJOS R, ARTICULO A
            WHERE P.PEDI_ID = D.PEDI_ID AND P.PREF_PRE = R.PREF_PRE AND R.TIDO_COD = 34 AND D.ARTI_COD = A.arti_cod AND
            A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
            A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND PEDI_FECHA >= :FECINI AND PEDI_FECHA <= :FECFIN AND
            (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
            PEDI_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            GROUP BY a.grup_cod
            INTO :codgrupo, :BASE, :IVA, :CONSUMO
            DO
            BEGIN
            COSTO = 0;
            FOR SELECT MAX(D.arti_cod), SUM(PEDE_CANT * PEDE_FACTOR), MAX(pedi_FECHA) FROM pedidos_detalle D, pedidos F, PREFIJOS P, ARTICULO A
                WHERE A.arti_cod = D.arti_cod AND F.pedi_id = D.pedi_id AND PEDI_FECHA >= :FECINI AND PEDI_FECHA <= :FECFIN AND
                PEDI_ANULADO = 'N' AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 34 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
                and a.grup_cod = :codgrupo GROUP BY D.ARTI_COD, PEDI_FECHA INTO :ARTICULO, cantdet, :fecha
                DO
                BEGIN
                EXECUTE PROCEDURE costo_promedio_y_ultimo(:ARTICULO, :FECHA) returning_values (:costounit, :ultcos);
                /* EL FACTOR */
                FACCOST = 1;
                SELECT FIRST 1 FACO_FACTOR FROM factor_costo WHERE FACO_FECINI <= :FECHA AND FACO_FECFIN >= :FECHA INTO :FACCOST;
                ULTCOS = ULTCOS * FACCOST;
                COSTOUNIT = COSTOUNIT * FACCOST;

                if (ULTIMO = 'S') then
                    COSTO = COSTO + ultcos * cantdet;
                else
                    COSTO = COSTO + costounit * cantdet;
                END
            CANTIDAD = 0;
            if (BASE IS NULL) then
                BASE = 0;
            if (IVA IS NULL) then
                IVA = 0;
            if (CONSUMO IS NULL) then
                CONSUMO = 0;
            UTILIDAD = BASE - COSTO;
            if (UOM = 'UTILIDAD') then
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
            else
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
            if (CEROS = 'S') then
                INSERT INTO REPORTES_AUX (REPA_ID, REPA_USER, REPA_ARTICULO) VALUES (2, USER, :codgrupo);
            INSERT INTO REP_UTILIDAD(ID, TIPO, CODIGO, BASE, IVA, CONSUMO, COSTO, CANT)
                VALUES (:IDREP, 34, :codgrupo, :base, :iva, :consumo, :costo, :cantidad);
            END /* FOR */
        SELECT SUM(BASE-COSTO) FROM REP_UTILIDAD WHERE id = :IDREP AND TIPO = 34 INTO :TOTAL;
        FOR SELECT GRUP_COD, GRUP_NOM FROM GRUPO
            WHERE GRUP_COD >= :GRPINI AND GRUP_COD <= :grpfin
            INTO :ARTICULO, :DESCRIPCION
            DO
            BEGIN
            BASE = 0;
            IVA = 0;
            CONSUMO = 0;
            COSTO = 0;
            UTILIDAD = 0;
            PORC = 0;
            SELECT BASE, IVA, CONSUMO, COSTO, CANT FROM rep_utilidad WHERE ID = :IDREP AND TIPO = 34 AND CODIGO = :articulo
                INTO :BASE, :IVA, :consumo,  :costo, :cantidad;
            UTILIDAD = BASE - COSTO;
            if (UOM = 'UTILIDAD') then
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
            else
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
            EXECUTE PROCEDURE PORCENTAJE (utilidad,  TOTAL, 'S') returning_values (part);
            if ((CEROS = 'S') or (BASE <> 0) or (COSTO <> 0)) then
                SUSPEND;
            END /* FOR */
        END
    if (BIN_AND(TIPO, 16) <> 0) then
        BEGIN
        TIPODOC = 35;
        FOR SELECT MAX(a.grup_cod), SUM((CTDE_TOTAL-CTDE_IVAMONTO-CTDE_CONSUMO)*COTI_FACTOR), SUM(CTDE_IVAMONTO), SUM(CTDE_CONSUMO)
            FROM COTIZACIONES_DETALLE D, COTIZACIONES C, PREFIJOS P, ARTICULO A
            WHERE C.COTI_ID = D.COTI_ID AND P.PREF_PRE = C.PREF_PRE AND P.TIDO_COD = 35 AND D.ARTI_COD = A.arti_cod AND
            A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
            A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND COTI_FECHA >= :FECINI AND COTI_FECHA <= :FECFIN AND
            (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
            COTI_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            GROUP BY A.grup_cod
            INTO :codgrupo, :BASE, :IVA, :CONSUMO
            DO
            BEGIN
            COSTO = 0;
            FOR SELECT MAX(D.arti_cod), SUM(CTDE_CANT * CTDE_FACTOR), MAX(COTI_FECHA) FROM cotizaciones_detalle D, cotizaciones F, PREFIJOS P, ARTICULO A
                WHERE A.arti_cod = D.arti_cod AND F.coti_id = D.coti_id AND COTI_FECHA >= :FECINI AND COTI_FECHA <= :FECFIN AND
                COTI_ANULADO = 'N' AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 35 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
                and a.grup_cod = :codgrupo GROUP BY D.ARTI_COD, COTI_FECHA INTO :ARTICULO, cantdet, :fecha
                DO
                BEGIN
                EXECUTE PROCEDURE costo_promedio_y_ultimo(:ARTICULO, :FECHA) returning_values (:costounit, :ultcos);
                /* EL FACTOR */
                FACCOST = 1;
                SELECT FIRST 1 FACO_FACTOR FROM factor_costo WHERE FACO_FECINI <= :FECHA AND FACO_FECFIN >= :FECHA INTO :FACCOST;
                ULTCOS = ULTCOS * FACCOST;
                COSTOUNIT = COSTOUNIT * FACCOST;

                if (ULTIMO = 'S') then
                    COSTO = COSTO + ultcos * cantdet;
                else
                    COSTO = COSTO + costounit * cantdet;
                END
            CANTIDAD = 0;
            if (BASE IS NULL) then
                BASE = 0;
            if (IVA IS NULL) then
                IVA = 0;
            if (CONSUMO IS NULL) then
                CONSUMO = 0;
            UTILIDAD = BASE - COSTO;
            if (UOM = 'UTILIDAD') then
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
            else
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
            if (CEROS = 'S') then
                INSERT INTO REPORTES_AUX (REPA_ID, REPA_USER, REPA_ARTICULO) VALUES (2, USER, :codgrupo);
            INSERT INTO REP_UTILIDAD(ID, TIPO, CODIGO, BASE, IVA, CONSUMO, COSTO, CANT)
                VALUES (:IDREP, 35, :codgrupo, :base, :iva, :consumo, :costo, :cantidad);
            END /* FOR */
        SELECT SUM(BASE-COSTO) FROM REP_UTILIDAD WHERE id = :IDREP AND TIPO = 35 INTO :TOTAL;
        FOR SELECT GRUP_COD, GRUP_NOM FROM GRUPO
            WHERE GRUP_COD >= :GRPINI AND GRUP_COD <= :grpfin
            INTO :ARTICULO, :DESCRIPCION
            DO
            BEGIN
            BASE = 0;
            IVA = 0;
            CONSUMO = 0;
            COSTO = 0;
            UTILIDAD = 0;
            PORC = 0;
            SELECT BASE, IVA, CONSUMO, COSTO, CANT FROM rep_utilidad WHERE ID = :IDREP AND TIPO = 35 AND CODIGO = :articulo
                INTO :BASE, :IVA, :consumo,  :costo, :cantidad;
            UTILIDAD = BASE - COSTO;
            if (UOM = 'UTILIDAD') then
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
            else
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
            EXECUTE PROCEDURE PORCENTAJE (utilidad,  TOTAL, 'S') returning_values (part);
            if ((CEROS = 'S') or (BASE <> 0) or (COSTO <> 0)) then
                SUSPEND;
            END /* FOR */
        END
    END
  ELSE
    BEGIN
    if (BIN_AND(TIPO, 1) <> 0) then
        BEGIN
        TIPODOC = 31;
        FOR SELECT F.PREF_PRE, FACT_NUMERO, FACT_FECHA, D.ARTI_COD, FADE_CANT * FADE_FACTOR, (FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO)*FACT_FACTOR, FADE_IVAMONTO*FACT_FACTOR, FADE_CONSUMO,
            ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD, F.FACT_ID, FADE_ITEM, TAIV_PORC
            FROM FACTURAS F, FACTURAS_DETALLE D, PREFIJOS P, ARTICULO A, TARIFA_IVA T
            WHERE F.FACT_ID = D.FACT_ID AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 31 AND D.ARTI_COD = A.arti_cod AND
                A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
                A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND FACT_FECHA >= :FECINI AND A.taiv_cod = T.taiv_cod AND
                (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
                FACT_FECHA <= :FECFIN AND FACT_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) and substring(a.arti_cod from 1 FOR 2) <> '.t'
            ORDER BY D.ARTI_COD, FACT_FECHA, F.FACT_ID, FADE_ITEM
            INTO :PREFIJO, :NUMERO, :FECHA, :ARTICULO, :CANTIDAD, :BASE, :IVA, :CONSUMO,
                :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC, :ID, :ITEM, :ivapor
            DO
            BEGIN
            EXECUTE procedure nombres_grupos_inventario (CODGRUPO, CODSUBG, CODMARC)
                returning_values (NOMGRUPO, NOMSUBG, NOMMARC);
            if (EXISTS (SELECT COST_SALP / COST_SALC FROM COSTOS C, MOVIMIENTO_ARTICULO M
                WHERE COST_IDMOV = MVAR_CONS AND MVAR_TIPODOC = 31 AND MVAR_IDREF = :ID AND COST_SALC <> 0 AND MVAR_ITEM = :ITEM)) then
                SELECT COST_SALP / COST_SALC, COST_ULTIMO FROM COSTOS C, MOVIMIENTO_ARTICULO M
                    WHERE COST_IDMOV = MVAR_CONS AND MVAR_TIPODOC = 31 AND MVAR_IDREF = :ID AND COST_SALC <> 0 AND MVAR_ITEM = :ITEM INTO :costounit, :ultcos;
            else
                EXECUTE PROCEDURE costo_promedio_y_ultimo(:ARTICULO, :FECHA) returning_values (:costounit, :ultcos);
            /* EL FACTOR */
            FACCOST = 1;
            SELECT FIRST 1 FACO_FACTOR FROM factor_costo WHERE FACO_FECINI <= :FECHA AND FACO_FECFIN >= :FECHA INTO :FACCOST;
            ULTCOS = ULTCOS * FACCOST;
            COSTOUNIT = COSTOUNIT * FACCOST;

            if (ULTIMO = 'S') then
                COSTO = ultcos * cantidad;
            else
                COSTO = costounit * cantidad;
            UTILIDAD = BASE - COSTO;
            if (UOM = 'UTILIDAD') then
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
            else
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
            SUSPEND;
            END
        END
    if (BIN_AND(TIPO, 2) <> 0) then
        BEGIN
        TIPODOC = 32;
        FOR SELECT R.PREF_PRE, REVT_NUMERO, REVT_FECHA, D.ARTI_COD, RVDE_CANT * RVDE_FACTOR, RVDE_TOTAL-RVDE_IVAMONTO-RVDE_CONSUMO, RVDE_IVAMONTO, RVDE_CONSUMO,
            ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD, R.REVT_ID, RVDE_ITEM, TAIV_PORC
            FROM REMISIONES_VENTA R, REMISIONES_VENTA_DETALLE D, PREFIJOS P, ARTICULO A, TARIFA_IVA T
            WHERE R.REVT_ID = D.REVT_ID AND P.PREF_PRE = R.PREF_PRE AND P.TIDO_COD = 32 AND D.ARTI_COD = A.arti_cod AND
                A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
                A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND REVT_FECHA >= :FECINI AND REVT_FECHA <= :FECFIN AND
                (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
                REVT_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) AND A.taiv_cod = T.taiv_cod
            ORDER BY D.ARTI_COD, REVT_FECHA, R.REVT_ID, RVDE_ITEM
            INTO :PREFIJO, :NUMERO, :FECHA, :ARTICULO, :CANTIDAD, :BASE, :IVA, :CONSUMO,
                :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC, :ID, :ITEM, :ivapor
            DO
            BEGIN
            EXECUTE procedure nombres_grupos_inventario (CODGRUPO, CODSUBG, CODMARC)
                returning_values (NOMGRUPO, NOMSUBG, NOMMARC);
            if (EXISTS (SELECT COST_SALP / COST_SALC FROM COSTOS C, MOVIMIENTO_ARTICULO M
                WHERE COST_IDMOV = MVAR_CONS AND MVAR_TIPODOC = 32 AND MVAR_IDREF = :ID AND COST_SALC <> 0 AND MVAR_ITEM = :ITEM)) then
                SELECT COST_SALP / COST_SALC, COST_ULTIMO FROM COSTOS C, MOVIMIENTO_ARTICULO M
                    WHERE COST_IDMOV = MVAR_CONS AND MVAR_TIPODOC = 32 AND MVAR_IDREF = :ID AND COST_SALC <> 0 AND MVAR_ITEM = :ITEM INTO :costounit, :ultcos;
            else
                EXECUTE PROCEDURE costo_promedio_y_ultimo(:ARTICULO, :FECHA) returning_values (:costounit, :ultcos);
            /* EL FACTOR */
            FACCOST = 1;
            SELECT FIRST 1 FACO_FACTOR FROM factor_costo WHERE FACO_FECINI <= :FECHA AND FACO_FECFIN >= :FECHA INTO :FACCOST;
            ULTCOS = ULTCOS * FACCOST;
            COSTOUNIT = COSTOUNIT * FACCOST;

            if (ULTIMO = 'S') then
                COSTO = ultcos * cantidad;
            else
                COSTO = costounit * cantidad;
            UTILIDAD = BASE - COSTO;
            if (UOM = 'UTILIDAD') then
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
            else
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
            SUSPEND;
            END
        END
    if (BIN_AND(TIPO, 4) <> 0) then
        BEGIN
        TIPODOC = 33;
        FOR SELECT V.PREF_PRE, DEVT_NUMERO, DEVT_FECHA, D.ARTI_COD, DVDE_CANT * DVDE_FACTOR, (DVDE_TOTAL-DVDE_IVAMONTO-DVDE_CONSUMO)*DEVT_FACTOR, DVDE_IVAMONTO*DEVT_FACTOR, DVDE_CONSUMO,
            ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD, V.DEVT_ID, DVDE_ITEM, TAIV_PORC
            FROM DEVOLUCIONES_VENTAS V, DEVOLUCIONES_VENTAS_DETALLE D, PREFIJOS P, ARTICULO A, TARIFA_IVA T
            WHERE V.DEVT_ID = D.DEVT_ID AND P.PREF_PRE = V.PREF_PRE AND P.TIDO_COD = 33 AND D.ARTI_COD = A.arti_cod AND
                A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
                A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND DEVT_FECHA >= :FECINI AND DEVT_FECHA <= :FECFIN AND
                (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
                DEVT_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) AND A.taiv_cod = T.taiv_cod
            ORDER BY D.ARTI_COD, DEVT_FECHA, V.DEVT_ID, DVDE_ITEM
            INTO :PREFIJO, :NUMERO, :FECHA, :ARTICULO, :CANTIDAD, :BASE, :IVA, :CONSUMO,
                :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC, :ID, :ITEM, :ivapor
            DO
            BEGIN
            EXECUTE procedure nombres_grupos_inventario (CODGRUPO, CODSUBG, CODMARC)
                returning_values (NOMGRUPO, NOMSUBG, NOMMARC);
            CANTIDAD = CANTIDAD * -1;
            if (EXISTS (SELECT COST_ENTP / COST_ENTC FROM COSTOS C, MOVIMIENTO_ARTICULO M
                WHERE COST_IDMOV = MVAR_CONS AND MVAR_TIPODOC = 33 AND MVAR_IDREF = :ID AND COST_ENTC <> 0 AND MVAR_ITEM = :ITEM)) then
                SELECT COST_ENTP / COST_ENTC, COST_ULTIMO FROM COSTOS C, MOVIMIENTO_ARTICULO M
                    WHERE COST_IDMOV = MVAR_CONS AND MVAR_TIPODOC = 33 AND MVAR_IDREF = :ID AND COST_ENTC <> 0 AND MVAR_ITEM = :ITEM INTO :costounit, :ultcos;
            else
                EXECUTE PROCEDURE costo_promedio_y_ultimo(:ARTICULO, :FECHA) returning_values (:costounit, :ultcos);
            /* EL FACTOR */
            FACCOST = 1;
            SELECT FIRST 1 FACO_FACTOR FROM factor_costo WHERE FACO_FECINI <= :FECHA AND FACO_FECFIN >= :FECHA INTO :FACCOST;
            ULTCOS = ULTCOS * FACCOST;
            COSTOUNIT = COSTOUNIT * FACCOST;

            if (ULTIMO = 'S') then
                COSTO = ultcos * cantidad;
            else
                COSTO = costounit * cantidad;
            BASE = BASE * -1;
            IVA = IVA * -1;
            CONSUMO = CONSUMO * -1;
            UTILIDAD = BASE - COSTO;
            if (UOM = 'UTILIDAD') then
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
            else
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
            SUSPEND;
            END
        END
    if (BIN_AND(TIPO, 8) <> 0) then
        BEGIN
        TIPODOC = 34;
        FOR SELECT P.PREF_PRE, PEDI_NUMERO, PEDI_FECHA, D.ARTI_COD, PEDE_CANT * PEDE_FACTOR, (PEDE_TOTAL-PEDE_IVAMONTO-PEDE_CONSUMO)*PEDI_FACTOR, PEDE_IVAMONTO*PEDI_FACTOR, PEDE_CONSUMO,
            ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD, TAIV_PORC 
            FROM PEDIDOS P, PEDIDOS_DETALLE D, PREFIJOS R, ARTICULO A, TARIFA_IVA T
            WHERE P.PEDI_ID = D.PEDI_ID AND P.PREF_PRE = R.PREF_PRE AND R.TIDO_COD = 34 AND D.ARTI_COD = A.arti_cod AND
                A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
                A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND PEDI_FECHA >= :FECINI AND PEDI_FECHA <= :FECFIN AND
                (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
                PEDI_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) AND A.taiv_cod = T.taiv_cod
            ORDER BY D.ARTI_COD, PEDI_FECHA, P.PEDI_ID, PEDE_ITEM
            INTO :PREFIJO, :NUMERO, :FECHA, :ARTICULO, :CANTIDAD, :BASE, :IVA, :CONSUMO,
                :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC, :ivapor
            DO
            BEGIN
            EXECUTE procedure nombres_grupos_inventario (CODGRUPO, CODSUBG, CODMARC)
                returning_values (NOMGRUPO, NOMSUBG, NOMMARC);
            EXECUTE PROCEDURE costo_promedio_y_ultimo(:ARTICULO, :FECHA) returning_values (:costounit, :ultcos);
            /* EL FACTOR */
            FACCOST = 1;
            SELECT FIRST 1 FACO_FACTOR FROM factor_costo WHERE FACO_FECINI <= :FECHA AND FACO_FECFIN >= :FECHA INTO :FACCOST;
            ULTCOS = ULTCOS * FACCOST;
            COSTOUNIT = COSTOUNIT * FACCOST;

            if (ULTIMO = 'S') then
                COSTO = ultcos * cantidad;
            else
                COSTO = costounit * cantidad;
            UTILIDAD = BASE - COSTO;
            if (UOM = 'UTILIDAD') then
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
            else
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
            SUSPEND;
            END
        END
    if (BIN_AND(TIPO, 16) <> 0) then
        BEGIN
        TIPODOC = 35;
        FOR SELECT C.PREF_PRE, COTI_NUMERO, COTI_FECHA, D.ARTI_COD, CTDE_CANT * CTDE_FACTOR, (CTDE_TOTAL-CTDE_IVAMONTO-CTDE_CONSUMO)*COTI_FACTOR, CTDE_IVAMONTO*COTI_FACTOR, CTDE_CONSUMO,
            ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD, TAIV_PORC
            FROM COTIZACIONES C, COTIZACIONES_DETALLE D, PREFIJOS P, ARTICULO A, TARIFA_IVA T
            WHERE C.COTI_ID = D.COTI_ID AND P.PREF_PRE = C.PREF_PRE AND P.TIDO_COD = 35 AND D.ARTI_COD = A.arti_cod AND
                A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
                A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :grpfin AND COTI_FECHA >= :FECINI AND COTI_FECHA <= :FECFIN AND
                (((:MARINI = '') AND (:MARFIN = 'zz')) or ((A.MARC_COD >= :MARINI) AND (A.MARC_COD <= :MARFIN))) AND
                COTI_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) AND A.taiv_cod = T.taiv_cod
            ORDER BY D.ARTI_COD, COTI_FECHA, C.COTI_ID, CTDE_ITEM
            INTO :PREFIJO, :NUMERO, :FECHA, :ARTICULO, :CANTIDAD, :BASE, :IVA, :CONSUMO,
                :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC, :ivapor
            DO
            BEGIN
            EXECUTE procedure nombres_grupos_inventario (CODGRUPO, CODSUBG, CODMARC)
                returning_values (NOMGRUPO, NOMSUBG, NOMMARC);
            EXECUTE PROCEDURE costo_promedio_y_ultimo(:ARTICULO, :FECHA) returning_values (:costounit, :ultcos);
            /* EL FACTOR */
            FACCOST = 1;
            SELECT FIRST 1 FACO_FACTOR FROM factor_costo WHERE FACO_FECINI <= :FECHA AND FACO_FECFIN >= :FECHA INTO :FACCOST;
            ULTCOS = ULTCOS * FACCOST;
            COSTOUNIT = COSTOUNIT * FACCOST;

            if (ULTIMO = 'S') then
                COSTO = ultcos * cantidad;
            else
                COSTO = costounit * cantidad;
            UTILIDAD = BASE - COSTO;
            if (UOM = 'UTILIDAD') then
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
            else
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
            SUSPEND;
            END
        END
    END
END
^

SET TERM ; ^


SET TERM ^ ;

CREATE OR ALTER procedure REP_UTILIDAD_VENDEDOR (
    TIPO integer,
    DETALLE char(1),
    VENINI varchar(20),
    VENFIN varchar(20),
    FECINI date,
    FECFIN date,
    ARTINI varchar(15),
    ARTFIN varchar(15),
    ORDEN char(1),
    CEROS char(1),
    SUBEMPRESA integer)
returns (
    CODVEND varchar(20),
    NOMVEND varchar(60),
    NOMTIPO varchar(50),
    ARTICULO varchar(15),
    DESCRIPCION varchar(60),
    CODGRUPO varchar(2),
    NOMGRUPO varchar(30),
    CODSUBG varchar(3),
    NOMSUBG varchar(30),
    CODMARC varchar(3),
    NOMMARC varchar(30),
    UNIDAD varchar(8),
    CANTIDAD numeric(18,4),
    BASE numeric(18,2),
    IVA numeric(18,2),
    CONSUMO numeric(18,2),
    COSTO numeric(18,2),
    UTILIDAD numeric(18,4),
    PORC numeric(9,2),
    TOTAL numeric(18,2),
    LISTA numeric(18,2),
    PREFIJO varchar(4),
    NUMERO varchar(6),
    FECHA date,
    DTO numeric(9,2))
AS
DECLARE VARIABLE COSTOUNIT NUMERIC(18,4);
DECLARE VARIABLE CANTDET NUMERIC(18,4);
DECLARE VARIABLE CODINI VARCHAR(15);
DECLARE VARIABLE CODFIN VARCHAR(15);
DECLARE VARIABLE DESINI VARCHAR(15);
DECLARE VARIABLE DESFIN VARCHAR(15);
declare variable UOM VARCHAR(20);
declare variable CODLISTA INTEGER;
declare variable ID INTEGER;
declare variable ITEM INTEGER;
declare variable FACCOST NUMERIC(18,4);
BEGIN
if (ORDEN = 'C') then
    BEGIN
    CODINI = ARTINI;
    CODFIN = ARTFIN;
    DESINI = '';
    DESFIN = 'zz';
    END
ELSE
    BEGIN
    DESINI = ARTINI;
    DESFIN = ARTFIN;
    CODINI = '';
    CODFIN = 'zz';
    END
  EXECUTE PROCEDURE lee_configuracion ('FACTURACION', 'ARTICULOS', 'SUGERIR PRECIOS CON PORCENTAJE DE MARGEN O UTILIDAD') returning_values (:UOM);
  SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = :TIPO INTO :NOMTIPO;
  FOR select VEND_COD, VEND_NOMBRE
    from VENDEDORES
    where VEND_COD >= :VENINI AND VEND_COD <= :VENFIN
    INTO :CODVEND, :NOMVEND
    DO  
    BEGIN
    if (DETALLE = 'N') then
        BEGIN
        if (BIN_AND(TIPO, 1) <> 0) then
            BEGIN
            SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 31 INTO :NOMTIPO;
            /* BORRA LA TABLA AUXILIAR */
            DELETE FROM reportes_aux WHERE REPA_ID = 4 AND REPA_USER = USER;
            FOR SELECT MAX(D.ARTI_COD), SUM(FADE_CANT * FADE_FACTOR), SUM(FACT_FACTOR*(FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO)),
                SUM(FACT_FACTOR*FADE_IVAMONTO), SUM(FACT_FACTOR*FADE_TOTAL), SUM(FADE_CONSUMO),
                MAX(ARTI_DES), MAX(ARTI_UNIDAD), MAX(GRUP_COD), MAX(SUBG_COD), MAX(MARC_COD)
                FROM FACTURAS_DETALLE D, FACTURAS F, PREFIJOS P, ARTICULO A
                WHERE F.FACT_ID = D.FACT_ID AND FACT_FECHA >= :FECINI AND FACT_FECHA <= :FECFIN AND VEND_COD = :CODVEND AND FACT_ANULADO = 'N'
                 AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 31 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) and substring(D.arti_cod from 1 FOR 2) <> '.t'
                 AND D.ARTI_COD = A.arti_cod AND A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN
                GROUP BY D.ARTI_COD
                INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :TOTAL, :CONSUMO,
                    :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
                DO
                BEGIN
                COSTO = 0;
                FOR SELECT F.FACT_ID, FADE_ITEM, FADE_CANT * FADE_FACTOR, FACT_FECHA FROM FACTURAS_DETALLE D, FACTURAS F, PREFIJOS P
                    WHERE F.VEND_COD = :codvend AND F.FACT_ID = D.FACT_ID AND FACT_FECHA >= :FECINI AND FACT_FECHA <= :FECFIN AND
                    FACT_ANULADO = 'N' AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 31 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
                    and D.ARTI_COD = :articulo  INTO :ID, :ITEM, :cantdet, :fecha
                    DO
                    BEGIN
                    if (EXISTS (SELECT COST_SALP / COST_SALC FROM COSTOS C, MOVIMIENTO_ARTICULO M
                        WHERE COST_IDMOV = MVAR_CONS AND MVAR_TIPODOC = 31 AND MVAR_IDREF = :ID AND COST_SALC <> 0 AND MVAR_ITEM = :ITEM)) then
                        SELECT COST_SALP / COST_SALC FROM COSTOS C, MOVIMIENTO_ARTICULO M
                            WHERE COST_IDMOV = MVAR_CONS AND MVAR_TIPODOC = 31 AND MVAR_IDREF = :ID AND COST_SALC <> 0 AND MVAR_ITEM = :ITEM INTO :costounit;
                    else
                        EXECUTE PROCEDURE COSTO_PROMEDIO(:ARTICULO, :FECHA) returning_values (:costounit);
                    /* EL FACTOR */
                    FACCOST = 1;
                    SELECT FIRST 1 FACO_FACTOR FROM factor_costo WHERE FACO_FECINI <= :FECHA AND FACO_FECFIN >= :FECHA INTO :FACCOST;
                    COSTOUNIT = COSTOUNIT * FACCOST;

                    COSTO = COSTO + costounit * cantdet;
                    END
                SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                if (CANTIDAD IS NULL) then
                    CANTIDAD = 0;
                if (BASE IS NULL) then
                    BASE = 0;
                if (IVA IS NULL) then
                    IVA = 0;
                UTILIDAD = BASE - COSTO;
                if (UOM = 'UTILIDAD') then
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
                else
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
                if (CEROS = 'S') then
                    begin
                    INSERT INTO REPORTES_AUX (REPA_ID, REPA_USER, REPA_ARTICULO) VALUES (4, USER, :ARTICULO);
                    SUSPEND;
                    end
                ELSE
                    if ((BASE <> 0) AND (CANTIDAD <> 0)) then
                        SUSPEND;
                END
            if (CEROS = 'S') then
                BEGIN
                COSTO = 0;
                UTILIDAD = 0;
                PORC = 0;
                /* agregue los articulos sin factura */
                FOR SELECT ARTI_COD, 0, 0, 0, ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                    FROM ARTICULO A WHERE A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN and
                    not exists (select REPA_ARTICULO FROM REPORTES_AUX WHERE REPA_ID = 4 AND REPA_USER = USER AND REPA_ARTICULO = a.arti_cod)
                    INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
                    DO
                    BEGIN
                    SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                    SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                    SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                    SUSPEND;
                    END
                END
            END
        if (BIN_AND(TIPO, 2) <> 0) then
            BEGIN
            SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 32 INTO :NOMTIPO;
            FOR SELECT MAX(D.ARTI_COD), SUM(RVDE_CANT * RVDE_FACTOR), SUM(RVDE_TOTAL-RVDE_IVAMONTO-RVDE_CONSUMO), SUM(RVDE_IVAMONTO), SUM(RVDE_TOTAL), SUM(RVDE_CONSUMO),
                MAX(ARTI_DES), MAX(ARTI_UNIDAD), MAX(GRUP_COD), MAX(SUBG_COD), MAX(MARC_COD)
                FROM REMISIONES_VENTA_DETALLE D, REMISIONES_VENTA R, PREFIJOS P, ARTICULO A
                WHERE R.REVT_ID = D.REVT_ID AND REVT_FECHA >= :FECINI AND REVT_FECHA <= :FECFIN AND VEND_COD = :CODVEND AND REVT_ANULADO = 'N'
                 AND P.PREF_PRE = R.PREF_PRE AND P.TIDO_COD = 32 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
                 AND D.ARTI_COD = A.arti_cod AND A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN
                GROUP BY D.ARTI_COD
                INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :TOTAL, :CONSUMO,
                    :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
                DO
                BEGIN
                COSTO = 0;
                FOR SELECT F.REVT_ID, RVDE_ITEM, RVDE_CANT * RVDE_FACTOR, REVT_FECHA FROM remisiones_venta_detalle D, remisiones_venta F, PREFIJOS P
                    WHERE F.VEND_COD = :codvend AND F.revt_id = D.revt_id AND REVT_FECHA >= :FECINI AND REVT_FECHA <= :FECFIN AND
                    REVT_ANULADO = 'N' AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 32 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
                    and D.ARTI_COD = :articulo  INTO :ID, :ITEM, :cantdet, :fecha
                    DO
                    BEGIN
                    if (EXISTS (SELECT COST_SALP / COST_SALC FROM COSTOS C, MOVIMIENTO_ARTICULO M
                        WHERE COST_IDMOV = MVAR_CONS AND MVAR_TIPODOC = 32 AND MVAR_IDREF = :ID AND COST_SALC <> 0 AND MVAR_ITEM = :ITEM)) then
                        SELECT COST_SALP / COST_SALC FROM COSTOS C, MOVIMIENTO_ARTICULO M
                            WHERE COST_IDMOV = MVAR_CONS AND MVAR_TIPODOC = 32 AND MVAR_IDREF = :ID AND COST_SALC <> 0 AND MVAR_ITEM = :ITEM INTO :costounit;
                    else
                        EXECUTE PROCEDURE COSTO_PROMEDIO(:ARTICULO, :FECHA) returning_values (:costounit);
                    /* EL FACTOR */
                    FACCOST = 1;
                    SELECT FIRST 1 FACO_FACTOR FROM factor_costo WHERE FACO_FECINI <= :FECHA AND FACO_FECFIN >= :FECHA INTO :FACCOST;
                    COSTOUNIT = COSTOUNIT * FACCOST;

                    COSTO = COSTO + costounit * cantdet;
                    END
                SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                if (CANTIDAD IS NULL) then
                    CANTIDAD = 0;
                if (BASE IS NULL) then
                    BASE = 0;
                if (IVA IS NULL) then
                    IVA = 0;
                UTILIDAD = BASE - COSTO;
                if (UOM = 'UTILIDAD') then
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
                else
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
                if (CEROS = 'S') then
                    begin
                    INSERT INTO REPORTES_AUX (REPA_ID, REPA_USER, REPA_ARTICULO) VALUES (4, USER, :ARTICULO);
                    SUSPEND;
                    end
                ELSE
                    if ((BASE <> 0) AND (CANTIDAD <> 0)) then
                        SUSPEND;
                END
            if (CEROS = 'S') then
                BEGIN
                COSTO = 0;
                UTILIDAD = 0;
                PORC = 0;
                /* agregue los articulos sin factura */
                FOR SELECT ARTI_COD, 0, 0, 0, ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                    FROM ARTICULO A WHERE A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN and
                    not exists (select REPA_ARTICULO FROM REPORTES_AUX WHERE REPA_ID = 4 AND REPA_USER = USER AND REPA_ARTICULO = a.arti_cod)
                    INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
                    DO
                    BEGIN
                    SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                    SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                    SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                    SUSPEND;
                    END
                END
            END
        if (BIN_AND(TIPO, 4) <> 0) then
            BEGIN
            SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 33 INTO :NOMTIPO;
            FOR SELECT MAX(D.ARTI_COD), SUM(DVDE_CANT * DVDE_FACTOR), SUM(DEVT_FACTOR*(DVDE_TOTAL-DVDE_IVAMONTO-DVDE_CONSUMO)),
                SUM(DEVT_FACTOR*DVDE_IVAMONTO), SUM(DEVT_FACTOR*DVDE_TOTAL), SUM(DVDE_CONSUMO),
                MAX(ARTI_DES), MAX(ARTI_UNIDAD), MAX(GRUP_COD), MAX(SUBG_COD), MAX(MARC_COD)
                FROM devoluciones_ventas_detalle D, DEVOLUCIONES_VENTAS V, PREFIJOS P, ARTICULO A
                WHERE V.DEVT_ID = D.DEVT_ID AND DEVT_FECHA >= :FECINI AND DEVT_FECHA <= :FECFIN AND VEND_COD = :CODVEND AND DEVT_ANULADO = 'N'
                 AND P.PREF_PRE = V.PREF_PRE AND P.TIDO_COD = 33 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) and substring(D.arti_cod from 1 FOR 2) <> '.t'
                 AND D.ARTI_COD = A.arti_cod AND A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN
                GROUP BY D.ARTI_COD
                INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :TOTAL, :CONSUMO,
                    :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
                DO
                BEGIN
                COSTO = 0;
                FOR SELECT F.DEVT_ID, DVDE_ITEM, DVDE_CANT * DVDE_FACTOR, DEVT_FECHA FROM devoluciones_ventas_detalle D, devoluciones_ventas F, PREFIJOS P
                    WHERE F.VEND_COD = :codvend AND F.devt_id = D.devt_id AND DEVT_FECHA >= :FECINI AND DEVT_FECHA <= :FECFIN AND
                    DEVT_ANULADO = 'N' AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 33 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
                    and D.ARTI_COD = :articulo  INTO :ID, :ITEM, :cantdet, :fecha
                    DO
                    BEGIN
                    if (EXISTS (SELECT COST_ENTP / COST_ENTC FROM COSTOS C, MOVIMIENTO_ARTICULO M
                        WHERE COST_IDMOV = MVAR_CONS AND MVAR_TIPODOC = 33 AND MVAR_IDREF = :ID AND COST_ENTC <> 0 AND MVAR_ITEM = :ITEM)) then
                        SELECT COST_ENTP / COST_ENTC FROM COSTOS C, MOVIMIENTO_ARTICULO M
                            WHERE COST_IDMOV = MVAR_CONS AND MVAR_TIPODOC = 33 AND MVAR_IDREF = :ID AND COST_ENTC <> 0 AND MVAR_ITEM = :ITEM INTO :costounit;
                    else
                        EXECUTE PROCEDURE COSTO_PROMEDIO(:ARTICULO, :FECHA) returning_values (:costounit);
                    /* EL FACTOR */
                    FACCOST = 1;
                    SELECT FIRST 1 FACO_FACTOR FROM factor_costo WHERE FACO_FECINI <= :FECHA AND FACO_FECFIN >= :FECHA INTO :FACCOST;
                    COSTOUNIT = COSTOUNIT * FACCOST;

                    COSTO = COSTO + costounit * cantdet;
                    END
                SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                if (CANTIDAD IS NULL) then
                    CANTIDAD = 0;
                if (BASE IS NULL) then
                    BASE = 0;
                if (IVA IS NULL) then
                    IVA = 0;
                UTILIDAD = BASE - COSTO;
                if (UOM = 'UTILIDAD') then
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
                else
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
                TOTAL = TOTAL * -1;
                IVA = IVA * -1;
                BASE = BASE * -1;
                CANTIDAD = CANTIDAD * -1;
                COSTO = COSTO * -1;
                UTILIDAD = UTILIDAD * -1;
                if (CEROS = 'S') then
                    begin
                    INSERT INTO REPORTES_AUX (REPA_ID, REPA_USER, REPA_ARTICULO) VALUES (4, USER, :ARTICULO);
                    SUSPEND;
                    end
                ELSE
                    if ((BASE <> 0) AND (CANTIDAD <> 0)) then
                        SUSPEND;
                END
            if (CEROS = 'S') then
                BEGIN
                COSTO = 0;
                UTILIDAD = 0;
                PORC = 0;
                /* agregue los articulos sin factura */
                FOR SELECT ARTI_COD, 0, 0, 0, ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                    FROM ARTICULO A WHERE A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN and
                    not exists (select REPA_ARTICULO FROM REPORTES_AUX WHERE REPA_ID = 4 AND REPA_USER = USER AND REPA_ARTICULO = a.arti_cod)
                    INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
                    DO
                    BEGIN
                    SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                    SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                    SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                    SUSPEND;
                    END
                END
            END
        if (BIN_AND(TIPO, 8) <> 0) then
            BEGIN
            SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 34 INTO :NOMTIPO;
            FOR SELECT MAX(D.ARTI_COD), SUM(PEDE_CANT * PEDE_FACTOR), SUM(PEDI_FACTOR*(PEDE_TOTAL-PEDE_IVAMONTO-PEDE_CONSUMO)),
                SUM(PEDI_FACTOR*PEDE_IVAMONTO), SUM(PEDI_FACTOR*PEDE_TOTAL), SUM(PEDE_CONSUMO),
                MAX(ARTI_DES), MAX(ARTI_UNIDAD), MAX(GRUP_COD), MAX(SUBG_COD), MAX(MARC_COD)
                FROM PEDIDOS_DETALLE D, PEDIDOS P, PREFIJOS PR, articulo A
                WHERE P.PEDI_ID = D.PEDI_ID AND PEDI_FECHA >= :FECINI AND PEDI_FECHA <= :FECFIN AND VEND_COD = :CODVEND AND PEDI_ANULADO = 'N'
                 AND PR.PREF_PRE = P.PREF_PRE AND P.TIDO_COD = 34 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
                 AND D.ARTI_COD = A.arti_cod AND A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN
                GROUP BY D.ARTI_COD
                INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :TOTAL, :CONSUMO,
                    :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
                DO
                BEGIN
                COSTO = 0;
                FOR SELECT PEDE_CANT * PEDE_FACTOR, PEDI_FECHA FROM pedidos_detalle D, PEDIDOS F, PREFIJOS P
                    WHERE F.VEND_COD = :codvend AND F.pedi_id = D.pedi_id AND PEDI_FECHA >= :FECINI AND PEDI_FECHA <= :FECFIN AND
                    PEDI_ANULADO = 'N' AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 34 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
                    and D.ARTI_COD = :articulo  INTO :cantdet, :fecha
                    DO
                    BEGIN
                    EXECUTE PROCEDURE COSTO_PROMEDIO(:ARTICULO, :FECHA) returning_values (:costounit);
                    /* EL FACTOR */
                    FACCOST = 1;
                    SELECT FIRST 1 FACO_FACTOR FROM factor_costo WHERE FACO_FECINI <= :FECHA AND FACO_FECFIN >= :FECHA INTO :FACCOST;
                    COSTOUNIT = COSTOUNIT * FACCOST;

                    COSTO = COSTO + costounit * cantdet;
                    END
                SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                if (CANTIDAD IS NULL) then
                    CANTIDAD = 0;
                if (BASE IS NULL) then
                    BASE = 0;
                if (IVA IS NULL) then
                    IVA = 0;
                UTILIDAD = BASE - COSTO;
                if (UOM = 'UTILIDAD') then
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
                else
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
                if (CEROS = 'S') then
                    begin
                    INSERT INTO REPORTES_AUX (REPA_ID, REPA_USER, REPA_ARTICULO) VALUES (4, USER, :ARTICULO);
                    SUSPEND;
                    end
                ELSE
                    if ((BASE <> 0) AND (CANTIDAD <> 0)) then
                        SUSPEND;
                END
            if (CEROS = 'S') then
                BEGIN
                COSTO = 0;
                UTILIDAD = 0;
                PORC = 0;
                /* agregue los articulos sin factura */
                FOR SELECT ARTI_COD, 0, 0, 0, ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                    FROM ARTICULO A WHERE A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN and
                    not exists (select REPA_ARTICULO FROM REPORTES_AUX WHERE REPA_ID = 4 AND REPA_USER = USER AND REPA_ARTICULO = a.arti_cod)
                    INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
                    DO
                    BEGIN
                    SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                    SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                    SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                    SUSPEND;
                    END
                END
            END
        if (BIN_AND(TIPO, 16) <> 0) then
            BEGIN
            SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 35 INTO :NOMTIPO;
            FOR SELECT MAX(D.ARTI_COD), SUM(CTDE_CANT * CTDE_FACTOR), SUM(COTI_FACTOR*(CTDE_TOTAL-CTDE_IVAMONTO-CTDE_CONSUMO)),
                SUM(COTI_FACTOR*CTDE_IVAMONTO), SUM(COTI_FACTOR*CTDE_TOTAL), SUM(CTDE_CONSUMO),
                MAX(ARTI_DES), MAX(ARTI_UNIDAD), MAX(GRUP_COD), MAX(SUBG_COD), MAX(MARC_COD)
                FROM COTIZACIONES_DETALLE D, COTIZACIONES C, PREFIJOS P, ARTICULO A
                WHERE C.COTI_ID = D.COTI_ID AND COTI_FECHA >= :FECINI AND COTI_FECHA <= :FECFIN AND VEND_COD = :CODVEND AND COTI_ANULADO = 'N'
                 AND P.PREF_PRE = C.PREF_PRE AND P.TIDO_COD = 35 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
                 AND D.ARTI_COD = A.arti_cod AND A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN
                GROUP BY D.ARTI_COD
                INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :TOTAL, :CONSUMO,
                    :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
                DO
                BEGIN
                COSTO = 0;
                FOR SELECT PEDE_CANT * PEDE_FACTOR, PEDI_FECHA FROM pedidos_detalle D, PEDIDOS F, PREFIJOS P
                    WHERE F.VEND_COD = :codvend AND F.pedi_id = D.pedi_id AND PEDI_FECHA >= :FECINI AND PEDI_FECHA <= :FECFIN AND
                    PEDI_ANULADO = 'N' AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 34 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
                    and D.ARTI_COD = :articulo  INTO :cantdet, :fecha
                    DO
                    BEGIN
                    EXECUTE PROCEDURE COSTO_PROMEDIO(:ARTICULO, :FECHA) returning_values (:costounit);
                    /* EL FACTOR */
                    FACCOST = 1;
                    SELECT FIRST 1 FACO_FACTOR FROM factor_costo WHERE FACO_FECINI <= :FECHA AND FACO_FECFIN >= :FECHA INTO :FACCOST;
                    COSTOUNIT = COSTOUNIT * FACCOST;

                    COSTO = COSTO + costounit * cantdet;
                    END
                SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                if (CANTIDAD IS NULL) then
                    CANTIDAD = 0;
                if (BASE IS NULL) then
                    BASE = 0;
                if (IVA IS NULL) then
                    IVA = 0;
                COSTO = CANTIDAD * COSTOUNIT;
                UTILIDAD = BASE - COSTO;
                if (UOM = 'UTILIDAD') then
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
                else
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
                if (CEROS = 'S') then
                    begin
                    INSERT INTO REPORTES_AUX (REPA_ID, REPA_USER, REPA_ARTICULO) VALUES (4, USER, :ARTICULO);
                    SUSPEND;
                    end
                ELSE
                    if ((BASE <> 0) AND (CANTIDAD <> 0)) then
                        SUSPEND;
                END
            if (CEROS = 'S') then
                BEGIN
                COSTO = 0;
                UTILIDAD = 0;
                PORC = 0;
                /* agregue los articulos sin factura */
                FOR SELECT ARTI_COD, 0, 0, 0, ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                    FROM ARTICULO A WHERE A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN and
                    not exists (select REPA_ARTICULO FROM REPORTES_AUX WHERE REPA_ID = 4 AND REPA_USER = USER AND REPA_ARTICULO = a.arti_cod)
                    INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
                    DO
                    BEGIN
                    SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                    SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                    SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                    SUSPEND;
                    END
                END
            END
        END
    ELSE
        BEGIN
        if (BIN_AND(TIPO, 1) <> 0) then
            BEGIN
            SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 31 INTO :NOMTIPO;
            FOR SELECT F.fact_id, D.fade_item, F.PREF_PRE, FACT_NUMERO, FACT_FECHA, ARTI_COD, FADE_CANT * FADE_FACTOR, (FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO)*FACT_FACTOR,
                FADE_IVAMONTO*FACT_FACTOR, FADE_DTOPORC, FADE_TOTAL*FACT_FACTOR, FADE_CONSUMO, D.lipr_cod
                FROM FACTURAS F, FACTURAS_DETALLE D, PREFIJOS P
                WHERE F.FACT_ID = D.FACT_ID AND FACT_FECHA >= :FECINI AND FACT_FECHA <= :FECFIN AND VEND_COD = :CODVEND AND FACT_ANULADO = 'N'
                 AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 31 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) and substring(D.arti_cod from 1 FOR 2) <> '.t'
                ORDER BY ARTI_COD, FACT_FECHA, F.FACT_ID, FADE_ITEM
                INTO :ID, :ITEM, :PREFIJO, :NUMERO, :FECHA, :ARTICULO, :CANTIDAD, :BASE, :IVA, :DTO, :TOTAL, :CONSUMO, :codlista
                DO
                BEGIN
                SELECT ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                    FROM ARTICULO WHERE ARTI_COD = :ARTICULO
                    INTO :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC;
                SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                if (EXISTS (SELECT COST_SALP / COST_SALC FROM COSTOS C, MOVIMIENTO_ARTICULO M
                    WHERE COST_IDMOV = MVAR_CONS AND MVAR_TIPODOC = 31 AND MVAR_IDREF = :ID AND COST_SALC <> 0 AND MVAR_ITEM = :ITEM)) then
                    SELECT COST_SALP / COST_SALC FROM COSTOS C, MOVIMIENTO_ARTICULO M
                        WHERE COST_IDMOV = MVAR_CONS AND MVAR_TIPODOC = 31 AND MVAR_IDREF = :ID AND COST_SALC <> 0 AND MVAR_ITEM = :ITEM INTO :costounit;
                else
                    EXECUTE PROCEDURE costo_promedio (:ARTICULO, :FECHA) RETURNING_VALUES (:COSTOUNIT);
                /* EL FACTOR */
                FACCOST = 1;
                SELECT FIRST 1 FACO_FACTOR FROM factor_costo WHERE FACO_FECINI <= :FECHA AND FACO_FECFIN >= :FECHA INTO :FACCOST;
                COSTOUNIT = COSTOUNIT * FACCOST;

                LISTA = 0;
                SELECT PRAR_FIJO FROM precios_articulo WHERE LIPR_COD = :CODLISTA AND ARTI_COD = :ARTICULO INTO :LISTA;
                COSTO = COSTOUNIT * CANTIDAD;
                UTILIDAD = BASE - COSTO;
                if (UOM = 'UTILIDAD') then
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
                else
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
                if (CEROS = 'S') then
                    INSERT INTO REPORTES_AUX (REPA_ID, REPA_USER, REPA_ARTICULO) VALUES (4, USER, :ARTICULO);
                SUSPEND;
                END
            if (CEROS = 'S') then
                BEGIN
                COSTO = 0;
                UTILIDAD = 0;
                PORC = 0;
                /* agregue los articulos sin factura */
                FOR SELECT ARTI_COD, 0, 0, 0, ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                    FROM ARTICULO A WHERE A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN and
                    not exists (select REPA_ARTICULO FROM REPORTES_AUX WHERE REPA_ID = 4 AND REPA_USER = USER AND REPA_ARTICULO = a.arti_cod)
                    INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
                    DO
                    BEGIN
                    SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                    SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                    SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                    SUSPEND;
                    END
                END
            END
        if (BIN_AND(TIPO, 2) <> 0) then
            BEGIN
            SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 32 INTO :NOMTIPO;
            FOR SELECT R.REVT_ID, RVDE_ITEM, R.PREF_PRE, REVT_NUMERO, REVT_FECHA, ARTI_COD, RVDE_CANT * RVDE_FACTOR, (RVDE_TOTAL - RVDE_IVAMONTO), RVDE_IVAMONTO, RVDE_DTOPORC, RVDE_TOTAL, RVDE_CONSUMO, D.lipr_cod
                FROM REMISIONES_VENTA R, REMISIONES_VENTA_DETALLE D, PREFIJOS P
                WHERE R.REVT_ID = D.REVT_ID AND REVT_FECHA >= :FECINI AND REVT_FECHA <= :FECFIN AND VEND_COD = :CODVEND AND REVT_ANULADO = 'N'
                 AND P.PREF_PRE = R.PREF_PRE AND P.TIDO_COD = 32 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) and substring(D.arti_cod from 1 FOR 2) <> '.t'
                ORDER BY ARTI_COD, REVT_FECHA, R.REVT_ID, RVDE_ITEM
                INTO :ID, :ITEM, :PREFIJO, :NUMERO, :FECHA, :ARTICULO, :CANTIDAD, :BASE, :IVA, :DTO, :TOTAL, :CONSUMO, :codlista
                DO
                BEGIN
                SELECT ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                    FROM ARTICULO WHERE ARTI_COD = :ARTICULO
                    INTO :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC;
                SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                if (EXISTS (SELECT COST_SALP / COST_SALC FROM COSTOS C, MOVIMIENTO_ARTICULO M
                    WHERE COST_IDMOV = MVAR_CONS AND MVAR_TIPODOC = 32 AND MVAR_IDREF = :ID AND COST_SALC <> 0 AND MVAR_ITEM = :ITEM)) then
                    SELECT COST_SALP / COST_SALC FROM COSTOS C, MOVIMIENTO_ARTICULO M
                        WHERE COST_IDMOV = MVAR_CONS AND MVAR_TIPODOC = 32 AND MVAR_IDREF = :ID AND COST_SALC <> 0 AND MVAR_ITEM = :ITEM INTO :costounit;
                else
                    EXECUTE PROCEDURE costo_promedio (:ARTICULO, :FECHA) RETURNING_VALUES (:COSTOUNIT);
                /* EL FACTOR */
                FACCOST = 1;
                SELECT FIRST 1 FACO_FACTOR FROM factor_costo WHERE FACO_FECINI <= :FECHA AND FACO_FECFIN >= :FECHA INTO :FACCOST;
                COSTOUNIT = COSTOUNIT * FACCOST;

                LISTA = 0;
                SELECT PRAR_FIJO FROM precios_articulo WHERE LIPR_COD = :CODLISTA AND ARTI_COD = :ARTICULO INTO :LISTA;
                COSTO = COSTOUNIT * CANTIDAD;
                UTILIDAD = BASE - COSTO;
                if (UOM = 'UTILIDAD') then
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
                else
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
                if (CEROS = 'S') then
                    INSERT INTO REPORTES_AUX (REPA_ID, REPA_USER, REPA_ARTICULO) VALUES (4, USER, :ARTICULO);
                SUSPEND;
                END
            if (CEROS = 'S') then
                BEGIN
                COSTO = 0;
                UTILIDAD = 0;
                PORC = 0;
                /* agregue los articulos sin factura */
                FOR SELECT ARTI_COD, 0, 0, 0, ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                    FROM ARTICULO A WHERE A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN and
                    not exists (select REPA_ARTICULO FROM REPORTES_AUX WHERE REPA_ID = 4 AND REPA_USER = USER AND REPA_ARTICULO = a.arti_cod)
                    INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
                    DO
                    BEGIN
                    SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                    SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                    SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                    SUSPEND;
                    END
                END
            END
        if (BIN_AND(TIPO, 4) <> 0) then
            BEGIN
            SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 33 INTO :NOMTIPO;
            FOR SELECT V.DEVT_ID, DVDE_ITEM, V.PREF_PRE, DEVT_NUMERO, DEVT_FECHA, ARTI_COD, DVDE_CANT * DVDE_FACTOR, (DVDE_TOTAL-DVDE_IVAMONTO-DVDE_CONSUMO)*DEVT_FACTOR,
                DVDE_IVAMONTO*DEVT_FACTOR, DVDE_DTOPORC, DVDE_TOTAL*DEVT_FACTOR, DVDE_CONSUMO
                FROM DEVOLUCIONES_VENTAS V, DEVOLUCIONES_VENTAS_DETALLE D, PREFIJOS P
                WHERE V.DEVT_ID = D.DEVT_ID AND DEVT_FECHA >= :FECINI AND DEVT_FECHA <= :FECFIN AND VEND_COD = :CODVEND AND DEVT_ANULADO = 'N'
                 AND P.PREF_PRE = V.PREF_PRE AND P.TIDO_COD = 33 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) and substring(D.arti_cod from 1 FOR 2) <> '.t'
                ORDER BY ARTI_COD, DEVT_FECHA, D.DEVT_ID, DVDE_ITEM
                INTO :ID, :ITEM, :PREFIJO, :NUMERO, :FECHA, :ARTICULO, :CANTIDAD, :BASE, :IVA, :DTO, :TOTAL, :CONSUMO
                DO
                BEGIN
                SELECT ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                    FROM ARTICULO WHERE ARTI_COD = :ARTICULO
                    INTO :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC;
                SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                if (EXISTS (SELECT COST_ENTP / COST_ENTC FROM COSTOS C, MOVIMIENTO_ARTICULO M
                    WHERE COST_IDMOV = MVAR_CONS AND MVAR_TIPODOC = 33 AND MVAR_IDREF = :ID AND COST_ENTC <> 0 AND MVAR_ITEM = :ITEM)) then
                    SELECT COST_ENTP / COST_ENTC FROM COSTOS C, MOVIMIENTO_ARTICULO M
                        WHERE COST_IDMOV = MVAR_CONS AND MVAR_TIPODOC = 33 AND MVAR_IDREF = :ID AND COST_ENTC <> 0 AND MVAR_ITEM = :ITEM INTO :costounit;
                else
                    EXECUTE PROCEDURE costo_promedio (:ARTICULO, :FECHA) RETURNING_VALUES (:COSTOUNIT);
                /* EL FACTOR */
                FACCOST = 1;
                SELECT FIRST 1 FACO_FACTOR FROM factor_costo WHERE FACO_FECINI <= :FECHA AND FACO_FECFIN >= :FECHA INTO :FACCOST;
                COSTOUNIT = COSTOUNIT * FACCOST;

                LISTA = 0;
                COSTO = COSTOUNIT * CANTIDAD;
                UTILIDAD = BASE - COSTO;
                if (UOM = 'UTILIDAD') then
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
                else
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
                TOTAL = TOTAL * -1;
                IVA = IVA * -1;
                BASE = BASE * -1;
                CANTIDAD = CANTIDAD * -1;
                COSTO = COSTO * -1;
                UTILIDAD = UTILIDAD * -1;
                if (CEROS = 'S') then
                    INSERT INTO REPORTES_AUX (REPA_ID, REPA_USER, REPA_ARTICULO) VALUES (4, USER, :ARTICULO);
                SUSPEND;
                END
            if (CEROS = 'S') then
                BEGIN
                COSTO = 0;
                UTILIDAD = 0;
                PORC = 0;
                /* agregue los articulos sin factura */
                FOR SELECT ARTI_COD, 0, 0, 0, ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                    FROM ARTICULO A WHERE A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN and
                    not exists (select REPA_ARTICULO FROM REPORTES_AUX WHERE REPA_ID = 4 AND REPA_USER = USER AND REPA_ARTICULO = a.arti_cod)
                    INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
                    DO
                    BEGIN
                    SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                    SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                    SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                    SUSPEND;
                    END
                END
            END
        if (BIN_AND(TIPO, 8) <> 0) then
            BEGIN
            SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 34 INTO :NOMTIPO;
            FOR SELECT P.PREF_PRE, PEDI_NUMERO, PEDI_FECHA, ARTI_COD, PEDE_CANT * PEDE_FACTOR, (PEDE_TOTAL-PEDE_IVAMONTO-PEDE_CONSUMO)*PEDI_FACTOR,
                PEDE_IVAMONTO*PEDI_FACTOR, PEDE_DTOPORC, PEDE_TOTAL*PEDI_FACTOR, PEDE_CONSUMO, D.lipr_cod
                FROM PEDIDOS P, PEDIDOS_DETALLE D, PREFIJOS PR
                WHERE P.PEDI_ID = D.PEDI_ID AND PEDI_FECHA >= :FECINI AND PEDI_FECHA <= :FECFIN AND VEND_COD = :CODVEND AND PEDI_ANULADO = 'N'
                 AND P.PREF_PRE = PR.PREF_PRE AND P.TIDO_COD = 34 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
                ORDER BY ARTI_COD, PEDI_FECHA, P.PEDI_ID, PEDE_ITEM
                INTO :PREFIJO, :NUMERO, :FECHA, :ARTICULO, :CANTIDAD, :BASE, :IVA, :DTO, :TOTAL, :CONSUMO, :codlista
                DO
                BEGIN
                SELECT ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                    FROM ARTICULO WHERE ARTI_COD = :ARTICULO
                    INTO :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC;
                SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                EXECUTE PROCEDURE costo_promedio (:ARTICULO, :FECHA) RETURNING_VALUES (:COSTOUNIT);
                /* EL FACTOR */
                FACCOST = 1;
                SELECT FIRST 1 FACO_FACTOR FROM factor_costo WHERE FACO_FECINI <= :FECHA AND FACO_FECFIN >= :FECHA INTO :FACCOST;
                COSTOUNIT = COSTOUNIT * FACCOST;

                LISTA = 0;
                SELECT PRAR_FIJO FROM precios_articulo WHERE LIPR_COD = :CODLISTA AND ARTI_COD = :ARTICULO INTO :LISTA;
                COSTO = COSTOUNIT * CANTIDAD;
                UTILIDAD = BASE - COSTO;
                if (UOM = 'UTILIDAD') then
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
                else
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
                if (CEROS = 'S') then
                    INSERT INTO REPORTES_AUX (REPA_ID, REPA_USER, REPA_ARTICULO) VALUES (4, USER, :ARTICULO);
                SUSPEND;
                END
            if (CEROS = 'S') then
                BEGIN
                COSTO = 0;
                UTILIDAD = 0;
                PORC = 0;
                /* agregue los articulos sin factura */
                FOR SELECT ARTI_COD, 0, 0, 0, ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                    FROM ARTICULO A WHERE A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN and
                    not exists (select REPA_ARTICULO FROM REPORTES_AUX WHERE REPA_ID = 4 AND REPA_USER = USER AND REPA_ARTICULO = a.arti_cod)
                    INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
                    DO
                    BEGIN
                    SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                    SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                    SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                    SUSPEND;
                    END
                END
            END
        if (BIN_AND(TIPO, 16) <> 0) then
            BEGIN
            SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 35 INTO :NOMTIPO;
            FOR SELECT C.PREF_PRE, COTI_NUMERO, COTI_FECHA, ARTI_COD, CTDE_CANT * CTDE_FACTOR, (CTDE_TOTAL-CTDE_IVAMONTO-CTDE_CONSUMO)*COTI_FACTOR,
                CTDE_IVAMONTO*COTI_FACTOR, CTDE_DTOPORC, CTDE_TOTAL*COTI_FACTOR, CTDE_CONSUMO, D.lipr_cod
                FROM COTIZACIONES C, COTIZACIONES_DETALLE D, PREFIJOS P
                WHERE C.COTI_ID = D.COTI_ID AND ARTI_COD = :ARTICULO AND COTI_FECHA >= :FECINI AND COTI_FECHA <= :FECFIN AND VEND_COD = :CODVEND AND COTI_ANULADO = 'N'
                 AND P.PREF_PRE = C.PREF_PRE AND P.TIDO_COD = 35 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
                ORDER BY COTI_FECHA, C.COTI_ID, CTDE_ITEM
                INTO :PREFIJO, :NUMERO, :FECHA, :ARTICULO, :CANTIDAD, :BASE, :IVA, :DTO, :TOTAL, :CONSUMO, :codlista
                DO
                BEGIN
                SELECT ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                    FROM ARTICULO WHERE ARTI_COD = :ARTICULO
                    INTO :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC;
                SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                LISTA = 0;
                SELECT PRAR_FIJO FROM precios_articulo WHERE LIPR_COD = :CODLISTA AND ARTI_COD = :ARTICULO INTO :LISTA;
                EXECUTE PROCEDURE costo_promedio (:ARTICULO, :FECHA) RETURNING_VALUES (:COSTOUNIT);
                /* EL FACTOR */
                FACCOST = 1;
                SELECT FIRST 1 FACO_FACTOR FROM factor_costo WHERE FACO_FECINI <= :FECHA AND FACO_FECFIN >= :FECHA INTO :FACCOST;
                COSTOUNIT = COSTOUNIT * FACCOST;

                COSTO = COSTOUNIT * CANTIDAD;
                UTILIDAD = BASE - COSTO;
                if (UOM = 'UTILIDAD') then
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
                else
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
                if (CEROS = 'S') then
                    INSERT INTO REPORTES_AUX (REPA_ID, REPA_USER, REPA_ARTICULO) VALUES (4, USER, :ARTICULO);
                SUSPEND;
                END
            if (CEROS = 'S') then
                BEGIN
                COSTO = 0;
                UTILIDAD = 0;
                PORC = 0;
                /* agregue los articulos sin factura */
                FOR SELECT ARTI_COD, 0, 0, 0, ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                    FROM ARTICULO A WHERE A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN and
                    not exists (select REPA_ARTICULO FROM REPORTES_AUX WHERE REPA_ID = 4 AND REPA_USER = USER AND REPA_ARTICULO = a.arti_cod)
                    INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
                    DO
                    BEGIN
                    SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                    SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                    SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                    SUSPEND;
                    END
                END
            END
        END
    END
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER procedure REP_UTILIDAD_CLIENTE (
    TIPO integer,
    DETALLE char(1),
    TERINI varchar(20),
    TERFIN varchar(20),
    FECINI date,
    FECFIN date,
    ARTINI varchar(15),
    ARTFIN varchar(15),
    ORDEN char(1),
    CEROS char(1),
    SUBEMPRESA integer)
returns (
    NIT varchar(20),
    NOMBRE varchar(60),
    SUCURSAL varchar(10),
    TELEFONO varchar(40),
    CIUDAD varchar(40),
    CODZONA varchar(2),
    NOMZONA varchar(30),
    NOMTIPO varchar(50),
    ARTICULO varchar(15),
    DESCRIPCION varchar(60),
    CODGRUPO varchar(2),
    NOMGRUPO varchar(30),
    CODSUBG varchar(3),
    NOMSUBG varchar(30),
    CODMARC varchar(3),
    NOMMARC varchar(30),
    UNIDAD varchar(8),
    CANTIDAD numeric(18,4),
    BASE numeric(18,2),
    IVA numeric(18,2),
    COSTO numeric(18,2),
    UTILIDAD numeric(18,4),
    PORC numeric(9,2),
    TOTAL numeric(18,2),
    PREFIJO varchar(4),
    NUMERO varchar(6),
    FECHA date,
    DTO numeric(9,2))
AS
DECLARE VARIABLE COSTOUNIT NUMERIC(18,4);
DECLARE VARIABLE CANTDET NUMERIC(18,4);
DECLARE VARIABLE CODINI VARCHAR(15);
DECLARE VARIABLE CODFIN VARCHAR(15);
DECLARE VARIABLE DESINI VARCHAR(15);
DECLARE VARIABLE DESFIN VARCHAR(15);
declare variable UOM VARCHAR(20);
declare variable NUMROWS INTEGER;
declare variable ID INTEGER;
declare variable ITEM INTEGER;
declare variable FACCOST NUMERIC(18,4);
BEGIN
if (ORDEN = 'C') then
    BEGIN
    CODINI = ARTINI;
    CODFIN = ARTFIN;
    DESINI = '';
    DESFIN = 'zz';
    END
ELSE
    BEGIN
    DESINI = ARTINI;
    DESFIN = ARTFIN;
    CODINI = '';
    CODFIN = 'zz';
    END
EXECUTE PROCEDURE lee_configuracion ('FACTURACION', 'ARTICULOS', 'SUGERIR PRECIOS CON PORCENTAJE DE MARGEN O UTILIDAD') returning_values (:UOM);
SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = :TIPO INTO :NOMTIPO;
if (DETALLE = 'N') then
    BEGIN
    if (BIN_AND(TIPO, 1) <> 0) then
        BEGIN
        SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 31 INTO :NOMTIPO;
        /* BORRA LA TABLA AUXILIAR */
        DELETE FROM reportes_aux WHERE REPA_ID = 3 AND REPA_USER = USER;

        FOR SELECT MAX(T.TERC_NIT), MAX(TERC_NOM), MAX(TERC_TEL), MAX(TERC_CIU), MAX(ZONA_COD), MAX(D.ARTI_COD), SUM(FADE_CANT * FADE_FACTOR), SUM(FACT_FACTOR*(FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO)),
            SUM(FACT_FACTOR*FADE_IVAMONTO), SUM(FACT_FACTOR*FADE_TOTAL),
            MAX(ARTI_DES), MAX(ARTI_UNIDAD), MAX(GRUP_COD), MAX(SUBG_COD), MAX(MARC_COD), max(f.fact_sucursal)
            FROM FACTURAS_DETALLE D, FACTURAS F, PREFIJOS P, terceros T, CLIENTES C, ARTICULO A
            WHERE C.TERC_NIT = T.TERC_NIT AND TERC_CLIE = 'S' AND F.terc_nit = T.terc_nit AND T.TERC_NIT >= :TERINI AND T.TERC_NIT <= :TERFIN AND
            F.FACT_ID = D.FACT_ID AND FACT_FECHA >= :FECINI AND FACT_FECHA <= :FECFIN AND FACT_ANULADO = 'N'
            AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 31 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) and substring(D.arti_cod from 1 FOR 2) <> '.t'
            AND D.ARTI_COD = A.arti_cod AND A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN
            GROUP BY T.TERC_NIT, f.fact_sucursal, D.ARTI_COD
            INTO :NIT, :NOMBRE, :TELEFONO, :CIUDAD, :CODZONA, :ARTICULO, :CANTIDAD, :BASE, :IVA, :TOTAL,
            :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC, :sucursal
            DO
            BEGIN
            COSTO = 0;
            FOR SELECT F.FACT_ID, FADE_ITEM, FADE_CANT * FADE_FACTOR, FACT_FECHA FROM FACTURAS_DETALLE D, FACTURAS F, PREFIJOS P
                WHERE F.TERC_NIT = :NIT AND F.FACT_ID = D.FACT_ID AND FACT_FECHA >= :FECINI AND FACT_FECHA <= :FECFIN AND
                FACT_ANULADO = 'N' AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 31 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
                and D.ARTI_COD = :articulo  INTO :ID, :ITEM, :cantdet, :fecha
                DO
                BEGIN
                if (EXISTS (SELECT COST_SALP / COST_SALC FROM COSTOS C, MOVIMIENTO_ARTICULO M
                    WHERE COST_IDMOV = MVAR_CONS AND MVAR_TIPODOC = 31 AND MVAR_IDREF = :ID AND COST_SALC <> 0 AND MVAR_ITEM = :ITEM)) then
                    SELECT COST_SALP / COST_SALC FROM COSTOS C, MOVIMIENTO_ARTICULO M
                        WHERE COST_IDMOV = MVAR_CONS AND MVAR_TIPODOC = 31 AND MVAR_IDREF = :ID AND COST_SALC <> 0 AND MVAR_ITEM = :ITEM INTO :costounit;
                else
                    EXECUTE PROCEDURE COSTO_PROMEDIO(:ARTICULO, :FECHA) returning_values (:costounit);
                /* EL FACTOR */
                FACCOST = 1;
                SELECT FIRST 1 FACO_FACTOR FROM factor_costo WHERE FACO_FECINI <= :FECHA AND FACO_FECFIN >= :FECHA INTO :FACCOST;
                COSTOUNIT = COSTOUNIT * FACCOST;

                COSTO = COSTO + costounit * cantdet;
                END
            SELECT ZONA_NOM FROM ZONAS WHERE ZONA_COD = :CODZONA INTO :NOMZONA;
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            if (CANTIDAD IS NULL) then
                CANTIDAD = 0;
            if (BASE IS NULL) then
                BASE = 0;
            if (IVA IS NULL) then
                IVA = 0;
            UTILIDAD = BASE - COSTO;
            if (UOM = 'UTILIDAD') then
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
            else
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
            if (CEROS = 'S') then
                INSERT INTO REPORTES_AUX (REPA_ID, REPA_USER, REPA_ARTICULO) VALUES (3, USER, :ARTICULO);
            SUSPEND;
            END /* FOR */
        if (CEROS = 'S') then
            BEGIN
            COSTO = 0;
            UTILIDAD = 0;
            PORC = 0;
            /* agregue los articulos sin factura */
            FOR SELECT ARTI_COD, 0, 0, 0, ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                FROM ARTICULO A WHERE A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN
                INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
                DO
                BEGIN
                SELECT COUNT(REPA_ARTICULO) FROM REPORTES_AUX WHERE REPA_ID = 3 AND REPA_USER = USER AND REPA_ARTICULO = :articulo INTO :numrows;
                if (numrows = 0) then
                    BEGIN
                    SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                    SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                    SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                    SUSPEND;
                    END
                END
            END
        END
    if (BIN_AND(TIPO, 2) <> 0) then
        BEGIN
        SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 32 INTO :NOMTIPO;
        /* BORRA LA TABLA AUXILIAR */
        DELETE FROM reportes_aux WHERE REPA_ID = 3 AND REPA_USER = USER;

        FOR SELECT MAX(T.TERC_NIT), MAX(TERC_NOM), MAX(TERC_TEL), MAX(TERC_CIU), MAX(ZONA_COD), MAX(D.ARTI_COD), SUM(RVDE_CANT * RVDE_FACTOR), SUM(RVDE_TOTAL-RVDE_IVAMONTO-RVDE_CONSUMO), SUM(RVDE_IVAMONTO), SUM(RVDE_TOTAL),
            MAX(ARTI_DES), MAX(ARTI_UNIDAD), MAX(GRUP_COD), MAX(SUBG_COD), MAX(MARC_COD), max(r.revt_sucursal)
            FROM REMISIONES_VENTA_DETALLE D, REMISIONES_VENTA R, PREFIJOS P, terceros T, CLIENTES C, ARTICULO A
            WHERE C.TERC_NIT = T.TERC_NIT AND TERC_CLIE = 'S' AND R.terc_nit = T.terc_nit AND T.TERC_NIT >= :TERINI AND T.TERC_NIT <= :TERFIN AND
            R.REVT_ID = D.REVT_ID AND REVT_FECHA >= :FECINI AND REVT_FECHA <= :FECFIN AND REVT_ANULADO = 'N'
            AND P.PREF_PRE = R.PREF_PRE AND P.TIDO_COD = 32 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            AND D.ARTI_COD = A.arti_cod AND A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN
            GROUP BY T.TERC_NIT, r.revt_sucursal, D.ARTI_COD
            INTO :NIT, :NOMBRE, :TELEFONO, :CIUDAD, :CODZONA, :ARTICULO, :CANTIDAD, :BASE, :IVA, :TOTAL,
                :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC, :sucursal
            DO
                BEGIN
                COSTO = 0;
                FOR SELECT R.REVT_ID, RVDE_ITEM, RVDE_CANT * RVDE_FACTOR, REVT_FECHA
                    FROM REMISIONES_VENTA_DETALLE D, REMISIONES_VENTA R, PREFIJOS P
                    WHERE R.terc_nit = :nit AND R.REVT_ID = D.REVT_ID AND REVT_FECHA >= :FECINI AND REVT_FECHA <= :FECFIN AND REVT_ANULADO = 'N'
                    AND P.PREF_PRE = R.PREF_PRE AND P.TIDO_COD = 32 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
                    AND D.ARTI_COD = :articulo INTO :ID, :ITEM, :cantdet, :fecha
                    DO
                    BEGIN
                    if (EXISTS (SELECT COST_SALP / COST_SALC FROM COSTOS C, MOVIMIENTO_ARTICULO M
                        WHERE COST_IDMOV = MVAR_CONS AND MVAR_TIPODOC = 32 AND MVAR_IDREF = :ID AND COST_SALC <> 0 AND MVAR_ITEM = :ITEM)) then
                        SELECT COST_SALP / COST_SALC FROM COSTOS C, MOVIMIENTO_ARTICULO M
                            WHERE COST_IDMOV = MVAR_CONS AND MVAR_TIPODOC = 32 AND MVAR_IDREF = :ID AND COST_SALC <> 0 AND MVAR_ITEM = :ITEM INTO :costounit;
                    else
                        EXECUTE PROCEDURE COSTO_PROMEDIO(:ARTICULO, :FECHA) returning_values (:costounit);
                    /* EL FACTOR */
                    FACCOST = 1;
                    SELECT FIRST 1 FACO_FACTOR FROM factor_costo WHERE FACO_FECINI <= :FECHA AND FACO_FECFIN >= :FECHA INTO :FACCOST;
                    COSTOUNIT = COSTOUNIT * FACCOST;

                    COSTO = COSTO + costounit * cantdet;
                    END
                SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                if (CANTIDAD IS NULL) then
                    CANTIDAD = 0;
                if (BASE IS NULL) then
                    BASE = 0;
                if (IVA IS NULL) then
                    IVA = 0;
                UTILIDAD = BASE - COSTO;
                if (UOM = 'UTILIDAD') then
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
                else
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
            if (CEROS = 'S') then
                INSERT INTO REPORTES_AUX (REPA_ID, REPA_USER, REPA_ARTICULO) VALUES (3, USER, :ARTICULO);
            SUSPEND;
            END /* FOR */
        if (CEROS = 'S') then
            BEGIN
            COSTO = 0;
            UTILIDAD = 0;
            PORC = 0;
            /* agregue los articulos sin factura */
            FOR SELECT ARTI_COD, 0, 0, 0, ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                FROM ARTICULO A WHERE A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN
                INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
                DO
                BEGIN
                SELECT COUNT(REPA_ARTICULO) FROM REPORTES_AUX WHERE REPA_ID = 3 AND REPA_USER = USER AND REPA_ARTICULO = :articulo INTO :numrows;
                if (numrows = 0) then
                    BEGIN
                    SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                    SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                    SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                    SUSPEND;
                    END
                END
            END
        END
    if (BIN_AND(TIPO, 4) <> 0) then
        BEGIN
        SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 33 INTO :NOMTIPO;
        /* BORRA LA TABLA AUXILIAR */
        DELETE FROM reportes_aux WHERE REPA_ID = 3 AND REPA_USER = USER;

        FOR SELECT MAX(T.TERC_NIT), MAX(TERC_NOM), MAX(TERC_TEL), MAX(TERC_CIU), MAX(ZONA_COD), MAX(D.ARTI_COD), SUM(DVDE_CANT * DVDE_FACTOR), SUM(DEVT_FACTOR*(DVDE_TOTAL-DVDE_IVAMONTO-DVDE_CONSUMO)),
            SUM(DEVT_FACTOR*DVDE_IVAMONTO), SUM(DEVT_FACTOR*DVDE_TOTAL),
            MAX(ARTI_DES), MAX(ARTI_UNIDAD), MAX(GRUP_COD), MAX(SUBG_COD), MAX(MARC_COD), max(v.devt_sucursal)
            FROM devoluciones_ventas_detalle D, DEVOLUCIONES_VENTAS V, PREFIJOS P, terceros T, CLIENTES C, ARTICULO A
            WHERE C.TERC_NIT = T.TERC_NIT AND TERC_CLIE = 'S' AND V.terc_nit = T.terc_nit AND T.TERC_NIT >= :TERINI AND T.TERC_NIT <= :TERFIN AND
            V.DEVT_ID = D.DEVT_ID AND DEVT_FECHA >= :FECINI AND DEVT_FECHA <= :FECFIN AND DEVT_ANULADO = 'N'
            AND P.PREF_PRE = V.PREF_PRE AND P.TIDO_COD = 33 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) and substring(D.arti_cod from 1 FOR 2) <> '.t'
            AND D.ARTI_COD = A.arti_cod AND A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN
            GROUP BY T.TERC_NIT, v.devt_sucursal, D.ARTI_COD
            INTO :NIT, :NOMBRE, :TELEFONO, :CIUDAD, :CODZONA, :ARTICULO, :CANTIDAD, :BASE, :IVA, :TOTAL,
                :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC, :sucursal
            DO
            BEGIN
            COSTO = 0;
            FOR SELECT V.DEVT_ID, DVDE_ITEM, DVDE_CANT * DVDE_FACTOR, DEVT_FECHA
                FROM devoluciones_ventas_detalle D, DEVOLUCIONES_VENTAS V, PREFIJOS P
                WHERE V.terc_nit = :nit AND V.DEVT_ID = D.DEVT_ID AND DEVT_FECHA >= :FECINI AND DEVT_FECHA <= :FECFIN AND DEVT_ANULADO = 'N'
                AND P.PREF_PRE = V.PREF_PRE AND P.TIDO_COD = 33 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
                AND D.ARTI_COD = :articulo INTO :ID, :ITEM, :cantdet, :fecha
                DO
                BEGIN
                if (EXISTS (SELECT COST_ENTP / COST_ENTC FROM COSTOS C, MOVIMIENTO_ARTICULO M
                    WHERE COST_IDMOV = MVAR_CONS AND MVAR_TIPODOC = 33 AND MVAR_IDREF = :ID AND COST_ENTC <> 0 AND MVAR_ITEM = :ITEM)) then
                    SELECT COST_ENTP / COST_ENTC FROM COSTOS C, MOVIMIENTO_ARTICULO M
                        WHERE COST_IDMOV = MVAR_CONS AND MVAR_TIPODOC = 33 AND MVAR_IDREF = :ID AND COST_ENTC <> 0 AND MVAR_ITEM = :ITEM INTO :costounit;
                else
                    EXECUTE PROCEDURE COSTO_PROMEDIO(:ARTICULO, :FECHA) returning_values (:costounit);
                /* EL FACTOR */
                FACCOST = 1;
                SELECT FIRST 1 FACO_FACTOR FROM factor_costo WHERE FACO_FECINI <= :FECHA AND FACO_FECFIN >= :FECHA INTO :FACCOST;
                COSTOUNIT = COSTOUNIT * FACCOST;

                COSTO = COSTO + costounit * cantdet;
                END
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            if (CANTIDAD IS NULL) then
                CANTIDAD = 0;
            if (BASE IS NULL) then
                BASE = 0;
            if (IVA IS NULL) then
                IVA = 0;
            UTILIDAD = BASE - COSTO;
            if (UOM = 'UTILIDAD') then
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
            else
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
            TOTAL = TOTAL * -1;
            IVA = IVA * -1;
            BASE = BASE * -1;
            CANTIDAD = CANTIDAD * -1;
            COSTO = COSTO * -1;
            UTILIDAD = UTILIDAD * -1;
            if (CEROS = 'S') then
                INSERT INTO REPORTES_AUX (REPA_ID, REPA_USER, REPA_ARTICULO) VALUES (3, USER, :ARTICULO);
            SUSPEND;
            END /* FOR */
        if (CEROS = 'S') then
            BEGIN
            COSTO = 0;
            UTILIDAD = 0;
            PORC = 0;
            /* agregue los articulos sin factura */
            FOR SELECT ARTI_COD, 0, 0, 0, ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                FROM ARTICULO A WHERE A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN
                INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
                DO
                BEGIN
                SELECT COUNT(REPA_ARTICULO) FROM REPORTES_AUX WHERE REPA_ID = 3 AND REPA_USER = USER AND REPA_ARTICULO = :articulo INTO :numrows;
                if (numrows = 0) then
                    BEGIN
                    SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                    SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                    SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                    SUSPEND;
                    END
                END
            END
        END
    if (BIN_AND(TIPO, 8) <> 0) then
        BEGIN
        SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 34 INTO :NOMTIPO;
        /* BORRA LA TABLA AUXILIAR */
        DELETE FROM reportes_aux WHERE REPA_ID = 3 AND REPA_USER = USER;

        FOR SELECT MAX(T.TERC_NIT), MAX(TERC_NOM), MAX(TERC_TEL), MAX(TERC_CIU), MAX(ZONA_COD), MAX(D.ARTI_COD), SUM(PEDE_CANT * PEDE_FACTOR),
            SUM(PEDI_FACTOR*(PEDE_TOTAL-PEDE_IVAMONTO-PEDE_CONSUMO)), SUM(PEDI_FACTOR*PEDE_IVAMONTO), SUM(PEDI_FACTOR*PEDE_TOTAL),
            MAX(ARTI_DES), MAX(ARTI_UNIDAD), MAX(GRUP_COD), MAX(SUBG_COD), MAX(MARC_COD), max(p.pedi_sucursal)
            FROM PEDIDOS_DETALLE D, PEDIDOS P, PREFIJOS PR, terceros T, CLIENTES C, ARTICULO A
            WHERE C.TERC_NIT = T.TERC_NIT AND TERC_CLIE = 'S' AND P.terc_nit = T.terc_nit AND T.TERC_NIT >= :TERINI AND T.TERC_NIT <= :TERFIN AND
            P.PEDI_ID = D.PEDI_ID AND PEDI_FECHA >= :FECINI AND PEDI_FECHA <= :FECFIN AND PEDI_ANULADO = 'N'
            AND PR.PREF_PRE = P.PREF_PRE AND P.TIDO_COD = 34 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            GROUP BY T.TERC_NIT, p.pedi_sucursal, D.ARTI_COD
            INTO :NIT, :NOMBRE, :TELEFONO, :CIUDAD, :CODZONA, :ARTICULO, :CANTIDAD, :BASE, :IVA, :TOTAL,
                :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC, :sucursal
            DO
            BEGIN
            COSTO = 0;
            FOR SELECT PEDE_CANT * PEDE_FACTOR, PEDI_FECHA
                FROM PEDIDOS_DETALLE D, PEDIDOS PE, PREFIJOS P
                WHERE PE.terc_nit = :nit AND PE.PEDI_ID = D.PEDI_ID AND PEDI_FECHA >= :FECINI AND PEDI_FECHA <= :FECFIN AND PEDI_ANULADO = 'N'
                AND P.PREF_PRE = PE.PREF_PRE AND P.TIDO_COD = 34 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
                AND D.ARTI_COD = :articulo INTO :cantdet, :fecha
                DO
                BEGIN
                EXECUTE PROCEDURE COSTO_PROMEDIO(:ARTICULO, :FECHA) returning_values (:costounit);
                /* EL FACTOR */
                FACCOST = 1;
                SELECT FIRST 1 FACO_FACTOR FROM factor_costo WHERE FACO_FECINI <= :FECHA AND FACO_FECFIN >= :FECHA INTO :FACCOST;
                COSTOUNIT = COSTOUNIT * FACCOST;

                COSTO = COSTO + costounit * cantdet;
                END
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            if (CANTIDAD IS NULL) then
                CANTIDAD = 0;
            if (BASE IS NULL) then
                BASE = 0;
            if (IVA IS NULL) then
                IVA = 0;
            UTILIDAD = BASE - COSTO;
            if (UOM = 'UTILIDAD') then
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
            else
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
            if (CEROS = 'S') then
                INSERT INTO REPORTES_AUX (REPA_ID, REPA_USER, REPA_ARTICULO) VALUES (3, USER, :ARTICULO);
            SUSPEND;
            END /* FOR */
        if (CEROS = 'S') then
            BEGIN
            COSTO = 0;
            UTILIDAD = 0;
            PORC = 0;
            /* agregue los articulos sin factura */
            FOR SELECT ARTI_COD, 0, 0, 0, ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                FROM ARTICULO A WHERE A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN
                INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
                DO
                BEGIN
                SELECT COUNT(REPA_ARTICULO) FROM REPORTES_AUX WHERE REPA_ID = 3 AND REPA_USER = USER AND REPA_ARTICULO = :articulo INTO :numrows;
                if (numrows = 0) then
                    BEGIN
                    SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                    SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                    SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                    SUSPEND;
                    END
                END
            END
        END
    if (BIN_AND(TIPO, 16) <> 0) then
        BEGIN
        SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 35 INTO :NOMTIPO;
        /* BORRA LA TABLA AUXILIAR */
        DELETE FROM reportes_aux WHERE REPA_ID = 3 AND REPA_USER = USER;

        FOR SELECT MAX(T.TERC_NIT), MAX(TERC_NOM), MAX(TERC_TEL), MAX(TERC_CIU), MAX(ZONA_COD), MAX(D.ARTI_COD), SUM(CTDE_CANT * CTDE_FACTOR),
            SUM(COTI_FACTOR*(CTDE_TOTAL-CTDE_IVAMONTO-CTDE_CONSUMO)), SUM(COTI_FACTOR*CTDE_IVAMONTO), SUM(COTI_FACTOR*CTDE_TOTAL),
            MAX(ARTI_DES), MAX(ARTI_UNIDAD), MAX(GRUP_COD), MAX(SUBG_COD), MAX(MARC_COD), max(ct.coti_sucursal)
            FROM COTIZACIONES_DETALLE D, COTIZACIONES CT, PREFIJOS P, terceros T, CLIENTES C, ARTICULO A
            WHERE C.TERC_NIT = T.TERC_NIT AND TERC_CLIE = 'S' AND C.terc_nit = T.terc_nit AND T.TERC_NIT >= :TERINI AND T.TERC_NIT <= :TERFIN AND
            CT.COTI_ID = D.COTI_ID AND COTI_FECHA >= :FECINI AND COTI_FECHA <= :FECFIN AND COTI_ANULADO = 'N'
            AND P.PREF_PRE = CT.PREF_PRE AND P.TIDO_COD = 35 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            GROUP BY T.TERC_NIT, ct.coti_sucursal, D.ARTI_COD
            INTO :NIT, :NOMBRE, :TELEFONO, :CIUDAD, :CODZONA, :ARTICULO, :CANTIDAD, :BASE, :IVA, :TOTAL,
                :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC, :sucursal
            DO
            BEGIN
            COSTO = 0;
            FOR SELECT CTDE_CANT * CTDE_FACTOR, COTI_FECHA
                FROM COTIZACIONES_DETALLE D, COTIZACIONES C, PREFIJOS P
                WHERE C.terc_nit = :nit AND C.COTI_ID = D.coti_id AND COTI_FECHA >= :FECINI AND COTI_FECHA <= :FECFIN AND COTI_ANULADO = 'N'
                AND P.PREF_PRE = C.PREF_PRE AND P.TIDO_COD = 35 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
                AND D.ARTI_COD = :articulo INTO :cantdet, :fecha
                DO
                BEGIN
                EXECUTE PROCEDURE COSTO_PROMEDIO(:ARTICULO, :FECHA) returning_values (:costounit);
                /* EL FACTOR */
                FACCOST = 1;
                SELECT FIRST 1 FACO_FACTOR FROM factor_costo WHERE FACO_FECINI <= :FECHA AND FACO_FECFIN >= :FECHA INTO :FACCOST;
                COSTOUNIT = COSTOUNIT * FACCOST;

                COSTO = COSTO + costounit * cantdet;
                END
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            EXECUTE PROCEDURE costo_promedio (:ARTICULO, :FECFIN) RETURNING_VALUES (:COSTOUNIT);
            if (CANTIDAD IS NULL) then
                CANTIDAD = 0;
            if (BASE IS NULL) then
                BASE = 0;
            if (IVA IS NULL) then
                IVA = 0;
            UTILIDAD = BASE - COSTO;
            if (UOM = 'UTILIDAD') then
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
            else
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
            if (CEROS = 'S') then
                INSERT INTO REPORTES_AUX (REPA_ID, REPA_USER, REPA_ARTICULO) VALUES (3, USER, :ARTICULO);
            SUSPEND;
            END /* FOR */
        if (CEROS = 'S') then
            BEGIN
            COSTO = 0;
            UTILIDAD = 0;
            PORC = 0;
            /* agregue los articulos sin factura */
            FOR SELECT ARTI_COD, 0, 0, 0, ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                FROM ARTICULO A WHERE A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN
                INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
                DO
                BEGIN
                SELECT COUNT(REPA_ARTICULO) FROM REPORTES_AUX WHERE REPA_ID = 3 AND REPA_USER = USER AND REPA_ARTICULO = :articulo INTO :numrows;
                if (numrows = 0) then
                    BEGIN
                    SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                    SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                    SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                    SUSPEND;
                    END
                END
            END
        END
    END
ELSE
    BEGIN
    if (BIN_AND(TIPO, 1) <> 0) then
            BEGIN
            SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 31 INTO :NOMTIPO;
            FOR SELECT F.PREF_PRE, FACT_NUMERO, FACT_FECHA, ARTI_COD, FADE_CANT * FADE_FACTOR, (FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO)*FACT_FACTOR,
                FADE_IVAMONTO*FACT_FACTOR, FADE_DTOPORC, FADE_TOTAL*FACT_FACTOR, F.terc_nit, F.fact_nomcliente, f.fact_sucursal
                FROM FACTURAS F, FACTURAS_DETALLE D, PREFIJOS P
                WHERE F.FACT_ID = D.FACT_ID AND FACT_FECHA >= :FECINI AND FACT_FECHA <= :FECFIN AND F.TERC_NIT >= :TERINI AND F.TERC_NIT <= :TERFIN AND FACT_ANULADO = 'N'
                 AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 31 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) and substring(D.arti_cod from 1 FOR 2) <> '.t'
                ORDER BY f.terc_nit, f.fact_sucursal, ARTI_COD, FACT_FECHA, F.FACT_ID, FADE_ITEM
                INTO :PREFIJO, :NUMERO, :FECHA, :ARTICULO, :CANTIDAD, :BASE, :IVA, :DTO, :TOTAL, :NIT, :nombre, :sucursal
                DO
                BEGIN
                SELECT ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                    FROM ARTICULO WHERE ARTI_COD = :ARTICULO
                    INTO :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC;
                SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                EXECUTE PROCEDURE costo_promedio (:ARTICULO, :FECHA) RETURNING_VALUES (:COSTOUNIT);
                /* EL FACTOR */
                FACCOST = 1;
                SELECT FIRST 1 FACO_FACTOR FROM factor_costo WHERE FACO_FECINI <= :FECHA AND FACO_FECFIN >= :FECHA INTO :FACCOST;
                COSTOUNIT = COSTOUNIT * FACCOST;

                COSTO = COSTOUNIT * CANTIDAD;
                UTILIDAD = BASE - COSTO;
                if (UOM = 'UTILIDAD') then
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
                else
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
                SUSPEND;
                END
            END
    if (BIN_AND(TIPO, 2) <> 0) then
            BEGIN
            SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 32 INTO :NOMTIPO;
            FOR SELECT R.PREF_PRE, REVT_NUMERO, REVT_FECHA, ARTI_COD, RVDE_CANT * RVDE_FACTOR,
                (RVDE_TOTAL - RVDE_IVAMONTO), RVDE_IVAMONTO, RVDE_DTOPORC, RVDE_TOTAL, R.terc_nit, R.revt_nomterc, r.revt_sucursal
                FROM REMISIONES_VENTA R, REMISIONES_VENTA_DETALLE D, PREFIJOS P
                WHERE R.REVT_ID = D.REVT_ID AND REVT_FECHA >= :FECINI AND REVT_FECHA <= :FECFIN AND R.TERC_NIT >= :TERINI AND R.TERC_NIT <= :TERFIN AND REVT_ANULADO = 'N'
                 AND P.PREF_PRE = R.PREF_PRE AND P.TIDO_COD = 32 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
                ORDER BY r.terc_nit, r.revt_sucursal, ARTI_COD, REVT_FECHA, R.REVT_ID, RVDE_ITEM
                INTO :PREFIJO, :NUMERO, :FECHA, :ARTICULO, :CANTIDAD, :BASE, :IVA, :DTO, :TOTAL, :NIT, :nombre, :sucursal
                DO
                BEGIN
                SELECT ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                    FROM ARTICULO WHERE ARTI_COD = :ARTICULO
                    INTO :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC;
                SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                EXECUTE PROCEDURE costo_promedio (:ARTICULO, :FECHA) RETURNING_VALUES (:COSTOUNIT);
                /* EL FACTOR */
                FACCOST = 1;
                SELECT FIRST 1 FACO_FACTOR FROM factor_costo WHERE FACO_FECINI <= :FECHA AND FACO_FECFIN >= :FECHA INTO :FACCOST;
                COSTOUNIT = COSTOUNIT * FACCOST;

                COSTO = COSTOUNIT * CANTIDAD;
                UTILIDAD = BASE - COSTO;
                if (UOM = 'UTILIDAD') then
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
                else
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
                SUSPEND;
                END
            END
    if (BIN_AND(TIPO, 4) <> 0) then
            BEGIN
            SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 33 INTO :NOMTIPO;
            FOR SELECT V.PREF_PRE, DEVT_NUMERO, DEVT_FECHA, ARTI_COD, DVDE_CANT * DVDE_FACTOR, (DVDE_TOTAL-DVDE_IVAMONTO-DVDE_CONSUMO)*DEVT_FACTOR,
                DVDE_IVAMONTO*DEVT_FACTOR, DVDE_DTOPORC, DVDE_TOTAL*DEVT_FACTOR, V.terc_nit, V.devt_nomterc, v.devt_sucursal
                FROM DEVOLUCIONES_VENTAS V, DEVOLUCIONES_VENTAS_DETALLE D, PREFIJOS P
                WHERE V.DEVT_ID = D.DEVT_ID AND DEVT_FECHA >= :FECINI AND DEVT_FECHA <= :FECFIN AND V.TERC_NIT >= :TERINI AND V.TERC_NIT <= :TERFIN AND DEVT_ANULADO = 'N'
                 AND P.PREF_PRE = V.PREF_PRE AND P.TIDO_COD = 33 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))  and substring(D.arti_cod from 1 FOR 2) <> '.t'
                ORDER BY v.terc_nit, v.devt_sucursal, ARTI_COD, DEVT_FECHA, D.DEVT_ID, DVDE_ITEM
                INTO :PREFIJO, :NUMERO, :FECHA, :ARTICULO, :CANTIDAD, :BASE, :IVA, :DTO, :TOTAL, :NIT, :nombre, :sucursal
                DO
                BEGIN
                SELECT ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                    FROM ARTICULO WHERE ARTI_COD = :ARTICULO
                    INTO :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC;
                SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                EXECUTE PROCEDURE costo_promedio (:ARTICULO, :FECHA) RETURNING_VALUES (:COSTOUNIT);
                /* EL FACTOR */
                FACCOST = 1;
                SELECT FIRST 1 FACO_FACTOR FROM factor_costo WHERE FACO_FECINI <= :FECHA AND FACO_FECFIN >= :FECHA INTO :FACCOST;
                COSTOUNIT = COSTOUNIT * FACCOST;

                COSTO = COSTOUNIT * CANTIDAD;
                UTILIDAD = BASE - COSTO;
                if (UOM = 'UTILIDAD') then
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
                else
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
                TOTAL = TOTAL * -1;
                IVA = IVA * -1;
                BASE = BASE * -1;
                CANTIDAD = CANTIDAD * -1;
                COSTO = COSTO * -1;
                UTILIDAD = UTILIDAD * -1;
                SUSPEND;
                END
            END
    if (BIN_AND(TIPO, 8) <> 0) then
            BEGIN
            SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 34 INTO :NOMTIPO;
            FOR SELECT P.PREF_PRE, PEDI_NUMERO, PEDI_FECHA, ARTI_COD, PEDE_CANT * PEDE_FACTOR, (PEDE_TOTAL-PEDE_IVAMONTO-PEDE_CONSUMO)*PEDI_FACTOR,
                PEDE_IVAMONTO*PEDI_FACTOR, PEDE_DTOPORC, PEDE_TOTAL*PEDI_FACTOR, P.terc_nit, P.pedi_nomterc, p.pedi_sucursal
                FROM PEDIDOS P, PEDIDOS_DETALLE D, PREFIJOS PR
                WHERE P.PEDI_ID = D.PEDI_ID AND PEDI_FECHA >= :FECINI AND PEDI_FECHA <= :FECFIN AND P.TERC_NIT >= :TERINI AND P.TERC_NIT <= :TERFIN AND PEDI_ANULADO = 'N'
                 AND P.PREF_PRE = PR.PREF_PRE AND P.TIDO_COD = 34 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
                ORDER BY p.terc_nit, p.pedi_sucursal, ARTI_COD, PEDI_FECHA, P.PEDI_ID, PEDE_ITEM
                INTO :PREFIJO, :NUMERO, :FECHA, :ARTICULO, :CANTIDAD, :BASE, :IVA, :DTO, :TOTAL, :NIT, :nombre, :sucursal
                DO
                BEGIN
                SELECT ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                    FROM ARTICULO WHERE ARTI_COD = :ARTICULO
                    INTO :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC;
                SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                EXECUTE PROCEDURE costo_promedio (:ARTICULO, :FECHA) RETURNING_VALUES (:COSTOUNIT);
                /* EL FACTOR */
                FACCOST = 1;
                SELECT FIRST 1 FACO_FACTOR FROM factor_costo WHERE FACO_FECINI <= :FECHA AND FACO_FECFIN >= :FECHA INTO :FACCOST;
                COSTOUNIT = COSTOUNIT * FACCOST;

                COSTO = COSTOUNIT * CANTIDAD;
                UTILIDAD = BASE - COSTO;
                if (UOM = 'UTILIDAD') then
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
                else
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
                SUSPEND;
                END
            END
    if (BIN_AND(TIPO, 16) <> 0) then
            BEGIN
            SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 35 INTO :NOMTIPO;
            FOR SELECT C.PREF_PRE, COTI_NUMERO, COTI_FECHA, ARTI_COD, CTDE_CANT * CTDE_FACTOR, (CTDE_TOTAL-CTDE_IVAMONTO-CTDE_CONSUMO)*COTI_FACTOR,
                CTDE_IVAMONTO*COTI_FACTOR, CTDE_DTOPORC, CTDE_TOTAL*COTI_FACTOR, C.terc_nit, C.coti_nomterc, c.coti_sucursal
                FROM COTIZACIONES C, COTIZACIONES_DETALLE D, PREFIJOS P
                WHERE C.COTI_ID = D.COTI_ID AND ARTI_COD = :ARTICULO AND COTI_FECHA >= :FECINI AND COTI_FECHA <= :FECFIN AND C.TERC_NIT >= :TERINI AND C.TERC_NIT <= :TERFIN AND COTI_ANULADO = 'N'
                 AND P.PREF_PRE = C.PREF_PRE AND P.TIDO_COD = 35 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
                ORDER BY c.terc_nit, c.coti_sucursal, COTI_FECHA, C.COTI_ID, CTDE_ITEM
                INTO :PREFIJO, :NUMERO, :FECHA, :ARTICULO, :CANTIDAD, :BASE, :IVA, :DTO, :TOTAL, :NIT, :nombre, :sucursal
                DO
                BEGIN
                SELECT ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                    FROM ARTICULO WHERE ARTI_COD = :ARTICULO
                    INTO :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC;
                SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                EXECUTE PROCEDURE costo_promedio (:ARTICULO, :FECHA) RETURNING_VALUES (:COSTOUNIT);
                /* EL FACTOR */
                FACCOST = 1;
                SELECT FIRST 1 FACO_FACTOR FROM factor_costo WHERE FACO_FECINI <= :FECHA AND FACO_FECFIN >= :FECHA INTO :FACCOST;
                COSTOUNIT = COSTOUNIT * FACCOST;

                COSTO = COSTOUNIT * CANTIDAD;
                UTILIDAD = BASE - COSTO;
                if (UOM = 'UTILIDAD') then
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
                else
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') returning_values (PORC);
                SUSPEND;
                END
            END
    END
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER procedure UTILIDAD_VENTAS (
    TIPO integer,
    DETALLE char(1),
    FECINI date,
    FECFIN date,
    PREFIJO varchar(4),
    ULTIMO char(1),
    SUBEMPRESA integer)
returns (
    PREF varchar(4),
    NUMERO varchar(6),
    FECHA date,
    PTVTID integer,
    VENDCOD integer,
    NIT varchar(20),
    NOMTERCERO varchar(60),
    ARTICULO varchar(15),
    ARTIDES varchar(60),
    CANT numeric(18,4),
    UNIDAD varchar(8),
    PRECIO numeric(18,2),
    IVAPOR numeric(9,2),
    COSTO numeric(18,2),
    UTILIDAD numeric(18,2),
    PORC numeric(9,2))
AS
declare variable IMPTOS CHAR(1);
declare variable ID INTEGER;
declare variable COSTOT NUMERIC(18,2);
declare variable ULTCOS NUMERIC(18,2);
declare variable PRECIOT NUMERIC(18,2);
declare variable UOM VARCHAR(20);
declare variable icoinc char(2);
declare variable consumo NUMERIC(18,2);
declare variable factor NUMERIC(18,4);
declare variable ITEM INTEGER;
declare variable FACCOST NUMERIC(18,4);
BEGIN
EXECUTE PROCEDURE lee_configuracion ('FACTURACION', 'ARTICULOS', 'SUGERIR PRECIOS CON PORCENTAJE DE MARGEN O UTILIDAD') returning_values (:UOM);
EXECUTE PROCEDURE lee_configuracion ('FACTURACION', 'ARTICULOS', 'IMPOCONSUMO INCLUIDO EN EL PRECIO BASE DE VENTA ANTES DE IVA') returning_values (:icoinc);
/* DETERMINE LA TABLA A EXAMINAR */
if (TIPO = 31) then
    BEGIN
    /* FACTURA */
    FOR SELECT FACT_ID, F.PREF_PRE, FACT_NUMERO, FACT_FECHA, PTVT_ID, VEND_COD, TERC_NIT, FACT_NOMCLIENTE, FACT_IVAINC, fact_factor
        FROM FACTURAS F, PREFIJOS P
        WHERE FACT_FECHA >= :FECINI AND FACT_FECHA <= :FECFIN AND FACT_ANULADO = 'N'
         AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = :TIPO AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
        ORDER BY FACT_FECHA, F.PREF_PRE, FACT_NUMERO
        INTO :ID, :PREF, :NUMERO, :FECHA, :PTVTID, :VENDCOD, :NIT, :NOMTERCERO, :IMPTOS, :factor
        DO
        if ((PREFIJO = '') or (PREFIJO = PREF)) then
          BEGIN
          COSTOT = 0;
          PRECIOT = 0;
          FOR SELECT FADE_ITEM, D.ARTI_COD, SUBSTR(FADE_DESC,1,60), FADE_CANT * FADE_FACTOR, FADE_UNIDAD, (FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO)*:FACTOR, FADE_IVAPORC, fade_consumo
            FROM FACTURAS_DETALLE D
            WHERE FACT_ID = :ID and substring(D.arti_cod from 1 FOR 2) <> '.t'
            INTO :ITEM, :ARTICULO, :ARTIDES, :CANT, :UNIDAD, :PRECIO, :ivapor, :consumo
            DO
                BEGIN
                if (EXISTS (SELECT COST_SALP / COST_SALC FROM COSTOS C, MOVIMIENTO_ARTICULO M
                    WHERE COST_IDMOV = MVAR_CONS AND MVAR_TIPODOC = 31 AND MVAR_IDREF = :ID AND COST_SALC <> 0 AND MVAR_ITEM = :ITEM)) then
                    SELECT COST_SALP / COST_SALC, COST_ULTIMO FROM COSTOS C, MOVIMIENTO_ARTICULO M
                        WHERE COST_IDMOV = MVAR_CONS AND MVAR_TIPODOC = 31 AND MVAR_IDREF = :ID AND COST_SALC <> 0 AND MVAR_ITEM = :ITEM INTO :costo, :ultcos;
                else
                    EXECUTE PROCEDURE costo_promedio_y_ultimo(:ARTICULO, :FECHA) returning_values (:COSTO, :ultcos);
                /* EL FACTOR */
                FACCOST = 1;
                SELECT FIRST 1 FACO_FACTOR FROM factor_costo WHERE FACO_FECINI <= :FECHA AND FACO_FECFIN >= :FECHA INTO :FACCOST;
                ULTCOS = ULTCOS * FACCOST;
                COSTO = COSTO * FACCOST;

                if (ULTIMO = 'S') then
                    COSTO = ultcos * CANT;
                else
                    COSTO = COSTO * CANT;
                if (DETALLE = 'S') then
                    BEGIN
                    UTILIDAD = PRECIO - COSTO;
                    if (UOM = 'UTILIDAD') then
                        EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
                    else
                        EXECUTE PROCEDURE PORCENTAJE (utilidad,  PRECIO, 'S') returning_values (PORC);
                    SUSPEND;
                    END
                ELSE
                    BEGIN
                    COSTOT = COSTOT + COSTO;
                    PRECIOT = PRECIOT + PRECIO;
                    END
                END
          if (DETALLE <> 'S') then
            BEGIN
            COSTO = COSTOT;
            PRECIO = PRECIOT;
            UTILIDAD = PRECIO - COSTO;
            if (UOM = 'UTILIDAD') then
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
            else
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  PRECIO, 'S') returning_values (PORC);
            SUSPEND;
            END
          END
    END
  if (TIPO = 32) then
    BEGIN
    /* REMISION */
    FOR SELECT REVT_ID, R.PREF_PRE, REVT_NUMERO, REVT_FECHA, PTVT_ID, VEND_COD, TERC_NIT, REVT_NOMTERC, REVT_IVAINC
        FROM REMISIONES_VENTA R, PREFIJOS P
        WHERE REVT_FECHA >= :FECINI AND REVT_FECHA <= :FECFIN AND REVT_ANULADO = 'N'
         AND P.PREF_PRE = R.PREF_PRE AND P.TIDO_COD = :TIPO AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
        ORDER BY REVT_FECHA, R.PREF_PRE, REVT_NUMERO
        INTO :ID, :PREF, :NUMERO, :FECHA, :PTVTID, :VENDCOD, :NIT, :NOMTERCERO, :IMPTOS
        DO
        if ((PREFIJO = '') or (PREFIJO = PREF)) then
          BEGIN
          COSTOT = 0;
          PRECIOT = 0;
          FOR SELECT RVDE_ITEM, D.ARTI_COD, SUBSTR(RVDE_DESC,1,60), RVDE_CANT * RVDE_FACTOR, RVDE_UNIDAD, (RVDE_TOTAL-RVDE_IVAMONTO-RVDE_CONSUMO), RVDE_IVAPORC, rvde_consumo
            FROM REMISIONES_VENTA_DETALLE D
            WHERE REVT_ID = :ID and substring(D.arti_cod from 1 FOR 2) <> '.t'
            INTO :ITEM, :ARTICULO, :ARTIDES, :CANT, :UNIDAD, :PRECIO, :ivapor, :consumo
            DO
                BEGIN
                if (EXISTS (SELECT COST_SALP / COST_SALC FROM COSTOS C, MOVIMIENTO_ARTICULO M
                    WHERE COST_IDMOV = MVAR_CONS AND MVAR_TIPODOC = 32 AND MVAR_IDREF = :ID AND COST_SALC <> 0 AND MVAR_ITEM = :ITEM)) then
                    SELECT COST_SALP / COST_SALC, COST_ULTIMO FROM COSTOS C, MOVIMIENTO_ARTICULO M
                        WHERE COST_IDMOV = MVAR_CONS AND MVAR_TIPODOC = 32 AND MVAR_IDREF = :ID AND COST_SALC <> 0 AND MVAR_ITEM = :ITEM INTO :costo, :ultcos;
                else
                    EXECUTE PROCEDURE costo_promedio_y_ultimo(:ARTICULO, :FECHA) returning_values (:COSTO, :ultcos);
                /* EL FACTOR */
                FACCOST = 1;
                SELECT FIRST 1 FACO_FACTOR FROM factor_costo WHERE FACO_FECINI <= :FECHA AND FACO_FECFIN >= :FECHA INTO :FACCOST;
                ULTCOS = ULTCOS * FACCOST;
                COSTO = COSTO * FACCOST;

                if (ULTIMO = 'S') then
                    COSTO = ultcos * CANT;
                else
                    COSTO = COSTO * CANT;
                if (DETALLE = 'S') then
                    BEGIN
                    UTILIDAD = PRECIO - COSTO;
                    if (UOM = 'UTILIDAD') then
                        EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
                    else
                        EXECUTE PROCEDURE PORCENTAJE (utilidad,  PRECIO, 'S') returning_values (PORC);
                    SUSPEND;
                    END
                ELSE
                    BEGIN
                    COSTOT = COSTOT + COSTO;
                    PRECIOT = PRECIOT + PRECIO;
                    END
                END
          if (DETALLE <> 'S') then
            BEGIN
            COSTO = COSTOT;
            PRECIO = PRECIOT;
            UTILIDAD = PRECIO - COSTO;
            if (UOM = 'UTILIDAD') then
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
            else
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  PRECIO, 'S') returning_values (PORC);
            SUSPEND;
            END
          END
    END
  if (TIPO = 33) then
    BEGIN
    /* DEVOLUCION */
    FOR SELECT DEVT_ID, D.PREF_PRE, DEVT_NUMERO, DEVT_FECHA, PTVT_ID, VEND_COD, TERC_NIT, DEVT_NOMTERC, DEVT_IVAINC, DEVT_FACTOR
        FROM DEVOLUCIONES_VENTAS D, PREFIJOS P
        WHERE DEVT_FECHA >= :FECINI AND DEVT_FECHA <= :FECFIN AND DEVT_ANULADO = 'N'
         AND P.PREF_PRE = D.PREF_PRE AND P.TIDO_COD = :TIPO AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
        ORDER BY DEVT_FECHA, D.PREF_PRE, DEVT_NUMERO
        INTO :ID, :PREF, :NUMERO, :FECHA, :PTVTID, :VENDCOD, :NIT, :NOMTERCERO, :IMPTOS, :FACTOR
        DO
        if ((PREFIJO = '') or (PREFIJO = PREF)) then
          BEGIN
          COSTOT = 0;
          PRECIOT = 0;
          FOR SELECT DVDE_ITEM, D.ARTI_COD, SUBSTR(DVDE_DESC,1,60), DVDE_CANT * DVDE_FACTOR, DVDE_UNIDAD, (DVDE_TOTAL-DVDE_IVAMONTO-DVDE_CONSUMO)*:FACTOR, DVDE_IVAPORC, dvde_consumo
            FROM DEVOLUCIONES_VENTAS_DETALLE D
            WHERE DEVT_ID = :ID and substring(D.arti_cod from 1 FOR 2) <> '.t'
            INTO :ITEM, :ARTICULO, :ARTIDES, :CANT, :UNIDAD, :PRECIO, :ivapor, :consumo
            DO
                BEGIN
                if (EXISTS (SELECT COST_ENTP / COST_ENTC FROM COSTOS C, MOVIMIENTO_ARTICULO M
                    WHERE COST_IDMOV = MVAR_CONS AND MVAR_TIPODOC = 33 AND MVAR_IDREF = :ID AND COST_ENTC <> 0 AND MVAR_ITEM = :ITEM)) then
                    SELECT COST_ENTP / COST_ENTC FROM COSTOS C, MOVIMIENTO_ARTICULO M
                        WHERE COST_IDMOV = MVAR_CONS AND MVAR_TIPODOC = 33 AND MVAR_IDREF = :ID AND COST_ENTC <> 0 AND MVAR_ITEM = :ITEM INTO :costo;
                else
                    EXECUTE PROCEDURE costo_promedio_y_ultimo(:ARTICULO, :FECHA) returning_values (:COSTO, :ultcos);
                /* EL FACTOR */
                FACCOST = 1;
                SELECT FIRST 1 FACO_FACTOR FROM factor_costo WHERE FACO_FECINI <= :FECHA AND FACO_FECFIN >= :FECHA INTO :FACCOST;
                ULTCOS = ULTCOS * FACCOST;
                COSTO = COSTO * FACCOST;

                if (ULTIMO = 'S') then
                    COSTO = ultcos * CANT;
                else
                    COSTO = COSTO * CANT;
                if (DETALLE = 'S') then
                    BEGIN
                    UTILIDAD = PRECIO - COSTO;
                    if (UOM = 'UTILIDAD') then
                        EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
                    else
                        EXECUTE PROCEDURE PORCENTAJE (utilidad,  PRECIO, 'S') returning_values (PORC);
                    SUSPEND;
                    END
                ELSE
                    BEGIN
                    COSTOT = COSTOT + COSTO;
                    PRECIOT = PRECIOT + PRECIO;
                    END
                END
        if (DETALLE <> 'S') then
            BEGIN
            COSTO = COSTOT;
            PRECIO = PRECIOT;
            UTILIDAD = PRECIO - COSTO;
            if (UOM = 'UTILIDAD') then
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
            else
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  PRECIO, 'S') returning_values (PORC);
            SUSPEND;
            END
        END
    END
  if (TIPO = 34) then
    BEGIN
    /* PEDIDO */
    FOR SELECT PEDI_ID, P.PREF_PRE, PEDI_NUMERO, PEDI_FECHA, PTVT_ID, VEND_COD, TERC_NIT, PEDI_NOMTERC, PEDI_IVAINC, PEDI_FACTOR
        FROM PEDIDOS P, PREFIJOS R
        WHERE PEDI_FECHA >= :FECINI AND PEDI_FECHA <= :FECFIN AND PEDI_ANULADO = 'N'
         AND P.PREF_PRE = R.PREF_PRE AND R.TIDO_COD = :TIPO AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
        ORDER BY PEDI_FECHA, P.PREF_PRE, PEDI_NUMERO
        INTO :ID, :PREF, :NUMERO, :FECHA, :PTVTID, :VENDCOD, :NIT, :NOMTERCERO, :IMPTOS, :FACTOR
        DO
        if ((PREFIJO = '') or (PREFIJO = PREF)) then
          BEGIN
          COSTOT = 0;
          PRECIOT = 0;
          FOR SELECT ARTI_COD, SUBSTR(PEDE_DESC,1,60), PEDE_CANT * PEDE_FACTOR, PEDE_UNIDAD, (PEDE_TOTAL-PEDE_IVAMONTO-PEDE_CONSUMO)*:FACTOR, PEDE_IVAPORC, pede_consumo
            FROM PEDIDOS_DETALLE
            WHERE PEDI_ID = :ID
            INTO :ARTICULO, :ARTIDES, :CANT, :UNIDAD, :PRECIO, :ivapor, :consumo
            DO
                BEGIN
                EXECUTE PROCEDURE costo_promedio_y_ultimo(:ARTICULO, :FECHA) returning_values (:COSTO, :ultcos);
                /* EL FACTOR */
                FACCOST = 1;
                SELECT FIRST 1 FACO_FACTOR FROM factor_costo WHERE FACO_FECINI <= :FECHA AND FACO_FECFIN >= :FECHA INTO :FACCOST;
                ULTCOS = ULTCOS * FACCOST;
                COSTO = COSTO * FACCOST;

                if (ULTIMO = 'S') then
                    COSTO = ultcos * CANT;
                else
                    COSTO = COSTO * CANT;
                if (DETALLE = 'S') then
                    BEGIN
                    UTILIDAD = PRECIO - COSTO;
                    if (UOM = 'UTILIDAD') then
                        EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
                    else
                        EXECUTE PROCEDURE PORCENTAJE (utilidad,  PRECIO, 'S') returning_values (PORC);
                    SUSPEND;
                    END
                ELSE
                    BEGIN
                    COSTOT = COSTOT + COSTO;
                    PRECIOT = PRECIOT + PRECIO;
                    END
                END
        if (DETALLE <> 'S') then
            BEGIN
            COSTO = COSTOT;
            PRECIO = PRECIOT;
            UTILIDAD = PRECIO - COSTO;
            if (UOM = 'UTILIDAD') then
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
            else
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  PRECIO, 'S') returning_values (PORC);
            SUSPEND;
            END
        END
    END
  if (TIPO = 35) then
    BEGIN
    /* COTIZACION */
    FOR SELECT COTI_ID, C.PREF_PRE, COTI_NUMERO, COTI_FECHA, PTVT_ID, VEND_COD, TERC_NIT, COTI_NOMTERC, COTI_IMPTOS, COTI_FACTOR
        FROM COTIZACIONES C, PREFIJOS P
        WHERE COTI_FECHA >= :FECINI AND COTI_FECHA <= :FECFIN AND COTI_ANULADO = 'N'
         AND P.PREF_PRE = C.PREF_PRE AND P.TIDO_COD = :TIPO AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
        ORDER BY COTI_FECHA, C.PREF_PRE, COTI_NUMERO
        INTO :ID, :PREF, :NUMERO, :FECHA, :PTVTID, :VENDCOD, :NIT, :NOMTERCERO, :IMPTOS, :FACTOR
        DO
        if ((PREFIJO = '') or (PREFIJO = PREF)) then
          BEGIN
          COSTOT = 0;
          PRECIOT = 0;
          FOR SELECT ARTI_COD, SUBSTR(CTDE_DESC,1,60), CTDE_CANT * CTDE_FACTOR, CTDE_UNIDAD, (CTDE_TOTAL-CTDE_IVAMONTO-CTDE_CONSUMO)*:FACTOR, CTDE_IVAPORC, ctde_consumo
            FROM COTIZACIONES_DETALLE
            WHERE COTI_ID = :ID
            INTO :ARTICULO, :ARTIDES, :CANT, :UNIDAD, :PRECIO, :ivapor, :consumo
            DO
                BEGIN
                EXECUTE PROCEDURE costo_promedio_y_ultimo(:ARTICULO, :FECHA) returning_values (:COSTO, :ultcos);
                /* EL FACTOR */
                FACCOST = 1;
                SELECT FIRST 1 FACO_FACTOR FROM factor_costo WHERE FACO_FECINI <= :FECHA AND FACO_FECFIN >= :FECHA INTO :FACCOST;
                ULTCOS = ULTCOS * FACCOST;
                COSTO = COSTO * FACCOST;

                if (ULTIMO = 'S') then
                    COSTO = ultcos * CANT;
                else
                    COSTO = COSTO * CANT;
                if (DETALLE = 'S') then
                    BEGIN
                    UTILIDAD = PRECIO - COSTO;
                    if (UOM = 'UTILIDAD') then
                        EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
                    else
                        EXECUTE PROCEDURE PORCENTAJE (utilidad,  PRECIO, 'S') returning_values (PORC);
                    SUSPEND;
                    END
                ELSE
                    BEGIN
                    COSTOT = COSTOT + COSTO;
                    PRECIOT = PRECIOT + PRECIO;
                    END
                END
        if (DETALLE <> 'S') then
            BEGIN
            COSTO = COSTOT;
            PRECIO = PRECIOT;
            UTILIDAD = PRECIO - COSTO;
            if (UOM = 'UTILIDAD') then
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') returning_values (PORC);
            else
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  PRECIO, 'S') returning_values (PORC);
            SUSPEND;
            END
        END
    END
END
^

SET TERM ; ^


