CREATE TABLE CLIENTE_ARTICULOS (
    TERC_NIT T_NIT NOT NULL,
    ARTI_COD T_COD_ARTICULO NOT NULL,
    CLAR_CODIGO T_COD_ARTICULO);

ALTER TABLE CLIENTE_ARTICULOS
ADD CONSTRAINT PK_CLIENTE_ARTICULOS
PRIMARY KEY (TERC_NIT,ARTI_COD);

grant select, delete, insert, update on CLIENTE_ARTICULOS to PUBLIC;


SET TERM ^ ;

CREATE OR ALTER procedure CONTABIL_FACTURA_NIIF (
    IDDOC integer,
    IDINTER integer,
    IDC integer)
returns (
    ERROR integer,
    VER char(1))
as
declare variable pref varchar(4);
declare variable num varchar(8);
declare variable numero varchar(12);
declare variable fecaux date;
declare variable conc varchar(60);
declare variable venceaux date;
declare variable vence char(8);
declare variable vrdto numeric(18,2);
declare variable vradic numeric(18,2);
declare variable vrsubt numeric(18,2);
declare variable vriva numeric(18,2);
declare variable prtfte numeric(9,2);
declare variable vrrtfte numeric(18,2);
declare variable vrrtiva numeric(18,2);
declare variable prtica numeric(9,2);
declare variable vrrtica numeric(18,2);
declare variable prcree numeric(9,2);
declare variable vrrcree numeric(18,2);
declare variable vrtotal numeric(18,2);
declare variable vrextra numeric(18,2);
declare variable ventas char(1);
declare variable ctaventas varchar(20);
declare variable iva char(1);
declare variable ctaiva varchar(20);
declare variable consumo char(1);
declare variable ctaconsumo varchar(20);
declare variable cartera char(1);
declare variable ctacartera varchar(20);
declare variable rtfte char(1);
declare variable ctartfte varchar(20);
declare variable rtiva char(1);
declare variable ctartiva varchar(20);
declare variable rtica char(1);
declare variable ctartica varchar(20);
declare variable rcree char(1);
declare variable ctarcree varchar(20);
declare variable inven char(1);
declare variable ctainven varchar(20);
declare variable costos char(1);
declare variable ctacostos varchar(20);
declare variable ctadto varchar(20);
declare variable ctaadic varchar(20);
declare variable ctaextra varchar(20);
declare variable existe char(1);
declare variable cuenta varchar(20);
declare variable monto numeric(18,2);
declare variable tipocuen char(1);
declare variable nit varchar(20);
declare variable nombre varchar(60);
declare variable proy varchar(4);
declare variable centro varchar(4);
declare variable SUBCEN varchar(4);
declare variable proyi varchar(4);
declare variable centi varchar(4);
declare variable subci varchar(4);
declare variable porc numeric(5,2);
declare variable debito numeric(18,2);
declare variable credito numeric(18,2);
declare variable nroi integer;
declare variable imptos numeric(18,2);
declare variable suma numeric(18,2);
declare variable tctaclien varchar(20);
declare variable tctaventa varchar(20);
declare variable tctartfte varchar(20);
declare variable tctartiva varchar(20);
declare variable tctartica varchar(20);
declare variable tctarcree varchar(20);
declare variable ctadic varchar(20);
declare variable baseadic varchar(20);
declare variable porcadic numeric(5,2);
declare variable valoradic numeric(18,2);
declare variable dbadic char(1);
declare variable ptovta integer;
declare variable anulado char(1);
declare variable dig integer;
declare variable mercancia numeric(18,2);
declare variable INALC numeric(18,2);
declare variable DTOXIT varchar(2);
declare variable vrconsumo numeric(18,2);
declare variable factor double precision;
declare variable cent char(1);
declare variable AUTORET VARCHAR(10);
declare variable FAUTORET DATE;
declare variable AUTORCREE VARCHAR(10);
declare variable FAUTORCREE DATE;
declare variable ERRORC INTEGER;
declare variable ICOING CHAR(2);
declare variable NITCONTA VARCHAR(20);
declare variable CNTNIT CHAR(2);
declare variable TERCEXENTO CHAR(1);
BEGIN
EXECUTE PROCEDURE LEE_CONFIGURACION('FACTURACION', 'ARTICULOS', 'IMPOCONSUMO COMO MAYOR VALOR DEL COSTO Y DEL INGRESO') returning_values (ICOING);
EXECUTE PROCEDURE LEE_CONFIGURACION('CONTABILIDAD', 'TERCEROS', 'CONTABILIZAR VENTAS Y RECIBOS DE CAJA CON TERCERO CONTABLE EN LUGAR DEL NIT') returning_values (CNTNIT);
EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'FECHA AUTORETENEDOR NO DESCONTAR RETENCIONES DEL SALDO PERO SI CONTABILIZARLAS') returning_values (AUTORET);
EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'FECHA AUTORETENEDOR DE RETENCION CREE') returning_values (AUTORCREE);
if (AUTORET <> '') then
    FAUTORET = CAST(AUTORET AS DATE);
else
    FAUTORET = '9999/12/31';
if (AUTORCREE <> '') then
    FAUTORCREE = CAST(AUTORCREE AS DATE);
else
    FAUTORCREE = '9999/12/31';
/* BUSQUE LA INTERFACE */
EXISTE = 'N';
SELECT 'S', N.INVE_VENTAS, N.INVE_IVA, N.INVE_CONSUMO, N.INVE_CARTERA, N.INVE_RTFTE, N.INVE_RTIVA, N.INVE_RTICA, N.INVE_RTCREE,
    N.INVE_COSTO, N.INVE_INVEN, N.INVE_CTAVENTAS, N.INVE_CTAIVA, N.INVE_CTACONSUMO, N.INVE_CTADTO, N.INVE_CTAADIC, N.INVE_CTAEXTRA,
    N.INVE_CTACARTERA, N.INVE_CTARTFTE, N.INVE_CTARTIVA, N.INVE_CTARTICA, N.INVE_CTARTCREE, N.INVE_CTAINVEN, N.INVE_CTACOSTOS, INVE_CONFIRMAR, INVE_CENTRO
    FROM interfaz_ventas I, interfaz_ventas_niif N
    WHERE I.inve_id = :IDINTER AND I.inve_id = N.inve_id
    INTO :EXISTE, :VENTAS, :IVA, :CONSUMO, :CARTERA, :RTFTE, :RTIVA, :RTICA, :RCREE,
    :COSTOS, :INVEN, :CTAVENTAS, :CTAIVA, :CTACONSUMO, :CTADTO, :CTAADIC, :CTAEXTRA,
    :CTACARTERA, :CTARTFTE, :CTARTIVA, :CTARTICA, :CTARCREE, :CTAINVEN, :CTACOSTOS, :VER, :CENT;
if (EXISTE = 'S') then
  BEGIN
  /* TRAIGA EL ENCABEZADO DE LA FACTURA */
  SELECT PREF_PRE, FACT_NUMERO, FACT_FECHA, F.TERC_NIT, PTVT_ID, FACT_VENCE, FACT_DTOMONTO, FACT_ADICIONAL, FACT_IVAMONTO,
    FACT_EXTRA, FACT_TOTAL, FACT_RTFTEPOR, FACT_RTFTEMONTO, FACT_RTIVAPOR, FACT_RTIVAMONTO, FACT_RTICAPOR, FACT_RTICAMONTO,
    FACT_RTCREE, FACT_RTCREEM, FACT_NOMCLIENTE, TERC_CTARTFTE, TERC_CTARTIVA, TERC_CTARTICA, TERC_CTARCREE, TERC_CTAVENTA, TERC_CTACLIENTE, FACT_ANULADO, T.terc_nitconta, terc_exento
        FROM FACTURAS F, TERCEROS T
        WHERE FACT_ID = :IDDOC AND F.TERC_NIT = T.TERC_NIT
        INTO :PREF, :NUM, :FECAUX, :NIT, :PTOVTA, :VENCEAUX, :VRDTO, :VRADIC, :VRIVA,
        :VREXTRA, :VRTOTAL, :PRTFTE, :VRRTFTE, :PORC, :VRRTIVA, :PRTICA, :VRRTICA,
        :prcree, :vrrcree, :NOMBRE, TCTARTFTE, TCTARTIVA, TCTARTICA, TCTARCREE, TCTAVENTA, TCTACLIEN, ANULADO, :nitconta, :tercexento;
  if ((CNTNIT = 'SI') AND (NITCONTA IS NOT NULL)) then
    NIT = NITCONTA;
  EXECUTE PROCEDURE FECHA_A_CONTA(:VENCEAUX) returning_values (:VENCE);
  if (ANULADO = 'N') then
    BEGIN
    /* BUSQUE EL CENTRO DEL PUNTO, LA BODEGA, O EL PREFIJO  */
    IF (CENT = 'B') THEN
        SELECT B.BODE_CENTRO, B.BODE_PROY, B.bode_subc FROM BODEGA B, FACTURAS F
            WHERE B.BODE_COD = F.BODE_COD AND F.FACT_ID = :IDDOC INTO :CENTRO, :PROY, :SUBCEN;
    IF (CENT = 'V') THEN
        SELECT S.proy_cod, Z.zona_centro, SZ.subz_subc
            FROM clientes c, sucursales s, zonas z, subzona sz, FACTURAS F
            WHERE C.TERC_NIT = F.terc_nit AND F.FACT_ID = :IDDOC AND C.sucu_id = S.sucu_id AND C.zona_id = Z.zona_id AND Z.zona_id = SZ.zona_id AND C.subz_cod = SZ.subz_cod
            INTO :PROY, :CENTRO, :SUBCEN;
    IF (CENT = 'C') THEN
        SELECT S.proy_cod, CN.cana_scau, Z.zona_centro
            FROM clientes c, sucursales s, zonas z, CANAL CN, FACTURAS F
            WHERE C.TERC_NIT = F.terc_nit AND F.FACT_ID = :IDDOC AND C.sucu_id = S.sucu_id AND C.zona_id = Z.zona_id AND C.clie_canal = CN.cana_cod
            INTO :PROY, :CENTRO, :SUBCEN;
    IF (CENT = 'P') THEN
        SELECT P.PREF_CENTRO,P.PREF_PROY, P.pref_subc  FROM PREFIJOS P, FACTURAS F
            WHERE P.PREF_PRE = F.PREF_PRE AND F.FACT_ID = :IDDOC AND P.TIDO_COD = 31 INTO :CENTRO, :PROY, :SUBCEN;
    NUMERO = PREF || NUM;
    SELECT SUM (FADE_CONSUMO) FROM FACTURAS_DETALLE WHERE FACT_ID = :IDDOC  AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
        INTO MERCANCIA;
    SELECT SUM (FADE_INALCM) FROM FACTURAS_DETALLE WHERE FACT_ID = :IDDOC  AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
        INTO INALC;
    VRSUBT = VRTOTAL - VREXTRA - VRIVA - MERCANCIA - INALC; /* BASE DE RETEFTE Y RETEICA */

    EXECUTE PROCEDURE lee_configuracion ('FACTURACION', 'FACTURAS', 'DESCUENTO PIE FACTURA IGUAL A SUMA DE DESCUENTOS POR ITEM') returning_values (:DTOXIT);
    if (DTOXIT = 'SI') then
        VRDTO = 0;
    MERCANCIA = VRSUBT - VRADIC + VRDTO;
    if (STRLEN(NOMBRE)> 41 ) then
      CONC = 'FV No.' || NUMERO || '-' || SUBSTR(NOMBRE,1,41);
    ELSE
      CONC = 'FV No.' || NUMERO || '-' || NOMBRE;
    NROI = 100000;
    SUMA = 0;
    ERROR = 0;
    DELETE FROM CONTABILIZACION_DET WHERE CNTB_ID = :IDC AND CNDE_ITEM >= :nroi;
    /* SI NO HAY CUENTA DE DESCUENTO NI ADICIONAL CALCULE UN FACTOR PARA LAS VENTAS Y EL IVA */
    if (MERCANCIA <> 0) then
        FACTOR = CAST(VRSUBT AS DOUBLE PRECISION) / CAST(MERCANCIA AS DOUBLE PRECISION);
    ELSE
        FACTOR = 1;
    /* TRAIGA EL NUMERO DE DIGITOS PARA EL REDONDEO */
    SELECT CAST(CONF_VALOR AS INTEGER) FROM CONFIGURACION WHERE CONF_MODULO = 'FACTURACION' AND
        CONF_CATEGORIA = 'GENERAL' AND CONF_PROPIEDAD = 'REDONDEO AL MULTIPLO DE DIEZ EN TOTALES' INTO :DIG;
    if (:tercexento = 'S') then
        BEGIN
        EXECUTE PROCEDURE lee_configuracion('FACTURACION', 'FACTURAS', 'CUENTA CONTABLE PARA VENTAS A CLIENTES EXENTOS DE IVA') returning_values (:CTAVENTAS);
        VENTAS = 'K';
        END
    /* CUENTAS DE VENTAS */
    if (VENTAS = 'A') then
        BEGIN
        FOR SELECT MAX(COAR_CTAVNT), SUM(FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO-FADE_INALCM), SUM(FADE_IVAMONTO), SUM(FADE_CONSUMO), MAX(B.bode_proy), MAX(B.bode_centro), MAX(B.bode_subc)
            FROM ARTICULO A, contabil_articulo_niif C, FACTURAS_DETALLE F, bodega b
            WHERE F.FACT_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL)) and
            f.bode_cod = b.bode_cod
            GROUP BY COAR_CTAVNT
            INTO :CTAVENTAS, :MONTO, :IMPTOS, :VRCONSUMO, :PROYI, :CENTI, :SUBCI
            DO
            BEGIN
            if (icoing = 'SI') then
                MONTO = MONTO + VRCONSUMO;
            if ((CTADTO IS NULL) OR (CTADTO = '')) then
                MONTO = MONTO * FACTOR;
            execute procedure redondee(MONTO, DIG) returning_values (MONTO);
            if (MONTO <> 0) then
                BEGIN
                EXECUTE PROCEDURE cuenta_interfaz_niif(31, :IDDOC, :CTAVENTAS, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (TIPOCUEN = 'I') then
                    BEGIN
                    EXECUTE PROCEDURE ERRORINT (1031, :IDDOC, :CUENTA, 3);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_SUBC, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON, CNDE_PREF, CNDE_FOLIOE)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, :SUBCEN, :NUMERO, NULL, :VENCE, NULL, 0, 31, :PREF, CAST(:NUM AS INTEGER));
                    NROI = NROI + 1;
                    SUMA = SUMA - MONTO;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    IF (CENT = 'B') THEN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_SUBC, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON, CNDE_PREF, CNDE_FOLIOE)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROYI, :CENTI, :SUBCI, NULL, NULL, NULL, NULL, 0, 0, :PREF, CAST(:NUM AS INTEGER));
                    ELSE
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_SUBC, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON, CNDE_PREF, CNDE_FOLIOE)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, :SUBCEN, NULL, NULL, NULL, NULL, 0, 0, :PREF, CAST(:NUM AS INTEGER));
                    NROI = NROI + 1;
                    SUMA = SUMA - MONTO;
                    END
                END /* MONTO <> 0 */
            END /* FOR */
        END /* VENTAS X ARTICULO */
     IF ((VENTAS = 'C') OR (VENTAS = 'K')) THEN
        BEGIN
        IF (VENTAS = 'C') THEN
            CTAVENTAS = TCTAVENTA;
        SELECT SUM(FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO-FADE_INALCM), SUM(FADE_IVAMONTO), SUM (FADE_CONSUMO)
            FROM FACTURAS_DETALLE F
            WHERE F.FACT_ID = :IDDOC AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
            INTO :MONTO, :IMPTOS, :VRCONSUMO;
        if (ICOING = 'SI') then
            MONTO = MONTO + VRCONSUMO;
        if ((CTADTO IS NULL) OR (CTADTO = '')) then
            MONTO = MONTO * FACTOR;
        execute procedure redondee(MONTO, DIG) returning_values (MONTO);
        if (MONTO <> 0) then
            BEGIN
            EXECUTE PROCEDURE cuenta_interfaz_niif(31, :IDDOC, :CTAVENTAS, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'I') then
                BEGIN
                EXECUTE PROCEDURE ERRORINT (1031, :IDDOC, :CUENTA, 3);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_SUBC, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON, CNDE_PREF, CNDE_FOLIOE)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, :SUBCEN, :NUMERO, NULL, :VENCE, NULL, 0, 31, :PREF, CAST(:NUM AS INTEGER));
                NROI = NROI + 1;
                SUMA = SUMA - MONTO;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_SUBC, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON, CNDE_PREF, CNDE_FOLIOE)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, :SUBCEN, NULL, NULL, NULL, NULL, 0, 0, :PREF, CAST(:NUM AS INTEGER));
                NROI = NROI + 1;
                SUMA = SUMA - MONTO;
                END
            END /* MONTO <> 0 */
        END /* VENTAS DE CLIENTE O CONSTANTE */
    /* EL IVA EN VENTAS */
    if (IVA = 'A') then
        BEGIN
        FOR SELECT MAX(COAR_CTAIVAV), SUM(FADE_IVAMONTO), SUM(FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO-FADE_INALCM), sum(FADE_CONSUMO)
            FROM ARTICULO A, contabil_articulo_niif C, FACTURAS_DETALLE F
            WHERE F.FACT_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
            GROUP BY COAR_CTAIVAV
            INTO :CTAIVA, :IMPTOS, :MONTO, :VALORADIC
        DO
            BEGIN
            MONTO = MONTO * -1;
            MONTO = MONTO * FACTOR;
            IMPTOS = IMPTOS * FACTOR;
            execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
            execute procedure redondee(MONTO, DIG) returning_values (MONTO);
            if (IMPTOS <> 0) then
                BEGIN
                EXECUTE PROCEDURE cuenta_interfaz_niif(31, :IDDOC, :CTAIVA, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (TIPOCUEN = 'I') then
                    BEGIN
                    EXECUTE PROCEDURE ERRORINT (1031, :IDDOC, :CUENTA, 3);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_SUBC, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON, CNDE_PREF, CNDE_FOLIOE)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :IMPTOS, :MONTO, ABS(:IMPTOS*100/:MONTO), :NIT, :PROY, :CENTRO, :SUBCEN, :NUMERO, NULL, :VENCE, NULL, 0, 31, :PREF, CAST(:NUM AS INTEGER));
                    NROI = NROI + 1;
                    SUMA = SUMA - IMPTOS;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_SUBC, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON, CNDE_PREF, CNDE_FOLIOE)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :IMPTOS, :MONTO, ABS(:IMPTOS*100/:MONTO), :NIT, :PROY, :CENTRO, :SUBCEN, NULL, NULL, NULL, NULL, 0, 0, :PREF, CAST(:NUM AS INTEGER));
                    NROI = NROI + 1;
                    SUMA = SUMA - IMPTOS;
                    END
                END   /* IMPTOS <> 0 */
            END /* FOR */
        END /* IVA X ARTICULO */
    if (IVA = 'K') then /* IVA EN CTA CONSTANTE */
        BEGIN
        SELECT SUM(FADE_IVAMONTO), SUM(FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO-fade_inalcm), SUM(FADE_CONSUMO)
            FROM FACTURAS_DETALLE F
            WHERE F.FACT_ID = :IDDOC and FADE_IVAMONTO <> 0 AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
            INTO :IMPTOS, :MONTO, :valoradic;
        MONTO = MONTO * -1;
        MONTO = MONTO * FACTOR;
        IMPTOS = IMPTOS * FACTOR;
        execute procedure redondee(MONTO, DIG) returning_values (MONTO);
        execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
        if (IMPTOS <> 0) then
            BEGIN
            EXECUTE PROCEDURE cuenta_interfaz_niif(31, :IDDOC, :CTAIVA, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'I') then
                BEGIN
                EXECUTE PROCEDURE ERRORINT (1031, :IDDOC, :CUENTA, 3);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_SUBC, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON, CNDE_PREF, CNDE_FOLIOE)
                    VALUES (:IDC, :NROI, :CTAIVA, :CONC, '', 0, :IMPTOS, :MONTO, ABS(:IMPTOS*100/:MONTO), :NIT, :PROY, :CENTRO, :SUBCEN, :NUMERO, NULL, :VENCE, NULL, 0, 31, :PREF, CAST(:NUM AS INTEGER));
                NROI = NROI + 1;
                SUMA = SUMA - IMPTOS;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_SUBC, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON, CNDE_PREF, CNDE_FOLIOE)
                    VALUES (:IDC, :NROI, :CTAIVA, :CONC, '', 0, :IMPTOS, :MONTO, ABS(:IMPTOS*100/:MONTO), :NIT, :PROY, :CENTRO, :SUBCEN, NULL, NULL, NULL, NULL, 0, 0, :PREF, CAST(:NUM AS INTEGER));
                NROI = NROI + 1;
                SUMA = SUMA - IMPTOS;
                END
            END /* IMPTOS <> 0 */
        END /* IVA EN CTA CONSTANTE */
    /* EL IMPOCONSUMO */
    if (CONSUMO = 'A') then
        BEGIN
        FOR SELECT MAX(COAR_CTACONS), SUM(FADE_CONSUMO)
            FROM ARTICULO A, contabil_articulo_niif C, FACTURAS_DETALLE F
            WHERE F.FACT_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
            GROUP BY COAR_CTACONS
            INTO :CTACONSUMO, :IMPTOS
        DO
            BEGIN
            execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
            if (IMPTOS <> 0) then
                BEGIN
                EXECUTE PROCEDURE cuenta_interfaz_niif(31, :IDDOC, :CTACONSUMO, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (TIPOCUEN = 'I') then
                    BEGIN
                    EXECUTE PROCEDURE ERRORINT (1031, :IDDOC, :CUENTA, 3);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_SUBC, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON, CNDE_PREF, CNDE_FOLIOE)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, :SUBCEN, :NUMERO, NULL, :VENCE, NULL, 0, 31, :PREF, CAST(:NUM AS INTEGER));
                    NROI = NROI + 1;
                    SUMA = SUMA - IMPTOS;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_SUBC, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON, CNDE_PREF, CNDE_FOLIOE)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, :SUBCEN, NULL, NULL, NULL, NULL, 0, 0, :PREF, CAST(:NUM AS INTEGER));
                    NROI = NROI + 1;
                    SUMA = SUMA - IMPTOS;
                    END
                END /* IMPTOS <> 0 */
            END /* FOR */
        END /* CONSUMO X ARTICULO */
    if (CONSUMO = 'K') then /* CONSUMO EN CTA CONSTANTE */
        BEGIN
        SELECT SUM(FADE_CONSUMO)
            FROM FACTURAS_DETALLE F
            WHERE F.FACT_ID = :IDDOC AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
            INTO :IMPTOS;
        execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
        if (IMPTOS <> 0) then
            BEGIN
            EXECUTE PROCEDURE cuenta_interfaz_niif(31, :IDDOC, :CTACONSUMO, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'I') then
                BEGIN
                EXECUTE PROCEDURE ERRORINT (1031, :IDDOC, :CUENTA, 3);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_SUBC, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON, CNDE_PREF, CNDE_FOLIOE)
                    VALUES (:IDC, :NROI, :CTACONSUMO, :CONC, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, :SUBCEN, :NUMERO, NULL, :VENCE, NULL, 0, 31, :PREF, CAST(:NUM AS INTEGER));
                NROI = NROI + 1;
                SUMA = SUMA - IMPTOS;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_SUBC, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON, CNDE_PREF, CNDE_FOLIOE)
                    VALUES (:IDC, :NROI, :CTACONSUMO, :CONC, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, :SUBCEN, NULL, NULL, NULL, NULL, 0, 0, :PREF, CAST(:NUM AS INTEGER));
                NROI = NROI + 1;
                SUMA = SUMA - IMPTOS;
                END
            END /* IMPTOS <> 0 */
        END /* CONSUMO EN CTA CONSTANTE */
    /* IMPUESTO NACIONAL AL CONSUMO CTA CONFIGURABLE */
        BEGIN
        SELECT SUM(FADE_INALCM), SUM(FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO-FADE_INALCM) FROM FACTURAS_DETALLE F
            WHERE F.FACT_ID = :IDDOC AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL)) and
            FADE_INALCM <> 0
            INTO :IMPTOS, :MONTO;
        execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
        if (MONTO <> 0) then
            PORC = IMPTOS / MONTO;
        execute procedure redondee(PORC, 0) returning_values (PORC);
        if (IMPTOS <> 0) then
            BEGIN
            EXECUTE PROCEDURE lee_configuracion ('FACTURACION', 'ARTICULOS', 'CUENTA CONTABLE PARA EL IMPUESTO NACIONAL AL CONSUMO') returning_values (ctaconsumo);
            EXECUTE PROCEDURE cuenta_interfaz_niif(31, :IDDOC, :CTACONSUMO, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON, CNDE_PREF, CNDE_FOLIOE)
                    VALUES (:IDC, :NROI, :CTACONSUMO, :CONC, '', 0, :IMPTOS, :MONTO, :PORC, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31, :PREF, CAST(:NUM AS INTEGER));
                NROI = NROI + 1;
                SUMA = SUMA - IMPTOS;
                END
            ELSE
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON, CNDE_PREF, CNDE_FOLIOE)
                    VALUES (:IDC, :NROI, :CTACONSUMO, :CONC, '', 0, :IMPTOS, :MONTO, :PORC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0, :PREF, CAST(:NUM AS INTEGER));
                NROI = NROI + 1;
                SUMA = SUMA - IMPTOS;
                END
            END /* IMPTOS <> 0 */
        END /* IMPUETO NACIONAL CONSUMO EN CTA CONFIGURABLE */
    /* DESCUENTO */
    if ((CTADTO IS NOT NULL) AND (CTADTO <> '')) then
        BEGIN
        execute procedure redondee(VRDTO, DIG) returning_values (VRDTO);
        if (VRDTO <> 0) then
            BEGIN
            EXECUTE PROCEDURE cuenta_interfaz_niif(31, :IDDOC, :CTADTO, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_SUBC, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON, CNDE_PREF, CNDE_FOLIOE)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRDTO, 0, 0, 0, :NIT, :PROY, :CENTRO, :SUBCEN, :NUMERO, NULL, :VENCE, NULL, 0, 31, :PREF, CAST(:NUM AS INTEGER));
                NROI = NROI + 1;
                SUMA = SUMA + VRDTO;
                END
            if (TIPOCUEN = 'N') then
                    BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_SUBC, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON, CNDE_PREF, CNDE_FOLIOE)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRDTO, 0, 0, 0, :NIT, :PROY, :CENTRO, :SUBCEN, NULL, NULL, NULL, NULL, 0, 31, :PREF, CAST(:NUM AS INTEGER));
                NROI = NROI + 1;
                SUMA = SUMA + VRDTO;
                END
            END
        END /* DESCUENTO */
    /* VALOR ADIC */
    if ((CTAADIC IS NOT NULL) AND (CTAADIC <> '')) then
        BEGIN
        execute procedure redondee(VRADIC, DIG) returning_values (VRADIC);
        if (VRADIC <> 0) THEN
            BEGIN
            EXECUTE PROCEDURE cuenta_interfaz_niif(31, :IDDOC, :CTAADIC, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_SUBC, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON, CNDE_PREF, CNDE_FOLIOE)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRADIC, 0, 0, :NIT, :PROY, :CENTRO, :SUBCEN, :NUMERO, NULL, :VENCE, NULL, 0, 31, :PREF, CAST(:NUM AS INTEGER));
                NROI = NROI + 1;
                SUMA = SUMA - VRADIC;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_SUBC, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON, CNDE_PREF, CNDE_FOLIOE)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRADIC, 0, 0, :NIT, :PROY, :CENTRO, :SUBCEN, NULL, NULL, NULL, NULL, 0, 31, :PREF, CAST(:NUM AS INTEGER));
                NROI = NROI + 1;
                SUMA = SUMA - VRADIC;
                END
            END
        END /* VR. ADIC */
    /* VALOR EXTRA */
    if ((CTAEXTRA IS NOT NULL) AND (CTAEXTRA <> '')) THEN
        BEGIN
        execute procedure redondee(VREXTRA, DIG) returning_values (VREXTRA);
        if (VREXTRA <> 0) THEN
            BEGIN
            EXECUTE PROCEDURE cuenta_interfaz_niif(31, :IDDOC, :CTAEXTRA, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_SUBC, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON, CNDE_PREF, CNDE_FOLIOE)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VREXTRA, 0, 0, :NIT, :PROY, :CENTRO, :SUBCEN, :NUMERO, NULL, :VENCE, NULL, 0, 31, :PREF, CAST(:NUM AS INTEGER));
                NROI = NROI + 1;
                SUMA = SUMA - VREXTRA;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_SUBC, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON, CNDE_PREF, CNDE_FOLIOE)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VREXTRA, 0, 0, :NIT, :PROY, :CENTRO, :SUBCEN, NULL, NULL, NULL, NULL, 0, 31, :PREF, CAST(:NUM AS INTEGER));
                NROI = NROI + 1;
                SUMA = SUMA - VREXTRA;
                END
            END
        END /* VR. EXTRA */
    /* DESCUENTE EL IMPOCONSUMO */
    SELECT SUM(FADE_CONSUMO)
        FROM FACTURAS_DETALLE F WHERE F.FACT_ID = :IDDOC AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL)) INTO :IMPTOS;
    vrsubt = vrsubt - IMPTOS;
    /* RETENCION FUENTE */
    if ((RTFTE = 'C') or (RTFTE = 'K')) then
      BEGIN
      execute procedure redondee(VRRTFTE, DIG) returning_values (VRRTFTE);
      if (VRRTFTE <> 0) then
        BEGIN
        if (RTFTE = 'C') then
            CTARTFTE = TCTARTFTE;
        EXECUTE PROCEDURE cuenta_interfaz_niif(31, :IDDOC, :CTARTFTE, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
        if (ERRORC <> 0) then
            ERROR = ERROR + 1;
        if (TIPOCUEN = 'C') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_SUBC, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON, CNDE_PREF, CNDE_FOLIOE)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTFTE, 0, :VRSUBT, :PRTFTE, :NIT, :PROY, :CENTRO, :SUBCEN, :NUMERO, NULL, :VENCE, NULL, 0, 31, :PREF, CAST(:NUM AS INTEGER));
            NROI = NROI + 1;
            SUMA = SUMA + VRRTFTE;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_SUBC, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON, CNDE_PREF, CNDE_FOLIOE)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTFTE, 0, :VRSUBT, :PRTFTE, :NIT, :PROY, :CENTRO, :SUBCEN, NULL, NULL, NULL, NULL, 0, 0, :PREF, CAST(:NUM AS INTEGER));
            NROI = NROI + 1;
            SUMA = SUMA + VRRTFTE;
            END
        /* AUTORETENCION */
        if (FAUTORET <= fecaux) then
            BEGIN
            EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'CUENTA DE AUTORETENCION EN LA FUENTE') returning_values (CTARTFTE);
            CUENTA = NULL;
            SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :CTARTFTE INTO :CUENTA, :TIPOCUEN;
            if (CUENTA IS NULL) then
                begin
                EXECUTE PROCEDURE ERRORINT (1031, :IDDOC, :CTARTFTE, 2);
                CUENTA = CTARTFTE;
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'I') then
                begin
                EXECUTE PROCEDURE ERRORINT (1031, :IDDOC, :CUENTA, 3);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_SUBC, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON, CNDE_PREF, CNDE_FOLIOE)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTFTE, (:VRSUBT*-1), :PRTFTE, :NIT, :PROY, :CENTRO, :SUBCEN, :NUMERO, NULL, :VENCE, NULL, 0, 31, :PREF, CAST(:NUM AS INTEGER));
                NROI = NROI + 1;
                SUMA = SUMA - VRRTFTE;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_SUBC, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON, CNDE_PREF, CNDE_FOLIOE)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTFTE, (:VRSUBT*-1), :PRTFTE, :NIT, :PROY, :CENTRO, :SUBCEN, NULL, NULL, NULL, NULL, 0, 0, :PREF, CAST(:NUM AS INTEGER));
                NROI = NROI + 1;
                SUMA = SUMA - VRRTFTE;
                END
            END
        END /* RTFTE */
      END
    if (RTFTE = 'A') then
      BEGIN
      if (VRRTFTE <> 0) then
        BEGIN
        FOR SELECT MAX(COAR_CTARTFTEV), MAX(COAR_RTFTE), MIN(COAR_RTBASE), SUM(FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO), SUM((FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO)*COAR_RTFTE)
          FROM contabil_articulo_niif C, FACTURAS_DETALLE F
          WHERE F.FACT_ID = :IDDOC AND F.ARTI_COD = C.ARTI_COD AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
          GROUP BY COAR_CTARTFTEV
          INTO :CTARTFTE, :PRTFTE, :baseadic, :MONTO, :VRRTFTE
          DO
          BEGIN
          MONTO = MONTO * FACTOR;
          if (MONTO >= BASEADIC) then
            BEGIN
            VRRTFTE = VRRTFTE * FACTOR / 100;
            execute procedure redondee(VRRTFTE, DIG) returning_values (VRRTFTE);
            execute procedure redondee(MONTO, DIG) returning_values (MONTO);
            if (VRRTFTE <> 0) then
                BEGIN
                EXECUTE PROCEDURE cuenta_interfaz_niif(31, :IDDOC, :CTARTFTE, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (TIPOCUEN = 'C') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_SUBC, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON, CNDE_PREF, CNDE_FOLIOE)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTFTE, 0, :MONTO, :PRTFTE, :NIT, :PROY, :CENTRO, :SUBCEN, :NUMERO, NULL, :VENCE, NULL, 0, 31, :PREF, CAST(:NUM AS INTEGER));
                    NROI = NROI + 1;
                    SUMA = SUMA + VRRTFTE;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_SUBC, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON, CNDE_PREF, CNDE_FOLIOE)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTFTE, 0, :MONTO, :PRTFTE, :NIT, :PROY, :CENTRO, :SUBCEN, NULL, NULL, NULL, NULL, 0, 0, :PREF, CAST(:NUM AS INTEGER));
                    NROI = NROI + 1;
                    SUMA = SUMA + VRRTFTE;
                    END
                /* AUTORETENCION */
                if (FAUTORET <= fecaux) then
                    BEGIN
                    EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'CUENTA DE AUTORETENCION EN LA FUENTE') returning_values (CTARTFTE);
                    EXECUTE PROCEDURE cuenta_interfaz_niif(31, :IDDOC, :CTARTFTE, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
                    if (ERRORC <> 0) then
                        ERROR = ERROR + 1;
                    if (TIPOCUEN = 'C') then
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_SUBC, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON, CNDE_PREF, CNDE_FOLIOE)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTFTE, (:MONTO*-1), :PRTFTE, :NIT, :PROY, :CENTRO, :SUBCEN, :NUMERO, NULL, :VENCE, NULL, 0, 31, :PREF, CAST(:NUM AS INTEGER));
                        NROI = NROI + 1;
                        SUMA = SUMA - VRRTFTE;
                        END
                    if (TIPOCUEN = 'N') then
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_SUBC, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON, CNDE_PREF, CNDE_FOLIOE)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTFTE, (:MONTO*-1), :PRTFTE, :NIT, :PROY, :CENTRO, :SUBCEN, NULL, NULL, NULL, NULL, 0, 0, :PREF, CAST(:NUM AS INTEGER));
                        NROI = NROI + 1;
                        SUMA = SUMA - VRRTFTE;
                        END
                    END
                END
            END
          END
        END /* RTFTE */
      END
    /* RETENCION IVA */
    if ((RTIVA = 'C') or (RTIVA = 'K')) then
      BEGIN
      execute procedure redondee(VRRTIVA, DIG) returning_values (VRRTIVA);
      if (VRRTIVA <> 0) then
        BEGIN
        if (RTIVA = 'C') then
            CTARTIVA = TCTARTIVA;
        EXECUTE PROCEDURE cuenta_interfaz_niif(31, :IDDOC, :CTARTIVA, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
        if (ERRORC <> 0) then
            ERROR = ERROR + 1;
        if (TIPOCUEN = 'C') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_SUBC, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON, CNDE_PREF, CNDE_FOLIOE)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTIVA, 0, :VRIVA, :PORC, :NIT, :PROY, :CENTRO, :SUBCEN, :NUMERO, NULL, :VENCE, NULL, 0, 31, :PREF, CAST(:NUM AS INTEGER));
            NROI = NROI + 1;
            SUMA = SUMA + VRRTIVA;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_SUBC, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON, CNDE_PREF, CNDE_FOLIOE)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTIVA, 0, :VRIVA, :PORC, :NIT, :PROY, :CENTRO, :SUBCEN, NULL, NULL, NULL, NULL, 0, 0, :PREF, CAST(:NUM AS INTEGER));
            NROI = NROI + 1;
            SUMA = SUMA + VRRTIVA;
            END
        END /* RTIVA */
      END
    /* RETENCION DE ICA */
    if ((RTICA = 'C') or (RTICA = 'K')) then
      BEGIN
      execute procedure redondee(VRRTICA, DIG) returning_values (VRRTICA);
      if (VRRTICA <> 0) then
        BEGIN
        if (RTICA = 'C') then
            CTARTICA = TCTARTICA;
        EXECUTE PROCEDURE cuenta_interfaz_niif(31, :IDDOC, :CTARTICA, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
        if (ERRORC <> 0) then
            ERROR = ERROR + 1;
        if (TIPOCUEN = 'C') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_SUBC, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON, CNDE_PREF, CNDE_FOLIOE)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTICA, 0, :VRSUBT, :PRTICA, :NIT, :PROY, :CENTRO, :SUBCEN, :NUMERO, NULL, :VENCE, NULL, 0, 31, :PREF, CAST(:NUM AS INTEGER));
            NROI = NROI + 1;
            SUMA = SUMA + VRRTICA;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_SUBC, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON, CNDE_PREF, CNDE_FOLIOE)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTICA, 0, :VRSUBT, :PRTICA, :NIT, :PROY, :CENTRO, :SUBCEN, NULL, NULL, NULL, NULL, 0, 0, :PREF, CAST(:NUM AS INTEGER));
            NROI = NROI + 1;
            SUMA = SUMA + VRRTICA;
            END
        END /* RTICA */
      END
    /* RETENCION CREE */
    if ((RCREE = 'C') or (RCREE = 'K')) then
      BEGIN
      execute procedure redondee(vrrcree, DIG) returning_values (vrrcree);
      if (vrrcree <> 0) then
        BEGIN
        if (RCREE = 'C') then
            ctarcree = tctarcree;
        EXECUTE PROCEDURE cuenta_interfaz_niif(31, :IDDOC, :ctarcree, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
        if (ERRORC <> 0) then
            ERROR = ERROR + 1;
        if (TIPOCUEN = 'C') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_SUBC, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON, CNDE_PREF, CNDE_FOLIOE)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :vrrcree, 0, :VRSUBT, :prcree, :NIT, :PROY, :CENTRO, :SUBCEN, :NUMERO, NULL, :VENCE, NULL, 0, 31, :PREF, CAST(:NUM AS INTEGER));
            NROI = NROI + 1;
            SUMA = SUMA + vrrcree;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_SUBC, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON, CNDE_PREF, CNDE_FOLIOE)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :vrrcree, 0, :VRSUBT, :prcree, :NIT, :PROY, :CENTRO, :SUBCEN, NULL, NULL, NULL, NULL, 0, 0, :PREF, CAST(:NUM AS INTEGER));
            NROI = NROI + 1;
            SUMA = SUMA + vrrcree;
            END
        /* AUTORETECREE */
        if (fautorcree <= fecaux) then
            BEGIN
            EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'CUENTA DE AUTORETENCION CREE') returning_values (ctarcree);
            CUENTA = NULL;
            SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :ctarcree INTO :CUENTA, :TIPOCUEN;
            if (CUENTA IS NULL) then
                begin
                EXECUTE PROCEDURE ERRORINT (1031, :IDDOC, :ctarcree, 2);
                CUENTA = ctarcree;
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON, CNDE_PREF, CNDE_FOLIOE)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :vrrcree, (:VRSUBT*-1), :prcree, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31, :PREF, CAST(:NUM AS INTEGER));
                NROI = NROI + 1;
                SUMA = SUMA - vrrcree;
                END
            ELSE
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON, CNDE_PREF, CNDE_FOLIOE)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :vrrcree, (:VRSUBT*-1), :prcree, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0, :PREF, CAST(:NUM AS INTEGER));
                NROI = NROI + 1;
                SUMA = SUMA - vrrcree;
                END
            END
        END /* RCREE */
      END
    /* CIERRE EL COMPROBANTE CONTRA LA CUENTA DEL TERCERO O LA CONSTANTE */
    if ((SUMA <> 0) and ((CARTERA = 'C') or (CARTERA = 'K') or (CARTERA = 'J'))) then
        BEGIN
        if (icoing = 'SI') then
            /* DESCUENTE EL IMPOCONSUMO QUE HACE PARTE DEL COSTO */
            SUMA = SUMA + IMPTOS;
        if (SUMA < 0) then
            BEGIN
            DEBITO = SUMA * -1;
            CREDITO = 0;
            END
        ELSE
            BEGIN
            DEBITO = 0;
            CREDITO = SUMA;
            END
        if (CARTERA = 'C') then
            CTACARTERA = TCTACLIEN;
        if (CARTERA = 'J') then
            BEGIN
            /* BUSQUE LA CUENTA DE LA CAJA */
            SELECT CAJA_CUENTA FROM CAJAS C, PUNTO_VENTA P
                WHERE P.CAJA_ID = C.CAJA_ID AND PTVT_ID = :PTOVTA
                INTO :CTACARTERA;
            END
        EXECUTE PROCEDURE cuenta_interfaz_niif(31, :IDDOC, :CTACARTERA, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
        if (ERRORC <> 0) then
            ERROR = ERROR + 1;
        if (TIPOCUEN = 'C') then
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_SUBC, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON, CNDE_PREF, CNDE_FOLIOE)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :DEBITO, :CREDITO, 0, 0, :NIT, :PROY, :CENTRO, :SUBCEN, :NUMERO, NULL, :VENCE, NULL, 0, 31, :PREF, CAST(:NUM AS INTEGER));
        if (TIPOCUEN = 'N') then
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_SUBC, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON, CNDE_PREF, CNDE_FOLIOE)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :DEBITO, :CREDITO, 0, 0, :NIT, :PROY, :CENTRO, :SUBCEN, NULL, NULL, NULL, NULL, 0, 0, :PREF, CAST(:NUM AS INTEGER));
        NROI = NROI + 1;
        END /* SUMA EN CARTERA */
    /* CALCULE COSTOS EN VENTAS */
    EXECUTE PROCEDURE costo_en_ventas_niif(31, :IDDOC);
    if (COSTOS = 'A') then
        BEGIN
        FOR SELECT MAX(CTACOS), SUM(CAST(CANT AS DOUBLE PRECISION) * COSTO), SUM(FADE_CONSUMO)
            FROM costo_ventas_niif CV, FACTURAS_DETALLE D WHERE CV.cove_item = D.fade_item AND D.fact_id = :iddoc AND
            TIDO_COD = 31 AND COVE_ID = :iddoc
            GROUP BY CTACOS
            INTO :CTACOSTOS, :MONTO, :vrconsumo
        DO
            BEGIN
            if (icoing = 'SI') then
                MONTO = MONTO + VRCONSUMO;
            if (MONTO <> 0) then
                BEGIN
                EXECUTE PROCEDURE cuenta_interfaz_niif(31, :IDDOC, :CTACOSTOS, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (TIPOCUEN = 'I') then
                    BEGIN
                    EXECUTE PROCEDURE ERRORINT (1031, :IDDOC, :CUENTA, 3);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_SUBC, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON, CNDE_PREF, CNDE_FOLIOE)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, :SUBCEN, :NUMERO, NULL, :VENCE, NULL, 0, 31, :PREF, CAST(:NUM AS INTEGER));
                    NROI = NROI + 1;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_SUBC, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON, CNDE_PREF, CNDE_FOLIOE)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, :SUBCEN, NULL, NULL, NULL, NULL, 0, 0, :PREF, CAST(:NUM AS INTEGER));
                    NROI = NROI + 1;
                    END
                END /* MONTO <> 0 */
            END /* FOR */
        END /* COSTOS */
    if (COSTOS = 'K') then
        BEGIN
        SELECT SUM(CAST(CANT AS DOUBLE PRECISION) * COSTO)
            FROM costo_ventas_niif WHERE TIDO_COD = 31 AND COVE_ID = :iddoc
            INTO :MONTO;
        if (icoing = 'SI') then
            MONTO = MONTO + imptos;
        if (MONTO <> 0) then
            BEGIN
            EXECUTE PROCEDURE cuenta_interfaz_niif(31, :IDDOC, :CTACOSTOS, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'I') then
                BEGIN
                EXECUTE PROCEDURE ERRORINT (1031, :IDDOC, :CUENTA, 3);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_SUBC, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON, CNDE_PREF, CNDE_FOLIOE)
                    VALUES (:IDC, :NROI, :CTACOSTOS, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, :SUBCEN, :NUMERO, NULL, :VENCE, NULL, 0, 31, :PREF, CAST(:NUM AS INTEGER));
                NROI = NROI + 1;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_SUBC, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON, CNDE_PREF, CNDE_FOLIOE)
                    VALUES (:IDC, :NROI, :CTACOSTOS, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, :SUBCEN, NULL, NULL, NULL, NULL, 0, 0, :PREF, CAST(:NUM AS INTEGER));
                NROI = NROI + 1;
                END
            END /* MONTO <> 0 */
        END /* COSTOS = K */
    if (INVEN = 'A') then
        BEGIN
        FOR SELECT MAX(CTAINV), SUM(CAST(CANT AS DOUBLE PRECISION) * COSTO)
            FROM costo_ventas_niif WHERE TIDO_COD = 31 AND COVE_ID = :iddoc
            GROUP BY CTAINV
            INTO :CTAINVEN, :MONTO
        DO
            BEGIN
            if (MONTO <> 0) then
                BEGIN
                EXECUTE PROCEDURE cuenta_interfaz_niif(31, :IDDOC, :CTAINVEN, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (TIPOCUEN = 'I') then
                    BEGIN
                    EXECUTE PROCEDURE ERRORINT (1031, :IDDOC, :CUENTA, 3);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_SUBC, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON, CNDE_PREF, CNDE_FOLIOE)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, :SUBCEN, :NUMERO, NULL, :VENCE, NULL, 0, 31, :PREF, CAST(:NUM AS INTEGER));
                    NROI = NROI + 1;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_SUBC, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON, CNDE_PREF, CNDE_FOLIOE)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, :SUBCEN, NULL, NULL, NULL, NULL, 0, 0, :PREF, CAST(:NUM AS INTEGER));
                    NROI = NROI + 1;
                    END
                END /* MONTO <> 0 */
            END /* FOR */
        END /* INVEN = A */
    if (INVEN = 'K') then
        BEGIN
        SELECT SUM(CAST(CANT AS DOUBLE PRECISION) * COSTO)
            FROM costo_ventas_niif WHERE TIDO_COD = 31 AND COVE_ID = :iddoc
            INTO :MONTO;
        if (MONTO <> 0) then
            BEGIN
            EXECUTE PROCEDURE cuenta_interfaz_niif(31, :IDDOC, :CTAINVEN, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'I') then
                BEGIN
                EXECUTE PROCEDURE ERRORINT (1031, :IDDOC, :CUENTA, 3);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_SUBC, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON, CNDE_PREF, CNDE_FOLIOE)
                    VALUES (:IDC, :NROI, :CTAINVEN, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, :SUBCEN, :NUMERO, NULL, :VENCE, NULL, 0, 31, :PREF, CAST(:NUM AS INTEGER));
                NROI = NROI + 1;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_SUBC, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON, CNDE_PREF, CNDE_FOLIOE)
                    VALUES (:IDC, :NROI, :CTAINVEN, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, :SUBCEN, NULL, NULL, NULL, NULL, 0, 0, :PREF, CAST(:NUM AS INTEGER));
                NROI = NROI + 1;
                END
            END /* MONTO <> 0 */
        END /* INVEN = K */
    /* recorra las cuentas adicionales */
    FOR SELECT INVC_CUENTA, INVC_BASE, INVC_PORC, INVC_VALOR, INVC_DB
        FROM INTERFAZ_VENTAS_CTAS
        WHERE INVE_ID = :IDINTER
        INTO :CTADIC, :BASEADIC, :PORCADIC, :VALORADIC, :DBADIC
        DO
        BEGIN
        if (VALORADIC <> 0) then
            MONTO = VALORADIC;
        ELSE
            BEGIN
            if (:BASEADIC = 'SUBTOTAL') then
                VALORADIC = vrsubt;
            if (:BASEADIC = 'DESCUENTO') then
                VALORADIC = VRDTO;
            if (:BASEADIC = 'IVA') then
                VALORADIC = VRIVA;
            if (:BASEADIC = 'ADICIONAL') then
                VALORADIC = VRADIC;
            if (:BASEADIC = 'EXTRA') then
                VALORADIC = VREXTRA;
            if (:BASEADIC = 'TOTAL') then
                VALORADIC = VRTOTAL;
            MONTO = VALORADIC * PORCADIC / 100;
            END
        if (MONTO <> 0) then
            BEGIN
            EXECUTE PROCEDURE cuenta_interfaz_niif(31, :IDDOC, :CTADIC, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'C') then
                BEGIN
                if (DBADIC = 'S') then
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_SUBC, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON, CNDE_PREF, CNDE_FOLIOE)
                        VALUES (:IDC, :NROI, :CTADIC, :CONC, '', :MONTO, 0, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, :SUBCEN, :NUMERO, NULL, :VENCE, NULL, 0, 31, :PREF, CAST(:NUM AS INTEGER));
                ELSE
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_SUBC, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON, CNDE_PREF, CNDE_FOLIOE)
                        VALUES (:IDC, :NROI, :CTADIC, :CONC, '', 0, :MONTO, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, :SUBCEN, :NUMERO, NULL, :VENCE, NULL, 0, 31, :PREF, CAST(:NUM AS INTEGER));
                NROI = NROI + 1;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                if (DBADIC = 'S') then
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_SUBC, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON, CNDE_PREF, CNDE_FOLIOE)
                        VALUES (:IDC, :NROI, :CTADIC, :CONC, '', :MONTO, 0, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, :SUBCEN, NULL, NULL, NULL, NULL, 0, 0, :PREF, CAST(:NUM AS INTEGER));
                ELSE
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_SUBC, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON, CNDE_PREF, CNDE_FOLIOE)
                        VALUES (:IDC, :NROI, :CTADIC, :CONC, '', 0, :MONTO, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, :SUBCEN, NULL, NULL, NULL, NULL, 0, 0, :PREF, CAST(:NUM AS INTEGER));
                NROI = NROI + 1;
                END
            NROI = NROI + 1;
            END
        END
    if (ERROR > 0) then
        VER = 'S';
    SUSPEND;
    END /* NO ANULADO */
  END /* EXISTE LA INTERFAZ */
ELSE
    BEGIN
    EXECUTE PROCEDURE ERRORINT (1031, :IDDOC, :PREF, 1);
    ERROR = ERROR + 1;
    VER = 'S';
    SUSPEND;
    END
END^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE FACTURAS_SIN_CONTABILIDAD_NIIF(
    FECINI DATE,
    FECFIN DATE,
    PREFIJO VARCHAR(4))
RETURNS (
    ID INTEGER,
    PREF VARCHAR(4),
    NUMERO VARCHAR(8),
    ESTADO VARCHAR(20),
    IDI INTEGER,
    IDC INTEGER)
AS
DECLARE VARIABLE VER CHAR(2);
declare variable ERROR INTEGER;
declare variable IDREF INTEGER;
BEGIN
FOR SELECT FACT_ID, PREF_PRE, FACT_NUMERO FROM FACTURAS WHERE FACT_ANULADO = 'N' AND
    FACT_FECHA >= :FECINI AND FACT_FECHA <= :FECFIN AND ((:PREFIJO = '') or (PREF_PRE = :PREFIJO))
    INTO :ID, :PREF, :NUMERO
DO
  BEGIN
  idc = null;
  if (not exists (SELECT E.ENCO_CONSEC FROM COMPROBANTE_ENCABEZADO E, comprobante_detalle_niif D
    WHERE ENCO_TIPOREF = 31 AND ENCO_IDREF = :ID AND E.enco_consec = D.enco_consec)) then
    BEGIN
    SELECT CNTB_ID FROM CONTABILIZACION WHERE CNTB_TIPOREF = 31 AND CNTB_IDREF = :ID into :idc;
    DELETE FROM CONTABILIZACION_DET WHERE CNTB_ID = :IDC AND CNDE_ITEM >= 100000;
    if (idc IS NOT NULL) then
        begin
        ESTADO = 'PROCESANDO';
        ERROR = NULL;
        SUSPEND;
        SELECT MAX(INVE_ID) FROM INTERFAZ_VENTAS WHERE PREF_PRE = :PREF AND TIDO_COD = 31 INTO :IDI;
        EXECUTE PROCEDURE contabil_factura_niif (:ID, :IDI, :idc) RETURNING_VALUES (:ERROR, VER);
        if ((ERROR = 0) or (error IS NULL)) then
            BEGIN
            SELECT ENCO_CONSEC FROM COMPROBANTE_ENCABEZADO E WHERE ENCO_TIPOREF = 31 AND ENCO_IDREF = :ID INTO :IDREF;
            INSERT INTO comprobante_detalle_niif (ENCO_CONSEC, CODE_ITEM, CUEN_COD, TERC_NIT, PROY_COD, CENT_COD, SUBC_COD, CODE_CONCEPTO, CODE_REFER, CONC_COD, CODE_BASE, CODE_PORC, CODE_DEBITO, CODE_CREDITO, CODE_TIPONUE, CNDE_DOCNUMERO, CODE_TIPOAPL, CNDE_DOCAPLICA, DOCO_VENCE, ARTI_COD)
                SELECT :IDREF, CNDE_ITEM, CNDE_CUENTA, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_SUBC, CNDE_CONC, CNDE_REF, CNDE_CONCOD, CNDE_BASE, CNDE_PORC, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_DOCTIPON, CNDE_DOCNUMERO, CNDE_DOCTIPOA, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO
                FROM CONTABILIZACION_DET WHERE CNTB_ID = :idc AND CNDE_ITEM >= 100000;
            UPDATE comprobante_encabezado SET ENCO_CONTANIIF = 'S' WHERE ENCO_CONSEC = :IDREF;
            ESTADO = 'OK';
            END
        ELSE
            ESTADO = 'ERROR';
        suspend;
        end
    END
  END
END^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER PROCEDURE SEPARAR_PREFIJO_NUMERO (
    CADENA VARCHAR(15)
)
RETURNS (
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(12)
)
AS
DECLARE VARIABLE I INTEGER;
DECLARE VARIABLE LONGITUD INTEGER;
DECLARE VARIABLE CARACTER CHAR(1);
DECLARE VARIABLE INICIO_NUMERO INTEGER;
DECLARE VARIABLE PARTE_NUMERICA VARCHAR(8);
BEGIN
    -- Inicializar variables
    PREFIJO = '';
    NUMERO = '';
    INICIO_NUMERO = 0;
    
    -- Si la cadena es nula o vacía, salir
    IF (CADENA IS NULL OR TRIM(CADENA) = '') THEN
    BEGIN
        SUSPEND;
        EXIT;
    END
    
    LONGITUD = CHAR_LENGTH(TRIM(CADENA));
    CADENA = TRIM(CADENA);
    
    -- Recorrer la cadena desde el final hacia atrás
    -- para encontrar dónde comienza la secuencia numérica final
    I = LONGITUD;
    WHILE (I >= 1) DO
    BEGIN
        CARACTER = SUBSTRING(CADENA FROM I FOR 1);
        
        -- Si encontramos un carácter NO numérico
        IF (CARACTER < '0' OR CARACTER > '9') THEN
        BEGIN
            INICIO_NUMERO = I + 1;
            LEAVE;
        END
        
        I = I - 1;
    END
    
    -- Si recorrimos toda la cadena y todos son dígitos
    IF (I = 0) THEN
        INICIO_NUMERO = 1;
    
    -- Separar prefijo y número
    IF (INICIO_NUMERO > 1) THEN
    BEGIN
        PREFIJO = SUBSTRING(CADENA FROM 1 FOR INICIO_NUMERO - 1);
        PARTE_NUMERICA = SUBSTRING(CADENA FROM INICIO_NUMERO);
    END
    ELSE
    BEGIN
        -- Toda la cadena es numérica
        PREFIJO = '';
        PARTE_NUMERICA = CADENA;
    END
    
    -- Eliminar ceros a la izquierda de la parte numérica
    IF (PARTE_NUMERICA <> '') THEN
    BEGIN
        BEGIN
            NUMERO = CAST(CAST(PARTE_NUMERICA AS BIGINT) AS VARCHAR(8));
        WHEN ANY DO
            -- Si falla la conversión, devolver la parte numérica tal cual
            NUMERO = PARTE_NUMERICA;
        END
    END
    ELSE
    BEGIN
        NUMERO = '';
    END
    
    SUSPEND;
END^

SET TERM ; ^

GRANT EXECUTE ON PROCEDURE SEPARAR_PREFIJO_NUMERO TO PUBLIC;
SET TERM ^ ;

CREATE OR ALTER procedure CONTABIL_FACTCOMP (
    IDDOC integer,
    IDINTER integer)
returns (
    ERROR integer,
    VER char(1),
    IDC integer)
as
declare variable PREFIJO varchar(4);
declare variable NUM varchar(6);
declare variable NUMERO varchar(10);
declare variable FECAUX date;
declare variable FECHA char(8);
declare variable CONCEPTO char(60);
declare variable VENCEAUX date;
declare variable VENCE char(8);
declare variable VRDTO numeric(18,2);
declare variable VRADIC numeric(18,2);
declare variable VRSUBT numeric(18,2);
declare variable VRIVA numeric(18,2);
declare variable PRTFTE numeric(9,2);
declare variable VRRTFTE numeric(18,2);
declare variable VRRTIVA numeric(18,2);
declare variable PRTICA numeric(9,2);
declare variable VRRTICA numeric(18,2);
declare variable PRCREE numeric(9,2);
declare variable VRRCREE numeric(18,2);
declare variable VRTOTAL numeric(18,2);
declare variable VREXTRA numeric(18,2);
declare variable TIPOCOMP varchar(3);
declare variable PREFCONT varchar(4);
declare variable INVEN char(1);
declare variable CTAINVEN varchar(20);
declare variable IVA char(1);
declare variable CTAIVA varchar(20);
declare variable CONSUMO char(1);
declare variable CTACONSUMO varchar(20);
declare variable ICOINC char(2);
declare variable CXP char(1);
declare variable CTACXP varchar(20);
declare variable RTFTE char(1);
declare variable CTARTFTE varchar(20);
declare variable RTIVA char(1);
declare variable CTARTIVA varchar(20);
declare variable RTICA char(1);
declare variable CTARTICA varchar(20);
declare variable RCREE char(1);
declare variable CTARCREE varchar(20);
declare variable CTADTO varchar(20);
declare variable CTAADIC varchar(20);
declare variable CTAEXTRA varchar(20);
declare variable EXISTE char(1);
declare variable CUENTA varchar(20);
declare variable MONTO numeric(18,2);
declare variable TIPOCUEN char(1);
declare variable NIT varchar(20);
declare variable NOMBRE varchar(60);
declare variable PROY varchar(4);
declare variable CENTRO varchar(4);
declare variable SUBCEN varchar(4);
declare variable PROYDET varchar(4);
declare variable CENTRODET varchar(4);
declare variable SUBCENDET varchar(4);
declare variable PORC numeric(5,2);
declare variable NUMITEMS integer;
declare variable ARTICULO varchar(15);
declare variable IMPINC char(1);
declare variable IMPTOS numeric(18,2);
declare variable SUMA numeric(18,2);
declare variable PORCIVA numeric(9,2);
declare variable TCTAPROV varchar(20);
declare variable TCTARTFTE varchar(20);
declare variable TCTARTIVA varchar(20);
declare variable TCTARTICA varchar(20);
declare variable TCTARCREE varchar(20);
declare variable CUENTAADIC varchar(20);
declare variable BASEADIC varchar(20);
declare variable PORCADIC numeric(5,2);
declare variable VALORADIC numeric(18,2);
declare variable DBADIC char(1);
declare variable FOMENTO char(1);
declare variable BODE_DET char(2);
declare variable NUMPROV varchar(10);
declare variable MERCANCIA numeric(18,2);
declare variable FACTOR double precision;
declare variable MENORV char(2);
declare variable DIG integer;
declare variable NETO numeric(18,2);
declare variable CENT char(1);
declare variable ANULADO char(1);
declare variable ERRORC integer;
declare variable SIMP char(1);
declare variable CTAIVARS varchar(20);
declare variable CTAFOMENTO varchar(20);
declare variable DEGUELLO numeric(18,2);
declare variable CTADEGUELLO varchar(20);
declare variable TOTIMPBA numeric(18,2);
declare variable TOTIMPUP numeric(18,2);
declare variable ISINC char(2);
declare variable IMPBA numeric(18,2);
declare variable IMPUP numeric(18,2);
declare variable AUTORIZA VARCHAR(30);
declare variable PREFE VARCHAR(4);
declare variable NUME INTEGER;
begin
  /* INTERFACE */
  EXISTE = 'N';
  select 'S', TICO_COD, PRCO_PRE, INCO_INVEN, INCO_IVA, INCO_CONSUMO, INCO_CXP, INCO_RTFTE, INCO_RTIVA, INCO_RTICA, INCO_RTCREE, INCO_CTAINVEN, INCO_CTAIVA, INCO_CTACONSUMO, INCO_CTADTO, INCO_CTAADIC, INCO_CTAEXTRA, INCO_CTACXP, INCO_CTARTFTE, INCO_CTARTIVA, INCO_CTARTICA, INCO_CTARTCREE, INCO_CONFIRMAR, INCO_CENTRO, INCO_FOMENTO, INCO_CTAFOMENTO
    from INTERFAZ_COMPRAS where INCO_ID = :IDINTER into :EXISTE, :TIPOCOMP, :PREFCONT, :INVEN, :IVA, :CONSUMO, :CXP, :RTFTE, :RTIVA, :RTICA, :RCREE, :CTAINVEN, :CTAIVA, :CTACONSUMO, :CTADTO, :CTAADIC, :CTAEXTRA, :CTACXP, :CTARTFTE, :CTARTIVA, :CTARTICA, :CTARCREE, :VER, :CENT, :FOMENTO, :ctafomento;
  if (EXISTE = 'S') then
    begin
    /* BORRE CONTABILIZACION PREVIA */
    delete from CONTABILIZACION where CNTB_TIPOREF = 21 and CNTB_IDREF = :IDDOC;
    /* ENCABEZADO DE LA FACTURA */
    select PREF_PRE, FACO_NUMERO, FACO_FECHA, F.TERC_NIT, FACO_IMPTOS, FACO_VENCE, FACO_DTOMONTO, FACO_ADICIONAL, FACO_IVAMONTO, FACO_EXTRA, FACO_TOTAL, FACO_RTFTEPORC, FACO_RTFTEMONTO,
        FACO_RTIVAPOR, FACO_RTIVAMONTO, FACO_RTICAPOR, FACO_RTICAMONTO, FACO_RTCREE, FACO_RTCREEM, TERC_NOM, PROV_CTARTFTE, PROV_CTARTIVA, PROV_CTARTICA, PROV_CTARTCREE, PROV_CTAPAGAR,
        FACO_NUMPROV, FACO_ANULADO, FACO_SIMPLIFICADO, FACO_DEGUELLO, FACO_IMPBA, FACO_IMPUP, IIF(faco_auto IS NULL, '', FACO_AUTO)
        from FACTURAS_COMPRA F, TERCEROS T, PROVEEDORES P where FACO_ID = :IDDOC and F.TERC_NIT = T.TERC_NIT and T.TERC_NIT = P.TERC_NIT
        into :PREFIJO, :NUM, :FECAUX, :NIT, :IMPINC, :VENCEAUX, :VRDTO, :VRADIC, :VRIVA, :VREXTRA, :VRTOTAL, :PRTFTE, :VRRTFTE,
        :PORC, :VRRTIVA, :PRTICA, :VRRTICA, :PRCREE, :VRRCREE, :NOMBRE, TCTARTFTE, TCTARTIVA, TCTARTICA, TCTARCREE, TCTAPROV, :NUMPROV, :ANULADO, :SIMP, :DEGUELLO, :TOTIMPBA, :TOTIMPUP, :autoriza;
    if (AUTORIZA <> '') then
        BEGIN
        PREFE = PREFIJO;
        NUME = CAST(:num AS INTEGER);
        END
    ELSE
        BEGIN
        execute procedure SEPARAR_PREFIJO_NUMERO(:NUMPROV) returning_values :PREFE, :NUME;
        END
    /* CENTRO DE LA BODEGA */
    if (CENT = 'B') then
        select BODE_CENTRO, BODE_PROY, BODE_SUBC from BODEGA B, FACTURAS_COMPRA F where B.BODE_COD = F.BODE_COD and F.FACO_ID = :IDDOC into :CENTRO, :PROY, :SUBCEN;
    else
        select PREF_CENTRO,PREF_PROY, PREF_SUBC  from PREFIJOS P, FACTURAS_COMPRA F where P.PREF_PRE = F.PREF_PRE and F.FACO_ID = :IDDOC and P.TIDO_COD = 21 into :CENTRO, :PROY, :SUBCEN;
    if (ANULADO = 'N') then
        begin
        NUMERO = PREFIJO || NUM;
        VRSUBT = VRTOTAL - VREXTRA - VRIVA - totimpba - totimpup;
        MERCANCIA = VRSUBT - VRADIC + VRDTO;
        execute procedure FECHA_A_CONTA(:FECAUX) returning_values (:FECHA);
        execute procedure FECHA_A_CONTA(:VENCEAUX) returning_values (:VENCE);
        if (NUMPROV is null) then
            NUMPROV = NUMERO;
        CONCEPTO = 'FC No.' || NUMERO || '-' || SUBSTR(NOMBRE,1,26) || '-NPROV.' || NUMPROV;
        IDC = gen_id(ID_CONTABILIZA, 1);
        insert into CONTABILIZACION (CNTB_ID, CNTB_TIPOCOMP, CNTB_PREFCNT, CNTB_NUMERO, CNTB_FECHA, CNTB_CONCEPTO, CNTB_REF, CNTB_TIPOREF, CNTB_IDREF, CNTB_PREFREF, CNTB_NUMREF, CNTB_PROCESADO)
            values (:IDC, :TIPOCOMP, :PREFCONT, :NUM, :FECHA, :CONCEPTO, '', 21, :IDDOC, :PREFIJO, :NUM, 'N');
        NUMITEMS = 0;
        SUMA = 0;
        NETO = 0;
        ERROR = 0;
        execute procedure lee_configuracion('COMPRAS', 'FACTURAS', 'CUENTA CONTABLE PARA IMPUESTO AL DEGUELLO DE GANADO') returning_values (:ctadeguello);
        execute procedure lee_configuracion('COMPRAS','FACTURAS','CUENTA DE IVA ASUMIDO POR COMPRAS AL REGIMEN SIMPLIFICADO') returning_values (:CTAIVARS);
        execute procedure lee_configuracion('COMPRAS','FACTURAS','DESCUENTO Y VALOR ADICIONAL DEL DOCUMENTO COMO MENOR VALOR DEL COSTO') returning_values (:MENORV);
        EXECUTE PROCEDURE lee_configuracion ('INVENTARIO', 'ARTICULOS', 'IMPOCONSUMO COMO MAYOR VALOR DEL COSTO') returning_values(:icoinc);
        EXECUTE PROCEDURE lee_configuracion ('COMPRAS', 'DOCUMENTOS', 'LLEVAR IMPUESTOS SALUDABLES COMO MAYOR VALOR DEL COSTO DEL INVENTARIO') returning_values(:isinc);
        select sum(FCDE_consumo) from facturas_compras_detalle where faco_id = :IDDOC into :valoradic;
        if (MENORV = 'SI') then
            if (MERCANCIA <> 0) then
                FACTOR = (cast(VRSUBT as double precision) - VALORADIC) / (cast(MERCANCIA as double precision) - VALORADIC);
            else
                FACTOR = 1;
        else
           FACTOR = 1;
        select cast(CONF_VALOR as integer) from CONFIGURACION where CONF_MODULO = 'COMPRAS' and CONF_CATEGORIA = 'DOCUMENTOS' and CONF_PROPIEDAD = 'REDONDEO AL MULTIPLO DE DIEZ EN TOTALES' into :DIG;
        if (INVEN = 'A') then
            begin
            for select max(COAR_CTACOMP), sum(cast(FCDE_CANT as double precision) * (FCDE_PRUNIT-FCDE_DTOMONTO)), sum(FCDE_IVAMONTO), sum(FCDE_CONSUMO), SUM(FCDE_IMPUP), SUM(FCDE_IMPBA), max(F.BODE_COD)
                from ARTICULO A, CONTABIL_ARTICULO C, FACTURAS_COMPRAS_DETALLE F where F.FACO_ID = :IDDOC and F.ARTI_COD = A.ARTI_COD and A.ARTI_COD = C.ARTI_COD
                group by COAR_CTACOMP, F.BODE_COD into :CTAINVEN, :MONTO, :IMPTOS, :VALORADIC, :IMPUP, :IMPBA, :BODE_DET do
                begin
                if (CENT = 'B') then
                  select BODE_CENTRO, BODE_PROY, BODE_SUBC from BODEGA where BODE_COD = :BODE_DET into :CENTRODET, :PROYDET, :subcendet;
                if (IMPINC = 'S') then
                    begin
                    MONTO = MONTO - IMPTOS;
                    MONTO = MONTO - VALORADIC;
                    end
                if (isinc <> 'SI') then
                    MONTO = MONTO - IMPBA - IMPUP;
                if (ICOINC = 'SI') then
                    MONTO = MONTO + VALORADIC;
                MONTO = MONTO * FACTOR;
                execute procedure redondee(MONTO, DIG) returning_values (MONTO);
                execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
                execute procedure CUENTA_INTERFAZ(21, :IDDOC, :CTAINVEN, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (TIPOCUEN = 'I') then
                    begin
                    for select F.ARTI_COD, (FCDE_CANT * (FCDE_PRUNIT-FCDE_DTOMONTO)), FCDE_IVAMONTO, FCDE_CONSUMO
                        from ARTICULO A, CONTABIL_ARTICULO C, FACTURAS_COMPRAS_DETALLE F where F.FACO_ID = :IDDOC and F.ARTI_COD = A.ARTI_COD and A.ARTI_COD = C.ARTI_COD and COAR_CTACOMP = :CUENTA
                        into :ARTICULO, :MONTO, :IMPTOS, :VALORADIC do
                        begin
                        if (IMPINC = 'S') then
                            begin
                            MONTO = MONTO - IMPTOS;
                            MONTO = MONTO - VALORADIC;
                            end
                        if (ICOINC = 'SI') then
                            MONTO = MONTO + VALORADIC;
                        MONTO = MONTO * FACTOR;
                        execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
                        execute procedure redondee(MONTO, DIG) returning_values (MONTO);
                        if (CENT = 'B') then
                           insert into CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC,
                                CNDE_PROY, CNDE_CENTRO, CNDE_SUBC, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON, CNDE_PREF, CNDE_FOLIOE)
                               values (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :MONTO, 0, 0, 0, :NIT,
                                :PROYDET, :CENTRODET, :SUBCENDET, :ARTICULO, 0, 0, :prefe, :nume);
                        else
                           insert into CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC,
                               CNDE_PROY, CNDE_CENTRO, CNDE_SUBC, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON, CNDE_PREF, CNDE_FOLIOE)
                               values (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :MONTO, 0, 0, 0, :NIT,
                               :PROY, :CENTRO, :SUBCEN, :ARTICULO, 0, 0, :prefe, :nume);
                        NUMITEMS = NUMITEMS + 1;
                        NETO = NETO + MONTO;
                        end
                    end
                if (TIPOCUEN = 'C') then
                    begin
                    if (CENT = 'B') then
                       insert into CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_SUBC, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_DOCTIPOA, CNDE_DOCTIPON, CNDE_PREF, CNDE_FOLIOE)
                           values (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :MONTO, 0, 0, 0, :NIT, :PROYDET, :CENTRODET, :SUBCENDET, :NUMERO, null, :VENCE, 0, 21, :prefe, :nume);
                    else
                       insert into CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_SUBC, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_DOCTIPOA, CNDE_DOCTIPON, CNDE_PREF, CNDE_FOLIOE)
                           values (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, :SUBCEN, :NUMERO, null, :VENCE, 0, 21, :prefe, :nume);
                    NUMITEMS = NUMITEMS + 1;
                    NETO = NETO + MONTO;
                    end
                if (TIPOCUEN = 'N') then
                    begin
                    if (CENT = 'B') then
                       insert into CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_SUBC, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON, CNDE_PREF, CNDE_FOLIOE)
                           values (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :MONTO, 0, 0, 0, :NIT, :PROYDET, :CENTRODET, :subcendet, null, null, null, null, 0, 0, :prefe, :nume);
                    else
                       insert into CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_SUBC, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON, CNDE_PREF, CNDE_FOLIOE)
                           values (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, :SUBCEN, null, null, null, null, 0, 0, :prefe, :nume);
                    NUMITEMS = NUMITEMS + 1;
                    NETO = NETO + MONTO;
                    end
                end
            end
        if (INVEN = 'K') then
            begin
            for select sum(cast(FCDE_CANT as double precision) * (FCDE_PRUNIT-FCDE_DTOMONTO)), sum(FCDE_IVAMONTO), sum(FCDE_CONSUMO), SUM(FCDE_IMPUP), SUM(FCDE_IMPBA), max(BODE_COD)
                from FACTURAS_COMPRAS_DETALLE where FACO_ID = :IDDOC group by BODE_COD into :MONTO, :IMPTOS, :VALORADIC, :IMPUP, :IMPBA, :BODE_DET do
                begin
                  if (CENT = 'B') then
                    select BODE_CENTRO, BODE_PROY, BODE_SUBC from BODEGA where BODE_COD = :BODE_DET into :CENTRODET, :PROYDET, :subcendet;
                  if (IMPINC = 'S') then
                   begin
                    MONTO = MONTO - IMPTOS;
                    MONTO = MONTO - VALORADIC;
                   end
                if (isinc <> 'SI') then
                    MONTO = MONTO - IMPBA - IMPUP;
                  if (ICOINC = 'SI') then
                    MONTO = MONTO + VALORADIC;
                  MONTO = MONTO * FACTOR;
                  execute procedure redondee(MONTO, DIG) returning_values (MONTO);
                  execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
                  execute procedure CUENTA_INTERFAZ(21, :IDDOC, :CTAINVEN, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                  if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                  if (TIPOCUEN = 'C') then
                   begin
                    if (CENT = 'B') then
                       insert into CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_SUBC, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_DOCTIPOA, CNDE_DOCTIPON, CNDE_PREF, CNDE_FOLIOE)
                         values (:IDC, :NUMITEMS, :CTAINVEN, :CONCEPTO, '', :MONTO, 0, 0, 0, :NIT, :PROYDET, :CENTRODET, :SUBCENDET, :NUMERO, null, :VENCE, 0, 21, :prefe, :nume);
                    else
                       insert into CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_SUBC, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_DOCTIPOA, CNDE_DOCTIPON, CNDE_PREF, CNDE_FOLIOE)
                         values (:IDC, :NUMITEMS, :CTAINVEN, :CONCEPTO, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, :SUBCEN, :NUMERO, null, :VENCE, 0, 21, :prefe, :nume);
                    NUMITEMS = NUMITEMS + 1;
                    NETO = NETO + MONTO;
                   end
                  if (TIPOCUEN = 'N') then
                   begin
                    if (CENT = 'B') then
                       insert into CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_SUBC, CNDE_DOCTIPOA, CNDE_DOCTIPON, CNDE_PREF, CNDE_FOLIOE)
                          values (:IDC, :NUMITEMS, :CTAINVEN, :CONCEPTO, '', :MONTO, 0, 0, 0, :NIT, :PROYDET, :CENTRODET, :SUBCENDET, 0, 0, :prefe, :nume);
                    else
                       insert into CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_SUBC, CNDE_DOCTIPOA, CNDE_DOCTIPON, CNDE_PREF, CNDE_FOLIOE)
                          values (:IDC, :NUMITEMS, :CTAINVEN, :CONCEPTO, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, :SUBCEN, 0, 0, :prefe, :nume);
                    NUMITEMS = NUMITEMS + 1;
                    NETO = NETO + MONTO;
                   end
                end
            end
        /* EL IVA */
        if ((IVA = 'A') and ((SIMP = 'N') or (ctaivars = ''))) then
            begin
            for select max(COAR_CTAIVAC), sum(FCDE_IVAMONTO), sum(FCDE_TOTAL-FCDE_IVAMONTO-FCDE_CONSUMO-FCDE_IMPBA-FCDE_IMPUP), sum(FCDE_CONSUMO)
                from ARTICULO A, CONTABIL_ARTICULO C, FACTURAS_COMPRAS_DETALLE F
                where F.FACO_ID = :IDDOC and F.ARTI_COD = A.ARTI_COD and A.ARTI_COD = C.ARTI_COD and FCDE_IVAMONTO <> 0
                group by COAR_CTAIVAC
                into :CTAIVA, :IMPTOS, :MONTO, :VALORADIC do
              if (IMPTOS <> 0) then
                begin
                if (MERCANCIA <> 0) then
                    IMPTOS = CAST(IMPTOS AS DOUBLE PRECISION) * VRSUBT / MERCANCIA;
                else
                    IMPTOS = 0;
                if (IMPINC = 'S') then
                    begin
                    MONTO = MONTO - IMPTOS;
                    MONTO = MONTO - VALORADIC;
                    end
                if (MERCANCIA <> 0) then
                    MONTO = cast(MONTO as double precision) * VRSUBT / MERCANCIA;
                else
                    MONTO = 0;
                execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
                execute procedure redondee(MONTO, DIG) returning_values (MONTO);
                execute procedure CUENTA_INTERFAZ(21, :IDDOC, :CTAIVA, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (TIPOCUEN = 'I') then
                    begin
                    for select F.ARTI_COD, FCDE_IVAMONTO, (FCDE_CANT * (FCDE_PRUNIT-FCDE_DTOMONTO)), TAIV_PORC, FCDE_CONSUMO
                        from ARTICULO A, CONTABIL_ARTICULO C, FACTURAS_COMPRAS_DETALLE F, TARIFA_IVA T where F.FACO_ID = :IDDOC and F.ARTI_COD = A.ARTI_COD and A.ARTI_COD = C.ARTI_COD and COAR_CTAIVAV = :CUENTA and A.TAIV_COD = T.TAIV_COD
                        into :ARTICULO, :IMPTOS, :MONTO, :PORCIVA, :VALORADIC
                    do
                        begin
                        if (MERCANCIA <> 0) then
                            IMPTOS = cast(IMPTOS as double precision) * VRSUBT / MERCANCIA;
                        else
                            IMPTOS = 0;
                        if (IMPINC = 'S') then
                            begin
                            MONTO = MONTO - IMPTOS;
                            MONTO = MONTO - VALORADIC;
                            end
                        if (MERCANCIA <> 0) then
                            MONTO = cast(MONTO as double precision) * VRSUBT / MERCANCIA;
                        else
                            MONTO = 0;
                        execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
                        execute procedure redondee(MONTO, DIG) returning_values (MONTO);
                        insert into CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_SUBC, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON, CNDE_PREF, CNDE_FOLIOE)
                            values (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :IMPTOS, 0, :MONTO, :PORCIVA, :NIT, :PROY, :CENTRO, :SUBCEN, null, null, null, :ARTICULO, 0, 0, :prefe, :nume);
                        NUMITEMS = NUMITEMS + 1;
                        NETO = NETO + IMPTOS;
                        end
                    end
                if (TIPOCUEN = 'C') then
                    begin
                    insert into CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_SUBC, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_DOCTIPOA, CNDE_DOCTIPON, CNDE_PREF, CNDE_FOLIOE)
                        values (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :IMPTOS, 0, :MONTO, :IMPTOS*100/:MONTO, :NIT, :PROY, :CENTRO, :SUBCEN, :NUMERO, null, :VENCE, 0, 21, :prefe, :nume);
                    NUMITEMS = NUMITEMS + 1;
                    NETO = NETO + IMPTOS;
                    end
                if (TIPOCUEN = 'N') then
                    begin
                    insert into CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_SUBC, CNDE_DOCTIPOA, CNDE_DOCTIPON, CNDE_PREF, CNDE_FOLIOE)
                        values (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :IMPTOS, 0, :MONTO, cast(:IMPTOS as double precision)*100/cast(:MONTO as double precision), :NIT, :PROY, :CENTRO, :SUBCEN, 0, 0, :prefe, :nume);
                    NUMITEMS = NUMITEMS + 1;
                    NETO = NETO + IMPTOS;
                    end
                end
            end
        if ((IVA = 'K') or ((SIMP = 'S') and (ctaivars <> ''))) then  /* IVA EN CTA CONSTANTE */
            begin
            select sum(FCDE_IVAMONTO), sum(FCDE_TOTAL-FCDE_IVAMONTO-FCDE_CONSUMO-FCDE_IMPBA-FCDE_IMPUP), sum(FCDE_CONSUMO)
                from FACTURAS_COMPRAS_DETALLE F
                where F.FACO_ID = :IDDOC  and FCDE_IVAMONTO <> 0
                into :IMPTOS, :MONTO, :VALORADIC;
            if (IMPTOS <> 0) then
                begin
                if (SIMP = 'S') then
                    CTAIVA = ctaivars;
                if (MERCANCIA <> 0) then
                    IMPTOS = cast(IMPTOS as double precision) * VRSUBT / MERCANCIA;
                else
                    IMPTOS = 0;
                if (IMPINC = 'S') then
                    begin
                    MONTO = MONTO - IMPTOS;
                    MONTO = MONTO - VALORADIC;
                    end
                if (MERCANCIA <> 0) then
                    MONTO = cast(MONTO as double precision) * VRSUBT / MERCANCIA;
                else
                    MONTO = 0;
                execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
                execute procedure redondee(MONTO, DIG) returning_values (MONTO);
                execute procedure CUENTA_INTERFAZ(21, :IDDOC, :CTAIVA, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (TIPOCUEN = 'C') then
                    begin
                    insert into CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_SUBC, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_DOCTIPOA, CNDE_DOCTIPON, CNDE_PREF, CNDE_FOLIOE)
                        values (:IDC, :NUMITEMS, :CTAIVA, :CONCEPTO, '', :IMPTOS, 0, :MONTO, :IMPTOS*100/:MONTO, :NIT, :PROY, :CENTRO, :SUBCEN, :NUMERO, null, :VENCE, 0, 21, :prefe, :nume);
                    NUMITEMS = NUMITEMS + 1;
                    NETO = NETO + IMPTOS;
                    end
                if (TIPOCUEN = 'N') then
                    begin
                    insert into CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_SUBC, CNDE_DOCTIPOA, CNDE_DOCTIPON, CNDE_PREF, CNDE_FOLIOE)
                        values (:IDC, :NUMITEMS, :CTAIVA, :CONCEPTO, '', :IMPTOS, 0, :MONTO, :IMPTOS*100/:MONTO, :NIT, :PROY, :CENTRO, :SUBCEN, 0, 0, :prefe, :nume);
                    NUMITEMS = NUMITEMS + 1;
                    NETO = NETO + IMPTOS;
                    end
                end
            end
        /* EL IMPOCONSUMO */
        if ((CONSUMO = 'A') AND (ICOINC <> 'SI')) then
            begin
            for select max(COAR_CTACONS), sum(FCDE_CONSUMO) from ARTICULO A, CONTABIL_ARTICULO C, FACTURAS_COMPRAS_DETALLE F
                where F.FACO_ID = :IDDOC and F.ARTI_COD = A.ARTI_COD and A.ARTI_COD = C.ARTI_COD group by COAR_CTACONS into :CTACONSUMO, :IMPTOS
            do
              if (IMPTOS <> 0) then
                begin
                execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
                execute procedure CUENTA_INTERFAZ(21, :IDDOC, :CTACONSUMO, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (TIPOCUEN = 'I') then
                    begin
                    for select F.ARTI_COD, FCDE_CONSUMO from ARTICULO A, FACTURAS_COMPRAS_DETALLE F where F.FACO_ID = :IDDOC into :ARTICULO, :IMPTOS
                        do
                        begin
                        if (IMPTOS <> 0) then
                            begin
                            execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
                            insert into CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_SUBC, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON, CNDE_PREF, CNDE_FOLIOE)
                                values (:IDC, :NUMITEMS, :CTACONSUMO, :CONCEPTO, '', :IMPTOS, 0, 0, 0, :NIT, :PROY, :CENTRO, :SUBCEN, :ARTICULO, 0, 0, :prefe, :nume);
                            NUMITEMS = NUMITEMS + 1;
                            NETO = NETO + IMPTOS;
                            end
                        end
                    end
                if (TIPOCUEN = 'C') then
                    begin
                    insert into CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_SUBC, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_DOCTIPOA, CNDE_DOCTIPON, CNDE_PREF, CNDE_FOLIOE)
                        values (:IDC, :NUMITEMS, :CTACONSUMO, :CONCEPTO, '', :IMPTOS, 0, 0, 0, :NIT, :PROY, :CENTRO, :SUBCEN, :NUMERO, null, :VENCE, 0, 21, :prefe, :nume);
                    NUMITEMS = NUMITEMS + 1;
                    NETO = NETO + IMPTOS;
                    end
                if (TIPOCUEN = 'N') then
                    begin
                    insert into CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_SUBC, CNDE_DOCTIPOA, CNDE_DOCTIPON, CNDE_PREF, CNDE_FOLIOE)
                        values (:IDC, :NUMITEMS, :CTACONSUMO, :CONCEPTO, '', :IMPTOS, 0, 0, 0, :NIT, :PROY, :CENTRO, :SUBCEN, 0, 0, :prefe, :nume);
                    NUMITEMS = NUMITEMS + 1;
                    NETO = NETO + IMPTOS;
                    end
                end
            end
        if ((CONSUMO = 'K') AND (ICOINC <> 'SI')) then
            begin
            select sum(FCDE_CONSUMO) from FACTURAS_COMPRAS_DETALLE F where F.FACO_ID = :IDDOC into :IMPTOS;
            if (IMPTOS <> 0) then
                begin
                execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
                /* TRAIGA LAS CARACTERISTICAS DE LA CUENTA */
                execute procedure CUENTA_INTERFAZ(21, :IDDOC, :CTACONSUMO, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                /* DEPENDE DEL TIPO DE CUENTA */
                if (TIPOCUEN = 'I') then
                    begin
                    /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                    for select F.ARTI_COD, FCDE_CONSUMO from ARTICULO A, FACTURAS_COMPRAS_DETALLE F where F.FACO_ID = :IDDOC into :ARTICULO, :IMPTOS
                        do
                        begin
                        if (IMPTOS <> 0) then
                            begin
                            execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
                            insert into CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_SUBC, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON, CNDE_PREF, CNDE_FOLIOE)
                                values (:IDC, :NUMITEMS, :CTACONSUMO, :CONCEPTO, '', :IMPTOS, 0, 0, 0, :NIT, :PROY, :CENTRO, :SUBCEN, :ARTICULO, 0, 0, :prefe, :nume);
                            NUMITEMS = NUMITEMS + 1;
                            NETO = NETO + IMPTOS;
                            end
                        end
                    end
                if (TIPOCUEN = 'C') then
                    begin
                    /* INSERTE EL REGISTRO DE LA BASE */
                    insert into CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_SUBC, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_DOCTIPOA, CNDE_DOCTIPON, CNDE_PREF, CNDE_FOLIOE)
                        values (:IDC, :NUMITEMS, :CTACONSUMO, :CONCEPTO, '', :IMPTOS, 0, 0, 0, :NIT, :PROY, :CENTRO, :SUBCEN, :NUMERO, null, :VENCE, 0, 21, :prefe, :nume);
                    NUMITEMS = NUMITEMS + 1;
                    NETO = NETO + IMPTOS;
                    end
                if (TIPOCUEN = 'N') then
                    begin
                    insert into CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_SUBC, CNDE_DOCTIPOA, CNDE_DOCTIPON, CNDE_PREF, CNDE_FOLIOE)
                        values (:IDC, :NUMITEMS, :CTACONSUMO, :CONCEPTO, '', :IMPTOS, 0, 0, 0, :NIT, :PROY, :CENTRO, :SUBCEN, 0, 0, :prefe, :nume);
                    NUMITEMS = NUMITEMS + 1;
                    NETO = NETO + IMPTOS;
                    end
                end
            end
        /* EL FOMENTO */
        if (FOMENTO = 'A') then
            begin
            for select max(COAR_CTAFOMENTO), sum(FCDE_FOMM) from ARTICULO A, CONTABIL_ARTICULO C, FACTURAS_COMPRAS_DETALLE F
                where F.FACO_ID = :IDDOC and F.ARTI_COD = A.ARTI_COD and A.ARTI_COD = C.ARTI_COD group by COAR_CTAFOMENTO into :CTAFOMENTO, :IMPTOS
            do
              if (IMPTOS <> 0) then
                begin
                execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
                execute procedure CUENTA_INTERFAZ(21, :IDDOC, :CTAFOMENTO, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (TIPOCUEN = 'I') then
                    begin
                    for select F.ARTI_COD, FCDE_FOMM from ARTICULO A, FACTURAS_COMPRAS_DETALLE F where F.FACO_ID = :IDDOC into :ARTICULO, :IMPTOS
                        do
                        begin
                        if (IMPTOS <> 0) then
                            begin
                            execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
                            insert into CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_SUBC, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON, CNDE_PREF, CNDE_FOLIOE)
                                values (:IDC, :NUMITEMS, :CTAFOMENTO, :CONCEPTO, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, :SUBCEN, :ARTICULO, 0, 0, :prefe, :nume);
                            NUMITEMS = NUMITEMS + 1;
                            NETO = NETO - IMPTOS;
                            end
                        end
                    end
                if (TIPOCUEN = 'C') then
                    begin
                    insert into CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_SUBC, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_DOCTIPOA, CNDE_DOCTIPON, CNDE_PREF, CNDE_FOLIOE)
                        values (:IDC, :NUMITEMS, :CTAFOMENTO, :CONCEPTO, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, :SUBCEN, :NUMERO, null, :VENCE, 0, 21, :prefe, :nume);
                    NUMITEMS = NUMITEMS + 1;
                    NETO = NETO - IMPTOS;
                    end
                if (TIPOCUEN = 'N') then
                    begin
                    insert into CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_SUBC, CNDE_DOCTIPOA, CNDE_DOCTIPON, CNDE_PREF, CNDE_FOLIOE)
                        values (:IDC, :NUMITEMS, :CTAFOMENTO, :CONCEPTO, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, :SUBCEN, 0, 0, :prefe, :nume);
                    NUMITEMS = NUMITEMS + 1;
                    NETO = NETO - IMPTOS;
                    end
                end
            end
        if (FOMENTO = 'K') then /* CONSUMO EN CTA CONSTANTE */
            begin
            select sum(FCDE_FOMM) from FACTURAS_COMPRAS_DETALLE F where F.FACO_ID = :IDDOC into :IMPTOS;
            if (IMPTOS <> 0) then
                begin
                execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
                /* TRAIGA LAS CARACTERISTICAS DE LA CUENTA */
                execute procedure CUENTA_INTERFAZ(21, :IDDOC, :CTAFOMENTO, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                /* DEPENDE DEL TIPO DE CUENTA */
                if (TIPOCUEN = 'I') then
                    begin
                    /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                    for select F.ARTI_COD, FCDE_CONSUMO from ARTICULO A, FACTURAS_COMPRAS_DETALLE F where F.FACO_ID = :IDDOC into :ARTICULO, :IMPTOS
                        do
                        begin
                        if (IMPTOS <> 0) then
                            begin
                            execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
                            insert into CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_SUBC, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON, CNDE_PREF, CNDE_FOLIOE)
                                values (:IDC, :NUMITEMS, :CTAFOMENTO, :CONCEPTO, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, :SUBCEN, :ARTICULO, 0, 0, :prefe, :nume);
                            NUMITEMS = NUMITEMS + 1;
                            NETO = NETO - IMPTOS;
                            end
                        end
                    end
                if (TIPOCUEN = 'C') then
                    begin
                    /* INSERTE EL REGISTRO DE LA BASE */
                    insert into CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_SUBC, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_DOCTIPOA, CNDE_DOCTIPON, CNDE_PREF, CNDE_FOLIOE)
                        values (:IDC, :NUMITEMS, :CTAFOMENTO, :CONCEPTO, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, :SUBCEN, :NUMERO, null, :VENCE, 0, 21, :prefe, :nume);
                    NUMITEMS = NUMITEMS + 1;
                    NETO = NETO - IMPTOS;
                    end
                if (TIPOCUEN = 'N') then
                    begin
                    insert into CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_SUBC, CNDE_DOCTIPOA, CNDE_DOCTIPON, CNDE_PREF, CNDE_FOLIOE)
                        values (:IDC, :NUMITEMS, :CTAFOMENTO, :CONCEPTO, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, :SUBCEN, 0, 0, :prefe, :nume);
                    NUMITEMS = NUMITEMS + 1;
                    NETO = NETO - IMPTOS;
                    end
                end
            end
        if (isinc <> 'SI') then
            begin
            if (totimpba <> 0) then /* IMP BEBIDAS AZUCARADAS */
                begin
                execute procedure redondee(totimpba, DIG) returning_values (IMPTOS);
    
                /* TRAIGA LAS CARACTERISTICAS DE LA CUENTA */
                EXECUTE PROCEDURE lee_configuracion('COMPRAS', 'FACTURAS', 'CUENTA CONTABLE PARA IMPUESTO EN COMPRAS DE BEBIDAS AZUCARADAS') returning_values (ctafomento);
                execute procedure CUENTA_INTERFAZ(21, :IDDOC, :CTAFOMENTO, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (TIPOCUEN = 'C') then
                    TIPOCUEN = 'N';
                if (TIPOCUEN = 'N') then
                    begin
                    insert into CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_SUBC, CNDE_DOCTIPOA, CNDE_DOCTIPON, CNDE_PREF, CNDE_FOLIOE)
                        values (:IDC, :NUMITEMS, :CTAFOMENTO, :CONCEPTO, '', :IMPTOS, 0, 0, 0, :NIT, :PROY, :CENTRO, :SUBCEN, 0, 0, :prefe, :nume);
                    NUMITEMS = NUMITEMS + 1;
                    NETO = NETO + IMPTOS;
                    end
                end
            if (totimpup <> 0) then /* IMP ULTRAPROCESADOS */
                begin
                execute procedure redondee(totimpup, DIG) returning_values (IMPTOS);
    
                /* TRAIGA LAS CARACTERISTICAS DE LA CUENTA */
                EXECUTE PROCEDURE lee_configuracion('COMPRAS', 'FACTURAS', 'CUENTA CONTABLE PARA IMPUESTO EN COMPRAS DE ALIMENTOS ULTRAPROCESADOS') returning_values (ctafomento);
                execute procedure CUENTA_INTERFAZ(21, :IDDOC, :CTAFOMENTO, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (TIPOCUEN = 'C') then
                    TIPOCUEN = 'N';
                if (TIPOCUEN = 'N') then
                    begin
                    insert into CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_SUBC, CNDE_DOCTIPOA, CNDE_DOCTIPON, CNDE_PREF, CNDE_FOLIOE)
                        values (:IDC, :NUMITEMS, :CTAFOMENTO, :CONCEPTO, '', :IMPTOS, 0, 0, 0, :NIT, :PROY, :CENTRO, :SUBCEN, 0, 0, :prefe, :nume);
                    NUMITEMS = NUMITEMS + 1;
                    NETO = NETO + IMPTOS;
                    end
                end
            end
        /* DESCUENTO */
        if ((CTADTO is not null) and
            (CTADTO <> '')) then
          begin
          execute procedure redondee(VRDTO, DIG) returning_values (VRDTO);
          if (VRDTO <> 0) then
            begin
            /* TRAIGA LAS CARACTERISTICAS DE LA CUENTA */
            execute procedure CUENTA_INTERFAZ(21, :IDDOC, :CTADTO, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'C') then
                begin
                insert into CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_SUBC, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_DOCTIPOA, CNDE_DOCTIPON, CNDE_PREF, CNDE_FOLIOE)
                    values (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :VRDTO, 0, 0, :NIT, :PROY, :CENTRO, :SUBCEN, :NUMERO, null, :VENCE, 0, 21, :prefe, :nume);
                NUMITEMS = NUMITEMS + 1;
                NETO = NETO - VRDTO;
                end
            if (TIPOCUEN = 'N') then
                begin
                /* INSERTE EL REGISTRO DE LA BASE */
                insert into CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_SUBC, CNDE_DOCTIPOA, CNDE_DOCTIPON, CNDE_PREF, CNDE_FOLIOE)
                    values (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :VRDTO, 0, 0, :NIT, :PROY, :CENTRO, :SUBCEN, 0, 0, :prefe, :nume);
                NUMITEMS = NUMITEMS + 1;
                NETO = NETO - VRDTO;
                end
            end
          end
        /* DEGUELLO */
        if ((ctadeguello is not null) and (ctadeguello <> '') and (deguello <> 0)) then
            begin
            /* TRAIGA LAS CARACTERISTICAS DE LA CUENTA */
            execute procedure CUENTA_INTERFAZ(21, :IDDOC, :ctadeguello, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'C') then
                begin
                insert into CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_SUBC, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_DOCTIPOA, CNDE_DOCTIPON, CNDE_PREF, CNDE_FOLIOE)
                    values (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :deguello, 0, 0, :NIT, :PROY, :CENTRO, :SUBCEN, :NUMERO, null, :VENCE, 0, 21, :prefe, :nume);
                NUMITEMS = NUMITEMS + 1;
                NETO = NETO - deguello;
                end
            if (TIPOCUEN = 'N') then
                begin
                /* INSERTE EL REGISTRO DE LA BASE */
                insert into CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_SUBC, CNDE_DOCTIPOA, CNDE_DOCTIPON, CNDE_PREF, CNDE_FOLIOE)
                    values (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :deguello, 0, 0, :NIT, :PROY, :CENTRO, :SUBCEN, 0, 0, :prefe, :nume);
                NUMITEMS = NUMITEMS + 1;
                NETO = NETO - deguello;
                end
            end
        /* VALOR ADIC */
        if ((CTAADIC is not null) and
            (CTAADIC <> '')) then
          begin
          execute procedure redondee(VRADIC, DIG) returning_values (VRADIC);
          if (VRADIC <> 0) then
            begin
            /* TRAIGA LAS CARACTERISTICAS DE LA CUENTA */
            execute procedure CUENTA_INTERFAZ(21, :IDDOC, :CTAADIC, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'C') then
                begin
                insert into CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_SUBC, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_DOCTIPOA, CNDE_DOCTIPON, CNDE_PREF, CNDE_FOLIOE)
                    values (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :VRADIC, 0, 0, 0, :NIT, :PROY, :CENTRO, :SUBCEN, :NUMERO, null, :VENCE, 0, 21, :prefe, :nume);
                NUMITEMS = NUMITEMS + 1;
                NETO = NETO + VRADIC;
                end
            if (TIPOCUEN = 'N') then
                begin
                insert into CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_SUBC, CNDE_DOCTIPOA, CNDE_DOCTIPON, CNDE_PREF, CNDE_FOLIOE)
                    values (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :VRADIC, 0, 0, 0, :NIT, :PROY, :CENTRO, :SUBCEN, 0, 0, :prefe, :nume);
                NUMITEMS = NUMITEMS + 1;
                NETO = NETO + VRADIC;
                end
            end
          end
        /* VALOR EXTRA */
        if ((CTAEXTRA is not null) and
            (CTAEXTRA <> '')) then
          begin
          execute procedure redondee(VREXTRA, DIG) returning_values (VREXTRA);
          if (VREXTRA <> 0) then
            begin
            /* TRAIGA LAS CARACTERISTICAS DE LA CUENTA */
            execute procedure CUENTA_INTERFAZ(21, :IDDOC, :CTAEXTRA, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'C') then
                begin
                if (VREXTRA > 0) then
                    insert into CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_SUBC, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_DOCTIPOA, CNDE_DOCTIPON, CNDE_PREF, CNDE_FOLIOE)
                        values (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :VREXTRA, 0, 0, 0, :NIT, :PROY, :CENTRO, :SUBCEN, :NUMERO, null, :VENCE, 0, 21, :prefe, :nume);
                else
                    insert into CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_SUBC, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON, CNDE_PREF, CNDE_FOLIOE)
                        values (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, (:VREXTRA*-1), 0, 0, :NIT, :PROY, :CENTRO, :SUBCEN, :NUMERO, null, :VENCE, null, 0, 21, :prefe, :nume);
                NUMITEMS = NUMITEMS + 1;
                NETO = NETO + VREXTRA;
                end
            if (TIPOCUEN = 'N') then
                begin
                if (VREXTRA > 0) then
                    insert into CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_SUBC, CNDE_DOCTIPOA, CNDE_DOCTIPON, CNDE_PREF, CNDE_FOLIOE)
                        values (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :VREXTRA, 0, 0, 0, :NIT, :PROY, :CENTRO, :SUBCEN, 0, 0, :prefe, :nume);
                else
                    insert into CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_SUBC, CNDE_DOCTIPOA, CNDE_DOCTIPON, CNDE_PREF, CNDE_FOLIOE)
                        values (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, (:VREXTRA*-1), 0, 0, :NIT, :PROY, :CENTRO, :SUBCEN, 0, 0, :prefe, :nume);
                NUMITEMS = NUMITEMS + 1;
                NETO = NETO + VREXTRA;
                end
            end
          end

        /* DESCUENTE EL IMPOCONSUMO */
        select sum(FCDE_CONSUMO) from FACTURAS_COMPRAS_DETALLE F where F.FACO_ID = :IDDOC into :IMPTOS;
        if (IMPTOS is null) then
            IMPTOS = 0;
        vrsubt = vrsubt - IMPTOS;
        /* RETENCION FUENTE */
        if ((RTFTE = 'P') or (RTFTE = 'K')) then
          begin
          execute procedure redondee(VRRTFTE, DIG) returning_values (VRRTFTE);
          if (VRRTFTE <> 0) then
            begin
            if (RTFTE = 'P') then
                CTARTFTE = TCTARTFTE;
            execute procedure CUENTA_INTERFAZ(21, :IDDOC, :CTARTFTE, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'C') then
                begin
                insert into CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_SUBC, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_DOCTIPOA, CNDE_DOCTIPON, CNDE_PREF, CNDE_FOLIOE)
                    values (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :VRRTFTE, (:VRSUBT*-1), :PRTFTE, :NIT, :PROY, :CENTRO, :SUBCEN, :NUMERO, null, :VENCE, 0, 21, :prefe, :nume);
                NUMITEMS = NUMITEMS + 1;
                NETO = NETO - VRRTFTE;
                SUMA = VRRTFTE;
                end
            if (TIPOCUEN = 'N') then
                begin
                insert into CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_SUBC, CNDE_DOCTIPOA, CNDE_DOCTIPON, CNDE_PREF, CNDE_FOLIOE)
                    values (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :VRRTFTE, (:VRSUBT*-1), :PRTFTE, :NIT, :PROY, :CENTRO, :SUBCEN, 0, 0, :prefe, :nume);
                NUMITEMS = NUMITEMS + 1;
                NETO = NETO - VRRTFTE;
                SUMA = VRRTFTE;
                end
            end
          end
        if ((RTFTE = 'A') AND (vrrtfte <> 0)) then
          begin
          for select max(COAR_CTARTFTE), max(COAR_RTFTE), min(COAR_RTBASE), sum(FCDE_TOTAL-FCDE_IVAMONTO-FCDE_CONSUMO-FCDE_IMPBA-FCDE_IMPUP), sum((FCDE_TOTAL-FCDE_IVAMONTO-FCDE_CONSUMO)*COAR_RTFTE)
            from CONTABIL_ARTICULO C, FACTURAS_COMPRAS_DETALLE F
            where F.faco_id = :IDDOC and F.ARTI_COD = C.ARTI_COD
            group by COAR_CTARTFTE
            into :CTARTFTE, :PRTFTE, :baseadic,  :MONTO, :VRRTFTE
            do
            begin
            MONTO = MONTO * FACTOR * -1;
            if (abs(MONTO) >= :baseadic) then
                begin
                VRRTFTE = VRRTFTE * FACTOR / 100;
                execute procedure redondee(VRRTFTE, DIG) returning_values (VRRTFTE);
                execute procedure redondee(MONTO, DIG) returning_values (MONTO);
                if (VRRTFTE <> 0) then
                    begin
                    execute procedure CUENTA_INTERFAZ(21, :IDDOC, :CTARTFTE, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
                    if (ERRORC <> 0) then
                        ERROR = ERROR + 1;
                    if (TIPOCUEN = 'C') then
                        begin
                        insert into CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_SUBC, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_DOCTIPOA, CNDE_DOCTIPON, CNDE_PREF, CNDE_FOLIOE)
                            values (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :VRRTFTE, :VRSUBT, :PRTFTE, :NIT, :PROY, :CENTRO, :SUBCEN, :NUMERO, null, :VENCE, 0, 21, :prefe, :nume);
                        NUMITEMS = NUMITEMS + 1;
                        NETO = NETO - VRRTFTE;
                        SUMA = VRRTFTE;
                        end
                    if (TIPOCUEN = 'N') then
                        begin
                        insert into CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_SUBC, CNDE_DOCTIPOA, CNDE_DOCTIPON, CNDE_PREF, CNDE_FOLIOE)
                            values (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :VRRTFTE, :VRSUBT, :PRTFTE, :NIT, :PROY, :CENTRO, :SUBCEN, 0, 0, :prefe, :nume);
                        NUMITEMS = NUMITEMS + 1;
                        NETO = NETO - VRRTFTE;
                        SUMA = VRRTFTE;
                        end
                    end
                end
              end
          end
        /* RETENCION IVA */
        if ((RTIVA = 'P') or (RTIVA = 'K')) then
          begin
          execute procedure redondee(VRRTIVA, DIG) returning_values (VRRTIVA);
          if (VRRTIVA <> 0) then
            begin
            if (RTIVA = 'P') then
                CTARTIVA = TCTARTIVA;
            execute procedure CUENTA_INTERFAZ(21, :IDDOC, :CTARTIVA, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            /* SI ES DOCUMENTO EQUIVALENTE */
            if (VRRTIVA = VRIVA) then
                BEGIN
                EXECUTE PROCEDURE LEE_CONFIGURACION('COMPRAS', 'FACTURAS', 'PORCENTAJE DE RETENCION DE IVA PARA REGIMEN SIMPLIFICADO') returning_values (:PORC);
                if (PORC <> 0) then
                    VRIVA = VRRTIVA * 100 / PORC;
                END
            if (TIPOCUEN = 'C') then
                begin
                insert into CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_SUBC, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_DOCTIPOA, CNDE_DOCTIPON, CNDE_PREF, CNDE_FOLIOE)
                    values (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :VRRTIVA, (:VRIVA*-1), :PORC, :NIT, :PROY, :CENTRO, :SUBCEN, :NUMERO, null, :VENCE, 0, 21, :prefe, :nume);
                NUMITEMS = NUMITEMS + 1;
                NETO = NETO - VRRTIVA;
                SUMA = SUMA + VRRTIVA;
                end
            if (TIPOCUEN = 'N') then
                begin
                insert into CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_SUBC, CNDE_DOCTIPOA, CNDE_DOCTIPON, CNDE_PREF, CNDE_FOLIOE)
                    values (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :VRRTIVA, (:VRIVA*-1), :PORC, :NIT, :PROY, :CENTRO, :SUBCEN, 0, 0, :prefe, :nume);
                NUMITEMS = NUMITEMS + 1;
                NETO = NETO - VRRTIVA;
                SUMA = SUMA + VRRTIVA;
                end
            end
          end
        /* RETENCION DE ICA */
        if ((RTICA = 'P') or (RTICA = 'K')) then
          begin
          execute procedure redondee(VRRTICA, DIG) returning_values (VRRTICA);
          if (VRRTICA <> 0) then
            begin
            if (RTICA = 'P') then
                CTARTICA = TCTARTICA;
            execute procedure CUENTA_INTERFAZ(21, :IDDOC, :CTARTICA, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'C') then
                begin
                insert into CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_SUBC, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_DOCTIPOA, CNDE_DOCTIPON, CNDE_PREF, CNDE_FOLIOE)
                    values (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :VRRTICA, (:VRSUBT*-1), :PRTICA, :NIT, :PROY, :CENTRO, :SUBCEN, :NUMERO, null, :VENCE, 0, 21, :prefe, :nume);
                NUMITEMS = NUMITEMS + 1;
                NETO = NETO - VRRTICA;
                SUMA = SUMA + VRRTICA;
                end
            if (TIPOCUEN = 'N') then
                begin
                insert into CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_SUBC, CNDE_DOCTIPOA, CNDE_DOCTIPON, CNDE_PREF, CNDE_FOLIOE)
                    values (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :VRRTICA, (:VRSUBT*-1), :PRTICA, :NIT, :PROY, :CENTRO, :SUBCEN, 0, 0, :prefe, :nume);
                NUMITEMS = NUMITEMS + 1;
                NETO = NETO - VRRTICA;
                SUMA = SUMA + VRRTICA;
                end
            end
          end
        /* RETENCION DE CREE */
        if ((RCREE = 'P') or (RCREE = 'K')) then
          begin
          execute procedure redondee(vrrcree, DIG) returning_values (vrrcree);
          if (vrrcree <> 0) then
            begin
            if (RCREE = 'P') then
                ctarcree = tctarcree;
            execute procedure CUENTA_INTERFAZ(21, :IDDOC, :ctarcree, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'C') then
                begin
                insert into CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_SUBC, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_DOCTIPOA, CNDE_DOCTIPON, CNDE_PREF, CNDE_FOLIOE)
                    values (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :vrrcree, (:VRSUBT*-1), :prcree, :NIT, :PROY, :CENTRO, :SUBCEN, :NUMERO, null, :VENCE, 0, 21, :prefe, :nume);
                NUMITEMS = NUMITEMS + 1;
                NETO = NETO - vrrcree;
                SUMA = SUMA + vrrcree;
                end
            if (TIPOCUEN = 'N') then
                begin
                insert into CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_SUBC, CNDE_DOCTIPOA, CNDE_DOCTIPON, CNDE_PREF, CNDE_FOLIOE)
                    values (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :vrrcree, (:VRSUBT*-1), :prcree, :NIT, :PROY, :CENTRO, :SUBCEN, 0, 0, :prefe, :nume);
                NUMITEMS = NUMITEMS + 1;
                NETO = NETO - vrrcree;
                SUMA = SUMA + vrrcree;
                end
            end
          end
        /* CIERRE EL COMPROBANTE CONTRA LA CUENTA DEL TERCERO O LA CONSTANTE */
        if ((CXP = 'P') or (CXP = 'K')) then
            begin
            SUMA = VRTOTAL - SUMA;
            execute procedure redondee(SUMA, DIG) returning_values (SUMA);
            if (CXP = 'P') then
                CTACXP = TCTAPROV;
            execute procedure CUENTA_INTERFAZ(21, :IDDOC, :CTACXP, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'C') then
                insert into CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_SUBC, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_DOCTIPOA, CNDE_DOCTIPON, CNDE_PREF, CNDE_FOLIOE)
                    values (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :SUMA, 0, 0, :NIT, :PROY, :CENTRO, :SUBCEN, :NUMERO, null, :VENCE, 0, 21, :prefe, :nume);
            if (TIPOCUEN = 'N') then
                insert into CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_SUBC, CNDE_DOCTIPOA, CNDE_DOCTIPON, CNDE_PREF, CNDE_FOLIOE)
                    values (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :SUMA, 0, 0, :NIT, :PROY, :CENTRO, :SUBCEN, 0, 0, :prefe, :nume);
            NETO = NETO - SUMA;
            NUMITEMS = NUMITEMS + 1;
            end
        /* recorra las cuentas adicionales */
        for select INCC_CUENTA, INCC_BASE, INCC_PORC, INCC_VALOR, INCC_DB from INTERFAZ_COMPRAS_CTAS
            where INCO_ID = :IDINTER into :CUENTAADIC, :BASEADIC, :PORCADIC, :VALORADIC, :DBADIC
            do
            begin
            if (VALORADIC <> 0) then
                MONTO = VALORADIC;
            else
                begin
                if (:BASEADIC = 'SUBTOTAL') then
                    VALORADIC = VRTOTAL - VREXTRA - VRIVA - VRADIC + VRDTO;
                if (:BASEADIC = 'DESCUENTO') then
                    VALORADIC = VRDTO;
                if (:BASEADIC = 'IVA') then
                    VALORADIC = VRIVA;
                if (:BASEADIC = 'CONSUMO') then
                    select sum(FCDE_CONSUMO) from FACTURAS_COMPRAS_DETALLE F where F.FACO_ID = :IDDOC into :VALORADIC;
                if (:BASEADIC = 'ADICIONAL') then
                    VALORADIC = VRADIC;
                if (:BASEADIC = 'EXTRA') then
                    VALORADIC = VREXTRA;
                if (:BASEADIC = 'TOTAL') then
                    VALORADIC = VRTOTAL;
                MONTO = cast(VALORADIC as double precision) * PORCADIC / 100;
                end
            if (MONTO <> 0) then
                begin
                execute procedure redondee(MONTO, DIG) returning_values (MONTO);
                execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
                execute procedure CUENTA_INTERFAZ(21, :IDDOC, :CUENTAADIC, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (TIPOCUEN = 'C') then
                    begin
                    if (DBADIC = 'S') then
                        begin
                        insert into CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_SUBC, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_DOCTIPOA, CNDE_DOCTIPON, CNDE_PREF, CNDE_FOLIOE)
                            values (:IDC, :NUMITEMS, :CUENTAADIC, :CONCEPTO, '', :MONTO, 0, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, :SUBCEN, :NUMERO, null, :VENCE, 0, 21, :prefe, :nume);
                        SUMA = SUMA + MONTO;
                        NETO = NETO + MONTO;
                        end
                    else
                        begin
                        insert into CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_SUBC, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_DOCTIPOA, CNDE_DOCTIPON, CNDE_PREF, CNDE_FOLIOE)
                            values (:IDC, :NUMITEMS, :CUENTAADIC, :CONCEPTO, '', 0, :MONTO, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, :SUBCEN, :NUMERO, null, :VENCE, 0, 21, :prefe, :nume);
                        SUMA = SUMA - MONTO;
                        NETO = NETO - MONTO;
                        end
                    NUMITEMS = NUMITEMS + 1;
                    end
                if (TIPOCUEN = 'N') then
                    begin
                    if (DBADIC = 'S') then
                        begin
                        insert into CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_SUBC, CNDE_DOCTIPOA, CNDE_DOCTIPON, CNDE_PREF, CNDE_FOLIOE)
                            values (:IDC, :NUMITEMS, :CUENTAADIC, :CONCEPTO, '', :MONTO, 0, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, :SUBCEN, 0, 0, :prefe, :nume);
                        SUMA = SUMA + MONTO;
                        NETO = NETO + MONTO;
                        end
                    else
                        begin
                        insert into CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_SUBC, CNDE_DOCTIPOA, CNDE_DOCTIPON, CNDE_PREF, CNDE_FOLIOE)
                            values (:IDC, :NUMITEMS, :CUENTAADIC, :CONCEPTO, '', 0, :MONTO, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, :SUBCEN, 0, 0, :prefe, :nume);
                        SUMA = SUMA - MONTO;
                        NETO = NETO - MONTO;
                        end
                    NUMITEMS = NUMITEMS + 1;
                    end
                end
            end
        if (NETO <> 0) then
            begin
            execute procedure lee_configuracion ('CONTABILIDAD','GENERAL','CUENTA PARA CUADRAR COMPROBANTES DESCUADRADOS DE INTERFAZ') returning_values (:ctaadic);
            if (ctaadic <> '') then
                begin
                execute procedure CUENTA_INTERFAZ(21, :IDDOC, :CTAADIC, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (TIPOCUEN = 'C') then
                    begin
                    if (NETO < 0) then
                        begin
                        NETO = NETO * -1;
                        insert into CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_SUBC, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_DOCTIPOA, CNDE_DOCTIPON, CNDE_PREF, CNDE_FOLIOE)
                            values (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :NETO, 0, 0, 0, :NIT, :PROY, :CENTRO, :SUBCEN, :NUMERO, null, :VENCE, 0, 21, :prefe, :nume);
                        end
                    else
                        begin
                        insert into CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_SUBC, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_DOCTIPOA, CNDE_DOCTIPON, CNDE_PREF, CNDE_FOLIOE)
                            values (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :NETO, 0, 0, :NIT, :PROY, :CENTRO, :SUBCEN , :NUMERO, null, :VENCE, 0, 21, :prefe, :nume);
                        end
                    end
                if (TIPOCUEN = 'N') then
                    begin
                    if (NETO < 0) then
                        begin
                        NETO = NETO * -1;
                        insert into CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_SUBC, CNDE_DOCTIPOA, CNDE_DOCTIPON, CNDE_PREF, CNDE_FOLIOE)
                            values (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :NETO, 0, 0, 0, :NIT, :PROY, :CENTRO, :SUBCEN, 0, 0, :prefe, :nume);
                        end
                    else
                        begin
                        insert into CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_SUBC, CNDE_DOCTIPOA, CNDE_DOCTIPON, CNDE_PREF, CNDE_FOLIOE)
                            values (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :NETO, 0, 0, :NIT, :PROY, :CENTRO, :SUBCEN, 0, 0, :prefe, :nume);
                        end
                    end
                end
            end
        end
    if (ERROR > 0) then
        VER = 'S';
    suspend;
    end
else
    begin
    execute PROCEDURE ERRORINT (21, :IDDOC, :PREFIJO, 1);
    ERROR = ERROR + 1;
    VER = 'S';
    suspend;
    end
end^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER procedure CONTABIL_FACTURA_NIIF (
    IDDOC integer,
    IDINTER integer,
    IDC integer)
returns (
    ERROR integer,
    VER char(1))
as
declare variable pref varchar(4);
declare variable num varchar(8);
declare variable numero varchar(12);
declare variable fecaux date;
declare variable conc varchar(60);
declare variable venceaux date;
declare variable vence char(8);
declare variable vrdto numeric(18,2);
declare variable vradic numeric(18,2);
declare variable vrsubt numeric(18,2);
declare variable vriva numeric(18,2);
declare variable prtfte numeric(9,2);
declare variable vrrtfte numeric(18,2);
declare variable vrrtiva numeric(18,2);
declare variable prtica numeric(9,2);
declare variable vrrtica numeric(18,2);
declare variable prcree numeric(9,2);
declare variable vrrcree numeric(18,2);
declare variable vrtotal numeric(18,2);
declare variable vrextra numeric(18,2);
declare variable ventas char(1);
declare variable ctaventas varchar(20);
declare variable iva char(1);
declare variable ctaiva varchar(20);
declare variable consumo char(1);
declare variable ctaconsumo varchar(20);
declare variable cartera char(1);
declare variable ctacartera varchar(20);
declare variable rtfte char(1);
declare variable ctartfte varchar(20);
declare variable rtiva char(1);
declare variable ctartiva varchar(20);
declare variable rtica char(1);
declare variable ctartica varchar(20);
declare variable rcree char(1);
declare variable ctarcree varchar(20);
declare variable inven char(1);
declare variable ctainven varchar(20);
declare variable costos char(1);
declare variable ctacostos varchar(20);
declare variable ctadto varchar(20);
declare variable ctaadic varchar(20);
declare variable ctaextra varchar(20);
declare variable existe char(1);
declare variable cuenta varchar(20);
declare variable monto numeric(18,2);
declare variable tipocuen char(1);
declare variable nit varchar(20);
declare variable nombre varchar(60);
declare variable proy varchar(4);
declare variable centro varchar(4);
declare variable SUBCEN varchar(4);
declare variable proyi varchar(4);
declare variable centi varchar(4);
declare variable subci varchar(4);
declare variable porc numeric(5,2);
declare variable debito numeric(18,2);
declare variable credito numeric(18,2);
declare variable nroi integer;
declare variable imptos numeric(18,2);
declare variable suma numeric(18,2);
declare variable tctaclien varchar(20);
declare variable tctaventa varchar(20);
declare variable tctartfte varchar(20);
declare variable tctartiva varchar(20);
declare variable tctartica varchar(20);
declare variable tctarcree varchar(20);
declare variable ctadic varchar(20);
declare variable baseadic varchar(20);
declare variable porcadic numeric(5,2);
declare variable valoradic numeric(18,2);
declare variable dbadic char(1);
declare variable ptovta integer;
declare variable anulado char(1);
declare variable dig integer;
declare variable mercancia numeric(18,2);
declare variable INALC numeric(18,2);
declare variable DTOXIT varchar(2);
declare variable vrconsumo numeric(18,2);
declare variable factor double precision;
declare variable cent char(1);
declare variable AUTORET VARCHAR(10);
declare variable FAUTORET DATE;
declare variable AUTORCREE VARCHAR(10);
declare variable FAUTORCREE DATE;
declare variable ERRORC INTEGER;
declare variable ICOING CHAR(2);
declare variable NITCONTA VARCHAR(20);
declare variable CNTNIT CHAR(2);
declare variable TERCEXENTO CHAR(1);
BEGIN
EXECUTE PROCEDURE LEE_CONFIGURACION('FACTURACION', 'ARTICULOS', 'IMPOCONSUMO COMO MAYOR VALOR DEL COSTO Y DEL INGRESO') returning_values (ICOING);
EXECUTE PROCEDURE LEE_CONFIGURACION('CONTABILIDAD', 'TERCEROS', 'CONTABILIZAR VENTAS Y RECIBOS DE CAJA CON TERCERO CONTABLE EN LUGAR DEL NIT') returning_values (CNTNIT);
EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'FECHA AUTORETENEDOR NO DESCONTAR RETENCIONES DEL SALDO PERO SI CONTABILIZARLAS') returning_values (AUTORET);
EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'FECHA AUTORETENEDOR DE RETENCION CREE') returning_values (AUTORCREE);
if (AUTORET <> '') then
    FAUTORET = CAST(AUTORET AS DATE);
else
    FAUTORET = '9999/12/31';
if (AUTORCREE <> '') then
    FAUTORCREE = CAST(AUTORCREE AS DATE);
else
    FAUTORCREE = '9999/12/31';
/* BUSQUE LA INTERFACE */
EXISTE = 'N';
SELECT 'S', N.INVE_VENTAS, N.INVE_IVA, N.INVE_CONSUMO, N.INVE_CARTERA, N.INVE_RTFTE, N.INVE_RTIVA, N.INVE_RTICA, N.INVE_RTCREE,
    N.INVE_COSTO, N.INVE_INVEN, N.INVE_CTAVENTAS, N.INVE_CTAIVA, N.INVE_CTACONSUMO, N.INVE_CTADTO, N.INVE_CTAADIC, N.INVE_CTAEXTRA,
    N.INVE_CTACARTERA, N.INVE_CTARTFTE, N.INVE_CTARTIVA, N.INVE_CTARTICA, N.INVE_CTARTCREE, N.INVE_CTAINVEN, N.INVE_CTACOSTOS, INVE_CONFIRMAR, INVE_CENTRO
    FROM interfaz_ventas I, interfaz_ventas_niif N
    WHERE I.inve_id = :IDINTER AND I.inve_id = N.inve_id
    INTO :EXISTE, :VENTAS, :IVA, :CONSUMO, :CARTERA, :RTFTE, :RTIVA, :RTICA, :RCREE,
    :COSTOS, :INVEN, :CTAVENTAS, :CTAIVA, :CTACONSUMO, :CTADTO, :CTAADIC, :CTAEXTRA,
    :CTACARTERA, :CTARTFTE, :CTARTIVA, :CTARTICA, :CTARCREE, :CTAINVEN, :CTACOSTOS, :VER, :CENT;
if (EXISTE = 'S') then
  BEGIN
  /* TRAIGA EL ENCABEZADO DE LA FACTURA */
  SELECT PREF_PRE, FACT_NUMERO, FACT_FECHA, F.TERC_NIT, PTVT_ID, FACT_VENCE, FACT_DTOMONTO, FACT_ADICIONAL, FACT_IVAMONTO,
    FACT_EXTRA, FACT_TOTAL, FACT_RTFTEPOR, FACT_RTFTEMONTO, FACT_RTIVAPOR, FACT_RTIVAMONTO, FACT_RTICAPOR, FACT_RTICAMONTO,
    FACT_RTCREE, FACT_RTCREEM, FACT_NOMCLIENTE, TERC_CTARTFTE, TERC_CTARTIVA, TERC_CTARTICA, TERC_CTARCREE, TERC_CTAVENTA, TERC_CTACLIENTE, FACT_ANULADO, T.terc_nitconta, terc_exento
        FROM FACTURAS F, TERCEROS T
        WHERE FACT_ID = :IDDOC AND F.TERC_NIT = T.TERC_NIT
        INTO :PREF, :NUM, :FECAUX, :NIT, :PTOVTA, :VENCEAUX, :VRDTO, :VRADIC, :VRIVA,
        :VREXTRA, :VRTOTAL, :PRTFTE, :VRRTFTE, :PORC, :VRRTIVA, :PRTICA, :VRRTICA,
        :prcree, :vrrcree, :NOMBRE, TCTARTFTE, TCTARTIVA, TCTARTICA, TCTARCREE, TCTAVENTA, TCTACLIEN, ANULADO, :nitconta, :tercexento;
  if ((CNTNIT = 'SI') AND (NITCONTA IS NOT NULL)) then
    NIT = NITCONTA;
  EXECUTE PROCEDURE FECHA_A_CONTA(:VENCEAUX) returning_values (:VENCE);
  if (ANULADO = 'N') then
    BEGIN
    /* BUSQUE EL CENTRO DEL PUNTO, LA BODEGA, O EL PREFIJO  */
    IF (CENT = 'B') THEN
        SELECT B.BODE_CENTRO, B.BODE_PROY, B.bode_subc FROM BODEGA B, FACTURAS F
            WHERE B.BODE_COD = F.BODE_COD AND F.FACT_ID = :IDDOC INTO :CENTRO, :PROY, :SUBCEN;
    IF (CENT = 'V') THEN
        SELECT S.proy_cod, Z.zona_centro, SZ.subz_subc
            FROM clientes c, sucursales s, zonas z, subzona sz, FACTURAS F
            WHERE C.TERC_NIT = F.terc_nit AND F.FACT_ID = :IDDOC AND C.sucu_id = S.sucu_id AND C.zona_id = Z.zona_id AND Z.zona_id = SZ.zona_id AND C.subz_cod = SZ.subz_cod
            INTO :PROY, :CENTRO, :SUBCEN;
    IF (CENT = 'C') THEN
        SELECT S.proy_cod, CN.cana_scau, Z.zona_centro
            FROM clientes c, sucursales s, zonas z, CANAL CN, FACTURAS F
            WHERE C.TERC_NIT = F.terc_nit AND F.FACT_ID = :IDDOC AND C.sucu_id = S.sucu_id AND C.zona_id = Z.zona_id AND C.clie_canal = CN.cana_cod
            INTO :PROY, :CENTRO, :SUBCEN;
    IF (CENT = 'P') THEN
        SELECT P.PREF_CENTRO,P.PREF_PROY, P.pref_subc  FROM PREFIJOS P, FACTURAS F
            WHERE P.PREF_PRE = F.PREF_PRE AND F.FACT_ID = :IDDOC AND P.TIDO_COD = 31 INTO :CENTRO, :PROY, :SUBCEN;
    NUMERO = PREF || NUM;
    SELECT SUM (FADE_CONSUMO) FROM FACTURAS_DETALLE WHERE FACT_ID = :IDDOC  AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
        INTO MERCANCIA;
    SELECT SUM (FADE_INALCM) FROM FACTURAS_DETALLE WHERE FACT_ID = :IDDOC  AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
        INTO INALC;
    VRSUBT = VRTOTAL - VREXTRA - VRIVA - MERCANCIA - INALC; /* BASE DE RETEFTE Y RETEICA */

    EXECUTE PROCEDURE lee_configuracion ('FACTURACION', 'FACTURAS', 'DESCUENTO PIE FACTURA IGUAL A SUMA DE DESCUENTOS POR ITEM') returning_values (:DTOXIT);
    if (DTOXIT = 'SI') then
        VRDTO = 0;
    MERCANCIA = VRSUBT - VRADIC + VRDTO;
    if (STRLEN(NOMBRE)> 41 ) then
      CONC = 'FV No.' || NUMERO || '-' || SUBSTR(NOMBRE,1,41);
    ELSE
      CONC = 'FV No.' || NUMERO || '-' || NOMBRE;
    NROI = 100000;
    SUMA = 0;
    ERROR = 0;
    DELETE FROM CONTABILIZACION_DET WHERE CNTB_ID = :IDC AND CNDE_ITEM >= :nroi;
    /* SI NO HAY CUENTA DE DESCUENTO NI ADICIONAL CALCULE UN FACTOR PARA LAS VENTAS Y EL IVA */
    if (MERCANCIA <> 0) then
        FACTOR = CAST(VRSUBT AS DOUBLE PRECISION) / CAST(MERCANCIA AS DOUBLE PRECISION);
    ELSE
        FACTOR = 1;
    /* TRAIGA EL NUMERO DE DIGITOS PARA EL REDONDEO */
    SELECT CAST(CONF_VALOR AS INTEGER) FROM CONFIGURACION WHERE CONF_MODULO = 'FACTURACION' AND
        CONF_CATEGORIA = 'GENERAL' AND CONF_PROPIEDAD = 'REDONDEO AL MULTIPLO DE DIEZ EN TOTALES' INTO :DIG;
    if (:tercexento = 'S') then
        BEGIN
        EXECUTE PROCEDURE lee_configuracion('FACTURACION', 'FACTURAS', 'CUENTA CONTABLE PARA VENTAS A CLIENTES EXENTOS DE IVA') returning_values (:CTAVENTAS);
        VENTAS = 'K';
        END
    /* CUENTAS DE VENTAS */
    if (VENTAS = 'A') then
        BEGIN
        FOR SELECT MAX(COAR_CTAVNT), SUM(FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO-FADE_INALCM), SUM(FADE_IVAMONTO), SUM(FADE_CONSUMO), MAX(B.bode_proy), MAX(B.bode_centro), MAX(B.bode_subc)
            FROM ARTICULO A, contabil_articulo_niif C, FACTURAS_DETALLE F, bodega b
            WHERE F.FACT_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL)) and
            f.bode_cod = b.bode_cod
            GROUP BY COAR_CTAVNT
            INTO :CTAVENTAS, :MONTO, :IMPTOS, :VRCONSUMO, :PROYI, :CENTI, :SUBCI
            DO
            BEGIN
            if (icoing = 'SI') then
                MONTO = MONTO + VRCONSUMO;
            if ((CTADTO IS NULL) OR (CTADTO = '')) then
                MONTO = MONTO * FACTOR;
            execute procedure redondee(MONTO, DIG) returning_values (MONTO);
            if (MONTO <> 0) then
                BEGIN
                EXECUTE PROCEDURE cuenta_interfaz_niif(31, :IDDOC, :CTAVENTAS, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (TIPOCUEN = 'I') then
                    BEGIN
                    EXECUTE PROCEDURE ERRORINT (1031, :IDDOC, :CUENTA, 3);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_SUBC, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON, CNDE_PREF, CNDE_FOLIOE)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, :SUBCEN, :NUMERO, NULL, :VENCE, NULL, 0, 31, :PREF, CAST(:NUM AS INTEGER));
                    NROI = NROI + 1;
                    SUMA = SUMA - MONTO;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    IF (CENT = 'B') THEN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_SUBC, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON, CNDE_PREF, CNDE_FOLIOE)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROYI, :CENTI, :SUBCI, NULL, NULL, NULL, NULL, 0, 0, :PREF, CAST(:NUM AS INTEGER));
                    ELSE
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_SUBC, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON, CNDE_PREF, CNDE_FOLIOE)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, :SUBCEN, NULL, NULL, NULL, NULL, 0, 0, :PREF, CAST(:NUM AS INTEGER));
                    NROI = NROI + 1;
                    SUMA = SUMA - MONTO;
                    END
                END /* MONTO <> 0 */
            END /* FOR */
        END /* VENTAS X ARTICULO */
     IF ((VENTAS = 'C') OR (VENTAS = 'K')) THEN
        BEGIN
        IF (VENTAS = 'C') THEN
            CTAVENTAS = TCTAVENTA;
        SELECT SUM(FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO-FADE_INALCM), SUM(FADE_IVAMONTO), SUM (FADE_CONSUMO)
            FROM FACTURAS_DETALLE F
            WHERE F.FACT_ID = :IDDOC AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
            INTO :MONTO, :IMPTOS, :VRCONSUMO;
        if (ICOING = 'SI') then
            MONTO = MONTO + VRCONSUMO;
        if ((CTADTO IS NULL) OR (CTADTO = '')) then
            MONTO = MONTO * FACTOR;
        execute procedure redondee(MONTO, DIG) returning_values (MONTO);
        if (MONTO <> 0) then
            BEGIN
            EXECUTE PROCEDURE cuenta_interfaz_niif(31, :IDDOC, :CTAVENTAS, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'I') then
                BEGIN
                EXECUTE PROCEDURE ERRORINT (1031, :IDDOC, :CUENTA, 3);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_SUBC, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON, CNDE_PREF, CNDE_FOLIOE)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, :SUBCEN, :NUMERO, NULL, :VENCE, NULL, 0, 31, :PREF, CAST(:NUM AS INTEGER));
                NROI = NROI + 1;
                SUMA = SUMA - MONTO;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_SUBC, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON, CNDE_PREF, CNDE_FOLIOE)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, :SUBCEN, NULL, NULL, NULL, NULL, 0, 0, :PREF, CAST(:NUM AS INTEGER));
                NROI = NROI + 1;
                SUMA = SUMA - MONTO;
                END
            END /* MONTO <> 0 */
        END /* VENTAS DE CLIENTE O CONSTANTE */
    /* EL IVA EN VENTAS */
    if (IVA = 'A') then
        BEGIN
        FOR SELECT MAX(COAR_CTAIVAV), SUM(FADE_IVAMONTO), SUM(FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO-FADE_INALCM), sum(FADE_CONSUMO)
            FROM ARTICULO A, contabil_articulo_niif C, FACTURAS_DETALLE F
            WHERE F.FACT_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
            GROUP BY COAR_CTAIVAV
            INTO :CTAIVA, :IMPTOS, :MONTO, :VALORADIC
        DO
            BEGIN
            MONTO = MONTO * -1;
            MONTO = MONTO * FACTOR;
            IMPTOS = IMPTOS * FACTOR;
            execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
            execute procedure redondee(MONTO, DIG) returning_values (MONTO);
            if (IMPTOS <> 0) then
                BEGIN
                EXECUTE PROCEDURE cuenta_interfaz_niif(31, :IDDOC, :CTAIVA, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (TIPOCUEN = 'I') then
                    BEGIN
                    EXECUTE PROCEDURE ERRORINT (1031, :IDDOC, :CUENTA, 3);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_SUBC, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON, CNDE_PREF, CNDE_FOLIOE)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :IMPTOS, :MONTO, ABS(:IMPTOS*100/:MONTO), :NIT, :PROY, :CENTRO, :SUBCEN, :NUMERO, NULL, :VENCE, NULL, 0, 31, :PREF, CAST(:NUM AS INTEGER));
                    NROI = NROI + 1;
                    SUMA = SUMA - IMPTOS;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_SUBC, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON, CNDE_PREF, CNDE_FOLIOE)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :IMPTOS, :MONTO, ABS(:IMPTOS*100/:MONTO), :NIT, :PROY, :CENTRO, :SUBCEN, NULL, NULL, NULL, NULL, 0, 0, :PREF, CAST(:NUM AS INTEGER));
                    NROI = NROI + 1;
                    SUMA = SUMA - IMPTOS;
                    END
                END   /* IMPTOS <> 0 */
            END /* FOR */
        END /* IVA X ARTICULO */
    if (IVA = 'K') then /* IVA EN CTA CONSTANTE */
        BEGIN
        SELECT SUM(FADE_IVAMONTO), SUM(FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO-fade_inalcm), SUM(FADE_CONSUMO)
            FROM FACTURAS_DETALLE F
            WHERE F.FACT_ID = :IDDOC and FADE_IVAMONTO <> 0 AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
            INTO :IMPTOS, :MONTO, :valoradic;
        MONTO = MONTO * -1;
        MONTO = MONTO * FACTOR;
        IMPTOS = IMPTOS * FACTOR;
        execute procedure redondee(MONTO, DIG) returning_values (MONTO);
        execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
        if (IMPTOS <> 0) then
            BEGIN
            EXECUTE PROCEDURE cuenta_interfaz_niif(31, :IDDOC, :CTAIVA, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'I') then
                BEGIN
                EXECUTE PROCEDURE ERRORINT (1031, :IDDOC, :CUENTA, 3);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_SUBC, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON, CNDE_PREF, CNDE_FOLIOE)
                    VALUES (:IDC, :NROI, :CTAIVA, :CONC, '', 0, :IMPTOS, :MONTO, ABS(:IMPTOS*100/:MONTO), :NIT, :PROY, :CENTRO, :SUBCEN, :NUMERO, NULL, :VENCE, NULL, 0, 31, :PREF, CAST(:NUM AS INTEGER));
                NROI = NROI + 1;
                SUMA = SUMA - IMPTOS;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_SUBC, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON, CNDE_PREF, CNDE_FOLIOE)
                    VALUES (:IDC, :NROI, :CTAIVA, :CONC, '', 0, :IMPTOS, :MONTO, ABS(:IMPTOS*100/:MONTO), :NIT, :PROY, :CENTRO, :SUBCEN, NULL, NULL, NULL, NULL, 0, 0, :PREF, CAST(:NUM AS INTEGER));
                NROI = NROI + 1;
                SUMA = SUMA - IMPTOS;
                END
            END /* IMPTOS <> 0 */
        END /* IVA EN CTA CONSTANTE */
    /* EL IMPOCONSUMO */
    if (CONSUMO = 'A') then
        BEGIN
        FOR SELECT MAX(COAR_CTACONS), SUM(FADE_CONSUMO)
            FROM ARTICULO A, contabil_articulo_niif C, FACTURAS_DETALLE F
            WHERE F.FACT_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
            GROUP BY COAR_CTACONS
            INTO :CTACONSUMO, :IMPTOS
        DO
            BEGIN
            execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
            if (IMPTOS <> 0) then
                BEGIN
                EXECUTE PROCEDURE cuenta_interfaz_niif(31, :IDDOC, :CTACONSUMO, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (TIPOCUEN = 'I') then
                    BEGIN
                    EXECUTE PROCEDURE ERRORINT (1031, :IDDOC, :CUENTA, 3);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_SUBC, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON, CNDE_PREF, CNDE_FOLIOE)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, :SUBCEN, :NUMERO, NULL, :VENCE, NULL, 0, 31, :PREF, CAST(:NUM AS INTEGER));
                    NROI = NROI + 1;
                    SUMA = SUMA - IMPTOS;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_SUBC, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON, CNDE_PREF, CNDE_FOLIOE)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, :SUBCEN, NULL, NULL, NULL, NULL, 0, 0, :PREF, CAST(:NUM AS INTEGER));
                    NROI = NROI + 1;
                    SUMA = SUMA - IMPTOS;
                    END
                END /* IMPTOS <> 0 */
            END /* FOR */
        END /* CONSUMO X ARTICULO */
    if (CONSUMO = 'K') then /* CONSUMO EN CTA CONSTANTE */
        BEGIN
        SELECT SUM(FADE_CONSUMO)
            FROM FACTURAS_DETALLE F
            WHERE F.FACT_ID = :IDDOC AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
            INTO :IMPTOS;
        execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
        if (IMPTOS <> 0) then
            BEGIN
            EXECUTE PROCEDURE cuenta_interfaz_niif(31, :IDDOC, :CTACONSUMO, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'I') then
                BEGIN
                EXECUTE PROCEDURE ERRORINT (1031, :IDDOC, :CUENTA, 3);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_SUBC, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON, CNDE_PREF, CNDE_FOLIOE)
                    VALUES (:IDC, :NROI, :CTACONSUMO, :CONC, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, :SUBCEN, :NUMERO, NULL, :VENCE, NULL, 0, 31, :PREF, CAST(:NUM AS INTEGER));
                NROI = NROI + 1;
                SUMA = SUMA - IMPTOS;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_SUBC, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON, CNDE_PREF, CNDE_FOLIOE)
                    VALUES (:IDC, :NROI, :CTACONSUMO, :CONC, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, :SUBCEN, NULL, NULL, NULL, NULL, 0, 0, :PREF, CAST(:NUM AS INTEGER));
                NROI = NROI + 1;
                SUMA = SUMA - IMPTOS;
                END
            END /* IMPTOS <> 0 */
        END /* CONSUMO EN CTA CONSTANTE */
    /* IMPUESTO NACIONAL AL CONSUMO CTA CONFIGURABLE */
        BEGIN
        SELECT SUM(FADE_INALCM), SUM(FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO-FADE_INALCM) FROM FACTURAS_DETALLE F
            WHERE F.FACT_ID = :IDDOC AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL)) and
            FADE_INALCM <> 0
            INTO :IMPTOS, :MONTO;
        execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
        if (MONTO <> 0) then
            PORC = IMPTOS / MONTO;
        execute procedure redondee(PORC, 0) returning_values (PORC);
        if (IMPTOS <> 0) then
            BEGIN
            EXECUTE PROCEDURE lee_configuracion ('FACTURACION', 'ARTICULOS', 'CUENTA CONTABLE PARA EL IMPUESTO NACIONAL AL CONSUMO') returning_values (ctaconsumo);
            EXECUTE PROCEDURE cuenta_interfaz_niif(31, :IDDOC, :CTACONSUMO, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON, CNDE_PREF, CNDE_FOLIOE)
                    VALUES (:IDC, :NROI, :CTACONSUMO, :CONC, '', 0, :IMPTOS, :MONTO, :PORC, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31, :PREF, CAST(:NUM AS INTEGER));
                NROI = NROI + 1;
                SUMA = SUMA - IMPTOS;
                END
            ELSE
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON, CNDE_PREF, CNDE_FOLIOE)
                    VALUES (:IDC, :NROI, :CTACONSUMO, :CONC, '', 0, :IMPTOS, :MONTO, :PORC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0, :PREF, CAST(:NUM AS INTEGER));
                NROI = NROI + 1;
                SUMA = SUMA - IMPTOS;
                END
            END /* IMPTOS <> 0 */
        END /* IMPUETO NACIONAL CONSUMO EN CTA CONFIGURABLE */
    /* DESCUENTO */
    if ((CTADTO IS NOT NULL) AND (CTADTO <> '')) then
        BEGIN
        execute procedure redondee(VRDTO, DIG) returning_values (VRDTO);
        if (VRDTO <> 0) then
            BEGIN
            EXECUTE PROCEDURE cuenta_interfaz_niif(31, :IDDOC, :CTADTO, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_SUBC, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON, CNDE_PREF, CNDE_FOLIOE)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRDTO, 0, 0, 0, :NIT, :PROY, :CENTRO, :SUBCEN, :NUMERO, NULL, :VENCE, NULL, 0, 31, :PREF, CAST(:NUM AS INTEGER));
                NROI = NROI + 1;
                SUMA = SUMA + VRDTO;
                END
            if (TIPOCUEN = 'N') then
                    BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_SUBC, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON, CNDE_PREF, CNDE_FOLIOE)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRDTO, 0, 0, 0, :NIT, :PROY, :CENTRO, :SUBCEN, NULL, NULL, NULL, NULL, 0, 31, :PREF, CAST(:NUM AS INTEGER));
                NROI = NROI + 1;
                SUMA = SUMA + VRDTO;
                END
            END
        END /* DESCUENTO */
    /* VALOR ADIC */
    if ((CTAADIC IS NOT NULL) AND (CTAADIC <> '')) then
        BEGIN
        execute procedure redondee(VRADIC, DIG) returning_values (VRADIC);
        if (VRADIC <> 0) THEN
            BEGIN
            EXECUTE PROCEDURE cuenta_interfaz_niif(31, :IDDOC, :CTAADIC, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_SUBC, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON, CNDE_PREF, CNDE_FOLIOE)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRADIC, 0, 0, :NIT, :PROY, :CENTRO, :SUBCEN, :NUMERO, NULL, :VENCE, NULL, 0, 31, :PREF, CAST(:NUM AS INTEGER));
                NROI = NROI + 1;
                SUMA = SUMA - VRADIC;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_SUBC, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON, CNDE_PREF, CNDE_FOLIOE)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRADIC, 0, 0, :NIT, :PROY, :CENTRO, :SUBCEN, NULL, NULL, NULL, NULL, 0, 31, :PREF, CAST(:NUM AS INTEGER));
                NROI = NROI + 1;
                SUMA = SUMA - VRADIC;
                END
            END
        END /* VR. ADIC */
    /* VALOR EXTRA */
    if ((CTAEXTRA IS NOT NULL) AND (CTAEXTRA <> '')) THEN
        BEGIN
        execute procedure redondee(VREXTRA, DIG) returning_values (VREXTRA);
        if (VREXTRA <> 0) THEN
            BEGIN
            EXECUTE PROCEDURE cuenta_interfaz_niif(31, :IDDOC, :CTAEXTRA, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_SUBC, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON, CNDE_PREF, CNDE_FOLIOE)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VREXTRA, 0, 0, :NIT, :PROY, :CENTRO, :SUBCEN, :NUMERO, NULL, :VENCE, NULL, 0, 31, :PREF, CAST(:NUM AS INTEGER));
                NROI = NROI + 1;
                SUMA = SUMA - VREXTRA;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_SUBC, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON, CNDE_PREF, CNDE_FOLIOE)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VREXTRA, 0, 0, :NIT, :PROY, :CENTRO, :SUBCEN, NULL, NULL, NULL, NULL, 0, 31, :PREF, CAST(:NUM AS INTEGER));
                NROI = NROI + 1;
                SUMA = SUMA - VREXTRA;
                END
            END
        END /* VR. EXTRA */
    /* DESCUENTE EL IMPOCONSUMO */
    SELECT SUM(FADE_CONSUMO)
        FROM FACTURAS_DETALLE F WHERE F.FACT_ID = :IDDOC AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL)) INTO :IMPTOS;
    vrsubt = vrsubt - IMPTOS;
    /* RETENCION FUENTE */
    if ((RTFTE = 'C') or (RTFTE = 'K')) then
      BEGIN
      execute procedure redondee(VRRTFTE, DIG) returning_values (VRRTFTE);
      if (VRRTFTE <> 0) then
        BEGIN
        if (RTFTE = 'C') then
            CTARTFTE = TCTARTFTE;
        EXECUTE PROCEDURE cuenta_interfaz_niif(31, :IDDOC, :CTARTFTE, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
        if (ERRORC <> 0) then
            ERROR = ERROR + 1;
        if (TIPOCUEN = 'C') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_SUBC, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON, CNDE_PREF, CNDE_FOLIOE)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTFTE, 0, :VRSUBT, :PRTFTE, :NIT, :PROY, :CENTRO, :SUBCEN, :NUMERO, NULL, :VENCE, NULL, 0, 31, :PREF, CAST(:NUM AS INTEGER));
            NROI = NROI + 1;
            SUMA = SUMA + VRRTFTE;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_SUBC, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON, CNDE_PREF, CNDE_FOLIOE)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTFTE, 0, :VRSUBT, :PRTFTE, :NIT, :PROY, :CENTRO, :SUBCEN, NULL, NULL, NULL, NULL, 0, 0, :PREF, CAST(:NUM AS INTEGER));
            NROI = NROI + 1;
            SUMA = SUMA + VRRTFTE;
            END
        /* AUTORETENCION */
        if (FAUTORET <= fecaux) then
            BEGIN
            EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'CUENTA DE AUTORETENCION EN LA FUENTE') returning_values (CTARTFTE);
            CUENTA = NULL;
            SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :CTARTFTE INTO :CUENTA, :TIPOCUEN;
            if (CUENTA IS NULL) then
                begin
                EXECUTE PROCEDURE ERRORINT (1031, :IDDOC, :CTARTFTE, 2);
                CUENTA = CTARTFTE;
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'I') then
                begin
                EXECUTE PROCEDURE ERRORINT (1031, :IDDOC, :CUENTA, 3);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_SUBC, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON, CNDE_PREF, CNDE_FOLIOE)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTFTE, (:VRSUBT*-1), :PRTFTE, :NIT, :PROY, :CENTRO, :SUBCEN, :NUMERO, NULL, :VENCE, NULL, 0, 31, :PREF, CAST(:NUM AS INTEGER));
                NROI = NROI + 1;
                SUMA = SUMA - VRRTFTE;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_SUBC, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON, CNDE_PREF, CNDE_FOLIOE)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTFTE, (:VRSUBT*-1), :PRTFTE, :NIT, :PROY, :CENTRO, :SUBCEN, NULL, NULL, NULL, NULL, 0, 0, :PREF, CAST(:NUM AS INTEGER));
                NROI = NROI + 1;
                SUMA = SUMA - VRRTFTE;
                END
            END
        END /* RTFTE */
      END
    if (RTFTE = 'A') then
      BEGIN
      if (VRRTFTE <> 0) then
        BEGIN
        FOR SELECT MAX(COAR_CTARTFTEV), MAX(COAR_RTFTE), MIN(COAR_RTBASE), SUM(FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO), SUM((FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO)*COAR_RTFTE)
          FROM contabil_articulo_niif C, FACTURAS_DETALLE F
          WHERE F.FACT_ID = :IDDOC AND F.ARTI_COD = C.ARTI_COD AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
          GROUP BY COAR_CTARTFTEV
          INTO :CTARTFTE, :PRTFTE, :baseadic, :MONTO, :VRRTFTE
          DO
          BEGIN
          MONTO = MONTO * FACTOR;
          if (MONTO >= BASEADIC) then
            BEGIN
            VRRTFTE = VRRTFTE * FACTOR / 100;
            execute procedure redondee(VRRTFTE, DIG) returning_values (VRRTFTE);
            execute procedure redondee(MONTO, DIG) returning_values (MONTO);
            if (VRRTFTE <> 0) then
                BEGIN
                EXECUTE PROCEDURE cuenta_interfaz_niif(31, :IDDOC, :CTARTFTE, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (TIPOCUEN = 'C') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_SUBC, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON, CNDE_PREF, CNDE_FOLIOE)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTFTE, 0, :MONTO, :PRTFTE, :NIT, :PROY, :CENTRO, :SUBCEN, :NUMERO, NULL, :VENCE, NULL, 0, 31, :PREF, CAST(:NUM AS INTEGER));
                    NROI = NROI + 1;
                    SUMA = SUMA + VRRTFTE;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_SUBC, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON, CNDE_PREF, CNDE_FOLIOE)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTFTE, 0, :MONTO, :PRTFTE, :NIT, :PROY, :CENTRO, :SUBCEN, NULL, NULL, NULL, NULL, 0, 0, :PREF, CAST(:NUM AS INTEGER));
                    NROI = NROI + 1;
                    SUMA = SUMA + VRRTFTE;
                    END
                /* AUTORETENCION */
                if (FAUTORET <= fecaux) then
                    BEGIN
                    EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'CUENTA DE AUTORETENCION EN LA FUENTE') returning_values (CTARTFTE);
                    EXECUTE PROCEDURE cuenta_interfaz_niif(31, :IDDOC, :CTARTFTE, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
                    if (ERRORC <> 0) then
                        ERROR = ERROR + 1;
                    if (TIPOCUEN = 'C') then
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_SUBC, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON, CNDE_PREF, CNDE_FOLIOE)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTFTE, (:MONTO*-1), :PRTFTE, :NIT, :PROY, :CENTRO, :SUBCEN, :NUMERO, NULL, :VENCE, NULL, 0, 31, :PREF, CAST(:NUM AS INTEGER));
                        NROI = NROI + 1;
                        SUMA = SUMA - VRRTFTE;
                        END
                    if (TIPOCUEN = 'N') then
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_SUBC, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON, CNDE_PREF, CNDE_FOLIOE)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTFTE, (:MONTO*-1), :PRTFTE, :NIT, :PROY, :CENTRO, :SUBCEN, NULL, NULL, NULL, NULL, 0, 0, :PREF, CAST(:NUM AS INTEGER));
                        NROI = NROI + 1;
                        SUMA = SUMA - VRRTFTE;
                        END
                    END
                END
            END
          END
        END /* RTFTE */
      END
    /* RETENCION IVA */
    if ((RTIVA = 'C') or (RTIVA = 'K')) then
      BEGIN
      execute procedure redondee(VRRTIVA, DIG) returning_values (VRRTIVA);
      if (VRRTIVA <> 0) then
        BEGIN
        if (RTIVA = 'C') then
            CTARTIVA = TCTARTIVA;
        EXECUTE PROCEDURE cuenta_interfaz_niif(31, :IDDOC, :CTARTIVA, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
        if (ERRORC <> 0) then
            ERROR = ERROR + 1;
        if (TIPOCUEN = 'C') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_SUBC, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON, CNDE_PREF, CNDE_FOLIOE)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTIVA, 0, :VRIVA, :PORC, :NIT, :PROY, :CENTRO, :SUBCEN, :NUMERO, NULL, :VENCE, NULL, 0, 31, :PREF, CAST(:NUM AS INTEGER));
            NROI = NROI + 1;
            SUMA = SUMA + VRRTIVA;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_SUBC, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON, CNDE_PREF, CNDE_FOLIOE)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTIVA, 0, :VRIVA, :PORC, :NIT, :PROY, :CENTRO, :SUBCEN, NULL, NULL, NULL, NULL, 0, 0, :PREF, CAST(:NUM AS INTEGER));
            NROI = NROI + 1;
            SUMA = SUMA + VRRTIVA;
            END
        END /* RTIVA */
      END
    /* RETENCION DE ICA */
    if ((RTICA = 'C') or (RTICA = 'K')) then
      BEGIN
      execute procedure redondee(VRRTICA, DIG) returning_values (VRRTICA);
      if (VRRTICA <> 0) then
        BEGIN
        if (RTICA = 'C') then
            CTARTICA = TCTARTICA;
        EXECUTE PROCEDURE cuenta_interfaz_niif(31, :IDDOC, :CTARTICA, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
        if (ERRORC <> 0) then
            ERROR = ERROR + 1;
        if (TIPOCUEN = 'C') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_SUBC, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON, CNDE_PREF, CNDE_FOLIOE)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTICA, 0, :VRSUBT, :PRTICA, :NIT, :PROY, :CENTRO, :SUBCEN, :NUMERO, NULL, :VENCE, NULL, 0, 31, :PREF, CAST(:NUM AS INTEGER));
            NROI = NROI + 1;
            SUMA = SUMA + VRRTICA;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_SUBC, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON, CNDE_PREF, CNDE_FOLIOE)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTICA, 0, :VRSUBT, :PRTICA, :NIT, :PROY, :CENTRO, :SUBCEN, NULL, NULL, NULL, NULL, 0, 0, :PREF, CAST(:NUM AS INTEGER));
            NROI = NROI + 1;
            SUMA = SUMA + VRRTICA;
            END
        END /* RTICA */
      END
    /* RETENCION CREE */
    if ((RCREE = 'C') or (RCREE = 'K')) then
      BEGIN
      execute procedure redondee(vrrcree, DIG) returning_values (vrrcree);
      if (vrrcree <> 0) then
        BEGIN
        if (RCREE = 'C') then
            ctarcree = tctarcree;
        EXECUTE PROCEDURE cuenta_interfaz_niif(31, :IDDOC, :ctarcree, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
        if (ERRORC <> 0) then
            ERROR = ERROR + 1;
        if (TIPOCUEN = 'C') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_SUBC, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON, CNDE_PREF, CNDE_FOLIOE)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :vrrcree, 0, :VRSUBT, :prcree, :NIT, :PROY, :CENTRO, :SUBCEN, :NUMERO, NULL, :VENCE, NULL, 0, 31, :PREF, CAST(:NUM AS INTEGER));
            NROI = NROI + 1;
            SUMA = SUMA + vrrcree;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_SUBC, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON, CNDE_PREF, CNDE_FOLIOE)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :vrrcree, 0, :VRSUBT, :prcree, :NIT, :PROY, :CENTRO, :SUBCEN, NULL, NULL, NULL, NULL, 0, 0, :PREF, CAST(:NUM AS INTEGER));
            NROI = NROI + 1;
            SUMA = SUMA + vrrcree;
            END
        /* AUTORETECREE */
        if (fautorcree <= fecaux) then
            BEGIN
            EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'CUENTA DE AUTORETENCION CREE') returning_values (ctarcree);
            CUENTA = NULL;
            SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :ctarcree INTO :CUENTA, :TIPOCUEN;
            if (CUENTA IS NULL) then
                begin
                EXECUTE PROCEDURE ERRORINT (1031, :IDDOC, :ctarcree, 2);
                CUENTA = ctarcree;
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON, CNDE_PREF, CNDE_FOLIOE)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :vrrcree, (:VRSUBT*-1), :prcree, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31, :PREF, CAST(:NUM AS INTEGER));
                NROI = NROI + 1;
                SUMA = SUMA - vrrcree;
                END
            ELSE
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON, CNDE_PREF, CNDE_FOLIOE)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :vrrcree, (:VRSUBT*-1), :prcree, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0, :PREF, CAST(:NUM AS INTEGER));
                NROI = NROI + 1;
                SUMA = SUMA - vrrcree;
                END
            END
        END /* RCREE */
      END
    /* CIERRE EL COMPROBANTE CONTRA LA CUENTA DEL TERCERO O LA CONSTANTE */
    if ((SUMA <> 0) and ((CARTERA = 'C') or (CARTERA = 'K') or (CARTERA = 'J'))) then
        BEGIN
        if (icoing = 'SI') then
            /* DESCUENTE EL IMPOCONSUMO QUE HACE PARTE DEL COSTO */
            SUMA = SUMA + IMPTOS;
        if (SUMA < 0) then
            BEGIN
            DEBITO = SUMA * -1;
            CREDITO = 0;
            END
        ELSE
            BEGIN
            DEBITO = 0;
            CREDITO = SUMA;
            END
        if (CARTERA = 'C') then
            CTACARTERA = TCTACLIEN;
        if (CARTERA = 'J') then
            BEGIN
            /* BUSQUE LA CUENTA DE LA CAJA */
            SELECT CAJA_CUENTA FROM CAJAS C, PUNTO_VENTA P
                WHERE P.CAJA_ID = C.CAJA_ID AND PTVT_ID = :PTOVTA
                INTO :CTACARTERA;
            END
        EXECUTE PROCEDURE cuenta_interfaz_niif(31, :IDDOC, :CTACARTERA, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
        if (ERRORC <> 0) then
            ERROR = ERROR + 1;
        if (TIPOCUEN = 'C') then
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_SUBC, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON, CNDE_PREF, CNDE_FOLIOE)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :DEBITO, :CREDITO, 0, 0, :NIT, :PROY, :CENTRO, :SUBCEN, :NUMERO, NULL, :VENCE, NULL, 0, 31, :PREF, CAST(:NUM AS INTEGER));
        if (TIPOCUEN = 'N') then
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_SUBC, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON, CNDE_PREF, CNDE_FOLIOE)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :DEBITO, :CREDITO, 0, 0, :NIT, :PROY, :CENTRO, :SUBCEN, NULL, NULL, NULL, NULL, 0, 0, :PREF, CAST(:NUM AS INTEGER));
        NROI = NROI + 1;
        END /* SUMA EN CARTERA */
    /* CALCULE COSTOS EN VENTAS */
    EXECUTE PROCEDURE costo_en_ventas_niif(31, :IDDOC);
    if (COSTOS = 'A') then
        BEGIN
        FOR SELECT MAX(CTACOS), SUM(CAST(CANT AS DOUBLE PRECISION) * COSTO), SUM(FADE_CONSUMO)
            FROM costo_ventas_niif CV, FACTURAS_DETALLE D WHERE CV.cove_item = D.fade_item AND D.fact_id = :iddoc AND
            TIDO_COD = 31 AND COVE_ID = :iddoc
            GROUP BY CTACOS
            INTO :CTACOSTOS, :MONTO, :vrconsumo
        DO
            BEGIN
            if (icoing = 'SI') then
                MONTO = MONTO + VRCONSUMO;
            if (MONTO <> 0) then
                BEGIN
                EXECUTE PROCEDURE cuenta_interfaz_niif(31, :IDDOC, :CTACOSTOS, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (TIPOCUEN = 'I') then
                    BEGIN
                    EXECUTE PROCEDURE ERRORINT (1031, :IDDOC, :CUENTA, 3);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_SUBC, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON, CNDE_PREF, CNDE_FOLIOE)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, :SUBCEN, :NUMERO, NULL, :VENCE, NULL, 0, 31, :PREF, CAST(:NUM AS INTEGER));
                    NROI = NROI + 1;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_SUBC, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON, CNDE_PREF, CNDE_FOLIOE)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, :SUBCEN, NULL, NULL, NULL, NULL, 0, 0, :PREF, CAST(:NUM AS INTEGER));
                    NROI = NROI + 1;
                    END
                END /* MONTO <> 0 */
            END /* FOR */
        END /* COSTOS */
    if (COSTOS = 'K') then
        BEGIN
        SELECT SUM(CAST(CANT AS DOUBLE PRECISION) * COSTO)
            FROM costo_ventas_niif WHERE TIDO_COD = 31 AND COVE_ID = :iddoc
            INTO :MONTO;
        if (icoing = 'SI') then
            MONTO = MONTO + imptos;
        if (MONTO <> 0) then
            BEGIN
            EXECUTE PROCEDURE cuenta_interfaz_niif(31, :IDDOC, :CTACOSTOS, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'I') then
                BEGIN
                EXECUTE PROCEDURE ERRORINT (1031, :IDDOC, :CUENTA, 3);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_SUBC, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON, CNDE_PREF, CNDE_FOLIOE)
                    VALUES (:IDC, :NROI, :CTACOSTOS, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, :SUBCEN, :NUMERO, NULL, :VENCE, NULL, 0, 31, :PREF, CAST(:NUM AS INTEGER));
                NROI = NROI + 1;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_SUBC, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON, CNDE_PREF, CNDE_FOLIOE)
                    VALUES (:IDC, :NROI, :CTACOSTOS, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, :SUBCEN, NULL, NULL, NULL, NULL, 0, 0, :PREF, CAST(:NUM AS INTEGER));
                NROI = NROI + 1;
                END
            END /* MONTO <> 0 */
        END /* COSTOS = K */
    if (INVEN = 'A') then
        BEGIN
        FOR SELECT MAX(CTAINV), SUM(CAST(CANT AS DOUBLE PRECISION) * COSTO)
            FROM costo_ventas_niif WHERE TIDO_COD = 31 AND COVE_ID = :iddoc
            GROUP BY CTAINV
            INTO :CTAINVEN, :MONTO
        DO
            BEGIN
            if (MONTO <> 0) then
                BEGIN
                EXECUTE PROCEDURE cuenta_interfaz_niif(31, :IDDOC, :CTAINVEN, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (TIPOCUEN = 'I') then
                    BEGIN
                    EXECUTE PROCEDURE ERRORINT (1031, :IDDOC, :CUENTA, 3);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_SUBC, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON, CNDE_PREF, CNDE_FOLIOE)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, :SUBCEN, :NUMERO, NULL, :VENCE, NULL, 0, 31, :PREF, CAST(:NUM AS INTEGER));
                    NROI = NROI + 1;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_SUBC, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON, CNDE_PREF, CNDE_FOLIOE)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, :SUBCEN, NULL, NULL, NULL, NULL, 0, 0, :PREF, CAST(:NUM AS INTEGER));
                    NROI = NROI + 1;
                    END
                END /* MONTO <> 0 */
            END /* FOR */
        END /* INVEN = A */
    if (INVEN = 'K') then
        BEGIN
        SELECT SUM(CAST(CANT AS DOUBLE PRECISION) * COSTO)
            FROM costo_ventas_niif WHERE TIDO_COD = 31 AND COVE_ID = :iddoc
            INTO :MONTO;
        if (MONTO <> 0) then
            BEGIN
            EXECUTE PROCEDURE cuenta_interfaz_niif(31, :IDDOC, :CTAINVEN, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'I') then
                BEGIN
                EXECUTE PROCEDURE ERRORINT (1031, :IDDOC, :CUENTA, 3);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_SUBC, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON, CNDE_PREF, CNDE_FOLIOE)
                    VALUES (:IDC, :NROI, :CTAINVEN, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, :SUBCEN, :NUMERO, NULL, :VENCE, NULL, 0, 31, :PREF, CAST(:NUM AS INTEGER));
                NROI = NROI + 1;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_SUBC, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON, CNDE_PREF, CNDE_FOLIOE)
                    VALUES (:IDC, :NROI, :CTAINVEN, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, :SUBCEN, NULL, NULL, NULL, NULL, 0, 0, :PREF, CAST(:NUM AS INTEGER));
                NROI = NROI + 1;
                END
            END /* MONTO <> 0 */
        END /* INVEN = K */
    /* recorra las cuentas adicionales */
    FOR SELECT INVC_CUENTA, INVC_BASE, INVC_PORC, INVC_VALOR, INVC_DB
        FROM INTERFAZ_VENTAS_CTAS
        WHERE INVE_ID = :IDINTER
        INTO :CTADIC, :BASEADIC, :PORCADIC, :VALORADIC, :DBADIC
        DO
        BEGIN
        if (VALORADIC <> 0) then
            MONTO = VALORADIC;
        ELSE
            BEGIN
            if (:BASEADIC = 'SUBTOTAL') then
                VALORADIC = vrsubt;
            if (:BASEADIC = 'DESCUENTO') then
                VALORADIC = VRDTO;
            if (:BASEADIC = 'IVA') then
                VALORADIC = VRIVA;
            if (:BASEADIC = 'ADICIONAL') then
                VALORADIC = VRADIC;
            if (:BASEADIC = 'EXTRA') then
                VALORADIC = VREXTRA;
            if (:BASEADIC = 'TOTAL') then
                VALORADIC = VRTOTAL;
            MONTO = VALORADIC * PORCADIC / 100;
            END
        if (MONTO <> 0) then
            BEGIN
            EXECUTE PROCEDURE cuenta_interfaz_niif(31, :IDDOC, :CTADIC, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'C') then
                BEGIN
                if (DBADIC = 'S') then
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_SUBC, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON, CNDE_PREF, CNDE_FOLIOE)
                        VALUES (:IDC, :NROI, :CTADIC, :CONC, '', :MONTO, 0, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, :SUBCEN, :NUMERO, NULL, :VENCE, NULL, 0, 31, :PREF, CAST(:NUM AS INTEGER));
                ELSE
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_SUBC, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON, CNDE_PREF, CNDE_FOLIOE)
                        VALUES (:IDC, :NROI, :CTADIC, :CONC, '', 0, :MONTO, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, :SUBCEN, :NUMERO, NULL, :VENCE, NULL, 0, 31, :PREF, CAST(:NUM AS INTEGER));
                NROI = NROI + 1;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                if (DBADIC = 'S') then
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_SUBC, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON, CNDE_PREF, CNDE_FOLIOE)
                        VALUES (:IDC, :NROI, :CTADIC, :CONC, '', :MONTO, 0, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, :SUBCEN, NULL, NULL, NULL, NULL, 0, 0, :PREF, CAST(:NUM AS INTEGER));
                ELSE
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_SUBC, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON, CNDE_PREF, CNDE_FOLIOE)
                        VALUES (:IDC, :NROI, :CTADIC, :CONC, '', 0, :MONTO, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, :SUBCEN, NULL, NULL, NULL, NULL, 0, 0, :PREF, CAST(:NUM AS INTEGER));
                NROI = NROI + 1;
                END
            NROI = NROI + 1;
            END
        END
    if (ERROR > 0) then
        VER = 'S';
    SUSPEND;
    END /* NO ANULADO */
  END /* EXISTE LA INTERFAZ */
ELSE
    BEGIN
    EXECUTE PROCEDURE ERRORINT (1031, :IDDOC, :PREF, 1);
    ERROR = ERROR + 1;
    VER = 'S';
    SUSPEND;
    END
END^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE FACTURAS_SIN_CONTABILIDAD_NIIF(
    FECINI DATE,
    FECFIN DATE,
    PREFIJO VARCHAR(4))
RETURNS (
    ID INTEGER,
    PREF VARCHAR(4),
    NUMERO VARCHAR(8),
    ESTADO VARCHAR(20),
    IDI INTEGER,
    IDC INTEGER)
AS
DECLARE VARIABLE VER CHAR(2);
declare variable ERROR INTEGER;
declare variable IDREF INTEGER;
BEGIN
FOR SELECT FACT_ID, PREF_PRE, FACT_NUMERO FROM FACTURAS WHERE FACT_ANULADO = 'N' AND
    FACT_FECHA >= :FECINI AND FACT_FECHA <= :FECFIN AND ((:PREFIJO = '') or (PREF_PRE = :PREFIJO))
    INTO :ID, :PREF, :NUMERO
DO
  BEGIN
  idc = null;
  if (not exists (SELECT E.ENCO_CONSEC FROM COMPROBANTE_ENCABEZADO E, comprobante_detalle_niif D
    WHERE ENCO_TIPOREF = 31 AND ENCO_IDREF = :ID AND E.enco_consec = D.enco_consec)) then
    BEGIN
    SELECT CNTB_ID FROM CONTABILIZACION WHERE CNTB_TIPOREF = 31 AND CNTB_IDREF = :ID into :idc;
    DELETE FROM CONTABILIZACION_DET WHERE CNTB_ID = :IDC AND CNDE_ITEM >= 100000;
    if (idc IS NOT NULL) then
        begin
        ESTADO = 'PROCESANDO';
        ERROR = NULL;
        SUSPEND;
        SELECT MAX(INVE_ID) FROM INTERFAZ_VENTAS WHERE PREF_PRE = :PREF AND TIDO_COD = 31 INTO :IDI;
        EXECUTE PROCEDURE contabil_factura_niif (:ID, :IDI, :idc) RETURNING_VALUES (:ERROR, VER);
        if ((ERROR = 0) or (error IS NULL)) then
            BEGIN
            SELECT ENCO_CONSEC FROM COMPROBANTE_ENCABEZADO E WHERE ENCO_TIPOREF = 31 AND ENCO_IDREF = :ID INTO :IDREF;
            INSERT INTO comprobante_detalle_niif (ENCO_CONSEC, CODE_ITEM, CUEN_COD, TERC_NIT, PROY_COD, CENT_COD, SUBC_COD, CODE_CONCEPTO, CODE_REFER, CONC_COD, CODE_BASE, CODE_PORC, CODE_DEBITO, CODE_CREDITO, CODE_TIPONUE, CNDE_DOCNUMERO, CODE_TIPOAPL, CNDE_DOCAPLICA, DOCO_VENCE, ARTI_COD)
                SELECT :IDREF, CNDE_ITEM, CNDE_CUENTA, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_SUBC, CNDE_CONC, CNDE_REF, CNDE_CONCOD, CNDE_BASE, CNDE_PORC, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_DOCTIPON, CNDE_DOCNUMERO, CNDE_DOCTIPOA, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO
                FROM CONTABILIZACION_DET WHERE CNTB_ID = :idc AND CNDE_ITEM >= 100000;
            UPDATE comprobante_encabezado SET ENCO_CONTANIIF = 'S' WHERE ENCO_CONSEC = :IDREF;
            ESTADO = 'OK';
            END
        ELSE
            ESTADO = 'ERROR';
        suspend;
        end
    END
  END
END^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER procedure CONTABIL_FACTCOMP (
    IDDOC integer,
    IDINTER integer)
returns (
    ERROR integer,
    VER char(1),
    IDC integer)
as
declare variable PREFIJO varchar(4);
declare variable NUM varchar(6);
declare variable NUMERO varchar(10);
declare variable FECAUX date;
declare variable FECHA char(8);
declare variable CONCEPTO char(60);
declare variable VENCEAUX date;
declare variable VENCE char(8);
declare variable VRDTO numeric(18,2);
declare variable VRADIC numeric(18,2);
declare variable VRSUBT numeric(18,2);
declare variable VRIVA numeric(18,2);
declare variable PRTFTE numeric(9,2);
declare variable VRRTFTE numeric(18,2);
declare variable VRRTIVA numeric(18,2);
declare variable PRTICA numeric(9,2);
declare variable VRRTICA numeric(18,2);
declare variable PRCREE numeric(9,2);
declare variable VRRCREE numeric(18,2);
declare variable VRTOTAL numeric(18,2);
declare variable VREXTRA numeric(18,2);
declare variable TIPOCOMP varchar(3);
declare variable PREFCONT varchar(4);
declare variable INVEN char(1);
declare variable CTAINVEN varchar(20);
declare variable IVA char(1);
declare variable CTAIVA varchar(20);
declare variable CONSUMO char(1);
declare variable CTACONSUMO varchar(20);
declare variable ICOINC char(2);
declare variable CXP char(1);
declare variable CTACXP varchar(20);
declare variable RTFTE char(1);
declare variable CTARTFTE varchar(20);
declare variable RTIVA char(1);
declare variable CTARTIVA varchar(20);
declare variable RTICA char(1);
declare variable CTARTICA varchar(20);
declare variable RCREE char(1);
declare variable CTARCREE varchar(20);
declare variable CTADTO varchar(20);
declare variable CTAADIC varchar(20);
declare variable CTAEXTRA varchar(20);
declare variable EXISTE char(1);
declare variable CUENTA varchar(20);
declare variable MONTO numeric(18,2);
declare variable TIPOCUEN char(1);
declare variable NIT varchar(20);
declare variable NOMBRE varchar(60);
declare variable PROY varchar(4);
declare variable CENTRO varchar(4);
declare variable SUBCEN varchar(4);
declare variable PROYDET varchar(4);
declare variable CENTRODET varchar(4);
declare variable SUBCENDET varchar(4);
declare variable PORC numeric(5,2);
declare variable NUMITEMS integer;
declare variable ARTICULO varchar(15);
declare variable IMPINC char(1);
declare variable IMPTOS numeric(18,2);
declare variable SUMA numeric(18,2);
declare variable PORCIVA numeric(9,2);
declare variable TCTAPROV varchar(20);
declare variable TCTARTFTE varchar(20);
declare variable TCTARTIVA varchar(20);
declare variable TCTARTICA varchar(20);
declare variable TCTARCREE varchar(20);
declare variable CUENTAADIC varchar(20);
declare variable BASEADIC varchar(20);
declare variable PORCADIC numeric(5,2);
declare variable VALORADIC numeric(18,2);
declare variable DBADIC char(1);
declare variable FOMENTO char(1);
declare variable BODE_DET char(2);
declare variable NUMPROV varchar(10);
declare variable MERCANCIA numeric(18,2);
declare variable FACTOR double precision;
declare variable MENORV char(2);
declare variable DIG integer;
declare variable NETO numeric(18,2);
declare variable CENT char(1);
declare variable ANULADO char(1);
declare variable ERRORC integer;
declare variable SIMP char(1);
declare variable CTAIVARS varchar(20);
declare variable CTAFOMENTO varchar(20);
declare variable DEGUELLO numeric(18,2);
declare variable CTADEGUELLO varchar(20);
declare variable TOTIMPBA numeric(18,2);
declare variable TOTIMPUP numeric(18,2);
declare variable ISINC char(2);
declare variable IMPBA numeric(18,2);
declare variable IMPUP numeric(18,2);
declare variable AUTORIZA VARCHAR(30);
declare variable PREFE VARCHAR(4);
declare variable NUME INTEGER;
begin
  /* INTERFACE */
  EXISTE = 'N';
  select 'S', TICO_COD, PRCO_PRE, INCO_INVEN, INCO_IVA, INCO_CONSUMO, INCO_CXP, INCO_RTFTE, INCO_RTIVA, INCO_RTICA, INCO_RTCREE, INCO_CTAINVEN, INCO_CTAIVA, INCO_CTACONSUMO, INCO_CTADTO, INCO_CTAADIC, INCO_CTAEXTRA, INCO_CTACXP, INCO_CTARTFTE, INCO_CTARTIVA, INCO_CTARTICA, INCO_CTARTCREE, INCO_CONFIRMAR, INCO_CENTRO, INCO_FOMENTO, INCO_CTAFOMENTO
    from INTERFAZ_COMPRAS where INCO_ID = :IDINTER into :EXISTE, :TIPOCOMP, :PREFCONT, :INVEN, :IVA, :CONSUMO, :CXP, :RTFTE, :RTIVA, :RTICA, :RCREE, :CTAINVEN, :CTAIVA, :CTACONSUMO, :CTADTO, :CTAADIC, :CTAEXTRA, :CTACXP, :CTARTFTE, :CTARTIVA, :CTARTICA, :CTARCREE, :VER, :CENT, :FOMENTO, :ctafomento;
  if (EXISTE = 'S') then
    begin
    /* BORRE CONTABILIZACION PREVIA */
    delete from CONTABILIZACION where CNTB_TIPOREF = 21 and CNTB_IDREF = :IDDOC;
    /* ENCABEZADO DE LA FACTURA */
    select PREF_PRE, FACO_NUMERO, FACO_FECHA, F.TERC_NIT, FACO_IMPTOS, FACO_VENCE, FACO_DTOMONTO, FACO_ADICIONAL, FACO_IVAMONTO, FACO_EXTRA, FACO_TOTAL, FACO_RTFTEPORC, FACO_RTFTEMONTO,
        FACO_RTIVAPOR, FACO_RTIVAMONTO, FACO_RTICAPOR, FACO_RTICAMONTO, FACO_RTCREE, FACO_RTCREEM, TERC_NOM, PROV_CTARTFTE, PROV_CTARTIVA, PROV_CTARTICA, PROV_CTARTCREE, PROV_CTAPAGAR,
        FACO_NUMPROV, FACO_ANULADO, FACO_SIMPLIFICADO, FACO_DEGUELLO, FACO_IMPBA, FACO_IMPUP, IIF(faco_auto IS NULL, '', FACO_AUTO)
        from FACTURAS_COMPRA F, TERCEROS T, PROVEEDORES P where FACO_ID = :IDDOC and F.TERC_NIT = T.TERC_NIT and T.TERC_NIT = P.TERC_NIT
        into :PREFIJO, :NUM, :FECAUX, :NIT, :IMPINC, :VENCEAUX, :VRDTO, :VRADIC, :VRIVA, :VREXTRA, :VRTOTAL, :PRTFTE, :VRRTFTE,
        :PORC, :VRRTIVA, :PRTICA, :VRRTICA, :PRCREE, :VRRCREE, :NOMBRE, TCTARTFTE, TCTARTIVA, TCTARTICA, TCTARCREE, TCTAPROV, :NUMPROV, :ANULADO, :SIMP, :DEGUELLO, :TOTIMPBA, :TOTIMPUP, :autoriza;
    if (AUTORIZA <> '') then
        BEGIN
        PREFE = PREFIJO;
        NUME = CAST(:num AS INTEGER);
        END
    ELSE
        BEGIN
        execute procedure SEPARAR_PREFIJO_NUMERO(:NUMPROV) returning_values :PREFE, :NUME;
        END
    /* CENTRO DE LA BODEGA */
    if (CENT = 'B') then
        select BODE_CENTRO, BODE_PROY, BODE_SUBC from BODEGA B, FACTURAS_COMPRA F where B.BODE_COD = F.BODE_COD and F.FACO_ID = :IDDOC into :CENTRO, :PROY, :SUBCEN;
    else
        select PREF_CENTRO,PREF_PROY, PREF_SUBC  from PREFIJOS P, FACTURAS_COMPRA F where P.PREF_PRE = F.PREF_PRE and F.FACO_ID = :IDDOC and P.TIDO_COD = 21 into :CENTRO, :PROY, :SUBCEN;
    if (ANULADO = 'N') then
        begin
        NUMERO = PREFIJO || NUM;
        VRSUBT = VRTOTAL - VREXTRA - VRIVA - totimpba - totimpup;
        MERCANCIA = VRSUBT - VRADIC + VRDTO;
        execute procedure FECHA_A_CONTA(:FECAUX) returning_values (:FECHA);
        execute procedure FECHA_A_CONTA(:VENCEAUX) returning_values (:VENCE);
        if (NUMPROV is null) then
            NUMPROV = NUMERO;
        CONCEPTO = 'FC No.' || NUMERO || '-' || SUBSTR(NOMBRE,1,26) || '-NPROV.' || NUMPROV;
        IDC = gen_id(ID_CONTABILIZA, 1);
        insert into CONTABILIZACION (CNTB_ID, CNTB_TIPOCOMP, CNTB_PREFCNT, CNTB_NUMERO, CNTB_FECHA, CNTB_CONCEPTO, CNTB_REF, CNTB_TIPOREF, CNTB_IDREF, CNTB_PREFREF, CNTB_NUMREF, CNTB_PROCESADO)
            values (:IDC, :TIPOCOMP, :PREFCONT, :NUM, :FECHA, :CONCEPTO, '', 21, :IDDOC, :PREFIJO, :NUM, 'N');
        NUMITEMS = 0;
        SUMA = 0;
        NETO = 0;
        ERROR = 0;
        execute procedure lee_configuracion('COMPRAS', 'FACTURAS', 'CUENTA CONTABLE PARA IMPUESTO AL DEGUELLO DE GANADO') returning_values (:ctadeguello);
        execute procedure lee_configuracion('COMPRAS','FACTURAS','CUENTA DE IVA ASUMIDO POR COMPRAS AL REGIMEN SIMPLIFICADO') returning_values (:CTAIVARS);
        execute procedure lee_configuracion('COMPRAS','FACTURAS','DESCUENTO Y VALOR ADICIONAL DEL DOCUMENTO COMO MENOR VALOR DEL COSTO') returning_values (:MENORV);
        EXECUTE PROCEDURE lee_configuracion ('INVENTARIO', 'ARTICULOS', 'IMPOCONSUMO COMO MAYOR VALOR DEL COSTO') returning_values(:icoinc);
        EXECUTE PROCEDURE lee_configuracion ('COMPRAS', 'DOCUMENTOS', 'LLEVAR IMPUESTOS SALUDABLES COMO MAYOR VALOR DEL COSTO DEL INVENTARIO') returning_values(:isinc);
        select sum(FCDE_consumo) from facturas_compras_detalle where faco_id = :IDDOC into :valoradic;
        if (MENORV = 'SI') then
            if (MERCANCIA <> 0) then
                FACTOR = (cast(VRSUBT as double precision) - VALORADIC) / (cast(MERCANCIA as double precision) - VALORADIC);
            else
                FACTOR = 1;
        else
           FACTOR = 1;
        select cast(CONF_VALOR as integer) from CONFIGURACION where CONF_MODULO = 'COMPRAS' and CONF_CATEGORIA = 'DOCUMENTOS' and CONF_PROPIEDAD = 'REDONDEO AL MULTIPLO DE DIEZ EN TOTALES' into :DIG;
        if (INVEN = 'A') then
            begin
            for select max(COAR_CTACOMP), sum(cast(FCDE_CANT as double precision) * (FCDE_PRUNIT-FCDE_DTOMONTO)), sum(FCDE_IVAMONTO), sum(FCDE_CONSUMO), SUM(FCDE_IMPUP), SUM(FCDE_IMPBA), max(F.BODE_COD)
                from ARTICULO A, CONTABIL_ARTICULO C, FACTURAS_COMPRAS_DETALLE F where F.FACO_ID = :IDDOC and F.ARTI_COD = A.ARTI_COD and A.ARTI_COD = C.ARTI_COD
                group by COAR_CTACOMP, F.BODE_COD into :CTAINVEN, :MONTO, :IMPTOS, :VALORADIC, :IMPUP, :IMPBA, :BODE_DET do
                begin
                if (CENT = 'B') then
                  select BODE_CENTRO, BODE_PROY, BODE_SUBC from BODEGA where BODE_COD = :BODE_DET into :CENTRODET, :PROYDET, :subcendet;
                if (IMPINC = 'S') then
                    begin
                    MONTO = MONTO - IMPTOS;
                    MONTO = MONTO - VALORADIC;
                    end
                if (isinc <> 'SI') then
                    MONTO = MONTO - IMPBA - IMPUP;
                if (ICOINC = 'SI') then
                    MONTO = MONTO + VALORADIC;
                MONTO = MONTO * FACTOR;
                execute procedure redondee(MONTO, DIG) returning_values (MONTO);
                execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
                execute procedure CUENTA_INTERFAZ(21, :IDDOC, :CTAINVEN, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (TIPOCUEN = 'I') then
                    begin
                    for select F.ARTI_COD, (FCDE_CANT * (FCDE_PRUNIT-FCDE_DTOMONTO)), FCDE_IVAMONTO, FCDE_CONSUMO
                        from ARTICULO A, CONTABIL_ARTICULO C, FACTURAS_COMPRAS_DETALLE F where F.FACO_ID = :IDDOC and F.ARTI_COD = A.ARTI_COD and A.ARTI_COD = C.ARTI_COD and COAR_CTACOMP = :CUENTA
                        into :ARTICULO, :MONTO, :IMPTOS, :VALORADIC do
                        begin
                        if (IMPINC = 'S') then
                            begin
                            MONTO = MONTO - IMPTOS;
                            MONTO = MONTO - VALORADIC;
                            end
                        if (ICOINC = 'SI') then
                            MONTO = MONTO + VALORADIC;
                        MONTO = MONTO * FACTOR;
                        execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
                        execute procedure redondee(MONTO, DIG) returning_values (MONTO);
                        if (CENT = 'B') then
                           insert into CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC,
                                CNDE_PROY, CNDE_CENTRO, CNDE_SUBC, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON, CNDE_PREF, CNDE_FOLIOE)
                               values (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :MONTO, 0, 0, 0, :NIT,
                                :PROYDET, :CENTRODET, :SUBCENDET, :ARTICULO, 0, 0, :prefe, :nume);
                        else
                           insert into CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC,
                               CNDE_PROY, CNDE_CENTRO, CNDE_SUBC, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON, CNDE_PREF, CNDE_FOLIOE)
                               values (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :MONTO, 0, 0, 0, :NIT,
                               :PROY, :CENTRO, :SUBCEN, :ARTICULO, 0, 0, :prefe, :nume);
                        NUMITEMS = NUMITEMS + 1;
                        NETO = NETO + MONTO;
                        end
                    end
                if (TIPOCUEN = 'C') then
                    begin
                    if (CENT = 'B') then
                       insert into CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_SUBC, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_DOCTIPOA, CNDE_DOCTIPON, CNDE_PREF, CNDE_FOLIOE)
                           values (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :MONTO, 0, 0, 0, :NIT, :PROYDET, :CENTRODET, :SUBCENDET, :NUMERO, null, :VENCE, 0, 21, :prefe, :nume);
                    else
                       insert into CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_SUBC, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_DOCTIPOA, CNDE_DOCTIPON, CNDE_PREF, CNDE_FOLIOE)
                           values (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, :SUBCEN, :NUMERO, null, :VENCE, 0, 21, :prefe, :nume);
                    NUMITEMS = NUMITEMS + 1;
                    NETO = NETO + MONTO;
                    end
                if (TIPOCUEN = 'N') then
                    begin
                    if (CENT = 'B') then
                       insert into CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_SUBC, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON, CNDE_PREF, CNDE_FOLIOE)
                           values (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :MONTO, 0, 0, 0, :NIT, :PROYDET, :CENTRODET, :subcendet, null, null, null, null, 0, 0, :prefe, :nume);
                    else
                       insert into CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_SUBC, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON, CNDE_PREF, CNDE_FOLIOE)
                           values (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, :SUBCEN, null, null, null, null, 0, 0, :prefe, :nume);
                    NUMITEMS = NUMITEMS + 1;
                    NETO = NETO + MONTO;
                    end
                end
            end
        if (INVEN = 'K') then
            begin
            for select sum(cast(FCDE_CANT as double precision) * (FCDE_PRUNIT-FCDE_DTOMONTO)), sum(FCDE_IVAMONTO), sum(FCDE_CONSUMO), SUM(FCDE_IMPUP), SUM(FCDE_IMPBA), max(BODE_COD)
                from FACTURAS_COMPRAS_DETALLE where FACO_ID = :IDDOC group by BODE_COD into :MONTO, :IMPTOS, :VALORADIC, :IMPUP, :IMPBA, :BODE_DET do
                begin
                  if (CENT = 'B') then
                    select BODE_CENTRO, BODE_PROY, BODE_SUBC from BODEGA where BODE_COD = :BODE_DET into :CENTRODET, :PROYDET, :subcendet;
                  if (IMPINC = 'S') then
                   begin
                    MONTO = MONTO - IMPTOS;
                    MONTO = MONTO - VALORADIC;
                   end
                if (isinc <> 'SI') then
                    MONTO = MONTO - IMPBA - IMPUP;
                  if (ICOINC = 'SI') then
                    MONTO = MONTO + VALORADIC;
                  MONTO = MONTO * FACTOR;
                  execute procedure redondee(MONTO, DIG) returning_values (MONTO);
                  execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
                  execute procedure CUENTA_INTERFAZ(21, :IDDOC, :CTAINVEN, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                  if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                  if (TIPOCUEN = 'C') then
                   begin
                    if (CENT = 'B') then
                       insert into CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_SUBC, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_DOCTIPOA, CNDE_DOCTIPON, CNDE_PREF, CNDE_FOLIOE)
                         values (:IDC, :NUMITEMS, :CTAINVEN, :CONCEPTO, '', :MONTO, 0, 0, 0, :NIT, :PROYDET, :CENTRODET, :SUBCENDET, :NUMERO, null, :VENCE, 0, 21, :prefe, :nume);
                    else
                       insert into CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_SUBC, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_DOCTIPOA, CNDE_DOCTIPON, CNDE_PREF, CNDE_FOLIOE)
                         values (:IDC, :NUMITEMS, :CTAINVEN, :CONCEPTO, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, :SUBCEN, :NUMERO, null, :VENCE, 0, 21, :prefe, :nume);
                    NUMITEMS = NUMITEMS + 1;
                    NETO = NETO + MONTO;
                   end
                  if (TIPOCUEN = 'N') then
                   begin
                    if (CENT = 'B') then
                       insert into CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_SUBC, CNDE_DOCTIPOA, CNDE_DOCTIPON, CNDE_PREF, CNDE_FOLIOE)
                          values (:IDC, :NUMITEMS, :CTAINVEN, :CONCEPTO, '', :MONTO, 0, 0, 0, :NIT, :PROYDET, :CENTRODET, :SUBCENDET, 0, 0, :prefe, :nume);
                    else
                       insert into CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_SUBC, CNDE_DOCTIPOA, CNDE_DOCTIPON, CNDE_PREF, CNDE_FOLIOE)
                          values (:IDC, :NUMITEMS, :CTAINVEN, :CONCEPTO, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, :SUBCEN, 0, 0, :prefe, :nume);
                    NUMITEMS = NUMITEMS + 1;
                    NETO = NETO + MONTO;
                   end
                end
            end
        /* EL IVA */
        if ((IVA = 'A') and ((SIMP = 'N') or (ctaivars = ''))) then
            begin
            for select max(COAR_CTAIVAC), sum(FCDE_IVAMONTO), sum(FCDE_TOTAL-FCDE_IVAMONTO-FCDE_CONSUMO-FCDE_IMPBA-FCDE_IMPUP), sum(FCDE_CONSUMO)
                from ARTICULO A, CONTABIL_ARTICULO C, FACTURAS_COMPRAS_DETALLE F
                where F.FACO_ID = :IDDOC and F.ARTI_COD = A.ARTI_COD and A.ARTI_COD = C.ARTI_COD and FCDE_IVAMONTO <> 0
                group by COAR_CTAIVAC
                into :CTAIVA, :IMPTOS, :MONTO, :VALORADIC do
              if (IMPTOS <> 0) then
                begin
                if (MERCANCIA <> 0) then
                    IMPTOS = CAST(IMPTOS AS DOUBLE PRECISION) * VRSUBT / MERCANCIA;
                else
                    IMPTOS = 0;
                if (IMPINC = 'S') then
                    begin
                    MONTO = MONTO - IMPTOS;
                    MONTO = MONTO - VALORADIC;
                    end
                if (MERCANCIA <> 0) then
                    MONTO = cast(MONTO as double precision) * VRSUBT / MERCANCIA;
                else
                    MONTO = 0;
                execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
                execute procedure redondee(MONTO, DIG) returning_values (MONTO);
                execute procedure CUENTA_INTERFAZ(21, :IDDOC, :CTAIVA, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (TIPOCUEN = 'I') then
                    begin
                    for select F.ARTI_COD, FCDE_IVAMONTO, (FCDE_CANT * (FCDE_PRUNIT-FCDE_DTOMONTO)), TAIV_PORC, FCDE_CONSUMO
                        from ARTICULO A, CONTABIL_ARTICULO C, FACTURAS_COMPRAS_DETALLE F, TARIFA_IVA T where F.FACO_ID = :IDDOC and F.ARTI_COD = A.ARTI_COD and A.ARTI_COD = C.ARTI_COD and COAR_CTAIVAV = :CUENTA and A.TAIV_COD = T.TAIV_COD
                        into :ARTICULO, :IMPTOS, :MONTO, :PORCIVA, :VALORADIC
                    do
                        begin
                        if (MERCANCIA <> 0) then
                            IMPTOS = cast(IMPTOS as double precision) * VRSUBT / MERCANCIA;
                        else
                            IMPTOS = 0;
                        if (IMPINC = 'S') then
                            begin
                            MONTO = MONTO - IMPTOS;
                            MONTO = MONTO - VALORADIC;
                            end
                        if (MERCANCIA <> 0) then
                            MONTO = cast(MONTO as double precision) * VRSUBT / MERCANCIA;
                        else
                            MONTO = 0;
                        execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
                        execute procedure redondee(MONTO, DIG) returning_values (MONTO);
                        insert into CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_SUBC, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON, CNDE_PREF, CNDE_FOLIOE)
                            values (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :IMPTOS, 0, :MONTO, :PORCIVA, :NIT, :PROY, :CENTRO, :SUBCEN, null, null, null, :ARTICULO, 0, 0, :prefe, :nume);
                        NUMITEMS = NUMITEMS + 1;
                        NETO = NETO + IMPTOS;
                        end
                    end
                if (TIPOCUEN = 'C') then
                    begin
                    insert into CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_SUBC, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_DOCTIPOA, CNDE_DOCTIPON, CNDE_PREF, CNDE_FOLIOE)
                        values (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :IMPTOS, 0, :MONTO, :IMPTOS*100/:MONTO, :NIT, :PROY, :CENTRO, :SUBCEN, :NUMERO, null, :VENCE, 0, 21, :prefe, :nume);
                    NUMITEMS = NUMITEMS + 1;
                    NETO = NETO + IMPTOS;
                    end
                if (TIPOCUEN = 'N') then
                    begin
                    insert into CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_SUBC, CNDE_DOCTIPOA, CNDE_DOCTIPON, CNDE_PREF, CNDE_FOLIOE)
                        values (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :IMPTOS, 0, :MONTO, cast(:IMPTOS as double precision)*100/cast(:MONTO as double precision), :NIT, :PROY, :CENTRO, :SUBCEN, 0, 0, :prefe, :nume);
                    NUMITEMS = NUMITEMS + 1;
                    NETO = NETO + IMPTOS;
                    end
                end
            end
        if ((IVA = 'K') or ((SIMP = 'S') and (ctaivars <> ''))) then  /* IVA EN CTA CONSTANTE */
            begin
            select sum(FCDE_IVAMONTO), sum(FCDE_TOTAL-FCDE_IVAMONTO-FCDE_CONSUMO-FCDE_IMPBA-FCDE_IMPUP), sum(FCDE_CONSUMO)
                from FACTURAS_COMPRAS_DETALLE F
                where F.FACO_ID = :IDDOC  and FCDE_IVAMONTO <> 0
                into :IMPTOS, :MONTO, :VALORADIC;
            if (IMPTOS <> 0) then
                begin
                if (SIMP = 'S') then
                    CTAIVA = ctaivars;
                if (MERCANCIA <> 0) then
                    IMPTOS = cast(IMPTOS as double precision) * VRSUBT / MERCANCIA;
                else
                    IMPTOS = 0;
                if (IMPINC = 'S') then
                    begin
                    MONTO = MONTO - IMPTOS;
                    MONTO = MONTO - VALORADIC;
                    end
                if (MERCANCIA <> 0) then
                    MONTO = cast(MONTO as double precision) * VRSUBT / MERCANCIA;
                else
                    MONTO = 0;
                execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
                execute procedure redondee(MONTO, DIG) returning_values (MONTO);
                execute procedure CUENTA_INTERFAZ(21, :IDDOC, :CTAIVA, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (TIPOCUEN = 'C') then
                    begin
                    insert into CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_SUBC, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_DOCTIPOA, CNDE_DOCTIPON, CNDE_PREF, CNDE_FOLIOE)
                        values (:IDC, :NUMITEMS, :CTAIVA, :CONCEPTO, '', :IMPTOS, 0, :MONTO, :IMPTOS*100/:MONTO, :NIT, :PROY, :CENTRO, :SUBCEN, :NUMERO, null, :VENCE, 0, 21, :prefe, :nume);
                    NUMITEMS = NUMITEMS + 1;
                    NETO = NETO + IMPTOS;
                    end
                if (TIPOCUEN = 'N') then
                    begin
                    insert into CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_SUBC, CNDE_DOCTIPOA, CNDE_DOCTIPON, CNDE_PREF, CNDE_FOLIOE)
                        values (:IDC, :NUMITEMS, :CTAIVA, :CONCEPTO, '', :IMPTOS, 0, :MONTO, :IMPTOS*100/:MONTO, :NIT, :PROY, :CENTRO, :SUBCEN, 0, 0, :prefe, :nume);
                    NUMITEMS = NUMITEMS + 1;
                    NETO = NETO + IMPTOS;
                    end
                end
            end
        /* EL IMPOCONSUMO */
        if ((CONSUMO = 'A') AND (ICOINC <> 'SI')) then
            begin
            for select max(COAR_CTACONS), sum(FCDE_CONSUMO) from ARTICULO A, CONTABIL_ARTICULO C, FACTURAS_COMPRAS_DETALLE F
                where F.FACO_ID = :IDDOC and F.ARTI_COD = A.ARTI_COD and A.ARTI_COD = C.ARTI_COD group by COAR_CTACONS into :CTACONSUMO, :IMPTOS
            do
              if (IMPTOS <> 0) then
                begin
                execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
                execute procedure CUENTA_INTERFAZ(21, :IDDOC, :CTACONSUMO, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (TIPOCUEN = 'I') then
                    begin
                    for select F.ARTI_COD, FCDE_CONSUMO from ARTICULO A, FACTURAS_COMPRAS_DETALLE F where F.FACO_ID = :IDDOC into :ARTICULO, :IMPTOS
                        do
                        begin
                        if (IMPTOS <> 0) then
                            begin
                            execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
                            insert into CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_SUBC, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON, CNDE_PREF, CNDE_FOLIOE)
                                values (:IDC, :NUMITEMS, :CTACONSUMO, :CONCEPTO, '', :IMPTOS, 0, 0, 0, :NIT, :PROY, :CENTRO, :SUBCEN, :ARTICULO, 0, 0, :prefe, :nume);
                            NUMITEMS = NUMITEMS + 1;
                            NETO = NETO + IMPTOS;
                            end
                        end
                    end
                if (TIPOCUEN = 'C') then
                    begin
                    insert into CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_SUBC, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_DOCTIPOA, CNDE_DOCTIPON, CNDE_PREF, CNDE_FOLIOE)
                        values (:IDC, :NUMITEMS, :CTACONSUMO, :CONCEPTO, '', :IMPTOS, 0, 0, 0, :NIT, :PROY, :CENTRO, :SUBCEN, :NUMERO, null, :VENCE, 0, 21, :prefe, :nume);
                    NUMITEMS = NUMITEMS + 1;
                    NETO = NETO + IMPTOS;
                    end
                if (TIPOCUEN = 'N') then
                    begin
                    insert into CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_SUBC, CNDE_DOCTIPOA, CNDE_DOCTIPON, CNDE_PREF, CNDE_FOLIOE)
                        values (:IDC, :NUMITEMS, :CTACONSUMO, :CONCEPTO, '', :IMPTOS, 0, 0, 0, :NIT, :PROY, :CENTRO, :SUBCEN, 0, 0, :prefe, :nume);
                    NUMITEMS = NUMITEMS + 1;
                    NETO = NETO + IMPTOS;
                    end
                end
            end
        if ((CONSUMO = 'K') AND (ICOINC <> 'SI')) then
            begin
            select sum(FCDE_CONSUMO) from FACTURAS_COMPRAS_DETALLE F where F.FACO_ID = :IDDOC into :IMPTOS;
            if (IMPTOS <> 0) then
                begin
                execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
                /* TRAIGA LAS CARACTERISTICAS DE LA CUENTA */
                execute procedure CUENTA_INTERFAZ(21, :IDDOC, :CTACONSUMO, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                /* DEPENDE DEL TIPO DE CUENTA */
                if (TIPOCUEN = 'I') then
                    begin
                    /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                    for select F.ARTI_COD, FCDE_CONSUMO from ARTICULO A, FACTURAS_COMPRAS_DETALLE F where F.FACO_ID = :IDDOC into :ARTICULO, :IMPTOS
                        do
                        begin
                        if (IMPTOS <> 0) then
                            begin
                            execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
                            insert into CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_SUBC, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON, CNDE_PREF, CNDE_FOLIOE)
                                values (:IDC, :NUMITEMS, :CTACONSUMO, :CONCEPTO, '', :IMPTOS, 0, 0, 0, :NIT, :PROY, :CENTRO, :SUBCEN, :ARTICULO, 0, 0, :prefe, :nume);
                            NUMITEMS = NUMITEMS + 1;
                            NETO = NETO + IMPTOS;
                            end
                        end
                    end
                if (TIPOCUEN = 'C') then
                    begin
                    /* INSERTE EL REGISTRO DE LA BASE */
                    insert into CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_SUBC, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_DOCTIPOA, CNDE_DOCTIPON, CNDE_PREF, CNDE_FOLIOE)
                        values (:IDC, :NUMITEMS, :CTACONSUMO, :CONCEPTO, '', :IMPTOS, 0, 0, 0, :NIT, :PROY, :CENTRO, :SUBCEN, :NUMERO, null, :VENCE, 0, 21, :prefe, :nume);
                    NUMITEMS = NUMITEMS + 1;
                    NETO = NETO + IMPTOS;
                    end
                if (TIPOCUEN = 'N') then
                    begin
                    insert into CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_SUBC, CNDE_DOCTIPOA, CNDE_DOCTIPON, CNDE_PREF, CNDE_FOLIOE)
                        values (:IDC, :NUMITEMS, :CTACONSUMO, :CONCEPTO, '', :IMPTOS, 0, 0, 0, :NIT, :PROY, :CENTRO, :SUBCEN, 0, 0, :prefe, :nume);
                    NUMITEMS = NUMITEMS + 1;
                    NETO = NETO + IMPTOS;
                    end
                end
            end
        /* EL FOMENTO */
        if (FOMENTO = 'A') then
            begin
            for select max(COAR_CTAFOMENTO), sum(FCDE_FOMM) from ARTICULO A, CONTABIL_ARTICULO C, FACTURAS_COMPRAS_DETALLE F
                where F.FACO_ID = :IDDOC and F.ARTI_COD = A.ARTI_COD and A.ARTI_COD = C.ARTI_COD group by COAR_CTAFOMENTO into :CTAFOMENTO, :IMPTOS
            do
              if (IMPTOS <> 0) then
                begin
                execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
                execute procedure CUENTA_INTERFAZ(21, :IDDOC, :CTAFOMENTO, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (TIPOCUEN = 'I') then
                    begin
                    for select F.ARTI_COD, FCDE_FOMM from ARTICULO A, FACTURAS_COMPRAS_DETALLE F where F.FACO_ID = :IDDOC into :ARTICULO, :IMPTOS
                        do
                        begin
                        if (IMPTOS <> 0) then
                            begin
                            execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
                            insert into CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_SUBC, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON, CNDE_PREF, CNDE_FOLIOE)
                                values (:IDC, :NUMITEMS, :CTAFOMENTO, :CONCEPTO, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, :SUBCEN, :ARTICULO, 0, 0, :prefe, :nume);
                            NUMITEMS = NUMITEMS + 1;
                            NETO = NETO - IMPTOS;
                            end
                        end
                    end
                if (TIPOCUEN = 'C') then
                    begin
                    insert into CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_SUBC, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_DOCTIPOA, CNDE_DOCTIPON, CNDE_PREF, CNDE_FOLIOE)
                        values (:IDC, :NUMITEMS, :CTAFOMENTO, :CONCEPTO, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, :SUBCEN, :NUMERO, null, :VENCE, 0, 21, :prefe, :nume);
                    NUMITEMS = NUMITEMS + 1;
                    NETO = NETO - IMPTOS;
                    end
                if (TIPOCUEN = 'N') then
                    begin
                    insert into CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_SUBC, CNDE_DOCTIPOA, CNDE_DOCTIPON, CNDE_PREF, CNDE_FOLIOE)
                        values (:IDC, :NUMITEMS, :CTAFOMENTO, :CONCEPTO, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, :SUBCEN, 0, 0, :prefe, :nume);
                    NUMITEMS = NUMITEMS + 1;
                    NETO = NETO - IMPTOS;
                    end
                end
            end
        if (FOMENTO = 'K') then /* CONSUMO EN CTA CONSTANTE */
            begin
            select sum(FCDE_FOMM) from FACTURAS_COMPRAS_DETALLE F where F.FACO_ID = :IDDOC into :IMPTOS;
            if (IMPTOS <> 0) then
                begin
                execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
                /* TRAIGA LAS CARACTERISTICAS DE LA CUENTA */
                execute procedure CUENTA_INTERFAZ(21, :IDDOC, :CTAFOMENTO, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                /* DEPENDE DEL TIPO DE CUENTA */
                if (TIPOCUEN = 'I') then
                    begin
                    /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                    for select F.ARTI_COD, FCDE_CONSUMO from ARTICULO A, FACTURAS_COMPRAS_DETALLE F where F.FACO_ID = :IDDOC into :ARTICULO, :IMPTOS
                        do
                        begin
                        if (IMPTOS <> 0) then
                            begin
                            execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
                            insert into CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_SUBC, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON, CNDE_PREF, CNDE_FOLIOE)
                                values (:IDC, :NUMITEMS, :CTAFOMENTO, :CONCEPTO, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, :SUBCEN, :ARTICULO, 0, 0, :prefe, :nume);
                            NUMITEMS = NUMITEMS + 1;
                            NETO = NETO - IMPTOS;
                            end
                        end
                    end
                if (TIPOCUEN = 'C') then
                    begin
                    /* INSERTE EL REGISTRO DE LA BASE */
                    insert into CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_SUBC, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_DOCTIPOA, CNDE_DOCTIPON, CNDE_PREF, CNDE_FOLIOE)
                        values (:IDC, :NUMITEMS, :CTAFOMENTO, :CONCEPTO, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, :SUBCEN, :NUMERO, null, :VENCE, 0, 21, :prefe, :nume);
                    NUMITEMS = NUMITEMS + 1;
                    NETO = NETO - IMPTOS;
                    end
                if (TIPOCUEN = 'N') then
                    begin
                    insert into CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_SUBC, CNDE_DOCTIPOA, CNDE_DOCTIPON, CNDE_PREF, CNDE_FOLIOE)
                        values (:IDC, :NUMITEMS, :CTAFOMENTO, :CONCEPTO, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, :SUBCEN, 0, 0, :prefe, :nume);
                    NUMITEMS = NUMITEMS + 1;
                    NETO = NETO - IMPTOS;
                    end
                end
            end
        if (isinc <> 'SI') then
            begin
            if (totimpba <> 0) then /* IMP BEBIDAS AZUCARADAS */
                begin
                execute procedure redondee(totimpba, DIG) returning_values (IMPTOS);
    
                /* TRAIGA LAS CARACTERISTICAS DE LA CUENTA */
                EXECUTE PROCEDURE lee_configuracion('COMPRAS', 'FACTURAS', 'CUENTA CONTABLE PARA IMPUESTO EN COMPRAS DE BEBIDAS AZUCARADAS') returning_values (ctafomento);
                execute procedure CUENTA_INTERFAZ(21, :IDDOC, :CTAFOMENTO, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (TIPOCUEN = 'C') then
                    TIPOCUEN = 'N';
                if (TIPOCUEN = 'N') then
                    begin
                    insert into CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_SUBC, CNDE_DOCTIPOA, CNDE_DOCTIPON, CNDE_PREF, CNDE_FOLIOE)
                        values (:IDC, :NUMITEMS, :CTAFOMENTO, :CONCEPTO, '', :IMPTOS, 0, 0, 0, :NIT, :PROY, :CENTRO, :SUBCEN, 0, 0, :prefe, :nume);
                    NUMITEMS = NUMITEMS + 1;
                    NETO = NETO + IMPTOS;
                    end
                end
            if (totimpup <> 0) then /* IMP ULTRAPROCESADOS */
                begin
                execute procedure redondee(totimpup, DIG) returning_values (IMPTOS);
    
                /* TRAIGA LAS CARACTERISTICAS DE LA CUENTA */
                EXECUTE PROCEDURE lee_configuracion('COMPRAS', 'FACTURAS', 'CUENTA CONTABLE PARA IMPUESTO EN COMPRAS DE ALIMENTOS ULTRAPROCESADOS') returning_values (ctafomento);
                execute procedure CUENTA_INTERFAZ(21, :IDDOC, :CTAFOMENTO, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (TIPOCUEN = 'C') then
                    TIPOCUEN = 'N';
                if (TIPOCUEN = 'N') then
                    begin
                    insert into CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_SUBC, CNDE_DOCTIPOA, CNDE_DOCTIPON, CNDE_PREF, CNDE_FOLIOE)
                        values (:IDC, :NUMITEMS, :CTAFOMENTO, :CONCEPTO, '', :IMPTOS, 0, 0, 0, :NIT, :PROY, :CENTRO, :SUBCEN, 0, 0, :prefe, :nume);
                    NUMITEMS = NUMITEMS + 1;
                    NETO = NETO + IMPTOS;
                    end
                end
            end
        /* DESCUENTO */
        if ((CTADTO is not null) and
            (CTADTO <> '')) then
          begin
          execute procedure redondee(VRDTO, DIG) returning_values (VRDTO);
          if (VRDTO <> 0) then
            begin
            /* TRAIGA LAS CARACTERISTICAS DE LA CUENTA */
            execute procedure CUENTA_INTERFAZ(21, :IDDOC, :CTADTO, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'C') then
                begin
                insert into CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_SUBC, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_DOCTIPOA, CNDE_DOCTIPON, CNDE_PREF, CNDE_FOLIOE)
                    values (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :VRDTO, 0, 0, :NIT, :PROY, :CENTRO, :SUBCEN, :NUMERO, null, :VENCE, 0, 21, :prefe, :nume);
                NUMITEMS = NUMITEMS + 1;
                NETO = NETO - VRDTO;
                end
            if (TIPOCUEN = 'N') then
                begin
                /* INSERTE EL REGISTRO DE LA BASE */
                insert into CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_SUBC, CNDE_DOCTIPOA, CNDE_DOCTIPON, CNDE_PREF, CNDE_FOLIOE)
                    values (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :VRDTO, 0, 0, :NIT, :PROY, :CENTRO, :SUBCEN, 0, 0, :prefe, :nume);
                NUMITEMS = NUMITEMS + 1;
                NETO = NETO - VRDTO;
                end
            end
          end
        /* DEGUELLO */
        if ((ctadeguello is not null) and (ctadeguello <> '') and (deguello <> 0)) then
            begin
            /* TRAIGA LAS CARACTERISTICAS DE LA CUENTA */
            execute procedure CUENTA_INTERFAZ(21, :IDDOC, :ctadeguello, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'C') then
                begin
                insert into CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_SUBC, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_DOCTIPOA, CNDE_DOCTIPON, CNDE_PREF, CNDE_FOLIOE)
                    values (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :deguello, 0, 0, :NIT, :PROY, :CENTRO, :SUBCEN, :NUMERO, null, :VENCE, 0, 21, :prefe, :nume);
                NUMITEMS = NUMITEMS + 1;
                NETO = NETO - deguello;
                end
            if (TIPOCUEN = 'N') then
                begin
                /* INSERTE EL REGISTRO DE LA BASE */
                insert into CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_SUBC, CNDE_DOCTIPOA, CNDE_DOCTIPON, CNDE_PREF, CNDE_FOLIOE)
                    values (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :deguello, 0, 0, :NIT, :PROY, :CENTRO, :SUBCEN, 0, 0, :prefe, :nume);
                NUMITEMS = NUMITEMS + 1;
                NETO = NETO - deguello;
                end
            end
        /* VALOR ADIC */
        if ((CTAADIC is not null) and
            (CTAADIC <> '')) then
          begin
          execute procedure redondee(VRADIC, DIG) returning_values (VRADIC);
          if (VRADIC <> 0) then
            begin
            /* TRAIGA LAS CARACTERISTICAS DE LA CUENTA */
            execute procedure CUENTA_INTERFAZ(21, :IDDOC, :CTAADIC, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'C') then
                begin
                insert into CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_SUBC, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_DOCTIPOA, CNDE_DOCTIPON, CNDE_PREF, CNDE_FOLIOE)
                    values (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :VRADIC, 0, 0, 0, :NIT, :PROY, :CENTRO, :SUBCEN, :NUMERO, null, :VENCE, 0, 21, :prefe, :nume);
                NUMITEMS = NUMITEMS + 1;
                NETO = NETO + VRADIC;
                end
            if (TIPOCUEN = 'N') then
                begin
                insert into CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_SUBC, CNDE_DOCTIPOA, CNDE_DOCTIPON, CNDE_PREF, CNDE_FOLIOE)
                    values (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :VRADIC, 0, 0, 0, :NIT, :PROY, :CENTRO, :SUBCEN, 0, 0, :prefe, :nume);
                NUMITEMS = NUMITEMS + 1;
                NETO = NETO + VRADIC;
                end
            end
          end
        /* VALOR EXTRA */
        if ((CTAEXTRA is not null) and
            (CTAEXTRA <> '')) then
          begin
          execute procedure redondee(VREXTRA, DIG) returning_values (VREXTRA);
          if (VREXTRA <> 0) then
            begin
            /* TRAIGA LAS CARACTERISTICAS DE LA CUENTA */
            execute procedure CUENTA_INTERFAZ(21, :IDDOC, :CTAEXTRA, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'C') then
                begin
                if (VREXTRA > 0) then
                    insert into CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_SUBC, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_DOCTIPOA, CNDE_DOCTIPON, CNDE_PREF, CNDE_FOLIOE)
                        values (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :VREXTRA, 0, 0, 0, :NIT, :PROY, :CENTRO, :SUBCEN, :NUMERO, null, :VENCE, 0, 21, :prefe, :nume);
                else
                    insert into CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_SUBC, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON, CNDE_PREF, CNDE_FOLIOE)
                        values (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, (:VREXTRA*-1), 0, 0, :NIT, :PROY, :CENTRO, :SUBCEN, :NUMERO, null, :VENCE, null, 0, 21, :prefe, :nume);
                NUMITEMS = NUMITEMS + 1;
                NETO = NETO + VREXTRA;
                end
            if (TIPOCUEN = 'N') then
                begin
                if (VREXTRA > 0) then
                    insert into CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_SUBC, CNDE_DOCTIPOA, CNDE_DOCTIPON, CNDE_PREF, CNDE_FOLIOE)
                        values (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :VREXTRA, 0, 0, 0, :NIT, :PROY, :CENTRO, :SUBCEN, 0, 0, :prefe, :nume);
                else
                    insert into CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_SUBC, CNDE_DOCTIPOA, CNDE_DOCTIPON, CNDE_PREF, CNDE_FOLIOE)
                        values (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, (:VREXTRA*-1), 0, 0, :NIT, :PROY, :CENTRO, :SUBCEN, 0, 0, :prefe, :nume);
                NUMITEMS = NUMITEMS + 1;
                NETO = NETO + VREXTRA;
                end
            end
          end

        /* DESCUENTE EL IMPOCONSUMO */
        select sum(FCDE_CONSUMO) from FACTURAS_COMPRAS_DETALLE F where F.FACO_ID = :IDDOC into :IMPTOS;
        if (IMPTOS is null) then
            IMPTOS = 0;
        vrsubt = vrsubt - IMPTOS;
        /* RETENCION FUENTE */
        if ((RTFTE = 'P') or (RTFTE = 'K')) then
          begin
          execute procedure redondee(VRRTFTE, DIG) returning_values (VRRTFTE);
          if (VRRTFTE <> 0) then
            begin
            if (RTFTE = 'P') then
                CTARTFTE = TCTARTFTE;
            execute procedure CUENTA_INTERFAZ(21, :IDDOC, :CTARTFTE, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'C') then
                begin
                insert into CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_SUBC, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_DOCTIPOA, CNDE_DOCTIPON, CNDE_PREF, CNDE_FOLIOE)
                    values (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :VRRTFTE, (:VRSUBT*-1), :PRTFTE, :NIT, :PROY, :CENTRO, :SUBCEN, :NUMERO, null, :VENCE, 0, 21, :prefe, :nume);
                NUMITEMS = NUMITEMS + 1;
                NETO = NETO - VRRTFTE;
                SUMA = VRRTFTE;
                end
            if (TIPOCUEN = 'N') then
                begin
                insert into CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_SUBC, CNDE_DOCTIPOA, CNDE_DOCTIPON, CNDE_PREF, CNDE_FOLIOE)
                    values (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :VRRTFTE, (:VRSUBT*-1), :PRTFTE, :NIT, :PROY, :CENTRO, :SUBCEN, 0, 0, :prefe, :nume);
                NUMITEMS = NUMITEMS + 1;
                NETO = NETO - VRRTFTE;
                SUMA = VRRTFTE;
                end
            end
          end
        if ((RTFTE = 'A') AND (vrrtfte <> 0)) then
          begin
          for select max(COAR_CTARTFTE), max(COAR_RTFTE), min(COAR_RTBASE), sum(FCDE_TOTAL-FCDE_IVAMONTO-FCDE_CONSUMO-FCDE_IMPBA-FCDE_IMPUP), sum((FCDE_TOTAL-FCDE_IVAMONTO-FCDE_CONSUMO)*COAR_RTFTE)
            from CONTABIL_ARTICULO C, FACTURAS_COMPRAS_DETALLE F
            where F.faco_id = :IDDOC and F.ARTI_COD = C.ARTI_COD
            group by COAR_CTARTFTE
            into :CTARTFTE, :PRTFTE, :baseadic,  :MONTO, :VRRTFTE
            do
            begin
            MONTO = MONTO * FACTOR * -1;
            if (abs(MONTO) >= :baseadic) then
                begin
                VRRTFTE = VRRTFTE * FACTOR / 100;
                execute procedure redondee(VRRTFTE, DIG) returning_values (VRRTFTE);
                execute procedure redondee(MONTO, DIG) returning_values (MONTO);
                if (VRRTFTE <> 0) then
                    begin
                    execute procedure CUENTA_INTERFAZ(21, :IDDOC, :CTARTFTE, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
                    if (ERRORC <> 0) then
                        ERROR = ERROR + 1;
                    if (TIPOCUEN = 'C') then
                        begin
                        insert into CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_SUBC, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_DOCTIPOA, CNDE_DOCTIPON, CNDE_PREF, CNDE_FOLIOE)
                            values (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :VRRTFTE, :VRSUBT, :PRTFTE, :NIT, :PROY, :CENTRO, :SUBCEN, :NUMERO, null, :VENCE, 0, 21, :prefe, :nume);
                        NUMITEMS = NUMITEMS + 1;
                        NETO = NETO - VRRTFTE;
                        SUMA = VRRTFTE;
                        end
                    if (TIPOCUEN = 'N') then
                        begin
                        insert into CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_SUBC, CNDE_DOCTIPOA, CNDE_DOCTIPON, CNDE_PREF, CNDE_FOLIOE)
                            values (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :VRRTFTE, :VRSUBT, :PRTFTE, :NIT, :PROY, :CENTRO, :SUBCEN, 0, 0, :prefe, :nume);
                        NUMITEMS = NUMITEMS + 1;
                        NETO = NETO - VRRTFTE;
                        SUMA = VRRTFTE;
                        end
                    end
                end
              end
          end
        /* RETENCION IVA */
        if ((RTIVA = 'P') or (RTIVA = 'K')) then
          begin
          execute procedure redondee(VRRTIVA, DIG) returning_values (VRRTIVA);
          if (VRRTIVA <> 0) then
            begin
            if (RTIVA = 'P') then
                CTARTIVA = TCTARTIVA;
            execute procedure CUENTA_INTERFAZ(21, :IDDOC, :CTARTIVA, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            /* SI ES DOCUMENTO EQUIVALENTE */
            if (VRRTIVA = VRIVA) then
                BEGIN
                EXECUTE PROCEDURE LEE_CONFIGURACION('COMPRAS', 'FACTURAS', 'PORCENTAJE DE RETENCION DE IVA PARA REGIMEN SIMPLIFICADO') returning_values (:PORC);
                if (PORC <> 0) then
                    VRIVA = VRRTIVA * 100 / PORC;
                END
            if (TIPOCUEN = 'C') then
                begin
                insert into CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_SUBC, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_DOCTIPOA, CNDE_DOCTIPON, CNDE_PREF, CNDE_FOLIOE)
                    values (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :VRRTIVA, (:VRIVA*-1), :PORC, :NIT, :PROY, :CENTRO, :SUBCEN, :NUMERO, null, :VENCE, 0, 21, :prefe, :nume);
                NUMITEMS = NUMITEMS + 1;
                NETO = NETO - VRRTIVA;
                SUMA = SUMA + VRRTIVA;
                end
            if (TIPOCUEN = 'N') then
                begin
                insert into CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_SUBC, CNDE_DOCTIPOA, CNDE_DOCTIPON, CNDE_PREF, CNDE_FOLIOE)
                    values (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :VRRTIVA, (:VRIVA*-1), :PORC, :NIT, :PROY, :CENTRO, :SUBCEN, 0, 0, :prefe, :nume);
                NUMITEMS = NUMITEMS + 1;
                NETO = NETO - VRRTIVA;
                SUMA = SUMA + VRRTIVA;
                end
            end
          end
        /* RETENCION DE ICA */
        if ((RTICA = 'P') or (RTICA = 'K')) then
          begin
          execute procedure redondee(VRRTICA, DIG) returning_values (VRRTICA);
          if (VRRTICA <> 0) then
            begin
            if (RTICA = 'P') then
                CTARTICA = TCTARTICA;
            execute procedure CUENTA_INTERFAZ(21, :IDDOC, :CTARTICA, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'C') then
                begin
                insert into CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_SUBC, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_DOCTIPOA, CNDE_DOCTIPON, CNDE_PREF, CNDE_FOLIOE)
                    values (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :VRRTICA, (:VRSUBT*-1), :PRTICA, :NIT, :PROY, :CENTRO, :SUBCEN, :NUMERO, null, :VENCE, 0, 21, :prefe, :nume);
                NUMITEMS = NUMITEMS + 1;
                NETO = NETO - VRRTICA;
                SUMA = SUMA + VRRTICA;
                end
            if (TIPOCUEN = 'N') then
                begin
                insert into CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_SUBC, CNDE_DOCTIPOA, CNDE_DOCTIPON, CNDE_PREF, CNDE_FOLIOE)
                    values (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :VRRTICA, (:VRSUBT*-1), :PRTICA, :NIT, :PROY, :CENTRO, :SUBCEN, 0, 0, :prefe, :nume);
                NUMITEMS = NUMITEMS + 1;
                NETO = NETO - VRRTICA;
                SUMA = SUMA + VRRTICA;
                end
            end
          end
        /* RETENCION DE CREE */
        if ((RCREE = 'P') or (RCREE = 'K')) then
          begin
          execute procedure redondee(vrrcree, DIG) returning_values (vrrcree);
          if (vrrcree <> 0) then
            begin
            if (RCREE = 'P') then
                ctarcree = tctarcree;
            execute procedure CUENTA_INTERFAZ(21, :IDDOC, :ctarcree, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'C') then
                begin
                insert into CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_SUBC, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_DOCTIPOA, CNDE_DOCTIPON, CNDE_PREF, CNDE_FOLIOE)
                    values (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :vrrcree, (:VRSUBT*-1), :prcree, :NIT, :PROY, :CENTRO, :SUBCEN, :NUMERO, null, :VENCE, 0, 21, :prefe, :nume);
                NUMITEMS = NUMITEMS + 1;
                NETO = NETO - vrrcree;
                SUMA = SUMA + vrrcree;
                end
            if (TIPOCUEN = 'N') then
                begin
                insert into CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_SUBC, CNDE_DOCTIPOA, CNDE_DOCTIPON, CNDE_PREF, CNDE_FOLIOE)
                    values (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :vrrcree, (:VRSUBT*-1), :prcree, :NIT, :PROY, :CENTRO, :SUBCEN, 0, 0, :prefe, :nume);
                NUMITEMS = NUMITEMS + 1;
                NETO = NETO - vrrcree;
                SUMA = SUMA + vrrcree;
                end
            end
          end
        /* CIERRE EL COMPROBANTE CONTRA LA CUENTA DEL TERCERO O LA CONSTANTE */
        if ((CXP = 'P') or (CXP = 'K')) then
            begin
            SUMA = VRTOTAL - SUMA;
            execute procedure redondee(SUMA, DIG) returning_values (SUMA);
            if (CXP = 'P') then
                CTACXP = TCTAPROV;
            execute procedure CUENTA_INTERFAZ(21, :IDDOC, :CTACXP, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'C') then
                insert into CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_SUBC, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_DOCTIPOA, CNDE_DOCTIPON, CNDE_PREF, CNDE_FOLIOE)
                    values (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :SUMA, 0, 0, :NIT, :PROY, :CENTRO, :SUBCEN, :NUMERO, null, :VENCE, 0, 21, :prefe, :nume);
            if (TIPOCUEN = 'N') then
                insert into CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_SUBC, CNDE_DOCTIPOA, CNDE_DOCTIPON, CNDE_PREF, CNDE_FOLIOE)
                    values (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :SUMA, 0, 0, :NIT, :PROY, :CENTRO, :SUBCEN, 0, 0, :prefe, :nume);
            NETO = NETO - SUMA;
            NUMITEMS = NUMITEMS + 1;
            end
        /* recorra las cuentas adicionales */
        for select INCC_CUENTA, INCC_BASE, INCC_PORC, INCC_VALOR, INCC_DB from INTERFAZ_COMPRAS_CTAS
            where INCO_ID = :IDINTER into :CUENTAADIC, :BASEADIC, :PORCADIC, :VALORADIC, :DBADIC
            do
            begin
            if (VALORADIC <> 0) then
                MONTO = VALORADIC;
            else
                begin
                if (:BASEADIC = 'SUBTOTAL') then
                    VALORADIC = VRTOTAL - VREXTRA - VRIVA - VRADIC + VRDTO;
                if (:BASEADIC = 'DESCUENTO') then
                    VALORADIC = VRDTO;
                if (:BASEADIC = 'IVA') then
                    VALORADIC = VRIVA;
                if (:BASEADIC = 'CONSUMO') then
                    select sum(FCDE_CONSUMO) from FACTURAS_COMPRAS_DETALLE F where F.FACO_ID = :IDDOC into :VALORADIC;
                if (:BASEADIC = 'ADICIONAL') then
                    VALORADIC = VRADIC;
                if (:BASEADIC = 'EXTRA') then
                    VALORADIC = VREXTRA;
                if (:BASEADIC = 'TOTAL') then
                    VALORADIC = VRTOTAL;
                MONTO = cast(VALORADIC as double precision) * PORCADIC / 100;
                end
            if (MONTO <> 0) then
                begin
                execute procedure redondee(MONTO, DIG) returning_values (MONTO);
                execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
                execute procedure CUENTA_INTERFAZ(21, :IDDOC, :CUENTAADIC, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (TIPOCUEN = 'C') then
                    begin
                    if (DBADIC = 'S') then
                        begin
                        insert into CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_SUBC, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_DOCTIPOA, CNDE_DOCTIPON, CNDE_PREF, CNDE_FOLIOE)
                            values (:IDC, :NUMITEMS, :CUENTAADIC, :CONCEPTO, '', :MONTO, 0, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, :SUBCEN, :NUMERO, null, :VENCE, 0, 21, :prefe, :nume);
                        SUMA = SUMA + MONTO;
                        NETO = NETO + MONTO;
                        end
                    else
                        begin
                        insert into CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_SUBC, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_DOCTIPOA, CNDE_DOCTIPON, CNDE_PREF, CNDE_FOLIOE)
                            values (:IDC, :NUMITEMS, :CUENTAADIC, :CONCEPTO, '', 0, :MONTO, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, :SUBCEN, :NUMERO, null, :VENCE, 0, 21, :prefe, :nume);
                        SUMA = SUMA - MONTO;
                        NETO = NETO - MONTO;
                        end
                    NUMITEMS = NUMITEMS + 1;
                    end
                if (TIPOCUEN = 'N') then
                    begin
                    if (DBADIC = 'S') then
                        begin
                        insert into CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_SUBC, CNDE_DOCTIPOA, CNDE_DOCTIPON, CNDE_PREF, CNDE_FOLIOE)
                            values (:IDC, :NUMITEMS, :CUENTAADIC, :CONCEPTO, '', :MONTO, 0, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, :SUBCEN, 0, 0, :prefe, :nume);
                        SUMA = SUMA + MONTO;
                        NETO = NETO + MONTO;
                        end
                    else
                        begin
                        insert into CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_SUBC, CNDE_DOCTIPOA, CNDE_DOCTIPON, CNDE_PREF, CNDE_FOLIOE)
                            values (:IDC, :NUMITEMS, :CUENTAADIC, :CONCEPTO, '', 0, :MONTO, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, :SUBCEN, 0, 0, :prefe, :nume);
                        SUMA = SUMA - MONTO;
                        NETO = NETO - MONTO;
                        end
                    NUMITEMS = NUMITEMS + 1;
                    end
                end
            end
        if (NETO <> 0) then
            begin
            execute procedure lee_configuracion ('CONTABILIDAD','GENERAL','CUENTA PARA CUADRAR COMPROBANTES DESCUADRADOS DE INTERFAZ') returning_values (:ctaadic);
            if (ctaadic <> '') then
                begin
                execute procedure CUENTA_INTERFAZ(21, :IDDOC, :CTAADIC, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (TIPOCUEN = 'C') then
                    begin
                    if (NETO < 0) then
                        begin
                        NETO = NETO * -1;
                        insert into CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_SUBC, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_DOCTIPOA, CNDE_DOCTIPON, CNDE_PREF, CNDE_FOLIOE)
                            values (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :NETO, 0, 0, 0, :NIT, :PROY, :CENTRO, :SUBCEN, :NUMERO, null, :VENCE, 0, 21, :prefe, :nume);
                        end
                    else
                        begin
                        insert into CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_SUBC, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_DOCTIPOA, CNDE_DOCTIPON, CNDE_PREF, CNDE_FOLIOE)
                            values (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :NETO, 0, 0, :NIT, :PROY, :CENTRO, :SUBCEN , :NUMERO, null, :VENCE, 0, 21, :prefe, :nume);
                        end
                    end
                if (TIPOCUEN = 'N') then
                    begin
                    if (NETO < 0) then
                        begin
                        NETO = NETO * -1;
                        insert into CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_SUBC, CNDE_DOCTIPOA, CNDE_DOCTIPON, CNDE_PREF, CNDE_FOLIOE)
                            values (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :NETO, 0, 0, 0, :NIT, :PROY, :CENTRO, :SUBCEN, 0, 0, :prefe, :nume);
                        end
                    else
                        begin
                        insert into CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_SUBC, CNDE_DOCTIPOA, CNDE_DOCTIPON, CNDE_PREF, CNDE_FOLIOE)
                            values (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :NETO, 0, 0, :NIT, :PROY, :CENTRO, :SUBCEN, 0, 0, :prefe, :nume);
                        end
                    end
                end
            end
        end
    if (ERROR > 0) then
        VER = 'S';
    suspend;
    end
else
    begin
    execute PROCEDURE ERRORINT (21, :IDDOC, :PREFIJO, 1);
    ERROR = ERROR + 1;
    VER = 'S';
    suspend;
    end
end^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE CONTABILICE_COMP_SIMPLIFICADO(
    IDI INTEGER)
RETURNS (
    ID INTEGER,
    PREF VARCHAR(4),
    NUMERO VARCHAR(6),
    ESTADO VARCHAR(20),
    IDC INTEGER)
AS
DECLARE VARIABLE VER CHAR(2);
declare variable ERROR INTEGER;
BEGIN
FOR SELECT FACO_ID, PREF_PRE, FACO_NUMERO FROM FACTURAS_COMPRA C, PROVEEDORES P WHERE
    C.TERC_NIT = P.TERC_NIT AND PROV_SIMPLIFICADO = 'S' AND FACO_ANULADO = 'N'
    ORDER BY FACO_ID INTO :ID, :PREF, :NUMERO
DO
  BEGIN
  ESTADO = 'PROCESANDO';
  SUSPEND;
  /* BORRE LA CONTABILIZACION */
/*  delete FROM comprobante_detalle WHERE ENCO_CONSEC IN (SELECT ENCO_CONSEC FROM COMPROBANTE_ENCABEZADO WHERE ENCO_TIPOREF = 21 AND ENCO_IDREF = :ID);
  DELETE FROM comprobante_encabezado  WHERE ENCO_TIPOREF = 21 AND ENCO_IDREF = :ID; */
  EXECUTE PROCEDURE CONTABIL_FACTCOMP (:ID, :IDI) RETURNING_VALUES (:ERROR, VER, :IDC);
  if (ERROR = 0) then
    BEGIN
/*    EXECUTE PROCEDURE CONTABILIZA_PENDIENTE (:IDC); */
    ESTADO = 'OK';
    END
  ELSE
    ESTADO = 'ERROR';
  suspend;
  END
END^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE FACTCOMP_SIN_CONTABILIDAD(
    FECINI DATE,
    FECFIN DATE)
RETURNS (
    ID INTEGER,
    PREF VARCHAR(4),
    NUMERO VARCHAR(6),
    ESTADO VARCHAR(20),
    IDI INTEGER,
    IDC INTEGER)
AS
DECLARE VARIABLE VER CHAR(2);
declare variable FECICNT VARCHAR(10);
declare variable FECFCNT VARCHAR(10);
declare variable ERROR INTEGER;
declare variable idref INTEGER;
BEGIN
EXECUTE PROCEDURE fecha_a_conta(FECINI) returning_values (FECICNT);
EXECUTE PROCEDURE fecha_a_conta(FECFIN) returning_values (FECFCNT);
FOR SELECT FACO_ID, PREF_PRE, FACO_NUMERO FROM FACTURAS_COMPRA WHERE FACO_ANULADO = 'N' AND
    FACO_FECHA >= :FECINI AND FACO_FECHA <= :FECFIN ORDER BY FACO_ID
    INTO :ID, :PREF, :NUMERO
DO
  BEGIN
  idref = null;
  SELECT ENCO_IDREF FROM COMPROBANTE_ENCABEZADO WHERE ENCO_TIPOREF = 21 AND ENCO_FECHA >= :FECICNT AND ENCO_FECHA <= :FECFCNT and ENCO_IDREF = :id into :idref;
  if (idref IS NULL) then
  begin
   ESTADO = 'PROCESANDO';
   SUSPEND;
   SELECT MAX(INCO_ID) FROM INTERFAZ_COMPRAS WHERE PREF_PRE = :PREF AND TIDO_COD = 21 INTO :IDI;
   EXECUTE PROCEDURE CONTABIL_FACTCOMP (:ID, :IDI) RETURNING_VALUES (:ERROR, VER, :IDC);
   if (ERROR = 0) then
    BEGIN
    EXECUTE PROCEDURE CONTABILIZA_PENDIENTE (:IDC);
    ESTADO = 'OK';
    END
   ELSE
    ESTADO = 'ERROR';
   suspend;
  End
  END
END^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE CONTABILICE_COMP_SIMPLIFICADO(
    IDI INTEGER)
RETURNS (
    ID INTEGER,
    PREF VARCHAR(4),
    NUMERO VARCHAR(6),
    ESTADO VARCHAR(20),
    IDC INTEGER)
AS
DECLARE VARIABLE VER CHAR(2);
declare variable ERROR INTEGER;
BEGIN
FOR SELECT FACO_ID, PREF_PRE, FACO_NUMERO FROM FACTURAS_COMPRA C, PROVEEDORES P WHERE
    C.TERC_NIT = P.TERC_NIT AND PROV_SIMPLIFICADO = 'S' AND FACO_ANULADO = 'N'
    ORDER BY FACO_ID INTO :ID, :PREF, :NUMERO
DO
  BEGIN
  ESTADO = 'PROCESANDO';
  SUSPEND;
  /* BORRE LA CONTABILIZACION */
/*  delete FROM comprobante_detalle WHERE ENCO_CONSEC IN (SELECT ENCO_CONSEC FROM COMPROBANTE_ENCABEZADO WHERE ENCO_TIPOREF = 21 AND ENCO_IDREF = :ID);
  DELETE FROM comprobante_encabezado  WHERE ENCO_TIPOREF = 21 AND ENCO_IDREF = :ID; */
  EXECUTE PROCEDURE CONTABIL_FACTCOMP (:ID, :IDI) RETURNING_VALUES (:ERROR, VER, :IDC);
  if (ERROR = 0) then
    BEGIN
/*    EXECUTE PROCEDURE CONTABILIZA_PENDIENTE (:IDC); */
    ESTADO = 'OK';
    END
  ELSE
    ESTADO = 'ERROR';
  suspend;
  END
END^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE FACTCOMP_SIN_CONTABILIDAD(
    FECINI DATE,
    FECFIN DATE)
RETURNS (
    ID INTEGER,
    PREF VARCHAR(4),
    NUMERO VARCHAR(6),
    ESTADO VARCHAR(20),
    IDI INTEGER,
    IDC INTEGER)
AS
DECLARE VARIABLE VER CHAR(2);
declare variable FECICNT VARCHAR(10);
declare variable FECFCNT VARCHAR(10);
declare variable ERROR INTEGER;
declare variable idref INTEGER;
BEGIN
EXECUTE PROCEDURE fecha_a_conta(FECINI) returning_values (FECICNT);
EXECUTE PROCEDURE fecha_a_conta(FECFIN) returning_values (FECFCNT);
FOR SELECT FACO_ID, PREF_PRE, FACO_NUMERO FROM FACTURAS_COMPRA WHERE FACO_ANULADO = 'N' AND
    FACO_FECHA >= :FECINI AND FACO_FECHA <= :FECFIN ORDER BY FACO_ID
    INTO :ID, :PREF, :NUMERO
DO
  BEGIN
  idref = null;
  SELECT ENCO_IDREF FROM COMPROBANTE_ENCABEZADO WHERE ENCO_TIPOREF = 21 AND ENCO_FECHA >= :FECICNT AND ENCO_FECHA <= :FECFCNT and ENCO_IDREF = :id into :idref;
  if (idref IS NULL) then
  begin
   ESTADO = 'PROCESANDO';
   SUSPEND;
   SELECT MAX(INCO_ID) FROM INTERFAZ_COMPRAS WHERE PREF_PRE = :PREF AND TIDO_COD = 21 INTO :IDI;
   EXECUTE PROCEDURE CONTABIL_FACTCOMP (:ID, :IDI) RETURNING_VALUES (:ERROR, VER, :IDC);
   if (ERROR = 0) then
    BEGIN
    EXECUTE PROCEDURE CONTABILIZA_PENDIENTE (:IDC);
    ESTADO = 'OK';
    END
   ELSE
    ESTADO = 'ERROR';
   suspend;
  End
  END
END^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER procedure CONTABIL_DEVOLCOMP (
    IDDOC integer,
    IDINTER integer)
returns (
    ERROR integer,
    VER char(1),
    IDC integer)
as
declare variable PREFIJO VARCHAR(4);
declare variable NUM VARCHAR(6);
declare variable NUMERO VARCHAR(10);
declare variable FECAUX DATE;
declare variable FECHA CHAR(8);
declare variable CONCEPTO CHAR(100);
declare variable NUMFAC VARCHAR(12);
declare variable VRDTO NUMERIC(18, 2);
declare variable VRADIC NUMERIC(18, 2);
declare variable VRSUBT NUMERIC(18, 2);
declare variable VRIVA NUMERIC(18, 2);
declare variable PRTFTE NUMERIC(9, 2);
declare variable VRRTFTE NUMERIC(18, 2);
declare variable VRRTIVA NUMERIC(18, 2);
declare variable PRTICA NUMERIC(9, 2);
declare variable VRRTICA NUMERIC(18, 2);
declare variable PRCREE NUMERIC(9, 2);
declare variable VRRCREE NUMERIC(18, 2);
declare variable VRTOTAL NUMERIC(18, 2);
declare variable VREXTRA NUMERIC(18, 2);
declare variable TIPOCOMP VARCHAR(3);
declare variable PREFCONT VARCHAR(4);
declare variable INVEN CHAR(1);
declare variable CTAINVEN VARCHAR(20);
declare variable IVA CHAR(1);
declare variable CTAIVA VARCHAR(20);
declare variable CONSUMO CHAR(1);
declare variable CTACONSUMO VARCHAR(20);
declare variable CXP CHAR(1);
declare variable CTACXP VARCHAR(20);
declare variable RTFTE CHAR(1);
declare variable CTARTFTE VARCHAR(20);
declare variable RTIVA CHAR(1);
declare variable CTARTIVA VARCHAR(20);
declare variable RTICA CHAR(1);
declare variable CTARTICA VARCHAR(20);
declare variable RCREE CHAR(1);
declare variable CTARCREE VARCHAR(20);
declare variable CTADTO VARCHAR(20);
declare variable CTAADIC VARCHAR(20);
declare variable CTAEXTRA VARCHAR(20);
declare variable EXISTE CHAR(1);
declare variable CUENTA VARCHAR(20);
declare variable MONTO NUMERIC(18,2);
declare variable TIPOCUEN CHAR(1);
declare variable NIT VARCHAR(20);
declare variable PROY VARCHAR(4);
declare variable CENTRO VARCHAR(4);
declare variable SUBCEN varchar(4);
declare variable PORC NUMERIC(5,2);
declare variable DEBITO NUMERIC(18,2);
declare variable CREDITO NUMERIC(18,2);
declare variable NUMITEMS INTEGER;
declare variable ARTICULO VARCHAR(15);
declare variable IMPINC CHAR(1);
declare variable IMPTOS NUMERIC(18, 2);
declare variable SUMA NUMERIC(18,2);
declare variable PORCIVA NUMERIC(9,2);
declare variable TCTAPROV VARCHAR(20);
declare variable TCTARTFTE VARCHAR(20);
declare variable TCTARTIVA VARCHAR(20);
declare variable TCTARTICA VARCHAR(20);
declare variable TCTARCREE VARCHAR(20);
declare variable CUENTAADIC VARCHAR(20);
declare variable BASEADIC VARCHAR(20);
declare variable PORCADIC NUMERIC(5,2);
declare variable VALORADIC NUMERIC(18,2);
declare variable DBADIC CHAR(1);
declare variable FOMENTO CHAR(1);
declare variable ANULADO CHAR(1);
declare variable CENT CHAR(1);
declare variable ERRORC INTEGER;
DECLARE VARIABLE MENORV CHAR(2);
DECLARE VARIABLE MERCANCIA NUMERIC(18,2);
declare variable FACTOR DOUBLE PRECISION;
declare variable DIG INTEGER;
declare variable CTAFOMENTO varchar(20);
declare variable DEGUELLO numeric(18,2);
declare variable CTADEGUELLO varchar(20);
declare variable PREFAC VARCHAR(4);
declare variable NUMEROFAC VARCHAR(8);
BEGIN
/* BUSQUE LA INTERFACE */
EXISTE = 'N';
SELECT 'S', TICO_COD, PRCO_PRE, INCO_INVEN, INCO_IVA, INCO_CONSUMO, INCO_CXP, INCO_RTFTE, INCO_RTIVA, INCO_RTICA, INCO_RTCREE, INCO_CTAINVEN, INCO_CTAIVA, INCO_CTACONSUMO, INCO_CTADTO, INCO_CTAADIC, INCO_CTAEXTRA, INCO_CTACXP, INCO_CTARTFTE, INCO_CTARTIVA, INCO_CTARTICA, INCO_CTARTCREE, INCO_CONFIRMAR, INCO_CENTRO, INCO_FOMENTO, INCO_CTAFOMENTO
    FROM INTERFAZ_COMPRAS
    WHERE INCO_ID = :IDINTER
    INTO :EXISTE, :TIPOCOMP, :PREFCONT, :INVEN, :IVA, :CONSUMO, :CXP, :RTFTE, :RTIVA, :RTICA, :RCREE, CTAINVEN, :CTAIVA, :CTACONSUMO, :CTADTO, :CTAADIC, :CTAEXTRA, :CTACXP, :CTARTFTE, :CTARTIVA, :CTARTICA, :CTARCREE, :VER, :CENT, :FOMENTO, :ctafomento;
if (EXISTE = 'S') then
   BEGIN
    /* BORRE CUALQUEIR CONTABILIZACION PREVIA */
    DELETE FROM CONTABILIZACION WHERE CNTB_TIPOREF = 24 AND CNTB_IDREF = :IDDOC;
   /* TRAIGA EL ENCABEZADO DE LA DEVOLUCION */
   SELECT PREF_PRE, DVCO_NUMERO, DVCO_FECHA, D.TERC_NIT, DVCO_FACTURA, DVCO_IMPTOS, DVCO_DTOMONTO, DVCO_ADICIONAL, DVCO_IVAMONTO,
        DVCO_EXTRA, DVCO_TOTAL, DVCO_RTFTEPORC, DVCO_RTFTEMONTO, DVCO_RTIVAPORC, DVCO_RTIVAMONTO, DVCO_RTICAPORC, DVCO_RTICAMONTO,
        DVCO_RTCREE, DVCO_RTCREEM, PROV_CTARTFTE, PROV_CTARTIVA, PROV_CTARTICA, PROV_CTAPAGAR, DVCO_ANULADO, DVCO_DEGUELLO, PROV_CTARTCREE
        FROM DEVOLUCIONES_COMPRAS D, TERCEROS T, PROVEEDORES P
        WHERE DVCO_ID = :IDDOC AND D.TERC_NIT = T.TERC_NIT AND T.TERC_NIT = P.TERC_NIT
        INTO :PREFIJO, :NUM, :FECAUX, :NIT, :NUMFAC, :IMPINC, :VRDTO, :VRADIC, :VRIVA,
        :VREXTRA, :VRTOTAL, :PRTFTE, :VRRTFTE, :PORC, :VRRTIVA, :PRTICA, :VRRTICA,
        :PRCREE, :VRRCREE, :TCTARTFTE, TCTARTIVA, TCTARTICA, TCTAPROV, ANULADO, :DEGUELLO, :TCTARCREE;
   if (ANULADO = 'N') then
    BEGIN
    PREFAC = left(numfac,  STRLEN(NUMFAC)-6);
    NUMEROFAC = right(NUMFAC, 6);

    NUMERO = PREFIJO || NUM;
    VRSUBT = VRTOTAL - VREXTRA - VRIVA; /* BASE DE RETEFTE Y RETEICA */
    /* CENTRO DE LA BODEGA */
    if (CENT = 'B') then
        select BODE_CENTRO, BODE_PROY, BODE_SUBC from BODEGA B, DEVOLUCIONES_COMPRAS F where B.BODE_COD = F.BODE_COD and F.dvco_id = :IDDOC into :CENTRO, :PROY, :SUBCEN;
    else
        SELECT PREF_CENTRO,PREF_PROY, PREF_SUBC FROM PREFIJOS P, DEVOLUCIONES_COMPRAS F
            WHERE P.PREF_PRE = F.PREF_PRE AND F.DVCO_ID = :IDDOC AND P.TIDO_COD = 24 INTO :CENTRO, :PROY, :subcen;
    /* CONVIERTA LA FECHA A CADENA */
    EXECUTE PROCEDURE FECHA_A_CONTA(:FECAUX) returning_values (:FECHA);
    EXECUTE PROCEDURE lee_configuracion('COMPRAS','FACTURAS','DESCUENTO Y VALOR ADICIONAL DEL DOCUMENTO COMO MENOR VALOR DEL COSTO') returning_values (:MENORV);
    SELECT CAST(CONF_VALOR AS INTEGER) FROM CONFIGURACION WHERE CONF_MODULO = 'COMPRAS' AND CONF_CATEGORIA = 'GENERAL' AND CONF_PROPIEDAD = 'REDONDEO AL MULTIPLO DE DIEZ EN TOTALES' INTO :DIG;
    VRSUBT = VRTOTAL - VREXTRA - VRIVA;
    MERCANCIA = VRSUBT - VRADIC + VRDTO;
    SELECT SUM(DVCD_consumo) from devoluciones_compras_det where dvco_id = :IDDOC into :valoradic;
    if (MENORV = 'SI') then
        if (MERCANCIA <> 0) then
            FACTOR = (CAST(VRSUBT AS DOUBLE PRECISION) - VALORADIC) / (CAST(MERCANCIA AS DOUBLE PRECISION) - VALORADIC);
        ELSE
            FACTOR = 1;
    ELSE
        FACTOR = 1;

    /* REGISTRE EL ENCABEZADO CONTABLE */
    CONCEPTO = 'DEVOLUCION COMPRA No. ' || NUMERO || ' EN FACTURA ' || NUMFAC;
    IDC = GEN_ID(ID_CONTABILIZA, 1);
    INSERT INTO CONTABILIZACION (CNTB_ID, CNTB_TIPOCOMP, CNTB_PREFCNT, CNTB_NUMERO, CNTB_FECHA, CNTB_CONCEPTO, CNTB_REF, CNTB_TIPOREF, CNTB_IDREF, CNTB_PREFREF, CNTB_NUMREF, CNTB_PROCESADO)
        VALUES (:IDC, :TIPOCOMP, :PREFCONT, :NUM, :FECHA, :CONCEPTO, '', 24, :IDDOC, :PREFIJO, :NUM, 'N');
    execute procedure lee_configuracion('COMPRAS', 'FACTURAS', 'CUENTA CONTABLE PARA IMPUESTO AL DEGUELLO DE GANADO') returning_values (:ctadeguello);

    NUMITEMS = 0;
    SUMA = 0;
    ERROR = 0;
    /* CUENTAS DE INVENTARIO */
    if (INVEN = 'A') then
        BEGIN
        /* SUME LAS BASES DE LOS ARTICULOS DEL DOCUMENTO */
        FOR SELECT MAX(COAR_CTACOMP), SUM(cast(DVCD_CANT as double precision) * (DVCD_PRUNIT-DVCD_DTOMONTO)), SUM(DVCD_IVAMONTO), SUM(DVCD_CONSUMO)
            FROM ARTICULO A, CONTABIL_ARTICULO C, DEVOLUCIONES_COMPRAS_DET F
            WHERE F.DVCO_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD
            GROUP BY COAR_CTAINV
            INTO :CTAINVEN, :MONTO, :IMPTOS, :VALORADIC
            DO
            BEGIN
            if (IMPINC = 'S') then
                BEGIN
                MONTO = MONTO - IMPTOS;
                MONTO = MONTO - VALORADIC;
                END
            /* TRAIGA LAS CARACTERISTICAS DE LA CUENTA */
            EXECUTE PROCEDURE CUENTA_INTERFAZ(24, :IDDOC, :CTAINVEN, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            /* DEPENDE DEL TIPO DE CUENTA */
            if (TIPOCUEN = 'I') then
                BEGIN
                /* ES UNA CUENTA DE INVENTARIO, REGISTRE UNO A UNO LOS ARTICULOS */
                FOR SELECT F.ARTI_COD, (cast(DVCD_CANT as double precision) * (DVCD_PRUNIT-DVCD_DTOMONTO)), DVCD_IVAMONTO, DVCD_CONSUMO
                    FROM ARTICULO A, CONTABIL_ARTICULO C, DEVOLUCIONES_COMPRAS_DET F
                    WHERE F.DVCO_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND COAR_CTAINV = :CUENTA
                    INTO :ARTICULO, :MONTO, :IMPTOS, :VALORADIC
                DO
                    BEGIN
                    if (IMPINC = 'S') then
                        BEGIN
                        MONTO = MONTO - IMPTOS;
                        MONTO = MONTO - VALORADIC;
                        END
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_SUBC, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON, CNDE_PREF, CNDE_FOLIOE)
                        VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, :subcen, NULL, NULL, NULL, :ARTICULO, 0, 0, :PREFAC, CAST(:NUMEROFAC AS INTEGER));
                    NUMITEMS = NUMITEMS + 1;
                    SUMA = SUMA - MONTO;
                    END
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                /* INSERTE EL REGISTRO DE LA BASE */
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_SUBC, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON, CNDE_PREF, CNDE_FOLIOE)
                    VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, :subcen, :NUMERO, NULL, :FECHA, NULL, 0, 24, :PREFAC, CAST(:NUMEROFAC AS INTEGER));
                NUMITEMS = NUMITEMS + 1;
                SUMA = SUMA - MONTO;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                /* INSERTE EL REGISTRO DE LA BASE */
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_SUBC, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON, CNDE_PREF, CNDE_FOLIOE)
                    VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, :subcen, NULL, NULL, NULL, NULL, 0, 0, :PREFAC, CAST(:NUMEROFAC AS INTEGER));
                NUMITEMS = NUMITEMS + 1;
                SUMA = SUMA - MONTO;
                END
            END /* FOR */
        END /* INVENTARIO X ARTICULO */

    if (INVEN = 'K') then
        BEGIN
        /* SUME LAS BASES DE LOS ARTICULOS DEL DOCUMENTO */
        SELECT SUM(cast(DVCD_CANT as double precision) * (DVCD_PRUNIT-DVCD_DTOMONTO)), SUM(DVCD_IVAMONTO), SUM(DVCD_CONSUMO)
            FROM DEVOLUCIONES_COMPRAS_DET WHERE DVCO_ID = :IDDOC
            INTO :MONTO, :IMPTOS, :VALORADIC;
        if (IMPINC = 'S') then
            BEGIN
            MONTO = MONTO - IMPTOS;
            MONTO = MONTO - VALORADIC;
            END
        /* TRAIGA LAS CARACTERISTICAS DE LA CUENTA */
        EXECUTE PROCEDURE CUENTA_INTERFAZ(24, :IDDOC, :CTAINVEN, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
        if (ERRORC <> 0) then
            ERROR = ERROR + 1;
        /* DEPENDE DEL TIPO DE CUENTA */
        if (TIPOCUEN = 'I') then
            BEGIN
            /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
            FOR SELECT ARTI_COD, (cast(DVCD_CANT as double precision) * (DVCD_PRUNIT-DVCD_DTOMONTO)), DVCD_IVAMONTO, DVCD_CONSUMO
                FROM DEVOLUCIONES_COMPRAS_DET
                WHERE DVCO_ID = :IDDOC
                INTO :ARTICULO, :MONTO, :IMPTOS, :VALORADIC
                DO
                BEGIN
                if (IMPINC = 'S') then
                    BEGIN
                    MONTO = MONTO - IMPTOS;
                    MONTO = MONTO - VALORADIC;
                    END
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_SUBC, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON, CNDE_PREF, CNDE_FOLIOE)
                    VALUES (:IDC, :NUMITEMS, :CTAINVEN, :CONCEPTO, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, :subcen, NULL, NULL, NULL, :ARTICULO, 0, 0, :PREFAC, CAST(:NUMEROFAC AS INTEGER));
                NUMITEMS = NUMITEMS + 1;
                SUMA = SUMA - MONTO;
                END
            END
        if (TIPOCUEN = 'C') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_SUBC, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON, CNDE_PREF, CNDE_FOLIOE)
                VALUES (:IDC, :NUMITEMS, :CTAINVEN, :CONCEPTO, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, :subcen, :NUMERO, NULL, :FECHA, NULL, 0, 24, :PREFAC, CAST(:NUMEROFAC AS INTEGER));
            NUMITEMS = NUMITEMS + 1;
            SUMA = SUMA - MONTO;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_SUBC, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON, CNDE_PREF, CNDE_FOLIOE)
                VALUES (:IDC, :NUMITEMS, :CTAINVEN, :CONCEPTO, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, :subcen, NULL, NULL, NULL, NULL, 0, 0, :PREFAC, CAST(:NUMEROFAC AS INTEGER));
            NUMITEMS = NUMITEMS + 1;
            SUMA = SUMA - MONTO;
            END
        END /* INVEN = K */
        
    /* EL IVA */
    if (IVA = 'A') then
        BEGIN
        /* SUME LAS BASES DE LOS ARTICULOS DEL DOCUMENTO */
        FOR SELECT MAX(COAR_CTAIVADC), SUM(DVCD_IVAMONTO), SUM(cast(DVCD_CANT as double precision) * (DVCD_PRUNIT-DVCD_DTOMONTO)), SUM(DVCD_CONSUMO)
            FROM ARTICULO A, CONTABIL_ARTICULO C, DEVOLUCIONES_COMPRAS_DET F
            WHERE F.DVCO_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND DVCD_IVAMONTO <> 0
            GROUP BY COAR_CTAIVAC
            INTO :CTAIVA, :IMPTOS, :MONTO, :VALORADIC
        DO
          if (IMPTOS <> 0) then
            BEGIN
            IMPTOS = CAST(IMPTOS AS DOUBLE PRECISION) * VRSUBT / MERCANCIA;
            if (IMPINC = 'S') then
                BEGIN
                MONTO = MONTO - IMPTOS;
                MONTO = MONTO - VALORADIC;
                END

            /* TRAIGA LAS CARCATERISTICAS DE LA CUENTA */
            EXECUTE PROCEDURE CUENTA_INTERFAZ(24, :IDDOC, :CTAIVA, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            /* DEPENDE DEL TIPO DE CUENTA */
            if (TIPOCUEN = 'I') then
                BEGIN
                /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                FOR SELECT F.ARTI_COD, DVCD_IVAMONTO, (cast(DVCD_CANT as double precision) * (DVCD_PRUNIT-DVCD_DTOMONTO)), TAIV_PORC, DVCD_CONSUMO
                    FROM ARTICULO A, CONTABIL_ARTICULO C, DEVOLUCIONES_COMPRAS_DET F, TARIFA_IVA T
                    WHERE F.DVCO_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND COAR_CTAIVAV = :CUENTA AND A.TAIV_COD = T.TAIV_COD
                    INTO :ARTICULO, :IMPTOS, :MONTO, :PORCIVA, :VALORADIC
                DO
                    BEGIN
                    if (IMPINC = 'S') then
                        BEGIN
                        MONTO = MONTO - IMPTOS;
                        MONTO = MONTO - VALORADIC;
                        END
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_SUBC, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON, CNDE_PREF, CNDE_FOLIOE)
                        VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :IMPTOS, :MONTO, :PORCIVA, :NIT, :PROY, :CENTRO, :subcen, NULL, NULL, NULL, :ARTICULO, 0, 0, :PREFAC, CAST(:NUMEROFAC AS INTEGER));
                    NUMITEMS = NUMITEMS + 1;
                    SUMA = SUMA - IMPTOS;
                    END
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_SUBC, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON, CNDE_PREF, CNDE_FOLIOE)
                    VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :IMPTOS, :MONTO, :PORCIVA, :NIT, :PROY, :CENTRO, :subcen, :NUMERO, NULL, :FECHA, NULL, 0, 24, :PREFAC, CAST(:NUMEROFAC AS INTEGER));
                NUMITEMS = NUMITEMS + 1;
                SUMA = SUMA - IMPTOS;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_SUBC, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON, CNDE_PREF, CNDE_FOLIOE)
                    VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :IMPTOS, :MONTO, :PORCIVA, :NIT, :PROY, :CENTRO, :subcen, NULL, NULL, NULL, NULL, 0, 0, :PREFAC, CAST(:NUMEROFAC AS INTEGER));
                NUMITEMS = NUMITEMS + 1;
                SUMA = SUMA - IMPTOS;
                END
            END /* FOR */
        END /* IVA X ARTICULO */
        
    if (IVA = 'K') then /* IVA EN CTA CONSTANTE */
        BEGIN
        SELECT SUM(DVCD_IVAMONTO), SUM(cast(DVCD_CANT as double precision) * (DVCD_PRUNIT-DVCD_DTOMONTO)), SUM(DVCD_CONSUMO)
            FROM DEVOLUCIONES_COMPRAS_DET F
            WHERE F.DVCO_ID = :IDDOC  AND DVCD_IVAMONTO <> 0
            INTO :IMPTOS, :MONTO, :VALORADIC;
            
        if (IMPTOS <> 0) then
            BEGIN
            IMPTOS = CAST(IMPTOS AS DOUBLE PRECISION) * VRSUBT / MERCANCIA;
            if (IMPINC = 'S') then
                BEGIN
                MONTO = MONTO - IMPTOS;
                MONTO = MONTO - VALORADIC;
                END
            /* TRAIGA LAS CARACTERISTICAS DE LA CUENTA */
            EXECUTE PROCEDURE CUENTA_INTERFAZ(24, :IDDOC, :CTAIVA, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            /* DEPENDE DEL TIPO DE CUENTA */
            if (TIPOCUEN = 'I') then
                BEGIN
                /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                FOR SELECT F.ARTI_COD, (cast(DVCD_CANT as double precision) * (DVCD_PRUNIT-DVCD_DTOMONTO)), DVCD_IVAMONTO, TAIV_PORC, DVCD_CONSUMO
                    FROM ARTICULO A, DEVOLUCIONES_COMPRAS_DET F, TARIFA_IVA T
                    WHERE F.DVCO_ID = :IDDOC AND A.TAIV_COD = T.TAIV_COD
                    INTO :ARTICULO, :MONTO, :IMPTOS, :PORCIVA, :VALORADIC
                    DO
                    BEGIN
                    if (IMPTOS <> 0) then
                        BEGIN
                        if (IMPINC = 'S') then
                            BEGIN
                            MONTO = MONTO - IMPTOS;
                            MONTO = MONTO - VALORADIC;
                            END
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_SUBC, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON, CNDE_PREF, CNDE_FOLIOE)
                            VALUES (:IDC, :NUMITEMS, :CTAIVA, :CONCEPTO, '', 0, :IMPTOS, :MONTO, :PORCIVA, :NIT, :PROY, :CENTRO, :subcen, NULL, NULL, NULL, :ARTICULO, 0, 0, :PREFAC, CAST(:NUMEROFAC AS INTEGER));
                        NUMITEMS = NUMITEMS + 1;
                        SUMA = SUMA - IMPTOS;
                        END
                    END
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                /* INSERTE EL REGISTRO DE LA BASE */
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_SUBC, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON, CNDE_PREF, CNDE_FOLIOE)
                    VALUES (:IDC, :NUMITEMS, :CTAIVA, :CONCEPTO, '', 0, :IMPTOS, :MONTO, :PORCIVA, :NIT, :PROY, :CENTRO, :subcen, :NUMERO, NULL, :FECHA, NULL, 0, 24, :PREFAC, CAST(:NUMEROFAC AS INTEGER));
                NUMITEMS = NUMITEMS + 1;
                SUMA = SUMA - IMPTOS;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                /* INSERTE EL REGISTRO DE LA BASE */
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_SUBC, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON, CNDE_PREF, CNDE_FOLIOE)
                    VALUES (:IDC, :NUMITEMS, :CTAIVA, :CONCEPTO, '', 0, :IMPTOS, :MONTO, :PORCIVA, :NIT, :PROY, :CENTRO, :subcen, NULL, NULL, NULL, NULL, 0, 0, :PREFAC, CAST(:NUMEROFAC AS INTEGER));
                NUMITEMS = NUMITEMS + 1;
                SUMA = SUMA - IMPTOS;
                END
            END /* <> 0 */
        END /* IVA EN CTA CONSTANTE */
        
    /* EL IMPOCONSUMO */
    if (CONSUMO = 'A') then
        BEGIN
        /* SUME LAS BASES DE LOS ARTICULOS DEL DOCUMENTO */
        FOR SELECT MAX(COAR_CTACONS), SUM(DVCD_CONSUMO)
            FROM ARTICULO A, CONTABIL_ARTICULO C, DEVOLUCIONES_COMPRAS_DET F
            WHERE F.DVCO_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD
            GROUP BY COAR_CTACONS
            INTO :CTACONSUMO, :IMPTOS
        DO
            BEGIN
            if (IMPTOS <> 0) then
                BEGIN
                /* TRAIGA LAS CARACTERISTICAS DE LA CUENTA */
                EXECUTE PROCEDURE CUENTA_INTERFAZ(24, :IDDOC, :CTACONSUMO, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                /* DEPENDE DEL TIPO DE CUENTA */
                if (TIPOCUEN = 'I') then
                    BEGIN
                    /* ES UNA CUENTA DE INVENTARIO, REGISTRE UNO A UNO LOS ARTICULOS */
                    FOR SELECT F.ARTI_COD, DVCD_CONSUMO
                        FROM ARTICULO A, CONTABIL_ARTICULO C, DEVOLUCIONES_COMPRAS_DET F
                        WHERE F.DVCO_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND COAR_CTACONS = :CUENTA
                        INTO :ARTICULO, :IMPTOS
                        DO
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_SUBC, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON, CNDE_PREF, CNDE_FOLIOE)
                            VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, :subcen, NULL, NULL, NULL, :ARTICULO, 0, 0, :PREFAC, CAST(:NUMEROFAC AS INTEGER));
                        NUMITEMS = NUMITEMS + 1;
                        SUMA = SUMA - IMPTOS;
                        END
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_SUBC, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON, CNDE_PREF, CNDE_FOLIOE)
                        VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, :subcen, :NUMERO, NULL, :FECHA, NULL, 0, 24, :PREFAC, CAST(:NUMEROFAC AS INTEGER));
                    NUMITEMS = NUMITEMS + 1;
                    SUMA = SUMA - IMPTOS;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    /* INSERTE EL REGISTRO DE LA BASE */
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_SUBC, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON, CNDE_PREF, CNDE_FOLIOE)
                        VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, :subcen, NULL, NULL, NULL, NULL, 0, 0, :PREFAC, CAST(:NUMEROFAC AS INTEGER));
                    NUMITEMS = NUMITEMS + 1;
                    SUMA = SUMA - IMPTOS;
                    END
                END
            END /* FOR */
        END /* CONSUMO X ARTICULO */
        
    if (CONSUMO = 'K') then /* CONSUMO EN CTA CONSTANTE */
        BEGIN
        SELECT SUM(DVCD_CONSUMO) FROM DEVOLUCIONES_COMPRAS_DET F WHERE F.DVCO_ID = :IDDOC INTO :IMPTOS;
        if (IMPTOS <> 0) then
            BEGIN
            /* TRAIGA LAS CARACTERISTICAS DE LA CUENTA */
            EXECUTE PROCEDURE CUENTA_INTERFAZ(24, :IDDOC, :CTACONSUMO, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            /* DEPENDE DEL TIPO DE CUENTA */
            if (TIPOCUEN = 'I') then
                BEGIN
                /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                FOR SELECT F.ARTI_COD, DVCD_CONSUMO
                    FROM ARTICULO A, DEVOLUCIONES_COMPRAS_DET F
                    WHERE F.DVCO_ID = :IDDOC
                    INTO :ARTICULO, :IMPTOS
                    DO
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_SUBC, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON, CNDE_PREF, CNDE_FOLIOE)
                        VALUES (:IDC, :NUMITEMS, :CTACONSUMO, :CONCEPTO, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, :subcen, NULL, NULL, NULL, :ARTICULO, 0, 0, :PREFAC, CAST(:NUMEROFAC AS INTEGER));
                    NUMITEMS = NUMITEMS + 1;
                    SUMA = SUMA - IMPTOS;
                    END
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                /* INSERTE EL REGISTRO DE LA BASE */
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_SUBC, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON, CNDE_PREF, CNDE_FOLIOE)
                    VALUES (:IDC, :NUMITEMS, :CTACONSUMO, :CONCEPTO, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, :subcen, :NUMERO, NULL, :FECHA, NULL, 0, 24, :PREFAC, CAST(:NUMEROFAC AS INTEGER));
                NUMITEMS = NUMITEMS + 1;
                SUMA = SUMA - IMPTOS;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                /* INSERTE EL REGISTRO DE LA BASE */
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_SUBC, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON, CNDE_PREF, CNDE_FOLIOE)
                    VALUES (:IDC, :NUMITEMS, :CTACONSUMO, :CONCEPTO, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, :subcen, NULL, NULL, NULL, NULL, 0, 0, :PREFAC, CAST(:NUMEROFAC AS INTEGER));
                NUMITEMS = NUMITEMS + 1;
                SUMA = SUMA - IMPTOS;
                END
            END
        END /* CONSUMO EN CTA CONSTANTE */
        
    /* EL FOMENTO */
    if (FOMENTO = 'A') then
        BEGIN
        /* SUME LAS BASES DE LOS ARTICULOS DEL DOCUMENTO */
        FOR SELECT MAX(COAR_CTAFOMENTO), SUM(DVCD_FOMM)
            FROM ARTICULO A, CONTABIL_ARTICULO C, DEVOLUCIONES_COMPRAS_DET F
            WHERE F.DVCO_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD
            GROUP BY COAR_CTAFOMENTO
            INTO :CTAFOMENTO, :IMPTOS
        DO
            BEGIN
            if (IMPTOS <> 0) then
                BEGIN
                /* TRAIGA LAS CARACTERISTICAS DE LA CUENTA */
                EXECUTE PROCEDURE CUENTA_INTERFAZ(24, :IDDOC, :CTAFOMENTO, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                /* DEPENDE DEL TIPO DE CUENTA */
                if (TIPOCUEN = 'I') then
                    BEGIN
                    /* ES UNA CUENTA DE INVENTARIO, REGISTRE UNO A UNO LOS ARTICULOS */
                    FOR SELECT F.ARTI_COD, DVCD_FOMM
                        FROM ARTICULO A, CONTABIL_ARTICULO C, DEVOLUCIONES_COMPRAS_DET F
                        WHERE F.DVCO_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND COAR_CTACONS = :CUENTA
                        INTO :ARTICULO, :IMPTOS
                        DO
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_SUBC, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON, CNDE_PREF, CNDE_FOLIOE)
                            VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :IMPTOS, 0, 0, 0, :NIT, :PROY, :CENTRO, :subcen, NULL, NULL, NULL, :ARTICULO, 0, 0, :PREFAC, CAST(:NUMEROFAC AS INTEGER));
                        NUMITEMS = NUMITEMS + 1;
                        SUMA = SUMA + IMPTOS;
                        END
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_SUBC, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON, CNDE_PREF, CNDE_FOLIOE)
                        VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :IMPTOS, 0, 0, 0, :NIT, :PROY, :CENTRO, :subcen, :NUMERO, NULL, :FECHA, NULL, 0, 24, :PREFAC, CAST(:NUMEROFAC AS INTEGER));
                    NUMITEMS = NUMITEMS + 1;
                    SUMA = SUMA + IMPTOS;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    /* INSERTE EL REGISTRO DE LA BASE */
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_SUBC, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON, CNDE_PREF, CNDE_FOLIOE)
                        VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :IMPTOS, 0, 0, 0, :NIT, :PROY, :CENTRO, :subcen, NULL, NULL, NULL, NULL, 0, 0, :PREFAC, CAST(:NUMEROFAC AS INTEGER));
                    NUMITEMS = NUMITEMS + 1;
                    SUMA = SUMA + IMPTOS;
                    END
                END
            END /* FOR */
        END /* FOMENTO X ARTICULO */
        
    if (FOMENTO = 'K') then /* FOMENTO EN CTA CONSTANTE */
        BEGIN
        SELECT SUM(DVCD_FOMM) FROM DEVOLUCIONES_COMPRAS_DET F WHERE F.DVCO_ID = :IDDOC INTO :IMPTOS;
        if (IMPTOS <> 0) then
            BEGIN
            /* TRAIGA LAS CARACTERISTICAS DE LA CUENTA */
            EXECUTE PROCEDURE CUENTA_INTERFAZ(24, :IDDOC, :CTAFOMENTO, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            /* DEPENDE DEL TIPO DE CUENTA */
            if (TIPOCUEN = 'I') then
                BEGIN
                /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                FOR SELECT F.ARTI_COD, DVCD_FOMM
                    FROM ARTICULO A, DEVOLUCIONES_COMPRAS_DET F
                    WHERE F.DVCO_ID = :IDDOC
                    INTO :ARTICULO, :IMPTOS
                    DO
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_SUBC, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON, CNDE_PREF, CNDE_FOLIOE)
                        VALUES (:IDC, :NUMITEMS, :CTAFOMENTO, :CONCEPTO, '', :IMPTOS, 0, 0, 0, :NIT, :PROY, :CENTRO, :subcen, NULL, NULL, NULL, :ARTICULO, 0, 0, :PREFAC, CAST(:NUMEROFAC AS INTEGER));
                    NUMITEMS = NUMITEMS + 1;
                    SUMA = SUMA + IMPTOS;
                    END
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                /* INSERTE EL REGISTRO DE LA BASE */
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_SUBC, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON, CNDE_PREF, CNDE_FOLIOE)
                    VALUES (:IDC, :NUMITEMS, :CTAFOMENTO, :CONCEPTO, '', :IMPTOS, 0, 0, 0, :NIT, :PROY, :CENTRO, :subcen, :NUMERO, NULL, :FECHA, NULL, 0, 24, :PREFAC, CAST(:NUMEROFAC AS INTEGER));
                NUMITEMS = NUMITEMS + 1;
                SUMA = SUMA + IMPTOS;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                /* INSERTE EL REGISTRO DE LA BASE */
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_SUBC, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON, CNDE_PREF, CNDE_FOLIOE)
                    VALUES (:IDC, :NUMITEMS, :CTAFOMENTO, :CONCEPTO, '', :IMPTOS, 0, 0, 0, :NIT, :PROY, :CENTRO, :subcen, NULL, NULL, NULL, NULL, 0, 0, :PREFAC, CAST(:NUMEROFAC AS INTEGER));
                NUMITEMS = NUMITEMS + 1;
                SUMA = SUMA + IMPTOS;
                END
            END
        END /* FOMENTO EN CTA CONSTANTE */
        
    /* DEGUELLO */
    if ((ctadeguello is not null) and (ctadeguello <> '') and (deguello <> 0)) then
        begin
        /* TRAIGA LAS CARACTERISTICAS DE LA CUENTA */
        execute procedure CUENTA_INTERFAZ(24, :IDDOC, :ctadeguello, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
        if (ERRORC <> 0) then
            ERROR = ERROR + 1;
        if (TIPOCUEN = 'C') then
            begin
            insert into CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_SUBC, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_DOCTIPOA, CNDE_DOCTIPON, CNDE_PREF, CNDE_FOLIOE)
                values (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :deguello, 0, 0, 0, :NIT, :PROY, :CENTRO, :SUBCEN, :NUMERO, null, :fecha, 0, 24, :PREFAC, CAST(:NUMEROFAC AS INTEGER));
            NUMITEMS = NUMITEMS + 1;
            SUMA = SUMA + deguello;
            end
        if (TIPOCUEN = 'N') then
            begin
            /* INSERTE EL REGISTRO DE LA BASE */
            insert into CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_SUBC, CNDE_DOCTIPOA, CNDE_DOCTIPON, CNDE_PREF, CNDE_FOLIOE)
                values (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :deguello, 0, 0, 0, :NIT, :PROY, :CENTRO, :SUBCEN, 0, 0, :PREFAC, CAST(:NUMEROFAC AS INTEGER));
            NUMITEMS = NUMITEMS + 1;
            SUMA = SUMA + deguello;
            end
        end
    /* DESCUENTO */
    if ((CTADTO IS NOT NULL) AND
        (CTADTO <> '') AND
        (VRDTO <> 0)) THEN
        BEGIN
        /* TRAIGA LAS CARACTERISTICAS DE LA CUENTA */
        EXECUTE PROCEDURE CUENTA_INTERFAZ(24, :IDDOC, :CTADTO, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
        if (ERRORC <> 0) then
            ERROR = ERROR + 1;
        if (TIPOCUEN = 'C') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_SUBC, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON, CNDE_PREF, CNDE_FOLIOE)
                VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :VRDTO, 0, 0, 0, :NIT, :PROY, :CENTRO, :subcen, :NUMERO, NULL, :FECHA, NULL, 0, 24, :PREFAC, CAST(:NUMEROFAC AS INTEGER));
            NUMITEMS = NUMITEMS + 1;
            SUMA = SUMA + VRDTO;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            /* INSERTE EL REGISTRO DE LA BASE */
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_SUBC, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON, CNDE_PREF, CNDE_FOLIOE)
                VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :VRDTO, 0, 0, 0, :NIT, :PROY, :CENTRO, :subcen, NULL, NULL, NULL, NULL, 0, 0, :PREFAC, CAST(:NUMEROFAC AS INTEGER));
            NUMITEMS = NUMITEMS + 1;
            SUMA = SUMA + VRDTO;
            END
        END /* DESCUENTO */
        
    /* VALOR ADIC */
    if ((CTAADIC IS NOT NULL) AND
        (CTAADIC <> '') AND
        (VRADIC <> 0)) THEN
        BEGIN
        /* TRAIGA LAS CARACTERISTICAS DE LA CUENTA */
        EXECUTE PROCEDURE CUENTA_INTERFAZ(24, :IDDOC, :CTAADIC, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
        if (ERRORC <> 0) then
            ERROR = ERROR + 1;
        if (TIPOCUEN = 'C') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_SUBC, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON, CNDE_PREF, CNDE_FOLIOE)
                VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :VRADIC, 0, 0, :NIT, :PROY, :CENTRO, :subcen, :NUMERO, NULL, :FECHA, NULL, 0, 24, :PREFAC, CAST(:NUMEROFAC AS INTEGER));
            NUMITEMS = NUMITEMS + 1;
            SUMA = SUMA - VRADIC;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            /* INSERTE EL REGISTRO DE LA BASE */
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_SUBC, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON, CNDE_PREF, CNDE_FOLIOE)
                VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :VRADIC, 0, 0, :NIT, :PROY, :CENTRO, :subcen, NULL, NULL, NULL, NULL, 0, 0, :PREFAC, CAST(:NUMEROFAC AS INTEGER));
            NUMITEMS = NUMITEMS + 1;
            SUMA = SUMA - VRADIC;
            END
        END /* VR. ADIC */
        
    /* VALOR EXTRA */
    if ((CTAEXTRA IS NOT NULL) AND
        (CTAEXTRA <> '') AND
        (VREXTRA <> 0)) THEN
        BEGIN
        /* TRAIGA LAS CARACTERISTICAS DE LA CUENTA */
        EXECUTE PROCEDURE CUENTA_INTERFAZ(24, :IDDOC, :CTAEXTRA, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
        if (ERRORC <> 0) then
            ERROR = ERROR + 1;
        if (TIPOCUEN = 'C') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_SUBC, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON, CNDE_PREF, CNDE_FOLIOE)
                VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :VREXTRA, 0, 0, 0, :NIT, :PROY, :CENTRO, :subcen, :NUMERO, NULL, :FECHA, NULL, 0, 24, :PREFAC, CAST(:NUMEROFAC AS INTEGER));
            NUMITEMS = NUMITEMS + 1;
            SUMA = SUMA + VREXTRA;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            /* INSERTE EL REGISTRO DE LA BASE */
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_SUBC, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON, CNDE_PREF, CNDE_FOLIOE)
                VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :VREXTRA, 0, 0, 0, :NIT, :PROY, :CENTRO, :subcen, NULL, NULL, NULL, NULL, 0, 0, :PREFAC, CAST(:NUMEROFAC AS INTEGER));
            NUMITEMS = NUMITEMS + 1;
            SUMA = SUMA + VREXTRA;
            END
        END /* VR. EXTRA */
        
    if (fomento <> 'SI') then
        BEGIN
        /* DESCUENTE EL IMPOCONSUMO */
        SELECT SUM(DVCD_CONSUMO)
            FROM devoluciones_compras_det WHERE DVCO_ID = :IDDOC INTO :IMPTOS;
        if (IMPTOS IS NULL) then
            IMPTOS = 0;
        vrsubt = vrsubt - IMPTOS;
        END
    /* RETENCION FUENTE */
    if ((RTFTE = 'P') or (RTFTE = 'K')) then
      if (VRRTFTE <> 0) then
        BEGIN
        if (RTFTE = 'P') then
            CTARTFTE = TCTARTFTE;
            
        /* TRAIGA LAS CARACTERISTICAS DE LA CUENTA */
        EXECUTE PROCEDURE CUENTA_INTERFAZ(24, :IDDOC, :CTARTFTE, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
        if (ERRORC <> 0) then
            ERROR = ERROR + 1;
        if (TIPOCUEN = 'C') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_SUBC, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON, CNDE_PREF, CNDE_FOLIOE)
                VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :VRRTFTE, 0, :VRSUBT, :PRTFTE, :NIT, :PROY, :CENTRO, :subcen, :NUMERO, NULL, :FECHA, NULL, 0, 24, :PREFAC, CAST(:NUMEROFAC AS INTEGER));
            NUMITEMS = NUMITEMS + 1;
            SUMA = SUMA + VRRTFTE;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            /* INSERTE EL REGISTRO DE LA BASE */
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_SUBC, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON, CNDE_PREF, CNDE_FOLIOE)
                VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :VRRTFTE, 0, :VRSUBT, :PRTFTE, :NIT, :PROY, :CENTRO, :subcen, NULL, NULL, NULL, NULL, 0, 0, :PREFAC, CAST(:NUMEROFAC AS INTEGER));
            NUMITEMS = NUMITEMS + 1;
            SUMA = SUMA + VRRTFTE;
            END
        END /* RTFTE */
    if (RTFTE = 'A') then
        BEGIN
        FOR SELECT MAX(COAR_CTARTFTE), MAX(COAR_RTFTE), MIN(COAR_RTBASE), SUM(DVCD_TOTAL-DVCD_IVAMONTO-DVCD_CONSUMO), SUM((DVCD_TOTAL-DVCD_IVAMONTO-DVCD_CONSUMO)*COAR_RTFTE)
            FROM CONTABIL_ARTICULO C, DEVOLUCIONES_COMPRAS_DET F
            WHERE F.dvco_id = :IDDOC AND F.ARTI_COD = C.ARTI_COD
            GROUP BY COAR_CTARTFTE
            INTO :CTARTFTE, :PRTFTE, :baseadic, :MONTO, :VRRTFTE
            DO
            BEGIN
            MONTO = MONTO * FACTOR;
            if (MONTO >= BASEADIC) then
                BEGIN
                VRRTFTE = VRRTFTE * FACTOR / 100;
                execute procedure redondee(VRRTFTE, DIG) returning_values (VRRTFTE);
                execute procedure redondee(MONTO, DIG) returning_values (MONTO);
                if (VRRTFTE <> 0) then
                    BEGIN
                    /* TRAIGA LAS CARACTERISTICAS DE LA CUENTA */
                    EXECUTE PROCEDURE CUENTA_INTERFAZ(24, :IDDOC, :CTARTFTE, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
                    if (ERRORC <> 0) then
                        ERROR = ERROR + 1;
                    if (TIPOCUEN = 'C') then
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_SUBC, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON, CNDE_PREF, CNDE_FOLIOE)
                            VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :VRRTFTE, 0, :VRSUBT, :PRTFTE, :NIT, :PROY, :CENTRO, :subcen, :NUMERO, NULL, :FECHA, NULL, 0, 24, :PREFAC, CAST(:NUMEROFAC AS INTEGER));
                        NUMITEMS = NUMITEMS + 1;
                        SUMA = SUMA + VRRTFTE;
                        END
                    if (TIPOCUEN = 'N') then
                        BEGIN
                        /* INSERTE EL REGISTRO DE LA BASE */
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_SUBC, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON, CNDE_PREF, CNDE_FOLIOE)
                            VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :VRRTFTE, 0, :VRSUBT, :PRTFTE, :NIT, :PROY, :CENTRO, :subcen, NULL, NULL, NULL, NULL, 0, 0, :PREFAC, CAST(:NUMEROFAC AS INTEGER));
                        NUMITEMS = NUMITEMS + 1;
                        SUMA = SUMA + VRRTFTE;
                        END
                    END
                END
            END
        END /* RTFTE */
    /* RETENCION IVA */
    if ((RTIVA = 'P') or (RTIVA = 'K')) then
      if (VRRTIVA <> 0) then
        BEGIN
        if (RTIVA = 'P') then
            CTARTIVA = TCTARTIVA;
            
        /* TRAIGA LAS CARACTERISTICAS DE LA CUENTA */
        EXECUTE PROCEDURE CUENTA_INTERFAZ(24, :IDDOC, :CTARTIVA, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
        if (ERRORC <> 0) then
            ERROR = ERROR + 1;
        if (TIPOCUEN = 'C') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_SUBC, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON, CNDE_PREF, CNDE_FOLIOE)
                VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :VRRTIVA, 0, :VRIVA, :PORC, :NIT, :PROY, :CENTRO, :subcen, :NUMERO, NULL, :FECHA, NULL, 0, 24, :PREFAC, CAST(:NUMEROFAC AS INTEGER));
            NUMITEMS = NUMITEMS + 1;
            SUMA = SUMA + VRRTIVA;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            /* INSERTE EL REGISTRO DE LA BASE */
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_SUBC, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON, CNDE_PREF, CNDE_FOLIOE)
                VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :VRRTIVA, 0, :VRIVA, :PORC, :NIT, :PROY, :CENTRO, :subcen, NULL, NULL, NULL, NULL, 0, 0, :PREFAC, CAST(:NUMEROFAC AS INTEGER));
            NUMITEMS = NUMITEMS + 1;
            SUMA = SUMA + VRRTIVA;
            END
        END /* RTIVA */
        
    /* RETENCION DE ICA */
    if ((RTICA = 'P') or (RTICA = 'K')) then
      if (VRRTICA <> 0) then
        BEGIN
        if (RTICA = 'P') then
            CTARTICA = TCTARTICA;
            
        /* TRAIGA LAS CARACTERISTICAS DE LA CUENTA */
        EXECUTE PROCEDURE CUENTA_INTERFAZ(24, :IDDOC, :CTARTICA, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
        if (ERRORC <> 0) then
            ERROR = ERROR + 1;
        if (TIPOCUEN = 'C') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_SUBC, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON, CNDE_PREF, CNDE_FOLIOE)
                VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :VRRTICA, 0, :VRSUBT, :PRTICA, :NIT, :PROY, :CENTRO, :subcen, :NUMERO, NULL, :FECHA, NULL, 0, 24, :PREFAC, CAST(:NUMEROFAC AS INTEGER));
            NUMITEMS = NUMITEMS + 1;
            SUMA = SUMA + VRRTICA;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            /* INSERTE EL REGISTRO DE LA BASE */
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_SUBC, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON, CNDE_PREF, CNDE_FOLIOE)
                VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :VRRTICA, 0, :VRSUBT, :PRTICA, :NIT, :PROY, :CENTRO, :subcen, NULL, NULL, NULL, NULL, 0, 0, :PREFAC, CAST(:NUMEROFAC AS INTEGER));
            NUMITEMS = NUMITEMS + 1;
            SUMA = SUMA + VRRTICA;
            END
        END /* RTICA */
    /* RETENCION CREE */
    if ((RCREE = 'P') or (RCREE = 'K')) then
      if (VRRCREE <> 0) then
        BEGIN
        if (RCREE = 'P') then
            CTARCREE = TCTARCREE;
            
        /* TRAIGA LAS CARACTERISTICAS DE LA CUENTA */
        EXECUTE PROCEDURE CUENTA_INTERFAZ(24, :IDDOC, :CTARCREE, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
        if (ERRORC <> 0) then
            ERROR = ERROR + 1;
        if (TIPOCUEN = 'C') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_SUBC, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON, CNDE_PREF, CNDE_FOLIOE)
                VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :VRRCREE, 0, :VRSUBT, :PRCREE, :NIT, :PROY, :CENTRO, :subcen, :NUMERO, NULL, :FECHA, NULL, 0, 24, :PREFAC, CAST(:NUMEROFAC AS INTEGER));
            NUMITEMS = NUMITEMS + 1;
            SUMA = SUMA + vrrcree;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            /* INSERTE EL REGISTRO DE LA BASE */
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_SUBC, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON, CNDE_PREF, CNDE_FOLIOE)
                VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :vrrcree, 0, :VRSUBT, :prcree, :NIT, :PROY, :CENTRO, :subcen, NULL, NULL, NULL, NULL, 0, 0, :PREFAC, CAST(:NUMEROFAC AS INTEGER));
            NUMITEMS = NUMITEMS + 1;
            SUMA = SUMA + vrrcree;
            END
        END /* RCREE */
    /* recorra las cuentas adicionales */
    FOR SELECT INCC_CUENTA, INCC_BASE, INCC_PORC, INCC_VALOR, INCC_DB
        FROM INTERFAZ_COMPRAS_CTAS
        WHERE INCO_ID = :IDINTER
        INTO :CUENTAADIC, :BASEADIC, :PORCADIC, :VALORADIC, :DBADIC
        DO
        BEGIN
        if (VALORADIC <> 0) then
            MONTO = VALORADIC;
        ELSE
            BEGIN
            if (:BASEADIC = 'SUBTOTAL') then
                VALORADIC = VRTOTAL - VREXTRA - VRIVA - VRADIC + VRDTO;
            if (:BASEADIC = 'DESCUENTO') then
                VALORADIC = VRDTO;
            if (:BASEADIC = 'IVA') then
                VALORADIC = VRIVA;
            if (:BASEADIC = 'CONSUMO') then
                SELECT SUM(DVCD_CONSUMO)
                    FROM DEVOLUCIONES_COMPRAS_DET F
                    WHERE F.DVCO_ID = :IDDOC 
                    INTO :VALORADIC;
            if (:BASEADIC = 'ADICIONAL') then
                VALORADIC = VRADIC;
            if (:BASEADIC = 'EXTRA') then
                VALORADIC = VREXTRA;
            if (:BASEADIC = 'TOTAL') then
                VALORADIC = VRTOTAL;
            MONTO = VALORADIC * PORCADIC;
            END
        if (MONTO <> 0) then
            BEGIN
            /* TRAIGA LAS CARACTERISTICAS DE LA CUENTA */
            EXECUTE PROCEDURE CUENTA_INTERFAZ(24, :IDDOC, :CUENTAADIC, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'C') then
                BEGIN
                if (DBADIC = 'S') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_SUBC, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON, CNDE_PREF, CNDE_FOLIOE)
                        VALUES (:IDC, :NUMITEMS, :CUENTAADIC, :CONCEPTO, '', :MONTO, 0, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, :subcen, :NUMERO, NULL, :FECHA, NULL, 0, 24, :PREFAC, CAST(:NUMEROFAC AS INTEGER));
                    SUMA = SUMA + MONTO;
                    END
                ELSE
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_SUBC, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON, CNDE_PREF, CNDE_FOLIOE)
                        VALUES (:IDC, :NUMITEMS, :CUENTAADIC, :CONCEPTO, '', 0, :MONTO, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, :subcen, :NUMERO, NULL, :FECHA, NULL, 0, 24, :PREFAC, CAST(:NUMEROFAC AS INTEGER));
                    SUMA = SUMA - MONTO;
                    END
                NUMITEMS = NUMITEMS + 1;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                if (DBADIC = 'S') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_SUBC, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON, CNDE_PREF, CNDE_FOLIOE)
                        VALUES (:IDC, :NUMITEMS, :CUENTAADIC, :CONCEPTO, '', :MONTO, 0, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, :subcen, NULL, NULL, NULL, NULL, 0, 0, :PREFAC, CAST(:NUMEROFAC AS INTEGER));
                    SUMA = SUMA + MONTO;
                    END
                ELSE
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_SUBC, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON, CNDE_PREF, CNDE_FOLIOE)
                        VALUES (:IDC, :NUMITEMS, :CUENTAADIC, :CONCEPTO, '', 0, :MONTO, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, :subcen, NULL, NULL, NULL, NULL, 0, 0, :PREFAC, CAST(:NUMEROFAC AS INTEGER));
                    SUMA = SUMA - MONTO;
                    END
                NUMITEMS = NUMITEMS + 1;
                END
            NUMITEMS = NUMITEMS + 1;
            END
        END
    /* CIERRE EL COMPROBANTE CONTRA LA CUENTA DEL TERCERO O LA CONSTANTE */
    if ((SUMA <> 0) and ((CXP = 'P') or (CXP = 'K'))) then
        BEGIN
        if (SUMA < 0) then
            BEGIN
            DEBITO = SUMA * -1;
            CREDITO = 0;
            END
        ELSE
            BEGIN
            DEBITO = 0;
            CREDITO = SUMA;
            END
        if (CXP = 'P') then
            CTACXP = TCTAPROV;

        /* TRAIGA LAS CARACTERISTICAS DE LA CUENTA */
        EXECUTE PROCEDURE CUENTA_INTERFAZ(24, :IDDOC, :CTACXP, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
        if (ERRORC <> 0) then
            ERROR = ERROR + 1;
        if (TIPOCUEN = 'C') then
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_SUBC, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON, CNDE_PREF, CNDE_FOLIOE)
                VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :DEBITO, :CREDITO, 0, 0, :NIT, :PROY, :CENTRO, :subcen, :NUMERO, NULL, :FECHA, NULL, 0, 24, :PREFAC, CAST(:NUMEROFAC AS INTEGER));
        if (TIPOCUEN = 'N') then
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_SUBC, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON, CNDE_PREF, CNDE_FOLIOE)
                VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :DEBITO, :CREDITO, 0, 0, :NIT, :PROY, :CENTRO, :subcen, NULL, NULL, NULL, NULL, 0, 0, :PREFAC, CAST(:NUMEROFAC AS INTEGER));
        END /* SUMA EN CXP */
     end
    if (ERROR > 0) then
        VER = 'S';
    SUSPEND;
    END /* EXISTE */
ELSE
    BEGIN
    EXECUTE PROCEDURE ERRORINT (24, :IDDOC, :PREFIJO, 1);
    ERROR = ERROR + 1;
    VER = 'S';
    SUSPEND;
    END
END^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE DEVCOMPRA_SIN_CONTABILIDAD(
    FECINI DATE,
    FECFIN DATE)
RETURNS (
    ID INTEGER,
    PREF VARCHAR(4),
    NUMERO VARCHAR(6),
    ESTADO VARCHAR(20),
    IDI INTEGER,
    IDC INTEGER)
AS
DECLARE VARIABLE VER CHAR(2);
declare variable FECICNT VARCHAR(10);
declare variable FECFCNT VARCHAR(10);
declare variable ERROR INTEGER;
declare variable idref INTEGER;
BEGIN
EXECUTE PROCEDURE fecha_a_conta(FECINI) returning_values (FECICNT);
EXECUTE PROCEDURE fecha_a_conta(FECFIN) returning_values (FECFCNT);
FOR SELECT DVCO_ID, PREF_PRE, DVCO_NUMERO FROM DEVOLUCIONES_COMPRAS WHERE DVCO_ANULADO = 'N' AND
    DVCO_FECHA >= :FECINI AND DVCO_FECHA <= :FECFIN
    INTO :ID, :PREF, :NUMERO
DO
  BEGIN
  idref = null;
  SELECT ENCO_IDREF FROM COMPROBANTE_ENCABEZADO WHERE ENCO_TIPOREF = 24 AND ENCO_FECHA >= :FECICNT AND ENCO_FECHA <= :FECFCNT and ENCO_IDREF = :id into :idref;
  if (idref IS NULL) then
  begin
   ESTADO = 'PROCESANDO';
   SUSPEND;
   SELECT MAX(INCO_ID) FROM INTERFAZ_COMPRAS WHERE PREF_PRE = :PREF AND TIDO_COD = 24 INTO :IDI;
   EXECUTE PROCEDURE CONTABIL_DEVOLCOMP (:ID, :IDI) RETURNING_VALUES (:ERROR, :VER, :IDC);
   if (ERROR = 0) then
    BEGIN
      EXECUTE PROCEDURE CONTABILIZA_PENDIENTE (:IDC);
      ESTADO = 'OK';
    end
   ELSE
    ESTADO = 'ERROR';
   suspend;
  End
  END
END^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER procedure CONTABIL_DEVOLCOMP_NIIF (
    IDDOC integer,
    IDINTER integer,
    IDC integer)
returns (
    ERROR integer,
    VER char(1))
as
declare variable PREFIJO VARCHAR(4);
declare variable NUM VARCHAR(6);
declare variable NUMERO VARCHAR(10);
declare variable FECAUX DATE;
declare variable FECHA CHAR(8);
declare variable CONCEPTO CHAR(100);
declare variable NUMFAC VARCHAR(10);
declare variable VRDTO NUMERIC(18, 2);
declare variable VRADIC NUMERIC(18, 2);
declare variable VRSUBT NUMERIC(18, 2);
declare variable VRIVA NUMERIC(18, 2);
declare variable PRTFTE NUMERIC(9, 2);
declare variable VRRTFTE NUMERIC(18, 2);
declare variable VRRTIVA NUMERIC(18, 2);
declare variable PRTICA NUMERIC(9, 2);
declare variable VRRTICA NUMERIC(18, 2);
declare variable PRCREE NUMERIC(9, 2);
declare variable VRRCREE NUMERIC(18, 2);
declare variable VRTOTAL NUMERIC(18, 2);
declare variable VREXTRA NUMERIC(18, 2);
declare variable INVEN CHAR(1);
declare variable CTAINVEN VARCHAR(20);
declare variable IVA CHAR(1);
declare variable CTAIVA VARCHAR(20);
declare variable CONSUMO CHAR(1);
declare variable CTACONSUMO VARCHAR(20);
declare variable CXP CHAR(1);
declare variable CTACXP VARCHAR(20);
declare variable RTFTE CHAR(1);
declare variable CTARTFTE VARCHAR(20);
declare variable RTIVA CHAR(1);
declare variable CTARTIVA VARCHAR(20);
declare variable RTICA CHAR(1);
declare variable CTARTICA VARCHAR(20);
declare variable RCREE CHAR(1);
declare variable CTARCREE VARCHAR(20);
declare variable CTADTO VARCHAR(20);
declare variable CTAADIC VARCHAR(20);
declare variable CTAEXTRA VARCHAR(20);
declare variable EXISTE CHAR(1);
declare variable CUENTA VARCHAR(20);
declare variable MONTO NUMERIC(18,2);
declare variable TIPOCUEN CHAR(1);
declare variable NIT VARCHAR(20);
declare variable PROY VARCHAR(4);
declare variable CENTRO VARCHAR(4);
declare variable SUBCEN varchar(4);
declare variable PORC NUMERIC(5,2);
declare variable DEBITO NUMERIC(18,2);
declare variable CREDITO NUMERIC(18,2);
declare variable NUMITEMS INTEGER;
declare variable ARTICULO VARCHAR(15);
declare variable IMPINC CHAR(1);
declare variable IMPTOS NUMERIC(18, 2);
declare variable SUMA NUMERIC(18,2);
declare variable PORCIVA NUMERIC(9,2);
declare variable TCTAPROV VARCHAR(20);
declare variable TCTARTFTE VARCHAR(20);
declare variable TCTARTIVA VARCHAR(20);
declare variable TCTARTICA VARCHAR(20);
declare variable TCTARCREE VARCHAR(20);
declare variable CUENTAADIC VARCHAR(20);
declare variable BASEADIC VARCHAR(20);
declare variable PORCADIC NUMERIC(5,2);
declare variable VALORADIC NUMERIC(18,2);
declare variable DBADIC CHAR(1);
declare variable FOMENTO CHAR(1);
declare variable ANULADO CHAR(1);
declare variable CENT CHAR(1);
declare variable ERRORC INTEGER;
DECLARE VARIABLE MENORV CHAR(2);
DECLARE VARIABLE MERCANCIA NUMERIC(18,2);
declare variable FACTOR DOUBLE PRECISION;
declare variable DIG INTEGER;
declare variable CTAFOMENTO varchar(20);
declare variable DEGUELLO numeric(18,2);
declare variable CTADEGUELLO varchar(20);
declare variable PREFAC VARCHAR(4);
declare variable NUMEROFAC VARCHAR(8);
BEGIN
/* BUSQUE LA INTERFACE */
EXISTE = 'N';
SELECT 'S', N.INCO_INVEN, N.INCO_IVA, N.INCO_CONSUMO, N.INCO_CXP, N.INCO_RTFTE, N.INCO_RTIVA, N.INCO_RTICA, N.INCO_RTCREE,
    N.INCO_CTAINVEN, N.INCO_CTAIVA, N.INCO_CTACONSUMO, N.INCO_CTADTO, N.INCO_CTAADIC, N.INCO_CTAEXTRA, N.INCO_CTACXP, N.INCO_CTARTFTE,
    N.INCO_CTARTIVA, N.INCO_CTARTICA, N.INCO_CTARTCREE, INCO_CONFIRMAR, INCO_CENTRO, N.INCO_FOMENTO, N.INCO_CTAFOMENTO
    FROM INTERFAZ_COMPRAS I, interfaz_compras_niif N
    WHERE I.INCO_ID = :IDINTER AND I.inco_id = N.inco_id
    INTO :EXISTE, :INVEN, :IVA, :CONSUMO, :CXP, :RTFTE, :RTIVA, :RTICA, :RCREE,
    :CTAINVEN, :CTAIVA, :CTACONSUMO, :CTADTO, :CTAADIC, :CTAEXTRA, :CTACXP, :CTARTFTE, :CTARTIVA,
    :CTARTICA, :CTARCREE, :VER, :CENT, :FOMENTO, :CTAFOMENTO;
if (EXISTE = 'S') then
   BEGIN
   /* TRAIGA EL ENCABEZADO DE LA DEVOLUCION */
   SELECT PREF_PRE, DVCO_NUMERO, DVCO_FECHA, D.TERC_NIT, DVCO_FACTURA, DVCO_IMPTOS, DVCO_DTOMONTO, DVCO_ADICIONAL, DVCO_IVAMONTO,
        DVCO_EXTRA, DVCO_TOTAL, DVCO_RTFTEPORC, DVCO_RTFTEMONTO, DVCO_RTIVAPORC, DVCO_RTIVAMONTO, DVCO_RTICAPORC, DVCO_RTICAMONTO,
        DVCO_RTCREE, DVCO_RTCREEM, PROV_CTARTFTE, PROV_CTARTIVA, PROV_CTARTICA, PROV_CTAPAGAR, DVCO_ANULADO, DVCO_DEGUELLO, PROV_CTARTCREE
        FROM DEVOLUCIONES_COMPRAS D, TERCEROS T, PROVEEDORES P
        WHERE DVCO_ID = :IDDOC AND D.TERC_NIT = T.TERC_NIT AND T.TERC_NIT = P.TERC_NIT
        INTO :PREFIJO, :NUM, :FECAUX, :NIT, :NUMFAC, :IMPINC, :VRDTO, :VRADIC, :VRIVA,
        :VREXTRA, :VRTOTAL, :PRTFTE, :VRRTFTE, :PORC, :VRRTIVA, :PRTICA, :VRRTICA,
        :PRCREE, :VRRCREE, :TCTARTFTE, TCTARTIVA, TCTARTICA, TCTAPROV, ANULADO, :DEGUELLO, :TCTARCREE;
   if (ANULADO = 'N') then
    BEGIN
    PREFAC = left(numfac,  STRLEN(NUMFAC)-6);
    NUMEROFAC = right(NUMFAC, 6);
    NUMERO = PREFIJO || NUM;
    VRSUBT = VRTOTAL - VREXTRA - VRIVA; /* BASE DE RETEFTE Y RETEICA */
    /* CENTRO DE LA BODEGA */
    if (CENT = 'B') then
        select BODE_CENTRO, BODE_PROY, BODE_SUBC from BODEGA B, DEVOLUCIONES_COMPRAS F where B.BODE_COD = F.BODE_COD and F.dvco_id = :IDDOC into :CENTRO, :PROY, :SUBCEN;
    else
        SELECT PREF_CENTRO,PREF_PROY, PREF_SUBC FROM PREFIJOS P, DEVOLUCIONES_COMPRAS F
            WHERE P.PREF_PRE = F.PREF_PRE AND F.DVCO_ID = :IDDOC AND P.TIDO_COD = 24 INTO :CENTRO, :PROY, :subcen;
    /* CONVIERTA LA FECHA A CADENA */
    EXECUTE PROCEDURE FECHA_A_CONTA(:FECAUX) returning_values (:FECHA);
    EXECUTE PROCEDURE lee_configuracion('COMPRAS','FACTURAS','DESCUENTO Y VALOR ADICIONAL DEL DOCUMENTO COMO MENOR VALOR DEL COSTO') returning_values (:MENORV);
    SELECT CAST(CONF_VALOR AS INTEGER) FROM CONFIGURACION WHERE CONF_MODULO = 'COMPRAS' AND CONF_CATEGORIA = 'GENERAL' AND CONF_PROPIEDAD = 'REDONDEO AL MULTIPLO DE DIEZ EN TOTALES' INTO :DIG;
    VRSUBT = VRTOTAL - VREXTRA - VRIVA;
    MERCANCIA = VRSUBT - VRADIC + VRDTO;
    SELECT SUM(DVCD_consumo) from devoluciones_compras_det where dvco_id = :IDDOC into :valoradic;
    if (MENORV = 'SI') then
        if (MERCANCIA <> 0) then
            FACTOR = (CAST(VRSUBT AS DOUBLE PRECISION) - VALORADIC) / (CAST(MERCANCIA AS DOUBLE PRECISION) - VALORADIC);
        ELSE
            FACTOR = 1;
    ELSE
        FACTOR = 1;

    /* REGISTRE EL ENCABEZADO CONTABLE */
    CONCEPTO = 'DEVOLUCION COMPRA No. ' || NUMERO || ' EN FACTURA ' || NUMFAC;
    execute procedure lee_configuracion('COMPRAS', 'FACTURAS', 'CUENTA CONTABLE PARA IMPUESTO AL DEGUELLO DE GANADO') returning_values (:ctadeguello);

    NUMITEMS = 100000;
    SUMA = 0;
    ERROR = 0;
    DELETE FROM CONTABILIZACION_DET WHERE CNTB_ID = :IDC AND CNDE_ITEM >= :numitems;
    /* CUENTAS DE INVENTARIO */
    if (INVEN = 'A') then
        BEGIN
        /* SUME LAS BASES DE LOS ARTICULOS DEL DOCUMENTO */
        FOR SELECT MAX(COAR_CTACOMP), SUM(cast(DVCD_CANT as double precision) * (DVCD_PRUNIT-DVCD_DTOMONTO)), SUM(DVCD_IVAMONTO), SUM(DVCD_CONSUMO)
            FROM ARTICULO A, contabil_articulo_niif C, DEVOLUCIONES_COMPRAS_DET F
            WHERE F.DVCO_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD
            GROUP BY COAR_CTAINV
            INTO :CTAINVEN, :MONTO, :IMPTOS, :VALORADIC
            DO
            BEGIN
            if (IMPINC = 'S') then
                BEGIN
                MONTO = MONTO - IMPTOS;
                MONTO = MONTO - VALORADIC;
                END
            /* TRAIGA LAS CARACTERISTICAS DE LA CUENTA */
            EXECUTE PROCEDURE cuenta_interfaz_niif(24, :IDDOC, :CTAINVEN, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            /* DEPENDE DEL TIPO DE CUENTA */
            if (TIPOCUEN = 'I') then
                BEGIN
                /* ES UNA CUENTA DE INVENTARIO, REGISTRE UNO A UNO LOS ARTICULOS */
                FOR SELECT F.ARTI_COD, (cast(DVCD_CANT as double precision) * (DVCD_PRUNIT-DVCD_DTOMONTO)), DVCD_IVAMONTO, DVCD_CONSUMO
                    FROM ARTICULO A, contabil_articulo_niif C, DEVOLUCIONES_COMPRAS_DET F
                    WHERE F.DVCO_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND COAR_CTAINV = :CUENTA
                    INTO :ARTICULO, :MONTO, :IMPTOS, :VALORADIC
                DO
                    BEGIN
                    if (IMPINC = 'S') then
                        BEGIN
                        MONTO = MONTO - IMPTOS;
                        MONTO = MONTO - VALORADIC;
                        END
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_SUBC, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON, CNDE_PREF, CNDE_FOLIOE)
                        VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, :subcen, NULL, NULL, NULL, :ARTICULO, 0, 0, :PREFAC, CAST(:NUMEROFAC AS INTEGER));
                    NUMITEMS = NUMITEMS + 1;
                    SUMA = SUMA - MONTO;
                    END
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                /* INSERTE EL REGISTRO DE LA BASE */
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_SUBC, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON, CNDE_PREF, CNDE_FOLIOE)
                    VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, :subcen, :NUMERO, NULL, :FECHA, NULL, 0, 24, :PREFAC, CAST(:NUMEROFAC AS INTEGER));
                NUMITEMS = NUMITEMS + 1;
                SUMA = SUMA - MONTO;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                /* INSERTE EL REGISTRO DE LA BASE */
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_SUBC, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON, CNDE_PREF, CNDE_FOLIOE)
                    VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, :subcen, NULL, NULL, NULL, NULL, 0, 0, :PREFAC, CAST(:NUMEROFAC AS INTEGER));
                NUMITEMS = NUMITEMS + 1;
                SUMA = SUMA - MONTO;
                END
            END /* FOR */
        END /* INVENTARIO X ARTICULO */

    if (INVEN = 'K') then
        BEGIN
        /* SUME LAS BASES DE LOS ARTICULOS DEL DOCUMENTO */
        SELECT SUM(cast(DVCD_CANT as double precision) * (DVCD_PRUNIT-DVCD_DTOMONTO)), SUM(DVCD_IVAMONTO), SUM(DVCD_CONSUMO)
            FROM DEVOLUCIONES_COMPRAS_DET WHERE DVCO_ID = :IDDOC
            INTO :MONTO, :IMPTOS, :VALORADIC;
        if (IMPINC = 'S') then
            BEGIN
            MONTO = MONTO - IMPTOS;
            MONTO = MONTO - VALORADIC;
            END
        /* TRAIGA LAS CARACTERISTICAS DE LA CUENTA */
        EXECUTE PROCEDURE cuenta_interfaz_niif(24, :IDDOC, :CTAINVEN, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
        if (ERRORC <> 0) then
            ERROR = ERROR + 1;
        /* DEPENDE DEL TIPO DE CUENTA */
        if (TIPOCUEN = 'I') then
            BEGIN
            /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
            FOR SELECT ARTI_COD, (cast(DVCD_CANT as double precision) * (DVCD_PRUNIT-DVCD_DTOMONTO)), DVCD_IVAMONTO, DVCD_CONSUMO
                FROM DEVOLUCIONES_COMPRAS_DET
                WHERE DVCO_ID = :IDDOC
                INTO :ARTICULO, :MONTO, :IMPTOS, :VALORADIC
                DO
                BEGIN
                if (IMPINC = 'S') then
                    BEGIN
                    MONTO = MONTO - IMPTOS;
                    MONTO = MONTO - VALORADIC;
                    END
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_SUBC, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON, CNDE_PREF, CNDE_FOLIOE)
                    VALUES (:IDC, :NUMITEMS, :CTAINVEN, :CONCEPTO, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, :subcen, NULL, NULL, NULL, :ARTICULO, 0, 0, :PREFAC, CAST(:NUMEROFAC AS INTEGER));
                NUMITEMS = NUMITEMS + 1;
                SUMA = SUMA - MONTO;
                END
            END
        if (TIPOCUEN = 'C') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_SUBC, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON, CNDE_PREF, CNDE_FOLIOE)
                VALUES (:IDC, :NUMITEMS, :CTAINVEN, :CONCEPTO, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, :subcen, :NUMERO, NULL, :FECHA, NULL, 0, 24, :PREFAC, CAST(:NUMEROFAC AS INTEGER));
            NUMITEMS = NUMITEMS + 1;
            SUMA = SUMA - MONTO;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_SUBC, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON, CNDE_PREF, CNDE_FOLIOE)
                VALUES (:IDC, :NUMITEMS, :CTAINVEN, :CONCEPTO, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, :subcen, NULL, NULL, NULL, NULL, 0, 0, :PREFAC, CAST(:NUMEROFAC AS INTEGER));
            NUMITEMS = NUMITEMS + 1;
            SUMA = SUMA - MONTO;
            END
        END /* INVEN = K */
        
    /* EL IVA */
    if (IVA = 'A') then
        BEGIN
        /* SUME LAS BASES DE LOS ARTICULOS DEL DOCUMENTO */
        FOR SELECT MAX(COAR_CTAIVADC), SUM(DVCD_IVAMONTO), SUM(cast(DVCD_CANT as double precision) * (DVCD_PRUNIT-DVCD_DTOMONTO)), SUM(DVCD_CONSUMO)
            FROM ARTICULO A, contabil_articulo_niif C, DEVOLUCIONES_COMPRAS_DET F
            WHERE F.DVCO_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND DVCD_IVAMONTO <> 0
            GROUP BY COAR_CTAIVAC
            INTO :CTAIVA, :IMPTOS, :MONTO, :VALORADIC
        DO
          if (IMPTOS <> 0) then
            BEGIN
            IMPTOS = CAST(IMPTOS AS DOUBLE PRECISION) * VRSUBT / MERCANCIA;
            if (IMPINC = 'S') then
                BEGIN
                MONTO = MONTO - IMPTOS;
                MONTO = MONTO - VALORADIC;
                END

            /* TRAIGA LAS CARCATERISTICAS DE LA CUENTA */
            EXECUTE PROCEDURE cuenta_interfaz_niif(24, :IDDOC, :CTAIVA, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            /* DEPENDE DEL TIPO DE CUENTA */
            if (TIPOCUEN = 'I') then
                BEGIN
                /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                FOR SELECT F.ARTI_COD, DVCD_IVAMONTO, (cast(DVCD_CANT as double precision) * (DVCD_PRUNIT-DVCD_DTOMONTO)), TAIV_PORC, DVCD_CONSUMO
                    FROM ARTICULO A, contabil_articulo_niif C, DEVOLUCIONES_COMPRAS_DET F, TARIFA_IVA T
                    WHERE F.DVCO_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND COAR_CTAIVAV = :CUENTA AND A.TAIV_COD = T.TAIV_COD
                    INTO :ARTICULO, :IMPTOS, :MONTO, :PORCIVA, :VALORADIC
                DO
                    BEGIN
                    if (IMPINC = 'S') then
                        BEGIN
                        MONTO = MONTO - IMPTOS;
                        MONTO = MONTO - VALORADIC;
                        END
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_SUBC, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON, CNDE_PREF, CNDE_FOLIOE)
                        VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :IMPTOS, :MONTO, :PORCIVA, :NIT, :PROY, :CENTRO, :subcen, NULL, NULL, NULL, :ARTICULO, 0, 0, :PREFAC, CAST(:NUMEROFAC AS INTEGER));
                    NUMITEMS = NUMITEMS + 1;
                    SUMA = SUMA - IMPTOS;
                    END
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_SUBC, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON, CNDE_PREF, CNDE_FOLIOE)
                    VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :IMPTOS, :MONTO, :PORCIVA, :NIT, :PROY, :CENTRO, :subcen, :NUMERO, NULL, :FECHA, NULL, 0, 24, :PREFAC, CAST(:NUMEROFAC AS INTEGER));
                NUMITEMS = NUMITEMS + 1;
                SUMA = SUMA - IMPTOS;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_SUBC, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON, CNDE_PREF, CNDE_FOLIOE)
                    VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :IMPTOS, :MONTO, :PORCIVA, :NIT, :PROY, :CENTRO, :subcen, NULL, NULL, NULL, NULL, 0, 0, :PREFAC, CAST(:NUMEROFAC AS INTEGER));
                NUMITEMS = NUMITEMS + 1;
                SUMA = SUMA - IMPTOS;
                END
            END /* FOR */
        END /* IVA X ARTICULO */
        
    if (IVA = 'K') then /* IVA EN CTA CONSTANTE */
        BEGIN
        SELECT SUM(DVCD_IVAMONTO), SUM(cast(DVCD_CANT as double precision) * (DVCD_PRUNIT-DVCD_DTOMONTO)), SUM(DVCD_CONSUMO)
            FROM DEVOLUCIONES_COMPRAS_DET F
            WHERE F.DVCO_ID = :IDDOC  AND DVCD_IVAMONTO <> 0
            INTO :IMPTOS, :MONTO, :VALORADIC;
            
        if (IMPTOS <> 0) then
            BEGIN
            IMPTOS = CAST(IMPTOS AS DOUBLE PRECISION) * VRSUBT / MERCANCIA;
            if (IMPINC = 'S') then
                BEGIN
                MONTO = MONTO - IMPTOS;
                MONTO = MONTO - VALORADIC;
                END
            /* TRAIGA LAS CARACTERISTICAS DE LA CUENTA */
            EXECUTE PROCEDURE cuenta_interfaz_niif(24, :IDDOC, :CTAIVA, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            /* DEPENDE DEL TIPO DE CUENTA */
            if (TIPOCUEN = 'I') then
                BEGIN
                /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                FOR SELECT F.ARTI_COD, (cast(DVCD_CANT as double precision) * (DVCD_PRUNIT-DVCD_DTOMONTO)), DVCD_IVAMONTO, TAIV_PORC, DVCD_CONSUMO
                    FROM ARTICULO A, DEVOLUCIONES_COMPRAS_DET F, TARIFA_IVA T
                    WHERE F.DVCO_ID = :IDDOC AND A.TAIV_COD = T.TAIV_COD
                    INTO :ARTICULO, :MONTO, :IMPTOS, :PORCIVA, :VALORADIC
                    DO
                    BEGIN
                    if (IMPTOS <> 0) then
                        BEGIN
                        if (IMPINC = 'S') then
                            BEGIN
                            MONTO = MONTO - IMPTOS;
                            MONTO = MONTO - VALORADIC;
                            END
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_SUBC, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON, CNDE_PREF, CNDE_FOLIOE)
                            VALUES (:IDC, :NUMITEMS, :CTAIVA, :CONCEPTO, '', 0, :IMPTOS, :MONTO, :PORCIVA, :NIT, :PROY, :CENTRO, :subcen, NULL, NULL, NULL, :ARTICULO, 0, 0, :PREFAC, CAST(:NUMEROFAC AS INTEGER));
                        NUMITEMS = NUMITEMS + 1;
                        SUMA = SUMA - IMPTOS;
                        END
                    END
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                /* INSERTE EL REGISTRO DE LA BASE */
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_SUBC, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON, CNDE_PREF, CNDE_FOLIOE)
                    VALUES (:IDC, :NUMITEMS, :CTAIVA, :CONCEPTO, '', 0, :IMPTOS, :MONTO, :PORCIVA, :NIT, :PROY, :CENTRO, :subcen, :NUMERO, NULL, :FECHA, NULL, 0, 24, :PREFAC, CAST(:NUMEROFAC AS INTEGER));
                NUMITEMS = NUMITEMS + 1;
                SUMA = SUMA - IMPTOS;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                /* INSERTE EL REGISTRO DE LA BASE */
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_SUBC, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON, CNDE_PREF, CNDE_FOLIOE)
                    VALUES (:IDC, :NUMITEMS, :CTAIVA, :CONCEPTO, '', 0, :IMPTOS, :MONTO, :PORCIVA, :NIT, :PROY, :CENTRO, :subcen, NULL, NULL, NULL, NULL, 0, 0, :PREFAC, CAST(:NUMEROFAC AS INTEGER));
                NUMITEMS = NUMITEMS + 1;
                SUMA = SUMA - IMPTOS;
                END
            END /* <> 0 */
        END /* IVA EN CTA CONSTANTE */
        
    /* EL IMPOCONSUMO */
    if (CONSUMO = 'A') then
        BEGIN
        /* SUME LAS BASES DE LOS ARTICULOS DEL DOCUMENTO */
        FOR SELECT MAX(COAR_CTACONS), SUM(DVCD_CONSUMO)
            FROM ARTICULO A, contabil_articulo_niif C, DEVOLUCIONES_COMPRAS_DET F
            WHERE F.DVCO_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD
            GROUP BY COAR_CTACONS
            INTO :CTACONSUMO, :IMPTOS
        DO
            BEGIN
            if (IMPTOS <> 0) then
                BEGIN
                /* TRAIGA LAS CARACTERISTICAS DE LA CUENTA */
                EXECUTE PROCEDURE cuenta_interfaz_niif(24, :IDDOC, :CTACONSUMO, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                /* DEPENDE DEL TIPO DE CUENTA */
                if (TIPOCUEN = 'I') then
                    BEGIN
                    /* ES UNA CUENTA DE INVENTARIO, REGISTRE UNO A UNO LOS ARTICULOS */
                    FOR SELECT F.ARTI_COD, DVCD_CONSUMO
                        FROM ARTICULO A, contabil_articulo_niif C, DEVOLUCIONES_COMPRAS_DET F
                        WHERE F.DVCO_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND COAR_CTACONS = :CUENTA
                        INTO :ARTICULO, :IMPTOS
                        DO
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_SUBC, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON, CNDE_PREF, CNDE_FOLIOE)
                            VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, :subcen, NULL, NULL, NULL, :ARTICULO, 0, 0, :PREFAC, CAST(:NUMEROFAC AS INTEGER));
                        NUMITEMS = NUMITEMS + 1;
                        SUMA = SUMA - IMPTOS;
                        END
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_SUBC, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON, CNDE_PREF, CNDE_FOLIOE)
                        VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, :subcen, :NUMERO, NULL, :FECHA, NULL, 0, 24, :PREFAC, CAST(:NUMEROFAC AS INTEGER));
                    NUMITEMS = NUMITEMS + 1;
                    SUMA = SUMA - IMPTOS;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    /* INSERTE EL REGISTRO DE LA BASE */
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_SUBC, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON, CNDE_PREF, CNDE_FOLIOE)
                        VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, :subcen, NULL, NULL, NULL, NULL, 0, 0, :PREFAC, CAST(:NUMEROFAC AS INTEGER));
                    NUMITEMS = NUMITEMS + 1;
                    SUMA = SUMA - IMPTOS;
                    END
                END
            END /* FOR */
        END /* CONSUMO X ARTICULO */
        
    if (CONSUMO = 'K') then /* CONSUMO EN CTA CONSTANTE */
        BEGIN
        SELECT SUM(DVCD_CONSUMO) FROM DEVOLUCIONES_COMPRAS_DET F WHERE F.DVCO_ID = :IDDOC INTO :IMPTOS;
        if (IMPTOS <> 0) then
            BEGIN
            /* TRAIGA LAS CARACTERISTICAS DE LA CUENTA */
            EXECUTE PROCEDURE cuenta_interfaz_niif(24, :IDDOC, :CTACONSUMO, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            /* DEPENDE DEL TIPO DE CUENTA */
            if (TIPOCUEN = 'I') then
                BEGIN
                /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                FOR SELECT F.ARTI_COD, DVCD_CONSUMO
                    FROM ARTICULO A, DEVOLUCIONES_COMPRAS_DET F
                    WHERE F.DVCO_ID = :IDDOC
                    INTO :ARTICULO, :IMPTOS
                    DO
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_SUBC, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON, CNDE_PREF, CNDE_FOLIOE)
                        VALUES (:IDC, :NUMITEMS, :CTACONSUMO, :CONCEPTO, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, :subcen, NULL, NULL, NULL, :ARTICULO, 0, 0, :PREFAC, CAST(:NUMEROFAC AS INTEGER));
                    NUMITEMS = NUMITEMS + 1;
                    SUMA = SUMA - IMPTOS;
                    END
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                /* INSERTE EL REGISTRO DE LA BASE */
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_SUBC, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON, CNDE_PREF, CNDE_FOLIOE)
                    VALUES (:IDC, :NUMITEMS, :CTACONSUMO, :CONCEPTO, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, :subcen, :NUMERO, NULL, :FECHA, NULL, 0, 24, :PREFAC, CAST(:NUMEROFAC AS INTEGER));
                NUMITEMS = NUMITEMS + 1;
                SUMA = SUMA - IMPTOS;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                /* INSERTE EL REGISTRO DE LA BASE */
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_SUBC, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON, CNDE_PREF, CNDE_FOLIOE)
                    VALUES (:IDC, :NUMITEMS, :CTACONSUMO, :CONCEPTO, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, :subcen, NULL, NULL, NULL, NULL, 0, 0, :PREFAC, CAST(:NUMEROFAC AS INTEGER));
                NUMITEMS = NUMITEMS + 1;
                SUMA = SUMA - IMPTOS;
                END
            END
        END /* CONSUMO EN CTA CONSTANTE */
        
    /* EL FOMENTO */
    if (FOMENTO = 'A') then
        BEGIN
        /* SUME LAS BASES DE LOS ARTICULOS DEL DOCUMENTO */
        FOR SELECT MAX(COAR_CTAFOMENTO), SUM(DVCD_FOMM)
            FROM ARTICULO A, contabil_articulo_niif C, DEVOLUCIONES_COMPRAS_DET F
            WHERE F.DVCO_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD
            GROUP BY COAR_CTAFOMENTO
            INTO :CTAFOMENTO, :IMPTOS
        DO
            BEGIN
            if (IMPTOS <> 0) then
                BEGIN
                /* TRAIGA LAS CARACTERISTICAS DE LA CUENTA */
                EXECUTE PROCEDURE cuenta_interfaz_niif(24, :IDDOC, :CTAFOMENTO, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                /* DEPENDE DEL TIPO DE CUENTA */
                if (TIPOCUEN = 'I') then
                    BEGIN
                    /* ES UNA CUENTA DE INVENTARIO, REGISTRE UNO A UNO LOS ARTICULOS */
                    FOR SELECT F.ARTI_COD, DVCD_FOMM
                        FROM ARTICULO A, contabil_articulo_niif C, DEVOLUCIONES_COMPRAS_DET F
                        WHERE F.DVCO_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND COAR_CTACONS = :CUENTA
                        INTO :ARTICULO, :IMPTOS
                        DO
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_SUBC, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON, CNDE_PREF, CNDE_FOLIOE)
                            VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :IMPTOS, 0, 0, 0, :NIT, :PROY, :CENTRO, :subcen, NULL, NULL, NULL, :ARTICULO, 0, 0, :PREFAC, CAST(:NUMEROFAC AS INTEGER));
                        NUMITEMS = NUMITEMS + 1;
                        SUMA = SUMA + IMPTOS;
                        END
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_SUBC, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON, CNDE_PREF, CNDE_FOLIOE)
                        VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :IMPTOS, 0, 0, 0, :NIT, :PROY, :CENTRO, :subcen, :NUMERO, NULL, :FECHA, NULL, 0, 24, :PREFAC, CAST(:NUMEROFAC AS INTEGER));
                    NUMITEMS = NUMITEMS + 1;
                    SUMA = SUMA + IMPTOS;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    /* INSERTE EL REGISTRO DE LA BASE */
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_SUBC, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON, CNDE_PREF, CNDE_FOLIOE)
                        VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :IMPTOS, 0, 0, 0, :NIT, :PROY, :CENTRO, :subcen, NULL, NULL, NULL, NULL, 0, 0, :PREFAC, CAST(:NUMEROFAC AS INTEGER));
                    NUMITEMS = NUMITEMS + 1;
                    SUMA = SUMA + IMPTOS;
                    END
                END
            END /* FOR */
        END /* FOMENTO X ARTICULO */
        
    if (FOMENTO = 'K') then /* FOMENTO EN CTA CONSTANTE */
        BEGIN
        SELECT SUM(DVCD_FOMM) FROM DEVOLUCIONES_COMPRAS_DET F WHERE F.DVCO_ID = :IDDOC INTO :IMPTOS;
        if (IMPTOS <> 0) then
            BEGIN
            /* TRAIGA LAS CARACTERISTICAS DE LA CUENTA */
            EXECUTE PROCEDURE cuenta_interfaz_niif(24, :IDDOC, :CTAFOMENTO, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            /* DEPENDE DEL TIPO DE CUENTA */
            if (TIPOCUEN = 'I') then
                BEGIN
                /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                FOR SELECT F.ARTI_COD, DVCD_FOMM
                    FROM ARTICULO A, DEVOLUCIONES_COMPRAS_DET F
                    WHERE F.DVCO_ID = :IDDOC
                    INTO :ARTICULO, :IMPTOS
                    DO
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_SUBC, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON, CNDE_PREF, CNDE_FOLIOE)
                        VALUES (:IDC, :NUMITEMS, :CTAFOMENTO, :CONCEPTO, '', :IMPTOS, 0, 0, 0, :NIT, :PROY, :CENTRO, :subcen, NULL, NULL, NULL, :ARTICULO, 0, 0, :PREFAC, CAST(:NUMEROFAC AS INTEGER));
                    NUMITEMS = NUMITEMS + 1;
                    SUMA = SUMA + IMPTOS;
                    END
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                /* INSERTE EL REGISTRO DE LA BASE */
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_SUBC, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON, CNDE_PREF, CNDE_FOLIOE)
                    VALUES (:IDC, :NUMITEMS, :CTAFOMENTO, :CONCEPTO, '', :IMPTOS, 0, 0, 0, :NIT, :PROY, :CENTRO, :subcen, :NUMERO, NULL, :FECHA, NULL, 0, 24, :PREFAC, CAST(:NUMEROFAC AS INTEGER));
                NUMITEMS = NUMITEMS + 1;
                SUMA = SUMA + IMPTOS;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                /* INSERTE EL REGISTRO DE LA BASE */
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_SUBC, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON, CNDE_PREF, CNDE_FOLIOE)
                    VALUES (:IDC, :NUMITEMS, :CTAFOMENTO, :CONCEPTO, '', :IMPTOS, 0, 0, 0, :NIT, :PROY, :CENTRO, :subcen, NULL, NULL, NULL, NULL, 0, 0, :PREFAC, CAST(:NUMEROFAC AS INTEGER));
                NUMITEMS = NUMITEMS + 1;
                SUMA = SUMA + IMPTOS;
                END
            END
        END /* FOMENTO EN CTA CONSTANTE */
        
    /* DEGUELLO */
    if ((ctadeguello is not null) and (ctadeguello <> '') and (deguello <> 0)) then
        begin
        /* TRAIGA LAS CARACTERISTICAS DE LA CUENTA */
        execute procedure cuenta_interfaz_niif(24, :IDDOC, :ctadeguello, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
        if (ERRORC <> 0) then
            ERROR = ERROR + 1;
        if (TIPOCUEN = 'C') then
            begin
            insert into CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_SUBC, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_DOCTIPOA, CNDE_DOCTIPON, CNDE_PREF, CNDE_FOLIOE)
                values (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :deguello, 0, 0, 0, :NIT, :PROY, :CENTRO, :SUBCEN, :NUMERO, null, :fecha, 0, 24, :PREFAC, CAST(:NUMEROFAC AS INTEGER));
            NUMITEMS = NUMITEMS + 1;
            SUMA = SUMA + deguello;
            end
        if (TIPOCUEN = 'N') then
            begin
            /* INSERTE EL REGISTRO DE LA BASE */
            insert into CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_SUBC, CNDE_DOCTIPOA, CNDE_DOCTIPON, CNDE_PREF, CNDE_FOLIOE)
                values (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :deguello, 0, 0, 0, :NIT, :PROY, :CENTRO, :SUBCEN, 0, 0, :PREFAC, CAST(:NUMEROFAC AS INTEGER));
            NUMITEMS = NUMITEMS + 1;
            SUMA = SUMA + deguello;
            end
        end
    /* DESCUENTO */
    if ((CTADTO IS NOT NULL) AND
        (CTADTO <> '') AND
        (VRDTO <> 0)) THEN
        BEGIN
        /* TRAIGA LAS CARACTERISTICAS DE LA CUENTA */
        EXECUTE PROCEDURE cuenta_interfaz_niif(24, :IDDOC, :CTADTO, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
        if (ERRORC <> 0) then
            ERROR = ERROR + 1;
        if (TIPOCUEN = 'C') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_SUBC, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON, CNDE_PREF, CNDE_FOLIOE)
                VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :VRDTO, 0, 0, 0, :NIT, :PROY, :CENTRO, :subcen, :NUMERO, NULL, :FECHA, NULL, 0, 24, :PREFAC, CAST(:NUMEROFAC AS INTEGER));
            NUMITEMS = NUMITEMS + 1;
            SUMA = SUMA + VRDTO;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            /* INSERTE EL REGISTRO DE LA BASE */
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_SUBC, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON, CNDE_PREF, CNDE_FOLIOE)
                VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :VRDTO, 0, 0, 0, :NIT, :PROY, :CENTRO, :subcen, NULL, NULL, NULL, NULL, 0, 0, :PREFAC, CAST(:NUMEROFAC AS INTEGER));
            NUMITEMS = NUMITEMS + 1;
            SUMA = SUMA + VRDTO;
            END
        END /* DESCUENTO */
        
    /* VALOR ADIC */
    if ((CTAADIC IS NOT NULL) AND
        (CTAADIC <> '') AND
        (VRADIC <> 0)) THEN
        BEGIN
        /* TRAIGA LAS CARACTERISTICAS DE LA CUENTA */
        EXECUTE PROCEDURE cuenta_interfaz_niif(24, :IDDOC, :CTAADIC, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
        if (ERRORC <> 0) then
            ERROR = ERROR + 1;
        if (TIPOCUEN = 'C') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_SUBC, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON, CNDE_PREF, CNDE_FOLIOE)
                VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :VRADIC, 0, 0, :NIT, :PROY, :CENTRO, :subcen, :NUMERO, NULL, :FECHA, NULL, 0, 24, :PREFAC, CAST(:NUMEROFAC AS INTEGER));
            NUMITEMS = NUMITEMS + 1;
            SUMA = SUMA - VRADIC;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            /* INSERTE EL REGISTRO DE LA BASE */
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_SUBC, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON, CNDE_PREF, CNDE_FOLIOE)
                VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :VRADIC, 0, 0, :NIT, :PROY, :CENTRO, :subcen, NULL, NULL, NULL, NULL, 0, 0, :PREFAC, CAST(:NUMEROFAC AS INTEGER));
            NUMITEMS = NUMITEMS + 1;
            SUMA = SUMA - VRADIC;
            END
        END /* VR. ADIC */
        
    /* VALOR EXTRA */
    if ((CTAEXTRA IS NOT NULL) AND
        (CTAEXTRA <> '') AND
        (VREXTRA <> 0)) THEN
        BEGIN
        /* TRAIGA LAS CARACTERISTICAS DE LA CUENTA */
        EXECUTE PROCEDURE cuenta_interfaz_niif(24, :IDDOC, :CTAEXTRA, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
        if (ERRORC <> 0) then
            ERROR = ERROR + 1;
        if (TIPOCUEN = 'C') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_SUBC, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON, CNDE_PREF, CNDE_FOLIOE)
                VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :VREXTRA, 0, 0, 0, :NIT, :PROY, :CENTRO, :subcen, :NUMERO, NULL, :FECHA, NULL, 0, 24, :PREFAC, CAST(:NUMEROFAC AS INTEGER));
            NUMITEMS = NUMITEMS + 1;
            SUMA = SUMA + VREXTRA;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            /* INSERTE EL REGISTRO DE LA BASE */
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_SUBC, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON, CNDE_PREF, CNDE_FOLIOE)
                VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :VREXTRA, 0, 0, 0, :NIT, :PROY, :CENTRO, :subcen, NULL, NULL, NULL, NULL, 0, 0, :PREFAC, CAST(:NUMEROFAC AS INTEGER));
            NUMITEMS = NUMITEMS + 1;
            SUMA = SUMA + VREXTRA;
            END
        END /* VR. EXTRA */
        
    if (fomento <> 'SI') then
        BEGIN
        /* DESCUENTE EL IMPOCONSUMO */
        SELECT SUM(DVCD_CONSUMO)
            FROM devoluciones_compras_det WHERE DVCO_ID = :IDDOC INTO :IMPTOS;
        if (IMPTOS IS NULL) then
            IMPTOS = 0;
        vrsubt = vrsubt - IMPTOS;
        END
    /* RETENCION FUENTE */
    if ((RTFTE = 'P') or (RTFTE = 'K')) then
      if (VRRTFTE <> 0) then
        BEGIN
        if (RTFTE = 'P') then
            CTARTFTE = TCTARTFTE;
            
        /* TRAIGA LAS CARACTERISTICAS DE LA CUENTA */
        EXECUTE PROCEDURE cuenta_interfaz_niif(24, :IDDOC, :CTARTFTE, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
        if (ERRORC <> 0) then
            ERROR = ERROR + 1;
        if (TIPOCUEN = 'C') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_SUBC, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON, CNDE_PREF, CNDE_FOLIOE)
                VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :VRRTFTE, 0, :VRSUBT, :PRTFTE, :NIT, :PROY, :CENTRO, :subcen, :NUMERO, NULL, :FECHA, NULL, 0, 24, :PREFAC, CAST(:NUMEROFAC AS INTEGER));
            NUMITEMS = NUMITEMS + 1;
            SUMA = SUMA + VRRTFTE;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            /* INSERTE EL REGISTRO DE LA BASE */
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_SUBC, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON, CNDE_PREF, CNDE_FOLIOE)
                VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :VRRTFTE, 0, :VRSUBT, :PRTFTE, :NIT, :PROY, :CENTRO, :subcen, NULL, NULL, NULL, NULL, 0, 0, :PREFAC, CAST(:NUMEROFAC AS INTEGER));
            NUMITEMS = NUMITEMS + 1;
            SUMA = SUMA + VRRTFTE;
            END
        END /* RTFTE */
    if (RTFTE = 'A') then
        BEGIN
        FOR SELECT MAX(COAR_CTARTFTE), MAX(COAR_RTFTE), MIN(COAR_RTBASE), SUM(DVCD_TOTAL-DVCD_IVAMONTO-DVCD_CONSUMO), SUM((DVCD_TOTAL-DVCD_IVAMONTO-DVCD_CONSUMO)*COAR_RTFTE)
            FROM contabil_articulo_niif C, DEVOLUCIONES_COMPRAS_DET F
            WHERE F.dvco_id = :IDDOC AND F.ARTI_COD = C.ARTI_COD
            GROUP BY COAR_CTARTFTE
            INTO :CTARTFTE, :PRTFTE, :baseadic, :MONTO, :VRRTFTE
            DO
            BEGIN
            MONTO = MONTO * FACTOR;
            if (MONTO >= BASEADIC) then
                BEGIN
                VRRTFTE = VRRTFTE * FACTOR / 100;
                execute procedure redondee(VRRTFTE, DIG) returning_values (VRRTFTE);
                execute procedure redondee(MONTO, DIG) returning_values (MONTO);
                if (VRRTFTE <> 0) then
                    BEGIN
                    /* TRAIGA LAS CARACTERISTICAS DE LA CUENTA */
                    EXECUTE PROCEDURE cuenta_interfaz_niif(24, :IDDOC, :CTARTFTE, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
                    if (ERRORC <> 0) then
                        ERROR = ERROR + 1;
                    if (TIPOCUEN = 'C') then
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_SUBC, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON, CNDE_PREF, CNDE_FOLIOE)
                            VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :VRRTFTE, 0, :VRSUBT, :PRTFTE, :NIT, :PROY, :CENTRO, :subcen, :NUMERO, NULL, :FECHA, NULL, 0, 24, :PREFAC, CAST(:NUMEROFAC AS INTEGER));
                        NUMITEMS = NUMITEMS + 1;
                        SUMA = SUMA + VRRTFTE;
                        END
                    if (TIPOCUEN = 'N') then
                        BEGIN
                        /* INSERTE EL REGISTRO DE LA BASE */
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_SUBC, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON, CNDE_PREF, CNDE_FOLIOE)
                            VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :VRRTFTE, 0, :VRSUBT, :PRTFTE, :NIT, :PROY, :CENTRO, :subcen, NULL, NULL, NULL, NULL, 0, 0, :PREFAC, CAST(:NUMEROFAC AS INTEGER));
                        NUMITEMS = NUMITEMS + 1;
                        SUMA = SUMA + VRRTFTE;
                        END
                    END
                END
            END
        END /* RTFTE */
    /* RETENCION IVA */
    if ((RTIVA = 'P') or (RTIVA = 'K')) then
      if (VRRTIVA <> 0) then
        BEGIN
        if (RTIVA = 'P') then
            CTARTIVA = TCTARTIVA;
            
        /* TRAIGA LAS CARACTERISTICAS DE LA CUENTA */
        EXECUTE PROCEDURE cuenta_interfaz_niif(24, :IDDOC, :CTARTIVA, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
        if (ERRORC <> 0) then
            ERROR = ERROR + 1;
        if (TIPOCUEN = 'C') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_SUBC, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON, CNDE_PREF, CNDE_FOLIOE)
                VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :VRRTIVA, 0, :VRIVA, :PORC, :NIT, :PROY, :CENTRO, :subcen, :NUMERO, NULL, :FECHA, NULL, 0, 24, :PREFAC, CAST(:NUMEROFAC AS INTEGER));
            NUMITEMS = NUMITEMS + 1;
            SUMA = SUMA + VRRTIVA;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            /* INSERTE EL REGISTRO DE LA BASE */
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_SUBC, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON, CNDE_PREF, CNDE_FOLIOE)
                VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :VRRTIVA, 0, :VRIVA, :PORC, :NIT, :PROY, :CENTRO, :subcen, NULL, NULL, NULL, NULL, 0, 0, :PREFAC, CAST(:NUMEROFAC AS INTEGER));
            NUMITEMS = NUMITEMS + 1;
            SUMA = SUMA + VRRTIVA;
            END
        END /* RTIVA */
        
    /* RETENCION DE ICA */
    if ((RTICA = 'P') or (RTICA = 'K')) then
      if (VRRTICA <> 0) then
        BEGIN
        if (RTICA = 'P') then
            CTARTICA = TCTARTICA;
            
        /* TRAIGA LAS CARACTERISTICAS DE LA CUENTA */
        EXECUTE PROCEDURE cuenta_interfaz_niif(24, :IDDOC, :CTARTICA, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
        if (ERRORC <> 0) then
            ERROR = ERROR + 1;
        if (TIPOCUEN = 'C') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_SUBC, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON, CNDE_PREF, CNDE_FOLIOE)
                VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :VRRTICA, 0, :VRSUBT, :PRTICA, :NIT, :PROY, :CENTRO, :subcen, :NUMERO, NULL, :FECHA, NULL, 0, 24, :PREFAC, CAST(:NUMEROFAC AS INTEGER));
            NUMITEMS = NUMITEMS + 1;
            SUMA = SUMA + VRRTICA;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            /* INSERTE EL REGISTRO DE LA BASE */
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_SUBC, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON, CNDE_PREF, CNDE_FOLIOE)
                VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :VRRTICA, 0, :VRSUBT, :PRTICA, :NIT, :PROY, :CENTRO, :subcen, NULL, NULL, NULL, NULL, 0, 0, :PREFAC, CAST(:NUMEROFAC AS INTEGER));
            NUMITEMS = NUMITEMS + 1;
            SUMA = SUMA + VRRTICA;
            END
        END /* RTICA */
    /* RETENCION CREE */
    if ((RCREE = 'P') or (RCREE = 'K')) then
      if (VRRCREE <> 0) then
        BEGIN
        if (RCREE = 'P') then
            CTARCREE = TCTARCREE;
            
        /* TRAIGA LAS CARACTERISTICAS DE LA CUENTA */
        EXECUTE PROCEDURE cuenta_interfaz_niif(24, :IDDOC, :CTARCREE, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
        if (ERRORC <> 0) then
            ERROR = ERROR + 1;
        if (TIPOCUEN = 'C') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_SUBC, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON, CNDE_PREF, CNDE_FOLIOE)
                VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :VRRCREE, 0, :VRSUBT, :PRCREE, :NIT, :PROY, :CENTRO, :subcen, :NUMERO, NULL, :FECHA, NULL, 0, 24, :PREFAC, CAST(:NUMEROFAC AS INTEGER));
            NUMITEMS = NUMITEMS + 1;
            SUMA = SUMA + vrrcree;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            /* INSERTE EL REGISTRO DE LA BASE */
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_SUBC, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON, CNDE_PREF, CNDE_FOLIOE)
                VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :vrrcree, 0, :VRSUBT, :prcree, :NIT, :PROY, :CENTRO, :subcen, NULL, NULL, NULL, NULL, 0, 0, :PREFAC, CAST(:NUMEROFAC AS INTEGER));
            NUMITEMS = NUMITEMS + 1;
            SUMA = SUMA + vrrcree;
            END
        END /* RCREE */
    /* recorra las cuentas adicionales */
    FOR SELECT INCC_CUENTA, INCC_BASE, INCC_PORC, INCC_VALOR, INCC_DB
        FROM INTERFAZ_COMPRAS_CTAS
        WHERE INCO_ID = :IDINTER
        INTO :CUENTAADIC, :BASEADIC, :PORCADIC, :VALORADIC, :DBADIC
        DO
        BEGIN
        if (VALORADIC <> 0) then
            MONTO = VALORADIC;
        ELSE
            BEGIN
            if (:BASEADIC = 'SUBTOTAL') then
                VALORADIC = VRTOTAL - VREXTRA - VRIVA - VRADIC + VRDTO;
            if (:BASEADIC = 'DESCUENTO') then
                VALORADIC = VRDTO;
            if (:BASEADIC = 'IVA') then
                VALORADIC = VRIVA;
            if (:BASEADIC = 'CONSUMO') then
                SELECT SUM(DVCD_CONSUMO)
                    FROM DEVOLUCIONES_COMPRAS_DET F
                    WHERE F.DVCO_ID = :IDDOC 
                    INTO :VALORADIC;
            if (:BASEADIC = 'ADICIONAL') then
                VALORADIC = VRADIC;
            if (:BASEADIC = 'EXTRA') then
                VALORADIC = VREXTRA;
            if (:BASEADIC = 'TOTAL') then
                VALORADIC = VRTOTAL;
            MONTO = VALORADIC * PORCADIC;
            END
        if (MONTO <> 0) then
            BEGIN
            /* TRAIGA LAS CARACTERISTICAS DE LA CUENTA */
            EXECUTE PROCEDURE cuenta_interfaz_niif(24, :IDDOC, :CUENTAADIC, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'C') then
                BEGIN
                if (DBADIC = 'S') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_SUBC, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON, CNDE_PREF, CNDE_FOLIOE)
                        VALUES (:IDC, :NUMITEMS, :CUENTAADIC, :CONCEPTO, '', :MONTO, 0, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, :subcen, :NUMERO, NULL, :FECHA, NULL, 0, 24, :PREFAC, CAST(:NUMEROFAC AS INTEGER));
                    SUMA = SUMA + MONTO;
                    END
                ELSE
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_SUBC, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON, CNDE_PREF, CNDE_FOLIOE)
                        VALUES (:IDC, :NUMITEMS, :CUENTAADIC, :CONCEPTO, '', 0, :MONTO, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, :subcen, :NUMERO, NULL, :FECHA, NULL, 0, 24, :PREFAC, CAST(:NUMEROFAC AS INTEGER));
                    SUMA = SUMA - MONTO;
                    END
                NUMITEMS = NUMITEMS + 1;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                if (DBADIC = 'S') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_SUBC, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON, CNDE_PREF, CNDE_FOLIOE)
                        VALUES (:IDC, :NUMITEMS, :CUENTAADIC, :CONCEPTO, '', :MONTO, 0, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, :subcen, NULL, NULL, NULL, NULL, 0, 0, :PREFAC, CAST(:NUMEROFAC AS INTEGER));
                    SUMA = SUMA + MONTO;
                    END
                ELSE
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_SUBC, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON, CNDE_PREF, CNDE_FOLIOE)
                        VALUES (:IDC, :NUMITEMS, :CUENTAADIC, :CONCEPTO, '', 0, :MONTO, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, :subcen, NULL, NULL, NULL, NULL, 0, 0, :PREFAC, CAST(:NUMEROFAC AS INTEGER));
                    SUMA = SUMA - MONTO;
                    END
                NUMITEMS = NUMITEMS + 1;
                END
            NUMITEMS = NUMITEMS + 1;
            END
        END
    /* CIERRE EL COMPROBANTE CONTRA LA CUENTA DEL TERCERO O LA CONSTANTE */
    if ((SUMA <> 0) and ((CXP = 'P') or (CXP = 'K'))) then
        BEGIN
        if (SUMA < 0) then
            BEGIN
            DEBITO = SUMA * -1;
            CREDITO = 0;
            END
        ELSE
            BEGIN
            DEBITO = 0;
            CREDITO = SUMA;
            END
        if (CXP = 'P') then
            CTACXP = TCTAPROV;

        /* TRAIGA LAS CARACTERISTICAS DE LA CUENTA */
        EXECUTE PROCEDURE cuenta_interfaz_niif(24, :IDDOC, :CTACXP, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
        if (ERRORC <> 0) then
            ERROR = ERROR + 1;
        if (TIPOCUEN = 'C') then
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_SUBC, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON, CNDE_PREF, CNDE_FOLIOE)
                VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :DEBITO, :CREDITO, 0, 0, :NIT, :PROY, :CENTRO, :subcen, :NUMERO, NULL, :FECHA, NULL, 0, 24, :PREFAC, CAST(:NUMEROFAC AS INTEGER));
        if (TIPOCUEN = 'N') then
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_SUBC, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON, CNDE_PREF, CNDE_FOLIOE)
                VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :DEBITO, :CREDITO, 0, 0, :NIT, :PROY, :CENTRO, :subcen, NULL, NULL, NULL, NULL, 0, 0, :PREFAC, CAST(:NUMEROFAC AS INTEGER));
        END /* SUMA EN CXP */
     end
    if (ERROR > 0) then
        VER = 'S';
    SUSPEND;
    END /* EXISTE */
ELSE
    BEGIN
    EXECUTE PROCEDURE ERRORINT (1024, :IDDOC, :PREFIJO, 1);
    ERROR = ERROR + 1;
    VER = 'S';
    SUSPEND;
    END
END^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER procedure CONTABIL_NOTADBPR (
    IDDOC integer,
    IDINTER integer)
returns (
    ERROR integer,
    VER char(1),
    IDC integer)
as
declare variable PREF VARCHAR(4);
declare variable NUM VARCHAR(6);
declare variable NUMERO VARCHAR(10);
declare variable FECAUX DATE;
declare variable FECHA CHAR(8);
declare variable CONC CHAR(120);
declare variable VENCEAUX DATE;
declare variable VENCE CHAR(8);
declare variable VRSUBT NUMERIC(18, 2);
declare variable BASE0 NUMERIC(18, 2);
declare variable BASE1 NUMERIC(18, 2);
declare variable BASE2 NUMERIC(18, 2);
declare variable VRIVA NUMERIC(18, 2);
declare variable IVA1 NUMERIC(18, 2);
declare variable IVA2 NUMERIC(18, 2);
declare variable PRTFTE NUMERIC(9, 2);
declare variable VRRTFTE NUMERIC(18, 2);
declare variable PRTIVA NUMERIC(9, 2);
declare variable VRRTIVA NUMERIC(18, 2);
declare variable PRTICA NUMERIC(9, 2);
declare variable VRRTICA NUMERIC(18, 2);
declare variable PRTCREE NUMERIC(9, 2);
declare variable VRRTCREE NUMERIC(18, 2);
declare variable VRTOTAL NUMERIC(18, 2);
declare variable TIPOCOMP VARCHAR(3);
declare variable PREFCONT VARCHAR(4);
declare variable BASE CHAR(1);
declare variable CTABASE VARCHAR(20);
declare variable IVA CHAR(1);
declare variable CTAIVA VARCHAR(20);
declare variable CLIE CHAR(1);
declare variable CTACLIE VARCHAR(20);
declare variable RTFTE CHAR(1);
declare variable CTARTFTE VARCHAR(20);
declare variable RTIVA CHAR(1);
declare variable CTARTIVA VARCHAR(20);
declare variable RTICA CHAR(1);
declare variable CTARTICA VARCHAR(20);
declare variable RTCREE CHAR(1);
declare variable CTARTCREE VARCHAR(20);
declare variable EXISTE CHAR(1);
declare variable CUENTA VARCHAR(20);
declare variable MONTO NUMERIC(18,2);
declare variable ES_RETENCION CHAR(1);
declare variable TIPOCUEN CHAR(1);
declare variable NIT VARCHAR(20);
declare variable PROY VARCHAR(4);
declare variable CENTRO VARCHAR(4);
declare variable SUBCENT VARCHAR(4);
declare variable MONTOBASE NUMERIC(18,2);
declare variable PORC NUMERIC(5,2);
declare variable DEBITO NUMERIC(18,2);
declare variable CREDITO NUMERIC(18,2);
declare variable NROI INTEGER;
declare variable SUMA NUMERIC(18,2);
declare variable TCTACLIEN VARCHAR(20);
declare variable TCTABASE VARCHAR(20);
declare variable TCTARTFTE VARCHAR(20);
declare variable TCTARTIVA VARCHAR(20);
declare variable TCTARTICA VARCHAR(20);
declare variable TCTARTCREE VARCHAR(20);
declare variable CUENTAADIC VARCHAR(20);
declare variable BASEADIC VARCHAR(20);
declare variable PORCADIC NUMERIC(5,2);
declare variable VALORADIC NUMERIC(18,2);
declare variable DBADIC CHAR(1);
declare variable NPROY VARCHAR(4);
declare variable NCENTRO VARCHAR(4);
declare variable NSUBC VARCHAR(4);
declare variable ANULADO CHAR(1);
declare variable TARIFA INTEGER;
declare variable AUTORIZA VARCHAR(30);
declare variable NUMPROV VARCHAR(20);
declare variable PREFE VARCHAR(4);
declare variable NUME INTEGER;
BEGIN
ERROR = 0;
/* BUSQUE LA INTERFACE */
EXISTE = 'N';
SELECT 'S', TICO_COD, PRCO_PRE, INCP_BASE, INCP_IVA, INCP_RTFTE, INCP_RTIVA, INCP_RTICA, INCP_RTCREE, INCP_PROV, INCP_CTABASE, INCP_CTAIVA,
    INCP_CTARTFTE, INCP_CTARTIVA, INCP_CTARTICA, INCP_CTARTCREE, INCP_CTAPROV, INCP_CONFIRMAR
    FROM INTERFAZ_CXPAGAR
    WHERE INCP_ID = :IDINTER
    INTO :EXISTE, :TIPOCOMP, :PREFCONT, :BASE, :IVA, :RTFTE, :RTIVA, :RTICA, :RTCREE, :CLIE, :CTABASE, :CTAIVA,
    :CTARTFTE, :CTARTIVA, :CTARTICA, :CTARTCREE, :CTACLIE, :VER;

if (EXISTE = 'S') then
  BEGIN
  /* BORRE CUALQUEIR CONTABILIZACION PREVIA */
  DELETE FROM CONTABILIZACION WHERE CNTB_TIPOREF = 51 AND CNTB_IDREF = :IDDOC;
  /* TRAIGA EL ENCABEZADO DE LA NOTA */
  SELECT PREF_PRE, NDPR_NUMERO, NDPR_FECHA, NDPR_VENCE, N.TERC_NIT, NDPR_CONC, NDPR_IVAPORC, NDPR_IVAMONTO, NDPR_MONTO,
    NDPR_RTFTEPORC, NDPR_RTFTEMONTO, NDPR_RTIVAPORC, NDPR_RTIVAMONTO, NDPR_RTICAPORC, NDPR_RTICAMONTO, NDPR_RTCREE, NDPR_RTCREEM,
    TERC_CTAVENTA, TERC_CTARTFTE, TERC_CTARTIVA, TERC_CTARTICA, TERC_CTARCREE, TERC_CTACLIENTE, NDPR_PROY, NDPR_CENTRO, NDPR_SUBC,
    NDPR_ANULADO, NDPR_BASE0, NDPR_BASE1, NDPR_BASE2, NDPR_IVA1, NDPR_IVA2, IIF(NDPR_auto IS NULL, '', NDPR_AUTO), N.ndpr_numprov
        FROM NOTAS_DEBITO_PROVEEDOR N, TERCEROS T
        WHERE NDPR_ID = :IDDOC AND N.TERC_NIT = T.TERC_NIT
        INTO :PREF, :NUM, :FECAUX, :VENCEAUX, :NIT, :CONC, :PORC, :VRIVA, :VRTOTAL,
        :PRTFTE, :VRRTFTE, :PRTIVA, :VRRTIVA, :PRTICA, :VRRTICA, :PRTCREE, :VRRTCREE,
        :TCTABASE, TCTARTFTE, TCTARTIVA, TCTARTICA, TCTARTCREE, TCTACLIEN, NPROY, NCENTRO, NSUBC,
        ANULADO, :BASE0, BASE1, :BASE2, :IVA1, :IVA2, :autoriza, :NUMPROV;
  if (ANULADO = 'N') then
    BEGIN
    /* SI ES PROVEEDOR, SOBREESCIBE LAS CUENTAS  */
    SELECT PROV_CTAPAGAR, PROV_CTARTFTE, PROV_CTARTIVA, PROV_CTARTICA, PROV_CTACAUSA, PROV_CTARTCREE
        FROM PROVEEDORES WHERE TERC_NIT = :NIT
        INTO TCTACLIEN, TCTARTFTE, TCTARTIVA, TCTARTICA, TCTABASE, tctartcree;
    if (AUTORIZA <> '') then
        BEGIN
        PREFE = PREF;
        NUME = CAST(:num AS INTEGER);
        END
    ELSE
        BEGIN
        execute procedure SEPARAR_PREFIJO_NUMERO(:NUMPROV) returning_values :PREFE, :NUME;
        END
        
    /* SI EL DOCUMENTO ESPECIFICA ALGUNAS SOBRESCRIBA LAS DEL PROVEEDOR */
    SELECT NDPR_CTAPAGAR, NDPR_CTACAUSA
        FROM NOTAS_DEBITO_PROVEEDOR
        WHERE NDPR_ID = :IDDOC
        INTO :TCTACLIEN, TCTABASE;
    SELECT PREF_CENTRO, PREF_PROY, PREF_SUBC FROM PREFIJOS P, NOTAS_DEBITO_PROVEEDOR N
        WHERE P.PREF_PRE = N.PREF_PRE AND P.TIDO_COD = 51 AND N.NDPR_ID = :IDDOC INTO :CENTRO, :PROY, :subcent;
    if (NPROY <> '') then
        PROY = NPROY;
    if (NCENTRO <> '') then
        CENTRO = NCENTRO;
    if (nsubc <> '') then
        subcent = nsubc;
    NUMERO = PREF || NUM;
    VRSUBT = VRTOTAL; /* BASE DE RETEFTE Y RETEICA */

    EXECUTE PROCEDURE FECHA_A_CONTA(:FECAUX) returning_values (:FECHA);
    EXECUTE PROCEDURE FECHA_A_CONTA(:VENCEAUX) returning_values (:VENCE);

    /* REGISTRE EL ENCABEZADO CONTABLE */
    IDC = GEN_ID(ID_CONTABILIZA, 1);
    INSERT INTO CONTABILIZACION (CNTB_ID, CNTB_TIPOCOMP, CNTB_PREFCNT, CNTB_NUMERO, CNTB_FECHA, CNTB_CONCEPTO, CNTB_REF, CNTB_TIPOREF, CNTB_IDREF, CNTB_PREFREF, CNTB_NUMREF, CNTB_PROCESADO)
        VALUES (:IDC, :TIPOCOMP, :PREFCONT, :NUM, :FECHA, :CONC, '', 51, :IDDOC, :PREF, :NUM, 'N');

    NROI = 0;
    SUMA = 0;

    IF ((BASE = 'T') OR (BASE = 'K')) THEN
        BEGIN
        IF (BASE = 'T') THEN
            CTABASE = TCTABASE;

        if (VRSUBT <> 0) then
            BEGIN
            CUENTA = NULL;
            SELECT CUEN_COD, CUEN_TIPO, CUEN_RETENCION FROM CUENTAS
                WHERE CUEN_COD = :CTABASE INTO :CUENTA, :TIPOCUEN, :ES_RETENCION;
            if (CUENTA IS NULL) then
                begin
                INSERT INTO  ERRORES (ERRO_ITEM, ERRO_TIPODOC, ERRO_IDDOC, ERRO_CODIGO, ERRO_CANT, ERRO_CADENA)
                    VALUES(GEN_ID(id_errores, 1), 51, :IDDOC, 'CUENTA NO EXISTE', 0, :CTABASE);
                CUENTA = CTABASE;
                ERROR = ERROR + 1;
                end
            if (ES_RETENCION = 'S') then
                if ((prtiva <> 0) and (vriva = 0)) then
                    montobase = FLOOR(VRSUBT / prtiva);
                else
                    montobase = VRSUBT;
            else
                montobase = 0;
            if (TIPOCUEN = 'I') then
                BEGIN
                INSERT INTO  ERRORES (ERRO_ITEM, ERRO_TIPODOC, ERRO_IDDOC, ERRO_CODIGO, ERRO_CANT, ERRO_CADENA)
                    VALUES(GEN_ID(id_errores, 1), 51, :IDDOC, 'CUENTA DE INVENTARIO', 0, :CUENTA);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_SUBC, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON, CNDE_PREF, CNDE_FOLIOE)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRSUBT, 0, :MONTOBASE, :prtiva, :NIT, :PROY, :CENTRO, :SUBCENT, :NUMERO, NULL, :VENCE, NULL, 0, 51, :PREFE, :NUME);
                NROI = NROI + 1;
                SUMA = SUMA + VRSUBT;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_SUBC, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON, CNDE_PREF, CNDE_FOLIOE)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRSUBT, 0, :MONTOBASE, :prtiva, :NIT, :PROY, :CENTRO, :SUBCENT, NULL, NULL, NULL, NULL, 0, 0, :PREFE, :NUME);
                NROI = NROI + 1;
                SUMA = SUMA + VRSUBT;
                END
            END /* MONTO <> 0 */
        END /* BASE TERCERO O CONSTANTE */
    IF ((BASE = 'I')) THEN
        BEGIN
        FOR SELECT TAIV_CTACOMP, TAIV_COD FROM TARIFA_IVA WHERE TAIV_COD <= 2 INTO :CTABASE, :tarifa
            DO
            BEGIN
            if (TARIFA = 0) then
                vrsubt = BASE0;
            if (TARIFA = 1) then
                vrsubt = BASE1;
            if (TARIFA = 2) then
                vrsubt = BASE2;
            if (VRSUBT <> 0) then
                BEGIN
                CUENTA = NULL;
                SELECT CUEN_COD, CUEN_TIPO, CUEN_RETENCION FROM CUENTAS
                    WHERE CUEN_COD = :CTABASE INTO :CUENTA, :TIPOCUEN, :ES_RETENCION;
                if (CUENTA IS NULL) then
                    begin
                    INSERT INTO  ERRORES (ERRO_ITEM, ERRO_TIPODOC, ERRO_IDDOC, ERRO_CODIGO, ERRO_CANT, ERRO_CADENA)
                        VALUES(GEN_ID(id_errores, 1), 51, :IDDOC, 'CUENTA NO EXISTE', 0, :CTABASE);
                    CUENTA = CTABASE;
                    ERROR = ERROR + 1;
                    end
                montobase = 0;
                if (TIPOCUEN = 'I') then
                    BEGIN
                    INSERT INTO  ERRORES (ERRO_ITEM, ERRO_TIPODOC, ERRO_IDDOC, ERRO_CODIGO, ERRO_CANT, ERRO_CADENA)
                        VALUES(GEN_ID(id_errores, 1), 51, :IDDOC, 'CUENTA DE INVENTARIO', 0, :CUENTA);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_SUBC, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON, CNDE_PREF, CNDE_FOLIOE)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRSUBT, 0, :MONTOBASE, :prtiva, :NIT, :PROY, :CENTRO, :SUBCENT, :NUMERO, NULL, :VENCE, NULL, 0, 51, :PREFE, :NUME);
                    NROI = NROI + 1;
                    SUMA = SUMA + VRSUBT;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_SUBC, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON, CNDE_PREF, CNDE_FOLIOE)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRSUBT, 0, :MONTOBASE, :prtiva, :NIT, :PROY, :CENTRO, :SUBCENT, NULL, NULL, NULL, NULL, 0, 0, :PREFE, :NUME);
                    NROI = NROI + 1;
                    SUMA = SUMA + VRSUBT;
                    END
                END /* MONTO <> 0 */
            END
        END /* BASE TARIFA DE IVA */

    if (IVA = 'I') then /* IVA POR TARIFA */
        BEGIN
        FOR SELECT TAIV_CTAIVACMP, TAIV_COD, TAIV_PORC FROM TARIFA_IVA WHERE (TAIV_COD <> 0) AND (TAIV_COD <= 2) INTO :CTAIVA, :tarifa, :PORC
            DO
            BEGIN
            if (TARIFA = 1) then
                BEGIN
                vrsubt = BASE1;
                VRIVA = IVA1;
                END
            if (TARIFA = 2) then
                BEGIN
                VRIVA = IVA2;
                vrsubt = BASE2;
                END
            if (VRIVA <> 0) then
                BEGIN
                CUENTA = NULL;
                SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                    WHERE CUEN_COD = :CTAIVA INTO :CUENTA, :TIPOCUEN;
                if (CUENTA IS NULL) then
                    begin
                    INSERT INTO  ERRORES (ERRO_ITEM, ERRO_TIPODOC, ERRO_IDDOC, ERRO_CODIGO, ERRO_CANT, ERRO_CADENA)
                        VALUES(GEN_ID(id_errores, 1), 51, :IDDOC, 'CUENTA NO EXISTE', 0, :CTAIVA);
                    CUENTA = CTAIVA;
                    ERROR = ERROR + 1;
                    end
                if (TIPOCUEN = 'I') then
                    BEGIN
                    INSERT INTO  ERRORES (ERRO_ITEM, ERRO_TIPODOC, ERRO_IDDOC, ERRO_CODIGO, ERRO_CANT, ERRO_CADENA)
                        VALUES(GEN_ID(id_errores, 1), 51, :IDDOC, 'CUENTA DE INVENTARIO', 0, :CUENTA);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_SUBC, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON, CNDE_PREF, CNDE_FOLIOE)
                        VALUES (:IDC, :NROI, :CTAIVA, :CONC, '', :VRIVA, 0, :vrsubt, :porc, :NIT, :PROY, :CENTRO, :SUBCENT, :NUMERO, NULL, :VENCE, NULL, 0, 51, :PREFE, :NUME);
                    NROI = NROI + 1;
                    SUMA = SUMA + VRIVA;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_SUBC, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON, CNDE_PREF, CNDE_FOLIOE)
                        VALUES (:IDC, :NROI, :CTAIVA, :CONC, '', :VRIVA, 0, :vrsubt, :porc, :NIT, :PROY, :CENTRO, :SUBCENT, NULL, NULL, NULL, NULL, 0, 0, :PREFE, :NUME);
                    NROI = NROI + 1;
                    SUMA = SUMA + VRIVA;
                    END
                END /* VRIVA <> 0 */
            end /* FOR */
        END /* IVA EN CTA CONSTANTE */
        
    VRSUBT = VRTOTAL; /* BASE DE RETEFTE Y RETEICA */
    if (IVA = 'K') then /* IVA EN CTA CONSTANTE */
        BEGIN
        if (VRIVA <> 0) then
            BEGIN
            /* si no discrimino tarifas, asuma el subtotal como base del iva */
            if ((base1 = 0) and (base2 = 0)) then
                base1 = vrsubt;
            CUENTA = NULL;
            SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :CTAIVA INTO :CUENTA, :TIPOCUEN;
            if (CUENTA IS NULL) then
                begin
                INSERT INTO  ERRORES (ERRO_ITEM, ERRO_TIPODOC, ERRO_IDDOC, ERRO_CODIGO, ERRO_CANT, ERRO_CADENA)
                    VALUES(GEN_ID(id_errores, 1), 51, :IDDOC, 'CUENTA NO EXISTE', 0, :CTAIVA);
                CUENTA = CTAIVA;
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'I') then
                BEGIN
                INSERT INTO  ERRORES (ERRO_ITEM, ERRO_TIPODOC, ERRO_IDDOC, ERRO_CODIGO, ERRO_CANT, ERRO_CADENA)
                    VALUES(GEN_ID(id_errores, 1), 51, :IDDOC, 'CUENTA DE INVENTARIO', 0, :CUENTA);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_SUBC, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON, CNDE_PREF, CNDE_FOLIOE)
                    VALUES (:IDC, :NROI, :CTAIVA, :CONC, '', :VRIVA, 0, (:base1+:base2), :porc, :NIT, :PROY, :CENTRO, :SUBCENT, :NUMERO, NULL, :VENCE, NULL, 0, 51, :PREFE, :NUME);
                NROI = NROI + 1;
                SUMA = SUMA + VRIVA;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_SUBC, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON, CNDE_PREF, CNDE_FOLIOE)
                    VALUES (:IDC, :NROI, :CTAIVA, :CONC, '', :VRIVA, 0, (:base1+:base2), :porc, :NIT, :PROY, :CENTRO, :SUBCENT, NULL, NULL, NULL, NULL, 0, 0, :PREFE, :NUME);
                NROI = NROI + 1;
                SUMA = SUMA + VRIVA;
                END
            END /* VRIVA <> 0 */
        END /* IVA EN CTA CONSTANTE */
        
    /* RETENCION FUENTE */
    if ((RTFTE = 'T') or (RTFTE = 'K')) then
      if (VRRTFTE <> 0) then
        BEGIN
        if (RTFTE = 'T') then
            CTARTFTE = TCTARTFTE;
            
        CUENTA = NULL;
        SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
            WHERE CUEN_COD = :CTARTFTE INTO :CUENTA, :TIPOCUEN;
        if (CUENTA IS NULL) then
            begin
            INSERT INTO  ERRORES (ERRO_ITEM, ERRO_TIPODOC, ERRO_IDDOC, ERRO_CODIGO, ERRO_CANT, ERRO_CADENA)
                VALUES(GEN_ID(id_errores, 1), 51, :IDDOC, 'CUENTA NO EXISTE', 0, :CTARTFTE);
            CUENTA = CTARTFTE;
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            INSERT INTO  ERRORES (ERRO_ITEM, ERRO_TIPODOC, ERRO_IDDOC, ERRO_CODIGO, ERRO_CANT, ERRO_CADENA)
                    VALUES(GEN_ID(id_errores, 1), 51, :IDDOC, 'CUENTA DE INVENTARIO', 0, :CUENTA);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'C') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_SUBC, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON, CNDE_PREF, CNDE_FOLIOE)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTFTE, (:VRSUBT*-1), :PRTFTE, :NIT, :PROY, :CENTRO, :SUBCENT, :NUMERO, NULL, :VENCE, NULL, 0, 51, :PREFE, :NUME);
            NROI = NROI + 1;
            SUMA = SUMA - VRRTFTE;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_SUBC, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON, CNDE_PREF, CNDE_FOLIOE)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTFTE, (:VRSUBT*-1), :PRTFTE, :NIT, :PROY, :CENTRO, :SUBCENT, NULL, NULL, NULL, NULL, 0, 0, :PREFE, :NUME);
            NROI = NROI + 1;
            SUMA = SUMA - VRRTFTE;
            END
        END /* RTFTE */
        
    /* RETENCION IVA */
    if ((RTIVA = 'T') or (RTIVA = 'K')) then
      if (VRRTIVA <> 0) then
        BEGIN
        if (RTIVA = 'T') then
            CTARTIVA = TCTARTIVA;
            
        CUENTA = NULL;
        SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
            WHERE CUEN_COD = :CTARTIVA INTO :CUENTA, :TIPOCUEN;
        if (CUENTA IS NULL) then
            begin
            INSERT INTO  ERRORES (ERRO_ITEM, ERRO_TIPODOC, ERRO_IDDOC, ERRO_CODIGO, ERRO_CANT, ERRO_CADENA)
                VALUES(GEN_ID(id_errores, 1), 51, :IDDOC, 'CUENTA NO EXISTE', 0, :CTARTIVA);
            CUENTA = CTARTIVA;
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            INSERT INTO  ERRORES (ERRO_ITEM, ERRO_TIPODOC, ERRO_IDDOC, ERRO_CODIGO, ERRO_CANT, ERRO_CADENA)
                VALUES(GEN_ID(id_errores, 1), 51, :IDDOC, 'CUENTA DE INVENTARIO', 0, :CUENTA);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'C') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_SUBC, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON, CNDE_PREF, CNDE_FOLIOE)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTIVA, (:VRIVA*-1), :prtiva, :NIT, :PROY, :CENTRO, :SUBCENT, :NUMERO, NULL, :VENCE, NULL, 0, 51, :PREFE, :NUME);
            NROI = NROI + 1;
            SUMA = SUMA - VRRTIVA;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_SUBC, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON, CNDE_PREF, CNDE_FOLIOE)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTIVA, (:VRIVA*-1), :prtiva, :NIT, :PROY, :CENTRO, :SUBCENT, NULL, NULL, NULL, NULL, 0, 0, :PREFE, :NUME);
            NROI = NROI + 1;
            SUMA = SUMA - VRRTIVA;
            END
        END /* RTIVA */
        
    /* RETENCION DE ICA */
    if ((RTICA = 'T') or (RTICA = 'K')) then
      if (VRRTICA <> 0) then
        BEGIN
        if (RTICA = 'T') then
            CTARTICA = TCTARTICA;
            
        CUENTA = NULL;
        SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
            WHERE CUEN_COD = :CTARTICA INTO :CUENTA, :TIPOCUEN;
        if (CUENTA IS NULL) then
            begin
            INSERT INTO  ERRORES (ERRO_ITEM, ERRO_TIPODOC, ERRO_IDDOC, ERRO_CODIGO, ERRO_CANT, ERRO_CADENA)
                    VALUES(GEN_ID(id_errores, 1), 51, :IDDOC, 'CUENTA NO EXISTE', 0, :CTARTICA);
            CUENTA = CTARTICA;
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            INSERT INTO  ERRORES (ERRO_ITEM, ERRO_TIPODOC, ERRO_IDDOC, ERRO_CODIGO, ERRO_CANT, ERRO_CADENA)
                VALUES(GEN_ID(id_errores, 1), 51, :IDDOC, 'CUENTA DE INVENTARIO', 0, :CUENTA);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'C') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_SUBC, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON, CNDE_PREF, CNDE_FOLIOE)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTICA, (:VRSUBT*-1), :PRTICA, :NIT, :PROY, :CENTRO, :SUBCENT, :NUMERO, NULL, :VENCE, NULL, 0, 51, :PREFE, :NUME);
            NROI = NROI + 1;
            SUMA = SUMA - VRRTICA;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_SUBC, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON, CNDE_PREF, CNDE_FOLIOE)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTICA, (:VRSUBT*-1), :PRTICA, :NIT, :PROY, :CENTRO, :SUBCENT, NULL, NULL, NULL, NULL, 0, 0, :PREFE, :NUME);
            NROI = NROI + 1;
            SUMA = SUMA - VRRTICA;
            END
        END /* RTICA */
    /* RETENCION CREE */
    if ((rtcree = 'T') or (rtcree = 'K')) then
      if (vrrtcree <> 0) then
        BEGIN
        if (rtcree = 'T') then
            ctartcree = tctartcree;
            
        CUENTA = NULL;
        SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
            WHERE CUEN_COD = :ctartcree INTO :CUENTA, :TIPOCUEN;
        if (CUENTA IS NULL) then
            begin
            INSERT INTO  ERRORES (ERRO_ITEM, ERRO_TIPODOC, ERRO_IDDOC, ERRO_CODIGO, ERRO_CANT, ERRO_CADENA)
                    VALUES(GEN_ID(id_errores, 1), 51, :IDDOC, 'CUENTA NO EXISTE', 0, :ctartcree);
            CUENTA = CTARTICA;
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            INSERT INTO  ERRORES (ERRO_ITEM, ERRO_TIPODOC, ERRO_IDDOC, ERRO_CODIGO, ERRO_CANT, ERRO_CADENA)
                VALUES(GEN_ID(id_errores, 1), 51, :IDDOC, 'CUENTA DE INVENTARIO', 0, :CUENTA);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'C') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON, CNDE_PREF, CNDE_FOLIOE)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :vrrtcree, (:VRSUBT*-1), :prtcree, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 51, :PREFE, :NUME);
            NROI = NROI + 1;
            SUMA = SUMA - vrrtcree;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON, CNDE_PREF, CNDE_FOLIOE)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :vrrtcree, (:VRSUBT*-1), :prtcree, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0, :PREFE, :NUME);
            NROI = NROI + 1;
            SUMA = SUMA - vrrtcree;
            END
        END /* RTCREE */
    /* recorra las cuentas adicionales */
    FOR SELECT INPC_CUENTA, INPC_BASE, INPC_PORC, INPC_VALOR, INPC_DB
        FROM INTERFAZ_CXPAGAR_CTAS
        WHERE INCP_ID = :IDINTER
        INTO :CUENTAADIC, :BASEADIC, :PORCADIC, :VALORADIC, :DBADIC
        DO
        BEGIN
        if (:BASEADIC = 'SUBTOTAL') then
            VALORADIC = VRTOTAL - VRIVA;
        if (:BASEADIC = 'IVA') then
            VALORADIC = VRIVA;
        if (:BASEADIC = 'TOTAL') then
            VALORADIC = VRTOTAL;
        MONTO = VALORADIC * PORCADIC;
        
        /* TRAIGA LAS CARACTERISTICAS DE LA CUENTA */
        CUENTA = NULL;
        SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
            WHERE CUEN_COD = :CUENTAADIC INTO :CUENTA, :TIPOCUEN;
        IF (CUENTA IS NULL) THEN
            begin
            INSERT INTO  ERRORES (ERRO_ITEM, ERRO_TIPODOC, ERRO_IDDOC, ERRO_CODIGO, ERRO_CANT, ERRO_CADENA)
                    VALUES(GEN_ID(id_errores, 1), 51, :IDDOC, 'CUENTA NO EXISTE', 0, :CUENTAADIC);
            CUENTA = CUENTAADIC;
            ERROR = ERROR + 1;
            end
        /* DEPENDE DEL TIPO DE CUENTA */
        if (TIPOCUEN = 'I') then
            BEGIN
            INSERT INTO  ERRORES (ERRO_ITEM, ERRO_TIPODOC, ERRO_IDDOC, ERRO_CODIGO, ERRO_CANT, ERRO_CADENA)
                VALUES(GEN_ID(id_errores, 1), 51, :IDDOC, 'CUENTA DE INVENTARIO', 0, :CUENTA);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'C') then
            BEGIN
            if (DBADIC = 'S') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_SUBC, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON, CNDE_PREF, CNDE_FOLIOE)
                    VALUES (:IDC, :NROI, :CUENTAADIC, :CONC, '', :MONTO, 0, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, :SUBCENT, :NUMERO, NULL, :FECHA, NULL, 0, 51, :PREFE, :NUME);
                SUMA = SUMA + MONTO;
                END
            ELSE
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_SUBC, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON, CNDE_PREF, CNDE_FOLIOE)
                    VALUES (:IDC, :NROI, :CUENTAADIC, :CONC, '', 0, :MONTO, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, :SUBCENT, :NUMERO, NULL, :FECHA, NULL, 0, 51, :PREFE, :NUME);
                SUMA = SUMA - MONTO;
                END
            NROI = NROI + 1;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            if (DBADIC = 'S') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_SUBC, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON, CNDE_PREF, CNDE_FOLIOE)
                    VALUES (:IDC, :NROI, :CUENTAADIC, :CONC, '', :MONTO, 0, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, :SUBCENT, NULL, NULL, NULL, NULL, 0, 0, :PREFE, :NUME);
                SUMA = SUMA + MONTO;
                END
            ELSE
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_SUBC, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON, CNDE_PREF, CNDE_FOLIOE)
                    VALUES (:IDC, :NROI, :CUENTAADIC, :CONC, '', 0, :MONTO, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, :SUBCENT, NULL, NULL, NULL, NULL, 0, 0, :PREFE, :NUME);
                SUMA = SUMA - MONTO;
                END
            NROI = NROI + 1;
            END
        
        NROI = NROI + 1;
        END
        
    /* CIERRE EL COMPROBANTE CONTRA LA CUENTA DEL TERCERO O LA CONSTANTE */
    if ((SUMA <> 0) and ((CLIE = 'T') or (CLIE = 'K'))) then
        BEGIN
        if (SUMA < 0) then
            BEGIN
            DEBITO = SUMA * -1;
            CREDITO = 0;
            END
        ELSE
            BEGIN
            DEBITO = 0;
            CREDITO = SUMA;
            END
        if (CLIE = 'T') then
            CTACLIE = TCTACLIEN;

        CUENTA = NULL;
        SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
            WHERE CUEN_COD = :CTACLIE INTO :CUENTA, :TIPOCUEN;
        IF (CUENTA IS NULL) then
            begin
            INSERT INTO  ERRORES (ERRO_ITEM, ERRO_TIPODOC, ERRO_IDDOC, ERRO_CODIGO, ERRO_CANT, ERRO_CADENA)
                VALUES(GEN_ID(id_errores, 1), 51, :IDDOC, 'CUENTA NO EXISTE', 0, :CTACLIE);
            CUENTA = CTACLIE;
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            INSERT INTO  ERRORES (ERRO_ITEM, ERRO_TIPODOC, ERRO_IDDOC, ERRO_CODIGO, ERRO_CANT, ERRO_CADENA)
                VALUES(GEN_ID(id_errores, 1), 51, :IDDOC, 'CUENTA DE INVENTARIO', 0, :CUENTA);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'C') then
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_SUBC, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON, CNDE_PREF, CNDE_FOLIOE)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :DEBITO, :CREDITO, 0, 0, :NIT, :PROY, :CENTRO, :SUBCENT, :NUMERO, NULL, :VENCE, NULL, 0, 51, :PREFE, :NUME);
        if (TIPOCUEN = 'N') then
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_SUBC, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON, CNDE_PREF, CNDE_FOLIOE)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :DEBITO, :CREDITO, 0, 0, :NIT, :PROY, :CENTRO, :SUBCENT, NULL, NULL, NULL, NULL, 0, 0, :PREFE, :NUME);
        NROI = NROI + 1;
        END /* SUMA EN CARTERA */
    if (ERROR > 0) then
        VER = 'S';
    SUSPEND;
    END /* ANULADO */
  END /* EXISTE LA INTERFAZ */
ELSE
    BEGIN
    INSERT INTO  ERRORES (ERRO_ITEM, ERRO_TIPODOC, ERRO_IDDOC, ERRO_CODIGO, ERRO_CANT, ERRO_CADENA)
        VALUES(GEN_ID(id_errores, 1), 51, :IDDOC, 'INTERFAZ NO EXISTE', 0, :pref);
    ERROR = ERROR + 1;
    VER = 'S';
    SUSPEND;
    END
END^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE NOTADBPR_SIN_CONTABILIDAD(
    FECINI DATE,
    FECFIN DATE)
RETURNS (
    ID INTEGER,
    IDI INTEGER,
    IDC INTEGER,
    PREF VARCHAR(4),
    NUMERO VARCHAR(6),
    ESTADO VARCHAR(20),
    ERROR INTEGER)
AS
DECLARE VARIABLE VER CHAR(2);
declare variable FECICNT VARCHAR(10);
declare variable FECFCNT VARCHAR(10);
declare variable idref INTEGER;
BEGIN
EXECUTE PROCEDURE fecha_a_conta(FECINI) returning_values (FECICNT);
EXECUTE PROCEDURE fecha_a_conta(FECFIN) returning_values (FECFCNT);
FOR SELECT NDPR_ID, PREF_PRE, NDPR_NUMERO FROM NOTAS_DEBITO_PROVEEDOR WHERE NDPR_ANULADO = 'N' AND
    NDPR_FECHA >= :FECINI AND NDPR_FECHA <= :FECFIN
    ORDER BY NDPR_ID INTO :ID, :PREF, :NUMERO
DO
  BEGIN
  idref = null;
  SELECT ENCO_IDREF FROM COMPROBANTE_ENCABEZADO WHERE ENCO_TIPOREF = 51 AND ENCO_FECHA >= :FECICNT AND ENCO_FECHA <= :FECFCNT and ENCO_IDREF = :id into :idref;
  if (idref IS NULL) then
  begin
  ESTADO = 'PROCESANDO';
  SUSPEND;
  SELECT MAX(INCA_ID) FROM INTERFAZ_CARTERA WHERE PREF_PRE = :PREF AND TIDO_COD = 51 INTO :IDI;
  if (IDI IS NOT NULL) then
    BEGIN
    EXECUTE PROCEDURE CONTABIL_NOTADBPR (:ID, :IDI) RETURNING_VALUES (:ERROR, :VER, :IDC);
    if (ERROR = 0) then
      BEGIN
      EXECUTE PROCEDURE CONTABILIZA_PENDIENTE (:IDC);
      ESTADO = 'OK';
      END
    ELSE
      ESTADO = 'ERROR';
    suspend;
    END
  end
  END
END^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER procedure CONTABIL_NOTADBPR_NIIF (
    IDDOC integer,
    IDINTER integer,
    IDC integer)
returns (
    ERROR integer,
    VER char(1))
as
declare variable PREF VARCHAR(4);
declare variable NUM VARCHAR(6);
declare variable NUMERO VARCHAR(10);
declare variable FECAUX DATE;
declare variable FECHA CHAR(8);
declare variable CONC CHAR(120);
declare variable VENCEAUX DATE;
declare variable VENCE CHAR(8);
declare variable VRSUBT NUMERIC(18, 2);
declare variable BASE0 NUMERIC(18, 2);
declare variable BASE1 NUMERIC(18, 2);
declare variable BASE2 NUMERIC(18, 2);
declare variable VRIVA NUMERIC(18, 2);
declare variable IVA1 NUMERIC(18, 2);
declare variable IVA2 NUMERIC(18, 2);
declare variable PRTFTE NUMERIC(9, 2);
declare variable VRRTFTE NUMERIC(18, 2);
declare variable PRTIVA NUMERIC(9, 2);
declare variable VRRTIVA NUMERIC(18, 2);
declare variable PRTICA NUMERIC(9, 2);
declare variable VRRTICA NUMERIC(18, 2);
declare variable PRTCREE NUMERIC(9, 2);
declare variable VRRTCREE NUMERIC(18, 2);
declare variable VRTOTAL NUMERIC(18, 2);
declare variable BASE CHAR(1);
declare variable CTABASE VARCHAR(20);
declare variable IVA CHAR(1);
declare variable CTAIVA VARCHAR(20);
declare variable CLIE CHAR(1);
declare variable CTACLIE VARCHAR(20);
declare variable RTFTE CHAR(1);
declare variable CTARTFTE VARCHAR(20);
declare variable RTIVA CHAR(1);
declare variable CTARTIVA VARCHAR(20);
declare variable RTICA CHAR(1);
declare variable CTARTICA VARCHAR(20);
declare variable RTCREE CHAR(1);
declare variable CTARTCREE VARCHAR(20);
declare variable EXISTE CHAR(1);
declare variable CUENTA VARCHAR(20);
declare variable MONTO NUMERIC(18,2);
declare variable ES_RETENCION CHAR(1);
declare variable TIPOCUEN CHAR(1);
declare variable NIT VARCHAR(20);
declare variable PROY VARCHAR(4);
declare variable CENTRO VARCHAR(4);
declare variable SUBCENT VARCHAR(4);
declare variable MONTOBASE NUMERIC(18,2);
declare variable PORC NUMERIC(5,2);
declare variable DEBITO NUMERIC(18,2);
declare variable CREDITO NUMERIC(18,2);
declare variable NROI INTEGER;
declare variable SUMA NUMERIC(18,2);
declare variable TCTACLIEN VARCHAR(20);
declare variable TCTABASE VARCHAR(20);
declare variable TCTARTFTE VARCHAR(20);
declare variable TCTARTIVA VARCHAR(20);
declare variable TCTARTICA VARCHAR(20);
declare variable TCTARTCREE VARCHAR(20);
declare variable CUENTAADIC VARCHAR(20);
declare variable BASEADIC VARCHAR(20);
declare variable PORCADIC NUMERIC(5,2);
declare variable VALORADIC NUMERIC(18,2);
declare variable DBADIC CHAR(1);
declare variable NPROY VARCHAR(4);
declare variable NCENTRO VARCHAR(4);
declare variable NSUBC VARCHAR(4);
declare variable ANULADO CHAR(1);
declare variable TARIFA INTEGER;
declare variable AUTORIZA VARCHAR(30);
declare variable NUMPROV VARCHAR(20);
declare variable PREFE VARCHAR(4);
declare variable NUME INTEGER;
BEGIN
ERROR = 0;
/* BUSQUE LA INTERFACE */
EXISTE = 'N';
SELECT 'S', N.INCP_BASE, N.INCP_IVA, N.INCP_RTFTE, N.INCP_RTIVA, N.INCP_RTICA, N.INCP_RTCREE, N.INCP_PROV, N.INCP_CTABASE, N.INCP_CTAIVA,
    N.INCP_CTARTFTE, N.INCP_CTARTIVA, N.INCP_CTARTICA, N.INCP_CTARTCREE, N.INCP_CTAPROV, INCP_CONFIRMAR
    FROM INTERFAZ_CXPAGAR I, interfaz_cxpagar_niif N
    WHERE I.INCP_ID = :IDINTER AND I.incp_id = N.incp_id
    INTO :EXISTE, :BASE, :IVA, :RTFTE, :RTIVA, :RTICA, :RTCREE, :CLIE, :CTABASE, :CTAIVA,
    :CTARTFTE, :CTARTIVA, :CTARTICA, :CTARTCREE, :CTACLIE, :VER;

if (EXISTE = 'S') then
  BEGIN
  /* TRAIGA EL ENCABEZADO DE LA NOTA */
  SELECT PREF_PRE, NDPR_NUMERO, NDPR_FECHA, NDPR_VENCE, N.TERC_NIT, NDPR_CONC, NDPR_IVAPORC, NDPR_IVAMONTO, NDPR_MONTO,
    NDPR_RTFTEPORC, NDPR_RTFTEMONTO, NDPR_RTIVAPORC, NDPR_RTIVAMONTO, NDPR_RTICAPORC, NDPR_RTICAMONTO, NDPR_RTCREE, NDPR_RTCREEM,
    TERC_CTAVENTA, TERC_CTARTFTE, TERC_CTARTIVA, TERC_CTARTICA, TERC_CTARCREE, TERC_CTACLIENTE, NDPR_PROY, NDPR_CENTRO, NDPR_SUBC,
    NDPR_ANULADO, NDPR_BASE0, NDPR_BASE1, NDPR_BASE2, NDPR_IVA1, NDPR_IVA2, IIF(NDPR_auto IS NULL, '', NDPR_AUTO), N.ndpr_numprov
        FROM NOTAS_DEBITO_PROVEEDOR N, TERCEROS T
        WHERE NDPR_ID = :IDDOC AND N.TERC_NIT = T.TERC_NIT
        INTO :PREF, :NUM, :FECAUX, :VENCEAUX, :NIT, :CONC, :PORC, :VRIVA, :VRTOTAL,
        :PRTFTE, :VRRTFTE, :PRTIVA, :VRRTIVA, :PRTICA, :VRRTICA, :PRTCREE, :VRRTCREE,
        :TCTABASE, TCTARTFTE, TCTARTIVA, TCTARTICA, TCTARTCREE, TCTACLIEN, NPROY, NCENTRO, NSUBC,
        ANULADO, :BASE0, BASE1, :BASE2, :IVA1, :IVA2, :autoriza, :NUMPROV;
  if (ANULADO = 'N') then
    BEGIN
    /* SI ES PROVEEDOR, SOBREESCIBE LAS CUENTAS  */
    SELECT PROV_CTAPAGAR, PROV_CTARTFTE, PROV_CTARTIVA, PROV_CTARTICA, PROV_CTACAUSA, PROV_CTARTCREE
        FROM PROVEEDORES WHERE TERC_NIT = :NIT
        INTO TCTACLIEN, TCTARTFTE, TCTARTIVA, TCTARTICA, TCTABASE, tctartcree;
    if (AUTORIZA <> '') then
        BEGIN
        PREFE = PREF;
        NUME = CAST(:num AS INTEGER);
        END
    ELSE
        BEGIN
        execute procedure SEPARAR_PREFIJO_NUMERO(:NUMPROV) returning_values :PREFE, :NUME;
        END
        
    /* SI EL DOCUMENTO ESPECIFICA ALGUNAS SOBRESCRIBA LAS DEL PROVEEDOR */
    SELECT NDPR_CTAPAGAR, NDPR_CTACAUSA
        FROM NOTAS_DEBITO_PROVEEDOR
        WHERE NDPR_ID = :IDDOC
        INTO :TCTACLIEN, TCTABASE;
    SELECT PREF_CENTRO, PREF_PROY, PREF_SUBC FROM PREFIJOS P, NOTAS_DEBITO_PROVEEDOR N
        WHERE P.PREF_PRE = N.PREF_PRE AND P.TIDO_COD = 51 AND N.NDPR_ID = :IDDOC INTO :CENTRO, :PROY, :subcent;
    if (NPROY <> '') then
        PROY = NPROY;
    if (NCENTRO <> '') then
        CENTRO = NCENTRO;
    if (nsubc <> '') then
        subcent = nsubc;
    NUMERO = PREF || NUM;
    VRSUBT = VRTOTAL; /* BASE DE RETEFTE Y RETEICA */

    EXECUTE PROCEDURE FECHA_A_CONTA(:FECAUX) returning_values (:FECHA);
    EXECUTE PROCEDURE FECHA_A_CONTA(:VENCEAUX) returning_values (:VENCE);
    NROI = 100000;
    SUMA = 0;
    DELETE FROM CONTABILIZACION_DET WHERE CNTB_ID = :IDC AND CNDE_ITEM >= :nroi;
    IF ((BASE = 'T') OR (BASE = 'K')) THEN
        BEGIN
        IF (BASE = 'T') THEN
            CTABASE = TCTABASE;

        if (VRSUBT <> 0) then
            BEGIN
            CUENTA = NULL;
            SELECT CUEN_COD, CUEN_TIPO, CUEN_RETENCION FROM cuentas_niif
                WHERE CUEN_COD = :CTABASE INTO :CUENTA, :TIPOCUEN, :ES_RETENCION;
            if (CUENTA IS NULL) then
                begin
                INSERT INTO  ERRORES (ERRO_ITEM, ERRO_TIPODOC, ERRO_IDDOC, ERRO_CODIGO, ERRO_CANT, ERRO_CADENA)
                    VALUES(GEN_ID(id_errores, 1), 1051, :IDDOC, 'CUENTA NO EXISTE', 0, :CTABASE);
                CUENTA = CTABASE;
                ERROR = ERROR + 1;
                end
            if (ES_RETENCION = 'S') then
                if ((prtiva <> 0) and (vriva = 0)) then
                    montobase = FLOOR(VRSUBT / prtiva);
                else
                    montobase = VRSUBT;
            else
                montobase = 0;
            if (TIPOCUEN = 'I') then
                BEGIN
                INSERT INTO  ERRORES (ERRO_ITEM, ERRO_TIPODOC, ERRO_IDDOC, ERRO_CODIGO, ERRO_CANT, ERRO_CADENA)
                    VALUES(GEN_ID(id_errores, 1), 1051, :IDDOC, 'CUENTA DE INVENTARIO', 0, :CUENTA);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_SUBC, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON, CNDE_PREF, CNDE_FOLIOE)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRSUBT, 0, :MONTOBASE, :prtiva, :NIT, :PROY, :CENTRO, :SUBCENT, :NUMERO, NULL, :VENCE, NULL, 0, 51, :PREFE, :NUME);
                NROI = NROI + 1;
                SUMA = SUMA + VRSUBT;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_SUBC, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON, CNDE_PREF, CNDE_FOLIOE)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRSUBT, 0, :MONTOBASE, :prtiva, :NIT, :PROY, :CENTRO, :SUBCENT, NULL, NULL, NULL, NULL, 0, 0, :PREFE, :NUME);
                NROI = NROI + 1;
                SUMA = SUMA + VRSUBT;
                END
            END /* MONTO <> 0 */
        END /* BASE TERCERO O CONSTANTE */
    IF ((BASE = 'I')) THEN
        BEGIN
        FOR SELECT TAIV_CTACOMP, TAIV_COD FROM TARIFA_IVA WHERE TAIV_COD <= 2 INTO :CTABASE, :tarifa
            DO
            BEGIN
            if (TARIFA = 0) then
                vrsubt = BASE0;
            if (TARIFA = 1) then
                vrsubt = BASE1;
            if (TARIFA = 2) then
                vrsubt = BASE2;
            if (VRSUBT <> 0) then
                BEGIN
                CUENTA = NULL;
                SELECT CUEN_COD, CUEN_TIPO, CUEN_RETENCION FROM cuentas_niif
                    WHERE CUEN_COD = :CTABASE INTO :CUENTA, :TIPOCUEN, :ES_RETENCION;
                if (CUENTA IS NULL) then
                    begin
                    INSERT INTO  ERRORES (ERRO_ITEM, ERRO_TIPODOC, ERRO_IDDOC, ERRO_CODIGO, ERRO_CANT, ERRO_CADENA)
                        VALUES(GEN_ID(id_errores, 1), 1051, :IDDOC, 'CUENTA NO EXISTE', 0, :CTABASE);
                    CUENTA = CTABASE;
                    ERROR = ERROR + 1;
                    end
                montobase = 0;
                if (TIPOCUEN = 'I') then
                    BEGIN
                    INSERT INTO  ERRORES (ERRO_ITEM, ERRO_TIPODOC, ERRO_IDDOC, ERRO_CODIGO, ERRO_CANT, ERRO_CADENA)
                        VALUES(GEN_ID(id_errores, 1), 1051, :IDDOC, 'CUENTA DE INVENTARIO', 0, :CUENTA);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_SUBC, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON, CNDE_PREF, CNDE_FOLIOE)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRSUBT, 0, :MONTOBASE, :prtiva, :NIT, :PROY, :CENTRO, :SUBCENT, :NUMERO, NULL, :VENCE, NULL, 0, 51, :PREFE, :NUME);
                    NROI = NROI + 1;
                    SUMA = SUMA + VRSUBT;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_SUBC, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON, CNDE_PREF, CNDE_FOLIOE)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRSUBT, 0, :MONTOBASE, :prtiva, :NIT, :PROY, :CENTRO, :SUBCENT, NULL, NULL, NULL, NULL, 0, 0, :PREFE, :NUME);
                    NROI = NROI + 1;
                    SUMA = SUMA + VRSUBT;
                    END
                END /* MONTO <> 0 */
            END
        END /* BASE TARIFA DE IVA */

    if (IVA = 'I') then /* IVA POR TARIFA */
        BEGIN
        FOR SELECT TAIV_CTAIVACMP, TAIV_COD, TAIV_PORC FROM TARIFA_IVA WHERE (TAIV_COD <> 0) AND (TAIV_COD <= 2) INTO :CTAIVA, :tarifa, :PORC
            DO
            BEGIN
            if (TARIFA = 1) then
                BEGIN
                vrsubt = BASE1;
                VRIVA = IVA1;
                END
            if (TARIFA = 2) then
                BEGIN
                VRIVA = IVA2;
                vrsubt = BASE2;
                END
            if (VRIVA <> 0) then
                BEGIN
                CUENTA = NULL;
                SELECT CUEN_COD, CUEN_TIPO FROM cuentas_niif
                    WHERE CUEN_COD = :CTAIVA INTO :CUENTA, :TIPOCUEN;
                if (CUENTA IS NULL) then
                    begin
                    INSERT INTO  ERRORES (ERRO_ITEM, ERRO_TIPODOC, ERRO_IDDOC, ERRO_CODIGO, ERRO_CANT, ERRO_CADENA)
                        VALUES(GEN_ID(id_errores, 1), 1051, :IDDOC, 'CUENTA NO EXISTE', 0, :CTAIVA);
                    CUENTA = CTAIVA;
                    ERROR = ERROR + 1;
                    end
                if (TIPOCUEN = 'I') then
                    BEGIN
                    INSERT INTO  ERRORES (ERRO_ITEM, ERRO_TIPODOC, ERRO_IDDOC, ERRO_CODIGO, ERRO_CANT, ERRO_CADENA)
                        VALUES(GEN_ID(id_errores, 1), 1051, :IDDOC, 'CUENTA DE INVENTARIO', 0, :CUENTA);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_SUBC, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON, CNDE_PREF, CNDE_FOLIOE)
                        VALUES (:IDC, :NROI, :CTAIVA, :CONC, '', :VRIVA, 0, :vrsubt, :porc, :NIT, :PROY, :CENTRO, :SUBCENT, :NUMERO, NULL, :VENCE, NULL, 0, 51, :PREFE, :NUME);
                    NROI = NROI + 1;
                    SUMA = SUMA + VRIVA;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_SUBC, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON, CNDE_PREF, CNDE_FOLIOE)
                        VALUES (:IDC, :NROI, :CTAIVA, :CONC, '', :VRIVA, 0, :vrsubt, :porc, :NIT, :PROY, :CENTRO, :SUBCENT, NULL, NULL, NULL, NULL, 0, 0, :PREFE, :NUME);
                    NROI = NROI + 1;
                    SUMA = SUMA + VRIVA;
                    END
                END /* VRIVA <> 0 */
            end /* FOR */
        END /* IVA EN CTA CONSTANTE */
        
    VRSUBT = VRTOTAL; /* BASE DE RETEFTE Y RETEICA */
    if (IVA = 'K') then /* IVA EN CTA CONSTANTE */
        BEGIN
        if (VRIVA <> 0) then
            BEGIN
            /* si no discrimino tarifas, asuma el subtotal como base del iva */
            if ((base1 = 0) and (base2 = 0)) then
                base1 = vrsubt;
            CUENTA = NULL;
            SELECT CUEN_COD, CUEN_TIPO FROM cuentas_niif
                WHERE CUEN_COD = :CTAIVA INTO :CUENTA, :TIPOCUEN;
            if (CUENTA IS NULL) then
                begin
                INSERT INTO  ERRORES (ERRO_ITEM, ERRO_TIPODOC, ERRO_IDDOC, ERRO_CODIGO, ERRO_CANT, ERRO_CADENA)
                    VALUES(GEN_ID(id_errores, 1), 1051, :IDDOC, 'CUENTA NO EXISTE', 0, :CTAIVA);
                CUENTA = CTAIVA;
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'I') then
                BEGIN
                INSERT INTO  ERRORES (ERRO_ITEM, ERRO_TIPODOC, ERRO_IDDOC, ERRO_CODIGO, ERRO_CANT, ERRO_CADENA)
                    VALUES(GEN_ID(id_errores, 1), 1051, :IDDOC, 'CUENTA DE INVENTARIO', 0, :CUENTA);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_SUBC, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON, CNDE_PREF, CNDE_FOLIOE)
                    VALUES (:IDC, :NROI, :CTAIVA, :CONC, '', :VRIVA, 0, (:base1+:base2), :porc, :NIT, :PROY, :CENTRO, :SUBCENT, :NUMERO, NULL, :VENCE, NULL, 0, 51, :PREFE, :NUME);
                NROI = NROI + 1;
                SUMA = SUMA + VRIVA;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_SUBC, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON, CNDE_PREF, CNDE_FOLIOE)
                    VALUES (:IDC, :NROI, :CTAIVA, :CONC, '', :VRIVA, 0, (:base1+:base2), :porc, :NIT, :PROY, :CENTRO, :SUBCENT, NULL, NULL, NULL, NULL, 0, 0, :PREFE, :NUME);
                NROI = NROI + 1;
                SUMA = SUMA + VRIVA;
                END
            END /* VRIVA <> 0 */
        END /* IVA EN CTA CONSTANTE */
        
    /* RETENCION FUENTE */
    if ((RTFTE = 'T') or (RTFTE = 'K')) then
      if (VRRTFTE <> 0) then
        BEGIN
        if (RTFTE = 'T') then
            CTARTFTE = TCTARTFTE;
            
        CUENTA = NULL;
        SELECT CUEN_COD, CUEN_TIPO FROM cuentas_niif
            WHERE CUEN_COD = :CTARTFTE INTO :CUENTA, :TIPOCUEN;
        if (CUENTA IS NULL) then
            begin
            INSERT INTO  ERRORES (ERRO_ITEM, ERRO_TIPODOC, ERRO_IDDOC, ERRO_CODIGO, ERRO_CANT, ERRO_CADENA)
                VALUES(GEN_ID(id_errores, 1), 1051, :IDDOC, 'CUENTA NO EXISTE', 0, :CTARTFTE);
            CUENTA = CTARTFTE;
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            INSERT INTO  ERRORES (ERRO_ITEM, ERRO_TIPODOC, ERRO_IDDOC, ERRO_CODIGO, ERRO_CANT, ERRO_CADENA)
                    VALUES(GEN_ID(id_errores, 1), 1051, :IDDOC, 'CUENTA DE INVENTARIO', 0, :CUENTA);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'C') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_SUBC, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON, CNDE_PREF, CNDE_FOLIOE)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTFTE, (:VRSUBT*-1), :PRTFTE, :NIT, :PROY, :CENTRO, :SUBCENT, :NUMERO, NULL, :VENCE, NULL, 0, 51, :PREFE, :NUME);
            NROI = NROI + 1;
            SUMA = SUMA - VRRTFTE;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_SUBC, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON, CNDE_PREF, CNDE_FOLIOE)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTFTE, (:VRSUBT*-1), :PRTFTE, :NIT, :PROY, :CENTRO, :SUBCENT, NULL, NULL, NULL, NULL, 0, 0, :PREFE, :NUME);
            NROI = NROI + 1;
            SUMA = SUMA - VRRTFTE;
            END
        END /* RTFTE */
        
    /* RETENCION IVA */
    if ((RTIVA = 'T') or (RTIVA = 'K')) then
      if (VRRTIVA <> 0) then
        BEGIN
        if (RTIVA = 'T') then
            CTARTIVA = TCTARTIVA;
            
        CUENTA = NULL;
        SELECT CUEN_COD, CUEN_TIPO FROM cuentas_niif
            WHERE CUEN_COD = :CTARTIVA INTO :CUENTA, :TIPOCUEN;
        if (CUENTA IS NULL) then
            begin
            INSERT INTO  ERRORES (ERRO_ITEM, ERRO_TIPODOC, ERRO_IDDOC, ERRO_CODIGO, ERRO_CANT, ERRO_CADENA)
                VALUES(GEN_ID(id_errores, 1), 1051, :IDDOC, 'CUENTA NO EXISTE', 0, :CTARTIVA);
            CUENTA = CTARTIVA;
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            INSERT INTO  ERRORES (ERRO_ITEM, ERRO_TIPODOC, ERRO_IDDOC, ERRO_CODIGO, ERRO_CANT, ERRO_CADENA)
                VALUES(GEN_ID(id_errores, 1), 1051, :IDDOC, 'CUENTA DE INVENTARIO', 0, :CUENTA);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'C') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_SUBC, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON, CNDE_PREF, CNDE_FOLIOE)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTIVA, (:VRIVA*-1), :prtiva, :NIT, :PROY, :CENTRO, :SUBCENT, :NUMERO, NULL, :VENCE, NULL, 0, 51, :PREFE, :NUME);
            NROI = NROI + 1;
            SUMA = SUMA - VRRTIVA;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_SUBC, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON, CNDE_PREF, CNDE_FOLIOE)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTIVA, (:VRIVA*-1), :prtiva, :NIT, :PROY, :CENTRO, :SUBCENT, NULL, NULL, NULL, NULL, 0, 0, :PREFE, :NUME);
            NROI = NROI + 1;
            SUMA = SUMA - VRRTIVA;
            END
        END /* RTIVA */
        
    /* RETENCION DE ICA */
    if ((RTICA = 'T') or (RTICA = 'K')) then
      if (VRRTICA <> 0) then
        BEGIN
        if (RTICA = 'T') then
            CTARTICA = TCTARTICA;
            
        CUENTA = NULL;
        SELECT CUEN_COD, CUEN_TIPO FROM cuentas_niif
            WHERE CUEN_COD = :CTARTICA INTO :CUENTA, :TIPOCUEN;
        if (CUENTA IS NULL) then
            begin
            INSERT INTO  ERRORES (ERRO_ITEM, ERRO_TIPODOC, ERRO_IDDOC, ERRO_CODIGO, ERRO_CANT, ERRO_CADENA)
                    VALUES(GEN_ID(id_errores, 1), 1051, :IDDOC, 'CUENTA NO EXISTE', 0, :CTARTICA);
            CUENTA = CTARTICA;
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            INSERT INTO  ERRORES (ERRO_ITEM, ERRO_TIPODOC, ERRO_IDDOC, ERRO_CODIGO, ERRO_CANT, ERRO_CADENA)
                VALUES(GEN_ID(id_errores, 1), 1051, :IDDOC, 'CUENTA DE INVENTARIO', 0, :CUENTA);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'C') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_SUBC, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON, CNDE_PREF, CNDE_FOLIOE)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTICA, (:VRSUBT*-1), :PRTICA, :NIT, :PROY, :CENTRO, :SUBCENT, :NUMERO, NULL, :VENCE, NULL, 0, 51, :PREFE, :NUME);
            NROI = NROI + 1;
            SUMA = SUMA - VRRTICA;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_SUBC, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON, CNDE_PREF, CNDE_FOLIOE)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTICA, (:VRSUBT*-1), :PRTICA, :NIT, :PROY, :CENTRO, :SUBCENT, NULL, NULL, NULL, NULL, 0, 0, :PREFE, :NUME);
            NROI = NROI + 1;
            SUMA = SUMA - VRRTICA;
            END
        END /* RTICA */
    /* RETENCION CREE */
    if ((rtcree = 'T') or (rtcree = 'K')) then
      if (vrrtcree <> 0) then
        BEGIN
        if (rtcree = 'T') then
            ctartcree = tctartcree;
            
        CUENTA = NULL;
        SELECT CUEN_COD, CUEN_TIPO FROM cuentas_niif
            WHERE CUEN_COD = :ctartcree INTO :CUENTA, :TIPOCUEN;
        if (CUENTA IS NULL) then
            begin
            INSERT INTO  ERRORES (ERRO_ITEM, ERRO_TIPODOC, ERRO_IDDOC, ERRO_CODIGO, ERRO_CANT, ERRO_CADENA)
                    VALUES(GEN_ID(id_errores, 1), 1051, :IDDOC, 'CUENTA NO EXISTE', 0, :ctartcree);
            CUENTA = CTARTICA;
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            INSERT INTO  ERRORES (ERRO_ITEM, ERRO_TIPODOC, ERRO_IDDOC, ERRO_CODIGO, ERRO_CANT, ERRO_CADENA)
                VALUES(GEN_ID(id_errores, 1), 1051, :IDDOC, 'CUENTA DE INVENTARIO', 0, :CUENTA);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'C') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON, CNDE_PREF, CNDE_FOLIOE)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :vrrtcree, (:VRSUBT*-1), :prtcree, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 51, :PREFE, :NUME);
            NROI = NROI + 1;
            SUMA = SUMA - vrrtcree;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON, CNDE_PREF, CNDE_FOLIOE)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :vrrtcree, (:VRSUBT*-1), :prtcree, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0, :PREFE, :NUME);
            NROI = NROI + 1;
            SUMA = SUMA - vrrtcree;
            END
        END /* RTCREE */
    /* recorra las cuentas adicionales */
    FOR SELECT INPC_CUENTA, INPC_BASE, INPC_PORC, INPC_VALOR, INPC_DB
        FROM INTERFAZ_CXPAGAR_CTAS
        WHERE INCP_ID = :IDINTER
        INTO :CUENTAADIC, :BASEADIC, :PORCADIC, :VALORADIC, :DBADIC
        DO
        BEGIN
        if (:BASEADIC = 'SUBTOTAL') then
            VALORADIC = VRTOTAL - VRIVA;
        if (:BASEADIC = 'IVA') then
            VALORADIC = VRIVA;
        if (:BASEADIC = 'TOTAL') then
            VALORADIC = VRTOTAL;
        MONTO = VALORADIC * PORCADIC;
        
        /* TRAIGA LAS CARACTERISTICAS DE LA CUENTA */
        CUENTA = NULL;
        SELECT CUEN_COD, CUEN_TIPO FROM cuentas_niif
            WHERE CUEN_COD = :CUENTAADIC INTO :CUENTA, :TIPOCUEN;
        IF (CUENTA IS NULL) THEN
            begin
            INSERT INTO  ERRORES (ERRO_ITEM, ERRO_TIPODOC, ERRO_IDDOC, ERRO_CODIGO, ERRO_CANT, ERRO_CADENA)
                    VALUES(GEN_ID(id_errores, 1), 1051, :IDDOC, 'CUENTA NO EXISTE', 0, :CUENTAADIC);
            CUENTA = CUENTAADIC;
            ERROR = ERROR + 1;
            end
        /* DEPENDE DEL TIPO DE CUENTA */
        if (TIPOCUEN = 'I') then
            BEGIN
            INSERT INTO  ERRORES (ERRO_ITEM, ERRO_TIPODOC, ERRO_IDDOC, ERRO_CODIGO, ERRO_CANT, ERRO_CADENA)
                VALUES(GEN_ID(id_errores, 1), 1051, :IDDOC, 'CUENTA DE INVENTARIO', 0, :CUENTA);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'C') then
            BEGIN
            if (DBADIC = 'S') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_SUBC, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON, CNDE_PREF, CNDE_FOLIOE)
                    VALUES (:IDC, :NROI, :CUENTAADIC, :CONC, '', :MONTO, 0, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, :SUBCENT, :NUMERO, NULL, :FECHA, NULL, 0, 51, :PREFE, :NUME);
                SUMA = SUMA + MONTO;
                END
            ELSE
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_SUBC, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON, CNDE_PREF, CNDE_FOLIOE)
                    VALUES (:IDC, :NROI, :CUENTAADIC, :CONC, '', 0, :MONTO, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, :SUBCENT, :NUMERO, NULL, :FECHA, NULL, 0, 51, :PREFE, :NUME);
                SUMA = SUMA - MONTO;
                END
            NROI = NROI + 1;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            if (DBADIC = 'S') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_SUBC, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON, CNDE_PREF, CNDE_FOLIOE)
                    VALUES (:IDC, :NROI, :CUENTAADIC, :CONC, '', :MONTO, 0, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, :SUBCENT, NULL, NULL, NULL, NULL, 0, 0, :PREFE, :NUME);
                SUMA = SUMA + MONTO;
                END
            ELSE
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_SUBC, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON, CNDE_PREF, CNDE_FOLIOE)
                    VALUES (:IDC, :NROI, :CUENTAADIC, :CONC, '', 0, :MONTO, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, :SUBCENT, NULL, NULL, NULL, NULL, 0, 0, :PREFE, :NUME);
                SUMA = SUMA - MONTO;
                END
            NROI = NROI + 1;
            END
        
        NROI = NROI + 1;
        END
        
    /* CIERRE EL COMPROBANTE CONTRA LA CUENTA DEL TERCERO O LA CONSTANTE */
    if ((SUMA <> 0) and ((CLIE = 'T') or (CLIE = 'K'))) then
        BEGIN
        if (SUMA < 0) then
            BEGIN
            DEBITO = SUMA * -1;
            CREDITO = 0;
            END
        ELSE
            BEGIN
            DEBITO = 0;
            CREDITO = SUMA;
            END
        if (CLIE = 'T') then
            CTACLIE = TCTACLIEN;

        CUENTA = NULL;
        SELECT CUEN_COD, CUEN_TIPO FROM cuentas_niif
            WHERE CUEN_COD = :CTACLIE INTO :CUENTA, :TIPOCUEN;
        IF (CUENTA IS NULL) then
            begin
            INSERT INTO  ERRORES (ERRO_ITEM, ERRO_TIPODOC, ERRO_IDDOC, ERRO_CODIGO, ERRO_CANT, ERRO_CADENA)
                VALUES(GEN_ID(id_errores, 1), 1051, :IDDOC, 'CUENTA NO EXISTE', 0, :CTACLIE);
            CUENTA = CTACLIE;
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            INSERT INTO  ERRORES (ERRO_ITEM, ERRO_TIPODOC, ERRO_IDDOC, ERRO_CODIGO, ERRO_CANT, ERRO_CADENA)
                VALUES(GEN_ID(id_errores, 1), 1051, :IDDOC, 'CUENTA DE INVENTARIO', 0, :CUENTA);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'C') then
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_SUBC, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON, CNDE_PREF, CNDE_FOLIOE)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :DEBITO, :CREDITO, 0, 0, :NIT, :PROY, :CENTRO, :SUBCENT, :NUMERO, NULL, :VENCE, NULL, 0, 51, :PREFE, :NUME);
        if (TIPOCUEN = 'N') then
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_SUBC, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON, CNDE_PREF, CNDE_FOLIOE)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :DEBITO, :CREDITO, 0, 0, :NIT, :PROY, :CENTRO, :SUBCENT, NULL, NULL, NULL, NULL, 0, 0, :PREFE, :NUME);
        NROI = NROI + 1;
        END /* SUMA EN CARTERA */
    if (ERROR > 0) then
        VER = 'S';
    SUSPEND;
    END /* ANULADO */
  END /* EXISTE LA INTERFAZ */
ELSE
    BEGIN
    INSERT INTO  ERRORES (ERRO_ITEM, ERRO_TIPODOC, ERRO_IDDOC, ERRO_CODIGO, ERRO_CANT, ERRO_CADENA)
        VALUES(GEN_ID(id_errores, 1), 1051, :IDDOC, 'INTERFAZ NO EXISTE', 0, :pref);
    ERROR = ERROR + 1;
    VER = 'S';
    SUSPEND;
    END
END^

SET TERM ; ^

ALTER TABLE NOTAS_CREDITO_PROVEEDOR
  ADD NCPR_NUMPROV VARCHAR(20);

 SET TERM ^ ;

CREATE OR ALTER procedure CONTABIL_NOTACRPR (
    IDDOC integer,
    IDINTER integer)
returns (
    ERROR integer,
    VER char(1),
    IDC integer)
as
declare variable PREF VARCHAR(4);
declare variable NUM VARCHAR(6);
declare variable NUMERO VARCHAR(12);
declare variable FECAUX DATE;
declare variable FECHA CHAR(8);
declare variable CONC CHAR(120);
declare variable VRSUBT NUMERIC(18, 2);
declare variable BASE0 NUMERIC(18, 2);
declare variable BASE1 NUMERIC(18, 2);
declare variable BASE2 NUMERIC(18, 2);
declare variable VRIVA NUMERIC(18, 2);
declare variable IVA1 NUMERIC(18, 2);
declare variable IVA2 NUMERIC(18, 2);
declare variable PRTFTE NUMERIC(9, 2);
declare variable VRRTFTE NUMERIC(18, 2);
declare variable VRRTIVA NUMERIC(18, 2);
declare variable PRTICA NUMERIC(9, 2);
declare variable VRRTICA NUMERIC(18, 2);
declare variable PRTCREE NUMERIC(9, 2);
declare variable VRRTCREE NUMERIC(18, 2);
declare variable VRTOTAL NUMERIC(18, 2);
declare variable TIPOCOMP VARCHAR(3);
declare variable PREFCONT VARCHAR(4);
declare variable BASE CHAR(1);
declare variable CTABASE VARCHAR(20);
declare variable IVA CHAR(1);
declare variable CTAIVA VARCHAR(20);
declare variable CLIE CHAR(1);
declare variable CTACLIE VARCHAR(20);
declare variable RTFTE CHAR(1);
declare variable CTARTFTE VARCHAR(20);
declare variable RTIVA CHAR(1);
declare variable CTARTIVA VARCHAR(20);
declare variable RTICA CHAR(1);
declare variable CTARTICA VARCHAR(20);
declare variable RTCREE CHAR(1);
declare variable CTARTCREE VARCHAR(20);
declare variable EXISTE CHAR(1);
declare variable CUENTA VARCHAR(20);
declare variable MONTO NUMERIC(18,2);
declare variable ES_RETENCION CHAR(1);
declare variable TIPOCUEN CHAR(1);
declare variable NIT VARCHAR(20);
declare variable NOMBRE VARCHAR(60);
declare variable PROY VARCHAR(4);
declare variable CENTRO VARCHAR(4);
declare variable SUBCENT VARCHAR(4);
declare variable PORC NUMERIC(5,2);
declare variable DEBITO NUMERIC(18,2);
declare variable CREDITO NUMERIC(18,2);
declare variable NROI INTEGER;
declare variable SUMA NUMERIC(18,2);
declare variable TCTACLIEN VARCHAR(20);
declare variable TCTABASE VARCHAR(20);
declare variable TCTARTFTE VARCHAR(20);
declare variable TCTARTIVA VARCHAR(20);
declare variable TCTARTICA VARCHAR(20);
declare variable TCTARTCREE VARCHAR(20);
declare variable BASEADIC VARCHAR(20);
declare variable PORCADIC NUMERIC(5,2);
declare variable VALORADIC NUMERIC(18,2);
declare variable DBADIC CHAR(1);
declare variable CUENTAADIC VARCHAR(20);
declare variable ANULADO CHAR(1);
declare variable MONTOBASE NUMERIC(18,2);
declare variable TARIFA INTEGER;
declare variable TIPODS INTEGER;
declare variable NUMEROFAC VARCHAR(12);
declare variable PREFAC VARCHAR(4);
declare variable NUMFAC VARCHAR(8);
declare variable AUTOFAC VARCHAR(30);
declare variable NUMPROV VARCHAR(20);
BEGIN
ERROR = 0;
/* BUSQUE LA INTERFACE */
EXISTE = 'N';
SELECT 'S', TICO_COD, PRCO_PRE, INCP_BASE, INCP_IVA, INCP_RTFTE, INCP_RTIVA, INCP_RTICA, INCP_RTCREE, INCP_PROV,
    INCP_CTABASE, INCP_CTAIVA, INCP_CTARTFTE, INCP_CTARTIVA, INCP_CTARTICA, INCP_CTARTCREE, INCP_CTAPROV, INCP_CONFIRMAR
  FROM INTERFAZ_CXPAGAR
  WHERE INCP_ID = :IDINTER
  INTO :EXISTE, :TIPOCOMP, :PREFCONT, :BASE, :IVA, :RTFTE, :RTIVA, :RTICA, :RTCREE, :CLIE,
    :CTABASE, :CTAIVA, :CTARTFTE, :CTARTIVA, :CTARTICA, :CTARTCREE, :CTACLIE, :VER;

if (EXISTE = 'S') then
  BEGIN
  /* BORRE CUALQUEIR CONTABILIZACION PREVIA */
  DELETE FROM CONTABILIZACION WHERE CNTB_TIPOREF = 52 AND CNTB_IDREF = :IDDOC;
  /* TRAIGA EL ENCABEZADO DE LA NOTA */
  SELECT PREF_PRE, NCPR_NUMERO, NCPR_FECHA, N.TERC_NIT, NCPR_CONC, NCPR_IVAMONTO, NCPR_MONTO, NCPR_RTFTEPORC, NCPR_RTFTEMONTO,
    NCPR_RTIVAPORC, NCPR_RTIVAMONTO, NCPR_RTICAPORC, NCPR_RTICAMONTO, NCPR_RTCREE, NCPR_RTCREEM, TERC_NOM, TERC_CTAVENTA,
    TERC_CTARTFTE, TERC_CTARTIVA, TERC_CTARTICA, TERC_CTARCREE, TERC_CTACLIENTE, NCPR_ANULADO, NCPR_BASE0, NCPR_BASE1, NCPR_BASE2,
    NCPR_IVA1, NCPR_IVA2, NCPR_TIPODS, NCPR_DOCSOPORTE, NCPR_NUMPROV
    FROM NOTAS_CREDITO_PROVEEDOR N, TERCEROS T
    WHERE NCPR_ID = :IDDOC AND N.TERC_NIT = T.TERC_NIT
    INTO :PREF, :NUM, :FECAUX, :NIT, :CONC, :VRIVA, :VRTOTAL, :PRTFTE, :VRRTFTE,
    :PORC, :VRRTIVA, :PRTICA, :VRRTICA, :prtcree, :vrrtcree, :NOMBRE, TCTABASE,
    TCTARTFTE, TCTARTIVA, TCTARTICA, tctartcree, TCTACLIEN, ANULADO, :BASE0, BASE1, :BASE2, :IVA1, :IVA2, :TIPODS, :NUMEROFAC, :NUMPROV;
  if (ANULADO = 'N') then
    BEGIN
    if (NUMEROFAC <> '') then
        BEGIN
        PREFAC = left(numerofac,  STRLEN(NUMEROFAC)-6);
        NUMFAC = right(NUMEROFAC, 6);
        END
    ELSE
        execute procedure SEPARAR_PREFIJO_NUMERO(:NUMPROV) returning_values :PREFAC, :NUMFAC;

    SELECT PREF_CENTRO, PREF_PROY, PREF_SUBC FROM PREFIJOS P, NOTAS_CREDITO_PROVEEDOR N
        WHERE P.PREF_PRE = N.PREF_PRE AND P.TIDO_COD = 52 AND NCPR_ID = :IDDOC INTO :CENTRO, :PROY, :subcent;
    /* SI ES PROVEEDOR, SOBREESCIBE LAS CUENTAS  */
    SELECT PROV_CTAPAGAR, PROV_CTARTFTE, PROV_CTARTIVA, PROV_CTARTICA, PROV_CTACAUSA, PROV_CTARTCREE
        FROM PROVEEDORES WHERE TERC_NIT = :NIT
        INTO TCTACLIEN, TCTARTFTE, TCTARTIVA, TCTARTICA, TCTABASE, tctartcree;
        
    /* SI EL DOCUMENTO ESPECIFICA ALGUNAS SOBRESCRIBA LAS DEL PROVEEDOR */
    SELECT NCPR_CTAPAGAR, NCPR_CTACAUSA
        FROM NOTAS_CREDITO_PROVEEDOR N
        WHERE NCPR_ID = :IDDOC
        INTO :TCTACLIEN, TCTABASE;
    NUMERO = PREF || NUM;
    VRSUBT = VRTOTAL; /* BASE DE RETEFTE Y RETEICA */

    EXECUTE PROCEDURE FECHA_A_CONTA(:FECAUX) returning_values (:FECHA);

    /* REGISTRE EL ENCABEZADO CONTABLE */
    IDC = GEN_ID(ID_CONTABILIZA, 1);
    INSERT INTO CONTABILIZACION (CNTB_ID, CNTB_TIPOCOMP, CNTB_PREFCNT, CNTB_NUMERO, CNTB_FECHA, CNTB_CONCEPTO, CNTB_REF, CNTB_TIPOREF, CNTB_IDREF, CNTB_PREFREF, CNTB_NUMREF, CNTB_PROCESADO)
        VALUES (:IDC, :TIPOCOMP, :PREFCONT, :NUM, :FECHA, :CONC, '', 52, :IDDOC, :PREF, :NUM, 'N');

    NROI = 0;
    SUMA = 0;

    IF ((BASE = 'T') OR (BASE = 'K')) THEN
        BEGIN
        IF (BASE = 'T') THEN
            CTABASE = TCTABASE;

        if (VRSUBT <> 0) then
            BEGIN
            CUENTA = NULL;
            SELECT CUEN_COD, CUEN_TIPO, CUEN_RETENCION FROM CUENTAS
                WHERE CUEN_COD = :CTABASE INTO :CUENTA, :TIPOCUEN, :ES_RETENCION;
            if (CUENTA IS NULL) then
                begin
                EXECUTE PROCEDURE ERRORINT (52, :IDDOC, :CTABASE, 2);
                CUENTA = CTABASE;
                ERROR = ERROR + 1;
                end
            if (ES_RETENCION = 'S') then
                if (PORC <> 0) then
                    montobase = FLOOR(VRSUBT / PORC * -1);
                else
                    montobase = VRSUBT * -1;
            else
                montobase = 0;
            if (TIPOCUEN = 'I') then
                BEGIN
                EXECUTE PROCEDURE ERRORINT (52, :IDDOC, :CUENTA, 3);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_SUBC, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON, CNDE_PREF, CNDE_FOLIOE)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRSUBT, :MONTOBASE, :PORC, :NIT, :PROY, :CENTRO, :SUBCENT, :NUMERO, NULL, :FECHA, NULL, 0, 52, :PREFAC, CAST(:NUMFAC AS INTEGER));
                NROI = NROI + 1;
                SUMA = SUMA - VRSUBT;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_SUBC, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON, CNDE_PREF, CNDE_FOLIOE)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRSUBT, :MONTOBASE, :PORC, :NIT, :PROY, :CENTRO, :SUBCENT, NULL, NULL, NULL, NULL, 0, 0, :PREFAC, CAST(:NUMFAC AS INTEGER));
                NROI = NROI + 1;
                SUMA = SUMA - VRSUBT;
                END
            END /* MONTO <> 0 */
        END /* BASE TERCERO O CONSTANTE */
    IF ((BASE = 'I')) THEN
        BEGIN
        FOR SELECT TAIV_CTACOMP, TAIV_COD FROM TARIFA_IVA WHERE TAIV_COD <= 2 INTO :CTABASE, :tarifa
            DO
            BEGIN
            if (TARIFA = 0) then
                vrsubt = BASE0;
            if (TARIFA = 1) then
                vrsubt = BASE1;
            if (TARIFA = 2) then
                vrsubt = BASE2;
            if (VRSUBT <> 0) then
                BEGIN
                CUENTA = NULL;
                SELECT CUEN_COD, CUEN_TIPO, CUEN_RETENCION FROM CUENTAS
                    WHERE CUEN_COD = :CTABASE INTO :CUENTA, :TIPOCUEN, :ES_RETENCION;
                if (CUENTA IS NULL) then
                    begin
                    EXECUTE PROCEDURE ERRORINT (52, :IDDOC, :CTABASE, 2);
                    CUENTA = CTABASE;
                    ERROR = ERROR + 1;
                    end
                montobase = 0;
                if (TIPOCUEN = 'I') then
                    BEGIN
                    EXECUTE PROCEDURE ERRORINT (52, :IDDOC, :CUENTA, 3);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_SUBC, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON, CNDE_PREF, CNDE_FOLIOE)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRSUBT, :MONTOBASE, :PORC, :NIT, :PROY, :CENTRO, :SUBCENT, :NUMERO, NULL, :FECHA, NULL, 0, 52, :PREFAC, CAST(:NUMFAC AS INTEGER));
                    NROI = NROI + 1;
                    SUMA = SUMA - VRSUBT;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_SUBC, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON, CNDE_PREF, CNDE_FOLIOE)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRSUBT, :MONTOBASE, :PORC, :NIT, :PROY, :CENTRO, :SUBCENT, NULL, NULL, NULL, NULL, 0, 0, :PREFAC, CAST(:NUMFAC AS INTEGER));
                    NROI = NROI + 1;
                    SUMA = SUMA - VRSUBT;
                    END
                END /* MONTO <> 0 */
            END /* FOR */
        END /* BASE TARIFA IVA */

    if (IVA = 'I') then /* IVA X TARIFA */
        BEGIN
        FOR SELECT TAIV_CTAIVACMP, TAIV_COD, TAIV_PORC FROM TARIFA_IVA WHERE (TAIV_COD <> 0) AND (TAIV_COD <= 2) INTO :CTAIVA, :tarifa, :PORC
            DO
            BEGIN
            if (TARIFA = 1) then
                BEGIN
                VRIVA = IVA1;
                vrsubt = BASE1 * -1;
                END
            if (TARIFA = 2) then
                BEGIN
                VRIVA = IVA2;
                vrsubt = BASE2 * -1;
                END
            if (VRIVA <> 0) then
                BEGIN
                CUENTA = NULL;
                SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                    WHERE CUEN_COD = :CTAIVA INTO :CUENTA, :TIPOCUEN;
                if (CUENTA IS NULL) then
                    begin
                    EXECUTE PROCEDURE ERRORINT (52, :IDDOC, :CTAIVA, 2);
                    CUENTA = CTAIVA;
                    ERROR = ERROR + 1;
                    end
                if (TIPOCUEN = 'I') then
                    BEGIN
                    EXECUTE PROCEDURE ERRORINT (52, :IDDOC, :CUENTA, 3);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_SUBC, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON, CNDE_PREF, CNDE_FOLIOE)
                        VALUES (:IDC, :NROI, :CTAIVA, :CONC, '', 0, :VRIVA, :VRSUBT, :PORC, :NIT, :PROY, :CENTRO, :SUBCENT, :NUMERO, NULL, :FECHA, NULL, 0, 52, :PREFAC, CAST(:NUMFAC AS INTEGER));
                    NROI = NROI + 1;
                    SUMA = SUMA - VRIVA;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_SUBC, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON, CNDE_PREF, CNDE_FOLIOE)
                        VALUES (:IDC, :NROI, :CTAIVA, :CONC, '', 0, :VRIVA, :VRSUBT, :PORC, :NIT, :PROY, :CENTRO, :SUBCENT, NULL, NULL, NULL, NULL, 0, 0, :PREFAC, CAST(:NUMFAC AS INTEGER));
                    NROI = NROI + 1;
                    SUMA = SUMA - VRIVA;
                    END
                END /* VRIVA <> 0 */
            END /* FOR */
        END /* IVA EN CTA CONSTANTE */
        
    VRSUBT = VRTOTAL; /* BASE DE RETEFTE Y RETEICA */
    if (IVA = 'K') then /* IVA EN CTA CONSTANTE */
        BEGIN
        if (VRIVA <> 0) then
            BEGIN
            CUENTA = NULL;
            SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :CTAIVA INTO :CUENTA, :TIPOCUEN;
            if (CUENTA IS NULL) then
                begin
                EXECUTE PROCEDURE ERRORINT (52, :IDDOC, :CTAIVA, 2);
                CUENTA = CTAIVA;
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'I') then
                BEGIN
                EXECUTE PROCEDURE ERRORINT (52, :IDDOC, :CUENTA, 3);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_SUBC, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON, CNDE_PREF, CNDE_FOLIOE)
                    VALUES (:IDC, :NROI, :CTAIVA, :CONC, '', 0, :VRIVA, :VRSUBT*-1, :PORC, :NIT, :PROY, :CENTRO, :SUBCENT, :NUMERO, NULL, :FECHA, NULL, 0, 52, :PREFAC, CAST(:NUMFAC AS INTEGER));
                NROI = NROI + 1;
                SUMA = SUMA - VRIVA;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_SUBC, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON, CNDE_PREF, CNDE_FOLIOE)
                    VALUES (:IDC, :NROI, :CTAIVA, :CONC, '', 0, :VRIVA, :VRSUBT*-1, :PORC, :NIT, :PROY, :CENTRO, :SUBCENT, NULL, NULL, NULL, NULL, 0, 0, :PREFAC, CAST(:NUMFAC AS INTEGER));
                NROI = NROI + 1;
                SUMA = SUMA - VRIVA;
                END
            END /* VRIVA <> 0 */
        END /* IVA EN CTA CONSTANTE */
        
    /* RETENCION FUENTE */
    if ((RTFTE = 'T') or (RTFTE = 'K')) then
      if (VRRTFTE <> 0) then
        BEGIN
        if (RTFTE = 'T') then
            CTARTFTE = TCTARTFTE;
            
        CUENTA = NULL;
        SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
            WHERE CUEN_COD = :CTARTFTE INTO :CUENTA, :TIPOCUEN;
        if (CUENTA IS NULL) then
            begin
            EXECUTE PROCEDURE ERRORINT (52, :IDDOC, :CTARTFTE, 2);
            CUENTA = CTARTFTE;
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            EXECUTE PROCEDURE ERRORINT (52, :IDDOC, :CUENTA, 3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'C') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_SUBC, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON, CNDE_PREF, CNDE_FOLIOE)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTFTE, 0, :VRSUBT, :PRTFTE, :NIT, :PROY, :CENTRO, :SUBCENT, :NUMERO, NULL, :FECHA, NULL, 0, 52, :PREFAC, CAST(:NUMFAC AS INTEGER));
            NROI = NROI + 1;
            SUMA = SUMA + VRRTFTE;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_SUBC, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON, CNDE_PREF, CNDE_FOLIOE)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTFTE, 0, :VRSUBT, :PRTFTE, :NIT, :PROY, :CENTRO, :SUBCENT, NULL, NULL, NULL, NULL, 0, 0, :PREFAC, CAST(:NUMFAC AS INTEGER));
            NROI = NROI + 1;
            SUMA = SUMA + VRRTFTE;
            END
        END /* RTFTE */
        
    /* RETENCION IVA */
    if ((RTIVA = 'T') or (RTIVA = 'K')) then
      if (VRRTIVA <> 0) then
        BEGIN
        if (RTIVA = 'T') then
            CTARTIVA = TCTARTIVA;
            
        CUENTA = NULL;
        SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
            WHERE CUEN_COD = :CTARTIVA INTO :CUENTA, :TIPOCUEN;
        if (CUENTA IS NULL) then
            begin
            EXECUTE PROCEDURE ERRORINT (52, :IDDOC, :CTARTIVA, 2);
            CUENTA = CTARTIVA;
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            EXECUTE PROCEDURE ERRORINT (52, :IDDOC, :CUENTA, 3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'C') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_SUBC, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON, CNDE_PREF, CNDE_FOLIOE)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTIVA, 0, :VRIVA, :PORC, :NIT, :PROY, :CENTRO, :SUBCENT, :NUMERO, NULL, :FECHA, NULL, 0, 52, :PREFAC, CAST(:NUMFAC AS INTEGER));
            NROI = NROI + 1;
            SUMA = SUMA + VRRTIVA;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_SUBC, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON, CNDE_PREF, CNDE_FOLIOE)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTIVA, 0, :VRIVA, :PORC, :NIT, :PROY, :CENTRO, :SUBCENT, NULL, NULL, NULL, NULL, 0, 0, :PREFAC, CAST(:NUMFAC AS INTEGER));
            NROI = NROI + 1;
            SUMA = SUMA + VRRTIVA;
            END
        END /* RTIVA */
        
    /* RETENCION DE ICA */
    if ((RTICA = 'T') or (RTICA = 'K')) then
      if (VRRTICA <> 0) then
        BEGIN
        if (RTICA = 'T') then
            CTARTICA = TCTARTICA;
            
        CUENTA = NULL;
        SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
            WHERE CUEN_COD = :CTARTICA INTO :CUENTA, :TIPOCUEN;
        if (CUENTA IS NULL) then
            begin
            EXECUTE PROCEDURE ERRORINT (52, :IDDOC, :CTARTICA, 2);
            CUENTA = CTARTICA;
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            EXECUTE PROCEDURE ERRORINT (52, :IDDOC, :CUENTA, 3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'C') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_SUBC, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON, CNDE_PREF, CNDE_FOLIOE)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTICA, 0, :VRSUBT, :PRTICA, :NIT, :PROY, :CENTRO, :SUBCENT, :NUMERO, NULL, :FECHA, NULL, 0, 52, :PREFAC, CAST(:NUMFAC AS INTEGER));
            NROI = NROI + 1;
            SUMA = SUMA + VRRTICA;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_SUBC, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON, CNDE_PREF, CNDE_FOLIOE)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTICA, 0, :VRSUBT, :PRTICA, :NIT, :PROY, :CENTRO, :SUBCENT, NULL, NULL, NULL, NULL, 0, 0, :PREFAC, CAST(:NUMFAC AS INTEGER));
            NROI = NROI + 1;
            SUMA = SUMA + VRRTICA;
            END
        END /* RTICA */
    /* RETENCION CREE */
    if ((rtcree = 'T') or (rtcree = 'K')) then
      if (vrrtcree <> 0) then
        BEGIN
        if (rtcree = 'T') then
            ctartcree = tctartcree;
            
        CUENTA = NULL;
        SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
            WHERE CUEN_COD = :ctartcree INTO :CUENTA, :TIPOCUEN;
        if (CUENTA IS NULL) then
            begin
            EXECUTE PROCEDURE ERRORINT (52, :IDDOC, :ctartcree, 2);
            CUENTA = ctartcree;
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            EXECUTE PROCEDURE ERRORINT (52, :IDDOC, :CUENTA, 3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'C') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON, CNDE_PREF, CNDE_FOLIOE)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :vrrtcree, 0, :VRSUBT, :prtcree, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 52, :PREFAC, CAST(:NUMFAC AS INTEGER));
            NROI = NROI + 1;
            SUMA = SUMA + vrrtcree;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON, CNDE_PREF, CNDE_FOLIOE)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :vrrtcree, 0, :VRSUBT, :prtcree, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0, :PREFAC, CAST(:NUMFAC AS INTEGER));
            NROI = NROI + 1;
            SUMA = SUMA + vrrtcree;
            END
        END /* RTCREE */
    /* recorra las cuentas adicionales */
    FOR SELECT INPC_CUENTA, INPC_BASE, INPC_PORC, INPC_VALOR, INPC_DB
        FROM INTERFAZ_CXPAGAR_CTAS
        WHERE INCP_ID = :IDINTER
        INTO :CUENTAADIC, :BASEADIC, :PORCADIC, :VALORADIC, :DBADIC
        DO
        BEGIN
        if (:BASEADIC = 'SUBTOTAL') then
            VALORADIC = VRTOTAL - VRIVA;
        if (:BASEADIC = 'IVA') then
            VALORADIC = VRIVA;
        if (:BASEADIC = 'TOTAL') then
            VALORADIC = VRTOTAL;
        MONTO = VALORADIC * PORCADIC;
        
        /* TRAIGA LAS CARACTERISTICAS DE LA CUENTA */
        CUENTA = NULL;
        SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
            WHERE CUEN_COD = :CUENTAADIC INTO :CUENTA, :TIPOCUEN;
        IF (CUENTA IS NULL) THEN
            begin
            EXECUTE PROCEDURE ERRORINT (52, :IDDOC, :CUENTAADIC, 2);
            CUENTA = CUENTAADIC;
            ERROR = ERROR + 1;
            end
        /* DEPENDE DEL TIPO DE CUENTA */
        if (TIPOCUEN = 'I') then
            BEGIN
            EXECUTE PROCEDURE ERRORINT (52, :IDDOC, :CUENTA, 3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'C') then
            BEGIN
            if (DBADIC = 'S') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_SUBC, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON, CNDE_PREF, CNDE_FOLIOE)
                    VALUES (:IDC, :NROI, :CUENTAADIC, :CONC, '', :MONTO, 0, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, :SUBCENT, :NUMERO, NULL, :FECHA, NULL, 0, 52, :PREFAC, CAST(:NUMFAC AS INTEGER));
                SUMA = SUMA + MONTO;
                END
            ELSE
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_SUBC, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON, CNDE_PREF, CNDE_FOLIOE)
                    VALUES (:IDC, :NROI, :CUENTAADIC, :CONC, '', 0, :MONTO, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, :SUBCENT, :NUMERO, NULL, :FECHA, NULL, 0, 52, :PREFAC, CAST(:NUMFAC AS INTEGER));
                SUMA = SUMA - MONTO;
                END
            NROI = NROI + 1;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            if (DBADIC = 'S') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_SUBC, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON, CNDE_PREF, CNDE_FOLIOE)
                    VALUES (:IDC, :NROI, :CUENTAADIC, :CONC, '', :MONTO, 0, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, :SUBCENT, NULL, NULL, NULL, NULL, 0, 0, :PREFAC, CAST(:NUMFAC AS INTEGER));
                SUMA = SUMA + MONTO;
                END
            ELSE
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_SUBC, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON, CNDE_PREF, CNDE_FOLIOE)
                    VALUES (:IDC, :NROI, :CUENTAADIC, :CONC, '', 0, :MONTO, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, :SUBCENT, NULL, NULL, NULL, NULL, 0, 0, :PREFAC, CAST(:NUMFAC AS INTEGER));
                SUMA = SUMA - MONTO;
                END
            NROI = NROI + 1;
            END
        
        NROI = NROI + 1;
        END
        
    /* CIERRE EL COMPROBANTE CONTRA LA CUENTA DEL TERCERO O LA CONSTANTE */
    if ((SUMA <> 0) and ((CLIE = 'T') or (CLIE = 'K'))) then
        BEGIN
        if (SUMA < 0) then
            BEGIN
            DEBITO = SUMA * -1;
            CREDITO = 0;
            END
        ELSE
            BEGIN
            DEBITO = 0;
            CREDITO = SUMA;
            END
        if (CLIE = 'T') then
            CTACLIE = TCTACLIEN;

        CUENTA = NULL;
        SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
            WHERE CUEN_COD = :CTACLIE INTO :CUENTA, :TIPOCUEN;
        IF (CUENTA IS NULL) then
            begin
            EXECUTE PROCEDURE ERRORINT (52, :IDDOC, :CTACLIE, 2);
            CUENTA = CTACLIE;
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            EXECUTE PROCEDURE ERRORINT (52, :IDDOC, :CUENTA, 3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'C') then
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_SUBC, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON, CNDE_PREF, CNDE_FOLIOE)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :DEBITO, :CREDITO, 0, 0, :NIT, :PROY, :CENTRO, :SUBCENT, :NUMERO, NULL, :FECHA, NULL, 0, 52, :PREFAC, CAST(:NUMFAC AS INTEGER));
        if (TIPOCUEN = 'N') then
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_SUBC, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON, CNDE_PREF, CNDE_FOLIOE)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :DEBITO, :CREDITO, 0, 0, :NIT, :PROY, :CENTRO, :SUBCENT, NULL, NULL, NULL, NULL, 0, 0, :PREFAC, CAST(:NUMFAC AS INTEGER));
        NROI = NROI + 1;
        END /* SUMA EN CARTERA */
    if (ERROR > 0) then
        VER = 'S';
    SUSPEND;
    END /* NO ANULADO */
  END /* EXISTE LA INTERFAZ */
ELSE
    BEGIN
    EXECUTE PROCEDURE ERRORINT (52, :IDDOC, :PREF, 1);
    ERROR = ERROR + 1;
    VER = 'S';
    SUSPEND;
    END
END^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE NOTACRPR_SIN_CONTABILIDAD(
    FECINI DATE,
    FECFIN DATE)
RETURNS (
    ID INTEGER,
    IDI INTEGER,
    IDC INTEGER,
    PREF VARCHAR(4),
    NUMERO VARCHAR(6),
    ESTADO VARCHAR(20),
    ERROR INTEGER)
AS
DECLARE VARIABLE VER CHAR(2);
declare variable FECICNT VARCHAR(10);
declare variable FECFCNT VARCHAR(10);
declare variable idref INTEGER;
BEGIN
EXECUTE PROCEDURE fecha_a_conta(FECINI) returning_values (FECICNT);
EXECUTE PROCEDURE fecha_a_conta(FECFIN) returning_values (FECFCNT);
FOR SELECT NCPR_ID, PREF_PRE, NCPR_NUMERO FROM NOTAS_CREDITO_PROVEEDOR WHERE NCPR_ANULADO = 'N' AND
    NCPR_FECHA >= :FECINI AND NCPR_FECHA <= :FECFIN
    ORDER BY NCPR_ID INTO :ID, :PREF, :NUMERO
DO
  BEGIN
  idref = null;
  SELECT ENCO_IDREF FROM COMPROBANTE_ENCABEZADO WHERE ENCO_TIPOREF = 52 AND ENCO_FECHA >= :FECICNT AND ENCO_FECHA <= :FECFCNT and ENCO_IDREF = :id into :idref;
  if (idref IS NULL) then
  begin
  ESTADO = 'PROCESANDO';
  SUSPEND;
  SELECT MAX(INCA_ID) FROM INTERFAZ_CARTERA WHERE PREF_PRE = :PREF AND TIDO_COD = 52 INTO :IDI;
  if (IDI IS NOT NULL) then
    BEGIN
    EXECUTE PROCEDURE CONTABIL_NOTACRPR (:ID, :IDI) RETURNING_VALUES (:ERROR, :VER, :IDC);
    if (ERROR = 0) then
      BEGIN
      EXECUTE PROCEDURE CONTABILIZA_PENDIENTE (:IDC);
      ESTADO = 'OK';
      END
    ELSE
      ESTADO = 'ERROR';
    suspend;
    END
  end
  END
END^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER procedure CONTABIL_NOTACRPR_NIIF (
    IDDOC integer,
    IDINTER integer,
    IDC integer)
returns (
    ERROR integer,
    VER char(1))
as
declare variable PREF VARCHAR(4);
declare variable NUM VARCHAR(6);
declare variable NUMERO VARCHAR(10);
declare variable FECAUX DATE;
declare variable FECHA CHAR(8);
declare variable CONC CHAR(120);
declare variable VRSUBT NUMERIC(18, 2);
declare variable BASE0 NUMERIC(18, 2);
declare variable BASE1 NUMERIC(18, 2);
declare variable BASE2 NUMERIC(18, 2);
declare variable VRIVA NUMERIC(18, 2);
declare variable IVA1 NUMERIC(18, 2);
declare variable IVA2 NUMERIC(18, 2);
declare variable PRTFTE NUMERIC(9, 2);
declare variable VRRTFTE NUMERIC(18, 2);
declare variable VRRTIVA NUMERIC(18, 2);
declare variable PRTICA NUMERIC(9, 2);
declare variable VRRTICA NUMERIC(18, 2);
declare variable PRTCREE NUMERIC(9, 2);
declare variable VRRTCREE NUMERIC(18, 2);
declare variable VRTOTAL NUMERIC(18, 2);
declare variable BASE CHAR(1);
declare variable CTABASE VARCHAR(20);
declare variable IVA CHAR(1);
declare variable CTAIVA VARCHAR(20);
declare variable CLIE CHAR(1);
declare variable CTACLIE VARCHAR(20);
declare variable RTFTE CHAR(1);
declare variable CTARTFTE VARCHAR(20);
declare variable RTIVA CHAR(1);
declare variable CTARTIVA VARCHAR(20);
declare variable RTICA CHAR(1);
declare variable CTARTICA VARCHAR(20);
declare variable RTCREE CHAR(1);
declare variable CTARTCREE VARCHAR(20);
declare variable EXISTE CHAR(1);
declare variable CUENTA VARCHAR(20);
declare variable MONTO NUMERIC(18,2);
declare variable ES_RETENCION CHAR(1);
declare variable TIPOCUEN CHAR(1);
declare variable NIT VARCHAR(20);
declare variable PROY VARCHAR(4);
declare variable CENTRO VARCHAR(4);
declare variable SUBCENT VARCHAR(4);
declare variable PORC NUMERIC(5,2);
declare variable DEBITO NUMERIC(18,2);
declare variable CREDITO NUMERIC(18,2);
declare variable NROI INTEGER;
declare variable SUMA NUMERIC(18,2);
declare variable TCTACLIEN VARCHAR(20);
declare variable TCTABASE VARCHAR(20);
declare variable TCTARTFTE VARCHAR(20);
declare variable TCTARTIVA VARCHAR(20);
declare variable TCTARTICA VARCHAR(20);
declare variable TCTARTCREE VARCHAR(20);
declare variable BASEADIC VARCHAR(20);
declare variable PORCADIC NUMERIC(5,2);
declare variable VALORADIC NUMERIC(18,2);
declare variable DBADIC CHAR(1);
declare variable CUENTAADIC VARCHAR(20);
declare variable ANULADO CHAR(1);
declare variable MONTOBASE NUMERIC(18,2);
declare variable TARIFA INTEGER;
declare variable TIPODS INTEGER;
declare variable NUMEROFAC VARCHAR(12);
declare variable PREFAC VARCHAR(4);
declare variable NUMFAC VARCHAR(8);
declare variable NUMPROV VARCHAR(20);
BEGIN
ERROR = 0;
/* BUSQUE LA INTERFACE */
EXISTE = 'N';
SELECT 'S', N.INCP_BASE, N.INCP_IVA, N.INCP_RTFTE, N.INCP_RTIVA, N.INCP_RTICA, N.INCP_RTCREE, N.INCP_PROV, N.INCP_CTABASE,
  N.INCP_CTAIVA, N.INCP_CTARTFTE, N.INCP_CTARTIVA, N.INCP_CTARTICA, N.INCP_CTARTCREE, N.INCP_CTAPROV, INCP_CONFIRMAR
  FROM INTERFAZ_CXPAGAR I, interfaz_cxpagar_niif N
  WHERE I.INCP_ID = :IDINTER AND I.incp_id = N.incp_id
  INTO :EXISTE, :BASE, :IVA, :RTFTE, :RTIVA, :RTICA, :RTCREE, :CLIE, :CTABASE,
    :CTAIVA, :CTARTFTE, :CTARTIVA, :CTARTICA, :CTARTCREE, :CTACLIE, :VER;
if (EXISTE = 'S') then
  BEGIN
  /* TRAIGA EL ENCABEZADO DE LA NOTA */
  SELECT PREF_PRE, NCPR_NUMERO, NCPR_FECHA, N.TERC_NIT, NCPR_CONC, NCPR_IVAMONTO, NCPR_MONTO, NCPR_RTFTEPORC, NCPR_RTFTEMONTO,
    NCPR_RTIVAPORC, NCPR_RTIVAMONTO, NCPR_RTICAPORC, NCPR_RTICAMONTO, NCPR_RTCREE, NCPR_RTCREEM, TERC_CTAVENTA,
    TERC_CTARTFTE, TERC_CTARTIVA, TERC_CTARTICA, TERC_CTARCREE, TERC_CTACLIENTE, NCPR_ANULADO, NCPR_BASE0,
    NCPR_BASE1, NCPR_BASE2, NCPR_IVA1, NCPR_IVA2, NCPR_TIPODS, NCPR_DOCSOPORTE, NCPR_NUMPROV
    FROM NOTAS_CREDITO_PROVEEDOR N, TERCEROS T
    WHERE NCPR_ID = :IDDOC AND N.TERC_NIT = T.TERC_NIT
    INTO :PREF, :NUM, :FECAUX, :NIT, :CONC, :VRIVA, :VRTOTAL, :PRTFTE, :VRRTFTE,
    :PORC, :VRRTIVA, :PRTICA, :VRRTICA, :prtcree, :vrrtcree, :TCTABASE,
    TCTARTFTE, TCTARTIVA, TCTARTICA, tctartcree, TCTACLIEN, ANULADO, :BASE0, BASE1, :BASE2, :IVA1, :IVA2, :TIPODS, :NUMEROFAC, :NUMPROV;
  if (ANULADO = 'N') then
    BEGIN
    if (NUMEROFAC <> '') then
        BEGIN
        PREFAC = left(numerofac,  STRLEN(NUMEROFAC)-6);
        NUMFAC = right(NUMEROFAC, 6);
        END
    ELSE
        execute procedure SEPARAR_PREFIJO_NUMERO(:NUMPROV) returning_values :PREFAC, :NUMFAC;
    SELECT PREF_CENTRO, PREF_PROY, PREF_SUBC FROM PREFIJOS P, NOTAS_CREDITO_PROVEEDOR N
        WHERE P.PREF_PRE = N.PREF_PRE AND P.TIDO_COD = 52 AND NCPR_ID = :IDDOC INTO :CENTRO, :PROY, :subcent;
    /* SI ES PROVEEDOR, SOBREESCIBE LAS CUENTAS  */
    SELECT PROV_CTAPAGAR, PROV_CTARTFTE, PROV_CTARTIVA, PROV_CTARTICA, PROV_CTACAUSA, PROV_CTARTCREE
        FROM PROVEEDORES WHERE TERC_NIT = :NIT
        INTO TCTACLIEN, TCTARTFTE, TCTARTIVA, TCTARTICA, TCTABASE, tctartcree;
        
    /* SI EL DOCUMENTO ESPECIFICA ALGUNAS SOBRESCRIBA LAS DEL PROVEEDOR */
    SELECT NCPR_CTAPAGAR, NCPR_CTACAUSA FROM NOTAS_CREDITO_PROVEEDOR N
        WHERE NCPR_ID = :IDDOC INTO :TCTACLIEN, TCTABASE;
    NUMERO = PREF || NUM;
    VRSUBT = VRTOTAL; /* BASE DE RETEFTE Y RETEICA */

    EXECUTE PROCEDURE FECHA_A_CONTA(:FECAUX) returning_values (:FECHA);
    NROI = 100000;
    SUMA = 0;
    DELETE FROM CONTABILIZACION_DET WHERE CNTB_ID = :IDC AND CNDE_ITEM >= :nroi;
    IF ((BASE = 'T') OR (BASE = 'K')) THEN
        BEGIN
        IF (BASE = 'T') THEN
            CTABASE = TCTABASE;

        if (VRSUBT <> 0) then
            BEGIN
            CUENTA = NULL;
            SELECT CUEN_COD, CUEN_TIPO, CUEN_RETENCION FROM cuentas_niif
                WHERE CUEN_COD = :CTABASE INTO :CUENTA, :TIPOCUEN, :ES_RETENCION;
            if (CUENTA IS NULL) then
                begin
                EXECUTE PROCEDURE ERRORINT (1052, :IDDOC, :CTABASE, 2);
                CUENTA = CTABASE;
                ERROR = ERROR + 1;
                end
            if (ES_RETENCION = 'S') then
                if (PORC <> 0) then
                    montobase = FLOOR(VRSUBT / PORC * -1);
                else
                    montobase = VRSUBT * -1;
            else
                montobase = 0;
            if (TIPOCUEN = 'I') then
                BEGIN
                EXECUTE PROCEDURE ERRORINT (1052, :IDDOC, :CUENTA, 3);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_SUBC, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON, CNDE_PREF, CNDE_FOLIOE)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRSUBT, :MONTOBASE, :PORC, :NIT, :PROY, :CENTRO, :SUBCENT, :NUMERO, NULL, :FECHA, NULL, 0, 52, :PREFAC, CAST(:NUMFAC AS INTEGER));
                NROI = NROI + 1;
                SUMA = SUMA - VRSUBT;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_SUBC, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON, CNDE_PREF, CNDE_FOLIOE)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRSUBT, :MONTOBASE, :PORC, :NIT, :PROY, :CENTRO, :SUBCENT, NULL, NULL, NULL, NULL, 0, 0, :PREFAC, CAST(:NUMFAC AS INTEGER));
                NROI = NROI + 1;
                SUMA = SUMA - VRSUBT;
                END
            END /* MONTO <> 0 */
        END /* BASE TERCERO O CONSTANTE */
    IF ((BASE = 'I')) THEN
        BEGIN
        FOR SELECT TAIV_CTACOMP, TAIV_COD FROM TARIFA_IVA WHERE TAIV_COD <= 2 INTO :CTABASE, :tarifa
            DO
            BEGIN
            if (TARIFA = 0) then
                vrsubt = BASE0;
            if (TARIFA = 1) then
                vrsubt = BASE1;
            if (TARIFA = 2) then
                vrsubt = BASE2;
            if (VRSUBT <> 0) then
                BEGIN
                CUENTA = NULL;
                SELECT CUEN_COD, CUEN_TIPO, CUEN_RETENCION FROM cuentas_niif
                    WHERE CUEN_COD = :CTABASE INTO :CUENTA, :TIPOCUEN, :ES_RETENCION;
                if (CUENTA IS NULL) then
                    begin
                    EXECUTE PROCEDURE ERRORINT (1052, :IDDOC, :CTABASE, 2);
                    CUENTA = CTABASE;
                    ERROR = ERROR + 1;
                    end
                montobase = 0;
                if (TIPOCUEN = 'I') then
                    BEGIN
                    EXECUTE PROCEDURE ERRORINT (1052, :IDDOC, :CUENTA, 3);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_SUBC, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON, CNDE_PREF, CNDE_FOLIOE)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRSUBT, :MONTOBASE, :PORC, :NIT, :PROY, :CENTRO, :SUBCENT, :NUMERO, NULL, :FECHA, NULL, 0, 52, :PREFAC, CAST(:NUMFAC AS INTEGER));
                    NROI = NROI + 1;
                    SUMA = SUMA - VRSUBT;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_SUBC, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON, CNDE_PREF, CNDE_FOLIOE)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRSUBT, :MONTOBASE, :PORC, :NIT, :PROY, :CENTRO, :SUBCENT, NULL, NULL, NULL, NULL, 0, 0, :PREFAC, CAST(:NUMFAC AS INTEGER));
                    NROI = NROI + 1;
                    SUMA = SUMA - VRSUBT;
                    END
                END /* MONTO <> 0 */
            END /* FOR */
        END /* BASE TARIFA IVA */

    if (IVA = 'I') then /* IVA X TARIFA */
        BEGIN
        FOR SELECT TAIV_CTAIVACMP, TAIV_COD, TAIV_PORC FROM TARIFA_IVA WHERE (TAIV_COD <> 0) AND (TAIV_COD <= 2) INTO :CTAIVA, :tarifa, :PORC
            DO
            BEGIN
            if (TARIFA = 1) then
                BEGIN
                VRIVA = IVA1;
                vrsubt = BASE1 * -1;
                END
            if (TARIFA = 2) then
                BEGIN
                VRIVA = IVA2;
                vrsubt = BASE2 * -1;
                END
            if (VRIVA <> 0) then
                BEGIN
                CUENTA = NULL;
                SELECT CUEN_COD, CUEN_TIPO FROM cuentas_niif
                    WHERE CUEN_COD = :CTAIVA INTO :CUENTA, :TIPOCUEN;
                if (CUENTA IS NULL) then
                    begin
                    EXECUTE PROCEDURE ERRORINT (1052, :IDDOC, :CTAIVA, 2);
                    CUENTA = CTAIVA;
                    ERROR = ERROR + 1;
                    end
                if (TIPOCUEN = 'I') then
                    BEGIN
                    EXECUTE PROCEDURE ERRORINT (1052, :IDDOC, :CUENTA, 3);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_SUBC, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON, CNDE_PREF, CNDE_FOLIOE)
                        VALUES (:IDC, :NROI, :CTAIVA, :CONC, '', 0, :VRIVA, :VRSUBT, :PORC, :NIT, :PROY, :CENTRO, :SUBCENT, :NUMERO, NULL, :FECHA, NULL, 0, 52, :PREFAC, CAST(:NUMFAC AS INTEGER));
                    NROI = NROI + 1;
                    SUMA = SUMA - VRIVA;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_SUBC, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON, CNDE_PREF, CNDE_FOLIOE)
                        VALUES (:IDC, :NROI, :CTAIVA, :CONC, '', 0, :VRIVA, :VRSUBT, :PORC, :NIT, :PROY, :CENTRO, :SUBCENT, NULL, NULL, NULL, NULL, 0, 0, :PREFAC, CAST(:NUMFAC AS INTEGER));
                    NROI = NROI + 1;
                    SUMA = SUMA - VRIVA;
                    END
                END /* VRIVA <> 0 */
            END /* FOR */
        END /* IVA EN CTA CONSTANTE */
        
    VRSUBT = VRTOTAL; /* BASE DE RETEFTE Y RETEICA */
    if (IVA = 'K') then /* IVA EN CTA CONSTANTE */
        BEGIN
        if (VRIVA <> 0) then
            BEGIN
            CUENTA = NULL;
            SELECT CUEN_COD, CUEN_TIPO FROM cuentas_niif
                WHERE CUEN_COD = :CTAIVA INTO :CUENTA, :TIPOCUEN;
            if (CUENTA IS NULL) then
                begin
                EXECUTE PROCEDURE ERRORINT (1052, :IDDOC, :CTAIVA, 2);
                CUENTA = CTAIVA;
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'I') then
                BEGIN
                EXECUTE PROCEDURE ERRORINT (1052, :IDDOC, :CUENTA, 3);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_SUBC, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON, CNDE_PREF, CNDE_FOLIOE)
                    VALUES (:IDC, :NROI, :CTAIVA, :CONC, '', 0, :VRIVA, :VRSUBT*-1, :PORC, :NIT, :PROY, :CENTRO, :SUBCENT, :NUMERO, NULL, :FECHA, NULL, 0, 52, :PREFAC, CAST(:NUMFAC AS INTEGER));
                NROI = NROI + 1;
                SUMA = SUMA - VRIVA;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_SUBC, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON, CNDE_PREF, CNDE_FOLIOE)
                    VALUES (:IDC, :NROI, :CTAIVA, :CONC, '', 0, :VRIVA, :VRSUBT*-1, :PORC, :NIT, :PROY, :CENTRO, :SUBCENT, NULL, NULL, NULL, NULL, 0, 0, :PREFAC, CAST(:NUMFAC AS INTEGER));
                NROI = NROI + 1;
                SUMA = SUMA - VRIVA;
                END
            END /* VRIVA <> 0 */
        END /* IVA EN CTA CONSTANTE */
        
    /* RETENCION FUENTE */
    if ((RTFTE = 'T') or (RTFTE = 'K')) then
      if (VRRTFTE <> 0) then
        BEGIN
        if (RTFTE = 'T') then
            CTARTFTE = TCTARTFTE;
            
        CUENTA = NULL;
        SELECT CUEN_COD, CUEN_TIPO FROM cuentas_niif
            WHERE CUEN_COD = :CTARTFTE INTO :CUENTA, :TIPOCUEN;
        if (CUENTA IS NULL) then
            begin
            EXECUTE PROCEDURE ERRORINT (1052, :IDDOC, :CTARTFTE, 2);
            CUENTA = CTARTFTE;
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            EXECUTE PROCEDURE ERRORINT (1052, :IDDOC, :CUENTA, 3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'C') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_SUBC, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON, CNDE_PREF, CNDE_FOLIOE)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTFTE, 0, :VRSUBT, :PRTFTE, :NIT, :PROY, :CENTRO, :SUBCENT, :NUMERO, NULL, :FECHA, NULL, 0, 52, :PREFAC, CAST(:NUMFAC AS INTEGER));
            NROI = NROI + 1;
            SUMA = SUMA + VRRTFTE;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_SUBC, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON, CNDE_PREF, CNDE_FOLIOE)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTFTE, 0, :VRSUBT, :PRTFTE, :NIT, :PROY, :CENTRO, :SUBCENT, NULL, NULL, NULL, NULL, 0, 0, :PREFAC, CAST(:NUMFAC AS INTEGER));
            NROI = NROI + 1;
            SUMA = SUMA + VRRTFTE;
            END
        END /* RTFTE */
        
    /* RETENCION IVA */
    if ((RTIVA = 'T') or (RTIVA = 'K')) then
      if (VRRTIVA <> 0) then
        BEGIN
        if (RTIVA = 'T') then
            CTARTIVA = TCTARTIVA;
            
        CUENTA = NULL;
        SELECT CUEN_COD, CUEN_TIPO FROM cuentas_niif
            WHERE CUEN_COD = :CTARTIVA INTO :CUENTA, :TIPOCUEN;
        if (CUENTA IS NULL) then
            begin
            EXECUTE PROCEDURE ERRORINT (1052, :IDDOC, :CTARTIVA, 2);
            CUENTA = CTARTIVA;
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            EXECUTE PROCEDURE ERRORINT (1052, :IDDOC, :CUENTA, 3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'C') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_SUBC, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON, CNDE_PREF, CNDE_FOLIOE)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTIVA, 0, :VRIVA, :PORC, :NIT, :PROY, :CENTRO, :SUBCENT, :NUMERO, NULL, :FECHA, NULL, 0, 52, :PREFAC, CAST(:NUMFAC AS INTEGER));
            NROI = NROI + 1;
            SUMA = SUMA + VRRTIVA;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_SUBC, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON, CNDE_PREF, CNDE_FOLIOE)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTIVA, 0, :VRIVA, :PORC, :NIT, :PROY, :CENTRO, :SUBCENT, NULL, NULL, NULL, NULL, 0, 0, :PREFAC, CAST(:NUMFAC AS INTEGER));
            NROI = NROI + 1;
            SUMA = SUMA + VRRTIVA;
            END
        END /* RTIVA */
        
    /* RETENCION DE ICA */
    if ((RTICA = 'T') or (RTICA = 'K')) then
      if (VRRTICA <> 0) then
        BEGIN
        if (RTICA = 'T') then
            CTARTICA = TCTARTICA;
            
        CUENTA = NULL;
        SELECT CUEN_COD, CUEN_TIPO FROM cuentas_niif
            WHERE CUEN_COD = :CTARTICA INTO :CUENTA, :TIPOCUEN;
        if (CUENTA IS NULL) then
            begin
            EXECUTE PROCEDURE ERRORINT (1052, :IDDOC, :CTARTICA, 2);
            CUENTA = CTARTICA;
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            EXECUTE PROCEDURE ERRORINT (1052, :IDDOC, :CUENTA, 3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'C') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_SUBC, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON, CNDE_PREF, CNDE_FOLIOE)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTICA, 0, :VRSUBT, :PRTICA, :NIT, :PROY, :CENTRO, :SUBCENT, :NUMERO, NULL, :FECHA, NULL, 0, 52, :PREFAC, CAST(:NUMFAC AS INTEGER));
            NROI = NROI + 1;
            SUMA = SUMA + VRRTICA;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_SUBC, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON, CNDE_PREF, CNDE_FOLIOE)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTICA, 0, :VRSUBT, :PRTICA, :NIT, :PROY, :CENTRO, :SUBCENT, NULL, NULL, NULL, NULL, 0, 0, :PREFAC, CAST(:NUMFAC AS INTEGER));
            NROI = NROI + 1;
            SUMA = SUMA + VRRTICA;
            END
        END /* RTICA */
    /* RETENCION CREE */
    if ((rtcree = 'T') or (rtcree = 'K')) then
      if (vrrtcree <> 0) then
        BEGIN
        if (rtcree = 'T') then
            ctartcree = tctartcree;
            
        CUENTA = NULL;
        SELECT CUEN_COD, CUEN_TIPO FROM cuentas_niif
            WHERE CUEN_COD = :ctartcree INTO :CUENTA, :TIPOCUEN;
        if (CUENTA IS NULL) then
            begin
            EXECUTE PROCEDURE ERRORINT (1052, :IDDOC, :ctartcree, 2);
            CUENTA = ctartcree;
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            EXECUTE PROCEDURE ERRORINT (1052, :IDDOC, :CUENTA, 3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'C') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON, CNDE_PREF, CNDE_FOLIOE)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :vrrtcree, 0, :VRSUBT, :prtcree, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 52, :PREFAC, CAST(:NUMFAC AS INTEGER));
            NROI = NROI + 1;
            SUMA = SUMA + vrrtcree;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON, CNDE_PREF, CNDE_FOLIOE)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :vrrtcree, 0, :VRSUBT, :prtcree, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0, :PREFAC, CAST(:NUMFAC AS INTEGER));
            NROI = NROI + 1;
            SUMA = SUMA + vrrtcree;
            END
        END /* RTCREE */
    /* recorra las cuentas adicionales */
    FOR SELECT INPC_CUENTA, INPC_BASE, INPC_PORC, INPC_VALOR, INPC_DB
        FROM INTERFAZ_CXPAGAR_CTAS
        WHERE INCP_ID = :IDINTER
        INTO :CUENTAADIC, :BASEADIC, :PORCADIC, :VALORADIC, :DBADIC
        DO
        BEGIN
        if (:BASEADIC = 'SUBTOTAL') then
            VALORADIC = VRTOTAL - VRIVA;
        if (:BASEADIC = 'IVA') then
            VALORADIC = VRIVA;
        if (:BASEADIC = 'TOTAL') then
            VALORADIC = VRTOTAL;
        MONTO = VALORADIC * PORCADIC;
        
        /* TRAIGA LAS CARACTERISTICAS DE LA CUENTA */
        CUENTA = NULL;
        SELECT CUEN_COD, CUEN_TIPO FROM cuentas_niif
            WHERE CUEN_COD = :CUENTAADIC INTO :CUENTA, :TIPOCUEN;
        IF (CUENTA IS NULL) THEN
            begin
            EXECUTE PROCEDURE ERRORINT (1052, :IDDOC, :CUENTAADIC, 2);
            CUENTA = CUENTAADIC;
            ERROR = ERROR + 1;
            end
        /* DEPENDE DEL TIPO DE CUENTA */
        if (TIPOCUEN = 'I') then
            BEGIN
            EXECUTE PROCEDURE ERRORINT (1052, :IDDOC, :CUENTA, 3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'C') then
            BEGIN
            if (DBADIC = 'S') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_SUBC, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON, CNDE_PREF, CNDE_FOLIOE)
                    VALUES (:IDC, :NROI, :CUENTAADIC, :CONC, '', :MONTO, 0, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, :SUBCENT, :NUMERO, NULL, :FECHA, NULL, 0, 52, :PREFAC, CAST(:NUMFAC AS INTEGER));
                SUMA = SUMA + MONTO;
                END
            ELSE
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_SUBC, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON, CNDE_PREF, CNDE_FOLIOE)
                    VALUES (:IDC, :NROI, :CUENTAADIC, :CONC, '', 0, :MONTO, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, :SUBCENT, :NUMERO, NULL, :FECHA, NULL, 0, 52, :PREFAC, CAST(:NUMFAC AS INTEGER));
                SUMA = SUMA - MONTO;
                END
            NROI = NROI + 1;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            if (DBADIC = 'S') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_SUBC, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON, CNDE_PREF, CNDE_FOLIOE)
                    VALUES (:IDC, :NROI, :CUENTAADIC, :CONC, '', :MONTO, 0, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, :SUBCENT, NULL, NULL, NULL, NULL, 0, 0, :PREFAC, CAST(:NUMFAC AS INTEGER));
                SUMA = SUMA + MONTO;
                END
            ELSE
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_SUBC, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON, CNDE_PREF, CNDE_FOLIOE)
                    VALUES (:IDC, :NROI, :CUENTAADIC, :CONC, '', 0, :MONTO, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, :SUBCENT, NULL, NULL, NULL, NULL, 0, 0, :PREFAC, CAST(:NUMFAC AS INTEGER));
                SUMA = SUMA - MONTO;
                END
            NROI = NROI + 1;
            END
        
        NROI = NROI + 1;
        END
        
    /* CIERRE EL COMPROBANTE CONTRA LA CUENTA DEL TERCERO O LA CONSTANTE */
    if ((SUMA <> 0) and ((CLIE = 'T') or (CLIE = 'K'))) then
        BEGIN
        if (SUMA < 0) then
            BEGIN
            DEBITO = SUMA * -1;
            CREDITO = 0;
            END
        ELSE
            BEGIN
            DEBITO = 0;
            CREDITO = SUMA;
            END
        if (CLIE = 'T') then
            CTACLIE = TCTACLIEN;

        CUENTA = NULL;
        SELECT CUEN_COD, CUEN_TIPO FROM cuentas_niif
            WHERE CUEN_COD = :CTACLIE INTO :CUENTA, :TIPOCUEN;
        IF (CUENTA IS NULL) then
            begin
            EXECUTE PROCEDURE ERRORINT (1052, :IDDOC, :CTACLIE, 2);
            CUENTA = CTACLIE;
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            EXECUTE PROCEDURE ERRORINT (1052, :IDDOC, :CUENTA, 3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'C') then
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_SUBC, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON, CNDE_PREF, CNDE_FOLIOE)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :DEBITO, :CREDITO, 0, 0, :NIT, :PROY, :CENTRO, :SUBCENT, :NUMERO, NULL, :FECHA, NULL, 0, 52, :PREFAC, CAST(:NUMFAC AS INTEGER));
        if (TIPOCUEN = 'N') then
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_SUBC, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON, CNDE_PREF, CNDE_FOLIOE)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :DEBITO, :CREDITO, 0, 0, :NIT, :PROY, :CENTRO, :SUBCENT, NULL, NULL, NULL, NULL, 0, 0, :PREFAC, CAST(:NUMFAC AS INTEGER));
        NROI = NROI + 1;
        END /* SUMA EN CARTERA */
    if (ERROR > 0) then
        VER = 'S';
    SUSPEND;
    END /* NO ANULADO */
  END /* EXISTE LA INTERFAZ */
ELSE
    BEGIN
    EXECUTE PROCEDURE ERRORINT (1052, :IDDOC, :PREF, 1);
    ERROR = ERROR + 1;
    VER = 'S';
    SUSPEND;
    END
END^

SET TERM ; ^


INSERT INTO TIPO_DOCUMENTO (TIDO_COD, TIDO_NOMCORTO, TIDO_NOMLARGO, TIDO_MODULO, TIDO_INVE, TIDO_CART, TIDO_CXP, TIDO_CAJA, TIDO_BCOS, TIDO_NOM, TIDO_IMP, TIDO_PROD) VALUES (30, 'PROGPROD', 'PROGRAMACION PRODUCCION', 'PRODUCCION', 'S', 'N', 'N', 'N', 'N', 'N', 'N', 'S');
COMMIT WORK;

ALTER TABLE INTERFAZ_PRODUCCION
ADD INPR_CODPROY T_CENTRO;

ALTER TABLE INTERFAZ_PRODUCCION
ADD INPR_CODCENT T_CENTRO;

ALTER TABLE INTERFAZ_PRODUCCION
ADD INPR_CODSUBC T_CENTRO;


CREATE TABLE PROG_PRODUCCION (
    PRPR_ID           T_ID NOT NULL /* T_ID = INTEGER */,
    PRPR_PREF         VARCHAR(4),
    PRPR_NUMERO       T_NUMDOC /* T_NUMDOC = VARCHAR(6) */,
    PRPR_FECINI       DATE,
    PRPR_FECFIN       DATE,
    PRPR_CONC         T_CONCEPTO /* T_CONCEPTO = VARCHAR(60) */,
    PRPR_RESPONSABLE  T_CONCEPTO /* T_CONCEPTO = VARCHAR(60) */,
    PRPR_OBS          BLOB SUB_TYPE TEXT SEGMENT SIZE 80,
    PRPR_ANULADO      T_BOOLEANO /* T_BOOLEANO = CHAR(1) check (value in ('S','N')) */,
    PRPR_TRANSMIT     T_BOOLEANO /* T_BOOLEANO = CHAR(1) check (value in ('S','N')) */,
    PRPR_USUARIO      T_USUARIO /* T_USUARIO = VARCHAR(10) */,
    PRPR_NUMOK        T_BOOLEANO /* T_BOOLEANO = CHAR(1) check (value in ('S','N')) */,
    PRPR_ENTRADA      T_BOOLEANO /* T_BOOLEANO = CHAR(1) check (value in ('S','N')) */,
    PRPR_BODORI       VARCHAR(2),
    PRPR_BODDES       VARCHAR(2)
);

ALTER TABLE PROG_PRODUCCION ADD CONSTRAINT PK_PROG_PRODUCCION PRIMARY KEY (PRPR_ID);

SET TERM ^ ;

CREATE OR ALTER TRIGGER PROG_PRODUCCION_AD FOR PROG_PRODUCCION
ACTIVE AFTER DELETE POSITION 0
as
begin
INSERT INTO AUDITORIA (AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
    VALUES (USER, 30, old.prpr_id, 'D', old.prpr_pref || old.prpr_numero);
end^

CREATE OR ALTER TRIGGER PROG_PRODUCCION_AI FOR PROG_PRODUCCION
ACTIVE AFTER INSERT POSITION 0
as
begin
IF ((NEW.prpr_id <> 0) AND (NEW.prpr_anulado = 'N')) THEN
  BEGIN
  INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
    VALUES (USER, 30, NEW.prpr_id, 'I', NEW.prpr_pref || NEW.prpr_numero);
  END
end^

CREATE OR ALTER TRIGGER PROG_PRODUCCION_AU FOR PROG_PRODUCCION
ACTIVE AFTER UPDATE POSITION 0
as
declare variable consec INTEGER;
BEGIN
if (new.prpr_anulado = 'S') then
    begin
    INSERT INTO AUDITORIA (AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
        VALUES (USER, 30, new.prpr_id, 'A', NEW.prpr_pref || NEW.prpr_numero);
    end

if ((new.prpr_id <> 0) and (new.prpr_anulado = 'N')) then
    BEGIN
    INSERT INTO AUDITORIA (AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
        VALUES (USER, 30, new.prpr_id, 'U', NEW.prpr_pref || NEW.prpr_numero);
    END
/* si cambia fecha o numero actualice los detalles */
if ((OLD.prpr_pref <> NEW.prpr_pref) or
    (OLD.prpr_numero <> NEW.prpr_numero) or
    (OLD.prpr_fecini <> NEW.prpr_fecini)) then
    BEGIN
--    UPDATE prog_produccion_det SET PRPD_TRANSMIT = 'N' WHERE PRPR_ID = NEW.prpr_id;
--    UPDATE prog_produccion_cons SET PRPC_TRANSMIT = 'N' WHERE PRPD_ID = NEW.prpr_id;
    END
/* actualice los anulados y trasmitidos */
if (OLD.prpr_anulado <> NEW.prpr_anulado) then
    BEGIN
--    UPDATE prog_produccion_det SET PRPD_ANULADO = NEW.prpr_anulado WHERE PRPR_ID = NEW.prpr_id;
--    UPDATE prog_produccion_cons SET PRPC_ANULADO = NEW.prpr_anulado WHERE PRPD_ID = NEW.prpr_id;
    END
if (OLD.prpr_transmit <> NEW.prpr_transmit) then
    BEGIN
--    UPDATE prog_produccion_det SET PRPD_TRANSMIT = NEW.prpr_transmit WHERE PRPR_ID = NEW.prpr_id;
--    UPDATE prog_produccion_cons SET PRPC_TRANSMIT = NEW.prpr_transmit WHERE PRPD_ID = NEW.prpr_id;
    END
end^

CREATE OR ALTER TRIGGER PROG_PRODUCCION_BI FOR PROG_PRODUCCION
ACTIVE BEFORE INSERT POSITION 0
as
declare variable NUMERO VARCHAR(6);
declare variable AUTOM CHAR(1);
declare variable EXISTE CHAR(1);
BEGIN
if (NEW.prpr_numok = 'N') then
  BEGIN
  /* Actualice el contador del prefijo */
  SELECT PREF_ACTUAL, PREF_AUTO FROM PREFIJOS WHERE TIDO_COD = 30 AND PREF_PRE = NEW.prpr_pref INTO :NUMERO, :AUTOM;
  /* ACTUALICE EL NUMERO EN COMPROBANTE_ENCABEZADO  */
  if (AUTOM = 'S') then
    BEGIN
    NEW.prpr_numero = NUMERO;
    NUMERO = CAST((CAST(NUMERO AS INTEGER) + 1) AS CHAR(6));
    UPDATE PREFIJOS
      SET PREF_ACTUAL = :NUMERO
    WHERE TIDO_COD = 30 AND PREF_PRE = NEW.prpr_pref;
    END
  ELSE
    BEGIN
    if (CAST(NUMERO AS INTEGER) = CAST(NEW.prpr_numero AS INTEGER)) then
        UPDATE PREFIJOS
          SET PREF_ACTUAL = CAST((CAST(PREF_ACTUAL AS INTEGER) + 1) AS CHAR(6))
        WHERE TIDO_COD = 30 AND PREF_PRE = NEW.prpr_pref;
    END
  EXECUTE PROCEDURE COMPLETA_CEROS (NEW.prpr_numero) returning_values (NEW.prpr_numero);
  NEW.prpr_numok = 'S';
  END
/* Verifique que el numero no existe previamente */
EXISTE = 'N';
SELECT 'S' FROM prog_produccion WHERE PRPR_PREF = NEW.prpr_pref AND PRPR_NUMERO = NEW.prpr_numero INTO :EXISTE;
if (EXISTE = 'S') then
    EXCEPTION DOCUMENTO_REGISTRADO 'Ya existe una progrmaciÃ³n con el nÃºmero ' || new.prpr_pref || new.prpr_numero;
end^

SET TERM ; ^

grant select, delete, insert, update on prog_produccion to PUBLIC;

/* INICIALIZAR NUMFAC EN CERO */
SET TERM ^ ;

CREATE OR ALTER procedure CONTABIL_NOTACRPR (
    IDDOC integer,
    IDINTER integer)
returns (
    ERROR integer,
    VER char(1),
    IDC integer)
as
declare variable PREF VARCHAR(4);
declare variable NUM VARCHAR(6);
declare variable NUMERO VARCHAR(12);
declare variable FECAUX DATE;
declare variable FECHA CHAR(8);
declare variable CONC CHAR(120);
declare variable VRSUBT NUMERIC(18, 2);
declare variable BASE0 NUMERIC(18, 2);
declare variable BASE1 NUMERIC(18, 2);
declare variable BASE2 NUMERIC(18, 2);
declare variable VRIVA NUMERIC(18, 2);
declare variable IVA1 NUMERIC(18, 2);
declare variable IVA2 NUMERIC(18, 2);
declare variable PRTFTE NUMERIC(9, 2);
declare variable VRRTFTE NUMERIC(18, 2);
declare variable VRRTIVA NUMERIC(18, 2);
declare variable PRTICA NUMERIC(9, 2);
declare variable VRRTICA NUMERIC(18, 2);
declare variable PRTCREE NUMERIC(9, 2);
declare variable VRRTCREE NUMERIC(18, 2);
declare variable VRTOTAL NUMERIC(18, 2);
declare variable TIPOCOMP VARCHAR(3);
declare variable PREFCONT VARCHAR(4);
declare variable BASE CHAR(1);
declare variable CTABASE VARCHAR(20);
declare variable IVA CHAR(1);
declare variable CTAIVA VARCHAR(20);
declare variable CLIE CHAR(1);
declare variable CTACLIE VARCHAR(20);
declare variable RTFTE CHAR(1);
declare variable CTARTFTE VARCHAR(20);
declare variable RTIVA CHAR(1);
declare variable CTARTIVA VARCHAR(20);
declare variable RTICA CHAR(1);
declare variable CTARTICA VARCHAR(20);
declare variable RTCREE CHAR(1);
declare variable CTARTCREE VARCHAR(20);
declare variable EXISTE CHAR(1);
declare variable CUENTA VARCHAR(20);
declare variable MONTO NUMERIC(18,2);
declare variable ES_RETENCION CHAR(1);
declare variable TIPOCUEN CHAR(1);
declare variable NIT VARCHAR(20);
declare variable NOMBRE VARCHAR(60);
declare variable PROY VARCHAR(4);
declare variable CENTRO VARCHAR(4);
declare variable SUBCENT VARCHAR(4);
declare variable PORC NUMERIC(5,2);
declare variable DEBITO NUMERIC(18,2);
declare variable CREDITO NUMERIC(18,2);
declare variable NROI INTEGER;
declare variable SUMA NUMERIC(18,2);
declare variable TCTACLIEN VARCHAR(20);
declare variable TCTABASE VARCHAR(20);
declare variable TCTARTFTE VARCHAR(20);
declare variable TCTARTIVA VARCHAR(20);
declare variable TCTARTICA VARCHAR(20);
declare variable TCTARTCREE VARCHAR(20);
declare variable BASEADIC VARCHAR(20);
declare variable PORCADIC NUMERIC(5,2);
declare variable VALORADIC NUMERIC(18,2);
declare variable DBADIC CHAR(1);
declare variable CUENTAADIC VARCHAR(20);
declare variable ANULADO CHAR(1);
declare variable MONTOBASE NUMERIC(18,2);
declare variable TARIFA INTEGER;
declare variable TIPODS INTEGER;
declare variable NUMEROFAC VARCHAR(12);
declare variable PREFAC VARCHAR(4);
declare variable NUMFAC VARCHAR(8);
declare variable AUTOFAC VARCHAR(30);
declare variable NUMPROV VARCHAR(20);
BEGIN
ERROR = 0;
/* BUSQUE LA INTERFACE */
EXISTE = 'N';
SELECT 'S', TICO_COD, PRCO_PRE, INCP_BASE, INCP_IVA, INCP_RTFTE, INCP_RTIVA, INCP_RTICA, INCP_RTCREE, INCP_PROV,
    INCP_CTABASE, INCP_CTAIVA, INCP_CTARTFTE, INCP_CTARTIVA, INCP_CTARTICA, INCP_CTARTCREE, INCP_CTAPROV, INCP_CONFIRMAR
  FROM INTERFAZ_CXPAGAR
  WHERE INCP_ID = :IDINTER
  INTO :EXISTE, :TIPOCOMP, :PREFCONT, :BASE, :IVA, :RTFTE, :RTIVA, :RTICA, :RTCREE, :CLIE,
    :CTABASE, :CTAIVA, :CTARTFTE, :CTARTIVA, :CTARTICA, :CTARTCREE, :CTACLIE, :VER;

if (EXISTE = 'S') then
  BEGIN
  /* BORRE CUALQUEIR CONTABILIZACION PREVIA */
  DELETE FROM CONTABILIZACION WHERE CNTB_TIPOREF = 52 AND CNTB_IDREF = :IDDOC;
  /* TRAIGA EL ENCABEZADO DE LA NOTA */
  SELECT PREF_PRE, NCPR_NUMERO, NCPR_FECHA, N.TERC_NIT, NCPR_CONC, NCPR_IVAMONTO, NCPR_MONTO, NCPR_RTFTEPORC, NCPR_RTFTEMONTO,
    NCPR_RTIVAPORC, NCPR_RTIVAMONTO, NCPR_RTICAPORC, NCPR_RTICAMONTO, NCPR_RTCREE, NCPR_RTCREEM, TERC_NOM, TERC_CTAVENTA,
    TERC_CTARTFTE, TERC_CTARTIVA, TERC_CTARTICA, TERC_CTARCREE, TERC_CTACLIENTE, NCPR_ANULADO, NCPR_BASE0, NCPR_BASE1, NCPR_BASE2,
    NCPR_IVA1, NCPR_IVA2, NCPR_TIPODS, NCPR_DOCSOPORTE, NCPR_NUMPROV
    FROM NOTAS_CREDITO_PROVEEDOR N, TERCEROS T
    WHERE NCPR_ID = :IDDOC AND N.TERC_NIT = T.TERC_NIT
    INTO :PREF, :NUM, :FECAUX, :NIT, :CONC, :VRIVA, :VRTOTAL, :PRTFTE, :VRRTFTE,
    :PORC, :VRRTIVA, :PRTICA, :VRRTICA, :prtcree, :vrrtcree, :NOMBRE, TCTABASE,
    TCTARTFTE, TCTARTIVA, TCTARTICA, tctartcree, TCTACLIEN, ANULADO, :BASE0, BASE1, :BASE2, :IVA1, :IVA2, :TIPODS, :NUMEROFAC, :NUMPROV;
  if (ANULADO = 'N') then
    BEGIN
    if (NUMEROFAC <> '') then
        BEGIN
        PREFAC = left(numerofac,  STRLEN(NUMEROFAC)-6);
        NUMFAC = right(NUMEROFAC, 6);
        END
    ELSE
        execute procedure SEPARAR_PREFIJO_NUMERO(:NUMPROV) returning_values :PREFAC, :NUMFAC;
    if ((NUMFAC = '') or (numfac IS NULL)) then
        NUMFAC = '0';
    SELECT PREF_CENTRO, PREF_PROY, PREF_SUBC FROM PREFIJOS P, NOTAS_CREDITO_PROVEEDOR N
        WHERE P.PREF_PRE = N.PREF_PRE AND P.TIDO_COD = 52 AND NCPR_ID = :IDDOC INTO :CENTRO, :PROY, :subcent;
    /* SI ES PROVEEDOR, SOBREESCIBE LAS CUENTAS  */
    SELECT PROV_CTAPAGAR, PROV_CTARTFTE, PROV_CTARTIVA, PROV_CTARTICA, PROV_CTACAUSA, PROV_CTARTCREE
        FROM PROVEEDORES WHERE TERC_NIT = :NIT
        INTO TCTACLIEN, TCTARTFTE, TCTARTIVA, TCTARTICA, TCTABASE, tctartcree;
        
    /* SI EL DOCUMENTO ESPECIFICA ALGUNAS SOBRESCRIBA LAS DEL PROVEEDOR */
    SELECT NCPR_CTAPAGAR, NCPR_CTACAUSA
        FROM NOTAS_CREDITO_PROVEEDOR N
        WHERE NCPR_ID = :IDDOC
        INTO :TCTACLIEN, TCTABASE;
    NUMERO = PREF || NUM;
    VRSUBT = VRTOTAL; /* BASE DE RETEFTE Y RETEICA */

    EXECUTE PROCEDURE FECHA_A_CONTA(:FECAUX) returning_values (:FECHA);

    /* REGISTRE EL ENCABEZADO CONTABLE */
    IDC = GEN_ID(ID_CONTABILIZA, 1);
    INSERT INTO CONTABILIZACION (CNTB_ID, CNTB_TIPOCOMP, CNTB_PREFCNT, CNTB_NUMERO, CNTB_FECHA, CNTB_CONCEPTO, CNTB_REF, CNTB_TIPOREF, CNTB_IDREF, CNTB_PREFREF, CNTB_NUMREF, CNTB_PROCESADO)
        VALUES (:IDC, :TIPOCOMP, :PREFCONT, :NUM, :FECHA, :CONC, '', 52, :IDDOC, :PREF, :NUM, 'N');

    NROI = 0;
    SUMA = 0;

    IF ((BASE = 'T') OR (BASE = 'K')) THEN
        BEGIN
        IF (BASE = 'T') THEN
            CTABASE = TCTABASE;

        if (VRSUBT <> 0) then
            BEGIN
            CUENTA = NULL;
            SELECT CUEN_COD, CUEN_TIPO, CUEN_RETENCION FROM CUENTAS
                WHERE CUEN_COD = :CTABASE INTO :CUENTA, :TIPOCUEN, :ES_RETENCION;
            if (CUENTA IS NULL) then
                begin
                EXECUTE PROCEDURE ERRORINT (52, :IDDOC, :CTABASE, 2);
                CUENTA = CTABASE;
                ERROR = ERROR + 1;
                end
            if (ES_RETENCION = 'S') then
                if (PORC <> 0) then
                    montobase = FLOOR(VRSUBT / PORC * -1);
                else
                    montobase = VRSUBT * -1;
            else
                montobase = 0;
            if (TIPOCUEN = 'I') then
                BEGIN
                EXECUTE PROCEDURE ERRORINT (52, :IDDOC, :CUENTA, 3);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_SUBC, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON, CNDE_PREF, CNDE_FOLIOE)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRSUBT, :MONTOBASE, :PORC, :NIT, :PROY, :CENTRO, :SUBCENT, :NUMERO, NULL, :FECHA, NULL, 0, 52, :PREFAC, CAST(:NUMFAC AS INTEGER));
                NROI = NROI + 1;
                SUMA = SUMA - VRSUBT;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_SUBC, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON, CNDE_PREF, CNDE_FOLIOE)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRSUBT, :MONTOBASE, :PORC, :NIT, :PROY, :CENTRO, :SUBCENT, NULL, NULL, NULL, NULL, 0, 0, :PREFAC, CAST(:NUMFAC AS INTEGER));
                NROI = NROI + 1;
                SUMA = SUMA - VRSUBT;
                END
            END /* MONTO <> 0 */
        END /* BASE TERCERO O CONSTANTE */
    IF ((BASE = 'I')) THEN
        BEGIN
        FOR SELECT TAIV_CTACOMP, TAIV_COD FROM TARIFA_IVA WHERE TAIV_COD <= 2 INTO :CTABASE, :tarifa
            DO
            BEGIN
            if (TARIFA = 0) then
                vrsubt = BASE0;
            if (TARIFA = 1) then
                vrsubt = BASE1;
            if (TARIFA = 2) then
                vrsubt = BASE2;
            if (VRSUBT <> 0) then
                BEGIN
                CUENTA = NULL;
                SELECT CUEN_COD, CUEN_TIPO, CUEN_RETENCION FROM CUENTAS
                    WHERE CUEN_COD = :CTABASE INTO :CUENTA, :TIPOCUEN, :ES_RETENCION;
                if (CUENTA IS NULL) then
                    begin
                    EXECUTE PROCEDURE ERRORINT (52, :IDDOC, :CTABASE, 2);
                    CUENTA = CTABASE;
                    ERROR = ERROR + 1;
                    end
                montobase = 0;
                if (TIPOCUEN = 'I') then
                    BEGIN
                    EXECUTE PROCEDURE ERRORINT (52, :IDDOC, :CUENTA, 3);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_SUBC, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON, CNDE_PREF, CNDE_FOLIOE)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRSUBT, :MONTOBASE, :PORC, :NIT, :PROY, :CENTRO, :SUBCENT, :NUMERO, NULL, :FECHA, NULL, 0, 52, :PREFAC, CAST(:NUMFAC AS INTEGER));
                    NROI = NROI + 1;
                    SUMA = SUMA - VRSUBT;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_SUBC, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON, CNDE_PREF, CNDE_FOLIOE)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRSUBT, :MONTOBASE, :PORC, :NIT, :PROY, :CENTRO, :SUBCENT, NULL, NULL, NULL, NULL, 0, 0, :PREFAC, CAST(:NUMFAC AS INTEGER));
                    NROI = NROI + 1;
                    SUMA = SUMA - VRSUBT;
                    END
                END /* MONTO <> 0 */
            END /* FOR */
        END /* BASE TARIFA IVA */

    if (IVA = 'I') then /* IVA X TARIFA */
        BEGIN
        FOR SELECT TAIV_CTAIVACMP, TAIV_COD, TAIV_PORC FROM TARIFA_IVA WHERE (TAIV_COD <> 0) AND (TAIV_COD <= 2) INTO :CTAIVA, :tarifa, :PORC
            DO
            BEGIN
            if (TARIFA = 1) then
                BEGIN
                VRIVA = IVA1;
                vrsubt = BASE1 * -1;
                END
            if (TARIFA = 2) then
                BEGIN
                VRIVA = IVA2;
                vrsubt = BASE2 * -1;
                END
            if (VRIVA <> 0) then
                BEGIN
                CUENTA = NULL;
                SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                    WHERE CUEN_COD = :CTAIVA INTO :CUENTA, :TIPOCUEN;
                if (CUENTA IS NULL) then
                    begin
                    EXECUTE PROCEDURE ERRORINT (52, :IDDOC, :CTAIVA, 2);
                    CUENTA = CTAIVA;
                    ERROR = ERROR + 1;
                    end
                if (TIPOCUEN = 'I') then
                    BEGIN
                    EXECUTE PROCEDURE ERRORINT (52, :IDDOC, :CUENTA, 3);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_SUBC, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON, CNDE_PREF, CNDE_FOLIOE)
                        VALUES (:IDC, :NROI, :CTAIVA, :CONC, '', 0, :VRIVA, :VRSUBT, :PORC, :NIT, :PROY, :CENTRO, :SUBCENT, :NUMERO, NULL, :FECHA, NULL, 0, 52, :PREFAC, CAST(:NUMFAC AS INTEGER));
                    NROI = NROI + 1;
                    SUMA = SUMA - VRIVA;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_SUBC, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON, CNDE_PREF, CNDE_FOLIOE)
                        VALUES (:IDC, :NROI, :CTAIVA, :CONC, '', 0, :VRIVA, :VRSUBT, :PORC, :NIT, :PROY, :CENTRO, :SUBCENT, NULL, NULL, NULL, NULL, 0, 0, :PREFAC, CAST(:NUMFAC AS INTEGER));
                    NROI = NROI + 1;
                    SUMA = SUMA - VRIVA;
                    END
                END /* VRIVA <> 0 */
            END /* FOR */
        END /* IVA EN CTA CONSTANTE */
        
    VRSUBT = VRTOTAL; /* BASE DE RETEFTE Y RETEICA */
    if (IVA = 'K') then /* IVA EN CTA CONSTANTE */
        BEGIN
        if (VRIVA <> 0) then
            BEGIN
            CUENTA = NULL;
            SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :CTAIVA INTO :CUENTA, :TIPOCUEN;
            if (CUENTA IS NULL) then
                begin
                EXECUTE PROCEDURE ERRORINT (52, :IDDOC, :CTAIVA, 2);
                CUENTA = CTAIVA;
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'I') then
                BEGIN
                EXECUTE PROCEDURE ERRORINT (52, :IDDOC, :CUENTA, 3);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_SUBC, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON, CNDE_PREF, CNDE_FOLIOE)
                    VALUES (:IDC, :NROI, :CTAIVA, :CONC, '', 0, :VRIVA, :VRSUBT*-1, :PORC, :NIT, :PROY, :CENTRO, :SUBCENT, :NUMERO, NULL, :FECHA, NULL, 0, 52, :PREFAC, CAST(:NUMFAC AS INTEGER));
                NROI = NROI + 1;
                SUMA = SUMA - VRIVA;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_SUBC, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON, CNDE_PREF, CNDE_FOLIOE)
                    VALUES (:IDC, :NROI, :CTAIVA, :CONC, '', 0, :VRIVA, :VRSUBT*-1, :PORC, :NIT, :PROY, :CENTRO, :SUBCENT, NULL, NULL, NULL, NULL, 0, 0, :PREFAC, CAST(:NUMFAC AS INTEGER));
                NROI = NROI + 1;
                SUMA = SUMA - VRIVA;
                END
            END /* VRIVA <> 0 */
        END /* IVA EN CTA CONSTANTE */
        
    /* RETENCION FUENTE */
    if ((RTFTE = 'T') or (RTFTE = 'K')) then
      if (VRRTFTE <> 0) then
        BEGIN
        if (RTFTE = 'T') then
            CTARTFTE = TCTARTFTE;
            
        CUENTA = NULL;
        SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
            WHERE CUEN_COD = :CTARTFTE INTO :CUENTA, :TIPOCUEN;
        if (CUENTA IS NULL) then
            begin
            EXECUTE PROCEDURE ERRORINT (52, :IDDOC, :CTARTFTE, 2);
            CUENTA = CTARTFTE;
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            EXECUTE PROCEDURE ERRORINT (52, :IDDOC, :CUENTA, 3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'C') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_SUBC, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON, CNDE_PREF, CNDE_FOLIOE)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTFTE, 0, :VRSUBT, :PRTFTE, :NIT, :PROY, :CENTRO, :SUBCENT, :NUMERO, NULL, :FECHA, NULL, 0, 52, :PREFAC, CAST(:NUMFAC AS INTEGER));
            NROI = NROI + 1;
            SUMA = SUMA + VRRTFTE;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_SUBC, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON, CNDE_PREF, CNDE_FOLIOE)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTFTE, 0, :VRSUBT, :PRTFTE, :NIT, :PROY, :CENTRO, :SUBCENT, NULL, NULL, NULL, NULL, 0, 0, :PREFAC, CAST(:NUMFAC AS INTEGER));
            NROI = NROI + 1;
            SUMA = SUMA + VRRTFTE;
            END
        END /* RTFTE */
        
    /* RETENCION IVA */
    if ((RTIVA = 'T') or (RTIVA = 'K')) then
      if (VRRTIVA <> 0) then
        BEGIN
        if (RTIVA = 'T') then
            CTARTIVA = TCTARTIVA;
            
        CUENTA = NULL;
        SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
            WHERE CUEN_COD = :CTARTIVA INTO :CUENTA, :TIPOCUEN;
        if (CUENTA IS NULL) then
            begin
            EXECUTE PROCEDURE ERRORINT (52, :IDDOC, :CTARTIVA, 2);
            CUENTA = CTARTIVA;
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            EXECUTE PROCEDURE ERRORINT (52, :IDDOC, :CUENTA, 3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'C') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_SUBC, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON, CNDE_PREF, CNDE_FOLIOE)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTIVA, 0, :VRIVA, :PORC, :NIT, :PROY, :CENTRO, :SUBCENT, :NUMERO, NULL, :FECHA, NULL, 0, 52, :PREFAC, CAST(:NUMFAC AS INTEGER));
            NROI = NROI + 1;
            SUMA = SUMA + VRRTIVA;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_SUBC, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON, CNDE_PREF, CNDE_FOLIOE)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTIVA, 0, :VRIVA, :PORC, :NIT, :PROY, :CENTRO, :SUBCENT, NULL, NULL, NULL, NULL, 0, 0, :PREFAC, CAST(:NUMFAC AS INTEGER));
            NROI = NROI + 1;
            SUMA = SUMA + VRRTIVA;
            END
        END /* RTIVA */
        
    /* RETENCION DE ICA */
    if ((RTICA = 'T') or (RTICA = 'K')) then
      if (VRRTICA <> 0) then
        BEGIN
        if (RTICA = 'T') then
            CTARTICA = TCTARTICA;
            
        CUENTA = NULL;
        SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
            WHERE CUEN_COD = :CTARTICA INTO :CUENTA, :TIPOCUEN;
        if (CUENTA IS NULL) then
            begin
            EXECUTE PROCEDURE ERRORINT (52, :IDDOC, :CTARTICA, 2);
            CUENTA = CTARTICA;
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            EXECUTE PROCEDURE ERRORINT (52, :IDDOC, :CUENTA, 3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'C') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_SUBC, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON, CNDE_PREF, CNDE_FOLIOE)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTICA, 0, :VRSUBT, :PRTICA, :NIT, :PROY, :CENTRO, :SUBCENT, :NUMERO, NULL, :FECHA, NULL, 0, 52, :PREFAC, CAST(:NUMFAC AS INTEGER));
            NROI = NROI + 1;
            SUMA = SUMA + VRRTICA;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_SUBC, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON, CNDE_PREF, CNDE_FOLIOE)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTICA, 0, :VRSUBT, :PRTICA, :NIT, :PROY, :CENTRO, :SUBCENT, NULL, NULL, NULL, NULL, 0, 0, :PREFAC, CAST(:NUMFAC AS INTEGER));
            NROI = NROI + 1;
            SUMA = SUMA + VRRTICA;
            END
        END /* RTICA */
    /* RETENCION CREE */
    if ((rtcree = 'T') or (rtcree = 'K')) then
      if (vrrtcree <> 0) then
        BEGIN
        if (rtcree = 'T') then
            ctartcree = tctartcree;
            
        CUENTA = NULL;
        SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
            WHERE CUEN_COD = :ctartcree INTO :CUENTA, :TIPOCUEN;
        if (CUENTA IS NULL) then
            begin
            EXECUTE PROCEDURE ERRORINT (52, :IDDOC, :ctartcree, 2);
            CUENTA = ctartcree;
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            EXECUTE PROCEDURE ERRORINT (52, :IDDOC, :CUENTA, 3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'C') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON, CNDE_PREF, CNDE_FOLIOE)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :vrrtcree, 0, :VRSUBT, :prtcree, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 52, :PREFAC, CAST(:NUMFAC AS INTEGER));
            NROI = NROI + 1;
            SUMA = SUMA + vrrtcree;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON, CNDE_PREF, CNDE_FOLIOE)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :vrrtcree, 0, :VRSUBT, :prtcree, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0, :PREFAC, CAST(:NUMFAC AS INTEGER));
            NROI = NROI + 1;
            SUMA = SUMA + vrrtcree;
            END
        END /* RTCREE */
    /* recorra las cuentas adicionales */
    FOR SELECT INPC_CUENTA, INPC_BASE, INPC_PORC, INPC_VALOR, INPC_DB
        FROM INTERFAZ_CXPAGAR_CTAS
        WHERE INCP_ID = :IDINTER
        INTO :CUENTAADIC, :BASEADIC, :PORCADIC, :VALORADIC, :DBADIC
        DO
        BEGIN
        if (:BASEADIC = 'SUBTOTAL') then
            VALORADIC = VRTOTAL - VRIVA;
        if (:BASEADIC = 'IVA') then
            VALORADIC = VRIVA;
        if (:BASEADIC = 'TOTAL') then
            VALORADIC = VRTOTAL;
        MONTO = VALORADIC * PORCADIC;
        
        /* TRAIGA LAS CARACTERISTICAS DE LA CUENTA */
        CUENTA = NULL;
        SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
            WHERE CUEN_COD = :CUENTAADIC INTO :CUENTA, :TIPOCUEN;
        IF (CUENTA IS NULL) THEN
            begin
            EXECUTE PROCEDURE ERRORINT (52, :IDDOC, :CUENTAADIC, 2);
            CUENTA = CUENTAADIC;
            ERROR = ERROR + 1;
            end
        /* DEPENDE DEL TIPO DE CUENTA */
        if (TIPOCUEN = 'I') then
            BEGIN
            EXECUTE PROCEDURE ERRORINT (52, :IDDOC, :CUENTA, 3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'C') then
            BEGIN
            if (DBADIC = 'S') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_SUBC, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON, CNDE_PREF, CNDE_FOLIOE)
                    VALUES (:IDC, :NROI, :CUENTAADIC, :CONC, '', :MONTO, 0, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, :SUBCENT, :NUMERO, NULL, :FECHA, NULL, 0, 52, :PREFAC, CAST(:NUMFAC AS INTEGER));
                SUMA = SUMA + MONTO;
                END
            ELSE
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_SUBC, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON, CNDE_PREF, CNDE_FOLIOE)
                    VALUES (:IDC, :NROI, :CUENTAADIC, :CONC, '', 0, :MONTO, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, :SUBCENT, :NUMERO, NULL, :FECHA, NULL, 0, 52, :PREFAC, CAST(:NUMFAC AS INTEGER));
                SUMA = SUMA - MONTO;
                END
            NROI = NROI + 1;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            if (DBADIC = 'S') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_SUBC, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON, CNDE_PREF, CNDE_FOLIOE)
                    VALUES (:IDC, :NROI, :CUENTAADIC, :CONC, '', :MONTO, 0, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, :SUBCENT, NULL, NULL, NULL, NULL, 0, 0, :PREFAC, CAST(:NUMFAC AS INTEGER));
                SUMA = SUMA + MONTO;
                END
            ELSE
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_SUBC, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON, CNDE_PREF, CNDE_FOLIOE)
                    VALUES (:IDC, :NROI, :CUENTAADIC, :CONC, '', 0, :MONTO, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, :SUBCENT, NULL, NULL, NULL, NULL, 0, 0, :PREFAC, CAST(:NUMFAC AS INTEGER));
                SUMA = SUMA - MONTO;
                END
            NROI = NROI + 1;
            END
        
        NROI = NROI + 1;
        END
        
    /* CIERRE EL COMPROBANTE CONTRA LA CUENTA DEL TERCERO O LA CONSTANTE */
    if ((SUMA <> 0) and ((CLIE = 'T') or (CLIE = 'K'))) then
        BEGIN
        if (SUMA < 0) then
            BEGIN
            DEBITO = SUMA * -1;
            CREDITO = 0;
            END
        ELSE
            BEGIN
            DEBITO = 0;
            CREDITO = SUMA;
            END
        if (CLIE = 'T') then
            CTACLIE = TCTACLIEN;

        CUENTA = NULL;
        SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
            WHERE CUEN_COD = :CTACLIE INTO :CUENTA, :TIPOCUEN;
        IF (CUENTA IS NULL) then
            begin
            EXECUTE PROCEDURE ERRORINT (52, :IDDOC, :CTACLIE, 2);
            CUENTA = CTACLIE;
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            EXECUTE PROCEDURE ERRORINT (52, :IDDOC, :CUENTA, 3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'C') then
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_SUBC, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON, CNDE_PREF, CNDE_FOLIOE)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :DEBITO, :CREDITO, 0, 0, :NIT, :PROY, :CENTRO, :SUBCENT, :NUMERO, NULL, :FECHA, NULL, 0, 52, :PREFAC, CAST(:NUMFAC AS INTEGER));
        if (TIPOCUEN = 'N') then
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_SUBC, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON, CNDE_PREF, CNDE_FOLIOE)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :DEBITO, :CREDITO, 0, 0, :NIT, :PROY, :CENTRO, :SUBCENT, NULL, NULL, NULL, NULL, 0, 0, :PREFAC, CAST(:NUMFAC AS INTEGER));
        NROI = NROI + 1;
        END /* SUMA EN CARTERA */
    if (ERROR > 0) then
        VER = 'S';
    SUSPEND;
    END /* NO ANULADO */
  END /* EXISTE LA INTERFAZ */
ELSE
    BEGIN
    EXECUTE PROCEDURE ERRORINT (52, :IDDOC, :PREF, 1);
    ERROR = ERROR + 1;
    VER = 'S';
    SUSPEND;
    END
END^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE NOTACRPR_SIN_CONTABILIDAD(
    FECINI DATE,
    FECFIN DATE)
RETURNS (
    ID INTEGER,
    IDI INTEGER,
    IDC INTEGER,
    PREF VARCHAR(4),
    NUMERO VARCHAR(6),
    ESTADO VARCHAR(20),
    ERROR INTEGER)
AS
DECLARE VARIABLE VER CHAR(2);
declare variable FECICNT VARCHAR(10);
declare variable FECFCNT VARCHAR(10);
declare variable idref INTEGER;
BEGIN
EXECUTE PROCEDURE fecha_a_conta(FECINI) returning_values (FECICNT);
EXECUTE PROCEDURE fecha_a_conta(FECFIN) returning_values (FECFCNT);
FOR SELECT NCPR_ID, PREF_PRE, NCPR_NUMERO FROM NOTAS_CREDITO_PROVEEDOR WHERE NCPR_ANULADO = 'N' AND
    NCPR_FECHA >= :FECINI AND NCPR_FECHA <= :FECFIN
    ORDER BY NCPR_ID INTO :ID, :PREF, :NUMERO
DO
  BEGIN
  idref = null;
  SELECT ENCO_IDREF FROM COMPROBANTE_ENCABEZADO WHERE ENCO_TIPOREF = 52 AND ENCO_FECHA >= :FECICNT AND ENCO_FECHA <= :FECFCNT and ENCO_IDREF = :id into :idref;
  if (idref IS NULL) then
  begin
  ESTADO = 'PROCESANDO';
  SUSPEND;
  SELECT MAX(INCA_ID) FROM INTERFAZ_CARTERA WHERE PREF_PRE = :PREF AND TIDO_COD = 52 INTO :IDI;
  if (IDI IS NOT NULL) then
    BEGIN
    EXECUTE PROCEDURE CONTABIL_NOTACRPR (:ID, :IDI) RETURNING_VALUES (:ERROR, :VER, :IDC);
    if (ERROR = 0) then
      BEGIN
      EXECUTE PROCEDURE CONTABILIZA_PENDIENTE (:IDC);
      ESTADO = 'OK';
      END
    ELSE
      ESTADO = 'ERROR';
    suspend;
    END
  end
  END
END^

SET TERM ; ^

insert into CONFIGURACION (CONF_MODULO, CONF_CATEGORIA, CONF_PROPIEDAD, CONF_VALOR, CONF_POSIBLES, CONF_AYUDA) values ('INVENTARIO','ARTICULOS','REPLICAR GRUPOS DE ARTICULOS', 'NO', 'SI,NO', 'SI:Cualquier cambio o nueva familia-grupo-subgrupo se replica  las companias configuradas');
commit work;



CREATE TABLE GRUPO_CONTABLE (
    GRCO_COD          VARCHAR(4) NOT NULL /* VARCHAR(4) */,
    GRCO_NOM          T_CONCEPTO /* T_CONCEPTO = VARCHAR(60) */,
    GRCO_CTAINV       T_CTA_CONTABLE /* T_CTA_CONTABLE = VARCHAR(20) */,
    GRCO_CTAVNT       T_CTA_CONTABLE /* T_CTA_CONTABLE = VARCHAR(20) */,
    GRCO_CTACMP       T_CTA_CONTABLE /* T_CTA_CONTABLE = VARCHAR(20) */,
    GRCO_CTACOS       T_CTA_CONTABLE /* T_CTA_CONTABLE = VARCHAR(20) */,
    GRCO_CTAIVAV      T_CTA_CONTABLE /* T_CTA_CONTABLE = VARCHAR(20) */,
    GRCO_CTAIVAC      T_CTA_CONTABLE /* T_CTA_CONTABLE = VARCHAR(20) */,
    GRCO_CTADEV       T_CTA_CONTABLE /* T_CTA_CONTABLE = VARCHAR(20) */,
    GRCO_CTARTFV      T_CTA_CONTABLE /* T_CTA_CONTABLE = VARCHAR(20) */,
    GRCO_CTARTFC      T_CTA_CONTABLE /* T_CTA_CONTABLE = VARCHAR(20) */,
    GRCO_CTAIVADV     T_CTA_CONTABLE /* T_CTA_CONTABLE = VARCHAR(20) */,
    GRCO_CTAIVADC     T_CTA_CONTABLE /* T_CTA_CONTABLE = VARCHAR(20) */
);

ALTER TABLE GRUPO_CONTABLE ADD CONSTRAINT PK_GRUPO_CONTABLE PRIMARY KEY (GRCO_COD);

SET TERM ^ ;

CREATE OR ALTER TRIGGER GRUPO_CONTABLE_AD FOR GRUPO_CONTABLE
ACTIVE AFTER DELETE POSITION 0
as
begin
INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
    VALUES (USER, 206, 1, 'D', OLD.GRCO_cod);
end^

CREATE OR ALTER TRIGGER GRUPO_CONTABLE_AI FOR GRUPO_CONTABLE
ACTIVE AFTER INSERT POSITION 0
as
begin
INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
    VALUES (USER, 206, 1, 'I', NEW.GRCO_cod);
end^

CREATE OR ALTER TRIGGER GRUPO_CONTABLE_AU FOR GRUPO_CONTABLE
ACTIVE AFTER UPDATE POSITION 0
as
begin
INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
    VALUES (USER, 206, 1, 'U', NEW.GRCO_cod);
end^

SET TERM ; ^

GRANT ALL ON GRUPO_CONTABLE TO PUBLIC;

ALTER TABLE ARTICULO
ADD GRCO_COD VARCHAR(4);

ALTER TABLE ARTICULO
ADD ARTI_CONSERVACION VARCHAR(250);

ALTER TABLE GRUPO_CONTABLE
ADD GRCO_RTICA T_CTA_CONTABLE;

ALTER TABLE GRUPO_CONTABLE
ADD GRCO_RTICAV T_CTA_CONTABLE;



