/* mal costo en facturas al sumar imp saludables */
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),
    ULTIMO char(1),
    SUBEMPRESA integer)
returns (
    NIT varchar(20),
    NOMBRE varchar(300),
    SUCURSAL varchar(10),
    CONTACTO varchar(255),
    TELEFONO varchar(40),
    CIUDAD varchar(40),
    CODZONA varchar(2),
    NOMZONA varchar(30),
    NOMTIPO varchar(50),
    ARTICULO varchar(15),
    DESCRIPCION varchar(300),
    CODGRUPO varchar(2),
    NOMGRUPO varchar(30),
    CODSUBG varchar(3),
    NOMSUBG varchar(30),
    CODMARC varchar(3),
    NOMMARC varchar(30),
    CODFABR varchar(3),
    NOMFABR varchar(60),
    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(8),
    FECHA date,
    DTO numeric(9,2),
    VENDCOD integer,
    VENDNOMBRE varchar(60))
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);
DECLARE VARIABLE ultcos NUMERIC(18, 2);
declare variable icoinc char(2);
declare variable icocos char(2);
declare variable icoutil char(2);
DECLARE VARIABLE CONSART NUMERIC(18, 2);
declare variable iscos char(2);
declare variable IMPBA NUMERIC(18,2);
declare variable IMPUP NUMERIC(18,2);
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);
EXECUTE PROCEDURE LEE_CONFIGURACION('FACTURACION', 'DOCUMENTOS', 'DESCONTAR IMPOCONSUMO EN BASE DE LIQUIDACION DE IVA') returning_values (ICOINC);
EXECUTE PROCEDURE lee_configuracion ('INVENTARIO', 'ARTICULOS', 'IMPOCONSUMO COMO MAYOR VALOR DEL COSTO') returning_values (:icocos);
EXECUTE PROCEDURE lee_configuracion ('FACTURACION', 'DOCUMENTOS', 'SUMAR CONSUMO EN BASE DE VENTAS Y COSTOS EN REPORTES DE UTILIDAD') returning_values (:icoutil);
EXECUTE PROCEDURE lee_configuracion ('COMPRAS', 'DOCUMENTOS', 'LLEVAR IMPUESTOS SALUDABLES COMO MAYOR VALOR DEL COSTO DEL INVENTARIO') returning_values (:iscos);
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(TERC_CONTACTO),
            MAX(ARTI_DES), MAX(ARTI_UNIDAD), MAX(GRUP_COD), MAX(SUBG_COD), MAX(MARC_COD), MAX(FABR_COD), MAX(f.fact_sucursal), MAX(A.arti_impba), MAX(A.arti_impup)
            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, :CONTACTO,
            :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC, :CODFABR, :sucursal, :IMPBA, :IMPUP
            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_sucursal = :sucursal 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
                EXECUTE PROCEDURE COSTO_VENTAS_ITEM(31, :id, :item, :articulo, :fecha) returning_values (:costounit, :ultcos);
                IF (ULTIMO = 'S') THEN
                    COSTOUNIT = ULTCOS;
                if (iscos = 'NO') then
                    COSTOUNIT = (COSTOUNIT * ((100 + IMPUP)/100)) + IMPBA;
                if ((ICOINC = 'SI') and (ICOCOS <> 'SI')) then
                    if (ICOUTIL = 'SI') then
                        begin
                        EXECUTE PROCEDURE CONSUMO_HISTORICO(:articulo,  :fecha) returning_values (:CONSART);
                        COSTOUNIT = COSTOUNIT + CONSART;
                        end
                COSTO = COSTO + costounit * cantdet;
                END
            NOMGRUPO = '';
            NOMSUBG = '';
            NOMMARC = '';
            NOMFABR = '';
            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;
            SELECT FABR_NOM FROM FABRICANTES WHERE FABR_COD = :CODFABR INTO NOMFABR;
            IF (CANTIDAD IS NULL) THEN
                CANTIDAD = 0;
            IF (BASE IS NULL) THEN
                BASE = 0;
            IF (IVA IS NULL) THEN
                IVA = 0;
            if (ICOINC = 'SI') then
                if (ICOUTIL = 'SI') then
                    BASE = TOTAL - IVA;
            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, FABR_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, :CODFABR
                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
                    NOMGRUPO = '';
                    NOMSUBG = '';
                    NOMMARC = '';
                    NOMFABR = '';
                    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;
                    SELECT FABR_NOM FROM FABRICANTES WHERE FABR_COD = :CODFABR INTO NOMFABR;
                    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(FABR_COD), MAX(r.revt_sucursal), MAX(TERC_CONTACTO), MAX(A.arti_impba), MAX(A.arti_impup)
            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, :CODFABR, :sucursal, :contacto, :IMPBA, :IMPUP
            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_sucursal = :sucursal 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
                    EXECUTE PROCEDURE COSTO_VENTAS_ITEM(32, :id, :item, :articulo, :fecha) returning_values (:costounit, :ultcos);
                    IF (ULTIMO = 'S') THEN
                        COSTOUNIT = ULTCOS;
                    if (iscos = 'NO') then
                        COSTOUNIT = (COSTOUNIT * ((100 + IMPUP)/100)) + IMPBA;
                    if ((ICOINC = 'SI') and (ICOCOS <> 'SI')) then
                        if (ICOUTIL = 'SI') then
                            begin
                            EXECUTE PROCEDURE CONSUMO_HISTORICO(:articulo,  :fecha) returning_values (:CONSART);
                            COSTOUNIT = COSTOUNIT + CONSART;
                            end
                    COSTO = COSTO + costounit * cantdet;
                    END
                NOMGRUPO = '';
                NOMSUBG = '';
                NOMMARC = '';
                NOMFABR = '';
                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;
                SELECT FABR_NOM FROM FABRICANTES WHERE FABR_COD = :CODFABR INTO NOMFABR;
                IF (CANTIDAD IS NULL) THEN
                    CANTIDAD = 0;
                IF (BASE IS NULL) THEN
                    BASE = 0;
                IF (IVA IS NULL) THEN
                    IVA = 0;
                if (ICOINC = 'SI') then
                    if (ICOUTIL = 'SI') then
                        BASE = TOTAL - IVA;
                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, FABR_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, :CODFABR
                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
                    NOMGRUPO = '';
                    NOMSUBG = '';
                    NOMMARC = '';
                    NOMFABR = '';
                    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;
                    SELECT FABR_NOM FROM FABRICANTES WHERE FABR_COD = :CODFABR INTO NOMFABR;
                    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(FABR_COD), MAX(v.devt_sucursal), MAX(TERC_CONTACTO), MAX(A.arti_impba), MAX(A.arti_impup)
            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, :CODFABR, :sucursal, :contacto, :IMPBA, :IMPUP
            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_sucursal = :sucursal 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
                EXECUTE PROCEDURE COSTO_VENTAS_ITEM(33, :id, :item, :articulo, :fecha) returning_values (:costounit, :ultcos);
                IF (ULTIMO = 'S') THEN
                    COSTOUNIT = ULTCOS;
                if (iscos = 'NO') then
                    COSTOUNIT = (COSTOUNIT * ((100 + IMPUP)/100)) + IMPBA;
                if ((ICOINC = 'SI') and (ICOCOS <> 'SI')) then
                    if (ICOUTIL = 'SI') then
                        begin
                        EXECUTE PROCEDURE CONSUMO_HISTORICO(:articulo,  :fecha) returning_values (:CONSART);
                        COSTOUNIT = COSTOUNIT + CONSART;
                        end
                COSTO = COSTO + costounit * cantdet;
                END
            NOMGRUPO = '';
            NOMSUBG = '';
            NOMMARC = '';
            NOMFABR = '';
            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;
            SELECT FABR_NOM FROM FABRICANTES WHERE FABR_COD = :CODFABR INTO NOMFABR;
            IF (CANTIDAD IS NULL) THEN
                CANTIDAD = 0;
            IF (BASE IS NULL) THEN
                BASE = 0;
            IF (IVA IS NULL) THEN
                IVA = 0;
            if (ICOINC = 'SI') then
                if (ICOUTIL = 'SI') then
                    BASE = TOTAL - IVA;
            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, FABR_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, :CODFABR
                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
                    NOMGRUPO = '';
                    NOMSUBG = '';
                    NOMMARC = '';
                    NOMFABR = '';
                    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;
                    SELECT FABR_NOM FROM FABRICANTES WHERE FABR_COD = :CODFABR INTO NOMFABR;
                    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(FABR_COD), MAX(p.pedi_sucursal), MAX(TERC_CONTACTO), MAX(A.arti_impba), MAX(A.arti_impup)
            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, :CODFABR, :sucursal, :contacto, :IMPBA, :IMPUP
            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_sucursal = :sucursal 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_y_ultimo(:ARTICULO, :FECHA) RETURNING_VALUES (:costounit, :ultcos);
                IF (ULTIMO = 'S') THEN
                    COSTOUNIT = ultcos;
                if (iscos = 'NO') then
                    COSTOUNIT = (COSTOUNIT * ((100 + IMPUP)/100)) + IMPBA;
                if ((ICOINC = 'SI') and (ICOCOS <> 'SI')) then
                    if (ICOUTIL = 'SI') then
                        begin
                        EXECUTE PROCEDURE CONSUMO_HISTORICO(:articulo,  :fecha) returning_values (:CONSART);
                        COSTOUNIT = COSTOUNIT + CONSART;
                        end
                /* 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
            NOMGRUPO = '';
            NOMSUBG = '';
            NOMMARC = '';
            NOMFABR = '';
            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;
            SELECT FABR_NOM FROM FABRICANTES WHERE FABR_COD = :CODFABR INTO NOMFABR;
            IF (CANTIDAD IS NULL) THEN
                CANTIDAD = 0;
            IF (BASE IS NULL) THEN
                BASE = 0;
            IF (IVA IS NULL) THEN
                IVA = 0;
            if (ICOINC = 'SI') then
                if (ICOUTIL = 'SI') then
                    BASE = TOTAL - IVA;
            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, FABR_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, :CODFABR
                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
                    NOMGRUPO = '';
                    NOMSUBG = '';
                    NOMMARC = '';
                    NOMFABR = '';
                    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;
                    SELECT FABR_NOM FROM FABRICANTES WHERE FABR_COD = :CODFABR INTO NOMFABR;
                    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(FABR_COD), MAX(ct.coti_sucursal), MAX(TERC_CONTACTO), MAX(A.arti_impba), MAX(A.arti_impup)
            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, :CODFABR, :sucursal, :contacto, :IMPBA, :IMPUP
            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_sucursal = :sucursal 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_y_ultimo(:ARTICULO, :FECHA) RETURNING_VALUES (:costounit, :ultcos);
                IF (ULTIMO = 'S') THEN
                    COSTOUNIT = ultcos;
                if (iscos = 'NO') then
                    COSTOUNIT = (COSTOUNIT * ((100 + IMPUP)/100)) + IMPBA;
                if ((ICOINC = 'SI') and (ICOCOS <> 'SI')) then
                    if (ICOUTIL = 'SI') then
                        begin
                        EXECUTE PROCEDURE CONSUMO_HISTORICO(:articulo,  :fecha) returning_values (:CONSART);
                        COSTOUNIT = COSTOUNIT + CONSART;
                        end
                /* 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
            NOMGRUPO = '';
            NOMSUBG = '';
            NOMMARC = '';
            NOMFABR = '';
            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;
            SELECT FABR_NOM FROM FABRICANTES WHERE FABR_COD = :CODFABR INTO NOMFABR;
            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;
            if (ICOINC = 'SI') then
                if (ICOUTIL = 'SI') then
                    BASE = TOTAL - IVA;
            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, FABR_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, :CODFABR
                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
                    NOMGRUPO = '';
                    NOMSUBG = '';
                    NOMMARC = '';
                    NOMFABR = '';
                    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;
                    SELECT FABR_NOM FROM FABRICANTES WHERE FABR_COD = :CODFABR INTO NOMFABR;
                    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 MAX(F.FACT_ID), MIN(D.FADE_ITEM), MAX(F.PREF_PRE), MAX(FACT_NUMERO), MAX(FACT_FECHA), MAX(ARTI_COD), SUM(FADE_CANT * FADE_FACTOR), SUM((FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO)*FACT_FACTOR),
                SUM(FADE_IVAMONTO*FACT_FACTOR), MAX(FADE_DTOPORC), SUM(FADE_TOTAL*FACT_FACTOR), MAX(F.terc_nit), MAX(F.fact_nomcliente), MAX(f.fact_sucursal),
                MAX(F.vend_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 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'
                 AND D.ARTI_COD >= :CODINI AND D.ARTI_COD <= :CODFIN AND D.fade_desc >= :DESINI AND D.fade_desc <= :DESFIN
                GROUP BY f.terc_nit, f.fact_sucursal, ARTI_COD, FACT_FECHA, F.FACT_ID
                INTO :ID, :ITEM, :PREFIJO, :NUMERO, :FECHA, :ARTICULO, :CANTIDAD, :BASE, :IVA, :DTO, :TOTAL, :NIT, :nombre, :sucursal, :vendcod
                DO
                BEGIN
                SELECT ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD, FABR_COD, arti_impba, arti_impup
                    FROM ARTICULO WHERE ARTI_COD = :ARTICULO
                    INTO :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC, :CODFABR, :IMPBA, :IMPUP;
                NOMGRUPO = '';
                NOMSUBG = '';
                NOMMARC = '';
                NOMFABR = '';
                VENDNOMBRE = '';
                if (:vendcod IS NOT NULL) then
                    SELECT VEND_NOMBRE FROM VENDEDORES WHERE VEND_COD = :vendcod INTO :vendnombre;
                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;
                SELECT FABR_NOM FROM FABRICANTES WHERE FABR_COD = :CODFABR INTO NOMFABR;
                SELECT TERC_CONTACTO, TERC_TEL, TERC_CIU, C.ZONA_COD, ZONA_NOM
                    FROM terceros T, CLIENTES C, ZONAS Z WHERE T.TERC_NIT = :NIT AND T.terc_nit = C.terc_nit AND C.zona_cod = Z.zona_cod
                    INTO :contacto, :telefono, :ciudad, :codzona, :nomzona;
                EXECUTE PROCEDURE COSTO_VENTAS_ITEM(31, :id, :item, :articulo, :fecha) returning_values (:costounit, :ultcos);
                IF (ULTIMO = 'S') THEN
                    COSTOUNIT = ultcos;
                if ((ICOINC = 'SI') and (ICOCOS <> 'SI')) then
                    if (ICOUTIL = 'SI') then
                        begin
                        EXECUTE PROCEDURE CONSUMO_HISTORICO(:articulo,  :fecha) returning_values (:CONSART);
                        COSTOUNIT = COSTOUNIT + CONSART;
                        end
                if (iscos = 'NO') then
                    COSTOUNIT = (COSTOUNIT * ((100 + IMPUP)/100)) + IMPBA;
                COSTO = COSTOUNIT * CANTIDAD;
                if (ICOINC = 'SI') then
                    if (ICOUTIL = 'SI') then
                        BASE = TOTAL - IVA;
                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.revt_id, D.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, R.terc_nit, R.revt_nomterc, r.revt_sucursal, R.vend_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 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))
                 AND D.ARTI_COD >= :CODINI AND D.ARTI_COD <= :CODFIN AND D.rvde_desc >= :DESINI AND D.rvde_desc <= :DESFIN
                ORDER BY r.terc_nit, r.revt_sucursal, ARTI_COD, REVT_FECHA, R.REVT_ID, RVDE_ITEM
                INTO :ID, :ITEM, :PREFIJO, :NUMERO, :FECHA, :ARTICULO, :CANTIDAD, :BASE, :IVA, :DTO, :TOTAL, :NIT, :nombre, :sucursal, :vendcod
                DO
                BEGIN
                SELECT ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD, FABR_COD, arti_impba, arti_impup
                    FROM ARTICULO WHERE ARTI_COD = :ARTICULO
                    INTO :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC, :CODFABR, :IMPBA, :IMPUP;
                NOMGRUPO = '';
                NOMSUBG = '';
                NOMMARC = '';
                NOMFABR = '';
                VENDNOMBRE = '';
                if (:vendcod IS NOT NULL) then
                SELECT VEND_NOMBRE from vendedores WHERE VEND_COD = :vendcod INTO :vendnombre;
                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;
                SELECT FABR_NOM FROM FABRICANTES WHERE FABR_COD = :CODFABR INTO NOMFABR;
                SELECT TERC_CONTACTO, TERC_TEL, TERC_CIU, C.ZONA_COD, ZONA_NOM
                    FROM terceros T, CLIENTES C, ZONAS Z WHERE T.TERC_NIT = :NIT AND T.terc_nit = C.terc_nit AND C.zona_cod = Z.zona_cod
                    INTO :contacto, :telefono, :ciudad, :codzona, :nomzona;
                EXECUTE PROCEDURE COSTO_VENTAS_ITEM(32, :id, :item, :articulo, :fecha) returning_values (:costounit, :ultcos);
                IF (ULTIMO = 'S') THEN
                    COSTOUNIT = ultcos;
                if (iscos = 'NO') then
                    COSTOUNIT = (COSTOUNIT * ((100 + IMPUP)/100)) + IMPBA;
                if ((ICOINC = 'SI') and (ICOCOS <> 'SI')) then
                    if (ICOUTIL = 'SI') then
                        begin
                        EXECUTE PROCEDURE CONSUMO_HISTORICO(:articulo,  :fecha) returning_values (:CONSART);
                        COSTOUNIT = COSTOUNIT + CONSART;
                        end
                COSTO = COSTOUNIT * CANTIDAD;
                if (ICOINC = 'SI') then
                    if (ICOUTIL = 'SI') then
                        BASE = TOTAL - IVA;
                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.devt_id, D.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, V.terc_nit, V.devt_nomterc, v.devt_sucursal, V.vend_cod
                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'
                 AND D.ARTI_COD >= :CODINI AND D.ARTI_COD <= :CODFIN AND D.dvde_desc >= :DESINI AND D.dvde_desc <= :DESFIN
                ORDER BY v.terc_nit, v.devt_sucursal, ARTI_COD, DEVT_FECHA, D.DEVT_ID, DVDE_ITEM
                INTO :ID, :ITEM, :PREFIJO, :NUMERO, :FECHA, :ARTICULO, :CANTIDAD, :BASE, :IVA, :DTO, :TOTAL, :NIT, :nombre, :sucursal, :vendcod
                DO
                BEGIN
                SELECT ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD, FABR_COD, arti_impba, arti_impup
                    FROM ARTICULO WHERE ARTI_COD = :ARTICULO
                    INTO :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC, :CODFABR, :IMPBA, :IMPUP;
                NOMGRUPO = '';
                NOMSUBG = '';
                NOMMARC = '';
                NOMFABR = '';
                VENDNOMBRE = '';
                if (:vendcod IS NOT NULL) then
                    SELECT VEND_NOMBRE FROM VENDEDORES WHERE VEND_COD = :vendcod INTO :vendnombre;
                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;
                SELECT FABR_NOM FROM FABRICANTES WHERE FABR_COD = :CODFABR INTO NOMFABR;
                SELECT TERC_CONTACTO, TERC_TEL, TERC_CIU, C.ZONA_COD, ZONA_NOM
                    FROM terceros T, CLIENTES C, ZONAS Z WHERE T.TERC_NIT = :NIT AND T.terc_nit = C.terc_nit AND C.zona_cod = Z.zona_cod
                    INTO :contacto, :telefono, :ciudad, :codzona, :nomzona;
                EXECUTE PROCEDURE COSTO_VENTAS_ITEM(33, :id, :item, :articulo, :fecha) returning_values (:costounit, :ultcos);
                IF (ULTIMO = 'S') THEN
                    COSTOUNIT = ultcos;
                if (iscos = 'NO') then
                    COSTOUNIT = (COSTOUNIT * ((100 + IMPUP)/100)) + IMPBA;
                if ((ICOINC = 'SI') and (ICOCOS <> 'SI')) then
                    if (ICOUTIL = 'SI') then
                        begin
                        EXECUTE PROCEDURE CONSUMO_HISTORICO(:articulo,  :fecha) returning_values (:CONSART);
                        COSTOUNIT = COSTOUNIT + CONSART;
                        end
                COSTO = COSTOUNIT * CANTIDAD;
                if (ICOINC = 'SI') then
                    if (ICOUTIL = 'SI') then
                        BASE = TOTAL - IVA;
                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, P.vend_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 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))
                 AND D.ARTI_COD >= :CODINI AND D.ARTI_COD <= :CODFIN AND D.pede_desc >= :DESINI AND D.pede_desc <= :DESFIN
                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, :vendcod
                DO
                BEGIN
                SELECT ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD, FABR_COD, arti_impba, arti_impup
                    FROM ARTICULO WHERE ARTI_COD = :ARTICULO
                    INTO :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC, :CODFABR, :IMPBA, :IMPUP;
                NOMGRUPO = '';
                NOMSUBG = '';
                NOMMARC = '';
                NOMFABR = '';
                VENDNOMBRE = '';
                if (:vendcod IS NOT NULL) then
                    SELECT VEND_NOMBRE FROM VENDEDORES WHERE VEND_COD = :vendcod INTO :vendnombre;
                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;
                SELECT FABR_NOM FROM FABRICANTES WHERE FABR_COD = :CODFABR INTO NOMFABR;
                SELECT TERC_CONTACTO, TERC_TEL, TERC_CIU, C.ZONA_COD, ZONA_NOM
                    FROM terceros T, CLIENTES C, ZONAS Z WHERE T.TERC_NIT = :NIT AND T.terc_nit = C.terc_nit AND C.zona_cod = Z.zona_cod
                    INTO :contacto, :telefono, :ciudad, :codzona, :nomzona;
                EXECUTE PROCEDURE costo_promedio_y_ultimo(:ARTICULO, :FECHA) RETURNING_VALUES (:costounit, :ultcos);
                IF (ULTIMO = 'S') THEN
                    COSTOUNIT = ultcos;
                if (iscos = 'NO') then
                    COSTOUNIT = (COSTOUNIT * ((100 + IMPUP)/100)) + IMPBA;
                if ((ICOINC = 'SI') and (ICOCOS <> 'SI')) then
                    if (ICOUTIL = 'SI') then
                        begin
                        EXECUTE PROCEDURE CONSUMO_HISTORICO(:articulo,  :fecha) returning_values (:CONSART);
                        COSTOUNIT = COSTOUNIT + CONSART;
                        end
                /* 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;
                if (ICOINC = 'SI') then
                    if (ICOUTIL = 'SI') then
                        BASE = TOTAL - IVA;
                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, C.vend_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 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))
                 AND D.ARTI_COD >= :CODINI AND D.ARTI_COD <= :CODFIN AND D.ctde_desc >= :DESINI AND D.ctde_desc <= :DESFIN
                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, :vendcod
                DO
                BEGIN
                SELECT ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD, FABR_COD, arti_impba, arti_impup
                    FROM ARTICULO WHERE ARTI_COD = :ARTICULO
                    INTO :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC, :CODFABR, :IMPBA, :IMPUP;
                NOMGRUPO = '';
                NOMSUBG = '';
                NOMMARC = '';
                NOMFABR = '';
                VENDNOMBRE = '';
                if (:vendcod IS NOT NULL) then
                    SELECT VEND_NOMBRE FROM VENDEDORES WHERE VEND_COD = :vendcod INTO :vendnombre;
                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;
                SELECT FABR_NOM FROM FABRICANTES WHERE FABR_COD = :CODFABR INTO NOMFABR;
                SELECT TERC_CONTACTO, TERC_TEL, TERC_CIU, C.ZONA_COD, ZONA_NOM
                    FROM terceros T, CLIENTES C, ZONAS Z WHERE T.TERC_NIT = :NIT AND T.terc_nit = C.terc_nit AND C.zona_cod = Z.zona_cod
                    INTO :contacto, :telefono, :ciudad, :codzona, :nomzona;
                EXECUTE PROCEDURE costo_promedio_y_ultimo(:ARTICULO, :FECHA) RETURNING_VALUES (:costounit, :ultcos);
                IF (ULTIMO = 'S') THEN
                    COSTOUNIT = ultcos;
                if (iscos = 'NO') then
                    COSTOUNIT = (COSTOUNIT * ((100 + IMPUP)/100)) + IMPBA;
                if ((ICOINC = 'SI') and (ICOCOS <> 'SI')) then
                    if (ICOUTIL = 'SI') then
                        begin
                        EXECUTE PROCEDURE CONSUMO_HISTORICO(:articulo,  :fecha) returning_values (:CONSART);
                        COSTOUNIT = COSTOUNIT + CONSART;
                        end
                /* 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;
                if (ICOINC = 'SI') then
                    if (ICOUTIL = 'SI') then
                        BASE = TOTAL - IVA;
                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 ; ^



