/* 20140326 */
/* fecha de bloqueo administrativo independiente de la contabilidad */
INSERT INTO CONFIGURACION (CONF_MODULO, CONF_CATEGORIA, CONF_PROPIEDAD, CONF_VALOR, CONF_POSIBLES, CONF_AYUDA) VALUES ('GENERAL', 'GENERAL', 'FECHA DE BLOQUEO ADMINISTRATIVO', '2013/01/01', '', 'Indique la fecha en formato aaaa/mm/dd a la que se cerrarán los módulos distintos a la contabilidad');
commit work;

/* 20140327 */
SET TERM ^ ;

CREATE OR ALTER procedure BALANCE_MES (
    ANO char(4),
    MES integer,
    SIN_MOV char(1),
    SIMULACIERRE char(1),
    NOTAS char(1))
returns (
    CODIGO varchar(20),
    NOMBRE varchar(60),
    INICIAL numeric(18,2),
    DEBITOS numeric(18,2),
    CREDITOS numeric(18,2),
    FINAL numeric(18,2),
    SCLASE numeric(18,2),
    SGRUPO numeric(18,2),
    SSUBGRUPO numeric(18,2),
    SCUENTA numeric(18,2),
    MCLASE numeric(18,2),
    MGRUPO numeric(18,2),
    MSUBGRUPO numeric(18,2),
    MCUENTA numeric(18,2),
    NIVEL integer,
    MOVIMIEN numeric(18,2),
    UOP char(1))
AS
declare variable CTACIERREU VARCHAR(20);
declare variable CTACIERREP VARCHAR(20);
declare variable CIERRE NUMERIC(18,2);
declare variable AUX NUMERIC(18,2);
declare variable NRONOTA INTEGER;
DECLARE VARIABLE DIG INTEGER;
declare variable AFECTA CHAR(1);
BEGIN
/* CALCULE LA UTILIDAD DEL EJERCICIO */
EXECUTE PROCEDURE SALDO_CUENTA_MES('4', ANO, MES, 'N') RETURNING_VALUES (AUX);
CIERRE = AUX;
EXECUTE PROCEDURE SALDO_CUENTA_MES('5', ANO, MES, 'N') RETURNING_VALUES (AUX);
CIERRE = CIERRE + AUX;
EXECUTE PROCEDURE SALDO_CUENTA_MES('6', ANO, MES, 'N') RETURNING_VALUES (AUX);
CIERRE = CIERRE + AUX;
EXECUTE PROCEDURE SALDO_CUENTA_MES('7', ANO, MES, 'N') RETURNING_VALUES (AUX);
CIERRE = CIERRE + AUX;
if (CIERRE > 0) then
    UOP = 'P';
ELSE
    UOP = 'U';
if (SIMULACIERRE = 'S') then
    BEGIN
    EXECUTE PROCEDURE LEE_CONFIGURACION ('CONTABILIDAD', 'GENERAL', 'CUENTA DE UTILIDAD DEL EJERCICIO') returning_values (:CTACIERREU);
    EXECUTE PROCEDURE LEE_CONFIGURACION ('CONTABILIDAD', 'GENERAL', 'CUENTA DE PERDIDA DEL EJERCICIO') returning_values (:CTACIERREP);
    END
FOR SELECT CUEN_COD, CUEN_NOM, CUEN_AFECTABLE FROM CUENTAS order by CUEN_COD INTO CODIGO, NOMBRE, AFECTA
DO
  BEGIN
  EXECUTE PROCEDURE SALDO_CUENTA_MES(CODIGO, ANO, MES, 'S') RETURNING_VALUES (INICIAL);
  EXECUTE PROCEDURE MOVIMIENTO_CUENTA_MES(CODIGO, ANO, MES, 'S') RETURNING_VALUES(DEBITOS);
  EXECUTE PROCEDURE MOVIMIENTO_CUENTA_MES(CODIGO, ANO, MES, 'N') RETURNING_VALUES(CREDITOS);
  EXECUTE PROCEDURE VALIDE_ESTRUCTURA (CODIGO) RETURNING_VALUES (:NIVEL);
  EXECUTE PROCEDURE DIGITOS_NIVEL (:NIVEL) RETURNING_VALUES (:DIG);

  IF (SIMULACIERRE = 'S') THEN
    if (CIERRE > 0) then
      BEGIN
      IF (CODIGO = SUBSTR(CTACIERREP, 1, DIG)) then
        DEBITOS = DEBITOS + CIERRE;
      END
    else
      BEGIN
      IF (CODIGO = SUBSTR(CTACIERREU, 1, DIG)) then
        CREDITOS = CREDITOS + (CIERRE * -1);
      END
  FINAL = INICIAL + DEBITOS - CREDITOS;
  SCLASE = 0;
  SGRUPO = 0;
  SSUBGRUPO = 0;
  SCUENTA = 0;
  MCLASE = 0;
  MGRUPO = 0;
  MSUBGRUPO = 0;
  MCUENTA = 0;
--  MOVIMIEN = 0;
  MOVIMIEN = DEBITOS - CREDITOS;
  if (NIVEL = 1) then
    BEGIN
    SCLASE = FINAL;
    MCLASE = MOVIMIEN;
    END
  if (NIVEL = 2) then
    BEGIN
    SGRUPO = FINAL;
    MGRUPO = MOVIMIEN;
    END
  if (NIVEL = 3) then
    BEGIN
    SSUBGRUPO = FINAL;
    MSUBGRUPO = MOVIMIEN;
    END
  if (NIVEL > 3) then
    BEGIN
    SCUENTA = FINAL;
    MCUENTA = MOVIMIEN;
    END
  if ((SIN_MOV = 'S') or (FINAL <> 0) or (DEBITOS <> 0) or (CREDITOS <> 0) or (AFECTA = 'N') )then
      begin
      if (NOTAS = 'S') then
          BEGIN
          /* busque notas a los estados si las hay */
          NRONOTA = 0;
          SELECT NOEF_NUMERO FROM notas_estados_financieros WHERE NOEF_ANO = :ANO AND NOEF_PERIODO = :MES AND NOEF_CUENTA = :codigo INTO :NRONOTA;
          if (NRONOTA <> 0) then
            NOMBRE = NOMBRE || ' (Nota ' || :nronota || ')';
          SUSPEND;
          end
      ELSE
          SUSPEND;
      end
  END
END
^

SET TERM ; ^

/* 20140327 */
ALTER TABLE ACTIVOS_GRUPOS
ADD ACGR_TIPODEP T_ID;

ALTER TABLE ACTIVOS_FIJOS
ADD ACFJ_VRORIG T_MONTO;

ALTER TABLE ACTIVOS_FIJOS
ADD ACFJ_CTADETERD T_CTA_CONTABLE;

ALTER TABLE ACTIVOS_FIJOS
ADD ACFJ_CTADETERC T_CTA_CONTABLE;

/* 20140329 */
/* NO REPORTE CUENTAS TOTALMEMNTE EN CERO */
SET TERM ^ ;

CREATE OR ALTER procedure BALANCE_COMPARATIVO (
    ANO1 char(4),
    MES1 integer,
    ANO2 char(4),
    MES2 integer,
    TERCEROS char(1))
returns (
    CUENTA varchar(20),
    NOM_CUENTA varchar(60),
    NIT varchar(20),
    NOM_TERCERO varchar(60),
    INICIAL1 numeric(18,2),
    DEBITOS1 numeric(18,2),
    CREDITOS1 numeric(18,2),
    FINAL1 numeric(18,2),
    INICIAL2 numeric(18,2),
    DEBITOS2 numeric(18,2),
    CREDITOS2 numeric(18,2),
    FINAL2 numeric(18,2),
    TERCERO char(1),
    NIVEL integer,
    NOMCTATER varchar(60))
AS
DECLARE VARIABLE OK CHAR(1);
BEGIN
FOR SELECT CUEN_COD, CUEN_NOM FROM CUENTAS order by CUEN_COD INTO CUENTA, NOM_CUENTA
DO
  BEGIN
  EXECUTE PROCEDURE SALDO_CUENTA_MES(CUENTA, ANO1, MES1, 'S') RETURNING_VALUES (INICIAL1);
  EXECUTE PROCEDURE MOVIMIENTO_CUENTA_MES(CUENTA, ANO1, MES1, 'S') RETURNING_VALUES(DEBITOS1);
  EXECUTE PROCEDURE MOVIMIENTO_CUENTA_MES(CUENTA, ANO1, MES1, 'N') RETURNING_VALUES(CREDITOS1);
  FINAL1 = INICIAL1 + DEBITOS1 - CREDITOS1;
  EXECUTE PROCEDURE SALDO_CUENTA_MES(CUENTA, ANO2, MES2, 'S') RETURNING_VALUES (INICIAL2);
  EXECUTE PROCEDURE MOVIMIENTO_CUENTA_MES(CUENTA, ANO2, MES2, 'S') RETURNING_VALUES(DEBITOS2);
  EXECUTE PROCEDURE MOVIMIENTO_CUENTA_MES(CUENTA, ANO2, MES2, 'N') RETURNING_VALUES(CREDITOS2);
  FINAL2 = INICIAL2 + DEBITOS2 - CREDITOS2;
  NIT = '';
  NOM_TERCERO = '';
  EXECUTE PROCEDURE VALIDE_ESTRUCTURA (CUENTA) RETURNING_VALUES (:NIVEL);
  NOMCTATER = NOM_CUENTA;
  if (TERCEROS = 'S') then
    BEGIN
    EXECUTE PROCEDURE ES_AFECTABLE(CUENTA) RETURNING_VALUES (OK);
    IF (OK = 'S') THEN
        BEGIN
        FOR SELECT TERC_NIT, TERC_NOM FROM TERCEROS ORDER BY TERC_NIT INTO NIT, NOM_TERCERO
            DO
            BEGIN
            EXECUTE PROCEDURE SALDO_TERCERO_MES(CUENTA, NIT, ANO1, MES1, 'S') RETURNING_VALUES (INICIAL1);
            EXECUTE PROCEDURE MOVIMIENTO_TERCERO_MES(CUENTA, NIT, ANO1, MES1, 'S') RETURNING_VALUES(DEBITOS1);
            EXECUTE PROCEDURE MOVIMIENTO_TERCERO_MES(CUENTA, NIT, ANO1, MES1, 'N') RETURNING_VALUES(CREDITOS1);
            FINAL1 = INICIAL1 + DEBITOS1 - CREDITOS1;
            EXECUTE PROCEDURE SALDO_TERCERO_MES(CUENTA, NIT, ANO2, MES2, 'S') RETURNING_VALUES (INICIAL2);
            EXECUTE PROCEDURE MOVIMIENTO_TERCERO_MES(CUENTA, NIT, ANO2, MES2, 'S') RETURNING_VALUES(DEBITOS2);
            EXECUTE PROCEDURE MOVIMIENTO_TERCERO_MES(CUENTA, NIT, ANO2, MES2, 'N') RETURNING_VALUES(CREDITOS2);
            FINAL2 = INICIAL2 + DEBITOS2 - CREDITOS2;
            NOM_CUENTA = '';
            NOMCTATER = NOM_TERCERO;
            if ((final1 <> 0) or (inicial1 <> 0) or (debitos1 <> 0) or (creditos1 <> 0) or (final2 <> 0) or (inicial2 <> 0) or (debitos2 <> 0) or (creditos2 <> 0)) then
                SUSPEND;
            END
        END
    END
  ELSE
    if ((final1 <> 0) or (inicial1 <> 0) or (debitos1 <> 0) or (creditos1 <> 0) or (final2 <> 0) or (inicial2 <> 0) or (debitos2 <> 0) or (creditos2 <> 0)) then
        SUSPEND;
  END
END
^

SET TERM ; ^

/* 20140329B */
/* REEMPLACE LOS NULL POR CEROS EN MENOR CUANTIA */
SET TERM ^ ;

CREATE OR ALTER procedure MM_1001_9 (
    INICIO char(8),
    FINAL char(8))
AS
declare variable IDCONC INTEGER;
declare variable CONCEPTO INTEGER;
declare variable TIPODOC INTEGER;
declare variable NIT VARCHAR(15) CHARACTER SET NONE;
declare variable DV CHAR(1) CHARACTER SET NONE;
declare variable APELLIDO1 VARCHAR(60) CHARACTER SET NONE;
declare variable APELLIDO2 VARCHAR(60) CHARACTER SET NONE;
declare variable NOMBRE1 VARCHAR(60) CHARACTER SET NONE;
declare variable NOMBRE2 VARCHAR(60) CHARACTER SET NONE;
declare variable RAZONSOCIAL VARCHAR(450) CHARACTER SET NONE;
declare variable DIRECCION VARCHAR(200) CHARACTER SET NONE;
declare variable SIMPLIFICA CHAR(1) CHARACTER SET NONE;
declare variable DEPARTAMENTO CHAR(2) CHARACTER SET NONE;
declare variable MUNICIPIO CHAR(3) CHARACTER SET NONE;
declare variable PAIS CHAR(3) CHARACTER SET NONE;
declare variable PAGO NUMERIC(18,0);
declare variable PAGOND NUMERIC(18,0);
declare variable IVA NUMERIC(18,0);
declare variable IVAND NUMERIC(18,0);
declare variable RTFTE NUMERIC(18,0);
declare variable RTFTEA NUMERIC(18,0);
declare variable RTIVAC NUMERIC(18,0);
declare variable RTIVAS NUMERIC(18,0);
declare variable RTIVAND NUMERIC(18,0);
declare variable RTCREE NUMERIC(18,0);
declare variable RTCREEA NUMERIC(18,0);
declare variable DEBITOS NUMERIC(18,2);
declare variable CREDITOS NUMERIC(18,2);
declare variable MINIMO NUMERIC(18,2);
declare variable MENORCUANTIA NUMERIC(18,2);
declare variable MENORPAGOND NUMERIC(18,2);
declare variable MENORRTF NUMERIC(18,2);
declare variable MENORRTFA NUMERIC(18,2);
declare variable MENORRTC NUMERIC(18,2);
declare variable MENORRTCA NUMERIC(18,2);
declare variable MENORIVA NUMERIC(18,2);
declare variable MENORIVAND NUMERIC(18,2);
declare variable MENORRTIVAC NUMERIC(18,2);
declare variable MENORRTIVAS NUMERIC(18,2);
declare variable MENORRTIVAN NUMERIC(18,2);
declare variable TOTALTERC NUMERIC(18,2);
declare variable TOTALTDB NUMERIC(18,2);
declare variable TOTALTCR NUMERIC(18,2);
declare variable ITEM integer;
declare variable DIRMENOR VARCHAR(200) CHARACTER SET NONE;
declare variable DEPMENOR CHAR(2) CHARACTER SET NONE;
declare variable MUNMENOR CHAR(3) CHARACTER SET NONE;
declare variable PAISMENOR CHAR(3) CHARACTER SET NONE;
declare variable NATUR CHAR(1);
declare variable TIPOID CHAR(1);
begin
EXECUTE PROCEDURE lee_configuracion('CONTABILIDAD', 'GENERAL', 'NIT COMPAÑIA') returning_values (:NIT);
SELECT TERC_DIR, SUBSTR(CIUD_COD,1,2), SUBSTR(CIUD_COD,3,5), PAIS_ID FROM TERCEROS WHERE TERC_NIT = :NIT
    INTO :dirmenor, :depmenor, :munmenor, :paismenor;
ITEM = 0;
FOR SELECT COME_ITEM, COME_RESPUESTA, COME_MINIMO, COME_NATUR FROM CONFIGURA_MEDIOSMAG
    WHERE COME_FORMATO = '10019' ORDER BY COME_ITEM INTO :idconc, :CONCEPTO , :MINIMO, :NATUR
    DO
    BEGIN
    MENORCUANTIA = 0;
    MENORPAGOND = 0;
    MENORRTF = 0;
    MENORRTFA = 0;
    MENORIVA = 0;
    MENORIVAND = 0;
    MENORRTIVAC = 0;
    MENORRTIVAS = 0;
    MENORRTIVAN = 0;
    FOR SELECT MAX(D.TERC_NIT), SUM(CODE_DEBITO-CODE_CREDITO), SUM(CODE_DEBITO), SUM(CODE_CREDITO)
        FROM COMPROBANTE_DETALLE D, COMPROBANTE_ENCABEZADO E, mediosmag_cuentas M
        WHERE M.mmcu_item = :idconc AND SUBSTR(CUEN_COD,1,STRLEN(M.mmcu_cuenta)) = M.mmcu_cuenta AND m.mmcu_cuenta <> '' AND
        E.ENCO_CONSEC = D.ENCO_CONSEC AND ENCO_FECHA >= :INICIO AND ENCO_FECHA <= :FINAL AND
        ((CODE_CREDITO <> 0) or (CODE_DEBITO <> 0))
        GROUP BY D.TERC_NIT
        INTO :NIT, :PAGO, :debitos, :creditos
        DO
        BEGIN
        /* TOTAL POR TERCERO */
        SELECT SUM(CODE_DEBITO-CODE_CREDITO), SUM(CODE_DEBITO), SUM(CODE_CREDITO) FROM COMPROBANTE_DETALLE D, COMPROBANTE_ENCABEZADO E, mediosmag_cuentas M, configura_mediosmag C
            WHERE C.come_formato = 10019 AND C.come_item = M.mmcu_item AND SUBSTR(D.CUEN_COD,1,STRLEN(M.mmcu_cuenta)) = M.mmcu_cuenta AND m.mmcu_cuenta <> '' AND
            E.ENCO_CONSEC = D.ENCO_CONSEC AND ENCO_FECHA >= :inicio AND ENCO_FECHA <= :final AND
            D.TERC_NIT = :NIT INTO :TOTALTERC, :TOTALTDB, :TOTALTCR;
        if (totalterc is null) then
            totalterc = 0;
        if (totaltdb is null) then
            totaltdb = 0;
        if (totaltcr is null) then
            totaltcr = 0;
        if (NATUR = 'D') then
            BEGIN
            pago = debitos;
            TOTALTERC = TOTALTDB;
            END
        if (NATUR = 'C') then
            BEGIN
            pago = creditos;
            TOTALTERC = TOTALTCR;
            END
        if ((TOTALTERC >= :MINIMO) AND (PAGO > 0)) then
            BEGIN
            SELECT TERC_NOM, TERC_NOMBRE1, TERC_NOMBRE2, TERC_APELLIDO1, TERC_APELLIDO2, TERC_DV, TERC_SIMPLIFICA,
                TERC_DIR, SUBSTR(CIUD_COD,1,2), SUBSTR(CIUD_COD,3,5), PAIS_ID, T.TERC_TIPOID
                FROM TERCEROS T WHERE TERC_NIT = :NIT
                INTO :RAZONSOCIAL, :NOMBRE1, :NOMBRE2, :APELLIDO1, :APELLIDO2, :DV, :SIMPLIFICA,
                :DIRECCION, :DEPARTAMENTO, :MUNICIPIO, :PAIS, :TIPOID;
            select TIID_CODIGO FROM TIPO_ID WHERE TIID_COD = :TIPOID INTO :TIPODOC;
            if (:TIPOID <> 'J') then
                RAZONSOCIAL = '';
            /* LOS NO DEDUCIBLES */
            SELECT SUM(CODE_DEBITO-CODE_CREDITO), SUM(CODE_DEBITO), SUM(CODE_CREDITO)
            FROM COMPROBANTE_DETALLE D, COMPROBANTE_ENCABEZADO E, mediosmag_cuentas M
            WHERE M.mmcu_item = :idconc AND SUBSTR(CUEN_COD,1,STRLEN(M.mmcu_cuenta)) = M.mmcu_cuenta AND m.mmcu_cuenta <> '' AND 
            E.ENCO_CONSEC = D.ENCO_CONSEC AND ENCO_FECHA >= :INICIO AND ENCO_FECHA <= :FINAL AND D.TERC_NIT = :NIT AND
            ((CODE_CREDITO <> 0) or (CODE_DEBITO <> 0)) AND D.code_descontable = 'N' INTO :PAGOND, :debitos, :creditos;
            if (NATUR = 'D') then
                pagond = debitos;
            if (NATUR = 'C') then
                pagond = creditos;
            if (PAGOND IS NULL) then
                PAGOND = 0;
            PAGO = PAGO - PAGOND;
            /* EL IVA DESCONTABLE */
            SELECT SUM(CODE_DEBITO-CODE_CREDITO), SUM(CODE_DEBITO), SUM(CODE_CREDITO)
            FROM COMPROBANTE_DETALLE D, COMPROBANTE_ENCABEZADO E, mediosmag_cuentas M
            WHERE M.mmcu_item = :idconc AND SUBSTR(CUEN_COD,1,STRLEN(M.mmcu_ctaiva)) = M.mmcu_ctaiva AND D.code_descontable = 'S' AND m.mmcu_ctaiva <> '' AND
            E.ENCO_CONSEC = D.ENCO_CONSEC AND ENCO_FECHA >= :INICIO AND ENCO_FECHA <= :FINAL AND D.TERC_NIT = :NIT AND
            ((CODE_CREDITO <> 0) or (CODE_DEBITO <> 0)) INTO :iva, :debitos, :creditos;
            if (NATUR = 'D') then
                IVA = debitos;
            if (NATUR = 'C') then
                IVA = creditos;
            if (IVA IS NULL) then
                IVA = 0;
            if (exists (select memg_nit from medios_magneticos_datos where memg_formato = 10019 and memg_ano = substr(:inicio,1,4)
                and memg_nit = :nit and memg_iva = :iva)) then
                IVA = 0;
            /* EL IVA NO DESCONTABLE */
            SELECT SUM(CODE_DEBITO-CODE_CREDITO), SUM(CODE_DEBITO), SUM(CODE_CREDITO)
            FROM COMPROBANTE_DETALLE D, COMPROBANTE_ENCABEZADO E, mediosmag_cuentas M
            WHERE M.mmcu_item = :idconc AND SUBSTR(CUEN_COD,1,STRLEN(M.mmcu_ctaivand)) = M.mmcu_ctaivand AND D.code_descontable = 'N' AND m.mmcu_ctaivand <> '' AND
            E.ENCO_CONSEC = D.ENCO_CONSEC AND ENCO_FECHA >= :INICIO AND ENCO_FECHA <= :FINAL AND D.TERC_NIT = :NIT AND
            ((CODE_CREDITO <> 0) or (CODE_DEBITO <> 0)) INTO :ivand, :debitos, :creditos;
            if (NATUR = 'D') then
                IVAND = debitos;
            if (NATUR = 'C') then
                IVAND = creditos;
            if (IVAND IS NULL) then
                IVAND = 0;
            if (exists (select memg_nit from medios_magneticos_datos where memg_formato = 10019 and memg_ano = substr(:inicio,1,4)
                and memg_nit = :nit and memg_ivand = :ivand)) then
                IVAND = 0;

            /* LAS RETENCIONES RENTA */
            SELECT SUM(CODE_CREDITO-CODE_DEBITO), SUM(CODE_DEBITO), SUM(CODE_CREDITO)
            FROM COMPROBANTE_DETALLE D, COMPROBANTE_ENCABEZADO E, mediosmag_cuentas M
            WHERE M.mmcu_item = :idconc AND SUBSTR(CUEN_COD,1,STRLEN(M.mmcu_ctartf)) = M.mmcu_ctartf AND D.code_descontable = 'S' AND m.mmcu_ctartf <> '' AND
            E.ENCO_CONSEC = D.ENCO_CONSEC AND ENCO_FECHA >= :INICIO AND ENCO_FECHA <= :FINAL AND D.TERC_NIT = :NIT AND
            ((CODE_CREDITO <> 0) or (CODE_DEBITO <> 0)) INTO :RTFTE, :debitos, :creditos;
            if (NATUR = 'D') then
                RTFTE = debitos;
            if (NATUR = 'C') then
                RTFTE = creditos;
            if (RTFTE IS NULL) then
                RTFTE = 0;
            if (exists (select memg_nit from medios_magneticos_datos where memg_formato = 10019 and memg_ano = substr(:inicio,1,4)
                and memg_nit = :nit and memg_retencion = :rtfte)) then
                RTFTE = 0;
            
            /* LAS RETENCIONES RENTA ASUMIDAS */
            SELECT SUM(CODE_CREDITO-CODE_DEBITO), SUM(CODE_DEBITO), SUM(CODE_CREDITO)
            FROM COMPROBANTE_DETALLE D, COMPROBANTE_ENCABEZADO E, mediosmag_cuentas M
            WHERE M.mmcu_item = :idconc AND SUBSTR(CUEN_COD,1,STRLEN(M.mmcu_ctartf)) = M.mmcu_ctartf AND D.code_descontable = 'N' AND m.mmcu_ctartf <> '' AND
            E.ENCO_CONSEC = D.ENCO_CONSEC AND ENCO_FECHA >= :INICIO AND ENCO_FECHA <= :FINAL AND D.TERC_NIT = :NIT AND
            ((CODE_CREDITO <> 0) or (CODE_DEBITO <> 0)) INTO :RTFTEA, :debitos, :creditos;
            if (NATUR = 'D') then
                RTFTEA = debitos;
            if (NATUR = 'C') then
                RTFTEA = creditos;
            if (RTFTEA IS NULL) then
                RTFTEA = 0;
            if (exists (select memg_nit from medios_magneticos_datos where memg_formato = 10019 and memg_ano = substr(:inicio,1,4)
                and memg_nit = :nit and memg_reteasum = :rtftea)) then
                RTFTEA = 0;
            /* LAS RETENCIONES IVA */
            SELECT SUM(CODE_CREDITO-CODE_DEBITO), SUM(CODE_DEBITO), SUM(CODE_CREDITO)
            FROM COMPROBANTE_DETALLE D, COMPROBANTE_ENCABEZADO E, mediosmag_cuentas M
            WHERE M.mmcu_item = :idconc AND SUBSTR(CUEN_COD,1,STRLEN(M.mmcu_ctartiva)) = M.mmcu_ctartiva AND m.mmcu_ctartiva <> '' AND
            E.ENCO_CONSEC = D.ENCO_CONSEC AND ENCO_FECHA >= :INICIO AND ENCO_FECHA <= :FINAL AND D.TERC_NIT = :NIT AND
            ((CODE_CREDITO <> 0) or (CODE_DEBITO <> 0)) INTO :RTIVAC, :debitos, :creditos;
            if (NATUR = 'D') then
                RTIVAC = debitos;
            if (NATUR = 'C') then
                RTIVAC = creditos;
            if (RTIVAC IS NULL) then
                RTIVAC = 0;
            if (SIMPLIFICA = 'S') then
                BEGIN
                RTIVAS = RTIVAC;
                RTIVAC = 0;
                rtivand = 0;
                END
            ELSE
                if (pais <> '169') then
                    BEGIN
                    rtivand = RTIVAC;
                    RTIVAC = 0;
                    RTIVAS = 0;
                    END
                ELSE
                    begin
                    RTIVAS = 0;
                    rtivand = 0;
                    end
            if (exists (select memg_nit from medios_magneticos_datos where memg_formato = 10019 and memg_ano = substr(:inicio,1,4)
                and memg_nit = :nit and ((memg_retivacomun = :rtivac) or (memg_retivasimp = :rtivas) or (memg_retivand = :rtivand)))) then
                BEGIN
                rtivand = 0;
                RTIVAC = 0;
                RTIVAS = 0;
                END
            /* LA RETENCION CREE */
            SELECT SUM(CODE_CREDITO-CODE_DEBITO), SUM(CODE_DEBITO), SUM(CODE_CREDITO)
            FROM COMPROBANTE_DETALLE D, COMPROBANTE_ENCABEZADO E, mediosmag_cuentas M
            WHERE M.mmcu_item = :idconc AND SUBSTR(CUEN_COD,1,STRLEN(M.mmcu_ctarcree)) = M.mmcu_ctarcree AND D.code_descontable = 'S' AND m.mmcu_ctarcree <> '' AND
            E.ENCO_CONSEC = D.ENCO_CONSEC AND ENCO_FECHA >= :INICIO AND ENCO_FECHA <= :FINAL AND D.TERC_NIT = :NIT AND
            ((CODE_CREDITO <> 0) or (CODE_DEBITO <> 0)) INTO :RTFTE, :debitos, :creditos;
            if (NATUR = 'D') then
                rtcree = debitos;
            if (NATUR = 'C') then
                rtcree = creditos;
            if (rtcree IS NULL) then
                rtcree = 0;
            if (exists (select memg_nit from medios_magneticos_datos MD where memg_formato = 10019 and memg_ano = substr(:inicio,1,4)
                and memg_nit = :nit and MD.memg_retcree = :rtcree)) then
                rtcree = 0;
            
            /* LAS RETENCIONES RENTA ASUMIDAS */
            SELECT SUM(CODE_CREDITO-CODE_DEBITO), SUM(CODE_DEBITO), SUM(CODE_CREDITO)
            FROM COMPROBANTE_DETALLE D, COMPROBANTE_ENCABEZADO E, mediosmag_cuentas M
            WHERE M.mmcu_item = :idconc AND SUBSTR(CUEN_COD,1,STRLEN(M.mmcu_ctartcreeas)) = M.mmcu_ctartcreeas AND D.code_descontable = 'N' AND m.mmcu_ctartcreeas <> '' AND
            E.ENCO_CONSEC = D.ENCO_CONSEC AND ENCO_FECHA >= :INICIO AND ENCO_FECHA <= :FINAL AND D.TERC_NIT = :NIT AND
            ((CODE_CREDITO <> 0) or (CODE_DEBITO <> 0)) INTO :rtcreea, :debitos, :creditos;
            if (NATUR = 'D') then
                rtcreea = debitos;
            if (NATUR = 'C') then
                rtcreea = creditos;
            if (rtcreea IS NULL) then
                rtcreea = 0;
            if (exists (select memg_nit from medios_magneticos_datos MD where memg_formato = 10019 and memg_ano = substr(:inicio,1,4)
                and memg_nit = :nit and MD.memg_rasumc = :rtcreea)) then
                rtcreea = 0;

            ITEM = ITEM + 1;
            insert into medios_magneticos_datos (memg_formato, memg_ano, memg_item, memg_concepto, memg_tipodoc, memg_nit, memg_dv,memg_apellido1, memg_apellido2,
                memg_nombre1, memg_nombre2, memg_razonsocial, memg_direccion, memg_departamento, memg_municipio, memg_pago, memg_pais, memg_pagond,
                memg_iva, memg_ivand, memg_retencion, memg_reteasum, memg_retivacomun, memg_retivasimp, memg_retivand, memg_retcree, memg_rasumc)
                values (10019, substr(:inicio,1,4), :item,  :concepto, :tipodoc, :nit, :dv, :apellido1, :apellido2,
                :nombre1, :nombre2, :razonsocial, :direccion, :departamento, :municipio, :pago, :pais, :pagond,
                :iva, :ivand, :rtfte, :rtftea, :rtivac, :rtivas, :rtivand, :rtcree, :rtcreea);
            END
        ELSE
            BEGIN
            /* LAS CUANTIAS MENORES */
            SELECT SUM(CODE_DEBITO-CODE_CREDITO), SUM(CODE_DEBITO), SUM(CODE_CREDITO)
            FROM COMPROBANTE_DETALLE D, COMPROBANTE_ENCABEZADO E, mediosmag_cuentas M
            WHERE M.mmcu_item = :idconc AND SUBSTR(CUEN_COD,1,STRLEN(M.mmcu_cuenta)) = M.mmcu_cuenta AND m.mmcu_cuenta <> '' AND 
            E.ENCO_CONSEC = D.ENCO_CONSEC AND ENCO_FECHA >= :INICIO AND ENCO_FECHA <= :FINAL AND D.TERC_NIT = :NIT AND
            ((CODE_CREDITO <> 0) or (CODE_DEBITO <> 0)) AND D.code_descontable = 'N' INTO :PAGOND, :debitos, :creditos;
            if (NATUR = 'D') then
                pagond = debitos;
            if (NATUR = 'C') then
                pagond = creditos;
            if (PAGOND IS NULL) then
                PAGOND = 0;
            PAGO = PAGO - PAGOND;
            MENORCUANTIA = MENORCUANTIA + PAGO;
            MENORPAGOND = MENORPAGOND + PAGOND;
            /* EL IVA DESCONTABLE */
            SELECT SUM(CODE_DEBITO-CODE_CREDITO), SUM(CODE_DEBITO), SUM(CODE_CREDITO)
            FROM COMPROBANTE_DETALLE D, COMPROBANTE_ENCABEZADO E, mediosmag_cuentas M
            WHERE M.mmcu_item = :idconc AND SUBSTR(CUEN_COD,1,STRLEN(M.mmcu_ctaiva)) = M.mmcu_ctaiva AND D.code_descontable = 'S' AND m.mmcu_ctaiva <> '' AND
            E.ENCO_CONSEC = D.ENCO_CONSEC AND ENCO_FECHA >= :INICIO AND ENCO_FECHA <= :FINAL AND D.TERC_NIT = :NIT AND
            ((CODE_CREDITO <> 0) or (CODE_DEBITO <> 0)) INTO :iva, :debitos, :creditos;
            if (NATUR = 'D') then
                IVA = debitos;
            if (NATUR = 'C') then
                IVA = creditos;
            if (IVA IS NULL) then
                IVA = 0;
            MENORIVA = MENORIVA + IVA;
            /* EL IVA NO DESCONTABLE */
            SELECT SUM(CODE_DEBITO-CODE_CREDITO), SUM(CODE_DEBITO), SUM(CODE_CREDITO)
            FROM COMPROBANTE_DETALLE D, COMPROBANTE_ENCABEZADO E, mediosmag_cuentas M
            WHERE M.mmcu_item = :idconc AND SUBSTR(CUEN_COD,1,STRLEN(M.mmcu_ctaivand)) = M.mmcu_ctaivand AND D.code_descontable = 'N' AND m.mmcu_ctaivand <> '' AND
            E.ENCO_CONSEC = D.ENCO_CONSEC AND ENCO_FECHA >= :INICIO AND ENCO_FECHA <= :FINAL AND D.TERC_NIT = :NIT AND
            ((CODE_CREDITO <> 0) or (CODE_DEBITO <> 0)) INTO :ivand, :debitos, :creditos;
            if (NATUR = 'D') then
                IVAND = debitos;
            if (NATUR = 'C') then
                IVAND = creditos;
            if (IVAND IS NULL) then
                IVAND = 0;
            MENORIVAND = MENORIVAND + IVAND;
            /* LAS RETENCIONES RENTA */
            SELECT SUM(CODE_CREDITO-CODE_DEBITO), SUM(CODE_DEBITO), SUM(CODE_CREDITO)
            FROM COMPROBANTE_DETALLE D, COMPROBANTE_ENCABEZADO E, mediosmag_cuentas M
            WHERE M.mmcu_item = :idconc AND SUBSTR(CUEN_COD,1,STRLEN(M.mmcu_ctartf)) = M.mmcu_ctartf AND D.code_descontable = 'S' AND m.mmcu_ctartf <> '' AND
            E.ENCO_CONSEC = D.ENCO_CONSEC AND ENCO_FECHA >= :INICIO AND ENCO_FECHA <= :FINAL AND D.TERC_NIT = :NIT AND
            ((CODE_CREDITO <> 0) or (CODE_DEBITO <> 0)) INTO :RTFTE, :debitos, :creditos;
            if (NATUR = 'D') then
                RTFTE = debitos;
            if (NATUR = 'C') then
                RTFTE = creditos;
            if (RTFTE IS NULL) then
                RTFTE = 0;
            MENORRTF = MENORRTF + RTFTE;
            /* LAS RETENCIONES RENTA ASUMIDAS */
            SELECT SUM(CODE_CREDITO-CODE_DEBITO), SUM(CODE_DEBITO), SUM(CODE_CREDITO)
            FROM COMPROBANTE_DETALLE D, COMPROBANTE_ENCABEZADO E, mediosmag_cuentas M
            WHERE M.mmcu_item = :idconc AND SUBSTR(CUEN_COD,1,STRLEN(M.mmcu_ctartf)) = M.mmcu_ctartf AND D.code_descontable = 'N' AND m.mmcu_ctartf <> '' AND
            E.ENCO_CONSEC = D.ENCO_CONSEC AND ENCO_FECHA >= :INICIO AND ENCO_FECHA <= :FINAL AND D.TERC_NIT = :NIT AND
            ((CODE_CREDITO <> 0) or (CODE_DEBITO <> 0)) INTO :RTFTEA, :debitos, :creditos;
            if (NATUR = 'D') then
                RTFTEA = debitos;
            if (NATUR = 'C') then
                RTFTEA = creditos;
            if (RTFTEA IS NULL) then
                RTFTEA = 0;
            MENORRTFA = MENORRTFA + RTFTEA;
            /* LAS RETENCIONES IVA */
            SELECT SUM(CODE_CREDITO-CODE_DEBITO), SUM(CODE_DEBITO), SUM(CODE_CREDITO)
            FROM COMPROBANTE_DETALLE D, COMPROBANTE_ENCABEZADO E, mediosmag_cuentas M
            WHERE M.mmcu_item = :idconc AND SUBSTR(CUEN_COD,1,STRLEN(M.mmcu_ctartiva)) = M.mmcu_ctartiva AND m.mmcu_ctartiva <> '' AND
            E.ENCO_CONSEC = D.ENCO_CONSEC AND ENCO_FECHA >= :INICIO AND ENCO_FECHA <= :FINAL AND D.TERC_NIT = :NIT AND
            ((CODE_CREDITO <> 0) or (CODE_DEBITO <> 0)) INTO :RTIVAC, :debitos, :creditos;
            if (NATUR = 'D') then
                RTIVAC = debitos;
            if (NATUR = 'C') then
                RTIVAC = creditos;
            if (RTIVAC IS NULL) then
                RTIVAC = 0;
            if (SIMPLIFICA = 'S') then
                BEGIN
                RTIVAS = RTIVAC;
                RTIVAC = 0;
                rtivand = 0;
                END
            ELSE
                if (pais <> '169') then
                    BEGIN
                    rtivand = RTIVAC;
                    RTIVAC = 0;
                    RTIVAS = 0;
                    END
                ELSE
                    begin
                    RTIVAS = 0;
                    rtivand = 0;
                    end
            MENORRTIVAC = MENORIVA + RTIVAC;
            MENORRTIVAS = MENORIVA + RTIVAS;
            MENORRTIVAN = MENORIVA + RTIVAND;
            /* LA RETENCION CREE */
            SELECT SUM(CODE_CREDITO-CODE_DEBITO), SUM(CODE_DEBITO), SUM(CODE_CREDITO)
            FROM COMPROBANTE_DETALLE D, COMPROBANTE_ENCABEZADO E, mediosmag_cuentas M
            WHERE M.mmcu_item = :idconc AND SUBSTR(CUEN_COD,1,STRLEN(M.mmcu_ctarcree)) = M.mmcu_ctarcree AND D.code_descontable = 'S' AND m.mmcu_ctarcree <> '' AND
            E.ENCO_CONSEC = D.ENCO_CONSEC AND ENCO_FECHA >= :INICIO AND ENCO_FECHA <= :FINAL AND D.TERC_NIT = :NIT AND
            ((CODE_CREDITO <> 0) or (CODE_DEBITO <> 0)) INTO :rtcree, :debitos, :creditos;
            if (NATUR = 'D') then
                rtcree = debitos;
            if (NATUR = 'C') then
                rtcree = creditos;
            if (RTFTE IS NULL) then
                rtcree = 0;
            MENORRTC = MENORRTC + rtcree;
            /* LA RETENCION CREE ASUMIDA */
            SELECT SUM(CODE_CREDITO-CODE_DEBITO), SUM(CODE_DEBITO), SUM(CODE_CREDITO)
            FROM COMPROBANTE_DETALLE D, COMPROBANTE_ENCABEZADO E, mediosmag_cuentas M
            WHERE M.mmcu_item = :idconc AND SUBSTR(CUEN_COD,1,STRLEN(M.mmcu_ctartcreeas)) = M.mmcu_ctartcreeas AND D.code_descontable = 'N' AND m.mmcu_ctartcreeas <> '' AND
            E.ENCO_CONSEC = D.ENCO_CONSEC AND ENCO_FECHA >= :INICIO AND ENCO_FECHA <= :FINAL AND D.TERC_NIT = :NIT AND
            ((CODE_CREDITO <> 0) or (CODE_DEBITO <> 0)) INTO :rtcreea, :debitos, :creditos;
            if (NATUR = 'D') then
                rtcreea = debitos;
            if (NATUR = 'C') then
                rtcreea = creditos;
            if (rtcreea IS NULL) then
                rtcreea = 0;
            menorrtca = menorrtca + rtcreea;
            END
        END
    if (MENORCUANTIA <> 0) then
        BEGIN
        if (menoriva IS NULL) then
            menoriva = 0;
        if (menorivand IS NULL) then
            menorivand = 0;
        if (menorpagond IS NULL) then
            menorpagond = 0;
        if (menorrtc IS NULL) then
            menorrtc = 0;
        if (menorrtca IS NULL) then
            menorrtca = 0;
        if (menorrtf IS NULL) then
            menorrtf = 0;
        if (menorrtfa IS NULL) then
            menorrtfa = 0;
        if (menorrtivac IS NULL) then
            menorrtivac = 0;
        if (menorrtivan IS NULL) then
            menorrtivan = 0;
        if (menorrtivas IS NULL) then
            menorrtivas = 0;
        ITEM = ITEM + 1;
        insert into medios_magneticos_datos (memg_formato, memg_ano, memg_item, memg_concepto, memg_tipodoc, memg_nit, memg_dv,memg_apellido1, memg_apellido2,
            memg_nombre1, memg_nombre2, memg_razonsocial, memg_direccion, memg_departamento, memg_municipio, memg_pago, memg_pais, memg_pagond,
            memg_iva, memg_ivand, memg_retencion, memg_reteasum, memg_retivacomun, memg_retivasimp, memg_retivand, memg_retcree, memg_rasumc)
            values (10019, substr(:inicio,1,4), :item,  :concepto, 43, '222222222', '', '', '',
            '', '', 'CUANTIAS MENORES', :dirmenor, :depmenor, :munmenor, :menorcuantia, :paismenor, :menorpagond,
            :menoriva, :menorivand, :menorrtf, :menorrtfa, :menorrtivac, :menorrtivas, :menorrtivan, :menorrtc, :menorrtca);
        END
    END

end
^

SET TERM ; ^

/* 20140331 */
/* MAL NOMBRE DEL PROCEDIMIENTO EN FTO 1006v8 */
UPDATE MEDIOSMAG_ARCHIVOS
SET MEDM_NOMBRE = '1006-V8 IMPUESTO A LAS VENTAS GENERADO',
    MEDM_VERSION = '08',
    MEDM_VALOR1 = 'IVA GENERADO',
    MEDM_VALOR2 = 'IVA RECUPERADO',
    MEDM_VALOR3 = 'IMP NAL CONSUMO',
    MEDM_VALOR4 = NULL,
    MEDM_VALOR5 = NULL,
    MEDM_VALOR6 = NULL,
    MEDM_VALOR7 = NULL,
    MEDM_VALOR8 = NULL,
    MEDM_VALOR9 = NULL,
    MEDM_PROCEDIMIENTO = 'MM_10068',
    MEDM_ORDEN = 5,
    MEDM_VALOR10 = NULL,
    MEDM_VALOR11 = NULL
WHERE (MEDM_FORMATO = 10068);
COMMIT WORK;

/* 20140401B */
/* nits de 20 caracteres */

SET TERM ^ ;

CREATE OR ALTER procedure MM_1001_9 (
    INICIO char(8),
    FINAL char(8))
AS
declare variable IDCONC INTEGER;
declare variable CONCEPTO INTEGER;
declare variable TIPODOC INTEGER;
declare variable NIT VARCHAR(20) CHARACTER SET NONE;
declare variable DV CHAR(1) CHARACTER SET NONE;
declare variable APELLIDO1 VARCHAR(60) CHARACTER SET NONE;
declare variable APELLIDO2 VARCHAR(60) CHARACTER SET NONE;
declare variable NOMBRE1 VARCHAR(60) CHARACTER SET NONE;
declare variable NOMBRE2 VARCHAR(60) CHARACTER SET NONE;
declare variable RAZONSOCIAL VARCHAR(450) CHARACTER SET NONE;
declare variable DIRECCION VARCHAR(200) CHARACTER SET NONE;
declare variable SIMPLIFICA CHAR(1) CHARACTER SET NONE;
declare variable DEPARTAMENTO CHAR(2) CHARACTER SET NONE;
declare variable MUNICIPIO CHAR(3) CHARACTER SET NONE;
declare variable PAIS CHAR(3) CHARACTER SET NONE;
declare variable PAGO NUMERIC(18,0);
declare variable PAGOND NUMERIC(18,0);
declare variable IVA NUMERIC(18,0);
declare variable IVAND NUMERIC(18,0);
declare variable RTFTE NUMERIC(18,0);
declare variable RTFTEA NUMERIC(18,0);
declare variable RTIVAC NUMERIC(18,0);
declare variable RTIVAS NUMERIC(18,0);
declare variable RTIVAND NUMERIC(18,0);
declare variable RTCREE NUMERIC(18,0);
declare variable RTCREEA NUMERIC(18,0);
declare variable DEBITOS NUMERIC(18,2);
declare variable CREDITOS NUMERIC(18,2);
declare variable MINIMO NUMERIC(18,2);
declare variable MENORCUANTIA NUMERIC(18,2);
declare variable MENORPAGOND NUMERIC(18,2);
declare variable MENORRTF NUMERIC(18,2);
declare variable MENORRTFA NUMERIC(18,2);
declare variable MENORRTC NUMERIC(18,2);
declare variable MENORRTCA NUMERIC(18,2);
declare variable MENORIVA NUMERIC(18,2);
declare variable MENORIVAND NUMERIC(18,2);
declare variable MENORRTIVAC NUMERIC(18,2);
declare variable MENORRTIVAS NUMERIC(18,2);
declare variable MENORRTIVAN NUMERIC(18,2);
declare variable TOTALTERC NUMERIC(18,2);
declare variable TOTALTDB NUMERIC(18,2);
declare variable TOTALTCR NUMERIC(18,2);
declare variable ITEM integer;
declare variable DIRMENOR VARCHAR(200) CHARACTER SET NONE;
declare variable DEPMENOR CHAR(2) CHARACTER SET NONE;
declare variable MUNMENOR CHAR(3) CHARACTER SET NONE;
declare variable PAISMENOR CHAR(3) CHARACTER SET NONE;
declare variable NATUR CHAR(1);
declare variable TIPOID CHAR(1);
begin
EXECUTE PROCEDURE lee_configuracion('CONTABILIDAD', 'GENERAL', 'NIT COMPAÑIA') returning_values (:NIT);
SELECT TERC_DIR, SUBSTR(CIUD_COD,1,2), SUBSTR(CIUD_COD,3,5), PAIS_ID FROM TERCEROS WHERE TERC_NIT = :NIT
    INTO :dirmenor, :depmenor, :munmenor, :paismenor;
ITEM = 0;
FOR SELECT COME_ITEM, COME_RESPUESTA, COME_MINIMO, COME_NATUR FROM CONFIGURA_MEDIOSMAG
    WHERE COME_FORMATO = '10019' ORDER BY COME_ITEM INTO :idconc, :CONCEPTO , :MINIMO, :NATUR
    DO
    BEGIN
    MENORCUANTIA = 0;
    MENORPAGOND = 0;
    MENORRTF = 0;
    MENORRTFA = 0;
    MENORIVA = 0;
    MENORIVAND = 0;
    MENORRTIVAC = 0;
    MENORRTIVAS = 0;
    MENORRTIVAN = 0;
    FOR SELECT MAX(D.TERC_NIT), SUM(CODE_DEBITO-CODE_CREDITO), SUM(CODE_DEBITO), SUM(CODE_CREDITO)
        FROM COMPROBANTE_DETALLE D, COMPROBANTE_ENCABEZADO E, mediosmag_cuentas M
        WHERE M.mmcu_item = :idconc AND SUBSTR(CUEN_COD,1,STRLEN(M.mmcu_cuenta)) = M.mmcu_cuenta AND m.mmcu_cuenta <> '' AND
        E.ENCO_CONSEC = D.ENCO_CONSEC AND ENCO_FECHA >= :INICIO AND ENCO_FECHA <= :FINAL AND
        ((CODE_CREDITO <> 0) or (CODE_DEBITO <> 0))
        GROUP BY D.TERC_NIT
        INTO :NIT, :PAGO, :debitos, :creditos
        DO
        BEGIN
        /* TOTAL POR TERCERO */
        SELECT SUM(CODE_DEBITO-CODE_CREDITO), SUM(CODE_DEBITO), SUM(CODE_CREDITO) FROM COMPROBANTE_DETALLE D, COMPROBANTE_ENCABEZADO E, mediosmag_cuentas M, configura_mediosmag C
            WHERE C.come_formato = 10019 AND C.come_item = M.mmcu_item AND SUBSTR(D.CUEN_COD,1,STRLEN(M.mmcu_cuenta)) = M.mmcu_cuenta AND m.mmcu_cuenta <> '' AND
            E.ENCO_CONSEC = D.ENCO_CONSEC AND ENCO_FECHA >= :inicio AND ENCO_FECHA <= :final AND
            D.TERC_NIT = :NIT INTO :TOTALTERC, :TOTALTDB, :TOTALTCR;
        if (totalterc is null) then
            totalterc = 0;
        if (totaltdb is null) then
            totaltdb = 0;
        if (totaltcr is null) then
            totaltcr = 0;
        if (NATUR = 'D') then
            BEGIN
            pago = debitos;
            TOTALTERC = TOTALTDB;
            END
        if (NATUR = 'C') then
            BEGIN
            pago = creditos;
            TOTALTERC = TOTALTCR;
            END
        if ((TOTALTERC >= :MINIMO) AND (PAGO > 0)) then
            BEGIN
            SELECT TERC_NOM, TERC_NOMBRE1, TERC_NOMBRE2, TERC_APELLIDO1, TERC_APELLIDO2, TERC_DV, TERC_SIMPLIFICA,
                TERC_DIR, SUBSTR(CIUD_COD,1,2), SUBSTR(CIUD_COD,3,5), PAIS_ID, T.TERC_TIPOID
                FROM TERCEROS T WHERE TERC_NIT = :NIT
                INTO :RAZONSOCIAL, :NOMBRE1, :NOMBRE2, :APELLIDO1, :APELLIDO2, :DV, :SIMPLIFICA,
                :DIRECCION, :DEPARTAMENTO, :MUNICIPIO, :PAIS, :TIPOID;
            select TIID_CODIGO FROM TIPO_ID WHERE TIID_COD = :TIPOID INTO :TIPODOC;
            if (:TIPOID <> 'J') then
                RAZONSOCIAL = '';
            /* LOS NO DEDUCIBLES */
            SELECT SUM(CODE_DEBITO-CODE_CREDITO), SUM(CODE_DEBITO), SUM(CODE_CREDITO)
            FROM COMPROBANTE_DETALLE D, COMPROBANTE_ENCABEZADO E, mediosmag_cuentas M
            WHERE M.mmcu_item = :idconc AND SUBSTR(CUEN_COD,1,STRLEN(M.mmcu_cuenta)) = M.mmcu_cuenta AND m.mmcu_cuenta <> '' AND 
            E.ENCO_CONSEC = D.ENCO_CONSEC AND ENCO_FECHA >= :INICIO AND ENCO_FECHA <= :FINAL AND D.TERC_NIT = :NIT AND
            ((CODE_CREDITO <> 0) or (CODE_DEBITO <> 0)) AND D.code_descontable = 'N' INTO :PAGOND, :debitos, :creditos;
            if (NATUR = 'D') then
                pagond = debitos;
            if (NATUR = 'C') then
                pagond = creditos;
            if (PAGOND IS NULL) then
                PAGOND = 0;
            PAGO = PAGO - PAGOND;
            /* EL IVA DESCONTABLE */
            SELECT SUM(CODE_DEBITO-CODE_CREDITO), SUM(CODE_DEBITO), SUM(CODE_CREDITO)
            FROM COMPROBANTE_DETALLE D, COMPROBANTE_ENCABEZADO E, mediosmag_cuentas M
            WHERE M.mmcu_item = :idconc AND SUBSTR(CUEN_COD,1,STRLEN(M.mmcu_ctaiva)) = M.mmcu_ctaiva AND D.code_descontable = 'S' AND m.mmcu_ctaiva <> '' AND
            E.ENCO_CONSEC = D.ENCO_CONSEC AND ENCO_FECHA >= :INICIO AND ENCO_FECHA <= :FINAL AND D.TERC_NIT = :NIT AND
            ((CODE_CREDITO <> 0) or (CODE_DEBITO <> 0)) INTO :iva, :debitos, :creditos;
            if (NATUR = 'D') then
                IVA = debitos;
            if (NATUR = 'C') then
                IVA = creditos;
            if (IVA IS NULL) then
                IVA = 0;
            if (exists (select memg_nit from medios_magneticos_datos where memg_formato = 10019 and memg_ano = substr(:inicio,1,4)
                and memg_nit = :nit and memg_iva = :iva)) then
                IVA = 0;
            /* EL IVA NO DESCONTABLE */
            SELECT SUM(CODE_DEBITO-CODE_CREDITO), SUM(CODE_DEBITO), SUM(CODE_CREDITO)
            FROM COMPROBANTE_DETALLE D, COMPROBANTE_ENCABEZADO E, mediosmag_cuentas M
            WHERE M.mmcu_item = :idconc AND SUBSTR(CUEN_COD,1,STRLEN(M.mmcu_ctaivand)) = M.mmcu_ctaivand AND D.code_descontable = 'N' AND m.mmcu_ctaivand <> '' AND
            E.ENCO_CONSEC = D.ENCO_CONSEC AND ENCO_FECHA >= :INICIO AND ENCO_FECHA <= :FINAL AND D.TERC_NIT = :NIT AND
            ((CODE_CREDITO <> 0) or (CODE_DEBITO <> 0)) INTO :ivand, :debitos, :creditos;
            if (NATUR = 'D') then
                IVAND = debitos;
            if (NATUR = 'C') then
                IVAND = creditos;
            if (IVAND IS NULL) then
                IVAND = 0;
            if (exists (select memg_nit from medios_magneticos_datos where memg_formato = 10019 and memg_ano = substr(:inicio,1,4)
                and memg_nit = :nit and memg_ivand = :ivand)) then
                IVAND = 0;

            /* LAS RETENCIONES RENTA */
            SELECT SUM(CODE_CREDITO-CODE_DEBITO), SUM(CODE_DEBITO), SUM(CODE_CREDITO)
            FROM COMPROBANTE_DETALLE D, COMPROBANTE_ENCABEZADO E, mediosmag_cuentas M
            WHERE M.mmcu_item = :idconc AND SUBSTR(CUEN_COD,1,STRLEN(M.mmcu_ctartf)) = M.mmcu_ctartf AND D.code_descontable = 'S' AND m.mmcu_ctartf <> '' AND
            E.ENCO_CONSEC = D.ENCO_CONSEC AND ENCO_FECHA >= :INICIO AND ENCO_FECHA <= :FINAL AND D.TERC_NIT = :NIT AND
            ((CODE_CREDITO <> 0) or (CODE_DEBITO <> 0)) INTO :RTFTE, :debitos, :creditos;
            if (NATUR = 'D') then
                RTFTE = debitos;
            if (NATUR = 'C') then
                RTFTE = creditos;
            if (RTFTE IS NULL) then
                RTFTE = 0;
            if (exists (select memg_nit from medios_magneticos_datos where memg_formato = 10019 and memg_ano = substr(:inicio,1,4)
                and memg_nit = :nit and memg_retencion = :rtfte)) then
                RTFTE = 0;
            
            /* LAS RETENCIONES RENTA ASUMIDAS */
            SELECT SUM(CODE_CREDITO-CODE_DEBITO), SUM(CODE_DEBITO), SUM(CODE_CREDITO)
            FROM COMPROBANTE_DETALLE D, COMPROBANTE_ENCABEZADO E, mediosmag_cuentas M
            WHERE M.mmcu_item = :idconc AND SUBSTR(CUEN_COD,1,STRLEN(M.mmcu_ctartf)) = M.mmcu_ctartf AND D.code_descontable = 'N' AND m.mmcu_ctartf <> '' AND
            E.ENCO_CONSEC = D.ENCO_CONSEC AND ENCO_FECHA >= :INICIO AND ENCO_FECHA <= :FINAL AND D.TERC_NIT = :NIT AND
            ((CODE_CREDITO <> 0) or (CODE_DEBITO <> 0)) INTO :RTFTEA, :debitos, :creditos;
            if (NATUR = 'D') then
                RTFTEA = debitos;
            if (NATUR = 'C') then
                RTFTEA = creditos;
            if (RTFTEA IS NULL) then
                RTFTEA = 0;
            if (exists (select memg_nit from medios_magneticos_datos where memg_formato = 10019 and memg_ano = substr(:inicio,1,4)
                and memg_nit = :nit and memg_reteasum = :rtftea)) then
                RTFTEA = 0;
            /* LAS RETENCIONES IVA */
            SELECT SUM(CODE_CREDITO-CODE_DEBITO), SUM(CODE_DEBITO), SUM(CODE_CREDITO)
            FROM COMPROBANTE_DETALLE D, COMPROBANTE_ENCABEZADO E, mediosmag_cuentas M
            WHERE M.mmcu_item = :idconc AND SUBSTR(CUEN_COD,1,STRLEN(M.mmcu_ctartiva)) = M.mmcu_ctartiva AND m.mmcu_ctartiva <> '' AND
            E.ENCO_CONSEC = D.ENCO_CONSEC AND ENCO_FECHA >= :INICIO AND ENCO_FECHA <= :FINAL AND D.TERC_NIT = :NIT AND
            ((CODE_CREDITO <> 0) or (CODE_DEBITO <> 0)) INTO :RTIVAC, :debitos, :creditos;
            if (NATUR = 'D') then
                RTIVAC = debitos;
            if (NATUR = 'C') then
                RTIVAC = creditos;
            if (RTIVAC IS NULL) then
                RTIVAC = 0;
            if (SIMPLIFICA = 'S') then
                BEGIN
                RTIVAS = RTIVAC;
                RTIVAC = 0;
                rtivand = 0;
                END
            ELSE
                if (pais <> '169') then
                    BEGIN
                    rtivand = RTIVAC;
                    RTIVAC = 0;
                    RTIVAS = 0;
                    END
                ELSE
                    begin
                    RTIVAS = 0;
                    rtivand = 0;
                    end
            if (exists (select memg_nit from medios_magneticos_datos where memg_formato = 10019 and memg_ano = substr(:inicio,1,4)
                and memg_nit = :nit and ((memg_retivacomun = :rtivac) or (memg_retivasimp = :rtivas) or (memg_retivand = :rtivand)))) then
                BEGIN
                rtivand = 0;
                RTIVAC = 0;
                RTIVAS = 0;
                END
            /* LA RETENCION CREE */
            SELECT SUM(CODE_CREDITO-CODE_DEBITO), SUM(CODE_DEBITO), SUM(CODE_CREDITO)
            FROM COMPROBANTE_DETALLE D, COMPROBANTE_ENCABEZADO E, mediosmag_cuentas M
            WHERE M.mmcu_item = :idconc AND SUBSTR(CUEN_COD,1,STRLEN(M.mmcu_ctarcree)) = M.mmcu_ctarcree AND D.code_descontable = 'S' AND m.mmcu_ctarcree <> '' AND
            E.ENCO_CONSEC = D.ENCO_CONSEC AND ENCO_FECHA >= :INICIO AND ENCO_FECHA <= :FINAL AND D.TERC_NIT = :NIT AND
            ((CODE_CREDITO <> 0) or (CODE_DEBITO <> 0)) INTO :RTFTE, :debitos, :creditos;
            if (NATUR = 'D') then
                rtcree = debitos;
            if (NATUR = 'C') then
                rtcree = creditos;
            if (rtcree IS NULL) then
                rtcree = 0;
            if (exists (select memg_nit from medios_magneticos_datos MD where memg_formato = 10019 and memg_ano = substr(:inicio,1,4)
                and memg_nit = :nit and MD.memg_retcree = :rtcree)) then
                rtcree = 0;
            
            /* LAS RETENCIONES RENTA ASUMIDAS */
            SELECT SUM(CODE_CREDITO-CODE_DEBITO), SUM(CODE_DEBITO), SUM(CODE_CREDITO)
            FROM COMPROBANTE_DETALLE D, COMPROBANTE_ENCABEZADO E, mediosmag_cuentas M
            WHERE M.mmcu_item = :idconc AND SUBSTR(CUEN_COD,1,STRLEN(M.mmcu_ctartcreeas)) = M.mmcu_ctartcreeas AND D.code_descontable = 'N' AND m.mmcu_ctartcreeas <> '' AND
            E.ENCO_CONSEC = D.ENCO_CONSEC AND ENCO_FECHA >= :INICIO AND ENCO_FECHA <= :FINAL AND D.TERC_NIT = :NIT AND
            ((CODE_CREDITO <> 0) or (CODE_DEBITO <> 0)) INTO :rtcreea, :debitos, :creditos;
            if (NATUR = 'D') then
                rtcreea = debitos;
            if (NATUR = 'C') then
                rtcreea = creditos;
            if (rtcreea IS NULL) then
                rtcreea = 0;
            if (exists (select memg_nit from medios_magneticos_datos MD where memg_formato = 10019 and memg_ano = substr(:inicio,1,4)
                and memg_nit = :nit and MD.memg_rasumc = :rtcreea)) then
                rtcreea = 0;

            ITEM = ITEM + 1;
            insert into medios_magneticos_datos (memg_formato, memg_ano, memg_item, memg_concepto, memg_tipodoc, memg_nit, memg_dv,memg_apellido1, memg_apellido2,
                memg_nombre1, memg_nombre2, memg_razonsocial, memg_direccion, memg_departamento, memg_municipio, memg_pago, memg_pais, memg_pagond,
                memg_iva, memg_ivand, memg_retencion, memg_reteasum, memg_retivacomun, memg_retivasimp, memg_retivand, memg_retcree, memg_rasumc)
                values (10019, substr(:inicio,1,4), :item,  :concepto, :tipodoc, :nit, :dv, :apellido1, :apellido2,
                :nombre1, :nombre2, :razonsocial, :direccion, :departamento, :municipio, :pago, :pais, :pagond,
                :iva, :ivand, :rtfte, :rtftea, :rtivac, :rtivas, :rtivand, :rtcree, :rtcreea);
            END
        ELSE
            BEGIN
            /* LAS CUANTIAS MENORES */
            SELECT SUM(CODE_DEBITO-CODE_CREDITO), SUM(CODE_DEBITO), SUM(CODE_CREDITO)
            FROM COMPROBANTE_DETALLE D, COMPROBANTE_ENCABEZADO E, mediosmag_cuentas M
            WHERE M.mmcu_item = :idconc AND SUBSTR(CUEN_COD,1,STRLEN(M.mmcu_cuenta)) = M.mmcu_cuenta AND m.mmcu_cuenta <> '' AND 
            E.ENCO_CONSEC = D.ENCO_CONSEC AND ENCO_FECHA >= :INICIO AND ENCO_FECHA <= :FINAL AND D.TERC_NIT = :NIT AND
            ((CODE_CREDITO <> 0) or (CODE_DEBITO <> 0)) AND D.code_descontable = 'N' INTO :PAGOND, :debitos, :creditos;
            if (NATUR = 'D') then
                pagond = debitos;
            if (NATUR = 'C') then
                pagond = creditos;
            if (PAGOND IS NULL) then
                PAGOND = 0;
            PAGO = PAGO - PAGOND;
            MENORCUANTIA = MENORCUANTIA + PAGO;
            MENORPAGOND = MENORPAGOND + PAGOND;
            /* EL IVA DESCONTABLE */
            SELECT SUM(CODE_DEBITO-CODE_CREDITO), SUM(CODE_DEBITO), SUM(CODE_CREDITO)
            FROM COMPROBANTE_DETALLE D, COMPROBANTE_ENCABEZADO E, mediosmag_cuentas M
            WHERE M.mmcu_item = :idconc AND SUBSTR(CUEN_COD,1,STRLEN(M.mmcu_ctaiva)) = M.mmcu_ctaiva AND D.code_descontable = 'S' AND m.mmcu_ctaiva <> '' AND
            E.ENCO_CONSEC = D.ENCO_CONSEC AND ENCO_FECHA >= :INICIO AND ENCO_FECHA <= :FINAL AND D.TERC_NIT = :NIT AND
            ((CODE_CREDITO <> 0) or (CODE_DEBITO <> 0)) INTO :iva, :debitos, :creditos;
            if (NATUR = 'D') then
                IVA = debitos;
            if (NATUR = 'C') then
                IVA = creditos;
            if (IVA IS NULL) then
                IVA = 0;
            MENORIVA = MENORIVA + IVA;
            /* EL IVA NO DESCONTABLE */
            SELECT SUM(CODE_DEBITO-CODE_CREDITO), SUM(CODE_DEBITO), SUM(CODE_CREDITO)
            FROM COMPROBANTE_DETALLE D, COMPROBANTE_ENCABEZADO E, mediosmag_cuentas M
            WHERE M.mmcu_item = :idconc AND SUBSTR(CUEN_COD,1,STRLEN(M.mmcu_ctaivand)) = M.mmcu_ctaivand AND D.code_descontable = 'N' AND m.mmcu_ctaivand <> '' AND
            E.ENCO_CONSEC = D.ENCO_CONSEC AND ENCO_FECHA >= :INICIO AND ENCO_FECHA <= :FINAL AND D.TERC_NIT = :NIT AND
            ((CODE_CREDITO <> 0) or (CODE_DEBITO <> 0)) INTO :ivand, :debitos, :creditos;
            if (NATUR = 'D') then
                IVAND = debitos;
            if (NATUR = 'C') then
                IVAND = creditos;
            if (IVAND IS NULL) then
                IVAND = 0;
            MENORIVAND = MENORIVAND + IVAND;
            /* LAS RETENCIONES RENTA */
            SELECT SUM(CODE_CREDITO-CODE_DEBITO), SUM(CODE_DEBITO), SUM(CODE_CREDITO)
            FROM COMPROBANTE_DETALLE D, COMPROBANTE_ENCABEZADO E, mediosmag_cuentas M
            WHERE M.mmcu_item = :idconc AND SUBSTR(CUEN_COD,1,STRLEN(M.mmcu_ctartf)) = M.mmcu_ctartf AND D.code_descontable = 'S' AND m.mmcu_ctartf <> '' AND
            E.ENCO_CONSEC = D.ENCO_CONSEC AND ENCO_FECHA >= :INICIO AND ENCO_FECHA <= :FINAL AND D.TERC_NIT = :NIT AND
            ((CODE_CREDITO <> 0) or (CODE_DEBITO <> 0)) INTO :RTFTE, :debitos, :creditos;
            if (NATUR = 'D') then
                RTFTE = debitos;
            if (NATUR = 'C') then
                RTFTE = creditos;
            if (RTFTE IS NULL) then
                RTFTE = 0;
            MENORRTF = MENORRTF + RTFTE;
            /* LAS RETENCIONES RENTA ASUMIDAS */
            SELECT SUM(CODE_CREDITO-CODE_DEBITO), SUM(CODE_DEBITO), SUM(CODE_CREDITO)
            FROM COMPROBANTE_DETALLE D, COMPROBANTE_ENCABEZADO E, mediosmag_cuentas M
            WHERE M.mmcu_item = :idconc AND SUBSTR(CUEN_COD,1,STRLEN(M.mmcu_ctartf)) = M.mmcu_ctartf AND D.code_descontable = 'N' AND m.mmcu_ctartf <> '' AND
            E.ENCO_CONSEC = D.ENCO_CONSEC AND ENCO_FECHA >= :INICIO AND ENCO_FECHA <= :FINAL AND D.TERC_NIT = :NIT AND
            ((CODE_CREDITO <> 0) or (CODE_DEBITO <> 0)) INTO :RTFTEA, :debitos, :creditos;
            if (NATUR = 'D') then
                RTFTEA = debitos;
            if (NATUR = 'C') then
                RTFTEA = creditos;
            if (RTFTEA IS NULL) then
                RTFTEA = 0;
            MENORRTFA = MENORRTFA + RTFTEA;
            /* LAS RETENCIONES IVA */
            SELECT SUM(CODE_CREDITO-CODE_DEBITO), SUM(CODE_DEBITO), SUM(CODE_CREDITO)
            FROM COMPROBANTE_DETALLE D, COMPROBANTE_ENCABEZADO E, mediosmag_cuentas M
            WHERE M.mmcu_item = :idconc AND SUBSTR(CUEN_COD,1,STRLEN(M.mmcu_ctartiva)) = M.mmcu_ctartiva AND m.mmcu_ctartiva <> '' AND
            E.ENCO_CONSEC = D.ENCO_CONSEC AND ENCO_FECHA >= :INICIO AND ENCO_FECHA <= :FINAL AND D.TERC_NIT = :NIT AND
            ((CODE_CREDITO <> 0) or (CODE_DEBITO <> 0)) INTO :RTIVAC, :debitos, :creditos;
            if (NATUR = 'D') then
                RTIVAC = debitos;
            if (NATUR = 'C') then
                RTIVAC = creditos;
            if (RTIVAC IS NULL) then
                RTIVAC = 0;
            if (SIMPLIFICA = 'S') then
                BEGIN
                RTIVAS = RTIVAC;
                RTIVAC = 0;
                rtivand = 0;
                END
            ELSE
                if (pais <> '169') then
                    BEGIN
                    rtivand = RTIVAC;
                    RTIVAC = 0;
                    RTIVAS = 0;
                    END
                ELSE
                    begin
                    RTIVAS = 0;
                    rtivand = 0;
                    end
            MENORRTIVAC = MENORIVA + RTIVAC;
            MENORRTIVAS = MENORIVA + RTIVAS;
            MENORRTIVAN = MENORIVA + RTIVAND;
            /* LA RETENCION CREE */
            SELECT SUM(CODE_CREDITO-CODE_DEBITO), SUM(CODE_DEBITO), SUM(CODE_CREDITO)
            FROM COMPROBANTE_DETALLE D, COMPROBANTE_ENCABEZADO E, mediosmag_cuentas M
            WHERE M.mmcu_item = :idconc AND SUBSTR(CUEN_COD,1,STRLEN(M.mmcu_ctarcree)) = M.mmcu_ctarcree AND D.code_descontable = 'S' AND m.mmcu_ctarcree <> '' AND
            E.ENCO_CONSEC = D.ENCO_CONSEC AND ENCO_FECHA >= :INICIO AND ENCO_FECHA <= :FINAL AND D.TERC_NIT = :NIT AND
            ((CODE_CREDITO <> 0) or (CODE_DEBITO <> 0)) INTO :rtcree, :debitos, :creditos;
            if (NATUR = 'D') then
                rtcree = debitos;
            if (NATUR = 'C') then
                rtcree = creditos;
            if (RTFTE IS NULL) then
                rtcree = 0;
            MENORRTC = MENORRTC + rtcree;
            /* LA RETENCION CREE ASUMIDA */
            SELECT SUM(CODE_CREDITO-CODE_DEBITO), SUM(CODE_DEBITO), SUM(CODE_CREDITO)
            FROM COMPROBANTE_DETALLE D, COMPROBANTE_ENCABEZADO E, mediosmag_cuentas M
            WHERE M.mmcu_item = :idconc AND SUBSTR(CUEN_COD,1,STRLEN(M.mmcu_ctartcreeas)) = M.mmcu_ctartcreeas AND D.code_descontable = 'N' AND m.mmcu_ctartcreeas <> '' AND
            E.ENCO_CONSEC = D.ENCO_CONSEC AND ENCO_FECHA >= :INICIO AND ENCO_FECHA <= :FINAL AND D.TERC_NIT = :NIT AND
            ((CODE_CREDITO <> 0) or (CODE_DEBITO <> 0)) INTO :rtcreea, :debitos, :creditos;
            if (NATUR = 'D') then
                rtcreea = debitos;
            if (NATUR = 'C') then
                rtcreea = creditos;
            if (rtcreea IS NULL) then
                rtcreea = 0;
            menorrtca = menorrtca + rtcreea;
            END
        END
    if (MENORCUANTIA <> 0) then
        BEGIN
        if (menoriva IS NULL) then
            menoriva = 0;
        if (menorivand IS NULL) then
            menorivand = 0;
        if (menorpagond IS NULL) then
            menorpagond = 0;
        if (menorrtc IS NULL) then
            menorrtc = 0;
        if (menorrtca IS NULL) then
            menorrtca = 0;
        if (menorrtf IS NULL) then
            menorrtf = 0;
        if (menorrtfa IS NULL) then
            menorrtfa = 0;
        if (menorrtivac IS NULL) then
            menorrtivac = 0;
        if (menorrtivan IS NULL) then
            menorrtivan = 0;
        if (menorrtivas IS NULL) then
            menorrtivas = 0;
        ITEM = ITEM + 1;
        insert into medios_magneticos_datos (memg_formato, memg_ano, memg_item, memg_concepto, memg_tipodoc, memg_nit, memg_dv,memg_apellido1, memg_apellido2,
            memg_nombre1, memg_nombre2, memg_razonsocial, memg_direccion, memg_departamento, memg_municipio, memg_pago, memg_pais, memg_pagond,
            memg_iva, memg_ivand, memg_retencion, memg_reteasum, memg_retivacomun, memg_retivasimp, memg_retivand, memg_retcree, memg_rasumc)
            values (10019, substr(:inicio,1,4), :item,  :concepto, 43, '222222222', '', '', '',
            '', '', 'CUANTIAS MENORES', :dirmenor, :depmenor, :munmenor, :menorcuantia, :paismenor, :menorpagond,
            :menoriva, :menorivand, :menorrtf, :menorrtfa, :menorrtivac, :menorrtivas, :menorrtivan, :menorrtc, :menorrtca);
        END
    END

end
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER procedure MM_1002 (
    INICIO char(8),
    FINAL char(8))
AS
declare variable CONCEPTO INTEGER;
declare variable TIPODOC INTEGER;
declare variable NIT VARCHAR(20) CHARACTER SET NONE;
declare variable DV CHAR(1) CHARACTER SET NONE;
declare variable APELLIDO1 VARCHAR(60) CHARACTER SET NONE;
declare variable APELLIDO2 VARCHAR(60) CHARACTER SET NONE;
declare variable NOMBRE1 VARCHAR(60) CHARACTER SET NONE;
declare variable NOMBRE2 VARCHAR(60) CHARACTER SET NONE;
declare variable RAZONSOCIAL VARCHAR(450) CHARACTER SET NONE;
declare variable DIRECCION VARCHAR(200) CHARACTER SET NONE;
declare variable DEPARTAMENTO CHAR(2) CHARACTER SET NONE;
declare variable MUNICIPIO CHAR(3) CHARACTER SET NONE;
declare variable PAIS CHAR(3) CHARACTER SET NONE;
declare variable PAGO NUMERIC(18,0);
declare variable RETENCION NUMERIC(18,0);
declare variable ITEM INTEGER;
declare variable IDCONC INTEGER;
begin
ITEM = 0;
FOR select COME_ITEM, COME_RESPUESTA FROM configura_mediosmag WHERE COME_FORMATO = 1002
    INTO :idconc, :CONCEPTO
    DO
    BEGIN
    FOR SELECT MAX(D.TERC_NIT), SUM(CODE_CREDITO-CODE_DEBITO), SUM(CODE_BASE)
        FROM COMPROBANTE_DETALLE D, COMPROBANTE_ENCABEZADO E, mediosmag_cuentas M
        WHERE M.mmcu_item = :idconc AND E.ENCO_CONSEC = D.ENCO_CONSEC AND ENCO_FECHA >= :INICIO AND ENCO_FECHA <= :FINAL AND
        SUBSTR(CUEN_COD,1,STRLEN(M.mmcu_cuenta)) = M.mmcu_cuenta AND ((CODE_CREDITO <> 0) or (CODE_DEBITO <> 0))
        GROUP BY D.TERC_NIT
        INTO :NIT, :RETENCION, :PAGO
        DO
        BEGIN
        if (RETENCION > 0) then
            BEGIN
            PAGO = PAGO * -1;
            SELECT TERC_NITCONTA, TERC_NOM, TERC_NOMBRE1, TERC_NOMBRE2, TERC_APELLIDO1, TERC_APELLIDO2, TERC_DV, TIID_CODIGO,
                TERC_DIR, SUBSTR(CIUD_COD,1,2), SUBSTR(CIUD_COD,3,5), PAIS_ID
                FROM TERCEROS T, TIPO_ID IT WHERE TERC_NIT = :NIT AND T.TERC_TIPOID = IT.TIID_COD
                INTO :NIT, :RAZONSOCIAL, :NOMBRE1, :NOMBRE2, :APELLIDO1, :APELLIDO2, :DV, :TIPODOC, :DIRECCION, :DEPARTAMENTO, :MUNICIPIO, :PAIS;
            ITEM = ITEM + 1;
            insert into medios_magneticos_datos (memg_formato, memg_ano, memg_item, memg_concepto, memg_tipodoc, memg_nit, memg_dv,memg_apellido1, memg_apellido2, 
                memg_nombre1, memg_nombre2, memg_razonsocial, memg_direccion, memg_departamento, memg_municipio, memg_pago, memg_retencion, memg_pais)
                values (1002, substr(:inicio,1,4), :item,  :concepto, :tipodoc, :nit, :dv, :apellido1, :apellido2,
                :nombre1, :nombre2, :razonsocial, :direccion, :departamento, :municipio, :pago, :retencion, :pais);
            END
        END
    END
end
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER procedure MM_1003 (
    INICIO char(8),
    FINAL char(8))
AS
declare variable IDCONC INTEGER;
declare variable CONCEPTO INTEGER;
declare variable TIPODOC INTEGER;
declare variable NIT VARCHAR(20) CHARACTER SET NONE;
declare variable DV CHAR(1) CHARACTER SET NONE;
declare variable APELLIDO1 VARCHAR(60) CHARACTER SET NONE;
declare variable APELLIDO2 VARCHAR(60) CHARACTER SET NONE;
declare variable NOMBRE1 VARCHAR(60) CHARACTER SET NONE;
declare variable NOMBRE2 VARCHAR(60) CHARACTER SET NONE;
declare variable RAZONSOCIAL VARCHAR(450) CHARACTER SET NONE;
declare variable DIRECCION VARCHAR(200) CHARACTER SET NONE;
declare variable DEPARTAMENTO CHAR(2) CHARACTER SET NONE;
declare variable MUNICIPIO CHAR(3) CHARACTER SET NONE;
declare variable PAGO NUMERIC(18,0);
declare variable RETENCION NUMERIC(18,0);
declare variable DEBITOS NUMERIC(18,0);
declare variable CREDITOS NUMERIC(18,0);
declare variable ITEM INTEGER;
declare variable TIPOID CHAR(1);
declare variable NATUR CHAR(1);
begin
ITEM = 0;
FOR select COME_ITEM, COME_RESPUESTA, COME_NATUR FROM configura_mediosmag WHERE COME_FORMATO = 10037
    INTO :idconc, :CONCEPTO, :NATUR
    DO
    BEGIN
    FOR SELECT MAX(D.TERC_NIT), SUM(CODE_DEBITO-CODE_CREDITO), SUM(CODE_CREDITO), SUM(CODE_CREDITO), SUM(CODE_BASE)
        FROM COMPROBANTE_DETALLE D, COMPROBANTE_ENCABEZADO E, mediosmag_cuentas M
        WHERE M.mmcu_item = :idconc AND SUBSTR(CUEN_COD,1,STRLEN(M.mmcu_cuenta)) = M.mmcu_cuenta AND
        E.ENCO_CONSEC = D.ENCO_CONSEC AND ENCO_FECHA >= :INICIO AND ENCO_FECHA <= :FINAL AND
        ((CODE_CREDITO <> 0) or (CODE_DEBITO <> 0))
        GROUP BY D.TERC_NIT
        INTO :NIT, :RETENCION, :DEBITOS, :CREDITOS, :PAGO
        DO
        BEGIN
        if (NATUR = 'D') then
            RETENCION = DEBITOS;
        if (NATUR = 'C') then
            RETENCION = CREDITOS;
        if (RETENCION > 0) then
            BEGIN
            SELECT TERC_NITCONTA, TERC_NOM, TERC_NOMBRE1, TERC_NOMBRE2, TERC_APELLIDO1, TERC_APELLIDO2, TERC_DV, TIID_CODIGO,
                TERC_DIR, SUBSTR(CIUD_COD,1,2), SUBSTR(CIUD_COD,3,5), IT.tiid_cod
                FROM TERCEROS T left outer join TIPO_ID IT on (T.TERC_TIPOID = IT.TIID_COD) WHERE TERC_NIT = :NIT
                INTO :NIT, :RAZONSOCIAL, :NOMBRE1, :NOMBRE2, :APELLIDO1, :APELLIDO2, :DV, :TIPODOC, :DIRECCION, :DEPARTAMENTO, :MUNICIPIO, :TIPOID;
            if (:TIPOID <> 'J') then
                RAZONSOCIAL = '';
            ITEM = ITEM + 1;
            insert into medios_magneticos_datos (memg_formato, memg_ano, memg_item, memg_concepto, memg_tipodoc, memg_nit, memg_dv,memg_apellido1, memg_apellido2, 
                memg_nombre1, memg_nombre2, memg_razonsocial, memg_direccion, memg_departamento, memg_municipio, memg_pago, memg_retencion)
                values (10037, substr(:inicio,1,4), :item,  :concepto, :tipodoc, :nit, :dv, :apellido1, :apellido2,
                :nombre1, :nombre2, :razonsocial, :direccion, :departamento, :municipio, :pago, :retencion);
            END
        END
    END
end
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER procedure MM_10057 (
    INICIO char(8),
    FINAL char(8))
AS
declare variable TIPODOC INTEGER;
declare variable NIT VARCHAR(20) CHARACTER SET NONE;
declare variable DV CHAR(1) CHARACTER SET NONE;
declare variable APELLIDO1 VARCHAR(60) CHARACTER SET NONE;
declare variable APELLIDO2 VARCHAR(60) CHARACTER SET NONE;
declare variable NOMBRE1 VARCHAR(60) CHARACTER SET NONE;
declare variable NOMBRE2 VARCHAR(60) CHARACTER SET NONE;
declare variable RAZONSOCIAL VARCHAR(450) CHARACTER SET NONE;
declare variable IVA NUMERIC(18,0);
declare variable ITEM INTEGER;
declare variable DEBITOS NUMERIC(18,0);
declare variable CREDITOS NUMERIC(18,0);
declare variable NATUR CHAR(1);
begin
ITEM = 0;
SELECT COME_NATUR FROM configura_mediosmag WHERE COME_ITEM = 100571 INTO :NATUR;
/* IVA DESCONTABLE */
FOR SELECT MAX(D.TERC_NIT), SUM(CODE_DEBITO-CODE_CREDITO), sum(CODE_DEBITO), SUM(CODE_CREDITO)
    FROM COMPROBANTE_DETALLE D, COMPROBANTE_ENCABEZADO E, mediosmag_cuentas M
    WHERE M.mmcu_item = 100571 AND SUBSTR(CUEN_COD,1,STRLEN(M.mmcu_cuenta)) = M.mmcu_cuenta AND
    E.ENCO_CONSEC = D.ENCO_CONSEC AND ENCO_FECHA >= :INICIO AND ENCO_FECHA <= :FINAL and m.mmcu_cuenta <> ''
    GROUP BY D.TERC_NIT
    INTO :NIT, :IVA, :DEBITOS, :CREDITOS
    DO
    BEGIN
    if (IVA IS NULL) then
        IVA = 0;
    if (CREDITOS IS NULL) then
        CREDITOS = 0;
    if (DEBITOS IS NULL) then
        DEBITOS = 0;
    if (NATUR = 'C') then
        IVA = CREDITOS;
    if (NATUR = 'D') then
        IVA = DEBITOS;
    if (IVA > 0) then
        BEGIN
        SELECT TERC_NOM, TERC_NOMBRE1, TERC_NOMBRE2, TERC_APELLIDO1, TERC_APELLIDO2, TERC_DV, TIID_CODIGO
            FROM TERCEROS T, TIPO_ID IT WHERE TERC_NIT = :NIT AND T.TERC_TIPOID = IT.TIID_COD
            INTO :RAZONSOCIAL, :NOMBRE1, :NOMBRE2, :APELLIDO1, :APELLIDO2, :DV, :TIPODOC;
        ITEM = ITEM + 1;
        insert into medios_magneticos_datos (memg_formato, memg_ano, memg_item, memg_tipodoc, memg_nit, memg_dv,memg_apellido1, memg_apellido2,
            memg_nombre1, memg_nombre2, memg_razonsocial, memg_pago, memg_retencion)
            values (10057, substr(:inicio,1,4), :item, :tipodoc, :nit, :dv, :apellido1, :apellido2,
            :nombre1, :nombre2, :razonsocial, :iva, 0);
        END
    END
/* IVA DEVOLUCIONES */
FOR SELECT MAX(D.TERC_NIT), SUM(CODE_DEBITO-CODE_CREDITO), sum(CODE_DEBITO), SUM(CODE_CREDITO)
    FROM COMPROBANTE_DETALLE D, COMPROBANTE_ENCABEZADO E, mediosmag_cuentas M
    WHERE M.mmcu_item = 100571 AND SUBSTR(CUEN_COD,1,STRLEN(M.mmcu_ctartf)) = M.mmcu_ctartf AND
    E.ENCO_CONSEC = D.ENCO_CONSEC AND ENCO_FECHA >= :INICIO AND ENCO_FECHA <= :FINAL and m.mmcu_ctartf <> ''
    GROUP BY D.TERC_NIT
    INTO :NIT, :IVA, :DEBITOS, :CREDITOS
    DO
    BEGIN
    if (IVA IS NULL) then
        IVA = 0;
    if (CREDITOS IS NULL) then
        CREDITOS = 0;
    if (DEBITOS IS NULL) then
        DEBITOS = 0;
    if (NATUR = 'C') then
        IVA = CREDITOS;
    if (NATUR = 'D') then
        IVA = DEBITOS;
    if (IVA > 0) then
        BEGIN
        SELECT TERC_NOM, TERC_NOMBRE1, TERC_NOMBRE2, TERC_APELLIDO1, TERC_APELLIDO2, TERC_DV, TIID_CODIGO
            FROM TERCEROS T, TIPO_ID IT WHERE TERC_NIT = :NIT AND T.TERC_TIPOID = IT.TIID_COD
            INTO :RAZONSOCIAL, :NOMBRE1, :NOMBRE2, :APELLIDO1, :APELLIDO2, :DV, :TIPODOC;
        ITEM = ITEM + 1;
        insert into medios_magneticos_datos (memg_formato, memg_ano, memg_item, memg_tipodoc, memg_nit, memg_dv,memg_apellido1, memg_apellido2,
            memg_nombre1, memg_nombre2, memg_razonsocial, memg_pago, memg_retencion)
            values (10057, substr(:inicio,1,4), :item, :tipodoc, :nit, :dv, :apellido1, :apellido2,
            :nombre1, :nombre2, :razonsocial, 0, :iva);
        END
    END
end
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER procedure MM_10068 (
    INICIO char(8),
    FINAL char(8))
AS
declare variable TIPODOC INTEGER;
declare variable NIT VARCHAR(20) CHARACTER SET NONE;
declare variable DV CHAR(1) CHARACTER SET NONE;
declare variable APELLIDO1 VARCHAR(60) CHARACTER SET NONE;
declare variable APELLIDO2 VARCHAR(60) CHARACTER SET NONE;
declare variable NOMBRE1 VARCHAR(60) CHARACTER SET NONE;
declare variable NOMBRE2 VARCHAR(60) CHARACTER SET NONE;
declare variable RAZONSOCIAL VARCHAR(450) CHARACTER SET NONE;
declare variable IVA NUMERIC(18,0);
declare variable INALC NUMERIC(18,0);
declare variable ITEM INTEGER;
declare variable DIRMENOR VARCHAR(200) CHARACTER SET NONE;
declare variable DEPMENOR CHAR(2) CHARACTER SET NONE;
declare variable MUNMENOR CHAR(3) CHARACTER SET NONE;
declare variable MENORCUANTIA NUMERIC(18,2);
declare variable MINIMO NUMERIC(18,2);
declare variable MENORCUANTIADV NUMERIC(18,2);
declare variable DEBITOS NUMERIC(18,2);
declare variable MENORCUANTIAINALC NUMERIC(18,2);
declare variable CREDITOS NUMERIC(18,2);
declare variable NATUR CHAR(1);
begin
ITEM = 0;
MENORCUANTIA = 0;
SELECT COME_MINIMO, COME_NATUR FROM configura_mediosmag WHERE COME_ITEM = 100681 INTO :MINIMO, :NATUR;

/* IVA GENERADO */
FOR SELECT MAX(D.TERC_NIT), SUM(CODE_CREDITO-CODE_DEBITO), sum(CODE_CREDITO), SUM(CODE_DEBITO)
    FROM COMPROBANTE_DETALLE D, COMPROBANTE_ENCABEZADO E, mediosmag_cuentas M
    WHERE M.mmcu_item = 100681 AND SUBSTR(CUEN_COD,1,STRLEN(M.mmcu_cuenta)) = M.mmcu_cuenta AND
    E.ENCO_CONSEC = D.ENCO_CONSEC AND ENCO_FECHA >= :INICIO AND ENCO_FECHA <= :FINAL and m.mmcu_cuenta <> ''
    GROUP BY D.TERC_NIT
    INTO :NIT, :IVA, :creditos, :debitos
    DO
    BEGIN
    if (IVA IS NULL) then
        IVA = 0;
    if (CREDITOS IS NULL) then
        CREDITOS = 0;
    if (DEBITOS IS NULL) then
        DEBITOS = 0;
    if (NATUR = 'C') then
        IVA = CREDITOS;
    if (NATUR = 'D') then
        IVA = DEBITOS;
    if (IVA > MINIMO) then
        BEGIN
        SELECT TERC_NOM, TERC_NOMBRE1, TERC_NOMBRE2, TERC_APELLIDO1, TERC_APELLIDO2, TERC_DV, TIID_CODIGO
            FROM TERCEROS T left outer join TIPO_ID IT on (T.TERC_TIPOID = IT.TIID_COD) WHERE TERC_NIT = :NIT
            INTO :RAZONSOCIAL, :NOMBRE1, :NOMBRE2, :APELLIDO1, :APELLIDO2, :DV, :TIPODOC;
        ITEM = ITEM + 1;
        insert into medios_magneticos_datos (memg_formato, memg_ano, memg_item, memg_tipodoc, memg_nit, memg_dv,memg_apellido1, memg_apellido2,
            memg_nombre1, memg_nombre2, memg_razonsocial, memg_pago, memg_retencion, memg_pagond)
            values (10068, substr(:inicio,1,4), :item, :tipodoc, :nit, :dv, :apellido1, :apellido2,
            :nombre1, :nombre2, :razonsocial, :iva, 0, 0);
        END
     ELSE
        MENORCUANTIA = MENORCUANTIA + iva;
    END
/* IVA DEV.COMPR */
MENORCUANTIADV = 0;
FOR SELECT MAX(D.TERC_NIT), SUM(CODE_CREDITO-CODE_DEBITO), sum(CODE_CREDITO), SUM(CODE_DEBITO)
    FROM COMPROBANTE_DETALLE D, COMPROBANTE_ENCABEZADO E, mediosmag_cuentas M
    WHERE M.mmcu_item = 100681 AND SUBSTR(CUEN_COD,1,STRLEN(M.mmcu_ctartf)) = M.mmcu_ctartf AND
    E.ENCO_CONSEC = D.ENCO_CONSEC AND ENCO_FECHA >= :INICIO AND ENCO_FECHA <= :FINAL and m.mmcu_ctartf <> ''
    GROUP BY D.TERC_NIT
    INTO :NIT, :IVA, :creditos, :debitos
    DO
    BEGIN
    if (IVA IS NULL) then
        IVA = 0;
    if (CREDITOS IS NULL) then
        CREDITOS = 0;
    if (DEBITOS IS NULL) then
        DEBITOS = 0;
    if (NATUR = 'C') then
        IVA = CREDITOS;
    if (NATUR = 'D') then
        IVA = DEBITOS;
    if (IVA > MINIMO) then
        BEGIN
        SELECT TERC_NOM, TERC_NOMBRE1, TERC_NOMBRE2, TERC_APELLIDO1, TERC_APELLIDO2, TERC_DV, TIID_CODIGO
            FROM TERCEROS T left outer join TIPO_ID IT on (T.TERC_TIPOID = IT.TIID_COD) WHERE TERC_NIT = :NIT
            INTO :RAZONSOCIAL, :NOMBRE1, :NOMBRE2, :APELLIDO1, :APELLIDO2, :DV, :TIPODOC;
        ITEM = ITEM + 1;
        insert into medios_magneticos_datos (memg_formato, memg_ano, memg_item, memg_tipodoc, memg_nit, memg_dv,memg_apellido1, memg_apellido2,
            memg_nombre1, memg_nombre2, memg_razonsocial, memg_pago, memg_retencion, memg_pagond)
            values (10068, substr(:inicio,1,4), :item, :tipodoc, :nit, :dv, :apellido1, :apellido2,
            :nombre1, :nombre2, :razonsocial, 0, :iva, 0);
        END
     ELSE
        MENORCUANTIADV = MENORCUANTIADV + iva;
    END
/* IMP NAL CONSUMO */
menorcuantiainalc = 0;
FOR SELECT MAX(D.TERC_NIT), SUM(CODE_CREDITO-CODE_DEBITO), sum(CODE_CREDITO), SUM(CODE_DEBITO)
    FROM COMPROBANTE_DETALLE D, COMPROBANTE_ENCABEZADO E, mediosmag_cuentas M
    WHERE M.mmcu_item = 100681 AND SUBSTR(CUEN_COD,1,STRLEN(M.mmcu_ctaiva)) = M.mmcu_ctaiva AND
    E.ENCO_CONSEC = D.ENCO_CONSEC AND ENCO_FECHA >= :INICIO AND ENCO_FECHA <= :FINAL and m.mmcu_ctaiva <> ''
    GROUP BY D.TERC_NIT
    INTO :NIT, :inalc, :creditos, :debitos
    DO
    BEGIN
    if (inalc IS NULL) then
        inalc = 0;
    if (CREDITOS IS NULL) then
        CREDITOS = 0;
    if (DEBITOS IS NULL) then
        DEBITOS = 0;
    if (NATUR = 'C') then
        inalc = CREDITOS;
    if (NATUR = 'D') then
        inalc = DEBITOS;
    if (inalc > MINIMO) then
        BEGIN
        /* busque el tercero si ya lo encuentra haga el update */
        if (exists (select memg_item from medios_magneticos_datos where memg_formato = 10068 and memg_ano = substr(:inicio,1,4)
            and memg_nit = :nit)) then
            UPDATE medios_magneticos_datos SET MEMG_PAGOND = :INALC
                WHERE memg_formato = 10068 and memg_ano = substr(:inicio,1,4) AND memg_nit = :nit;
        ELSE
            BEGIN
            SELECT TERC_NOM, TERC_NOMBRE1, TERC_NOMBRE2, TERC_APELLIDO1, TERC_APELLIDO2, TERC_DV, TIID_CODIGO
                FROM TERCEROS T left outer join TIPO_ID IT on (T.TERC_TIPOID = IT.TIID_COD) WHERE TERC_NIT = :NIT
                INTO :RAZONSOCIAL, :NOMBRE1, :NOMBRE2, :APELLIDO1, :APELLIDO2, :DV, :TIPODOC;
            ITEM = ITEM + 1;
            insert into medios_magneticos_datos (memg_formato, memg_ano, memg_item, memg_tipodoc, memg_nit, memg_dv,memg_apellido1, memg_apellido2,
                memg_nombre1, memg_nombre2, memg_razonsocial, memg_pago, memg_retencion, memg_pagond)
                values (10068, substr(:inicio,1,4), :item, :tipodoc, :nit, :dv, :apellido1, :apellido2,
                :nombre1, :nombre2, :razonsocial, 0, 0, :inalc);
            END
        END
     ELSE
        menorcuantiainalc = menorcuantiainalc + inalc;
    END
if ((MENORCUANTIA > 0) or (MENORCUANTIADV > 0) or (menorcuantiainalc > 0)) then
    BEGIN
    EXECUTE PROCEDURE lee_configuracion('CONTABILIDAD', 'GENERAL', 'NIT COMPAÑIA') returning_values (:NIT);
    SELECT TERC_DIR, SUBSTR(CIUD_COD,1,2), SUBSTR(CIUD_COD,3,5) FROM TERCEROS WHERE TERC_NIT = :NIT
    INTO :dirmenor, :depmenor, :munmenor;
    ITEM = ITEM + 1;
    insert into medios_magneticos_datos (memg_formato, memg_ano, memg_item, memg_tipodoc, memg_nit, memg_dv,memg_apellido1, memg_apellido2,
        memg_nombre1, memg_nombre2, memg_razonsocial, memg_direccion, memg_departamento, memg_municipio, memg_pago, memg_retencion, memg_pagond)
        values (10068, substr(:inicio,1,4), :item,  43, '222222222', '', '', '',
        '', '', 'CUANTIAS MENORES', :dirmenor, :depmenor, :munmenor, :menorcuantia, :menorcuantiadv, :menorcuantiainalc);
    END
end
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER procedure MM_10078 (
    INICIO char(8),
    FINAL char(8))
AS
declare variable CONCEPTO INTEGER;
declare variable TIPODOC INTEGER;
declare variable NIT VARCHAR(20) CHARACTER SET NONE;
declare variable DV CHAR(1) CHARACTER SET NONE;
declare variable APELLIDO1 VARCHAR(60) CHARACTER SET NONE;
declare variable APELLIDO2 VARCHAR(60) CHARACTER SET NONE;
declare variable NOMBRE1 VARCHAR(60) CHARACTER SET NONE;
declare variable NOMBRE2 VARCHAR(60) CHARACTER SET NONE;
declare variable RAZONSOCIAL VARCHAR(450) CHARACTER SET NONE;
declare variable PAIS VARCHAR(3) CHARACTER SET NONE;
declare variable INGRESO NUMERIC(18,0);
declare variable DEVOLUCION NUMERIC(18,0);
declare variable ITEM INTEGER;
declare variable MINIMO NUMERIC(18,2);
declare variable MENORCUANTIAI NUMERIC(18,2);
declare variable MENORCUANTIAD NUMERIC(18,2);
declare variable TOTALTERC NUMERIC(18,2);
declare variable PAISMENOR CHAR(3) CHARACTER SET NONE;
declare variable TIPOID CHAR(1);
begin
EXECUTE PROCEDURE lee_configuracion('CONTABILIDAD', 'GENERAL', 'NIT COMPAÑIA') returning_values (:NIT);
SELECT PAIS_ID FROM TERCEROS WHERE TERC_NIT = :NIT INTO :paismenor;
ITEM = 0;
MENORCUANTIAI = 0;
MENORCUANTIAD = 0;
/* INGRESOS OPERACIONALES */
select COME_RESPUESTA, COME_MINIMO FROM configura_mediosmag WHERE COME_ITEM = 51 INTO :CONCEPTO, :MINIMO;
FOR SELECT MAX(D.TERC_NIT), SUM(CODE_CREDITO)
    FROM COMPROBANTE_DETALLE D, COMPROBANTE_ENCABEZADO E, mediosmag_cuentas M
    WHERE M.mmcu_item = 100781 AND SUBSTR(CUEN_COD,1,STRLEN(M.mmcu_cuenta)) = M.mmcu_cuenta AND
    E.ENCO_CONSEC = D.ENCO_CONSEC AND ENCO_FECHA >= :INICIO AND ENCO_FECHA <= :FINAL AND
    (CODE_CREDITO <> 0)
    GROUP BY D.TERC_NIT
    INTO :NIT, :ingreso
    DO
    BEGIN
    SELECT SUM(CODE_CREDITO-CODE_DEBITO) FROM comprobante_detalle D WHERE TERC_NIT = :NIT AND
        SUBSTR(CUEN_COD,1,1) = '4' AND EXISTS (SELECT ENCO_CONSEC FROM comprobante_encabezado WHERE
        ENCO_FECHA >= :INICIO AND ENCO_FECHA <= :FINAL AND ENCO_CONSEC = D.enco_consec)
        INTO TOTALTERC;
    if (INGRESO IS NULL) then
        INGRESO = 0;
    SELECT SUM(CODE_DEBITO)
    FROM COMPROBANTE_DETALLE D, COMPROBANTE_ENCABEZADO E, mediosmag_cuentas M
    WHERE M.mmcu_item = 100781 AND SUBSTR(CUEN_COD,1,STRLEN(M.mmcu_ctartf)) = M.mmcu_ctartf AND
    E.ENCO_CONSEC = D.ENCO_CONSEC AND ENCO_FECHA >= :INICIO AND ENCO_FECHA <= :FINAL AND
    (CODE_DEBITO <> 0) AND D.TERC_NIT = :NIT into :devolucion;
    if (DEVOLUCION IS NULL) then
        DEVOLUCION = 0;
    if ((TOTALTERC >= MINIMO) AND ((INGRESO > 0) or (DEVOLUCION > 0))) then
        BEGIN
        SELECT TERC_NOM, TERC_NOMBRE1, TERC_NOMBRE2, TERC_APELLIDO1, TERC_APELLIDO2, TERC_DV, TIID_CODIGO, PAIS_ID, IT.tiid_cod
            FROM TERCEROS T left outer join TIPO_ID IT on (T.TERC_TIPOID = IT.TIID_COD) WHERE TERC_NIT = :NIT
            INTO :RAZONSOCIAL, :NOMBRE1, :NOMBRE2, :APELLIDO1, :APELLIDO2, :DV, :TIPODOC, :PAIS, :TIPOID;
        if (:TIPOID <> 'J') then
            RAZONSOCIAL = '';
        ITEM = ITEM + 1;
        insert into medios_magneticos_datos (memg_formato, memg_ano, memg_item, memg_concepto, memg_tipodoc, memg_nit, memg_dv,memg_apellido1, memg_apellido2, 
            memg_nombre1, memg_nombre2, memg_razonsocial, memg_pago, memg_retivacomun, memg_pais)
            values (10078, substr(:inicio,1,4), :item,  :concepto, :tipodoc, :nit, :dv, :apellido1, :apellido2,
            :nombre1, :nombre2, :razonsocial, :ingreso, :devolucion, :pais);
        END
    ELSE
        BEGIN
        MENORCUANTIAI = MENORCUANTIAI + INGRESO;
        MENORCUANTIAD = MENORCUANTIAD + DEVOLUCION;
        END
    END
if ((MENORCUANTIAI > 0) or (MENORCUANTIAD > 0)) then
    BEGIN
    ITEM = ITEM + 1;
    insert into medios_magneticos_datos (memg_formato, memg_ano, memg_item, memg_concepto, memg_tipodoc, memg_nit, memg_dv,memg_apellido1, memg_apellido2,
        memg_nombre1, memg_nombre2, memg_razonsocial, memg_pago, memg_retivacomun, memg_pais)
        values (10078, substr(:inicio,1,4), :item,  :concepto, 43, '222222222', '', '', '',
        '', '', 'CUANTIAS MENORES', :menorcuantiai, :menorcuantiad, :paismenor);
    END
/* INGRESOS NO-OPERACIONALES */
MENORCUANTIAI = 0;
MENORCUANTIAD = 0;
select COME_RESPUESTA, COME_MINIMO FROM configura_mediosmag WHERE COME_ITEM = 52 INTO :CONCEPTO, :MINIMO;
FOR SELECT MAX(D.TERC_NIT), SUM(CODE_CREDITO)
    FROM COMPROBANTE_DETALLE D, COMPROBANTE_ENCABEZADO E, mediosmag_cuentas M
    WHERE M.mmcu_item = 100782 AND SUBSTR(CUEN_COD,1,STRLEN(M.mmcu_cuenta)) = M.mmcu_cuenta AND
    E.ENCO_CONSEC = D.ENCO_CONSEC AND ENCO_FECHA >= :INICIO AND ENCO_FECHA <= :FINAL AND
    (CODE_CREDITO <> 0)
    GROUP BY D.TERC_NIT
    INTO :NIT, :ingreso
    DO
    BEGIN
    SELECT SUM(CODE_CREDITO-CODE_DEBITO) FROM comprobante_detalle D WHERE TERC_NIT = :NIT AND
        SUBSTR(CUEN_COD,1,1) = '4' AND EXISTS (SELECT ENCO_CONSEC FROM comprobante_encabezado WHERE
        ENCO_FECHA >= :INICIO AND ENCO_FECHA <= :FINAL AND ENCO_CONSEC = D.enco_consec)
        INTO TOTALTERC;
    if (INGRESO IS NULL) then
        INGRESO = 0;
    SELECT SUM(CODE_DEBITO)
    FROM COMPROBANTE_DETALLE D, COMPROBANTE_ENCABEZADO E, mediosmag_cuentas M
    WHERE M.mmcu_item = 100782 AND SUBSTR(CUEN_COD,1,STRLEN(M.mmcu_ctartf)) = M.mmcu_ctartf AND
    E.ENCO_CONSEC = D.ENCO_CONSEC AND ENCO_FECHA >= :INICIO AND ENCO_FECHA <= :FINAL AND
    (CODE_DEBITO <> 0) AND D.TERC_NIT = :NIT into :devolucion;
    if (DEVOLUCION IS NULL) then
        DEVOLUCION = 0;
    if ((TOTALTERC >= MINIMO) AND ((INGRESO > 0) or (DEVOLUCION > 0))) then
        BEGIN
        SELECT TERC_NOM, TERC_NOMBRE1, TERC_NOMBRE2, TERC_APELLIDO1, TERC_APELLIDO2, TERC_DV, TIID_CODIGO, PAIS_ID, IT.tiid_cod
            FROM TERCEROS T left outer join TIPO_ID IT on (T.TERC_TIPOID = IT.TIID_COD) WHERE TERC_NIT = :NIT
            INTO :RAZONSOCIAL, :NOMBRE1, :NOMBRE2, :APELLIDO1, :APELLIDO2, :DV, :TIPODOC, :PAIS, :TIPOID;
        if (:TIPOID <> 'J') then
            RAZONSOCIAL = '';
        ITEM = ITEM + 1;
        insert into medios_magneticos_datos (memg_formato, memg_ano, memg_item, memg_concepto, memg_tipodoc, memg_nit, memg_dv,memg_apellido1, memg_apellido2, 
            memg_nombre1, memg_nombre2, memg_razonsocial, memg_pago, memg_retivacomun, memg_pais)
            values (10078, substr(:inicio,1,4), :item,  :concepto, :tipodoc, :nit, :dv, :apellido1, :apellido2,
            :nombre1, :nombre2, :razonsocial, :ingreso, :devolucion, :pais);
        END
    ELSE
        BEGIN
        MENORCUANTIAI = MENORCUANTIAI + INGRESO;
        MENORCUANTIAD = MENORCUANTIAD + DEVOLUCION;
        END
    END
if ((MENORCUANTIAI > 0) or (MENORCUANTIAD > 0)) then
    BEGIN
    ITEM = ITEM + 1;
    insert into medios_magneticos_datos (memg_formato, memg_ano, memg_item, memg_concepto, memg_tipodoc, memg_nit, memg_dv,memg_apellido1, memg_apellido2,
        memg_nombre1, memg_nombre2, memg_razonsocial, memg_pago, memg_retivacomun, memg_pais)
        values (10078, substr(:inicio,1,4), :item,  :concepto, 43, '222222222', '', '', '',
        '', '', 'CUANTIAS MENORES', :menorcuantiai, :menorcuantiad, :paismenor);
    END
/* INGRESOS FINANCIEROS*/
MENORCUANTIAI = 0;
MENORCUANTIAD = 0;
select COME_RESPUESTA, COME_MINIMO FROM configura_mediosmag WHERE COME_ITEM = 53 INTO :CONCEPTO, :MINIMO;
FOR SELECT MAX(D.TERC_NIT), SUM(CODE_CREDITO)
    FROM COMPROBANTE_DETALLE D, COMPROBANTE_ENCABEZADO E, mediosmag_cuentas M
    WHERE M.mmcu_item = 100783 AND SUBSTR(CUEN_COD,1,STRLEN(M.mmcu_cuenta)) = M.mmcu_cuenta AND
    E.ENCO_CONSEC = D.ENCO_CONSEC AND ENCO_FECHA >= :INICIO AND ENCO_FECHA <= :FINAL AND
    (CODE_CREDITO <> 0)
    GROUP BY D.TERC_NIT
    INTO :NIT, :ingreso
    DO
    BEGIN
    SELECT SUM(CODE_CREDITO-CODE_DEBITO) FROM comprobante_detalle D WHERE TERC_NIT = :NIT AND
        SUBSTR(CUEN_COD,1,1) = '4' AND EXISTS (SELECT ENCO_CONSEC FROM comprobante_encabezado WHERE
        ENCO_FECHA >= :INICIO AND ENCO_FECHA <= :FINAL AND ENCO_CONSEC = D.enco_consec)
        INTO TOTALTERC;
    if (INGRESO IS NULL) then
        INGRESO = 0;
    SELECT SUM(CODE_DEBITO)
    FROM COMPROBANTE_DETALLE D, COMPROBANTE_ENCABEZADO E, mediosmag_cuentas M
    WHERE M.mmcu_item = 100783 AND SUBSTR(CUEN_COD,1,STRLEN(M.mmcu_ctartf)) = M.mmcu_ctartf AND
    E.ENCO_CONSEC = D.ENCO_CONSEC AND ENCO_FECHA >= :INICIO AND ENCO_FECHA <= :FINAL AND
    (CODE_DEBITO <> 0) AND D.TERC_NIT = :NIT into :devolucion;
    if (DEVOLUCION IS NULL) then
        DEVOLUCION = 0;
    if ((TOTALTERC >= MINIMO) AND ((INGRESO > 0) or (DEVOLUCION > 0))) then
        BEGIN
        SELECT TERC_NOM, TERC_NOMBRE1, TERC_NOMBRE2, TERC_APELLIDO1, TERC_APELLIDO2, TERC_DV, TIID_CODIGO, PAIS_ID, IT.tiid_cod
            FROM TERCEROS T left outer join TIPO_ID IT on (T.TERC_TIPOID = IT.TIID_COD) WHERE TERC_NIT = :NIT
            INTO :RAZONSOCIAL, :NOMBRE1, :NOMBRE2, :APELLIDO1, :APELLIDO2, :DV, :TIPODOC, :PAIS, :TIPOID;
        if (:TIPOID <> 'J') then
            RAZONSOCIAL = '';
        ITEM = ITEM + 1;
        insert into medios_magneticos_datos (memg_formato, memg_ano, memg_item, memg_concepto, memg_tipodoc, memg_nit, memg_dv,memg_apellido1, memg_apellido2, 
            memg_nombre1, memg_nombre2, memg_razonsocial, memg_pago, memg_retivacomun, memg_pais)
            values (10078, substr(:inicio,1,4), :item,  :concepto, :tipodoc, :nit, :dv, :apellido1, :apellido2,
            :nombre1, :nombre2, :razonsocial, :ingreso, :devolucion, :pais);
        END
    ELSE
        BEGIN
        MENORCUANTIAI = MENORCUANTIAI + INGRESO;
        MENORCUANTIAD = MENORCUANTIAD + DEVOLUCION;
        END
    END
if ((MENORCUANTIAI > 0) or (MENORCUANTIAD > 0)) then
    BEGIN
    ITEM = ITEM + 1;
    insert into medios_magneticos_datos (memg_formato, memg_ano, memg_item, memg_concepto, memg_tipodoc, memg_nit, memg_dv,memg_apellido1, memg_apellido2,
        memg_nombre1, memg_nombre2, memg_razonsocial, memg_pago, memg_retivacomun, memg_pais)
        values (10078, substr(:inicio,1,4), :item,  :concepto, 43, '222222222', '', '', '',
        '', '', 'CUANTIAS MENORES', :menorcuantiai, :menorcuantiad, :paismenor);
    END
end
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER procedure MM_1008 (
    INICIO char(8),
    FINAL char(8))
AS
declare variable IDCONC INTEGER;
declare variable CONCEPTO INTEGER;
declare variable TIPODOC INTEGER;
declare variable NIT VARCHAR(20) CHARACTER SET NONE;
declare variable DV CHAR(1) CHARACTER SET NONE;
declare variable APELLIDO1 VARCHAR(60) CHARACTER SET NONE;
declare variable APELLIDO2 VARCHAR(60) CHARACTER SET NONE;
declare variable NOMBRE1 VARCHAR(60) CHARACTER SET NONE;
declare variable NOMBRE2 VARCHAR(60) CHARACTER SET NONE;
declare variable RAZONSOCIAL VARCHAR(450) CHARACTER SET NONE;
declare variable DIRECCION VARCHAR(200) CHARACTER SET NONE;
declare variable DEPARTAMENTO CHAR(2) CHARACTER SET NONE;
declare variable MUNICIPIO CHAR(3) CHARACTER SET NONE;
declare variable PAIS CHAR(3) CHARACTER SET NONE;
declare variable SALDO NUMERIC(18,0);
declare variable SALDOAUX NUMERIC(18,0);
declare variable CUENTA VARCHAR(20);
declare variable MINIMO NUMERIC(18,0);
declare variable MENORCUANTIA NUMERIC(18,2);
declare variable ITEM INTEGER;
declare variable ANO CHAR(4);
declare variable DIRMENOR VARCHAR(200) CHARACTER SET NONE;
declare variable DEPMENOR CHAR(2) CHARACTER SET NONE;
declare variable MUNMENOR CHAR(3) CHARACTER SET NONE;
declare variable PAISMENOR CHAR(3) CHARACTER SET NONE;
declare variable TIPOID CHAR(1);
begin
EXECUTE PROCEDURE lee_configuracion('CONTABILIDAD', 'GENERAL', 'NIT COMPAÑIA') returning_values (:NIT);
SELECT TERC_DIR, SUBSTR(CIUD_COD,1,2), SUBSTR(CIUD_COD,3,5), PAIS_ID FROM TERCEROS WHERE TERC_NIT = :NIT
    INTO :dirmenor, :depmenor, :munmenor, :paismenor;
ITEM = 0;
ANO = SUBSTR(INICIO,1,4);
/* CXC CLIENTES */
FOR select COME_ITEM, COME_RESPUESTA, COME_MINIMO
    FROM configura_mediosmag WHERE COME_FORMATO = 10087 INTO :idconc, :CONCEPTO, :MINIMO
    DO
    BEGIN
    MENORCUANTIA = 0;
    FOR SELECT distinct TERC_NIT FROM SALDOS_TERCEROS S, mediosmag_cuentas M
        WHERE M.mmcu_item = :idconc AND CUEN_COD >= M.mmcu_cuenta AND CUEN_COD <= M.mmcu_cuenta || '999999'
        ORDER BY TERC_NIT INTO :NIT
        do
        BEGIN
        SALDO = 0;
        FOR SELECT DISTINCT CUEN_COD FROM SALDOS_TERCEROS S, mediosmag_cuentas M
            WHERE TERC_NIT = :NIT AND M.mmcu_item = :IDCONC AND CUEN_COD >= M.mmcu_cuenta AND CUEN_COD <= M.mmcu_cuenta || '999999'
            INTO :CUENTA
            DO
            BEGIN
            EXECUTE PROCEDURE SALDO_TERCERO_MES(CUENTA, NIT, ANO, 12, 'N') RETURNING_VALUES (SALDOAUX);
            SALDO = SALDO + SALDOAUX;
            END
        if (SALDO >= MINIMO) then
            BEGIN
            SELECT TERC_NITCONTA, TERC_NOM, TERC_NOMBRE1, TERC_NOMBRE2, TERC_APELLIDO1, TERC_APELLIDO2, TERC_DV, TIID_CODIGO,
                TERC_DIR, SUBSTR(CIUD_COD,1,2), SUBSTR(CIUD_COD,3,5), PAIS_ID, IT.tiid_cod
                FROM TERCEROS T left outer join TIPO_ID IT on (T.TERC_TIPOID = IT.TIID_COD) WHERE TERC_NIT = :NIT
                INTO :NIT, :RAZONSOCIAL, :NOMBRE1, :NOMBRE2, :APELLIDO1, :APELLIDO2, :DV, :TIPODOC, :DIRECCION, :DEPARTAMENTO, :MUNICIPIO, :PAIS, :TIPOID;
            if (:TIPOID <> 'J') then
                RAZONSOCIAL = '';
            ITEM = ITEM + 1;
            insert into medios_magneticos_datos (memg_formato, memg_ano, memg_item, memg_concepto, memg_tipodoc, memg_nit, memg_dv,memg_apellido1, memg_apellido2,
                memg_nombre1, memg_nombre2, memg_razonsocial, memg_direccion, memg_departamento, memg_municipio, memg_pago, memg_pais)
                values (10087, substr(:inicio,1,4), :item,  :concepto, :tipodoc, :nit, :dv, :apellido1, :apellido2,
                :nombre1, :nombre2, :razonsocial, :direccion, :departamento, :municipio, :SALDO, :pais);
            END
        ELSE
            MENORCUANTIA = MENORCUANTIA + SALDO;
        END
    if (MENORCUANTIA <> 0) then
        BEGIN
        ITEM = ITEM + 1;
        insert into medios_magneticos_datos (memg_formato, memg_ano, memg_item, memg_concepto, memg_tipodoc, memg_nit, memg_dv,memg_apellido1, memg_apellido2,
            memg_nombre1, memg_nombre2, memg_razonsocial, memg_direccion, memg_departamento, memg_municipio, memg_pago, memg_pais)
            values (10087, substr(:inicio,1,4), :item,  :concepto, 43, '222222222', '', '', '',
            '', '', 'CUANTIAS MENORES', :dirmenor, :depmenor, :munmenor, :menorcuantia, :paismenor);
        END
    END
end
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER procedure MM_1012 (
    INICIO char(8),
    FINAL char(8))
AS
declare variable CONCEPTO INTEGER;
declare variable TIPODOC INTEGER;
declare variable NIT VARCHAR(20) CHARACTER SET NONE;
declare variable DV CHAR(1) CHARACTER SET NONE;
declare variable APELLIDO1 VARCHAR(60) CHARACTER SET NONE;
declare variable APELLIDO2 VARCHAR(60) CHARACTER SET NONE;
declare variable NOMBRE1 VARCHAR(60) CHARACTER SET NONE;
declare variable NOMBRE2 VARCHAR(60) CHARACTER SET NONE;
declare variable RAZONSOCIAL VARCHAR(450) CHARACTER SET NONE;
declare variable PAIS VARCHAR(3) CHARACTER SET NONE;
declare variable SALDO NUMERIC(18,0);
declare variable SALDOAUX NUMERIC(18,0);
declare variable CUENTA VARCHAR(20);
declare variable ITEM INTEGER;
declare variable ANO CHAR(4);
begin
ITEM = 0;
ANO = SUBSTR(INICIO,1,4);
/* SALDOS EN BANCOS NACIONALES */
select COME_RESPUESTA FROM configura_mediosmag WHERE COME_ITEM = 82 INTO :CONCEPTO;
FOR SELECT distinct TERC_NIT FROM SALDOS_TERCEROS WHERE SUBSTR(CUEN_COD,1,6) = '111005' OR
    SUBSTR(CUEN_COD,1,4) = '1120' ORDER BY TERC_NIT INTO :NIT
    do
    BEGIN
    SELECT TERC_NOM, TERC_NOMBRE1, TERC_NOMBRE2, TERC_APELLIDO1, TERC_APELLIDO2, TERC_DV, TIID_CODIGO, PAIS_ID
        FROM TERCEROS T left outer join TIPO_ID IT on (T.TERC_TIPOID = IT.TIID_COD) WHERE TERC_NIT = :NIT
        INTO :RAZONSOCIAL, :NOMBRE1, :NOMBRE2, :APELLIDO1, :APELLIDO2, :DV, :TIPODOC, :PAIS;
    SALDO = 0;
    FOR SELECT DISTINCT CUEN_COD FROM SALDOS_TERCEROS WHERE TERC_NIT = :NIT AND
        SUBSTR(CUEN_COD,1,6) = '111005' OR SUBSTR(CUEN_COD,1,4) = '1120' INTO :CUENTA
        DO
        BEGIN
        EXECUTE PROCEDURE SALDO_TERCERO_MES(CUENTA, NIT, ANO, 12, 'N') RETURNING_VALUES (SALDOAUX);
        SALDO = SALDO + SALDOAUX;
        END
    if (SALDO > 0) then
        BEGIN
        ITEM = ITEM + 1;
        insert into medios_magneticos_datos (memg_formato, memg_ano, memg_item, memg_concepto, memg_tipodoc, memg_nit, memg_dv,memg_apellido1, memg_apellido2,
            memg_nombre1, memg_nombre2, memg_razonsocial, memg_pago, memg_pais)
            values (10127, :ANO, :item,  :concepto, :tipodoc, :nit, :dv, :apellido1, :apellido2,
            :nombre1, :nombre2, :razonsocial, :SALDO, :pais);
        END
    END
/* SALDOS EN BANCOS EXTERIOR CONSOLIDADO */
EXECUTE PROCEDURE saldo_cuentaf ('111010', FINAL) returning_values (SALDO);
ITEM = ITEM + 1;
TIPODOC = 31;
NIT = '444444000';
RAZONSOCIAL = 'OPERACIONES DEL EXTERIOR';
APELLIDO1 = '';
APELLIDO2 = '';
NOMBRE1 = '';
NOMBRE2 = '';
if (SALDO > 0) then
    BEGIN
    ITEM = ITEM + 1;
    insert into medios_magneticos_datos (memg_formato, memg_ano, memg_item, memg_concepto, memg_tipodoc, memg_nit, memg_dv,memg_apellido1, memg_apellido2,
        memg_nombre1, memg_nombre2, memg_razonsocial, memg_pago, memg_pais)
        values (10127, :ANO, :item,  :concepto, :tipodoc, :nit, :dv, :apellido1, :apellido2,
        :nombre1, :nombre2, :razonsocial, :SALDO, :pais);
    END
/* SALDOS INVERSIONES EN BONOS */
select COME_RESPUESTA FROM configura_mediosmag WHERE COME_ITEM = 83 INTO :CONCEPTO;
FOR SELECT distinct TERC_NIT FROM SALDOS_TERCEROS WHERE SUBSTR(CUEN_COD,1,4) = '1215' ORDER BY TERC_NIT INTO :NIT
    do
    BEGIN
    SELECT TERC_NOM, TERC_NOMBRE1, TERC_NOMBRE2, TERC_APELLIDO1, TERC_APELLIDO2, TERC_DV, TIID_CODIGO, PAIS_ID
        FROM TERCEROS T left outer join TIPO_ID IT on (T.TERC_TIPOID = IT.TIID_COD) WHERE TERC_NIT = :NIT
        INTO :RAZONSOCIAL, :NOMBRE1, :NOMBRE2, :APELLIDO1, :APELLIDO2, :DV, :TIPODOC, :PAIS;
    SALDO = 0;
    FOR SELECT DISTINCT CUEN_COD FROM SALDOS_TERCEROS WHERE TERC_NIT = :NIT AND
        SUBSTR(CUEN_COD,1,4) = '1215' INTO :CUENTA
        DO
        BEGIN
        EXECUTE PROCEDURE SALDO_TERCERO_MES(CUENTA, NIT, ANO, 12, 'N') RETURNING_VALUES (SALDOAUX);
        SALDO = SALDO + SALDOAUX;
        END
    if (SALDO > 0) then
        BEGIN
        ITEM = ITEM + 1;
        insert into medios_magneticos_datos (memg_formato, memg_ano, memg_item, memg_concepto, memg_tipodoc, memg_nit, memg_dv,memg_apellido1, memg_apellido2,
            memg_nombre1, memg_nombre2, memg_razonsocial, memg_pago, memg_pais)
            values (10127, :ANO, :item,  :concepto, :tipodoc, :nit, :dv, :apellido1, :apellido2,
            :nombre1, :nombre2, :razonsocial, :SALDO, :pais);
        END
    END
/* SALDOS INVERSIONES EN CDTS */
select COME_RESPUESTA FROM configura_mediosmag WHERE COME_ITEM = 84 INTO :CONCEPTO;
FOR SELECT distinct TERC_NIT FROM SALDOS_TERCEROS WHERE SUBSTR(CUEN_COD,1,4) = '1225' ORDER BY TERC_NIT INTO :NIT
    do
    BEGIN
    SELECT TERC_NOM, TERC_NOMBRE1, TERC_NOMBRE2, TERC_APELLIDO1, TERC_APELLIDO2, TERC_DV, TIID_CODIGO, PAIS_ID
        FROM TERCEROS T left outer join TIPO_ID IT on (T.TERC_TIPOID = IT.TIID_COD) WHERE TERC_NIT = :NIT
        INTO :RAZONSOCIAL, :NOMBRE1, :NOMBRE2, :APELLIDO1, :APELLIDO2, :DV, :TIPODOC, :PAIS;
    SALDO = 0;
    FOR SELECT DISTINCT CUEN_COD FROM SALDOS_TERCEROS WHERE TERC_NIT = :NIT AND
        SUBSTR(CUEN_COD,1,4) = '1225' INTO :CUENTA
        DO
        BEGIN
        EXECUTE PROCEDURE SALDO_TERCERO_MES(CUENTA, NIT, ANO, 12, 'N') RETURNING_VALUES (SALDOAUX);
        SALDO = SALDO + SALDOAUX;
        END
    if (SALDO > 0) then
        BEGIN
        ITEM = ITEM + 1;
        insert into medios_magneticos_datos (memg_formato, memg_ano, memg_item, memg_concepto, memg_tipodoc, memg_nit, memg_dv,memg_apellido1, memg_apellido2,
            memg_nombre1, memg_nombre2, memg_razonsocial, memg_pago, memg_pais)
            values (10127, :ANO, :item,  :concepto, :tipodoc, :nit, :dv, :apellido1, :apellido2,
            :nombre1, :nombre2, :razonsocial, :SALDO, :pais);
        END
    END
/* SALDOS INVERSIONES EN TITULOS */
select COME_RESPUESTA FROM configura_mediosmag WHERE COME_ITEM = 85 INTO :CONCEPTO;
FOR SELECT distinct TERC_NIT FROM SALDOS_TERCEROS WHERE SUBSTR(CUEN_COD,1,4) = '1235' ORDER BY TERC_NIT INTO :NIT
    do
    BEGIN
    SELECT TERC_NOM, TERC_NOMBRE1, TERC_NOMBRE2, TERC_APELLIDO1, TERC_APELLIDO2, TERC_DV, TIID_CODIGO, PAIS_ID
        FROM TERCEROS T left outer join TIPO_ID IT on (T.TERC_TIPOID = IT.TIID_COD) WHERE TERC_NIT = :NIT
        INTO :RAZONSOCIAL, :NOMBRE1, :NOMBRE2, :APELLIDO1, :APELLIDO2, :DV, :TIPODOC, :PAIS;
    SALDO = 0;
    FOR SELECT DISTINCT CUEN_COD FROM SALDOS_TERCEROS WHERE TERC_NIT = :NIT AND
        SUBSTR(CUEN_COD,1,4) = '1235' INTO :CUENTA
        DO
        BEGIN
        EXECUTE PROCEDURE SALDO_TERCERO_MES(CUENTA, NIT, ANO, 12, 'N') RETURNING_VALUES (SALDOAUX);
        SALDO = SALDO + SALDOAUX;
        END
    if (SALDO > 0) then
        BEGIN
        ITEM = ITEM + 1;
        insert into medios_magneticos_datos (memg_formato, memg_ano, memg_item, memg_concepto, memg_tipodoc, memg_nit, memg_dv,memg_apellido1, memg_apellido2,
            memg_nombre1, memg_nombre2, memg_razonsocial, memg_pago, memg_pais)
            values (10127, :ANO, :item,  :concepto, :tipodoc, :nit, :dv, :apellido1, :apellido2,
            :nombre1, :nombre2, :razonsocial, :SALDO, :pais);
        END
    END
/* SALDOS INVERSIONES EN DERECHOS FID. */
select COME_RESPUESTA FROM configura_mediosmag WHERE COME_ITEM = 86 INTO :CONCEPTO;
FOR SELECT distinct TERC_NIT FROM SALDOS_TERCEROS WHERE SUBSTR(CUEN_COD,1,4) = '1245' ORDER BY TERC_NIT INTO :NIT
    do
    BEGIN
    SELECT TERC_NOM, TERC_NOMBRE1, TERC_NOMBRE2, TERC_APELLIDO1, TERC_APELLIDO2, TERC_DV, TIID_CODIGO, PAIS_ID
        FROM TERCEROS T left outer join TIPO_ID IT on (T.TERC_TIPOID = IT.TIID_COD) WHERE TERC_NIT = :NIT
        INTO :RAZONSOCIAL, :NOMBRE1, :NOMBRE2, :APELLIDO1, :APELLIDO2, :DV, :TIPODOC, :PAIS;
    SALDO = 0;
    FOR SELECT DISTINCT CUEN_COD FROM SALDOS_TERCEROS WHERE TERC_NIT = :NIT AND
        SUBSTR(CUEN_COD,1,4) = '1245' INTO :CUENTA
        DO
        BEGIN
        EXECUTE PROCEDURE SALDO_TERCERO_MES(CUENTA, NIT, ANO, 12, 'N') RETURNING_VALUES (SALDOAUX);
        SALDO = SALDO + SALDOAUX;
        END
    if (SALDO > 0) then
        BEGIN
        ITEM = ITEM + 1;
        insert into medios_magneticos_datos (memg_formato, memg_ano, memg_item, memg_concepto, memg_tipodoc, memg_nit, memg_dv,memg_apellido1, memg_apellido2,
            memg_nombre1, memg_nombre2, memg_razonsocial, memg_pago, memg_pais)
            values (10127, :ANO, :item,  :concepto, :tipodoc, :nit, :dv, :apellido1, :apellido2,
            :nombre1, :nombre2, :razonsocial, :SALDO, :pais);
        END
    END
/* SALDOS OTRAS INVERSIONES */
select COME_RESPUESTA FROM configura_mediosmag WHERE COME_ITEM = 87 INTO :CONCEPTO;
FOR SELECT distinct TERC_NIT FROM SALDOS_TERCEROS WHERE SUBSTR(CUEN_COD,1,4) = '1220' OR
    SUBSTR(CUEN_COD,1,4) = '1230' or SUBSTR(CUEN_COD,1,4) = '1240' OR SUBSTR(CUEN_COD,1,4) = '1250' OR
    SUBSTR(CUEN_COD,1,4) = '1255' OR SUBSTR(CUEN_COD,1,4) = '1260' or SUBSTR(CUEN_COD,1,4) = '1295'
    ORDER BY TERC_NIT INTO :NIT
    do
    BEGIN
    SELECT TERC_NOM, TERC_NOMBRE1, TERC_NOMBRE2, TERC_APELLIDO1, TERC_APELLIDO2, TERC_DV, TIID_CODIGO, PAIS_ID
        FROM TERCEROS T left outer join TIPO_ID IT on (T.TERC_TIPOID = IT.TIID_COD) WHERE TERC_NIT = :NIT
        INTO :RAZONSOCIAL, :NOMBRE1, :NOMBRE2, :APELLIDO1, :APELLIDO2, :DV, :TIPODOC, :PAIS;
    SALDO = 0;
    FOR SELECT DISTINCT CUEN_COD FROM SALDOS_TERCEROS WHERE TERC_NIT = :NIT AND
        SUBSTR(CUEN_COD,1,4) = '1220' or SUBSTR(CUEN_COD,1,4) = '1230' or SUBSTR(CUEN_COD,1,4) = '1240' OR
        SUBSTR(CUEN_COD,1,4) = '1250' or SUBSTR(CUEN_COD,1,4) = '1255' OR SUBSTR(CUEN_COD,1,4) = '1260' or
        SUBSTR(CUEN_COD,1,4) = '1295' INTO :CUENTA
        DO
        BEGIN
        EXECUTE PROCEDURE SALDO_TERCERO_MES(CUENTA, NIT, ANO, 12, 'N') RETURNING_VALUES (SALDOAUX);
        SALDO = SALDO + SALDOAUX;
        END
    if (SALDO > 0) then
        BEGIN
        ITEM = ITEM + 1;
        insert into medios_magneticos_datos (memg_formato, memg_ano, memg_item, memg_concepto, memg_tipodoc, memg_nit, memg_dv,memg_apellido1, memg_apellido2,
            memg_nombre1, memg_nombre2, memg_razonsocial, memg_pago, memg_pais)
            values (10127, :ANO, :item,  :concepto, :tipodoc, :nit, :dv, :apellido1, :apellido2,
            :nombre1, :nombre2, :razonsocial, :SALDO, :pais);
        END
    END
/* SALDOS ACCIONES O CUOTAS */
select COME_RESPUESTA FROM configura_mediosmag WHERE COME_ITEM = 88 INTO :CONCEPTO;
FOR SELECT distinct TERC_NIT FROM SALDOS_TERCEROS WHERE SUBSTR(CUEN_COD,1,4) = '1205' OR
    SUBSTR(CUEN_COD,1,4) = '1210' ORDER BY TERC_NIT INTO :NIT
    do
    BEGIN
    SELECT TERC_NOM, TERC_NOMBRE1, TERC_NOMBRE2, TERC_APELLIDO1, TERC_APELLIDO2, TERC_DV, TIID_CODIGO, PAIS_ID
        FROM TERCEROS T left outer join TIPO_ID IT on (T.TERC_TIPOID = IT.TIID_COD) WHERE TERC_NIT = :NIT
        INTO :RAZONSOCIAL, :NOMBRE1, :NOMBRE2, :APELLIDO1, :APELLIDO2, :DV, :TIPODOC, :PAIS;
    SALDO = 0;
    FOR SELECT DISTINCT CUEN_COD FROM SALDOS_TERCEROS WHERE TERC_NIT = :NIT AND
        SUBSTR(CUEN_COD,1,4) = '1205' OR SUBSTR(CUEN_COD,1,4) = '1210' INTO :CUENTA
        DO
        BEGIN
        EXECUTE PROCEDURE SALDO_TERCERO_MES(CUENTA, NIT, ANO, 12, 'N') RETURNING_VALUES (SALDOAUX);
        SALDO = SALDO + SALDOAUX;
        END
    if (SALDO > 0) then
        BEGIN
        ITEM = ITEM + 1;
        insert into medios_magneticos_datos (memg_formato, memg_ano, memg_item, memg_concepto, memg_tipodoc, memg_nit, memg_dv,memg_apellido1, memg_apellido2,
            memg_nombre1, memg_nombre2, memg_razonsocial, memg_pago, memg_pais)
            values (10127, :ANO, :item,  :concepto, :tipodoc, :nit, :dv, :apellido1, :apellido2,
            :nombre1, :nombre2, :razonsocial, :SALDO, :pais);
        END
    END
end
^

SET TERM ; ^

/* 20140401D */
/* string truncation por codevn de 2c */
SET TERM ^ ;

CREATE OR ALTER procedure COMISIONES_ARTICULO (
    DETALLE char(1),
    DESDE integer,
    HASTA integer,
    FECINI date,
    FECFIN date,
    ARTINI varchar(15),
    ARTFIN varchar(15),
    CEROS char(1),
    AGENCIA integer,
    SOLOTOT char(1))
returns (
    CODVEND varchar(10),
    NOMVEND varchar(60),
    NOMTIPO varchar(10),
    ARTICULO varchar(15),
    DESCRIPCION varchar(60),
    CODGRUPO varchar(2),
    NOMGRUPO varchar(30),
    CODSUBG varchar(3),
    NOMSUBG varchar(30),
    CODMARC varchar(3),
    NOMMARC varchar(30),
    UNIDAD varchar(8),
    CANTVTAS numeric(18,4),
    CANTDEV numeric(18,4),
    BASEVTAS numeric(18,2),
    BASEDEV numeric(18,2),
    PORC numeric(18,2),
    COMISION numeric(18,2),
    PREFIJO varchar(4),
    NUMERO varchar(8),
    FECHA date,
    PUNTOVTA integer)
AS
declare variable COMIPOR NUMERIC(9,2);
declare variable COMIPORM NUMERIC(9,2);
declare variable COMIMONTO NUMERIC(18,2);
declare variable LISTA VARCHAR(6);
declare variable COMIPPOR NUMERIC(9,2);
declare variable COMIPMONTO NUMERIC(18,2);
declare variable IDFAC INTEGER;
declare variable COMIXVND CHAR(2);
declare variable TOTBASEV NUMERIC(18,2);
declare variable TOTBASED NUMERIC(18,2);
declare variable TOTCOMIS NUMERIC(18,2);
BEGIN
EXECUTE PROCEDURE lee_configuracion ('FACTURACION', 'ARTICULOS', 'COMISIONES POR ARTICULO POR GRUPO O POR LISTA DE PRECIOS') returning_values (LISTA);
EXECUTE PROCEDURE lee_configuracion ('FACTURACION', 'ARTICULOS', 'COMISION POR ARTICULO Y PROPORCION POR VENDEDOR') returning_values (comixvnd);
FOR select VEND_COD, VEND_NOMBRE
    from VENDEDORES
    where VEND_COD >= :DESDE AND VEND_COD <= :HASTA AND ((:AGENCIA = 0) or (SUCU_ID = :AGENCIA)) AND VEND_ESTADO = 'A'
    INTO :CODVEND, :NOMVEND
    DO  
    BEGIN
    TOTBASEV = 0;
    TOTBASED = 0;
    TOTCOMIS = 0;
    FOR SELECT ARTI_COD, ARTI_DES, ARTI_UNIDAD, A.GRUP_COD, GRUP_NOM, A.SUBG_COD, A.MARC_COD, GRUP_COMIPOR, GRUP_COMIMONTO
        FROM ARTICULO A, GRUPO G
        WHERE ARTI_COD >= :ARTINI AND ARTI_COD <= :ARTFIN AND A.GRUP_COD = G.GRUP_COD and substring(a.arti_cod from 1 FOR 2) <> '.t'
      INTO :ARTICULO, :DESCRIPCION, :UNIDAD, :CODGRUPO, :NOMGRUPO, :CODSUBG, :CODMARC, :COMIPOR, :COMIMONTO
      DO
        BEGIN
        SELECT MARC_NOM, MARC_COMIPOR FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC, :COMIPORM;
        SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
        if (COMIMONTO IS null) then
            COMIMONTO = 0;
        BASEDEV = 0;
        BASEVTAS = 0;
        CANTDEV = 0;
        CANTVTAS = 0;
        if (DETALLE = 'N') then
            BEGIN
            if ((LISTA = 'GRUPO') or (LISTA = 'MARCA')) then
                BEGIN
                SELECT SUM(FADE_CANT * FADE_FACTOR), SUM(FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO)
                    FROM FACTURAS_DETALLE D, FACTURAS F
                    WHERE F.FACT_ID = D.FACT_ID AND ARTI_COD = :ARTICULO AND FACT_FECHA >= :FECINI AND FACT_FECHA <= :FECFIN AND VEND_COD = :CODVEND AND FACT_ANULADO = 'N'
                    INTO :CANTVTAS, :BASEVTAS;
                SELECT SUM(DVDE_CANT * DVDE_FACTOR), SUM(DVDE_TOTAL-DVDE_IVAMONTO-DVDE_CONSUMO)
                    FROM devoluciones_ventas_detalle D, DEVOLUCIONES_VENTAS V
                    WHERE V.DEVT_ID = D.DEVT_ID AND ARTI_COD = :ARTICULO AND DEVT_FECHA >= :FECINI AND DEVT_FECHA <= :FECFIN AND VEND_COD = :CODVEND AND DEVT_ANULADO = 'N'
                    INTO :CANTDEV, :BASEDEV;
                if (CANTVTAS IS NULL) then
                    CANTVTAS = 0;
                if (CANTDEV IS NULL) then
                    CANTDEV = 0;
                if (BASEVTAS IS NULL) then
                    BASEVTAS = 0;
                if (BASEDEV IS NULL) then
                    BASEDEV = 0;
                if (COMIMONTO > 0) then
                    BEGIN
                    COMISION = (CANTVTAS - CANTDEV) * COMIMONTO;
                    PORC = COMISION * 100 / (BASEVTAS - BASEDEV);
                    END
                ELSE
                    BEGIN
                    if (LISTA = 'MARCA') then
                        BEGIN
                        COMISION = (BASEVTAS - BASEDEV) * COMIPORM / 100;
                        PORC = COMIPORM;
                        END
                    else
                        BEGIN
                        COMISION = (BASEVTAS - BASEDEV) * COMIPOR / 100;
                        PORC = COMIPOR;
                        END
                    END
                if (comixvnd = 'SI') then
                    begin
                    COMIPOR = 100;
                    SELECT MAX(COMI_PORC) FROM comisiones WHERE VEND_COD = :codvend AND
                        COMI_INICIAL <= (:BASEVTAS - :BASEDEV) AND COMI_FINAL >= (:BASEVTAS - :BASEDEV) INTO :comipor;
                    porc = PORC * COMIPOR;
                    end
                if (SOLOTOT = 'S') then
                    BEGIN
                    TOTBASEV = TOTBASEV + basevtas;
                    TOTBASED = TOTBASED + basedev;
                    totcomis = totcomis + comision;
                    END
                ELSE
                    BEGIN
                    if (CEROS = 'S') then
                        SUSPEND;
                    ELSE
                        if ((CANTVTAS <> 0) OR (CANTDEV <> 0)) then
                            SUSPEND;
                    END
                END
            ELSE
                BEGIN
                SELECT SUM(FADE_CANT * FADE_FACTOR), SUM(FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO), SUM((FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO)*P.prar_comi/100)
                    FROM FACTURAS_DETALLE D, FACTURAS F, PRECIOS_ARTICULO P
                    WHERE F.FACT_ID = D.FACT_ID AND D.arti_cod = P.arti_cod AND D.lipr_cod = P.lipr_cod AND D.ARTI_COD = :ARTICULO AND FACT_FECHA >= :FECINI AND FACT_FECHA <= :FECFIN AND VEND_COD = :CODVEND AND FACT_ANULADO = 'N'
                    INTO :CANTVTAS, :BASEVTAS, :COMISION;
                SELECT SUM(DVDE_CANT * DVDE_FACTOR), SUM(DVDE_TOTAL-DVDE_IVAMONTO-DVDE_CONSUMO)
                    FROM devoluciones_ventas_detalle D, DEVOLUCIONES_VENTAS V
                    WHERE V.DEVT_ID = D.DEVT_ID AND D.ARTI_COD = :ARTICULO AND DEVT_FECHA >= :FECINI AND DEVT_FECHA <= :FECFIN AND VEND_COD = :CODVEND AND DEVT_ANULADO = 'N'
                    INTO :CANTDEV, :BASEDEV;
                if (CANTVTAS IS NULL) then
                    CANTVTAS = 0;
                if (CANTDEV IS NULL) then
                    CANTDEV = 0;
                if (BASEVTAS IS NULL) then
                    BASEVTAS = 0;
                if (BASEDEV IS NULL) then
                    BASEDEV = 0;
                if (COMISION IS NULL) then
                    COMISION = 0;
                if (COMIMONTO IS NULL) then
                    COMIMONTO = 0;
                if (BASEVTAS <> 0) then
                    PORC = COMISION / BASEVTAS;
                else
                    PORC = 0;
                if (basedev <> 0) then
                    COMISION = (BASEVTAS - BASEDEV) * PORC;
                PORC = PORC * 100;
                if (SOLOTOT = 'S') then
                    BEGIN
                    TOTBASEV = TOTBASEV + basevtas;
                    TOTBASED = TOTBASED + basedev;
                    totcomis = totcomis + comision;
                    END
                ELSE
                    BEGIN
                    if (CEROS = 'S') then
                        SUSPEND;
                    ELSE
                        if ((CANTVTAS <> 0) OR (CANTDEV <> 0)) then
                            SUSPEND;
                    END
                END
            END
        ELSE
            BEGIN
            CANTDEV = 0;
            BASEDEV = 0;
            SELECT TIDO_NOMCORTO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 31 INTO :NOMTIPO;
            FOR SELECT PREF_PRE, FACT_NUMERO, FACT_FECHA, FADE_CANT * FADE_FACTOR, FADE_TOTAL - FADE_IVAMONTO - FADE_CONSUMO, P.prar_comi, P.prar_comimonto, f.ptvt_id
                FROM FACTURAS F, FACTURAS_DETALLE D, precios_articulo P
                WHERE F.FACT_ID = D.FACT_ID AND D.arti_cod = P.arti_cod AND D.lipr_cod = P.lipr_cod AND D.ARTI_COD = :ARTICULO AND FACT_FECHA >= :FECINI AND FACT_FECHA <= :FECFIN AND VEND_COD = :CODVEND AND FACT_ANULADO = 'N'
                INTO :PREFIJO, :NUMERO, :FECHA, :CANTVTAS, :BASEVTAS, :comippor, :comipmonto, :puntovta
                DO
                BEGIN
                if (CANTVTAS IS NULL) then
                    CANTVTAS = 0;
                if (BASEVTAS IS NULL) then
                    BASEVTAS = 0;
                if ((LISTA = 'GRUPO') or (LISTA = 'MARCA')) then
                    BEGIN
                    if (COMIMONTO > 0) then
                        BEGIN
                        COMISION = CANTVTAS * COMIMONTO;
                        PORC = COMISION * 100 / BASEVTAS;
                        END
                    ELSE
                        BEGIN
                        if (LISTA = 'MARCA') then
                            BEGIN
                            COMISION = BASEVTAS * COMIPORM / 100;
                            PORC = COMIPORM;
                            END
                        else
                            BEGIN
                            COMISION = BASEVTAS * COMIPOR / 100;
                            PORC = COMIPOR;
                            END
                        END
                    END
                ELSE
                    BEGIN
                    if (COMIPMONTO > 0) then
                        BEGIN
                        COMISION = CANTVTAS * COMIPMONTO;
                        PORC = COMISION * 100 / BASEVTAS;
                        END
                    ELSE
                        BEGIN
                        COMISION = BASEVTAS * COMIPPOR / 100;
                        PORC = COMIPPOR;
                        END
                    END
                if (SOLOTOT = 'S') then
                    BEGIN
                    TOTBASEV = TOTBASEV + basevtas;
                    TOTBASED = TOTBASED + basedev;
                    totcomis = totcomis + comision;
                    END
                ELSE
                    SUSPEND;
                END
            CANTVTAS = 0;
            BASEVTAS = 0;
            SELECT TIDO_NOMCORTO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 33 INTO :NOMTIPO;
            FOR SELECT PREF_PRE, DEVT_NUMERO, DEVT_FECHA, DVDE_CANT * DVDE_FACTOR, DVDE_TOTAL - DVDE_IVAMONTO - DVDE_CONSUMO, V.devt_factid
                FROM DEVOLUCIONES_VENTAS V, DEVOLUCIONES_VENTAS_DETALLE D
                WHERE V.DEVT_ID = D.DEVT_ID AND D.ARTI_COD = :ARTICULO AND DEVT_FECHA >= :FECINI AND DEVT_FECHA <= :FECFIN AND VEND_COD = :CODVEND AND DEVT_ANULADO = 'N'
                INTO :PREFIJO, :NUMERO, :FECHA, :CANTDEV, :BASEDEV, :idfac
                DO
                BEGIN
                if (CANTDEV IS NULL) then
                    CANTDEV = 0;
                if (BASEDEV IS NULL) then
                    BASEDEV = 0;
                if ((LISTA = 'GRUPO') or (LISTA = 'MARCA')) then
                    BEGIN
                    if (COMIMONTO > 0) then
                        BEGIN
                        COMISION = CANTDEV * COMIMONTO * -1;
                        PORC = COMISION * 100 / BASEDEV;
                        END
                    ELSE
                        BEGIN
                        if (LISTA = 'MARCA') then
                            BEGIN
                            COMISION = BASEDEV * COMIPORM / 100;
                            PORC = COMIPORM;
                            END
                        else
                            BEGIN
                            COMISION = BASEDEV * COMIPOR / 100 * -1;
                            PORC = COMIPOR;
                            END
                        END
                    END
                ELSE
                    BEGIN
                    /*  BUSQUE EL PRECIO DE LA FACTURA */
                    COMIPMONTO = 0;
                    COMIPPOR = 0;
                    SELECT FIRST 1 P.prar_comi, P.prar_comimonto FROM FACTURAS_DETALLE D, PRECIOS_ARTICULO P
                        WHERE D.arti_cod = P.arti_cod AND D.lipr_cod = P.lipr_cod AND D.ARTI_COD = :articulo AND FACT_ID = :idfac INTO :comippor, :comipmonto;
                    if (COMIPMONTO > 0) then
                        BEGIN
                        COMISION = CANTDEV * COMIPMONTO * -1;
                        PORC = COMISION * 100 / BASEDEV;
                        END
                    ELSE
                        BEGIN
                        COMISION = BASEDEV * COMIPPOR / 100 * -1;
                        PORC = COMIPPOR;
                        END
                    END
                if (SOLOTOT = 'S') then
                    BEGIN
                    TOTBASEV = TOTBASEV + basevtas;
                    TOTBASED = TOTBASED + basedev;
                    totcomis = totcomis + comision;
                    END
                ELSE
                    SUSPEND;
                END
            END
        END
    if (SOLOTOT = 'S') then
        BEGIN
        basevtas = TOTBASEV;
        basedev = TOTBASED;
        comision = totcomis;
        if ((BASEVTAS - BASEDEV) <> 0) then
            PORC = COMISION * 100 / (BASEVTAS-BASEDEV);
        ELSE
            PORC = 0;
        if (CEROS = 'S') then
            SUSPEND;
        ELSE
            if ((basevtas <> 0) OR (basedev <> 0)) then
                SUSPEND;
        END
    END
END
^

SET TERM ; ^

/* 20140401E */
/* 15 FORMAS DE PAGO EN CIERRE POS */
SET TERM ^ ;

create or alter procedure CIERRE_FORMAPAGO (
    FECHA date,
    PUNTO integer,
    PREFIJO varchar(4),
    FP INTEGER)
returns (
    CANT INTEGER,
    TOTAL NUMERIC(18,2))
as
declare variable PREFRDC VARCHAR(4);
declare variable otrabo numeric(18,4);
begin
if (PREFIJO <> '') then
  SELECT AUTO_PREFRDC FROM AUTORIZACIONES WHERE PREF_PRE = :PREFIJO INTO :prefrdc;
CANT = 0;
SELECT count(RCPA_ITEM), SUM(RCPA_MONTO) FROM RECIBOS_CAJA_PAGO P, RECIBOS_CAJA R, PUNTO_VENTA PT
    WHERE R.RECA_ID = P.RECA_ID AND PT.PTVT_ID = :punto AND RECA_FECHA = :FECHA AND PT.caja_id = R.caja_id
    AND ((R.PREF_PRE = :prefrdc) or (:PREFIJO = '')) AND FOPA_ID = :FP and RECA_ANULADO = 'N'
    AND exists (select reca_id from RECIBOS_CAJA_DETALLE D, MOVIMIENTO_CLIENTES M WHERE M.mvcl_tiporef = D.rcde_tipodoc AND
    M.mvcl_idref = D.rcde_iddoc AND M.mvcl_fecha = :fecha and d.rcde_abono = r.reca_monto and D.reca_id = R.reca_id)
    INTO :CANT, :TOTAL;
if (TOTAL is null) then
    TOTAL = 0;
SELECT SUM(RCDE_ABONO) FROM RECIBOS_CAJA_DETALLE D, MOVIMIENTO_CLIENTES M, RECIBOS_CAJA_PAGO P, RECIBOS_CAJA R, punto_venta PT
    WHERE M.mvcl_tiporef = D.rcde_tipodoc AND R.RECA_ID = P.RECA_ID AND PT.PTVT_ID = :punto AND RECA_FECHA = :FECHA AND
    PT.caja_id = R.caja_id AND ((R.PREF_PRE = :prefrdc) or (:PREFIJO = '')) AND FOPA_ID = :FP and RECA_ANULADO = 'N' AND
    M.mvcl_idref = D.rcde_iddoc AND M.mvcl_fecha = :fecha and P.rcpa_monto <> D.rcde_abono and D.reca_id = R.reca_id
    INTO :OTRABO;
if (OTRABO IS NULL) then
    OTRABO = 0;
TOTAL = TOTAL + OTRABO;
suspend;
end
^

SET TERM ; ^

GRANT EXECUTE ON PROCEDURE cierre_formapago TO PUBLIC;

SET TERM ^ ;

CREATE OR ALTER procedure CIERRE_FACTURACION (
    FECHA date,
    PUNTO integer,
    PREFIJO varchar(4))
returns (
    PREF varchar(4),
    AUTORIZA varchar(20),
    PUNTOVTA varchar(60),
    NUMINI varchar(8),
    NUMFIN varchar(8),
    NROFAC integer,
    HORAINI time,
    HORAFIN time,
    BASEFAC numeric(18,2),
    IVAFAC numeric(18,2),
    DEC2799F numeric(18,2),
    TOTALFAC numeric(18,2),
    NROITE integer,
    NRODEV integer,
    BASEDEV numeric(18,2),
    IVADEV numeric(18,2),
    DEC2799D numeric(18,2),
    TOTALDEV numeric(18,2),
    BASENETO numeric(18,2),
    IVANETO numeric(18,2),
    DEC2799N numeric(18,2),
    TOTALNETO numeric(18,2),
    BASEF0 numeric(18,2),
    IVAF0 numeric(18,2),
    DEC2799F0 numeric(18,2),
    TOTALF0 numeric(18,2),
    BASED0 numeric(18,2),
    IVAD0 numeric(18,2),
    DEC2799D0 numeric(18,2),
    TOTALD0 numeric(18,2),
    BASEF1 numeric(18,2),
    IVAF1 numeric(18,2),
    DEC2799F1 numeric(18,2),
    TOTALF1 numeric(18,2),
    BASED1 numeric(18,2),
    IVAD1 numeric(18,2),
    DEC2799D1 numeric(18,2),
    TOTALD1 numeric(18,2),
    BASEF2 numeric(18,2),
    IVAF2 numeric(18,2),
    DEC2799F2 numeric(18,2),
    TOTALF2 numeric(18,2),
    BASED2 numeric(18,2),
    IVAD2 numeric(18,2),
    DEC2799D2 numeric(18,2),
    TOTALD2 numeric(18,2),
    BASEF3 numeric(18,2),
    IVAF3 numeric(18,2),
    DEC2799F3 numeric(18,2),
    TOTALF3 numeric(18,2),
    BASED3 numeric(18,2),
    IVAD3 numeric(18,2),
    DEC2799D3 numeric(18,2),
    TOTALD3 numeric(18,2),
    BASEF4 numeric(18,2),
    IVAF4 numeric(18,2),
    DEC2799F4 numeric(18,2),
    TOTALF4 numeric(18,2),
    BASED4 numeric(18,2),
    IVAD4 numeric(18,2),
    DEC2799D4 numeric(18,2),
    TOTALD4 numeric(18,2),
    FORMAP1 numeric(18,2),
    FORMAP2 numeric(18,2),
    FORMAP3 numeric(18,2),
    FORMAP4 numeric(18,2),
    FORMAP5 numeric(18,2),
    FORMAP6 numeric(18,2),
    FORMAP7 numeric(18,2),
    FORMAP8 numeric(18,2),
    FORMAP9 numeric(18,2),
    FORMAP10 numeric(18,2),
    FORMAP11 numeric(18,2),
    FORMAP12 numeric(18,2),
    FORMAP13 numeric(18,2),
    FORMAP14 numeric(18,2),
    FORMAP15 numeric(18,2),
    CANTFP1 integer,
    CANTFP2 integer,
    CANTFP3 integer,
    CANTFP4 integer,
    CANTFP5 integer,
    CANTFP6 integer,
    CANTFP7 integer,
    CANTFP8 integer,
    CANTFP9 integer,
    CANTFP10 integer,
    CANTFP11 integer,
    CANTFP12 integer,
    CANTFP13 integer,
    CANTFP14 integer,
    CANTFP15 integer,
    CARTERA numeric(18,2),
    RETES numeric(18,2),
    VENDEDOR1 varchar(60),
    VTAVEND1 numeric(18,2),
    VENDEDOR2 varchar(60),
    VTAVEND2 numeric(18,2),
    VENDEDOR3 varchar(60),
    VTAVEND3 numeric(18,2),
    VENDEDOR4 varchar(60),
    VTAVEND4 numeric(18,2),
    VENDEDOR5 varchar(60),
    VTAVEND5 numeric(18,2),
    NROFACTANUL integer,
    IVANUL numeric(18,2),
    TOTALFACANUL numeric(18,2))
AS
declare variable tarifa numeric(9,2);
declare variable basef numeric(18,2);
declare variable ivaf numeric(18,2);
declare variable dec2799af numeric(18,2);
declare variable totalf numeric(18,2);
declare variable basedv numeric(18,2);
declare variable ivad numeric(18,2);
declare variable dec2799ad numeric(18,2);
declare variable totald numeric(18,2);
declare variable i integer;
declare variable codven integer;
declare variable vended varchar(60);
declare variable f_id integer;
declare variable f_total numeric(18,2);
declare variable factor numeric(18,4);
declare variable ajuste integer;
begin
AJUSTE = 0;
if (PREFIJO <> '') then
  SELECT PREF_PRE, AUTO_NUMERO FROM AUTORIZACIONES WHERE PREF_PRE = :PREFIJO INTO :PREF, :autoriza;
SELECT PTVT_NOM FROM PUNTO_VENTA WHERE PTVT_ID = :punto INTO :puntovta;
  /* LAS VENTAS */
  SELECT MIN(FACT_NUMERO), MAX(FACT_NUMERO), COUNT(FACT_NUMERO), SUM(FACT_TOTAL - FACT_IVAMONTO + FACT_DEC2799), SUM(FACT_IVAMONTO), SUM(FACT_TOTAL), sum(fact_dec2799)
    FROM FACTURAS WHERE FACT_FECHA = :FECHA AND PTVT_ID = :PUNTO AND ((PREF_PRE = :PREFIJO) or (:PREFIJO = '')) and FACT_ANULADO = 'N'
    INTO :NUMINI, :NUMFIN, :NROFAC, :BASENETO, :IVANETO, :TOTALNETO, :dec2799f;
  if (dec2799f is null) then
    dec2799f = 0;
  SELECT MIN(AUDI_HORA) FROM AUDITORIA WHERE TIDO_COD = 31 AND AUDI_COD = :PREFIJO || :NUMINI AND AUDI_OPER = 'I' INTO :HORAINI;
  SELECT MAX(AUDI_HORA) FROM AUDITORIA WHERE TIDO_COD = 31 AND AUDI_COD = :PREFIJO || :NUMFIN AND AUDI_OPER = 'I' INTO :HORAFIN;
  SELECT COUNT(FADE_ITEM), SUM(FADE_TOTAL-FADE_IVAMONTO), SUM(FADE_IVAMONTO), SUM(FADE_TOTAL)
    FROM facturas_detalle D, FACTURAS F
    WHERE D.FACT_ID = F.FACT_ID AND FACT_FECHA = :FECHA AND PTVT_ID = :PUNTO AND ((PREF_PRE = :PREFIJO) or (:PREFIJO = '')) AND FADE_CANT > 0 and FACT_ANULADO = 'N' and substring(d.arti_cod from 1 FOR 2) <> '.t'
    INTO :nroite, :BASEFAC, :IVAFAC, :TOTALFAC;
  totalfac = totalfac - dec2799f;
/*  ivafac = ivafac - dec2799f; */
  SELECT COUNT(FADE_ITEM), SUM(FADE_IVAMONTO-FADE_TOTAL), SUM(FADE_IVAMONTO*-1), SUM(FADE_TOTAL*-1)
    FROM facturas_detalle D, FACTURAS F
    WHERE D.FACT_ID = F.FACT_ID AND FACT_FECHA = :FECHA AND PTVT_ID = :PUNTO AND ((PREF_PRE = :PREFIJO) or (:PREFIJO = '')) AND FADE_CANT < 0 and FACT_ANULADO = 'N' and substring(d.arti_cod from 1 FOR 2) <> '.t'
    INTO :NRODEV, :BASEDEV, :IVADEV, :TOTALDEV;
  SELECT COUNT(DVDE_ITEM), SUM(DVDE_TOTAL-DVDE_IVAMONTO), SUM(DVDE_IVAMONTO), SUM(DVDE_TOTAL)
    FROM devoluciones_ventas_detalle D, devoluciones_ventas F
    WHERE D.DEVT_ID = F.DEVT_ID AND DEVT_FECHA = :FECHA AND PTVT_ID = :PUNTO AND DEVT_ANULADO = 'N' and substring(d.arti_cod from 1 FOR 2) <> '.t'
    INTO :I, :BASEDV, :IVAD, :TOTALD;
  select sum(devt_dec2799) FROM devoluciones_ventas WHERE DEVT_FECHA = :FECHA AND PTVT_ID = :PUNTO AND DEVT_ANULADO = 'N' into :dec2799d;
  if (dec2799d is null) then
    dec2799d = 0;
  totald = totald - dec2799d;
/*  ivad = ivad - dec2799; */
  DEC2799N = DEC2799F - DEC2799D;
  SELECT COUNT(FACT_NUMERO),SUM(FACT_TOTAL - FACT_IVAMONTO), SUM(FACT_IVAMONTO) FROM FACTURAS
    WHERE FACT_FECHA = :FECHA AND PTVT_ID = :PUNTO AND ((PREF_PRE = :PREFIJO) or (:PREFIJO = '')) and FACT_ANULADO = 'S'
    INTO :NROFACTANUL, :TOTALFACANUL, :IVANUL;
  if (nrofac is null) then
    nrofac = 0;
  if (NROFACTANUL is null) then
    NROFACTANUL = 0;
  if (TOTALFACANUL is null) then
    TOTALFACANUL = 0;
  if (IVANUL is null) then
    IVANUL = 0;
  if (baseneto is null) then
    baseneto = 0;
  if (ivaneto is null) then
    ivaneto = 0;
  if (totalneto is null) then
    totalneto = 0;
  if (nroite is null) then
    nroite = 0;
  if (basefac is null) then
    basefac = 0;
  if (ivafac is null) then
    ivafac = 0;
  if (totalfac is null) then
    totalfac = 0;
  if (nrodev is null) then
    nrodev = 0;
  if (basedev is null) then
    basedev = 0;
  if (ivadev is null) then
    ivadev = 0;
  if (totaldev is null) then
    totaldev = 0;
  if (I is null) then
    I = 0;
  if (basedv is null) then
    basedv = 0;
  if (ivad is null) then
    ivad = 0;
  if (totald is null) then
    totald = 0;
  NRODEV = NRODEV + I;
  BASENETO = BASENETO - BASEDV;
  IVANETO = IVANETO - IVAD;
  TOTALNETO = TOTALNETO - TOTALD;

  BASEDEV = BASEDEV + BASEDV;
  IVADEV = IVADEV + IVAD;
  TOTALDEV = TOTALDEV + TOTALD;

  /* POR TARIFA DE IVA */
  I = 0;
  BASEF0 = 0;
  BASED0 = 0;
  IVAF0 = 0;
  IVAD0 = 0;
  DEC2799F0 = 0;
  DEC2799D0 = 0;
  TOTALF0 = 0;
  TOTALD0 = 0;
  BASEF1 = 0;
  BASED1 = 0;
  IVAF1 = 0;
  IVAD1 = 0;
  DEC2799F1 = 0;
  DEC2799D1 = 0;
  TOTALF1 = 0;
  TOTALD1 = 0;
  BASEF2 = 0;
  BASED2 = 0;
  IVAF2 = 0;
  IVAD2 = 0;
  DEC2799F2 = 0;
  DEC2799D2 = 0;
  TOTALF2 = 0;
  TOTALD2 = 0;
  BASEF3 = 0;
  BASED3 = 0;
  IVAF3 = 0;
  IVAD3 = 0;
  DEC2799F3 = 0;
  DEC2799D3 = 0;
  TOTALF3 = 0;
  TOTALD3 = 0;
  BASEF4 = 0;
  BASED4 = 0;
  IVAF4 = 0;
  IVAD4 = 0;
  DEC2799F4 = 0;
  DEC2799D4 = 0;
  TOTALF4 = 0;
  TOTALD4 = 0;
  vtavend1 = 0;
  vtavend2 = 0;
  vtavend3 = 0;
  vtavend4 = 0;
  vtavend5 = 0;
  FOR SELECT TAIV_PORC FROM TARIFA_IVA ORDER BY TAIV_PORC INTO :TARIFA DO
    BEGIN
    I = I + 1;
    SELECT SUM(FADE_TOTAL-FADE_IVAMONTO), SUM(FADE_IVAMONTO), SUM(FADE_TOTAL) FROM facturas_detalle D, FACTURAS F
        WHERE D.FACT_ID = F.FACT_ID AND FACT_FECHA = :FECHA AND PTVT_ID = :PUNTO AND ((PREF_PRE = :PREFIJO) or (:PREFIJO = '')) AND FADE_CANT > 0 AND FADE_IVAPORC = :TARIFA and FACT_ANULADO = 'N'
        INTO :BASEF, :IVAF, :TOTALF;
    SELECT SUM(FADE_TOTAL-FADE_IVAMONTO), SUM(FADE_IVAMONTO), SUM(FADE_TOTAL) FROM facturas_detalle D, FACTURAS F
        WHERE D.FACT_ID = F.FACT_ID AND FACT_FECHA = :FECHA AND PTVT_ID = :PUNTO AND ((PREF_PRE = :PREFIJO) or (:PREFIJO = '')) AND FADE_CANT < 0 AND FADE_IVAPORC = :TARIFA and FACT_ANULADO = 'N'
        INTO :BASEDV, :IVAD, :TOTALD;
    if (basef is null) then
        basef = 0;
    if (ivaf is null) then
        ivaf = 0;
    if (totalf is null) then
        totalf = 0;
    if (basedv is null) then
        basedv = 0;
    if (ivad is null) then
        ivad = 0;
    if (totald is null) then
        totald = 0;
    SELECT SUM(FADE_IVAMONTO) FROM ARTICULO A, facturas_detalle D, FACTURAS F
        WHERE D.FACT_ID = F.FACT_ID AND FACT_FECHA = :FECHA AND PTVT_ID = :PUNTO AND ((PREF_PRE = :PREFIJO) or (:PREFIJO = '')) AND FADE_CANT > 0 AND FADE_IVAPORC = :TARIFA and FACT_ANULADO = 'N'
        AND D.ARTI_COD = A.ARTI_COD AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL)) AND A.arti_dec2799 = 'S'
        INTO DEC2799af;
    if (dec2799af is null) then
        dec2799af = 0;
    SELECT SUM(FADE_IVAMONTO) FROM ARTICULO A, facturas_detalle D, FACTURAS F
        WHERE D.FACT_ID = F.FACT_ID AND FACT_FECHA = :FECHA AND PTVT_ID = :PUNTO AND ((PREF_PRE = :PREFIJO) or (:PREFIJO = '')) AND FADE_CANT < 0 AND FADE_IVAPORC = :TARIFA and FACT_ANULADO = 'N'
        AND D.ARTI_COD = A.ARTI_COD AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL)) AND A.arti_dec2799 = 'S'
        INTO DEC2799ad;
    if (dec2799ad is null) then
        dec2799ad = 0;
    FACTOR = 1;
    SELECT AJCI_FACTOR FROM ajuste_cierre WHERE AJCI_PORC = :TARIFA AND AJCI_FECINI <= :FECHA AND AJCI_FECFIN >= :FECHA INTO :FACTOR;
    if (FACTOR IS null) then
        FACTOR = 1;
    if (FACTOR <> 1) then
        AJUSTE = 1;
    BASEF = BASEF * FACTOR;
    BASEDV = BASEDV * FACTOR;
    IVAF = IVAF * FACTOR;
    IVAD = IVAD * FACTOR;
    TOTALF = TOTALF * FACTOR;
    TOTALD = TOTALD * FACTOR;
    DEC2799af = DEC2799af * FACTOR;
    DEC2799ad = DEC2799ad * FACTOR;

    if (I = 1) then
        BEGIN
        BASEF0 = BASEF;
        BASED0 = :BASEDV;
        IVAF0 = IVAF;
        IVAD0 = IVAD;
        DEC2799F0 = DEC2799AF;
        DEC2799D0 = DEC2799AD;
        TOTALF0 = TOTALF;
        TOTALD0 = TOTALD;
        SELECT SUM(DVDE_TOTAL-DVDE_IVAMONTO), SUM(DVDE_IVAMONTO), SUM(DVDE_TOTAL) FROM devoluciones_ventas_detalle D, devoluciones_ventas F
            WHERE D.DEVT_ID = F.DEVT_ID AND DEVT_FECHA = :FECHA AND PTVT_ID = :PUNTO AND DVDE_IVAPORC = :TARIFA and DEVT_ANULADO = 'N'
            INTO :BASEDV, :IVAD, :TOTALD;
        SELECT SUM(DVDE_IVAMONTO) FROM devoluciones_ventas_detalle D, devoluciones_ventas F, ARTICULO A
            WHERE D.DEVT_ID = F.DEVT_ID AND DEVT_FECHA = :FECHA AND PTVT_ID = :PUNTO AND DVDE_IVAPORC = :TARIFA and DEVT_ANULADO = 'N'
            AND D.ARTI_COD = A.ARTI_COD AND ((DVDE_REFERENCIA <> '.t') or (DVDE_REFERENCIA IS NULL)) AND A.arti_dec2799 = 'S'
            INTO :DEC2799AD;
        if (dec2799ad is null) then
            dec2799ad = 0;
        DEC2799D0 = DEC2799D0 + DEC2799AD;
        if (basedv is null) then
            basedv = 0;
        if (ivad is null) then
            ivad = 0;
        if (totald is null) then
            totald = 0;
        BASED0 = BASED0 - BASEDV;
        IVAD0 = IVAD0 - IVAD;
        TOTALD0 = TOTALD0 - TOTALD;
        END
    if (I = 2) then
        BEGIN
        BASEF1 = BASEF;
        BASED1 = :BASEDV;
        IVAF1 = IVAF;
        IVAD1 = IVAD;
        DEC2799F1 = DEC2799AF;
        DEC2799D1 = DEC2799AD;
        TOTALF1 = TOTALF;
        TOTALD1 = TOTALD;
        SELECT SUM(DVDE_TOTAL-DVDE_IVAMONTO), SUM(DVDE_IVAMONTO), SUM(DVDE_TOTAL) FROM devoluciones_ventas_detalle D, devoluciones_ventas F
            WHERE D.DEVT_ID = F.DEVT_ID AND DEVT_FECHA = :FECHA AND PTVT_ID = :PUNTO AND DVDE_IVAPORC = :TARIFA and DEVT_ANULADO = 'N'
            INTO :BASEDV, :IVAD, :TOTALD;
        SELECT SUM(DVDE_IVAMONTO) FROM devoluciones_ventas_detalle D, devoluciones_ventas F, ARTICULO A
            WHERE D.DEVT_ID = F.DEVT_ID AND DEVT_FECHA = :FECHA AND PTVT_ID = :PUNTO AND DVDE_IVAPORC = :TARIFA and DEVT_ANULADO = 'N'
            AND D.ARTI_COD = A.ARTI_COD AND ((DVDE_REFERENCIA <> '.t') or (DVDE_REFERENCIA IS NULL)) AND A.arti_dec2799 = 'S'
            INTO :DEC2799AD;
        if (dec2799ad is null) then
            dec2799ad = 0;
        DEC2799D1 = DEC2799D1 + DEC2799AD;
        if (basedv is null) then
            basedv = 0;
        if (ivad is null) then
            ivad = 0;
        if (totald is null) then
            totald = 0;
        BASED1 = BASED1 - BASEDV;
        IVAD1 = IVAD1 - IVAD;
        TOTALD1 = TOTALD1 - TOTALD;
        END
    if (I = 3) then
        BEGIN
        BASEF2 = BASEF;
        BASED2 = :BASEDV;
        IVAF2 = IVAF;
        IVAD2 = IVAD;
        DEC2799F2 = DEC2799AF;
        DEC2799D2 = DEC2799AD;
        TOTALF2 = TOTALF;
        TOTALD2 = TOTALD;
        SELECT SUM(DVDE_TOTAL-DVDE_IVAMONTO), SUM(DVDE_IVAMONTO), SUM(DVDE_TOTAL) FROM devoluciones_ventas_detalle D, devoluciones_ventas F
            WHERE D.DEVT_ID = F.DEVT_ID AND DEVT_FECHA = :FECHA AND PTVT_ID = :PUNTO AND DVDE_IVAPORC = :TARIFA and DEVT_ANULADO = 'N'
            INTO :BASEDV, :IVAD, :TOTALD;
        SELECT SUM(DVDE_IVAMONTO) FROM devoluciones_ventas_detalle D, devoluciones_ventas F, ARTICULO A
            WHERE D.DEVT_ID = F.DEVT_ID AND DEVT_FECHA = :FECHA AND PTVT_ID = :PUNTO AND DVDE_IVAPORC = :TARIFA and DEVT_ANULADO = 'N'
            AND D.ARTI_COD = A.ARTI_COD AND ((DVDE_REFERENCIA <> '.t') or (DVDE_REFERENCIA IS NULL)) AND A.arti_dec2799 = 'S'
            INTO :DEC2799AD;
        if (dec2799ad is null) then
            dec2799ad = 0;
        DEC2799D2 = DEC2799D2 + DEC2799AD;
        if (basedv is null) then
            basedv = 0;
        if (ivad is null) then
            ivad = 0;
        if (totald is null) then
            totald = 0;
        BASED2 = BASED2 - BASEDV;
        IVAD2 = IVAD2 - IVAD;
        TOTALD2 = TOTALD2 - TOTALD;
        END
    if (I = 4) then
        BEGIN
        BASEF3 = BASEF;
        BASED3 = :BASEDV;
        IVAF3 = IVAF;
        IVAD3 = IVAD;
        DEC2799F3 = DEC2799AF;
        DEC2799D3 = DEC2799AD;
        TOTALF3 = TOTALF;
        TOTALD3 = TOTALD;
        SELECT SUM(DVDE_TOTAL-DVDE_IVAMONTO), SUM(DVDE_IVAMONTO), SUM(DVDE_TOTAL) FROM devoluciones_ventas_detalle D, devoluciones_ventas F
            WHERE D.DEVT_ID = F.DEVT_ID AND DEVT_FECHA = :FECHA AND PTVT_ID = :PUNTO AND DVDE_IVAPORC = :TARIFA and DEVT_ANULADO = 'N'
            INTO :BASEDV, :IVAD, :TOTALD;
        SELECT SUM(DVDE_IVAMONTO) FROM devoluciones_ventas_detalle D, devoluciones_ventas F, ARTICULO A
            WHERE D.DEVT_ID = F.DEVT_ID AND DEVT_FECHA = :FECHA AND PTVT_ID = :PUNTO AND DVDE_IVAPORC = :TARIFA and DEVT_ANULADO = 'N'
            AND D.ARTI_COD = A.ARTI_COD AND ((DVDE_REFERENCIA <> '.t') or (DVDE_REFERENCIA IS NULL)) AND A.arti_dec2799 = 'S'
            INTO :DEC2799AD;
        if (dec2799ad is null) then
            dec2799ad = 0;
        DEC2799D3 = DEC2799D3 + DEC2799AD;
        if (basedv is null) then
            basedv = 0;
        if (ivad is null) then
            ivad = 0;
        if (totald is null) then
            totald = 0;
        BASED3 = BASED3 - BASEDV;
        IVAD3 = IVAD3 - IVAD;
        TOTALD3 = TOTALD3 - TOTALD;
        END
    if (I = 5) then
        BEGIN
        BASEF4 = BASEF;
        BASED4 = :BASEDV;
        IVAF4 = IVAF;
        IVAD4 = IVAD;
        DEC2799F4 = DEC2799AF;
        DEC2799D4 = DEC2799AD;
        TOTALF4 = TOTALF;
        TOTALD4 = TOTALD;
        SELECT SUM(DVDE_TOTAL-DVDE_IVAMONTO), SUM(DVDE_IVAMONTO), SUM(DVDE_TOTAL) FROM devoluciones_ventas_detalle D, devoluciones_ventas F
            WHERE D.DEVT_ID = F.DEVT_ID AND DEVT_FECHA = :FECHA AND PTVT_ID = :PUNTO AND DVDE_IVAPORC = :TARIFA and DEVT_ANULADO = 'N'
            INTO :BASEDV, :IVAD, :TOTALD;
        SELECT SUM(DVDE_IVAMONTO) FROM devoluciones_ventas_detalle D, devoluciones_ventas F, ARTICULO A
            WHERE D.DEVT_ID = F.DEVT_ID AND DEVT_FECHA = :FECHA AND PTVT_ID = :PUNTO AND DVDE_IVAPORC = :TARIFA and DEVT_ANULADO = 'N'
            AND D.ARTI_COD = A.ARTI_COD AND ((DVDE_REFERENCIA <> '.t') or (DVDE_REFERENCIA IS NULL)) AND A.arti_dec2799 = 'S'
            INTO :DEC2799AD;
        if (dec2799ad is null) then
            dec2799ad = 0;
        DEC2799D4 = DEC2799D4 + DEC2799AD;
        if (basedv is null) then
            basedv = 0;
        if (ivad is null) then
            ivad = 0;
        if (totald is null) then
            totald = 0;
        BASED4 = BASED4 - BASEDV;
        IVAD4 = IVAD4 - IVAD;
        TOTALD4 = TOTALD4 - TOTALD;
        END
    END
  /* POR FORMA DE PAGO */
  EXECUTE PROCEDURE cierre_formapago(:FECHA, :PUNTO, :PREFIJO, 1) returning_values (CANTFP1, FORMAP1);
  EXECUTE PROCEDURE cierre_formapago(:FECHA, :PUNTO, :PREFIJO, 2) returning_values (CANTFP2, FORMAP2);
  EXECUTE PROCEDURE cierre_formapago(:FECHA, :PUNTO, :PREFIJO, 3) returning_values (CANTFP3, FORMAP3);
  EXECUTE PROCEDURE cierre_formapago(:FECHA, :PUNTO, :PREFIJO, 4) returning_values (CANTFP4, FORMAP4);
  EXECUTE PROCEDURE cierre_formapago(:FECHA, :PUNTO, :PREFIJO, 5) returning_values (CANTFP5, FORMAP5);
  EXECUTE PROCEDURE cierre_formapago(:FECHA, :PUNTO, :PREFIJO, 6) returning_values (CANTFP6, FORMAP6);
  EXECUTE PROCEDURE cierre_formapago(:FECHA, :PUNTO, :PREFIJO, 7) returning_values (CANTFP7, FORMAP7);
  EXECUTE PROCEDURE cierre_formapago(:FECHA, :PUNTO, :PREFIJO, 8) returning_values (CANTFP8, FORMAP8);
  EXECUTE PROCEDURE cierre_formapago(:FECHA, :PUNTO, :PREFIJO, 9) returning_values (CANTFP9, FORMAP9);
  EXECUTE PROCEDURE cierre_formapago(:FECHA, :PUNTO, :PREFIJO, 10) returning_values (CANTFP10, FORMAP10);
  EXECUTE PROCEDURE cierre_formapago(:FECHA, :PUNTO, :PREFIJO, 11) returning_values (CANTFP11, FORMAP11);
  EXECUTE PROCEDURE cierre_formapago(:FECHA, :PUNTO, :PREFIJO, 12) returning_values (CANTFP12, FORMAP12);
  EXECUTE PROCEDURE cierre_formapago(:FECHA, :PUNTO, :PREFIJO, 13) returning_values (CANTFP13, FORMAP13);
  EXECUTE PROCEDURE cierre_formapago(:FECHA, :PUNTO, :PREFIJO, 14) returning_values (CANTFP14, FORMAP14);
  EXECUTE PROCEDURE cierre_formapago(:FECHA, :PUNTO, :PREFIJO, 15) returning_values (CANTFP15, FORMAP15);
  cartera = 0;
  for SELECT FACT_ID FROM FACTURAS WHERE FACT_FECHA = :FECHA AND PTVT_ID = :PUNTO AND ((PREF_PRE = :PREFIJO) or (:PREFIJO = '')) and FACT_ANULADO = 'N'
    into :f_id
    do
    begin
    EXECUTE procedure saldo_doc_cartera(31, :f_id, :fecha,  0) returning_values (f_total);
    CARTERA = :cartera + :F_TOTAL;
    end
  for SELECT DEVT_ID FROM devoluciones_ventas WHERE DEVT_FECHA = :FECHA AND PTVT_ID = :PUNTO and DEVT_ANULADO = 'N'
    into :f_id
    do
    begin
    EXECUTE procedure saldo_doc_cartera(33, :f_id, :FECHA, 0) returning_values (f_total);
    CARTERA = :cartera - :F_TOTAL;
    end
  /* LAS RETENCIONES */
  SELECT SUM(RCDE_RTFTE+RCDE_RTIVA+RCDE_RTICA) FROM recibos_caja_detalle D, RECIBOS_CAJA R, PUNTO_VENTA PT
    WHERE R.RECA_ID = D.RECA_ID AND PT.PTVT_ID = :punto AND RECA_FECHA = :FECHA AND PT.caja_id = R.caja_id AND ((PT.PREF_PRE = R.PREF_PRE) or (:PREFIJO = '')) AND RECA_ANULADO = 'N'
    INTO :RETES;
  if (RETES IS NULL) then
    RETES = 0;

  if (cartera is null) then
    cartera = 0;
  I = 0;
  FOR SELECT MAX(F.VEND_COD), MAX(VEND_NOMBRE), SUM(FACT_TOTAL - FACT_IVAMONTO) FROM FACTURAS F, VENDEDORES V
    WHERE F.VEND_COD = V.VEND_COD AND FACT_FECHA = :FECHA AND F.PTVT_ID = :PUNTO AND ((PREF_PRE = :PREFIJO) or (:PREFIJO = '')) and FACT_ANULADO = 'N'
    GROUP BY F.VEND_COD ORDER BY F.VEND_COD
    INTO :CODVEN, :VENDED, :TOTALF
    DO
    BEGIN
    if (totalf IS NULL) then
        TOTALF = 0;
    SELECT SUM(DEVT_TOTAL - DEVT_IVAMONTO) FROM DEVOLUCIONES_VENTAS
        WHERE VEND_COD = :CODVEN AND DEVT_FECHA = :FECHA AND PTVT_ID = :PUNTO AND ((PREF_PRE = :PREFIJO) or (:PREFIJO = '')) and DEVT_ANULADO = 'N'
        INTO :totald;
    if (TOTALD IS NULL) then
        TOTALD = 0;
    if (I = 0) then
        BEGIN
        vendedor1 = VENDED;
        vtavend1 = TOTALF - TOTALD;
        END
    if (I = 1) then
        BEGIN
        vendedor2 = VENDED;
        vtavend2 = TOTALF - TOTALD;
        END
    if (I = 2) then
        BEGIN
        vendedor3 = VENDED;
        vtavend3 = TOTALF - TOTALD;
        END
    if (I = 3) then
        BEGIN
        vendedor4 = VENDED;
        vtavend4 = TOTALF - TOTALD;
        END
    if (I = 4) then
        BEGIN
        vendedor5 = VENDED;
        vtavend5 = TOTALF - TOTALD;
        END
    I = I + 1;
    END
  if (AJUSTE = 1) then
    BEGIN
    BASEFAC = BASEF0 + BASEF1 + BASEF2 + BASEF3 + BASEF4;
    IVAFAC = IVAF0 + IVAF1 + IVAF2 + IVAF3 + IVAF4;
    TOTALFAC = totalf0 + TOTALF1 + TOTALF2 + TOTALF3 + TOTALF4;
    BASEDEV = totald0 + TOTALD1 + TOTALD2 + TOTALD3 + TOTALD4;
    IVADEV = IVAD0 + IVAD1 + IVAD2 + IVAD3 + IVAD4;
    TOTALDEV = totald0 + TOTALD1 + totald2 + totald3 + totald4;
    BASENETO = basefac + basedev;
    IVANETO = ivafac + ivadev;
    if (totalneto <> 0) Then
        begin
        formap1 = formap1 * (totalfac + totaldev) / totalneto;
        formap2 = formap2 * (totalfac + totaldev) / totalneto;
        formap3 = formap3 * (totalfac + totaldev) / totalneto;
        formap4 = formap4 * (totalfac + totaldev) / totalneto;
        formap5 = formap5 * (totalfac + totaldev) / totalneto;
        formap6 = formap6 * (totalfac + totaldev) / totalneto;
        formap7 = formap7 * (totalfac + totaldev) / totalneto;
        formap8 = formap8 * (totalfac + totaldev) / totalneto;
        formap9 = formap9 * (totalfac + totaldev) / totalneto;
        formap10 = formap10 * (totalfac + totaldev) / totalneto;
        formap11 = formap11 * (totalfac + totaldev) / totalneto;
        formap12 = formap12 * (totalfac + totaldev) / totalneto;
        formap13 = formap13 * (totalfac + totaldev) / totalneto;
        formap14 = formap14 * (totalfac + totaldev) / totalneto;
        formap15 = formap15 * (totalfac + totaldev) / totalneto;
        vtavend1 = vtavend1 * (totalfac + totaldev) / totalneto;
        vtavend2 = vtavend2 * (totalfac + totaldev) / totalneto;
        vtavend3 = vtavend3 * (totalfac + totaldev) / totalneto;
        vtavend4 = vtavend4 * (totalfac + totaldev) / totalneto;
        vtavend5 = vtavend5 * (totalfac + totaldev) / totalneto;
        end
    TOTALNETO = totalfac + totaldev;
    END
  INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
    VALUES (USER, 123, :punto, 'I', (:formap1+:formap2+:formap3+:formap4+:formap5+:CARTERA));
  suspend;
end
^

SET TERM ; ^

/* 20140402 */
/* NO DISCRIMINE SALDOS POR TERCERO EN CUENTAS DE BANCOS E INVERSIONES */
SET TERM ^ ;

CREATE OR ALTER procedure MM_1012 (
    INICIO char(8),
    FINAL char(8))
AS
declare variable CONCEPTO INTEGER;
declare variable TIPODOC INTEGER;
declare variable NIT VARCHAR(15) CHARACTER SET NONE;
declare variable DV CHAR(1) CHARACTER SET NONE;
declare variable APELLIDO1 VARCHAR(60) CHARACTER SET NONE;
declare variable APELLIDO2 VARCHAR(60) CHARACTER SET NONE;
declare variable NOMBRE1 VARCHAR(60) CHARACTER SET NONE;
declare variable NOMBRE2 VARCHAR(60) CHARACTER SET NONE;
declare variable RAZONSOCIAL VARCHAR(450) CHARACTER SET NONE;
declare variable PAIS VARCHAR(3) CHARACTER SET NONE;
declare variable SALDO NUMERIC(18,0);
declare variable SALDOAUX NUMERIC(18,0);
declare variable CUENTA VARCHAR(20);
declare variable ITEM INTEGER;
declare variable ANO CHAR(4);
begin
ITEM = 0;
ANO = SUBSTR(INICIO,1,4);
/* SALDOS EN BANCOS NACIONALES */
EXECUTE PROCEDURE lee_configuracion('CONTABILIDAD', 'GENERAL', 'NIT COMPAÑIA') returning_values (NIT);
SELECT TERC_NOM, TERC_NOMBRE1, TERC_NOMBRE2, TERC_APELLIDO1, TERC_APELLIDO2, TERC_DV, TIID_CODIGO, PAIS_ID
    FROM TERCEROS T left outer join TIPO_ID IT on (T.TERC_TIPOID = IT.TIID_COD) WHERE TERC_NIT = :NIT
    INTO :RAZONSOCIAL, :NOMBRE1, :NOMBRE2, :APELLIDO1, :APELLIDO2, :DV, :TIPODOC, :PAIS;
select COME_RESPUESTA FROM configura_mediosmag WHERE COME_ITEM = 82 INTO :CONCEPTO;
FOR SELECT CUEN_COD, CUEN_NOM FROM CUENTAS WHERE SUBSTR(CUEN_COD,1,6) = '111005' OR
    SUBSTR(CUEN_COD,1,4) = '1120' ORDER BY CUEN_COD INTO :CUENTA, :razonsocial
    do
    BEGIN
    SALDO = 0;
    EXECUTE PROCEDURE saldo_cuenta_mes(CUENTA, ANO, 12, 'N') RETURNING_VALUES (SALDO);
    if (SALDO > 0) then
        BEGIN
        ITEM = ITEM + 1;
        insert into medios_magneticos_datos (memg_formato, memg_ano, memg_item, memg_concepto, memg_tipodoc, memg_nit, memg_dv,memg_apellido1, memg_apellido2,
            memg_nombre1, memg_nombre2, memg_razonsocial, memg_pago, memg_pais)
            values (10127, :ANO, :item,  :concepto, :tipodoc, :nit, :dv, :apellido1, :apellido2,
            :nombre1, :nombre2, :razonsocial, :SALDO, :pais);
        END
    END
/* SALDOS EN BANCOS EXTERIOR CONSOLIDADO */
EXECUTE PROCEDURE saldo_cuentaf ('111010', FINAL) returning_values (SALDO);
ITEM = ITEM + 1;
TIPODOC = 31;
NIT = '444444000';
RAZONSOCIAL = 'OPERACIONES DEL EXTERIOR';
APELLIDO1 = '';
APELLIDO2 = '';
NOMBRE1 = '';
NOMBRE2 = '';
if (SALDO > 0) then
    BEGIN
    ITEM = ITEM + 1;
    insert into medios_magneticos_datos (memg_formato, memg_ano, memg_item, memg_concepto, memg_tipodoc, memg_nit, memg_dv,memg_apellido1, memg_apellido2,
        memg_nombre1, memg_nombre2, memg_razonsocial, memg_pago, memg_pais)
        values (10127, :ANO, :item,  :concepto, :tipodoc, :nit, :dv, :apellido1, :apellido2,
        :nombre1, :nombre2, :razonsocial, :SALDO, :pais);
    END
/* SALDOS INVERSIONES EN BONOS */
EXECUTE PROCEDURE lee_configuracion('CONTABILIDAD', 'GENERAL', 'NIT COMPAÑIA') returning_values (NIT);
SELECT TERC_NOM, TERC_NOMBRE1, TERC_NOMBRE2, TERC_APELLIDO1, TERC_APELLIDO2, TERC_DV, TIID_CODIGO, PAIS_ID
    FROM TERCEROS T left outer join TIPO_ID IT on (T.TERC_TIPOID = IT.TIID_COD) WHERE TERC_NIT = :NIT
    INTO :RAZONSOCIAL, :NOMBRE1, :NOMBRE2, :APELLIDO1, :APELLIDO2, :DV, :TIPODOC, :PAIS;
select COME_RESPUESTA FROM configura_mediosmag WHERE COME_ITEM = 83 INTO :CONCEPTO;
FOR SELECT CUEN_COD, CUEN_NOM FROM CUENTAS WHERE SUBSTR(CUEN_COD,1,4) = '1215' ORDER BY CUEN_COD INTO :cuenta, :razonsocial
    do
    BEGIN
    SALDO = 0;
    EXECUTE PROCEDURE saldo_cuenta_mes(CUENTA, ANO, 12, 'N') RETURNING_VALUES (SALDO);
    if (SALDO > 0) then
        BEGIN
        ITEM = ITEM + 1;
        insert into medios_magneticos_datos (memg_formato, memg_ano, memg_item, memg_concepto, memg_tipodoc, memg_nit, memg_dv,memg_apellido1, memg_apellido2,
            memg_nombre1, memg_nombre2, memg_razonsocial, memg_pago, memg_pais)
            values (10127, :ANO, :item,  :concepto, :tipodoc, :nit, :dv, :apellido1, :apellido2,
            :nombre1, :nombre2, :razonsocial, :SALDO, :pais);
        END
    END
/* SALDOS INVERSIONES EN CDTS */
select COME_RESPUESTA FROM configura_mediosmag WHERE COME_ITEM = 84 INTO :CONCEPTO;
FOR SELECT CUEN_COD, CUEN_NOM FROM CUENTAS WHERE SUBSTR(CUEN_COD,1,4) = '1225' ORDER BY CUEN_COD INTO :cuenta, :razonsocial
    do
    BEGIN
    SALDO = 0;
    EXECUTE PROCEDURE saldo_cuenta_mes(CUENTA, ANO, 12, 'N') RETURNING_VALUES (SALDO);
    if (SALDO > 0) then
        BEGIN
        ITEM = ITEM + 1;
        insert into medios_magneticos_datos (memg_formato, memg_ano, memg_item, memg_concepto, memg_tipodoc, memg_nit, memg_dv,memg_apellido1, memg_apellido2,
            memg_nombre1, memg_nombre2, memg_razonsocial, memg_pago, memg_pais)
            values (10127, :ANO, :item,  :concepto, :tipodoc, :nit, :dv, :apellido1, :apellido2,
            :nombre1, :nombre2, :razonsocial, :SALDO, :pais);
        END
    END
/* SALDOS INVERSIONES EN TITULOS */
select COME_RESPUESTA FROM configura_mediosmag WHERE COME_ITEM = 85 INTO :CONCEPTO;
FOR SELECT CUEN_COD, CUEN_NOM FROM CUENTAS WHERE SUBSTR(CUEN_COD,1,4) = '1235' ORDER BY CUEN_COD INTO :cuenta, :razonsocial
    do
    BEGIN
    SALDO = 0;
    EXECUTE PROCEDURE saldo_cuenta_mes(CUENTA, ANO, 12, 'N') RETURNING_VALUES (SALDO);
    if (SALDO > 0) then
        BEGIN
        ITEM = ITEM + 1;
        insert into medios_magneticos_datos (memg_formato, memg_ano, memg_item, memg_concepto, memg_tipodoc, memg_nit, memg_dv,memg_apellido1, memg_apellido2,
            memg_nombre1, memg_nombre2, memg_razonsocial, memg_pago, memg_pais)
            values (10127, :ANO, :item,  :concepto, :tipodoc, :nit, :dv, :apellido1, :apellido2,
            :nombre1, :nombre2, :razonsocial, :SALDO, :pais);
        END
    END
/* SALDOS INVERSIONES EN DERECHOS FID. */
select COME_RESPUESTA FROM configura_mediosmag WHERE COME_ITEM = 86 INTO :CONCEPTO;
FOR SELECT distinct TERC_NIT FROM SALDOS_TERCEROS WHERE SUBSTR(CUEN_COD,1,4) = '1245' ORDER BY TERC_NIT INTO :NIT
    do
    BEGIN
    SELECT TERC_NOM, TERC_NOMBRE1, TERC_NOMBRE2, TERC_APELLIDO1, TERC_APELLIDO2, TERC_DV, TIID_CODIGO, PAIS_ID
        FROM TERCEROS T left outer join TIPO_ID IT on (T.TERC_TIPOID = IT.TIID_COD) WHERE TERC_NIT = :NIT
        INTO :RAZONSOCIAL, :NOMBRE1, :NOMBRE2, :APELLIDO1, :APELLIDO2, :DV, :TIPODOC, :PAIS;
    SALDO = 0;
    FOR SELECT DISTINCT CUEN_COD FROM SALDOS_TERCEROS WHERE TERC_NIT = :NIT AND
        SUBSTR(CUEN_COD,1,4) = '1245' INTO :CUENTA
        DO
        BEGIN
        EXECUTE PROCEDURE SALDO_TERCERO_MES(CUENTA, NIT, ANO, 12, 'N') RETURNING_VALUES (SALDOAUX);
        SALDO = SALDO + SALDOAUX;
        END
    if (SALDO > 0) then
        BEGIN
        ITEM = ITEM + 1;
        insert into medios_magneticos_datos (memg_formato, memg_ano, memg_item, memg_concepto, memg_tipodoc, memg_nit, memg_dv,memg_apellido1, memg_apellido2,
            memg_nombre1, memg_nombre2, memg_razonsocial, memg_pago, memg_pais)
            values (10127, :ANO, :item,  :concepto, :tipodoc, :nit, :dv, :apellido1, :apellido2,
            :nombre1, :nombre2, :razonsocial, :SALDO, :pais);
        END
    END
/* SALDOS OTRAS INVERSIONES */
select COME_RESPUESTA FROM configura_mediosmag WHERE COME_ITEM = 87 INTO :CONCEPTO;
FOR SELECT distinct TERC_NIT FROM SALDOS_TERCEROS WHERE SUBSTR(CUEN_COD,1,4) = '1220' OR
    SUBSTR(CUEN_COD,1,4) = '1230' or SUBSTR(CUEN_COD,1,4) = '1240' OR SUBSTR(CUEN_COD,1,4) = '1250' OR
    SUBSTR(CUEN_COD,1,4) = '1255' OR SUBSTR(CUEN_COD,1,4) = '1260' or SUBSTR(CUEN_COD,1,4) = '1295'
    ORDER BY TERC_NIT INTO :NIT
    do
    BEGIN
    SELECT TERC_NOM, TERC_NOMBRE1, TERC_NOMBRE2, TERC_APELLIDO1, TERC_APELLIDO2, TERC_DV, TIID_CODIGO, PAIS_ID
        FROM TERCEROS T left outer join TIPO_ID IT on (T.TERC_TIPOID = IT.TIID_COD) WHERE TERC_NIT = :NIT
        INTO :RAZONSOCIAL, :NOMBRE1, :NOMBRE2, :APELLIDO1, :APELLIDO2, :DV, :TIPODOC, :PAIS;
    SALDO = 0;
    FOR SELECT DISTINCT CUEN_COD FROM SALDOS_TERCEROS WHERE TERC_NIT = :NIT AND
        SUBSTR(CUEN_COD,1,4) = '1220' or SUBSTR(CUEN_COD,1,4) = '1230' or SUBSTR(CUEN_COD,1,4) = '1240' OR
        SUBSTR(CUEN_COD,1,4) = '1250' or SUBSTR(CUEN_COD,1,4) = '1255' OR SUBSTR(CUEN_COD,1,4) = '1260' or
        SUBSTR(CUEN_COD,1,4) = '1295' INTO :CUENTA
        DO
        BEGIN
        EXECUTE PROCEDURE SALDO_TERCERO_MES(CUENTA, NIT, ANO, 12, 'N') RETURNING_VALUES (SALDOAUX);
        SALDO = SALDO + SALDOAUX;
        END
    if (SALDO > 0) then
        BEGIN
        ITEM = ITEM + 1;
        insert into medios_magneticos_datos (memg_formato, memg_ano, memg_item, memg_concepto, memg_tipodoc, memg_nit, memg_dv,memg_apellido1, memg_apellido2,
            memg_nombre1, memg_nombre2, memg_razonsocial, memg_pago, memg_pais)
            values (10127, :ANO, :item,  :concepto, :tipodoc, :nit, :dv, :apellido1, :apellido2,
            :nombre1, :nombre2, :razonsocial, :SALDO, :pais);
        END
    END
/* SALDOS ACCIONES O CUOTAS */
select COME_RESPUESTA FROM configura_mediosmag WHERE COME_ITEM = 88 INTO :CONCEPTO;
FOR SELECT distinct TERC_NIT FROM SALDOS_TERCEROS WHERE SUBSTR(CUEN_COD,1,4) = '1205' OR
    SUBSTR(CUEN_COD,1,4) = '1210' ORDER BY TERC_NIT INTO :NIT
    do
    BEGIN
    SELECT TERC_NOM, TERC_NOMBRE1, TERC_NOMBRE2, TERC_APELLIDO1, TERC_APELLIDO2, TERC_DV, TIID_CODIGO, PAIS_ID
        FROM TERCEROS T left outer join TIPO_ID IT on (T.TERC_TIPOID = IT.TIID_COD) WHERE TERC_NIT = :NIT
        INTO :RAZONSOCIAL, :NOMBRE1, :NOMBRE2, :APELLIDO1, :APELLIDO2, :DV, :TIPODOC, :PAIS;
    SALDO = 0;
    FOR SELECT DISTINCT CUEN_COD FROM SALDOS_TERCEROS WHERE TERC_NIT = :NIT AND
        SUBSTR(CUEN_COD,1,4) = '1205' OR SUBSTR(CUEN_COD,1,4) = '1210' INTO :CUENTA
        DO
        BEGIN
        EXECUTE PROCEDURE SALDO_TERCERO_MES(CUENTA, NIT, ANO, 12, 'N') RETURNING_VALUES (SALDOAUX);
        SALDO = SALDO + SALDOAUX;
        END
    if (SALDO > 0) then
        BEGIN
        ITEM = ITEM + 1;
        insert into medios_magneticos_datos (memg_formato, memg_ano, memg_item, memg_concepto, memg_tipodoc, memg_nit, memg_dv,memg_apellido1, memg_apellido2,
            memg_nombre1, memg_nombre2, memg_razonsocial, memg_pago, memg_pais)
            values (10127, :ANO, :item,  :concepto, :tipodoc, :nit, :dv, :apellido1, :apellido2,
            :nombre1, :nombre2, :razonsocial, :SALDO, :pais);
        END
    END
end
^

SET TERM ; ^

/* 20140402b */
/* ELIMINE LOS CEROS A LA IZQUIERDA DEL NUMERO CONFIGURABLE */
INSERT INTO CONFIGURACION (CONF_MODULO, CONF_CATEGORIA, CONF_PROPIEDAD, CONF_VALOR, CONF_POSIBLES, CONF_AYUDA) VALUES ('FACTURACION', 'DOCUMENTOS', 'IMPRIMIR REPORTES DE COMPROBANTES Y CONSECUTIVOS CON CEROS A LA IZQUIERDA', 'SI', 'SI,NO', 'SI:Imprime los números con 8 o 6 dígitos completando con ceros a la izquierda.  NO: Elimina los ceros a la izquierda del número.');
commit work;

SET TERM ^ ;

CREATE OR ALTER procedure REP_COMPROBANTES_FAC (
    TIPO integer,
    DETALLE char(1),
    FECINI date,
    FECFIN date,
    PREFINI varchar(4),
    PREFFIN varchar(4),
    PTOINI integer,
    PTOFIN integer,
    ANULADOS char(1),
    SUBEMPRESA integer)
returns (
    NOMTIPO varchar(30),
    ID integer,
    PREF varchar(4),
    NUMERO varchar(8),
    FECHA date,
    VENCE date,
    CODBOD varchar(2),
    NOMBOD varchar(30),
    AUTORIZA varchar(20),
    PTVTID integer,
    PTVTNOM varchar(60),
    VENDCOD integer,
    VENDNOM varchar(60),
    COMIPORC numeric(9,2),
    COMIMONTO numeric(18,2),
    NIT varchar(20),
    NOMTERCERO varchar(60),
    SUCURSAL varchar(10),
    DIRECCION varchar(60),
    CIUDAD varchar(40),
    TELEFONO varchar(40),
    PEDIDO varchar(30),
    COTIZACI varchar(30),
    REMISION varchar(30),
    OBS varchar(255),
    ITEM integer,
    ARTICULO varchar(15),
    CODBAR varchar(15),
    ARTIDES varchar(60),
    CANT numeric(18,4),
    UNIDAD varchar(8),
    BODITEM varchar(2),
    LOTE varchar(15),
    REFERENCIA varchar(60),
    PRECIO numeric(18,2),
    DTOPORCIT numeric(9,2),
    DTOMONTOIT numeric(18,2),
    IVAPORCIT numeric(9,2),
    IVAMONTOIT numeric(18,2),
    CONSUMOIT numeric(18,2),
    SUBTOTALIT numeric(18,2),
    DTOPOR numeric(9,2),
    DTOMONTO numeric(18,2),
    ADICIONAL numeric(18,2),
    IVAMONTO numeric(18,2),
    RTFTEPOR numeric(9,2),
    RTFTEMONTO numeric(18,2),
    RTIVAPOR numeric(9,2),
    RTIVAMONTO numeric(18,2),
    RTICAPOR numeric(9,2),
    RTICAMONTO numeric(18,2),
    RTCREE numeric(9,2),
    RTCREEM numeric(18,2),
    EXTRA numeric(18,2),
    DTOFPOR numeric(9,2),
    DTOFMONTO numeric(18,2),
    DTOFFECHA date,
    TOTAL numeric(18,2),
    ANULADO char(1),
    VEHICULO varchar(8),
    DESPACHO varchar(255),
    FECREG date,
    HORAREG time,
    CONTADO numeric(18,2),
    CREDITO numeric(18,2))
AS
declare variable CEROSIZQ CHAR(2);
BEGIN
VEHICULO = '';
execute procedure lee_configuracion('FACTURACION', 'DOCUMENTOS', 'IMPRIMIR REPORTES DE COMPROBANTES Y CONSECUTIVOS CON CEROS A LA IZQUIERDA') returning_values (CEROSIZQ);
  /* DETERMINE LA TABLA A EXAMINAR */
  if (BIN_AND(TIPO, 1) <> 0) then
    BEGIN
    SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 31 INTO :NOMTIPO;
    FOR SELECT FACT_ID, F.PREF_PRE, FACT_NUMERO, FACT_FECHA, FACT_VENCE, F.BODE_COD, B.BODE_NOM, F.AUTO_NUMERO, F.PTVT_ID, PTVT_NOM,
        F.VEND_COD, VEND_NOMBRE, F.FACT_COMIPORC, F.FACT_COMIMONTO, F.TERC_NIT, FACT_NOMCLIENTE, FACT_PEDIDO, FACT_COTIZACI, FACT_REMISION,
        FACT_DTOPOR, FACT_DTOMONTO, FACT_ADICIONAL, FACT_IVAMONTO, FACT_RTFTEPOR, FACT_RTFTEMONTO, FACT_RTIVAPOR, FACT_RTIVAMONTO,
        FACT_RTICAPOR, FACT_RTICAMONTO, FACT_RTCREE, FACT_RTCREEM, FACT_EXTRA, FACT_DTOFPOR, FACT_DTOFMONTO, FACT_DTOFFECHA, FACT_TOTAL, FACT_ANULADO, VEHI_COD,
        SUBSTRING(FACT_OBS FROM 1 FOR 255), FACT_SUCURSAL, FACT_DESPACHO
        FROM FACTURAS F, BODEGA B, PUNTO_VENTA P, VENDEDORES V, PREFIJOS PR WHERE F.PTVT_ID >= :PTOINI AND F.PTVT_ID <= :PTOFIN AND
         F.BODE_COD = B.BODE_COD AND F.PTVT_ID = P.PTVT_ID AND F.VEND_COD = V.VEND_COD AND FACT_FECHA >= :FECINI AND FACT_FECHA <= :FECFIN
         AND PR.PREF_PRE = F.PREF_PRE AND PR.TIDO_COD = 31 AND ((PR.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) AND
         F.PREF_PRE >= :prefini AND F.PREF_PRE <= :preffin
        ORDER BY FACT_FECHA, FACT_ID
        INTO :ID, :PREF, :NUMERO, :FECHA, :VENCE, :CODBOD, :NOMBOD, :AUTORIZA, :PTVTID, :PTVTNOM,
        :VENDCOD, :VENDNOM, :COMIPORC, :COMIMONTO, :NIT, :NOMTERCERO, :PEDIDO, :COTIZACI, :REMISION,
        :DTOPOR, :DTOMONTO, :ADICIONAL, :IVAMONTO, :RTFTEPOR, :RTFTEMONTO, :RTIVAPOR, :RTIVAMONTO,
        :RTICAPOR, :RTICAMONTO, :RTCREE, :RTCREEM, :EXTRA, :DTOFPOR, :DTOFMONTO, :DTOFFECHA, :TOTAL, :ANULADO, :VEHICULO,
        :OBS, :sucursal, :despacho
        DO
        BEGIN
        if (CEROSIZQ = 'NO') then
            NUMERO = CAST(CAST(NUMERO AS INTEGER) AS VARCHAR(8));
        if ((ANULADOS = 'S') or (ANULADO = 'N')) then
            BEGIN
            DIRECCION = '';
            CIUDAD = '';
            TELEFONO = '';
            SELECT TERC_DIR, TERC_CIU, TERC_TEL FROM TERCEROS WHERE terc_nit = :NIT INTO :direccion, :ciudad, :telefono;
            SELECT SUM(RCDE_ABONO+RCDE_DTOF) FROM RECIBOS_CAJA_DETALLE D, RECIBOS_CAJA R
                WHERE D.rcde_tipodoc = 31 AND D.rcde_iddoc = :id AND R.reca_id = D.reca_id AND RECA_FECHA = :FECHA AND RCDE_ANULADO = 'N'
                INTO :CONTADO;
            if (CONTADO IS NULL) then
                CONTADO = 0;
            CREDITO = TOTAL - CONTADO;
            SELECT AUDI_FECHA, AUDI_HORA FROM AUDITORIA
                WHERE AUDI_IDDOC = :ID AND TIDO_COD = 31 AND AUDI_OPER = 'I' INTO :FECREG, :HORAREG;
            if (anulado = 'S') then
                BEGIN
                COMIPORC = 0;
                COMIMONTO = 0;
                DTOPOR = 0;
                DTOMONTO = 0;
                ADICIONAL = 0;
                IVAMONTO = 0;
                RTFTEPOR = 0;
                RTFTEMONTO = 0;
                RTIVAPOR = 0;
                RTIVAMONTO = 0;
                RTICAPOR = 0;
                RTICAMONTO = 0;
                RTCREE = 0;
                RTCREEM = 0;
                EXTRA = 0;
                DTOFPOR = 0;
                DTOFMONTO = 0;
                TOTAL = 0;
                END
            if (DETALLE = 'S') then
                BEGIN
                if (anulado = 'S') then
                    BEGIN
                    ITEM = 0;
                    ARTICULO = '';
                    CODBAR = '';
                    ARTIDES = '';
                    CANT = 0;
                    UNIDAD = '';
                    BODITEM = '';
                    LOTE = '';
                    REFERENCIA = '';
                    PRECIO = 0;
                    DTOPORCIT = 0;
                    DTOMONTOIT = 0;
                    IVAPORCIT = 0;
                    IVAMONTOIT = 0;
                    CONSUMOIT = 0;
                    SUBTOTALIT = 0;
                    SUSPEND;
                    END
                ELSE
                    BEGIN
                    FOR SELECT FADE_ITEM, ARTI_COD, FADE_CODBAR, SUBSTRING(FADE_DESC FROM 1 FOR 60), FADE_CANT, FADE_UNIDAD, BODE_COD, FADE_LOTE, FADE_REFERENCIA, FADE_PRUNIT, FADE_DTOPORC, FADE_DTOMONTO, FADE_IVAPORC, FADE_IVAMONTO, FADE_CONSUMO, FADE_TOTAL
                        FROM FACTURAS_DETALLE
                        WHERE FACT_ID = :ID and substring(arti_cod from 1 FOR 2) <> '.t'
                        ORDER BY FADE_ITEM
                        INTO :ITEM, :ARTICULO, :CODBAR, :ARTIDES, :CANT, :UNIDAD, :BODITEM, :LOTE, :REFERENCIA, :PRECIO, :DTOPORCIT, :DTOMONTOIT, :IVAPORCIT, :IVAMONTOIT, :CONSUMOIT, :SUBTOTALIT
                        DO
                        SUSPEND;
                    END
                END
            ELSE
                SUSPEND;
            END
        END
    END
  if (BIN_AND(TIPO, 2) <> 0) then
    BEGIN
    DESPACHO = '';
    RTCREE = 0;
    RTCREEM = 0;
    SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 32 INTO :NOMTIPO;
    FOR SELECT REVT_ID, R.PREF_PRE, REVT_NUMERO, REVT_FECHA, REVT_FECHA VENCE, R.BODE_COD, B.BODE_NOM, '', R.PTVT_ID, PTVT_NOM, R.VEND_COD, VEND_NOMBRE, 0, 0, R.TERC_NIT, REVT_NOMTERC, '', '', '', 0, 0, 0, REVT_IVAMONTO, 0, 0, 0, 0, 0, 0, 0, 0, 0, REVT_FECHA DTOF, REVT_TOTAL, REVT_ANULADO, SUBSTRING(REVT_OBS FROM 1 FOR 255), REVT_SUCURSAL
        FROM REMISIONES_VENTA R, BODEGA B, PUNTO_VENTA P, VENDEDORES V, PREFIJOS PR WHERE R.PTVT_ID >= :PTOINI AND R.PTVT_ID <= :PTOFIN AND
         R.BODE_COD = B.BODE_COD AND R.PTVT_ID = P.PTVT_ID AND R.VEND_COD = V.VEND_COD AND REVT_FECHA >= :FECINI AND REVT_FECHA <= :FECFIN
         AND PR.PREF_PRE = R.PREF_PRE AND PR.TIDO_COD = 32 AND ((PR.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) AND
         R.PREF_PRE >= :prefini AND R.PREF_PRE <= :preffin
        ORDER BY REVT_FECHA, REVT_ID
        INTO :ID, :PREF, :NUMERO, :FECHA, :VENCE, :CODBOD, :NOMBOD, :AUTORIZA, :PTVTID, :PTVTNOM, :VENDCOD, :VENDNOM, :COMIPORC, :COMIMONTO, :NIT, :NOMTERCERO, :PEDIDO, :COTIZACI, :REMISION, :DTOPOR, :DTOMONTO, :ADICIONAL, :IVAMONTO, :RTFTEPOR, :RTFTEMONTO, :RTIVAPOR, :RTIVAMONTO, :RTICAPOR, :RTICAMONTO, :EXTRA, :DTOFPOR, :DTOFMONTO, :DTOFFECHA, :TOTAL, :ANULADO, :OBS, :sucursal
        DO
        BEGIN
        if (CEROSIZQ = 'NO') then
            NUMERO = CAST(CAST(NUMERO AS INTEGER) AS VARCHAR(8));
        if ((ANULADOS = 'S') or (ANULADO = 'N')) then
            BEGIN
            DIRECCION = '';
            CIUDAD = '';
            TELEFONO = '';
            SELECT TERC_DIR, TERC_CIU, TERC_TEL FROM TERCEROS WHERE terc_nit = :NIT INTO :direccion, :ciudad, :telefono;
            SELECT AUDI_FECHA, AUDI_HORA FROM AUDITORIA
                WHERE AUDI_IDDOC = :ID AND TIDO_COD = 32 AND AUDI_OPER = 'I' INTO :FECREG, :HORAREG;
            CONTADO = 0;
            CREDITO = TOTAL;
            if (anulado = 'S') then
                BEGIN
                COMIPORC = 0;
                COMIMONTO = 0;
                DTOPOR = 0;
                DTOMONTO = 0;
                ADICIONAL = 0;
                IVAMONTO = 0;
                RTFTEPOR = 0;
                RTFTEMONTO = 0;
                RTIVAPOR = 0;
                RTIVAMONTO = 0;
                RTICAPOR = 0;
                RTICAMONTO = 0;
                EXTRA = 0;
                DTOFPOR = 0;
                DTOFMONTO = 0;
                TOTAL = 0;
                END
            if (DETALLE = 'S') then
                BEGIN
                if (anulado = 'S') then
                    BEGIN
                    ITEM = 0;
                    ARTICULO = '';
                    CODBAR = '';
                    ARTIDES = '';
                    CANT = 0;
                    UNIDAD = '';
                    BODITEM = '';
                    LOTE = '';
                    REFERENCIA = '';
                    PRECIO = 0;
                    DTOPORCIT = 0;
                    DTOMONTOIT = 0;
                    IVAPORCIT = 0;
                    IVAMONTOIT = 0;
                    CONSUMOIT = 0;
                    SUBTOTALIT = 0;
                    SUSPEND;
                    END
                ELSE
                    BEGIN
                    FOR SELECT RVDE_ITEM, ARTI_COD, RVDE_CODBAR, SUBSTRING(RVDE_DESC FROM 1 FOR 60), RVDE_CANT, RVDE_UNIDAD, BODE_COD, RVDE_LOTE, RVDE_REFERENCIA, RVDE_PRUNIT, RVDE_DTOPORC, RVDE_DTOMONTO, RVDE_IVAPORC, RVDE_IVAMONTO, RVDE_CONSUMO, RVDE_TOTAL
                        FROM REMISIONES_VENTA_DETALLE
                        WHERE REVT_ID = :ID
                        ORDER BY RVDE_ITEM
                        INTO :ITEM, :ARTICULO, :CODBAR, :ARTIDES, :CANT, :UNIDAD, :BODITEM, :LOTE, :REFERENCIA, :PRECIO, :DTOPORCIT, :DTOMONTOIT, :IVAPORCIT, :IVAMONTOIT, :CONSUMOIT, :SUBTOTALIT
                        DO
                        SUSPEND;
                    END
                END
            ELSE
                SUSPEND;
            END
        END
    END
  if (BIN_AND(TIPO, 4) <> 0) then
    BEGIN
    DESPACHO = '';
    SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 33 INTO :NOMTIPO;
    FOR SELECT DEVT_ID, D.PREF_PRE, DEVT_NUMERO, DEVT_FECHA, DEVT_FECHA VENCE, D.BODE_COD, B.BODE_NOM, '', D.PTVT_ID, PTVT_NOM,
        D.VEND_COD, VEND_NOMBRE, DEVT_COMIPORC, DEVT_COMIMONTO, D.TERC_NIT, DEVT_NOMTERC, DEVT_FACTURA, '', DEVT_REMISION,
        DEVT_DTOPOR, DEVT_DTOMONTO, DEVT_ADICIONAL, DEVT_IVAMONTO, DEVT_RTFTEPORC, DEVT_RTFTEMONTO, DEVT_RTIVAPORC, DEVT_RTIVAMONTO,
        DEVT_RTICAPORC, DEVT_RTICAMONTO, DEVT_RTCREE, DEVT_RTCREEM, DEVT_EXTRA, 0, 0, DEVT_FECHA DTOF, DEVT_TOTAL, DEVT_ANULADO, SUBSTRING(DEVT_OBS FROM 1 FOR 255), DEVT_SUCURSAL
        FROM DEVOLUCIONES_VENTAS D, BODEGA B, PUNTO_VENTA P, VENDEDORES V, PREFIJOS PR WHERE D.PTVT_ID >= :PTOINI AND D.PTVT_ID <= :PTOFIN AND
         D.BODE_COD = B.BODE_COD AND D.PTVT_ID = P.PTVT_ID AND D.VEND_COD = V.VEND_COD AND DEVT_FECHA >= :FECINI AND DEVT_FECHA <= :FECFIN
         AND PR.PREF_PRE = D.PREF_PRE AND PR.TIDO_COD = 33 AND ((PR.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) AND
         D.PREF_PRE >= :prefini AND D.PREF_PRE <= :preffin
        ORDER BY DEVT_FECHA, DEVT_ID
        INTO :ID, :PREF, :NUMERO, :FECHA, :VENCE, :CODBOD, :NOMBOD, :AUTORIZA, :PTVTID, :PTVTNOM,
        :VENDCOD, :VENDNOM, :COMIPORC, :COMIMONTO, :NIT, :NOMTERCERO, :PEDIDO, :COTIZACI, :REMISION,
        :DTOPOR, :DTOMONTO, :ADICIONAL, :IVAMONTO, :RTFTEPOR, :RTFTEMONTO, :RTIVAPOR, :RTIVAMONTO,
        :RTICAPOR, :RTICAMONTO, :RTCREE, :RTCREEM, :EXTRA, :DTOFPOR, :DTOFMONTO, :DTOFFECHA, :TOTAL, :ANULADO, :OBS, :sucursal
        DO
        BEGIN
        if (CEROSIZQ = 'NO') then
            NUMERO = CAST(CAST(NUMERO AS INTEGER) AS VARCHAR(8));
        if ((ANULADOS = 'S') or (ANULADO = 'N')) then
            BEGIN
            SELECT AUDI_FECHA, AUDI_HORA FROM AUDITORIA
                WHERE AUDI_IDDOC = :ID AND TIDO_COD = 33 AND AUDI_OPER = 'I' INTO :FECREG, :HORAREG;
            SELECT SUM(RCDE_ABONO+RCDE_DTOF) FROM RECIBOS_CAJA_DETALLE D, RECIBOS_CAJA R
                WHERE D.rcde_tipodoc = 33 AND D.rcde_iddoc = :id AND R.reca_id = D.reca_id AND RECA_FECHA = :FECHA AND RCDE_ANULADO = 'N'
                INTO :CONTADO;
            if (CONTADO IS NULL) then
                CONTADO = 0;
            ELSE
                CONTADO = CONTADO * -1;
            CREDITO = TOTAL - CONTADO;
            DIRECCION = '';
            CIUDAD = '';
            TELEFONO = '';
            SELECT TERC_DIR, TERC_CIU, TERC_TEL FROM TERCEROS WHERE terc_nit = :NIT INTO :direccion, :ciudad, :telefono;
            if (anulado = 'S') then
                BEGIN
                COMIPORC = 0;
                COMIMONTO = 0;
                DTOPOR = 0;
                DTOMONTO = 0;
                ADICIONAL = 0;
                IVAMONTO = 0;
                RTFTEPOR = 0;
                RTFTEMONTO = 0;
                RTIVAPOR = 0;
                RTIVAMONTO = 0;
                RTICAPOR = 0;
                RTICAMONTO = 0;
                EXTRA = 0;
                DTOFPOR = 0;
                DTOFMONTO = 0;
                TOTAL = 0;
                END
            if (DETALLE = 'S') then
                BEGIN
                if (anulado = 'S') then
                    BEGIN
                    ITEM = 0;
                    ARTICULO = '';
                    CODBAR = '';
                    ARTIDES = '';
                    CANT = 0;
                    UNIDAD = '';
                    BODITEM = '';
                    LOTE = '';
                    REFERENCIA = '';
                    PRECIO = 0;
                    DTOPORCIT = 0;
                    DTOMONTOIT = 0;
                    IVAPORCIT = 0;
                    IVAMONTOIT = 0;
                    CONSUMOIT = 0;
                    SUBTOTALIT = 0;
                    SUSPEND;
                    END
                ELSE
                    BEGIN
                    FOR SELECT DVDE_ITEM, ARTI_COD, DVDE_CODBAR, SUBSTRING(DVDE_DESC FROM 1 FOR 60), DVDE_CANT, DVDE_UNIDAD, BODE_COD, DVDE_LOTE, DVDE_REFERENCIA, DVDE_PRUNIT, DVDE_DTOPORC, DVDE_DTOMONTO, DVDE_IVAPORC, DVDE_IVAMONTO, DVDE_CONSUMO, DVDE_TOTAL
                        FROM DEVOLUCIONES_VENTAS_DETALLE
                        WHERE DEVT_ID = :ID and substring(arti_cod from 1 FOR 2) <> '.t'
                        ORDER BY DVDE_ITEM
                        INTO :ITEM, :ARTICULO, :CODBAR, :ARTIDES, :CANT, :UNIDAD, :BODITEM, :LOTE, :REFERENCIA, :PRECIO, :DTOPORCIT, :DTOMONTOIT, :IVAPORCIT, :IVAMONTOIT, :CONSUMOIT, :SUBTOTALIT
                        DO
                        SUSPEND;
                    END
                END
            ELSE
                SUSPEND;
            END
        END
    END
  if (BIN_AND(TIPO, 8) <> 0) then
    BEGIN
    DESPACHO = '';
    RTCREE = 0;
    RTCREEM = 0;
    SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 34 INTO :NOMTIPO;
    FOR SELECT PEDI_ID, P.PREF_PRE, PEDI_NUMERO, PEDI_FECHA, PEDI_FECHA VENCE, '', '', '', P.PTVT_ID, PTVT_NOM, P.VEND_COD, VEND_NOMBRE, 0, 0, P.TERC_NIT, PEDI_NOMTERC, PEDI_ORDENC, PEDI_COTIZACI, '', PEDI_DTOPOR, PEDI_DTOMONTO, PEDI_ADICIONAL, PEDI_IVAMONTO, 0, 0, 0, 0, 0, 0, PEDI_EXTRA, 0, 0, PEDI_FECHA DTOF, PEDI_TOTAL, PEDI_ANULADO, SUBSTRING(PEDI_OBS FROM 1 FOR 255), PEDI_SUCURSAL
        FROM PEDIDOS P, PUNTO_VENTA PT, VENDEDORES V, PREFIJOS PR WHERE P.PTVT_ID >= :PTOINI AND P.PTVT_ID <= :PTOFIN AND
         P.PTVT_ID = PT.PTVT_ID AND P.VEND_COD = V.VEND_COD AND PEDI_FECHA >= :FECINI AND PEDI_FECHA <= :FECFIN
         AND PR.PREF_PRE = P.PREF_PRE AND PR.TIDO_COD = 34 AND ((PR.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) AND
         P.PREF_PRE >= :prefini AND P.PREF_PRE <= :preffin
        ORDER BY PEDI_FECHA, PEDI_ID
        INTO :ID, :PREF, :NUMERO, :FECHA, :VENCE, :CODBOD, :NOMBOD, :AUTORIZA, :PTVTID, :PTVTNOM, :VENDCOD, :VENDNOM, :COMIPORC, :COMIMONTO, :NIT, :NOMTERCERO, :PEDIDO, :COTIZACI, :REMISION, :DTOPOR, :DTOMONTO, :ADICIONAL, :IVAMONTO, :RTFTEPOR, :RTFTEMONTO, :RTIVAPOR, :RTIVAMONTO, :RTICAPOR, :RTICAMONTO, :EXTRA, :DTOFPOR, :DTOFMONTO, :DTOFFECHA, :TOTAL, :ANULADO, :OBS, :sucursal
        DO
        BEGIN
        if (CEROSIZQ = 'NO') then
            NUMERO = CAST(CAST(NUMERO AS INTEGER) AS VARCHAR(8));
        if ((ANULADOS = 'S') or (ANULADO = 'N')) then
            BEGIN
            DIRECCION = '';
            CIUDAD = '';
            TELEFONO = '';
            SELECT TERC_DIR, TERC_CIU, TERC_TEL FROM TERCEROS WHERE terc_nit = :NIT INTO :direccion, :ciudad, :telefono;
            SELECT AUDI_FECHA, AUDI_HORA FROM AUDITORIA
                WHERE AUDI_IDDOC = :ID AND TIDO_COD = 34 AND AUDI_OPER = 'I' INTO :FECREG, :HORAREG;
            CONTADO = 0;
            CREDITO = TOTAL;
            if (anulado = 'S') then
                BEGIN
                COMIPORC = 0;
                COMIMONTO = 0;
                DTOPOR = 0;
                DTOMONTO = 0;
                ADICIONAL = 0;
                IVAMONTO = 0;
                RTFTEPOR = 0;
                RTFTEMONTO = 0;
                RTIVAPOR = 0;
                RTIVAMONTO = 0;
                RTICAPOR = 0;
                RTICAMONTO = 0;
                RTCREE = 0;
                RTCREEM = 0;
                EXTRA = 0;
                DTOFPOR = 0;
                DTOFMONTO = 0;
                TOTAL = 0;
                END
            if (DETALLE = 'S') then
                BEGIN
                if (anulado = 'S') then
                    BEGIN
                    ITEM = 0;
                    ARTICULO = '';
                    CODBAR = '';
                    ARTIDES = '';
                    CANT = 0;
                    UNIDAD = '';
                    BODITEM = '';
                    LOTE = '';
                    REFERENCIA = '';
                    PRECIO = 0;
                    DTOPORCIT = 0;
                    DTOMONTOIT = 0;
                    IVAPORCIT = 0;
                    IVAMONTOIT = 0;
                    CONSUMOIT = 0;
                    SUBTOTALIT = 0;
                    SUSPEND;
                    END
                ELSE
                    BEGIN
                    FOR SELECT PEDE_ITEM, ARTI_COD, PEDE_CODBAR, SUBSTRING(PEDE_DESC FROM 1 FOR 60), PEDE_CANT, PEDE_UNIDAD, '', '', PEDE_REFERENCIA, PEDE_PRUNIT, PEDE_DTOPORC, PEDE_DTOMONTO, PEDE_IVAPORC, PEDE_IVAMONTO, PEDE_CONSUMO, PEDE_TOTAL
                        FROM PEDIDOS_DETALLE
                        WHERE PEDI_ID = :ID
                        ORDER BY PEDE_ITEM
                        INTO :ITEM, :ARTICULO, :CODBAR, :artides, :CANT, :UNIDAD, :BODITEM, :LOTE, :REFERENCIA, :PRECIO, :DTOPORCIT, :DTOMONTOIT, :IVAPORCIT, :IVAMONTOIT, :CONSUMOIT, :SUBTOTALIT
                        DO
                        SUSPEND;
                    END
                END
            ELSE
                SUSPEND;
            END
        END
    END
  if (BIN_AND(TIPO, 16) <> 0) then
    BEGIN
    DESPACHO = '';
    RTCREE = 0;
    RTCREEM = 0;
    SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 35 INTO :NOMTIPO;
    FOR SELECT COTI_ID, C.PREF_PRE, COTI_NUMERO, COTI_FECHA, COTI_FECHA VENCE, '', '', '', C.PTVT_ID, PTVT_NOM, C.VEND_COD, VEND_NOMBRE, 0, 0, C.TERC_NIT, COTI_NOMTERC, '', '', '', COTI_DTOPORC, COTI_DTOMONTO, COTI_ADICIONAL, COTI_IVAMONTO, 0, 0, 0, 0, 0, 0, COTI_EXTRA, 0, 0, COTI_FECHA DTOF, COTI_TOTAL, COTI_ANULADO, SUBSTRING(COTI_OBS FROM 1 FOR 255), COTI_SUCURSAL
        FROM COTIZACIONES C, PUNTO_VENTA P, VENDEDORES V, PREFIJOS PR WHERE C.PTVT_ID >= :PTOINI AND C.PTVT_ID <= :PTOFIN AND
         C.PTVT_ID = P.PTVT_ID AND C.VEND_COD = V.VEND_COD AND COTI_FECHA >= :FECINI AND COTI_FECHA <= :FECFIN
         AND PR.PREF_PRE = C.PREF_PRE AND PR.TIDO_COD = 35 AND ((PR.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) AND
         C.PREF_PRE >= :prefini AND C.PREF_PRE <= :preffin
        ORDER BY COTI_FECHA, COTI_ID
        INTO :ID, :PREF, :NUMERO, :FECHA, :VENCE, :CODBOD, :NOMBOD, :AUTORIZA, :PTVTID, :PTVTNOM, :VENDCOD, :VENDNOM, :COMIPORC, :COMIMONTO, :NIT, :NOMTERCERO, :PEDIDO, :COTIZACI, :REMISION, :DTOPOR, :DTOMONTO, :ADICIONAL, :IVAMONTO, :RTFTEPOR, :RTFTEMONTO, :RTIVAPOR, :RTIVAMONTO, :RTICAPOR, :RTICAMONTO, :EXTRA, :DTOFPOR, :DTOFMONTO, :DTOFFECHA, :TOTAL, :ANULADO, :OBS, :sucursal
        DO
        BEGIN
        if (CEROSIZQ = 'NO') then
            NUMERO = CAST(CAST(NUMERO AS INTEGER) AS VARCHAR(8));
        if ((ANULADOS = 'S') or (ANULADO = 'N')) then
            BEGIN
            DIRECCION = '';
            CIUDAD = '';
            TELEFONO = '';
            SELECT TERC_DIR, TERC_CIU, TERC_TEL FROM TERCEROS WHERE terc_nit = :NIT INTO :direccion, :ciudad, :telefono;
            SELECT AUDI_FECHA, AUDI_HORA FROM AUDITORIA
                WHERE AUDI_IDDOC = :ID AND TIDO_COD = 35 AND AUDI_OPER = 'I' INTO :FECREG, :HORAREG;
            CONTADO = 0;
            CREDITO = TOTAL;
            if (anulado = 'S') then
                BEGIN
                COMIPORC = 0;
                COMIMONTO = 0;
                DTOPOR = 0;
                DTOMONTO = 0;
                ADICIONAL = 0;
                IVAMONTO = 0;
                RTFTEPOR = 0;
                RTFTEMONTO = 0;
                RTIVAPOR = 0;
                RTIVAMONTO = 0;
                RTICAPOR = 0;
                RTICAMONTO = 0;
                EXTRA = 0;
                DTOFPOR = 0;
                DTOFMONTO = 0;
                TOTAL = 0;
                END
            if (DETALLE = 'S') then
                BEGIN
                if (anulado = 'S') then
                    BEGIN
                    ITEM = 0;
                    ARTICULO = '';
                    CODBAR = '';
                    ARTIDES = '';
                    CANT = 0;
                    UNIDAD = '';
                    BODITEM = '';
                    LOTE = '';
                    REFERENCIA = '';
                    PRECIO = 0;
                    DTOPORCIT = 0;
                    DTOMONTOIT = 0;
                    IVAPORCIT = 0;
                    IVAMONTOIT = 0;
                    CONSUMOIT = 0;
                    SUBTOTALIT = 0;
                    SUSPEND;
                    END
                ELSE
                    BEGIN
                    FOR SELECT CTDE_ITEM, ARTI_COD, CTDE_CODBAR, SUBSTRING(CTDE_DESC FROM 1 FOR 60), CTDE_CANT, CTDE_UNIDAD, '', '', CTDE_REFERENCIA, CTDE_PRUNIT, CTDE_DTOPORC, CTDE_DTOMONTO, CTDE_IVAPORC, CTDE_IVAMONTO, CTDE_CONSUMO, CTDE_TOTAL
                        FROM COTIZACIONES_DETALLE
                        WHERE COTI_ID = :ID
                        ORDER BY CTDE_ITEM
                        INTO :ITEM, :ARTICULO, :CODBAR, :ARTIDES, :CANT, :UNIDAD, :BODITEM, :LOTE, :REFERENCIA, :PRECIO, :DTOPORCIT, :DTOMONTOIT, :IVAPORCIT, :IVAMONTOIT, :CONSUMOIT, :SUBTOTALIT
                        DO
                        SUSPEND;
                    END
                END
            ELSE
                SUSPEND;
            END
        END
    END
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER procedure REP_CONSECUTIVOS_FAC (
    TIPO integer,
    DETALLE char(1),
    PREINI varchar(4),
    PREFIN varchar(4),
    NUMINI varchar(8),
    NUMFIN varchar(8),
    PTOINI integer,
    PTOFIN integer,
    ANULADOS char(1),
    SUBEMPRESA integer)
returns (
    NOMTIPO varchar(30),
    ID integer,
    PREF varchar(4),
    NUMERO varchar(8),
    FECHA date,
    VENCE date,
    CODBOD varchar(2),
    NOMBOD varchar(30),
    AUTORIZA varchar(20),
    PTVTID integer,
    PTVTNOM varchar(60),
    VENDCOD integer,
    VENDNOM varchar(60),
    COMIPORC numeric(9,2),
    COMIMONTO numeric(18,2),
    NIT varchar(20),
    NOMTERCERO varchar(60),
    SUCURSAL varchar(10),
    PEDIDO varchar(30),
    COTIZACI varchar(30),
    REMISION varchar(30),
    OBS varchar(255),
    ITEM integer,
    ARTICULO varchar(15),
    CODBAR varchar(15),
    ARTIDES varchar(60),
    CANT numeric(18,4),
    UNIDAD varchar(8),
    BODITEM varchar(2),
    LOTE varchar(15),
    REFERENCIA varchar(60),
    PRECIO numeric(18,2),
    DTOPORCIT numeric(9,2),
    DTOMONTOIT numeric(18,2),
    IVAPORCIT numeric(9,2),
    IVAMONTOIT numeric(18,2),
    CONSUMOIT numeric(18,2),
    SUBTOTALIT numeric(18,2),
    DTOPOR numeric(9,2),
    DTOMONTO numeric(18,2),
    ADICIONAL numeric(18,2),
    IVAMONTO numeric(18,2),
    RTFTEPOR numeric(9,2),
    RTFTEMONTO numeric(18,2),
    RTIVAPOR numeric(9,2),
    RTIVAMONTO numeric(18,2),
    RTICAPOR numeric(9,2),
    RTICAMONTO numeric(18,2),
    RTCREE numeric(9,2),
    RTCREEM numeric(18,2),
    EXTRA numeric(18,2),
    DTOFPOR numeric(9,2),
    DTOFMONTO numeric(18,2),
    DTOFFECHA date,
    TOTAL numeric(18,2),
    ANULADO char(1),
    VEHICULO varchar(8))
AS
declare variable CEROSIZQ CHAR(2);
BEGIN
VEHICULO = '';
execute procedure lee_configuracion('FACTURACION', 'DOCUMENTOS', 'IMPRIMIR REPORTES DE COMPROBANTES Y CONSECUTIVOS CON CEROS A LA IZQUIERDA') returning_values (CEROSIZQ);
  /* DETERMINE LA TABLA A EXAMINAR */
  if (BIN_AND(TIPO, 1) <> 0) then
    BEGIN
    SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 31 INTO :NOMTIPO;
    /* FACTURA */
    FOR SELECT FACT_ID, F.PREF_PRE, FACT_NUMERO, FACT_FECHA, FACT_VENCE, F.BODE_COD, B.BODE_NOM, F.AUTO_NUMERO, F.PTVT_ID, PTVT_NOM,
        F.VEND_COD, VEND_NOMBRE, F.FACT_COMIPORC, F.FACT_COMIMONTO, F.TERC_NIT, FACT_NOMCLIENTE, FACT_PEDIDO, FACT_COTIZACI, FACT_REMISION,
        FACT_DTOPOR, FACT_DTOMONTO, FACT_ADICIONAL, FACT_IVAMONTO, FACT_RTFTEPOR, FACT_RTFTEMONTO, FACT_RTIVAPOR, FACT_RTIVAMONTO,
        FACT_RTICAPOR, FACT_RTICAMONTO, FACT_RTCREE, FACT_RTCREEM, FACT_EXTRA, FACT_DTOFPOR, FACT_DTOFMONTO, FACT_DTOFFECHA, FACT_TOTAL, FACT_ANULADO, VEHI_COD,
        SUBSTRING(FACT_OBS FROM 1 FOR 255), FACT_SUCURSAL
        FROM FACTURAS F, BODEGA B, PUNTO_VENTA P, VENDEDORES V, PREFIJOS PR WHERE F.PTVT_ID >= :PTOINI AND F.PTVT_ID <= :PTOFIN AND
         F.BODE_COD = B.BODE_COD AND F.PTVT_ID = P.PTVT_ID AND F.VEND_COD = V.VEND_COD AND F.PREF_PRE >= :PREINI AND F.PREF_PRE <= :PREFIN AND FACT_NUMERO >= :NUMINI AND FACT_NUMERO <= :NUMFIN
         AND PR.PREF_PRE = F.PREF_PRE AND PR.TIDO_COD = 31 AND ((PR.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
        ORDER BY F.PREF_PRE, FACT_NUMERO
        INTO :ID, :PREF, :NUMERO, :FECHA, :VENCE, :CODBOD, :NOMBOD, :AUTORIZA, :PTVTID, :PTVTNOM,
        :VENDCOD, :VENDNOM, :COMIPORC, :COMIMONTO, :NIT, :NOMTERCERO, :PEDIDO, :COTIZACI, :REMISION,
        :DTOPOR, :DTOMONTO, :ADICIONAL, :IVAMONTO, :RTFTEPOR, :RTFTEMONTO, :RTIVAPOR, :RTIVAMONTO,
        :RTICAPOR, :RTICAMONTO, :RTCREE, :RTCREEM, :EXTRA, :DTOFPOR, :DTOFMONTO, :DTOFFECHA, :TOTAL, :ANULADO, :VEHICULO,
        :OBS, :sucursal
        DO
        BEGIN
        if (CEROSIZQ = 'NO') then
            NUMERO = CAST(CAST(NUMERO AS INTEGER) AS VARCHAR(8));
        if ((ANULADOS = 'S') or (ANULADO = 'N')) then
            BEGIN
            if (anulado = 'S') then
                BEGIN
                COMIPORC = 0;
                COMIMONTO = 0;
                DTOPOR = 0;
                DTOMONTO = 0;
                ADICIONAL = 0;
                IVAMONTO = 0;
                RTFTEPOR = 0;
                RTFTEMONTO = 0;
                RTIVAPOR = 0;
                RTIVAMONTO = 0;
                RTICAPOR = 0;
                RTICAMONTO = 0;
                RTCREE = 0;
                RTCREEM = 0;
                EXTRA = 0;
                DTOFPOR = 0;
                DTOFMONTO = 0;
                TOTAL = 0;
                END
            if (DETALLE = 'S') then
                BEGIN
                if (anulado = 'S') then
                    BEGIN
                    ITEM = 0;
                    ARTICULO = '';
                    CODBAR = '';
                    ARTIDES = '';
                    CANT = 0;
                    UNIDAD = '';
                    BODITEM = '';
                    LOTE = '';
                    REFERENCIA = '';
                    PRECIO = 0;
                    DTOPORCIT = 0;
                    DTOMONTOIT = 0;
                    IVAPORCIT = 0;
                    IVAMONTOIT = 0;
                    CONSUMOIT = 0;
                    SUBTOTALIT = 0;
                    SUSPEND;
                    END
                ELSE
                    BEGIN
                    FOR SELECT FADE_ITEM, ARTI_COD, FADE_CODBAR, SUBSTRING(FADE_DESC FROM 1 FOR 60), FADE_CANT, FADE_UNIDAD, BODE_COD, FADE_LOTE, FADE_REFERENCIA, FADE_PRUNIT, FADE_DTOPORC, FADE_DTOMONTO, FADE_IVAPORC, FADE_IVAMONTO, FADE_CONSUMO, FADE_TOTAL
                        FROM FACTURAS_DETALLE
                        WHERE FACT_ID = :ID and substring(arti_cod from 1 FOR 2) <> '.t'
                        ORDER BY FADE_ITEM
                        INTO :ITEM, :ARTICULO, :CODBAR, :ARTIDES, :CANT, :UNIDAD, :BODITEM, :LOTE, :REFERENCIA, :PRECIO, :DTOPORCIT, :DTOMONTOIT, :IVAPORCIT, :IVAMONTOIT, :CONSUMOIT, :SUBTOTALIT
                        DO
                        SUSPEND;
                    END
                END
            ELSE
                SUSPEND;
            END
        END
    END
  if (BIN_AND(TIPO, 2) <> 0) then
    BEGIN
    RTCREE = 0;
    RTCREEM = 0;
    SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 32 INTO :NOMTIPO;
    /* REMISION */
    FOR SELECT REVT_ID, R.PREF_PRE, REVT_NUMERO, REVT_FECHA, REVT_FECHA, R.BODE_COD, B.BODE_NOM, '', R.PTVT_ID, PTVT_NOM, R.VEND_COD, VEND_NOMBRE, 0, 0, R.TERC_NIT, REVT_NOMTERC, '', '', '', 0, 0, 0, REVT_IVAMONTO, 0, 0, 0, 0, 0, 0, 0, 0, 0, REVT_FECHA, REVT_TOTAL, REVT_ANULADO, SUBSTRING(REVT_OBS FROM 1 FOR 255), REVT_SUCURSAL
        FROM REMISIONES_VENTA R, BODEGA B, PUNTO_VENTA P, VENDEDORES V, PREFIJOS PR WHERE R.PTVT_ID >= :PTOINI AND R.PTVT_ID <= :PTOFIN AND
         R.BODE_COD = B.BODE_COD AND R.PTVT_ID = P.PTVT_ID AND R.VEND_COD = V.VEND_COD AND R.PREF_PRE >= :PREINI AND R.PREF_PRE <= :PREFIN AND REVT_NUMERO >= :NUMINI AND REVT_NUMERO <= :NUMFIN
         AND PR.PREF_PRE = R.PREF_PRE AND PR.TIDO_COD = 32 AND ((PR.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
        ORDER BY R.PREF_PRE, REVT_NUMERO
        INTO :ID, :PREF, :NUMERO, :FECHA, :VENCE, :CODBOD, :NOMBOD, :AUTORIZA, :PTVTID, :PTVTNOM, :VENDCOD, :VENDNOM, :COMIPORC, :COMIMONTO, :NIT, :NOMTERCERO, :PEDIDO, :COTIZACI, :REMISION, :DTOPOR, :DTOMONTO, :ADICIONAL, :IVAMONTO, :RTFTEPOR, :RTFTEMONTO, :RTIVAPOR, :RTIVAMONTO, :RTICAPOR, :RTICAMONTO, :EXTRA, :DTOFPOR, :DTOFMONTO, :DTOFFECHA, :TOTAL, :ANULADO, :OBS, :sucursal
        DO
        BEGIN
        if (CEROSIZQ = 'NO') then
            NUMERO = CAST(CAST(NUMERO AS INTEGER) AS VARCHAR(8));
        if ((ANULADOS = 'S') or (ANULADO = 'N')) then
            BEGIN
            if (anulado = 'S') then
                BEGIN
                COMIPORC = 0;
                COMIMONTO = 0;
                DTOPOR = 0;
                DTOMONTO = 0;
                ADICIONAL = 0;
                IVAMONTO = 0;
                RTFTEPOR = 0;
                RTFTEMONTO = 0;
                RTIVAPOR = 0;
                RTIVAMONTO = 0;
                RTICAPOR = 0;
                RTICAMONTO = 0;
                EXTRA = 0;
                DTOFPOR = 0;
                DTOFMONTO = 0;
                TOTAL = 0;
                END
            if (DETALLE = 'S') then
                BEGIN
                if (anulado = 'S') then
                    BEGIN
                    ITEM = 0;
                    ARTICULO = '';
                    CODBAR = '';
                    ARTIDES = '';
                    CANT = 0;
                    UNIDAD = '';
                    BODITEM = '';
                    LOTE = '';
                    REFERENCIA = '';
                    PRECIO = 0;
                    DTOPORCIT = 0;
                    DTOMONTOIT = 0;
                    IVAPORCIT = 0;
                    IVAMONTOIT = 0;
                    CONSUMOIT = 0;
                    SUBTOTALIT = 0;
                    SUSPEND;
                    END
                ELSE
                    BEGIN
                    FOR SELECT RVDE_ITEM, ARTI_COD, RVDE_CODBAR, SUBSTRING(RVDE_DESC FROM 1 FOR 60), RVDE_CANT, RVDE_UNIDAD, BODE_COD, RVDE_LOTE, RVDE_REFERENCIA, RVDE_PRUNIT, RVDE_DTOPORC, RVDE_DTOMONTO, RVDE_IVAPORC, RVDE_IVAMONTO, RVDE_CONSUMO, RVDE_TOTAL
                        FROM REMISIONES_VENTA_DETALLE
                        WHERE REVT_ID = :ID
                        ORDER BY RVDE_ITEM
                        INTO :ITEM, :ARTICULO, :CODBAR, :ARTIDES, :CANT, :UNIDAD, :BODITEM, :LOTE, :REFERENCIA, :PRECIO, :DTOPORCIT, :DTOMONTOIT, :IVAPORCIT, :IVAMONTOIT, :CONSUMOIT, :SUBTOTALIT
                        DO
                        SUSPEND;
                    END
                END
            ELSE
                SUSPEND;
            END
        END
    END
  if (BIN_AND(TIPO, 4) <> 0) then
    BEGIN
    SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 33 INTO :NOMTIPO;
    /* DEVOLUCIONES */
    FOR SELECT DEVT_ID, D.PREF_PRE, DEVT_NUMERO, DEVT_FECHA, DEVT_FECHA, D.BODE_COD, B.BODE_NOM, '', D.PTVT_ID, PTVT_NOM,
        D.VEND_COD, VEND_NOMBRE, DEVT_COMIPORC, DEVT_COMIMONTO, D.TERC_NIT, DEVT_NOMTERC, '', '', '', DEVT_DTOPOR, DEVT_DTOMONTO,
        DEVT_ADICIONAL, DEVT_IVAMONTO, DEVT_RTFTEPORC, DEVT_RTFTEMONTO, DEVT_RTIVAPORC, DEVT_RTIVAMONTO, DEVT_RTICAPORC, DEVT_RTICAMONTO,
        DEVT_RTCREE, DEVT_RTCREEM, DEVT_EXTRA, 0, 0, DEVT_FECHA, DEVT_TOTAL, DEVT_ANULADO, SUBSTRING(DEVT_OBS FROM 1 FOR 255), DEVT_SUCURSAL
        FROM DEVOLUCIONES_VENTAS D, BODEGA B, PUNTO_VENTA P, VENDEDORES V, PREFIJOS PR WHERE D.PTVT_ID >= :PTOINI AND D.PTVT_ID <= :PTOFIN AND
         D.BODE_COD = B.BODE_COD AND D.PTVT_ID = P.PTVT_ID AND D.VEND_COD = V.VEND_COD AND D.PREF_PRE >= :PREINI AND D.PREF_PRE <= :PREFIN AND DEVT_NUMERO >= :NUMINI AND DEVT_NUMERO <= :NUMFIN
         AND PR.PREF_PRE = D.PREF_PRE AND PR.TIDO_COD = 33 AND ((PR.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
        ORDER BY D.PREF_PRE, DEVT_NUMERO
        INTO :ID, :PREF, :NUMERO, :FECHA, :VENCE, :CODBOD, :NOMBOD, :AUTORIZA, :PTVTID, :PTVTNOM,
        :VENDCOD, :VENDNOM, :COMIPORC, :COMIMONTO, :NIT, :NOMTERCERO, :PEDIDO, :COTIZACI, :REMISION, :DTOPOR, :DTOMONTO,
        :ADICIONAL, :IVAMONTO, :RTFTEPOR, :RTFTEMONTO, :RTIVAPOR, :RTIVAMONTO, :RTICAPOR, :RTICAMONTO,
        :RTCREE, :RTCREEM, :EXTRA, :DTOFPOR, :DTOFMONTO, :DTOFFECHA, :TOTAL, :ANULADO, :OBS, :sucursal
        DO
        BEGIN
        if (CEROSIZQ = 'NO') then
            NUMERO = CAST(CAST(NUMERO AS INTEGER) AS VARCHAR(8));
        if ((ANULADOS = 'S') or (ANULADO = 'N')) then
            BEGIN
            if (anulado = 'S') then
                BEGIN
                COMIPORC = 0;
                COMIMONTO = 0;
                DTOPOR = 0;
                DTOMONTO = 0;
                ADICIONAL = 0;
                IVAMONTO = 0;
                RTFTEPOR = 0;
                RTFTEMONTO = 0;
                RTIVAPOR = 0;
                RTIVAMONTO = 0;
                RTICAPOR = 0;
                RTICAMONTO = 0;
                RTCREE = 0;
                RTCREEM = 0;
                EXTRA = 0;
                DTOFPOR = 0;
                DTOFMONTO = 0;
                TOTAL = 0;
                END
            if (DETALLE = 'S') then
                BEGIN
                if (anulado = 'S') then
                    BEGIN
                    ITEM = 0;
                    ARTICULO = '';
                    CODBAR = '';
                    ARTIDES = '';
                    CANT = 0;
                    UNIDAD = '';
                    BODITEM = '';
                    LOTE = '';
                    REFERENCIA = '';
                    PRECIO = 0;
                    DTOPORCIT = 0;
                    DTOMONTOIT = 0;
                    IVAPORCIT = 0;
                    IVAMONTOIT = 0;
                    CONSUMOIT = 0;
                    SUBTOTALIT = 0;
                    SUSPEND;
                    END
                ELSE
                    BEGIN
                    FOR SELECT DVDE_ITEM, ARTI_COD, DVDE_CODBAR, SUBSTRING(DVDE_DESC FROM 1 FOR 60), DVDE_CANT, DVDE_UNIDAD, BODE_COD, DVDE_LOTE, DVDE_REFERENCIA, DVDE_PRUNIT, DVDE_DTOPORC, DVDE_DTOMONTO, DVDE_IVAPORC, DVDE_IVAMONTO, DVDE_CONSUMO, DVDE_TOTAL
                        FROM DEVOLUCIONES_VENTAS_DETALLE
                        WHERE DEVT_ID = :ID and substring(arti_cod from 1 FOR 2) <> '.t'
                        ORDER BY DVDE_ITEM
                        INTO :ITEM, :ARTICULO, :CODBAR, :ARTIDES, :CANT, :UNIDAD, :BODITEM, :LOTE, :REFERENCIA, :PRECIO, :DTOPORCIT, :DTOMONTOIT, :IVAPORCIT, :IVAMONTOIT, :CONSUMOIT, :SUBTOTALIT
                        DO
                        SUSPEND;
                    END
                END
            ELSE
                SUSPEND;
            END
        END
    END
  if (BIN_AND(TIPO, 8) <> 0) then
    BEGIN
    RTCREE = 0;
    RTCREEM = 0;
    SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 34 INTO :NOMTIPO;
    /* PEDIDO */
    FOR SELECT PEDI_ID, P.PREF_PRE, PEDI_NUMERO, PEDI_FECHA, PEDI_FECHA, '', '', '', P.PTVT_ID, PTVT_NOM, P.VEND_COD, VEND_NOMBRE, 0, 0, P.TERC_NIT, PEDI_NOMTERC, PEDI_ORDENC, PEDI_COTIZACI, '', PEDI_DTOPOR, PEDI_DTOMONTO, PEDI_ADICIONAL, PEDI_IVAMONTO, 0, 0, 0, 0, 0, 0, PEDI_EXTRA, 0, 0, PEDI_FECHA, PEDI_TOTAL, PEDI_ANULADO, SUBSTRING(PEDI_OBS FROM 1 FOR 255), PEDI_SUCURSAL
        FROM PEDIDOS P, PUNTO_VENTA PT, VENDEDORES V, PREFIJOS PR WHERE P.PTVT_ID >= :PTOINI AND P.PTVT_ID <= :PTOFIN AND
         P.PTVT_ID = PT.PTVT_ID AND P.VEND_COD = V.VEND_COD AND P.PREF_PRE >= :PREINI AND P.PREF_PRE <= :PREFIN AND PEDI_NUMERO >= :NUMINI AND PEDI_NUMERO <= :NUMFIN
         AND PR.PREF_PRE = P.PREF_PRE AND PR.TIDO_COD = 34 AND ((PR.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
        ORDER BY P.PREF_PRE, PEDI_NUMERO
        INTO :ID, :PREF, :NUMERO, :FECHA, :VENCE, :CODBOD, :NOMBOD, :AUTORIZA, :PTVTID, :PTVTNOM, :VENDCOD, :VENDNOM, :COMIPORC, :COMIMONTO, :NIT, :NOMTERCERO, :PEDIDO, :COTIZACI, :REMISION, :DTOPOR, :DTOMONTO, :ADICIONAL, :IVAMONTO, :RTFTEPOR, :RTFTEMONTO, :RTIVAPOR, :RTIVAMONTO, :RTICAPOR, :RTICAMONTO, :EXTRA, :DTOFPOR, :DTOFMONTO, :DTOFFECHA, :TOTAL, :ANULADO, :OBS, :sucursal
        DO
        BEGIN
        if (CEROSIZQ = 'NO') then
            NUMERO = CAST(CAST(NUMERO AS INTEGER) AS VARCHAR(8));
        if ((ANULADOS = 'S') or (ANULADO = 'N')) then
            BEGIN
            if (anulado = 'S') then
                BEGIN
                COMIPORC = 0;
                COMIMONTO = 0;
                DTOPOR = 0;
                DTOMONTO = 0;
                ADICIONAL = 0;
                IVAMONTO = 0;
                RTFTEPOR = 0;
                RTFTEMONTO = 0;
                RTIVAPOR = 0;
                RTIVAMONTO = 0;
                RTICAPOR = 0;
                RTICAMONTO = 0;
                EXTRA = 0;
                DTOFPOR = 0;
                DTOFMONTO = 0;
                TOTAL = 0;
                END
            if (DETALLE = 'S') then
                BEGIN
                if (anulado = 'S') then
                    BEGIN
                    ITEM = 0;
                    ARTICULO = '';
                    CODBAR = '';
                    ARTIDES = '';
                    CANT = 0;
                    UNIDAD = '';
                    BODITEM = '';
                    LOTE = '';
                    REFERENCIA = '';
                    PRECIO = 0;
                    DTOPORCIT = 0;
                    DTOMONTOIT = 0;
                    IVAPORCIT = 0;
                    IVAMONTOIT = 0;
                    CONSUMOIT = 0;
                    SUBTOTALIT = 0;
                    SUSPEND;
                    END
                ELSE
                    BEGIN
                    FOR SELECT PEDE_ITEM, ARTI_COD, PEDE_CODBAR, SUBSTRING(PEDE_DESC FROM 1 FOR 60), PEDE_CANT, PEDE_UNIDAD, '', '', PEDE_REFERENCIA, PEDE_PRUNIT, PEDE_DTOPORC, PEDE_DTOMONTO, PEDE_IVAPORC, PEDE_IVAMONTO, PEDE_CONSUMO, PEDE_TOTAL
                        FROM PEDIDOS_DETALLE
                        WHERE PEDI_ID = :ID
                        ORDER BY PEDE_ITEM
                        INTO :ITEM, :ARTICULO, :CODBAR, :artides, :CANT, :UNIDAD, :BODITEM, :LOTE, :REFERENCIA, :PRECIO, :DTOPORCIT, :DTOMONTOIT, :IVAPORCIT, :IVAMONTOIT, :CONSUMOIT, :SUBTOTALIT
                        DO
                        SUSPEND;
                    END
                END
            ELSE
                SUSPEND;
            END
        END
    END
  if (BIN_AND(TIPO, 16) <> 0) then
    BEGIN
    RTCREE = 0;
    RTCREEM = 0;
    SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 35 INTO :NOMTIPO;
    FOR SELECT COTI_ID, C.PREF_PRE, COTI_NUMERO, COTI_FECHA, COTI_FECHA, '', '', '', C.PTVT_ID, PTVT_NOM, C.VEND_COD, VEND_NOMBRE, 0, 0, C.TERC_NIT, COTI_NOMTERC, '', '', '', COTI_DTOPORC, COTI_DTOMONTO, COTI_ADICIONAL, COTI_IVAMONTO, 0, 0, 0, 0, 0, 0, COTI_EXTRA, 0, 0, COTI_FECHA, COTI_TOTAL, COTI_ANULADO, SUBSTRING(COTI_OBS FROM 1 FOR 255), COTI_SUCURSAL
        FROM COTIZACIONES C, PUNTO_VENTA P, VENDEDORES V, PREFIJOS PR WHERE C.PTVT_ID >= :PTOINI AND C.PTVT_ID <= :PTOFIN AND
         C.PTVT_ID = P.PTVT_ID AND C.VEND_COD = V.VEND_COD AND C.PREF_PRE >= :PREINI AND C.PREF_PRE <= :PREFIN AND COTI_NUMERO >= :NUMINI AND COTI_NUMERO <= :NUMFIN
         AND PR.PREF_PRE = C.PREF_PRE AND PR.TIDO_COD = 35 AND ((PR.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
        ORDER BY C.PREF_PRE, COTI_NUMERO
        INTO :ID, :PREF, :NUMERO, :FECHA, :VENCE, :CODBOD, :NOMBOD, :AUTORIZA, :PTVTID, :PTVTNOM, :VENDCOD, :VENDNOM, :COMIPORC, :COMIMONTO, :NIT, :NOMTERCERO, :PEDIDO, :COTIZACI, :REMISION, :DTOPOR, :DTOMONTO, :ADICIONAL, :IVAMONTO, :RTFTEPOR, :RTFTEMONTO, :RTIVAPOR, :RTIVAMONTO, :RTICAPOR, :RTICAMONTO, :EXTRA, :DTOFPOR, :DTOFMONTO, :DTOFFECHA, :TOTAL, :ANULADO, :OBS, :sucursal
        DO
        BEGIN
        if (CEROSIZQ = 'NO') then
            NUMERO = CAST(CAST(NUMERO AS INTEGER) AS VARCHAR(8));
        if ((ANULADOS = 'S') or (ANULADO = 'N')) then
            BEGIN
            if (anulado = 'S') then
                BEGIN
                COMIPORC = 0;
                COMIMONTO = 0;
                DTOPOR = 0;
                DTOMONTO = 0;
                ADICIONAL = 0;
                IVAMONTO = 0;
                RTFTEPOR = 0;
                RTFTEMONTO = 0;
                RTIVAPOR = 0;
                RTIVAMONTO = 0;
                RTICAPOR = 0;
                RTICAMONTO = 0;
                EXTRA = 0;
                DTOFPOR = 0;
                DTOFMONTO = 0;
                TOTAL = 0;
                END
            if (DETALLE = 'S') then
                BEGIN
                if (anulado = 'S') then
                    BEGIN
                    ITEM = 0;
                    ARTICULO = '';
                    CODBAR = '';
                    ARTIDES = '';
                    CANT = 0;
                    UNIDAD = '';
                    BODITEM = '';
                    LOTE = '';
                    REFERENCIA = '';
                    PRECIO = 0;
                    DTOPORCIT = 0;
                    DTOMONTOIT = 0;
                    IVAPORCIT = 0;
                    IVAMONTOIT = 0;
                    CONSUMOIT = 0;
                    SUBTOTALIT = 0;
                    SUSPEND;
                    END
                ELSE
                    BEGIN
                    FOR SELECT CTDE_ITEM, ARTI_COD, CTDE_CODBAR, SUBSTRING(CTDE_DESC FROM 1 FOR 60), CTDE_CANT, CTDE_UNIDAD, '', '', CTDE_REFERENCIA, CTDE_PRUNIT, CTDE_DTOPORC, CTDE_DTOMONTO, CTDE_IVAPORC, CTDE_IVAMONTO, CTDE_CONSUMO, CTDE_TOTAL
                        FROM COTIZACIONES_DETALLE
                        WHERE COTI_ID = :ID
                        ORDER BY CTDE_ITEM
                        INTO :ITEM, :ARTICULO, :CODBAR, :ARTIDES, :CANT, :UNIDAD, :BODITEM, :LOTE, :REFERENCIA, :PRECIO, :DTOPORCIT, :DTOMONTOIT, :IVAPORCIT, :IVAMONTOIT, :CONSUMOIT, :SUBTOTALIT
                        DO
                        SUSPEND;
                    END
                END
            ELSE
                SUSPEND;
            END
        END
    END
END
^

SET TERM ; ^

/* 20140403 */
/* DOCUMENTOS POR ACTIVO */

ALTER TABLE ACTIVOS_FIJOS_VALOR
ADD ACFV_OBS EXPLICA;
ALTER TABLE ACTIVOS_FIJOS_VALOR
ADD ACFV_DOCUMENTO BLOB SUB_TYPE 0 SEGMENT SIZE 1024;

CREATE TABLE ACTIVOS_DOCUMENTOS (
    ACFJ_COD      t_cod_articulo NOT NULL,
    ACDO_ITEM     T_ID NOT NULL /* T_ID = INTEGER */,
    ACDO_ARCHIVO  BLOB SUB_TYPE 0 SEGMENT SIZE 80,
    ACDO_NOMBRE   EXPLICA /* EXPLICA = VARCHAR(255) */
);

ALTER TABLE ACTIVOS_DOCUMENTOS ADD CONSTRAINT PK_ACTIVOS_DOCUMENTOS PRIMARY KEY (ACFJ_COD, ACDO_ITEM);

SET TERM ^ ;

CREATE OR ALTER TRIGGER ACTIVOS_DOCUMENTOS_BI FOR ACTIVOS_DOCUMENTOS
ACTIVE BEFORE INSERT POSITION 0
as
begin
select max(acdo_item)+1 from activos_documentos where acfj_cod = new.acfj_cod into new.acdo_item;
if (new.acdo_item is null) then
    new.acdo_item = 1;
end
^

SET TERM ; ^

grant select, delete, insert, update on ACTIVOS_DOCUMENTOS to PUBLIC;
grant select, delete, insert, update on tercero_documentos to PUBLIC;

/* 20140404 */
grant select, delete, insert, update on mediosmag_archivos2014 to public;
grant execute on procedure saldo_articulo_niif to public;

UPDATE CONFIGURACION
SET CONF_PROPIEDAD = 'CUENTA DE AUTORETENCION CREE'
WHERE (CONF_MODULO = 'CARTERA') AND (CONF_CATEGORIA = 'SALDOS') AND (CONF_PROPIEDAD = 'CUENTA DE AUTORETENCION DEL CREE');
COMMIT WORK;

/* 20140405 */
SET TERM ^ ;

CREATE OR ALTER TRIGGER AUDITORIA_BI FOR AUDITORIA
ACTIVE BEFORE INSERT POSITION 0
as
begin
NEW.audi_id = gen_id(id_auditoria, 1);
new.audi_fecha = cast('now' as DATE);
new.audi_hora = cast('now' as TIME);
if (new.audi_usuario is null) then
    new.audi_usuario = USER;
new.audi_envio = 'N';
NEW.audi_ipcliente = rdb$get_context('SYSTEM', 'CLIENT_ADDRESS');
end
^

SET TERM ; ^

SET TERM ^ ;

create or ALTER procedure INFORME_DIARIO_VENTAS_FP (
    FECHA DATE,
    PREFIJO VARCHAR(4),
    PUNTO INTEGER)
returns (
    FORMAP INTEGER,
    NOMFORMA VARCHAR(30),
    CANTIDAD INTEGER,
    TOTAL numeric(18,2))
as
declare variable IDR INTEGER;
declare variable I INTEGER;
declare variable TOTALF NUMERIC(18,2);
declare variable TOTALR NUMERIC(18,2);
declare variable MONTO NUMERIC(18,2);
begin
FOR SELECT FOPA_ID, FOPA_NOM FROM formas_pago INTO :FORMAP, :nomforma
    DO
    BEGIN
    CANTIDAD = 0;
    TOTAL = 0;
    FOR SELECT R.RECA_ID, F.FACT_TOTAL, R.RECA_MONTO FROM FACTURAS F, RECIBOS_CAJA R, RECIBOS_CAJA_DETALLE D
        WHERE FACT_FECHA = :FECHA AND PTVT_ID = :PUNTO AND ((F.PREF_PRE = :PREFIJO) or (:PREFIJO = '')) and FACT_ANULADO = 'N' AND
        R.RECA_ID = D.RECA_ID AND RECA_FECHA = :FECHA AND RECA_ANULADO = 'N' AND D.RCDE_TIPODOC = 31 AND D.RCDE_IDDOC = F.FACT_ID
        INTO :IDR, :TOTALF, :TOTALR
        DO
        BEGIN
        SELECT count(RCPA_ITEM), SUM(RCPA_MONTO) FROM RECIBOS_CAJA_PAGO P
            WHERE RECA_ID = :IDR AND FOPA_ID = :FORMAP INTO :I, :MONTO;
        CANTIDAD = CANTIDAD + I;
        TOTAL = TOTAL + ROUND(MONTO * (TOTALF / TOTALR),2);
        END
    if (TOTAL <> 0) then
        suspend;
    END
end
^

SET TERM ; ^

SET TERM ^ ;

create or ALTER procedure INFORME_DIARIO_VENTAS_TERM (
    FECHA DATE,
    PREFIJO VARCHAR(4),
    PUNTO INTEGER,
    AGRUPA CHAR(1))
returns (
    TERMINAL VARCHAR(20),
    NOMTERM VARCHAR(60),
    CANTIDAD INTEGER,
    BASE numeric(18,2),
    DESCTO numeric(18,2),
    IVAMONTO numeric(18,2),
    TOTAL numeric(18,2))
as
begin
if (AGRUPA = 'I') then
    FOR SELECT MAX(AUDI_IPCLIENTE), COUNT(FACT_ID), SUM(FACT_TOTAL), SUM(FACT_IVAMONTO), SUM(FACT_DTOMONTO)
        FROM FACTURAS F, AUDITORIA A
        WHERE FACT_FECHA = :FECHA AND PTVT_ID = :PUNTO AND ((F.PREF_PRE = :PREFIJO) or (:PREFIJO = '')) and FACT_ANULADO = 'N' AND
        A.TIDO_COD = 31 AND AUDI_IDDOC = F.FACT_ID GROUP BY AUDI_IPCLIENTE
        INTO :TERMINAL, :CANTIDAD, :TOTAL, :IVAMONTO, :DESCTO
        DO
        BEGIN
        SELECT TERM_NOMBRE FROM TERMINALES_NOMBRES WHERE TERM_IP = :TERMINAL INTO :NOMTERM;
        suspend;
        END
if (AGRUPA = 'U') then
    FOR SELECT MAX(AUDI_USUARIO), COUNT(FACT_ID), SUM(FACT_TOTAL), SUM(FACT_IVAMONTO), SUM(FACT_DTOMONTO)
        FROM FACTURAS F, AUDITORIA A
        WHERE FACT_FECHA = :FECHA AND PTVT_ID = :PUNTO AND ((F.PREF_PRE = :PREFIJO) or (:PREFIJO = '')) and FACT_ANULADO = 'N' AND
        A.TIDO_COD = 31 AND AUDI_IDDOC = F.FACT_ID GROUP BY AUDI_USUARIO
        INTO :TERMINAL, :CANTIDAD, :TOTAL, :IVAMONTO, :DESCTO
        DO
        BEGIN
        NOMTERM = TERMINAL;
        suspend;
        END
if (AGRUPA = 'P') then
    FOR SELECT MAX(PTVT_ID), COUNT(FACT_ID), SUM(FACT_TOTAL), SUM(FACT_IVAMONTO), SUM(FACT_DTOMONTO)
        FROM FACTURAS F
        WHERE FACT_FECHA = :FECHA AND PTVT_ID = :PUNTO AND ((F.PREF_PRE = :PREFIJO) or (:PREFIJO = '')) and FACT_ANULADO = 'N'
        GROUP BY PTVT_ID
        INTO :TERMINAL, :CANTIDAD, :TOTAL, :IVAMONTO, :DESCTO
        DO
        BEGIN
        SELECT PTVT_NOM FROM PUNTO_VENTA WHERE PTVT_ID = :TERMINAL INTO :NOMTERM;
        suspend;
        END
end
^

SET TERM ; ^

SET TERM ^ ;

create or ALTER procedure INFORME_DIARIO_VENTAS (
    FECHA DATE,
    PREFIJO VARCHAR(4),
    PUNTO INTEGER,
    AGRUPA CHAR(1))
returns (
    SERVIDOR VARCHAR(60),
    NUMINI VARCHAR(8),
    NUMFIN VARCHAR(8),
    NROFAC INTEGER,
    HORAINI time,
    HORAFIN time,
    BASEFAC numeric(18,2),
    IVAFAC numeric(18,2),
    TOTALFAC numeric(18,2),
    NROITE integer,
    NRODEV integer,
    BASEDEV numeric(18,2),
    IVADEV numeric(18,2),
    TOTALDEV numeric(18,2),
    BASENETO numeric(18,2),
    IVANETO numeric(18,2),
    TOTALNETO numeric(18,2),
    GRUPOFAC VARCHAR(20),
    GRUPONOM VARCHAR(60),
    GRUPOCANTF INTEGER,
    GRUPOBASEF numeric(18,2),
    GRUPODSCTOF numeric(18,2),
    GRUPOIVAP numeric(9,2),
    GRUPOIVAMF numeric(18,2),
    GRUPOTOTF numeric(18,2))
as
declare variable I INTEGER;
declare variable TARIFA INTEGER;
begin
/* LAS VENTAS */
SELECT MIN(FACT_NUMERO), MAX(FACT_NUMERO), COUNT(FACT_NUMERO), SUM(FACT_TOTAL - FACT_IVAMONTO + FACT_DEC2799), SUM(FACT_IVAMONTO), SUM(FACT_TOTAL)
    FROM FACTURAS WHERE FACT_FECHA = :FECHA AND PTVT_ID = :PUNTO AND ((PREF_PRE = :PREFIJO) or (:PREFIJO = '')) and FACT_ANULADO = 'N'
    INTO :NUMINI, :NUMFIN, :NROFAC, :BASENETO, :IVANETO, :TOTALNETO;
SELECT MIN(AUDI_HORA) FROM AUDITORIA WHERE TIDO_COD = 31 AND AUDI_COD = :PREFIJO || :NUMINI AND AUDI_OPER = 'I' INTO :HORAINI;
SELECT MAX(AUDI_HORA) FROM AUDITORIA WHERE TIDO_COD = 31 AND AUDI_COD = :PREFIJO || :NUMFIN AND AUDI_OPER = 'I' INTO :HORAFIN;
SELECT COUNT(FADE_ITEM), SUM(FADE_TOTAL-FADE_IVAMONTO), SUM(FADE_IVAMONTO), SUM(FADE_TOTAL)
    FROM facturas_detalle D, FACTURAS F
    WHERE D.FACT_ID = F.FACT_ID AND FACT_FECHA = :FECHA AND PTVT_ID = :PUNTO AND ((PREF_PRE = :PREFIJO) or (:PREFIJO = '')) and FACT_ANULADO = 'N' and substring(d.arti_cod from 1 FOR 2) <> '.t'
    INTO :nroite, :BASEFAC, :IVAFAC, :TOTALFAC;
if (nrofac is null) then
    nrofac = 0;
if (baseneto is null) then
    baseneto = 0;
if (ivaneto is null) then
    ivaneto = 0;
if (totalneto is null) then
    totalneto = 0;
if (nroite is null) then
    nroite = 0;
if (basefac is null) then
    basefac = 0;
if (ivafac is null) then
    ivafac = 0;
if (totalfac is null) then
    totalfac = 0;

if (AGRUPA = 'T') then
    BEGIN
    /* POR TARIFA DE IVA */
    FOR SELECT TAIV_PORC FROM TARIFA_IVA ORDER BY TAIV_PORC INTO :GRUPOIVAP DO
        BEGIN
        GRUPOFAC = GRUPOIVAP;
        SELECT TAIV_NOMBRE FROM TARIFA_IVA WHERE TAIV_PORC = :GRUPOIVAP INTO GRUPONOM;
        SELECT COUNT(D.fade_item), SUM((FADE_TOTAL-FADE_IVAMONTO)*FACT_FACTOR), SUM(FADE_IVAMONTO*FACT_FACTOR), SUM(FADE_TOTAL*FACT_FACTOR), SUM(FADE_TOTAL*(1-FACT_FACTOR))
            FROM facturas_detalle D, FACTURAS F
            WHERE D.FACT_ID = F.FACT_ID AND FACT_FECHA = :FECHA AND PTVT_ID = :PUNTO AND ((PREF_PRE = :PREFIJO) or (:PREFIJO = ''))
            AND FADE_IVAPORC = :GRUPOIVAP and FACT_ANULADO = 'N'
            INTO :GRUPOCANTF, GRUPOBASEF, :GRUPOIVAMF, :GRUPOTOTF, :GRUPODSCTOF;
        if (grupocantf is null) then
            grupocantf = 0;
        if (grupobasef is null) then
            grupobasef = 0;
        if (grupoivamf is null) then
            grupoivamf = 0;
        if (grupototf is null) then
            grupototf = 0;
        if (grupodsctof is null) then
            grupodsctof = 0;
        SUSPEND;
        END
    END
if (AGRUPA = 'G') then
    BEGIN
    /* POR GRUPO DE INVENTARIO */
    FOR SELECT GRUP_COD, GRUP_NOM FROM grupo ORDER BY GRUP_COD INTO :GRUPOFAC, :GRUPONOM
        DO
        BEGIN
        FOR SELECT COUNT(D.fade_item), SUM((FADE_TOTAL-FADE_IVAMONTO)*FACT_FACTOR), SUM(FADE_IVAMONTO*FACT_FACTOR), SUM(FADE_TOTAL*FACT_FACTOR), SUM(FADE_TOTAL*(1-FACT_FACTOR)), MAX(A.taiv_cod)
            FROM facturas_detalle D, FACTURAS F, ARTICULO A
            WHERE D.FACT_ID = F.FACT_ID AND FACT_FECHA = :FECHA AND PTVT_ID = :PUNTO AND ((PREF_PRE = :PREFIJO) or (:PREFIJO = ''))
            AND FACT_ANULADO = 'N' AND A.arti_cod = D.arti_cod AND A.grup_cod = :GRUPOFAC
            GROUP BY A.taiv_cod
            INTO :GRUPOCANTF, GRUPOBASEF, :GRUPOIVAMF, :GRUPOTOTF, :GRUPODSCTOF, :TARIFA
            DO
            BEGIN
            if (grupocantf is null) then
                grupocantf = 0;
            if (grupobasef is null) then
                grupobasef = 0;
            if (grupoivamf is null) then
                grupoivamf = 0;
            if (grupototf is null) then
                grupototf = 0;
            if (grupodsctof is null) then
                grupodsctof = 0;
            SELECT TAIV_PORC FROM tarifa_iva WHERE TAIV_COD = :TARIFA INTO :GRUPOIVAP;
            SUSPEND;
            END
        END
    END
if (AGRUPA = 'A') then
    BEGIN
    FOR SELECT COUNT(D.fade_item), SUM((FADE_TOTAL-FADE_IVAMONTO)*FACT_FACTOR), SUM(FADE_IVAMONTO*FACT_FACTOR), SUM(FADE_TOTAL*FACT_FACTOR), SUM(FADE_TOTAL*(1-FACT_FACTOR)), MAX(A.taiv_cod)
        FROM facturas_detalle D, FACTURAS F, ARTICULO A
        WHERE D.FACT_ID = F.FACT_ID AND FACT_FECHA = :FECHA AND PTVT_ID = :PUNTO AND ((PREF_PRE = :PREFIJO) or (:PREFIJO = ''))
        AND FACT_ANULADO = 'N' AND A.arti_cod = D.arti_cod AND A.grup_cod = :GRUPOFAC
        GROUP BY A.arti_cod
        INTO :GRUPOCANTF, GRUPOBASEF, :GRUPOIVAMF, :GRUPOTOTF, :GRUPODSCTOF, :TARIFA
        DO
        BEGIN
        if (grupocantf is null) then
            grupocantf = 0;
        if (grupobasef is null) then
            grupobasef = 0;
        if (grupoivamf is null) then
            grupoivamf = 0;
        if (grupototf is null) then
            grupototf = 0;
        if (grupodsctof is null) then
            grupodsctof = 0;
        SELECT TAIV_PORC FROM tarifa_iva WHERE TAIV_COD = :TARIFA INTO :GRUPOIVAP;
        SUSPEND;
        END
    END
end
^

SET TERM ; ^

/* 20140408 */
/* contbilic niif en cuentas por envima del 100,000 y ue 1,000 es insuficiente para la nómina */
SET TERM ^ ;

CREATE OR ALTER procedure CONTABIL_AJUSTE_NIIF (
    IDDOC integer,
    IDINTER integer,
    IDC integer)
returns (
    ERROR integer,
    VER char(1))
AS
declare variable PREFIJO VARCHAR(4);
declare variable CONCEPTO CHAR(60);
declare variable BASE CHAR(1);
declare variable IVAV CHAR(1);
declare variable CONSUMO CHAR(1);
declare variable TOTAL CHAR(1);
declare variable CTABASE VARCHAR(20);
declare variable CTAIVA VARCHAR(20);
declare variable CTACONSUMO VARCHAR(20);
declare variable CTACIERRE VARCHAR(20);
declare variable EXISTE CHAR(1);
declare variable CUENTA VARCHAR(20);
declare variable MONTO NUMERIC(18,2);
declare variable ES_TERCERO CHAR(1);
declare variable ES_CENTRO CHAR(1);
declare variable TIPOCUEN CHAR(1);
declare variable NIT VARCHAR(20);
declare variable NITDET VARCHAR(20);
declare variable PROY VARCHAR(4);
declare variable CENTRO VARCHAR(4);
declare variable DEBITO NUMERIC(18,2);
declare variable CREDITO NUMERIC(18,2);
declare variable NUMITEMS INTEGER;
declare variable ARTICULO VARCHAR(15);
declare variable SUMA NUMERIC(18,2);
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 ANULADO CHAR(1);
declare variable CENT CHAR(1);
declare variable NOAJUSTAR CHAR(1);
BEGIN
  /* BUSQUE LA INTERFACE */
  EXISTE = 'N';
  SELECT 'S', PREF_PRE, N.ININ_BASE, N.ININ_IVAV, N.ININ_CONSUMO, N.ININ_TOTAL, N.ININ_CTABASE, N.ININ_CTAIVA, N.ININ_CTACONSUMO, N.ININ_CTACIERRE, ININ_CONFIRMAR, ININ_CENTRO
    FROM INTERFAZ_INVENTARIO I, interfaz_inventario_niif N
    WHERE I.ININ_ID = :IDINTER AND I.inin_id = N.inin_id
    INTO :EXISTE, :PREFIJO, :BASE, :IVAV, :CONSUMO, :TOTAL, :CTABASE, :CTAIVA, :CTACONSUMO, :CTACIERRE, :VER, :CENT;

  if (EXISTE = 'S') then
    BEGIN
    EXECUTE PROCEDURE LEE_CONFIGURACION('CONTABILIDAD', 'GENERAL', 'NIT COMPAÑIA') RETURNING_VALUES (:NIT);
    /* TRAIGA EL ENCABEZADO DEL AJUSTE */
    SELECT PREF_PRE, AJUS_CONC, AJUS_ANULADO, AJUS_NOAJUSTAR
        FROM AJUSTES
        WHERE AJUS_ID = :IDDOC
        INTO :PREFIJO, :CONCEPTO, :ANULADO, :NOAJUSTAR;
    if ((ANULADO = 'N') AND (noajustar = 'N')) then
        BEGIN
        if (CENT = 'B') then
           SELECT BODE_CENTRO, BODE_PROY FROM BODEGA B, AJUSTES A
              WHERE A.BODE_COD = B.BODE_COD AND A.AJUS_ID = :IDDOC INTO :CENTRO, :PROY;
        ELSE
            SELECT PREF_CENTRO, PREF_PROY FROM PREFIJOS P, AJUSTES A
                WHERE P.PREF_PRE = A.PREF_PRE AND P.TIDO_COD = 14 AND A.AJUS_ID = :IDDOC INTO :CENTRO, :PROY;
        NUMITEMS = 100000;
        SUMA = 0;
        /* PRIMERO LA BASE */
        if (BASE = 'A') then
            BEGIN
            /* SUME LOS AJUSTES POSITIVOS */
            FOR SELECT MAX(COAR_CTAINV), SUM((AJUS_EXNUE-AJUS_EXANT) * AJDE_COSTO)
                FROM ARTICULO A, CONTABIL_ARTICULO_NIIF C, AJUSTES_DETALLE E
                WHERE E.AJUS_ID = :IDDOC AND E.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND AJUS_EXNUE > AJUS_EXANT
                GROUP BY COAR_CTAINV
                INTO :CTABASE, :MONTO
                DO
                BEGIN
                if (MONTO <> 0) then
                    BEGIN
                    /* TRAIGA LAS CARACTERISTICAS DE LA CUENTA */
                    SELECT CUEN_COD, CUEN_TERCERO, CUEN_CENTRO, CUEN_TIPO
                        FROM CUENTAS_NIIF
                        WHERE CUEN_COD = :CTABASE
                        INTO :CUENTA, :ES_TERCERO, :ES_CENTRO, :TIPOCUEN;
                    if (CUENTA IS NULL) then
                        begin
                        EXECUTE PROCEDURE ERRORINT (1014, :IDDOC, :CTABASE, 2);
                        CUENTA = CTABASE;
                        ERROR = ERROR + 1;
                        end
                    /* DEFINA EL TERCERO */
                    NITDET = NIT;
                    /* DEPENDE DEL TIPO DE CUENTA */
                    if ((TIPOCUEN = 'I') or (TIPOCUEN = 'A')) then
                        BEGIN
                        /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                        FOR SELECT E.ARTI_COD, ((AJUS_EXNUE-AJUS_EXANT) * AJDE_COSTO)
                            FROM ARTICULO A, CONTABIL_ARTICULO_NIIF C, AJUSTES_DETALLE E
                            WHERE E.AJUS_ID = :IDDOC AND E.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND COAR_CTAINV = :CUENTA AND AJUS_EXNUE > AJUS_EXANT
                            INTO :ARTICULO, :MONTO
                            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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                                VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :MONTO, 0, 0, 0, :NITDET, :PROY, :CENTRO, NULL, NULL, NULL, :ARTICULO, 0, 0);
                            NUMITEMS = NUMITEMS + 1;
                            SUMA = SUMA + MONTO;
                            END
                        END
                    if (TIPOCUEN = 'C') then
                        BEGIN
                        EXECUTE PROCEDURE ERRORINT (1014, :IDDOC, :CUENTA, 4);
                        TIPOCUEN = 'N';
                        ERROR = ERROR + 1;
                        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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :MONTO, 0, 0, 0, :NITDET, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                        NUMITEMS = NUMITEMS + 1;
                        SUMA = SUMA + MONTO;
                        END
                    END
                END /* FOR */
            /* LOS AJUSTES NEGATIVOS */
            FOR SELECT MAX(COAR_CTAINV), SUM((AJUS_EXANT-AJUS_EXNUE) * AJDE_COSTO)
                FROM ARTICULO A, CONTABIL_ARTICULO_NIIF C, AJUSTES_DETALLE E
                WHERE E.AJUS_ID = :IDDOC AND E.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND AJUS_EXNUE < AJUS_EXANT
                GROUP BY COAR_CTAINV
                INTO :CTABASE, :MONTO
                DO
                BEGIN
                if (MONTO <> 0) then
                    BEGIN
                    /* TRAIGA LAS CARACTERISTICAS DE LA CUENTA */
                    SELECT CUEN_COD, CUEN_TERCERO, CUEN_CENTRO, CUEN_TIPO
                        FROM CUENTAS_NIIF
                        WHERE CUEN_COD = :CTABASE
                        INTO :CUENTA, :ES_TERCERO, :ES_CENTRO, :TIPOCUEN;
                    if (CUENTA IS NULL) then
                        begin
                        EXECUTE PROCEDURE ERRORINT (1014, :IDDOC, :CTABASE, 2);
                        CUENTA = CTABASE;
                        ERROR = ERROR + 1;
                        end
                    /* DEFINA EL TERCERO */
                    NITDET = NIT;
                    /* DEPENDE DEL TIPO DE CUENTA */
                    if ((TIPOCUEN = 'I') or (TIPOCUEN = 'A')) then
                        BEGIN
                        /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                        FOR SELECT E.ARTI_COD, ((AJUS_EXANT-AJUS_EXNUE) * AJDE_COSTO)
                            FROM ARTICULO A, CONTABIL_ARTICULO_NIIF C, AJUSTES_DETALLE E
                            WHERE E.AJUS_ID = :IDDOC AND E.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND COAR_CTAINV = :CUENTA AND AJUS_EXNUE < AJUS_EXANT
                            INTO :ARTICULO, :MONTO
                            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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                                VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :MONTO, 0, 0, :NITDET, :PROY, :CENTRO, NULL, NULL, NULL, :ARTICULO, 0, 0);
                            NUMITEMS = NUMITEMS + 1;
                            SUMA = SUMA - MONTO;
                            END
                        END
                    if (TIPOCUEN = 'C') then
                        BEGIN
                        EXECUTE PROCEDURE ERRORINT (1014, :IDDOC, :CUENTA, 4);
                        TIPOCUEN = 'N';
                        ERROR = ERROR + 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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :MONTO, 0, 0, :NITDET, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                        NUMITEMS = NUMITEMS + 1;
                        SUMA = SUMA - MONTO;
                        END
                    END
                END /* FOR */
            END /* BASE */
        if (BASE = 'K') then
            BEGIN
            CUENTA = :ctabase;
            /* SUME LAS BASES DE LOS ARTICULOS DEL DOCUMENTO */
            SELECT SUM((AJUS_EXNUE-AJUS_EXANT) * AJDE_COSTO) FROM AJUSTES_DETALLE E
                WHERE E.AJUS_ID = :IDDOC AND AJUS_EXNUE > AJUS_EXANT INTO :MONTO;
        
            if (MONTO <> 0) then
                BEGIN
                /* TRAIGA LAS CARACTERISTICAS DE LA CUENTA */
                SELECT CUEN_COD, CUEN_TERCERO, CUEN_CENTRO, CUEN_TIPO
                    FROM CUENTAS_NIIF
                    WHERE CUEN_COD = :CTABASE
                    INTO :CUENTA, :ES_TERCERO, :ES_CENTRO, :TIPOCUEN;
                if (CUENTA IS NULL) then
                    begin
                    EXECUTE PROCEDURE ERRORINT (1014, :IDDOC, :CTABASE, 2);
                    CUENTA = CTABASE;
                    ERROR = ERROR + 1;
                    end
                /* DEFINA EL TERCERO */
                NITDET = NIT;
                /* DEPENDE DEL TIPO DE CUENTA */
                if ((TIPOCUEN = 'I') or (TIPOCUEN = 'A')) then
                    BEGIN
                    /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                    FOR SELECT E.ARTI_COD, ((AJUS_EXNUE-AJUS_EXANT) * AJDE_COSTO)
                        FROM ARTICULO A, CONTABIL_ARTICULO_NIIF C, AJUSTES_DETALLE E
                        WHERE E.AJUS_ID = :IDDOC AND E.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND COAR_CTAINV = :CUENTA AND AJUS_EXNUE > AJUS_EXANT 
                        INTO :ARTICULO, :MONTO
                        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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :MONTO, 0, 0, 0, :NITDET, :PROY, :CENTRO, NULL, NULL, NULL, :ARTICULO, 0, 0);
                        NUMITEMS = NUMITEMS + 1;
                        SUMA = SUMA + MONTO;
                        END
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    EXECUTE PROCEDURE ERRORINT (1014, :IDDOC, :CUENTA, 4);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :MONTO, 0, 0, 0, :NITDET, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NUMITEMS = NUMITEMS + 1;
                    SUMA = SUMA + MONTO;
                    END
                END
            CUENTA = :ctabase;
            /* SUME LAS BASES DE LOS ARTICULOS DEL DOCUMENTO */
            SELECT SUM((AJUS_EXANT-AJUS_EXNUE) * AJDE_COSTO) FROM AJUSTES_DETALLE E
                WHERE E.AJUS_ID = :IDDOC AND AJUS_EXNUE < AJUS_EXANT INTO :MONTO;
        
            if (MONTO <> 0) then
                BEGIN
                /* TRAIGA LAS CARACTERISTICAS DE LA CUENTA */
                SELECT CUEN_COD, CUEN_TERCERO, CUEN_CENTRO, CUEN_TIPO
                    FROM CUENTAS_NIIF
                    WHERE CUEN_COD = :CTABASE
                    INTO :CUENTA, :ES_TERCERO, :ES_CENTRO, :TIPOCUEN;
                if (CUENTA IS NULL) then
                    begin
                    EXECUTE PROCEDURE ERRORINT (1014, :IDDOC, :CTABASE, 2);
                    CUENTA = CTABASE;
                    ERROR = ERROR + 1;
                    end
                /* DEFINA EL TERCERO */
                NITDET = NIT;
                /* DEPENDE DEL TIPO DE CUENTA */
                if ((TIPOCUEN = 'I') or (TIPOCUEN = 'A')) then
                    BEGIN
                    /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                    FOR SELECT E.ARTI_COD, ((AJUS_EXANT-AJUS_EXNUE) * AJDE_COSTO)
                        FROM ARTICULO A, CONTABIL_ARTICULO_NIIF C, AJUSTES_DETALLE E
                        WHERE E.AJUS_ID = :IDDOC AND E.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND COAR_CTAINV = :CUENTA AND AJUS_EXNUE < AJUS_EXANT
                        INTO :ARTICULO, :MONTO
                        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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :MONTO, 0, 0, :NITDET, :PROY, :CENTRO, NULL, NULL, NULL, :ARTICULO, 0, 0);
                        NUMITEMS = NUMITEMS + 1;
                        SUMA = SUMA - MONTO;
                        END
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    EXECUTE PROCEDURE ERRORINT (1014, :IDDOC, :CUENTA, 4);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :MONTO, 0, 0, :NITDET, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NUMITEMS = NUMITEMS + 1;
                    SUMA = SUMA - MONTO;
                    END
                END
            END /* BASE K O T */
        /* recorra las cuentas adicionales */
        FOR SELECT INIC_CUENTA, INIC_BASE, INIC_PORC, INIC_VALOR, INIC_DB
            FROM INTERFAZ_INVENTARIO_CTAS
            WHERE ININ_ID = :IDINTER
            INTO :CUENTAADIC, :BASEADIC, :PORCADIC, :VALORADIC, :DBADIC
            DO
            BEGIN
            if (VALORADIC <> 0) then
                MONTO = VALORADIC;
            ELSE
                BEGIN
                if ((:BASEADIC = 'SUBTOTAL') or (:BASEADIC = 'TOTAL')) then
                    SELECT SUM((AJUS_EXNUE-AJUS_EXANT) * AJDE_COSTO) FROM
                        AJUSTES_DETALLE WHERE AJUS_ID = :iddoc INTO :VALORADIC;
                MONTO = ABS(VALORADIC * PORCADIC / 100);
                END
            if (monto <> 0) then
                begin
                /* TRAIGA LAS CARACTERISTICAS DE LA CUENTA */
                CUENTA = NULL;
                SELECT CUEN_COD, CUEN_TERCERO, CUEN_CENTRO, CUEN_TIPO
                    FROM CUENTAS_NIIF
                    WHERE CUEN_COD = :CUENTAADIC
                    INTO :CUENTA, :ES_TERCERO, :ES_CENTRO, :TIPOCUEN;
                if (CUENTA IS NULL) then
                    begin
                    EXECUTE PROCEDURE ERRORINT (1014, :IDDOC, :CUENTAADIC, 2);
                    CUENTA = CUENTAADIC;
                    ERROR = ERROR + 1;
                    end
                /* DEFINA EL TERCERO */
                NITDET = NIT;
                /* DEPENDE DEL TIPO DE CUENTA */
                if (TIPOCUEN = 'I') then
                    BEGIN
                    EXECUTE PROCEDURE ERRORINT (1014, :IDDOC, :CUENTA, 3);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    EXECUTE PROCEDURE ERRORINT (1014, :IDDOC, :CUENTA, 4);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NUMITEMS, :CUENTAADIC, :CONCEPTO, '', :MONTO, 0, :VALORADIC, :PORCADIC, :NITDET, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                        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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NUMITEMS, :CUENTAADIC, :CONCEPTO, '', 0, :MONTO, :VALORADIC, :PORCADIC, :NITDET, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                        SUMA = SUMA - MONTO;
                        END
                    NUMITEMS = NUMITEMS + 1;
                    END
                end
            END
        /* CIERRE EL COMPROBANTE CONTRA LA CUENTA DEL TERCERO O LA CONSTANTE */
        if (SUMA <> 0) then
            BEGIN
            if (SUMA > 0) then
                BEGIN
                DEBITO = 0;
                CREDITO = SUMA;
                END
            ELSE
                BEGIN
                DEBITO = SUMA * -1;
                CREDITO = 0;
                END
            /* TRAIGA LAS CARACTERISTICAS DE LA CUENTA */
            SELECT CUEN_COD, CUEN_TERCERO, CUEN_CENTRO, CUEN_TIPO
                FROM CUENTAS_NIIF
                WHERE CUEN_COD = :CTACIERRE
                INTO :CUENTA, :ES_TERCERO, :ES_CENTRO, :TIPOCUEN;
            if (CUENTA IS NULL) then
                begin
                EXECUTE PROCEDURE ERRORINT (1014, :IDDOC, :CTACIERRE, 2);
                CUENTA = CTACIERRE;
                ERROR = ERROR + 1;
                end
            /* DEFINA EL TERCERO */
            NITDET = NIT;
            /* DEPENDE DEL TIPO DE CUENTA */
            if (TIPOCUEN = 'I') then
                BEGIN
                EXECUTE PROCEDURE ERRORINT (1014, :IDDOC, :CUENTA, 3);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                EXECUTE PROCEDURE ERRORINT (1014, :IDDOC, :CUENTA, 4);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                END
            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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :DEBITO, :CREDITO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            END /* SUMA */
        if (ERROR > 0) then
            VER = 'S';
        END /* EXISTE LA INTERFAZ */
      END
  ELSE
    BEGIN
    EXECUTE PROCEDURE ERRORINT (1014, :IDDOC, :PREFIJO, 1);
    ERROR = ERROR + 1;
    VER = 'S';
    END
SUSPEND;
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER procedure CONTABIL_APLICACL_NIIF (
    IDDOC integer,
    IDINTER integer,
    IDC integer)
returns (
    ERRORI integer,
    VER char(1))
AS
declare variable PREF VARCHAR(4);
declare variable NUM VARCHAR(8);
declare variable NUMERO VARCHAR(10);
declare variable NUMDOC VARCHAR(12);
declare variable FECAUX DATE;
declare variable FECHA CHAR(8);
declare variable CONC CHAR(120);
declare variable VENCE CHAR(8);
declare variable VRSUBT NUMERIC(18, 2);
declare variable APLICADO NUMERIC(18, 2);
declare variable BASE CHAR(1);
declare variable CTABASE VARCHAR(20);
declare variable CLIE CHAR(1);
declare variable CTACLIE VARCHAR(20);
declare variable EXISTE CHAR(1);
declare variable CUENTA VARCHAR(20);
declare variable TIPOCUEN CHAR(1);
declare variable NIT VARCHAR(20);
declare variable PROY VARCHAR(4);
declare variable CENTRO VARCHAR(4);
declare variable NROI INTEGER;
declare variable TCTACLIEN VARCHAR(20);
declare variable TCTABASE VARCHAR(20);
declare variable ANULADO CHAR(1);
declare variable TIPODOC INTEGER;
declare variable RETES CHAR(2);
BEGIN
execute procedure lee_configuracion('CARTERA', 'SALDOS', 'DESCONTAR RETENCIONES POR CAUSACION') returning_values (RETES);
/* BUSQUE LA INTERFACE */
EXISTE = 'N';
SELECT 'S', N.INCA_BASE, N.INCA_CLIE, N.INCA_CTABASE, N.INCA_CTACLIE, INCA_CONFIRMAR
    FROM INTERFAZ_CARTERA I, interfaz_cartera_niif N
    WHERE I.INCA_ID = :IDINTER AND I.inca_id = N.inca_id
    INTO :EXISTE, :BASE, :CLIE, :CTABASE, :CTACLIE, :VER;
if (EXISTE = 'S') then
    BEGIN
    /* TRAIGA EL ENCABEZADO DE LA NOTA */
    SELECT PREF_PRE, APCL_NUMERO, APCL_FECHA, N.TERC_NIT, APCL_CONCEPTO, TERC_CTAVENTA,
        TERC_CTACLIENTE, APCL_ANULADO
        FROM aplicacion_cliente N, TERCEROS T
        WHERE N.APCL_ID = :IDDOC AND N.TERC_NIT = T.TERC_NIT
        INTO :PREF, :NUM, :FECAUX, :NIT, :CONC, :TCTABASE, :TCTACLIEN, :ANULADO;

    if (ANULADO = 'N') then
        BEGIN
        SELECT PREF_CENTRO, PREF_PROY FROM PREFIJOS P, aplicacion_cliente N
            WHERE P.PREF_PRE = N.PREF_PRE AND P.TIDO_COD = 43 AND APCL_ID = :IDDOC INTO :CENTRO, :PROY;
        NUMERO = PREF || NUM;
        EXECUTE PROCEDURE FECHA_A_CONTA(:FECAUX) returning_values (:FECHA);
        VENCE = FECHA;
        NROI = 100000;
        ERRORI = 0;
        FOR SELECT ACDE_APLICADO+ACDE_RTFTE+ACDE_RTIVA+ACDE_RTICA, ACDE_PREFIJO || ACDE_NUMERO, ACDE_TIPODOC, ACDE_APLICADO
            FROM aplicacion_cliente_detalle WHERE APCL_ID = :IDDOC
            INTO :vrsubt, :numdoc, :tipodoc, :aplicado
            DO
            BEGIN
            if (RETES = 'SI') then
                vrsubt = aplicado;
            if (VRSUBT < 0) then
                BEGIN
                IF ((BASE = 'C') OR (BASE = 'K')) THEN
                    BEGIN
                    IF (BASE = 'C') THEN
                        CTABASE = TCTABASE;
                    CUENTA = NULL;
                    SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS_NIIF
                        WHERE CUEN_COD = :CTABASE INTO :CUENTA, :TIPOCUEN;
                    if (CUENTA IS NULL) then
                        begin
                        EXECUTE PROCEDURE ERRORINT(43, :IDDOC, :CTABASE, 2);
                        CUENTA = CTABASE;
                        TIPOCUEN = 'N';
                        ERRORI = ERRORI + 1;
                        end
                    if (TIPOCUEN = 'I') then
                        BEGIN
                        EXECUTE PROCEDURE ERRORINT(43, :IDDOC, :CUENTA, 3);
                        TIPOCUEN = 'N';
                        ERRORI = ERRORI + 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)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRSUBT, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, :NUMDOC, :VENCE, NULL, :tipodoc, 43);
                        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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', ABS(:VRSUBT), 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                        NROI = NROI + 1;
                        END
                    END
                END /* SUBT < 0 */
            if ((VRSUBT > 0) and ((CLIE = 'C') or (CLIE = 'K'))) then
                BEGIN
                if (CLIE = 'C') 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(43, :IDDOC, :CTACLIE, 2);
                    CUENTA = CTACLIE;
                    ERRORI = ERRORI + 1;
                    end
                if (TIPOCUEN = 'I') then
                    BEGIN
                    EXECUTE PROCEDURE ERRORINT(43, :IDDOC, :CUENTA, 3);
                    TIPOCUEN = 'N';
                    ERRORI = ERRORI + 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)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :vrsubt, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, :NUMDOC, :VENCE, NULL, :tipodoc, 42);
                    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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :vrsubt, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    END
                end
            END /* for */
        END /* NO ANULADO */
    if (ERRORI > 0) then
        VER = 'S';
    SUSPEND;
    END
ELSE
    BEGIN
    EXECUTE PROCEDURE ERRORINT(43, :IDDOC, :PREF, 1);
    ERRORI = ERRORI + 1;
    VER = 'S';
    SUSPEND;
    END
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER procedure CONTABIL_APLICAPR_NIIF (
    IDDOC integer,
    IDINTER integer,
    IDC integer)
returns (
    ERRORI integer,
    VER char(1))
AS
declare variable PREF VARCHAR(4);
declare variable NUM VARCHAR(8);
declare variable NUMERO VARCHAR(10);
declare variable NUMDOC VARCHAR(10);
declare variable FECAUX DATE;
declare variable FECHA CHAR(8);
declare variable CONC CHAR(120);
declare variable VRSUBT NUMERIC(18, 2);
declare variable BASE CHAR(1);
declare variable CTABASE VARCHAR(20);
declare variable CLIE CHAR(1);
declare variable CTACLIE VARCHAR(20);
declare variable EXISTE CHAR(1);
declare variable CUENTA VARCHAR(20);
declare variable TIPOCUEN CHAR(1);
declare variable NIT VARCHAR(20);
declare variable PROY VARCHAR(4);
declare variable CENTRO VARCHAR(4);
declare variable NROI INTEGER;
declare variable TCTACLIEN VARCHAR(20);
declare variable TCTABASE VARCHAR(20);
declare variable ANULADO CHAR(1);
declare variable TIPODOC INTEGER;
declare variable RETES CHAR(2);
declare variable APLICADO NUMERIC(18,2);
BEGIN
execute procedure lee_configuracion('CXPAGAR', 'SALDOS', 'DESCONTAR RETENCIONES POR CAUSACION') returning_values (RETES);
ERRORI = 0;
/* BUSQUE LA INTERFACE */
EXISTE = 'N';
SELECT 'S', N.INCP_BASE, N.INCP_PROV, N.INCP_CTABASE, 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, :CLIE, :CTABASE, :CTACLIE, :VER;

if (EXISTE = 'S') then
  BEGIN
  /* TRAIGA EL ENCABEZADO DE LA NOTA */
  SELECT PREF_PRE, APPR_NUMERO, APPR_FECHA, N.TERC_NIT, APPR_CONC, TERC_CTAVENTA, TERC_CTACLIENTE,
      APPR_ANULADO
    FROM aplicacion_provedor N, TERCEROS T
    WHERE N.APPR_ID = :IDDOC AND N.TERC_NIT = T.TERC_NIT
    INTO :PREF, :NUM, :FECAUX, :NIT, :CONC, :TCTABASE, TCTACLIEN, ANULADO;
  if (ANULADO = 'N') then
    BEGIN
    SELECT PREF_CENTRO, PREF_PROY FROM PREFIJOS P, aplicacion_provedor N
        WHERE P.PREF_PRE = N.PREF_PRE AND P.TIDO_COD = 53 AND APPR_ID = :IDDOC INTO :CENTRO, :PROY;
    /* SI ES PROVEEDOR, SOBREESCIBE LAS CUENTAS  */
    SELECT PROV_CTAPAGAR, PROV_CTACAUSA
        FROM PROVEEDORES WHERE TERC_NIT = :NIT INTO TCTACLIEN, TCTABASE;
    NUMERO = PREF || NUM;

    EXECUTE PROCEDURE FECHA_A_CONTA(:FECAUX) returning_values (:FECHA);

    NROI = 100000;

    FOR SELECT APPD_APLICADO+APPD_RTFTE+APPD_RTIVA+APPD_RTICA, APPD_PREFIJO || APPD_NUMERO, APPD_TIPODOC, APPD_APLICADO
        FROM aplicacion_proveedor_detalle
        WHERE APPR_ID = :IDDOC
        INTO :vrsubt, :numdoc, :tipodoc, :aplicado
        DO
        BEGIN
        if (RETES = 'SI') then
            vrsubt = aplicado;
        IF ((VRSUBT < 0) AND ((BASE = 'T') OR (BASE = 'K'))) THEN
            BEGIN
            IF (BASE = 'T') THEN
                CTABASE = TCTABASE;
            CUENTA = NULL;
            SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS_NIIF
                WHERE CUEN_COD = :CTABASE INTO :CUENTA, :TIPOCUEN;
            if (CUENTA IS NULL) then
                begin
                EXECUTE PROCEDURE ERRORINT(53, :IDDOC, :CTABASE, 2);
                CUENTA = CTABASE;
                ERRORI = ERRORI + 1;
                end
            if (TIPOCUEN = 'I') then
                BEGIN
                EXECUTE PROCEDURE ERRORINT(53, :IDDOC, :CUENTA, 3);
                TIPOCUEN = 'N';
                ERRORI = ERRORI + 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)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, ABS(:VRSUBT), 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, :numdoc, :FECHA, NULL, :tipodoc, 43);
                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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, ABS(:VRSUBT), 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                END
            END /* MONTO <> 0 */
        if ((VRSUBT > 0) and ((CLIE = 'T') or (CLIE = 'K'))) then
            BEGIN
            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(53, :IDDOC, :CTACLIE, 2);
                CUENTA = CTACLIE;
                ERRORI = ERRORI + 1;
                end
            if (TIPOCUEN = 'I') then
                BEGIN
                EXECUTE PROCEDURE ERRORINT(53, :IDDOC, :CUENTA, 3);
                TIPOCUEN = 'N';
                ERRORI = ERRORI + 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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :vrsubt, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, :numdoc, :FECHA, NULL, :tipodoc, 43);
            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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :vrsubt, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            END /* CARTERA */
        END /* DO */
    END
  if (ERRORI > 0) then
    VER = 'S';
  SUSPEND;
  END /* EXISTE LA INTERFAZ */
ELSE
    BEGIN
    EXECUTE PROCEDURE ERRORINT(53, :IDDOC, :PREF, 1);
    ERRORI = ERRORI + 1;
    VER = 'S';
    SUSPEND;
    END
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER procedure CONTABIL_DESENSAMBLE_NIIF (
    IDDOC integer,
    IDINTER integer,
    IDC integer)
returns (
    ERROR integer,
    VER char(1))
AS
declare variable PREFIJO VARCHAR(4);
declare variable CONCEPTO CHAR(60);
declare variable BASE CHAR(1);
declare variable IVAV CHAR(1);
declare variable CONSUMO CHAR(1);
declare variable TOTAL CHAR(1);
declare variable CTABASE VARCHAR(20);
declare variable CTAIVA VARCHAR(20);
declare variable CTACONSUMO VARCHAR(20);
declare variable CTACIERRE 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 NUMITEMS INTEGER;
declare variable ARTICULO VARCHAR(15);
declare variable IMPTOS NUMERIC(18, 2);
declare variable SUMA NUMERIC(18,2);
declare variable VRBASE NUMERIC(18,2);
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 ANULADO CHAR(1);
declare variable CENT CHAR(1);
BEGIN
  /* BUSQUE LA INTERFACE */
  EXISTE = 'N';
  SELECT 'S', PREF_PRE, N.ININ_BASE, N.ININ_IVAV, N.ININ_CONSUMO, N.ININ_TOTAL, N.ININ_CTABASE, N.ININ_CTAIVA, N.ININ_CTACONSUMO, N.ININ_CTACIERRE, ININ_CONFIRMAR, ININ_CENTRO
    FROM INTERFAZ_INVENTARIO I, interfaz_inventario_niif N
    WHERE I.ININ_ID = :IDINTER AND I.inin_id = N.inin_id
    INTO :EXISTE, :PREFIJO, :BASE, :IVAV, :CONSUMO, :TOTAL, :CTABASE, :CTAIVA, :CTACONSUMO, :CTACIERRE, :VER, :CENT;
  if (EXISTE = 'S') then
    BEGIN
    EXECUTE PROCEDURE LEE_CONFIGURACION('CONTABILIDAD', 'GENERAL', 'NIT COMPAÑIA') RETURNING_VALUES (:NIT);
    /* TRAIGA EL ENCABEZADO DEL ENSAMBLE */
    SELECT PREF_PRE, DESE_CONC, DESE_ANULADO
        FROM DESENSAMBLES
        WHERE DESE_ID = :IDDOC
        INTO :PREFIJO, :CONCEPTO, :ANULADO;
    if (ANULADO = 'N') then
        BEGIN
        if (CENT = 'B') then
            SELECT BODE_CENTRO, BODE_PROY FROM BODEGA B, DESENSAMBLES E
                WHERE B.BODE_COD = E.BODE_COD AND E.DESE_ID = :IDDOC INTO :CENTRO, :PROY;
        ELSE
            SELECT PREF_CENTRO, PREF_PROY FROM PREFIJOS P, DESENSAMBLES E
                WHERE P.PREF_PRE = E.PREF_PRE AND E.DESE_ID = :IDDOC AND P.TIDO_COD = 16 INTO :CENTRO, :PROY;
        NUMITEMS = 100000;
        SUMA = 0;
        ERROR = 0;
        /* PRIMERO EL PRODUCTO */
        if (BASE = 'A') then
            BEGIN
            /* SUME LAS BASES DE LOS ARTICULOS DEL DOCUMENTO */
            FOR SELECT MAX(COAR_CTAINV), SUM(cast(DEDE_CANT as double precision) * DEDE_COSTO), SUM(DEDE_IVAMONTO + DEDE_CONSUMO)
                FROM ARTICULO A, CONTABIL_ARTICULO_NIIF C, DESENSAMBLES_DETALLE D, DESENSAMBLES E
                WHERE E.DESE_ID = :IDDOC AND E.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND E.DESE_ID = D.DESE_ID
                GROUP BY COAR_CTAINV
                INTO :CTABASE, :MONTO, :IMPTOS
            DO
                BEGIN
                VRBASE = MONTO;
                if (MONTO <> 0) then
                    BEGIN
                    /* TRAIGA LAS CARACTERISTICAS DE LA CUENTA */
                    SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS_NIIF
                        WHERE CUEN_COD = :CTABASE INTO :CUENTA, :TIPOCUEN;
                    if (CUENTA IS NULL) then
                        begin
                        EXECUTE PROCEDURE ERRORINT(1016, :IDDOC, :CTABASE, 2);
                        CUENTA = CTABASE;
                        ERROR = ERROR + 1;
                        end
                    if (TIPOCUEN = 'I') then
                        BEGIN
                        SELECT ARTI_COD FROM DESENSAMBLES WHERE DESE_ID = :iddoc INTO :ARTICULO;
                        INSERT INTO CONTABILIZACION_DET (CNTB_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)
                            VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ARTICULO, 0, 0);
                        NUMITEMS = NUMITEMS + 1;
                        SUMA = SUMA - MONTO;
                        END
                    if (TIPOCUEN = 'C') then
                        BEGIN
                        EXECUTE PROCEDURE ERRORINT(1016, :IDDOC, :CUENTA, 4);
                        TIPOCUEN = 'N';
                        ERROR = ERROR + 1;
                        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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                        NUMITEMS = NUMITEMS + 1;
                        SUMA = SUMA - MONTO;
                        END
                    END
                END /* FOR */

            /* LOS COMPONENTES */
            FOR SELECT MAX(COAR_CTAINV), SUM(cast(DEDE_CANT as double precision) * DEDE_COSTO), SUM(DEDE_IVAMONTO + DEDE_CONSUMO)
                FROM ARTICULO A, CONTABIL_ARTICULO_NIIF C, DESENSAMBLES_DETALLE E
                WHERE E.DESE_ID = :IDDOC AND E.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD
                GROUP BY COAR_CTAINV
                INTO :CTABASE, :MONTO, :IMPTOS
            DO
                BEGIN
                VRBASE = MONTO;
                if (MONTO <> 0) then
                    BEGIN
                    /* TRAIGA LAS CARACTERISTICAS DE LA CUENTA */
                   SELECT CUEN_COD,CUEN_TIPO FROM CUENTAS_NIIF
                        WHERE CUEN_COD = :CTABASE INTO :CUENTA, :TIPOCUEN;
                    if (CUENTA IS NULL) then
                        begin
                        EXECUTE PROCEDURE ERRORINT(1016, :IDDOC, :CTABASE, 2);
                        CUENTA = CTABASE;
                        ERROR = ERROR + 1;
                        end
                    if (TIPOCUEN = 'I') then
                        BEGIN
                        /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                        FOR SELECT E.ARTI_COD, (cast(DEDE_CANT as double precision) * DEDE_COSTO), (DEDE_IVAMONTO + DEDE_CONSUMO)
                            FROM ARTICULO A, CONTABIL_ARTICULO_NIIF C, DESENSAMBLES_DETALLE E
                            WHERE E.DESE_ID = :IDDOC AND E.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND COAR_CTAINV = :CUENTA
                            INTO :ARTICULO, :MONTO, :IMPTOS
                        DO
                            BEGIN
                            if (MONTO <> 0) then
                                BEGIN
                                INSERT INTO CONTABILIZACION_DET (CNTB_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)
                                    VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ARTICULO, 0, 0);
                                NUMITEMS = NUMITEMS + 1;
                                SUMA = SUMA + MONTO;
                                END
                            END
                        END
                    if (TIPOCUEN = 'C') then
                        BEGIN
                        EXECUTE PROCEDURE ERRORINT(1016, :IDDOC, :CUENTA, 4);
                        TIPOCUEN = 'N';
                        ERROR = ERROR + 1;
                        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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                        NUMITEMS = NUMITEMS + 1;
                        SUMA = SUMA + MONTO;
                        END
                    END
                END /* FOR */
            END /* BASE */
        if (BASE = 'K') then
            BEGIN
            /* SUME LAS BASES DE LOS ARTICULOS DEL DOCUMENTO */
            SELECT SUM(cast(DEDE_CANT as double precision) * DEDE_COSTO), SUM(DEDE_IVAMONTO + DEDE_CONSUMO)
                FROM DESENSAMBLES_DETALLE E
                WHERE E.DESE_ID = :IDDOC
                INTO :MONTO, :IMPTOS;
            if (MONTO <> 0) then
                BEGIN
                /* TRAIGA LAS CARACTERISTICAS DE LA CUENTA */
                SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS_NIIF
                    WHERE CUEN_COD = :CTABASE INTO :CUENTA, :TIPOCUEN;
                if (CUENTA IS NULL) then
                    begin
                    EXECUTE PROCEDURE ERRORINT(1016, :IDDOC, :CTABASE, 2);
                    CUENTA = CTABASE;
                    ERROR = ERROR + 1;
                    end
                if (TIPOCUEN = 'I') then
                    BEGIN
                    SELECT ARTI_COD FROM DESENSAMBLES WHERE DESE_ID = :IDDOC INTO :ARTICULO;
                    INSERT INTO CONTABILIZACION_DET (CNTB_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)
                        VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ARTICULO, 0, 0);
                    NUMITEMS = NUMITEMS + 1;
                    SUMA = SUMA - MONTO;
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    EXECUTE PROCEDURE ERRORINT(1016, :IDDOC, :CUENTA, 4);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NUMITEMS = NUMITEMS + 1;
                    SUMA = SUMA - MONTO;
                    END
                /* LOS COMPONENTES CON LA CUENTA DE CIERRE */
                SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS_NIIF
                    WHERE CUEN_COD = :ctacierre INTO :CUENTA, :TIPOCUEN;
                if (CUENTA IS NULL) then
                    begin
                    EXECUTE PROCEDURE ERRORINT(1016, :IDDOC, :CTABASE, 2);
                    CUENTA = CTABASE;
                    ERROR = ERROR + 1;
                    end
                if (TIPOCUEN = 'I') then
                    BEGIN
                    SELECT ARTI_COD FROM DESENSAMBLES WHERE DESE_ID = :IDDOC INTO :ARTICULO;
                    INSERT INTO CONTABILIZACION_DET (CNTB_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)
                        VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ARTICULO, 0, 0);
                    NUMITEMS = NUMITEMS + 1;
                    SUMA = SUMA + MONTO;
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    EXECUTE PROCEDURE ERRORINT(1016, :IDDOC, :CUENTA, 4);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NUMITEMS = NUMITEMS + 1;
                    SUMA = SUMA + MONTO;
                    END
                END
            END /* BASE K O T */
        /* recorra las cuentas adicionales */
        FOR SELECT INIC_CUENTA, INIC_BASE, INIC_PORC, INIC_VALOR, INIC_DB
            FROM INTERFAZ_INVENTARIO_CTAS
            WHERE ININ_ID = :IDINTER
            INTO :CUENTAADIC, :BASEADIC, :PORCADIC, :VALORADIC, :DBADIC
            DO
            BEGIN
            if (:BASEADIC = 'SUBTOTAL') then
                VALORADIC = VRBASE;
            if (:BASEADIC = 'TOTAL') then
                VALORADIC = VRBASE;
            MONTO = VALORADIC * PORCADIC;
            if (MONTO <> 0) then
                BEGIN
                /* 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(1016, :IDDOC, :CUENTAADIC, 2);
                    CUENTA = CUENTAADIC;
                    ERROR = ERROR + 1;
                    end
                if (TIPOCUEN = 'I') then
                    BEGIN
                    EXECUTE PROCEDURE ERRORINT(1016, :IDDOC, :CUENTA, 3);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    EXECUTE PROCEDURE ERRORINT(1016, :IDDOC, :CUENTA, 4);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NUMITEMS, :CUENTAADIC, :CONCEPTO, '', :MONTO, 0, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                        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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NUMITEMS, :CUENTAADIC, :CONCEPTO, '', 0, :MONTO, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                        SUMA = SUMA - MONTO;
                        END
                    NUMITEMS = NUMITEMS + 1;
                    END
                END
            END
        END
      if (ERROR > 0) then
        VER = 'S';
      SUSPEND;
      END /* EXISTE LA INTERFAZ */
  ELSE
    BEGIN
    EXECUTE PROCEDURE ERRORINT(1016, :IDDOC, :PREFIJO, 1);
    ERROR = ERROR + 1;
    VER = 'S';
    SUSPEND;
    END
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER procedure CONTABIL_DEVOLCLI_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(10);
declare variable FECAUX DATE;
declare variable FECHA CHAR(8);
declare variable CONC CHAR(120);
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 PRTCREE NUMERIC(9, 2);
declare variable VRRTCREE 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 RTCREE CHAR(1);
declare variable CTARTCREE 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 PROY VARCHAR(4);
declare variable CENTRO VARCHAR(4);
declare variable PROYI VARCHAR(4);
declare variable CENTI 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 TCTARTCREE 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 CENT CHAR(1);
DECLARE VARIABLE MERCANCIA NUMERIC(18,2);
DECLARE VARIABLE INALC NUMERIC(18,2);
declare variable FACTOR DOUBLE PRECISION;
declare variable DIG INTEGER;
DECLARE VARIABLE FOMENTO VARCHAR(2);
DECLARE VARIABLE VRCONSUMO NUMERIC(18,2);
declare variable AUTORET VARCHAR(10);
declare variable FAUTORET DATE;
declare variable AUTORCREE VARCHAR(10);
declare variable FAUTORCREE DATE;
declare variable IDREM INTEGER;
declare variable IDPED INTEGER;
declare variable DTOXIT CHAR(2);
declare variable ERRORC INTEGER;
declare variable ICOING CHAR(2);
declare variable NITCONTA VARCHAR(20);
declare variable CNTNIT CHAR(2);
BEGIN
EXECUTE PROCEDURE LEE_CONFIGURACION('COMPRAS', 'FACTURAS', 'USAR IMPOCONSUMO COMO PORCENTAJE DE FOMENTO') returning_values (FOMENTO);
EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'FECHA AUTORETENEDOR NO DESCONTAR RETENCIONES DEL SALDO PERO SI CONTABILIZARLAS') returning_values (AUTORET);
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('FACTURACION', 'ARTICULOS', 'IMPOCONSUMO COMO MAYOR VALOR DEL COSTO Y DEL INGRESO') returning_values (ICOING);
if (AUTORET <> '') then
    FAUTORET = CAST(AUTORET AS DATE);
else
    FAUTORET = '9999/12/31';
EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'FECHA AUTORETENEDOR DE RETENCION CREE') returning_values (AUTORCREE);
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, :RTCREE,
    :COSTOS, :INVEN, :CTAVENTAS, :CTAIVA, :CTACONSUMO, :CTADTO, :CTAADIC, :CTAEXTRA,
    :CTACARTERA, :CTARTFTE, :CTARTIVA, :CTARTICA, :CTARTCREE, :CTAINVEN, :CTACOSTOS, :VER, :CENT;
  if (EXISTE = 'S') then
   BEGIN
    /* TRAIGA EL ENCABEZADO DE LA DEVOLUCION */
   SELECT PREF_PRE, DEVT_NUMERO, DEVT_FECHA, F.TERC_NIT, PTVT_ID, DEVT_FACTURA, DEVT_DTOMONTO, DEVT_ADICIONAL, DEVT_IVAMONTO, DEVT_EXTRA, DEVT_TOTAL,
        DEVT_RTFTEPORC, DEVT_RTFTEMONTO, DEVT_RTIVAPORC, DEVT_RTIVAMONTO, DEVT_RTICAPORC, DEVT_RTICAMONTO, DEVT_RTCREE, DEVT_RTCREEM,
        TERC_CTARTFTE, TERC_CTARTIVA, TERC_CTARTICA, TERC_CTARCREE, TERC_CTAVENTA, TERC_CTACLIENTE, DEVT_ANULADO, DEVT_REMID, DEVT_PEDID, T.terc_nitconta
        FROM DEVOLUCIONES_VENTAS F, TERCEROS T
        WHERE DEVT_ID = :IDDOC AND F.TERC_NIT = T.TERC_NIT
        INTO :PREF, :NUM, :FECAUX, :NIT, :PTOVTA, :NUMFAC, :VRDTO, :VRADIC, :VRIVA, :VREXTRA, :VRTOTAL,
        :PRTFTE, :VRRTFTE, :PORC, :VRRTIVA, :PRTICA, :VRRTICA, :PRTCREE, :VRRTCREE,
        :TCTARTFTE, TCTARTIVA, TCTARTICA, TCTARTCREE, TCTAVENTA, TCTACLIEN, ANULADO, :IDREM, :IDPED, :nitconta;
  if ((CNTNIT = 'SI') AND (NITCONTA IS NOT NULL)) then
    NIT = NITCONTA;
   if (idrem is null) Then
    IDREM = 0;
   if (idped is null) Then
    IDPED = 0;
   if ((ANULADO = 'N') AND (IDREM = 0) AND (IDPED = 0)) then
    BEGIN
    NUMERO = PREF || NUM;
    SELECT SUM(DVDE_CONSUMO) FROM devoluciones_ventas_detalle WHERE DEVT_ID = :iddoc AND ((DVDE_REFERENCIA <> '.t') or (DVDE_REFERENCIA IS NULL))
        INTO :MERCANCIA;
    SELECT SUM(DVDE_INACM) FROM devoluciones_ventas_detalle WHERE DEVT_ID = :iddoc AND ((DVDE_REFERENCIA <> '.t') or (DVDE_REFERENCIA IS NULL))
        INTO :INALC;
    VRSUBT = VRTOTAL - VREXTRA - VRIVA - MERCANCIA - INALC; /* BASE DE RETEFTE Y RETEICA */
    EXECUTE PROCEDURE lee_configuracion ('FACTURACION', 'DEVOLUCIONES', 'DESCUENTO PIE DEVOLUCION IGUAL A SUMA DE DESCUENTOS POR ITEM') returning_values (:DTOXIT);
    if (DTOXIT = 'SI') then
        VRDTO = 0;
    MERCANCIA = VRSUBT - VRADIC + VRDTO;
    IF (CENT = 'B') THEN
        SELECT B.BODE_CENTRO, B.BODE_PROY FROM BODEGA B, DEVOLUCIONES_VENTAS F
            WHERE B.BODE_COD = F.BODE_COD AND F.DEVT_ID = :IDDOC INTO :CENTRO, :PROY;
    IF (CENT = 'V') THEN
        SELECT V.CENT_COD, V.PROY_COD FROM VENDEDORES V, DEVOLUCIONES_VENTAS F
            WHERE V.VEND_COD = F.VEND_COD AND F.DEVT_ID = :IDDOC INTO :CENTRO, :PROY;
    IF (CENT = 'P') THEN
        SELECT P.PREF_CENTRO,P.PREF_PROY  FROM PREFIJOS P, DEVOLUCIONES_VENTAS F
            WHERE P.PREF_PRE = F.PREF_PRE AND F.DEVT_ID = :IDDOC AND P.TIDO_COD = 33 INTO :CENTRO, :PROY;
    EXECUTE PROCEDURE FECHA_A_CONTA(:FECAUX) returning_values (:FECHA);
    /* REGISTRE EL ENCABEZADO CONTABLE */
    CONC = 'DEVOLUCION VENTAS No. ' || NUMERO || ' EN FACTURA ' || NUMFAC;
    CONC = SUBSTR(CONC, 1, 60);
    NROI = 100000;
    SUMA = 0;
    ERROR = 0;
    /* 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;
    /* CUENTAS DE VENTAS */
    if (VENTAS = 'A') then
        BEGIN
        FOR SELECT MAX(COAR_CTADEV), SUM(DVDE_TOTAL-DVDE_IVAMONTO-DVDE_CONSUMO-DVDE_INACM), SUM(DVDE_IVAMONTO), SUM(DVDE_CONSUMO), MAX(B.bode_proy), MAX(B.bode_centro)
            FROM ARTICULO A, CONTABIL_ARTICULO_NIIF C, DEVOLUCIONES_VENTAS_DETALLE F, BODEGA B
            WHERE F.DEVT_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND B.bode_cod = F.bode_cod AND ((DVDE_REFERENCIA <> '.t') or (DVDE_REFERENCIA IS NULL))
            GROUP BY COAR_CTADEV
            INTO :CTAVENTAS, :MONTO, :IMPTOS, :VRCONSUMO, :proyi, :centi
            DO
            BEGIN
            if ((FOMENTO = 'SI') or (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(33, :IDDOC, :CTAVENTAS, '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)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
                    NROI = NROI + 1;
                    SUMA = SUMA + MONTO;
                    END
                ELSE
                    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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROYI, :CENTI, NULL, NULL, NULL, NULL, 0, 0);
                    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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    SUMA = SUMA + MONTO;
                    END
                END /* MONTO <> 0 */
            END /* FOR */
        END /* VENTAS A */
     IF ((VENTAS = 'C') OR (VENTAS = 'K')) THEN
        BEGIN
        IF (VENTAS = 'C') THEN
            CTAVENTAS = TCTAVENTA;
        SELECT SUM(DVDE_TOTAL-DVDE_IVAMONTO-DVDE_CONSUMO-DVDE_INACM), SUM(DVDE_IVAMONTO), SUM(DVDE_CONSUMO)
            FROM DEVOLUCIONES_VENTAS_DETALLE F
            WHERE F.DEVT_ID = :IDDOC  AND ((DVDE_REFERENCIA <> '.t') or (DVDE_REFERENCIA IS NULL))
            INTO :MONTO, :IMPTOS, :VRCONSUMO;
        if ((FOMENTO = 'SI') or (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(33, :IDDOC, :CTAVENTAS, '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)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
                NROI = NROI + 1;
                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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA + MONTO;
                END
            END /* MONTO <> 0 */
        END /* VENTAS C O K */

    if (IVA = 'A') then
        BEGIN
        FOR SELECT MAX(COAR_CTAIVADV), SUM(DVDE_IVAMONTO), SUM(DVDE_TOTAL-DVDE_IVAMONTO-DVDE_CONSUMO-DVDE_INACM), SUM(DVDE_CONSUMO)
            FROM ARTICULO A, CONTABIL_ARTICULO_NIIF C, DEVOLUCIONES_VENTAS_DETALLE F
            WHERE F.DEVT_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND ((DVDE_REFERENCIA <> '.t') or (DVDE_REFERENCIA IS NULL))
            GROUP BY COAR_CTAIVADV
            INTO :CTAIVA, :IMPTOS, :MONTO, :VALORADIC
        DO
            BEGIN
            if (FOMENTO = 'SI') then
                MONTO = 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(33, :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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :IMPTOS, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
                    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)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :IMPTOS, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    SUMA = SUMA + IMPTOS;
                    END
                END   /* IMPTOS <> 0 */
            END /* FOR */
        END /* IVA A */
    if (IVA = 'K') then
        BEGIN
        SELECT SUM(DVDE_IVAMONTO), SUM(DVDE_TOTAL-DVDE_IVAMONTO-DVDE_CONSUMO-DVDE_INACM), SUM(DVDE_CONSUMO)
            FROM DEVOLUCIONES_VENTAS_DETALLE F
            WHERE F.DEVT_ID = :IDDOC  AND ((DVDE_REFERENCIA <> '.t') or (DVDE_REFERENCIA IS NULL))
            INTO :IMPTOS, :MONTO, :VALORADIC;
        if (FOMENTO = 'SI') then
            MONTO = 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(33, :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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTAIVA, :CONC, '', :IMPTOS, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
                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)
                    VALUES (:IDC, :NROI, :CTAIVA, :CONC, '', :IMPTOS, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA + IMPTOS;
                END
            END /* IMPTOS <> 0 */
        END /* IVA K */

    if ((CONSUMO = 'A') AND (FOMENTO <> 'SI')) then
        BEGIN
        FOR SELECT MAX(COAR_CTACONS), SUM(DVDE_CONSUMO)
            FROM ARTICULO A, CONTABIL_ARTICULO_NIIF C, DEVOLUCIONES_VENTAS_DETALLE F
            WHERE F.DEVT_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND ((DVDE_REFERENCIA <> '.t') or (DVDE_REFERENCIA IS NULL))
            GROUP BY COAR_CTACONS
            INTO :CTACONSUMO, :IMPTOS
        DO
            BEGIN
            if (IMPTOS <> 0) then
                BEGIN
                EXECUTE PROCEDURE CUENTA_INTERFAZ_NIIF(33, :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)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :IMPTOS, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
                    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)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :IMPTOS, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    SUMA = SUMA + IMPTOS;
                    END
                END /* IMPTOS <> 0 */
            END /* FOR */
        END /* CONSUMO A */
    if ((CONSUMO = 'K') AND (FOMENTO <> 'SI')) then
        BEGIN
        SELECT SUM(DVDE_CONSUMO)
            FROM DEVOLUCIONES_VENTAS_DETALLE F
            WHERE F.DEVT_ID = :IDDOC AND ((DVDE_REFERENCIA <> '.t') or (DVDE_REFERENCIA IS NULL))
            INTO :IMPTOS;
        if (IMPTOS <> 0) then
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ_NIIF(33, :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)
                    VALUES (:IDC, :NROI, :CTACONSUMO, :CONC, '', :IMPTOS, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 31);
                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)
                    VALUES (:IDC, :NROI, :CTACONSUMO, :CONC, '', :IMPTOS, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA + IMPTOS;
                END
            END /* IMPTOS <> 0 */
        END /* CONSUMO K */
    /* INALC */
        BEGIN
        SELECT SUM(DVDE_INACM)
            FROM DEVOLUCIONES_VENTAS_DETALLE F
            WHERE F.DEVT_ID = :IDDOC AND ((DVDE_REFERENCIA <> '.t') or (DVDE_REFERENCIA IS NULL))
            INTO :IMPTOS;
        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(33, :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)
                    VALUES (:IDC, :NROI, :CTACONSUMO, :CONC, '', :IMPTOS, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 31);
                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)
                    VALUES (:IDC, :NROI, :CTACONSUMO, :CONC, '', :IMPTOS, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA + IMPTOS;
                END
            END /* IMPTOS <> 0 */
        END /* INALC */

    if ((CTADTO IS NOT NULL) AND
        (CTADTO <> '') AND
        (VRDTO <> 0)) THEN
        BEGIN
        EXECUTE PROCEDURE CUENTA_INTERFAZ_NIIF(33, :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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRDTO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
            NROI = NROI + 1;
            SUMA = SUMA - VRDTO;
            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)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRDTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 33);
            NROI = NROI + 1;
            SUMA = SUMA - VRDTO;
            END
        END

    if ((CTAADIC IS NOT NULL) AND
        (CTAADIC <> '') AND
        (VRADIC <> 0)) THEN
        BEGIN
        EXECUTE PROCEDURE CUENTA_INTERFAZ_NIIF(33, :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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRADIC, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
            NROI = NROI + 1;
            SUMA = SUMA + VRADIC;
            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)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRADIC, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 33);
            NROI = NROI + 1;
            SUMA = SUMA + VRADIC;
            END
        END

    if ((CTAEXTRA IS NOT NULL) AND
        (CTAEXTRA <> '') AND
        (VREXTRA <> 0)) THEN
        BEGIN
        EXECUTE PROCEDURE CUENTA_INTERFAZ_NIIF(33, :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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VREXTRA, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
            NROI = NROI + 1;
            SUMA = SUMA + VREXTRA;
            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)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VREXTRA, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 33);
            NROI = NROI + 1;
            SUMA = SUMA + VREXTRA;
            END
        END

    if ((RTFTE = 'C') or (RTFTE = 'K')) then
      if (VRRTFTE <> 0) then
        BEGIN
        if (RTFTE = 'C') then
            CTARTFTE = TCTARTFTE;
        EXECUTE PROCEDURE CUENTA_INTERFAZ_NIIF(33, :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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTFTE, (:VRSUBT*-1), :PRTFTE, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
            NROI = NROI + 1;
            SUMA = SUMA - VRRTFTE;
            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)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTFTE, (:VRSUBT*-1), :PRTFTE, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            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(33, :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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTFTE, 0, :VRSUBT, :PRTFTE, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
                NROI = NROI + 1;
                SUMA = SUMA + VRRTFTE;
                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)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTFTE, 0, :VRSUBT, :PRTFTE, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA + VRRTFTE;
                END
            END
        END /* RTFTE */
    if (RTFTE = 'A') then
     if (VRRTFTE <> 0) then
      BEGIN
      FOR SELECT MAX(COAR_CTARTFTEV), MAX(COAR_RTFTE), MIN(COAR_RTBASE), SUM(DVDE_TOTAL-DVDE_IVAMONTO-DVDE_CONSUMO), SUM((DVDE_TOTAL-DVDE_IVAMONTO-DVDE_CONSUMO)*COAR_RTFTE)
        FROM CONTABIL_ARTICULO_NIIF C, devoluciones_ventas_detalle F
        WHERE F.devt_id = :IDDOC AND F.ARTI_COD = C.ARTI_COD AND ((DVDE_REFERENCIA <> '.t') or (DVDE_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(33, :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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTFTE, (:MONTO*-1), :PRTFTE, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
                    NROI = NROI + 1;
                    SUMA = SUMA - VRRTFTE;
                    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)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTFTE, (:MONTO*-1), :PRTFTE, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    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(33, :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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTFTE, 0, :MONTO, :PRTFTE, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
                        NROI = NROI + 1;
                        SUMA = SUMA + VRRTFTE;
                        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)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTFTE, 0, :MONTO, :PRTFTE, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                        NROI = NROI + 1;
                        SUMA = SUMA + VRRTFTE;
                        END
                    END
                END
            END
        END /* RTFTE */
      END

    if ((RTIVA = 'C') or (RTIVA = 'K')) then
      if (VRRTIVA <> 0) then
        BEGIN
        if (RTIVA = 'C') then
            CTARTIVA = TCTARTIVA;
        EXECUTE PROCEDURE CUENTA_INTERFAZ_NIIF(33, :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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTIVA, (:VRIVA*-1), :PORC, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
            NROI = NROI + 1;
            SUMA = SUMA - VRRTIVA;
            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)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTIVA, (:VRIVA*-1), :PORC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            SUMA = SUMA - VRRTIVA;
            END
        END /* RTIVA */

    if ((RTICA = 'C') or (RTICA = 'K')) then
      if (VRRTICA <> 0) then
        BEGIN
        if (RTICA = 'C') then
            CTARTICA = TCTARTICA;
        EXECUTE PROCEDURE CUENTA_INTERFAZ_NIIF(33, :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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTICA, (:VRSUBT*-1), :PRTICA, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
            NROI = NROI + 1;
            SUMA = SUMA - VRRTICA;
            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)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTICA, (:VRSUBT*-1), :PRTICA, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            SUMA = SUMA - VRRTICA;
            END
        END /* RTICA */
    if (RTICA = 'A') then
      BEGIN
      if (VRRTICA <> 0) then
        BEGIN
        FOR SELECT MAX(COAR_CTARTICAV), SUM(DVDE_TOTAL-DVDE_IVAMONTO-DVDE_CONSUMO), SUM(((DVDE_TOTAL-DVDE_IVAMONTO-DVDE_CONSUMO)/1000)*:prtica)
          FROM CONTABIL_ARTICULO_NIIF C, devoluciones_ventas_detalle F
          WHERE F.devt_id = :IDDOC AND F.ARTI_COD = C.ARTI_COD AND ((DVDE_REFERENCIA <> '.t') or (DVDE_REFERENCIA IS NULL))
          GROUP BY COAR_CTARTICAV
          INTO :ctartica, :MONTO, :vrrtica
          DO
          BEGIN
          MONTO = MONTO * FACTOR;
          vrrtica = vrrtica * FACTOR;
          execute procedure redondee(vrrtica, DIG) returning_values (vrrtica);
          execute procedure redondee(MONTO, DIG) returning_values (MONTO);
          if (vrrtica <> 0) then
            BEGIN
            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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :vrrtica, (:MONTO*-1), :prtica/10, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :fecha, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA - vrrtica;
                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)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :vrrtica, (:MONTO*-1), :prtica/10, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA - vrrtica;
                END
            END
          END
        END
      END   /* RTICA */

    if ((RTCREE = 'C') or (RTCREE = 'K')) then
      if (VRRTCREE <> 0) then
        BEGIN
        if (RTCREE = 'C') then
            CTARTCREE = TCTARTCREE;
        EXECUTE PROCEDURE CUENTA_INTERFAZ_NIIF(33, :IDDOC, :CTARTCREE, '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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTCREE, (:VRSUBT*-1), :PRTCREE, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
            NROI = NROI + 1;
            SUMA = SUMA - VRRTCREE;
            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)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTCREE, (:VRSUBT*-1), :PRTCREE, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            SUMA = SUMA - VRRTCREE;
            END
        /* AUTORETENCION */
        if (fautorcree <= fecaux) then
            BEGIN
            EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'CUENTA DE AUTORETENCION CREE') returning_values (ctartcree);
            EXECUTE PROCEDURE CUENTA_INTERFAZ_NIIF(33, :IDDOC, :ctartcree, '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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :vrrtcree, 0, :VRSUBT, :prtcree, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
                NROI = NROI + 1;
                SUMA = SUMA + vrrtcree;
                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)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :vrrtcree, 0, :VRSUBT, :prtcree, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA + vrrtcree;
                END
            END
        END /* RTCREE */
    if (RTCREE = 'A') then
      BEGIN
      FOR SELECT MAX(COAR_CTARTCREE), MAX(COAR_RTCREE), SUM(DVDE_TOTAL-DVDE_IVAMONTO-DVDE_CONSUMO), SUM((DVDE_TOTAL-DVDE_IVAMONTO-DVDE_CONSUMO)*COAR_RTCREE)
        FROM CONTABIL_ARTICULO_NIIF C, devoluciones_ventas_detalle F
        WHERE F.devt_id = :IDDOC AND F.ARTI_COD = C.ARTI_COD AND ((DVDE_REFERENCIA <> '.t') or (DVDE_REFERENCIA IS NULL))
        GROUP BY COAR_CTARTCREE
        INTO :ctartcree, :PRTFTE, :MONTO, :vrrtcree
        DO
        BEGIN
        MONTO = MONTO * FACTOR;
        VRRTCREE = VRRTCREE * FACTOR / 100;
        execute procedure redondee(VRRTCREE, DIG) returning_values (VRRTCREE);
        execute procedure redondee(MONTO, DIG) returning_values (MONTO);
        if (VRRTCREE <> 0) then
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ_NIIF(33, :IDDOC, :CTARTCREE, '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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :vrrtcree, (:MONTO*-1), :prtcree, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
                NROI = NROI + 1;
                SUMA = SUMA - vrrtcree;
                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)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :vrrtcree, (:MONTO*-1), :prtcree, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA - vrrtcree;
                END
            /* AUTORETENCION */
            if (fautorcree <= fecaux) then
                BEGIN
                EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'CUENTA DE AUTORETENCION CREE') returning_values (ctartcree);
                EXECUTE PROCEDURE CUENTA_INTERFAZ_NIIF(33, :IDDOC, :ctartcree, '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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :vrrtcree, 0, :MONTO, :prtcree, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
                    NROI = NROI + 1;
                    SUMA = SUMA + vrrtcree;
                    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)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :vrrtcree, 0, :MONTO, :prtcree, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    SUMA = SUMA + vrrtcree;
                    END
                END
            END
        END /* RTCREE */
      END
    /* SI HAY ARTICULOS DE TERCEROS LLEVE ESE VALOR A LA CUENTA INDICADA */
    SELECT SUM(DVDE_TOTAL) FROM devoluciones_ventas_detalle F, ARTICULO A
        WHERE F.devt_id = :IDDOC AND ((DVDE_REFERENCIA <> '.t') or (DVDE_REFERENCIA IS NULL)) AND F.arti_cod = A.arti_cod AND A.arti_tercero = 'S'
        INTO :MONTO;
    if (MONTO IS NULL) then
        MONTO = 0;
    if (MONTO <> 0) then
        BEGIN
        if ((CTADTO IS NULL) OR (CTADTO = '')) then
            MONTO = MONTO * FACTOR;
        /* reste las retenciones en la misma cuenta (4 digitos) */
        EXECUTE PROCEDURE lee_configuracion('FACTURACION', 'FACTURAS', 'CUENTA DE CARTERA PARA INGRESOS DE TERCEROS') returning_values(:CTAVENTAS);
        select sum(cnde_debitos-cnde_creditos) from contabilizacion_det where cntb_id = :idc and substring(cnde_cuenta from 1 for 4) = substring(:ctaventas from 1 for 4)
            into :vrrtfte;
        if (vrrtfte is null) then
            vrrtfte = 0;
        monto = monto + vrrtfte;
        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 = '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)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :fecha, NULL, 0, 31);
                NROI = NROI + 1;
                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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA - MONTO;
                END
            END
        END /* MONTO <> 0 */

    /* CIERRE CONTRA CUENTA TERCERO O CONSTANTE */
    if ((SUMA <> 0) and ((CARTERA = 'C') or (CARTERA = 'K') or (CARTERA = 'J'))) then
        BEGIN
        if (icoing = 'SI') then
            BEGIN
            /* DESCUENTE EL IMPOCONSUMO */
            SELECT SUM(DVDE_CONSUMO)
                FROM devoluciones_ventas_detalle F WHERE F.DEVT_ID = :IDDOC AND ((DVDE_REFERENCIA <> '.t') or (DVDE_REFERENCIA IS NULL)) INTO :IMPTOS;
            SUMA = SUMA - IMPTOS;
            END
        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
            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(33, :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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :DEBITO, :CREDITO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
        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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :DEBITO, :CREDITO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
        NROI = NROI + 1;
        END /* SUMA CARTERA */
    /* COSTOS VENTAS */
    EXECUTE PROCEDURE COSTO_EN_VENTAS(33, :IDDOC);
    if (COSTOS = 'A') then
        BEGIN
        FOR SELECT MAX(CTACOS), SUM(CAST(CANT AS DOUBLE PRECISION) * COSTO), SUM(DVDE_CONSUMO)
            FROM COSTO_VENTAS CV, devoluciones_ventas_detalle D WHERE CV.cove_item = D.dvde_item AND D.devt_id = :iddoc AND
            TIDO_COD = 33 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(33, :IDDOC, :CTACOSTOS, '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)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
                    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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    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 WHERE TIDO_COD = 33 AND COVE_ID = :IDDOC
            INTO :MONTO;
        if (icoing = 'SI') then
            MONTO = MONTO + imptos;
        if (MONTO <> 0) then
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ_NIIF(33, :IDDOC, :CTACOSTOS, '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)
                    VALUES (:IDC, :NROI, :CTACOSTOS, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
                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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTACOSTOS, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                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 WHERE TIDO_COD = 33 AND COVE_ID = :IDDOC
            GROUP BY CTAINV
            INTO :CTAINVEN, :MONTO
        DO
            BEGIN
            if (MONTO <> 0) then
                BEGIN
                EXECUTE PROCEDURE CUENTA_INTERFAZ_NIIF(33, :IDDOC, :CTAINVEN, '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)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
                    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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    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 WHERE TIDO_COD = 33 AND COVE_ID = :IDDOC
            INTO :MONTO;
        if (MONTO <> 0) then
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ_NIIF(33, :IDDOC, :CTAINVEN, '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)
                    VALUES (:IDC, :NROI, :CTAINVEN, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
                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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTAINVEN, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                END
            END /* MONTO <> 0 */
        END /* INVEN = K */
    /* 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(33, :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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTADIC, :CONC, '', :MONTO, 0, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
                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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTADIC, :CONC, '', 0, :MONTO, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
                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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTADIC, :CONC, '', :MONTO, 0, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTADIC, :CONC, '', 0, :MONTO, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                END
            NROI = NROI + 1;
            END
        END
    if (error > 0) then
        ver = 'S';
    SUSPEND;
    END
   END /* EXISTE INTERFAZ */
  ELSE
    BEGIN
    EXECUTE PROCEDURE ERRORINT(1033, :IDDOC, :PREF, 1);
    ERROR = ERROR + 1;
    VER = 'S';
    SUSPEND;
    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(8);
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 PRTCREE NUMERIC(9, 2);
declare variable VRRTCREE 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 RTCREE CHAR(1);
declare variable CTARTCREE 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 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 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 FOMENTO CHAR(2);
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 IDREM INTEGER;
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
    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, :RTCREE,
    :CTAINVEN, :CTAIVA, :CTACONSUMO, :CTADTO, :CTAADIC, :CTAEXTRA, :CTACXP, :CTARTFTE, :CTARTIVA,
    :CTARTICA, :CTARTCREE, :VER, :CENT;
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_CTARTCREE, PROV_CTAPAGAR, DVCO_ANULADO, d.dvco_remid
        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,
        :prtcree, :vrrtcree, :TCTARTFTE, TCTARTIVA, TCTARTICA, tctartcree, TCTAPROV, ANULADO, :idrem;
   if ((ANULADO = 'N') AND (IDREM = 0)) then
    BEGIN
    NUMERO = PREFIJO || NUM;
    VRSUBT = VRTOTAL - VREXTRA - VRIVA; /* BASE DE RETEFTE Y RETEICA */
    IF (CENT = 'B') THEN
        SELECT BODE_CENTRO, BODE_PROY FROM BODEGA B, DEVOLUCIONES_COMPRAS F
            WHERE B.BODE_COD = F.BODE_COD AND F.DVCO_ID = :IDDOC INTO :CENTRO, :PROY;
    ELSE
        SELECT PREF_CENTRO,PREF_PROY 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;
    EXECUTE PROCEDURE LEE_CONFIGURACION('COMPRAS', 'FACTURAS', 'USAR IMPOCONSUMO COMO PORCENTAJE DE FOMENTO') RETURNING_VALUES (FOMENTO);
    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;

    EXECUTE PROCEDURE FECHA_A_CONTA(:FECAUX) returning_values (:FECHA);
    /* REGISTRE EL ENCABEZADO CONTABLE */
    CONCEPTO = 'DEVOLUCION COMPRA No. ' || NUMERO || ' EN FACTURA ' || NUMFAC;
    NUMITEMS = 100000;
    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_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;
                if (FOMENTO <> 'SI') then
                    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') or (TIPOCUEN = 'A')) 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;
                        if (FOMENTO <> 'SI') then
                            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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ARTICULO, 0, 0);
                    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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 24);
                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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                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;
            if (FOMENTO <> 'SI') then
                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') or (TIPOCUEN = 'A'))  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;
                    if (FOMENTO <> 'SI') then
                        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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NUMITEMS, :CTAINVEN, :CONCEPTO, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ARTICULO, 0, 0);
                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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NUMITEMS, :CTAINVEN, :CONCEPTO, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 24);
            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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NUMITEMS, :CTAINVEN, :CONCEPTO, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            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_CTAIVADC
            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;
                if (FOMENTO <> 'SI') then
                    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;
                        if (FOMENTO <> 'SI') then
                            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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :IMPTOS, :MONTO, :PORCIVA, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ARTICULO, 0, 0);
                    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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :IMPTOS, :MONTO, :PORCIVA, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 24);
                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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :IMPTOS, :MONTO, :PORCIVA, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                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;
                if (FOMENTO <> 'SI') then
                    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;
                            if (FOMENTO <> 'SI') then
                                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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NUMITEMS, :CTAIVA, :CONCEPTO, '', 0, :IMPTOS, :MONTO, :PORCIVA, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ARTICULO, 0, 0);
                        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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NUMITEMS, :CTAIVA, :CONCEPTO, '', 0, :IMPTOS, :MONTO, :PORCIVA, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 24);
                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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NUMITEMS, :CTAIVA, :CONCEPTO, '', 0, :IMPTOS, :MONTO, :PORCIVA, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                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;
                if (FOMENTO <> 'SI') then
                    BEGIN
                    /* DEPENDE DEL TIPO DE CUENTA */
                    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)
                            VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 24);
                        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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                        NUMITEMS = NUMITEMS + 1;
                        SUMA = SUMA - IMPTOS;
                        END
                    END
                ELSE
                    BEGIN
                    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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NUMITEMS, :CTACONSUMO, :CONCEPTO, '', :IMPTOS, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 24);
                        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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NUMITEMS, :CTACONSUMO, :CONCEPTO, '', :IMPTOS, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                        NUMITEMS = NUMITEMS + 1;
                        SUMA = SUMA + IMPTOS;
                        END
                    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;
            if (FOMENTO <> 'SI') then
                BEGIN
                /* DEPENDE DEL TIPO DE CUENTA */
                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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NUMITEMS, :CTACONSUMO, :CONCEPTO, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 24);
                    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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NUMITEMS, :CTACONSUMO, :CONCEPTO, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NUMITEMS = NUMITEMS + 1;
                    SUMA = SUMA - IMPTOS;
                    END
                END
            ELSE
                BEGIN
                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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NUMITEMS, :CTACONSUMO, :CONCEPTO, '', :IMPTOS, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ARTICULO, 0, 0);
                        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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NUMITEMS, :CTACONSUMO, :CONCEPTO, '', :IMPTOS, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 24);
                    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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NUMITEMS, :CTACONSUMO, :CONCEPTO, '', :IMPTOS, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NUMITEMS = NUMITEMS + 1;
                    SUMA = SUMA + IMPTOS;
                    END
                END
            END
        END /* CONSUMO EN CTA CONSTANTE */
        
    /* 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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :VRDTO, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 24);
            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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :VRDTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :VRADIC, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 24);
            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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :VRADIC, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :VREXTRA, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 24);
            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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :VREXTRA, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :VRRTFTE, 0, :VRSUBT, :PRTFTE, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 24);
            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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :VRRTFTE, 0, :VRSUBT, :PRTFTE, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :VRRTFTE, 0, :VRSUBT, :PRTFTE, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 24);
                        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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :VRRTFTE, 0, :VRSUBT, :PRTFTE, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                        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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :VRRTIVA, 0, :VRIVA, :PORC, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 24);
            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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :VRRTIVA, 0, :VRIVA, :PORC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :VRRTICA, 0, :VRSUBT, :PRTICA, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 24);
            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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :VRRTICA, 0, :VRSUBT, :PRTICA, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NUMITEMS = NUMITEMS + 1;
            SUMA = SUMA + VRRTICA;
            END
        END /* RTICA */
    /* RETENCION CREE */
    if ((rtcree = 'P') or (rtcree = 'K')) then
      if (vrrtcree <> 0) then
        BEGIN
        if (rtcree = 'P') then
            ctartcree = tctartcree;
            
        /* TRAIGA LAS CARACTERISTICAS DE LA CUENTA */
        EXECUTE PROCEDURE CUENTA_INTERFAZ_NIIF(24, :IDDOC, :ctartcree, '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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :vrrtcree, 0, :VRSUBT, :prtcree, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 24);
            NUMITEMS = NUMITEMS + 1;
            SUMA = SUMA + vrrtcree;
            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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :vrrtcree, 0, :VRSUBT, :prtcree, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NUMITEMS = NUMITEMS + 1;
            SUMA = SUMA + vrrtcree;
            END
        END /* RTCREE */
    /* 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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NUMITEMS, :CUENTAADIC, :CONCEPTO, '', :MONTO, 0, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 24);
                    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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NUMITEMS, :CUENTAADIC, :CONCEPTO, '', 0, :MONTO, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 24);
                    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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NUMITEMS, :CUENTAADIC, :CONCEPTO, '', :MONTO, 0, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NUMITEMS, :CUENTAADIC, :CONCEPTO, '', 0, :MONTO, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :DEBITO, :CREDITO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 24);
        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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :DEBITO, :CREDITO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
        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 ^ ;

CREATE OR ALTER procedure CONTABIL_EGRESO_NIIF (
    IDDOC integer,
    IDINTER integer,
    IDC integer)
returns (
    ERRORI integer,
    VER char(1))
AS
declare variable PREF VARCHAR(4);
declare variable CONC CHAR(120);
declare variable VRDTO NUMERIC(18, 2);
declare variable VRRTFTE NUMERIC(18, 2);
declare variable VRRTIVA NUMERIC(18, 2);
declare variable VRRTICA NUMERIC(18, 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 CAJA CHAR(1);
declare variable CTACAJA 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 DTO CHAR(1);
declare variable CTADTO 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 MONTOBASE NUMERIC(18,2);
declare variable PORC NUMERIC(9,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 TCTARTFTE VARCHAR(20);
declare variable TCTARTIVA VARCHAR(20);
declare variable TCTARTICA VARCHAR(20);
declare variable TCTARTCREE VARCHAR(20);
declare variable TCTACART VARCHAR(20);
declare variable TIPOIT INTEGER;
declare variable IDIT INTEGER;
declare variable PREFIT VARCHAR(4);
declare variable NUMIT VARCHAR(8);
declare variable NUMEROIT VARCHAR(10);
declare variable ABONOIT NUMERIC(18,2);
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 VRBASE NUMERIC(18,2);
declare variable GMF CHAR(1);
declare variable CODBCO INTEGER;
declare variable NUMCHEQ VARCHAR(20);
declare variable CRUCES NUMERIC(18,2);
declare variable VRCAJA NUMERIC(18,2);
declare variable OK INTEGER;
declare variable DIFCAMBIO NUMERIC(18,2);
declare variable CTADIF VARCHAR(20);
declare variable RTFTEC NUMERIC(18,2);
declare variable RTIVAC NUMERIC(18,2);
declare variable RTICAC NUMERIC(18,2);
declare variable RTCREEC NUMERIC(18,2);
declare variable RTFTER CHAR(1);
declare variable CTARTFTER VARCHAR(20);
declare variable RTIVAR CHAR(1);
declare variable CTARTIVAR VARCHAR(20);
declare variable RTICAR CHAR(1);
declare variable CTARTICAR VARCHAR(20);
declare variable RTCREER CHAR(1);
declare variable CTARTCREER VARCHAR(20);
declare variable RET CHAR(2);
declare variable RTIT NUMERIC(18,2);
declare variable NITBCO VARCHAR(20);
declare variable NUMPROV CHAR(8);
declare variable TIPO INTEGER;
BEGIN
/* BUSQUE LA INTERFACE */
EXISTE = 'N';
SELECT 'S', N.INCJ_BASE, N.INCJ_DTOPP, N.INCJ_RTFTE, N.INCJ_RTIVA, N.INCJ_RTICA, N.INCJ_CAJA, N.incj_rtcree, N.INCJ_CTABASE,
    N.INCJ_CTADTO, N.INCJ_CTARTFTE, N.INCJ_CTARTIVA, N.INCJ_CTARTICA, N.INCJ_CTARTCREE, N.INCJ_CTACAJA, INCJ_CONFIRMAR
    FROM INTERFAZ_CAJA I, interfaz_caja_niif N
    WHERE I.INCJ_ID = :IDINTER AND I.incj_id = N.incj_id
    INTO :EXISTE, :BASE, :DTO, :RTFTE, :RTIVA, :RTICA, :CAJA, :RTCREE, :CTABASE,
    :CTADTO, :CTARTFTE, :CTARTIVA, :CTARTICA, :CTARTCREE, :CTACAJA, :VER;
if (EXISTE = 'S') then
    BEGIN
    OK = 0;
    /* TRAIGA EL ENCABEZADO DEL EGRESO */
    SELECT PREF_PRE, E.TERC_NIT, EGRE_CONC, EGRE_DTOF, EGRE_MONTO, EGRE_RTFTEMONTO, EGRE_RTIVAMONTO,
        EGRE_RTICAMONTO, EGRE_RTCREE, TERC_CTARTFTE, TERC_CTARTIVA, TERC_CTARTICA, TERC_CTARCREE, TERC_CTACLIENTE, EGRE_TIPO
        FROM EGRESOS E, TERCEROS T
        WHERE EGRE_ID = :IDDOC AND E.TERC_NIT = T.TERC_NIT
        INTO :PREF, :NIT, :CONC, :VRDTO, :VRTOTAL, :VRRTFTE, :VRRTIVA,
        :VRRTICA, :vrrtcree, :TCTARTFTE, TCTARTIVA, TCTARTICA, tctartcree, TCTACLIEN, :TIPO;
    /* SI ES PROVEEDOR, SOBREESCIBE LAS CUENTAS  */
    SELECT PROV_CTAPAGAR, PROV_CTARTFTE, PROV_CTARTIVA, PROV_CTARTICA, PROV_CTARTCREE
        FROM PROVEEDORES WHERE TERC_NIT = :NIT
        INTO TCTACLIEN, TCTARTFTE, TCTARTIVA, TCTARTICA, tctartcree;
    SELECT PREF_CENTRO, PREF_PROY FROM PREFIJOS
        WHERE PREF_PRE = :PREF AND TIDO_COD = 62 INTO :CENTRO, :PROY;
    /* SUME LOS CRUCES PARA LLEVARLOS A LA CUENTA X PAGAR Y RESTAR DE LA CAJA */
    SELECT SUM(EGCC_ABONO) FROM EGRESOS_CRUCEC WHERE EGRE_ID = :iddoc INTO :CRUCES;
    if (CRUCES IS NULL) then
        CRUCES = 0;
    VRCAJA = VRTOTAL;
    NROI = 100000;
    SUMA = 0;
    ERRORI = 0;
    /* EL CREDITO EN LA CAJA O EL BANCO */
    IF ((CAJA = 'K')) THEN
        BEGIN
        if (VRCAJA <> 0) then
            BEGIN
            CUENTA = NULL;
            EXECUTE PROCEDURE VALIDE_CUENTA_C (CTACAJA) RETURNING_VALUES (:OK);
            IF (OK = 0) THEN
                SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS_NIIF
                    WHERE CUEN_COD = :CTACAJA INTO :CUENTA, :TIPOCUEN;
            ELSE
                begin
                EXECUTE PROCEDURE ERRORINT(62, :IDDOC, :CTACAJA, 2);
                CUENTA = CTACAJA;
                TIPOCUEN = 'N';
                ERRORI = ERRORI + 1;
                end
            if (TIPOCUEN = 'I') then
                BEGIN
                EXECUTE PROCEDURE ERRORINT(62, :IDDOC, :CUENTA, 3);
                TIPOCUEN = 'N';
                ERRORI = ERRORI + 1;
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                EXECUTE PROCEDURE ERRORINT(62, :IDDOC, :CUENTA, 4);
                TIPOCUEN = 'N';
                ERRORI = ERRORI + 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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRCAJA, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA - VRCAJA;
                END
            END /* VRCAJA <> 0 */
        END /* CAJA CONSTANTE */
    IF ((CAJA = 'F')) THEN
        BEGIN
        /* mueva la cuenta de la caja o el banco o ambas */
        /* PRIMERO LA CAJA */
        FOR SELECT CAJA_CUENTA, EGCA_MONTO FROM EGRESOS_CAJA E, CAJAS C
            WHERE C.CAJA_ID = E.CAJA_ID AND EGRE_ID = :IDDOC
            INTO :CTACAJA, :MONTO
            DO
            BEGIN
            if (MONTO <> 0) then
                BEGIN
                CUENTA = NULL;
                EXECUTE PROCEDURE VALIDE_CUENTA_C (CTACAJA) RETURNING_VALUES (:OK);
                IF (OK = 0) THEN
                    SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS_NIIF
                        WHERE CUEN_COD = :CTACAJA INTO :CUENTA, :TIPOCUEN;
                ELSE
                    begin
                    EXECUTE PROCEDURE ERRORINT(62, :IDDOC, :CTACAJA, 2);
                    CUENTA = CTACAJA;
                    TIPOCUEN = 'N';
                    ERRORI = ERRORI + 1;
                    end
                if (TIPOCUEN = 'I') then
                    BEGIN
                    EXECUTE PROCEDURE ERRORINT(62, :IDDOC, :CUENTA, 3);
                    TIPOCUEN = 'N';
                    ERRORI = ERRORI + 1;
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    EXECUTE PROCEDURE ERRORINT(62, :IDDOC, :CUENTA, 4);
                    TIPOCUEN = 'N';
                    ERRORI = ERRORI + 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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    SUMA = SUMA - MONTO;
                    END
                END /* MONTO <> 0 */
            END /* DO CAJA */
        /* AHORA EL BANCO */
        MONTO = 0;
        SELECT CUBA_CTACONTA, EGBC_MONTO, EGBC_GMF, E.CUBA_COD, CUBA_GMFPOR, EGBC_NUMERO, BANC_NIT
            FROM EGRESOS_BANCO E, CUENTAS_BANCO C, BANCOS B
            WHERE E.CUBA_COD = C.CUBA_COD AND EGRE_ID = :IDDOC AND B.banc_cod = C.banc_cod
            INTO :CTACAJA, :MONTO, :GMF, :CODBCO, :PORC, :NUMCHEQ, :nitbco;
        if (MONTO <> 0) then
            BEGIN
            if (MONTO <> 0) then
                BEGIN
                CUENTA = NULL;
                EXECUTE PROCEDURE VALIDE_CUENTA_C (CTACAJA) RETURNING_VALUES (:OK);
                IF (OK = 0) THEN
                    SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS_NIIF
                        WHERE CUEN_COD = :CTACAJA INTO :CUENTA, :TIPOCUEN;
                ELSE
                    begin
                    EXECUTE PROCEDURE ERRORINT(62, :IDDOC, :CTACAJA, 2);
                    CUENTA = CTACAJA;
                    TIPOCUEN = 'N';
                    ERRORI = ERRORI + 1;
                    end
                if (TIPOCUEN = 'I') then
                    BEGIN
                    EXECUTE PROCEDURE ERRORINT(62, :IDDOC, :CUENTA, 3);
                    TIPOCUEN = 'N';
                    ERRORI = ERRORI + 1;
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    EXECUTE PROCEDURE ERRORINT(62, :IDDOC, :CUENTA, 4);
                    TIPOCUEN = 'N';
                    ERRORI = ERRORI + 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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, :NUMCHEQ, 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    SUMA = SUMA - MONTO;
                    END
                /* EL GMF */
                if ((GMF = 'S') AND (PORC <> 0)) then
                    BEGIN
                    if (NITBCO IS NULL) then
                        NITBCO = NIT;
                    EXECUTE procedure REDONDEE(:MONTO * :PORC / 1000, 0) returning_values (MONTO);
                    /* REGISTRE EL GMF EN LA MISMA CUENTA DEL BANCO COMO CREDITO */
                    INSERT INTO CONTABILIZACION_DET (CNTB_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)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, :NUMCHEQ, 0, :MONTO, 0, 0, :NITBCO, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    SUMA = SUMA - MONTO;

                    /* AHORA LA CUENTA DEL GASTO */
                    SELECT CUBA_CTAGMF FROM CUENTAS_BANCO
                        where CUBA_COD = :CODBCO INTO :CTACAJA;
                    EXECUTE PROCEDURE VALIDE_CUENTA_C (CTACAJA) RETURNING_VALUES (:OK);
                    IF (OK = 0) THEN
                        SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS_NIIF
                            WHERE CUEN_COD = :CTACAJA INTO :CUENTA, :TIPOCUEN;
                    ELSE
                        begin
                        EXECUTE PROCEDURE ERRORINT(62, :IDDOC, :CTACAJA, 2);
                        CUENTA = CTACAJA;
                        TIPOCUEN = 'N';
                        ERRORI = ERRORI + 1;
                        end
                    if (TIPOCUEN = 'I') then
                        BEGIN
                        EXECUTE PROCEDURE ERRORINT(62, :IDDOC, :CUENTA, 3);
                        TIPOCUEN = 'N';
                        ERRORI = ERRORI + 1;
                        END
                    if (TIPOCUEN = 'C') then
                        BEGIN
                        EXECUTE PROCEDURE ERRORINT(62, :IDDOC, :CUENTA, 4);
                        TIPOCUEN = 'N';
                        ERRORI = ERRORI + 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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, :NUMCHEQ, :MONTO, 0, 0, 0, :NITBCO, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                        NROI = NROI + 1;
                        SUMA = SUMA + MONTO;
                        END
                    END /* GMF */
                END /* MONTO <> 0 */
            END /* EGRESO_BANCO */
        END /* CAJA = F */

    /* SI ES PRESTAMO DE NOMINA CONTABILICE LA CONTRAPARTIDA */
    if (TIPO = 5) then
        BEGIN
        EXECUTE PROCEDURE lee_configuracion('NOMINA', 'PAGOS', 'CUENTA POR COBRAR POR PRESTAMOS A EMPLEADOS') returning_values (:tctacart);
        CUENTA = NULL;
        EXECUTE PROCEDURE VALIDE_CUENTA_C (tctacart) RETURNING_VALUES (:OK);
        IF (OK = 0) THEN
            SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS_NIIF
                WHERE CUEN_COD = :tctacart INTO :CUENTA, :TIPOCUEN;
        ELSE
            begin
            EXECUTE PROCEDURE ERRORINT(62, :IDDOC, :tctacart, 2);
            CUENTA = tctacart;
            TIPOCUEN = 'N';
            ERRORI = ERRORI + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            EXECUTE PROCEDURE ERRORINT(62, :IDDOC, :CUENTA, 3);
            TIPOCUEN = 'N';
            ERRORI = ERRORI + 1;
            END
        if (TIPOCUEN = 'C') then
            BEGIN
            EXECUTE PROCEDURE ERRORINT(62, :IDDOC, :CUENTA, 3);
            TIPOCUEN = 'N';
            ERRORI = ERRORI + 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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRTOTAL, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            SUMA = SUMA + VRTOTAL;
            NROI = NROI + 1;
            END
        END
    /* LOS CRUCES CON CUENTAS X COBRAR */
    if (CRUCES <> 0) then
        BEGIN
        SELECT TERC_CTACLIENTE FROM TERCEROS WHERE TERC_NIT = :nit INTO :tctacart;
        if (tctacart IS NULL) then
            tctacart = tctaclien;
        CUENTA = NULL;
        EXECUTE PROCEDURE VALIDE_CUENTA_C (tctacart) RETURNING_VALUES (:OK);
        IF (OK = 0) THEN
            SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS_NIIF
                WHERE CUEN_COD = :tctacart INTO :CUENTA, :TIPOCUEN;
        ELSE
            begin
            EXECUTE PROCEDURE ERRORINT(62, :IDDOC, :tctacart, 2);
            CUENTA = tctacart;
            TIPOCUEN = 'N';
            ERRORI = ERRORI + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            EXECUTE PROCEDURE ERRORINT(62, :IDDOC, :CUENTA, 3);
            TIPOCUEN = 'N';
            ERRORI = ERRORI + 1;
            END
        if (TIPOCUEN = 'C') then
            BEGIN
            /* DEBERIA RECORRER DOCUMENTO POR DOCUMENTO */
            FOR SELECT EGCC_TIPODOC, EGCC_PREFIJO, EGCC_NUMERO, EGCC_ABONO+EGCC_RTFTE+EGCC_RTIVA+EGCC_RTICA+EGCC_DTOF
                FROM egresos_crucec WHERE EGRE_ID = :IDDOC
                INTO :TIPOIT, PREFIT, NUMIT, ABONOIT
                DO
                BEGIN
                NUMEROIT = PREFIT || NUMIT;
                if (ABONOIT > 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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :ABONOIT, 0, 0, :NIT, :PROY, :CENTRO, NULL, :NUMEROIT, NULL, NULL, :TIPOIT, 0);
                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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', abs(:ABONOIT), 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, :NUMEROIT, NULL, NULL, :TIPOIT, 0);
                SUMA = SUMA - ABONOIT;
                NROI = NROI + 1;
                END
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            if (CRUCES > 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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :CRUCES, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', abs(:CRUCES), 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            SUMA = SUMA - CRUCES;
            NROI = NROI + 1;
            END
        /* LA DIFERENCIA EN CAMBIO */
        SELECT SUM(EGCC_DIFCAMBIO) FROM egresos_crucec WHERE EGRE_ID = :iddoc INTO :DIFCAMBIO;
        IF ((DIFCAMBIO IS NOT NULL) AND (DIFCAMBIO <> 0)) THEN
            BEGIN
            if (DIFCAMBIO > 0) then
                execute procedure lee_configuracion('GENERAL','GENERAL','CUENTA DE INGRESO POR DIFERENCIA EN CAMBIO PARA OPERACIONES EN OTRA MONEDA') returning_values (:ctadif);
            else
                execute procedure lee_configuracion('GENERAL','GENERAL','CUENTA DE GASTO POR DIFERENCIA EN CAMBIO PARA OPERACIONES EN OTRA MONEDA') returning_values (:ctadif);
            CUENTA = NULL;
            EXECUTE PROCEDURE VALIDE_CUENTA_C (ctadif) RETURNING_VALUES (:OK);
            IF (OK = 0) THEN
                SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS_NIIF
                    WHERE CUEN_COD = :ctadif INTO :CUENTA, :TIPOCUEN;
            ELSE
                begin
                EXECUTE PROCEDURE ERRORINT(62, :IDDOC, :ctadif, 2);
                CUENTA = ctadif;
                TIPOCUEN = 'N';
                ERRORI = ERRORI + 1;
                end
            if (TIPOCUEN = 'I') then
                BEGIN
                EXECUTE PROCEDURE ERRORINT(62, :IDDOC, :CUENTA, 3);
                TIPOCUEN = 'N';
                ERRORI = ERRORI + 1;
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                EXECUTE PROCEDURE ERRORINT(62, :IDDOC, :CUENTA, 4);
                TIPOCUEN = 'N';
                ERRORI = ERRORI + 1;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                if (DIFCAMBIO > 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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :difcambio, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', ABS(:difcambio), 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA - difcambio;
                END
            END
        /* RETEFUENTE DEL CRUCE */
        SELECT first 1 INCJ_RTFTE, INCJ_RTIVA, INCJ_RTICA, INCJ_RTCREE, INCJ_CTARTFTE, INCJ_CTARTIVA, INCJ_CTARTICA, INCJ_CTARTCREE
            FROM INTERFAZ_CAJA WHERE tido_cod = 61 into :RTFTER, :RTIVAR, :RTICAR, :RTCREER, CTARTFTER, :CTARTIVAR, :CTARTICAR, :CTARTCREER;
        SELECT SUM(EGCC_RTFTE) FROM egresos_crucec WHERE EGRE_ID = :iddoc INTO :rtftec;
        IF ((rtftec IS NOT NULL) AND (rtftec <> 0)) THEN
            BEGIN
            if ((RTFTER = 'T') or (RTFTER = 'K')) then
                BEGIN
                if (RTFTER = 'T') then
                    SELECT TERC_CTARTFTE FROM TERCEROS WHERE TERC_NIT = :NIT INTO CTARTFTER;
                CUENTA = NULL;
                EXECUTE PROCEDURE VALIDE_CUENTA_C (ctartfter) RETURNING_VALUES (:OK);
                IF (OK = 0) THEN
                    SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS_NIIF
                        WHERE CUEN_COD = :ctartfter INTO :CUENTA, :TIPOCUEN;
                ELSE
                    begin
                    EXECUTE PROCEDURE ERRORINT(62, :IDDOC, :ctartfter, 2);
                    CUENTA = ctartfter;
                    TIPOCUEN = 'N';
                    ERRORI = ERRORI + 1;
                    end
                if (TIPOCUEN = 'I') then
                    BEGIN
                    EXECUTE PROCEDURE ERRORINT(62, :IDDOC, :CUENTA, 3);
                    TIPOCUEN = 'N';
                    ERRORI = ERRORI + 1;
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    EXECUTE PROCEDURE ERRORINT(62, :IDDOC, :CUENTA, 4);
                    TIPOCUEN = 'N';
                    ERRORI = ERRORI + 1;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    if (rtftec > 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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :rtftec, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, abs(:rtftec), 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    SUMA = SUMA + rtftec;
                    END
                END
            END
        /* RETEIVA DEL CRUCE */
        SELECT SUM(EGCC_RTIVA) FROM egresos_crucec WHERE EGRE_ID = :iddoc INTO :rtivac;
        IF ((rtivac IS NOT NULL) AND (rtivac <> 0)) THEN
            BEGIN
            if ((RTIVAR = 'T') or (RTIVAR = 'K')) then
                BEGIN
                if (RTIVAR = 'T') then
                    SELECT TERC_CTARTIVA FROM TERCEROS WHERE TERC_NIT = :NIT INTO CTARTIVAR;
                CUENTA = NULL;
                EXECUTE PROCEDURE VALIDE_CUENTA_C (ctartivar) RETURNING_VALUES (:OK);
                IF (OK = 0) THEN
                    SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS_NIIF
                        WHERE CUEN_COD = :ctartivar INTO :CUENTA, :TIPOCUEN;
                ELSE
                    begin
                    EXECUTE PROCEDURE ERRORINT(62, :IDDOC, :ctartivar, 2);
                    CUENTA = ctartivar;
                    TIPOCUEN = 'N';
                    ERRORI = ERRORI + 1;
                    end
                if (TIPOCUEN = 'I') then
                    BEGIN
                    EXECUTE PROCEDURE ERRORINT(62, :IDDOC, :CUENTA, 3);
                    TIPOCUEN = 'N';
                    ERRORI = ERRORI + 1;
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    EXECUTE PROCEDURE ERRORINT(62, :IDDOC, :CUENTA, 4);
                    TIPOCUEN = 'N';
                    ERRORI = ERRORI + 1;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    if (rtivac > 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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :rtivac, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, abs(:rtivac), 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    SUMA = SUMA + rtivac;
                    END
                END
            END
        /* RETEICA DEL CRUCE */
        SELECT SUM(EGCC_RTICA) FROM egresos_crucec WHERE EGRE_ID = :iddoc INTO :rticac;
        IF ((rticac IS NOT NULL) AND (rtivac <> 0)) THEN
            BEGIN
            if ((RTICAR = 'T') or (RTICAR = 'K')) then
                BEGIN
                if (RTICAR = 'T') then
                    SELECT TERC_CTARTICA FROM TERCEROS WHERE TERC_NIT = :NIT INTO CTARTICAR;
                CUENTA = NULL;
                EXECUTE PROCEDURE VALIDE_CUENTA_C (ctarticar) RETURNING_VALUES (:OK);
                IF (OK = 0) THEN
                    SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS_NIIF
                        WHERE CUEN_COD = :ctarticar INTO :CUENTA, :TIPOCUEN;
                ELSE
                    begin
                    EXECUTE PROCEDURE ERRORINT(62, :IDDOC, :ctarticar, 2);
                    CUENTA = ctarticar;
                    TIPOCUEN = 'N';
                    ERRORI = ERRORI + 1;
                    end
                if (TIPOCUEN = 'I') then
                    BEGIN
                    EXECUTE PROCEDURE ERRORINT(62, :IDDOC, :CUENTA, 3);
                    TIPOCUEN = 'N';
                    ERRORI = ERRORI + 1;
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    EXECUTE PROCEDURE ERRORINT(62, :IDDOC, :CUENTA, 4);
                    TIPOCUEN = 'N';
                    ERRORI = ERRORI + 1;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    if (rticac > 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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :rticac, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, abs(:rticac), 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    SUMA = SUMA + rticac;
                    END
                END
            END
        /* RETECREE DEL CRUCE */
        SELECT SUM(EGCC_RCREE) FROM egresos_crucec WHERE EGRE_ID = :iddoc INTO :rtcreec;
        IF ((rtcreec IS NOT NULL) AND (rtcreec <> 0)) THEN
            BEGIN
            if ((rtcreer = 'T') or (rtcreer = 'K')) then
                BEGIN
                if (rtcreer = 'T') then
                    SELECT TERC_CTARTICA FROM TERCEROS WHERE TERC_NIT = :NIT INTO ctartcreer;
                CUENTA = NULL;
                EXECUTE PROCEDURE VALIDE_CUENTA_C (ctarticar) RETURNING_VALUES (:OK);
                IF (OK = 0) THEN
                    SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS_NIIF
                        WHERE CUEN_COD = :ctartcreer INTO :CUENTA, :TIPOCUEN;
                ELSE
                    begin
                    EXECUTE PROCEDURE ERRORINT(62, :IDDOC, :ctartcreer, 2);
                    CUENTA = ctartcreer;
                    TIPOCUEN = 'N';
                    ERRORI = ERRORI + 1;
                    end
                if (TIPOCUEN = 'I') then
                    BEGIN
                    EXECUTE PROCEDURE ERRORINT(62, :IDDOC, :CUENTA, 3);
                    TIPOCUEN = 'N';
                    ERRORI = ERRORI + 1;
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    EXECUTE PROCEDURE ERRORINT(62, :IDDOC, :CUENTA, 4);
                    TIPOCUEN = 'N';
                    ERRORI = ERRORI + 1;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    if (rtcreec > 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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :rtcreec, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, abs(:rtcreec), 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    SUMA = SUMA + rtcreec;
                    END
                END
            END
        END /* cruces */

    if (DTO = 'K') then /* DTO EN CTA CONSTANTE */
        BEGIN
        if (VRDTO <> 0) then
            BEGIN
            CUENTA = NULL;
            EXECUTE PROCEDURE VALIDE_CUENTA_C (CTADTO) RETURNING_VALUES (:OK);
            IF (OK = 0) THEN
                SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS_NIIF
                    WHERE CUEN_COD = :CTADTO INTO :CUENTA, :TIPOCUEN;
            ELSE
                begin
                EXECUTE PROCEDURE ERRORINT(62, :IDDOC, :CTADTO, 2);
                CUENTA = CTADTO;
                TIPOCUEN = 'N';
                ERRORI = ERRORI + 1;
                end
            if (TIPOCUEN = 'I') then
                BEGIN
                EXECUTE PROCEDURE ERRORINT(62, :IDDOC, :CUENTA, 3);
                TIPOCUEN = 'N';
                ERRORI = ERRORI + 1;
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                EXECUTE PROCEDURE ERRORINT(62, :IDDOC, :CUENTA, 4);
                TIPOCUEN = 'N';
                ERRORI = ERRORI + 1;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                if (vrdto > 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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRDTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', abs(:VRDTO), 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA - VRDTO;
                END
            END /* VRDTO <> 0 */
        END /* DTO EN CTA CONSTANTE */

    /* LA DIFERENCIA EN CAMBIO */
    SELECT SUM(EGDE_DIFCAMBIO) FROM egresos_detalle WHERE EGRE_ID = :iddoc INTO :DIFCAMBIO;
    IF ((DIFCAMBIO IS NOT NULL) AND (DIFCAMBIO <> 0)) THEN
        BEGIN
        if (DIFCAMBIO > 0) then
            execute procedure lee_configuracion('GENERAL','GENERAL','CUENTA DE GASTO POR DIFERENCIA EN CAMBIO PARA OPERACIONES EN OTRA MONEDA') returning_values (:ctadif);
        else
            execute procedure lee_configuracion('GENERAL','GENERAL','CUENTA DE INGRESO POR DIFERENCIA EN CAMBIO PARA OPERACIONES EN OTRA MONEDA') returning_values (:ctadif);
        CUENTA = NULL;
        EXECUTE PROCEDURE VALIDE_CUENTA_C (ctadif) RETURNING_VALUES (:OK);
        IF (OK = 0) THEN
            SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS_NIIF
                WHERE CUEN_COD = :ctadif INTO :CUENTA, :TIPOCUEN;
        ELSE
            begin
            EXECUTE PROCEDURE ERRORINT(62, :IDDOC, :ctadif, 2);
            CUENTA = ctadif;
            TIPOCUEN = 'N';
            ERRORI = ERRORI + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            EXECUTE PROCEDURE ERRORINT(62, :IDDOC, :CUENTA, 3);
            TIPOCUEN = 'N';
            ERRORI = ERRORI + 1;
            END
        if (TIPOCUEN = 'C') then
            BEGIN
            EXECUTE PROCEDURE ERRORINT(62, :IDDOC, :CUENTA, 4);
            TIPOCUEN = 'N';
            ERRORI = ERRORI + 1;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            if (DIFCAMBIO > 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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :difcambio, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, ABS(:difcambio), 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            SUMA = SUMA + difcambio;
            END
        END
    /* RETENCION FUENTE */
    if ((RTFTE = 'T') or (RTFTE = 'K')) then
      if (VRRTFTE <> 0) then
        BEGIN
        if (RTFTE = 'T') then
            CTARTFTE = TCTARTFTE;
        CUENTA = NULL;
        EXECUTE PROCEDURE VALIDE_CUENTA_C (CTARTFTE) RETURNING_VALUES (:OK);
        IF (OK = 0) THEN
            SELECT CUEN_COD, CUEN_RETENCION, CUEN_TIPO FROM CUENTAS_NIIF
                WHERE CUEN_COD = :CTARTFTE INTO :CUENTA, :ES_RETENCION, :TIPOCUEN;
        ELSE
            begin
            EXECUTE PROCEDURE ERRORINT(62, :IDDOC, :CTARTFTE, 2);
            CUENTA = CTARTFTE;
            TIPOCUEN = 'N';
            ERRORI = ERRORI + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            EXECUTE PROCEDURE ERRORINT(62, :IDDOC, :CUENTA, 3);
            TIPOCUEN = 'N';
            ERRORI = ERRORI + 1;
            END
        if (TIPOCUEN = 'C') then
            BEGIN
            EXECUTE PROCEDURE ERRORINT(62, :IDDOC, :CUENTA, 4);
            TIPOCUEN = 'N';
            ERRORI = ERRORI + 1;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            if (ES_RETENCION = 'S') then
                BEGIN
                VRBASE = (VRTOTAL+VRRTFTE)*-1;
                SELECT PROV_RETEFTE from proveedores where terc_nit = :NIT INTO :PORC;
                END
            ELSE
                BEGIN
                VRBASE = 0;
                PORC = 0;
                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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTFTE, :VRBASE, :PORC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            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;
        EXECUTE PROCEDURE VALIDE_CUENTA_C (CTARTIVA) RETURNING_VALUES (:OK);
        IF (OK = 0) THEN
            SELECT CUEN_COD, CUEN_RETENCION, CUEN_TIPO FROM CUENTAS_NIIF
                WHERE CUEN_COD = :CTARTIVA INTO :CUENTA, :ES_RETENCION, :TIPOCUEN;
        ELSE
            begin
            EXECUTE PROCEDURE ERRORINT(62, :IDDOC, :CTARTIVA, 2);
            CUENTA = CTARTIVA;
            TIPOCUEN = 'N';
            ERRORI = ERRORI + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            EXECUTE PROCEDURE ERRORINT(62, :IDDOC, :CUENTA, 3);
            TIPOCUEN = 'N';
            ERRORI = ERRORI + 1;
            END
        if (TIPOCUEN = 'C') then
            BEGIN
            EXECUTE PROCEDURE ERRORINT(62, :IDDOC, :CUENTA, 4);
            TIPOCUEN = 'N';
            ERRORI = ERRORI + 1;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            if (ES_RETENCION = 'S') then
                BEGIN
                VRBASE = VRTOTAL;
                SELECT PROV_RTEIVA from proveedores where terc_nit = :NIT INTO :PORC;
                END
            ELSE
                BEGIN
                VRBASE = 0;
                PORC = 0;
                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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTIVA, :VRBASE, :PORC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            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;
        EXECUTE PROCEDURE VALIDE_CUENTA_C (CTARTICA) RETURNING_VALUES (:OK);
        IF (OK = 0) THEN
            SELECT CUEN_COD, CUEN_RETENCION, CUEN_TIPO FROM CUENTAS_NIIF
                WHERE CUEN_COD = :CTARTICA INTO :CUENTA, :ES_RETENCION, :TIPOCUEN;
        ELSE
            begin
            EXECUTE PROCEDURE ERRORINT(62, :IDDOC, :CTARTICA, 2);
            CUENTA = CTARTICA;
            TIPOCUEN = 'N';
            ERRORI = ERRORI + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            EXECUTE PROCEDURE ERRORINT(62, :IDDOC, :CUENTA, 3);
            TIPOCUEN = 'N';
            ERRORI = ERRORI + 1;
            END
        if (TIPOCUEN = 'C') then
            BEGIN
            EXECUTE PROCEDURE ERRORINT(62, :IDDOC, :CUENTA, 4);
            TIPOCUEN = 'N';
            ERRORI = ERRORI + 1;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            if (ES_RETENCION = 'S') then
                BEGIN
                VRBASE = VRTOTAL;
                SELECT PROV_RTEICA from proveedores where terc_nit = :NIT INTO :PORC;
                END
            ELSE
                BEGIN
                VRBASE = 0;
                PORC = 0;
                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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTICA, :VRBASE, :PORC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            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;
        EXECUTE PROCEDURE VALIDE_CUENTA_C (ctartcree) RETURNING_VALUES (:OK);
        IF (OK = 0) THEN
            SELECT CUEN_COD, CUEN_RETENCION, CUEN_TIPO FROM CUENTAS_NIIF
                WHERE CUEN_COD = :ctartcree INTO :CUENTA, :ES_RETENCION, :TIPOCUEN;
        ELSE
            begin
            EXECUTE PROCEDURE ERRORINT(62, :IDDOC, :ctartcree, 2);
            CUENTA = ctartcree;
            TIPOCUEN = 'N';
            ERRORI = ERRORI + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            EXECUTE PROCEDURE ERRORINT(62, :IDDOC, :CUENTA, 3);
            TIPOCUEN = 'N';
            ERRORI = ERRORI + 1;
            END
        if (TIPOCUEN = 'C') then
            BEGIN
            EXECUTE PROCEDURE ERRORINT(62, :IDDOC, :CUENTA, 4);
            TIPOCUEN = 'N';
            ERRORI = ERRORI + 1;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            if (ES_RETENCION = 'S') then
                BEGIN
                VRBASE = VRTOTAL;
                SELECT PROV_RTCREE from proveedores where terc_nit = :NIT INTO :PORC;
                END
            ELSE
                BEGIN
                VRBASE = 0;
                PORC = 0;
                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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :vrrtcree, :VRBASE, :PORC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            SUMA = SUMA - vrrtcree;
            END
        END /* RTCREE */
    /* RECORRA LAS CUENTAS DE EGRESOS_CONTABILIDAD */
    FOR SELECT CUEN_COD, EGCO_NIT, EGCO_PROY, EGCO_CENTRO, EGCO_CONC, EGCO_DEBITOS, EGCO_CREDITOS, EGCO_BASEM, EGCO_PORC
        FROM EGRESOS_CONTABILIDAD WHERE EGRE_ID = :IDDOC ORDER BY EGCO_ITEM
        INTO :CTABASE, :NIT, :PROY, :CENTRO, :CONC, :DEBITO, :CREDITO, :MONTOBASE, :PORC
        DO
        BEGIN
        CUENTA = NULL;
        EXECUTE PROCEDURE VALIDE_CUENTA_C (CTABASE) RETURNING_VALUES (:OK);
        IF (OK = 0) THEN
            SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS_NIIF
                WHERE CUEN_COD = :CTABASE INTO :CUENTA, :TIPOCUEN;
        ELSE
            begin
            EXECUTE PROCEDURE ERRORINT(62, :IDDOC, :CTABASE, 2);
            CUENTA = CTABASE;
            TIPOCUEN = 'N';
            ERRORI = ERRORI + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            EXECUTE PROCEDURE ERRORINT(62, :IDDOC, :CUENTA, 3);
            TIPOCUEN = 'N';
            ERRORI = ERRORI + 1;
            END
        if (TIPOCUEN = 'C') then
            BEGIN
            EXECUTE PROCEDURE ERRORINT(62, :IDDOC, :CUENTA, 4);
            TIPOCUEN = 'N';
            ERRORI = ERRORI + 1;
            END
        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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :DEBITO, :CREDITO, :MONTOBASE, :PORC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
        SUMA = SUMA + DEBITO - CREDITO;
        NROI = NROI + 1;
        END
    /* CIERRE EL COMPROBANTE CONTRA LA CUENTA DEL TERCERO O LA BASE CONSTANTE */
    if (SUMA <> 0) THEN
        BEGIN
        if (SUMA < 0) then
            BEGIN
            DEBITO = SUMA * -1;
            CREDITO = 0;
            END
        ELSE
            BEGIN
            DEBITO = 0;
            CREDITO = SUMA;
            END
        if ((BASE = 'F') or (BASE = 'T') or (BASE = 'K')) then
            BEGIN
            if (BASE = 'T') then
                CTABASE = TCTACLIEN;
            if (BASE = 'F') then
                BEGIN
                SELECT CAJA_CUENTA FROM EGRESOS E, CAJAS C
                    WHERE C.CAJA_ID = E.CAJA_ID AND EGRE_ID = :IDDOC INTO :CTABASE;
                END
            CUENTA = NULL;
            EXECUTE PROCEDURE VALIDE_CUENTA_C (CTABASE) RETURNING_VALUES (:OK);
            IF (OK = 0) THEN
                SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS_NIIF
                    WHERE CUEN_COD = :CTABASE INTO :CUENTA, :TIPOCUEN;
            ELSE
                begin
                EXECUTE PROCEDURE ERRORINT(62, :IDDOC, :CTABASE, 2);
                CUENTA = CTABASE;
                TIPOCUEN = 'N';
                ERRORI = ERRORI + 1;
                end
            if (TIPOCUEN = 'I') then
                BEGIN
                EXECUTE PROCEDURE ERRORINT(62, :IDDOC, :CUENTA, 3);
                TIPOCUEN = 'N';
                ERRORI = ERRORI + 1;
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                /* DEBERIA RECORRER DOCUMENTO POR DOCUMENTO */
                FOR SELECT RCDE_TIPODOC, RCDE_PREFIJO, RCDE_NUMERO, RCDE_ABONO+RCDE_RTFTE+RCDE_RTIVA+RCDE_RTICA+RCDE_DTOF
                    FROM RECIBOS_CAJA_DETALLE WHERE RECA_ID = :IDDOC
                    INTO :TIPOIT, PREFIT, NUMIT, ABONOIT
                    DO
                    BEGIN
                    NUMEROIT = PREFIT || NUMIT;
                    INSERT INTO CONTABILIZACION_DET (CNTB_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)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :ABONOIT, 0, 0, :NIT, :PROY, :CENTRO, NULL, :NUMEROIT, NULL, NULL, :TIPOIT, 0);
                    NROI = NROI + 1;
                    END
                END
            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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :DEBITO, :CREDITO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            END /* SUMA EN CARTERA */
        if (BASE = 'D') then
            BEGIN
            execute procedure lee_configuracion('CXPAGAR','SALDOS','DESCONTAR RETENCIONES POR CAUSACION') returning_values (RET);
            CTABASE = NULL;
            NITBCO = NIT; /* LOS DOCUMENTOS PUEDEN ESTAR CAUSADOS A OTRO NIT, GUARDE EL NIT DEL ENCABEZADO */
            FOR SELECT EGDE_TIPODOC, EGDE_IDDOC, EGDE_PREFIJO, EGDE_NUMERO, EGDE_ABONO+EGDE_DTOF, EGDE_RTFTE+EGDE_RTIVA+EGDE_RTICA, EGDE_NUMPROV
                FROM EGRESOS_DETALLE WHERE EGRE_ID = :IDDOC INTO :tipoit, :IDIT, :PREFIT, :NUMIT, :suma, :RTIT, :NUMPROV
                DO
                BEGIN
                if (TIPOIT <> 55) then
                    SELECT FIRST 1 CUEN_COD, D.TERC_NIT, PROY_COD, CENT_COD FROM COMPROBANTE_ENCABEZADO E, COMPROBANTE_DETALLE D
                        WHERE E.enco_consec = D.enco_consec AND E.enco_tiporef = :TIPOIT AND E.enco_idref = :IDIT AND
                        ((SUBSTR(CUEN_COD,1,1) = '2') or (SUBSTR(CUEN_COD,1,2) = '13'))  AND SUBSTR(CUEN_COD,1,3) <> '236' AND SUBSTR(CUEN_COD,1,4) <> '2408'
                        AND ((((:TIPOIT = 21) OR (:TIPOIT = 51)) AND (CODE_CREDITO <> 0)) or (((:TIPOIT = 24) OR (:TIPOIT = 52)) AND (CODE_DEBITO <> 0)))
                        ORDER BY D.code_item
                        INTO :ctabase, :nit, :proy, :centro;
                else
                    BEGIN
                    execute procedure lee_configuracion('CAJA', 'EGRESOS', 'CUENTA CONTABLE PARA LOS ANTICIPOS A ACREEDORES SI LA INTERFAZ ES POR DOCUMENTO') returning_values (ctabase);
                    if ((ctabase is null) or (ctabase = '')) then
                        BEGIN
                        SELECT TERC_NIT from anticipos_proveedor WHERE ANPR_ID = :IDDOC INTO :NIT;
                        SELECT GRPR_CTAANTI FROM grupos_proveedores G, proveedores C
                            WHERE C.TERC_NIT = :nit AND C.grpr_cod = G.grpr_cod INTO :ctabase;
                        if ((ctabase is null) or (ctabase = '')) then
                            CTABASE = TCTACLIEN;
                        END
                    END
                if ((ctabase is null) or (ctabase = '')) then
                    CTABASE = TCTACLIEN;
                CUENTA = NULL;
                EXECUTE PROCEDURE VALIDE_CUENTA_C (ctabase) RETURNING_VALUES (:OK);
                IF (OK = 0) THEN
                    SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS_NIIF
                        WHERE CUEN_COD = :CTABASE INTO :CUENTA, :TIPOCUEN;
                ELSE
                    begin
                    EXECUTE PROCEDURE ERRORINT(62, :IDDOC, :CTABASE, 2);
                    CUENTA = CTABASE;
                    TIPOCUEN = 'N';
                    ERRORI = ERRORI + 1;
                    end
                if (RET = 'NO') then
                    SUMA = SUMA + RTIT;
                if (SUMA < 0) then
                    BEGIN
                    CREDITO = SUMA * -1;
                    DEBITO = 0;
                    END
                ELSE
                    BEGIN
                    CREDITO = 0;
                    DEBITO = SUMA;
                    END
                if (TIPOCUEN = 'I') then
                    BEGIN
                    EXECUTE PROCEDURE ERRORINT(62, :IDDOC, :CUENTA, 3);
                    TIPOCUEN = 'N';
                    ERRORI = ERRORI + 1;
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    /* DEBERIA RECORRER DOCUMENTO POR DOCUMENTO */
                    NUMEROIT = PREFIT || NUMIT;
                    INSERT INTO CONTABILIZACION_DET (CNTB_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)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, :NUMPROV, :debito, :credito, 0, 0, :NIT, :PROY, :CENTRO, NULL, :NUMEROIT, NULL, NULL, :TIPOIT, 0);
                    END
                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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, :NUMPROV, :DEBITO, :CREDITO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                END /* SUMA EN CARTERA */
            NIT = NITBCO; /* RESTAURE EL NIT DEL ENCABEZADO */
            END
        END
    /* recorra las cuentas adicionales */
    FOR SELECT INJC_CUENTA, INJC_BASE, INJC_PORC, INJC_VALOR, INJC_DB
        FROM INTERFAZ_CAJA_CTAS
        WHERE INCJ_ID = :IDINTER
        INTO :CTADIC, :BASEADIC, :PORCADIC, :VALORADIC, :DBADIC
        DO
        BEGIN
        if (:BASEADIC = 'TOTAL') then
            VALORADIC = VRTOTAL;
        if (:BASEADIC = 'DESCUENTO') then
            VALORADIC = VRDTO;
        if (:BASEADIC = 'RTFTE') then
            VALORADIC = VRRTFTE;
        if (:BASEADIC = 'RTIVA') then
            VALORADIC = VRRTIVA;
        if (:BASEADIC = 'RTICA') then
            VALORADIC = VRRTICA;
        MONTO = VALORADIC * PORCADIC / 100;
        CUENTA = NULL;
        EXECUTE PROCEDURE VALIDE_CUENTA_C (CTADIC) RETURNING_VALUES (:OK);
        IF (OK = 0) THEN
            SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS_NIIF
                WHERE CUEN_COD = :CTADIC INTO :CUENTA, :TIPOCUEN;
        ELSE
            begin
            EXECUTE PROCEDURE ERRORINT(62, :IDDOC, :CTADIC, 2);
            CUENTA = CTADIC;
            TIPOCUEN = 'N';
            ERRORI = ERRORI + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            EXECUTE PROCEDURE ERRORINT(62, :IDDOC, :CUENTA, 3);
            TIPOCUEN = 'N';
            ERRORI = ERRORI + 1;
            END
        if (TIPOCUEN = 'C') then
            BEGIN
            EXECUTE PROCEDURE ERRORINT(62, :IDDOC, :CUENTA, 4);
            TIPOCUEN = 'N';
            ERRORI = ERRORI + 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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTADIC, :CONC, '', :MONTO, 0, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTADIC, :CONC, '', 0, :MONTO, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            END
        NROI = NROI + 1;
        END
    if (ERRORi > 0) then
        VER = 'S';
    SUSPEND;
    END /* EXISTE LA INTERFAZ */
  ELSE
    BEGIN
    EXECUTE PROCEDURE ERRORINT(62, :IDDOC, :PREF, 1);
    ERRORI = ERRORI + 1;
    VER = 'S';
    SUSPEND;
    END
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER procedure CONTABIL_ENSAMBLE_NIIF (
    IDDOC integer,
    IDINTER integer,
    IDC integer)
returns (
    ERROR integer,
    VER char(1))
AS
declare variable PREFIJO VARCHAR(4);
declare variable CONCEPTO CHAR(60);
declare variable BASE CHAR(1);
declare variable IVAV CHAR(1);
declare variable CONSUMO CHAR(1);
declare variable TOTAL CHAR(1);
declare variable CTABASE VARCHAR(20);
declare variable CTAIVA VARCHAR(20);
declare variable CTACONSUMO VARCHAR(20);
declare variable CTACIERRE 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 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 VRBASE NUMERIC(18,2);
declare variable VRIVA NUMERIC(18,2);
declare variable VRCONSUMO NUMERIC(18,2);
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 ANULADO CHAR(1);
declare variable CENT CHAR(1);
BEGIN
  /* BUSQUE LA INTERFACE */
  EXISTE = 'N';
  SELECT 'S', PREF_PRE, N.ININ_BASE, N.ININ_IVAV, N.ININ_CONSUMO, N.ININ_TOTAL, N.ININ_CTABASE, N.ININ_CTAIVA, N.ININ_CTACONSUMO, N.ININ_CTACIERRE, ININ_CONFIRMAR, ININ_CENTRO
    FROM INTERFAZ_INVENTARIO I, interfaz_inventario_niif N
    WHERE I.ININ_ID = :IDINTER AND I.inin_id = N.inin_id
    INTO :EXISTE, :PREFIJO, :BASE, :IVAV, :CONSUMO, :TOTAL, :CTABASE, :CTAIVA, :CTACONSUMO, :CTACIERRE, :VER, :CENT;
  if (EXISTE = 'S') then
    BEGIN
    EXECUTE PROCEDURE LEE_CONFIGURACION('CONTABILIDAD', 'GENERAL', 'NIT COMPAÑIA') RETURNING_VALUES (:NIT);
    /* TRAIGA EL ENCABEZADO DEL ENSAMBLE */
    SELECT PREF_PRE, ENSA_CONC, ENSA_ANULADO
        FROM ENSAMBLES
        WHERE ENSA_ID = :IDDOC
        INTO :PREFIJO, :CONCEPTO, :ANULADO;
    if (ANULADO = 'N') then
        BEGIN
        if (CENT = 'B') then
            SELECT BODE_CENTRO, BODE_PROY FROM BODEGA B, ENSAMBLES E
                WHERE B.BODE_COD = E.BODE_COD AND E.ENSA_ID = :IDDOC INTO :CENTRO, :PROY;
        ELSE
            SELECT PREF_CENTRO, PREF_PROY FROM PREFIJOS P, ENSAMBLES E
                WHERE P.PREF_PRE = E.PREF_PRE AND E.ENSA_ID = :IDDOC AND P.TIDO_COD = 15 INTO :CENTRO, :PROY;
        NUMITEMS = 100000;
        SUMA = 0;
        ERROR = 0;
        /* PRIMERO EL PRODUCTO */
        if (BASE = 'A') then
            BEGIN
            /* SUME LAS BASES DE LOS ARTICULOS DEL DOCUMENTO */
            FOR SELECT MAX(COAR_CTAINV), SUM(cast(ESDE_CANT as double precision) * ESDE_COSTO), SUM(ESDE_IVAMONTO + ESDE_CONSUMO)
                FROM ARTICULO A, CONTABIL_ARTICULO_NIIF C, ENSAMBLES_DETALLE D, ENSAMBLES E
                WHERE E.ENSA_ID = :IDDOC AND E.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND E.ENSA_ID = D.ENSA_ID
                GROUP BY COAR_CTAINV
                INTO :CTABASE, :MONTO, :IMPTOS
            DO
                BEGIN
                VRBASE = MONTO;
                if (MONTO <> 0) then
                    BEGIN
                    /* TRAIGA LAS CARACTERISTICAS DE LA CUENTA */
                    SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS_NIIF
                        WHERE CUEN_COD = :CTABASE INTO :CUENTA, :TIPOCUEN;
                    if (CUENTA IS NULL) then
                        begin
                        EXECUTE PROCEDURE ERRORINT(1015, :IDDOC, :CTABASE, 2);
                        CUENTA = CTABASE;
                        ERROR = ERROR + 1;
                        end
                    if (TIPOCUEN = 'I') then
                        BEGIN
                        SELECT ARTI_COD FROM ENSAMBLES WHERE ENSA_ID = :iddoc INTO :ARTICULO;
                        INSERT INTO CONTABILIZACION_DET (CNTB_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)
                            VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ARTICULO, 0, 0);
                        NUMITEMS = NUMITEMS + 1;
                        SUMA = SUMA + MONTO;
                        END
                    if (TIPOCUEN = 'C') then
                        BEGIN
                        EXECUTE PROCEDURE ERRORINT(1015, :IDDOC, :CUENTA, 4);
                        TIPOCUEN = 'N';
                        ERROR = ERROR + 1;
                        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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                        NUMITEMS = NUMITEMS + 1;
                        SUMA = SUMA + MONTO;
                        END
                    END
                END /* FOR */

            /* LOS COMPONENTES */
            FOR SELECT MAX(COAR_CTAINV), SUM(cast(ESDE_CANT as double precision) * ESDE_COSTO), SUM(ESDE_IVAMONTO + ESDE_CONSUMO)
                FROM ARTICULO A, CONTABIL_ARTICULO_NIIF C, ENSAMBLES_DETALLE E
                WHERE E.ENSA_ID = :IDDOC AND E.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD
                GROUP BY COAR_CTAINV
                INTO :CTABASE, :MONTO, :IMPTOS
            DO
                BEGIN
                VRBASE = MONTO;
                if (MONTO <> 0) then
                    BEGIN
                    /* TRAIGA LAS CARACTERISTICAS DE LA CUENTA */
                    SELECT CUEN_COD,CUEN_TIPO FROM CUENTAS_NIIF
                        WHERE CUEN_COD = :CTABASE INTO :CUENTA, :TIPOCUEN;
                    if (CUENTA IS NULL) then
                        begin
                        EXECUTE PROCEDURE ERRORINT(1015, :IDDOC, :CTABASE, 2);
                        CUENTA = CTABASE;
                        ERROR = ERROR + 1;
                        end
                    if (TIPOCUEN = 'I') then
                        BEGIN
                        /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                        FOR SELECT E.ARTI_COD, (cast(ESDE_CANT as double precision) * ESDE_COSTO), (ESDE_IVAMONTO + ESDE_CONSUMO)
                            FROM ARTICULO A, CONTABIL_ARTICULO_NIIF C, ENSAMBLES_DETALLE E
                            WHERE E.ENSA_ID = :IDDOC AND E.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND COAR_CTAINV = :CUENTA
                            INTO :ARTICULO, :MONTO, :IMPTOS
                        DO
                            BEGIN
                            if (IMPINC = 'S') then
                                MONTO = MONTO - IMPTOS;
                            if (MONTO <> 0) then
                                BEGIN
                                INSERT INTO CONTABILIZACION_DET (CNTB_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)
                                    VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ARTICULO, 0, 0);
                                NUMITEMS = NUMITEMS + 1;
                                SUMA = SUMA - MONTO;
                                END
                            END
                        END
                    if (TIPOCUEN = 'C') then
                        BEGIN
                        EXECUTE PROCEDURE ERRORINT(1015, :IDDOC, :CUENTA, 4);
                        TIPOCUEN = 'N';
                        ERROR = ERROR + 1;
                        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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                        NUMITEMS = NUMITEMS + 1;
                        SUMA = SUMA - MONTO;
                        END
                    END
                END /* FOR */
            END /* BASE */
        if (BASE = 'K') then
            BEGIN
            /* SUME LAS BASES DE LOS ARTICULOS DEL DOCUMENTO */
            SELECT SUM(cast(ESDE_CANT as double precision) * ESDE_COSTO), SUM(ESDE_IVAMONTO + ESDE_CONSUMO)
                FROM ENSAMBLES_DETALLE E
                WHERE E.ENSA_ID = :IDDOC
                INTO :MONTO, :IMPTOS;
            if (MONTO <> 0) then
                BEGIN
                /* TRAIGA LAS CARACTERISTICAS DE LA CUENTA */
                SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS_NIIF
                    WHERE CUEN_COD = :CTABASE INTO :CUENTA, :TIPOCUEN;
                if (CUENTA IS NULL) then
                    begin
                    EXECUTE PROCEDURE ERRORINT(1015, :IDDOC, :CTABASE, 2);
                    CUENTA = CTABASE;
                    ERROR = ERROR + 1;
                    end
                if (TIPOCUEN = 'I') then
                    BEGIN
                    SELECT ARTI_COD FROM ENSAMBLES WHERE ENSA_ID = :IDDOC INTO :ARTICULO;
                    INSERT INTO CONTABILIZACION_DET (CNTB_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)
                        VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ARTICULO, 0, 0);
                    NUMITEMS = NUMITEMS + 1;
                    SUMA = SUMA + MONTO;
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    EXECUTE PROCEDURE ERRORINT(1015, :IDDOC, :CUENTA, 4);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NUMITEMS = NUMITEMS + 1;
                    SUMA = SUMA + MONTO;
                    END
                /* LOS COMPONENTES CON LA CUENTA DE CIERRE */
                SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS_NIIF
                    WHERE CUEN_COD = :ctacierre INTO :CUENTA, :TIPOCUEN;
                if (CUENTA IS NULL) then
                    begin
                    EXECUTE PROCEDURE ERRORINT(1015, :IDDOC, :CTABASE, 2);
                    CUENTA = CTABASE;
                    ERROR = ERROR + 1;
                    end
                if (TIPOCUEN = 'I') then
                    BEGIN
                    SELECT ARTI_COD FROM ENSAMBLES WHERE ENSA_ID = :IDDOC INTO :ARTICULO;
                    INSERT INTO CONTABILIZACION_DET (CNTB_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)
                        VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ARTICULO, 0, 0);
                    NUMITEMS = NUMITEMS + 1;
                    SUMA = SUMA - MONTO;
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    EXECUTE PROCEDURE ERRORINT(1015, :IDDOC, :CUENTA, 4);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NUMITEMS = NUMITEMS + 1;
                    SUMA = SUMA - MONTO;
                    END
                END
            END /* BASE K O T */
        /* recorra las cuentas adicionales */
        FOR SELECT INIC_CUENTA, INIC_BASE, INIC_PORC, INIC_VALOR, INIC_DB
            FROM INTERFAZ_INVENTARIO_CTAS
            WHERE ININ_ID = :IDINTER
            INTO :CUENTAADIC, :BASEADIC, :PORCADIC, :VALORADIC, :DBADIC
            DO
            BEGIN
            if (:BASEADIC = 'SUBTOTAL') then
                VALORADIC = VRBASE;
            if (:BASEADIC = 'IVA') then
                VALORADIC = VRIVA;
            if (:BASEADIC = 'CONSUMO') then
                VALORADIC = VRCONSUMO;
            if (:BASEADIC = 'TOTAL') then
                VALORADIC = VRBASE + VRIVA + VRCONSUMO;
            MONTO = VALORADIC * PORCADIC;
            if (MONTO <> 0) then
                BEGIN
                /* 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(1015, :IDDOC, :CUENTAADIC, 2);
                    CUENTA = CUENTAADIC;
                    ERROR = ERROR + 1;
                    end
                if (TIPOCUEN = 'I') then
                    BEGIN
                    EXECUTE PROCEDURE ERRORINT(1015, :IDDOC, :CUENTA, 3);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    EXECUTE PROCEDURE ERRORINT(1015, :IDDOC, :CUENTA, 4);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NUMITEMS, :CUENTAADIC, :CONCEPTO, '', :MONTO, 0, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                        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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NUMITEMS, :CUENTAADIC, :CONCEPTO, '', 0, :MONTO, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                        SUMA = SUMA - MONTO;
                        END
                    NUMITEMS = NUMITEMS + 1;
                    END
                END
            END
        END
      if (ERROR > 0) then
        VER = 'S';
      SUSPEND;
      END /* EXISTE LA INTERFAZ */
  ELSE
    BEGIN
    EXECUTE PROCEDURE ERRORINT(1015, :IDDOC, :PREFIJO, 1);
    ERROR = ERROR + 1;
    VER = 'S';
    SUSPEND;
    END
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER procedure CONTABIL_ENTRADA_NIIF (
    IDDOC integer,
    IDINTER integer,
    IDC integer)
returns (
    ERROR integer,
    VER char(1))
AS
declare variable PREFIJO VARCHAR(4);
declare variable NUMERO VARCHAR(8);
declare variable FECAUX DATE;
declare variable FECHA CHAR(8);
declare variable CONCEPTO CHAR(60);
declare variable TIPOCOMP VARCHAR(3);
declare variable PREFCONT VARCHAR(4);
declare variable BASE CHAR(1);
declare variable IVAV CHAR(1);
declare variable CONSUMO CHAR(1);
declare variable TOTAL CHAR(1);
declare variable CTABASE VARCHAR(20);
declare variable CTAIVA VARCHAR(20);
declare variable CTACONSUMO VARCHAR(20);
declare variable CTACIERRE 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 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 VRBASE NUMERIC(18,2);
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 PROV CHAR(1);
declare variable ANULADO CHAR(1);
declare variable CENT CHAR(1);
BEGIN
  /* BUSQUE LA INTERFACE */
  EXISTE = 'N';
  SELECT 'S', PREF_PRE, TICO_COD, PRCO_PREF, N.ININ_BASE, N.ININ_IVAV, N.ININ_CONSUMO, N.ININ_TOTAL, N.ININ_CTABASE, N.ININ_CTAIVA, N.ININ_CTACONSUMO, N.ININ_CTACIERRE, ININ_CONFIRMAR, ININ_CENTRO, ININ_CODPROY, ININ_CODCENT
    FROM INTERFAZ_INVENTARIO I, interfaz_inventario_niif N
    WHERE I.ININ_ID = :IDINTER AND I.inin_id = N.inin_id
    INTO :EXISTE, :PREFIJO, :TIPOCOMP, :PREFCONT, :BASE, :IVAV, :CONSUMO, :TOTAL, :CTABASE, :CTAIVA, :CTACONSUMO, :CTACIERRE, :VER, :CENT, :PROY, :centro;
  if (EXISTE = 'S') then
    BEGIN
    /* TRAIGA EL ENCABEZADO DE LA ENTRADA */
    SELECT PREF_PRE, ENTR_NUMERO, ENTR_FECHA, ENTR_CONC, TERC_NIT, ENTR_IMPTOS, ENTR_ANULADO
        FROM ENTRADAS
        WHERE ENTR_ID = :IDDOC
        INTO :PREFIJO, :NUMERO, :FECAUX, :CONCEPTO, :NIT, :IMPINC, :ANULADO;
    if ((NIT IS NULL) or (NIT = '')) then
        EXECUTE PROCEDURE LEE_CONFIGURACION('CONTABILIDAD', 'GENERAL', 'NIT COMPAÑIA') RETURNING_VALUES (:NIT);
        
    if (ANULADO = 'N') then
        BEGIN
        if (CENT = 'B') then
            SELECT BODE_CENTRO, BODE_PROY FROM BODEGA B, ENTRADAS E
                WHERE B.BODE_COD = E.BODE_COD AND E.ENTR_ID = :IDDOC INTO :CENTRO, :PROY;
        ELSE
          if (CENT = 'P') then
            SELECT PREF_CENTRO, PREF_PROY FROM PREFIJOS P, ENTRADAS E
                WHERE P.PREF_PRE = E.PREF_PRE AND P.TIDO_COD = 11 AND E.ENTR_ID = :IDDOC INTO :CENTRO, :PROY;
        /* CONVIERTA LA FECHA A CADENA */
        EXECUTE PROCEDURE FECHA_A_CONTA(:FECAUX) returning_values (:FECHA);
        NUMITEMS = 100000;
        SUMA = 0;
        ERROR = 0;
        /* PRIMERO LA BASE */
        if (BASE = 'A') then
            BEGIN
            /* SUME LAS BASES DE LOS ARTICULOS DEL DOCUMENTO */
            FOR SELECT MAX(COAR_CTAINV), SUM(CAST(ENDE_CANT AS DOUBLE PRECISION) * ENDE_COSTO), SUM(ENDE_IVAMONTO + (ENDE_CONSUMO * ENDE_CANT * ENDE_FACTOR))
                FROM ARTICULO A, CONTABIL_ARTICULO_NIIF C, ENTRADAS_DETALLE E
                WHERE E.ENTR_ID = :IDDOC AND E.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD
                GROUP BY COAR_CTAINV
                INTO :CTABASE, :MONTO, :IMPTOS
            DO
            if (MONTO <> 0) then
                BEGIN
                if (IMPINC = 'S') then
                    MONTO = MONTO - IMPTOS;
                VRBASE = MONTO;
                /* TRAIGA LAS CARACTERISTICAS DE LA CUENTA */
                SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS_NIIF
                    WHERE CUEN_COD = :CTABASE INTO :CUENTA, :TIPOCUEN;
                if (CUENTA IS NULL) then
                    begin
                    EXECUTE PROCEDURE ERRORINT(1011, :IDDOC, :CTABASE, 2);
                    CUENTA = CTABASE;
                    ERROR = ERROR + 1;
                    end
                /* DEPENDE DEL TIPO DE CUENTA */
                if ((TIPOCUEN = 'I') or (TIPOCUEN = 'A'))  then
                    BEGIN
                    /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                    FOR SELECT E.ARTI_COD, (CAST(ENDE_CANT AS DOUBLE PRECISION) * ENDE_COSTO), (ENDE_IVAMONTO + (ENDE_CONSUMO * ENDE_CANT * ENDE_FACTOR))
                        FROM ARTICULO A, CONTABIL_ARTICULO_NIIF C, ENTRADAS_DETALLE E
                        WHERE E.ENTR_ID = :IDDOC AND E.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND COAR_CTAINV = :CUENTA
                        INTO :ARTICULO, :MONTO, :IMPTOS
                    DO
                        BEGIN
                        if (IMPINC = 'S') then
                            MONTO = MONTO - IMPTOS;
                        IF (MONTO <> 0) THEN
                            BEGIN
                            INSERT INTO CONTABILIZACION_DET (CNTB_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)
                                VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ARTICULO, 0, 0);
                            NUMITEMS = NUMITEMS + 1;
                            SUMA = SUMA + MONTO;
                            END
                        END
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    EXECUTE PROCEDURE ERRORINT(1011, :IDDOC, :CUENTA, 4);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NUMITEMS = NUMITEMS + 1;
                    SUMA = SUMA + MONTO;
                    END
                END /* FOR */
            END /* BASE */
        if (BASE = 'I') then
            BEGIN
            /* SUME LAS BASES DE LOS ARTICULOS DEL DOCUMENTO */
            FOR SELECT MAX(TAIV_CTAINV), SUM(CAST(ENDE_CANT AS DOUBLE PRECISION) * ENDE_COSTO), SUM(ENDE_IVAMONTO + (ENDE_CONSUMO * ENDE_CANT * ENDE_FACTOR))
                FROM ARTICULO A, TARIFA_IVA I, ENTRADAS_DETALLE E
                WHERE E.ENTR_ID = :IDDOC AND E.ARTI_COD = A.ARTI_COD AND A.TAIV_COD = I.TAIV_COD
                GROUP BY TAIV_CTAINV
                INTO :CTABASE, :MONTO, :IMPTOS
            DO
            if (MONTO <> 0) then
                BEGIN
                if (IMPINC = 'S') then
                    MONTO = MONTO - IMPTOS;
                VRBASE = MONTO;
                /* TRAIGA LAS CARACTERISTICAS DE LA CUENTA */
                SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS_NIIF
                    WHERE CUEN_COD = :CTABASE INTO :CUENTA, :TIPOCUEN;
                if (CUENTA IS NULL) then
                    begin
                    EXECUTE PROCEDURE ERRORINT(1011, :IDDOC, :CTABASE, 2);
                    CUENTA = CTABASE;
                    ERROR = ERROR + 1;
                    end
                /* DEPENDE DEL TIPO DE CUENTA */
                if ((TIPOCUEN = 'I') or (TIPOCUEN = 'A'))  then
                    BEGIN
                    /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                    FOR SELECT E.ARTI_COD, (CAST(ENDE_CANT AS DOUBLE PRECISION) * ENDE_COSTO), (ENDE_IVAMONTO + (ENDE_CONSUMO * ENDE_CANT * ENDE_FACTOR))
                        FROM ARTICULO A, TARIFA_IVA I, ENTRADAS_DETALLE E
                        WHERE E.ENTR_ID = :IDDOC AND E.ARTI_COD = A.ARTI_COD AND A.TAIV_COD = I.TAIV_COD AND TAIV_CTAINV = :CUENTA
                        INTO :ARTICULO, :MONTO, :IMPTOS
                    DO
                        BEGIN
                        if (IMPINC = 'S') then
                            MONTO = MONTO - IMPTOS;
                        IF (MONTO <> 0) THEN
                            BEGIN
                            INSERT INTO CONTABILIZACION_DET (CNTB_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)
                                VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ARTICULO, 0, 0);
                            NUMITEMS = NUMITEMS + 1;
                            SUMA = SUMA + MONTO;
                            END
                        END
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    EXECUTE PROCEDURE ERRORINT(1011, :IDDOC, :CUENTA, 4);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NUMITEMS = NUMITEMS + 1;
                    SUMA = SUMA + MONTO;
                    END
                END /* FOR */
            END /* BASE */
        if ((BASE = 'K') or (BASE = 'T')) then
            BEGIN
            CUENTA = :ctabase;
            if (BASE = 'T') then
                BEGIN
                SELECT TERC_PROV, TERC_CTAVENTA FROM TERCEROS WHERE TERC_NIT = :NIT INTO :PROV, :CUENTA;
                if (:PROV = 'S') then
                    SELECT PROV_CTACAUSA FROM PROVEEDORES WHERE TERC_NIT = :NIT INTO :CUENTA;
                END
            /* SUME LAS BASES DE LOS ARTICULOS DEL DOCUMENTO */
            SELECT SUM(CAST(ENDE_CANT AS DOUBLE PRECISION) * ENDE_COSTO), SUM(ENDE_IVAMONTO + (ENDE_CONSUMO * ENDE_CANT * ENDE_FACTOR))
                FROM ENTRADAS_DETALLE E
                WHERE E.ENTR_ID = :IDDOC
                INTO :MONTO, :IMPTOS;
        
            if (MONTO <> 0) then
                BEGIN
                if (IMPINC = 'S') then
                    MONTO = MONTO - IMPTOS;
                /* TRAIGA LAS CARACTERISTICAS DE LA CUENTA */
                SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS_NIIF
                    WHERE CUEN_COD = :CTABASE INTO :CUENTA, :TIPOCUEN;
                if (CUENTA IS NULL) then
                    begin
                    EXECUTE PROCEDURE ERRORINT(1011, :IDDOC, :CTABASE, 2);
                    CUENTA = CTABASE;
                    ERROR = ERROR + 1;
                    end
                /* DEPENDE DEL TIPO DE CUENTA */
                if (TIPOCUEN = 'I') then
                    BEGIN
                    /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                    FOR SELECT E.ARTI_COD, (CAST(ENDE_CANT AS DOUBLE PRECISION) * ENDE_COSTO), (ENDE_IVAMONTO + (ENDE_CONSUMO * ENDE_CANT * ENDE_FACTOR))
                        FROM ARTICULO A, CONTABIL_ARTICULO_NIIF C, ENTRADAS_DETALLE E
                        WHERE E.ENTR_ID = :IDDOC AND E.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND COAR_CTAINV = :CUENTA
                        INTO :ARTICULO, :MONTO, :IMPTOS
                        DO
                        BEGIN
                        if (IMPINC = 'S') then
                            MONTO = MONTO - IMPTOS;
                        IF (MONTO <> 0) Then
                            BEGIN
                            INSERT INTO CONTABILIZACION_DET (CNTB_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)
                                VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ARTICULO, 0, 0);
                            NUMITEMS = NUMITEMS + 1;
                            SUMA = SUMA + MONTO;
                            END
                        END
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    EXECUTE PROCEDURE ERRORINT(1011, :IDDOC, :CUENTA, 4);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NUMITEMS = NUMITEMS + 1;
                    SUMA = SUMA + MONTO;
                    END
                END
            END /* BASE K O T */
        /* EL IVA  */
        if (IVAV = 'A') then
            BEGIN
            /* SUME LAS BASES DE LOS ARTICULOS DEL DOCUMENTO */
            FOR SELECT MAX(COAR_CTAIVAV), SUM(ENDE_IVAMONTO), SUM(CAST(ENDE_CANT AS DOUBLE PRECISION) * ENDE_COSTO)
                FROM ARTICULO A, CONTABIL_ARTICULO_NIIF C, ENTRADAS_DETALLE E
                WHERE E.ENTR_ID = :IDDOC AND E.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD
                GROUP BY COAR_CTAIVAV
                INTO :CTAIVA, :IMPTOS, :MONTO
            DO
                BEGIN
                if (IMPINC = 'S') then
                    MONTO = MONTO - IMPTOS;
                if (IMPTOS <> 0) then
                    BEGIN
                    /* TRAIGA LAS CARCATERISTICAS DE LA CUENTA */
                    SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS_NIIF
                        WHERE CUEN_COD = :CTAIVA INTO :CUENTA, :TIPOCUEN;
                    if (CUENTA IS NULL) then
                        begin
                        EXECUTE PROCEDURE ERRORINT(1011, :IDDOC, :CTAIVA, 2);
                        CUENTA = CTAIVA;
                        ERROR = ERROR + 1;
                        end
                    /* DEPENDE DEL TIPO DE CUENTA */
                    if (TIPOCUEN = 'I') then
                        BEGIN
                        /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                        FOR SELECT E.ARTI_COD, ENDE_IVAMONTO, (CAST(ENDE_CANT AS DOUBLE PRECISION) * ENDE_COSTO)
                            FROM ARTICULO A, CONTABIL_ARTICULO_NIIF C, ENTRADAS_DETALLE E
                            WHERE E.ENTR_ID = :IDDOC AND E.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND COAR_CTAIVAV = :CUENTA
                            INTO :ARTICULO, :IMPTOS, :MONTO
                        DO
                            BEGIN
                            if (IMPINC = 'S') then
                                MONTO = MONTO - IMPTOS;
                            if (IMPTOS <> 0) then
                                BEGIN
                                INSERT INTO CONTABILIZACION_DET (CNTB_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)
                                    VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :IMPTOS, 0, :MONTO, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ARTICULO, 0, 0);
                                NUMITEMS = NUMITEMS + 1;
                                SUMA = SUMA + IMPTOS;
                                END
                            END
                        END
                    if (TIPOCUEN = 'C') then
                        BEGIN
                        EXECUTE PROCEDURE ERRORINT(1011, :IDDOC, :CUENTA, 4);
                        TIPOCUEN = 'N';
                        ERROR = ERROR + 1;
                        END
                    if (TIPOCUEN = 'N') then
                        BEGIN
                        /* INSERTE EL REGISTRO DEL IVA EN VENTAS */
                        INSERT INTO CONTABILIZACION_DET (CNTB_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)
                            VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :IMPTOS, 0, :MONTO, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                        NUMITEMS = NUMITEMS + 1;
                        SUMA = SUMA + IMPTOS;
                        END
                    END /* MONTO <> 0 */
                END /* FOR */
            END /* IVA */
        if (IVAV = 'I') then
            BEGIN
            /* SUME LAS BASES DE LOS ARTICULOS DEL DOCUMENTO */
            FOR SELECT MAX(TAIV_CTAIVACMP), SUM(ENDE_IVAMONTO), SUM(CAST(ENDE_CANT AS DOUBLE PRECISION) * ENDE_COSTO)
                FROM ARTICULO A, TARIFA_IVA I, ENTRADAS_DETALLE E
                WHERE E.ENTR_ID = :IDDOC AND E.ARTI_COD = A.ARTI_COD AND A.TAIV_COD = I.TAIV_COD
                GROUP BY TAIV_CTAIVACMP
                INTO :CTAIVA, :IMPTOS, :MONTO
            DO
                BEGIN
                if (IMPINC = 'S') then
                    MONTO = MONTO - IMPTOS;
                if (MONTO <> 0) then
                    BEGIN
                    /* TRAIGA LAS CARCATERISTICAS DE LA CUENTA */
                    SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS_NIIF
                        WHERE CUEN_COD = :CTAIVA INTO :CUENTA, :TIPOCUEN;
                    if (CUENTA IS NULL) then
                        begin
                        EXECUTE PROCEDURE ERRORINT(1011, :IDDOC, :CTAIVA, 2);
                        CUENTA = CTAIVA;
                        ERROR = ERROR + 1;
                        end
                    /* DEPENDE DEL TIPO DE CUENTA */
                    if (TIPOCUEN = 'I') then
                        BEGIN
                        /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                        FOR SELECT E.ARTI_COD, ENDE_IVAMONTO, (CAST(ENDE_CANT AS DOUBLE PRECISION) * ENDE_COSTO)
                            FROM ARTICULO A, TARIFA_IVA I, ENTRADAS_DETALLE E
                            WHERE E.ENTR_ID = :IDDOC AND E.ARTI_COD = A.ARTI_COD AND A.TAIV_COD = I.TAIV_COD AND TAIV_CTAIVACMP = :CUENTA
                            INTO :ARTICULO, :IMPTOS, :MONTO
                        DO
                            BEGIN
                            if (IMPINC = 'S') then
                                MONTO = MONTO - IMPTOS;
                            if (MONTO <> 0) then
                                BEGIN
                                INSERT INTO CONTABILIZACION_DET (CNTB_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)
                                    VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :IMPTOS, 0, :MONTO, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ARTICULO, 0, 0);
                                NUMITEMS = NUMITEMS + 1;
                                SUMA = SUMA + IMPTOS;
                                END
                            END
                        END
                    if (TIPOCUEN = 'C') then
                        BEGIN
                        EXECUTE PROCEDURE ERRORINT(1011, :IDDOC, :CUENTA, 4);
                        TIPOCUEN = 'N';
                        ERROR = ERROR + 1;
                        END
                    if (TIPOCUEN = 'N') then
                        BEGIN
                        /* INSERTE EL REGISTRO DEL IVA EN VENTAS */
                        INSERT INTO CONTABILIZACION_DET (CNTB_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)
                            VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :IMPTOS, 0, :MONTO, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                        NUMITEMS = NUMITEMS + 1;
                        SUMA = SUMA + IMPTOS;
                        END
                    END
                END /* FOR */
            END /* IVA */
        if (IVAV = 'K') then
            BEGIN
            /* SUME LAS BASES DE LOS ARTICULOS DEL DOCUMENTO */
            SELECT SUM(ENDE_IVAMONTO), SUM(CAST(ENDE_CANT AS DOUBLE PRECISION) * ENDE_COSTO)
                FROM ENTRADAS_DETALLE E
                WHERE E.ENTR_ID = :IDDOC
                INTO :IMPTOS, :MONTO;
            if (IMPINC = 'S') then
                MONTO = MONTO - IMPTOS;
            if (IMPTOS <> 0) then
                BEGIN
                /* TRAIGA LAS CARCATERISTICAS DE LA CUENTA */
                SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS_NIIF
                    WHERE CUEN_COD = :CTAIVA INTO :CUENTA, :TIPOCUEN;
                if (CUENTA IS NULL) then
                    begin
                    EXECUTE PROCEDURE ERRORINT(1011, :IDDOC, :CTAIVA, 2);
                    CUENTA = CTABASE;
                    ERROR = ERROR + 1;
                    end
                /* DEPENDE DEL TIPO DE CUENTA */
                if (TIPOCUEN = 'I') then
                    BEGIN
                    /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                    FOR SELECT E.ARTI_COD, ENDE_IVAMONTO, (CAST(ENDE_CANT AS DOUBLE PRECISION) * ENDE_COSTO)
                        FROM ARTICULO A, CONTABIL_ARTICULO_NIIF C, ENTRADAS_DETALLE E
                        WHERE E.ENTR_ID = :IDDOC AND E.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND COAR_CTAIVAV = :CUENTA
                        INTO :ARTICULO, :IMPTOS, :MONTO
                        DO
                        BEGIN
                        if (IMPINC = 'S') then
                            MONTO = MONTO - IMPTOS;
                        if (IMPTOS <> 0) then
                            BEGIN
                            INSERT INTO CONTABILIZACION_DET (CNTB_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)
                                VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :IMPTOS, 0, :MONTO, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ARTICULO, 0, 0);
                            NUMITEMS = NUMITEMS + 1;
                            SUMA = SUMA + IMPTOS;
                            END
                        END
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    EXECUTE PROCEDURE ERRORINT(1011, :IDDOC, :CUENTA, 4);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    /* INSERTE EL REGISTRO DEL IVA EN VENTAS */
                    INSERT INTO CONTABILIZACION_DET (CNTB_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)
                        VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :IMPTOS, 0, :MONTO, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NUMITEMS = NUMITEMS + 1;
                    SUMA = SUMA + IMPTOS;
                    END
                END
            END /* IVA K */
        /* EL IMPOCONSUMO */
        if (CONSUMO = 'A') then
            BEGIN
            /* SUME LAS BASES DE LOS ARTICULOS DEL DOCUMENTO */
            FOR SELECT MAX(COAR_CTACONS), SUM(ENDE_CONSUMO * ENDE_CANT * ENDE_FACTOR)
                FROM ARTICULO A, CONTABIL_ARTICULO_NIIF C, ENTRADAS_DETALLE E
                WHERE E.ENTR_ID = :IDDOC AND E.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 */
                    SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS_NIIF
                        WHERE CUEN_COD = :CTACONSUMO INTO :CUENTA, :TIPOCUEN;
                    if (CUENTA IS NULL) then
                        begin
                        EXECUTE PROCEDURE ERRORINT(1011, :IDDOC, :CTACONSUMO, 2);
                        CUENTA = CTABASE;
                        ERROR = ERROR + 1;
                        end
                    /* DEPENDE DEL TIPO DE CUENTA */
                    if (TIPOCUEN = 'I') then
                        BEGIN
                        /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                        FOR SELECT E.ARTI_COD, ENDE_CONSUMO * ENDE_CANT * ENDE_FACTOR
                            FROM ARTICULO A, CONTABIL_ARTICULO_NIIF C, ENTRADAS_DETALLE E
                            WHERE E.ENTR_ID = :IDDOC AND E.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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                                VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :IMPTOS, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ARTICULO, 0, 0);
                            NUMITEMS = NUMITEMS + 1;
                            SUMA = SUMA + IMPTOS;
                            END
                        END
                    if (TIPOCUEN = 'C') then
                        BEGIN
                        EXECUTE PROCEDURE ERRORINT(1011, :IDDOC, :CUENTA, 4);
                        TIPOCUEN = 'N';
                        ERROR = ERROR + 1;
                        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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :IMPTOS, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                        NUMITEMS = NUMITEMS + 1;
                        SUMA = SUMA + IMPTOS;
                        END
                    END
                END /* FOR */
            END /* CONSUMO */
        if (CONSUMO = 'K') then
            BEGIN
            /* SUME LAS BASES DE LOS ARTICULOS DEL DOCUMENTO */
            SELECT SUM(ENDE_CONSUMO * ENDE_CANT * ENDE_FACTOR) FROM ENTRADAS_DETALLE E
                WHERE E.ENTR_ID = :IDDOC INTO :IMPTOS;
            if (IMPTOS <> 0) then
                BEGIN
                /* TRAIGA LAS CARACTERISTICAS DE LA CUENTA */
                SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS_NIIF
                    WHERE CUEN_COD = :CTACONSUMO INTO :CUENTA, :TIPOCUEN;
                if (CUENTA IS NULL) then
                    begin
                    EXECUTE PROCEDURE ERRORINT(1011, :IDDOC, :CTACONSUMO, 2);
                    CUENTA = CTACONSUMO;
                    ERROR = ERROR + 1;
                    end
                /* DEPENDE DEL TIPO DE CUENTA */
                if (TIPOCUEN = 'I') then
                    BEGIN
                    /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                    FOR SELECT E.ARTI_COD, ENDE_CONSUMO * ENDE_CANT * ENDE_FACTOR
                        FROM ARTICULO A, CONTABIL_ARTICULO_NIIF C, ENTRADAS_DETALLE E
                        WHERE E.ENTR_ID = :IDDOC AND E.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND COAR_CTACONS = :CUENTA
                        INTO :ARTICULO, :IMPTOS
                        DO
                        BEGIN
                        if (IMPTOS <> 0) then
                            BEGIN
                            INSERT INTO CONTABILIZACION_DET (CNTB_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)
                            VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :IMPTOS, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ARTICULO, 0, 0);
                            NUMITEMS = NUMITEMS + 1;
                            SUMA = SUMA + IMPTOS;
                            END
                        END
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    EXECUTE PROCEDURE ERRORINT(1011, :IDDOC, :CUENTA, 4);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :IMPTOS, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NUMITEMS = NUMITEMS + 1;
                    SUMA = SUMA + IMPTOS;
                    END
                END
            END /* CONSUMO K */
        /* recorra las cuentas adicionales */
        FOR SELECT INIC_CUENTA, INIC_BASE, INIC_PORC, INIC_VALOR, INIC_DB
            FROM INTERFAZ_INVENTARIO_CTAS
            WHERE ININ_ID = :IDINTER
            INTO :CUENTAADIC, :BASEADIC, :PORCADIC, :VALORADIC, :DBADIC
            DO
            BEGIN
            if (VALORADIC <> 0) then
                MONTO = VALORADIC;
            ELSE
                BEGIN
                if (:BASEADIC = 'SUBTOTAL') then
                    SELECT SUM(CAST(ENDE_CANT AS DOUBLE PRECISION) * (ENDE_COSTO-ENDE_DTOMONTO)) FROM
                        ENTRADAS_DETALLE WHERE ENTR_ID = :iddoc INTO :VALORADIC;
                if (:BASEADIC = 'IVA') then
                    SELECT SUM(ENDE_IVAMONTO) FROM
                        ENTRADAS_DETALLE WHERE ENTR_ID = :iddoc INTO :VALORADIC;
                if (:BASEADIC = 'CONSUMO') then
                    SELECT SUM(ENDE_CONSUMO * ENDE_CANT * ENDE_FACTOR) FROM
                        ENTRADAS_DETALLE WHERE ENTR_ID = :iddoc INTO :VALORADIC;
                if (:BASEADIC = 'TOTAL') then
                    SELECT SUM((CAST(ENDE_CANT AS DOUBLE PRECISION) * (ENDE_COSTO-ENDE_DTOMONTO)) + ENDE_IVAMONTO + (ENDE_CONSUMO * ENDE_CANT * ENDE_FACTOR)) FROM
                        ENTRADAS_DETALLE WHERE ENTR_ID = :iddoc INTO :VALORADIC;
                MONTO = VALORADIC * PORCADIC / 100;
                END
            if (MONTO <> 0) then
                BEGIN
                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(1011, :IDDOC, :CUENTAADIC, 2);
                    CUENTA = CUENTAADIC;
                    ERROR = ERROR + 1;
                    end
                /* DEPENDE DEL TIPO DE CUENTA */
                if (TIPOCUEN = 'I') then
                    BEGIN
                    EXECUTE PROCEDURE ERRORINT(1011, :IDDOC, :CUENTA, 3);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    EXECUTE PROCEDURE ERRORINT(1011, :IDDOC, :CUENTA, 4);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NUMITEMS, :CUENTAADIC, :CONCEPTO, '', :MONTO, 0, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                        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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NUMITEMS, :CUENTAADIC, :CONCEPTO, '', 0, :MONTO, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                        SUMA = SUMA - MONTO;
                        END
                    NUMITEMS = NUMITEMS + 1;
                    END
                END
            END
        /* CIERRE EL COMPROBANTE CONTRA LA CUENTA DEL TERCERO O LA CONSTANTE */
        if (SUMA <> 0) then
            BEGIN
            if (SUMA > 0) then
                BEGIN
                DEBITO = 0;
                CREDITO = SUMA;
                END
            ELSE
                BEGIN
                DEBITO = SUMA * -1;
                CREDITO = 0;
                END
            if (TOTAL <> 'K') then
                BEGIN
                SELECT TERC_CTAPROV, TERC_PROV
                    FROM TERCEROS WHERE TERC_NIT = :NIT
                    INTO :CTACIERRE, :PROV;
                if (PROV = 'S') then
                    SELECT PROV_CTAPAGAR FROM PROVEEDORES WHERE TERC_NIT = :nit INTO :CUENTA;
                END
            /* TRAIGA LAS CARACTERISTICAS DE LA CUENTA */
            SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS_NIIF
                WHERE CUEN_COD = :CTACIERRE INTO :CUENTA, :TIPOCUEN;
            if (CUENTA IS NULL) then
                begin
                EXECUTE PROCEDURE ERRORINT(24, :IDDOC, :CTACIERRE, 2);
                CUENTA = CTACIERRE;
                ERROR = ERROR + 1;
                end
            /* DEPENDE DEL TIPO DE CUENTA */
            if (TIPOCUEN = 'I') then
                BEGIN
                EXECUTE PROCEDURE ERRORINT(1011, :IDDOC, :CUENTA, 3);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                EXECUTE PROCEDURE ERRORINT(1011, :IDDOC, :CUENTA, 4);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                END
            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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :DEBITO, :CREDITO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            END /* SUMA */
        if (ERROR > 0) then
            VER = 'S';
        END
      END /* EXISTE LA INTERFAZ */
  ELSE
    BEGIN
    EXECUTE PROCEDURE ERRORINT(1011, :IDDOC, :PREFIJO, 1);
    ERROR = ERROR + 1;
    VER = 'S';
    END
SUSPEND;
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER procedure CONTABIL_FACTCOMP_NIIF (
    IDDOC integer,
    IDINTER integer,
    IDC integer)
returns (
    ERRORI integer,
    VER char(1))
AS
DECLARE VARIABLE PREFIJO VARCHAR(4);
DECLARE VARIABLE NUM VARCHAR(8);
DECLARE VARIABLE NUMERO VARCHAR(10);
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 PRTCREE NUMERIC(9,2);
DECLARE VARIABLE VRRTCREE 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 RTCREE CHAR(1);
DECLARE VARIABLE CTARTCREE 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 PROYDET VARCHAR(4);
DECLARE VARIABLE CENTRODET 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 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 FOMENTO CHAR(2);
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 SIMPLIF CHAR(1);
BEGIN
  /* 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
    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, :RTCREE,
    :CTAINVEN, :CTAIVA, :CTACONSUMO, :CTADTO, :CTAADIC, :CTAEXTRA, :CTACXP, :CTARTFTE, :CTARTIVA,
    :CTARTICA, :CTARTCREE, :VER, :CENT;
  if (EXISTE = 'S') then
    BEGIN
    /* ENCABEZADO DE LA FACTURA */
    SELECT PREF_PRE, FACO_NUMERO, 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, PROV_SIMPLIFICADO
        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, :NIT, :IMPINC, :VENCEAUX, :VRDTO, :VRADIC, :VRIVA,
        :VREXTRA, :VRTOTAL, :PRTFTE, :VRRTFTE, :PORC, :VRRTIVA, :PRTICA, :VRRTICA,
        :prtcree, :vrrtcree, :NOMBRE, TCTARTFTE, TCTARTIVA, TCTARTICA, tctartcree, :TCTAPROV, :NUMPROV, :ANULADO, :simplif;
    /* CENTRO DE LA BODEGA */
    IF (CENT = 'B') THEN
        SELECT BODE_CENTRO, BODE_PROY FROM BODEGA B, FACTURAS_COMPRA F WHERE B.BODE_COD = F.BODE_COD AND F.FACO_ID = :IDDOC INTO :CENTRO, :PROY;
    ELSE
        SELECT PREF_CENTRO,PREF_PROY  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;
    if (ANULADO = 'N') then
        BEGIN
        NUMERO = PREFIJO || NUM;
        VRSUBT = VRTOTAL - VREXTRA - VRIVA;
        MERCANCIA = VRSUBT - VRADIC + VRDTO;
        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;
        NUMITEMS = 100000;
        SUMA = 0;
        NETO = 0;
        ERRORI = 0;
        EXECUTE PROCEDURE LEE_CONFIGURACION('COMPRAS', 'FACTURAS', 'USAR IMPOCONSUMO COMO PORCENTAJE DE FOMENTO') RETURNING_VALUES (FOMENTO);
        EXECUTE PROCEDURE lee_configuracion('COMPRAS','FACTURAS','DESCUENTO Y VALOR ADICIONAL DEL DOCUMENTO COMO MENOR VALOR DEL COSTO') returning_values (:MENORV);
        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), MAX(F.BODE_COD)
                FROM ARTICULO A, CONTABIL_ARTICULO_NIIF 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, :BODE_DET DO
                BEGIN
                IF (CENT = 'B') THEN
                  SELECT BODE_CENTRO, BODE_PROY FROM BODEGA WHERE BODE_COD = :BODE_DET INTO :CENTRODET, :PROYDET;
                if (IMPINC = 'S') then
                    BEGIN
                    MONTO = MONTO - IMPTOS;
                    if (FOMENTO <> 'SI' ) then
                        MONTO = MONTO - VALORADIC;
                    END
                MONTO = MONTO * FACTOR;
                execute procedure redondee(MONTO, DIG) returning_values (MONTO);
                execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
                EXECUTE PROCEDURE CUENTA_INTERFAZ_NIIF(21, :IDDOC, :CTAINVEN, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERRORI = ERRORI + 1;
                if ((TIPOCUEN = 'I') or (TIPOCUEN = 'A'))  then
                    BEGIN
                    FOR SELECT F.ARTI_COD, (FCDE_CANT * (FCDE_PRUNIT-FCDE_DTOMONTO)), FCDE_IVAMONTO, FCDE_CONSUMO
                        FROM ARTICULO A, CONTABIL_ARTICULO_NIIF 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;
                            if (FOMENTO <> 'SI' ) then
                                MONTO = MONTO - VALORADIC;
                            END
                        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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                               VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :MONTO, 0, 0, 0, :NIT, :PROYDET, :CENTRODET, NULL, NULL, NULL, :ARTICULO, 0, 0);
                        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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                               VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ARTICULO, 0, 0);
                        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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                           VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :MONTO, 0, 0, 0, :NIT, :PROYDET, :CENTRODET, :NUMERO, NULL, :VENCE, NULL, 0, 21);
                    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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                           VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 21);
                    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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                           VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :MONTO, 0, 0, 0, :NIT, :PROYDET, :CENTRODET, NULL, NULL, NULL, NULL, 0, 0);
                    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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                           VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    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), MAX(BODE_COD)
                FROM FACTURAS_COMPRAS_DETALLE WHERE FACO_ID = :IDDOC GROUP BY BODE_COD INTO :MONTO, :IMPTOS, :VALORADIC, :BODE_DET Do
                BEGIN
                  IF (CENT = 'B') THEN
                    SELECT BODE_CENTRO, BODE_PROY FROM BODEGA WHERE BODE_COD = :BODE_DET INTO :CENTRODET, :PROYDET;
                  if (IMPINC = 'S') then
                   BEGIN
                    MONTO = MONTO - IMPTOS;
                    if (FOMENTO <> 'SI' ) then
                      MONTO = MONTO - VALORADIC;
                   END
                  MONTO = MONTO * FACTOR;
                  execute procedure redondee(MONTO, DIG) returning_values (MONTO);
                  execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
                  EXECUTE PROCEDURE CUENTA_INTERFAZ_NIIF(21, :IDDOC, :CTAINVEN, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                  if (ERRORC <> 0) then
                    ERRORI = ERRORI + 1;
                if ((TIPOCUEN = 'I') or (TIPOCUEN = 'A'))  then
                   BEGIN
                    FOR SELECT ARTI_COD, (FCDE_CANT * (FCDE_PRUNIT-FCDE_DTOMONTO)), FCDE_IVAMONTO, FCDE_CONSUMO
                      FROM FACTURAS_COMPRAS_DETALLE WHERE FACO_ID = :IDDOC INTO :ARTICULO, :MONTO, :IMPTOS, :VALORADIC DO
                       BEGIN
                       if (IMPINC = 'S') then
                        BEGIN
                         MONTO = MONTO - IMPTOS;
                         if (FOMENTO <> 'SI' ) then
                            MONTO = MONTO - VALORADIC;
                        END
                       MONTO = MONTO * FACTOR;
                       execute procedure redondee(MONTO, DIG) returning_values (MONTO);
                       execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
                       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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                             VALUES (:IDC, :NUMITEMS, :CTAINVEN, :CONCEPTO, '', :MONTO, 0, 0, 0, :NIT, :PROYDET, :CENTRODET, NULL, NULL, NULL, :ARTICULO, 0, 0);
                       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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                             VALUES (:IDC, :NUMITEMS, :CTAINVEN, :CONCEPTO, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ARTICULO, 0, 0);
                       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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                         VALUES (:IDC, :NUMITEMS, :CTAINVEN, :CONCEPTO, '', :MONTO, 0, 0, 0, :NIT, :PROYDET, :CENTRODET, :NUMERO, NULL, :VENCE, NULL, 0, 21);
                    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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                         VALUES (:IDC, :NUMITEMS, :CTAINVEN, :CONCEPTO, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 21);
                    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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                          VALUES (:IDC, :NUMITEMS, :CTAINVEN, :CONCEPTO, '', :MONTO, 0, 0, 0, :NIT, :PROYDET, :CENTRODET, NULL, NULL, NULL, NULL, 0, 0);
                    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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                          VALUES (:IDC, :NUMITEMS, :CTAINVEN, :CONCEPTO, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NUMITEMS = NUMITEMS + 1;
                    NETO = NETO + MONTO;
                   END
                END
            END
        /* EL IVA */
        if ((IVA = 'A') AND (SIMPLIF = 'N')) then
            BEGIN
            FOR SELECT MAX(COAR_CTAIVAC), SUM(FCDE_IVAMONTO), SUM(CAST(FCDE_CANT AS DOUBLE PRECISION) * (FCDE_PRUNIT-FCDE_DTOMONTO)), SUM(FCDE_CONSUMO)
                FROM ARTICULO A, CONTABIL_ARTICULO_NIIF 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;
                    if (FOMENTO <> 'SI' ) then
                        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_NIIF(21, :IDDOC, :CTAIVA, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERRORI = ERRORI + 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_NIIF 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;
                            if (FOMENTO <> 'SI' ) then
                                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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :IMPTOS, 0, :MONTO, :PORCIVA, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ARTICULO, 0, 0);
                        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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :IMPTOS, 0, :MONTO, :IMPTOS*100/:MONTO, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 21);
                    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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :IMPTOS, 0, :MONTO, CAST(:IMPTOS AS DOUBLE PRECISION)*100/CAST(:MONTO AS DOUBLE PRECISION), :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NUMITEMS = NUMITEMS + 1;
                    NETO = NETO + IMPTOS;
                    END
                END
            END
        if ((IVA = 'K') or (SIMPLIF = 'S')) then /* IVA EN CTA CONSTANTE */
            BEGIN
            SELECT SUM(FCDE_IVAMONTO), SUM(CAST(FCDE_CANT AS DOUBLE PRECISION) * (FCDE_PRUNIT-FCDE_DTOMONTO)), 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 (MERCANCIA <> 0) then
                    IMPTOS = CAST(IMPTOS AS DOUBLE PRECISION) * VRSUBT / MERCANCIA;
                else
                    IMPTOS = 0;
                if (IMPINC = 'S') then
                    BEGIN
                    MONTO = MONTO - IMPTOS;
                    if (FOMENTO <> 'SI' ) then
                        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);
                if (SIMPLIF = 'S') then
                    BEGIN
                    EXECUTE PROCEDURE lee_configuracion('COMPRAS', 'FACTURAS', 'CUENTA DE IVA PARA EL REGIMEN SIMPLIFICADO') returning_values (:CTAIVA);
                    END
                EXECUTE PROCEDURE CUENTA_INTERFAZ_NIIF(21, :IDDOC, :CTAIVA, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERRORI = ERRORI + 1;
                if (TIPOCUEN = 'I') then
                    BEGIN
                    FOR SELECT F.ARTI_COD, (FCDE_CANT * (FCDE_PRUNIT-FCDE_DTOMONTO)), FCDE_IVAMONTO, TAIV_PORC, FCDE_CONSUMO
                        FROM ARTICULO A, FACTURAS_COMPRAS_DETALLE F, TARIFA_IVA T WHERE F.FACO_ID = :IDDOC AND A.TAIV_COD = T.TAIV_COD
                        INTO :ARTICULO, :MONTO, :IMPTOS, :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;
                            if (FOMENTO <> 'SI' ) then
                                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);
                        if (IMPTOS <> 0) then
                            BEGIN
                            INSERT INTO CONTABILIZACION_DET (CNTB_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)
                                VALUES (:IDC, :NUMITEMS, :CTAIVA, :CONCEPTO, '', :IMPTOS, 0, :MONTO, :PORCIVA, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ARTICULO, 0, 0);
                            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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NUMITEMS, :CTAIVA, :CONCEPTO, '', :IMPTOS, 0, :MONTO, :IMPTOS*100/:MONTO, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 21);
                    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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NUMITEMS, :CTAIVA, :CONCEPTO, '', :IMPTOS, 0, :MONTO, :IMPTOS*100/:MONTO, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NUMITEMS = NUMITEMS + 1;
                    NETO = NETO + IMPTOS;
                    END
                END
            END
        /* EL IMPOCONSUMO */
        if (CONSUMO = 'A') then
            BEGIN
            FOR SELECT MAX(COAR_CTACONS), SUM(FCDE_CONSUMO) FROM ARTICULO A, CONTABIL_ARTICULO_NIIF 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_NIIF(21, :IDDOC, :CTACONSUMO, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERRORI = ERRORI + 1;
                if (FOMENTO <> 'SI') then
                    BEGIN
                    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)
                            VALUES (:IDC, :NUMITEMS, :CTACONSUMO, :CONCEPTO, '', :IMPTOS, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                        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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NUMITEMS, :CTACONSUMO, :CONCEPTO, '', :IMPTOS, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                        NUMITEMS = NUMITEMS + 1;
                        NETO = NETO + IMPTOS;
                        END
                    END
                ELSE
                    BEGIN
                    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)
                            VALUES (:IDC, :NUMITEMS, :CTACONSUMO, :CONCEPTO, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                        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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NUMITEMS, :CTACONSUMO, :CONCEPTO, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                        NUMITEMS = NUMITEMS + 1;
                        NETO = NETO - IMPTOS;
                        END
                    END
                END
            END
        if (CONSUMO = 'K') then /* CONSUMO EN CTA CONSTANTE */
            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_NIIF(21, :IDDOC, :CTACONSUMO, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
              if (ERRORC <> 0) then
                ERRORI = ERRORI + 1;
              if (FOMENTO <> 'SI') then
                BEGIN
                /* DEPENDE DEL TIPO DE CUENTA */
                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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NUMITEMS, :CTACONSUMO, :CONCEPTO, '', :IMPTOS, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                    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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NUMITEMS, :CTACONSUMO, :CONCEPTO, '', :IMPTOS, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NUMITEMS = NUMITEMS + 1;
                    NETO = NETO + IMPTOS;
                    END
                END
              ELSE
                BEGIN
                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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NUMITEMS, :CTACONSUMO, :CONCEPTO, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                    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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NUMITEMS, :CTACONSUMO, :CONCEPTO, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NUMITEMS = NUMITEMS + 1;
                    NETO = NETO - IMPTOS;
                    END
                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_NIIF(21, :IDDOC, :CTADTO, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERRORI = ERRORI + 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)
                    VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :VRDTO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 21);
                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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :VRDTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NUMITEMS = NUMITEMS + 1;
                NETO = NETO - VRDTO;
                END
            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_NIIF(21, :IDDOC, :CTAADIC, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERRORI = ERRORI + 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)
                    VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :VRADIC, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 21);
                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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :VRADIC, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                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_NIIF(21, :IDDOC, :CTAEXTRA, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERRORI = ERRORI + 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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :VREXTRA, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 21);
                else
                    begin
                    EXECUTE PROCEDURE lee_configuracion('COMPRAS', 'FACTURAS', 'CUENTA CONTABLE PARA VALORES EXTRA NEGATIVOS') returning_values (:CTAEXTRA);
                    if (CTAEXTRA <> '') then
                        CUENTA = CTAEXTRA;
                    INSERT INTO CONTABILIZACION_DET (CNTB_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)
                        VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, abs(:VREXTRA), 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 21);
                    end
                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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :VREXTRA, 0, 0, 0, :NIT, :PROY, :CENTRO, null, NULL, null, NULL, 0, 0);
                else
                    begin
                    EXECUTE PROCEDURE lee_configuracion('COMPRAS', 'FACTURAS', 'CUENTA CONTABLE PARA VALORES EXTRA NEGATIVOS') returning_values (:CTAEXTRA);
                    if (CTAEXTRA <> '') then
                        CUENTA = CTAEXTRA;
                    INSERT INTO CONTABILIZACION_DET (CNTB_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)
                        VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, abs(:VREXTRA), 0, 0, :NIT, :PROY, :CENTRO, null, NULL, null, NULL, 0, 0);
                    end
                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_NIIF(21, :IDDOC, :CTARTFTE, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERRORI = ERRORI + 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)
                    VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :VRRTFTE, (:VRSUBT*-1), :PRTFTE, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :VRRTFTE, (:VRSUBT*-1), :PRTFTE, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NUMITEMS = NUMITEMS + 1;
                NETO = NETO - VRRTFTE;
                SUMA = VRRTFTE;
                END
            end
          END
        if (RTFTE = 'A') then
          BEGIN
          FOR SELECT MAX(COAR_CTARTFTE), MAX(COAR_RTFTE), MIN(COAR_RTBASE), SUM(FCDE_TOTAL-FCDE_IVAMONTO-FCDE_CONSUMO), SUM((FCDE_TOTAL-FCDE_IVAMONTO-FCDE_CONSUMO)*COAR_RTFTE)
            FROM CONTABIL_ARTICULO_NIIF 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_NIIF(21, :IDDOC, :CTARTFTE, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
                    if (ERRORC <> 0) then
                        ERRORI = ERRORI + 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)
                            VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :VRRTFTE, :MONTO, :PRTFTE, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                        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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :VRRTFTE, :MONTO, :PRTFTE, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                        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_NIIF(21, :IDDOC, :CTARTIVA, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERRORI = ERRORI + 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)
                    VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :VRRTIVA, (:VRIVA*-1), :PORC, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 21);
                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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :VRRTIVA, (:VRIVA*-1), :PORC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                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_NIIF(21, :IDDOC, :CTARTICA, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERRORI = ERRORI + 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)
                    VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :VRRTICA, (:VRSUBT*-1), :PRTICA, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 21);
                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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :VRRTICA, (:VRSUBT*-1), :PRTICA, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NUMITEMS = NUMITEMS + 1;
                NETO = NETO - VRRTICA;
                SUMA = SUMA + VRRTICA;
                END
            end
          END
        /* RETENCION CREE */
        if ((rtcree = 'P') or (rtcree = 'K')) then
          BEGIN
          execute procedure redondee(vrrtcree, DIG) returning_values (vrrtcree);
          if (vrrtcree <> 0) then
            begin
            if (rtcree = 'P') then
                ctartcree = tctartcree;
            EXECUTE PROCEDURE CUENTA_INTERFAZ_NIIF(21, :IDDOC, :ctartcree, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERRORI = ERRORI + 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)
                    VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :vrrtcree, (:VRSUBT*-1), :prtcree, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 21);
                NUMITEMS = NUMITEMS + 1;
                NETO = NETO - vrrtcree;
                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)
                    VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :vrrtcree, (:VRSUBT*-1), :prtcree, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NUMITEMS = NUMITEMS + 1;
                NETO = NETO - vrrtcree;
                SUMA = SUMA + vrrtcree;
                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_NIIF(21, :IDDOC, :CTACXP, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERRORI = ERRORI + 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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :SUMA, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 21);
            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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :SUMA, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            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_NIIF(21, :IDDOC, :CUENTAADIC, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERRORI = ERRORI + 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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NUMITEMS, :CUENTAADIC, :CONCEPTO, '', :MONTO, 0, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                        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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NUMITEMS, :CUENTAADIC, :CONCEPTO, '', 0, :MONTO, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                        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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NUMITEMS, :CUENTAADIC, :CONCEPTO, '', :MONTO, 0, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                        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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NUMITEMS, :CUENTAADIC, :CONCEPTO, '', 0, :MONTO, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                        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_NIIF(21, :IDDOC, :CTAADIC, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERRORI = ERRORI + 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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :NETO, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                        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)
                            VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :NETO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                        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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :NETO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                        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)
                            VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :NETO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                        END
                    END
                END
            END
        END
    if (ERRORI > 0) then
        VER = 'S';
    SUSPEND;
    END
ELSE
    BEGIN
    EXECUTE PROCEDURE ERRORINT(21, :IDDOC, :PREFIJO, 1);
    ERRORI = ERRORI + 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 prtcree numeric(9,2);
declare variable vrrtcree 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 rtcree char(1);
declare variable ctartcree 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 proyi varchar(4);
declare variable centi 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 tctartcree 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 fomento varchar(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('COMPRAS', 'FACTURAS', 'USAR IMPOCONSUMO COMO PORCENTAJE DE FOMENTO') returning_values (FOMENTO);
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, :RTCREE,
    :COSTOS, :INVEN, :CTAVENTAS, :CTAIVA, :CTACONSUMO, :CTADTO, :CTAADIC, :CTAEXTRA,
    :CTACARTERA, :CTARTFTE, :CTARTIVA, :CTARTICA, :CTARTCREE, :CTAINVEN, :CTACOSTOS, :VER, :CENT;
if (EXISTE = 'S') then
  BEGIN
  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, :prtcree, :vrrtcree,
        :NOMBRE, TCTARTFTE, TCTARTIVA, TCTARTICA, tctartcree, TCTAVENTA, TCTACLIEN, ANULADO, :nitconta, :tercexento;
  if ((CNTNIT = 'SI') AND (NITCONTA IS NOT NULL)) then
    NIT = NITCONTA;
  if (ANULADO = 'N') then
    BEGIN
    IF (CENT = 'B') THEN
        SELECT B.BODE_CENTRO, B.BODE_PROY FROM BODEGA B, FACTURAS F
            WHERE B.BODE_COD = F.BODE_COD AND F.FACT_ID = :IDDOC INTO :CENTRO, :PROY;
    IF (CENT = 'V') THEN
        SELECT V.CENT_COD, V.PROY_COD FROM VENDEDORES V, FACTURAS F
            WHERE V.VEND_COD = F.VEND_COD AND F.FACT_ID = :IDDOC INTO :CENTRO, :PROY;
    IF (CENT = 'P') THEN
        SELECT P.PREF_CENTRO,P.PREF_PROY  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;
    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;
    EXECUTE PROCEDURE FECHA_A_CONTA(:VENCEAUX) returning_values (:VENCE);
    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;
    /* FACTOR PARA VENTAS E IVA */
    if (MERCANCIA <> 0) then
        FACTOR = CAST(VRSUBT AS DOUBLE PRECISION) / CAST(MERCANCIA AS DOUBLE PRECISION);
    ELSE
        FACTOR = 1;
    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
     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 ((FOMENTO = 'SI') or (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 = '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)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                NROI = NROI + 1;
                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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA - MONTO;
                END
            END /* MONTO <> 0 */
        END /* VENTAS C O K */
    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)
            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
            DO
            BEGIN
            if ((FOMENTO = 'SI') or (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 = '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)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                    NROI = NROI + 1;
                    SUMA = SUMA - MONTO;
                    END
                ELSE
                    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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROYI, :CENTI, NULL, NULL, NULL, NULL, 0, 0);
                    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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    SUMA = SUMA - MONTO;
                    END
                END /* MONTO <> 0 */
            END /* FOR */
        END /* VENTAS A */
    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))
            AND FADE_IVAMONTO <> 0
            GROUP BY COAR_CTAIVAV
            INTO :CTAIVA, :IMPTOS, :MONTO, :VALORADIC
            DO
            BEGIN
            if (FOMENTO = 'SI') then
                MONTO = MONTO + VALORADIC;
            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 = '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)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :IMPTOS, :MONTO, ABS(:IMPTOS*100/:MONTO), :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                    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)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :IMPTOS, :MONTO, ABS(:IMPTOS*100/:MONTO), :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    SUMA = SUMA - IMPTOS;
                    END
                END   /* IMPTOS <> 0 */
            END /* FOR */
        END /* IVA A */
    if (IVA = 'K') then
        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;
        if (FOMENTO = 'SI') then
            MONTO = 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 = '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)
                    VALUES (:IDC, :NROI, :CTAIVA, :CONC, '', 0, :IMPTOS, :MONTO, ABS(:IMPTOS*100/:MONTO), :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                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)
                    VALUES (:IDC, :NROI, :CTAIVA, :CONC, '', 0, :IMPTOS, :MONTO, ABS(:IMPTOS*100/:MONTO), :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA - IMPTOS;
                END
            END /* IMPTOS <> 0 */
        END /* IVA K */
    if ((CONSUMO = 'A') AND (FOMENTO <> 'SI')) 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 = '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)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                    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)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    SUMA = SUMA - IMPTOS;
                    END
                END /* IMPTOS <> 0 */
            END /* FOR */
        END /* CONSUMO A */
    if ((CONSUMO = 'K') AND (FOMENTO <> 'SI')) then
        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 = '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)
                    VALUES (:IDC, :NROI, :CTACONSUMO, :CONC, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                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)
                    VALUES (:IDC, :NROI, :CTACONSUMO, :CONC, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA - IMPTOS;
                END
            END /* IMPTOS <> 0 */
        END /* CONSUMO K */
    /* IMP NACIONAL CONSUMO */
        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)
                    VALUES (:IDC, :NROI, :CTACONSUMO, :CONC, '', 0, :IMPTOS, :MONTO, :PORC, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                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)
                    VALUES (:IDC, :NROI, :CTACONSUMO, :CONC, '', 0, :IMPTOS, :MONTO, :PORC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA - IMPTOS;
                END
            END /* IMPTOS <> 0 */
        END /* INALC */
    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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRDTO, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA + VRDTO;
                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)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRDTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA + VRDTO;
                END
            END
        END /* DESCUENTO */
    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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRADIC, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA - VRADIC;
                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)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRADIC, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA - VRADIC;
                END
            END
        END /* VR. ADIC */
    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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VREXTRA, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA - VREXTRA;
                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)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VREXTRA, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA - VREXTRA;
                END
            END
        END /* VR. EXTRA */
    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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTFTE, 0, :VRSUBT, :PRTFTE, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
            NROI = NROI + 1;
            SUMA = SUMA + VRRTFTE;
            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)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTFTE, 0, :VRSUBT, :PRTFTE, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTFTE, (:VRSUBT*-1), :PRTFTE, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTFTE, (:VRSUBT*-1), :PRTFTE, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTFTE, 0, :MONTO, :PRTFTE, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                    NROI = NROI + 1;
                    SUMA = SUMA + VRRTFTE;
                    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)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTFTE, 0, :MONTO, :PRTFTE, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTFTE, (:MONTO*-1), :PRTFTE, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                        NROI = NROI + 1;
                        SUMA = SUMA - VRRTFTE;
                        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)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTFTE, (:MONTO*-1), :PRTFTE, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                        NROI = NROI + 1;
                        SUMA = SUMA - VRRTFTE;
                        END
                    END
                END
            END
          END
        END /* RTFTE */
      END
    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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTIVA, 0, :VRIVA, :PORC, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
            NROI = NROI + 1;
            SUMA = SUMA + VRRTIVA;
            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)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTIVA, 0, :VRIVA, :PORC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            SUMA = SUMA + VRRTIVA;
            END
        END /* RTIVA */
      END
    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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTICA, 0, :VRSUBT, :PRTICA, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
            NROI = NROI + 1;
            SUMA = SUMA + VRRTICA;
            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)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTICA, 0, :VRSUBT, :PRTICA, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            SUMA = SUMA + VRRTICA;
            END
        END /* RTICA */
      END
    if (RTICA = 'A') then
      BEGIN
      if (VRRTICA <> 0) then
        BEGIN
        FOR SELECT MAX(COAR_CTARTICAV), SUM(FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO), SUM(((FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO)/1000)*:prtica)
          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_CTARTICAV
          INTO :ctartica, :MONTO, :vrrtica
          DO
          BEGIN
          MONTO = MONTO * FACTOR;
          vrrtica = vrrtica * FACTOR;
          execute procedure redondee(vrrtica, DIG) returning_values (vrrtica);
          execute procedure redondee(MONTO, DIG) returning_values (MONTO);
          if (vrrtica <> 0) then
            BEGIN
            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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :vrrtica, 0, :MONTO, :prtica/10, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA + vrrtica;
                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)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :vrrtica, 0, :MONTO, :prtica/10, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA + vrrtica;
                END
            END
          END
        END
      END   /* RTICA */
    if ((RTCREE = 'C') or (RTCREE = 'K')) then
      BEGIN
      execute procedure redondee(VRRTCREE, DIG) returning_values (VRRTCREE);
      if (VRRTCREE <> 0) then
        BEGIN
        if (RTCREE = 'C') then
            CTARTCREE = TCTARTCREE;
        EXECUTE PROCEDURE cuenta_interfaz_niif(31, :IDDOC, :CTARTCREE, '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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTCREE, 0, :VRSUBT, :prtcree, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
            NROI = NROI + 1;
            SUMA = SUMA + VRRTCREE;
            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)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTCREE, 0, :VRSUBT, :prtcree, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            SUMA = SUMA + VRRTCREE;
            END
        /* AUTORETECREE */
        if (fautorcree <= fecaux) then
            BEGIN
            EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'CUENTA DE AUTORETENCION CREE') returning_values (ctartcree);
            EXECUTE PROCEDURE cuenta_interfaz_niif(31, :IDDOC, :CTARTCREE, '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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :vrrtcree, (:VRSUBT*-1), :prtcree, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA - vrrtcree;
                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)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :vrrtcree, (:VRSUBT*-1), :prtcree, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA - vrrtcree;
                END
            END
        END /* RTCREE */
      END
    if (RTCREE = 'A') then
      BEGIN
      if (VRRTCREE <> 0) then
        BEGIN
        FOR SELECT MAX(COAR_CTARTCREE), MAX(COAR_RTCREE), SUM(FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO), SUM((FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO)*COAR_RTCREE)
          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_CTARTCREE
          INTO :ctartcree, :prtcree, :MONTO, :vrrtcree
          DO
          BEGIN
          MONTO = MONTO * FACTOR;
          vrrtcree = vrrtcree * FACTOR / 100;
          execute procedure redondee(vrrtcree, DIG) returning_values (vrrtcree);
          execute procedure redondee(MONTO, DIG) returning_values (MONTO);
          if (vrrtcree <> 0) then
            BEGIN
            EXECUTE PROCEDURE cuenta_interfaz_niif(31, :IDDOC, :ctartcree, '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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :vrrtcree, 0, :MONTO, :prtcree, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA + vrrtcree;
                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)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :vrrtcree, 0, :MONTO, :prtcree, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA + vrrtcree;
                END
            /* AUTORETENCION */
            if (fautorcree <= fecaux) then
                BEGIN
                EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'CUENTA DE AUTORETENCION CREE') returning_values (ctartcree);
                EXECUTE PROCEDURE cuenta_interfaz_niif(31, :IDDOC, :ctartcree, '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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :vrrtcree, (:MONTO*-1), :prtcree, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                    NROI = NROI + 1;
                    SUMA = SUMA - vrrtcree;
                    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)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :vrrtcree, (:MONTO*-1), :prtcree, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    SUMA = SUMA - vrrtcree;
                    END
                END
            END
          END
        END /* RTCREE */
      END
    /* ARTICULOS DE TERCEROS LLEVE ESE VALOR A LA CUENTA INDICADA */
    SELECT SUM(FADE_TOTAL) FROM FACTURAS_DETALLE F, ARTICULO A
        WHERE F.FACT_ID = :IDDOC AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL)) AND F.arti_cod = A.arti_cod AND A.arti_tercero = 'S'
        INTO :MONTO;
    if (MONTO IS NULL) then
        MONTO = 0;
    if (MONTO <> 0) then
        BEGIN
        if ((CTADTO IS NULL) OR (CTADTO = '')) then
            MONTO = MONTO * FACTOR;
        /* reste las retenciones en la misma cuenta (4 digitos) */
        EXECUTE PROCEDURE lee_configuracion('FACTURACION', 'FACTURAS', 'CUENTA DE CARTERA PARA INGRESOS DE TERCEROS') returning_values(:CTAVENTAS);
        select sum(cnde_debitos-cnde_creditos) from contabilizacion_det where cntb_id = :idc and substring(cnde_cuenta from 1 for 4) = substring(:ctaventas from 1 for 4)
            into :vrrtfte;
        if (vrrtfte is null) then
            vrrtfte = 0;
        monto = monto - vrrtfte;
        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 = '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)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                NROI = NROI + 1;
                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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA + MONTO;
                END
            END /* MONTO <> 0 */
        END
    /* CIERRE 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
            BEGIN
            /* DESCUENTE IMPOCONSUMO DEL COSTO */
            SELECT SUM(FADE_CONSUMO) FROM FACTURAS_DETALLE F WHERE F.FACT_ID = :IDDOC AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
                INTO :IMPTOS;
            SUMA = SUMA + IMPTOS;
            END
        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
            /* CUENTA DE 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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :DEBITO, :CREDITO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
        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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :DEBITO, :CREDITO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
        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 = '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)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                    NROI = NROI + 1;
                    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)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    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 = '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)
                    VALUES (:IDC, :NROI, :CTACOSTOS, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                NROI = NROI + 1;
                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)
                    VALUES (:IDC, :NROI, :CTACOSTOS, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                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 = '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)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                    NROI = NROI + 1;
                    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)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    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 = '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)
                    VALUES (:IDC, :NROI, :CTAINVEN, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                NROI = NROI + 1;
                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)
                    VALUES (:IDC, :NROI, :CTAINVEN, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTADIC, :CONC, '', :MONTO, 0, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTADIC, :CONC, '', 0, :MONTO, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                NROI = NROI + 1;
                END
            ELSE
                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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTADIC, :CONC, '', :MONTO, 0, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTADIC, :CONC, '', 0, :MONTO, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                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(31, :IDDOC, :PREF, 1);
    ERROR = ERROR + 1;
    VER = 'S';
    SUSPEND;
    END
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER procedure CONTABIL_NOTACRCL_NIIF (
    IDDOC integer,
    IDINTER integer,
    IDC integer)
returns (
    ERRORI integer,
    VER char(1))
AS
declare variable PREF VARCHAR(4);
declare variable NUM VARCHAR(8);
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 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 PRTCREE NUMERIC(9, 2);
declare variable VRRCREE 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 CTARCREE VARCHAR(20);
declare variable EXISTE CHAR(1);
declare variable CUENTA VARCHAR(20);
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 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 monto NUMERIC(18, 2);
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 ANULADO CHAR(1);
declare variable AUTORET VARCHAR(10);
declare variable FAUTORET DATE;
declare variable AUTORCREE VARCHAR(10);
declare variable FAUTORCREE DATE;
BEGIN
EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'FECHA AUTORETENEDOR NO DESCONTAR RETENCIONES DEL SALDO PERO SI CONTABILIZARLAS') returning_values (AUTORET);
if (AUTORET <> '') then
    FAUTORET = CAST(AUTORET AS DATE);
else
    FAUTORET = '9999/12/31';
EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'FECHA AUTORETENEDOR DE RETENCION CREE') returning_values (AUTORCREE);
if (AUTORCREE <> '') then
    FAUTORCREE = CAST(AUTORCREE AS DATE);
else
    FAUTORCREE = '9999/12/31';
  /* BUSQUE LA INTERFACE */
  EXISTE = 'N';
  SELECT 'S', N.INCA_BASE, N.INCA_IVA, N.INCA_RTFTE, N.INCA_RTIVA, N.INCA_RTICA, N.INCA_RTCREE, N.INCA_CLIE, N.INCA_CTABASE, N.INCA_CTAIVA, N.INCA_CTARTFTE, N.INCA_CTARTIVA, N.INCA_CTARTICA, N.INCA_CTARTCREE, N.INCA_CTACLIE, INCA_CONFIRMAR
    FROM INTERFAZ_CARTERA I, interfaz_cartera_niif N
    WHERE I.INCA_ID = :IDINTER AND I.inca_id = N.inca_id
    INTO :EXISTE, :BASE, :IVA, :RTFTE, :RTIVA, :RTICA, :RTCREE, :CLIE, :CTABASE, :CTAIVA, :CTARTFTE, :CTARTIVA, :CTARTICA, :CTARCREE, :CTACLIE, :VER;
  if (EXISTE = 'S') then
    BEGIN
    /* TRAIGA EL ENCABEZADO DE LA NOTA */
    SELECT PREF_PRE, NCCL_NUMERO, NCCL_FECHA, N.TERC_NIT, NCCL_CONC, NCCL_IVAMONTO, NCCL_MONTO, NCCL_RTFTEPORC, NCCL_RTFTEMONTO,
        NCCL_RTIVAPORC, NCCL_RTIVAMONTO, NCCL_RTICAPORC, NCCL_RTICAMONTO, NCCL_RTCREE, NCCL_RTCREEM,
        TERC_CTAVENTA, TERC_CTARTFTE, TERC_CTARTIVA, TERC_CTARTICA, TERC_CTARCREE, TERC_CTACLIENTE, NCCL_ANULADO
        FROM NOTAS_CREDITO_CLIENTES N, TERCEROS T
        WHERE NCCL_ID = :IDDOC AND N.TERC_NIT = T.TERC_NIT
        INTO :PREF, :NUM, :FECAUX, :NIT, :CONC, :VRIVA, :VRTOTAL, :PRTFTE, :VRRTFTE,
        :PORC, :VRRTIVA, :PRTICA, :VRRTICA, :prtcree, :vrrcree,
        :TCTABASE, TCTARTFTE, TCTARTIVA, TCTARTICA, tctartcree, TCTACLIEN, ANULADO;
    if (ANULADO = 'N') then
      BEGIN
      SELECT PREF_CENTRO, PREF_PROY FROM PREFIJOS P, NOTAS_CREDITO_CLIENTES N
        WHERE P.PREF_PRE = N.PREF_PRE AND P.TIDO_COD = 42 AND NCCL_ID = :IDDOC INTO :CENTRO, :PROY;
      NUMERO = PREF || NUM;
      VRSUBT = VRTOTAL; /* BASE DE RETEFTE Y RETEICA */
      EXECUTE PROCEDURE FECHA_A_CONTA(:FECAUX) returning_values (:FECHA);
      NROI = 100000;
      SUMA = 0;
      ERRORI = 0;
      IF ((BASE = 'C') OR (BASE = 'K')) THEN
        BEGIN
        IF (BASE = 'C') 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(42, :IDDOC, :CTABASE, 2);
                CUENTA = CTABASE;
                TIPOCUEN = 'N';
                ERRORI = ERRORI + 1;
                end
            if (ES_RETENCION = 'S') then
                if (PORC <> 0) then
                    montobase = FLOOR(VRSUBT / PORC);
                else
                    montobase = VRSUBT;
            else
                montobase = 0;
            if (TIPOCUEN = 'I') then
                BEGIN
                EXECUTE PROCEDURE ERRORINT(42, :IDDOC, :CUENTA, 3);
                TIPOCUEN = 'N';
                ERRORI = ERRORI + 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)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRSUBT, 0, :montobase, :porc, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :fecha, NULL, 0, 42);
                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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRSUBT, 0, :montobase, :porc, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA + VRSUBT;
                END
            END /* MONTO <> 0 */
        END /* BASE CLIENTE O CONSTANTE */
    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(42, :IDDOC, :CTAIVA, 2);
                CUENTA = CTAIVA;
                TIPOCUEN = 'N';
                ERRORI = ERRORI + 1;
                end
            if (TIPOCUEN = 'I') then
                BEGIN
                EXECUTE PROCEDURE ERRORINT(42, :IDDOC, :CUENTA, 3);
                TIPOCUEN = 'N';
                ERRORI = ERRORI + 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)
                    VALUES (:IDC, :NROI, :CTAIVA, :CONC, '', 0, :VRIVA, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :fecha, NULL, 0, 42);
                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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTAIVA, :CONC, '', :VRIVA, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA + VRIVA;
                END
            END /* VRIVA <> 0 */
        END /* IVA EN CTA CONSTANTE */
    /* RETENCION FUENTE */
    if ((RTFTE = 'C') or (RTFTE = 'K')) then
      if (VRRTFTE <> 0) then
        BEGIN
        if (RTFTE = 'C') 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(42, :IDDOC, :CTARTFTE, 2);
            CUENTA = CTARTFTE;
            TIPOCUEN = 'N';
            ERRORI = ERRORI + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            EXECUTE PROCEDURE ERRORINT(42, :IDDOC, :CUENTA, 3);
            TIPOCUEN = 'N';
            ERRORI = ERRORI + 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)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTFTE, (:VRSUBT * -1), :PRTFTE, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :fecha, NULL, 0, 42);
            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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTFTE, (:VRSUBT * -1), :PRTFTE, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            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);
            SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS_NIIF
                WHERE CUEN_COD = :CTARTFTE INTO :CUENTA, :TIPOCUEN;
            if (CUENTA IS NULL) then
                begin
                EXECUTE PROCEDURE ERRORINT(42, :IDDOC, :CTARTFTE, 2);
                CUENTA = CTARTFTE;
                TIPOCUEN = 'N';
                ERRORI = ERRORI + 1;
                end
            if (TIPOCUEN = 'I') then
                BEGIN
                EXECUTE PROCEDURE ERRORINT(42, :IDDOC, :CUENTA, 3);
                TIPOCUEN = 'N';
                ERRORI = ERRORI + 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)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTFTE, 0, :VRSUBT, :PRTFTE, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :fecha, NULL, 0, 42);
                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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTFTE, 0, :VRSUBT, :PRTFTE, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA + VRRTFTE;
                END
            END
        END /* RTFTE */
    /* RETENCION IVA */
    if ((RTIVA = 'C') or (RTIVA = 'K')) then
      if (VRRTIVA <> 0) then
        BEGIN
        if (RTIVA = 'C') 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(42, :IDDOC, :CTARTIVA, 2);
            CUENTA = CTARTIVA;
            ERRORI = ERRORI + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            EXECUTE PROCEDURE ERRORINT(42, :IDDOC, :CUENTA, 3);
            TIPOCUEN = 'N';
            ERRORI = ERRORI + 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)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTIVA, :VRIVA, :PORC, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :fecha, NULL, 0, 42);
            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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTIVA, :VRIVA, :PORC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            SUMA = SUMA - VRRTIVA;
            END
        END /* RTIVA */
    /* RETENCION DE ICA */
    if ((RTICA = 'C') or (RTICA = 'K')) then
      if (VRRTICA <> 0) then
        BEGIN
        if (RTICA = 'C') 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(42, :IDDOC, :CTARTICA, 2);
            CUENTA = CTARTICA;
            TIPOCUEN = 'N';
            ERRORI = ERRORI + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            EXECUTE PROCEDURE ERRORINT(42, :IDDOC, :CUENTA, 3);
            TIPOCUEN = 'N';
            ERRORI = ERRORI + 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)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTICA, :VRSUBT, :PRTICA, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :fecha, NULL, 0, 42);
            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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTICA, :VRSUBT, :PRTICA, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            SUMA = SUMA - VRRTICA;
            END
        END /* RTICA */
    /* RETENCION CREE */
    if ((RTCREE = 'C') or (RTCREE = 'K')) then
      if (vrrcree <> 0) then
        BEGIN
        if (RTCREE = 'C') then
            ctarcree = tctartcree;
        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(42, :IDDOC, :ctarcree, 2);
            CUENTA = ctarcree;
            TIPOCUEN = 'N';
            ERRORI = ERRORI + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            EXECUTE PROCEDURE ERRORINT(42, :IDDOC, :CUENTA, 3);
            TIPOCUEN = 'N';
            ERRORI = ERRORI + 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)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :vrrcree, :VRSUBT, :prtcree, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :fecha, NULL, 0, 42);
            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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :vrrcree, :VRSUBT, :prtcree, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            SUMA = SUMA - vrrcree;
            END
        /* AUTORETENCION */
        if (fautorcree <= fecaux) then
            BEGIN
            EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'CUENTA DE AUTORETENCION CREE') returning_values (ctarcree);
            SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS_NIIF
                WHERE CUEN_COD = :ctarcree INTO :CUENTA, :TIPOCUEN;
            if (CUENTA IS NULL) then
                begin
                EXECUTE PROCEDURE ERRORINT(42, :IDDOC, :CTARTFTE, 2);
                CUENTA = CTARTFTE;
                TIPOCUEN = 'N';
                ERRORI = ERRORI + 1;
                end
            if (TIPOCUEN = 'I') then
                BEGIN
                EXECUTE PROCEDURE ERRORINT(42, :IDDOC, :CUENTA, 3);
                TIPOCUEN = 'N';
                ERRORI = ERRORI + 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)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :vrrcree, 0, :VRSUBT, :prtcree, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :fecha, NULL, 0, 42);
                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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :vrrcree, 0, :VRSUBT, :prtcree, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA + vrrcree;
                END
            END
        END /* RTCREE */
    /* recorra las cuentas adicionales */
    FOR SELECT INCD_CUENTA, INCD_BASE, INCD_PORC, INCD_VALOR, INCD_DB
        FROM INTERFAZ_CARTERA_CTAS
        WHERE INCA_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(42, :IDDOC, :CUENTAADIC, 2);
            CUENTA = CUENTAADIC;
            TIPOCUEN = 'N';
            ERRORI = ERRORI + 1;
            end
        /* DEPENDE DEL TIPO DE CUENTA */
        if (TIPOCUEN = 'I') then
            BEGIN
            EXECUTE PROCEDURE ERRORINT(42, :IDDOC, :CUENTA, 3);
            TIPOCUEN = 'N';
            ERRORI = ERRORI + 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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTAADIC, :CONC, '', :MONTO, 0, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 42);
                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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTAADIC, :CONC, '', 0, :MONTO, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 42);
                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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTAADIC, :CONC, '', :MONTO, 0, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTAADIC, :CONC, '', 0, :MONTO, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                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 = 'C') 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 = 'C') 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(42, :IDDOC, :CTACLIE, 2);
            CUENTA = CTACLIE;
            ERRORI = ERRORI + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            EXECUTE PROCEDURE ERRORINT(42, :IDDOC, :CUENTA, 3);
            TIPOCUEN = 'N';
            ERRORI = ERRORI + 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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :DEBITO, :CREDITO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :fecha, NULL, 0, 42);
        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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :DEBITO, :CREDITO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
        NROI = NROI + 1;
        END /* SUMA EN CARTERA */
    if (ERRORI > 0) then
        VER = 'S';
    SUSPEND;
    END /* NO ANULADO */
  END /* EXISTE LA INTERFAZ */
ELSE
  BEGIN
  EXECUTE PROCEDURE ERRORINT(42, :IDDOC, :PREF, 1);
  ERRORI = ERRORI + 1;
  VER = 'S';
  SUSPEND;
  END
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER procedure CONTABIL_NOTACRPR_NIIF (
    IDDOC integer,
    IDINTER integer,
    IDC integer)
returns (
    ERRORI integer,
    VER char(1))
AS
declare variable PREF VARCHAR(4);
declare variable NUM VARCHAR(8);
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 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 BASERTFTE NUMERIC(18,2);
BEGIN
ERRORI = 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_BASERTFTE
    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, :basertfte;
  if (ANULADO = 'N') then
    BEGIN
    SELECT PREF_CENTRO, PREF_PROY 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;
    /* 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;

    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(52, :IDDOC, :CTABASE, 2);
                CUENTA = CTABASE;
                ERRORI = ERRORI + 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';
                ERRORI = ERRORI + 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)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRSUBT, :MONTOBASE, :PORC, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 52);
                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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRSUBT, :MONTOBASE, :PORC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                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(52, :IDDOC, :CTABASE, 2);
                    CUENTA = CTABASE;
                    ERRORI = ERRORI + 1;
                    end
                montobase = 0;
                if (TIPOCUEN = 'I') then
                    BEGIN
                    EXECUTE PROCEDURE ERRORINT(52, :IDDOC, :CUENTA, 3);
                    TIPOCUEN = 'N';
                    ERRORI = ERRORI + 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)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRSUBT, :MONTOBASE, :PORC, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 52);
                    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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRSUBT, :MONTOBASE, :PORC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    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(52, :IDDOC, :CTAIVA, 2);
                    CUENTA = CTAIVA;
                    ERRORI = ERRORI + 1;
                    end
                if (TIPOCUEN = 'I') then
                    BEGIN
                    EXECUTE PROCEDURE ERRORINT(52, :IDDOC, :CUENTA, 3);
                    TIPOCUEN = 'N';
                    ERRORI = ERRORI + 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)
                        VALUES (:IDC, :NROI, :CTAIVA, :CONC, '', 0, :VRIVA, :VRSUBT, :PORC, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 52);
                    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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTAIVA, :CONC, '', 0, :VRIVA, :VRSUBT, :PORC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    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(52, :IDDOC, :CTAIVA, 2);
                CUENTA = CTAIVA;
                ERRORI = ERRORI + 1;
                end
            if (TIPOCUEN = 'I') then
                BEGIN
                EXECUTE PROCEDURE ERRORINT(52, :IDDOC, :CUENTA, 3);
                TIPOCUEN = 'N';
                ERRORI = ERRORI + 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)
                    VALUES (:IDC, :NROI, :CTAIVA, :CONC, '', 0, :VRIVA, :VRSUBT*-1, :PORC, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 52);
                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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTAIVA, :CONC, '', 0, :VRIVA, :VRSUBT*-1, :PORC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                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(52, :IDDOC, :CTARTFTE, 2);
            CUENTA = CTARTFTE;
            ERRORI = ERRORI + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            EXECUTE PROCEDURE ERRORINT(52, :IDDOC, :CUENTA, 3);
            TIPOCUEN = 'N';
            ERRORI = ERRORI + 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)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTFTE, 0, :basertfte, :PRTFTE, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 52);
            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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTFTE, 0, :basertfte, :PRTFTE, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            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(52, :IDDOC, :CTARTIVA, 2);
            CUENTA = CTARTIVA;
            ERRORI = ERRORI + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            EXECUTE PROCEDURE ERRORINT(52, :IDDOC, :CUENTA, 3);
            TIPOCUEN = 'N';
            ERRORI = ERRORI + 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)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTIVA, 0, :VRIVA, :PORC, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 52);
            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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTIVA, 0, :VRIVA, :PORC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            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(52, :IDDOC, :CTARTICA, 2);
            CUENTA = CTARTICA;
            ERRORI = ERRORI + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            EXECUTE PROCEDURE ERRORINT(52, :IDDOC, :CUENTA, 3);
            TIPOCUEN = 'N';
            ERRORI = ERRORI + 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)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTICA, 0, :VRSUBT, :PRTICA, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 52);
            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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTICA, 0, :VRSUBT, :PRTICA, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            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(52, :IDDOC, :ctartcree, 2);
            CUENTA = ctartcree;
            ERRORI = ERRORI + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            EXECUTE PROCEDURE ERRORINT(52, :IDDOC, :CUENTA, 3);
            TIPOCUEN = 'N';
            ERRORI = ERRORI + 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)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :vrrtcree, 0, :VRSUBT, :prtcree, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 52);
            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)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :vrrtcree, 0, :VRSUBT, :prtcree, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            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(52, :IDDOC, :CUENTAADIC, 2);
            CUENTA = CUENTAADIC;
            ERRORI = ERRORI + 1;
            end
        /* DEPENDE DEL TIPO DE CUENTA */
        if (TIPOCUEN = 'I') then
            BEGIN
            EXECUTE PROCEDURE ERRORINT(52, :IDDOC, :CUENTA, 3);
            TIPOCUEN = 'N';
            ERRORI = ERRORI + 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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTAADIC, :CONC, '', :MONTO, 0, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 31);
                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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTAADIC, :CONC, '', 0, :MONTO, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 31);
                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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTAADIC, :CONC, '', :MONTO, 0, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTAADIC, :CONC, '', 0, :MONTO, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                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(52, :IDDOC, :CTACLIE, 2);
            CUENTA = CTACLIE;
            ERRORI = ERRORI + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            EXECUTE PROCEDURE ERRORINT(52, :IDDOC, :CUENTA, 3);
            TIPOCUEN = 'N';
            ERRORI = ERRORI + 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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :DEBITO, :CREDITO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 52);
        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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :DEBITO, :CREDITO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
        NROI = NROI + 1;
        END /* SUMA EN CARTERA */
    if (ERRORI > 0) then
        VER = 'S';
    SUSPEND;
    END /* NO ANULADO */
  END /* EXISTE LA INTERFAZ */
ELSE
    BEGIN
    EXECUTE PROCEDURE ERRORINT(52, :IDDOC, :PREF, 1);
    ERRORI = ERRORI + 1;
    VER = 'S';
    SUSPEND;
    END
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER procedure CONTABIL_NOTADBCL_NIIF (
    IDDOC integer,
    IDINTER integer,
    IDC integer)
returns (
    ERRORI integer,
    VER char(1))
AS
declare variable PREF VARCHAR(4);
declare variable NUM VARCHAR(8);
declare variable NUMERO VARCHAR(10);
declare variable FECAUX DATE;
declare variable FECHA CHAR(8);
declare variable CONC CHAR(120);
declare variable VENCE CHAR(8);
declare variable VENCEAUX DATE;
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 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 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 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 MONTO NUMERIC(18,2);
declare variable MONTOBASE NUMERIC(18,2);
declare variable ANULADO CHAR(1);
declare variable AUTORET VARCHAR(10);
declare variable FAUTORET DATE;
declare variable AUTORCREE VARCHAR(10);
declare variable FAUTORCREE DATE;
BEGIN
EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'FECHA AUTORETENEDOR NO DESCONTAR RETENCIONES DEL SALDO PERO SI CONTABILIZARLAS') returning_values (AUTORET);
if (AUTORET <> '') then
    FAUTORET = CAST(AUTORET AS DATE);
else
    FAUTORET = '9999/12/31';
EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'FECHA AUTORETENEDOR DE RETENCION CREE') returning_values (AUTORCREE);
if (AUTORCREE <> '') then
    FAUTORCREE = CAST(AUTORCREE AS DATE);
else
    FAUTORCREE = '9999/12/31';
/* BUSQUE LA INTERFACE */
EXISTE = 'N';
SELECT 'S', N.INCA_BASE, N.INCA_IVA, N.INCA_RTFTE, N.INCA_RTIVA, N.INCA_RTICA, N.INCA_RTCREE, N.INCA_CLIE, N.INCA_CTABASE, N.INCA_CTAIVA,
    N.INCA_CTARTFTE, N.INCA_CTARTIVA, N.INCA_CTARTICA, N.INCA_CTARTCREE, N.INCA_CTACLIE, INCA_CONFIRMAR
    FROM INTERFAZ_CARTERA I, interfaz_cartera_niif N
    WHERE I.INCA_ID = :IDINTER AND I.inca_id = N.inca_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, NDCL_NUMERO, NDCL_FECHA, NDCL_VENCE, N.TERC_NIT, NDCL_CONC, NDCL_IVAMONTO, NDCL_MONTO, NDCL_RTFTEPORC, NDCL_RTFTEMONTO,
    NDCL_RTIVAPORC, NDCL_RTIVAMONTO, NDCL_RTICAPORC, NDCL_RTICAMONTO, NDCL_RTCREE, NDCL_RTCREEM, TERC_CTAVENTA,
    TERC_CTARTFTE, TERC_CTARTIVA, TERC_CTARTICA, TERC_CTARCREE, TERC_CTACLIENTE, NDCL_ANULADO
    FROM NOTAS_DEBITO_CLIENTES N, TERCEROS T
    WHERE NDCL_ID = :IDDOC AND N.TERC_NIT = T.TERC_NIT
    INTO :PREF, :NUM, :FECAUX, :VENCEAUX, :NIT, :CONC, :VRIVA, :VRTOTAL, :PRTFTE, :VRRTFTE,
    :PORC, :VRRTIVA, :PRTICA, :VRRTICA, :prtcree, :vrrtcree, :TCTABASE,
    :TCTARTFTE, TCTARTIVA, TCTARTICA, tctartcree, TCTACLIEN, ANULADO;
  if (ANULADO = 'N') then
    BEGIN
    SELECT PREF_CENTRO, PREF_PROY FROM PREFIJOS P, NOTAS_DEBITO_CLIENTES N
        WHERE P.PREF_PRE = N.PREF_PRE AND P.TIDO_COD = 41 AND NDCL_ID = :IDDOC INTO :CENTRO, :PROY;
    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;
    ERRORI = 0;
    IF ((BASE = 'C') OR (BASE = 'K')) THEN
        BEGIN
        IF (BASE = 'C') 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(41, :IDDOC, :CTABASE, 2);
                CUENTA = CTABASE;
                TIPOCUEN = 'N';
                ERRORI = ERRORI + 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(41, :IDDOC, :CUENTA, 3);
                TIPOCUEN = 'N';
                ERRORI = ERRORI + 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)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRSUBT, :MONTOBASE, :PORC, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 41);
                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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRSUBT, :MONTOBASE, :PORC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA - VRSUBT;
                END
            END /* MONTO <> 0 */
        END /* BASE CLIENTE O CONSTANTE */
    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(41, :IDDOC, :CTAIVA, 2);
                CUENTA = CTAIVA;
                TIPOCUEN = 'N';
                ERRORI = ERRORI + 1;
                end
            if (TIPOCUEN = 'I') then
                BEGIN
                EXECUTE PROCEDURE ERRORINT(41, :IDDOC, :CUENTA, 3);
                TIPOCUEN = 'N';
                ERRORI = ERRORI + 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)
                    VALUES (:IDC, :NROI, :CTAIVA, :CONC, '', 0, :VRIVA, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 41);
                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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTAIVA, :CONC, '', 0, :VRIVA, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA - VRIVA;
                END
            END /* VRIVA <> 0 */
        END /* IVA EN CTA CONSTANTE */
    /* RETENCION FUENTE */
    if ((RTFTE = 'C') or (RTFTE = 'K')) then
      if (VRRTFTE <> 0) then
        BEGIN
        if (RTFTE = 'C') 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(41, :IDDOC, :CTARTFTE, 2);
            CUENTA = CTARTFTE;
            TIPOCUEN = 'N';
            ERRORI = ERRORI + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            EXECUTE PROCEDURE ERRORINT(41, :IDDOC, :CUENTA, 3);
            TIPOCUEN = 'N';
            ERRORI = ERRORI + 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)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTFTE, 0, :VRSUBT, :PRTFTE, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 41);
            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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTFTE, 0, :VRSUBT, :PRTFTE, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            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_NIIF
                WHERE CUEN_COD = :CTARTFTE INTO :CUENTA, :TIPOCUEN;
            if (CUENTA IS NULL) then
                begin
                EXECUTE PROCEDURE ERRORINT(41, :IDDOC, :CTARTFTE, 2);
                CUENTA = CTARTFTE;
                TIPOCUEN = 'N';
                ERRORI = ERRORI + 1;
                end
            if (TIPOCUEN = 'I') then
                BEGIN
                EXECUTE PROCEDURE ERRORINT(41, :IDDOC, :CUENTA, 3);
                TIPOCUEN = 'N';
                ERRORI = ERRORI + 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)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTFTE, (:VRSUBT*-1), :PRTFTE, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 41);
                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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTFTE, (:VRSUBT*-1), :PRTFTE, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA - VRRTFTE;
                END
            END
        END /* RTFTE */
    /* RETENCION IVA */
    if ((RTIVA = 'C') or (RTIVA = 'K')) then
      if (VRRTIVA <> 0) then
        BEGIN
        if (RTIVA = 'C') 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(41, :IDDOC, :CTARTIVA, 2);
            CUENTA = CTARTIVA;
            TIPOCUEN = 'N';
            ERRORI = ERRORI + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            EXECUTE PROCEDURE ERRORINT(41, :IDDOC, :CUENTA, 3);
            TIPOCUEN = 'N';
            ERRORI = ERRORI + 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)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTIVA, 0, :VRIVA, :PORC, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 41);
            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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTIVA, 0, :VRIVA, :PORC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            SUMA = SUMA + VRRTIVA;
            END
        END /* RTIVA */
    /* RETENCION DE ICA */
    if ((RTICA = 'C') or (RTICA = 'K')) then
      if (VRRTICA <> 0) then
        BEGIN
        if (RTICA = 'C') 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(41, :IDDOC, :CTARTICA, 2);
            CUENTA = CTARTICA;
            ERRORI = ERRORI + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            EXECUTE PROCEDURE ERRORINT(41, :IDDOC, :CUENTA, 3);
            TIPOCUEN = 'N';
            ERRORI = ERRORI + 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)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTICA, 0, :VRSUBT, :PRTICA, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 41);
            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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTICA, 0, :VRSUBT, :PRTICA, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            SUMA = SUMA + VRRTICA;
            END
        END /* RTICA */
    /* RETENCION CREE */
    if ((RTCREE = 'C') or (RTCREE = 'K')) then
      if (VRRTCREE <> 0) then
        BEGIN
        if (RTCREE = 'C') 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(41, :IDDOC, :CTARTCREE, 2);
            CUENTA = CTARTCREE;
            ERRORI = ERRORI + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            EXECUTE PROCEDURE ERRORINT(41, :IDDOC, :CUENTA, 3);
            TIPOCUEN = 'N';
            ERRORI = ERRORI + 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)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :vrrtcree, 0, :VRSUBT, :prtcree, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 41);
            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)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :vrrtcree, 0, :VRSUBT, :prtcree, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            SUMA = SUMA + vrrtcree;
            END
        /* AUTORETENCION */
        if (fautorcree <= fecaux) then
            BEGIN
            EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'CUENTA DE AUTORETENCION CREE') returning_values (ctartcree);
            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(41, :IDDOC, :ctartcree, 2);
                CUENTA = ctartcree;
                TIPOCUEN = 'N';
                ERRORI = ERRORI + 1;
                end
            if (TIPOCUEN = 'I') then
                BEGIN
                EXECUTE PROCEDURE ERRORINT(41, :IDDOC, :CUENTA, 3);
                TIPOCUEN = 'N';
                ERRORI = ERRORI + 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)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :vrrtcree, (:VRSUBT*-1), :prtcree, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 41);
                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)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :vrrtcree, (:VRSUBT*-1), :prtcree, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA - vrrtcree;
                END
            END
        END /* RTCREE */
    /* recorra las cuentas adicionales */
    FOR SELECT INCD_CUENTA, INCD_BASE, INCD_PORC, INCD_VALOR, INCD_DB
        FROM INTERFAZ_CARTERA_CTAS
        WHERE INCA_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(41, :IDDOC, :CUENTAADIC, 2);
            CUENTA = CUENTAADIC;
            ERRORI = ERRORI + 1;
            end
        /* DEPENDE DEL TIPO DE CUENTA */
        if (TIPOCUEN = 'I') then
            BEGIN
            EXECUTE PROCEDURE ERRORINT(41, :IDDOC, :CUENTA, 3);
            TIPOCUEN = 'N';
            ERRORI = ERRORI + 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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTAADIC, :CONC, '', :MONTO, 0, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 41);
                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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTAADIC, :CONC, '', 0, :MONTO, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 41);
                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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTAADIC, :CONC, '', :MONTO, 0, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTAADIC, :CONC, '', 0, :MONTO, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                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 = 'C') 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 = 'C') 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(41, :IDDOC, :CTACLIE, 2);
            CUENTA = CTACLIE;
            TIPOCUEN = 'N';
            ERRORI = ERRORI + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            EXECUTE PROCEDURE ERRORINT(41, :IDDOC, :CUENTA, 3);
            TIPOCUEN = 'N';
            ERRORI = ERRORI + 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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :DEBITO, :CREDITO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 41);
        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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :DEBITO, :CREDITO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
        NROI = NROI + 1;
        END /* SUMA EN CARTERA */
    if (ERRORI > 0) then
        VER = 'S';
    SUSPEND;
    END /* NO ANULADO */
  END /* EXISTE LA INTERFAZ */
ELSE
    BEGIN
    EXECUTE PROCEDURE ERRORINT(41, :IDDOC, :PREF, 1);
    ERRORI = ERRORI + 1;
    VER = 'S';
    SUSPEND;
    END
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER procedure CONTABIL_NOTADBPR_NIIF (
    IDDOC integer,
    IDINTER integer,
    IDC integer)
returns (
    ERRORI integer,
    VER char(1))
AS
declare variable PREF VARCHAR(4);
declare variable NUM VARCHAR(8);
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 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 ANULADO CHAR(1);
declare variable TARIFA INTEGER;
declare variable basertfte NUMERIC(18,2);
BEGIN
ERRORI = 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_ANULADO, NDPR_BASE0, NDPR_BASE1, NDPR_BASE2, NDPR_IVA1, NDPR_IVA2, NDPR_BASERTFTE
        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,
        ANULADO, :BASE0, BASE1, :BASE2, :IVA1, :IVA2, :basertfte;
  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;
        
    /* 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 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;
    if (NPROY <> '') then
        PROY = NPROY;
    if (NCENTRO <> '') then
        CENTRO = NCENTRO;
    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;

    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), 51, :IDDOC, 'CUENTA NO EXISTE', 0, :CTABASE);
                CUENTA = CTABASE;
                ERRORI = ERRORI + 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';
                ERRORI = ERRORI + 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)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRSUBT, 0, :MONTOBASE, :prtiva, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 41);
                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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRSUBT, 0, :MONTOBASE, :prtiva, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                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), 51, :IDDOC, 'CUENTA NO EXISTE', 0, :CTABASE);
                    CUENTA = CTABASE;
                    ERRORI = ERRORI + 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';
                    ERRORI = ERRORI + 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)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRSUBT, 0, :MONTOBASE, :prtiva, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 41);
                    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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRSUBT, 0, :MONTOBASE, :prtiva, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    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), 51, :IDDOC, 'CUENTA NO EXISTE', 0, :CTAIVA);
                    CUENTA = CTAIVA;
                    ERRORI = ERRORI + 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';
                    ERRORI = ERRORI + 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)
                        VALUES (:IDC, :NROI, :CTAIVA, :CONC, '', :VRIVA, 0, :vrsubt, :porc, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 41);
                    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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTAIVA, :CONC, '', :VRIVA, 0, :vrsubt, :porc, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    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), 51, :IDDOC, 'CUENTA NO EXISTE', 0, :CTAIVA);
                CUENTA = CTAIVA;
                ERRORI = ERRORI + 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';
                ERRORI = ERRORI + 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)
                    VALUES (:IDC, :NROI, :CTAIVA, :CONC, '', :VRIVA, 0, (:base1+:base2), :porc, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 41);
                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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTAIVA, :CONC, '', :VRIVA, 0, (:base1+:base2), :porc, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                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), 51, :IDDOC, 'CUENTA NO EXISTE', 0, :CTARTFTE);
            CUENTA = CTARTFTE;
            ERRORI = ERRORI + 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';
            ERRORI = ERRORI + 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)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTFTE, (:basertfte*-1), :PRTFTE, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 41);
            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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTFTE, (:basertfte*-1), :PRTFTE, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            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), 51, :IDDOC, 'CUENTA NO EXISTE', 0, :CTARTIVA);
            CUENTA = CTARTIVA;
            ERRORI = ERRORI + 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';
            ERRORI = ERRORI + 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)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTIVA, (:VRIVA*-1), :prtiva, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 41);
            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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTIVA, (:VRIVA*-1), :prtiva, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            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), 51, :IDDOC, 'CUENTA NO EXISTE', 0, :CTARTICA);
            CUENTA = CTARTICA;
            ERRORI = ERRORI + 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';
            ERRORI = ERRORI + 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)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTICA, (:VRSUBT*-1), :PRTICA, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 41);
            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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTICA, (:VRSUBT*-1), :PRTICA, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            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), 51, :IDDOC, 'CUENTA NO EXISTE', 0, :ctartcree);
            CUENTA = CTARTICA;
            ERRORI = ERRORI + 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';
            ERRORI = ERRORI + 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)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :vrrtcree, (:VRSUBT*-1), :prtcree, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 41);
            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)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :vrrtcree, (:VRSUBT*-1), :prtcree, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            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;
        if (MONTO <> 0) then
            BEGIN
            /* 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), 51, :IDDOC, 'CUENTA NO EXISTE', 0, :CUENTAADIC);
                CUENTA = CUENTAADIC;
                ERRORI = ERRORI + 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';
                ERRORI = ERRORI + 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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTAADIC, :CONC, '', :MONTO, 0, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 31);
                    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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTAADIC, :CONC, '', 0, :MONTO, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 31);
                    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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTAADIC, :CONC, '', :MONTO, 0, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTAADIC, :CONC, '', 0, :MONTO, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    SUMA = SUMA - MONTO;
                    END
                NROI = NROI + 1;
                END
            
            NROI = NROI + 1;
            END
        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), 51, :IDDOC, 'CUENTA NO EXISTE', 0, :CTACLIE);
            CUENTA = CTACLIE;
            ERRORI = ERRORI + 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';
            ERRORI = ERRORI + 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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :DEBITO, :CREDITO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 41);
        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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :DEBITO, :CREDITO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
        NROI = NROI + 1;
        END /* SUMA EN CARTERA */
    if (ERRORI > 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);
    ERRORI = ERRORI + 1;
    VER = 'S';
    SUSPEND;
    END
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER procedure CONTABIL_PRODDEV_NIIF (
    IDDOC integer,
    IDINTER integer,
    IDC integer)
returns (
    ERROR integer,
    VER char(1))
AS
declare variable PREFIJO VARCHAR(4);
declare variable NUMERO VARCHAR(8);
declare variable CONCEPTO CHAR(60);
declare variable BASE CHAR(1);
declare variable CTABASE VARCHAR(20);
declare variable CTACIERRE 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 NUMITEMS INTEGER;
declare variable ARTICULO VARCHAR(15);
declare variable SUMA NUMERIC(18,2);
declare variable VRBASE NUMERIC(18,2);
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 ANULADO CHAR(1);
declare variable CENT CHAR(1);
declare variable ORDEN VARCHAR(10);
declare variable CODPROD VARCHAR(20);
BEGIN
  /* BUSQUE LA INTERFACE */
  EXISTE = 'N';
  SELECT 'S', PREF_PRE, N.ININ_BASE, N.ININ_CTABASE, N.ININ_CTACIERRE, ININ_CONFIRMAR, ININ_CENTRO
    FROM INTERFAZ_INVENTARIO I, interfaz_inventario_niif N
    WHERE I.ININ_ID = :IDINTER AND I.inin_id = N.inin_id
    INTO :EXISTE, :PREFIJO, :BASE, :CTABASE, :CTACIERRE, :VER, :CENT;
  if (EXISTE = 'S') then
    BEGIN
    /* TRAIGA EL ENCABEZADO DEL ENSAMBLE */
    SELECT PRDD_PREF, PRDD_NUMERO, P.PROR_NIT, P.pref_pre || P.pror_numero, PRDD_ANULADO, P.ARTI_COD
        FROM produccion_devolucion S, produccion_orden P
        WHERE S.PRDD_ID = :IDDOC AND S.pror_id = P.pror_id
        INTO :PREFIJO, :NUMERO, :NIT, :ORDEN, :ANULADO, :CODPROD;
    if (ANULADO = 'N') then
        BEGIN
        if (CENT = 'B') then
            SELECT BODE_CENTRO, BODE_PROY FROM BODEGA B, produccion_devolucion E
                WHERE B.BODE_COD = E.prdd_bodega AND E.prdd_id = :IDDOC INTO :CENTRO, :PROY;
        ELSE
            SELECT PREF_CENTRO, PREF_PROY FROM PREFIJOS P, produccion_devolucion E
                WHERE P.PREF_PRE = E.prdd_pref AND E.prdd_id = :IDDOC AND P.TIDO_COD = 29 INTO :CENTRO, :PROY;
        /* COMPONGA UN CONCEPTO */
        CONCEPTO = 'DEVOLUCION MATERIALES ' || :prefijo || :numero || ' EN ORDEN ' || :ORDEN;
        NUMITEMS = 100000;
        SUMA = 0;
        ERROR = 0;
        /* PRIMERO EL PRODUCTO */
        if (BASE = 'A') then
            BEGIN
            /* SUME LAS BASES DE LOS ARTICULOS DEL DOCUMENTO */
            FOR SELECT MAX(COAR_CTAINV), SUM(cast(D.prdd_cant as double precision) * D.prdd_costo)
                FROM ARTICULO A, CONTABIL_ARTICULO_NIIF C, produccion_devolucion_det D
                WHERE D.prdd_id = :IDDOC AND A.arti_cod = :codprod AND A.ARTI_COD = C.ARTI_COD
                GROUP BY COAR_CTAINV
                INTO :CTABASE, :MONTO
            DO
                BEGIN
                VRBASE = MONTO;
                if (MONTO <> 0) then
                    BEGIN
                    /* TRAIGA LAS CARACTERISTICAS DE LA CUENTA */
                    SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS_NIIF
                        WHERE CUEN_COD = :CTABASE INTO :CUENTA, :TIPOCUEN;
                    if (CUENTA IS NULL) then
                        begin
                        EXECUTE PROCEDURE ERRORINT(1029, :IDDOC, :CTABASE, 2);
                        CUENTA = CTABASE;
                        ERROR = ERROR + 1;
                        end
                    if (TIPOCUEN = 'I') then
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_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)
                            VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :codprod, 0, 0);
                        NUMITEMS = NUMITEMS + 1;
                        SUMA = SUMA - MONTO;
                        END
                    if (TIPOCUEN = 'C') then
                        BEGIN
                        EXECUTE PROCEDURE ERRORINT(1029, :IDDOC, :CUENTA, 4);
                        TIPOCUEN = 'N';
                        ERROR = ERROR + 1;
                        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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                        NUMITEMS = NUMITEMS + 1;
                        SUMA = SUMA - MONTO;
                        END
                    END
                END /* FOR */

            /* LOS COMPONENTES */
            FOR SELECT MAX(COAR_CTAINV), SUM(cast(D.prdd_cant as double precision) * D.prdd_costo)
                FROM ARTICULO A, CONTABIL_ARTICULO_NIIF C, produccion_devolucion_det D
                WHERE D.prdd_id = :IDDOC AND D.arti_cod = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD
                GROUP BY COAR_CTAINV
                INTO :CTABASE, :MONTO
            DO
                BEGIN
                if (MONTO <> 0) then
                    BEGIN
                    /* TRAIGA LAS CARACTERISTICAS DE LA CUENTA */
                    SELECT CUEN_COD,CUEN_TIPO FROM CUENTAS_NIIF
                        WHERE CUEN_COD = :CTABASE INTO :CUENTA, :TIPOCUEN;
                    if (CUENTA IS NULL) then
                        begin
                        EXECUTE PROCEDURE ERRORINT(1029, :IDDOC, :CTABASE, 2);
                        CUENTA = CTABASE;
                        ERROR = ERROR + 1;
                        end
                    if (TIPOCUEN = 'I') then
                        BEGIN
                        /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                        FOR SELECT D.ARTI_COD, (cast(D.prdd_cant as double precision) * D.prdd_costo)
                            FROM ARTICULO A, CONTABIL_ARTICULO_NIIF C, produccion_devolucion_det D
                            WHERE D.prdd_id = :IDDOC AND D.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND COAR_CTAINV = :CUENTA
                            INTO :ARTICULO, :MONTO
                        DO
                            BEGIN
                            if (MONTO <> 0) then
                                BEGIN
                                INSERT INTO CONTABILIZACION_DET (CNTB_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)
                                    VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ARTICULO, 0, 0);
                                NUMITEMS = NUMITEMS + 1;
                                SUMA = SUMA + MONTO;
                                END
                            END
                        END
                    if (TIPOCUEN = 'C') then
                        BEGIN
                        EXECUTE PROCEDURE ERRORINT(1029, :IDDOC, :CUENTA, 4);
                        TIPOCUEN = 'N';
                        ERROR = ERROR + 1;
                        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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                        NUMITEMS = NUMITEMS + 1;
                        SUMA = SUMA + MONTO;
                        END
                    END
                END /* FOR */
            END /* BASE */
        if (BASE = 'K') then
            BEGIN
            /* SUME LAS BASES DE LOS ARTICULOS DEL DOCUMENTO */
            SELECT SUM(cast(D.prdd_cant as double precision) * D.prdd_costo)
                FROM produccion_devolucion_det D
                WHERE D.prdd_id = :IDDOC
                INTO :MONTO;
            if (MONTO <> 0) then
                BEGIN
                /* TRAIGA LAS CARACTERISTICAS DE LA CUENTA */
                SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS_NIIF
                    WHERE CUEN_COD = :CTABASE INTO :CUENTA, :TIPOCUEN;
                if (CUENTA IS NULL) then
                    begin
                    EXECUTE PROCEDURE ERRORINT(1029, :IDDOC, :CTABASE, 2);
                    CUENTA = CTABASE;
                    ERROR = ERROR + 1;
                    end
                if (TIPOCUEN = 'I') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_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)
                        VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :codprod, 0, 0);
                    NUMITEMS = NUMITEMS + 1;
                    SUMA = SUMA - MONTO;
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    EXECUTE PROCEDURE ERRORINT(1029, :IDDOC, :CUENTA, 4);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NUMITEMS = NUMITEMS + 1;
                    SUMA = SUMA - MONTO;
                    END
                /* LOS COMPONENTES CON LA CUENTA DE CIERRE */
                SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS_NIIF
                    WHERE CUEN_COD = :ctacierre INTO :CUENTA, :TIPOCUEN;
                if (CUENTA IS NULL) then
                    begin
                    EXECUTE PROCEDURE ERRORINT(1029, :IDDOC, :ctacierre, 2);
                    CUENTA = :ctacierre;
                    ERROR = ERROR + 1;
                    end
                if (TIPOCUEN = 'I') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_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)
                        VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :codprod, 0, 0);
                    NUMITEMS = NUMITEMS + 1;
                    SUMA = SUMA + MONTO;
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    EXECUTE PROCEDURE ERRORINT(1029, :IDDOC, :CUENTA, 4);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NUMITEMS = NUMITEMS + 1;
                    SUMA = SUMA + MONTO;
                    END
                END
            END /* BASE K O T */
        /* recorra las cuentas adicionales */
        FOR SELECT INIC_CUENTA, INIC_BASE, INIC_PORC, INIC_VALOR, INIC_DB
            FROM INTERFAZ_INVENTARIO_CTAS
            WHERE ININ_ID = :IDINTER
            INTO :CUENTAADIC, :BASEADIC, :PORCADIC, :VALORADIC, :DBADIC
            DO
            BEGIN
            if (:BASEADIC = 'SUBTOTAL') then
                VALORADIC = VRBASE;
            if (:BASEADIC = 'TOTAL') then
                VALORADIC = VRBASE;
            MONTO = VALORADIC * PORCADIC;
            if (MONTO <> 0) then
                BEGIN
                /* 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(1029, :IDDOC, :CUENTAADIC, 2);
                    CUENTA = CUENTAADIC;
                    ERROR = ERROR + 1;
                    end
                if (TIPOCUEN = 'I') then
                    BEGIN
                    EXECUTE PROCEDURE ERRORINT(1029, :IDDOC, :CUENTA, 3);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    EXECUTE PROCEDURE ERRORINT(1029, :IDDOC, :CUENTA, 4);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NUMITEMS, :CUENTAADIC, :CONCEPTO, '', :MONTO, 0, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                        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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NUMITEMS, :CUENTAADIC, :CONCEPTO, '', 0, :MONTO, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                        SUMA = SUMA - MONTO;
                        END
                    NUMITEMS = NUMITEMS + 1;
                    END
                END
            END
        END
      if (ERROR > 0) then
        VER = 'S';
      SUSPEND;
      END /* EXISTE LA INTERFAZ */
  ELSE
    BEGIN
    EXECUTE PROCEDURE ERRORINT(1029, :IDDOC, :PREFIJO, 1);
    ERROR = ERROR + 1;
    VER = 'S';
    SUSPEND;
    END
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER procedure CONTABIL_PRODENT_NIIF (
    IDDOC integer,
    IDINTER integer,
    IDC integer)
returns (
    ERROR integer,
    VER char(1))
AS
declare variable PREFIJO VARCHAR(4);
declare variable NUMERO VARCHAR(8);
declare variable CONCEPTO CHAR(60);
declare variable BASE CHAR(1);
declare variable CTABASE VARCHAR(20);
declare variable CTACIERRE 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 NUMITEMS INTEGER;
declare variable SUMA NUMERIC(18,2);
declare variable VRBASE NUMERIC(18,2);
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 ANULADO CHAR(1);
declare variable CENT CHAR(1);
declare variable CLIENTE VARCHAR(60);
declare variable CODPROD VARCHAR(20);
declare variable COSTO NUMERIC(18,2);
declare variable CODRECH VARCHAR(20);
BEGIN
  /* BUSQUE LA INTERFACE */
  EXISTE = 'N';
  SELECT 'S', PREF_PRE, N.ININ_BASE, N.ININ_CTABASE, N.ININ_CTACIERRE, ININ_CONFIRMAR, ININ_CENTRO
    FROM INTERFAZ_INVENTARIO I, interfaz_inventario_niif N
    WHERE I.ININ_ID = :IDINTER AND I.inin_id = N.inin_id
    INTO :EXISTE, :PREFIJO, :BASE, :CTABASE, :CTACIERRE, :VER, :CENT;
  if (EXISTE = 'S') then
    BEGIN
    /* TRAIGA EL ENCABEZADO DEL ENSAMBLE */
    SELECT PRDE_PREF, PRDE_NUMERO, P.PROR_NIT, P.PROR_NOMCLIENTE, PRDE_ANULADO, P.ARTI_COD, E.prde_costo, E.prde_rechazado
        FROM produccion_entrada_enc E, produccion_orden P
        WHERE E.prde_id = :IDDOC AND E.pror_id = P.pror_id
        INTO :PREFIJO, :NUMERO, :NIT, :CLIENTE, :ANULADO, :CODPROD, :COSTO, :codrech;
    if (ANULADO = 'N') then
        BEGIN
        if (CENT = 'B') then
            SELECT BODE_CENTRO, BODE_PROY FROM BODEGA B, produccion_entrada_enc E
                WHERE B.BODE_COD = E.prde_bodprod AND E.prde_id = :IDDOC INTO :CENTRO, :PROY;
        ELSE
            SELECT PREF_CENTRO, PREF_PROY FROM PREFIJOS P, produccion_entrada_enc E
                WHERE P.PREF_PRE = E.prde_pref AND E.prde_id = :IDDOC AND P.TIDO_COD = 20 INTO :CENTRO, :PROY;
        /* COMPONGA UN CONCEPTO */
        CONCEPTO = 'ENTRADA PRODUCCION ' || :prefijo || :numero || '-' || SUBSTRING (:CLIENTE FROM 1 FOR 25);
        NUMITEMS = 100000;
        SUMA = 0;
        ERROR = 0;
        if (BASE = 'A') then
            BEGIN
            /* PRIMERO EL PRODUCTO BUENO */
            SELECT MAX(COAR_CTAINV), SUM(cast(D.pren_cantok as double precision) * :costo)
                FROM ARTICULO A, CONTABIL_ARTICULO_NIIF C, produccion_entrada_det D
                WHERE D.prde_id = :IDDOC AND A.arti_cod = :codprod AND A.ARTI_COD = C.ARTI_COD
                INTO :CTABASE, :MONTO;
            VRBASE = MONTO;
            if (MONTO <> 0) then
                BEGIN
                /* TRAIGA LAS CARACTERISTICAS DE LA CUENTA */
                SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS_NIIF
                    WHERE CUEN_COD = :CTABASE INTO :CUENTA, :TIPOCUEN;
                if (CUENTA IS NULL) then
                    begin
                    EXECUTE PROCEDURE ERRORINT(1020, :IDDOC, :CTABASE, 2);
                    CUENTA = CTABASE;
                    ERROR = ERROR + 1;
                    end
                if (TIPOCUEN = 'I') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_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)
                        VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :codprod, 0, 0);
                    NUMITEMS = NUMITEMS + 1;
                    SUMA = SUMA + MONTO;
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    EXECUTE PROCEDURE ERRORINT(1020, :IDDOC, :CUENTA, 4);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NUMITEMS = NUMITEMS + 1;
                    SUMA = SUMA + MONTO;
                    END
                END
            /* EL PRODUCTO MALO */
            SELECT MAX(COAR_CTAINV), SUM(cast(D.pren_cantmal as double precision) * :costo)
                FROM ARTICULO A, CONTABIL_ARTICULO_NIIF C, produccion_entrada_det D
                WHERE D.prde_id = :IDDOC AND A.arti_cod = :codrech AND A.ARTI_COD = C.ARTI_COD
                INTO :CTABASE, :MONTO;
            if (MONTO <> 0) then
                BEGIN
                /* TRAIGA LAS CARACTERISTICAS DE LA CUENTA */
                SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS_NIIF
                    WHERE CUEN_COD = :CTABASE INTO :CUENTA, :TIPOCUEN;
                if (CUENTA IS NULL) then
                    begin
                    EXECUTE PROCEDURE ERRORINT(1020, :IDDOC, :CTABASE, 2);
                    CUENTA = CTABASE;
                    ERROR = ERROR + 1;
                    end
                if (TIPOCUEN = 'I') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_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)
                        VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :codprod, 0, 0);
                    NUMITEMS = NUMITEMS + 1;
                    SUMA = SUMA + MONTO;
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    EXECUTE PROCEDURE ERRORINT(1020, :IDDOC, :CUENTA, 4);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NUMITEMS = NUMITEMS + 1;
                    SUMA = SUMA + MONTO;
                    END
                END
            END /* BASE */
        /* DSCARGA EL MATERIAL */
        SELECT SUM(cast(D.pren_cantmal+D.pren_cantok as double precision) * :costo)
            FROM produccion_entrada_det D WHERE D.prde_id = :IDDOC INTO :MONTO;
        if (MONTO <> 0) then
            BEGIN
            /* TRAIGA LAS CARACTERISTICAS DE LA CUENTA */
            SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS_NIIF
                WHERE CUEN_COD = :ctacierre INTO :CUENTA, :TIPOCUEN;
            if (CUENTA IS NULL) then
                begin
                EXECUTE PROCEDURE ERRORINT(1020, :IDDOC, :ctacierre, 2);
                CUENTA = ctacierre;
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'I') then
                BEGIN
                EXECUTE PROCEDURE ERRORINT(1020, :IDDOC, :CUENTA, 3);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                EXECUTE PROCEDURE ERRORINT(1020, :IDDOC, :CUENTA, 4);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NUMITEMS = NUMITEMS + 1;
                SUMA = SUMA - MONTO;
                END
            END
        /* recorra las cuentas adicionales */
        FOR SELECT INIC_CUENTA, INIC_BASE, INIC_PORC, INIC_VALOR, INIC_DB
            FROM INTERFAZ_INVENTARIO_CTAS
            WHERE ININ_ID = :IDINTER
            INTO :CUENTAADIC, :BASEADIC, :PORCADIC, :VALORADIC, :DBADIC
            DO
            BEGIN
            if (:BASEADIC = 'SUBTOTAL') then
                VALORADIC = VRBASE;
            if (:BASEADIC = 'TOTAL') then
                VALORADIC = VRBASE;
            MONTO = VALORADIC * PORCADIC;
            if (MONTO <> 0) then
                BEGIN
                /* 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(1020, :IDDOC, :CUENTAADIC, 2);
                    CUENTA = CUENTAADIC;
                    ERROR = ERROR + 1;
                    end
                if (TIPOCUEN = 'I') then
                    BEGIN
                    EXECUTE PROCEDURE ERRORINT(1020, :IDDOC, :CUENTA, 3);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    EXECUTE PROCEDURE ERRORINT(1020, :IDDOC, :CUENTA, 4);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NUMITEMS, :CUENTAADIC, :CONCEPTO, '', :MONTO, 0, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                        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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NUMITEMS, :CUENTAADIC, :CONCEPTO, '', 0, :MONTO, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                        SUMA = SUMA - MONTO;
                        END
                    NUMITEMS = NUMITEMS + 1;
                    END
                END
            END
        END
      if (ERROR > 0) then
        VER = 'S';
      SUSPEND;
      END /* EXISTE LA INTERFAZ */
  ELSE
    BEGIN
    EXECUTE PROCEDURE ERRORINT(1020, :IDDOC, :PREFIJO, 1);
    ERROR = ERROR + 1;
    VER = 'S';
    SUSPEND;
    END
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER procedure CONTABIL_PRODSAL_NIIF (
    IDDOC integer,
    IDINTER integer,
    IDC integer)
returns (
    ERROR integer,
    VER char(1))
AS
declare variable PREFIJO VARCHAR(4);
declare variable NUMERO VARCHAR(8);
declare variable CONCEPTO CHAR(60);
declare variable BASE CHAR(1);
declare variable CTABASE VARCHAR(20);
declare variable CTACIERRE 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 NUMITEMS INTEGER;
declare variable ARTICULO VARCHAR(15);
declare variable SUMA NUMERIC(18,2);
declare variable VRBASE NUMERIC(18,2);
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 ANULADO CHAR(1);
declare variable CENT CHAR(1);
declare variable CLIENTE VARCHAR(60);
declare variable CODPROD VARCHAR(20);
BEGIN
  /* BUSQUE LA INTERFACE */
  EXISTE = 'N';
  SELECT 'S', PREF_PRE, N.ININ_BASE, N.ININ_CTABASE, N.ININ_CTACIERRE, ININ_CONFIRMAR, ININ_CENTRO
    FROM INTERFAZ_INVENTARIO I, interfaz_inventario_niif N
    WHERE I.ININ_ID = :IDINTER AND I.inin_id = N.inin_id
    INTO :EXISTE, :PREFIJO, :BASE, :CTABASE, :CTACIERRE, :VER, :CENT;
  if (EXISTE = 'S') then
    BEGIN
    /* TRAIGA EL ENCABEZADO DEL ENSAMBLE */
    SELECT PRSA_PREF, PRSA_NUMERO, P.PROR_NIT, P.PROR_NOMCLIENTE, PRSA_ANULADO, P.ARTI_COD
        FROM produccion_salida_enc S, produccion_orden P
        WHERE S.PRSA_ID = :IDDOC AND S.pror_id = P.pror_id
        INTO :PREFIJO, :NUMERO, :NIT, :CLIENTE, :ANULADO, :CODPROD;
    if (ANULADO = 'N') then
        BEGIN
        if (CENT = 'B') then
            SELECT BODE_CENTRO, BODE_PROY FROM BODEGA B, produccion_salida_enc E
                WHERE B.BODE_COD = E.prsa_bodega AND E.prsa_id = :IDDOC INTO :CENTRO, :PROY;
        ELSE
            SELECT PREF_CENTRO, PREF_PROY FROM PREFIJOS P, produccion_salida_enc E
                WHERE P.PREF_PRE = E.prsa_pref AND E.prsa_id = :IDDOC AND P.TIDO_COD = 28 INTO :CENTRO, :PROY;
        /* COMPONGA UN CONCEPTO */
        CONCEPTO = 'SALIDA A PRODUCCION ' || :prefijo || :numero || '-' || SUBSTRING (:CLIENTE FROM 1 FOR 25);
        NUMITEMS = 100000;
        SUMA = 0;
        ERROR = 0;
        /* PRIMERO EL PRODUCTO */
        if (BASE = 'A') then
            BEGIN
            /* SUME LAS BASES DE LOS ARTICULOS DEL DOCUMENTO */
            FOR SELECT MAX(COAR_CTAINV), SUM(cast(D.prsa_cant as double precision) * D.prsa_costo)
                FROM ARTICULO A, CONTABIL_ARTICULO_NIIF C, produccion_salida_det D
                WHERE D.prsa_id = :IDDOC AND A.arti_cod = :codprod AND A.ARTI_COD = C.ARTI_COD
                GROUP BY COAR_CTAINV
                INTO :CTABASE, :MONTO
            DO
                BEGIN
                VRBASE = MONTO;
                if (MONTO <> 0) then
                    BEGIN
                    /* TRAIGA LAS CARACTERISTICAS DE LA CUENTA */
                    SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS_NIIF
                        WHERE CUEN_COD = :CTABASE INTO :CUENTA, :TIPOCUEN;
                    if (CUENTA IS NULL) then
                        begin
                        EXECUTE PROCEDURE ERRORINT(1028, :IDDOC, :CTABASE, 2);
                        CUENTA = CTABASE;
                        ERROR = ERROR + 1;
                        end
                    if (TIPOCUEN = 'I') then
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_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)
                            VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :codprod, 0, 0);
                        NUMITEMS = NUMITEMS + 1;
                        SUMA = SUMA + MONTO;
                        END
                    if (TIPOCUEN = 'C') then
                        BEGIN
                        EXECUTE PROCEDURE ERRORINT(1028, :IDDOC, :CUENTA, 4);
                        TIPOCUEN = 'N';
                        ERROR = ERROR + 1;
                        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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                        NUMITEMS = NUMITEMS + 1;
                        SUMA = SUMA + MONTO;
                        END
                    END
                END /* FOR */

            /* LOS COMPONENTES */
            FOR SELECT MAX(COAR_CTAINV), SUM(cast(D.prsa_cant as double precision) * D.prsa_costo)
                FROM ARTICULO A, CONTABIL_ARTICULO_NIIF C, produccion_salida_det D
                WHERE D.prsa_id = :IDDOC AND D.arti_cod = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD
                GROUP BY COAR_CTAINV
                INTO :CTABASE, :MONTO
            DO
                BEGIN
                if (MONTO <> 0) then
                    BEGIN
                    /* TRAIGA LAS CARACTERISTICAS DE LA CUENTA */
                    SELECT CUEN_COD,CUEN_TIPO FROM CUENTAS_NIIF
                        WHERE CUEN_COD = :CTABASE INTO :CUENTA, :TIPOCUEN;
                    if (CUENTA IS NULL) then
                        begin
                        EXECUTE PROCEDURE ERRORINT(1028, :IDDOC, :CTABASE, 2);
                        CUENTA = CTABASE;
                        ERROR = ERROR + 1;
                        end
                    if (TIPOCUEN = 'I') then
                        BEGIN
                        /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                        FOR SELECT D.ARTI_COD, (cast(D.prsa_cant as double precision) * D.prsa_costo)
                            FROM ARTICULO A, CONTABIL_ARTICULO_NIIF C, produccion_salida_det D
                            WHERE D.prsa_id = :IDDOC AND D.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND COAR_CTAINV = :CUENTA
                            INTO :ARTICULO, :MONTO
                        DO
                            BEGIN
                            if (MONTO <> 0) then
                                BEGIN
                                INSERT INTO CONTABILIZACION_DET (CNTB_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)
                                    VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ARTICULO, 0, 0);
                                NUMITEMS = NUMITEMS + 1;
                                SUMA = SUMA - MONTO;
                                END
                            END
                        END
                    if (TIPOCUEN = 'C') then
                        BEGIN
                        EXECUTE PROCEDURE ERRORINT(1028, :IDDOC, :CUENTA, 4);
                        TIPOCUEN = 'N';
                        ERROR = ERROR + 1;
                        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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                        NUMITEMS = NUMITEMS + 1;
                        SUMA = SUMA - MONTO;
                        END
                    END
                END /* FOR */
            END /* BASE */
        if (BASE = 'K') then
            BEGIN
            /* SUME LAS BASES DE LOS ARTICULOS DEL DOCUMENTO */
            SELECT SUM(cast(D.prsa_cant as double precision) * D.prsa_costo)
                FROM produccion_salida_det D
                WHERE D.prsa_id = :IDDOC
                INTO :MONTO;
            if (MONTO <> 0) then
                BEGIN
                /* TRAIGA LAS CARACTERISTICAS DE LA CUENTA */
                SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS_NIIF
                    WHERE CUEN_COD = :CTABASE INTO :CUENTA, :TIPOCUEN;
                if (CUENTA IS NULL) then
                    begin
                    EXECUTE PROCEDURE ERRORINT(1028, :IDDOC, :CTABASE, 2);
                    CUENTA = CTABASE;
                    ERROR = ERROR + 1;
                    end
                if (TIPOCUEN = 'I') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_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)
                        VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :codprod, 0, 0);
                    NUMITEMS = NUMITEMS + 1;
                    SUMA = SUMA + MONTO;
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    EXECUTE PROCEDURE ERRORINT(1028, :IDDOC, :CUENTA, 4);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NUMITEMS = NUMITEMS + 1;
                    SUMA = SUMA + MONTO;
                    END
                /* LOS COMPONENTES CON LA CUENTA DE CIERRE */
                SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS_NIIF
                    WHERE CUEN_COD = :ctacierre INTO :CUENTA, :TIPOCUEN;
                if (CUENTA IS NULL) then
                    begin
                    EXECUTE PROCEDURE ERRORINT(1028, :IDDOC, :CTABASE, 2);
                    CUENTA = CTABASE;
                    ERROR = ERROR + 1;
                    end
                if (TIPOCUEN = 'I') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_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)
                        VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :codprod, 0, 0);
                    NUMITEMS = NUMITEMS + 1;
                    SUMA = SUMA - MONTO;
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    EXECUTE PROCEDURE ERRORINT(1028, :IDDOC, :CUENTA, 4);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NUMITEMS = NUMITEMS + 1;
                    SUMA = SUMA - MONTO;
                    END
                END
            END /* BASE K O T */
        /* recorra las cuentas adicionales */
        FOR SELECT INIC_CUENTA, INIC_BASE, INIC_PORC, INIC_VALOR, INIC_DB
            FROM INTERFAZ_INVENTARIO_CTAS
            WHERE ININ_ID = :IDINTER
            INTO :CUENTAADIC, :BASEADIC, :PORCADIC, :VALORADIC, :DBADIC
            DO
            BEGIN
            if (:BASEADIC = 'SUBTOTAL') then
                VALORADIC = VRBASE;
            if (:BASEADIC = 'TOTAL') then
                VALORADIC = VRBASE;
            MONTO = VALORADIC * PORCADIC;
            if (MONTO <> 0) then
                BEGIN
                /* 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(1028, :IDDOC, :CUENTAADIC, 2);
                    CUENTA = CUENTAADIC;
                    ERROR = ERROR + 1;
                    end
                if (TIPOCUEN = 'I') then
                    BEGIN
                    EXECUTE PROCEDURE ERRORINT(1028, :IDDOC, :CUENTA, 3);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    EXECUTE PROCEDURE ERRORINT(1028, :IDDOC, :CUENTA, 4);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NUMITEMS, :CUENTAADIC, :CONCEPTO, '', :MONTO, 0, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                        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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NUMITEMS, :CUENTAADIC, :CONCEPTO, '', 0, :MONTO, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                        SUMA = SUMA - MONTO;
                        END
                    NUMITEMS = NUMITEMS + 1;
                    END
                END
            END
        END
      if (ERROR > 0) then
        VER = 'S';
      SUSPEND;
      END /* EXISTE LA INTERFAZ */
  ELSE
    BEGIN
    EXECUTE PROCEDURE ERRORINT(1028, :IDDOC, :PREFIJO, 1);
    ERROR = ERROR + 1;
    VER = 'S';
    SUSPEND;
    END
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER procedure CONTABIL_PRODUCCION_NIIF (
    IDDOC integer,
    IDINTER integer,
    IDC integer)
returns (
    ERROR integer,
    VER char(1))
AS
declare variable PREFIJO VARCHAR(4);
declare variable NUMERO VARCHAR(6);
declare variable CONCEPTO CHAR(60);
declare variable BASE CHAR(1);
declare variable CTABASE VARCHAR(20);
declare variable CTACIERRE 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 NUMITEMS INTEGER;
declare variable ARTICULO VARCHAR(15);
declare variable IMPTOS NUMERIC(18, 2);
declare variable SUMA NUMERIC(18,2);
declare variable VRBASE NUMERIC(18,2);
declare variable VRIVA NUMERIC(18,2);
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 ANULADO CHAR(1);
declare variable CENT CHAR(1);
declare variable CLIENTE VARCHAR(60);
declare variable CODPROD VARCHAR(20);
BEGIN
  /* BUSQUE LA INTERFACE */
  EXISTE = 'N';
  SELECT 'S', PREF_PRE, N.ININ_BASE, N.ININ_CTABASE, N.ININ_CTACIERRE, ININ_CONFIRMAR, ININ_CENTRO
    FROM INTERFAZ_INVENTARIO I, interfaz_inventario_niif N
    WHERE I.ININ_ID = :IDINTER AND I.inin_id = N.inin_id
    INTO :EXISTE, :PREFIJO, :BASE, :CTABASE, :CTACIERRE, :VER, :CENT;
  if (EXISTE = 'S') then
    BEGIN
    /* TRAIGA EL ENCABEZADO DEL ENSAMBLE */
    SELECT PREF_PRE, PROR_NUMERO, PROR_NIT, PROR_NOMCLIENTE, PROR_ANULADO, ARTI_COD
        FROM PRODUCCION_ORDEN
        WHERE PROR_ID = :IDDOC
        INTO :PREFIJO, :NUMERO, :NIT, :CLIENTE, :ANULADO, :CODPROD;
    if (ANULADO = 'N') then
        BEGIN
        if (CENT = 'B') then
            SELECT BODE_CENTRO, BODE_PROY FROM BODEGA B, produccion_orden E
                WHERE B.BODE_COD = E.pror_bodega AND E.pror_id = :IDDOC INTO :CENTRO, :PROY;
        ELSE
            SELECT PREF_CENTRO, PREF_PROY FROM PREFIJOS P, produccion_orden E
                WHERE P.PREF_PRE = E.PREF_PRE AND E.pror_id = :IDDOC AND P.TIDO_COD = 19 INTO :CENTRO, :PROY;
        CONCEPTO = 'ORDEN DE PRODUCCION ' || :prefijo || :numero || '-' || SUBSTRING (:CLIENTE FROM 1 FOR 25);
        NUMITEMS = 100000;
        SUMA = 0;
        ERROR = 0;
        /* PRIMERO EL PRODUCTO */
        if (BASE = 'A') then
            BEGIN
            /* SUME LAS BASES DE LOS ARTICULOS DEL DOCUMENTO */
            FOR SELECT MAX(COAR_CTAINV), SUM(cast(D.pode_cant as double precision) * D.pode_costo), SUM(D.pode_ivamonto)
                FROM ARTICULO A, CONTABIL_ARTICULO_NIIF C, produccion_orden_detalle D
                WHERE D.pror_id = :IDDOC AND A.arti_cod = :codprod AND A.ARTI_COD = C.ARTI_COD
                GROUP BY COAR_CTAINV
                INTO :CTABASE, :MONTO, :IMPTOS
            DO
                BEGIN
                VRBASE = MONTO;
                VRIVA = :IMPTOS;
                if (MONTO <> 0) then
                    BEGIN
                    /* TRAIGA LAS CARACTERISTICAS DE LA CUENTA */
                    SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS_NIIF
                        WHERE CUEN_COD = :CTABASE INTO :CUENTA, :TIPOCUEN;
                    if (CUENTA IS NULL) then
                        begin
                        EXECUTE PROCEDURE ERRORINT(1019, :IDDOC, :CTABASE, 2);
                        CUENTA = CTABASE;
                        ERROR = ERROR + 1;
                        end
                    if (TIPOCUEN = 'I') then
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_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)
                            VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :codprod, 0, 0);
                        NUMITEMS = NUMITEMS + 1;
                        SUMA = SUMA + MONTO;
                        END
                    if (TIPOCUEN = 'C') then
                        BEGIN
                        EXECUTE PROCEDURE ERRORINT(1019, :IDDOC, :CUENTA, 4);
                        TIPOCUEN = 'N';
                        ERROR = ERROR + 1;
                        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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                        NUMITEMS = NUMITEMS + 1;
                        SUMA = SUMA + MONTO;
                        END
                    END
                END /* FOR */

            /* LOS COMPONENTES */
            FOR SELECT MAX(COAR_CTAINV), SUM(cast(D.pode_cant as double precision) * D.pode_costo), SUM(D.pode_ivamonto)
                FROM ARTICULO A, CONTABIL_ARTICULO_NIIF C, produccion_orden_detalle D
                WHERE D.pror_id = :IDDOC AND D.arti_cod = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD
                GROUP BY COAR_CTAINV
                INTO :CTABASE, :MONTO, :IMPTOS
            DO
                BEGIN
                if (MONTO <> 0) then
                    BEGIN
                    /* TRAIGA LAS CARACTERISTICAS DE LA CUENTA */
                    SELECT CUEN_COD,CUEN_TIPO FROM CUENTAS_NIIF
                        WHERE CUEN_COD = :CTABASE INTO :CUENTA, :TIPOCUEN;
                    if (CUENTA IS NULL) then
                        begin
                        EXECUTE PROCEDURE ERRORINT(1019, :IDDOC, :CTABASE, 2);
                        CUENTA = CTABASE;
                        ERROR = ERROR + 1;
                        end
                    if (TIPOCUEN = 'I') then
                        BEGIN
                        /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                        FOR SELECT D.ARTI_COD, (cast(D.pode_cant as double precision) * D.pode_costo), (D.pode_ivamonto)
                            FROM ARTICULO A, CONTABIL_ARTICULO_NIIF C, produccion_orden_detalle D
                            WHERE D.pror_id = :IDDOC AND D.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND COAR_CTAINV = :CUENTA
                            INTO :ARTICULO, :MONTO, :IMPTOS
                        DO
                            BEGIN
                            if (MONTO <> 0) then
                                BEGIN
                                INSERT INTO CONTABILIZACION_DET (CNTB_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)
                                    VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ARTICULO, 0, 0);
                                NUMITEMS = NUMITEMS + 1;
                                SUMA = SUMA - MONTO;
                                END
                            END
                        END
                    if (TIPOCUEN = 'C') then
                        BEGIN
                        EXECUTE PROCEDURE ERRORINT(1019, :IDDOC, :CUENTA, 4);
                        TIPOCUEN = 'N';
                        ERROR = ERROR + 1;
                        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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                        NUMITEMS = NUMITEMS + 1;
                        SUMA = SUMA - MONTO;
                        END
                    END
                END /* FOR */
            END /* BASE */
        if (BASE = 'K') then
            BEGIN
            /* SUME LAS BASES DE LOS ARTICULOS DEL DOCUMENTO */
            SELECT SUM(cast(D.pode_cant as double precision) * D.pode_costo), SUM(D.pode_ivamonto)
                FROM produccion_orden_detalle D
                WHERE D.pror_id = :IDDOC
                INTO :MONTO, :IMPTOS;
            if (MONTO <> 0) then
                BEGIN
                /* TRAIGA LAS CARACTERISTICAS DE LA CUENTA */
                SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS_NIIF
                    WHERE CUEN_COD = :CTABASE INTO :CUENTA, :TIPOCUEN;
                if (CUENTA IS NULL) then
                    begin
                    EXECUTE PROCEDURE ERRORINT(1019, :IDDOC, :CTABASE, 2);
                    CUENTA = CTABASE;
                    ERROR = ERROR + 1;
                    end
                if (TIPOCUEN = 'I') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_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)
                        VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :codprod, 0, 0);
                    NUMITEMS = NUMITEMS + 1;
                    SUMA = SUMA + MONTO;
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    EXECUTE PROCEDURE ERRORINT(1019, :IDDOC, :CUENTA, 4);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NUMITEMS = NUMITEMS + 1;
                    SUMA = SUMA + MONTO;
                    END
                /* LOS COMPONENTES CON LA CUENTA DE CIERRE */
                SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS_NIIF
                    WHERE CUEN_COD = :ctacierre INTO :CUENTA, :TIPOCUEN;
                if (CUENTA IS NULL) then
                    begin
                    EXECUTE PROCEDURE ERRORINT(1019, :IDDOC, :CTABASE, 2);
                    CUENTA = CTABASE;
                    ERROR = ERROR + 1;
                    end
                if (TIPOCUEN = 'I') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_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)
                        VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :codprod, 0, 0);
                    NUMITEMS = NUMITEMS + 1;
                    SUMA = SUMA - MONTO;
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    EXECUTE PROCEDURE ERRORINT(1019, :IDDOC, :CUENTA, 4);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NUMITEMS = NUMITEMS + 1;
                    SUMA = SUMA - MONTO;
                    END
                END
            END /* BASE K O T */
        /* recorra las cuentas adicionales */
        FOR SELECT INIC_CUENTA, INIC_BASE, INIC_PORC, INIC_VALOR, INIC_DB
            FROM INTERFAZ_INVENTARIO_CTAS
            WHERE ININ_ID = :IDINTER
            INTO :CUENTAADIC, :BASEADIC, :PORCADIC, :VALORADIC, :DBADIC
            DO
            BEGIN
            if (:BASEADIC = 'SUBTOTAL') then
                VALORADIC = VRBASE;
            if (:BASEADIC = 'IVA') then
                VALORADIC = VRIVA;
            if (:BASEADIC = 'TOTAL') then
                VALORADIC = VRBASE + VRIVA;
            MONTO = VALORADIC * PORCADIC;
            if (MONTO <> 0) then
                BEGIN
                /* 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(1019, :IDDOC, :CUENTAADIC, 2);
                    CUENTA = CUENTAADIC;
                    ERROR = ERROR + 1;
                    end
                if (TIPOCUEN = 'I') then
                    BEGIN
                    EXECUTE PROCEDURE ERRORINT(1019, :IDDOC, :CUENTA, 3);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    EXECUTE PROCEDURE ERRORINT(1019, :IDDOC, :CUENTA, 4);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NUMITEMS, :CUENTAADIC, :CONCEPTO, '', :MONTO, 0, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                        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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NUMITEMS, :CUENTAADIC, :CONCEPTO, '', 0, :MONTO, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                        SUMA = SUMA - MONTO;
                        END
                    NUMITEMS = NUMITEMS + 1;
                    END
                END
            END
        END
      if (ERROR > 0) then
        VER = 'S';
      SUSPEND;
      END /* EXISTE LA INTERFAZ */
  ELSE
    BEGIN
    EXECUTE PROCEDURE ERRORINT(1019, :IDDOC, :PREFIJO, 1);
    ERROR = ERROR + 1;
    VER = 'S';
    SUSPEND;
    END
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER procedure CONTABIL_RECICAJA_NIIF (
    IDDOC integer,
    IDINTER integer,
    IDC integer)
returns (
    ERRORI integer,
    VER char(1))
AS
declare variable PREF VARCHAR(4);
declare variable CONC CHAR(120);
declare variable VRDTO NUMERIC(18,2);
declare variable VRRTFTE NUMERIC(18,2);
declare variable VRRTIVA NUMERIC(18,2);
declare variable VRRTICA NUMERIC(18,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 CAJA CHAR(1);
declare variable CTACAJA 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 DTO CHAR(1);
declare variable CTADTO 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 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 TCTARTFTE VARCHAR(20);
declare variable TCTARTIVA VARCHAR(20);
declare variable TCTARTICA VARCHAR(20);
declare variable TCTARTCREE VARCHAR(20);
declare variable TIPOIT INTEGER;
declare variable IDIT INTEGER;
declare variable PREFIT VARCHAR(4);
declare variable NUMIT VARCHAR(8);
declare variable NUMEROIT VARCHAR(10);
declare variable ABONOIT NUMERIC(18,2);
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 ANULADO CHAR(1);
declare variable VRBASE NUMERIC(18,2);
declare variable PORC numeric(9,2);
declare variable OK INTEGER;
declare variable CRUCES NUMERIC(18,2);
declare variable VRCAJA NUMERIC(18,2);
declare variable DIFCAMBIO NUMERIC(18,2);
declare variable CTADIF VARCHAR(20);
declare variable PROVID INTEGER;
declare variable RTFTEC NUMERIC(18,2);
declare variable RTIVAC NUMERIC(18,2);
declare variable RTICAC NUMERIC(18,2);
declare variable RTCREEC NUMERIC(18,2);
declare variable RTFTER CHAR(1);
declare variable CTARTFTER VARCHAR(20);
declare variable RTIVAR CHAR(1);
declare variable CTARTIVAR VARCHAR(20);
declare variable RTICAR CHAR(1);
declare variable CTARTICAR VARCHAR(20);
declare variable RTCREER CHAR(1);
declare variable CTARTCREER VARCHAR(20);
declare variable RET CHAR(2);
declare variable RTIT NUMERIC(18,2);
declare variable EXEDENTE NUMERIC(18,2);
declare variable CTAEXCEDENTE VARCHAR(20);
BEGIN
ERRORI = 0;
/* BUSQUE LA INTERFACE */
EXISTE = 'N';
SELECT 'S',N.INCJ_BASE,N.INCJ_DTOPP,N.INCJ_RTFTE,N.INCJ_RTIVA,N.INCJ_RTICA,N.INCJ_RTCREE,N.INCJ_CAJA,N.INCJ_CTABASE,N.INCJ_CTADTO,
    N.INCJ_CTARTFTE,N.INCJ_CTARTIVA,N.INCJ_CTARTICA,N.INCJ_CTARTCREE,N.INCJ_CTACAJA,INCJ_CONFIRMAR
    FROM INTERFAZ_CAJA I, interfaz_caja_niif N
    WHERE I.INCJ_ID = :IDINTER AND I.incj_id = N.incj_id
    INTO :EXISTE,:BASE,:DTO,:RTFTE,:RTIVA,:RTICA,:RTCREE,:CAJA,:CTABASE,:CTADTO,
    :CTARTFTE,:CTARTIVA,:CTARTICA,:CTARTCREE,:CTACAJA,:VER;
if (EXISTE = 'S') then
  BEGIN
  OK = 0;
  /* TRAIGA EL ENCABEZADO DEL RECIBO */
  SELECT PREF_PRE,R.TERC_NIT,RECA_CONC,RECA_DTOF,RECA_MONTO,RECA_RTFTEMONTO,RECA_RTIVAMONTO,
    RECA_RTICAMONTO,RECA_RTCREEM,TERC_CTARTFTE,TERC_CTARTIVA,TERC_CTARTICA,TERC_CTARCREE,TERC_CTACLIENTE,RECA_ANULADO,
    RECA_PROVID, RECA_EXEDENTE
    FROM RECIBOS_CAJA R,TERCEROS T
    WHERE RECA_ID = :IDDOC AND R.TERC_NIT = T.TERC_NIT
    INTO :PREF,:NIT,:CONC,:VRDTO,:VRTOTAL,:VRRTFTE,:VRRTIVA,
    :VRRTICA,:vrrtcree,TCTARTFTE,TCTARTIVA,TCTARTICA,tctartcree,TCTACLIEN,:ANULADO,:PROVID, :exedente;
  if (ANULADO = 'N') then
    BEGIN
    SELECT PREF_CENTRO,PREF_PROY FROM PREFIJOS
        WHERE PREF_PRE = :PREF AND TIDO_COD = 61 INTO :CENTRO,:PROY;
    NROI = 100000;
    SUMA = 0;
    /* SUME LOS CRUCES PARA LLEVARLOS A LA CUENTA X PAGAR Y RESTAR DE LA CAJA */
    SELECT SUM(RCCR_ABONO) FROM RECIBOS_CAJA_CRUCEC WHERE RECA_ID = :iddoc INTO :CRUCES;
    if (CRUCES IS NULL) then
        CRUCES = 0;
    VRCAJA = VRTOTAL;
    IF ((CAJA = 'K')) THEN
        BEGIN
        if (VRCAJA <> 0) then
            BEGIN
            CUENTA = NULL;
            EXECUTE PROCEDURE VALIDE_CUENTA_C (CTACAJA) RETURNING_VALUES (:OK);
            IF (OK = 0) THEN
                SELECT CUEN_COD,CUEN_TIPO FROM CUENTAS_NIIF
                    WHERE CUEN_COD = :CTACAJA INTO :CUENTA,:TIPOCUEN;
            ELSE
                begin
                EXECUTE PROCEDURE ERRORINT(61,:IDDOC,:CTACAJA,2);
                CUENTA = CTACAJA;
                TIPOCUEN = 'N';
                ERRORI = ERRORI + 1;
                end
            if (TIPOCUEN = 'I') then
                BEGIN
                EXECUTE PROCEDURE ERRORINT(61,:IDDOC,:CUENTA,3);
                TIPOCUEN = 'N';
                ERRORI = ERRORI + 1;
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                EXECUTE PROCEDURE ERRORINT(61,:IDDOC,:CUENTA,4);
                TIPOCUEN = 'N';
                ERRORI = ERRORI + 1;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                IF (VRCAJA > 0) THEN
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_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)
                        VALUES (:IDC,:NROI,:CUENTA,:CONC,'',:VRCAJA,0,0,0,:NIT,:PROY,:CENTRO,NULL,NULL,NULL,NULL,0,0);
                    SUMA = SUMA + VRCAJA;
                    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)
                       VALUES (:IDC,:NROI,:CUENTA,:CONC,'',0,ABS(:VRCAJA),0,0,:NIT,:PROY,:CENTRO,NULL,NULL,NULL,NULL,0,0);
                    SUMA = SUMA + VRCAJA;
                    END
                NROI = NROI + 1;
                END
            END
        END
    IF ((CAJA = 'F')) THEN
        BEGIN
        FOR SELECT MAX(FOPA_CTACONTA),SUM(RCPA_MONTO)
            FROM formas_pago F,recibos_caja_pago R
            WHERE R.RECA_ID = :IDDOC AND R.FOPA_ID = F.FOPA_ID
            GROUP BY FOPA_CTACONTA
            INTO :CTACAJA,:MONTO
        DO
            BEGIN
            if (MONTO <> 0) then
                BEGIN
                CUENTA = NULL;
                EXECUTE PROCEDURE VALIDE_CUENTA_C (CTACAJA) RETURNING_VALUES (:OK);
                IF (OK = 0) THEN
                    SELECT CUEN_COD,CUEN_TIPO FROM CUENTAS_NIIF
                        WHERE CUEN_COD = :CTACAJA INTO :CUENTA,:TIPOCUEN;
                ELSE
                    begin
                    EXECUTE PROCEDURE ERRORINT(61,:IDDOC,:CTACAJA,2);
                    CUENTA = CTACAJA;
                    ERRORI = ERRORI + 1;
                    end
                if (TIPOCUEN = 'I') then
                    BEGIN
                    EXECUTE PROCEDURE ERRORINT(61,:IDDOC,:CUENTA,3);
                    TIPOCUEN = 'N';
                    ERRORI = ERRORI + 1;
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    EXECUTE PROCEDURE ERRORINT(61,:IDDOC,:CUENTA,4);
                    TIPOCUEN = 'N';
                    ERRORI = ERRORI + 1;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    IF (MONTO > 0) THEN
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_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)
                            VALUES (:IDC,:NROI,:CUENTA,:CONC,'',:MONTO,0,0,0,:NIT,:PROY,:CENTRO,NULL,NULL,NULL,NULL,0,0);
                        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_DOCNUMERO,CNDE_DOCAPLICAR,CNDE_DOCVENCE,CNDE_ARTICULO,CNDE_DOCTIPOA,CNDE_DOCTIPON)
                            VALUES (:IDC,:NROI,:CUENTA,:CONC,'',0,abs(:MONTO),0,0,:NIT,:PROY,:CENTRO,NULL,NULL,NULL,NULL,0,0);
                        SUMA = SUMA + MONTO;
                        END
                    NROI = NROI + 1;
                    END
                END /* MONTO <> 0 */
            END /* DO FORMA_PAGO */
        END /* CAJA = F */
    IF ((CAJA = 'C')) THEN
        BEGIN
        FOR SELECT f.caja_cuenta, r.reca_monto
            FROM cajas F,recibos_caja R
            WHERE R.RECA_ID = :IDDOC AND R.caja_id = F.caja_id
            INTO :CTACAJA, :MONTO
            DO
            BEGIN
            if (MONTO <> 0) then
                BEGIN
                CUENTA = NULL;
                EXECUTE PROCEDURE VALIDE_CUENTA_C (CTACAJA) RETURNING_VALUES (:OK);
                IF (OK = 0) THEN
                    SELECT CUEN_COD,CUEN_TIPO FROM CUENTAS_NIIF
                        WHERE CUEN_COD = :CTACAJA INTO :CUENTA,:TIPOCUEN;
                ELSE
                    begin
                    EXECUTE PROCEDURE ERRORINT(61,:IDDOC,:CTACAJA,2);
                    CUENTA = CTACAJA;
                    ERRORI = ERRORI + 1;
                    end
                if (TIPOCUEN = 'I') then
                    BEGIN
                    EXECUTE PROCEDURE ERRORINT(61,:IDDOC,:CUENTA,3);
                    TIPOCUEN = 'N';
                    ERRORI = ERRORI + 1;
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    EXECUTE PROCEDURE ERRORINT(61,:IDDOC,:CUENTA,4);
                    TIPOCUEN = 'N';
                    ERRORI = ERRORI + 1;
                    END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    IF (MONTO > 0) THEN
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_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)
                            VALUES (:IDC,:NROI,:CUENTA,:CONC,'',:MONTO,0,0,0,:NIT,:PROY,:CENTRO,NULL,NULL,NULL,NULL,0,0);
                        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_DOCNUMERO,CNDE_DOCAPLICAR,CNDE_DOCVENCE,CNDE_ARTICULO,CNDE_DOCTIPOA,CNDE_DOCTIPON)
                            VALUES (:IDC,:NROI,:CUENTA,:CONC,'',0,abs(:MONTO),0,0,:NIT,:PROY,:CENTRO,NULL,NULL,NULL,NULL,0,0);
                        SUMA = SUMA + MONTO;
                        END
                    NROI = NROI + 1;
                    END
                END /* MONTO <> 0 */
            END /* DO FORMA_PAGO */
        END /* CAJA = C */
    if (DTO = 'K') then /* DTO EN CTA CONSTANTE */
        BEGIN
        if (VRDTO <> 0) then
            BEGIN
            CUENTA = NULL;
            EXECUTE PROCEDURE VALIDE_CUENTA_C (CTADTO) RETURNING_VALUES (:OK);
            IF (OK = 0) THEN
                SELECT CUEN_COD,CUEN_TIPO FROM CUENTAS_NIIF
                    WHERE CUEN_COD = :CTADTO INTO :CUENTA,:TIPOCUEN;
            ELSE
                begin
                EXECUTE PROCEDURE ERRORINT(61,:IDDOC,:CTADTO,2);
                CUENTA = CTADTO;
                TIPOCUEN = 'N';
                ERRORI = ERRORI + 1;
                end
            if (TIPOCUEN = 'I') then
                BEGIN
                EXECUTE PROCEDURE ERRORINT(61,:IDDOC,:CUENTA,3);
                TIPOCUEN = 'N';
                ERRORI = ERRORI + 1;
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                EXECUTE PROCEDURE ERRORINT(61,:IDDOC,:CUENTA,4);
                TIPOCUEN = 'N';
                ERRORI = ERRORI + 1;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                if (VRDTO > 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_DOCNUMERO,CNDE_DOCAPLICAR,CNDE_DOCVENCE,CNDE_ARTICULO,CNDE_DOCTIPOA,CNDE_DOCTIPON)
                        VALUES (:IDC,:NROI,:CUENTA,:CONC,'',:VRDTO,0,0,0,:NIT,:PROY,:CENTRO,NULL,NULL,NULL,NULL,0,0);
                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_DOCNUMERO,CNDE_DOCAPLICAR,CNDE_DOCVENCE,CNDE_ARTICULO,CNDE_DOCTIPOA,CNDE_DOCTIPON)
                        VALUES (:IDC,:NROI,:CUENTA,:CONC,'',0, abs(:VRDTO),0,0,:NIT,:PROY,:CENTRO,NULL,NULL,NULL,NULL,0,0);
                NROI = NROI + 1;
                SUMA = SUMA + VRDTO;
                END
            END /* VRDTO <> 0 */
        END /* DTO EN CTA CONSTANTE */

    /* LA DIFERENCIA EN CAMBIO */
    SELECT SUM(RCDE_DIFCAMBIO) FROM recibos_caja_detalle WHERE RECA_ID = :iddoc INTO :DIFCAMBIO;
    IF ((DIFCAMBIO IS NOT NULL) AND (DIFCAMBIO <> 0)) THEN
        BEGIN
        if (DIFCAMBIO > 0) then
            execute procedure lee_configuracion('GENERAL','GENERAL','CUENTA DE INGRESO POR DIFERENCIA EN CAMBIO PARA OPERACIONES EN OTRA MONEDA') returning_values (:ctadif);
        else
            execute procedure lee_configuracion('GENERAL','GENERAL','CUENTA DE GASTO POR DIFERENCIA EN CAMBIO PARA OPERACIONES EN OTRA MONEDA') returning_values (:ctadif);
        CUENTA = NULL;
        EXECUTE PROCEDURE VALIDE_CUENTA_C (ctadif) RETURNING_VALUES (:OK);
        IF (OK = 0) THEN
            SELECT CUEN_COD,CUEN_TIPO FROM CUENTAS_NIIF
                WHERE CUEN_COD = :ctadif INTO :CUENTA,:TIPOCUEN;
        ELSE
            begin
            EXECUTE PROCEDURE ERRORINT(61,:IDDOC,:ctadif,2);
            CUENTA = ctadif;
            TIPOCUEN = 'N';
            ERRORI = ERRORI + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            EXECUTE PROCEDURE ERRORINT(61,:IDDOC,:CUENTA,3);
            TIPOCUEN = 'N';
            ERRORI = ERRORI + 1;
            END
        if (TIPOCUEN = 'C') then
            BEGIN
            EXECUTE PROCEDURE ERRORINT(61,:IDDOC,:CUENTA,4);
            TIPOCUEN = 'N';
            ERRORI = ERRORI + 1;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            if (DIFCAMBIO > 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_DOCNUMERO,CNDE_DOCAPLICAR,CNDE_DOCVENCE,CNDE_ARTICULO,CNDE_DOCTIPOA,CNDE_DOCTIPON)
                    VALUES (:IDC,:NROI,:CUENTA,:CONC,'',0,:difcambio,0,0,:NIT,:PROY,:CENTRO,NULL,NULL,NULL,NULL,0,0);
            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_DOCNUMERO,CNDE_DOCAPLICAR,CNDE_DOCVENCE,CNDE_ARTICULO,CNDE_DOCTIPOA,CNDE_DOCTIPON)
                    VALUES (:IDC,:NROI,:CUENTA,:CONC,'',ABS(:difcambio),0,0,0,:NIT,:PROY,:CENTRO,NULL,NULL,NULL,NULL,0,0);
            NROI = NROI + 1;
            SUMA = SUMA - difcambio;
            END
        END
    IF ((exedente IS NOT NULL) AND (exedente <> 0)) THEN
        BEGIN
        EXECUTE PROCEDURE lee_configuracion('CAJA', 'RECIBOS', 'CUENTA CONTABLE PARA EXCENTES EN RECIBOS DE CAJA') returning_values (ctaexcedente);
        CUENTA = NULL;
        EXECUTE PROCEDURE VALIDE_CUENTA_C (ctaexcedente) RETURNING_VALUES (:OK);
        IF (OK = 0) THEN
            SELECT CUEN_COD,CUEN_TIPO FROM CUENTAS_NIIF
                WHERE CUEN_COD = :ctaexcedente INTO :CUENTA,:TIPOCUEN;
        ELSE
            begin
            EXECUTE PROCEDURE ERRORINT(61,:IDDOC,:ctaexcedente,2);
            CUENTA = ctaexcedente;
            TIPOCUEN = 'N';
            ERRORI = ERRORI + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            EXECUTE PROCEDURE ERRORINT(61,:IDDOC,:CUENTA,3);
            TIPOCUEN = 'N';
            ERRORI = ERRORI + 1;
            END
        if (TIPOCUEN = 'C') then
            BEGIN
            EXECUTE PROCEDURE ERRORINT(61,:IDDOC,:CUENTA,4);
            TIPOCUEN = 'N';
            ERRORI = ERRORI + 1;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            if (exedente > 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_DOCNUMERO,CNDE_DOCAPLICAR,CNDE_DOCVENCE,CNDE_ARTICULO,CNDE_DOCTIPOA,CNDE_DOCTIPON)
                    VALUES (:IDC,:NROI,:CUENTA,:CONC,'',0,:exedente,0,0,:NIT,:PROY,:CENTRO,NULL,NULL,NULL,NULL,0,0);
            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_DOCNUMERO,CNDE_DOCAPLICAR,CNDE_DOCVENCE,CNDE_ARTICULO,CNDE_DOCTIPOA,CNDE_DOCTIPON)
                    VALUES (:IDC,:NROI,:CUENTA,:CONC,'',ABS(:exedente),0,0,0,:NIT,:PROY,:CENTRO,NULL,NULL,NULL,NULL,0,0);
            NROI = NROI + 1;
            SUMA = SUMA - exedente;
            END
        END
    /* RETENCION FUENTE */
    if ((RTFTE = 'T') or (RTFTE = 'K')) then
      if (VRRTFTE <> 0) then
        BEGIN
        if (RTFTE = 'T') then
            CTARTFTE = TCTARTFTE;
        CUENTA = NULL;
        EXECUTE PROCEDURE VALIDE_CUENTA_C (CTARTFTE) RETURNING_VALUES (:OK);
        IF (OK = 0) THEN
            SELECT CUEN_COD,CUEN_RETENCION,CUEN_TIPO FROM CUENTAS_NIIF
                WHERE CUEN_COD = :CTARTFTE INTO :CUENTA,:ES_RETENCION,:TIPOCUEN;
        ELSE
            begin
            EXECUTE PROCEDURE ERRORINT(61,:IDDOC,:CTARTFTE,2);
            CUENTA = CTARTFTE;
            TIPOCUEN = 'N';
            ERRORI = ERRORI + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            EXECUTE PROCEDURE ERRORINT(61,:IDDOC,:CUENTA,3);
            TIPOCUEN = 'N';
            ERRORI = ERRORI + 1;
            END
        if (TIPOCUEN = 'C') then
            BEGIN
            EXECUTE PROCEDURE ERRORINT(61,:IDDOC,:CUENTA,4);
            TIPOCUEN = 'N';
            ERRORI = ERRORI + 1;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            if (ES_RETENCION = 'S') then
                BEGIN
                VRBASE = VRTOTAL + VRDTO + vrrtfte + vrrtiva + vrrtica;
                SELECT CLIE_rtefte from clientes where terc_nit = :NIT INTO :PORC;
                END
            ELSE
                BEGIN
                VRBASE = 0;
                PORC = 0;
                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_DOCNUMERO,CNDE_DOCAPLICAR,CNDE_DOCVENCE,CNDE_ARTICULO,CNDE_DOCTIPOA,CNDE_DOCTIPON)
                VALUES (:IDC,:NROI,:CUENTA,:CONC,'',:VRRTFTE,0,:VRBASE,:PORC,:NIT,:PROY,:CENTRO,NULL,NULL,NULL,NULL,0,0);
            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;
        EXECUTE PROCEDURE VALIDE_CUENTA_C (CTARTIVA) RETURNING_VALUES (:OK);
        IF (OK = 0) THEN
            SELECT CUEN_COD,CUEN_RETENCION,CUEN_TIPO FROM CUENTAS_NIIF
                WHERE CUEN_COD = :CTARTIVA INTO :CUENTA,:ES_RETENCION,:TIPOCUEN;
        ELSE
            begin
            EXECUTE PROCEDURE ERRORINT(61,:IDDOC,:CTARTIVA,2);
            CUENTA = CTARTIVA;
            TIPOCUEN = 'N';
            ERRORI = ERRORI + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            EXECUTE PROCEDURE ERRORINT(61,:IDDOC,:CUENTA,3);
            TIPOCUEN = 'N';
            ERRORI = ERRORI + 1;
            END
        if (TIPOCUEN = 'C') then
            BEGIN
            EXECUTE PROCEDURE ERRORINT(61,:IDDOC,:CUENTA,4);
            TIPOCUEN = 'N';
            ERRORI = ERRORI + 1;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            if (ES_RETENCION = 'S') then
                BEGIN
                VRBASE = VRTOTAL + VRDTO + vrrtfte + vrrtiva + vrrtica;
                SELECT CLIE_RTEIVA from clientes where terc_nit = :NIT INTO :PORC;
                END
            ELSE
                BEGIN
                VRBASE = 0;
                PORC = 0;
                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_DOCNUMERO,CNDE_DOCAPLICAR,CNDE_DOCVENCE,CNDE_ARTICULO,CNDE_DOCTIPOA,CNDE_DOCTIPON)
                VALUES (:IDC,:NROI,:CUENTA,:CONC,'',:VRRTIVA,0,:VRBASE,:PORC,:NIT,:PROY,:CENTRO,NULL,NULL,NULL,NULL,0,0);
            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;
        EXECUTE PROCEDURE VALIDE_CUENTA_C (CTARTICA) RETURNING_VALUES (:OK);
        IF (OK = 0) THEN
            SELECT CUEN_COD,CUEN_RETENCION,CUEN_TIPO FROM CUENTAS_NIIF
                WHERE CUEN_COD = :CTARTICA INTO :CUENTA,:ES_RETENCION,:TIPOCUEN;
        ELSE
            begin
            EXECUTE PROCEDURE ERRORINT(61,:IDDOC,:CTARTICA,2);
            CUENTA = CTARTICA;
            TIPOCUEN = 'N';
            ERRORI = ERRORI + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            EXECUTE PROCEDURE ERRORINT(61,:IDDOC,:CUENTA,3);
            TIPOCUEN = 'N';
            ERRORI = ERRORI + 1;
            END
        if (TIPOCUEN = 'C') then
            BEGIN
            EXECUTE PROCEDURE ERRORINT(61,:IDDOC,:CUENTA,4);
            TIPOCUEN = 'N';
            ERRORI = ERRORI + 1;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            if (ES_RETENCION = 'S') then
                BEGIN
                VRBASE = VRTOTAL + VRDTO + vrrtfte + vrrtiva + vrrtica;
                SELECT CLIE_RTEICA from clientes where terc_nit = :NIT INTO :PORC;
                END
            ELSE
                BEGIN
                VRBASE = 0;
                PORC = 0;
                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_DOCNUMERO,CNDE_DOCAPLICAR,CNDE_DOCVENCE,CNDE_ARTICULO,CNDE_DOCTIPOA,CNDE_DOCTIPON)
                VALUES (:IDC,:NROI,:CUENTA,:CONC,'',:VRRTICA,0,0,0,:NIT,:PROY,:CENTRO,NULL,NULL,NULL,NULL,0,0);
            NROI = NROI + 1;
            SUMA = SUMA + VRRTICA;
            END
        END /* RTICA */
    /* RETENCION CREE */
    if ((rtcree = 'T') or (rtcree = 'K')) then
        BEGIN
        if (rtcree = 'T') then
            ctartcree = tctartcree;
        if (vrrtcree <> 0) then
            BEGIN
            CUENTA = NULL;
            EXECUTE PROCEDURE VALIDE_CUENTA_C (ctartcree) RETURNING_VALUES (:OK);
            IF (OK = 0) THEN
                SELECT CUEN_COD,CUEN_RETENCION,CUEN_TIPO FROM CUENTAS_NIIF
                    WHERE CUEN_COD = :ctartcree INTO :CUENTA,:ES_RETENCION,:TIPOCUEN;
            ELSE
                begin
                EXECUTE PROCEDURE ERRORINT(61,:IDDOC,:ctartcree,2);
                CUENTA = CTARTICA;
                TIPOCUEN = 'N';
                ERRORI = ERRORI + 1;
                end
            if (TIPOCUEN = 'I') then
                BEGIN
                EXECUTE PROCEDURE ERRORINT(61,:IDDOC,:CUENTA,3);
                TIPOCUEN = 'N';
                ERRORI = ERRORI + 1;
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                EXECUTE PROCEDURE ERRORINT(61,:IDDOC,:CUENTA,4);
                TIPOCUEN = 'N';
                ERRORI = ERRORI + 1;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                if (ES_RETENCION = 'S') then
                    BEGIN
                    VRBASE = VRTOTAL + VRDTO + vrrtfte + vrrtiva + vrrtica + vrrtcree;
                    SELECT CLIE_RTcree from clientes where terc_nit = :NIT INTO :PORC;
                    END
                ELSE
                    BEGIN
                    VRBASE = 0;
                    PORC = 0;
                    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_DOCNUMERO,CNDE_DOCAPLICAR,CNDE_DOCVENCE,CNDE_ARTICULO,CNDE_DOCTIPOA,CNDE_DOCTIPON)
                    VALUES (:IDC,:NROI,:CUENTA,:CONC,'',:vrrtcree,0,:vrbase,:porc,:NIT,:PROY,:CENTRO,NULL,NULL,NULL,NULL,0,0);
                NROI = NROI + 1;
                SUMA = SUMA + vrrtcree;
                END
            END
        END /* RTCREE */
    /* CRUCES CON CXP */
    if (CRUCES <> 0) then
        BEGIN
        SELECT PROV_CTAPAGAR FROM PROVEEDORES WHERE TERC_NIT = :nit INTO :ctabase;
        if (CTABASE IS NULL) then
            ctabase = tctaclien;
        CUENTA = NULL;
        EXECUTE PROCEDURE VALIDE_CUENTA_C (CTABASE) RETURNING_VALUES (:OK);
        IF (OK = 0) THEN
            SELECT CUEN_COD,CUEN_TIPO FROM CUENTAS_NIIF
                WHERE CUEN_COD = :CTABASE INTO :CUENTA,:TIPOCUEN;
        ELSE
            begin
            EXECUTE PROCEDURE ERRORINT(61,:IDDOC,:CTABASE,2);
            CUENTA = CTABASE;
            TIPOCUEN = 'N';
            ERRORI = ERRORI + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            EXECUTE PROCEDURE ERRORINT(61,:IDDOC,:CUENTA,3);
            TIPOCUEN = 'N';
            ERRORI = ERRORI + 1;
            END
        if (TIPOCUEN = 'C') then
            BEGIN
            /* DEBERIA RECORRER DOCUMENTO POR DOCUMENTO */
            FOR SELECT RCCR_TIPODOC,RCCR_PREFIJO,RCCR_NUMERO,RCCR_ABONO+RCCR_RTFTE+RCCR_RTIVA+RCCR_RTICA+RCCR_DTOF
                FROM recibos_caja_crucec WHERE RECA_ID = :IDDOC
                INTO :TIPOIT,PREFIT,NUMIT,ABONOIT
                DO
                BEGIN
                NUMEROIT = PREFIT || NUMIT;
                if (ABONOIT > 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_DOCNUMERO,CNDE_DOCAPLICAR,CNDE_DOCVENCE,CNDE_ARTICULO,CNDE_DOCTIPOA,CNDE_DOCTIPON)
                        VALUES (:IDC,:NROI,:CUENTA,:CONC,'',:ABONOIT,0,0,0,:NIT,:PROY,:CENTRO,NULL,:NUMEROIT,NULL,NULL,:TIPOIT,0);
                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_DOCNUMERO,CNDE_DOCAPLICAR,CNDE_DOCVENCE,CNDE_ARTICULO,CNDE_DOCTIPOA,CNDE_DOCTIPON)
                        VALUES (:IDC,:NROI,:CUENTA,:CONC,'',0, ABS(:ABONOIT),0,0,:NIT,:PROY,:CENTRO,NULL,:NUMEROIT,NULL,NULL,:TIPOIT,0);
                SUMA = SUMA + ABONOIT;
                NROI = NROI + 1;
                END
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            if (CRUCES > 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_DOCNUMERO,CNDE_DOCAPLICAR,CNDE_DOCVENCE,CNDE_ARTICULO,CNDE_DOCTIPOA,CNDE_DOCTIPON)
                    VALUES (:IDC,:NROI,:CUENTA,:CONC,'',:CRUCES,0,0,0,:NIT,:PROY,:CENTRO,NULL,NULL,NULL,NULL,0,0);
            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_DOCNUMERO,CNDE_DOCAPLICAR,CNDE_DOCVENCE,CNDE_ARTICULO,CNDE_DOCTIPOA,CNDE_DOCTIPON)
                    VALUES (:IDC,:NROI,:CUENTA,:CONC,'',0,ABS(:CRUCES),0,0,:NIT,:PROY,:CENTRO,NULL,NULL,NULL,NULL,0,0);
            SUMA = SUMA + CRUCES;
            NROI = NROI + 1;
            END

        /* LA DIFERENCIA EN CAMBIO */
        SELECT SUM(RCCR_DIFCAMBIO) FROM recibos_caja_crucec WHERE RECA_ID = :iddoc INTO :DIFCAMBIO;
        IF ((DIFCAMBIO IS NOT NULL) AND (DIFCAMBIO <> 0)) THEN
            BEGIN
            if (DIFCAMBIO > 0) then
                execute procedure lee_configuracion('GENERAL','GENERAL','CUENTA DE GASTO POR DIFERENCIA EN CAMBIO PARA OPERACIONES EN OTRA MONEDA') returning_values (:ctadif);
            else
                execute procedure lee_configuracion('GENERAL','GENERAL','CUENTA DE INGRESO POR DIFERENCIA EN CAMBIO PARA OPERACIONES EN OTRA MONEDA') returning_values (:ctadif);
            CUENTA = NULL;
            EXECUTE PROCEDURE VALIDE_CUENTA_C (ctadif) RETURNING_VALUES (:OK);
            IF (OK = 0) THEN
                SELECT CUEN_COD,CUEN_TIPO FROM CUENTAS_NIIF
                    WHERE CUEN_COD = :ctadif INTO :CUENTA,:TIPOCUEN;
            ELSE
                begin
                EXECUTE PROCEDURE ERRORINT(61,:IDDOC,:ctadif,2);
                CUENTA = ctadif;
                TIPOCUEN = 'N';
                ERRORI = ERRORI + 1;
                end
            if (TIPOCUEN = 'I') then
                BEGIN
                EXECUTE PROCEDURE ERRORINT(61,:IDDOC,:CUENTA,3);
                TIPOCUEN = 'N';
                ERRORI = ERRORI + 1;
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                EXECUTE PROCEDURE ERRORINT(61,:IDDOC,:CUENTA,4);
                TIPOCUEN = 'N';
                ERRORI = ERRORI + 1;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                if (DIFCAMBIO > 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_DOCNUMERO,CNDE_DOCAPLICAR,CNDE_DOCVENCE,CNDE_ARTICULO,CNDE_DOCTIPOA,CNDE_DOCTIPON)
                        VALUES (:IDC,:NROI,:CUENTA,:CONC,'',:difcambio,0,0,0,:NIT,:PROY,:CENTRO,NULL,NULL,NULL,NULL,0,0);
                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_DOCNUMERO,CNDE_DOCAPLICAR,CNDE_DOCVENCE,CNDE_ARTICULO,CNDE_DOCTIPOA,CNDE_DOCTIPON)
                        VALUES (:IDC,:NROI,:CUENTA,:CONC,'',0,ABS(:difcambio),0,0,:NIT,:PROY,:CENTRO,NULL,NULL,NULL,NULL,0,0);
                NROI = NROI + 1;
                SUMA = SUMA + difcambio;
                END
            END
        /* RETEFUENTE DEL CRUCE */
        SELECT first 1 INCJ_RTFTE,INCJ_RTIVA,INCJ_RTICA,INCJ_RTCREE,INCJ_CTARTFTE,INCJ_CTARTIVA,INCJ_CTARTICA,INCJ_CTARTCREE
            FROM INTERFAZ_CAJA WHERE tido_cod = 62 into :RTFTER,:RTIVAR,:RTICAR,:RTCREER,:CTARTFTER,:CTARTIVAR,:CTARTICAR,:ctartcreer;
        SELECT SUM(RCCR_RTFTE) FROM recibos_caja_crucec WHERE RECA_ID = :iddoc INTO :rtftec;
        IF ((rtftec IS NOT NULL) AND (rtftec <> 0)) THEN
            BEGIN
            if ((RTFTER = 'T') or (RTFTER = 'K')) then
                BEGIN
                if (RTFTER = 'T') then
                    SELECT PROV_CTARTFTE FROM proveedores WHERE TERC_NIT = :NIT INTO CTARTFTER;
                CUENTA = NULL;
                EXECUTE PROCEDURE VALIDE_CUENTA_C (ctartfter) RETURNING_VALUES (:OK);
                IF (OK = 0) THEN
                    SELECT CUEN_COD,CUEN_TIPO FROM CUENTAS_NIIF
                        WHERE CUEN_COD = :ctartfter INTO :CUENTA,:TIPOCUEN;
                ELSE
                    begin
                    EXECUTE PROCEDURE ERRORINT(62,:IDDOC,:ctartfter,2);
                    CUENTA = ctartfter;
                    TIPOCUEN = 'N';
                    ERRORI = ERRORI + 1;
                    end
                if (TIPOCUEN = 'I') then
                    BEGIN
                    EXECUTE PROCEDURE ERRORINT(62,:IDDOC,:CUENTA,3);
                    TIPOCUEN = 'N';
                    ERRORI = ERRORI + 1;
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    EXECUTE PROCEDURE ERRORINT(62,:IDDOC,:CUENTA,4);
                    TIPOCUEN = 'N';
                    ERRORI = ERRORI + 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_DOCNUMERO,CNDE_DOCAPLICAR,CNDE_DOCVENCE,CNDE_ARTICULO,CNDE_DOCTIPOA,CNDE_DOCTIPON)
                        VALUES (:IDC,:NROI,:CUENTA,:CONC,'',0,:rtftec,0,0,:NIT,:PROY,:CENTRO,NULL,NULL,NULL,NULL,0,0);
                    NROI = NROI + 1;
                    SUMA = SUMA - rtftec;
                    END
                END
            END
        /* RETEIVA DEL CRUCE */
        SELECT SUM(RCCR_RTIVA) FROM recibos_caja_crucec WHERE RECA_ID = :iddoc INTO :rtivac;
        IF ((rtivac IS NOT NULL) AND (rtivac <> 0)) THEN
            BEGIN
            if ((RTIVAR = 'T') or (RTIVAR = 'K')) then
                BEGIN
                if (RTIVAR = 'T') then
                    SELECT PROV_CTARTIVA FROM proveedores WHERE TERC_NIT = :NIT INTO CTARTIVAR;
                CUENTA = NULL;
                EXECUTE PROCEDURE VALIDE_CUENTA_C (ctartivar) RETURNING_VALUES (:OK);
                IF (OK = 0) THEN
                    SELECT CUEN_COD,CUEN_TIPO FROM CUENTAS_NIIF
                        WHERE CUEN_COD = :ctartivar INTO :CUENTA,:TIPOCUEN;
                ELSE
                    begin
                    EXECUTE PROCEDURE ERRORINT(62,:IDDOC,:ctartivar,2);
                    CUENTA = ctartivar;
                    TIPOCUEN = 'N';
                    ERRORI = ERRORI + 1;
                    end
                if (TIPOCUEN = 'I') then
                    BEGIN
                    EXECUTE PROCEDURE ERRORINT(62,:IDDOC,:CUENTA,3);
                    TIPOCUEN = 'N';
                    ERRORI = ERRORI + 1;
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    EXECUTE PROCEDURE ERRORINT(62,:IDDOC,:CUENTA,4);
                    TIPOCUEN = 'N';
                    ERRORI = ERRORI + 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_DOCNUMERO,CNDE_DOCAPLICAR,CNDE_DOCVENCE,CNDE_ARTICULO,CNDE_DOCTIPOA,CNDE_DOCTIPON)
                        VALUES (:IDC,:NROI,:CUENTA,:CONC,'',0,:rtivac,0,0,:NIT,:PROY,:CENTRO,NULL,NULL,NULL,NULL,0,0);
                    NROI = NROI + 1;
                    SUMA = SUMA - rtivac;
                    END
                END
            END
        /* RETEICA DEL CRUCE */
        SELECT SUM(RCCR_RTICA) FROM recibos_caja_crucec WHERE RECA_ID = :iddoc INTO :rticac;
        IF ((rticac IS NOT NULL) AND (rtivac <> 0)) THEN
            BEGIN
            if ((RTICAR = 'T') or (RTICAR = 'K')) then
                BEGIN
                if (RTICAR = 'T') then
                    SELECT PROV_CTARTICA FROM proveedores WHERE TERC_NIT = :NIT INTO CTARTICAR;
                CUENTA = NULL;
                EXECUTE PROCEDURE VALIDE_CUENTA_C (ctarticar) RETURNING_VALUES (:OK);
                IF (OK = 0) THEN
                    SELECT CUEN_COD,CUEN_TIPO FROM CUENTAS_NIIF
                        WHERE CUEN_COD = :ctarticar INTO :CUENTA,:TIPOCUEN;
                ELSE
                    begin
                    EXECUTE PROCEDURE ERRORINT(62,:IDDOC,:ctarticar,2);
                    CUENTA = ctarticar;
                    TIPOCUEN = 'N';
                    ERRORI = ERRORI + 1;
                    end
                if (TIPOCUEN = 'I') then
                    BEGIN
                    EXECUTE PROCEDURE ERRORINT(62,:IDDOC,:CUENTA,3);
                    TIPOCUEN = 'N';
                    ERRORI = ERRORI + 1;
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    EXECUTE PROCEDURE ERRORINT(62,:IDDOC,:CUENTA,4);
                    TIPOCUEN = 'N';
                    ERRORI = ERRORI + 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_DOCNUMERO,CNDE_DOCAPLICAR,CNDE_DOCVENCE,CNDE_ARTICULO,CNDE_DOCTIPOA,CNDE_DOCTIPON)
                        VALUES (:IDC,:NROI,:CUENTA,:CONC,'',0,:rticac,0,0,:NIT,:PROY,:CENTRO,NULL,NULL,NULL,NULL,0,0);
                    NROI = NROI + 1;
                    SUMA = SUMA - rticac;
                    END
                END
            END
        /* RETECREE DEL CRUCE */
        SELECT SUM(RCCR_RCREE) FROM recibos_caja_crucec WHERE RECA_ID = :iddoc INTO :rtcreec;
        IF ((rtcreec IS NOT NULL) AND (rtcreec <> 0)) THEN
            BEGIN
            if ((rtcreer = 'T') or (rtcreer = 'K')) then
                BEGIN
                if (rtcreer = 'T') then
                    SELECT PROV_CTARTCREE FROM proveedores WHERE TERC_NIT = :NIT INTO ctartcreer;
                CUENTA = NULL;
                EXECUTE PROCEDURE VALIDE_CUENTA_C (ctartcreer) RETURNING_VALUES (:OK);
                IF (OK = 0) THEN
                    SELECT CUEN_COD,CUEN_TIPO FROM CUENTAS_NIIF
                        WHERE CUEN_COD = :ctartcreer INTO :CUENTA,:TIPOCUEN;
                ELSE
                    begin
                    EXECUTE PROCEDURE ERRORINT(62,:IDDOC,:ctartcreer,2);
                    CUENTA = ctartcreer;
                    TIPOCUEN = 'N';
                    ERRORI = ERRORI + 1;
                    end
                if (TIPOCUEN = 'I') then
                    BEGIN
                    EXECUTE PROCEDURE ERRORINT(62,:IDDOC,:CUENTA,3);
                    TIPOCUEN = 'N';
                    ERRORI = ERRORI + 1;
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    EXECUTE PROCEDURE ERRORINT(62,:IDDOC,:CUENTA,4);
                    TIPOCUEN = 'N';
                    ERRORI = ERRORI + 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_DOCNUMERO,CNDE_DOCAPLICAR,CNDE_DOCVENCE,CNDE_ARTICULO,CNDE_DOCTIPOA,CNDE_DOCTIPON)
                        VALUES (:IDC,:NROI,:CUENTA,:CONC,'',0,:rtcreec,0,0,:NIT,:PROY,:CENTRO,NULL,NULL,NULL,NULL,0,0);
                    NROI = NROI + 1;
                    SUMA = SUMA - rtcreec;
                    END
                END
            END
        END /* cruces */
    /* CIERRE EL COMPROBANTE CONTRA LA CUENTA DEL TERCERO O LA BASE CONSTANTE */
    if (SUMA <> 0) THEN
        BEGIN
        if  ((BASE = 'T') or (BASE = 'K')) then
            BEGIN
            if (SUMA < 0) then
                BEGIN
                DEBITO = SUMA * -1;
                CREDITO = 0;
                END
            ELSE
                BEGIN
                DEBITO = 0;
                CREDITO = SUMA;
                END
            if (BASE = 'T') then
                CTABASE = TCTACLIEN;
            CUENTA = NULL;
            EXECUTE PROCEDURE VALIDE_CUENTA_C (CTABASE) RETURNING_VALUES (:OK);
            IF (OK = 0) THEN
                SELECT CUEN_COD,CUEN_TIPO FROM CUENTAS_NIIF
                    WHERE CUEN_COD = :CTABASE INTO :CUENTA,:TIPOCUEN;
            ELSE
                begin
                EXECUTE PROCEDURE ERRORINT(61,:IDDOC,:CTABASE,2);
                CUENTA = CTABASE;
                TIPOCUEN = 'N';
                ERRORI = ERRORI + 1;
                end
            if (TIPOCUEN = 'I') then
                BEGIN
                EXECUTE PROCEDURE ERRORINT(61,:IDDOC,:CUENTA,3);
                TIPOCUEN = 'N';
                ERRORI = ERRORI + 1;
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                /* DEBERIA RECORRER DOCUMENTO POR DOCUMENTO */
                FOR SELECT RCDE_TIPODOC,RCDE_PREFIJO,RCDE_NUMERO,RCDE_ABONO+RCDE_RTFTE+RCDE_RTIVA+RCDE_RTICA+RCDE_DTOF
                    FROM RECIBOS_CAJA_DETALLE WHERE RECA_ID = :IDDOC
                    INTO :TIPOIT,PREFIT,NUMIT,ABONOIT
                    DO
                    BEGIN
                    NUMEROIT = PREFIT || NUMIT;
                    INSERT INTO CONTABILIZACION_DET (CNTB_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)
                        VALUES (:IDC,:NROI,:CUENTA,:CONC,'',0,:ABONOIT,0,0,:NIT,:PROY,:CENTRO,NULL,:NUMEROIT,NULL,NULL,:TIPOIT,0);
                    NROI = NROI + 1;
                    END
                END
            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_DOCNUMERO,CNDE_DOCAPLICAR,CNDE_DOCVENCE,CNDE_ARTICULO,CNDE_DOCTIPOA,CNDE_DOCTIPON)
                    VALUES (:IDC,:NROI,:CUENTA,:CONC,'',:DEBITO,:CREDITO,0,0,:NIT,:PROY,:CENTRO,NULL,NULL,NULL,NULL,0,0);
            NROI = NROI + 1;
            END /* SUMA EN CARTERA */
        if (BASE = 'D') then
            BEGIN
            CTABASE = NULL;
            execute procedure lee_configuracion('CARTERA','SALDOS','DESCONTAR RETENCIONES POR CAUSACION') returning_values (RET);
            FOR SELECT RCDE_TIPODOC,RCDE_IDDOC,RCDE_PREFIJO,RCDE_NUMERO,RCDE_ABONO+RCDE_DTOF,RCDE_RTFTE+RCDE_RTIVA+RCDE_RTICA
                FROM RECIBOS_CAJA_DETALLE WHERE RECA_ID = :IDDOC INTO :tipoit,:idit,:PREFIT,:NUMIT,:suma,:RTIT DO
                BEGIN
                if (TIPOIT <> 45) then
                    SELECT FIRST 1 CUEN_COD,PROY_COD,CENT_COD FROM COMPROBANTE_ENCABEZADO E,COMPROBANTE_DETALLE D
                        WHERE E.enco_consec = D.enco_consec AND E.enco_tiporef = :TIPOIT AND E.enco_idref = :IDIT
                        AND ((SUBSTR(CUEN_COD,1,2) = '13') or (SUBSTR(CUEN_COD,1,4) = '2805') ) AND SUBSTR(CUEN_COD,1,4) <> '1355'
                        INTO :ctabase,:proy,:centro;
                ELSE
                    SELECT ZONA_CTAANTI FROM ZONAS Z, CLIENTES C
                        WHERE C.TERC_NIT = :nit AND C.zona_cod = Z.zona_cod INTO :ctabase;
                if ((ctabase is null) or (ctabase = '')) then
                    CTABASE = TCTACLIEN;
                CUENTA = NULL;
                EXECUTE PROCEDURE VALIDE_CUENTA_C (ctabase) RETURNING_VALUES (:OK);
                IF (OK = 0) THEN
                    SELECT CUEN_COD,CUEN_TIPO FROM CUENTAS_NIIF
                        WHERE CUEN_COD = :CTABASE INTO :CUENTA,:TIPOCUEN;
                ELSE
                    begin
                    EXECUTE PROCEDURE ERRORINT(61,:IDDOC,:CTABASE,2);
                    CUENTA = CTABASE;
                    TIPOCUEN = 'N';
                    ERRORI = ERRORI + 1;
                    end
                if (RET = 'NO') then
                    SUMA = SUMA + RTIT;
                if (SUMA < 0) then
                    BEGIN
                    DEBITO = SUMA * -1;
                    CREDITO = 0;
                    END
                ELSE
                    BEGIN
                    DEBITO = 0;
                    CREDITO = SUMA;
                    END
                if (TIPOCUEN = 'I') then
                    BEGIN
                    EXECUTE PROCEDURE ERRORINT(61,:IDDOC,:CUENTA,3);
                    TIPOCUEN = 'N';
                    ERRORI = ERRORI + 1;
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    NUMEROIT = PREFIT || NUMIT;
                    INSERT INTO CONTABILIZACION_DET (CNTB_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)
                        VALUES (:IDC,:NROI,:CUENTA,:CONC,'',:debito,:credito,0,0,:NIT,:PROY,:CENTRO,NULL,:NUMEROIT,NULL,NULL,:TIPOIT,0);
                    END
                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_DOCNUMERO,CNDE_DOCAPLICAR,CNDE_DOCVENCE,CNDE_ARTICULO,CNDE_DOCTIPOA,CNDE_DOCTIPON)
                        VALUES (:IDC,:NROI,:CUENTA,:CONC,'',:DEBITO,:CREDITO,0,0,:NIT,:PROY,:CENTRO,NULL,NULL,NULL,NULL,0,0);
                NROI = NROI + 1;
                END /* SUMA EN CARTERA */
            END
        END
    /* recorra las cuentas adicionales */
    FOR SELECT INJC_CUENTA,INJC_BASE,INJC_PORC,INJC_VALOR,INJC_DB
        FROM INTERFAZ_CAJA_CTAS
        WHERE INCJ_ID = :IDINTER
        INTO :CTADIC,:BASEADIC,:PORCADIC,:VALORADIC,:DBADIC
        DO
        BEGIN
        if (:BASEADIC = 'TOTAL') then
            VALORADIC = VRTOTAL;
        if (:BASEADIC = 'DESCUENTO') then
            VALORADIC = VRDTO;
        if (:BASEADIC = 'RTFTE') then
            VALORADIC = VRRTFTE;
        if (:BASEADIC = 'RTIVA') then
            VALORADIC = VRRTIVA;
        if (:BASEADIC = 'RTICA') then
            VALORADIC = VRRTICA;
        MONTO = VALORADIC * PORCADIC;
        CUENTA = NULL;
        EXECUTE PROCEDURE VALIDE_CUENTA_C (CTADIC) RETURNING_VALUES (:OK);
        IF (OK = 0) THEN
            SELECT CUEN_COD,CUEN_TIPO FROM CUENTAS_NIIF
                WHERE CUEN_COD = :CTADIC INTO :CUENTA,:TIPOCUEN;
        ELSE
            begin
            EXECUTE PROCEDURE ERRORINT(61,:IDDOC,:CTADIC,2);
            CUENTA = CTADIC;
            TIPOCUEN = 'N';
            ERRORI = ERRORI + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            EXECUTE PROCEDURE ERRORINT(61,:IDDOC,:CUENTA,3);
            TIPOCUEN = 'N';
            ERRORI = ERRORI + 1;
            END
        if (TIPOCUEN = 'C') then
            BEGIN
            EXECUTE PROCEDURE ERRORINT(61,:IDDOC,:CUENTA,4);
            TIPOCUEN = 'N';
            ERRORI = ERRORI + 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_DOCNUMERO,CNDE_DOCAPLICAR,CNDE_DOCVENCE,CNDE_ARTICULO,CNDE_DOCTIPOA,CNDE_DOCTIPON)
                    VALUES (:IDC,:NROI,:CTADIC,:CONC,'',:MONTO,0,:VALORADIC,:PORCADIC,:NIT,:PROY,:CENTRO,NULL,NULL,NULL,NULL,0,0);
            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_DOCNUMERO,CNDE_DOCAPLICAR,CNDE_DOCVENCE,CNDE_ARTICULO,CNDE_DOCTIPOA,CNDE_DOCTIPON)
                    VALUES (:IDC,:NROI,:CTADIC,:CONC,'',0,:MONTO,:VALORADIC,:PORCADIC,:NIT,:PROY,:CENTRO,NULL,NULL,NULL,NULL,0,0);
            END
        NROI = NROI + 1;
        END
    /* REVERSE EL PROVISIONAL SI EXISTE */
    if ((PROVID IS NOT NULL) AND (PROVID <> 0))  then
        BEGIN
        INSERT INTO CONTABILIZACION_DET (CNTB_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)
            SELECT :IDC,CODE_ITEM+:NROI,CUEN_COD,:CONC,'',CODE_CREDITO,CODE_DEBITO,CODE_BASE*-1,CODE_PORC,D.TERC_NIT,PROY_COD,CENT_COD,NULL,NULL,NULL,NULL,0,0
                FROM COMPROBANTE_DETALLE D,COMPROBANTE_ENCABEZADO E WHERE E.enco_consec = D.enco_consec AND E.enco_tiporef = 65 AND E.enco_idref = :provid;
        END
    if (ERRORI > 0) then
        VER = 'S';
    SUSPEND;
    END /* NO ANULADO */
  END /* EXISTE LA INTERFAZ */
ELSE
    BEGIN
    EXECUTE PROCEDURE ERRORINT(61,:IDDOC,:PREF,1);
    ERRORI = ERRORI + 1;
    VER = 'S';
    SUSPEND;
    END
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER procedure CONTABIL_REMICLIE_NIIF (
    IDDOC integer,
    IDINTER integer,
    IDC integer)
returns (
    ERRORI 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 fecha char(8);
declare variable conc varchar(60);
declare variable vrsubt numeric(18,2);
declare variable vriva numeric(18,2);
declare variable vrtotal 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 inven char(1);
declare variable ctainven varchar(20);
declare variable costos char(1);
declare variable ctacostos 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 proyi varchar(4);
declare variable centi 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 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 anulado char(1);
declare variable dig integer;
declare variable mercancia numeric(18,2);
declare variable INALC numeric(18,2);
declare variable fomento varchar(2);
declare variable vrconsumo numeric(18,2);
declare variable cent char(1);
declare variable ERRORC INTEGER;
declare variable ICOING CHAR(2);
declare variable NITCONTA VARCHAR(20);
declare variable CNTNIT CHAR(2);
BEGIN
EXECUTE PROCEDURE LEE_CONFIGURACION('COMPRAS', 'FACTURAS', 'USAR IMPOCONSUMO COMO PORCENTAJE DE FOMENTO') returning_values (FOMENTO);
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);
/* BUSQUE LA INTERFACE */
EXISTE = 'N';
SELECT 'S', N.INVE_VENTAS, N.INVE_IVA, N.INVE_CONSUMO, N.INVE_CARTERA,
    N.INVE_COSTO, N.INVE_INVEN, N.INVE_CTAVENTAS, N.INVE_CTAIVA, N.INVE_CTACONSUMO,
    N.INVE_CTACARTERA, 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,
    :COSTOS, :INVEN, :CTAVENTAS, :CTAIVA, :CTACONSUMO,
    :CTACARTERA, :CTAINVEN, :CTACOSTOS, :VER, :CENT;
if (EXISTE = 'S') then
  BEGIN
  SELECT PREF_PRE, REVT_NUMERO, REVT_FECHA, F.TERC_NIT, REVT_IVAMONTO, REVT_TOTAL,
    REVT_NOMTERC, TERC_CTAVENTA, TERC_CTACLIENTE, REVT_ANULADO, T.terc_nitconta
        FROM remisiones_venta F, TERCEROS T
        WHERE REVT_ID = :IDDOC AND F.TERC_NIT = T.TERC_NIT
        INTO :PREF, :NUM, :FECAUX, :NIT, :VRIVA, :VRTOTAL,
        :NOMBRE, TCTAVENTA, TCTACLIEN, ANULADO, :nitconta;
  if ((CNTNIT = 'SI') AND (NITCONTA IS NOT NULL)) then
    NIT = NITCONTA;
  if (ANULADO = 'N') then
    BEGIN
    IF (CENT = 'B') THEN
        SELECT B.BODE_CENTRO, B.BODE_PROY FROM BODEGA B, remisiones_venta F
            WHERE B.BODE_COD = F.BODE_COD AND F.REVT_ID = :IDDOC INTO :CENTRO, :PROY;
    IF (CENT = 'V') THEN
        SELECT V.CENT_COD, V.PROY_COD FROM VENDEDORES V, remisiones_venta F
            WHERE V.VEND_COD = F.VEND_COD AND F.REVT_ID = :IDDOC INTO :CENTRO, :PROY;
    IF (CENT = 'P') THEN
        SELECT P.PREF_CENTRO,P.PREF_PROY  FROM PREFIJOS P, remisiones_venta F
            WHERE P.PREF_PRE = F.PREF_PRE AND F.REVT_ID = :IDDOC AND P.TIDO_COD = 32 INTO :CENTRO, :PROY;
    NUMERO = PREF || NUM;
    SELECT SUM (RVDE_CONSUMO) FROM remisiones_venta_detalle WHERE REVT_ID = :IDDOC  AND ((RVDE_REFERENCIA <> '.t') or (RVDE_REFERENCIA IS NULL))
        INTO MERCANCIA;
    SELECT SUM (RVDE_INALCM) FROM remisiones_venta_detalle WHERE REVT_ID = :IDDOC  AND ((RVDE_REFERENCIA <> '.t') or (RVDE_REFERENCIA IS NULL))
        INTO INALC;
    VRSUBT = VRTOTAL - VRIVA - MERCANCIA - INALC; /* BASE DE RETEFTE Y RETEICA */

    MERCANCIA = VRSUBT;
    EXECUTE PROCEDURE FECHA_A_CONTA(:FECAUX) returning_values (:FECHA);
    if (STRLEN(NOMBRE)> 41 ) then
      CONC = 'REMCLI No.' || NUMERO || '-' || SUBSTRING(NOMBRE FROM 1 FOR 41);
    ELSE
      CONC = 'REMCLI No.' || NUMERO || '-' || NOMBRE;
    NROI = 100000;
    SUMA = 0;
    ERRORI = 0;
    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 ((VENTAS = 'C') OR (VENTAS = 'K')) THEN
        BEGIN
        IF (VENTAS = 'C') THEN
            CTAVENTAS = TCTAVENTA;
        SELECT SUM(RVDE_TOTAL-RVDE_IVAMONTO-RVDE_CONSUMO-RVDE_INALCM), SUM(RVDE_IVAMONTO), SUM (RVDE_CONSUMO)
            FROM remisiones_venta_detalle F
            WHERE F.REVT_ID = :IDDOC AND ((RVDE_REFERENCIA <> '.t') or (RVDE_REFERENCIA IS NULL))
            INTO :MONTO, :IMPTOS, :VRCONSUMO;
        if ((FOMENTO = 'SI') or (ICOING = 'SI')) then
            MONTO = MONTO + VRCONSUMO;
        execute procedure redondee(MONTO, DIG) returning_values (MONTO);
        if (MONTO <> 0) then
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ_NIIF(32, :IDDOC, :CTAVENTAS, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERRORI = ERRORI + 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)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 31);
                NROI = NROI + 1;
                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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA - MONTO;
                END
            END /* MONTO <> 0 */
        END /* VENTAS C O K */
    if (VENTAS = 'A') then
        BEGIN
        FOR SELECT MAX(COAR_CTAVNT), SUM(RVDE_TOTAL-RVDE_IVAMONTO-RVDE_CONSUMO-RVDE_INALCM), SUM(RVDE_IVAMONTO), SUM(RVDE_CONSUMO), MAX(B.bode_proy), MAX(B.bode_centro)
            FROM ARTICULO A, CONTABIL_ARTICULO_NIIF C, remisiones_venta_detalle F, bodega b
            WHERE F.REVT_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND ((RVDE_REFERENCIA <> '.t') or (RVDE_REFERENCIA IS NULL)) and
            f.bode_cod = b.bode_cod
            GROUP BY COAR_CTAVNT
            INTO :CTAVENTAS, :MONTO, :IMPTOS, :VRCONSUMO, :PROYI, :CENTI
            DO
            BEGIN
            if ((FOMENTO = 'SI') or (icoing = 'SI')) then
                MONTO = MONTO + VRCONSUMO;
            execute procedure redondee(MONTO, DIG) returning_values (MONTO);
            if (MONTO <> 0) then
                BEGIN
                EXECUTE PROCEDURE CUENTA_INTERFAZ_NIIF(32, :IDDOC, :CTAVENTAS, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERRORI = ERRORI + 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)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :fecha, NULL, 0, 31);
                    NROI = NROI + 1;
                    SUMA = SUMA - MONTO;
                    END
                ELSE
                    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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROYI, :CENTI, NULL, NULL, NULL, NULL, 0, 0);
                    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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    SUMA = SUMA - MONTO;
                    END
                END /* MONTO <> 0 */
            END /* FOR */
        END /* VENTAS A */
    if (IVA = 'A') then
        BEGIN
        FOR SELECT MAX(COAR_CTAIVAV), SUM(RVDE_IVAMONTO), SUM(RVDE_TOTAL-RVDE_IVAMONTO-RVDE_CONSUMO-RVDE_INALCM), sum(RVDE_CONSUMO)
            FROM ARTICULO A, CONTABIL_ARTICULO_NIIF C, remisiones_venta_detalle F
            WHERE F.REVT_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND ((RVDE_REFERENCIA <> '.t') or (RVDE_REFERENCIA IS NULL))
            AND RVDE_IVAMONTO <> 0
            GROUP BY COAR_CTAIVAV
            INTO :CTAIVA, :IMPTOS, :MONTO, :VALORADIC
            DO
            BEGIN
            if (FOMENTO = 'SI') then
                MONTO = MONTO + VALORADIC;
            MONTO = MONTO * -1;
            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(32, :IDDOC, :CTAIVA, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERRORI = ERRORI + 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)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :IMPTOS, :MONTO, ABS(:IMPTOS*100/:MONTO), :NIT, :PROY, :CENTRO, :NUMERO, NULL, :fecha, NULL, 0, 31);
                    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)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :IMPTOS, :MONTO, ABS(:IMPTOS*100/:MONTO), :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    SUMA = SUMA - IMPTOS;
                    END
                END   /* IMPTOS <> 0 */
            END /* FOR */
        END /* IVA A */
    if (IVA = 'K') then
        BEGIN
        SELECT SUM(RVDE_IVAMONTO), SUM(RVDE_TOTAL-RVDE_IVAMONTO-RVDE_CONSUMO-RVDE_INALCM), SUM(RVDE_CONSUMO)
            FROM remisiones_venta_detalle F
            WHERE F.REVT_ID = :IDDOC and RVDE_IVAMONTO <> 0 AND ((RVDE_REFERENCIA <> '.t') or (RVDE_REFERENCIA IS NULL))
            INTO :IMPTOS, :MONTO, :valoradic;
        if (FOMENTO = 'SI') then
            MONTO = MONTO + VALORADIC;
        MONTO = MONTO * -1;
        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(32, :IDDOC, :CTAIVA, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERRORI = ERRORI + 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)
                    VALUES (:IDC, :NROI, :CTAIVA, :CONC, '', 0, :IMPTOS, :MONTO, ABS(:IMPTOS*100/:MONTO), :NIT, :PROY, :CENTRO, :NUMERO, NULL, :fecha, NULL, 0, 31);
                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)
                    VALUES (:IDC, :NROI, :CTAIVA, :CONC, '', 0, :IMPTOS, :MONTO, ABS(:IMPTOS*100/:MONTO), :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA - IMPTOS;
                END
            END /* IMPTOS <> 0 */
        END /* IVA K */
    if ((CONSUMO = 'A') AND (FOMENTO <> 'SI')) then
        BEGIN
        FOR SELECT MAX(COAR_CTACONS), SUM(RVDE_CONSUMO)
            FROM ARTICULO A, CONTABIL_ARTICULO_NIIF C, remisiones_venta_detalle F
            WHERE F.REVT_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND ((RVDE_REFERENCIA <> '.t') or (RVDE_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(32, :IDDOC, :CTACONSUMO, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERRORI = ERRORI + 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)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :fecha, NULL, 0, 31);
                    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)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    SUMA = SUMA - IMPTOS;
                    END
                END /* IMPTOS <> 0 */
            END /* FOR */
        END /* CONSUMO A */
    if ((CONSUMO = 'K') AND (FOMENTO <> 'SI')) then
        BEGIN
        SELECT SUM(RVDE_CONSUMO)
            FROM remisiones_venta_detalle F
            WHERE F.REVT_ID = :IDDOC AND ((RVDE_REFERENCIA <> '.t') or (RVDE_REFERENCIA IS NULL))
            INTO :IMPTOS;
        execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
        if (IMPTOS <> 0) then
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ_NIIF(32, :IDDOC, :CTACONSUMO, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERRORI = ERRORI + 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)
                    VALUES (:IDC, :NROI, :CTACONSUMO, :CONC, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :fecha, NULL, 0, 31);
                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)
                    VALUES (:IDC, :NROI, :CTACONSUMO, :CONC, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA - IMPTOS;
                END
            END /* IMPTOS <> 0 */
        END /* CONSUMO K */
    /* IMP NACIONAL CONSUMO */
        BEGIN
        SELECT SUM(RVDE_INALCM), SUM(RVDE_TOTAL-RVDE_IVAMONTO-RVDE_CONSUMO-RVDE_INALCM) FROM remisiones_venta_detalle F
            WHERE F.REVT_ID = :IDDOC AND ((RVDE_REFERENCIA <> '.t') or (RVDE_REFERENCIA IS NULL)) and
            RVDE_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
                ERRORI = ERRORI + 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)
                    VALUES (:IDC, :NROI, :CTACONSUMO, :CONC, '', 0, :IMPTOS, :MONTO, :PORC, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :fecha, NULL, 0, 31);
                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)
                    VALUES (:IDC, :NROI, :CTACONSUMO, :CONC, '', 0, :IMPTOS, :MONTO, :PORC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA - IMPTOS;
                END
            END /* IMPTOS <> 0 */
        END /* INALC */

    /* ARTICULOS DE TERCEROS LLEVE ESE VALOR A LA CUENTA INDICADA */
    SELECT SUM(RVDE_TOTAL) FROM remisiones_venta_detalle F, ARTICULO A
        WHERE F.REVT_ID = :IDDOC AND ((RVDE_REFERENCIA <> '.t') or (RVDE_REFERENCIA IS NULL)) AND F.arti_cod = A.arti_cod AND A.arti_tercero = 'S'
        INTO :MONTO;
    if (MONTO IS NULL) then
        MONTO = 0;
    if (MONTO <> 0) then
        BEGIN
        execute procedure redondee(MONTO, DIG) returning_values (MONTO);
        if (MONTO <> 0) then
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ_NIIF(32, :IDDOC, :CTAVENTAS, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERRORI = ERRORI + 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)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :fecha, NULL, 0, 31);
                NROI = NROI + 1;
                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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA + MONTO;
                END
            END /* MONTO <> 0 */
        END
    /* CIERRE CONTRA LA CUENTA DEL TERCERO O LA CONSTANTE */
    if ((SUMA <> 0) and ((CARTERA = 'C') or (CARTERA = 'K'))) then
        BEGIN
        if (icoing = 'SI') then
            BEGIN
            /* DESCUENTE IMPOCONSUMO DEL COSTO */
            SELECT SUM(RVDE_CONSUMO) FROM remisiones_venta_detalle F WHERE F.revt_id = :IDDOC AND ((RVDE_REFERENCIA <> '.t') or (RVDE_REFERENCIA IS NULL))
                INTO :IMPTOS;
            SUMA = SUMA + IMPTOS;
            END
        if (SUMA < 0) then
            BEGIN
            DEBITO = SUMA * -1;
            CREDITO = 0;
            END
        ELSE
            BEGIN
            DEBITO = 0;
            CREDITO = SUMA;
            END
        if (CARTERA = 'C') then
            CTACARTERA = TCTACLIEN;
        EXECUTE PROCEDURE CUENTA_INTERFAZ_NIIF(32, :IDDOC, :CTACARTERA, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
        if (ERRORC <> 0) then
            ERRORI = ERRORI + 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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :DEBITO, :CREDITO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :fecha, NULL, 0, 31);
        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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :DEBITO, :CREDITO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
        NROI = NROI + 1;
        END /* SUMA EN CARTERA */
    /* CALCULE COSTOS EN VENTAS */
    EXECUTE PROCEDURE COSTO_EN_VENTAS(32, :IDDOC);
    if (COSTOS = 'A') then
        BEGIN
        FOR SELECT MAX(CTACOS), SUM(CAST(CANT AS DOUBLE PRECISION) * COSTO), SUM(RVDE_CONSUMO)
            FROM COSTO_VENTAS CV, remisiones_venta_detalle D WHERE CV.cove_item = D.rvde_item AND D.revt_id = :iddoc AND
            TIDO_COD = 32 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(32, :IDDOC, :CTACOSTOS, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERRORI = ERRORI + 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)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :fecha, NULL, 0, 31);
                    NROI = NROI + 1;
                    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)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    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 WHERE TIDO_COD = 32 AND COVE_ID = :iddoc
            INTO :MONTO;
        if (icoing = 'SI') then
            MONTO = MONTO + imptos;
        if (MONTO <> 0) then
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ_NIIF(32, :IDDOC, :CTACOSTOS, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERRORI = ERRORI + 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)
                    VALUES (:IDC, :NROI, :CTACOSTOS, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :fecha, NULL, 0, 31);
                NROI = NROI + 1;
                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)
                    VALUES (:IDC, :NROI, :CTACOSTOS, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                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 WHERE TIDO_COD = 32 AND COVE_ID = :iddoc
            GROUP BY CTAINV
            INTO :CTAINVEN, :MONTO
            DO
            BEGIN
            if (MONTO <> 0) then
                BEGIN
                EXECUTE PROCEDURE CUENTA_INTERFAZ_NIIF(32, :IDDOC, :CTAINVEN, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERRORI = ERRORI + 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)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :fecha, NULL, 0, 31);
                    NROI = NROI + 1;
                    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)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    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 WHERE TIDO_COD = 32 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
                ERRORI = ERRORI + 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)
                    VALUES (:IDC, :NROI, :CTAINVEN, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :fecha, NULL, 0, 31);
                NROI = NROI + 1;
                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)
                    VALUES (:IDC, :NROI, :CTAINVEN, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                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 = 'IVA') then
                VALORADIC = VRIVA;
            if (:BASEADIC = 'TOTAL') then
                VALORADIC = VRTOTAL;
            MONTO = VALORADIC * PORCADIC / 100;
            END
        if (MONTO <> 0) then
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ_NIIF(32, :IDDOC, :CTADIC, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERRORI = ERRORI + 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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTADIC, :CONC, '', :MONTO, 0, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :fecha, NULL, 0, 31);
                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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTADIC, :CONC, '', 0, :MONTO, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :fecha, NULL, 0, 31);
                NROI = NROI + 1;
                END
            ELSE
                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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTADIC, :CONC, '', :MONTO, 0, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTADIC, :CONC, '', 0, :MONTO, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                END
            NROI = NROI + 1;
            END
        END
    if (ERRORI > 0) then
        VER = 'S';
    SUSPEND;
    END /* NO ANULADO */
  END /* EXISTE LA INTERFAZ */
ELSE
    BEGIN
    EXECUTE PROCEDURE ERRORINT(32, :IDDOC, :PREF, 1);
    ERRORI = ERRORI + 1;
    VER = 'S';
    SUSPEND;
    END
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER procedure CONTABIL_REMIPROV_NIIF (
    IDDOC integer,
    IDINTER integer,
    IDC integer)
returns (
    ERRORI integer,
    VER char(1))
AS
DECLARE VARIABLE PREFIJO VARCHAR(4);
DECLARE VARIABLE NUM VARCHAR(8);
DECLARE VARIABLE NUMERO VARCHAR(10);
DECLARE VARIABLE FECAUX DATE;
DECLARE VARIABLE FECHA CHAR(8);
DECLARE VARIABLE CONCEPTO CHAR(60);
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 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 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 PROYDET VARCHAR(4);
DECLARE VARIABLE CENTRODET VARCHAR(4);
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 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(2);
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 SIMPLIF CHAR(1);
BEGIN
  /* INTERFACE */
  EXISTE = 'N';
  SELECT 'S', N.INCO_INVEN, N.INCO_IVA, N.INCO_CONSUMO, N.INCO_CXP,
    N.INCO_CTAINVEN, N.INCO_CTAIVA, N.INCO_CTACONSUMO, N.INCO_CTADTO, N.INCO_CTAADIC, N.INCO_CTAEXTRA, N.INCO_CTACXP,
    INCO_CONFIRMAR, INCO_CENTRO
    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,
    :CTAINVEN, :CTAIVA, :CTACONSUMO, :CTADTO, :CTAADIC, :CTAEXTRA, :CTACXP,
    :VER, :CENT;
  if (EXISTE = 'S') then
    BEGIN
    /* ENCABEZADO DE LA REMISION */
    SELECT PREF_PRE, REPR_NUMERO, REPR_FECHA, F.TERC_NIT, REPR_IMPTOS, REPR_DTOMONTO, REPR_ADICIONAL, REPR_IVAMONTO,
        REPR_EXTRA, REPR_TOTAL, TERC_NOM, PROV_CTAPAGAR, REPR_NUMPROV, REPR_ANULADO, PROV_SIMPLIFICADO
        FROM remision_proveedor F, TERCEROS T, PROVEEDORES P WHERE REPR_ID = :IDDOC AND F.TERC_NIT = T.TERC_NIT AND T.TERC_NIT = P.TERC_NIT
        INTO :PREFIJO, :NUM, :FECAUX, :NIT, :IMPINC, :VRDTO, :VRADIC, :VRIVA,
        :VREXTRA, :VRTOTAL, :NOMBRE, :TCTAPROV, :NUMPROV, :ANULADO, :simplif;
    /* CENTRO DE LA BODEGA */
    IF (CENT = 'B') THEN
        SELECT BODE_CENTRO, BODE_PROY FROM BODEGA B, remision_proveedor F WHERE B.BODE_COD = F.BODE_COD AND F.repr_id = :IDDOC INTO :CENTRO, :PROY;
    ELSE
        SELECT PREF_CENTRO,PREF_PROY  FROM PREFIJOS P, remision_proveedor F WHERE P.PREF_PRE = F.PREF_PRE AND F.repr_id = :IDDOC AND P.TIDO_COD = 22 INTO :CENTRO, :PROY;
    if (ANULADO = 'N') then
        BEGIN
        NUMERO = PREFIJO || NUM;
        VRSUBT = VRTOTAL - VREXTRA - VRIVA;
        MERCANCIA = VRSUBT - VRADIC + VRDTO;
        EXECUTE PROCEDURE FECHA_A_CONTA(:FECAUX) returning_values (:FECHA);
        if (NUMPROV IS NULL) then
            NUMPROV = NUMERO;
        CONCEPTO = 'REMIPROV No.' || NUMERO || '-' || SUBSTRING(NOMBRE FROM 1 FOR 26) || '-NPROV.' || NUMPROV;
        NUMITEMS = 100000;
        SUMA = 0;
        NETO = 0;
        ERRORI = 0;
        EXECUTE PROCEDURE LEE_CONFIGURACION('COMPRAS', 'FACTURAS', 'USAR IMPOCONSUMO COMO PORCENTAJE DE FOMENTO') RETURNING_VALUES (FOMENTO);
        EXECUTE PROCEDURE lee_configuracion('COMPRAS','FACTURAS','DESCUENTO Y VALOR ADICIONAL DEL DOCUMENTO COMO MENOR VALOR DEL COSTO') returning_values (:MENORV);
        SELECT SUM(RPVD_consumo) from remision_proveedor_det where REPR_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(RPVD_CANT AS DOUBLE PRECISION) * (RPVD_PRUNIT-RPVD_DTOMONTO)), SUM(RPVD_IVAMONTO), SUM(RPVD_CONSUMO), MAX(F.BODE_COD)
                FROM ARTICULO A, CONTABIL_ARTICULO_NIIF C, remision_proveedor_det F WHERE F.repr_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, :BODE_DET DO
                BEGIN
                IF (CENT = 'B') THEN
                  SELECT BODE_CENTRO, BODE_PROY FROM BODEGA WHERE BODE_COD = :BODE_DET INTO :CENTRODET, :PROYDET;
                if (IMPINC = 'S') then
                    BEGIN
                    MONTO = MONTO - IMPTOS;
                    if (FOMENTO <> 'SI' ) then
                        MONTO = MONTO - VALORADIC;
                    END
                MONTO = MONTO * FACTOR;
                execute procedure redondee(MONTO, DIG) returning_values (MONTO);
                execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
                EXECUTE PROCEDURE CUENTA_INTERFAZ_NIIF(22, :IDDOC, :CTAINVEN, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERRORI = ERRORI + 1;
                if ((TIPOCUEN = 'I') or (TIPOCUEN = 'A'))  then
                    BEGIN
                    FOR SELECT F.ARTI_COD, (RPVD_CANT * (RPVD_PRUNIT-RPVD_DTOMONTO)), RPVD_IVAMONTO, RPVD_CONSUMO
                        FROM ARTICULO A, CONTABIL_ARTICULO_NIIF C, remision_proveedor_det F WHERE F.repr_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;
                            if (FOMENTO <> 'SI' ) then
                                MONTO = MONTO - VALORADIC;
                            END
                        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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                               VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :MONTO, 0, 0, 0, :NIT, :PROYDET, :CENTRODET, NULL, NULL, NULL, :ARTICULO, 0, 0);
                        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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                               VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ARTICULO, 0, 0);
                        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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                           VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :MONTO, 0, 0, 0, :NIT, :PROYDET, :CENTRODET, :NUMERO, NULL, :fecha, NULL, 0, 22);
                    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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                           VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :fecha, NULL, 0, 22);
                    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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                           VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :MONTO, 0, 0, 0, :NIT, :PROYDET, :CENTRODET, NULL, NULL, NULL, NULL, 0, 0);
                    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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                           VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NUMITEMS = NUMITEMS + 1;
                    NETO = NETO + MONTO;
                    END
                END
            END
        if (INVEN = 'K') then
            BEGIN
            FOR SELECT SUM(CAST(RPVD_CANT AS DOUBLE PRECISION) * (RPVD_PRUNIT-RPVD_DTOMONTO)), SUM(RPVD_IVAMONTO), SUM(RPVD_CONSUMO), MAX(BODE_COD)
                FROM remision_proveedor_det WHERE REPR_ID = :IDDOC GROUP BY BODE_COD INTO :MONTO, :IMPTOS, :VALORADIC, :BODE_DET Do
                BEGIN
                  IF (CENT = 'B') THEN
                    SELECT BODE_CENTRO, BODE_PROY FROM BODEGA WHERE BODE_COD = :BODE_DET INTO :CENTRODET, :PROYDET;
                  if (IMPINC = 'S') then
                   BEGIN
                    MONTO = MONTO - IMPTOS;
                    if (FOMENTO <> 'SI' ) then
                      MONTO = MONTO - VALORADIC;
                   END
                  MONTO = MONTO * FACTOR;
                  execute procedure redondee(MONTO, DIG) returning_values (MONTO);
                  execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
                  EXECUTE PROCEDURE CUENTA_INTERFAZ_NIIF(22, :IDDOC, :CTAINVEN, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                  if (ERRORC <> 0) then
                    ERRORI = ERRORI + 1;
                if ((TIPOCUEN = 'I') or (TIPOCUEN = 'A'))  then
                   BEGIN
                    FOR SELECT ARTI_COD, (RPVD_CANT * (RPVD_PRUNIT-RPVD_DTOMONTO)), RPVD_IVAMONTO, RPVD_CONSUMO
                      FROM remision_proveedor_det WHERE REPR_ID = :IDDOC INTO :ARTICULO, :MONTO, :IMPTOS, :VALORADIC DO
                       BEGIN
                       if (IMPINC = 'S') then
                        BEGIN
                         MONTO = MONTO - IMPTOS;
                         if (FOMENTO <> 'SI' ) then
                            MONTO = MONTO - VALORADIC;
                        END
                       MONTO = MONTO * FACTOR;
                       execute procedure redondee(MONTO, DIG) returning_values (MONTO);
                       execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
                       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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                             VALUES (:IDC, :NUMITEMS, :CTAINVEN, :CONCEPTO, '', :MONTO, 0, 0, 0, :NIT, :PROYDET, :CENTRODET, NULL, NULL, NULL, :ARTICULO, 0, 0);
                       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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                             VALUES (:IDC, :NUMITEMS, :CTAINVEN, :CONCEPTO, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ARTICULO, 0, 0);
                       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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                         VALUES (:IDC, :NUMITEMS, :CTAINVEN, :CONCEPTO, '', :MONTO, 0, 0, 0, :NIT, :PROYDET, :CENTRODET, :NUMERO, NULL, :fecha, NULL, 0, 22);
                    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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                         VALUES (:IDC, :NUMITEMS, :CTAINVEN, :CONCEPTO, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :fecha, NULL, 0, 22);
                    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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                          VALUES (:IDC, :NUMITEMS, :CTAINVEN, :CONCEPTO, '', :MONTO, 0, 0, 0, :NIT, :PROYDET, :CENTRODET, NULL, NULL, NULL, NULL, 0, 0);
                    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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                          VALUES (:IDC, :NUMITEMS, :CTAINVEN, :CONCEPTO, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NUMITEMS = NUMITEMS + 1;
                    NETO = NETO + MONTO;
                   END
                END
            END
        /* EL IVA */
        if ((IVA = 'A') AND (SIMPLIF = 'N')) then
            BEGIN
            FOR SELECT MAX(COAR_CTAIVAC), SUM(RPVD_IVAMONTO), SUM(CAST(RPVD_CANT AS DOUBLE PRECISION) * (RPVD_PRUNIT-RPVD_DTOMONTO)), SUM(RPVD_CONSUMO)
                FROM ARTICULO A, CONTABIL_ARTICULO_NIIF C, remision_proveedor_det F
                WHERE F.repr_id = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND RPVD_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;
                    if (FOMENTO <> 'SI' ) then
                        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_NIIF(22, :IDDOC, :CTAIVA, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERRORI = ERRORI + 1;
                if (TIPOCUEN = 'I') then
                    BEGIN
                    FOR SELECT F.ARTI_COD, RPVD_IVAMONTO, (RPVD_CANT * (RPVD_PRUNIT-RPVD_DTOMONTO)), TAIV_PORC, RPVD_CONSUMO
                        FROM ARTICULO A, CONTABIL_ARTICULO_NIIF C, remision_proveedor_det F, TARIFA_IVA T WHERE F.repr_id = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND COAR_CTAIVAC = :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;
                            if (FOMENTO <> 'SI' ) then
                                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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :IMPTOS, 0, :MONTO, :PORCIVA, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ARTICULO, 0, 0);
                        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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :IMPTOS, 0, :MONTO, :IMPTOS*100/:MONTO, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :fecha, NULL, 0, 22);
                    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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :IMPTOS, 0, :MONTO, CAST(:IMPTOS AS DOUBLE PRECISION)*100/CAST(:MONTO AS DOUBLE PRECISION), :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NUMITEMS = NUMITEMS + 1;
                    NETO = NETO + IMPTOS;
                    END
                END
            END
        if ((IVA = 'K') or (SIMPLIF = 'S')) then /* IVA EN CTA CONSTANTE */
            BEGIN
            SELECT SUM(RPVD_IVAMONTO), SUM(CAST(RPVD_CANT AS DOUBLE PRECISION) * (RPVD_PRUNIT-RPVD_DTOMONTO)), SUM(RPVD_CONSUMO)
                FROM remision_proveedor_det F
                WHERE F.repr_id = :IDDOC  AND RPVD_IVAMONTO <> 0
                INTO :IMPTOS, :MONTO, :VALORADIC;
            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;
                    if (FOMENTO <> 'SI' ) then
                        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);
                if (SIMPLIF = 'S') then
                    BEGIN
                    EXECUTE PROCEDURE lee_configuracion('COMPRAS', 'FACTURAS', 'CUENTA DE IVA PARA EL REGIMEN SIMPLIFICADO') returning_values (:CTAIVA);
                    END
                EXECUTE PROCEDURE CUENTA_INTERFAZ_NIIF(22, :IDDOC, :CTAIVA, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERRORI = ERRORI + 1;
                if (TIPOCUEN = 'I') then
                    BEGIN
                    FOR SELECT F.ARTI_COD, (RPVD_CANT * (RPVD_PRUNIT-RPVD_DTOMONTO)), RPVD_IVAMONTO, TAIV_PORC, RPVD_CONSUMO
                        FROM ARTICULO A, remision_proveedor_det F, TARIFA_IVA T WHERE F.repr_id = :IDDOC AND A.TAIV_COD = T.TAIV_COD
                        INTO :ARTICULO, :MONTO, :IMPTOS, :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;
                            if (FOMENTO <> 'SI' ) then
                                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);
                        if (IMPTOS <> 0) then
                            BEGIN
                            INSERT INTO CONTABILIZACION_DET (CNTB_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)
                                VALUES (:IDC, :NUMITEMS, :CTAIVA, :CONCEPTO, '', :IMPTOS, 0, :MONTO, :PORCIVA, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ARTICULO, 0, 0);
                            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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NUMITEMS, :CTAIVA, :CONCEPTO, '', :IMPTOS, 0, :MONTO, :IMPTOS*100/:MONTO, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :fecha, NULL, 0, 22);
                    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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NUMITEMS, :CTAIVA, :CONCEPTO, '', :IMPTOS, 0, :MONTO, :IMPTOS*100/:MONTO, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NUMITEMS = NUMITEMS + 1;
                    NETO = NETO + IMPTOS;
                    END
                END
            END
        /* EL IMPOCONSUMO */
        if (CONSUMO = 'A') then
            BEGIN
            FOR SELECT MAX(COAR_CTACONS), SUM(RPVD_CONSUMO) FROM ARTICULO A, CONTABIL_ARTICULO_NIIF C, remision_proveedor_det F
                WHERE F.repr_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_NIIF(22, :IDDOC, :CTACONSUMO, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERRORI = ERRORI + 1;
                if (FOMENTO <> 'SI') then
                    BEGIN
                    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)
                            VALUES (:IDC, :NUMITEMS, :CTACONSUMO, :CONCEPTO, '', :IMPTOS, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :fecha, NULL, 0, 31);
                        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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NUMITEMS, :CTACONSUMO, :CONCEPTO, '', :IMPTOS, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                        NUMITEMS = NUMITEMS + 1;
                        NETO = NETO + IMPTOS;
                        END
                    END
                ELSE
                    BEGIN
                    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)
                            VALUES (:IDC, :NUMITEMS, :CTACONSUMO, :CONCEPTO, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :fecha, NULL, 0, 31);
                        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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NUMITEMS, :CTACONSUMO, :CONCEPTO, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                        NUMITEMS = NUMITEMS + 1;
                        NETO = NETO - IMPTOS;
                        END
                    END
                END
            END
        if (CONSUMO = 'K') then /* CONSUMO EN CTA CONSTANTE */
            BEGIN
            SELECT SUM(RPVD_CONSUMO) FROM remision_proveedor_det F WHERE F.repr_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_NIIF(22, :IDDOC, :CTACONSUMO, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
              if (ERRORC <> 0) then
                ERRORI = ERRORI + 1;
              if (FOMENTO <> 'SI') then
                BEGIN
                /* DEPENDE DEL TIPO DE CUENTA */
                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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NUMITEMS, :CTACONSUMO, :CONCEPTO, '', :IMPTOS, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :fecha, NULL, 0, 31);
                    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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NUMITEMS, :CTACONSUMO, :CONCEPTO, '', :IMPTOS, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NUMITEMS = NUMITEMS + 1;
                    NETO = NETO + IMPTOS;
                    END
                END
              ELSE
                BEGIN
                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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NUMITEMS, :CTACONSUMO, :CONCEPTO, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :fecha, NULL, 0, 31);
                    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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NUMITEMS, :CTACONSUMO, :CONCEPTO, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NUMITEMS = NUMITEMS + 1;
                    NETO = NETO - IMPTOS;
                    END
                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_NIIF(22, :IDDOC, :CTADTO, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERRORI = ERRORI + 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)
                    VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :VRDTO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :fecha, NULL, 0, 22);
                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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :VRDTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NUMITEMS = NUMITEMS + 1;
                NETO = NETO - VRDTO;
                END
            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_NIIF(22, :IDDOC, :CTAADIC, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERRORI = ERRORI + 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)
                    VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :VRADIC, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :fecha, NULL, 0, 22);
                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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :VRADIC, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                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_NIIF(22, :IDDOC, :CTAEXTRA, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERRORI = ERRORI + 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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :VREXTRA, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :fecha, NULL, 0, 22);
                else
                    begin
                    EXECUTE PROCEDURE lee_configuracion('COMPRAS', 'FACTURAS', 'CUENTA CONTABLE PARA VALORES EXTRA NEGATIVOS') returning_values (:CTAEXTRA);
                    if (CTAEXTRA <> '') then
                        CUENTA = CTAEXTRA;
                    INSERT INTO CONTABILIZACION_DET (CNTB_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)
                        VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, abs(:VREXTRA), 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :fecha, NULL, 0, 22);
                    end
                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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :VREXTRA, 0, 0, 0, :NIT, :PROY, :CENTRO, null, NULL, null, NULL, 0, 0);
                else
                    begin
                    EXECUTE PROCEDURE lee_configuracion('COMPRAS', 'FACTURAS', 'CUENTA CONTABLE PARA VALORES EXTRA NEGATIVOS') returning_values (:CTAEXTRA);
                    if (CTAEXTRA <> '') then
                        CUENTA = CTAEXTRA;
                    INSERT INTO CONTABILIZACION_DET (CNTB_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)
                        VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, abs(:VREXTRA), 0, 0, :NIT, :PROY, :CENTRO, null, NULL, null, NULL, 0, 0);
                    end
                NUMITEMS = NUMITEMS + 1;
                NETO = NETO + VREXTRA;
                END
            end
          END

        /* DESCUENTE EL IMPOCONSUMO */
        SELECT SUM(RPVD_CONSUMO) FROM remision_proveedor_det F WHERE F.repr_id = :IDDOC INTO :IMPTOS;
        if (IMPTOS IS NULL) then
            IMPTOS = 0;
        vrsubt = vrsubt - IMPTOS;
        /* 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_NIIF(22, :IDDOC, :CTACXP, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERRORI = ERRORI + 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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :SUMA, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :fecha, NULL, 0, 22);
            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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :SUMA, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            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(RPVD_CONSUMO) FROM remision_proveedor_det F WHERE F.repr_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_NIIF(22, :IDDOC, :CUENTAADIC, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERRORI = ERRORI + 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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NUMITEMS, :CUENTAADIC, :CONCEPTO, '', :MONTO, 0, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :fecha, NULL, 0, 31);
                        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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NUMITEMS, :CUENTAADIC, :CONCEPTO, '', 0, :MONTO, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :fecha, NULL, 0, 31);
                        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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NUMITEMS, :CUENTAADIC, :CONCEPTO, '', :MONTO, 0, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                        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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NUMITEMS, :CUENTAADIC, :CONCEPTO, '', 0, :MONTO, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                        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_NIIF(22, :IDDOC, :CTAADIC, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERRORI = ERRORI + 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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :NETO, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :fecha, NULL, 0, 31);
                        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)
                            VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :NETO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :fecha, NULL, 0, 31);
                        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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :NETO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                        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)
                            VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :NETO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                        END
                    END
                END
            END
        END
    if (ERRORI > 0) then
        VER = 'S';
    SUSPEND;
    END
ELSE
    BEGIN
    EXECUTE PROCEDURE ERRORINT(22, :IDDOC, :PREFIJO, 1);
    ERRORI = ERRORI + 1;
    VER = 'S';
    SUSPEND;
    END
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER procedure CONTABIL_SALIDA_NIIF (
    IDDOC integer,
    IDINTER integer,
    IDC integer)
returns (
    ERROR integer,
    VER char(1))
AS
declare variable PREFIJO VARCHAR(4);
declare variable CONCEPTO CHAR(60);
declare variable CTACIERRE VARCHAR(20);
declare variable BASE CHAR(1);
declare variable IVAV CHAR(1);
declare variable CONSUMO CHAR(1);
declare variable TOTAL CHAR(1);
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 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 CTABASE VARCHAR(20);
declare variable CTAIVA VARCHAR(20);
declare variable CTACONSUMO 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 PROV CHAR(1);
declare variable ANULADO CHAR(1);
declare variable CENT CHAR(1);
BEGIN
ERROR = 0;
/* BUSQUE LA INTERFACE */
EXISTE = 'N';
SELECT 'S', PREF_PRE, N.ININ_BASE, N.ININ_IVAV, N.ININ_CONSUMO, N.ININ_TOTAL, N.ININ_CTABASE, N.ININ_CTAIVA, N.ININ_CTACONSUMO, N.ININ_CTACIERRE, ININ_CONFIRMAR, ININ_CENTRO, ININ_CODPROY, ININ_CODCENT
    FROM INTERFAZ_INVENTARIO I, interfaz_inventario_niif N
    WHERE I.ININ_ID = :IDINTER AND I.inin_id = N.inin_id
    INTO :EXISTE, :PREFIJO, :BASE, :IVAV, :CONSUMO, :TOTAL, :CTABASE, :CTAIVA, :CTACONSUMO, :CTACIERRE, :VER, :CENT, :PROY, :centro;
if (EXISTE = 'S') then
    BEGIN
    /* TRAIGA EL ENCABEZADO DE LA SALIDA */
    SELECT PREF_PRE, SALI_CONC, TERC_NIT, SALI_IMPTOS, SALI_ANULADO
        FROM SALIDAS
        WHERE SALI_ID = :IDDOC
        INTO :PREFIJO, :CONCEPTO, :NIT, :IMPINC, :ANULADO;
    if ((NIT IS NULL) or (NIT = '')) then
        EXECUTE PROCEDURE LEE_CONFIGURACION('CONTABILIDAD', 'GENERAL', 'NIT COMPAÑIA') RETURNING_VALUES (:NIT);

    if (ANULADO = 'N') then
        BEGIN
        if (CENT = 'B') then
            SELECT BODE_CENTRO, BODE_PROY FROM BODEGA B, SALIDAS E
                WHERE B.BODE_COD = E.BODE_COD AND E.SALI_ID = :IDDOC INTO :CENTRO, :PROY;
        ELSE
          if (CENT = 'P') then
            SELECT PREF_CENTRO, PREF_PROY FROM PREFIJOS P, SALIDAS E
                WHERE P.PREF_PRE = E.PREF_PRE AND E.SALI_ID = :IDDOC AND P.TIDO_COD = 12 INTO :CENTRO, :PROY;
        NUMITEMS = 100000;
        SUMA = 0;
        /* PRIMERO LA BASE */
        if (BASE = 'A') then
            BEGIN
            /* SUME LAS BASES DE LOS ARTICULOS DEL DOCUMENTO */
            FOR SELECT MAX(COAR_CTAINV), SUM(SADE_CANT * SADE_COSTO), SUM(SADE_IVAMONTO + (SADE_CONSUMO*SADE_CANT*SADE_FACTOR))
                FROM ARTICULO A, CONTABIL_ARTICULO_NIIF C, SALIDAS_DETALLE E
                WHERE E.SALI_ID = :IDDOC AND E.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD
                GROUP BY COAR_CTAINV
                INTO :CTABASE, :MONTO, :IMPTOS
            DO
                BEGIN
                if (IMPINC = 'S') then
                    MONTO = MONTO - IMPTOS;
                if (MONTO <> 0) then
                    BEGIN
                    /* TRAIGA LAS CARACTERISTICAS DE LA CUENTA */
                    SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS_NIIF
                        WHERE CUEN_COD = :CTABASE INTO :CUENTA, :TIPOCUEN;
                    if (CUENTA IS NULL) then
                        begin
                        EXECUTE PROCEDURE ERRORINT(1012, :IDDOC, :CTABASE, 2);
                        CUENTA = CTABASE;
                        TIPOCUEN = 'N';
                        ERROR = ERROR + 1;
                        end
                    /* DEPENDE DEL TIPO DE CUENTA */
                    if ((TIPOCUEN = 'I') or (TIPOCUEN = 'A')) then
                        BEGIN
                        /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                        FOR SELECT E.ARTI_COD, (SADE_CANT * SADE_COSTO), (SADE_IVAMONTO + (SADE_CONSUMO*SADE_CANT*SADE_FACTOR))
                            FROM ARTICULO A, CONTABIL_ARTICULO_NIIF C, SALIDAS_DETALLE E
                            WHERE E.SALI_ID = :IDDOC AND E.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND COAR_CTAINV = :CUENTA
                            INTO :ARTICULO, :MONTO, :IMPTOS
                        DO
                            BEGIN
                            if (IMPINC = 'S') then
                                MONTO = MONTO - IMPTOS;
                            if (MONTO <> 0) then
                                BEGIN
                                INSERT INTO CONTABILIZACION_DET (CNTB_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)
                                    VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ARTICULO, 0, 0);
                                NUMITEMS = NUMITEMS + 1;
                                SUMA = SUMA - MONTO;
                                END
                            END
                        END
                    if (TIPOCUEN = 'C') then
                        BEGIN
                        EXECUTE PROCEDURE ERRORINT(1012, :IDDOC, :CUENTA, 4);
                        TIPOCUEN = 'N';
                        ERROR = ERROR + 1;
                        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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                        NUMITEMS = NUMITEMS + 1;
                        SUMA = SUMA - MONTO;
                        END
                    END
                END /* FOR */
            END /* BASE POR ARTICULO */
        if (BASE = 'I') then
            BEGIN
            /* SUME LAS BASES DE LOS ARTICULOS DEL DOCUMENTO */
            FOR SELECT MAX(TAIV_CTAINV), SUM(SADE_CANT * SADE_COSTO), SUM(SADE_IVAMONTO + (SADE_CONSUMO*SADE_CANT*SADE_FACTOR))
                FROM ARTICULO A, TARIFA_IVA I, SALIDAS_DETALLE E
                WHERE E.SALI_ID = :IDDOC AND E.ARTI_COD = A.ARTI_COD AND A.TAIV_COD = I.TAIV_COD
                GROUP BY TAIV_CTAINV
                INTO :CTABASE, :MONTO, :IMPTOS
            DO
                BEGIN
                if (IMPINC = 'S') then
                    MONTO = MONTO - IMPTOS;
                if (MONTO <> 0) then
                    BEGIN
                    /* TRAIGA LAS CARACTERISTICAS DE LA CUENTA */
                    SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS_NIIF
                        WHERE CUEN_COD = :CTABASE INTO :CUENTA, :TIPOCUEN;
                    if (CUENTA IS NULL) then
                        begin
                        EXECUTE PROCEDURE ERRORINT(1012, :IDDOC, :CTABASE, 2);
                        CUENTA = CTABASE;
                        TIPOCUEN = 'N';
                        ERROR = ERROR + 1;
                        end
                    /* DEPENDE DEL TIPO DE CUENTA */
                    if ((TIPOCUEN = 'I') or (TIPOCUEN = 'A')) then
                        BEGIN
                        /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                        FOR SELECT E.ARTI_COD, (SADE_CANT * SADE_COSTO), (SADE_IVAMONTO + (SADE_CONSUMO*SADE_CANT*SADE_FACTOR))
                            FROM ARTICULO A, TARIFA_IVA I, SALIDAS_DETALLE E
                            WHERE E.SALI_ID = :IDDOC AND E.ARTI_COD = A.ARTI_COD AND A.TAIV_COD = I.TAIV_COD AND TAIV_CTAINV = :CUENTA
                            INTO :ARTICULO, :MONTO, :IMPTOS
                        DO
                            BEGIN
                            if (IMPINC = 'S') then
                                MONTO = MONTO - IMPTOS;
                            if (MONTO <> 0) then
                                BEGIN
                                INSERT INTO CONTABILIZACION_DET (CNTB_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)
                                    VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ARTICULO, 0, 0);
                                NUMITEMS = NUMITEMS + 1;
                                SUMA = SUMA - MONTO;
                                END
                            END
                        END
                    if (TIPOCUEN = 'C') then
                        BEGIN
                        EXECUTE PROCEDURE ERRORINT(1012, :IDDOC, :CUENTA, 4);
                        TIPOCUEN = 'N';
                        ERROR = ERROR + 1;
                        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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                        NUMITEMS = NUMITEMS + 1;
                        SUMA = SUMA - MONTO;
                        END
                    END
                END /* FOR */
            END /* BASE POR IVA */
        if ((BASE = 'K') or (BASE = 'T')) then
            BEGIN
            if (BASE = 'T') then
                BEGIN
                SELECT TERC_PROV, TERC_CTAVENTA FROM TERCEROS WHERE TERC_NIT = :NIT INTO :PROV, :CTABASE;
                if (:PROV = 'S') then
                    SELECT PROV_CTACAUSA FROM PROVEEDORES WHERE TERC_NIT = :NIT INTO :CTABASE;
                END
            /* SUME LAS BASES DE LOS ARTICULOS DEL DOCUMENTO */
            FOR SELECT SUM(SADE_CANT * SADE_COSTO), SUM(SADE_IVAMONTO + (SADE_CONSUMO*SADE_CANT*SADE_FACTOR))
                FROM SALIDAS_DETALLE
                WHERE SALI_ID = :IDDOC
                INTO :MONTO, :IMPTOS
            DO
                BEGIN
                if (IMPINC = 'S') then
                    MONTO = MONTO - IMPTOS;
                if (MONTO <> 0) then
                    BEGIN
                    /* TRAIGA LAS CARACTERISTICAS DE LA CUENTA */
                    SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS_NIIF
                        WHERE CUEN_COD = :CTABASE INTO :CUENTA, :TIPOCUEN;
                    if (CUENTA IS NULL) then
                        begin
                        EXECUTE PROCEDURE ERRORINT(1012, :IDDOC, :CTABASE, 2);
                        CUENTA = CTABASE;
                        TIPOCUEN = 'N';
                        ERROR = ERROR + 1;
                        end
                    /* DEPENDE DEL TIPO DE CUENTA */
                    if (TIPOCUEN = 'I') then
                        BEGIN
                        /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                        FOR SELECT E.ARTI_COD, (SADE_CANT * SADE_COSTO), (SADE_IVAMONTO + (SADE_CONSUMO*SADE_CANT*SADE_FACTOR))
                            FROM ARTICULO A, CONTABIL_ARTICULO_NIIF C, SALIDAS_DETALLE E
                            WHERE E.SALI_ID = :IDDOC AND E.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND COAR_CTAINV = :CUENTA
                            INTO :ARTICULO, :MONTO, :IMPTOS
                        DO
                            BEGIN
                            if (IMPINC = 'S') then
                                MONTO = MONTO - IMPTOS;
                            if (MONTO <> 0) then
                                BEGIN
                                INSERT INTO CONTABILIZACION_DET (CNTB_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)
                                    VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ARTICULO, 0, 0);
                                NUMITEMS = NUMITEMS + 1;
                                SUMA = SUMA - MONTO;
                                END
                            END
                        END
                    if (TIPOCUEN = 'C') then
                        BEGIN
                        EXECUTE PROCEDURE ERRORINT(1012, :IDDOC, :CUENTA, 4);
                        TIPOCUEN = 'N';
                        ERROR = ERROR + 1;
                        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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                        NUMITEMS = NUMITEMS + 1;
                        SUMA = SUMA - MONTO;
                        END
                    END
                END /* FOR */
            END /* BASE K O POR TERCERO */
        /* EL IVA EN VENTAS */
        if (IVAV = 'A') then
            BEGIN
            /* SUME LAS BASES DE LOS ARTICULOS DEL DOCUMENTO */
            FOR SELECT MAX(COAR_CTAIVAV), SUM(SADE_IVAMONTO), SUM(SADE_CANT * SADE_COSTO)
                FROM ARTICULO A, CONTABIL_ARTICULO_NIIF C, SALIDAS_DETALLE E
                WHERE E.SALI_ID = :IDDOC AND E.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD
                GROUP BY COAR_CTAIVAV
                INTO :CTAIVA, :IMPTOS, :MONTO
            DO
                BEGIN
                if (IMPTOS <> 0) then
                    BEGIN
                    /* TRAIGA LAS CARCATERISTICAS DE LA CUENTA */
                    SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS_NIIF
                        WHERE CUEN_COD = :CTAIVA INTO :CUENTA, :TIPOCUEN;
                    if (CUENTA IS NULL) then
                        begin
                        EXECUTE PROCEDURE ERRORINT(1012, :IDDOC, :CTAIVA, 2);
                        CUENTA = CTAIVA;
                        TIPOCUEN = 'N';
                        ERROR = ERROR + 1;
                        end
                    if (TIPOCUEN = 'I') then
                        BEGIN
                        /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                        FOR SELECT E.ARTI_COD, SADE_IVAMONTO, (SADE_CANT * SADE_COSTO)
                            FROM ARTICULO A, CONTABIL_ARTICULO_NIIF C, SALIDAS_DETALLE E
                            WHERE E.SALI_ID = :IDDOC AND E.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND COAR_CTAIVAV = :CUENTA
                            INTO :ARTICULO, :IMPTOS, :MONTO
                        DO
                            BEGIN
                            if (IMPINC = 'S') then
                                MONTO = MONTO - IMPTOS;
                            MONTO = MONTO * -1;
                            if (IMPTOS <> 0) then
                                BEGIN
                                INSERT INTO CONTABILIZACION_DET (CNTB_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)
                                    VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :IMPTOS, :MONTO, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ARTICULO, 0, 0);
                                NUMITEMS = NUMITEMS + 1;
                                SUMA = SUMA - IMPTOS;
                                END
                            END
                        END
                    if (TIPOCUEN = 'C') then
                        BEGIN
                        EXECUTE PROCEDURE ERRORINT(1012, :IDDOC, :CUENTA, 4);
                        TIPOCUEN = 'N';
                        ERROR = ERROR + 1;
                        END
                    if (TIPOCUEN = 'N') then
                        BEGIN
                        /* INSERTE EL REGISTRO DEL IVA EN VENTAS */
                        if (IMPINC = 'S') then
                            MONTO = MONTO - IMPTOS;
                        MONTO = MONTO * -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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :IMPTOS, :MONTO, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                        NUMITEMS = NUMITEMS + 1;
                        SUMA = SUMA - IMPTOS;
                        END
                    END
                END /* FOR */
            END /* IVA POR ARTICULO */
        if (IVAV = 'I') then
            BEGIN
            /* SUME LAS BASES DE LOS ARTICULOS DEL DOCUMENTO */
            FOR SELECT MAX(TAIV_CTAIVAVNT), SUM(SADE_IVAMONTO), SUM(SADE_CANT * SADE_COSTO)
                FROM ARTICULO A, TARIFA_IVA I, SALIDAS_DETALLE E
                WHERE E.SALI_ID = :IDDOC AND E.ARTI_COD = A.ARTI_COD AND A.TAIV_COD = I.TAIV_COD
                GROUP BY TAIV_CTAIVAVNT
                INTO :CTAIVA, :IMPTOS, :MONTO
            DO
                BEGIN
                if (IMPTOS <> 0) then
                    BEGIN
                    /* TRAIGA LAS CARCATERISTICAS DE LA CUENTA */
                    SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS_NIIF
                        WHERE CUEN_COD = :CTAIVA INTO :CUENTA, :TIPOCUEN;
                    if (CUENTA IS NULL) then
                        begin
                        EXECUTE PROCEDURE ERRORINT(1012, :IDDOC, :CTAIVA, 2);
                        CUENTA = CTAIVA;
                        TIPOCUEN = 'N';
                        ERROR = ERROR + 1;
                        end
                    if (TIPOCUEN = 'I') then
                        BEGIN
                        /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                        FOR SELECT E.ARTI_COD, SADE_IVAMONTO, (SADE_CANT * SADE_COSTO)
                            FROM ARTICULO A, TARIFA_IVA I, SALIDAS_DETALLE E
                            WHERE E.SALI_ID = :IDDOC AND E.ARTI_COD = A.ARTI_COD AND A.TAIV_COD = I.TAIV_COD AND TAIV_CTAIVAVNT = :CUENTA
                            INTO :ARTICULO, :IMPTOS, :MONTO
                        DO
                            BEGIN
                            if (IMPINC = 'S') then
                                MONTO = MONTO - IMPTOS;
                            MONTO = MONTO * -1;
                            if (IMPTOS <> 0) then
                                BEGIN
                                INSERT INTO CONTABILIZACION_DET (CNTB_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)
                                    VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :IMPTOS, :MONTO, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ARTICULO, 0, 0);
                                NUMITEMS = NUMITEMS + 1;
                                SUMA = SUMA - IMPTOS;
                                END
                            END
                        END
                    if (TIPOCUEN = 'C') then
                        BEGIN
                        EXECUTE PROCEDURE ERRORINT(1012, :IDDOC, :CUENTA, 4);
                        TIPOCUEN = 'N';
                        ERROR = ERROR + 1;
                        END
                    if (TIPOCUEN = 'N') then
                        BEGIN
                        /* INSERTE EL REGISTRO DEL IVA EN VENTAS */
                        if (IMPINC = 'S') then
                            MONTO = MONTO - IMPTOS;
                        MONTO = MONTO * -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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :IMPTOS, :MONTO, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                        NUMITEMS = NUMITEMS + 1;
                        SUMA = SUMA - IMPTOS;
                        END
                    END
                END /* FOR */
            END /* IVA POR TARIFA */
        if (IVAV = 'K') then
            BEGIN
            /* SUME LAS BASES DE LOS ARTICULOS DEL DOCUMENTO */
            SELECT SUM(SADE_IVAMONTO), SUM(SADE_CANT * SADE_COSTO)
                FROM SALIDAS_DETALLE
                WHERE SALI_ID = :IDDOC
                INTO :IMPTOS, :MONTO;
            if (IMPTOS <> 0) then
                BEGIN
                /* TRAIGA LAS CARCATERISTICAS DE LA CUENTA */
                SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS_NIIF
                    WHERE CUEN_COD = :CTAIVA INTO :CUENTA, :TIPOCUEN;
                if (CUENTA IS NULL) then
                    begin
                    EXECUTE PROCEDURE ERRORINT(1012, :IDDOC, :CTAIVA, 2);
                    CUENTA = CTAIVA;
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    end
                if (TIPOCUEN = 'I') then
                    BEGIN
                    /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                    FOR SELECT E.ARTI_COD, SADE_IVAMONTO, (SADE_CANT * SADE_COSTO)
                        FROM ARTICULO A, CONTABIL_ARTICULO_NIIF C, SALIDAS_DETALLE E
                        WHERE E.SALI_ID = :IDDOC AND E.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND COAR_CTAIVAV = :CUENTA
                        INTO :ARTICULO, :IMPTOS, :MONTO
                        DO
                        BEGIN
                        if (IMPTOS <> 0) then
                            BEGIN
                            if (IMPINC = 'S') then
                                MONTO = MONTO - IMPTOS;
                            MONTO = MONTO * -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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                                VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :IMPTOS, :MONTO, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ARTICULO, 0, 0);
                            NUMITEMS = NUMITEMS + 1;
                            SUMA = SUMA - IMPTOS;
                            END
                        END
                    END
                if (TIPOCUEN = 'C') then
                        BEGIN
                        EXECUTE PROCEDURE ERRORINT(1012, :IDDOC, :CUENTA, 4);
                        TIPOCUEN = 'N';
                        ERROR = ERROR + 1;
                        END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    /* INSERTE EL REGISTRO DEL IVA EN VENTAS */
                    if (IMPINC = 'S') then
                        MONTO = MONTO - IMPTOS;
                    MONTO = MONTO * -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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :IMPTOS, :MONTO, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NUMITEMS = NUMITEMS + 1;
                    SUMA = SUMA - IMPTOS;
                    END
                END
            END /* IVA CONSTANTE */
        /* EL IMPOCONSUMO */
        if (CONSUMO = 'A') then
            BEGIN
            /* SUME LAS BASES DE LOS ARTICULOS DEL DOCUMENTO */
            FOR SELECT MAX(COAR_CTACONS), SUM(SADE_CONSUMO*SADE_CANT*SADE_FACTOR)
                FROM ARTICULO A, CONTABIL_ARTICULO_NIIF C, SALIDAS_DETALLE E
                WHERE E.SALI_ID = :IDDOC AND E.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 */
                    SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS_NIIF
                        WHERE CUEN_COD = :CTACONSUMO INTO :CUENTA, :TIPOCUEN;
                    if (CUENTA IS NULL) then
                        begin
                        EXECUTE PROCEDURE ERRORINT(1012, :IDDOC, :CTACONSUMO, 2);
                        CUENTA = CTACONSUMO;
                        TIPOCUEN = 'N';
                        ERROR = ERROR + 1;
                        end
                    if (TIPOCUEN = 'I') then
                        BEGIN
                        /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                        FOR SELECT E.ARTI_COD, SADE_CONSUMO*SADE_CANT*SADE_FACTOR
                            FROM ARTICULO A, CONTABIL_ARTICULO_NIIF C, SALIDAS_DETALLE E
                            WHERE E.SALI_ID = :IDDOC AND E.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND COAR_CTACONS = :CUENTA
                            INTO :ARTICULO, :IMPTOS
                            DO
                            if (IMPTOS <> 0) then
                                BEGIN
                                INSERT INTO CONTABILIZACION_DET (CNTB_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)
                                    VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ARTICULO, 0, 0);
                                NUMITEMS = NUMITEMS + 1;
                                SUMA = SUMA - IMPTOS;
                                END
                        END
                    if (TIPOCUEN = 'C') then
                        BEGIN
                        EXECUTE PROCEDURE ERRORINT(1012, :IDDOC, :CUENTA, 4);
                        TIPOCUEN = 'N';
                        ERROR = ERROR + 1;
                        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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                        NUMITEMS = NUMITEMS + 1;
                        SUMA = SUMA - IMPTOS;
                        END
                    END
                END /* FOR */
            END /* CONSUMO POR ARTICULO */
        if (CONSUMO = 'K') then
            BEGIN
            /* SUME LAS BASES DE LOS ARTICULOS DEL DOCUMENTO */
            SELECT SUM(SADE_CONSUMO*SADE_CANT*SADE_FACTOR)
                FROM SALIDAS_DETALLE
                WHERE SALI_ID = :IDDOC
                INTO :IMPTOS;
            if (IMPTOS <> 0) then
                BEGIN
                /* TRAIGA LAS CARACTERISTICAS DE LA CUENTA */
                SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS_NIIF
                    WHERE CUEN_COD = :ctaconsumo INTO :CUENTA, :TIPOCUEN;
                if (CUENTA IS NULL) then
                    begin
                    EXECUTE PROCEDURE ERRORINT(1012, :IDDOC, :CTACONSUMO, 2);
                    CUENTA = CTACONSUMO;
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    end
                if (TIPOCUEN = 'I') then
                    BEGIN
                    /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                    FOR SELECT E.ARTI_COD, SADE_CONSUMO*SADE_CANT*SADE_FACTOR
                    FROM ARTICULO A, CONTABIL_ARTICULO_NIIF C, SALIDAS_DETALLE E
                        WHERE E.SALI_ID = :IDDOC AND E.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND COAR_CTACONS = :CUENTA
                        INTO :ARTICULO, :IMPTOS
                        DO
                        if (IMPTOS <> 0) then
                            BEGIN
                            INSERT INTO CONTABILIZACION_DET (CNTB_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)
                                VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ARTICULO, 0, 0);
                            NUMITEMS = NUMITEMS + 1;
                            SUMA = SUMA - IMPTOS;
                            END
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    EXECUTE PROCEDURE ERRORINT(1012, :IDDOC, :CUENTA, 4);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NUMITEMS = NUMITEMS + 1;
                    SUMA = SUMA - IMPTOS;
                    END
                END
            END /* CONSUMO CONSTANTE */
        /* recorra las cuentas adicionales */
        FOR SELECT INIC_CUENTA, INIC_BASE, INIC_PORC, INIC_VALOR, INIC_DB
            FROM INTERFAZ_INVENTARIO_CTAS
            WHERE ININ_ID = :IDINTER
            INTO :CUENTAADIC, :BASEADIC, :PORCADIC, :VALORADIC, :DBADIC
            DO
            BEGIN
            if (VALORADIC <> 0) then
                MONTO = VALORADIC;
            ELSE
                BEGIN
                if (:BASEADIC = 'SUBTOTAL') then
                    SELECT SUM(SADE_CANT * SADE_COSTO)
                    FROM SALIDAS_DETALLE E
                    WHERE E.SALI_ID = :IDDOC 
                    INTO :VALORADIC;
                if (:BASEADIC = 'IVA') then
                    SELECT SUM(SADE_IVAMONTO)
                    FROM SALIDAS_DETALLE E
                    WHERE E.SALI_ID = :IDDOC 
                    INTO :VALORADIC;
                if (:BASEADIC = 'CONSUMO') then
                    SELECT SUM(SADE_CONSUMO*SADE_CANT*SADE_FACTOR)
                    FROM SALIDAS_DETALLE E
                    WHERE E.SALI_ID = :IDDOC 
                    INTO :VALORADIC;
                MONTO = VALORADIC * PORCADIC / 100;
                END
            if (MONTO <> 0) then
                BEGIN
                /* 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(1012, :IDDOC, :CUENTAADIC, 2);
                    CUENTA = CUENTAADIC;
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    end
                if (TIPOCUEN = 'I') then
                    BEGIN
                    EXECUTE PROCEDURE ERRORINT(1012, :IDDOC, :CUENTA, 3);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    EXECUTE PROCEDURE ERRORINT(1012, :IDDOC, :CUENTA, 4);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NUMITEMS, :CUENTAADIC, :CONCEPTO, '', :MONTO, 0, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                        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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NUMITEMS, :CUENTAADIC, :CONCEPTO, '', 0, :MONTO, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                        SUMA = SUMA - MONTO;
                        END
                    NUMITEMS = NUMITEMS + 1;
                    END
                END
            END
        /* CIERRE EL COMPROBANTE  */
        if (SUMA <> 0) then
            BEGIN
            if (SUMA > 0) then
                BEGIN
                DEBITO = 0;
                CREDITO = SUMA;
                END
            ELSE    
                BEGIN
                DEBITO = SUMA * -1;
                CREDITO = 0;
                END
            if ((TOTAL = 'K') or (TOTAL = 'T')) then
                BEGIN
                if (TOTAL = 'T') then
                    BEGIN
                    SELECT TERC_CTAPROV, TERC_PROV
                        FROM TERCEROS WHERE TERC_NIT = :NIT
                        INTO :CTACIERRE, :PROV;
                    if (PROV = 'S') then
                        SELECT PROV_CTAPAGAR FROM PROVEEDORES WHERE TERC_NIT = :nit
                        INTO :CTACIERRE;
                    END
                /* TRAIGA LAS CARACTERISTICAS DE LA CUENTA */
                SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS_NIIF
                    WHERE CUEN_COD = :CTACIERRE INTO :CUENTA, :TIPOCUEN;
                if (CUENTA IS NULL) then
                    begin
                    EXECUTE PROCEDURE ERRORINT(1012, :IDDOC, :CTACIERRE, 2);
                    CUENTA = CTACIERRE;
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    end
                if (TIPOCUEN = 'I') then
                    BEGIN
                    EXECUTE PROCEDURE ERRORINT(1012, :IDDOC, :CUENTA, 3);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    EXECUTE PROCEDURE ERRORINT(1012, :IDDOC, :CUENTA, 4);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    END
                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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :DEBITO, :CREDITO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                END
            END /* SUMA */
        if (ERROR > 0) then
            VER = 'S';
        SUSPEND;
        END /* NO ANULADO */
    END /* EXISTE LA INTERFAZ */
ELSE
    BEGIN
    EXECUTE PROCEDURE ERRORINT(1012, :IDDOC, :PREFIJO, 1);
    ERROR = ERROR + 1;
    VER = 'S';
    SUSPEND;
    END
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER procedure CONTABIL_TRASMERC_NIIF (
    IDDOC integer,
    IDINTER integer,
    IDC integer)
returns (
    ERROR integer,
    VER char(1))
AS
declare variable PREFIJO VARCHAR(4);
declare variable CONCEPTO CHAR(60);
declare variable CTACIERRE VARCHAR(20);
declare variable BASE CHAR(1);
declare variable IVAV CHAR(1);
declare variable CONSUMO CHAR(1);
declare variable TOTAL CHAR(1);
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 PROYDES VARCHAR(4);
declare variable CENTRODES VARCHAR(4);
declare variable DEBITO NUMERIC(18,2);
declare variable CREDITO NUMERIC(18,2);
declare variable DEBITODES NUMERIC(18,2);
declare variable CREDITODES 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 SUMADES NUMERIC(18,2);
declare variable CTABASE VARCHAR(20);
declare variable CTAIVA VARCHAR(20);
declare variable CTACONSUMO 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 PROV CHAR(1);
declare variable ANULADO CHAR(1);
declare variable CENT CHAR(1);
BEGIN
ERROR = 0;
/* BUSQUE LA INTERFACE */
EXISTE = 'N';
  SELECT 'S', PREF_PRE, N.ININ_BASE, N.ININ_IVAV, N.ININ_CONSUMO, N.ININ_TOTAL, N.ININ_CTABASE, N.ININ_CTAIVA, N.ININ_CTACONSUMO, N.ININ_CTACIERRE, ININ_CONFIRMAR, ININ_CENTRO, ININ_CODPROY, ININ_CODCENT
    FROM INTERFAZ_INVENTARIO I, interfaz_inventario_niif N
    WHERE I.ININ_ID = :IDINTER AND I.inin_id = N.inin_id
    INTO :EXISTE, :PREFIJO, :BASE, :IVAV, :CONSUMO, :TOTAL, :CTABASE, :CTAIVA, :CTACONSUMO, :CTACIERRE, :VER, :CENT, :PROY, :centro;
if (EXISTE = 'S') then
    BEGIN
    /* TRAIGA EL ENCABEZADO DE LA SALIDA */
    SELECT PREF_PRE, TRAN_CONC, TERC_NIT, TRAN_IMPTOS, TRAN_ANULADO
        FROM TRASFERENCIAS
        WHERE TRAN_ID = :IDDOC
        INTO :PREFIJO, :CONCEPTO, :NIT, :IMPINC, :ANULADO;

    if (ANULADO = 'N') then
        BEGIN
        if (CENT = 'B') then
          BEGIN
            SELECT BODE_CENTRO, BODE_PROY FROM BODEGA B, TRASFERENCIAS E
                WHERE B.BODE_COD = E.BODE_COD AND E.tran_id = :IDDOC INTO :CENTRO, :PROY;
            SELECT BODE_CENTRO, BODE_PROY FROM BODEGA B, TRASFERENCIAS E
                WHERE B.BODE_COD = E.TRAN_BODDES AND E.tran_id = :IDDOC INTO :CENTRODES, :PROYDES;
          END
        ELSE
          if (CENT = 'P') then
            BEGIN
            SELECT PREF_CENTRO, PREF_PROY FROM PREFIJOS P, TRASFERENCIAS E
                WHERE P.PREF_PRE = E.PREF_PRE AND E.TRAN_ID = :IDDOC AND P.TIDO_COD = 13 INTO :CENTRO, :PROY;
            SELECT PREF_CENTRO, PREF_PROY FROM PREFIJOS P, TRASFERENCIAS E
                WHERE P.PREF_PRE = E.PREF_PRE AND E.TRAN_ID = :IDDOC AND P.TIDO_COD = 13 INTO :CENTRODES, :PROYDES;
            END
          ELSE
            BEGIN
            SELECT BODE_CENTRO, BODE_PROY FROM BODEGA B, TRASFERENCIAS E
                WHERE B.BODE_COD = E.BODE_COD AND E.tran_id = :IDDOC INTO :CENTRO, :PROY;
            END
        NUMITEMS = 100000;
        SUMA = 0;
        SUMADES = 0;
        ERROR = 0;
        /* PRIMERO LA BASE */
        if (BASE = 'A') then
            BEGIN
            /* SUME LAS BASES DE LOS ARTICULOS DEL DOCUMENTO */
            FOR SELECT MAX(COAR_CTAINV), SUM(TRAS_CANT * TRAS_COSTO), SUM(TRAS_IVAMONTO + (TRAS_CONSUMO*TRAS_CANT*TRAS_FACTOR))
                FROM ARTICULO A, CONTABIL_ARTICULO_NIIF C, TRASFERENCIAS_DETALLE E
                WHERE E.TRAN_ID = :IDDOC AND E.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD
                GROUP BY COAR_CTAINV
                INTO :CTABASE, :MONTO, :IMPTOS
            DO
                BEGIN
                if (IMPINC = 'S') then
                    MONTO = MONTO - IMPTOS;
                if (MONTO <> 0) then
                    BEGIN
                    /* TRAIGA LAS CARACTERISTICAS DE LA CUENTA */
                    SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS_NIIF
                        WHERE CUEN_COD = :CTABASE INTO :CUENTA, :TIPOCUEN;
                    if (CUENTA IS NULL) then
                        begin
                        EXECUTE PROCEDURE ERRORINT(1013, :IDDOC, :CTABASE, 2);
                        CUENTA = CTABASE;
                        TIPOCUEN = 'N';
                        ERROR = ERROR + 1;
                        end
                    /* DEPENDE DEL TIPO DE CUENTA */
                    if ((TIPOCUEN = 'I') or (TIPOCUEN = 'A')) then
                        BEGIN
                        /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                        FOR SELECT E.ARTI_COD, (TRAS_CANT * TRAS_COSTO), (TRAS_IVAMONTO + (TRAS_CONSUMO*TRAS_CANT*TRAS_FACTOR))
                            FROM ARTICULO A, CONTABIL_ARTICULO_NIIF C, TRASFERENCIAS_DETALLE E
                            WHERE E.TRAN_ID = :IDDOC AND E.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND COAR_CTAINV = :CUENTA
                            INTO :ARTICULO, :MONTO, :IMPTOS
                        DO
                            BEGIN
                            if (IMPINC = 'S') then
                                MONTO = MONTO - IMPTOS;
                            if (MONTO <> 0) then
                                BEGIN
                                /*PRIMERO LA SALIDA*/
                                INSERT INTO CONTABILIZACION_DET (CNTB_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)
                                    VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ARTICULO, 0, 0);
                                NUMITEMS = NUMITEMS + 1;
                                SUMA = SUMA - MONTO;
                                /*AHORA LA ENTRADA*/
                                INSERT INTO CONTABILIZACION_DET (CNTB_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)
                                    VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :MONTO, 0, 0, 0, :NIT, :PROYDES, :CENTRODES, NULL, NULL, NULL, :ARTICULO, 0, 0);
                                SUMADES = SUMADES + MONTO;
                                NUMITEMS = NUMITEMS + 1;
                                END
                            END
                        END
                    if (TIPOCUEN = 'C') then
                        BEGIN
                        EXECUTE PROCEDURE ERRORINT(1013, :IDDOC, :CUENTA, 4);
                        TIPOCUEN = 'N';
                        ERROR = ERROR + 1;
                        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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                        NUMITEMS = NUMITEMS + 1;
                        SUMA = SUMA - MONTO;
                                /*AHORA LA ENTRADA*/
                        INSERT INTO CONTABILIZACION_DET (CNTB_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)
                          VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :MONTO, 0, 0, 0, :NIT, :PROYDES, :CENTRODES, NULL, NULL, NULL, :ARTICULO, 0, 0);
                        SUMADES = SUMADES + MONTO;
                        NUMITEMS = NUMITEMS + 1;
                        END
                    END
                END /* FOR */
            END /* BASE POR ARTICULO */
        if (BASE = 'I') then
            BEGIN
            /* SUME LAS BASES DE LOS ARTICULOS DEL DOCUMENTO */
            FOR SELECT MAX(TAIV_CTAINV), SUM(TRAS_CANT * TRAS_COSTO), SUM(TRAS_IVAMONTO + (TRAS_CONSUMO*TRAS_CANT*TRAS_FACTOR))
                FROM ARTICULO A, TARIFA_IVA I, TRASFERENCIAS_DETALLE E
                WHERE E.TRAN_ID = :IDDOC AND E.ARTI_COD = A.ARTI_COD AND A.TAIV_COD = I.TAIV_COD
                GROUP BY TAIV_CTAINV
                INTO :CTABASE, :MONTO, :IMPTOS
            DO
                BEGIN
                if (IMPINC = 'S') then
                    MONTO = MONTO - IMPTOS;
                if (MONTO <> 0) then
                    BEGIN
                    /* TRAIGA LAS CARACTERISTICAS DE LA CUENTA */
                    SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS_NIIF
                        WHERE CUEN_COD = :CTABASE INTO :CUENTA, :TIPOCUEN;
                    if (CUENTA IS NULL) then
                        begin
                        EXECUTE PROCEDURE ERRORINT(1013, :IDDOC, :CTABASE, 2);
                        CUENTA = CTABASE;
                        TIPOCUEN = 'N';
                        ERROR = ERROR + 1;
                        end
                    /* DEPENDE DEL TIPO DE CUENTA */
                    if ((TIPOCUEN = 'I') or (TIPOCUEN = 'A')) then
                        BEGIN
                        /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                        FOR SELECT E.ARTI_COD, (TRAS_CANT * TRAS_COSTO), (TRAS_IVAMONTO + (TRAS_CONSUMO*TRAS_CANT*TRAS_FACTOR))
                            FROM ARTICULO A, TARIFA_IVA I, TRASFERENCIAS_DETALLE E
                            WHERE E.TRAN_ID = :IDDOC AND E.ARTI_COD = A.ARTI_COD AND A.TAIV_COD = I.TAIV_COD AND TAIV_CTAINV = :CUENTA
                            INTO :ARTICULO, :MONTO, :IMPTOS
                        DO
                            BEGIN
                            if (IMPINC = 'S') then
                                MONTO = MONTO - IMPTOS;
                            if (MONTO <> 0) then
                                BEGIN
                                INSERT INTO CONTABILIZACION_DET (CNTB_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)
                                    VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ARTICULO, 0, 0);
                                NUMITEMS = NUMITEMS + 1;
                                SUMA = SUMA - MONTO;
                                /*AHORA LA ENTRADA*/
                                INSERT INTO CONTABILIZACION_DET (CNTB_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)
                                  VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :MONTO, 0, 0, 0, :NIT, :PROYDES, :CENTRODES, NULL, NULL, NULL, :ARTICULO, 0, 0);
                                SUMADES = SUMADES + MONTO;
                                NUMITEMS = NUMITEMS + 1;
                                END
                            END
                        END
                    if (TIPOCUEN = 'C') then
                        BEGIN
                        EXECUTE PROCEDURE ERRORINT(1013, :IDDOC, :CUENTA, 4);
                        TIPOCUEN = 'N';
                        ERROR = ERROR + 1;
                        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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                        NUMITEMS = NUMITEMS + 1;
                        SUMA = SUMA - MONTO;
                        /*AHORA LA ENTRADA*/
                        INSERT INTO CONTABILIZACION_DET (CNTB_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)
                            VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :MONTO, 0, 0, 0, :NIT, :PROYDES, :CENTRODES, NULL, NULL, NULL, :ARTICULO, 0, 0);
                        SUMADES = SUMADES + MONTO;
                        NUMITEMS = NUMITEMS + 1;
                        END
                    END
                END /* FOR */
            END /* BASE POR IVA */
        if ((BASE = 'K') or (BASE = 'T')) then
            BEGIN
            if (BASE = 'T') then
                BEGIN
                SELECT TERC_PROV, TERC_CTAVENTA FROM TERCEROS WHERE TERC_NIT = :NIT INTO :PROV, :CTABASE;
                if (:PROV = 'S') then
                    SELECT PROV_CTACAUSA FROM PROVEEDORES WHERE TERC_NIT = :NIT INTO :CTABASE;
                END
            /* SUME LAS BASES DE LOS ARTICULOS DEL DOCUMENTO */
            FOR SELECT SUM(TRAS_CANT * TRAS_COSTO), SUM(TRAS_IVAMONTO + (TRAS_CONSUMO*TRAS_CANT*TRAS_FACTOR))
                FROM TRASFERENCIAS_DETALLE
                WHERE TRAN_ID = :IDDOC
                INTO :MONTO, :IMPTOS
            DO
                BEGIN
                if (IMPINC = 'S') then
                    MONTO = MONTO - IMPTOS;
                if (MONTO <> 0) then
                    BEGIN
                    /* TRAIGA LAS CARACTERISTICAS DE LA CUENTA */
                    SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS_NIIF
                        WHERE CUEN_COD = :CTABASE INTO :CUENTA, :TIPOCUEN;
                    if (CUENTA IS NULL) then
                        begin
                        EXECUTE PROCEDURE ERRORINT(1013, :IDDOC, :CTABASE, 2);
                        CUENTA = CTABASE;
                        TIPOCUEN = 'N';
                        ERROR = ERROR + 1;
                        end
                    /* DEPENDE DEL TIPO DE CUENTA */
                    if (TIPOCUEN = 'I') then
                        BEGIN
                        /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                        FOR SELECT E.ARTI_COD, (TRAS_CANT * TRAS_COSTO), (TRAS_IVAMONTO + (TRAS_CONSUMO*TRAS_CANT*TRAS_FACTOR))
                            FROM ARTICULO A, CONTABIL_ARTICULO_NIIF C, TRASFERENCIAS_DETALLE E
                            WHERE E.TRAN_ID = :IDDOC AND E.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND COAR_CTAINV = :CUENTA
                            INTO :ARTICULO, :MONTO, :IMPTOS
                        DO
                            BEGIN
                            if (IMPINC = 'S') then
                                MONTO = MONTO - IMPTOS;
                            if (MONTO <> 0) then
                                BEGIN
                                INSERT INTO CONTABILIZACION_DET (CNTB_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)
                                    VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ARTICULO, 0, 0);
                                NUMITEMS = NUMITEMS + 1;
                                SUMA = SUMA - MONTO;
                                /*AHORA LA ENTRADA*/
                                INSERT INTO CONTABILIZACION_DET (CNTB_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)
                                  VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :MONTO, 0, 0, 0, :NIT, :PROYDES, :CENTRODES, NULL, NULL, NULL, :ARTICULO, 0, 0);
                                SUMADES = SUMADES + MONTO;
                                NUMITEMS = NUMITEMS + 1;
                                END
                            END
                        END
                    if (TIPOCUEN = 'C') then
                        BEGIN
                        EXECUTE PROCEDURE ERRORINT(1013, :IDDOC, :CUENTA, 4);
                        TIPOCUEN = 'N';
                        ERROR = ERROR + 1;
                        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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                        NUMITEMS = NUMITEMS + 1;
                        SUMA = SUMA - MONTO;
                        /*AHORA LA ENTRADA*/
                        INSERT INTO CONTABILIZACION_DET (CNTB_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)
                            VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :MONTO, 0, 0, 0, :NIT, :PROYDES, :CENTRODES, NULL, NULL, NULL, :ARTICULO, 0, 0);
                        SUMADES = SUMADES + MONTO;
                        NUMITEMS = NUMITEMS + 1;
                        END
                    END
                END /* FOR */
            END /* BASE K O POR TERCERO */
        /* EL IVA EN VENTAS */
        if (IVAV = 'A') then
            BEGIN
            /* SUME LAS BASES DE LOS ARTICULOS DEL DOCUMENTO */
            FOR SELECT MAX(COAR_CTAIVAV), SUM(TRAS_IVAMONTO), SUM(TRAS_CANT * TRAS_COSTO)
                FROM ARTICULO A, CONTABIL_ARTICULO_NIIF C, TRASFERENCIAS_DETALLE E
                WHERE E.TRAN_ID = :IDDOC AND E.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD
                GROUP BY COAR_CTAIVAV
                INTO :CTAIVA, :IMPTOS, :MONTO
            DO
                BEGIN
                if (IMPTOS <> 0) then
                    BEGIN
                    /* TRAIGA LAS CARCATERISTICAS DE LA CUENTA */
                    SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS_NIIF
                        WHERE CUEN_COD = :CTAIVA INTO :CUENTA, :TIPOCUEN;
                    if (CUENTA IS NULL) then
                        begin
                        EXECUTE PROCEDURE ERRORINT(1013, :IDDOC, :CTAIVA, 2);
                        CUENTA = CTAIVA;
                        TIPOCUEN = 'N';
                        ERROR = ERROR + 1;
                        end
                    if (TIPOCUEN = 'I') then
                        BEGIN
                        /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                        FOR SELECT E.ARTI_COD, TRAS_IVAMONTO, (TRAS_CANT * TRAS_COSTO)
                            FROM ARTICULO A, CONTABIL_ARTICULO_NIIF C, TRASFERENCIAS_DETALLE E
                            WHERE E.TRAN_ID = :IDDOC AND E.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND COAR_CTAIVAV = :CUENTA
                            INTO :ARTICULO, :IMPTOS, :MONTO
                        DO
                            BEGIN
                            if (IMPINC = 'S') then
                                MONTO = MONTO - IMPTOS;
                            /*MONTO = MONTO * -1; */
                            if (IMPTOS <> 0) then
                                BEGIN
                                INSERT INTO CONTABILIZACION_DET (CNTB_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)
                                    VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :IMPTOS, (:MONTO * -1), 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ARTICULO, 0, 0);
                                NUMITEMS = NUMITEMS + 1;
                                SUMA = SUMA - IMPTOS;
                                /*AHORA LA ENTRADA*/
                                INSERT INTO CONTABILIZACION_DET (CNTB_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)
                                  VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :IMPTOS, 0,:MONTO, 0, :NIT, :PROYDES, :CENTRODES, NULL, NULL, NULL, :ARTICULO, 0, 0);
                                SUMADES = SUMADES + MONTO;
                                NUMITEMS = NUMITEMS + 1;
                                END
                            END
                        END
                    if (TIPOCUEN = 'C') then
                        BEGIN
                        EXECUTE PROCEDURE ERRORINT(1013, :IDDOC, :CUENTA, 4);
                        TIPOCUEN = 'N';
                        ERROR = ERROR + 1;
                        END
                    if (TIPOCUEN = 'N') then
                        BEGIN
                        /* INSERTE EL REGISTRO DEL IVA EN VENTAS */
                        if (IMPINC = 'S') then
                            MONTO = MONTO - IMPTOS;
                        /*MONTO = MONTO * -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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :IMPTOS, (:MONTO *-1), 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                        NUMITEMS = NUMITEMS + 1;
                        SUMA = SUMA - IMPTOS;
                        /*AHORA LA ENTRADA*/
                        INSERT INTO CONTABILIZACION_DET (CNTB_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)
                            VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :IMPTOS, 0,:MONTO, 0, :NIT, :PROYDES, :CENTRODES, NULL, NULL, NULL, :ARTICULO, 0, 0);
                        SUMADES = SUMADES + MONTO;
                        NUMITEMS = NUMITEMS + 1;
                        END
                    END
                END /* FOR */
            END /* IVA POR ARTICULO */
        if (IVAV = 'I') then
            BEGIN
            /* SUME LAS BASES DE LOS ARTICULOS DEL DOCUMENTO */
            FOR SELECT MAX(TAIV_CTAIVAVNT), SUM(TRAS_IVAMONTO), SUM(TRAS_CANT * TRAS_COSTO)
                FROM ARTICULO A, TARIFA_IVA I, TRASFERENCIAS_DETALLE E
                WHERE E.TRAN_ID = :IDDOC AND E.ARTI_COD = A.ARTI_COD AND A.TAIV_COD = I.TAIV_COD
                GROUP BY TAIV_CTAIVAVNT
                INTO :CTAIVA, :IMPTOS, :MONTO
            DO
                BEGIN
                if (IMPTOS <> 0) then
                    BEGIN
                    /* TRAIGA LAS CARCATERISTICAS DE LA CUENTA */
                    SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS_NIIF
                        WHERE CUEN_COD = :CTAIVA INTO :CUENTA, :TIPOCUEN;
                    if (CUENTA IS NULL) then
                        begin
                        EXECUTE PROCEDURE ERRORINT(1013, :IDDOC, :CTAIVA, 2);
                        CUENTA = CTAIVA;
                        TIPOCUEN = 'N';
                        ERROR = ERROR + 1;
                        end
                    if (TIPOCUEN = 'I') then
                        BEGIN
                        /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                        FOR SELECT E.ARTI_COD, TRAS_IVAMONTO, (TRAS_CANT * TRAS_COSTO)
                            FROM ARTICULO A, TARIFA_IVA I, TRASFERENCIAS_DETALLE E
                            WHERE E.TRAN_ID = :IDDOC AND E.ARTI_COD = A.ARTI_COD AND A.TAIV_COD = I.TAIV_COD AND TAIV_CTAIVAVNT = :CUENTA
                            INTO :ARTICULO, :IMPTOS, :MONTO
                        DO
                            BEGIN
                            if (IMPINC = 'S') then
                                MONTO = MONTO - IMPTOS;
                            /*MONTO = MONTO * -1; */
                            if (IMPTOS <> 0) then
                                BEGIN
                                INSERT INTO CONTABILIZACION_DET (CNTB_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)
                                    VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :IMPTOS, (:MONTO * -1), 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ARTICULO, 0, 0);
                                NUMITEMS = NUMITEMS + 1;
                                SUMA = SUMA - IMPTOS;
                                /*AHORA LA ENTRADA*/
                                INSERT INTO CONTABILIZACION_DET (CNTB_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)
                                  VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :IMPTOS, 0,:MONTO, 0, :NIT, :PROYDES, :CENTRODES, NULL, NULL, NULL, :ARTICULO, 0, 0);
                                SUMADES = SUMADES + MONTO;
                                NUMITEMS = NUMITEMS + 1;
                                END
                            END
                        END
                    if (TIPOCUEN = 'C') then
                        BEGIN
                        EXECUTE PROCEDURE ERRORINT(1013, :IDDOC, :CUENTA, 4);
                        TIPOCUEN = 'N';
                        ERROR = ERROR + 1;
                        END
                    if (TIPOCUEN = 'N') then
                        BEGIN
                        /* INSERTE EL REGISTRO DEL IVA EN VENTAS */
                        if (IMPINC = 'S') then
                            MONTO = MONTO - IMPTOS;
                        /*MONTO = MONTO * -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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :IMPTOS, (:MONTO * -1), 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                        NUMITEMS = NUMITEMS + 1;
                        SUMA = SUMA - IMPTOS;
                        /*AHORA LA ENTRADA*/
                        INSERT INTO CONTABILIZACION_DET (CNTB_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)
                            VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :IMPTOS, 0,:MONTO, 0, :NIT, :PROYDES, :CENTRODES, NULL, NULL, NULL, :ARTICULO, 0, 0);
                        SUMADES = SUMADES + MONTO;
                        NUMITEMS = NUMITEMS + 1;
                        END
                    END
                END /* FOR */
            END /* IVA POR TARIFA */
        if (IVAV = 'K') then
            BEGIN
            /* SUME LAS BASES DE LOS ARTICULOS DEL DOCUMENTO */
            SELECT SUM(TRAS_IVAMONTO), SUM(TRAS_CANT * TRAS_COSTO)
                FROM TRASFERENCIAS_DETALLE
                WHERE TRAN_ID = :IDDOC
                INTO :IMPTOS, :MONTO;
            if (IMPTOS <> 0) then
                BEGIN
                /* TRAIGA LAS CARCATERISTICAS DE LA CUENTA */
                SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS_NIIF
                    WHERE CUEN_COD = :CTAIVA INTO :CUENTA, :TIPOCUEN;
                if (CUENTA IS NULL) then
                    begin
                    EXECUTE PROCEDURE ERRORINT(1013, :IDDOC, :CTAIVA, 2);
                    CUENTA = CTAIVA;
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    end
                if (TIPOCUEN = 'I') then
                    BEGIN
                    /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                    FOR SELECT E.ARTI_COD, TRAS_IVAMONTO, (TRAS_CANT * TRAS_COSTO)
                        FROM ARTICULO A, CONTABIL_ARTICULO_NIIF C, TRASFERENCIAS_DETALLE E
                        WHERE E.TRAN_ID = :IDDOC AND E.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND COAR_CTAIVAV = :CUENTA
                        INTO :ARTICULO, :IMPTOS, :MONTO
                        DO
                        BEGIN
                        if (IMPTOS <> 0) then
                            BEGIN
                            if (IMPINC = 'S') then
                                MONTO = MONTO - IMPTOS;
                            /*MONTO = MONTO * -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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                                VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :IMPTOS, (:MONTO * -1), 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ARTICULO, 0, 0);
                            NUMITEMS = NUMITEMS + 1;
                            SUMA = SUMA - IMPTOS;
                            /*AHORA LA ENTRADA*/
                            INSERT INTO CONTABILIZACION_DET (CNTB_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)
                              VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :IMPTOS, 0,:MONTO, 0, :NIT, :PROYDES, :CENTRODES, NULL, NULL, NULL, :ARTICULO, 0, 0);
                            SUMADES = SUMADES + MONTO;
                            NUMITEMS = NUMITEMS + 1;
                            END
                        END
                    END
                if (TIPOCUEN = 'C') then
                        BEGIN
                        EXECUTE PROCEDURE ERRORINT(1013, :IDDOC, :CUENTA, 4);
                        TIPOCUEN = 'N';
                        ERROR = ERROR + 1;
                        END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    /* INSERTE EL REGISTRO DEL IVA EN VENTAS */
                    if (IMPINC = 'S') then
                        MONTO = MONTO - IMPTOS;
                    /*MONTO = MONTO * -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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :IMPTOS, (:MONTO * -1), 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NUMITEMS = NUMITEMS + 1;
                    SUMA = SUMA - IMPTOS;
                    /*AHORA LA ENTRADA*/
                    INSERT INTO CONTABILIZACION_DET (CNTB_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)
                        VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :IMPTOS, 0,:MONTO, 0, :NIT, :PROYDES, :CENTRODES, NULL, NULL, NULL, :ARTICULO, 0, 0);
                    SUMADES = SUMADES + MONTO;
                    NUMITEMS = NUMITEMS + 1;
                    END
                END
            END /* IVA CONSTANTE */
        /* EL IMPOCONSUMO */
        if (CONSUMO = 'A') then
            BEGIN
            /* SUME LAS BASES DE LOS ARTICULOS DEL DOCUMENTO */
            FOR SELECT MAX(COAR_CTACONS), SUM(TRAS_CONSUMO*TRAS_CANT*TRAS_FACTOR)
                FROM ARTICULO A, CONTABIL_ARTICULO_NIIF C, TRASFERENCIAS_DETALLE E
                WHERE E.TRAN_ID = :IDDOC AND E.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 */
                    SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS_NIIF
                        WHERE CUEN_COD = :CTACONSUMO INTO :CUENTA, :TIPOCUEN;
                    if (CUENTA IS NULL) then
                        begin
                        EXECUTE PROCEDURE ERRORINT(1013, :IDDOC, :CTACONSUMO, 2);
                        CUENTA = CTACONSUMO;
                        TIPOCUEN = 'N';
                        ERROR = ERROR + 1;
                        end
                    if (TIPOCUEN = 'I') then
                        BEGIN
                        /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                        FOR SELECT E.ARTI_COD, (TRAS_CONSUMO*TRAS_CANT*TRAS_FACTOR)
                            FROM ARTICULO A, CONTABIL_ARTICULO_NIIF C, TRASFERENCIAS_DETALLE E
                            WHERE E.TRAN_ID = :IDDOC AND E.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND COAR_CTACONS = :CUENTA
                            INTO :ARTICULO, :IMPTOS
                            DO
                            if (IMPTOS <> 0) then
                                BEGIN
                                INSERT INTO CONTABILIZACION_DET (CNTB_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)
                                    VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ARTICULO, 0, 0);
                                NUMITEMS = NUMITEMS + 1;
                                SUMA = SUMA - IMPTOS;
                                /*AHORA LA ENTRADA*/
                                INSERT INTO CONTABILIZACION_DET (CNTB_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)
                                    VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :IMPTOS, 0, 0, 0, :NIT, :PROYDES, :CENTRODES, NULL, NULL, NULL, :ARTICULO, 0, 0);
                                SUMADES = SUMADES + MONTO;
                                NUMITEMS = NUMITEMS + 1;
                                END
                        END
                    if (TIPOCUEN = 'C') then
                        BEGIN
                        EXECUTE PROCEDURE ERRORINT(1013, :IDDOC, :CUENTA, 4);
                        TIPOCUEN = 'N';
                        ERROR = ERROR + 1;
                        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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                        NUMITEMS = NUMITEMS + 1;
                        SUMA = SUMA - IMPTOS;
                        /*AHORA LA ENTRADA*/
                        INSERT INTO CONTABILIZACION_DET (CNTB_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)
                            VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :IMPTOS, 0, 0, 0, :NIT, :PROYDES, :CENTRODES, NULL, NULL, NULL, :ARTICULO, 0, 0);
                        SUMADES = SUMADES + MONTO;
                        NUMITEMS = NUMITEMS + 1;
                        END
                    END
                END /* FOR */
            END /* CONSUMO POR ARTICULO */
        if (CONSUMO = 'K') then
            BEGIN
            /* SUME LAS BASES DE LOS ARTICULOS DEL DOCUMENTO */
            SELECT SUM(TRAS_CONSUMO*TRAS_CANT*TRAS_FACTOR)
                FROM TRASFERENCIAS_DETALLE
                WHERE TRAN_ID = :IDDOC
                INTO :IMPTOS;
            if (IMPTOS <> 0) then
                BEGIN
                /* TRAIGA LAS CARACTERISTICAS DE LA CUENTA */
                SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS_NIIF
                    WHERE CUEN_COD = :CUENTA INTO :CUENTA, :TIPOCUEN;
                if (CUENTA IS NULL) then
                    begin
                    EXECUTE PROCEDURE ERRORINT(1013, :IDDOC, :CTACONSUMO, 2);
                    CUENTA = CTACONSUMO;
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    end
                if (TIPOCUEN = 'I') then
                    BEGIN
                    /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                    FOR SELECT E.ARTI_COD, (TRAS_CONSUMO*TRAS_CANT*TRAS_FACTOR)
                    FROM ARTICULO A, CONTABIL_ARTICULO_NIIF C, TRASFERENCIAS_DETALLE E
                        WHERE E.TRAN_ID = :IDDOC AND E.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND COAR_CTACONS = :CUENTA
                        INTO :ARTICULO, :IMPTOS
                        DO
                        if (IMPTOS <> 0) then
                            BEGIN
                            INSERT INTO CONTABILIZACION_DET (CNTB_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)
                                VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ARTICULO, 0, 0);
                            NUMITEMS = NUMITEMS + 1;
                            SUMA = SUMA - IMPTOS;
                            /*AHORA LA ENTRADA*/
                            INSERT INTO CONTABILIZACION_DET (CNTB_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)
                                VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :IMPTOS, 0, 0, 0, :NIT, :PROYDES, :CENTRODES, NULL, NULL, NULL, :ARTICULO, 0, 0);
                            SUMADES = SUMADES + MONTO;
                            NUMITEMS = NUMITEMS + 1;
                            END
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    EXECUTE PROCEDURE ERRORINT(1013, :IDDOC, :CUENTA, 4);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NUMITEMS = NUMITEMS + 1;
                    SUMA = SUMA - IMPTOS;
                    /*AHORA LA ENTRADA*/
                    INSERT INTO CONTABILIZACION_DET (CNTB_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)
                       VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :IMPTOS, 0, 0, 0, :NIT, :PROYDES, :CENTRODES, NULL, NULL, NULL, :ARTICULO, 0, 0);
                    SUMADES = SUMADES + MONTO;
                    NUMITEMS = NUMITEMS + 1;
                    END
                END
            END /* CONSUMO CONSTANTE */
        /* recorra las cuentas adicionales */
        FOR SELECT INIC_CUENTA, INIC_BASE, INIC_PORC, INIC_VALOR, INIC_DB
            FROM INTERFAZ_INVENTARIO_CTAS
            WHERE ININ_ID = :IDINTER
            INTO :CUENTAADIC, :BASEADIC, :PORCADIC, :VALORADIC, :DBADIC
            DO
            BEGIN
            if (VALORADIC <> 0) then
                MONTO = VALORADIC;
            ELSE
                BEGIN
                if (:BASEADIC = 'SUBTOTAL') then
                    SELECT SUM(TRAS_CANT * TRAS_COSTO)
                    FROM TRASFERENCIAS_DETALLE E
                    WHERE E.TRAN_ID = :IDDOC
                    INTO :VALORADIC;
                if (:BASEADIC = 'IVA') then
                    SELECT SUM(TRAS_IVAMONTO)
                    FROM TRASFERENCIAS_DETALLE E
                    WHERE E.TRAN_ID = :IDDOC
                    INTO :VALORADIC;
                if (:BASEADIC = 'CONSUMO') then
                    SELECT SUM(TRAS_CONSUMO*TRAS_CANT*TRAS_FACTOR)
                    FROM TRASFERENCIAS_DETALLE E
                    WHERE E.TRAN_ID = :IDDOC
                    INTO :VALORADIC;
                MONTO = VALORADIC * PORCADIC / 100;
                END
            if (MONTO <> 0) then
                BEGIN
                /* 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(1013, :IDDOC, :CUENTAADIC, 2);
                    CUENTA = CUENTAADIC;
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    end
                if (TIPOCUEN = 'I') then
                    BEGIN
                    EXECUTE PROCEDURE ERRORINT(1013, :IDDOC, :CUENTA, 3);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    EXECUTE PROCEDURE ERRORINT(1013, :IDDOC, :CUENTA, 4);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NUMITEMS, :CUENTAADIC, :CONCEPTO, '', :MONTO, 0, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                        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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NUMITEMS, :CUENTAADIC, :CONCEPTO, '', 0, :MONTO, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                        SUMA = SUMA - MONTO;
                        END
                    NUMITEMS = NUMITEMS + 1;
                    END
                END
            END
        /* CIERRE EL COMPROBANTE  */
        if ((SUMA <> 0) AND (SUMADES <> 0)) then
            BEGIN
            if (SUMA > 0) then
                BEGIN
                DEBITO = 0;
                CREDITO = SUMA;
                END
            ELSE    
                BEGIN
                DEBITO = SUMA * -1;
                CREDITO = 0;
                END
            if (SUMADES > 0) then
                BEGIN
                DEBITODES = 0;
                CREDITODES = SUMADES;
                END
            ELSE    
                BEGIN
                DEBITODES = SUMADES * -1;
                CREDITODES = 0;
                END
            if ((TOTAL = 'K') or (TOTAL = 'T')) then
                BEGIN
                if (TOTAL = 'T') then
                    BEGIN
                    SELECT TERC_CTAPROV, TERC_PROV
                        FROM TERCEROS WHERE TERC_NIT = :NIT
                        INTO :CTACIERRE, :PROV;
                    if (PROV = 'S') then
                        SELECT PROV_CTAPAGAR FROM PROVEEDORES WHERE TERC_NIT = :nit
                        INTO :CTACIERRE;
                    END
                /* TRAIGA LAS CARACTERISTICAS DE LA CUENTA */
                SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS_NIIF
                    WHERE CUEN_COD = :CTACIERRE INTO :CUENTA, :TIPOCUEN;
                if (CUENTA IS NULL) then
                    begin
                    EXECUTE PROCEDURE ERRORINT(1013, :IDDOC, :CTACIERRE, 2);
                    CUENTA = CTACIERRE;
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    end
                if (TIPOCUEN = 'I') then
                    BEGIN
                    EXECUTE PROCEDURE ERRORINT(1013, :IDDOC, :CUENTA, 3);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    EXECUTE PROCEDURE ERRORINT(1013, :IDDOC, :CUENTA, 4);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    END
                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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :DEBITO, :CREDITO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NUMITEMS = NUMITEMS + 1;
                /*AHORA LA ENTRADA*/
                INSERT INTO CONTABILIZACION_DET (CNTB_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)
                    VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :DEBITODES, :CREDITODES, 0, 0, :NIT, :PROYDES, :CENTRODES, NULL, NULL, NULL, NULL, 0, 0);
                END
            END /* SUMA */
        if (ERROR > 0) then
            VER = 'S';
        SUSPEND;
        END /* NO ANULADO */
    END /* EXISTE LA INTERFAZ */
ELSE
    BEGIN
    EXECUTE PROCEDURE ERRORINT(1013, :IDDOC, :PREFIJO, 1);
    ERROR = ERROR + 1;
    VER = 'S';
    SUSPEND;
    END
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER procedure CONTABILIZA_PENDIENTE (
    IDCNT integer)
AS
declare variable idc integer;
declare variable TIPO INTEGER;
declare variable IDDOC INTEGER;
declare variable ANULADO CHAR(1);
BEGIN
SELECT CNTB_TIPOREF, CNTB_IDREF FROM contabilizacion WHERE CNTB_ID = :IDCNT INTO :TIPO, :IDDOC;
if (TIPO = 0) then
    ANULADO = 'N';
if (TIPO = 10) then
    SELECT CACO_ANULADO FROM cambio_costo WHERE CACO_ID = :IDDOC INTO :ANULADO;
if (TIPO = 11) then
    SELECT ENTR_ANULADO FROM ENTRADAS WHERE ENTR_ID = :IDDOC INTO :ANULADO;
if (TIPO = 12) then
    SELECT SALI_ANULADO FROM SALIDAS WHERE SALI_ID = :IDDOC INTO :ANULADO;
if (TIPO = 13) then
    SELECT TRAN_ANULADO FROM trasferencias WHERE TRAN_ID = :IDDOC INTO :ANULADO;
if (TIPO = 14) then
    SELECT AJUS_ANULADO FROM ajustes WHERE AJUS_ID = :IDDOC INTO :ANULADO;
if (TIPO = 15) then
    SELECT ENSA_ANULADO FROM ensambles WHERE ENSA_ID = :IDDOC INTO :ANULADO;
if (TIPO = 16) then
    SELECT DESE_ANULADO FROM desensambles WHERE DESE_ID = :IDDOC INTO :ANULADO;
if (TIPO = 21) then
    SELECT FACO_ANULADO FROM FACTURAS_COMPRA WHERE FACO_ID = :IDDOC INTO :ANULADO;
if (TIPO = 24) then
    SELECT DVCO_ANULADO FROM devoluciones_compras WHERE DVCO_ID = :IDDOC INTO :ANULADO;
if (TIPO = 31) then
    SELECT FACT_ANULADO FROM FACTURAS WHERE FACT_ID = :IDDOC INTO :ANULADO;
if (TIPO = 33) then
    SELECT DEVT_ANULADO FROM devoluciones_ventas WHERE DEVT_ID = :IDDOC INTO :ANULADO;
if (TIPO = 37) then
    SELECT RUTE_ANULADO FROM rutero WHERE RUTE_ID = :IDDOC INTO :ANULADO;
if (TIPO = 41) then
    SELECT NDCL_ANULADO FROM NOTAS_DEBITO_CLIENTES WHERE NDCL_ID = :IDDOC INTO :ANULADO;
if (TIPO = 42) then
    SELECT NCCL_ANULADO FROM NOTAS_CREDITO_CLIENTES WHERE NCCL_ID = :IDDOC INTO :ANULADO;
if (TIPO = 43) then
    SELECT APCL_ANULADO FROM aplicacion_cliente WHERE APCL_ID = :IDDOC INTO :ANULADO;
if (TIPO = 45) then
    SELECT ANCL_ANULADO FROM ANTICIPOS_CLIENTE WHERE ANCL_ID = :IDDOC INTO :ANULADO;
if (TIPO = 77) then
    SELECT DVCH_ANULADO FROM devolucion_cheques WHERE DVCH_ID = :IDDOC INTO :ANULADO;
if (TIPO = 51) then
    SELECT NDPR_ANULADO FROM NOTAS_DEBITO_PROVEEDOR WHERE NDPR_ID = :IDDOC INTO :ANULADO;
if (TIPO = 52) then
    SELECT NCPR_ANULADO FROM NOTAS_CREDITO_PROVEEDOR WHERE NCPR_ID = :IDDOC INTO :ANULADO;
if (TIPO = 53) then
    SELECT APPR_ANULADO FROM aplicacion_provedor WHERE APPR_ID = :IDDOC INTO :ANULADO;
if (TIPO = 55) then
    SELECT ANPR_ANULADO FROM ANTICIPOS_PROVEEDOR WHERE ANPR_ID = :IDDOC INTO :ANULADO;
if (TIPO = 61) then
    SELECT RECA_ANULADO FROM recibos_caja WHERE RECA_ID = :IDDOC INTO :ANULADO;
if (TIPO = 62) then
    SELECT EGRE_ANULADO FROM EGRESOS WHERE EGRE_ID = :IDDOC INTO :ANULADO;
if (TIPO = 64) then
    SELECT COTJ_ANULADO FROM consigna_tarjetas WHERE COTJ_ID = :IDDOC INTO :ANULADO;
if (TIPO = 66) then
    SELECT TRCJ_ANULADO FROM traslados_caja WHERE TRCJ_ID = :IDDOC INTO :ANULADO;
if (TIPO = 71) then
    SELECT CONS_ANULADO FROM CONSIGNA WHERE CONS_ID = :IDDOC INTO :ANULADO;
if (TIPO = 72) then
    SELECT CHEQ_ANULADO FROM CHEQUES WHERE CHEQ_ID = :IDDOC INTO :ANULADO;
if (TIPO = 73) then
    SELECT RETI_ANULADO FROM RETIROS WHERE RETI_ID = :IDDOC INTO :ANULADO;
if (TIPO = 74) then
    SELECT NDBC_ANULADO FROM notas_debito WHERE NDBC_ID = :IDDOC INTO :ANULADO;
if (TIPO = 75) then
    SELECT NCBC_ANULADO FROM notas_credito WHERE NCBC_ID = :IDDOC INTO :ANULADO;
if (TIPO = 76) then
    SELECT TRAS_ANULADO FROM traslados WHERE TRAS_ID = :IDDOC INTO :ANULADO;
if (TIPO = 77) then
    SELECT DVCH_ANULADO FROM devolucion_cheques WHERE DVCH_ID = :IDDOC INTO :ANULADO;
if (TIPO = 92) then
    if (exists (select nomi_id from nomina where nomi_id = :IDDOC)) then
        ANULADO = 'N';
    else
        ANULADO = 'S';

if (ANULADO = 'N') then
  BEGIN
  /* PASA DE CONTABILIZACION A COMPROBANTES */
  /* EL ENCABEZADO */
  EXECUTE PROCEDURE CAMBIE_ID_COMPROBA returning_values (:IDC);
  INSERT INTO COMPROBANTE_ENCABEZADO (ENCO_CONSEC, TICO_COD, PRCO_PREF, ENCO_NUMERO, ENCO_FECHA, ENCO_CONCEPTO, ENCO_REFER, ENCO_TIPOREF, ENCO_IDREF)
      SELECT :IDC, CNTB_TIPOCOMP, CNTB_PREFCNT, CNTB_NUMERO, CNTB_FECHA, CNTB_CONCEPTO, CNTB_REF, CNTB_TIPOREF, CNTB_IDREF
        FROM CONTABILIZACION WHERE CNTB_ID = :IDCNT;
  /* LOS DETALLES */
  INSERT INTO COMPROBANTE_DETALLE (ENCO_CONSEC, CODE_ITEM, CUEN_COD, TERC_NIT, PROY_COD, CENT_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 :IDC, CNDE_ITEM, CNDE_CUENTA, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, 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 = :IDCNT AND CNDE_ITEM < 100000;

  INSERT INTO comprobante_detalle_niif (ENCO_CONSEC, CODE_ITEM, CUEN_COD, TERC_NIT, PROY_COD, CENT_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 :IDC, CNDE_ITEM, CNDE_CUENTA, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, 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 = :idcnt AND CNDE_ITEM >= 100000;

  UPDATE CONTABILIZACION SET CNTB_PROCESADO = 'S'
    WHERE CNTB_ID = :IDCNT;
  END
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE APLICACIONCL_SIN_CONTABILIDAD(
    FECINI DATE,
    FECFIN DATE)
RETURNS (
    ID INTEGER,
    PREF VARCHAR(4),
    NUMERO VARCHAR(8),
    ESTADO VARCHAR(20),
    IDI INTEGER,
    IDC INTEGER,
    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 APCL_ID, PREF_PRE, APCL_NUMERO FROM aplicacion_cliente WHERE APCL_ANULADO = 'N' AND
    APCL_FECHA >= :FECINI AND APCL_FECHA <= :FECFIN ORDER BY APCL_ID
    INTO :ID, :PREF, :NUMERO
DO
  BEGIN
  idref = null;
  SELECT ENCO_IDREF FROM COMPROBANTE_ENCABEZADO WHERE ENCO_TIPOREF = 43 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 = 43 INTO :IDI;
   EXECUTE PROCEDURE contabil_aplicacl (: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 APLICACIONPR_SIN_CONTABILIDAD(
    FECINI DATE,
    FECFIN DATE)
RETURNS (
    ID INTEGER,
    PREF VARCHAR(4),
    NUMERO VARCHAR(8),
    ESTADO VARCHAR(20),
    IDI INTEGER,
    IDC INTEGER,
    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 APPR_ID, PREF_PRE, APPR_NUMERO FROM aplicacion_provedor WHERE APPR_ANULADO = 'N' AND
    APPR_FECHA >= :FECINI AND APPR_FECHA <= :FECFIN ORDER BY APPR_ID
    INTO :ID, :PREF, :NUMERO
DO
  BEGIN
  idref = null;
  SELECT ENCO_IDREF FROM COMPROBANTE_ENCABEZADO WHERE ENCO_TIPOREF = 53 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(INCP_ID) FROM interfaz_cxpagar WHERE PREF_PRE = :PREF AND TIDO_COD = 53 INTO :IDI;
   EXECUTE PROCEDURE contabil_aplicapr (: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 CANCELE_FACTURA(
    ID INTEGER,
    ABONO NUMERIC(18,2),
    FORMAP INTEGER)
RETURNS (
    IDR INTEGER)
AS
declare variable PREF VARCHAR(4);
declare variable NUMERO VARCHAR(8);
declare variable NIT VARCHAR(20);
declare variable SUCURSAL VARCHAR(10);
declare variable NOMCLI VARCHAR(60);
declare variable CAJA INTEGER;
declare variable PREFRDC VARCHAR(4);
declare variable NUMRDC VARCHAR(8);
declare variable SALDO NUMERIC(18,2);
declare variable IDF INTEGER;
declare variable RTFTE NUMERIC(18,2);
declare variable RTIVA NUMERIC(18,2);
declare variable RTICA NUMERIC(18,2);
declare variable RCREE NUMERIC(18,2);
declare variable DTOF NUMERIC(18,2);
declare variable ERROR INTEGER;
declare variable COBR INTEGER;
declare variable CONTADO CHAR(1);
declare variable VER CHAR(1);
declare variable IDI INTEGER;
declare variable IDC INTEGER;
begin
SELECT F.PREF_PRE, FACT_NUMERO, F.TERC_NIT, fact_nomcliente, P.caja_id, A.auto_prefrdc, F.VEND_COD, F.fact_sucursal, A.auto_contado
    FROM FACTURAS F, PUNTO_VENTA P, AUTORIZACIONES A
    WHERE FACT_ID = :ID AND F.ptvt_id = P.ptvt_id AND F.pref_pre = A.pref_pre
    INTO :pref,  :NUMERO, :NIT, :NOMCLI, :CAJA, :PREFRDC, :COBR, :sucursal, :contado;
SELECT CAJA_ID FROM USUARIO WHERE USER_COD = USER INTO :CAJA;
IDR = GEN_ID(id_recicaja, 1);
EXECUTE PROCEDURE busca_id_doc_cartera(31, :pref, :numero, :nit,  CAST('NOW' AS DATE))
    returning_values (:IDF, :saldo, :RTFTE, :RTIVA, :RTICA, :rcree, :DTOF, :ERROR);
if (SALDO >= ABONO) then
    BEGIN
    SELECT PREF_ACTUAL FROM PREFIJOS WHERE TIDO_COD = 61 AND PREF_PRE = :prefrdc INTO :NUMRDC;
    INSERT INTO RECIBOS_CAJA (RECA_ID, CAJA_ID, TIDO_COD, PREF_PRE, RECA_NUMERO, RECA_FECHA, RECA_CONC, RECA_MONTO,
        RECA_RTFTEMONTO, RECA_RTIVAMONTO, RECA_RTICAMONTO, RECA_RTCREEM, RECA_DTOF, RECA_OBS, TERC_NIT, RECA_NOMTERC, RECA_ANULADO, RECA_TRANSMIT,
        COBR_COD, RECA_PROVISIONAL, RECA_PROVID, RECA_USUARIO, NUMOK, RECA_TRM, RECA_EXEDENTE, CONS_ID)
        VALUES (:IDR, :CAJA, 61, :prefrdc, :numrdc, CAST('NOW' AS DATE), 'Cancela factura de venta No. ' || :pref || :numero, :abono,
        :RTFTE, :RTIVA, :RTICA, :RCREE, :DTOF, NULL, :NIT, :NOMCLI, 'N', 'N', :COBR, NULL, NULL, USER, 'N', 1, 0, NULL);

    INSERT INTO RECIBOS_CAJA_DETALLE (RECA_ID, RCDE_ITEM, RCDE_TIPODOC, RCDE_IDDOC, RCDE_PREFIJO, RCDE_NUMERO, RCDE_ABONO,
        RCDE_RTFTE, RCDE_RTIVA, RCDE_RTICA, RCDE_RCREE, RCDE_DTOF, RCDE_ANULADO, RCDE_TRANSMIT, RCDE_COMIP, RCDE_SUCURSAL, RCDE_DIFCAMBIO)
        VALUES (:idr, 1, 31, :IDF, :pref, :numero, :abono, :rtfte, :rtiva, :rtica, :rcree, :dtof, 'N', 'N', NULL, :sucursal, 0);

    INSERT INTO RECIBOS_CAJA_PAGO (RECA_ID, RCPA_ITEM, FOPA_ID, RCPA_BANCO, RCPA_CUENTA, RCPA_NUMERO, RCPA_FECHA, RCPA_MONTO,
        RCPA_ANULADO, RCPA_TRANSMIT, RCPA_IVAMONTO, RCPA_CONC)
        VALUES (:idr, 1, :formap, '', '', '', CAST('NOW' AS DATE), :abono, 'N', 'N', NULL, NULL);

    if (CONTADO = 'N') then
        BEGIN
        /* HAGA LA CONTABILIZACION */
        SELECT MIN(INCJ_ID) FROM interfaz_caja WHERE TIDO_COD = 61 AND PREF_PRE = :prefrdc INTO :IDI;
        execute procedure contabil_recicaja (:idr, :idi) returning_values (:ERROR, :VER, :IDC);
        if (ERROR = 0) then
            execute procedure CONTABILIZA_PENDIENTE (:IDC);
        END
    SUSPEND;
    END
ELSE
    exception documento_abono_mayor;
end

^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE CHEQUES_SIN_CONTABILIDAD(
    FECINI DATE,
    FECFIN DATE)
RETURNS (
    ID INTEGER,
    IDI INTEGER,
    IDC INTEGER,
    CTA INTEGER,
    PREF VARCHAR(4),
    NUMERO VARCHAR(8),
    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 CHEQ_ID, CUBA_COD, PRBA_PREF, CHEQ_NUMERO FROM CHEQUES
    WHERE CHEQ_ANULADO = 'N' AND CHEQ_FECHA >= :FECINI AND CHEQ_FECHA <= :FECFIN
    ORDER BY CHEQ_ID INTO :ID, :CTA, :PREF, :NUMERO
DO
  BEGIN
  idref = null;
  SELECT ENCO_IDREF FROM COMPROBANTE_ENCABEZADO WHERE ENCO_TIPOREF = 72 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(INBA_ID) FROM INTERFAZ_BANCOS WHERE PREF_PRE = :PREF AND TIDO_COD = 72 AND CUBA_COD = :CTA INTO :IDI;
  if (IDI is NOT NULL) then
      BEGIN
      EXECUTE PROCEDURE CONTABIL_CHEQUE (: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 ^ ;

ALTER PROCEDURE CONSIGNA_SIN_CONTABILIDAD(
    FECINI DATE,
    FECFIN DATE)
RETURNS (
    ID INTEGER,
    IDI INTEGER,
    IDC INTEGER,
    CTA INTEGER,
    PREF VARCHAR(4),
    NUMERO VARCHAR(8),
    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 CONS_ID, CUBA_COD, PRBA_PREF, CONS_NUMERO FROM CONSIGNA
    WHERE CONS_ANULADO = 'N' AND CONS_FECHA >= :FECINI AND CONS_FECHA <= :FECFIN
    ORDER BY CONS_ID INTO :ID, :CTA, :PREF, :NUMERO
DO
  BEGIN
  idref = null;
  SELECT ENCO_IDREF FROM COMPROBANTE_ENCABEZADO WHERE ENCO_TIPOREF = 71 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(INBA_ID) FROM INTERFAZ_BANCOS WHERE PREF_PRE = :PREF AND TIDO_COD = 71 AND CUBA_COD = :CTA INTO :IDI;
  if (IDI is NOT NULL) then
      BEGIN
      EXECUTE PROCEDURE CONTABIL_CONSIGNA (: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 ^ ;

ALTER PROCEDURE CONTADO_MVERDE(
    FECINI DATE,
    FECFIN DATE,
    PREF VARCHAR(4))
RETURNS (
    FECHA DATE,
    PUNTO INTEGER,
    IDC INTEGER,
    ERROR INTEGER,
    VER CHAR(1))
AS
declare variable IDIN INTEGER;
declare variable IDF INTEGER;
declare variable NIT VARCHAR(20);
begin
FECHA = FECINI;
SELECT MAX(INVE_ID) FROM INTERFAZ_VENTAS WHERE TIDO_COD = 31 AND PREF_PRE = :PREF INTO :IDIN;
WHILE (FECHA <= fecfin) DO
    BEGIN
    /* LAS DE CONTADO */
    FOR SELECT PTVT_ID, TERC_NIT FROM punto_venta WHERE PREF_PRE = :PREF ORDER BY PTVT_ID INTO :PUNTO, :NIT
        do
        BEGIN
        EXECUTE PROCEDURE contabil_facturas_contado (FECHA, NIT, PREF, PUNTO, IDIN) returning_values (ERROR,  VER, IDC);
        EXECUTE PROCEDURE contabiliza_pendiente (IDC);
        suspend;
        END
    /* LAS DE CREDITO */
    FOR SELECT FACT_ID, PTVT_ID FROM facturas F WHERE fact_fecha = :fecha and pref_pre = :pref and
        NOT exists (select terc_nit from punto_venta p where terc_nit = f.terc_nit) into : IDF, :PUNTO
        DO
        BEGIN
        if (NOT EXISTS (SELECT ENCO_CONSEC FROM comprobante_encabezado WHERE ENCO_TIPOREF = 31 AND ENCO_IDREF = :IDF)) then
            BEGIN
            EXECUTE PROCEDURE contabil_factura(idf,  IDIN) returning_values (ERROR, VER, IDC);
            EXECUTE PROCEDURE contabiliza_pendiente (IDC);
            suspend;
            END
        END
    FECHA = FECHA + 1;
    END
end

^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE CONTADO_MVERDE2(
    FECINI DATE,
    FECFIN DATE,
    PREF VARCHAR(4))
RETURNS (
    FECHA DATE,
    PUNTO INTEGER,
    IDC INTEGER,
    ERROR INTEGER,
    VER CHAR(1))
AS
declare variable IDIN INTEGER;
declare variable IDF INTEGER;
declare variable NIT VARCHAR(20);
begin
FECHA = FECINI;
SELECT MAX(INVE_ID) FROM INTERFAZ_VENTAS WHERE TIDO_COD = 31 AND PREF_PRE = :PREF INTO :IDIN;
WHILE (FECHA <= fecfin) DO
    BEGIN
    FOR SELECT FACT_ID, PTVT_ID FROM facturas F WHERE fact_fecha = :fecha and pref_pre = :pref
        ORDER BY FACT_NUMERO into :IDF, :PUNTO
        DO
        BEGIN
        if (NOT EXISTS (SELECT ENCO_CONSEC FROM comprobante_encabezado WHERE ENCO_TIPOREF = 31 AND ENCO_IDREF = :IDF)) then
            BEGIN
            EXECUTE PROCEDURE contabil_factura_factor(idf,  IDIN) returning_values (ERROR, VER, IDC);
            EXECUTE PROCEDURE contabiliza_pendiente (IDC);
            suspend;
            END
        END
    FECHA = FECHA + 1;
    END
end

^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE DESENSAMBLES_SIN_CONTABILIDAD(
    FECINI DATE,
    FECFIN DATE)
RETURNS (
    ID INTEGER,
    PREF VARCHAR(4),
    NUMERO VARCHAR(8),
    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 DESE_ID, PREF_PRE, DESE_NUMERO FROM DESENSAMBLES WHERE DESE_ANULADO = 'N' AND
    DESE_FECHA >= :FECINI AND DESE_FECHA <= :FECFIN
    INTO :ID, :PREF, :NUMERO
DO
  BEGIN
  idref = null;
  SELECT ENCO_IDREF FROM COMPROBANTE_ENCABEZADO WHERE ENCO_TIPOREF = 16 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(ININ_ID) FROM INTERFAZ_INVENTARIO WHERE PREF_PRE = :PREF AND TIDO_COD = 16 INTO :IDI;
  EXECUTE PROCEDURE CONTABIL_DESENSAMBLE (: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 DEVCOMPRA_SIN_CONTABILIDAD(
    FECINI DATE,
    FECFIN DATE)
RETURNS (
    ID INTEGER,
    PREF VARCHAR(4),
    NUMERO VARCHAR(8),
    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 ^ ;

ALTER PROCEDURE DEVOLUCIONES_SIN_CONTABILIDAD(
    FECINI DATE,
    FECFIN DATE)
RETURNS (
    ID INTEGER,
    PREF VARCHAR(4),
    NUMERO VARCHAR(8),
    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 DEVT_ID, PREF_PRE, DEVT_NUMERO FROM devoluciones_ventas WHERE DEVT_ANULADO = 'N' AND
    DEVT_FECHA >= :FECINI AND DEVT_FECHA <= :FECFIN
    INTO :ID, :PREF, :NUMERO
DO
  BEGIN
  idref = null;
  SELECT ENCO_IDREF FROM COMPROBANTE_ENCABEZADO WHERE ENCO_TIPOREF = 33 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(INVE_ID) FROM INTERFAZ_VENTAS WHERE PREF_PRE = :PREF AND TIDO_COD = 33 INTO :IDI;
   EXECUTE PROCEDURE contabil_devolcli (: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 EGRESOS_SIN_CONTABILIDAD(
    FECINI DATE,
    FECFIN DATE)
RETURNS (
    ID INTEGER,
    IDI INTEGER,
    IDC INTEGER,
    PREF VARCHAR(4),
    NUMERO VARCHAR(8),
    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;
declare variable idinte integer;
BEGIN
EXECUTE PROCEDURE fecha_a_conta(FECINI) returning_values (FECICNT);
EXECUTE PROCEDURE fecha_a_conta(FECFIN) returning_values (FECFCNT);
FOR SELECT EGRE_ID, PREF_PRE, egre_numero, egre_idinter FROM EGRESOS WHERE EGRE_ANULADO = 'N' AND PREF_PRE <> 'R004' AND
    EGRE_FECHA >= :FECINI AND EGRE_FECHA <= :FECFIN ORDER BY EGRE_ID INTO :ID, :PREF, :NUMERO, :idinte
DO
  BEGIN
  idref = null;
  SELECT ENCO_IDREF FROM COMPROBANTE_ENCABEZADO WHERE ENCO_TIPOREF = 62 AND ENCO_FECHA >= :FECICNT AND ENCO_FECHA <= :FECFCNT and ENCO_IDREF = :ID into :idref;
  if (idref IS NULL) then
    begin
    ESTADO = 'PROCESANDO';
    SUSPEND;
    if ((idinte <> 0) and (idinte is not null)) then
        IDI = IDINTE;
    else
        SELECT MAX(INCJ_ID) FROM INTERFAZ_CAJA WHERE PREF_PRE = :PREF AND TIDO_COD = 62 INTO :IDI;
    EXECUTE PROCEDURE CONTABIL_EGRESO (: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 EGRESO_NOMINA(
    IDCONS INTEGER,
    PGLOBAL CHAR(1),
    NITBENE VARCHAR(20),
    FECHAEGR DATE,
    PREF VARCHAR(4),
    NUMEROEGR VARCHAR(8),
    CONCEPTO VARCHAR(60),
    OBSERVACIONES BLOB SUB_TYPE 0 SEGMENT SIZE 80,
    NOMBREBENE VARCHAR(60),
    CAJA INTEGER,
    USUARIOEGR VARCHAR(10),
    PAGO CHAR(1),
    CUENTAID INTEGER,
    FECHAEGRBNCO DATE,
    PREFEGREBNCO VARCHAR(4),
    NUMEROEGREBNCO VARCHAR(8),
    BENEBNCO VARCHAR(60),
    CONCEPTOBNCO VARCHAR(60),
    GMF CHAR(1),
    FORMAPAGOID INTEGER,
    CAJABNCO VARCHAR(2),
    CAJABNCOCUENTA VARCHAR(20),
    CAJABNCONUMEROEGR VARCHAR(20),
    FORMULARIO VARCHAR(10))
RETURNS (
    OK CHAR(1))
AS
declare variable IDNOMINA INTEGER;
declare variable idpago integer;
declare variable idegreso integer;
declare variable nitemplnglo varchar(20) character set none;
declare variable numegresointeger integer;
declare variable itempago integer;
declare variable pagoempl char(1);
declare variable periodo integer;
declare variable nomiano char(4);
declare variable emplnom varchar(60);
declare variable total numeric(18,2);
declare variable RETIRO VARCHAR(8);
declare variable ERROR integer;
declare variable VER char(2);
declare variable IDC integer;
declare variable NOMINT VARCHAR(60);
declare variable IDINT integer;
begin
execute procedure lee_configuracion ('NOMINA', 'PAGOS', 'USAR CHEQUE O RETIRO PARA PAGOS DE NOMINA DEL BANCO') returning_values (:RETIRO);
SELECT first 1 CONO_IDORI FROM CONSOLIDADO_NOMINA WHERE CONO_ID = :idcons INTO :idnomina;
select nomi_pagook, nomi_periodo, nomi_ano from nomina where nomi_id = :idnomina into :ok, :periodo, :nomiano;
if (ok = 'N') then
    BEGIN
    if (pglobal = 'S') then
        BEGIN
        idpago = GEN_ID(id_pagonomi, 1);
        SELECT SUM (CONO_ABONO) FROM CONSOLIDADO_NOMINA WHERE CONO_ID = :idcons AND CONO_TIPOORI = 92
            and cono_pagook = 'N' AND CONO_DEB = 'S'
            INTO :total;
        if((:TOTAL IS NOT NULL) and (:total <> 0)) then
            BEGIN
            EXECUTE PROCEDURE cambie_id_egreso returning_values (:idegreso);
            INSERT INTO egresos (EGRE_ID, TIDO_COD, PREF_PRE, EGRE_numero, EGRE_fecha, EGRE_CONC, EGRE_MONTO, EGRE_RTFTEMONTO, EGRE_OBS, EGRE_NOMTERC, EGRE_ANULADO, EGRE_TRANSMIT, TERC_NIT, EGRE_TIPO, CAJA_ID, EGRE_usuario, NUMOK, CLEG_ID)
                 VALUES (:idegreso,62, :pref, :numeroegr, :fechaegr, :concepto, :total, 0, :observaciones, :nombrebene, 'N', 'N', :nitbene, '3', :caja, :usuarioegr, 'N', 0);
            if (pago = 'B') then
                BEGIN
                if (RETIRO = 'RETIRO') then
                    INSERT INTO egresos_banco (EGRE_ID, EGBC_TIPOBCO, CUBA_COD, EGBC_numero, EGBC_fecha, PRBA_PREF, EGBC_BENEF, EGBC_MONTO, EGBC_CONCEPTO, EGBC_GMF, EGBC_ANULADO, EGBC_TRANSMIT)
                        VALUES (:idegreso, 73, :cuentaid, :numeroegrebnco, :fechaegrbnco, :prefegrebnco, :benebnco, :total, :conceptobnco, :gmf, 'N', 'N');
                else
                    INSERT INTO egresos_banco (EGRE_ID, EGBC_TIPOBCO, CUBA_COD, EGBC_numero, EGBC_fecha, PRBA_PREF, EGBC_BENEF, EGBC_MONTO, EGBC_CONCEPTO, EGBC_GMF, EGBC_ANULADO, EGBC_TRANSMIT)
                        VALUES (:idegreso, 72, :cuentaid, :numeroegrebnco, :fechaegrbnco, :prefegrebnco, :benebnco, :total, :conceptobnco, :gmf, 'N', 'N');
                end
            ELSE
                if (pago = 'C') then
                    INSERT INTO egresos_caja (EGRE_ID, EGCA_ITEM, CAJA_ID, FOPA_ID, EGCA_BANCO, EGCA_CUENTA, EGCA_numero, EGCA_fecha, EGCA_MONTO, EGCA_ANULADO, EGCA_TRANSMIT) VALUES (:idegreso, 1, :caja, :formapagoid, :cajabnco, :cajabncocuenta, :cajabnconumeroegr, :fechaegr, :total, 'N', 'N');
            insert INTO pago_nomina (pgno_id, pgno_fecha, pgno_tipopago, pgno_egreid, pgno_egrepre, pgno_egrenum, pgno_monto, pgno_nomina, pgno_nit, pgno_formulario, PGNO_ANT, PGNO_CONSOLIDA)
                 VALUES (:idpago, :fechaegr, :pago , :idegreso, :pref, :numeroegr, :total, :idnomina, :nitbene, :formulario, 'N', :idcons);
            END
        update CONSOLIDADO_NOMINA set cono_pagook = 'S'
            WHERE CONO_ID = :idcons AND CONO_TIPOORI = 92 and cono_pagook = 'N' AND CONO_DEB = 'S';
        FOR SELECT DISTINCT TERC_NIT FROM CONSOLIDADO_NOMINA WHERE CONO_ID = :idcons into :nitemplnglo
            DO
            BEGIN
            SELECT SUM (CONO_ABONO) FROM CONSOLIDADO_NOMINA
                WHERE CONO_ID = :idcons AND CONO_TIPOORI = 92 and cono_pagook = 'N' AND CONO_DEB = 'S' AND TERC_NIT = :nitemplnglo
                INTO :total;
            select max (pgno_item) from pago_nomina_det WHERE PGNO_ID = :idpago INTO :itempago;
            if (:itempago IS NULL) then
                itempago = 0;
            itempago = :itempago + 1;
            insert INTO pago_nomina_det  (pgno_id, terc_nit, pgnd_monto, pgno_item)
                 VALUES (:idpago, :nitemplnglo, :total, :itempago);
            END
        OK = 'S';
        END
    ELSE
        BEGIN
        FOR SELECT DISTINCT TERC_NIT FROM CONSOLIDADO_NOMINA WHERE CONO_ID = :idcons into :nitemplnglo
            DO
            BEGIN
            EXECUTE PROCEDURE cambie_id_egreso returning_values (:idegreso);
            SELECT SUM (CONO_ABONO) FROM CONSOLIDADO_NOMINA WHERE CONO_ID = :idcons AND CONO_TIPOORI = 92
                and cono_pagook = 'N' AND CONO_DEB = 'S' AND TERC_NIT = :nitemplnglo
                INTO :total;
            SELECT TERC_NOM FROM TERCEROS WHERE TERC_NIT = :nitemplnglo INTO :emplnom;
            concepto = 'PAGO NOMINA DEL PERIODO ' || CAST (periodo AS CHAR(2)) || ' DEL ' || nomiano;
            if((:TOTAL IS NOT NULL) AND (:total <> 0)) then
                BEGIN
                INSERT INTO egresos (EGRE_ID, TIDO_COD, PREF_PRE, EGRE_numero, EGRE_fecha, EGRE_CONC, EGRE_MONTO, EGRE_RTFTEMONTO, EGRE_OBS, EGRE_NOMTERC, EGRE_ANULADO, EGRE_TRANSMIT, TERC_NIT, EGRE_TIPO, CAJA_ID, EGRE_usuario, NUMOK, CLEG_ID)
                     VALUES (:idegreso,62, :pref, :numeroegr, :fechaegr, :concepto, :total, 0, :observaciones, :emplnom, 'N', 'N', :nitemplnglo, '3', :caja, :usuarioegr, 'N', 0);
                SELECT empl_formpago FROM EMPLEADOS WHERE TERC_NIT = :nitemplnglo INTO :pagoempl;
                if (pagoempl = 'B') then
                    begin
                    conceptobnco = :concepto;
                    if (RETIRO = 'RETIRO') then
                        INSERT INTO egresos_banco (EGRE_ID, EGBC_TIPOBCO, CUBA_COD, EGBC_numero, EGBC_fecha, PRBA_PREF, EGBC_BENEF, EGBC_MONTO, EGBC_CONCEPTO, EGBC_GMF, EGBC_ANULADO, EGBC_TRANSMIT)
                           VALUES (:idegreso, 73, :cuentaid, :numeroegrebnco, :fechaegrbnco, :prefegrebnco, :nitemplnglo, :total, :conceptobnco, :gmf, 'N', 'N');
                    else
                        INSERT INTO egresos_banco (EGRE_ID, EGBC_TIPOBCO, CUBA_COD, EGBC_numero, EGBC_fecha, PRBA_PREF, EGBC_BENEF, EGBC_MONTO, EGBC_CONCEPTO, EGBC_GMF, EGBC_ANULADO, EGBC_TRANSMIT)
                           VALUES (:idegreso, 72, :cuentaid, :numeroegrebnco, :fechaegrbnco, :prefegrebnco, :nitemplnglo, :total, :conceptobnco, :gmf, 'N', 'N');
                    end
                ELSE
                    INSERT INTO egresos_caja (EGRE_ID, EGCA_ITEM, CAJA_ID, FOPA_ID, EGCA_BANCO, EGCA_CUENTA, EGCA_numero, EGCA_fecha, EGCA_MONTO, EGCA_ANULADO, EGCA_TRANSMIT)
                       VALUES (:idegreso, 1, :caja, :formapagoid, :cajabnco, :cajabncocuenta, :cajabnconumeroegr, :fechaegr, :total, 'N', 'N');
                END
            EXECUTE PROCEDURE cambie_id_pago_nomina returning_values (:idpago);
            INSERT INTO pago_nomina (pgno_id, pgno_fecha, pgno_tipopago, pgno_egreid, pgno_egrepre, pgno_egrenum, pgno_monto, pgno_nomina, pgno_nit, pgno_formulario, PGNO_ANT, PGNO_CONSOLIDA)
                 VALUES (:idpago, :fechaegr, :pago , :idegreso, :pref, :numeroegr, :total, :idnomina, :nitemplnglo, :formulario, 'N', :idcons);
            select max (pgno_item) from pago_nomina_det WHERE PGNO_ID = :idpago INTO :itempago;
            if (:itempago IS NULL) then
                itempago = 0;
            itempago = :itempago + 1;
            insert INTO pago_nomina_det  (pgno_id, terc_nit, pgnd_monto, pgno_item)
                 VALUES (:idpago, :nitemplnglo, :total, :itempago);
            numegresointeger = cast (numeroegr as integer);
            numegresointeger = numegresointeger + 1;
            execute procedure completa_ceros(numegresointeger)returning_values :numeroegr;
            update CONSOLIDADO_NOMINA set cono_pagook = 'S' WHERE CONO_ID = :idcons AND CONO_TIPOORI = 92
                and cono_pagook = 'N' AND CONO_DEB = 'S' AND TERC_NIT = :nitemplnglo;
            /* CONTABILICE EL EGRESO */
            execute procedure lee_configuracion('NOMINA', 'PAGOS', 'NOMBRE DE INTERFAZ CONTABLE PARA EGRESOS DE NOMINA') returning_values (:NOMINT);
            if (NOMINT <> '') then
                select INCJ_ID from interfaz_caja where TIDO_COD = 62 and PREF_PRE = :pref AND INCJ_NOMBRE = :NOMINT into :IDINT;
            ELSE
                select max(INCJ_ID) from interfaz_caja where TIDO_COD = 62 and PREF_PRE = :pref into :IDINT;
            execute procedure contabil_egreso (:idegreso, :idint) returning_values (:ERROR, :VER, :IDC);
            if (ERROR = 0) then
                execute procedure CONTABILIZA_PENDIENTE (:IDC);
            END
        END
    if (NOT EXISTS (SELECT CONO_ID FROM consolidado_nomina WHERE CONO_ID = :idcons AND CONO_VALOR > CONO_ABONO)) then
        update NOMINA SET NOMI_pagook = 'S' WHERE NOMI_ID = :IDNOMINA;
    OK = 'S';
    END
ELSE
    BEGIN
    OK = 'N';
    exception nomina_con_pago;
    END
END

^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE ENSAMBLES_SIN_CONTABILIDAD(
    FECINI DATE,
    FECFIN DATE)
RETURNS (
    ID INTEGER,
    PREF VARCHAR(4),
    NUMERO VARCHAR(8),
    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 ENSA_ID, PREF_PRE, ENSA_NUMERO FROM ENSAMBLES WHERE ENSA_ANULADO = 'N' AND
    ENSA_FECHA >= :FECINI AND ENSA_FECHA <= :FECFIN
    INTO :ID, :PREF, :NUMERO
DO
  BEGIN
  idref = null;
  SELECT ENCO_IDREF FROM COMPROBANTE_ENCABEZADO WHERE ENCO_TIPOREF = 15 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(ININ_ID) FROM INTERFAZ_INVENTARIO WHERE PREF_PRE = :PREF AND TIDO_COD = 15 INTO :IDI;
  EXECUTE PROCEDURE CONTABIL_ENSAMBLE (: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 ENTRADAS_SIN_CONTABILIDAD(
    FECINI DATE,
    FECFIN DATE)
RETURNS (
    ID INTEGER,
    PREF VARCHAR(4),
    NUMERO VARCHAR(8),
    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 ENTR_ID, PREF_PRE, ENTR_NUMERO FROM ENTRADAS WHERE ENTR_ANULADO = 'N' AND
    ENTR_FECHA >= :FECINI AND ENTR_FECHA <= :FECFIN
    INTO :ID, :PREF, :NUMERO
DO
  BEGIN
  idref = null;
  SELECT ENCO_IDREF FROM COMPROBANTE_ENCABEZADO WHERE ENCO_TIPOREF = 11 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(ININ_ID) FROM INTERFAZ_INVENTARIO WHERE PREF_PRE = :PREF AND TIDO_COD = 11 INTO :IDI;
   EXECUTE PROCEDURE CONTABIL_ENTRADA (: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 FACTCOMP_SIN_CONTABILIDAD(
    FECINI DATE,
    FECFIN DATE)
RETURNS (
    ID INTEGER,
    PREF VARCHAR(4),
    NUMERO VARCHAR(8),
    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 FACTURAR_CONCEPTOS(
    ID INTEGER,
    NITINI VARCHAR(20),
    NITFIN VARCHAR(20),
    AGRINI VARCHAR(20),
    AGRFIN VARCHAR(20),
    AGRUPA INTEGER,
    FECHA DATE,
    REFER VARCHAR(60),
    FECINI DATE,
    FECFIN DATE,
    MORA NUMERIC(9,4))
RETURNS (
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(8),
    NIT VARCHAR(20),
    SUCURSAL VARCHAR(10),
    NOMBRE VARCHAR(60),
    TOTAL NUMERIC(18,2))
AS
declare variable IDF INTEGER;
declare variable IDC INTEGER;
declare variable VEND INTEGER;
declare variable PTVT INTEGER;
declare variable VENDINI INTEGER;
declare variable VENDFIN INTEGER;
declare variable ZONINI CHAR(2);
declare variable ZONFIN CHAR(2);
declare variable grpini INTEGER;
declare variable grpfin INTEGER;
declare variable DIAS INTEGER;
declare variable OBS VARCHAR(255);
declare variable IVAINC CHAR(1);
declare variable ITEM INTEGER;
declare variable ARTICULO VARCHAR(20);
declare variable DESCR VARCHAR(60);
declare variable CANT NUMERIC(18,2);
declare variable PRUNIT NUMERIC(18,2);
declare variable IVAP NUMERIC(18,2);
declare variable IVAM NUMERIC(18,2);
declare variable BASE NUMERIC(18,2);
declare variable RTFTE NUMERIC(9,2);
declare variable RTIVA NUMERIC(9,2);
declare variable RTICA NUMERIC(9,2);
declare variable RTFTEM NUMERIC(18,2);
declare variable RTIVAM NUMERIC(18,2);
declare variable RTICAM NUMERIC(18,2);
declare variable UNIDAD VARCHAR(8);
declare variable BOD VARCHAR(2);
declare variable ERROR INTEGER;
declare variable VER CHAR(1);
declare variable factmes varchar(2);
declare variable GRPFM VARCHAR(3);
declare variable OK CHAR(1);
declare variable SALDO NUMERIC(18,2);
declare variable REDON INTEGER;
declare variable REDONT INTEGER;
begin
if (agrupa = 0) then
    BEGIN
    VENDINI = 0;
    VENDFIN = 999999;
    GRPINI = 0;
    GRPFIN = 999999;
    ZONINI = '';
    ZONFIN = 'zz';
    END
if (agrupa = 1) then
    BEGIN
    VENDINI = 0;
    VENDFIN = 999999;
    ZONINI = '';
    ZONFIN = 'zz';
    GRPINI = AGRINI;
    GRPFIN = AGRFIN;
    END
if (agrupa = 2) then
    BEGIN
    GRPINI = 0;
    GRPFIN = 999999;
    ZONINI = '';
    ZONFIN = 'zz';
    VENDINI = AGRINI;
    VENDFIN = AGRFIN;
    END
if (agrupa = 3) then
    BEGIN
    VENDINI = 0;
    VENDFIN = 999999;
    GRPINI = 0;
    GRPFIN = 999999;
    ZONINI = AGRINI;
    ZONFIN = AGRFIN;
    END
EXECUTE procedure lee_configuracion ('FACTURACION', 'FACTURAS', 'GRUPO DE MERCANCIA PARA CONTROL MENSUAL DE FACTURACION') returning_values (:GRPFM);
EXECUTE procedure lee_configuracion ('FACTURACION', 'FACTURAS', 'CONTROLAR FACTURACION MENSUAL POR CADA CLIENTE') returning_values (:factmes);
EXECUTE procedure lee_configuracion ('FACTURACION', 'ARTICULOS', 'REDONDEO AL MULTIPLO DE DIEZ EN PRECIOS') returning_values (:redon);
EXECUTE procedure lee_configuracion ('FACTURACION', 'DOCUMENTOS', 'REDONDEO AL MULTIPLO DE DIEZ EN TOTALES') returning_values (:redont);
SELECT FACC_PREF, FACC_VEND, FACC_DIAS, FACC_PTVT, FACC_OBS FROM factura_concepto WHERE FACC_ID = :ID
    INTO :prefijo, :vend, :dias, :ptvt, :obs;
SELECT BODE_COD FROM punto_venta WHERE PTVT_ID = :PTVT INTO :BOD;
FOR SELECT T.TERC_NIT, S.clcu_cod, S.clsu_nombre, S.vend_cod, C.clie_rtefte, C.clie_rteiva, C.clie_rteica, C.clie_rtftebase
    FROM TERCEROS T, CLIENTES C, CLIENTE_SUCURSALES S
    WHERE T.terc_nit = C.terc_nit AND T.TERC_NIT >= :NITINI AND T.TERC_NIT <= :NITFIN AND C.terc_nit = S.terc_nit AND
        C.vend_cod >= :vendini AND C.vend_cod <= :vendfin AND ((S.grca_cod is null and :grpini = 0 ) or (S.grca_cod >= :grpini AND S.grca_cod <= :grpfin)) AND
        ((c.zona_cod is null and :zonini = '') or (C.zona_cod >= :zonini AND C.zona_cod <= :zonfin))
    INTO :NIT, :sucursal, :NOMBRE, :VEND, :RTFTE, :RTIVA, :RTICA, :RTFTEM
    DO
    BEGIN
    SELECT PREF_ACTUAL, PREF_IVAINC FROM PREFIJOS WHERE TIDO_COD = 31 AND PREF_PRE = :prefijo
        INTO :NUMERO, :IVAINC;
    select max(INVE_ID) FROM interfaz_ventas WHERE PREF_PRE = :prefijo AND TIDO_COD = 31 INTO :IDC;

    OK = 'S';
    if (FACTMES = 'SI') then
        begin
        if (EXISTS(SELECT FAME_IDFACT FROM FACTURAS_MES WHERE FAME_NIT = :nit AND FAME_SUCURSAL = :sucursal AND FAME_ANO = EXTRACT(YEAR FROM :FECHA) AND FAME_MES = EXTRACT(MONTH FROM :FECHA))) then
            OK = 'N';
        end
    if (OK = 'S') then
        BEGIN
        IDF = GEN_ID(id_factura, 1);
        INSERT INTO FACTURAS (FACT_ID, PTVT_ID, VEND_COD, TERC_NIT, AUTO_NUMERO, FACT_NUMERO, FACT_FECHA, FACT_DESPACHO,
            FACT_VENCE, FACT_IVAINC, FACT_COMIPORC, FACT_COMIMONTO, FACT_DTOPOR, FACT_DTOMONTO, FACT_ADICIONAL,
            FACT_IVAMONTO, FACT_RTFTEPOR, FACT_RTFTEMONTO, FACT_RTIVAPOR, FACT_RTIVAMONTO, FACT_RTICAPOR, FACT_RTICAMONTO,
            FACT_EXTRA, FACT_DTOFPOR, FACT_DTOFMONTO, FACT_DTOFFECHA, PREF_PRE, FACT_TRANSP, FACT_NOMCLIENTE, FACT_COTIZACI,
            FACT_PEDIDO, FACT_REMISION, FACT_ANULADO, FACT_TRANSMIT, FACT_TOTAL, BODE_COD, FACT_OBS, VEHI_COD, FACT_CONSOLIDA,
            FACT_RECIBIDO, FACT_USUARIO, FACT_SUCURSAL, NUMOK, COBR_COD, FACT_FACTOR, FACT_DETCLI, FACT_DETCLINOM,
            FACT_DTOIT1, FACT_DTOIT2, FACT_DTOIT3, FACT_TRM, FACT_FECINI, FACT_FECFIN)
            VALUES (:IDF, :PTVT, :VEND, :NIT, NULL, :NUMERO, :FECHA, NULL, (:FECHA + :DIAS), :IVAINC,
            0, 0, 0, 0, 0, :IVAM, :RTFTE, :RTFTEM, :RTIVA, :RTIVAM, :RTICA, :RTICAM, 0, 0, 0, :FECHA, :PREFIJO, NULL,
            :NOMBRE, NULL, NULL, NULL, 'N', 'S', :TOTAL, :BOD, :OBS, NULL, NULL, 0, USER, :sucursal, 'N', :VEND, 1, NULL,
            NULL, NULL, NULL, NULL, 1, :fecini, :fecfin);

        FOR SELECT FACI_ITEM, FC.ARTI_COD, FACI_CANT, FACI_PRUNIT, ARTI_UNIDAD, TAIV_PORC, FACI_DESC
            FROM factura_concepto_items FC, ARTICULO A, TARIFA_IVA I
            WHERE FC.arti_cod = A.arti_cod AND A.taiv_cod = I.taiv_cod AND FC.facc_id = :ID
            INTO :item, :articulo, :CANT, :prunit, :unidad, :ivap, :descr
            DO
            BEGIN
            /* busque el precio por cliente */
            if (EXISTS(SELECT ARTI_COD FROM ARTICULO WHERE ARTI_COD = :articulo AND GRUP_COD = :GRPFM)) then
                SELECT CLSU_VALORMES FROM cliente_sucursales WHERE TERC_NIT = :NIT AND CLCU_COD = :sucursal INTO :PRUNIT;

            if (IVAINC = 'S') then
                BEGIN
                IVAM = :CANT * :PRUNIT / (100 + :IVAP) * :IVAP;
                BASE = :CANT * :PRUNIT;
                END
            ELSE
                BEGIN
                IVAM = :CANT * :PRUNIT * IVAP / 100;
                BASE = :CANT * :PRUNIT + IVAM;
                END
            EXECUTE PROCEDURE redondee(IVAM, REDON) returning_values (IVAM);
            EXECUTE PROCEDURE redondee(BASE, REDON) returning_values (BASE);
            INSERT INTO FACTURAS_DETALLE (FACT_ID, FADE_ITEM, BODE_COD, ARTI_COD, FADE_CANT, FADE_UNIDAD, FADE_LOTE,
                FADE_PRUNIT, FADE_DTOPORC, FADE_DTOMONTO, FADE_IVAPORC, FADE_IVAMONTO, FADE_CONSUMO, FADE_FACTOR,
                FADE_DESC, FADE_OBS, FADE_CODBAR, FADE_REMISIONADO, FADE_DEVUELTO, FADE_TOTAL, LIPR_COD, FADE_REFERENCIA,
                FADE_ANULADO, FADE_TRANSMIT, FADE_FACTORLISTA, FADE_DTO1, FADE_DTO2, FADE_DTO3, FADE_DTOM1, FADE_DTOM2,
                FADE_DTOM3, FADE_CAJAS)
                VALUES (:IDF, :ITEM, :BOD, :articulo, :CANT, :UNIDAD, NULL, :prunit, 0, 0, :IVAP, :ivam, 0, 1,
                :descr, NULL, :articulo, 0, 0, :BASE, 1, :refer, 'N', 'N', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
            END

        /* SI HAY TASA DE MORA AGREGUE EL ITEM */
        execute procedure lee_configuracion('FACTURACION', 'FACTURAS', 'CODIGO DE ARTICULO PARA FACTURAR INTERESES DE MORA') returning_values (:articulo);
        if ((ARTICULO <> '') AND (MORA <> 0)) then
            BEGIN
            select sum(SALDO) from vencido_cliente (:nit, :fecini, '01', 'N') INTO :SALDO;
            PRUNIT = SALDO * MORA / 100;
            EXECUTE PROCEDURE redondee(PRUNIT, REDON) returning_values (PRUNIT);
            if (PRUNIT > 0) then
                BEGIN
                ivap = 0;
                IVAM = 0;
                SELECT ARTI_DES, ARTI_UNIDAD FROM ARTICULO WHERE ARTI_COD = :ARTICULO INTO :DESCR, :UNIDAD;
                INSERT INTO FACTURAS_DETALLE (FACT_ID, FADE_ITEM, BODE_COD, ARTI_COD, FADE_CANT, FADE_UNIDAD, FADE_LOTE,
                    FADE_PRUNIT, FADE_DTOPORC, FADE_DTOMONTO, FADE_IVAPORC, FADE_IVAMONTO, FADE_CONSUMO, FADE_FACTOR,
                    FADE_DESC, FADE_OBS, FADE_CODBAR, FADE_REMISIONADO, FADE_DEVUELTO, FADE_TOTAL, LIPR_COD, FADE_REFERENCIA,
                    FADE_ANULADO, FADE_TRANSMIT, FADE_FACTORLISTA, FADE_DTO1, FADE_DTO2, FADE_DTO3, FADE_DTOM1, FADE_DTOM2,
                    FADE_DTOM3, FADE_CAJAS)
                    VALUES (:IDF, :ITEM+1, :BOD, :articulo, 1, :UNIDAD, NULL, :prunit, 0, 0, :IVAP, :ivam, 0, 1,
                    :descr, NULL, :articulo, 0, 0, :PRUNIT, 1, NULL, 'N', 'N', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
                END
            END
        /* CALCULE EL TOTAL DE LA FACTURA XA EFECTOS DE IMPUESTOS */
        SELECT SUM(FADE_TOTAL), SUM(FADE_IVAMONTO) FROM facturas_detalle WHERE FACT_ID = :idf
            INTO :TOTAL, :IVAM;
        BASE = TOTAL - IVAM;
        if (BASE >= RTFTEM) then
            BEGIN
            RTFTEM = BASE * RTFTE / 100;
            RTICAM = BASE * RTICA / 1000;
            RTIVAM = IVAM * RTIVA / 100;
            END
        ELSE
            BEGIN
            RTFTEM = 0;
            RTICAM = 0;
            RTIVAM = 0;
            END
        EXECUTE PROCEDURE redondee(TOTAL, REDONT) returning_values (TOTAL);
        EXECUTE PROCEDURE redondee(IVAM, REDONT) returning_values (IVAM);
        EXECUTE PROCEDURE redondee(RTFTEM, REDONT) returning_values (RTFTEM);
        EXECUTE PROCEDURE redondee(RTIVAM, REDONT) returning_values (RTIVAM);
        EXECUTE PROCEDURE redondee(RTICAM, REDONT) returning_values (RTICAM);
        UPDATE FACTURAS SET FACT_TOTAL = :total,  FACT_IVAMONTO = :IVAM, FACT_RTFTEMONTO = :rtftem, 
            FACT_RTIVAMONTO = :rtivam, FACT_RTICAMONTO = :rticam, FACT_TRANSMIT = 'N' WHERE FACT_ID = :IDF;

        /* contabilice */
        execute procedure CONTABIL_FACTURA(:idf,  :IDC) returning_values (:ERROR, :VER, :IDC);
        EXECUTE procedure contabiliza_pendiente (:IDC);
        suspend;
        END
    END
end

^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE FACTURAS_SIN_CONTABILIDAD(
    FECINI DATE,
    FECFIN DATE)
RETURNS (
    ID INTEGER,
    PREF VARCHAR(4),
    NUMERO VARCHAR(8),
    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 FACT_ID, PREF_PRE, FACT_NUMERO FROM FACTURAS WHERE FACT_ANULADO = 'N' AND
    FACT_FECHA >= :FECINI AND FACT_FECHA <= :FECFIN INTO :ID, :PREF, :NUMERO
DO
  BEGIN
  idref = null;
  SELECT ENCO_IDREF FROM COMPROBANTE_ENCABEZADO WHERE ENCO_TIPOREF = 31 AND ENCO_FECHA >= :FECICNT AND ENCO_FECHA <= :FECFCNT and ENCO_IDREF = :ID into :idref;
  if (idref IS 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 (:ID, :IDI) RETURNING_VALUES (:ERROR, VER, :IDC);
   if ((ERROR = 0) or (error IS NULL)) then
    BEGIN
    EXECUTE PROCEDURE CONTABILIZA_PENDIENTE (:IDC);
    ESTADO = 'OK';
    END
   ELSE
    ESTADO = 'ERROR';
   suspend;
  end
  END
END

^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE NOTACRCL_SIN_CONTABILIDAD(
    FECINI DATE,
    FECFIN DATE)
RETURNS (
    ID INTEGER,
    IDI INTEGER,
    IDC INTEGER,
    PREF VARCHAR(4),
    NUMERO VARCHAR(8),
    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 NCCL_ID, PREF_PRE, NCCL_NUMERO FROM NOTAS_CREDITO_CLIENTES WHERE NCCL_ANULADO = 'N' AND
    NCCL_FECHA >= :FECINI AND NCCL_FECHA <= :FECFIN
    ORDER BY NCCL_ID INTO :ID, :PREF, :NUMERO
DO
  BEGIN
  idref = null;
  SELECT ENCO_IDREF FROM COMPROBANTE_ENCABEZADO WHERE ENCO_TIPOREF = 42 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 = 42 INTO :IDI;
  if (IDI IS NOT NULL) then
    BEGIN
    EXECUTE PROCEDURE CONTABIL_NOTACRCL (: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 ^ ;

ALTER PROCEDURE NOTACRPR_SIN_CONTABILIDAD(
    FECINI DATE,
    FECFIN DATE)
RETURNS (
    ID INTEGER,
    IDI INTEGER,
    IDC INTEGER,
    PREF VARCHAR(4),
    NUMERO VARCHAR(8),
    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 ^ ;

ALTER PROCEDURE NOTADBCL_SIN_CONTABILIDAD(
    FECINI DATE,
    FECFIN DATE)
RETURNS (
    ID INTEGER,
    IDI INTEGER,
    IDC INTEGER,
    PREF VARCHAR(4),
    NUMERO VARCHAR(8),
    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 NDCL_ID, PREF_PRE, NDCL_NUMERO FROM NOTAS_DEBITO_CLIENTES WHERE NDCL_ANULADO = 'N' AND
    NDCL_FECHA >= :FECINI AND NDCL_FECHA <= :FECFIN
    ORDER BY NDCL_ID INTO :ID, :PREF, :NUMERO
DO
  BEGIN
  idref = null;
  SELECT ENCO_IDREF FROM COMPROBANTE_ENCABEZADO WHERE ENCO_TIPOREF = 41 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 = 41 INTO :IDI;
  if (IDI IS NOT NULL) then
    BEGIN
    EXECUTE PROCEDURE CONTABIL_NOTADBCL (: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 ^ ;

ALTER PROCEDURE NOTADBPR_SIN_CONTABILIDAD(
    FECINI DATE,
    FECFIN DATE)
RETURNS (
    ID INTEGER,
    IDI INTEGER,
    IDC INTEGER,
    PREF VARCHAR(4),
    NUMERO VARCHAR(8),
    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 ^ ;

ALTER PROCEDURE NOTASCRBC_SIN_CONTABILIDAD(
    FECINI DATE,
    FECFIN DATE)
RETURNS (
    ID INTEGER,
    IDI INTEGER,
    IDC INTEGER,
    CTA INTEGER,
    PREF VARCHAR(4),
    NUMERO VARCHAR(8),
    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 NCBC_ID, CUBA_COD, PRBA_PREF, NCBC_NUMERO FROM NOTAS_CREDITO
    WHERE NCBC_ANULADO = 'N' AND NCBC_FECHA >= :FECINI AND NCBC_FECHA <= :FECFIN
    ORDER BY NCBC_ID INTO :ID, :CTA, :PREF, :NUMERO
DO
  BEGIN
  idref = null;
  SELECT ENCO_IDREF FROM COMPROBANTE_ENCABEZADO WHERE ENCO_TIPOREF = 75 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(INBA_ID) FROM INTERFAZ_BANCOS WHERE PREF_PRE = :PREF AND TIDO_COD = 75 AND CUBA_COD = :CTA INTO :IDI;
  if (IDI is NOT NULL) then
      BEGIN
      EXECUTE PROCEDURE CONTABIL_NOTACRBC (: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 ^ ;

ALTER PROCEDURE NOTASDBBC_SIN_CONTABILIDAD(
    FECINI DATE,
    FECFIN DATE)
RETURNS (
    ID INTEGER,
    IDI INTEGER,
    IDC INTEGER,
    CTA INTEGER,
    PREF VARCHAR(4),
    NUMERO VARCHAR(8),
    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 NDBC_ID, CUBA_COD, PRBA_PREF, NDBC_NUMERO FROM NOTAS_DEBITO
    WHERE NDBC_ANULADO = 'N' AND NDBC_FECHA >= :FECINI AND NDBC_FECHA <= :FECFIN
    ORDER BY NDBC_ID INTO :ID, :CTA, :PREF, :NUMERO
DO
  BEGIN
  idref = null;
  SELECT ENCO_IDREF FROM COMPROBANTE_ENCABEZADO WHERE ENCO_TIPOREF = 74 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(INBA_ID) FROM INTERFAZ_BANCOS WHERE PREF_PRE = :PREF AND TIDO_COD = 74 AND CUBA_COD = :CTA INTO :IDI;
  if (IDI is NOT NULL) then
      BEGIN
      EXECUTE PROCEDURE CONTABIL_NOTADBBC (: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 ^ ;

ALTER PROCEDURE RECCONTADO_MVERDE(
    FECINI DATE,
    FECFIN DATE)
RETURNS (
    FECHA DATE,
    IDC INTEGER,
    ERROR INTEGER,
    VER CHAR(1))
AS
declare variable PREF VARCHAR(4);
declare variable IDIN INTEGER;
declare variable IDF INTEGER;
begin
FECHA = FECINI;
WHILE (FECHA <= fecfin) DO
    BEGIN
    /* LOS DE CREDITO */
    FOR SELECT RECA_ID, PREF_PRE FROM RECIBOS_CAJA r WHERE reca_fecha = :fecha and NOT exists (select terc_nit from
        punto_venta p where terc_nit = r.terc_nit) into : IDF, :PREF
        DO
        BEGIN
        SELECT MAX(INCJ_ID) FROM INTERFAZ_CAJA WHERE TIDO_COD = 61 and pref_pre = :PREF INTO :IDIN;
        EXECUTE PROCEDURE contabil_recicaja(idf,  IDIN) returning_values (ERROR, VER, IDC);
        EXECUTE PROCEDURE contabiliza_pendiente (IDC);
        suspend;
        END
    FECHA = FECHA + 1;
    END
end

^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE RECIBOS_SIN_CONTABILIDAD(
    FECINI DATE,
    FECFIN DATE)
RETURNS (
    ID INTEGER,
    PREF VARCHAR(4),
    NUMERO VARCHAR(8),
    ESTADO VARCHAR(20),
    IDI INTEGER,
    IDC INTEGER,
    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 RECA_ID, PREF_PRE, RECA_NUMERO FROM RECIBOS_CAJA WHERE RECA_ANULADO = 'N' AND
    RECA_FECHA >= :FECINI AND RECA_FECHA <= :FECFIN and PREF_PRE NOT IN (SELECT AUTO_PREFRDC FROM AUTORIZACIONES) ORDER BY RECA_ID
    INTO :ID, :PREF, :NUMERO
DO
  BEGIN
  idref = null;
  SELECT ENCO_IDREF FROM COMPROBANTE_ENCABEZADO WHERE ENCO_TIPOREF = 61 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(INCJ_ID) FROM INTERFAZ_CAJA WHERE PREF_PRE = :PREF AND TIDO_COD = 61 INTO :IDI;
   EXECUTE PROCEDURE CONTABIL_RECICAJA (: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 RETIROS_SIN_CONTABILIDAD(
    FECINI DATE,
    FECFIN DATE)
RETURNS (
    ID INTEGER,
    IDI INTEGER,
    IDC INTEGER,
    CTA INTEGER,
    PREF VARCHAR(4),
    NUMERO VARCHAR(8),
    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 RETI_ID, CUBA_COD, PRBA_PREF, RETI_NUMERO FROM RETIROS
    WHERE RETI_ANULADO = 'N' AND RETI_FECHA >= :FECINI AND RETI_FECHA <= :FECFIN
    ORDER BY RETI_ID INTO :ID, :CTA, :PREF, :NUMERO
DO
  BEGIN
  idref = null;
  SELECT ENCO_IDREF FROM COMPROBANTE_ENCABEZADO WHERE ENCO_TIPOREF = 73 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(INBA_ID) FROM INTERFAZ_BANCOS WHERE PREF_PRE = :PREF AND TIDO_COD = 73 AND CUBA_COD = :CTA INTO :IDI;
  if (IDI is NOT NULL) then
      BEGIN
      EXECUTE PROCEDURE CONTABIL_RETIRO (: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 ^ ;

ALTER PROCEDURE SALIDAS_SIN_CONTABILIDAD(
    FECINI DATE,
    FECFIN DATE)
RETURNS (
    ID INTEGER,
    PREF VARCHAR(4),
    NUMERO VARCHAR(8),
    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 SALI_ID, PREF_PRE, SALI_NUMERO FROM SALIDAS WHERE SALI_ANULADO = 'N' AND
    SALI_FECHA >= :FECINI AND SALI_FECHA <= :FECFIN
    INTO :ID, :PREF, :NUMERO
DO
  BEGIN
  idref = null;
  SELECT ENCO_IDREF FROM COMPROBANTE_ENCABEZADO WHERE ENCO_TIPOREF = 12 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(ININ_ID) FROM INTERFAZ_INVENTARIO WHERE PREF_PRE = :PREF AND TIDO_COD = 12 INTO :IDI;
  EXECUTE PROCEDURE CONTABIL_SALIDA (: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 TRASCUENTAS_SIN_CONTABILIDAD(
    FECINI DATE,
    FECFIN DATE)
RETURNS (
    ID INTEGER,
    IDI INTEGER,
    IDC INTEGER,
    CTA INTEGER,
    PREF VARCHAR(4),
    NUMERO VARCHAR(8),
    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 TRAS_ID, CUBA_COD, PRBA_PREF, TRAS_NUMERO FROM TRASLADOS
    WHERE TRAS_ANULADO = 'N' AND TRAS_FECHA >= :FECINI AND TRAS_FECHA <= :FECFIN
    ORDER BY TRAS_ID INTO :ID, :CTA, :PREF, :NUMERO
DO
  BEGIN
  idref = null;
  SELECT ENCO_IDREF FROM COMPROBANTE_ENCABEZADO WHERE ENCO_TIPOREF = 76 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(INBA_ID) FROM INTERFAZ_BANCOS WHERE PREF_PRE = :PREF AND TIDO_COD = 76 AND CUBA_COD = :CTA INTO :IDI;
  if (IDI is NOT NULL) then
      BEGIN
      EXECUTE PROCEDURE contabil_trascuenta (: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 ^ ;

ALTER PROCEDURE TRASFERENCIAS_SIN_CONTABILIDAD(
    FECINI DATE,
    FECFIN DATE)
RETURNS (
    ID INTEGER,
    PREF VARCHAR(4),
    NUMERO VARCHAR(8),
    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 TRAN_ID, PREF_PRE, TRAN_NUMERO FROM trasferencias WHERE TRAN_ANULADO = 'N' AND
    TRAN_FECHA >= :FECINI AND TRAN_FECHA <= :FECFIN
    INTO :ID, :PREF, :NUMERO
DO
  BEGIN
  idref = null;
  SELECT ENCO_IDREF FROM COMPROBANTE_ENCABEZADO WHERE ENCO_TIPOREF = 13 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(ININ_ID) FROM INTERFAZ_INVENTARIO WHERE PREF_PRE = :PREF AND TIDO_COD = 13 INTO :IDI;
  EXECUTE PROCEDURE contabil_traslamercancia (: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 TRASLACAJAS_SIN_CONTABILIDAD(
    FECINI DATE,
    FECFIN DATE)
RETURNS (
    ID INTEGER,
    IDI INTEGER,
    IDC INTEGER,
    PREF VARCHAR(4),
    NUMERO VARCHAR(8),
    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 TRCJ_ID, PREF_PRE, TRCJ_numero FROM TRASLADOS_CAJA WHERE TRCJ_ANULADO = 'N' AND
    TRCJ_FECHA >= :FECINI AND TRCJ_FECHA <= :FECFIN
    ORDER BY TRCJ_ID INTO :ID, :PREF, :NUMERO
DO
  BEGIN
  idref = null;
  SELECT ENCO_IDREF FROM COMPROBANTE_ENCABEZADO WHERE ENCO_TIPOREF = 66 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(INCJ_ID) FROM INTERFAZ_CAJA WHERE PREF_PRE = :PREF AND TIDO_COD = 66 INTO :IDI;
  EXECUTE PROCEDURE CONTABIL_TRASLACAJA (: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 TRIGGER CONSIGNA_RECIBOS_BI
as
declare variable FECDOC date;
declare variable IDINT integer;
declare variable IDC integer;
declare variable fec date;
declare variable NUMCONS varchar(10);
declare variable NOMCLI varchar(60);
declare variable IVAMONTO numeric(18,2);
declare variable ERROR integer;
declare variable VER char(2);
declare variable IDR integer;
declare variable ITEM integer;
declare variable CONSEC integer;
declare variable NOMINT VARCHAR(60);
declare variable CONC VARCHAR(60);
begin
if (new.cond_anulado is null) then
    new.cond_anulado = 'N';
if (new.cond_transmit is null) then
    new.cond_transmit = 'N';
if (new.cond_sucursal is null) then
    new.cond_sucursal = '01';
/* valide que la fecha no sea anterior al documento */
select C.cons_fecha, C.prba_pref || C.cons_numero, C.cons_prefrdc
    from consigna C where cons_id = new.cons_id into :fec, :numcons, new.cond_prefrdc;
/* Grabar el recibo de caja correspondiente */
if (new.cond_recid is null) then
    new.cond_recid = gen_id(id_recicaja, 1);
if (not exists(select reca_id from recibos_caja where reca_id = new.cond_recid)) then
    begin
    select MVCL_FECHA from movimiento_clientes M where M.mvcl_tiporef = new.cond_tipodoc and M.mvcl_idref = new.cond_iddoc
        into :FECDOC;
    if (FECDOC > FEC) then
        exception fecha_anterior_documento 'EL RECIBO DE FECHA ' || :FEC || ' INTENTA ABONAR UN DOCUMENTO DE FECHA ' || FECDOC;
    NOMCLI = '';
    select TERC_NOM from TERCEROS where TERC_NIT = new.cond_nit into :NOMCLI;
    /* REGISTRE EL RECIBO */
    select PREF_ACTUAL from PREFIJOS where PREF_PRE = new.cond_prefrdc and TIDO_COD = 61 into new.cond_numrdc;
    select reca_id from recibos_caja where cons_id = new.cons_id AND TERC_NIT = NEW.COND_NIT into :IDR;
    if (IDR IS NULL) then
        IDR = 0;
    if (IDR <> 0) then
        begin
        SELECT RECA_CONC FROM RECIBOS_CAJA WHERE RECA_ID = :IDR INTO :CONC;
        if (STRLEN(CONC) < 50) then
            CONC = CONC || ',' || new.cond_prefdoc || new.cond_numdoc;
        update RECIBOS_CAJA
            set RECA_CONC = :CONC,
                RECA_MONTO = RECA_MONTO + new.cond_monto + new.cond_exedente,
                RECA_RTFTEMONTO = RECA_RTFTEMONTO + new.cond_rtfte,
                RECA_RTIVAMONTO = RECA_RTIVAMONTO + new.cond_rtiva,
                RECA_RTICAMONTO = RECA_RTICAMONTO + new.cond_rtica,
                RECA_DTOF = RECA_DTOF + new.cond_descto,
                RECA_EXEDENTE = RECA_EXEDENTE + new.cond_exedente,
                RECA_OBS = RECA_OBS || ' ' || NEW.cond_obs
            where RECA_ID = :IDR;
        new.cond_recid = :IDR;
        end
    else
        begin
        IDR = new.cond_recid;
        insert into RECIBOS_CAJA (RECA_ID, TIDO_COD, PREF_PRE, RECA_NUMERO, RECA_FECHA, CAJA_ID, RECA_CONC, RECA_MONTO,
            RECA_RTFTEMONTO, RECA_RTIVAMONTO, RECA_RTICAMONTO, RECA_DTOF, RECA_OBS, TERC_NIT, RECA_NOMTERC, RECA_ANULADO,
            RECA_TRANSMIT, COBR_COD, RECA_PROVISIONAL, RECA_PROVID, RECA_USUARIO, NUMOK, RECA_TRM, RECA_EXEDENTE, cons_id)
            values (:idr, 61, new.cond_prefrdc, new.cond_numrdc, :FEC, new.caja_id, 'CONS. ' || :numcons || ' FV.' || new.cond_prefdoc || new.cond_numdoc, new.cond_monto + new.cond_exedente,
            new.cond_rtfte, new.cond_rtiva, new.cond_rtica, new.cond_descto, new.cond_obs, new.cond_nit, :NOMCLI, 'N', 'N', new.cond_cobr, null, 0, user, 'N', 1, new.cond_exedente, new.cons_id);
        end
    /* EL DETALLE DEL RECIBO */
    select max(RCDE_ITEM) from recibos_caja_detalle where RECA_ID = :IDR into :ITEM;
    if (ITEM is null) then
        ITEM = 0;
    ITEM = ITEM + 1;
    insert into recibos_caja_detalle (RECA_ID, RCDE_ITEM, RCDE_TIPODOC, RCDE_IDDOC, RCDE_PREFIJO, RCDE_NUMERO,
        RCDE_ABONO, RCDE_RTFTE, RCDE_RTIVA, RCDE_RTICA, RCDE_DTOF, RCDE_ANULADO, RCDE_TRANSMIT, RCDE_COMIP,
        RCDE_SUCURSAL, RCDE_DIFCAMBIO, RCDE_COBR)
        values (:IDR, :ITEM, new.cond_tipodoc, new.cond_iddoc, new.cond_prefdoc, new.cond_numdoc,
        new.cond_monto, new.cond_rtfte, new.cond_rtiva, new.cond_rtica, new.cond_descto, 'N', 'N', new.cond_comip, new.cond_sucursal, 0, NEW.cond_cobr);
    /* EL DETALLE DEL PAGO */
    IVAMONTO = 0;
    if (new.cond_tipodoc =  31) then
        select FACT_IVAMONTO from FACTURAS where FACT_ID = new.cond_iddoc into :IVAMONTO;
    if (exists (select reca_id from recibos_caja_pago where reca_id = :IDR and fopa_id = new.fopa_id and rcpa_banco = new.cond_banco and
        rcpa_cuenta = new.cond_cuenta and rcpa_numero = new.cond_numero)) then
        update recibos_caja_pago
            set rcpa_monto = rcpa_monto + new.cond_monto + new.cond_exedente,
                RCPA_IVAMONTO = RCPA_IVAMONTO + :IVAMONTO
            where reca_id = :IDR and fopa_id = new.fopa_id and rcpa_banco = new.cond_banco and
            rcpa_cuenta = new.cond_cuenta and rcpa_numero = new.cond_numero;
    else
        insert into recibos_caja_pago (RECA_ID, RCPA_ITEM, FOPA_ID, RCPA_BANCO, RCPA_CUENTA, RCPA_NUMERO, RCPA_FECHA,
            RCPA_MONTO, RCPA_ANULADO, RCPA_TRANSMIT, RCPA_IVAMONTO)
            values(:IDR, :ITEM, new.fopa_id, new.cond_banco, new.cond_cuenta, new.cond_numero, :FEC,
            new.cond_monto + new.cond_exedente, 'N', 'N', :ivamonto);
    /* borre la contabilización */
    select enco_consec from comprobante_encabezado where enco_tiporef = 61 and enco_idref = :IDR into :consec;
    if (not consec is null) then
      delete from comprobante_detalle where enco_consec = :consec;
    delete from comprobante_encabezado where enco_tiporef = 61 and enco_idref = :IDR;
    /* CONTABILICE EL RECIBO */
    execute procedure lee_configuracion('BANCOS', 'CONSIGNACIONES', 'NOMBRE DE INTERFAZ CONTABLE PARA RECIBOS DE CAJA DESDE CONSIGNACION') returning_values (:NOMINT);
    if (NOMINT <> '') then
        select INCJ_ID from interfaz_caja where TIDO_COD = 61 and PREF_PRE = new.cond_prefrdc AND INCJ_NOMBRE = :NOMINT into :IDINT;
    ELSE
        select max(INCJ_ID) from interfaz_caja where TIDO_COD = 61 and PREF_PRE = new.cond_prefrdc into :IDINT;
    execute procedure contabil_recicaja (:idr, :idint) returning_values (:ERROR, :VER, :IDC);
    if (ERROR = 0) then
        execute procedure CONTABILIZA_PENDIENTE (:IDC);
    end
end
^

SET TERM ; ^

SET TERM ^ ;

ALTER TRIGGER CONSIGNA_RECIBOS_BU
as
declare variable FECDOC date;
declare variable IDINT integer;
declare variable IDC integer;
declare variable fec date;
declare variable NUMCONS varchar(10);
declare variable NOMCLI varchar(60);
declare variable IVAMONTO numeric(18,2);
declare variable ERROR integer;
declare variable VER char(2);
declare variable IDR integer;
declare variable ITEM integer;
declare variable CONSEC integer;
begin
if (new.cond_anulado = 'S') then
    begin
    /* ANULE EL DETALLE DE CONSIGNACION */
    update consigna_detalle set code_anulado = 'S' where CONS_ID = old.cons_id and code_item2 = old.cond_item;
    /* BORRE EL RECIBO DE CAJA */
    if (old.cond_recid <> 0) then
        begin
        update recibos_caja set RECA_ANULADO = 'S' where RECA_ID = old.cond_recid;
        end
    end
else
    begin
    if ((old.cond_recid <> 0) and (old.cond_anulado = 'N')) then
        begin
        /* BORRE EL DETALLE DE LA CONSIGNACION */
        delete from consigna_detalle where CONS_ID = old.cons_id and code_item2 = old.cond_item;
        /* BORRE EL RECIBO Y VUELVA A GRABARLO */
        delete from recibos_caja_detalle where RECA_ID = old.cond_recid;
        delete from recibos_caja_pago where RECA_ID = old.cond_recid;
        delete from recibos_caja where RECA_ID = old.cond_recid;
        end
    if ((new.cond_recid <> 0) and (new.cond_anulado = 'N')) then
        begin
        /* GRABE EL DETALLE DE LA CONSIGNACION */
        insert into CONSIGNA_DETALLE (CONS_ID, CODE_ITEM2, FOPA_ID, CODE_BANCO, CODE_CUENTA, CODE_NUMERO, CODE_FECHA, CODE_MONTO,
            CODE_ANULADO, CODE_TRANSMIT, CODE_DEVUELTO, CAJA_ID)
            values (new.cons_id, new.cond_item, new.fopa_id, new.cond_banco, new.cond_cuenta, new.cond_numero, :fec, new.cond_monto,
            'N', 'N', 'N', new.caja_id);
        /* Grabar el recibo de caja correspondiente */
        new.cond_recid = gen_id(id_recicaja, 1);
        if (not exists(select reca_id from recibos_caja where reca_id = new.cond_recid)) then
            begin
            select C.cons_fecha, C.prba_pref || C.cons_numero from consigna C where cons_id = new.cons_id into :fec, :numcons;
                select MVCL_FECHA from movimiento_clientes M where M.mvcl_tiporef = new.cond_tipodoc and M.mvcl_idref = new.cond_iddoc
                into :FECDOC;
            if (FECDOC > FEC) then
                exception fecha_anterior_documento 'EL RECIBO DE FECHA ' || :FEC || ' INTENTA ABONAR UN DOCUMENTO DE FECHA ' || FECDOC;
            NOMCLI = '';
            select TERC_NOM from TERCEROS where TERC_NIT = new.cond_nit into :NOMCLI;
            /* REGISTRE EL RECIBO */
            select PREF_ACTUAL from PREFIJOS where PREF_PRE = new.cond_prefrdc and TIDO_COD = 61 into new.cond_numrdc;
            select reca_id from recibos_caja where cons_id = new.cons_id AND TERC_NIT = NEW.COND_NIT into :IDR;
            if (IDR IS NULL) then
                IDR = 0;
            if (IDR <> 0) then
                begin
                update RECIBOS_CAJA
                    set RECA_CONC = 'ABONOS EN CONSIGNACION No. ' || :numcons,
                        RECA_MONTO = RECA_MONTO + new.cond_monto + new.cond_exedente,
                        RECA_RTFTEMONTO = RECA_RTFTEMONTO + new.cond_rtfte,
                        RECA_RTIVAMONTO = RECA_RTIVAMONTO + new.cond_rtiva,
                        RECA_RTICAMONTO = RECA_RTICAMONTO + new.cond_rtica,
                        RECA_DTOF = RECA_DTOF + new.cond_descto,
                        RECA_EXEDENTE = RECA_EXEDENTE + new.cond_exedente
                    where RECA_ID = :IDR;
                end
            else
                begin
                IDR = new.cond_recid;
                insert into RECIBOS_CAJA (RECA_ID, TIDO_COD, PREF_PRE, RECA_NUMERO, RECA_FECHA, CAJA_ID, RECA_CONC, RECA_MONTO,
                    RECA_RTFTEMONTO, RECA_RTIVAMONTO, RECA_RTICAMONTO, RECA_DTOF, RECA_OBS, TERC_NIT, RECA_NOMTERC, RECA_ANULADO,
                    RECA_TRANSMIT, COBR_COD, RECA_PROVISIONAL, RECA_PROVID, RECA_USUARIO, NUMOK, RECA_TRM, RECA_EXEDENTE)
                    values (new.cond_recid, 61, new.cond_prefrdc, new.cond_numrdc, :FEC, new.caja_id, 'ABONO FACTURA ' || new.cond_prefdoc || new.cond_numdoc || ' EN CONSIGNACION ' || :numcons, new.cond_monto + new.cond_exedente,
                    new.cond_rtfte, new.cond_rtiva, new.cond_rtica, new.cond_descto, null, new.cond_nit, :NOMCLI, 'N', 'N', new.cond_cobr, null, 0, user, 'N', 1, new.cond_exedente);
                end
            /* EL DETALLE DEL RECIBO */
            select max(RCDE_ITEM) from recibos_caja_detalle where RECA_ID = :IDR into :ITEM;
            if (ITEM is null) then
                ITEM = 0;
            ITEM = ITEM + 1;
            insert into recibos_caja_detalle (RECA_ID, RCDE_ITEM, RCDE_TIPODOC, RCDE_IDDOC, RCDE_PREFIJO, RCDE_NUMERO,
                RCDE_ABONO, RCDE_RTFTE, RCDE_RTIVA, RCDE_RTICA, RCDE_DTOF, RCDE_ANULADO, RCDE_TRANSMIT, RCDE_COMIP,
                RCDE_SUCURSAL, RCDE_DIFCAMBIO, RCDE_COBR)
                values (:IDR, :ITEM, new.cond_tipodoc, new.cond_iddoc, new.cond_prefdoc, new.cond_numdoc,
                new.cond_monto, new.cond_rtfte, new.cond_rtiva, new.cond_rtica, new.cond_descto, 'N', 'N', new.cond_comip, new.cond_sucursal, 0, NEW.cond_cobr);
            /* EL DETALLE DEL PAGO */
            IVAMONTO = 0;
            if (new.cond_tipodoc =  31) then
                select FACT_IVAMONTO from FACTURAS where FACT_ID = new.cond_iddoc into :IVAMONTO;
            insert into recibos_caja_pago (RECA_ID, RCPA_ITEM, FOPA_ID, RCPA_BANCO, RCPA_CUENTA, RCPA_NUMERO, RCPA_FECHA,
                RCPA_MONTO, RCPA_ANULADO, RCPA_TRANSMIT, RCPA_IVAMONTO)
                values(:IDR, :ITEM, new.fopa_id, new.cond_banco, new.cond_cuenta, new.cond_numero, :FEC,
                new.cond_monto + new.cond_exedente, 'N', 'N', :ivamonto);
            /* borre la contabilización */
            select enco_consec from comprobante_encabezado where enco_tiporef = 61 and enco_idref = :IDR into :consec;
            if (not consec is null) then
              delete from comprobante_detalle where enco_consec = :consec;
            delete from comprobante_encabezado where enco_tiporef = 61 and enco_idref = :IDR;
            /* CONTABILICE EL RECIBO */
            select max(INCJ_ID) from interfaz_caja where TIDO_COD = 61 and PREF_PRE = new.cond_prefrdc into :IDINT;
            execute procedure contabil_recicaja (new.cond_recid, :idint) returning_values (:ERROR, :VER, :IDC);
            if (ERROR = 0) then
                execute procedure CONTABILIZA_PENDIENTE (:IDC);
            end
        end
    end
end
^

SET TERM ; ^

/* 20140409 */
/* SOLO POR PREFIJO NO MIRE EL PUNTO DE VENTA EN INFORME FISCAL */
ALTER TABLE AUTORIZACIONES
ADD AUTO_MAQUINA T_CONCEPTO;

SET TERM ^ ;

CREATE OR ALTER procedure INFORME_DIARIO_VENTAS (
    FECHA date,
    PREFIJO varchar(4),
    AGRUPA char(1))
returns (
    SERVIDOR varchar(60),
    NUMINI varchar(8),
    NUMFIN varchar(8),
    NROFAC integer,
    HORAINI time,
    HORAFIN time,
    BASEFAC numeric(18,2),
    IVAFAC numeric(18,2),
    TOTALFAC numeric(18,2),
    NROITE integer,
    NRODEV integer,
    BASEDEV numeric(18,2),
    IVADEV numeric(18,2),
    TOTALDEV numeric(18,2),
    BASENETO numeric(18,2),
    IVANETO numeric(18,2),
    TOTALNETO numeric(18,2),
    GRUPOFAC varchar(20),
    GRUPONOM varchar(60),
    GRUPOCANTF integer,
    GRUPOBASEF numeric(18,2),
    GRUPODSCTOF numeric(18,2),
    GRUPOIVAP numeric(9,2),
    GRUPOIVAMF numeric(18,2),
    GRUPOTOTF numeric(18,2))
AS
declare variable I INTEGER;
declare variable TARIFA INTEGER;
begin
SELECT AUTO_MAQUINA FROM AUTORIZACIONES WHERE PREF_PRE = :PREFIJO INTO :SERVIDOR;
/* LAS VENTAS */
SELECT MIN(FACT_NUMERO), MAX(FACT_NUMERO), COUNT(FACT_ID)
    FROM FACTURAS WHERE FACT_FECHA = :FECHA AND ((PREF_PRE = :PREFIJO) or (:PREFIJO = ''))
    INTO :NUMINI, :NUMFIN, :NROFAC;
NUMINI = CAST(NUMINI AS INTEGER);
NUMFIN = CAST(NUMFIN AS INTEGER);
SELECT SUM(FACT_TOTAL - FACT_IVAMONTO + FACT_DEC2799), SUM(FACT_IVAMONTO), SUM(FACT_TOTAL)
    FROM FACTURAS WHERE FACT_FECHA = :FECHA AND ((PREF_PRE = :PREFIJO) or (:PREFIJO = '')) and FACT_ANULADO = 'N'
    INTO :BASENETO, :IVANETO, :TOTALNETO;
SELECT MIN(AUDI_HORA) FROM AUDITORIA WHERE TIDO_COD = 31 AND AUDI_COD = :PREFIJO || :NUMINI AND AUDI_OPER = 'I' INTO :HORAINI;
SELECT MAX(AUDI_HORA) FROM AUDITORIA WHERE TIDO_COD = 31 AND AUDI_COD = :PREFIJO || :NUMFIN AND AUDI_OPER = 'I' INTO :HORAFIN;
SELECT COUNT(FADE_ITEM), SUM(FADE_TOTAL-FADE_IVAMONTO), SUM(FADE_IVAMONTO), SUM(FADE_TOTAL)
    FROM facturas_detalle D, FACTURAS F
    WHERE D.FACT_ID = F.FACT_ID AND FACT_FECHA = :FECHA AND ((PREF_PRE = :PREFIJO) or (:PREFIJO = '')) and FACT_ANULADO = 'N' and substring(d.arti_cod from 1 FOR 2) <> '.t'
    INTO :nroite, :BASEFAC, :IVAFAC, :TOTALFAC;
if (nrofac is null) then
    nrofac = 0;
if (baseneto is null) then
    baseneto = 0;
if (ivaneto is null) then
    ivaneto = 0;
if (totalneto is null) then
    totalneto = 0;
if (nroite is null) then
    nroite = 0;
if (basefac is null) then
    basefac = 0;
if (ivafac is null) then
    ivafac = 0;
if (totalfac is null) then
    totalfac = 0;

if (AGRUPA = 'T') then
    BEGIN
    /* POR TARIFA DE IVA */
    FOR SELECT TAIV_PORC FROM TARIFA_IVA ORDER BY TAIV_PORC INTO :GRUPOIVAP DO
        BEGIN
        GRUPOFAC = GRUPOIVAP;
        SELECT TAIV_NOMBRE FROM TARIFA_IVA WHERE TAIV_PORC = :GRUPOIVAP INTO GRUPONOM;
        SELECT COUNT(D.fade_item), SUM((FADE_TOTAL-FADE_IVAMONTO)*FACT_FACTOR), SUM(FADE_IVAMONTO*FACT_FACTOR), SUM(FADE_TOTAL*FACT_FACTOR), SUM(FADE_TOTAL*(1-FACT_FACTOR))
            FROM facturas_detalle D, FACTURAS F
            WHERE D.FACT_ID = F.FACT_ID AND FACT_FECHA = :FECHA AND ((PREF_PRE = :PREFIJO) or (:PREFIJO = ''))
            AND FADE_IVAPORC = :GRUPOIVAP and FACT_ANULADO = 'N'
            INTO :GRUPOCANTF, GRUPOBASEF, :GRUPOIVAMF, :GRUPOTOTF, :GRUPODSCTOF;
        if (grupocantf is null) then
            grupocantf = 0;
        if (grupobasef is null) then
            grupobasef = 0;
        if (grupoivamf is null) then
            grupoivamf = 0;
        if (grupototf is null) then
            grupototf = 0;
        if (grupodsctof is null) then
            grupodsctof = 0;
        SUSPEND;
        END
    END
if (AGRUPA = 'G') then
    BEGIN
    /* POR GRUPO DE INVENTARIO */
    FOR SELECT GRUP_COD, GRUP_NOM FROM grupo ORDER BY GRUP_COD INTO :GRUPOFAC, :GRUPONOM
        DO
        BEGIN
        FOR SELECT COUNT(D.fade_item), SUM((FADE_TOTAL-FADE_IVAMONTO)*FACT_FACTOR), SUM(FADE_IVAMONTO*FACT_FACTOR), SUM(FADE_TOTAL*FACT_FACTOR), SUM(FADE_TOTAL*(1-FACT_FACTOR)), MAX(A.taiv_cod)
            FROM facturas_detalle D, FACTURAS F, ARTICULO A
            WHERE D.FACT_ID = F.FACT_ID AND FACT_FECHA = :FECHA AND ((PREF_PRE = :PREFIJO) or (:PREFIJO = ''))
            AND FACT_ANULADO = 'N' AND A.arti_cod = D.arti_cod AND A.grup_cod = :GRUPOFAC
            GROUP BY A.taiv_cod
            INTO :GRUPOCANTF, GRUPOBASEF, :GRUPOIVAMF, :GRUPOTOTF, :GRUPODSCTOF, :TARIFA
            DO
            BEGIN
            if (grupocantf is null) then
                grupocantf = 0;
            if (grupobasef is null) then
                grupobasef = 0;
            if (grupoivamf is null) then
                grupoivamf = 0;
            if (grupototf is null) then
                grupototf = 0;
            if (grupodsctof is null) then
                grupodsctof = 0;
            SELECT TAIV_PORC FROM tarifa_iva WHERE TAIV_COD = :TARIFA INTO :GRUPOIVAP;
            SUSPEND;
            END
        END
    END
if (AGRUPA = 'A') then
    BEGIN
    FOR SELECT COUNT(D.fade_item), SUM((FADE_TOTAL-FADE_IVAMONTO)*FACT_FACTOR), SUM(FADE_IVAMONTO*FACT_FACTOR), SUM(FADE_TOTAL*FACT_FACTOR), SUM(FADE_TOTAL*(1-FACT_FACTOR)), MAX(A.taiv_cod)
        FROM facturas_detalle D, FACTURAS F, ARTICULO A
        WHERE D.FACT_ID = F.FACT_ID AND FACT_FECHA = :FECHA AND ((PREF_PRE = :PREFIJO) or (:PREFIJO = ''))
        AND FACT_ANULADO = 'N' AND A.arti_cod = D.arti_cod AND A.grup_cod = :GRUPOFAC
        GROUP BY A.arti_cod
        INTO :GRUPOCANTF, GRUPOBASEF, :GRUPOIVAMF, :GRUPOTOTF, :GRUPODSCTOF, :TARIFA
        DO
        BEGIN
        if (grupocantf is null) then
            grupocantf = 0;
        if (grupobasef is null) then
            grupobasef = 0;
        if (grupoivamf is null) then
            grupoivamf = 0;
        if (grupototf is null) then
            grupototf = 0;
        if (grupodsctof is null) then
            grupodsctof = 0;
        SELECT TAIV_PORC FROM tarifa_iva WHERE TAIV_COD = :TARIFA INTO :GRUPOIVAP;
        SUSPEND;
        END
    END
end
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER procedure INFORME_DIARIO_VENTAS_FP (
    FECHA date,
    PREFIJO varchar(4))
returns (
    FORMAP integer,
    NOMFORMA varchar(30),
    CANTIDAD integer,
    TOTAL numeric(18,2))
AS
declare variable IDR INTEGER;
declare variable I INTEGER;
declare variable TOTALF NUMERIC(18,2);
declare variable TOTALR NUMERIC(18,2);
declare variable MONTO NUMERIC(18,2);
begin
FOR SELECT FOPA_ID, FOPA_NOM FROM formas_pago INTO :FORMAP, :nomforma
    DO
    BEGIN
    CANTIDAD = 0;
    TOTAL = 0;
    FOR SELECT R.RECA_ID, F.FACT_TOTAL, R.RECA_MONTO FROM FACTURAS F, RECIBOS_CAJA R, RECIBOS_CAJA_DETALLE D
        WHERE FACT_FECHA = :FECHA AND ((F.PREF_PRE = :PREFIJO) or (:PREFIJO = '')) and FACT_ANULADO = 'N' AND
        R.RECA_ID = D.RECA_ID AND RECA_FECHA = :FECHA AND RECA_ANULADO = 'N' AND D.RCDE_TIPODOC = 31 AND D.RCDE_IDDOC = F.FACT_ID
        INTO :IDR, :TOTALF, :TOTALR
        DO
        BEGIN
        SELECT count(RCPA_ITEM), SUM(RCPA_MONTO) FROM RECIBOS_CAJA_PAGO P
            WHERE RECA_ID = :IDR AND FOPA_ID = :FORMAP INTO :I, :MONTO;
        CANTIDAD = CANTIDAD + I;
        TOTAL = TOTAL + ROUND(MONTO * (TOTALF / TOTALR),2);
        END
    if (TOTAL <> 0) then
        suspend;
    END
end
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER procedure INFORME_DIARIO_VENTAS_TERM (
    FECHA date,
    PREFIJO varchar(4),
    AGRUPA char(1))
returns (
    TERMINAL varchar(20),
    NOMTERM varchar(60),
    CANTIDAD integer,
    BASE numeric(18,2),
    DESCTO numeric(18,2),
    IVAMONTO numeric(18,2),
    TOTAL numeric(18,2))
AS
begin
if (AGRUPA = 'I') then
    FOR SELECT MAX(AUDI_IPCLIENTE), COUNT(FACT_ID), SUM(FACT_TOTAL), SUM(FACT_IVAMONTO), SUM(FACT_DTOMONTO)
        FROM FACTURAS F, AUDITORIA A
        WHERE FACT_FECHA = :FECHA AND ((F.PREF_PRE = :PREFIJO) or (:PREFIJO = '')) and FACT_ANULADO = 'N' AND
        A.TIDO_COD = 31 AND AUDI_IDDOC = F.FACT_ID GROUP BY AUDI_IPCLIENTE
        INTO :TERMINAL, :CANTIDAD, :TOTAL, :IVAMONTO, :DESCTO
        DO
        BEGIN
        SELECT TERM_NOMBRE FROM TERMINALES_NOMBRES WHERE TERM_IP = :TERMINAL INTO :NOMTERM;
        suspend;
        END
if (AGRUPA = 'U') then
    FOR SELECT MAX(AUDI_USUARIO), COUNT(FACT_ID), SUM(FACT_TOTAL), SUM(FACT_IVAMONTO), SUM(FACT_DTOMONTO)
        FROM FACTURAS F, AUDITORIA A
        WHERE FACT_FECHA = :FECHA AND ((F.PREF_PRE = :PREFIJO) or (:PREFIJO = '')) and FACT_ANULADO = 'N' AND
        A.TIDO_COD = 31 AND AUDI_IDDOC = F.FACT_ID GROUP BY AUDI_USUARIO
        INTO :TERMINAL, :CANTIDAD, :TOTAL, :IVAMONTO, :DESCTO
        DO
        BEGIN
        NOMTERM = TERMINAL;
        suspend;
        END
if (AGRUPA = 'P') then
    FOR SELECT MAX(PTVT_ID), COUNT(FACT_ID), SUM(FACT_TOTAL), SUM(FACT_IVAMONTO), SUM(FACT_DTOMONTO)
        FROM FACTURAS F
        WHERE FACT_FECHA = :FECHA AND ((F.PREF_PRE = :PREFIJO) or (:PREFIJO = '')) and FACT_ANULADO = 'N'
        GROUP BY PTVT_ID
        INTO :TERMINAL, :CANTIDAD, :TOTAL, :IVAMONTO, :DESCTO
        DO
        BEGIN
        SELECT PTVT_NOM FROM PUNTO_VENTA WHERE PTVT_ID = :TERMINAL INTO :NOMTERM;
        suspend;
        END
end
^

SET TERM ; ^

UPDATE AUDITORIA SET AUDI_IPCLIENTE = 'SERVIDOR' WHERE AUDI_IPCLIENTE IS NULL;
COMMIT WORK;

/* 20140410 */
/* si hay codigos repetidos evitar el multiple rows ... */
SET TERM ^ ;

CREATE OR ALTER procedure CONSULTA_ARTICULOS_PRECIOS (
    CODIGO varchar(20),
    LISTA integer)
returns (
    ARTICULO varchar(20),
    DES varchar(60),
    GRUPO varchar(30),
    MARCA varchar(30),
    UNIDAD varchar(8),
    PRECIO numeric(18,2),
    IVA numeric(9,2),
    OBSERVACIONES blob sub_type 1 segment size 80,
    FOTO blob sub_type 0 segment size 80,
    PESO numeric(18,2),
    IVAMONTO numeric(18,2),
    CONSUMO numeric(18,2),
    TOTAL numeric(18,2),
    LARGO numeric(18,2),
    ALTO numeric(18,2),
    ANCHO numeric(18,2),
    PUM numeric(18,2))
AS
declare variable DIG INTEGER;
declare variable ITEMS INTEGER;
declare variable CODGRP VARCHAR(2);
declare variable CODMAR VARCHAR(3);
declare variable IVAINC VARCHAR(2);
BEGIN
select count(arti_cod) from BARRAS_ARTICULO WHERE COBA_COD = :CODIGO INTO :ITEMS;
if (ITEMS > 0) then
    SELECT first 1 ARTI_COD, COBA_DES, COBA_UNIDAD from BARRAS_ARTICULO
        WHERE COBA_COD = :CODIGO INTO :ARTICULO, :DES, :UNIDAD;
ELSE
    SELECT ARTI_COD, ARTI_DES, ARTI_UNIDAD FROM ARTICULO
        WHERE ARTI_COD = :CODIGO INTO :ARTICULO, :DES, :UNIDAD;

EXECUTE PROCEDURE LEE_CONFIGURACION ('FACTURACION', 'ARTICULOS', 'REDONDEO AL MULTIPLO DE DIEZ EN PRECIOS') returning_values (DIG);
FOR select grup_cod, taiv_porc, marc_cod, ARTI_OBS, ARTI_PESO, ARTI_LARGO, ARTI_ALTO, ARTI_ANCHO, ARTI_FOTO
    from articulo a, tarifa_iva t
    where a.taiv_cod = t.taiv_cod AND ESAR_COD = 'A' AND A.arti_cod = :ARTICULO
    INTO :CODGRP, :IVA, :CODMAR, :observaciones, :peso, :largo, :alto, :ancho, :foto
    do
    begin
    SELECT GRUP_NOM FROM GRUPO WHERE GRUP_COD = :CODGRP INTO :GRUPO;
    SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMAR INTO :MARCA;
    PRECIO = 0;
    SELECT prar_fijo PRECIO, PRAR_CONSUMO FROM precios_articulo
        WHERE arti_cod = :ARTICULO and lipr_cod = :LISTA INTO :PRECIO, :CONSUMO;
    EXECUTE PROCEDURE redondee(PRECIO, DIG) returning_values (PRECIO);
    IF (PESO <> 0) THEN
        PUM = PRECIO / PESO;
    ELSE
        PUM = 0;
    SELECT LIPR_MODIF FROM LISTA_PRECIOS WHERE LIPR_COD = :LISTA INTO :IVAINC;
    if (IVAINC = 'N') then
        IVAMONTO = PRECIO * IVA / 100;
    ELSE
        BEGIN
        IVAMONTO = (PRECIO - CONSUMO) * IVA / (100 + IVA);
        PRECIO = (PRECIO - CONSUMO) / (1 + (IVA/100));
        END
    TOTAL = PRECIO + IVAMONTO + CONSUMO;
    SUSPEND;
    END
END
^

SET TERM ; ^

/* 20140410B */
/* error si naturaleza debito */
SET TERM ^ ;

CREATE OR ALTER PROCEDURE MM_1003(
    INICIO CHAR(8),
    FINAL CHAR(8))
AS
declare variable IDCONC INTEGER;
declare variable CONCEPTO INTEGER;
declare variable TIPODOC INTEGER;
declare variable NIT VARCHAR(20) CHARACTER SET NONE;
declare variable DV CHAR(1) CHARACTER SET NONE;
declare variable APELLIDO1 VARCHAR(60) CHARACTER SET NONE;
declare variable APELLIDO2 VARCHAR(60) CHARACTER SET NONE;
declare variable NOMBRE1 VARCHAR(60) CHARACTER SET NONE;
declare variable NOMBRE2 VARCHAR(60) CHARACTER SET NONE;
declare variable RAZONSOCIAL VARCHAR(450) CHARACTER SET NONE;
declare variable DIRECCION VARCHAR(200) CHARACTER SET NONE;
declare variable DEPARTAMENTO CHAR(2) CHARACTER SET NONE;
declare variable MUNICIPIO CHAR(3) CHARACTER SET NONE;
declare variable PAGO NUMERIC(18,0);
declare variable RETENCION NUMERIC(18,0);
declare variable DEBITOS NUMERIC(18,0);
declare variable CREDITOS NUMERIC(18,0);
declare variable ITEM INTEGER;
declare variable TIPOID CHAR(1);
declare variable NATUR CHAR(1);
begin
ITEM = 0;
FOR select COME_ITEM, COME_RESPUESTA, COME_NATUR FROM configura_mediosmag WHERE COME_FORMATO = 10037
    INTO :idconc, :CONCEPTO, :NATUR
    DO
    BEGIN
    FOR SELECT MAX(D.TERC_NIT), SUM(CODE_DEBITO-CODE_CREDITO), SUM(CODE_DEBITO), SUM(CODE_CREDITO), SUM(CODE_BASE)
        FROM COMPROBANTE_DETALLE D, COMPROBANTE_ENCABEZADO E, mediosmag_cuentas M
        WHERE M.mmcu_item = :idconc AND SUBSTR(CUEN_COD,1,STRLEN(M.mmcu_cuenta)) = M.mmcu_cuenta AND
        E.ENCO_CONSEC = D.ENCO_CONSEC AND ENCO_FECHA >= :INICIO AND ENCO_FECHA <= :FINAL AND
        ((CODE_CREDITO <> 0) or (CODE_DEBITO <> 0))
        GROUP BY D.TERC_NIT
        INTO :NIT, :RETENCION, :DEBITOS, :CREDITOS, :PAGO
        DO
        BEGIN
        if (NATUR = 'D') then
            RETENCION = DEBITOS;
        if (NATUR = 'C') then
            RETENCION = CREDITOS;
        if (RETENCION > 0) then
            BEGIN
            SELECT TERC_NITCONTA, TERC_NOM, TERC_NOMBRE1, TERC_NOMBRE2, TERC_APELLIDO1, TERC_APELLIDO2, TERC_DV, TIID_CODIGO,
                TERC_DIR, SUBSTR(CIUD_COD,1,2), SUBSTR(CIUD_COD,3,5), IT.tiid_cod
                FROM TERCEROS T left outer join TIPO_ID IT on (T.TERC_TIPOID = IT.TIID_COD) WHERE TERC_NIT = :NIT
                INTO :NIT, :RAZONSOCIAL, :NOMBRE1, :NOMBRE2, :APELLIDO1, :APELLIDO2, :DV, :TIPODOC, :DIRECCION, :DEPARTAMENTO, :MUNICIPIO, :TIPOID;
            if (:TIPOID <> 'J') then
                RAZONSOCIAL = '';
            ITEM = ITEM + 1;
            insert into medios_magneticos_datos (memg_formato, memg_ano, memg_item, memg_concepto, memg_tipodoc, memg_nit, memg_dv,memg_apellido1, memg_apellido2, 
                memg_nombre1, memg_nombre2, memg_razonsocial, memg_direccion, memg_departamento, memg_municipio, memg_pago, memg_retencion)
                values (10037, substr(:inicio,1,4), :item,  :concepto, :tipodoc, :nit, :dv, :apellido1, :apellido2,
                :nombre1, :nombre2, :razonsocial, :direccion, :departamento, :municipio, :pago, :retencion);
            END
        END
    END
end^

SET TERM ; ^

/* 20140411 */
/* retecree independiente de la base de rtefte */
SET TERM ^ ;

CREATE OR ALTER procedure FACTURAR_CONCEPTOS (
    ID integer,
    NITINI varchar(20),
    NITFIN varchar(20),
    AGRINI varchar(20),
    AGRFIN varchar(20),
    AGRUPA integer,
    FECHA date,
    REFER varchar(60),
    FECINI date,
    FECFIN date,
    MORA numeric(9,4))
returns (
    PREFIJO varchar(4),
    NUMERO varchar(8),
    NIT varchar(20),
    SUCURSAL varchar(10),
    NOMBRE varchar(60),
    TOTAL numeric(18,2))
AS
declare variable IDF INTEGER;
declare variable IDC INTEGER;
declare variable VEND INTEGER;
declare variable PTVT INTEGER;
declare variable VENDINI INTEGER;
declare variable VENDFIN INTEGER;
declare variable ZONINI CHAR(2);
declare variable ZONFIN CHAR(2);
declare variable grpini INTEGER;
declare variable grpfin INTEGER;
declare variable DIAS INTEGER;
declare variable OBS VARCHAR(255);
declare variable IVAINC CHAR(1);
declare variable ITEM INTEGER;
declare variable ARTICULO VARCHAR(20);
declare variable DESCR VARCHAR(60);
declare variable CANT NUMERIC(18,2);
declare variable PRUNIT NUMERIC(18,2);
declare variable IVAP NUMERIC(18,2);
declare variable IVAM NUMERIC(18,2);
declare variable BASE NUMERIC(18,2);
declare variable RTFTE NUMERIC(9,2);
declare variable RTIVA NUMERIC(9,2);
declare variable RTICA NUMERIC(9,2);
declare variable RTCREE NUMERIC(9,2);
declare variable RTFTEM NUMERIC(18,2);
declare variable RTIVAM NUMERIC(18,2);
declare variable RTICAM NUMERIC(18,2);
declare variable RTCREEM NUMERIC(18,2);
declare variable UNIDAD VARCHAR(8);
declare variable BOD VARCHAR(2);
declare variable ERROR INTEGER;
declare variable VER CHAR(1);
declare variable factmes varchar(2);
declare variable GRPFM VARCHAR(3);
declare variable OK CHAR(1);
declare variable SALDO NUMERIC(18,2);
declare variable REDON INTEGER;
declare variable REDONT INTEGER;
begin
if (agrupa = 0) then
    BEGIN
    VENDINI = 0;
    VENDFIN = 999999;
    GRPINI = 0;
    GRPFIN = 999999;
    ZONINI = '';
    ZONFIN = 'zz';
    END
if (agrupa = 1) then
    BEGIN
    VENDINI = 0;
    VENDFIN = 999999;
    ZONINI = '';
    ZONFIN = 'zz';
    GRPINI = AGRINI;
    GRPFIN = AGRFIN;
    END
if (agrupa = 2) then
    BEGIN
    GRPINI = 0;
    GRPFIN = 999999;
    ZONINI = '';
    ZONFIN = 'zz';
    VENDINI = AGRINI;
    VENDFIN = AGRFIN;
    END
if (agrupa = 3) then
    BEGIN
    VENDINI = 0;
    VENDFIN = 999999;
    GRPINI = 0;
    GRPFIN = 999999;
    ZONINI = AGRINI;
    ZONFIN = AGRFIN;
    END
EXECUTE procedure lee_configuracion ('FACTURACION', 'FACTURAS', 'GRUPO DE MERCANCIA PARA CONTROL MENSUAL DE FACTURACION') returning_values (:GRPFM);
EXECUTE procedure lee_configuracion ('FACTURACION', 'FACTURAS', 'CONTROLAR FACTURACION MENSUAL POR CADA CLIENTE') returning_values (:factmes);
EXECUTE procedure lee_configuracion ('FACTURACION', 'ARTICULOS', 'REDONDEO AL MULTIPLO DE DIEZ EN PRECIOS') returning_values (:redon);
EXECUTE procedure lee_configuracion ('FACTURACION', 'DOCUMENTOS', 'REDONDEO AL MULTIPLO DE DIEZ EN TOTALES') returning_values (:redont);
SELECT FACC_PREF, FACC_VEND, FACC_DIAS, FACC_PTVT, FACC_OBS FROM factura_concepto WHERE FACC_ID = :ID
    INTO :prefijo, :vend, :dias, :ptvt, :obs;
SELECT BODE_COD FROM punto_venta WHERE PTVT_ID = :PTVT INTO :BOD;

FOR SELECT T.TERC_NIT, S.clcu_cod, S.clsu_nombre, S.vend_cod, C.clie_rtefte, C.clie_rteiva, C.clie_rteica, C.clie_rtftebase, C.clie_rtcree, clie_rticabase
    FROM TERCEROS T, CLIENTES C, CLIENTE_SUCURSALES S
    WHERE T.terc_nit = C.terc_nit AND T.TERC_NIT >= :NITINI AND T.TERC_NIT <= :NITFIN AND C.terc_nit = S.terc_nit AND
        C.vend_cod >= :vendini AND C.vend_cod <= :vendfin AND ((S.grca_cod is null and :grpini = 0 ) or (S.grca_cod >= :grpini AND S.grca_cod <= :grpfin)) AND
        ((c.zona_cod is null and :zonini = '') or (C.zona_cod >= :zonini AND C.zona_cod <= :zonfin))
    INTO :NIT, :sucursal, :NOMBRE, :VEND, :RTFTE, :RTIVA, :RTICA, :RTFTEM, :rtcree, :RTICAM
    DO
    BEGIN
    SELECT PREF_ACTUAL, PREF_IVAINC FROM PREFIJOS WHERE TIDO_COD = 31 AND PREF_PRE = :prefijo
        INTO :NUMERO, :IVAINC;
    select max(INVE_ID) FROM interfaz_ventas WHERE PREF_PRE = :prefijo AND TIDO_COD = 31 INTO :IDC;

    OK = 'S';
    if (FACTMES = 'SI') then
        begin
        if (EXISTS(SELECT FAME_IDFACT FROM FACTURAS_MES WHERE FAME_NIT = :nit AND FAME_SUCURSAL = :sucursal AND FAME_ANO = EXTRACT(YEAR FROM :FECHA) AND FAME_MES = EXTRACT(MONTH FROM :FECHA))) then
            OK = 'N';
        end
    if (OK = 'S') then
        BEGIN
        IDF = GEN_ID(id_factura, 1);
        INSERT INTO FACTURAS (FACT_ID, PTVT_ID, VEND_COD, TERC_NIT, AUTO_NUMERO, FACT_NUMERO, FACT_FECHA, FACT_DESPACHO,
            FACT_VENCE, FACT_IVAINC, FACT_COMIPORC, FACT_COMIMONTO, FACT_DTOPOR, FACT_DTOMONTO, FACT_ADICIONAL,
            FACT_IVAMONTO, FACT_RTFTEPOR, FACT_RTFTEMONTO, FACT_RTIVAPOR, FACT_RTIVAMONTO, FACT_RTICAPOR, FACT_RTICAMONTO,
            FACT_EXTRA, FACT_DTOFPOR, FACT_DTOFMONTO, FACT_DTOFFECHA, PREF_PRE, FACT_TRANSP, FACT_NOMCLIENTE, FACT_COTIZACI,
            FACT_PEDIDO, FACT_REMISION, FACT_ANULADO, FACT_TRANSMIT, FACT_TOTAL, BODE_COD, FACT_OBS, VEHI_COD, FACT_CONSOLIDA,
            FACT_RECIBIDO, FACT_USUARIO, FACT_SUCURSAL, NUMOK, COBR_COD, FACT_FACTOR, FACT_DETCLI, FACT_DETCLINOM,
            FACT_DTOIT1, FACT_DTOIT2, FACT_DTOIT3, FACT_TRM, FACT_FECINI, FACT_FECFIN, FACT_RTCREE, FACT_RTCREEM)
            VALUES (:IDF, :PTVT, :VEND, :NIT, NULL, :NUMERO, :FECHA, NULL, (:FECHA + :DIAS), :IVAINC,
            0, 0, 0, 0, 0, :IVAM, :RTFTE, :RTFTEM, :RTIVA, :RTIVAM, :RTICA, :RTICAM, 0, 0, 0, :FECHA, :PREFIJO, NULL,
            :NOMBRE, NULL, NULL, NULL, 'N', 'S', :TOTAL, :BOD, :OBS, NULL, NULL, 0, USER, :sucursal, 'N', :VEND, 1, NULL,
            NULL, NULL, NULL, NULL, 1, :fecini, :fecfin, :rtcree, :rtcreem);

        FOR SELECT FACI_ITEM, FC.ARTI_COD, FACI_CANT, FACI_PRUNIT, ARTI_UNIDAD, TAIV_PORC, FACI_DESC
            FROM factura_concepto_items FC, ARTICULO A, TARIFA_IVA I
            WHERE FC.arti_cod = A.arti_cod AND A.taiv_cod = I.taiv_cod AND FC.facc_id = :ID
            INTO :item, :articulo, :CANT, :prunit, :unidad, :ivap, :descr
            DO
            BEGIN
            /* busque el precio por cliente */
            if (EXISTS(SELECT ARTI_COD FROM ARTICULO WHERE ARTI_COD = :articulo AND GRUP_COD = :GRPFM)) then
                SELECT CLSU_VALORMES FROM cliente_sucursales WHERE TERC_NIT = :NIT AND CLCU_COD = :sucursal INTO :PRUNIT;

            if (IVAINC = 'S') then
                BEGIN
                IVAM = :CANT * :PRUNIT / (100 + :IVAP) * :IVAP;
                BASE = :CANT * :PRUNIT;
                END
            ELSE
                BEGIN
                IVAM = :CANT * :PRUNIT * IVAP / 100;
                BASE = :CANT * :PRUNIT + IVAM;
                END
            EXECUTE PROCEDURE redondee(IVAM, REDON) returning_values (IVAM);
            EXECUTE PROCEDURE redondee(BASE, REDON) returning_values (BASE);
            INSERT INTO FACTURAS_DETALLE (FACT_ID, FADE_ITEM, BODE_COD, ARTI_COD, FADE_CANT, FADE_UNIDAD, FADE_LOTE,
                FADE_PRUNIT, FADE_DTOPORC, FADE_DTOMONTO, FADE_IVAPORC, FADE_IVAMONTO, FADE_CONSUMO, FADE_FACTOR,
                FADE_DESC, FADE_OBS, FADE_CODBAR, FADE_REMISIONADO, FADE_DEVUELTO, FADE_TOTAL, LIPR_COD, FADE_REFERENCIA,
                FADE_ANULADO, FADE_TRANSMIT, FADE_FACTORLISTA, FADE_DTO1, FADE_DTO2, FADE_DTO3, FADE_DTOM1, FADE_DTOM2,
                FADE_DTOM3, FADE_CAJAS)
                VALUES (:IDF, :ITEM, :BOD, :articulo, :CANT, :UNIDAD, NULL, :prunit, 0, 0, :IVAP, :ivam, 0, 1,
                :descr, NULL, :articulo, 0, 0, :BASE, 1, :refer, 'N', 'N', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
            END

        /* SI HAY TASA DE MORA AGREGUE EL ITEM */
        execute procedure lee_configuracion('FACTURACION', 'FACTURAS', 'CODIGO DE ARTICULO PARA FACTURAR INTERESES DE MORA') returning_values (:articulo);
        if ((ARTICULO <> '') AND (MORA <> 0)) then
            BEGIN
            select sum(SALDO) from vencido_cliente (:nit, :fecini, '01', 'N') INTO :SALDO;
            PRUNIT = SALDO * MORA / 100;
            EXECUTE PROCEDURE redondee(PRUNIT, REDON) returning_values (PRUNIT);
            if (PRUNIT > 0) then
                BEGIN
                ivap = 0;
                IVAM = 0;
                SELECT ARTI_DES, ARTI_UNIDAD FROM ARTICULO WHERE ARTI_COD = :ARTICULO INTO :DESCR, :UNIDAD;
                INSERT INTO FACTURAS_DETALLE (FACT_ID, FADE_ITEM, BODE_COD, ARTI_COD, FADE_CANT, FADE_UNIDAD, FADE_LOTE,
                    FADE_PRUNIT, FADE_DTOPORC, FADE_DTOMONTO, FADE_IVAPORC, FADE_IVAMONTO, FADE_CONSUMO, FADE_FACTOR,
                    FADE_DESC, FADE_OBS, FADE_CODBAR, FADE_REMISIONADO, FADE_DEVUELTO, FADE_TOTAL, LIPR_COD, FADE_REFERENCIA,
                    FADE_ANULADO, FADE_TRANSMIT, FADE_FACTORLISTA, FADE_DTO1, FADE_DTO2, FADE_DTO3, FADE_DTOM1, FADE_DTOM2,
                    FADE_DTOM3, FADE_CAJAS)
                    VALUES (:IDF, :ITEM+1, :BOD, :articulo, 1, :UNIDAD, NULL, :prunit, 0, 0, :IVAP, :ivam, 0, 1,
                    :descr, NULL, :articulo, 0, 0, :PRUNIT, 1, NULL, 'N', 'N', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
                END
            END
        /* CALCULE EL TOTAL DE LA FACTURA XA EFECTOS DE IMPUESTOS */
        SELECT SUM(FADE_TOTAL), SUM(FADE_IVAMONTO) FROM facturas_detalle WHERE FACT_ID = :idf
            INTO :TOTAL, :IVAM;
        BASE = TOTAL - IVAM;
        if (BASE >= RTFTEM) then
            BEGIN
            RTFTEM = BASE * RTFTE / 100;
            RTIVAM = IVAM * RTIVA / 100;
            END
        ELSE
            BEGIN
            RTFTEM = 0;
            RTIVAM = 0;
            END
        RTCREEM = BASE * RTCREE / 100;
        if (BASE >= RTICAM) then
            RTICAM = BASE * RTICA / 1000;
        else
            RTICAM = 0;
        EXECUTE PROCEDURE redondee(TOTAL, REDONT) returning_values (TOTAL);
        EXECUTE PROCEDURE redondee(IVAM, REDONT) returning_values (IVAM);
        EXECUTE PROCEDURE redondee(RTFTEM, REDONT) returning_values (RTFTEM);
        EXECUTE PROCEDURE redondee(RTIVAM, REDONT) returning_values (RTIVAM);
        EXECUTE PROCEDURE redondee(RTICAM, REDONT) returning_values (RTICAM);
        EXECUTE PROCEDURE redondee(RTCREEM, REDONT) returning_values (RTCREEM);
        UPDATE FACTURAS SET FACT_TOTAL = :total,  FACT_IVAMONTO = :IVAM, FACT_RTFTEMONTO = :rtftem, 
            FACT_RTIVAMONTO = :rtivam, FACT_RTICAMONTO = :rticam, FACT_RTCREEM = :rtcreem, FACT_TRANSMIT = 'N' WHERE FACT_ID = :IDF;

        /* contabilice */
        execute procedure CONTABIL_FACTURA(:idf,  :IDC) returning_values (:ERROR, :VER, :IDC);
        EXECUTE procedure contabiliza_pendiente (:IDC);
        suspend;
        END
    END
end
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER TRIGGER FACTURAS_BI FOR FACTURAS
ACTIVE BEFORE INSERT POSITION 0
AS
declare variable NUMERO VARCHAR(8);
declare variable AUTOM CHAR(1);
declare variable EXISTE CHAR(1);
DECLARE VARIABLE VALCUPO CHAR(10);
declare variable DISPONIBLE NUMERIC(18,2);
declare variable OK CHAR(1);
declare variable SITOT CHAR(2);
declare variable CODCOBR INTEGER;
declare variable CODVEND INTEGER;
declare variable contado char(1);
declare variable BLOQAUTO CHAR(2);
declare variable FECCONTA VARCHAR(8);
declare variable FECBLO VARCHAR(8);
declare variable FECSERVER CHAR(2);
declare variable PREGTASA CHAR(2);
BEGIN
EXECUTE PROCEDURE LEE_CONFIGURACION('FACTURACION', 'DOCUMENTOS', 'INHABILITAR FECHA EN DOCUMENTOS') returning_values (:fecserver);
if (FECSERVER = 'SI') then
    NEW.fact_fecha = CAST ('NOW' AS DATE);
if (NEW.fact_anticipo IS NULL) then
    NEW.fact_anticipo = 0;
/* doble moneda */
if ((NEW.fact_trm IS NULL) or (NEW.fact_trm = 0)) then
    NEW.fact_trm = 1;

if ((new.fact_vence - new.fact_fecha) > 999) then
    exception fecha_no_valida 'El vencimiento es mayor a 999 días. Revise el vencimiento en el documento.';

EXECUTE PROCEDURE LEE_CONFIGURACION('GENERAL', 'GENERAL', 'PREGUNTAR TASA DE CAMBIO EN DOCUMENTOS DE CARTERA') returning_values (:pregtasa);
if (PREGTASA = 'SI') then
    BEGIN
    NEW.fact_dtomonto = NEW.fact_dtomonto * NEW.fact_trm;
    NEW.fact_comimonto = NEW.fact_comimonto * NEW.fact_trm;
    NEW.fact_adicional = NEW.fact_adicional * NEW.fact_trm;
    NEW.fact_ivamonto = NEW.fact_ivamonto * NEW.fact_trm;
    NEW.fact_rtftemonto = NEW.fact_rtftemonto * NEW.fact_trm;
    NEW.fact_rtivamonto = NEW.fact_rtivamonto * NEW.fact_trm;
    NEW.fact_rticamonto = NEW.fact_rticamonto * NEW.fact_trm;
    NEW.fact_rtcreem = NEW.fact_rtcreem * NEW.fact_trm;
    NEW.fact_extra = NEW.fact_extra * NEW.fact_trm;
    NEW.fact_dtofmonto = NEW.fact_dtofmonto * NEW.fact_trm;
    NEW.fact_total = NEW.fact_total * NEW.fact_trm;
    NEW.fact_dtoit1 = NEW.fact_dtoit1 * NEW.fact_trm;
    NEW.fact_dtoit2 = NEW.fact_dtoit2 * NEW.fact_trm;
    NEW.fact_dtoit3 = NEW.fact_dtoit3 * NEW.fact_trm;
    END
EXECUTE PROCEDURE LEE_CONFIGURACION('FACTURACION', 'POS', 'CAMBIAR FECHA DE BLOQUEO AUTOMATICAMENTE AL CAMBIAR FECHA DE LA FACTURA') RETURNING_VALUES (:bloqauto);
if (bloqauto = 'SI') then
    BEGIN
    EXECUTE PROCEDURE LEE_CONFIGURACION ('CONTABILIDAD', 'GENERAL', 'FECHA DE BLOQUEO') RETURNING_VALUES (:FECBLO);
    EXECUTE PROCEDURE fecha_a_conta (NEW.fact_fecha) returning_values (:FECCONTA);
    if (FECBLO > FECCONTA) then
        EXCEPTION CONTABILIDAD_BLOQUEADA 'La contabilidad esta bloqueada a ' || :fecblo;
    if (FECBLO < FECCONTA) then
        UPDATE CONFIGURACION
            SET CONF_VALOR = :FECCONTA
            WHERE (CONF_MODULO = 'CONTABILIDAD') AND (CONF_CATEGORIA = 'GENERAL') AND (CONF_PROPIEDAD = 'FECHA DE BLOQUEO');
    END
OK = 'S';
EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'ACCION A TOMAR SI EL CUPO DE CREDITO ES INSUFICIENTE') RETURNING_VALUES (:VALCUPO);
select auto_contado, auto_numero from autorizaciones
    where pref_pre = new.pref_pre and tido_cod = 31 AND auto_inicial <= new.fact_numero and auto_final >= new.fact_numero and auto_fecha <= new.fact_fecha and auto_vence >= new.fact_fecha
    into :contado, new.auto_numero;
if (contado='N') then
    BEGIN
    IF (VALCUPO = 'PROHIBIR') THEN
        BEGIN
        OK = 'N';
        /* VERIFIQUE EL CUPO DE CREDITO */
        execute procedure cupo_disponible(new.TERC_NIT, NEW.fact_fecha, NEW.fact_sucursal) returning_values (:DISPONIBLE);
        if (DISPONIBLE >= (NEW.FACT_TOTAL-NEW.fact_recibido)) then
            OK = 'S';
        END
    END
else
    BEGIN
    /* ASEGURECE QUE QUEDA SIN DIAS DE CREDITO */
    NEW.fact_vence = NEW.fact_fecha;
    END
IF (OK = 'S') THEN
  begin
  /* calcule la comision */
  EXECUTE PROCEDURE LEE_CONFIGURACION('FACTURACION', 'VENDEDORES', 'COMISIONES EN VENTA INCLUYENDO IMPUESTOS') returning_values (:SITOT);
  if ((NEW.fact_comiporc IS NULL) or (NEW.fact_comiporc = 0)) THEN
    BEGIN
    if (SITOT = 'SI') then
      SELECT MAX(COMI_PORC) FROM comisiones WHERE VEND_COD = NEW.vend_cod AND
        COMI_INICIAL <= NEW.fact_total AND COMI_FINAL >= NEW.fact_total
        INTO NEW.fact_comiporc;
    else
      SELECT MAX(COMI_PORC) FROM comisiones WHERE VEND_COD = NEW.vend_cod AND
        COMI_INICIAL <= (NEW.fact_total -NEW.fact_ivamonto) AND COMI_FINAL >= (NEW.fact_total -NEW.fact_ivamonto)
        INTO NEW.fact_comiporc;
    if (NEW.fact_comiporc IS NULL) then
        NEW.fact_comiporc = 0;
    END
  if (SITOT = 'SI') then
      NEW.fact_comimonto = NEW.fact_total * NEW.fact_comiporc / 100;
  ELSE
      NEW.fact_comimonto = (NEW.fact_total -NEW.fact_ivamonto) * NEW.fact_comiporc / 100;

  if (NEW.numok = 'N') then
    BEGIN
    /* Actualice el contador del prefijo */
    SELECT PREF_ACTUAL, PREF_AUTO FROM PREFIJOS WHERE TIDO_COD = 31 AND PREF_PRE = NEW.PREF_PRE INTO :NUMERO, :AUTOM;
    /* ACTUALICE EL NUMERO EN ENCABEZADO  */
    if (AUTOM = 'S') then
        BEGIN
        NEW.FACT_NUMERO = NUMERO;
        NUMERO = CAST((CAST(NUMERO AS INTEGER) + 1) AS CHAR(8));
        UPDATE PREFIJOS
            SET PREF_ACTUAL = :NUMERO
            WHERE TIDO_COD = 31 AND PREF_PRE = NEW.PREF_PRE;
        END
    ELSE
        BEGIN
        if (CAST(NUMERO AS INTEGER) = CAST(NEW.FACT_NUMERO AS INTEGER)) then
            UPDATE PREFIJOS
                SET PREF_ACTUAL = CAST((CAST(PREF_ACTUAL AS INTEGER) + 1) AS CHAR(8))
                WHERE TIDO_COD = 31 AND PREF_PRE = NEW.PREF_PRE;
        END
    EXECUTE PROCEDURE COMPLETA_CEROS8 (NEW.FACT_numero) returning_values (NEW.FACT_numero);
    NEW.numok = 'S';
    END
  /* Verifique que el numero no existe previamente */
  EXISTE = 'N';
  SELECT 'S' FROM FACTURAS WHERE PREF_PRE = NEW.PREF_PRE AND FACT_NUMERO = NEW.FACT_NUMERO INTO :EXISTE;
  if (EXISTE = 'S') then
    EXCEPTION DOCUMENTO_REGISTRADO 'Ya existe una factura con el número ' || new.pref_pre || new.fact_numero;
  end
else
  begin
  EXCEPTION CUPO_INSUFICIENTE;
  end

select COBR_COD, VEND_COD FROM CLIENTE_SUCURSALES WHERE TERC_NIT = NEW.terc_nit AND CLCU_COD = NEW.fact_sucursal INTO :CODCOBR, CODVEND;
if (NEW.vend_cod IS NULL) then
    NEW.vend_cod = :CODVEND;
if (NEW.cobr_cod IS NULL) then
    BEGIN
    EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'COMISIONES', 'UNIFICAR CODIGOS DE VENDEDORES Y COBRADORES') returning_values (:SITOT);
    if ((SITOT = 'SI') AND (NEW.vend_cod IS NOT NULL)) then
        NEW.cobr_cod = NEW.vend_cod;
    else
        NEW.cobr_cod = :CODCOBR;
    END
if ((new.FACT_TOTAL-new.FACT_IVAMONTO+new.FACT_DTOMONTO-new.FACT_ADICIONAL) = 0) then
    NEW.FACT_FACTOR = 1;
else
    NEW.FACT_FACTOR = (new.FACT_TOTAL-new.FACT_IVAMONTO)/(new.FACT_TOTAL-new.FACT_IVAMONTO+new.FACT_DTOMONTO-new.FACT_ADICIONAL);
if (new.fact_vence < new.fact_fecha) then
    new.fact_vence = new.fact_fecha;
if (NEW.fact_dec2799 IS NULL) then
    NEW.fact_dec2799 = 0;
END
^

SET TERM ; ^

/* 20140411b */
/* rtcree mal usaba variable de retfte */
SET TERM ^ ;

CREATE OR ALTER procedure MM_1001_9 (
    INICIO char(8),
    FINAL char(8))
AS
declare variable IDCONC INTEGER;
declare variable CONCEPTO INTEGER;
declare variable TIPODOC INTEGER;
declare variable NIT VARCHAR(20) CHARACTER SET NONE;
declare variable DV CHAR(1) CHARACTER SET NONE;
declare variable APELLIDO1 VARCHAR(60) CHARACTER SET NONE;
declare variable APELLIDO2 VARCHAR(60) CHARACTER SET NONE;
declare variable NOMBRE1 VARCHAR(60) CHARACTER SET NONE;
declare variable NOMBRE2 VARCHAR(60) CHARACTER SET NONE;
declare variable RAZONSOCIAL VARCHAR(450) CHARACTER SET NONE;
declare variable DIRECCION VARCHAR(200) CHARACTER SET NONE;
declare variable SIMPLIFICA CHAR(1) CHARACTER SET NONE;
declare variable DEPARTAMENTO CHAR(2) CHARACTER SET NONE;
declare variable MUNICIPIO CHAR(3) CHARACTER SET NONE;
declare variable PAIS CHAR(3) CHARACTER SET NONE;
declare variable PAGO NUMERIC(18,0);
declare variable PAGOND NUMERIC(18,0);
declare variable IVA NUMERIC(18,0);
declare variable IVAND NUMERIC(18,0);
declare variable RTFTE NUMERIC(18,0);
declare variable RTFTEA NUMERIC(18,0);
declare variable RTIVAC NUMERIC(18,0);
declare variable RTIVAS NUMERIC(18,0);
declare variable RTIVAND NUMERIC(18,0);
declare variable RTCREE NUMERIC(18,0);
declare variable RTCREEA NUMERIC(18,0);
declare variable DEBITOS NUMERIC(18,2);
declare variable CREDITOS NUMERIC(18,2);
declare variable MINIMO NUMERIC(18,2);
declare variable MENORCUANTIA NUMERIC(18,2);
declare variable MENORPAGOND NUMERIC(18,2);
declare variable MENORRTF NUMERIC(18,2);
declare variable MENORRTFA NUMERIC(18,2);
declare variable MENORRTC NUMERIC(18,2);
declare variable MENORRTCA NUMERIC(18,2);
declare variable MENORIVA NUMERIC(18,2);
declare variable MENORIVAND NUMERIC(18,2);
declare variable MENORRTIVAC NUMERIC(18,2);
declare variable MENORRTIVAS NUMERIC(18,2);
declare variable MENORRTIVAN NUMERIC(18,2);
declare variable TOTALTERC NUMERIC(18,2);
declare variable TOTALTDB NUMERIC(18,2);
declare variable TOTALTCR NUMERIC(18,2);
declare variable ITEM integer;
declare variable DIRMENOR VARCHAR(200) CHARACTER SET NONE;
declare variable DEPMENOR CHAR(2) CHARACTER SET NONE;
declare variable MUNMENOR CHAR(3) CHARACTER SET NONE;
declare variable PAISMENOR CHAR(3) CHARACTER SET NONE;
declare variable NATUR CHAR(1);
declare variable TIPOID CHAR(1);
begin
EXECUTE PROCEDURE lee_configuracion('CONTABILIDAD', 'GENERAL', 'NIT COMPAÑIA') returning_values (:NIT);
SELECT TERC_DIR, SUBSTR(CIUD_COD,1,2), SUBSTR(CIUD_COD,3,5), PAIS_ID FROM TERCEROS WHERE TERC_NIT = :NIT
    INTO :dirmenor, :depmenor, :munmenor, :paismenor;
ITEM = 0;
FOR SELECT COME_ITEM, COME_RESPUESTA, COME_MINIMO, COME_NATUR FROM CONFIGURA_MEDIOSMAG
    WHERE COME_FORMATO = '10019' ORDER BY COME_ITEM INTO :idconc, :CONCEPTO , :MINIMO, :NATUR
    DO
    BEGIN
    MENORCUANTIA = 0;
    MENORPAGOND = 0;
    MENORRTF = 0;
    MENORRTFA = 0;
    MENORIVA = 0;
    MENORIVAND = 0;
    MENORRTIVAC = 0;
    MENORRTIVAS = 0;
    MENORRTIVAN = 0;
    FOR SELECT MAX(D.TERC_NIT), SUM(CODE_DEBITO-CODE_CREDITO), SUM(CODE_DEBITO), SUM(CODE_CREDITO)
        FROM COMPROBANTE_DETALLE D, COMPROBANTE_ENCABEZADO E, mediosmag_cuentas M
        WHERE M.mmcu_item = :idconc AND SUBSTR(CUEN_COD,1,STRLEN(M.mmcu_cuenta)) = M.mmcu_cuenta AND m.mmcu_cuenta <> '' AND
        E.ENCO_CONSEC = D.ENCO_CONSEC AND ENCO_FECHA >= :INICIO AND ENCO_FECHA <= :FINAL AND
        ((CODE_CREDITO <> 0) or (CODE_DEBITO <> 0))
        GROUP BY D.TERC_NIT
        INTO :NIT, :PAGO, :debitos, :creditos
        DO
        BEGIN
        /* TOTAL POR TERCERO */
        SELECT SUM(CODE_DEBITO-CODE_CREDITO), SUM(CODE_DEBITO), SUM(CODE_CREDITO) FROM COMPROBANTE_DETALLE D, COMPROBANTE_ENCABEZADO E, mediosmag_cuentas M, configura_mediosmag C
            WHERE C.come_formato = 10019 AND C.come_item = M.mmcu_item AND SUBSTR(D.CUEN_COD,1,STRLEN(M.mmcu_cuenta)) = M.mmcu_cuenta AND m.mmcu_cuenta <> '' AND
            E.ENCO_CONSEC = D.ENCO_CONSEC AND ENCO_FECHA >= :inicio AND ENCO_FECHA <= :final AND
            D.TERC_NIT = :NIT INTO :TOTALTERC, :TOTALTDB, :TOTALTCR;
        if (totalterc is null) then
            totalterc = 0;
        if (totaltdb is null) then
            totaltdb = 0;
        if (totaltcr is null) then
            totaltcr = 0;
        if (NATUR = 'D') then
            BEGIN
            pago = debitos;
            TOTALTERC = TOTALTDB;
            END
        if (NATUR = 'C') then
            BEGIN
            pago = creditos;
            TOTALTERC = TOTALTCR;
            END
        if ((TOTALTERC >= :MINIMO) AND (PAGO > 0)) then
            BEGIN
            SELECT TERC_NOM, TERC_NOMBRE1, TERC_NOMBRE2, TERC_APELLIDO1, TERC_APELLIDO2, TERC_DV, TERC_SIMPLIFICA,
                TERC_DIR, SUBSTR(CIUD_COD,1,2), SUBSTR(CIUD_COD,3,5), PAIS_ID, T.TERC_TIPOID
                FROM TERCEROS T WHERE TERC_NIT = :NIT
                INTO :RAZONSOCIAL, :NOMBRE1, :NOMBRE2, :APELLIDO1, :APELLIDO2, :DV, :SIMPLIFICA,
                :DIRECCION, :DEPARTAMENTO, :MUNICIPIO, :PAIS, :TIPOID;
            select TIID_CODIGO FROM TIPO_ID WHERE TIID_COD = :TIPOID INTO :TIPODOC;
            if (:TIPOID <> 'J') then
                RAZONSOCIAL = '';
            /* LOS NO DEDUCIBLES */
            SELECT SUM(CODE_DEBITO-CODE_CREDITO), SUM(CODE_DEBITO), SUM(CODE_CREDITO)
            FROM COMPROBANTE_DETALLE D, COMPROBANTE_ENCABEZADO E, mediosmag_cuentas M
            WHERE M.mmcu_item = :idconc AND SUBSTR(CUEN_COD,1,STRLEN(M.mmcu_cuenta)) = M.mmcu_cuenta AND m.mmcu_cuenta <> '' AND 
            E.ENCO_CONSEC = D.ENCO_CONSEC AND ENCO_FECHA >= :INICIO AND ENCO_FECHA <= :FINAL AND D.TERC_NIT = :NIT AND
            ((CODE_CREDITO <> 0) or (CODE_DEBITO <> 0)) AND D.code_descontable = 'N' INTO :PAGOND, :debitos, :creditos;
            if (NATUR = 'D') then
                pagond = debitos;
            if (NATUR = 'C') then
                pagond = creditos;
            if (PAGOND IS NULL) then
                PAGOND = 0;
            PAGO = PAGO - PAGOND;
            /* EL IVA DESCONTABLE */
            SELECT SUM(CODE_DEBITO-CODE_CREDITO), SUM(CODE_DEBITO), SUM(CODE_CREDITO)
            FROM COMPROBANTE_DETALLE D, COMPROBANTE_ENCABEZADO E, mediosmag_cuentas M
            WHERE M.mmcu_item = :idconc AND SUBSTR(CUEN_COD,1,STRLEN(M.mmcu_ctaiva)) = M.mmcu_ctaiva AND D.code_descontable = 'S' AND m.mmcu_ctaiva <> '' AND
            E.ENCO_CONSEC = D.ENCO_CONSEC AND ENCO_FECHA >= :INICIO AND ENCO_FECHA <= :FINAL AND D.TERC_NIT = :NIT AND
            ((CODE_CREDITO <> 0) or (CODE_DEBITO <> 0)) INTO :iva, :debitos, :creditos;
            if (NATUR = 'D') then
                IVA = debitos;
            if (NATUR = 'C') then
                IVA = creditos;
            if (IVA IS NULL) then
                IVA = 0;
            if (exists (select memg_nit from medios_magneticos_datos where memg_formato = 10019 and memg_ano = substr(:inicio,1,4)
                and memg_nit = :nit and memg_iva = :iva)) then
                IVA = 0;
            /* EL IVA NO DESCONTABLE */
            SELECT SUM(CODE_DEBITO-CODE_CREDITO), SUM(CODE_DEBITO), SUM(CODE_CREDITO)
            FROM COMPROBANTE_DETALLE D, COMPROBANTE_ENCABEZADO E, mediosmag_cuentas M
            WHERE M.mmcu_item = :idconc AND SUBSTR(CUEN_COD,1,STRLEN(M.mmcu_ctaivand)) = M.mmcu_ctaivand AND D.code_descontable = 'N' AND m.mmcu_ctaivand <> '' AND
            E.ENCO_CONSEC = D.ENCO_CONSEC AND ENCO_FECHA >= :INICIO AND ENCO_FECHA <= :FINAL AND D.TERC_NIT = :NIT AND
            ((CODE_CREDITO <> 0) or (CODE_DEBITO <> 0)) INTO :ivand, :debitos, :creditos;
            if (NATUR = 'D') then
                IVAND = debitos;
            if (NATUR = 'C') then
                IVAND = creditos;
            if (IVAND IS NULL) then
                IVAND = 0;
            if (exists (select memg_nit from medios_magneticos_datos where memg_formato = 10019 and memg_ano = substr(:inicio,1,4)
                and memg_nit = :nit and memg_ivand = :ivand)) then
                IVAND = 0;

            /* LAS RETENCIONES RENTA */
            SELECT SUM(CODE_CREDITO-CODE_DEBITO), SUM(CODE_DEBITO), SUM(CODE_CREDITO)
            FROM COMPROBANTE_DETALLE D, COMPROBANTE_ENCABEZADO E, mediosmag_cuentas M
            WHERE M.mmcu_item = :idconc AND SUBSTR(CUEN_COD,1,STRLEN(M.mmcu_ctartf)) = M.mmcu_ctartf AND D.code_descontable = 'S' AND m.mmcu_ctartf <> '' AND
            E.ENCO_CONSEC = D.ENCO_CONSEC AND ENCO_FECHA >= :INICIO AND ENCO_FECHA <= :FINAL AND D.TERC_NIT = :NIT AND
            ((CODE_CREDITO <> 0) or (CODE_DEBITO <> 0)) INTO :RTFTE, :debitos, :creditos;
            if (NATUR = 'D') then
                RTFTE = debitos;
            if (NATUR = 'C') then
                RTFTE = creditos;
            if (RTFTE IS NULL) then
                RTFTE = 0;
            if (exists (select memg_nit from medios_magneticos_datos where memg_formato = 10019 and memg_ano = substr(:inicio,1,4)
                and memg_nit = :nit and memg_retencion = :rtfte)) then
                RTFTE = 0;
            
            /* LAS RETENCIONES RENTA ASUMIDAS */
            SELECT SUM(CODE_CREDITO-CODE_DEBITO), SUM(CODE_DEBITO), SUM(CODE_CREDITO)
            FROM COMPROBANTE_DETALLE D, COMPROBANTE_ENCABEZADO E, mediosmag_cuentas M
            WHERE M.mmcu_item = :idconc AND SUBSTR(CUEN_COD,1,STRLEN(M.mmcu_ctartf)) = M.mmcu_ctartf AND D.code_descontable = 'N' AND m.mmcu_ctartf <> '' AND
            E.ENCO_CONSEC = D.ENCO_CONSEC AND ENCO_FECHA >= :INICIO AND ENCO_FECHA <= :FINAL AND D.TERC_NIT = :NIT AND
            ((CODE_CREDITO <> 0) or (CODE_DEBITO <> 0)) INTO :RTFTEA, :debitos, :creditos;
            if (NATUR = 'D') then
                RTFTEA = debitos;
            if (NATUR = 'C') then
                RTFTEA = creditos;
            if (RTFTEA IS NULL) then
                RTFTEA = 0;
            if (exists (select memg_nit from medios_magneticos_datos where memg_formato = 10019 and memg_ano = substr(:inicio,1,4)
                and memg_nit = :nit and memg_reteasum = :rtftea)) then
                RTFTEA = 0;
            /* LAS RETENCIONES IVA */
            SELECT SUM(CODE_CREDITO-CODE_DEBITO), SUM(CODE_DEBITO), SUM(CODE_CREDITO)
            FROM COMPROBANTE_DETALLE D, COMPROBANTE_ENCABEZADO E, mediosmag_cuentas M
            WHERE M.mmcu_item = :idconc AND SUBSTR(CUEN_COD,1,STRLEN(M.mmcu_ctartiva)) = M.mmcu_ctartiva AND m.mmcu_ctartiva <> '' AND
            E.ENCO_CONSEC = D.ENCO_CONSEC AND ENCO_FECHA >= :INICIO AND ENCO_FECHA <= :FINAL AND D.TERC_NIT = :NIT AND
            ((CODE_CREDITO <> 0) or (CODE_DEBITO <> 0)) INTO :RTIVAC, :debitos, :creditos;
            if (NATUR = 'D') then
                RTIVAC = debitos;
            if (NATUR = 'C') then
                RTIVAC = creditos;
            if (RTIVAC IS NULL) then
                RTIVAC = 0;
            if (SIMPLIFICA = 'S') then
                BEGIN
                RTIVAS = RTIVAC;
                RTIVAC = 0;
                rtivand = 0;
                END
            ELSE
                if (pais <> '169') then
                    BEGIN
                    rtivand = RTIVAC;
                    RTIVAC = 0;
                    RTIVAS = 0;
                    END
                ELSE
                    begin
                    RTIVAS = 0;
                    rtivand = 0;
                    end
            if (exists (select memg_nit from medios_magneticos_datos where memg_formato = 10019 and memg_ano = substr(:inicio,1,4)
                and memg_nit = :nit and ((memg_retivacomun = :rtivac) or (memg_retivasimp = :rtivas) or (memg_retivand = :rtivand)))) then
                BEGIN
                rtivand = 0;
                RTIVAC = 0;
                RTIVAS = 0;
                END
            /* LA RETENCION CREE */
            SELECT SUM(CODE_CREDITO-CODE_DEBITO), SUM(CODE_DEBITO), SUM(CODE_CREDITO)
            FROM COMPROBANTE_DETALLE D, COMPROBANTE_ENCABEZADO E, mediosmag_cuentas M
            WHERE M.mmcu_item = :idconc AND SUBSTR(CUEN_COD,1,STRLEN(M.mmcu_ctarcree)) = M.mmcu_ctarcree AND D.code_descontable = 'S' AND m.mmcu_ctarcree <> '' AND
            E.ENCO_CONSEC = D.ENCO_CONSEC AND ENCO_FECHA >= :INICIO AND ENCO_FECHA <= :FINAL AND D.TERC_NIT = :NIT AND
            ((CODE_CREDITO <> 0) or (CODE_DEBITO <> 0)) INTO :rtcree, :debitos, :creditos;
            if (NATUR = 'D') then
                rtcree = debitos;
            if (NATUR = 'C') then
                rtcree = creditos;
            if (rtcree IS NULL) then
                rtcree = 0;
            if (exists (select memg_nit from medios_magneticos_datos MD where memg_formato = 10019 and memg_ano = substr(:inicio,1,4)
                and memg_nit = :nit and MD.memg_retcree = :rtcree)) then
                rtcree = 0;
            
            /* LAS RETENCIONES RENTA ASUMIDAS */
            SELECT SUM(CODE_CREDITO-CODE_DEBITO), SUM(CODE_DEBITO), SUM(CODE_CREDITO)
            FROM COMPROBANTE_DETALLE D, COMPROBANTE_ENCABEZADO E, mediosmag_cuentas M
            WHERE M.mmcu_item = :idconc AND SUBSTR(CUEN_COD,1,STRLEN(M.mmcu_ctartcreeas)) = M.mmcu_ctartcreeas AND D.code_descontable = 'N' AND m.mmcu_ctartcreeas <> '' AND
            E.ENCO_CONSEC = D.ENCO_CONSEC AND ENCO_FECHA >= :INICIO AND ENCO_FECHA <= :FINAL AND D.TERC_NIT = :NIT AND
            ((CODE_CREDITO <> 0) or (CODE_DEBITO <> 0)) INTO :rtcreea, :debitos, :creditos;
            if (NATUR = 'D') then
                rtcreea = debitos;
            if (NATUR = 'C') then
                rtcreea = creditos;
            if (rtcreea IS NULL) then
                rtcreea = 0;
            if (exists (select memg_nit from medios_magneticos_datos MD where memg_formato = 10019 and memg_ano = substr(:inicio,1,4)
                and memg_nit = :nit and MD.memg_rasumc = :rtcreea)) then
                rtcreea = 0;

            ITEM = ITEM + 1;
            insert into medios_magneticos_datos (memg_formato, memg_ano, memg_item, memg_concepto, memg_tipodoc, memg_nit, memg_dv,memg_apellido1, memg_apellido2,
                memg_nombre1, memg_nombre2, memg_razonsocial, memg_direccion, memg_departamento, memg_municipio, memg_pago, memg_pais, memg_pagond,
                memg_iva, memg_ivand, memg_retencion, memg_reteasum, memg_retivacomun, memg_retivasimp, memg_retivand, memg_retcree, memg_rasumc)
                values (10019, substr(:inicio,1,4), :item,  :concepto, :tipodoc, :nit, :dv, :apellido1, :apellido2,
                :nombre1, :nombre2, :razonsocial, :direccion, :departamento, :municipio, :pago, :pais, :pagond,
                :iva, :ivand, :rtfte, :rtftea, :rtivac, :rtivas, :rtivand, :rtcree, :rtcreea);
            END
        ELSE
            BEGIN
            /* LAS CUANTIAS MENORES */
            SELECT SUM(CODE_DEBITO-CODE_CREDITO), SUM(CODE_DEBITO), SUM(CODE_CREDITO)
            FROM COMPROBANTE_DETALLE D, COMPROBANTE_ENCABEZADO E, mediosmag_cuentas M
            WHERE M.mmcu_item = :idconc AND SUBSTR(CUEN_COD,1,STRLEN(M.mmcu_cuenta)) = M.mmcu_cuenta AND m.mmcu_cuenta <> '' AND 
            E.ENCO_CONSEC = D.ENCO_CONSEC AND ENCO_FECHA >= :INICIO AND ENCO_FECHA <= :FINAL AND D.TERC_NIT = :NIT AND
            ((CODE_CREDITO <> 0) or (CODE_DEBITO <> 0)) AND D.code_descontable = 'N' INTO :PAGOND, :debitos, :creditos;
            if (NATUR = 'D') then
                pagond = debitos;
            if (NATUR = 'C') then
                pagond = creditos;
            if (PAGOND IS NULL) then
                PAGOND = 0;
            PAGO = PAGO - PAGOND;
            MENORCUANTIA = MENORCUANTIA + PAGO;
            MENORPAGOND = MENORPAGOND + PAGOND;
            /* EL IVA DESCONTABLE */
            SELECT SUM(CODE_DEBITO-CODE_CREDITO), SUM(CODE_DEBITO), SUM(CODE_CREDITO)
            FROM COMPROBANTE_DETALLE D, COMPROBANTE_ENCABEZADO E, mediosmag_cuentas M
            WHERE M.mmcu_item = :idconc AND SUBSTR(CUEN_COD,1,STRLEN(M.mmcu_ctaiva)) = M.mmcu_ctaiva AND D.code_descontable = 'S' AND m.mmcu_ctaiva <> '' AND
            E.ENCO_CONSEC = D.ENCO_CONSEC AND ENCO_FECHA >= :INICIO AND ENCO_FECHA <= :FINAL AND D.TERC_NIT = :NIT AND
            ((CODE_CREDITO <> 0) or (CODE_DEBITO <> 0)) INTO :iva, :debitos, :creditos;
            if (NATUR = 'D') then
                IVA = debitos;
            if (NATUR = 'C') then
                IVA = creditos;
            if (IVA IS NULL) then
                IVA = 0;
            MENORIVA = MENORIVA + IVA;
            /* EL IVA NO DESCONTABLE */
            SELECT SUM(CODE_DEBITO-CODE_CREDITO), SUM(CODE_DEBITO), SUM(CODE_CREDITO)
            FROM COMPROBANTE_DETALLE D, COMPROBANTE_ENCABEZADO E, mediosmag_cuentas M
            WHERE M.mmcu_item = :idconc AND SUBSTR(CUEN_COD,1,STRLEN(M.mmcu_ctaivand)) = M.mmcu_ctaivand AND D.code_descontable = 'N' AND m.mmcu_ctaivand <> '' AND
            E.ENCO_CONSEC = D.ENCO_CONSEC AND ENCO_FECHA >= :INICIO AND ENCO_FECHA <= :FINAL AND D.TERC_NIT = :NIT AND
            ((CODE_CREDITO <> 0) or (CODE_DEBITO <> 0)) INTO :ivand, :debitos, :creditos;
            if (NATUR = 'D') then
                IVAND = debitos;
            if (NATUR = 'C') then
                IVAND = creditos;
            if (IVAND IS NULL) then
                IVAND = 0;
            MENORIVAND = MENORIVAND + IVAND;
            /* LAS RETENCIONES RENTA */
            SELECT SUM(CODE_CREDITO-CODE_DEBITO), SUM(CODE_DEBITO), SUM(CODE_CREDITO)
            FROM COMPROBANTE_DETALLE D, COMPROBANTE_ENCABEZADO E, mediosmag_cuentas M
            WHERE M.mmcu_item = :idconc AND SUBSTR(CUEN_COD,1,STRLEN(M.mmcu_ctartf)) = M.mmcu_ctartf AND D.code_descontable = 'S' AND m.mmcu_ctartf <> '' AND
            E.ENCO_CONSEC = D.ENCO_CONSEC AND ENCO_FECHA >= :INICIO AND ENCO_FECHA <= :FINAL AND D.TERC_NIT = :NIT AND
            ((CODE_CREDITO <> 0) or (CODE_DEBITO <> 0)) INTO :RTFTE, :debitos, :creditos;
            if (NATUR = 'D') then
                RTFTE = debitos;
            if (NATUR = 'C') then
                RTFTE = creditos;
            if (RTFTE IS NULL) then
                RTFTE = 0;
            MENORRTF = MENORRTF + RTFTE;
            /* LAS RETENCIONES RENTA ASUMIDAS */
            SELECT SUM(CODE_CREDITO-CODE_DEBITO), SUM(CODE_DEBITO), SUM(CODE_CREDITO)
            FROM COMPROBANTE_DETALLE D, COMPROBANTE_ENCABEZADO E, mediosmag_cuentas M
            WHERE M.mmcu_item = :idconc AND SUBSTR(CUEN_COD,1,STRLEN(M.mmcu_ctartf)) = M.mmcu_ctartf AND D.code_descontable = 'N' AND m.mmcu_ctartf <> '' AND
            E.ENCO_CONSEC = D.ENCO_CONSEC AND ENCO_FECHA >= :INICIO AND ENCO_FECHA <= :FINAL AND D.TERC_NIT = :NIT AND
            ((CODE_CREDITO <> 0) or (CODE_DEBITO <> 0)) INTO :RTFTEA, :debitos, :creditos;
            if (NATUR = 'D') then
                RTFTEA = debitos;
            if (NATUR = 'C') then
                RTFTEA = creditos;
            if (RTFTEA IS NULL) then
                RTFTEA = 0;
            MENORRTFA = MENORRTFA + RTFTEA;
            /* LAS RETENCIONES IVA */
            SELECT SUM(CODE_CREDITO-CODE_DEBITO), SUM(CODE_DEBITO), SUM(CODE_CREDITO)
            FROM COMPROBANTE_DETALLE D, COMPROBANTE_ENCABEZADO E, mediosmag_cuentas M
            WHERE M.mmcu_item = :idconc AND SUBSTR(CUEN_COD,1,STRLEN(M.mmcu_ctartiva)) = M.mmcu_ctartiva AND m.mmcu_ctartiva <> '' AND
            E.ENCO_CONSEC = D.ENCO_CONSEC AND ENCO_FECHA >= :INICIO AND ENCO_FECHA <= :FINAL AND D.TERC_NIT = :NIT AND
            ((CODE_CREDITO <> 0) or (CODE_DEBITO <> 0)) INTO :RTIVAC, :debitos, :creditos;
            if (NATUR = 'D') then
                RTIVAC = debitos;
            if (NATUR = 'C') then
                RTIVAC = creditos;
            if (RTIVAC IS NULL) then
                RTIVAC = 0;
            if (SIMPLIFICA = 'S') then
                BEGIN
                RTIVAS = RTIVAC;
                RTIVAC = 0;
                rtivand = 0;
                END
            ELSE
                if (pais <> '169') then
                    BEGIN
                    rtivand = RTIVAC;
                    RTIVAC = 0;
                    RTIVAS = 0;
                    END
                ELSE
                    begin
                    RTIVAS = 0;
                    rtivand = 0;
                    end
            MENORRTIVAC = MENORIVA + RTIVAC;
            MENORRTIVAS = MENORIVA + RTIVAS;
            MENORRTIVAN = MENORIVA + RTIVAND;
            /* LA RETENCION CREE */
            SELECT SUM(CODE_CREDITO-CODE_DEBITO), SUM(CODE_DEBITO), SUM(CODE_CREDITO)
            FROM COMPROBANTE_DETALLE D, COMPROBANTE_ENCABEZADO E, mediosmag_cuentas M
            WHERE M.mmcu_item = :idconc AND SUBSTR(CUEN_COD,1,STRLEN(M.mmcu_ctarcree)) = M.mmcu_ctarcree AND D.code_descontable = 'S' AND m.mmcu_ctarcree <> '' AND
            E.ENCO_CONSEC = D.ENCO_CONSEC AND ENCO_FECHA >= :INICIO AND ENCO_FECHA <= :FINAL AND D.TERC_NIT = :NIT AND
            ((CODE_CREDITO <> 0) or (CODE_DEBITO <> 0)) INTO :rtcree, :debitos, :creditos;
            if (NATUR = 'D') then
                rtcree = debitos;
            if (NATUR = 'C') then
                rtcree = creditos;
            if (RTFTE IS NULL) then
                rtcree = 0;
            MENORRTC = MENORRTC + rtcree;
            /* LA RETENCION CREE ASUMIDA */
            SELECT SUM(CODE_CREDITO-CODE_DEBITO), SUM(CODE_DEBITO), SUM(CODE_CREDITO)
            FROM COMPROBANTE_DETALLE D, COMPROBANTE_ENCABEZADO E, mediosmag_cuentas M
            WHERE M.mmcu_item = :idconc AND SUBSTR(CUEN_COD,1,STRLEN(M.mmcu_ctartcreeas)) = M.mmcu_ctartcreeas AND D.code_descontable = 'N' AND m.mmcu_ctartcreeas <> '' AND
            E.ENCO_CONSEC = D.ENCO_CONSEC AND ENCO_FECHA >= :INICIO AND ENCO_FECHA <= :FINAL AND D.TERC_NIT = :NIT AND
            ((CODE_CREDITO <> 0) or (CODE_DEBITO <> 0)) INTO :rtcreea, :debitos, :creditos;
            if (NATUR = 'D') then
                rtcreea = debitos;
            if (NATUR = 'C') then
                rtcreea = creditos;
            if (rtcreea IS NULL) then
                rtcreea = 0;
            menorrtca = menorrtca + rtcreea;
            END
        END
    if (MENORCUANTIA <> 0) then
        BEGIN
        if (menoriva IS NULL) then
            menoriva = 0;
        if (menorivand IS NULL) then
            menorivand = 0;
        if (menorpagond IS NULL) then
            menorpagond = 0;
        if (menorrtc IS NULL) then
            menorrtc = 0;
        if (menorrtca IS NULL) then
            menorrtca = 0;
        if (menorrtf IS NULL) then
            menorrtf = 0;
        if (menorrtfa IS NULL) then
            menorrtfa = 0;
        if (menorrtivac IS NULL) then
            menorrtivac = 0;
        if (menorrtivan IS NULL) then
            menorrtivan = 0;
        if (menorrtivas IS NULL) then
            menorrtivas = 0;
        ITEM = ITEM + 1;
        insert into medios_magneticos_datos (memg_formato, memg_ano, memg_item, memg_concepto, memg_tipodoc, memg_nit, memg_dv,memg_apellido1, memg_apellido2,
            memg_nombre1, memg_nombre2, memg_razonsocial, memg_direccion, memg_departamento, memg_municipio, memg_pago, memg_pais, memg_pagond,
            memg_iva, memg_ivand, memg_retencion, memg_reteasum, memg_retivacomun, memg_retivasimp, memg_retivand, memg_retcree, memg_rasumc)
            values (10019, substr(:inicio,1,4), :item,  :concepto, 43, '222222222', '', '', '',
            '', '', 'CUANTIAS MENORES', :dirmenor, :depmenor, :munmenor, :menorcuantia, :paismenor, :menorpagond,
            :menoriva, :menorivand, :menorrtf, :menorrtfa, :menorrtivac, :menorrtivas, :menorrtivan, :menorrtc, :menorrtca);
        END
    END

end
^

SET TERM ; ^

/* 20140413 */
/* DETERIORO/SUPERAVIT ACTIVOS */
CREATE DOMAIN FECCONTA AS CHAR(8);

ALTER TABLE ACTIVOS_FIJOS_VALOR DROP CONSTRAINT PK_ACTIVOS_FIJOS_VALOR;

update RDB$RELATION_FIELDS set RDB$FIELD_SOURCE = 'FECCONTA'
where (RDB$FIELD_NAME = 'ACFV_FECHA') and (RDB$RELATION_NAME = 'ACTIVOS_FIJOS_VALOR');
COMMIT WORK;

alter table ACTIVOS_FIJOS_VALOR add constraint PK_ACTIVOS_FIJOS_VALOR primary key (ACFJ_COD,ACFV_FECHA);

ALTER TABLE ACTIVOS_FIJOS_VALOR
ADD ACFV_VRUSO T_MONTO;
ALTER TABLE ACTIVOS_FIJOS_VALOR
ADD ACFJ_CSUSO T_MONTO;
ALTER TABLE ACTIVOS_FIJOS_VALOR
ADD ACFV_PRVENTA T_MONTO;
ALTER TABLE ACTIVOS_FIJOS_VALOR
ADD ACFV_CSVENTA T_MONTO;
ALTER TABLE ACTIVOS_FIJOS_VALOR
ADD ACFV_VRRECUP T_MONTO;
ALTER TABLE ACTIVOS_FIJOS_VALOR
ADD ACFV_DIFER T_MONTO;

SET TERM ^ ;

CREATE OR ALTER procedure ACTIVO_VALOR (
    CODIGO varchar(15),
    FECHA char(8),
    DEP CHAR(1))
returns (
    VALOR numeric(18,2))
AS
declare variable CTACONTA VARCHAR(20);
declare variable CTADEPC VARCHAR(20);
declare variable VRACT NUMERIC(18,2);
declare variable VRDEP NUMERIC(18,2);
begin
SELECT ACFJ_CTACONTA, ACFJ_CTADEPC FROM ACTIVOS_FIJOS WHERE ACFJ_COD = :CODIGO INTO :CTACONTA, :CTADEPC;
EXECUTE PROCEDURE saldo_activo_niif(:CTACONTA, :CODIGO, :FECHA) returning_values (:VRACT);
EXECUTE PROCEDURE saldo_activo_niif(:ctadepc, :CODIGO, :FECHA) returning_values (:VRDEP);
if (DEP = 'S') then
    VALOR = VRACT - VRDEP;
else
    VALOR = VRACT;
suspend;
end
^

SET TERM ; ^

GRANT execute ON PROCEDURE ACTIVO_VALOR TO PUBLIC;

ALTER TABLE ACTIVOS_FIJOS_VALOR
ADD ACFV_IDCOMP T_ID;

ALTER TABLE ACTIVOS_FIJOS_VALOR
ADD TICO_COD T_TIPO_COMP;
ALTER TABLE ACTIVOS_FIJOS_VALOR
ADD PRCO_PREF VARCHAR(4);
ALTER TABLE ACTIVOS_FIJOS_VALOR
ADD ACFV_CONC T_CONCEPTO;
ALTER TABLE ACTIVOS_FIJOS_VALOR
ADD ENCO_NUMERO T_NUMDOC;

SET TERM ^ ;

create or ALTER trigger ACTIVOS_FIJOS_VALOR_BI for ACTIVOS_FIJOS_VALOR
active BEFORE INSERT position 0
as
declare variable NIT VARCHAR(20);
declare variable PROY VARCHAR(4);
declare variable CENTRO VARCHAR(4);
declare variable I INTEGER;
declare variable CTADB VARCHAR(20);
declare variable CTACR VARCHAR(20);
begin
/* Registre un comprobante */
execute procedure cambie_id_comproba returning_values(NEW.acfv_idcomp);
insert into comprobante_encabezado (tico_cod, prco_pref, enco_consec, enco_numero, enco_fecha, enco_concepto, enco_refer, enco_tiporef, enco_idref, ENCO_DESCONTABLE)
    values (new.tico_cod, new.prco_pref, NEW.acfv_conc, new.enco_numero, new.acfv_fecha, NEW.acfv_conc, NULL, 5, 0, 'S');
EXECUTE PROCEDURE LEE_CONFIGURACION('CONTABILIDAD', 'GENERAL', 'NIT COMPAÑIA') RETURNING_VALUES (NIT);
EXECUTE PROCEDURE LEE_CONFIGURACION('CONTABILIDAD', 'GENERAL', 'PROYECTO UNICO') RETURNING_VALUES (PROY);
EXECUTE PROCEDURE LEE_CONFIGURACION('CONTABILIDAD', 'GENERAL', 'CENTRO DE COSTOS UNICO') RETURNING_VALUES (CENTRO);
I = 1;
/* DETERIORO/SUPERAVIT */
SELECT ACFJ_CTADETERD, ACFJ_CTADETERC FROM ACTIVOS_FIJOS WHERE ACFJ_COD = NEW.acfj_cod INTO :CTADB, :CTACR;
if (NEW.acfv_difer > 0) then
    BEGIN
    INSERT INTO comprobante_detalle_niif (ENCO_CONSEC, CODE_ITEM, CUEN_COD, TERC_NIT, PROY_COD, CENT_COD, ARTI_COD, CODE_CONCEPTO, CODE_REFER, CODE_BASE, CODE_PORC, CODE_DEBITO, CODE_CREDITO, CODE_DESCONTABLE)
        VALUES (NEW.acfv_idcomp, :I, :ctacr, :NIT, :PROY, :CENTRO, NEW.acfj_cod, NEW.acfv_conc, NULL, 0, 0, new.acfv_difer, 0, 'S');
    I = I + 1;
    INSERT INTO comprobante_detalle_niif (ENCO_CONSEC, CODE_ITEM, CUEN_COD, TERC_NIT, PROY_COD, CENT_COD, ARTI_COD, CODE_CONCEPTO, CODE_REFER, CODE_BASE, CODE_PORC, CODE_DEBITO, CODE_CREDITO, CODE_DESCONTABLE)
        VALUES (NEW.acfv_idcomp, :I, :ctadb, :NIT, :PROY, :CENTRO, NEW.acfj_cod, NEW.acfv_conc, NULL, 0, 0, 0, new.acfv_difer, 'S');
    END
ELSE
    BEGIN
    INSERT INTO comprobante_detalle_niif (ENCO_CONSEC, CODE_ITEM, CUEN_COD, TERC_NIT, PROY_COD, CENT_COD, ARTI_COD, CODE_CONCEPTO, CODE_REFER, CODE_BASE, CODE_PORC, CODE_DEBITO, CODE_CREDITO, CODE_DESCONTABLE)
        VALUES (NEW.acfv_idcomp, :I, :ctacr, :NIT, :PROY, :CENTRO, NEW.acfj_cod, NEW.acfv_conc, NULL, 0, 0, 0, abs(new.acfv_difer), 'S');
    I = I + 1;
    INSERT INTO comprobante_detalle_niif (ENCO_CONSEC, CODE_ITEM, CUEN_COD, TERC_NIT, PROY_COD, CENT_COD, ARTI_COD, CODE_CONCEPTO, CODE_REFER, CODE_BASE, CODE_PORC, CODE_DEBITO, CODE_CREDITO, CODE_DESCONTABLE)
        VALUES (NEW.acfv_idcomp, :I, :ctadb, :NIT, :PROY, :CENTRO, NEW.acfj_cod, NEW.acfv_conc, NULL, 0, 0, abs(new.acfv_difer), 0, 'S');
    END
end
^

SET TERM ; ^

CREATE TABLE DEPRECIACION_DETALLE (
    DEPR_ID T_ID NOT NULL,
    DEPD_ITEM T_ID NOT NULL,
    ACFJ_COD T_COD_ARTICULO,
    DEPD_MESES ENTERO,
    DEPD_UNIDADES ENTERO,
    DEPD_MONTO T_MONTO);
alter table DEPRECIACION_DETALLE add constraint PK_DEPRECIACION_DETALLE primary key (DEPR_ID,DEPD_ITEM);
alter table DEPRECIACION_DETALLE add constraint FK_DEPRECIACION_DETALLE_1 foreign key (DEPR_ID)
    references DEPRECIACION(DEPR_ID) on delete CASCADE on update CASCADE;

grant select, delete, insert, update on depreciacion_detalle to PUBLIC;

CREATE TABLE DEPRECIACION_UNIDADES (
    DEPR_ID T_ID NOT NULL,
    DEPU_ITEM T_ID NOT NULL,
    ACFJ_COD T_COD_ARTICULO,
    DEPU_UNIDADES T_ID);
alter table DEPRECIACION_UNIDADES add constraint PK_DEPRECIACION_UNIDADES primary key (DEPR_ID,DEPU_ITEM);
alter table DEPRECIACION_UNIDADES add constraint FK_DEPRECIACION_UNIDADES_1 foreign key (DEPR_ID)
    references DEPRECIACION(DEPR_ID) on delete CASCADE on update CASCADE;

grant select, delete, insert, update on depreciacion_unidades to PUBLIC;

ALTER TABLE ACTIVOS_FIJOS
ADD ACFJ_UNITOT T_ID;
ALTER TABLE DEPRECIACION_UNIDADES
ADD DEPU_OK T_BOOLEANO;

SET TERM ^ ;

create procedure ULTIMA_DEPRECIACION_UNIDADES (
    FECHA CHAR(8))
returns (
    ACTIVO VARCHAR(20),
    FECULT CHAR(8),
    UNIREST INTEGER)
as
declare variable UNIDEP INTEGER;
begin
FOR SELECT ACFJ_COD, ACFJ_UNITOT FROM ACTIVOS_FIJOS WHERE ACFJ_DEP = 'S' AND ACFJ_UNIDADES = 'S' INTO :ACTIVO, :UNIREST
    DO
    BEGIN
    SELECT SUM(DEPU_UNIDADES), MAX(D.depr_fecha) FROM depreciacion_unidades DU, DEPRECIACION D
        WHERE D.depr_id = DU.depr_id AND ACFJ_COD = :ACTIVO AND DEPU_OK = 'S' AND DEPR_FECHA <= :FECHA
        INTO :UNIDEP, :FECULT;
    if (UNIDEP IS NULL) then
        UNIDEP = 0;
    UNIREST = UNIREST - UNIDEP;
    suspend;
    END
end
^

SET TERM ; ^

grant EXECUTE on PROCEDURE ultima_depreciacion_unidades to PUBLIC;

SET TERM ^ ;

CREATE OR ALTER procedure ACTIVO_VALOR_NIIF (
    CODIGO varchar(15),
    FECHA char(8),
    DEP CHAR(1))
returns (
    VALOR numeric(18,2))
AS
declare variable CTACONTA VARCHAR(20);
declare variable CTADEPC VARCHAR(20);
declare variable CTADETERC VARCHAR(20);
declare variable VRACT NUMERIC(18,2);
declare variable VRDEP NUMERIC(18,2);
declare variable VRDET NUMERIC(18,2);
begin
SELECT ACFJ_CTANIIF, ACFJ_CTANIIFC, ACFJ_CTADETERC FROM ACTIVOS_FIJOS WHERE ACFJ_COD = :CODIGO
    INTO :CTACONTA, :CTADEPC, :CTADETERC;
EXECUTE PROCEDURE saldo_activo_niif(:CTACONTA, :CODIGO, :FECHA) returning_values (:VRACT);
EXECUTE PROCEDURE saldo_activo_niif(:ctadepc, :CODIGO, :FECHA) returning_values (:VRDEP);
EXECUTE PROCEDURE saldo_activo_niif(:ctadeterc, :CODIGO, :FECHA) returning_values (:VRDET);
if (DEP = 'S') then
    VALOR = VRACT - VRDEP - VRDET;
else
    VALOR = VRACT - VRDET;
suspend;
end
^

SET TERM ; ^

grant EXECUTE on PROCEDURE activo_valor_niif to PUBLIC;

ALTER TABLE DEPRECIACION_DETALLE
ADD DEPD_MONTON T_MONTO;

update RDB$RELATION_FIELDS set RDB$FIELD_SOURCE = 'T_ID'
where (RDB$FIELD_NAME = 'DEPD_UNIDADES') and (RDB$RELATION_NAME = 'DEPRECIACION_DETALLE');
COMMIT WORK;

ALTER TABLE DEPRECIACION_DETALLE
ADD DEPD_MESESN ENTERO;

SET TERM ^ ;

CREATE OR ALTER TRIGGER DEPRECIACION_DETALLE_BI FOR DEPRECIACION_DETALLE
ACTIVE BEFORE INSERT POSITION 0
as
declare variable FECHA CHAR(8);
declare variable FECULT CHAR(8);
declare variable TIPO INTEGER;
declare variable FECING DATE;
declare variable MESESD INTEGER;
declare variable MESESDN INTEGER;
declare variable DEP CHAR(1);
declare variable UNI CHAR(1);
declare variable RESCATE NUMERIC(18,2);
declare variable UNITOT INTEGER;
declare variable VALORI NUMERIC(18,2);
declare variable ANO INTEGER;
declare variable ANOU INTEGER;
declare variable MES INTEGER;
declare variable MESU INTEGER;
begin
SELECT DEPR_FECHA FROM depreciacion WHERE DEPR_ID = NEW.depr_id INTO :FECHA;
SELECT AG.acgr_tipodep, A.acfj_fecing, A.acfj_dep, A.acfj_unidades, A.acfj_unitot, A.acfj_mesdep, A.acfj_depniif, A.acfj_rescate
    FROM activos_grupos AG, activos_fijos A WHERE A.acgr_id = AG.acgr_id AND A.acfj_cod = NEW.acfj_cod
    INTO :TIPO, :FECING, :DEP, :UNI, :UNITOT, :MESESD, :MESESDN, :RESCATE;
if (DEP = 'S') then
    BEGIN
    if (TIPO = 1) then
        BEGIN
        /* LINEA RECTA: DEP = (VRORIG / MESESDEP) * MESES A DEPRECIAR */
        /* DEPRECIACION COLGAP */
        /* CALCULE MESES A DEPRECIAR DESDE LA ULTIMA */
        SELECT MAX(D.depr_fecha) FROM depreciacion_detalle DD, DEPRECIACION D
            WHERE D.depr_id = DD.depr_id AND ACFJ_COD = NEW.acfj_cod AND DEPR_FECHA <= :FECHA AND DD.depd_monto <> 0
            INTO :FECULT;
        if (FECULT IS NULL) then
            execute procedure fecha_a_conta(FECING) returning_values (:FECULT);
        ANO = SUBSTR(FECHA, 1, 4);
        MES = SUBSTR(FECHA, 5, 6);
        ANOU = SUBSTR(FECULT, 1, 4);
        MESU = SUBSTR(FECULT, 5, 6);
        NEW.depd_meses = (ANO-ANOU)*12+(MES-MESU);
        EXECUTE PROCEDURE activo_valor(NEW.acfj_cod, :FECHA, 'N') returning_values (VALORI);
        NEW.depd_monto = (VALORI / MESESD) * NEW.depd_meses;
        EXECUTE PROCEDURE activo_valor(NEW.acfj_cod, :FECHA, 'S') returning_values (VALORI);
        if (NEW.depd_monto > :VALORI) then
            NEW.depd_monto = :VALORI;
        /* DEPRECIACION NIIF */
        /* CALCULE MESES A DEPRECIAR DESDE LA ULTIMA */
        SELECT MAX(D.depr_fecha) FROM depreciacion_detalle DD, DEPRECIACION D
            WHERE D.depr_id = DD.depr_id AND ACFJ_COD = NEW.acfj_cod AND DEPR_FECHA <= :FECHA AND DD.depd_monton <> 0
            INTO :FECULT;
        if (FECULT IS NULL) then
            execute procedure fecha_a_conta(FECING) returning_values (:FECULT);
        ANO = SUBSTR(FECHA, 1, 4);
        MES = SUBSTR(FECHA, 5, 6);
        ANOU = SUBSTR(FECULT, 1, 4);
        MESU = SUBSTR(FECULT, 5, 6);
        NEW.depd_mesesn = (ANO-ANOU)*12+(MES-MESU);
        EXECUTE PROCEDURE activo_valor_niif(NEW.acfj_cod, :FECHA, 'N') returning_values (VALORI);
        NEW.depd_monton = ((VALORI-rescate) / :mesesdn) * NEW.depd_mesesn;
        EXECUTE PROCEDURE activo_valor_niif(NEW.acfj_cod, :FECHA, 'S') returning_values (VALORI);
        if (NEW.depd_monton > :VALORI) then
            NEW.depd_monton = :VALORI;
        END
    if (TIPO = 2) then
        BEGIN
        /* UNIDADES */
        if ((UNI = 'S') AND (UNITOT <> 0)) then
            BEGIN
            /* DEPRECIACION COLGAP */
            EXECUTE PROCEDURE activo_valor(NEW.acfj_cod, :FECHA, 'N') returning_values (VALORI);
            NEW.depd_monto = (VALORI / unitot) * NEW.depd_unidades;
            EXECUTE PROCEDURE activo_valor(NEW.acfj_cod, :FECHA, 'S') returning_values (VALORI);
            if (NEW.depd_monto > :VALORI) then
                NEW.depd_monto = :VALORI;
            /* DEPRECIACION NIIF */
            EXECUTE PROCEDURE activo_valor_niif(NEW.acfj_cod, :FECHA, 'N') returning_values (VALORI);
            NEW.depd_monton = ((VALORI-rescate) / unitot) * NEW.depd_unidades;
            EXECUTE PROCEDURE activo_valor_niif(NEW.acfj_cod, :FECHA, 'S') returning_values (VALORI);
            if (NEW.depd_monton > :VALORI) then
                NEW.depd_monton = :VALORI;
            END
        END
    END
end
^

SET TERM ; ^

SET TERM ^ ;

create trigger DEPRECIACION_AI for DEPRECIACION
active AFTER INSERT position 0
as
declare variable COD VARCHAR(20);
declare variable I INTEGER;
begin
I = 0;
FOR SELECT ACFJ_COD FROM activos_fijos WHERE ACFJ_ACTIVO = 'S' AND ACFJ_DEP = 'S' INTO :COD
    DO
    BEGIN
    I = I + 1;
    INSERT INTO depreciacion_detalle (DEPR_ID, DEPD_ITEM, ACFJ_COD) VALUES (NEW.depr_id, :I, :COD);
    END
end
^

SET TERM ; ^

SET TERM ^ ;

create or ALTER trigger DEPRECIACION_BI for DEPRECIACION
active BEFORE INSERT position 0
as
begin
/* Registre un comprobante */
execute procedure cambie_id_comproba returning_values(NEW.enco_consec);
insert into comprobante_encabezado (tico_cod, prco_pref, enco_consec, enco_numero, enco_fecha, enco_concepto, enco_refer, enco_tiporef, enco_idref, ENCO_DESCONTABLE)
    values (new.tico_cod, new.prco_pref, NEW.enco_consec, new.enco_numero, new.depr_fecha, NEW.depr_conc, NULL, 6, 0, 'S');

end
^

SET TERM ; ^

SET TERM ^ ;

create or ALTER trigger DEPRECIACION_DETALLE_AI for DEPRECIACION_DETALLE
active AFTER INSERT position 0
as
declare variable CTADEPD VARCHAR(20);
declare variable CTADEPC VARCHAR(20);
declare variable CTADEPND VARCHAR(20);
declare variable CTADEPNC VARCHAR(20);
declare variable IDC INTEGER;
declare variable I INTEGER;
declare variable NIT VARCHAR(20);
declare variable PROY VARCHAR(4);
declare variable CENTRO VARCHAR(4);
declare variable CONC VARCHAR(60);
begin
I = 0;
/* CONTABILICE */
EXECUTE PROCEDURE LEE_CONFIGURACION('CONTABILIDAD', 'GENERAL', 'NIT COMPAÑIA') RETURNING_VALUES (NIT);
EXECUTE PROCEDURE LEE_CONFIGURACION('CONTABILIDAD', 'GENERAL', 'PROYECTO UNICO') RETURNING_VALUES (PROY);
EXECUTE PROCEDURE LEE_CONFIGURACION('CONTABILIDAD', 'GENERAL', 'CENTRO DE COSTOS UNICO') RETURNING_VALUES (CENTRO);
SELECT A.acfj_ctadepd, A.acfj_ctadepc, A.acfj_ctaniifd, A.acfj_ctaniifc FROM activos_fijos A
    WHERE A.acfj_cod = NEW.acfj_cod INTO :ctadepd, :ctadepc, :ctadepnd, :ctadepnc;
SELECT D.enco_consec, D.depr_conc FROM DEPRECIACION D WHERE D.depr_id = NEW.depr_id INTO :IDC, :CONC;
/* COLGAP */
if (EXISTS (SELECT ENCO_CONSEC FROM COMPROBANTE_DETALLE
    WHERE ENCO_CONSEC = :IDC AND CUEN_COD = :ctadepd AND ARTI_COD = NEW.acfj_cod)) then
    UPDATE comprobante_detalle D SET D.code_debito = D.code_debito + NEW.depd_monto
        WHERE ENCO_CONSEC = :IDC AND CUEN_COD = :ctadepd AND ARTI_COD = NEW.acfj_cod;
ELSE
    BEGIN
    i = I + 1;
    INSERT INTO comprobante_detalle (ENCO_CONSEC, CODE_ITEM, CUEN_COD, TERC_NIT, PROY_COD, CENT_COD, CODE_CONCEPTO, CODE_REFER, CODE_BASE, CODE_PORC, CODE_DEBITO, CODE_CREDITO, CODE_DESCONTABLE)
        VALUES (:IDC, :I, :ctadepd, :NIT, :PROY, :CENTRO, :conc, NULL, 0, 0, NEW.depd_monto, 0, 'S');
    END
if (EXISTS (SELECT ENCO_CONSEC FROM COMPROBANTE_DETALLE
    WHERE ENCO_CONSEC = :IDC AND CUEN_COD = :ctadepc AND ARTI_COD = NEW.acfj_cod)) then
    UPDATE comprobante_detalle D SET D.code_credito = D.code_credito + NEW.depd_monto
        WHERE ENCO_CONSEC = :IDC AND CUEN_COD = :ctadepc AND ARTI_COD = NEW.acfj_cod;
ELSE
    BEGIN
    i = I + 1;
    INSERT INTO comprobante_detalle (ENCO_CONSEC, CODE_ITEM, CUEN_COD, TERC_NIT, PROY_COD, CENT_COD, CODE_CONCEPTO, CODE_REFER, CODE_BASE, CODE_PORC, CODE_DEBITO, CODE_CREDITO, CODE_DESCONTABLE)
        VALUES (:IDC, :I, :ctadepc, :NIT, :PROY, :CENTRO, :conc, NULL, 0, 0, 0, NEW.depd_monto, 'S');
    END
/* NIIF */
if (EXISTS (SELECT ENCO_CONSEC FROM comprobante_detalle_niif
    WHERE ENCO_CONSEC = :IDC AND CUEN_COD = :ctadepnd AND ARTI_COD = NEW.acfj_cod)) then
    UPDATE comprobante_detalle_niif D SET D.code_debito = D.code_debito + NEW.depd_monton
        WHERE ENCO_CONSEC = :IDC AND CUEN_COD = :ctadepnd AND ARTI_COD = NEW.acfj_cod;
ELSE
    BEGIN
    i = I + 1;
    INSERT INTO comprobante_detalle_niif (ENCO_CONSEC, CODE_ITEM, CUEN_COD, TERC_NIT, PROY_COD, CENT_COD, CODE_CONCEPTO, CODE_REFER, CODE_BASE, CODE_PORC, CODE_DEBITO, CODE_CREDITO, CODE_DESCONTABLE)
        VALUES (:IDC, :I, :ctadepnd, :NIT, :PROY, :CENTRO, :conc, NULL, 0, 0, NEW.depd_monton, 0, 'S');
    END
if (EXISTS (SELECT ENCO_CONSEC FROM comprobante_detalle_niif
    WHERE ENCO_CONSEC = :IDC AND CUEN_COD = :ctadepnc AND ARTI_COD = NEW.acfj_cod)) then
    UPDATE comprobante_detalle_niif D SET D.code_credito = D.code_credito + NEW.depd_monton
        WHERE ENCO_CONSEC = :IDC AND CUEN_COD = :ctadepnc AND ARTI_COD = NEW.acfj_cod;
ELSE
    BEGIN
    i = I + 1;
    INSERT INTO comprobante_detalle (ENCO_CONSEC, CODE_ITEM, CUEN_COD, TERC_NIT, PROY_COD, CENT_COD, CODE_CONCEPTO, CODE_REFER, CODE_BASE, CODE_PORC, CODE_DEBITO, CODE_CREDITO, CODE_DESCONTABLE)
        VALUES (:IDC, :I, :ctadepnc, :NIT, :PROY, :CENTRO, :conc, NULL, 0, 0, 0, NEW.depd_monton, 'S');
    END
end
^

SET TERM ; ^

SET TERM ^ ;

create or alter trigger DEPRECIACION_BD for DEPRECIACION
active BEFORE DELETE position 0
as
begin
  /* elimine el comprobante contable */
  delete from comprobante_detalle where enco_consec = old.enco_consec;
  delete from comprobante_encabezado where enco_consec = old.enco_consec;
end
^

SET TERM ; ^

SET TERM ^ ;

create or alter trigger DEPRECIACION_DETALLE_BD for DEPRECIACION_DETALLE
active BEFORE DELETE position 0
as
declare variable CTADEPD VARCHAR(20);
declare variable CTADEPC VARCHAR(20);
declare variable CTADEPND VARCHAR(20);
declare variable CTADEPNC VARCHAR(20);
declare variable IDC INTEGER;
begin
SELECT A.acfj_ctadepd, A.acfj_ctadepc, A.acfj_ctaniifd, A.acfj_ctaniifc FROM activos_fijos A
    WHERE A.acfj_cod = old.acfj_cod INTO :ctadepd, :ctadepc, :ctadepnd, :ctadepnc;
SELECT D.enco_consec FROM DEPRECIACION D WHERE D.depr_id = old.depr_id INTO :IDC;
/* COLGAP */
UPDATE comprobante_detalle D SET D.code_debito = D.code_debito - old.depd_monto
    WHERE ENCO_CONSEC = :IDC AND CUEN_COD = :ctadepd AND ARTI_COD = old.acfj_cod;
UPDATE comprobante_detalle D SET D.code_credito = D.code_credito - old.depd_monto
    WHERE ENCO_CONSEC = :IDC AND CUEN_COD = :ctadepc AND ARTI_COD = old.acfj_cod;
/* NIIF */
UPDATE comprobante_detalle_niif D SET D.code_debito = D.code_debito - old.depd_monton
    WHERE ENCO_CONSEC = :IDC AND CUEN_COD = :ctadepnd AND ARTI_COD = old.acfj_cod;
UPDATE comprobante_detalle_niif D SET D.code_credito = D.code_credito - old.depd_monton
    WHERE ENCO_CONSEC = :IDC AND CUEN_COD = :ctadepnc AND ARTI_COD = old.acfj_cod;
end
^

SET TERM ; ^

/* 20140414 */
GRANT EXECUTE ON PROCEDURE VALIDE_PADRE_NIIF TO PUBLIC;

grant select, delete, insert, update on APERTURA_NIIF to PUBLIC;
grant select, delete, insert, update on apertura_niif_det to PUBLIC;

/* 20140416 */
/* RETENCIOENS ASUMIDAS SI SON NEGATIVAS MULTIPLICAR POR -1 */
SET TERM ^ ;

CREATE OR ALTER PROCEDURE MM_1001_9(
    INICIO CHAR(8),
    FINAL CHAR(8))
AS
declare variable IDCONC INTEGER;
declare variable CONCEPTO INTEGER;
declare variable TIPODOC INTEGER;
declare variable NIT VARCHAR(20) CHARACTER SET NONE;
declare variable DV CHAR(1) CHARACTER SET NONE;
declare variable APELLIDO1 VARCHAR(60) CHARACTER SET NONE;
declare variable APELLIDO2 VARCHAR(60) CHARACTER SET NONE;
declare variable NOMBRE1 VARCHAR(60) CHARACTER SET NONE;
declare variable NOMBRE2 VARCHAR(60) CHARACTER SET NONE;
declare variable RAZONSOCIAL VARCHAR(450) CHARACTER SET NONE;
declare variable DIRECCION VARCHAR(200) CHARACTER SET NONE;
declare variable SIMPLIFICA CHAR(1) CHARACTER SET NONE;
declare variable DEPARTAMENTO CHAR(2) CHARACTER SET NONE;
declare variable MUNICIPIO CHAR(3) CHARACTER SET NONE;
declare variable PAIS CHAR(3) CHARACTER SET NONE;
declare variable PAGO NUMERIC(18,0);
declare variable PAGOND NUMERIC(18,0);
declare variable IVA NUMERIC(18,0);
declare variable IVAND NUMERIC(18,0);
declare variable RTFTE NUMERIC(18,0);
declare variable RTFTEA NUMERIC(18,0);
declare variable RTIVAC NUMERIC(18,0);
declare variable RTIVAS NUMERIC(18,0);
declare variable RTIVAND NUMERIC(18,0);
declare variable RTCREE NUMERIC(18,0);
declare variable RTCREEA NUMERIC(18,0);
declare variable DEBITOS NUMERIC(18,2);
declare variable CREDITOS NUMERIC(18,2);
declare variable MINIMO NUMERIC(18,2);
declare variable MENORCUANTIA NUMERIC(18,2);
declare variable MENORPAGOND NUMERIC(18,2);
declare variable MENORRTF NUMERIC(18,2);
declare variable MENORRTFA NUMERIC(18,2);
declare variable MENORRTC NUMERIC(18,2);
declare variable MENORRTCA NUMERIC(18,2);
declare variable MENORIVA NUMERIC(18,2);
declare variable MENORIVAND NUMERIC(18,2);
declare variable MENORRTIVAC NUMERIC(18,2);
declare variable MENORRTIVAS NUMERIC(18,2);
declare variable MENORRTIVAN NUMERIC(18,2);
declare variable TOTALTERC NUMERIC(18,2);
declare variable TOTALTDB NUMERIC(18,2);
declare variable TOTALTCR NUMERIC(18,2);
declare variable ITEM integer;
declare variable DIRMENOR VARCHAR(200) CHARACTER SET NONE;
declare variable DEPMENOR CHAR(2) CHARACTER SET NONE;
declare variable MUNMENOR CHAR(3) CHARACTER SET NONE;
declare variable PAISMENOR CHAR(3) CHARACTER SET NONE;
declare variable NATUR CHAR(1);
declare variable TIPOID CHAR(1);
begin
EXECUTE PROCEDURE lee_configuracion('CONTABILIDAD', 'GENERAL', 'NIT COMPAÑIA') returning_values (:NIT);
SELECT TERC_DIR, SUBSTR(CIUD_COD,1,2), SUBSTR(CIUD_COD,3,5), PAIS_ID FROM TERCEROS WHERE TERC_NIT = :NIT
    INTO :dirmenor, :depmenor, :munmenor, :paismenor;
ITEM = 0;
FOR SELECT COME_ITEM, COME_RESPUESTA, COME_MINIMO, COME_NATUR FROM CONFIGURA_MEDIOSMAG
    WHERE COME_FORMATO = '10019' ORDER BY COME_ITEM INTO :idconc, :CONCEPTO , :MINIMO, :NATUR
    DO
    BEGIN
    MENORCUANTIA = 0;
    MENORPAGOND = 0;
    MENORRTF = 0;
    MENORRTFA = 0;
    MENORIVA = 0;
    MENORIVAND = 0;
    MENORRTIVAC = 0;
    MENORRTIVAS = 0;
    MENORRTIVAN = 0;
    FOR SELECT MAX(D.TERC_NIT), SUM(CODE_DEBITO-CODE_CREDITO), SUM(CODE_DEBITO), SUM(CODE_CREDITO)
        FROM COMPROBANTE_DETALLE D, COMPROBANTE_ENCABEZADO E, mediosmag_cuentas M
        WHERE M.mmcu_item = :idconc AND SUBSTR(CUEN_COD,1,STRLEN(M.mmcu_cuenta)) = M.mmcu_cuenta AND m.mmcu_cuenta <> '' AND
        E.ENCO_CONSEC = D.ENCO_CONSEC AND ENCO_FECHA >= :INICIO AND ENCO_FECHA <= :FINAL AND
        ((CODE_CREDITO <> 0) or (CODE_DEBITO <> 0))
        GROUP BY D.TERC_NIT
        INTO :NIT, :PAGO, :debitos, :creditos
        DO
        BEGIN
        /* TOTAL POR TERCERO */
        SELECT SUM(CODE_DEBITO-CODE_CREDITO), SUM(CODE_DEBITO), SUM(CODE_CREDITO) FROM COMPROBANTE_DETALLE D, COMPROBANTE_ENCABEZADO E, mediosmag_cuentas M, configura_mediosmag C
            WHERE C.come_formato = 10019 AND C.come_item = M.mmcu_item AND SUBSTR(D.CUEN_COD,1,STRLEN(M.mmcu_cuenta)) = M.mmcu_cuenta AND m.mmcu_cuenta <> '' AND
            E.ENCO_CONSEC = D.ENCO_CONSEC AND ENCO_FECHA >= :inicio AND ENCO_FECHA <= :final AND
            D.TERC_NIT = :NIT INTO :TOTALTERC, :TOTALTDB, :TOTALTCR;
        if (totalterc is null) then
            totalterc = 0;
        if (totaltdb is null) then
            totaltdb = 0;
        if (totaltcr is null) then
            totaltcr = 0;
        if (NATUR = 'D') then
            BEGIN
            pago = debitos;
            TOTALTERC = TOTALTDB;
            END
        if (NATUR = 'C') then
            BEGIN
            pago = creditos;
            TOTALTERC = TOTALTCR;
            END
        if ((TOTALTERC >= :MINIMO) AND (PAGO > 0)) then
            BEGIN
            SELECT TERC_NOM, TERC_NOMBRE1, TERC_NOMBRE2, TERC_APELLIDO1, TERC_APELLIDO2, TERC_DV, TERC_SIMPLIFICA,
                TERC_DIR, SUBSTR(CIUD_COD,1,2), SUBSTR(CIUD_COD,3,5), PAIS_ID, T.TERC_TIPOID
                FROM TERCEROS T WHERE TERC_NIT = :NIT
                INTO :RAZONSOCIAL, :NOMBRE1, :NOMBRE2, :APELLIDO1, :APELLIDO2, :DV, :SIMPLIFICA,
                :DIRECCION, :DEPARTAMENTO, :MUNICIPIO, :PAIS, :TIPOID;
            select TIID_CODIGO FROM TIPO_ID WHERE TIID_COD = :TIPOID INTO :TIPODOC;
            if (:TIPOID <> 'J') then
                RAZONSOCIAL = '';
            /* LOS NO DEDUCIBLES */
            SELECT SUM(CODE_DEBITO-CODE_CREDITO), SUM(CODE_DEBITO), SUM(CODE_CREDITO)
            FROM COMPROBANTE_DETALLE D, COMPROBANTE_ENCABEZADO E, mediosmag_cuentas M
            WHERE M.mmcu_item = :idconc AND SUBSTR(CUEN_COD,1,STRLEN(M.mmcu_cuenta)) = M.mmcu_cuenta AND m.mmcu_cuenta <> '' AND 
            E.ENCO_CONSEC = D.ENCO_CONSEC AND ENCO_FECHA >= :INICIO AND ENCO_FECHA <= :FINAL AND D.TERC_NIT = :NIT AND
            ((CODE_CREDITO <> 0) or (CODE_DEBITO <> 0)) AND D.code_descontable = 'N' INTO :PAGOND, :debitos, :creditos;
            if (NATUR = 'D') then
                pagond = debitos;
            if (NATUR = 'C') then
                pagond = creditos;
            if (PAGOND IS NULL) then
                PAGOND = 0;
            PAGO = PAGO - PAGOND;
            /* EL IVA DESCONTABLE */
            SELECT SUM(CODE_DEBITO-CODE_CREDITO), SUM(CODE_DEBITO), SUM(CODE_CREDITO)
            FROM COMPROBANTE_DETALLE D, COMPROBANTE_ENCABEZADO E, mediosmag_cuentas M
            WHERE M.mmcu_item = :idconc AND SUBSTR(CUEN_COD,1,STRLEN(M.mmcu_ctaiva)) = M.mmcu_ctaiva AND D.code_descontable = 'S' AND m.mmcu_ctaiva <> '' AND
            E.ENCO_CONSEC = D.ENCO_CONSEC AND ENCO_FECHA >= :INICIO AND ENCO_FECHA <= :FINAL AND D.TERC_NIT = :NIT AND
            ((CODE_CREDITO <> 0) or (CODE_DEBITO <> 0)) INTO :iva, :debitos, :creditos;
            if (NATUR = 'D') then
                IVA = debitos;
            if (NATUR = 'C') then
                IVA = creditos;
            if (IVA IS NULL) then
                IVA = 0;
            if (exists (select memg_nit from medios_magneticos_datos where memg_formato = 10019 and memg_ano = substr(:inicio,1,4)
                and memg_nit = :nit and memg_iva = :iva)) then
                IVA = 0;
            /* EL IVA NO DESCONTABLE */
            SELECT SUM(CODE_DEBITO-CODE_CREDITO), SUM(CODE_DEBITO), SUM(CODE_CREDITO)
            FROM COMPROBANTE_DETALLE D, COMPROBANTE_ENCABEZADO E, mediosmag_cuentas M
            WHERE M.mmcu_item = :idconc AND SUBSTR(CUEN_COD,1,STRLEN(M.mmcu_ctaivand)) = M.mmcu_ctaivand AND m.mmcu_ctaivand <> '' AND
            E.ENCO_CONSEC = D.ENCO_CONSEC AND ENCO_FECHA >= :INICIO AND ENCO_FECHA <= :FINAL AND D.TERC_NIT = :NIT AND
            ((CODE_CREDITO <> 0) or (CODE_DEBITO <> 0)) INTO :ivand, :debitos, :creditos;
            if (NATUR = 'D') then
                IVAND = debitos;
            if (NATUR = 'C') then
                IVAND = creditos;
            if (IVAND IS NULL) then
                IVAND = 0;
            if (exists (select memg_nit from medios_magneticos_datos where memg_formato = 10019 and memg_ano = substr(:inicio,1,4)
                and memg_nit = :nit and memg_ivand = :ivand)) then
                IVAND = 0;

            /* LAS RETENCIONES RENTA */
            SELECT SUM(CODE_CREDITO-CODE_DEBITO), SUM(CODE_DEBITO), SUM(CODE_CREDITO)
            FROM COMPROBANTE_DETALLE D, COMPROBANTE_ENCABEZADO E, mediosmag_cuentas M
            WHERE M.mmcu_item = :idconc AND SUBSTR(CUEN_COD,1,STRLEN(M.mmcu_ctartf)) = M.mmcu_ctartf AND D.code_descontable = 'S' AND m.mmcu_ctartf <> '' AND
            E.ENCO_CONSEC = D.ENCO_CONSEC AND ENCO_FECHA >= :INICIO AND ENCO_FECHA <= :FINAL AND D.TERC_NIT = :NIT AND
            ((CODE_CREDITO <> 0) or (CODE_DEBITO <> 0)) INTO :RTFTE, :debitos, :creditos;
            if (NATUR = 'D') then
                RTFTE = debitos;
            if (NATUR = 'C') then
                RTFTE = creditos;
            if (RTFTE IS NULL) then
                RTFTE = 0;
            if (exists (select memg_nit from medios_magneticos_datos where memg_formato = 10019 and memg_ano = substr(:inicio,1,4)
                and memg_nit = :nit and memg_retencion = :rtfte)) then
                RTFTE = 0;
            
            /* LAS RETENCIONES RENTA ASUMIDAS */
            SELECT SUM(CODE_CREDITO-CODE_DEBITO), SUM(CODE_DEBITO), SUM(CODE_CREDITO)
            FROM COMPROBANTE_DETALLE D, COMPROBANTE_ENCABEZADO E, mediosmag_cuentas M
            WHERE M.mmcu_item = :idconc AND SUBSTR(CUEN_COD,1,STRLEN(M.mmcu_ctartf)) = M.mmcu_ctartf AND D.code_descontable = 'N' AND m.mmcu_ctartf <> '' AND
            E.ENCO_CONSEC = D.ENCO_CONSEC AND ENCO_FECHA >= :INICIO AND ENCO_FECHA <= :FINAL AND D.TERC_NIT = :NIT AND
            ((CODE_CREDITO <> 0) or (CODE_DEBITO <> 0)) INTO :RTFTEA, :debitos, :creditos;
            if (NATUR = 'D') then
                RTFTEA = debitos;
            if (NATUR = 'C') then
                RTFTEA = creditos;
            if (RTFTEA IS NULL) then
                RTFTEA = 0;
            if (exists (select memg_nit from medios_magneticos_datos where memg_formato = 10019 and memg_ano = substr(:inicio,1,4)
                and memg_nit = :nit and memg_reteasum = :rtftea)) then
                RTFTEA = 0;
            if (rtftea < 0) then
                rtftea = rtftea * -1;
            /* LAS RETENCIONES IVA */
            SELECT SUM(CODE_CREDITO-CODE_DEBITO), SUM(CODE_DEBITO), SUM(CODE_CREDITO)
            FROM COMPROBANTE_DETALLE D, COMPROBANTE_ENCABEZADO E, mediosmag_cuentas M
            WHERE M.mmcu_item = :idconc AND SUBSTR(CUEN_COD,1,STRLEN(M.mmcu_ctartiva)) = M.mmcu_ctartiva AND m.mmcu_ctartiva <> '' AND
            E.ENCO_CONSEC = D.ENCO_CONSEC AND ENCO_FECHA >= :INICIO AND ENCO_FECHA <= :FINAL AND D.TERC_NIT = :NIT AND
            ((CODE_CREDITO <> 0) or (CODE_DEBITO <> 0)) INTO :RTIVAC, :debitos, :creditos;
            if (NATUR = 'D') then
                RTIVAC = debitos;
            if (NATUR = 'C') then
                RTIVAC = creditos;
            if (RTIVAC IS NULL) then
                RTIVAC = 0;
            if (SIMPLIFICA = 'S') then
                BEGIN
                RTIVAS = RTIVAC;
                RTIVAC = 0;
                rtivand = 0;
                END
            ELSE
                if (pais <> '169') then
                    BEGIN
                    rtivand = RTIVAC;
                    RTIVAC = 0;
                    RTIVAS = 0;
                    END
                ELSE
                    begin
                    RTIVAS = 0;
                    rtivand = 0;
                    end
            if (exists (select memg_nit from medios_magneticos_datos where memg_formato = 10019 and memg_ano = substr(:inicio,1,4)
                and memg_nit = :nit and ((memg_retivacomun = :rtivac) or (memg_retivasimp = :rtivas) or (memg_retivand = :rtivand)))) then
                BEGIN
                rtivand = 0;
                RTIVAC = 0;
                RTIVAS = 0;
                END
            /* LA RETENCION CREE */
            SELECT SUM(CODE_CREDITO-CODE_DEBITO), SUM(CODE_DEBITO), SUM(CODE_CREDITO)
            FROM COMPROBANTE_DETALLE D, COMPROBANTE_ENCABEZADO E, mediosmag_cuentas M
            WHERE M.mmcu_item = :idconc AND SUBSTR(CUEN_COD,1,STRLEN(M.mmcu_ctarcree)) = M.mmcu_ctarcree AND D.code_descontable = 'S' AND m.mmcu_ctarcree <> '' AND
            E.ENCO_CONSEC = D.ENCO_CONSEC AND ENCO_FECHA >= :INICIO AND ENCO_FECHA <= :FINAL AND D.TERC_NIT = :NIT AND
            ((CODE_CREDITO <> 0) or (CODE_DEBITO <> 0)) INTO :rtcree, :debitos, :creditos;
            if (NATUR = 'D') then
                rtcree = debitos;
            if (NATUR = 'C') then
                rtcree = creditos;
            if (rtcree IS NULL) then
                rtcree = 0;
            if (exists (select memg_nit from medios_magneticos_datos MD where memg_formato = 10019 and memg_ano = substr(:inicio,1,4)
                and memg_nit = :nit and MD.memg_retcree = :rtcree)) then
                rtcree = 0;
            
            /* LAS RETENCIONES CREE ASUMIDAS */
            SELECT SUM(CODE_CREDITO-CODE_DEBITO), SUM(CODE_DEBITO), SUM(CODE_CREDITO)
            FROM COMPROBANTE_DETALLE D, COMPROBANTE_ENCABEZADO E, mediosmag_cuentas M
            WHERE M.mmcu_item = :idconc AND SUBSTR(CUEN_COD,1,STRLEN(M.mmcu_ctartcreeas)) = M.mmcu_ctartcreeas AND m.mmcu_ctartcreeas <> '' AND
            E.ENCO_CONSEC = D.ENCO_CONSEC AND ENCO_FECHA >= :INICIO AND ENCO_FECHA <= :FINAL AND D.TERC_NIT = :NIT AND
            ((CODE_CREDITO <> 0) or (CODE_DEBITO <> 0)) INTO :rtcreea, :debitos, :creditos;
            if (NATUR = 'D') then
                rtcreea = debitos;
            if (NATUR = 'C') then
                rtcreea = creditos;
            if (rtcreea IS NULL) then
                rtcreea = 0;
            if (exists (select memg_nit from medios_magneticos_datos MD where memg_formato = 10019 and memg_ano = substr(:inicio,1,4)
                and memg_nit = :nit and MD.memg_rasumc = :rtcreea)) then
                rtcreea = 0;
            if (rtcreea < 0) then
                rtcreea = rtcreea * -1;

            ITEM = ITEM + 1;
            insert into medios_magneticos_datos (memg_formato, memg_ano, memg_item, memg_concepto, memg_tipodoc, memg_nit, memg_dv,memg_apellido1, memg_apellido2,
                memg_nombre1, memg_nombre2, memg_razonsocial, memg_direccion, memg_departamento, memg_municipio, memg_pago, memg_pais, memg_pagond,
                memg_iva, memg_ivand, memg_retencion, memg_reteasum, memg_retivacomun, memg_retivasimp, memg_retivand, memg_retcree, memg_rasumc)
                values (10019, substr(:inicio,1,4), :item,  :concepto, :tipodoc, :nit, :dv, :apellido1, :apellido2,
                :nombre1, :nombre2, :razonsocial, :direccion, :departamento, :municipio, :pago, :pais, :pagond,
                :iva, :ivand, :rtfte, :rtftea, :rtivac, :rtivas, :rtivand, :rtcree, :rtcreea);
            END
        ELSE
            BEGIN
            /* LAS CUANTIAS MENORES */
            SELECT SUM(CODE_DEBITO-CODE_CREDITO), SUM(CODE_DEBITO), SUM(CODE_CREDITO)
            FROM COMPROBANTE_DETALLE D, COMPROBANTE_ENCABEZADO E, mediosmag_cuentas M
            WHERE M.mmcu_item = :idconc AND SUBSTR(CUEN_COD,1,STRLEN(M.mmcu_cuenta)) = M.mmcu_cuenta AND m.mmcu_cuenta <> '' AND 
            E.ENCO_CONSEC = D.ENCO_CONSEC AND ENCO_FECHA >= :INICIO AND ENCO_FECHA <= :FINAL AND D.TERC_NIT = :NIT AND
            ((CODE_CREDITO <> 0) or (CODE_DEBITO <> 0)) AND D.code_descontable = 'N' INTO :PAGOND, :debitos, :creditos;
            if (NATUR = 'D') then
                pagond = debitos;
            if (NATUR = 'C') then
                pagond = creditos;
            if (PAGOND IS NULL) then
                PAGOND = 0;
            PAGO = PAGO - PAGOND;
            MENORCUANTIA = MENORCUANTIA + PAGO;
            MENORPAGOND = MENORPAGOND + PAGOND;
            /* EL IVA DESCONTABLE */
            SELECT SUM(CODE_DEBITO-CODE_CREDITO), SUM(CODE_DEBITO), SUM(CODE_CREDITO)
            FROM COMPROBANTE_DETALLE D, COMPROBANTE_ENCABEZADO E, mediosmag_cuentas M
            WHERE M.mmcu_item = :idconc AND SUBSTR(CUEN_COD,1,STRLEN(M.mmcu_ctaiva)) = M.mmcu_ctaiva AND D.code_descontable = 'S' AND m.mmcu_ctaiva <> '' AND
            E.ENCO_CONSEC = D.ENCO_CONSEC AND ENCO_FECHA >= :INICIO AND ENCO_FECHA <= :FINAL AND D.TERC_NIT = :NIT AND
            ((CODE_CREDITO <> 0) or (CODE_DEBITO <> 0)) INTO :iva, :debitos, :creditos;
            if (NATUR = 'D') then
                IVA = debitos;
            if (NATUR = 'C') then
                IVA = creditos;
            if (IVA IS NULL) then
                IVA = 0;
            MENORIVA = MENORIVA + IVA;
            /* EL IVA NO DESCONTABLE */
            SELECT SUM(CODE_DEBITO-CODE_CREDITO), SUM(CODE_DEBITO), SUM(CODE_CREDITO)
            FROM COMPROBANTE_DETALLE D, COMPROBANTE_ENCABEZADO E, mediosmag_cuentas M
            WHERE M.mmcu_item = :idconc AND SUBSTR(CUEN_COD,1,STRLEN(M.mmcu_ctaivand)) = M.mmcu_ctaivand AND D.code_descontable = 'N' AND m.mmcu_ctaivand <> '' AND
            E.ENCO_CONSEC = D.ENCO_CONSEC AND ENCO_FECHA >= :INICIO AND ENCO_FECHA <= :FINAL AND D.TERC_NIT = :NIT AND
            ((CODE_CREDITO <> 0) or (CODE_DEBITO <> 0)) INTO :ivand, :debitos, :creditos;
            if (NATUR = 'D') then
                IVAND = debitos;
            if (NATUR = 'C') then
                IVAND = creditos;
            if (IVAND IS NULL) then
                IVAND = 0;
            MENORIVAND = MENORIVAND + IVAND;
            /* LAS RETENCIONES RENTA */
            SELECT SUM(CODE_CREDITO-CODE_DEBITO), SUM(CODE_DEBITO), SUM(CODE_CREDITO)
            FROM COMPROBANTE_DETALLE D, COMPROBANTE_ENCABEZADO E, mediosmag_cuentas M
            WHERE M.mmcu_item = :idconc AND SUBSTR(CUEN_COD,1,STRLEN(M.mmcu_ctartf)) = M.mmcu_ctartf AND D.code_descontable = 'S' AND m.mmcu_ctartf <> '' AND
            E.ENCO_CONSEC = D.ENCO_CONSEC AND ENCO_FECHA >= :INICIO AND ENCO_FECHA <= :FINAL AND D.TERC_NIT = :NIT AND
            ((CODE_CREDITO <> 0) or (CODE_DEBITO <> 0)) INTO :RTFTE, :debitos, :creditos;
            if (NATUR = 'D') then
                RTFTE = debitos;
            if (NATUR = 'C') then
                RTFTE = creditos;
            if (RTFTE IS NULL) then
                RTFTE = 0;
            MENORRTF = MENORRTF + RTFTE;
            /* LAS RETENCIONES RENTA ASUMIDAS */
            SELECT SUM(CODE_CREDITO-CODE_DEBITO), SUM(CODE_DEBITO), SUM(CODE_CREDITO)
            FROM COMPROBANTE_DETALLE D, COMPROBANTE_ENCABEZADO E, mediosmag_cuentas M
            WHERE M.mmcu_item = :idconc AND SUBSTR(CUEN_COD,1,STRLEN(M.mmcu_ctartf)) = M.mmcu_ctartf AND D.code_descontable = 'N' AND m.mmcu_ctartf <> '' AND
            E.ENCO_CONSEC = D.ENCO_CONSEC AND ENCO_FECHA >= :INICIO AND ENCO_FECHA <= :FINAL AND D.TERC_NIT = :NIT AND
            ((CODE_CREDITO <> 0) or (CODE_DEBITO <> 0)) INTO :RTFTEA, :debitos, :creditos;
            if (NATUR = 'D') then
                RTFTEA = debitos;
            if (NATUR = 'C') then
                RTFTEA = creditos;
            if (RTFTEA IS NULL) then
                RTFTEA = 0;
            MENORRTFA = MENORRTFA + RTFTEA;
            /* LAS RETENCIONES IVA */
            SELECT SUM(CODE_CREDITO-CODE_DEBITO), SUM(CODE_DEBITO), SUM(CODE_CREDITO)
            FROM COMPROBANTE_DETALLE D, COMPROBANTE_ENCABEZADO E, mediosmag_cuentas M
            WHERE M.mmcu_item = :idconc AND SUBSTR(CUEN_COD,1,STRLEN(M.mmcu_ctartiva)) = M.mmcu_ctartiva AND m.mmcu_ctartiva <> '' AND
            E.ENCO_CONSEC = D.ENCO_CONSEC AND ENCO_FECHA >= :INICIO AND ENCO_FECHA <= :FINAL AND D.TERC_NIT = :NIT AND
            ((CODE_CREDITO <> 0) or (CODE_DEBITO <> 0)) INTO :RTIVAC, :debitos, :creditos;
            if (NATUR = 'D') then
                RTIVAC = debitos;
            if (NATUR = 'C') then
                RTIVAC = creditos;
            if (RTIVAC IS NULL) then
                RTIVAC = 0;
            if (SIMPLIFICA = 'S') then
                BEGIN
                RTIVAS = RTIVAC;
                RTIVAC = 0;
                rtivand = 0;
                END
            ELSE
                if (pais <> '169') then
                    BEGIN
                    rtivand = RTIVAC;
                    RTIVAC = 0;
                    RTIVAS = 0;
                    END
                ELSE
                    begin
                    RTIVAS = 0;
                    rtivand = 0;
                    end
            MENORRTIVAC = MENORIVA + RTIVAC;
            MENORRTIVAS = MENORIVA + RTIVAS;
            MENORRTIVAN = MENORIVA + RTIVAND;
            /* LA RETENCION CREE */
            SELECT SUM(CODE_CREDITO-CODE_DEBITO), SUM(CODE_DEBITO), SUM(CODE_CREDITO)
            FROM COMPROBANTE_DETALLE D, COMPROBANTE_ENCABEZADO E, mediosmag_cuentas M
            WHERE M.mmcu_item = :idconc AND SUBSTR(CUEN_COD,1,STRLEN(M.mmcu_ctarcree)) = M.mmcu_ctarcree AND D.code_descontable = 'S' AND m.mmcu_ctarcree <> '' AND
            E.ENCO_CONSEC = D.ENCO_CONSEC AND ENCO_FECHA >= :INICIO AND ENCO_FECHA <= :FINAL AND D.TERC_NIT = :NIT AND
            ((CODE_CREDITO <> 0) or (CODE_DEBITO <> 0)) INTO :rtcree, :debitos, :creditos;
            if (NATUR = 'D') then
                rtcree = debitos;
            if (NATUR = 'C') then
                rtcree = creditos;
            if (RTFTE IS NULL) then
                rtcree = 0;
            MENORRTC = MENORRTC + rtcree;
            /* LA RETENCION CREE ASUMIDA */
            SELECT SUM(CODE_CREDITO-CODE_DEBITO), SUM(CODE_DEBITO), SUM(CODE_CREDITO)
            FROM COMPROBANTE_DETALLE D, COMPROBANTE_ENCABEZADO E, mediosmag_cuentas M
            WHERE M.mmcu_item = :idconc AND SUBSTR(CUEN_COD,1,STRLEN(M.mmcu_ctartcreeas)) = M.mmcu_ctartcreeas AND D.code_descontable = 'N' AND m.mmcu_ctartcreeas <> '' AND
            E.ENCO_CONSEC = D.ENCO_CONSEC AND ENCO_FECHA >= :INICIO AND ENCO_FECHA <= :FINAL AND D.TERC_NIT = :NIT AND
            ((CODE_CREDITO <> 0) or (CODE_DEBITO <> 0)) INTO :rtcreea, :debitos, :creditos;
            if (NATUR = 'D') then
                rtcreea = debitos;
            if (NATUR = 'C') then
                rtcreea = creditos;
            if (rtcreea IS NULL) then
                rtcreea = 0;
            menorrtca = menorrtca + rtcreea;
            END
        END
    if (MENORCUANTIA <> 0) then
        BEGIN
        if (menoriva IS NULL) then
            menoriva = 0;
        if (menorivand IS NULL) then
            menorivand = 0;
        if (menorpagond IS NULL) then
            menorpagond = 0;
        if (menorrtc IS NULL) then
            menorrtc = 0;
        if (menorrtca IS NULL) then
            menorrtca = 0;
        if (menorrtf IS NULL) then
            menorrtf = 0;
        if (menorrtfa IS NULL) then
            menorrtfa = 0;
        if (menorrtivac IS NULL) then
            menorrtivac = 0;
        if (menorrtivan IS NULL) then
            menorrtivan = 0;
        if (menorrtivas IS NULL) then
            menorrtivas = 0;
        ITEM = ITEM + 1;
        insert into medios_magneticos_datos (memg_formato, memg_ano, memg_item, memg_concepto, memg_tipodoc, memg_nit, memg_dv,memg_apellido1, memg_apellido2,
            memg_nombre1, memg_nombre2, memg_razonsocial, memg_direccion, memg_departamento, memg_municipio, memg_pago, memg_pais, memg_pagond,
            memg_iva, memg_ivand, memg_retencion, memg_reteasum, memg_retivacomun, memg_retivasimp, memg_retivand, memg_retcree, memg_rasumc)
            values (10019, substr(:inicio,1,4), :item,  :concepto, 43, '222222222', '', '', '',
            '', '', 'CUANTIAS MENORES', :dirmenor, :depmenor, :munmenor, :menorcuantia, :paismenor, :menorpagond,
            :menoriva, :menorivand, :menorrtf, :menorrtfa, :menorrtivac, :menorrtivas, :menorrtivan, :menorrtc, :menorrtca);
        END
    END

end^

SET TERM ; ^

/* 20140421 */
/* NO REPORTE EL DV EXCEPTO SI ES NIT. DETALLE RETENCIONES E IVA SIN MIRAR TOPE DE CUANTIA MENOR */
SET TERM ^ ;

CREATE OR ALTER PROCEDURE MM_1001_9(
    INICIO CHAR(8),
    FINAL CHAR(8))
AS
declare variable IDCONC INTEGER;
declare variable CONCEPTO INTEGER;
declare variable TIPODOC INTEGER;
declare variable NIT VARCHAR(20) CHARACTER SET NONE;
declare variable DV CHAR(1) CHARACTER SET NONE;
declare variable APELLIDO1 VARCHAR(60) CHARACTER SET NONE;
declare variable APELLIDO2 VARCHAR(60) CHARACTER SET NONE;
declare variable NOMBRE1 VARCHAR(60) CHARACTER SET NONE;
declare variable NOMBRE2 VARCHAR(60) CHARACTER SET NONE;
declare variable RAZONSOCIAL VARCHAR(450) CHARACTER SET NONE;
declare variable DIRECCION VARCHAR(200) CHARACTER SET NONE;
declare variable SIMPLIFICA CHAR(1) CHARACTER SET NONE;
declare variable DEPARTAMENTO CHAR(2) CHARACTER SET NONE;
declare variable MUNICIPIO CHAR(3) CHARACTER SET NONE;
declare variable PAIS CHAR(3) CHARACTER SET NONE;
declare variable PAGO NUMERIC(18,0);
declare variable PAGOND NUMERIC(18,0);
declare variable IVA NUMERIC(18,0);
declare variable IVAND NUMERIC(18,0);
declare variable RTFTE NUMERIC(18,0);
declare variable RTFTEA NUMERIC(18,0);
declare variable RTIVAC NUMERIC(18,0);
declare variable RTIVAS NUMERIC(18,0);
declare variable RTIVAND NUMERIC(18,0);
declare variable RTCREE NUMERIC(18,0);
declare variable RTCREEA NUMERIC(18,0);
declare variable DEBITOS NUMERIC(18,2);
declare variable CREDITOS NUMERIC(18,2);
declare variable MINIMO NUMERIC(18,2);
declare variable MENORCUANTIA NUMERIC(18,2);
declare variable MENORPAGOND NUMERIC(18,2);
declare variable MENORRTF NUMERIC(18,2);
declare variable MENORRTFA NUMERIC(18,2);
declare variable MENORRTC NUMERIC(18,2);
declare variable MENORRTCA NUMERIC(18,2);
declare variable MENORIVA NUMERIC(18,2);
declare variable MENORIVAND NUMERIC(18,2);
declare variable MENORRTIVAC NUMERIC(18,2);
declare variable MENORRTIVAS NUMERIC(18,2);
declare variable MENORRTIVAN NUMERIC(18,2);
declare variable TOTALTERC NUMERIC(18,2);
declare variable TOTALTDB NUMERIC(18,2);
declare variable TOTALTCR NUMERIC(18,2);
declare variable ITEM integer;
declare variable DIRMENOR VARCHAR(200) CHARACTER SET NONE;
declare variable DEPMENOR CHAR(2) CHARACTER SET NONE;
declare variable MUNMENOR CHAR(3) CHARACTER SET NONE;
declare variable PAISMENOR CHAR(3) CHARACTER SET NONE;
declare variable NATUR CHAR(1);
declare variable TIPOID CHAR(1);
begin
EXECUTE PROCEDURE lee_configuracion('CONTABILIDAD', 'GENERAL', 'NIT COMPAÑIA') returning_values (:NIT);
SELECT TERC_DIR, SUBSTR(CIUD_COD,1,2), SUBSTR(CIUD_COD,3,5), PAIS_ID FROM TERCEROS WHERE TERC_NIT = :NIT
    INTO :dirmenor, :depmenor, :munmenor, :paismenor;
ITEM = 0;
FOR SELECT COME_ITEM, COME_RESPUESTA, COME_MINIMO, COME_NATUR FROM CONFIGURA_MEDIOSMAG
    WHERE COME_FORMATO = '10019' ORDER BY COME_ITEM INTO :idconc, :CONCEPTO , :MINIMO, :NATUR
    DO
    BEGIN
    MENORCUANTIA = 0;
    MENORPAGOND = 0;
    MENORRTF = 0;
    MENORRTFA = 0;
    MENORIVA = 0;
    MENORIVAND = 0;
    MENORRTIVAC = 0;
    MENORRTIVAS = 0;
    MENORRTIVAN = 0;
    FOR SELECT MAX(D.TERC_NIT), SUM(CODE_DEBITO-CODE_CREDITO), SUM(CODE_DEBITO), SUM(CODE_CREDITO)
        FROM COMPROBANTE_DETALLE D, COMPROBANTE_ENCABEZADO E, mediosmag_cuentas M
        WHERE M.mmcu_item = :idconc AND SUBSTR(CUEN_COD,1,STRLEN(M.mmcu_cuenta)) = M.mmcu_cuenta AND m.mmcu_cuenta <> '' AND
        E.ENCO_CONSEC = D.ENCO_CONSEC AND ENCO_FECHA >= :INICIO AND ENCO_FECHA <= :FINAL AND
        ((CODE_CREDITO <> 0) or (CODE_DEBITO <> 0))
        GROUP BY D.TERC_NIT
        INTO :NIT, :PAGO, :debitos, :creditos
        DO
        BEGIN
        /* TOTAL POR TERCERO */
        SELECT SUM(CODE_DEBITO-CODE_CREDITO), SUM(CODE_DEBITO), SUM(CODE_CREDITO) FROM COMPROBANTE_DETALLE D, COMPROBANTE_ENCABEZADO E, mediosmag_cuentas M, configura_mediosmag C
            WHERE C.come_formato = 10019 AND C.come_item = M.mmcu_item AND SUBSTR(D.CUEN_COD,1,STRLEN(M.mmcu_cuenta)) = M.mmcu_cuenta AND m.mmcu_cuenta <> '' AND
            E.ENCO_CONSEC = D.ENCO_CONSEC AND ENCO_FECHA >= :inicio AND ENCO_FECHA <= :final AND
            D.TERC_NIT = :NIT INTO :TOTALTERC, :TOTALTDB, :TOTALTCR;
        if (totalterc is null) then
            totalterc = 0;
        if (totaltdb is null) then
            totaltdb = 0;
        if (totaltcr is null) then
            totaltcr = 0;
        if (NATUR = 'D') then
            BEGIN
            pago = debitos;
            TOTALTERC = TOTALTDB;
            END
        if (NATUR = 'C') then
            BEGIN
            pago = creditos;
            TOTALTERC = TOTALTCR;
            END
        /* EL IVA DESCONTABLE */
        SELECT SUM(CODE_DEBITO-CODE_CREDITO), SUM(CODE_DEBITO), SUM(CODE_CREDITO)
        FROM COMPROBANTE_DETALLE D, COMPROBANTE_ENCABEZADO E, mediosmag_cuentas M
        WHERE M.mmcu_item = :idconc AND SUBSTR(CUEN_COD,1,STRLEN(M.mmcu_ctaiva)) = M.mmcu_ctaiva AND D.code_descontable = 'S' AND m.mmcu_ctaiva <> '' AND
        E.ENCO_CONSEC = D.ENCO_CONSEC AND ENCO_FECHA >= :INICIO AND ENCO_FECHA <= :FINAL AND D.TERC_NIT = :NIT AND
        ((CODE_CREDITO <> 0) or (CODE_DEBITO <> 0)) INTO :iva, :debitos, :creditos;
        if (NATUR = 'D') then
            IVA = debitos;
        if (NATUR = 'C') then
            IVA = creditos;
        if (IVA IS NULL) then
            IVA = 0;
        /* LAS RETENCIONES RENTA */
        SELECT SUM(CODE_CREDITO-CODE_DEBITO), SUM(CODE_DEBITO), SUM(CODE_CREDITO)
        FROM COMPROBANTE_DETALLE D, COMPROBANTE_ENCABEZADO E, mediosmag_cuentas M
        WHERE M.mmcu_item = :idconc AND SUBSTR(CUEN_COD,1,STRLEN(M.mmcu_ctartf)) = M.mmcu_ctartf AND D.code_descontable = 'S' AND m.mmcu_ctartf <> '' AND
        E.ENCO_CONSEC = D.ENCO_CONSEC AND ENCO_FECHA >= :INICIO AND ENCO_FECHA <= :FINAL AND D.TERC_NIT = :NIT AND
        ((CODE_CREDITO <> 0) or (CODE_DEBITO <> 0)) INTO :RTFTE, :debitos, :creditos;
        if (NATUR = 'D') then
            RTFTE = debitos;
        if (NATUR = 'C') then
            RTFTE = creditos;
        if (RTFTE IS NULL) then
            RTFTE = 0;
        if (((TOTALTERC >= :MINIMO) AND (PAGO > 0)) or (IVA <> 0) or (RTFTE <> 0))  then
            BEGIN   
            SELECT TERC_NOM, TERC_NOMBRE1, TERC_NOMBRE2, TERC_APELLIDO1, TERC_APELLIDO2, TERC_DV, TERC_SIMPLIFICA,
                TERC_DIR, SUBSTR(CIUD_COD,1,2), SUBSTR(CIUD_COD,3,5), PAIS_ID, T.TERC_TIPOID
                FROM TERCEROS T WHERE TERC_NIT = :NIT
                INTO :RAZONSOCIAL, :NOMBRE1, :NOMBRE2, :APELLIDO1, :APELLIDO2, :DV, :SIMPLIFICA,
                :DIRECCION, :DEPARTAMENTO, :MUNICIPIO, :PAIS, :TIPOID;
            select TIID_CODIGO FROM TIPO_ID WHERE TIID_COD = :TIPOID INTO :TIPODOC;
            if (:TIPOID <> 'J') then
                begin
                RAZONSOCIAL = '';
                if (:TIPOID <> 'N') then
                    DV = '';
                end
            /* LOS NO DEDUCIBLES */
            SELECT SUM(CODE_DEBITO-CODE_CREDITO), SUM(CODE_DEBITO), SUM(CODE_CREDITO)
            FROM COMPROBANTE_DETALLE D, COMPROBANTE_ENCABEZADO E, mediosmag_cuentas M
            WHERE M.mmcu_item = :idconc AND SUBSTR(CUEN_COD,1,STRLEN(M.mmcu_cuenta)) = M.mmcu_cuenta AND m.mmcu_cuenta <> '' AND 
            E.ENCO_CONSEC = D.ENCO_CONSEC AND ENCO_FECHA >= :INICIO AND ENCO_FECHA <= :FINAL AND D.TERC_NIT = :NIT AND
            ((CODE_CREDITO <> 0) or (CODE_DEBITO <> 0)) AND D.code_descontable = 'N' INTO :PAGOND, :debitos, :creditos;
            if (NATUR = 'D') then
                pagond = debitos;
            if (NATUR = 'C') then
                pagond = creditos;
            if (PAGOND IS NULL) then
                PAGOND = 0;
            PAGO = PAGO - PAGOND;

            if (exists (select memg_nit from medios_magneticos_datos where memg_formato = 10019 and memg_ano = substr(:inicio,1,4)
                and memg_nit = :nit and memg_iva = :iva)) then
                IVA = 0;
            /* EL IVA NO DESCONTABLE */
            SELECT SUM(CODE_DEBITO-CODE_CREDITO), SUM(CODE_DEBITO), SUM(CODE_CREDITO)
            FROM COMPROBANTE_DETALLE D, COMPROBANTE_ENCABEZADO E, mediosmag_cuentas M
            WHERE M.mmcu_item = :idconc AND SUBSTR(CUEN_COD,1,STRLEN(M.mmcu_ctaivand)) = M.mmcu_ctaivand AND m.mmcu_ctaivand <> '' AND
            E.ENCO_CONSEC = D.ENCO_CONSEC AND ENCO_FECHA >= :INICIO AND ENCO_FECHA <= :FINAL AND D.TERC_NIT = :NIT AND
            ((CODE_CREDITO <> 0) or (CODE_DEBITO <> 0)) INTO :ivand, :debitos, :creditos;
            if (NATUR = 'D') then
                IVAND = debitos;
            if (NATUR = 'C') then
                IVAND = creditos;
            if (IVAND IS NULL) then
                IVAND = 0;
            if (exists (select memg_nit from medios_magneticos_datos where memg_formato = 10019 and memg_ano = substr(:inicio,1,4)
                and memg_nit = :nit and memg_ivand = :ivand)) then
                IVAND = 0;

            if (exists (select memg_nit from medios_magneticos_datos where memg_formato = 10019 and memg_ano = substr(:inicio,1,4)
                and memg_nit = :nit and memg_retencion = :rtfte)) then
                RTFTE = 0;
            
            /* LAS RETENCIONES RENTA ASUMIDAS */
            SELECT SUM(CODE_CREDITO-CODE_DEBITO), SUM(CODE_DEBITO), SUM(CODE_CREDITO)
            FROM COMPROBANTE_DETALLE D, COMPROBANTE_ENCABEZADO E, mediosmag_cuentas M
            WHERE M.mmcu_item = :idconc AND SUBSTR(CUEN_COD,1,STRLEN(M.mmcu_ctartf)) = M.mmcu_ctartf AND D.code_descontable = 'N' AND m.mmcu_ctartf <> '' AND
            E.ENCO_CONSEC = D.ENCO_CONSEC AND ENCO_FECHA >= :INICIO AND ENCO_FECHA <= :FINAL AND D.TERC_NIT = :NIT AND
            ((CODE_CREDITO <> 0) or (CODE_DEBITO <> 0)) INTO :RTFTEA, :debitos, :creditos;
            if (NATUR = 'D') then
                RTFTEA = debitos;
            if (NATUR = 'C') then
                RTFTEA = creditos;
            if (RTFTEA IS NULL) then
                RTFTEA = 0;
            if (exists (select memg_nit from medios_magneticos_datos where memg_formato = 10019 and memg_ano = substr(:inicio,1,4)
                and memg_nit = :nit and memg_reteasum = :rtftea)) then
                RTFTEA = 0;
            if (rtftea < 0) then
                rtftea = rtftea * -1;
            /* LAS RETENCIONES IVA */
            SELECT SUM(CODE_CREDITO-CODE_DEBITO), SUM(CODE_DEBITO), SUM(CODE_CREDITO)
            FROM COMPROBANTE_DETALLE D, COMPROBANTE_ENCABEZADO E, mediosmag_cuentas M
            WHERE M.mmcu_item = :idconc AND SUBSTR(CUEN_COD,1,STRLEN(M.mmcu_ctartiva)) = M.mmcu_ctartiva AND m.mmcu_ctartiva <> '' AND
            E.ENCO_CONSEC = D.ENCO_CONSEC AND ENCO_FECHA >= :INICIO AND ENCO_FECHA <= :FINAL AND D.TERC_NIT = :NIT AND
            ((CODE_CREDITO <> 0) or (CODE_DEBITO <> 0)) INTO :RTIVAC, :debitos, :creditos;
            if (NATUR = 'D') then
                RTIVAC = debitos;
            if (NATUR = 'C') then
                RTIVAC = creditos;
            if (RTIVAC IS NULL) then
                RTIVAC = 0;
--            if (SIMPLIFICA = 'S') then
                BEGIN
                RTIVAS = RTIVAC;
                RTIVAC = 0;
                rtivand = 0;
                END
--            ELSE
                if (pais <> '169') then
                    BEGIN
                    rtivand = RTIVAS;
                    RTIVAC = 0;
                    RTIVAS = 0;
                    END
/*                ELSE
                    begin
                    RTIVAS = 0;
                    rtivand = 0;
                    end */
            if (exists (select memg_nit from medios_magneticos_datos where memg_formato = 10019 and memg_ano = substr(:inicio,1,4)
                and memg_nit = :nit and ((memg_retivacomun = :rtivac) or (memg_retivasimp = :rtivas) or (memg_retivand = :rtivand)))) then
                BEGIN
                rtivand = 0;
                RTIVAC = 0;
                RTIVAS = 0;
                END
            /* LA RETENCION CREE */
            SELECT SUM(CODE_CREDITO-CODE_DEBITO), SUM(CODE_DEBITO), SUM(CODE_CREDITO)
            FROM COMPROBANTE_DETALLE D, COMPROBANTE_ENCABEZADO E, mediosmag_cuentas M
            WHERE M.mmcu_item = :idconc AND SUBSTR(CUEN_COD,1,STRLEN(M.mmcu_ctarcree)) = M.mmcu_ctarcree AND D.code_descontable = 'S' AND m.mmcu_ctarcree <> '' AND
            E.ENCO_CONSEC = D.ENCO_CONSEC AND ENCO_FECHA >= :INICIO AND ENCO_FECHA <= :FINAL AND D.TERC_NIT = :NIT AND
            ((CODE_CREDITO <> 0) or (CODE_DEBITO <> 0)) INTO :rtcree, :debitos, :creditos;
            if (NATUR = 'D') then
                rtcree = debitos;
            if (NATUR = 'C') then
                rtcree = creditos;
            if (rtcree IS NULL) then
                rtcree = 0;
            if (exists (select memg_nit from medios_magneticos_datos MD where memg_formato = 10019 and memg_ano = substr(:inicio,1,4)
                and memg_nit = :nit and MD.memg_retcree = :rtcree)) then
                rtcree = 0;
            
            /* LAS RETENCIONES CREE ASUMIDAS */
            SELECT SUM(CODE_CREDITO-CODE_DEBITO), SUM(CODE_DEBITO), SUM(CODE_CREDITO)
            FROM COMPROBANTE_DETALLE D, COMPROBANTE_ENCABEZADO E, mediosmag_cuentas M
            WHERE M.mmcu_item = :idconc AND SUBSTR(CUEN_COD,1,STRLEN(M.mmcu_ctartcreeas)) = M.mmcu_ctartcreeas AND m.mmcu_ctartcreeas <> '' AND
            E.ENCO_CONSEC = D.ENCO_CONSEC AND ENCO_FECHA >= :INICIO AND ENCO_FECHA <= :FINAL AND D.TERC_NIT = :NIT AND
            ((CODE_CREDITO <> 0) or (CODE_DEBITO <> 0)) INTO :rtcreea, :debitos, :creditos;
            if (NATUR = 'D') then
                rtcreea = debitos;
            if (NATUR = 'C') then
                rtcreea = creditos;
            if (rtcreea IS NULL) then
                rtcreea = 0;
            if (rtcreea < 0) then
                rtcreea = rtcreea * -1;
            if (exists (select memg_nit from medios_magneticos_datos MD where memg_formato = 10019 and memg_ano = substr(:inicio,1,4)
                and memg_nit = :nit and MD.memg_rasumc = :rtcreea)) then
                rtcreea = 0;

            ITEM = ITEM + 1;
            insert into medios_magneticos_datos (memg_formato, memg_ano, memg_item, memg_concepto, memg_tipodoc, memg_nit, memg_dv,memg_apellido1, memg_apellido2,
                memg_nombre1, memg_nombre2, memg_razonsocial, memg_direccion, memg_departamento, memg_municipio, memg_pago, memg_pais, memg_pagond,
                memg_iva, memg_ivand, memg_retencion, memg_reteasum, memg_retivacomun, memg_retivasimp, memg_retivand, memg_retcree, memg_rasumc)
                values (10019, substr(:inicio,1,4), :item,  :concepto, :tipodoc, :nit, :dv, :apellido1, :apellido2,
                :nombre1, :nombre2, :razonsocial, :direccion, :departamento, :municipio, :pago, :pais, :pagond,
                :iva, :ivand, :rtfte, :rtftea, :rtivac, :rtivas, :rtivand, :rtcree, :rtcreea);
            END
        ELSE
            BEGIN
            /* LAS CUANTIAS MENORES */
            SELECT SUM(CODE_DEBITO-CODE_CREDITO), SUM(CODE_DEBITO), SUM(CODE_CREDITO)
            FROM COMPROBANTE_DETALLE D, COMPROBANTE_ENCABEZADO E, mediosmag_cuentas M
            WHERE M.mmcu_item = :idconc AND SUBSTR(CUEN_COD,1,STRLEN(M.mmcu_cuenta)) = M.mmcu_cuenta AND m.mmcu_cuenta <> '' AND 
            E.ENCO_CONSEC = D.ENCO_CONSEC AND ENCO_FECHA >= :INICIO AND ENCO_FECHA <= :FINAL AND D.TERC_NIT = :NIT AND
            ((CODE_CREDITO <> 0) or (CODE_DEBITO <> 0)) AND D.code_descontable = 'N' INTO :PAGOND, :debitos, :creditos;
            if (NATUR = 'D') then
                pagond = debitos;
            if (NATUR = 'C') then
                pagond = creditos;
            if (PAGOND IS NULL) then
                PAGOND = 0;
            PAGO = PAGO - PAGOND;
            MENORCUANTIA = MENORCUANTIA + PAGO;
            MENORPAGOND = MENORPAGOND + PAGOND;
            /* EL IVA DESCONTABLE */
            SELECT SUM(CODE_DEBITO-CODE_CREDITO), SUM(CODE_DEBITO), SUM(CODE_CREDITO)
            FROM COMPROBANTE_DETALLE D, COMPROBANTE_ENCABEZADO E, mediosmag_cuentas M
            WHERE M.mmcu_item = :idconc AND SUBSTR(CUEN_COD,1,STRLEN(M.mmcu_ctaiva)) = M.mmcu_ctaiva AND D.code_descontable = 'S' AND m.mmcu_ctaiva <> '' AND
            E.ENCO_CONSEC = D.ENCO_CONSEC AND ENCO_FECHA >= :INICIO AND ENCO_FECHA <= :FINAL AND D.TERC_NIT = :NIT AND
            ((CODE_CREDITO <> 0) or (CODE_DEBITO <> 0)) INTO :iva, :debitos, :creditos;
            if (NATUR = 'D') then
                IVA = debitos;
            if (NATUR = 'C') then
                IVA = creditos;
            if (IVA IS NULL) then
                IVA = 0;
            MENORIVA = MENORIVA + IVA;
            /* EL IVA NO DESCONTABLE */
            SELECT SUM(CODE_DEBITO-CODE_CREDITO), SUM(CODE_DEBITO), SUM(CODE_CREDITO)
            FROM COMPROBANTE_DETALLE D, COMPROBANTE_ENCABEZADO E, mediosmag_cuentas M
            WHERE M.mmcu_item = :idconc AND SUBSTR(CUEN_COD,1,STRLEN(M.mmcu_ctaivand)) = M.mmcu_ctaivand AND D.code_descontable = 'N' AND m.mmcu_ctaivand <> '' AND
            E.ENCO_CONSEC = D.ENCO_CONSEC AND ENCO_FECHA >= :INICIO AND ENCO_FECHA <= :FINAL AND D.TERC_NIT = :NIT AND
            ((CODE_CREDITO <> 0) or (CODE_DEBITO <> 0)) INTO :ivand, :debitos, :creditos;
            if (NATUR = 'D') then
                IVAND = debitos;
            if (NATUR = 'C') then
                IVAND = creditos;
            if (IVAND IS NULL) then
                IVAND = 0;
            MENORIVAND = MENORIVAND + IVAND;
            /* LAS RETENCIONES RENTA */
            SELECT SUM(CODE_CREDITO-CODE_DEBITO), SUM(CODE_DEBITO), SUM(CODE_CREDITO)
            FROM COMPROBANTE_DETALLE D, COMPROBANTE_ENCABEZADO E, mediosmag_cuentas M
            WHERE M.mmcu_item = :idconc AND SUBSTR(CUEN_COD,1,STRLEN(M.mmcu_ctartf)) = M.mmcu_ctartf AND D.code_descontable = 'S' AND m.mmcu_ctartf <> '' AND
            E.ENCO_CONSEC = D.ENCO_CONSEC AND ENCO_FECHA >= :INICIO AND ENCO_FECHA <= :FINAL AND D.TERC_NIT = :NIT AND
            ((CODE_CREDITO <> 0) or (CODE_DEBITO <> 0)) INTO :RTFTE, :debitos, :creditos;
            if (NATUR = 'D') then
                RTFTE = debitos;
            if (NATUR = 'C') then
                RTFTE = creditos;
            if (RTFTE IS NULL) then
                RTFTE = 0;
            MENORRTF = MENORRTF + RTFTE;
            /* LAS RETENCIONES RENTA ASUMIDAS */
            SELECT SUM(CODE_CREDITO-CODE_DEBITO), SUM(CODE_DEBITO), SUM(CODE_CREDITO)
            FROM COMPROBANTE_DETALLE D, COMPROBANTE_ENCABEZADO E, mediosmag_cuentas M
            WHERE M.mmcu_item = :idconc AND SUBSTR(CUEN_COD,1,STRLEN(M.mmcu_ctartf)) = M.mmcu_ctartf AND D.code_descontable = 'N' AND m.mmcu_ctartf <> '' AND
            E.ENCO_CONSEC = D.ENCO_CONSEC AND ENCO_FECHA >= :INICIO AND ENCO_FECHA <= :FINAL AND D.TERC_NIT = :NIT AND
            ((CODE_CREDITO <> 0) or (CODE_DEBITO <> 0)) INTO :RTFTEA, :debitos, :creditos;
            if (NATUR = 'D') then
                RTFTEA = debitos;
            if (NATUR = 'C') then
                RTFTEA = creditos;
            if (RTFTEA IS NULL) then
                RTFTEA = 0;
            MENORRTFA = MENORRTFA + RTFTEA;
            /* LAS RETENCIONES IVA */
            SELECT SUM(CODE_CREDITO-CODE_DEBITO), SUM(CODE_DEBITO), SUM(CODE_CREDITO)
            FROM COMPROBANTE_DETALLE D, COMPROBANTE_ENCABEZADO E, mediosmag_cuentas M
            WHERE M.mmcu_item = :idconc AND SUBSTR(CUEN_COD,1,STRLEN(M.mmcu_ctartiva)) = M.mmcu_ctartiva AND m.mmcu_ctartiva <> '' AND
            E.ENCO_CONSEC = D.ENCO_CONSEC AND ENCO_FECHA >= :INICIO AND ENCO_FECHA <= :FINAL AND D.TERC_NIT = :NIT AND
            ((CODE_CREDITO <> 0) or (CODE_DEBITO <> 0)) INTO :RTIVAC, :debitos, :creditos;
            if (NATUR = 'D') then
                RTIVAC = debitos;
            if (NATUR = 'C') then
                RTIVAC = creditos;
            if (RTIVAC IS NULL) then
                RTIVAC = 0;
            if (SIMPLIFICA = 'S') then
                BEGIN
                RTIVAS = RTIVAC;
                RTIVAC = 0;
                rtivand = 0;
                END
            ELSE
                if (pais <> '169') then
                    BEGIN
                    rtivand = RTIVAC;
                    RTIVAC = 0;
                    RTIVAS = 0;
                    END
                ELSE
                    begin
                    RTIVAS = 0;
                    rtivand = 0;
                    end
            MENORRTIVAC = MENORIVA + RTIVAC;
            MENORRTIVAS = MENORIVA + RTIVAS;
            MENORRTIVAN = MENORIVA + RTIVAND;
            /* LA RETENCION CREE */
            SELECT SUM(CODE_CREDITO-CODE_DEBITO), SUM(CODE_DEBITO), SUM(CODE_CREDITO)
            FROM COMPROBANTE_DETALLE D, COMPROBANTE_ENCABEZADO E, mediosmag_cuentas M
            WHERE M.mmcu_item = :idconc AND SUBSTR(CUEN_COD,1,STRLEN(M.mmcu_ctarcree)) = M.mmcu_ctarcree AND D.code_descontable = 'S' AND m.mmcu_ctarcree <> '' AND
            E.ENCO_CONSEC = D.ENCO_CONSEC AND ENCO_FECHA >= :INICIO AND ENCO_FECHA <= :FINAL AND D.TERC_NIT = :NIT AND
            ((CODE_CREDITO <> 0) or (CODE_DEBITO <> 0)) INTO :rtcree, :debitos, :creditos;
            if (NATUR = 'D') then
                rtcree = debitos;
            if (NATUR = 'C') then
                rtcree = creditos;
            if (RTFTE IS NULL) then
                rtcree = 0;
            MENORRTC = MENORRTC + rtcree;
            /* LA RETENCION CREE ASUMIDA */
            SELECT SUM(CODE_CREDITO-CODE_DEBITO), SUM(CODE_DEBITO), SUM(CODE_CREDITO)
            FROM COMPROBANTE_DETALLE D, COMPROBANTE_ENCABEZADO E, mediosmag_cuentas M
            WHERE M.mmcu_item = :idconc AND SUBSTR(CUEN_COD,1,STRLEN(M.mmcu_ctartcreeas)) = M.mmcu_ctartcreeas AND D.code_descontable = 'N' AND m.mmcu_ctartcreeas <> '' AND
            E.ENCO_CONSEC = D.ENCO_CONSEC AND ENCO_FECHA >= :INICIO AND ENCO_FECHA <= :FINAL AND D.TERC_NIT = :NIT AND
            ((CODE_CREDITO <> 0) or (CODE_DEBITO <> 0)) INTO :rtcreea, :debitos, :creditos;
            if (NATUR = 'D') then
                rtcreea = debitos;
            if (NATUR = 'C') then
                rtcreea = creditos;
            if (rtcreea IS NULL) then
                rtcreea = 0;
            menorrtca = menorrtca + rtcreea;
            END
        END
    if (MENORCUANTIA <> 0) then
        BEGIN
        if (menoriva IS NULL) then
            menoriva = 0;
        if (menorivand IS NULL) then
            menorivand = 0;
        if (menorpagond IS NULL) then
            menorpagond = 0;
        if (menorrtc IS NULL) then
            menorrtc = 0;
        if (menorrtca IS NULL) then
            menorrtca = 0;
        if (menorrtf IS NULL) then
            menorrtf = 0;
        if (menorrtfa IS NULL) then
            menorrtfa = 0;
        if (menorrtivac IS NULL) then
            menorrtivac = 0;
        if (menorrtivan IS NULL) then
            menorrtivan = 0;
        if (menorrtivas IS NULL) then
            menorrtivas = 0;
        ITEM = ITEM + 1;
        insert into medios_magneticos_datos (memg_formato, memg_ano, memg_item, memg_concepto, memg_tipodoc, memg_nit, memg_dv,memg_apellido1, memg_apellido2,
            memg_nombre1, memg_nombre2, memg_razonsocial, memg_direccion, memg_departamento, memg_municipio, memg_pago, memg_pais, memg_pagond,
            memg_iva, memg_ivand, memg_retencion, memg_reteasum, memg_retivacomun, memg_retivasimp, memg_retivand, memg_retcree, memg_rasumc)
            values (10019, substr(:inicio,1,4), :item,  :concepto, 43, '222222222', '', '', '',
            '', '', 'CUANTIAS MENORES', :dirmenor, :depmenor, :munmenor, :menorcuantia, :paismenor, :menorpagond,
            :menoriva, :menorivand, :menorrtf, :menorrtfa, :menorrtivac, :menorrtivas, :menorrtivan, :menorrtc, :menorrtca);
        END
    END

end^

SET TERM ; ^

/* 20140421B */
/* no deje el concepto vacio */
UPDATE CONFIGURA_MEDIOSMAG
SET COME_RESPUESTA = '10057',
    COME_NATUR = 'D'
WHERE (COME_ITEM = 100571);
commit work;

/* 20140425B */
/* REPORTE SOLO CUENTAS AFECTABLES */
SET TERM ^ ;

CREATE OR ALTER procedure MM_1012 (
    INICIO char(8),
    FINAL char(8))
AS
declare variable CONCEPTO INTEGER;
declare variable TIPODOC INTEGER;
declare variable NIT VARCHAR(15) CHARACTER SET NONE;
declare variable DV CHAR(1) CHARACTER SET NONE;
declare variable APELLIDO1 VARCHAR(60) CHARACTER SET NONE;
declare variable APELLIDO2 VARCHAR(60) CHARACTER SET NONE;
declare variable NOMBRE1 VARCHAR(60) CHARACTER SET NONE;
declare variable NOMBRE2 VARCHAR(60) CHARACTER SET NONE;
declare variable RAZONSOCIAL VARCHAR(450) CHARACTER SET NONE;
declare variable PAIS VARCHAR(3) CHARACTER SET NONE;
declare variable SALDO NUMERIC(18,0);
declare variable SALDOAUX NUMERIC(18,0);
declare variable CUENTA VARCHAR(20);
declare variable ITEM INTEGER;
declare variable ANO CHAR(4);
begin
ITEM = 0;
ANO = SUBSTR(INICIO,1,4);
/* SALDOS EN BANCOS NACIONALES */
EXECUTE PROCEDURE lee_configuracion('CONTABILIDAD', 'GENERAL', 'NIT COMPAÑIA') returning_values (NIT);
SELECT TERC_NOM, TERC_NOMBRE1, TERC_NOMBRE2, TERC_APELLIDO1, TERC_APELLIDO2, TERC_DV, TIID_CODIGO, PAIS_ID
    FROM TERCEROS T left outer join TIPO_ID IT on (T.TERC_TIPOID = IT.TIID_COD) WHERE TERC_NIT = :NIT
    INTO :RAZONSOCIAL, :NOMBRE1, :NOMBRE2, :APELLIDO1, :APELLIDO2, :DV, :TIPODOC, :PAIS;
select COME_RESPUESTA FROM configura_mediosmag WHERE COME_ITEM = 82 INTO :CONCEPTO;
FOR SELECT CUEN_COD, CUEN_NOM FROM CUENTAS WHERE CUEN_AFECTABLE = 'S' AND ((SUBSTR(CUEN_COD,1,6) = '111005') OR
    (SUBSTR(CUEN_COD,1,4) = '1120')) ORDER BY CUEN_COD INTO :CUENTA, :razonsocial
    do
    BEGIN
    SALDO = 0;
    EXECUTE PROCEDURE saldo_cuenta_mes(CUENTA, ANO, 12, 'N') RETURNING_VALUES (SALDO);
    if (SALDO > 0) then
        BEGIN
        ITEM = ITEM + 1;
        insert into medios_magneticos_datos (memg_formato, memg_ano, memg_item, memg_concepto, memg_tipodoc, memg_nit, memg_dv,memg_apellido1, memg_apellido2,
            memg_nombre1, memg_nombre2, memg_razonsocial, memg_pago, memg_pais)
            values (10127, :ANO, :item,  :concepto, :tipodoc, :nit, :dv, :apellido1, :apellido2,
            :nombre1, :nombre2, :razonsocial, :SALDO, :pais);
        END
    END
/* SALDOS EN BANCOS EXTERIOR CONSOLIDADO */
EXECUTE PROCEDURE saldo_cuentaf ('111010', FINAL) returning_values (SALDO);
ITEM = ITEM + 1;
TIPODOC = 31;
NIT = '444444000';
RAZONSOCIAL = 'OPERACIONES DEL EXTERIOR';
APELLIDO1 = '';
APELLIDO2 = '';
NOMBRE1 = '';
NOMBRE2 = '';
if (SALDO > 0) then
    BEGIN
    ITEM = ITEM + 1;
    insert into medios_magneticos_datos (memg_formato, memg_ano, memg_item, memg_concepto, memg_tipodoc, memg_nit, memg_dv,memg_apellido1, memg_apellido2,
        memg_nombre1, memg_nombre2, memg_razonsocial, memg_pago, memg_pais)
        values (10127, :ANO, :item,  :concepto, :tipodoc, :nit, :dv, :apellido1, :apellido2,
        :nombre1, :nombre2, :razonsocial, :SALDO, :pais);
    END
/* SALDOS INVERSIONES EN BONOS */
EXECUTE PROCEDURE lee_configuracion('CONTABILIDAD', 'GENERAL', 'NIT COMPAÑIA') returning_values (NIT);
SELECT TERC_NOM, TERC_NOMBRE1, TERC_NOMBRE2, TERC_APELLIDO1, TERC_APELLIDO2, TERC_DV, TIID_CODIGO, PAIS_ID
    FROM TERCEROS T left outer join TIPO_ID IT on (T.TERC_TIPOID = IT.TIID_COD) WHERE TERC_NIT = :NIT
    INTO :RAZONSOCIAL, :NOMBRE1, :NOMBRE2, :APELLIDO1, :APELLIDO2, :DV, :TIPODOC, :PAIS;
select COME_RESPUESTA FROM configura_mediosmag WHERE COME_ITEM = 83 INTO :CONCEPTO;
FOR SELECT CUEN_COD, CUEN_NOM FROM CUENTAS WHERE CUEN_AFECTABLE = 'S' AND SUBSTR(CUEN_COD,1,4) = '1215' ORDER BY CUEN_COD INTO :cuenta, :razonsocial
    do
    BEGIN
    SALDO = 0;
    EXECUTE PROCEDURE saldo_cuenta_mes(CUENTA, ANO, 12, 'N') RETURNING_VALUES (SALDO);
    if (SALDO > 0) then
        BEGIN
        ITEM = ITEM + 1;
        insert into medios_magneticos_datos (memg_formato, memg_ano, memg_item, memg_concepto, memg_tipodoc, memg_nit, memg_dv,memg_apellido1, memg_apellido2,
            memg_nombre1, memg_nombre2, memg_razonsocial, memg_pago, memg_pais)
            values (10127, :ANO, :item,  :concepto, :tipodoc, :nit, :dv, :apellido1, :apellido2,
            :nombre1, :nombre2, :razonsocial, :SALDO, :pais);
        END
    END
/* SALDOS INVERSIONES EN CDTS */
select COME_RESPUESTA FROM configura_mediosmag WHERE COME_ITEM = 84 INTO :CONCEPTO;
FOR SELECT CUEN_COD, CUEN_NOM FROM CUENTAS WHERE SUBSTR(CUEN_COD,1,4) = '1225' and CUEN_AFECTABLE = 'S' ORDER BY CUEN_COD INTO :cuenta, :razonsocial
    do
    BEGIN
    SALDO = 0;
    EXECUTE PROCEDURE saldo_cuenta_mes(CUENTA, ANO, 12, 'N') RETURNING_VALUES (SALDO);
    if (SALDO > 0) then
        BEGIN
        ITEM = ITEM + 1;
        insert into medios_magneticos_datos (memg_formato, memg_ano, memg_item, memg_concepto, memg_tipodoc, memg_nit, memg_dv,memg_apellido1, memg_apellido2,
            memg_nombre1, memg_nombre2, memg_razonsocial, memg_pago, memg_pais)
            values (10127, :ANO, :item,  :concepto, :tipodoc, :nit, :dv, :apellido1, :apellido2,
            :nombre1, :nombre2, :razonsocial, :SALDO, :pais);
        END
    END
/* SALDOS INVERSIONES EN TITULOS */
select COME_RESPUESTA FROM configura_mediosmag WHERE COME_ITEM = 85 INTO :CONCEPTO;
FOR SELECT CUEN_COD, CUEN_NOM FROM CUENTAS WHERE SUBSTR(CUEN_COD,1,4) = '1235' and CUEN_AFECTABLE = 'S' ORDER BY CUEN_COD INTO :cuenta, :razonsocial
    do
    BEGIN
    SALDO = 0;
    EXECUTE PROCEDURE saldo_cuenta_mes(CUENTA, ANO, 12, 'N') RETURNING_VALUES (SALDO);
    if (SALDO > 0) then
        BEGIN
        ITEM = ITEM + 1;
        insert into medios_magneticos_datos (memg_formato, memg_ano, memg_item, memg_concepto, memg_tipodoc, memg_nit, memg_dv,memg_apellido1, memg_apellido2,
            memg_nombre1, memg_nombre2, memg_razonsocial, memg_pago, memg_pais)
            values (10127, :ANO, :item,  :concepto, :tipodoc, :nit, :dv, :apellido1, :apellido2,
            :nombre1, :nombre2, :razonsocial, :SALDO, :pais);
        END
    END
/* SALDOS INVERSIONES EN DERECHOS FID. */
select COME_RESPUESTA FROM configura_mediosmag WHERE COME_ITEM = 86 INTO :CONCEPTO;
FOR SELECT distinct TERC_NIT FROM SALDOS_TERCEROS WHERE SUBSTR(CUEN_COD,1,4) = '1245' ORDER BY TERC_NIT INTO :NIT
    do
    BEGIN
    SELECT TERC_NOM, TERC_NOMBRE1, TERC_NOMBRE2, TERC_APELLIDO1, TERC_APELLIDO2, TERC_DV, TIID_CODIGO, PAIS_ID
        FROM TERCEROS T left outer join TIPO_ID IT on (T.TERC_TIPOID = IT.TIID_COD) WHERE TERC_NIT = :NIT
        INTO :RAZONSOCIAL, :NOMBRE1, :NOMBRE2, :APELLIDO1, :APELLIDO2, :DV, :TIPODOC, :PAIS;
    SALDO = 0;
    FOR SELECT DISTINCT CUEN_COD FROM SALDOS_TERCEROS WHERE TERC_NIT = :NIT AND
        SUBSTR(CUEN_COD,1,4) = '1245' INTO :CUENTA
        DO
        BEGIN
        EXECUTE PROCEDURE SALDO_TERCERO_MES(CUENTA, NIT, ANO, 12, 'N') RETURNING_VALUES (SALDOAUX);
        SALDO = SALDO + SALDOAUX;
        END
    if (SALDO > 0) then
        BEGIN
        ITEM = ITEM + 1;
        insert into medios_magneticos_datos (memg_formato, memg_ano, memg_item, memg_concepto, memg_tipodoc, memg_nit, memg_dv,memg_apellido1, memg_apellido2,
            memg_nombre1, memg_nombre2, memg_razonsocial, memg_pago, memg_pais)
            values (10127, :ANO, :item,  :concepto, :tipodoc, :nit, :dv, :apellido1, :apellido2,
            :nombre1, :nombre2, :razonsocial, :SALDO, :pais);
        END
    END
/* SALDOS OTRAS INVERSIONES */
select COME_RESPUESTA FROM configura_mediosmag WHERE COME_ITEM = 87 INTO :CONCEPTO;
FOR SELECT distinct TERC_NIT FROM SALDOS_TERCEROS WHERE SUBSTR(CUEN_COD,1,4) = '1220' OR
    SUBSTR(CUEN_COD,1,4) = '1230' or SUBSTR(CUEN_COD,1,4) = '1240' OR SUBSTR(CUEN_COD,1,4) = '1250' OR
    SUBSTR(CUEN_COD,1,4) = '1255' OR SUBSTR(CUEN_COD,1,4) = '1260' or SUBSTR(CUEN_COD,1,4) = '1295'
    ORDER BY TERC_NIT INTO :NIT
    do
    BEGIN
    SELECT TERC_NOM, TERC_NOMBRE1, TERC_NOMBRE2, TERC_APELLIDO1, TERC_APELLIDO2, TERC_DV, TIID_CODIGO, PAIS_ID
        FROM TERCEROS T left outer join TIPO_ID IT on (T.TERC_TIPOID = IT.TIID_COD) WHERE TERC_NIT = :NIT
        INTO :RAZONSOCIAL, :NOMBRE1, :NOMBRE2, :APELLIDO1, :APELLIDO2, :DV, :TIPODOC, :PAIS;
    SALDO = 0;
    FOR SELECT DISTINCT CUEN_COD FROM SALDOS_TERCEROS WHERE TERC_NIT = :NIT AND
        SUBSTR(CUEN_COD,1,4) = '1220' or SUBSTR(CUEN_COD,1,4) = '1230' or SUBSTR(CUEN_COD,1,4) = '1240' OR
        SUBSTR(CUEN_COD,1,4) = '1250' or SUBSTR(CUEN_COD,1,4) = '1255' OR SUBSTR(CUEN_COD,1,4) = '1260' or
        SUBSTR(CUEN_COD,1,4) = '1295' INTO :CUENTA
        DO
        BEGIN
        EXECUTE PROCEDURE SALDO_TERCERO_MES(CUENTA, NIT, ANO, 12, 'N') RETURNING_VALUES (SALDOAUX);
        SALDO = SALDO + SALDOAUX;
        END
    if (SALDO > 0) then
        BEGIN
        ITEM = ITEM + 1;
        insert into medios_magneticos_datos (memg_formato, memg_ano, memg_item, memg_concepto, memg_tipodoc, memg_nit, memg_dv,memg_apellido1, memg_apellido2,
            memg_nombre1, memg_nombre2, memg_razonsocial, memg_pago, memg_pais)
            values (10127, :ANO, :item,  :concepto, :tipodoc, :nit, :dv, :apellido1, :apellido2,
            :nombre1, :nombre2, :razonsocial, :SALDO, :pais);
        END
    END
/* SALDOS ACCIONES O CUOTAS */
select COME_RESPUESTA FROM configura_mediosmag WHERE COME_ITEM = 88 INTO :CONCEPTO;
FOR SELECT distinct TERC_NIT FROM SALDOS_TERCEROS WHERE SUBSTR(CUEN_COD,1,4) = '1205' OR
    SUBSTR(CUEN_COD,1,4) = '1210' ORDER BY TERC_NIT INTO :NIT
    do
    BEGIN
    SELECT TERC_NOM, TERC_NOMBRE1, TERC_NOMBRE2, TERC_APELLIDO1, TERC_APELLIDO2, TERC_DV, TIID_CODIGO, PAIS_ID
        FROM TERCEROS T left outer join TIPO_ID IT on (T.TERC_TIPOID = IT.TIID_COD) WHERE TERC_NIT = :NIT
        INTO :RAZONSOCIAL, :NOMBRE1, :NOMBRE2, :APELLIDO1, :APELLIDO2, :DV, :TIPODOC, :PAIS;
    SALDO = 0;
    FOR SELECT DISTINCT CUEN_COD FROM SALDOS_TERCEROS WHERE TERC_NIT = :NIT AND
        SUBSTR(CUEN_COD,1,4) = '1205' OR SUBSTR(CUEN_COD,1,4) = '1210' INTO :CUENTA
        DO
        BEGIN
        EXECUTE PROCEDURE SALDO_TERCERO_MES(CUENTA, NIT, ANO, 12, 'N') RETURNING_VALUES (SALDOAUX);
        SALDO = SALDO + SALDOAUX;
        END
    if (SALDO > 0) then
        BEGIN
        ITEM = ITEM + 1;
        insert into medios_magneticos_datos (memg_formato, memg_ano, memg_item, memg_concepto, memg_tipodoc, memg_nit, memg_dv,memg_apellido1, memg_apellido2,
            memg_nombre1, memg_nombre2, memg_razonsocial, memg_pago, memg_pais)
            values (10127, :ANO, :item,  :concepto, :tipodoc, :nit, :dv, :apellido1, :apellido2,
            :nombre1, :nombre2, :razonsocial, :SALDO, :pais);
        END
    END
end
^

SET TERM ; ^

/* 20140529B */
/* MAL ESCRITA CONFIGURACION AÑO BALANCE APERTURA */
SET TERM ^ ;

CREATE OR ALTER TRIGGER SALDOS_INICIALES_NIIF_AI FOR SALDOS_INICIALES_NIIF
ACTIVE AFTER INSERT POSITION 0
AS
DECLARE VARIABLE ANO VARCHAR(4);
DECLARE VARIABLE MES VARCHAR(2);
DECLARE VARIABLE INICIAL VARCHAR(8);
DECLARE VARIABLE EXISTE CHAR(1);
declare variable CUENNIT VARCHAR(40);
BEGIN
/* COMPONGA LA FECHA DE INICIO DE LA COMPAÑIA */
EXECUTE PROCEDURE LEE_CONFIGURACION('CONTABILIDAD', 'GENERAL', 'AÑO BALANCE DE APERTURA NIIF') RETURNING_VALUES (ANO);
MES = 1;
if (strlen(ANO) <> 4) then
    exception ANO_INICIO_INCORRECTO;
ELSE
    if (strlen(MES) = 1) then
        INICIAL = ANO || '0' || MES || '01';
    else
        INICIAL = ANO || MES || '01';
/* Busque en saldos_cuentas la cuenta y la fecha, si la encuentra actualice INICIAL, si no inserte un registro */
EXISTE = 'N';
SELECT 'S' FROM SALDOS_CUENTAS_NIIF
  WHERE (CUEN_COD = new.cuen_cod) AND (SACU_FECHA = :INICIAL) INTO :EXISTE;
IF (EXISTE = 'N') THEN
    BEGIN
    INSERT INTO SALDOS_CUENTAS_NIIF(CUEN_COD, SACU_FECHA, SACU_SALDO, SACU_DEBITO, SACU_CREDITO)
      VALUES (new.cuen_cod, :INICIAL, NEW.SAIN_DEBITO-NEW.SAIN_CREDITO, 0, 0);
    END
ELSE
    BEGIN
    UPDATE SALDOS_CUENTAS_NIIF
      SET SACU_SALDO = SACU_SALDO + NEW.SAIN_DEBITO - NEW.SAIN_CREDITO
      WHERE (CUEN_COD = new.cuen_cod) AND (SACU_FECHA = :INICIAL);
    END
/* Busque en saldos_TERCEROS si la encuentra actualice INICIAL, si no inserte un registro */
EXISTE = 'N';
SELECT 'S' FROM SALDOS_TERCEROS_NIIF
    WHERE (CUEN_COD = NEW.CUEN_COD) AND (TERC_NIT = NEW.TERC_NIT) AND (SACU_FECHA = :INICIAL) INTO :EXISTE;
IF (EXISTE = 'N') THEN
    BEGIN
    INSERT INTO SALDOS_TERCEROS_NIIF(CUEN_COD, TERC_NIT, SACU_FECHA, SATE_SALDO, SATE_DEBITO, SATE_CREDITO)
         VALUES (NEW.CUEN_COD, NEW.TERC_NIT, :INICIAL, NEW.SAIN_DEBITO-NEW.SAIN_CREDITO, 0, 0);
    END
ELSE
    BEGIN
    UPDATE SALDOS_TERCEROS_NIIF
      SET SATE_SALDO = SATE_SALDO + NEW.SAIN_DEBITO - NEW.SAIN_CREDITO
    WHERE (CUEN_COD = NEW.CUEN_COD) AND (TERC_NIT = NEW.TERC_NIT) AND (SACU_FECHA = :INICIAL);
    END
/* Busque en saldos_CENTROS si la encuentra actualice INICIAL, si no inserte un registro */
EXISTE = 'N';
SELECT 'S' FROM SALDOS_CENTROS_NIIF WHERE (CUEN_COD = NEW.CUEN_COD) AND (PROY_COD = NEW.PROY_COD) AND
    (CENT_COD = NEW.CENT_COD) AND (SACU_FECHA = :INICIAL) INTO :EXISTE;
IF (EXISTE = 'N') THEN
    BEGIN
    INSERT INTO SALDOS_CENTROS_NIIF(CUEN_COD, PROY_COD, CENT_COD, SACU_FECHA, SACE_SALDO, SACE_DEBITO, SACE_CREDITO)
        VALUES (NEW.CUEN_COD, NEW.PROY_COD, NEW.CENT_COD, :INICIAL, NEW.SAIN_DEBITO-NEW.SAIN_CREDITO, 0, 0);
    END
ELSE
    BEGIN
    UPDATE SALDOS_CENTROS_NIIF
        SET SACE_SALDO = SACE_SALDO + NEW.SAIN_DEBITO - NEW.SAIN_CREDITO
    WHERE (CUEN_COD = NEW.CUEN_COD) AND (PROY_COD = NEW.PROY_COD) AND (CENT_COD = NEW.CENT_COD) AND (SACU_FECHA = :INICIAL);
    END
/* Busque en saldos_CENTROS_TERCERO si la encuentra actualice INICIAL, si no inserte un registro */
EXISTE = 'N';
SELECT 'S' FROM SALDOS_CENTROS_TERCERO_NIIF WHERE (CUEN_COD = NEW.CUEN_COD) AND (PROY_COD = NEW.PROY_COD) AND
    (CENT_COD = NEW.CENT_COD) AND (TERC_NIT = NEW.TERC_NIT) AND (SACU_FECHA = :INICIAL) INTO :EXISTE;
IF (EXISTE = 'N') THEN
    BEGIN
    INSERT INTO SALDOS_CENTROS_TERCERO_NIIF(CUEN_COD, TERC_NIT, PROY_COD, CENT_COD, SACU_FECHA, SACT_SALDO, SACT_DEBITO, SACT_CREDITO)
        VALUES (NEW.CUEN_COD, NEW.terc_nit, NEW.PROY_COD, NEW.CENT_COD, :INICIAL, NEW.SAIN_DEBITO-NEW.SAIN_CREDITO, 0, 0);
    END
ELSE
    BEGIN
    UPDATE SALDOS_CENTROS_TERCERO_NIIF
        SET SACT_SALDO = SACT_SALDO + NEW.SAIN_DEBITO - NEW.SAIN_CREDITO
    WHERE (CUEN_COD = NEW.CUEN_COD) AND (PROY_COD = NEW.PROY_COD) AND (CENT_COD = NEW.CENT_COD)
        AND (TERC_NIT = NEW.TERC_NIT) AND (SACU_FECHA = :INICIAL);
    END

if (NEW.ARTI_COD IS NOT NULL) then
    BEGIN
    EXISTE = 'N';
    SELECT 'S' FROM SALDOS_ARTICULO_NIIF
        WHERE (CUEN_COD = NEW.CUEN_COD) AND (ARTI_COD = NEW.ARTI_COD) AND (SAAR_FECHA = :INICIAL) INTO :EXISTE;
    IF (EXISTE = 'N') THEN
        BEGIN
        INSERT INTO SALDOS_ARTICULO_NIIF(CUEN_COD, ARTI_COD, SAAR_FECHA, SAAR_SALDO, SAAR_DEBITOS, SAAR_CREDITOS)
            VALUES (NEW.CUEN_COD, NEW.ARTI_COD, :INICIAL, NEW.SAIN_DEBITO-NEW.SAIN_CREDITO, 0, 0);
        END
    ELSE
        BEGIN
        UPDATE SALDOS_ARTICULO_NIIF
          SET SAAR_SALDO = SAAR_SALDO + NEW.SAIN_DEBITO - NEW.SAIN_CREDITO
        WHERE (CUEN_COD = NEW.CUEN_COD) AND (ARTI_COD = NEW.ARTI_COD) AND (SAAR_FECHA = :INICIAL);
        END
    END
/* Actualice los saldos de fechas posteriores */
UPDATE SALDOS_CUENTAS_NIIF
      SET SACU_SALDO = SACU_SALDO + NEW.SAIN_DEBITO - NEW.SAIN_CREDITO
    WHERE (CUEN_COD = new.cuen_cod) AND (SACU_FECHA > :INICIAL);

UPDATE SALDOS_TERCEROS_NIIF
  SET SATE_SALDO = SATE_SALDO + NEW.SAIN_DEBITO - NEW.SAIN_CREDITO
  WHERE (CUEN_COD = NEW.CUEN_COD) AND (TERC_NIT = NEW.TERC_NIT) AND (SACU_FECHA > :INICIAL);
UPDATE SALDOS_CENTROS_NIIF
  SET SACE_SALDO = SACE_SALDO + NEW.SAIN_DEBITO - NEW.SAIN_CREDITO
  WHERE (CUEN_COD = NEW.CUEN_COD) AND (PROY_COD = NEW.PROY_COD) AND (CENT_COD = NEW.CENT_COD) AND (SACU_FECHA > :INICIAL);
UPDATE saldos_centros_tercero_NIIF
  SET SACT_SALDO = SACT_SALDO + NEW.SAIN_DEBITO - NEW.SAIN_CREDITO
  WHERE (CUEN_COD = NEW.CUEN_COD) AND (PROY_COD = NEW.PROY_COD) AND (CENT_COD = NEW.CENT_COD)
  AND (TERC_NIT = NEW.TERC_NIT) AND (SACU_FECHA > :INICIAL);
UPDATE SALDOS_ARTICULO_NIIF
  SET SAAR_SALDO = SAAR_SALDO + NEW.SAIN_DEBITO - NEW.SAIN_CREDITO
  WHERE (CUEN_COD = NEW.CUEN_COD) AND (ARTI_COD = NEW.ARTI_COD) AND (SAAR_FECHA > :INICIAL);
CUENNIT = NEW.cuen_cod || '-' || NEW.terc_nit;
INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD, AUDI_TICO)
    VALUES (USER, 1007, NEW.sain_item, 'I', SUBSTRING(:CUENNIT FROM 1 FOR 20), NULL);
END
^

SET TERM ; ^

/* 20140430B */
/* no incluya los anticipos */
SET TERM ^ ;

CREATE OR ALTER procedure CUADRE_CAJA_DETALLE (
    FECHA date,
    AGENCIA integer)
returns (
    CXCTIPO varchar(10),
    CXCNUMERO varchar(12),
    CXCNIT varchar(20),
    CXCNOMBRE varchar(60),
    CXCMONTO numeric(18,2))
AS
declare variable id integer;
declare variable TIPO integer;
declare variable ABONO NUMERIC(18,2);
begin
/* DETALLE DE LA CARTERA DEL DIA */
for SELECT MVCL_IDREF, terc_nit, mvcl_tiporef, TIDO_NOMCORTO, MVCL_PREFREF || MVCL_NUMREF, MVCL_MONTO
    FROM MOVIMIENTO_CLIENTES M, TIPO_DOCUMENTO T
    WHERE (MVCL_FECHA = :FECHA) AND (MVCL_tiporef <> 45) AND (MVCL_ABONO = 'N') AND (M.mvcl_tiporef = T.tido_cod) AND ((:AGENCIA = 0) or (M.sucu_id = :agencia))
    into :id, :cxcnit, :TIPO, :cxctipo, :cxcnumero, cxcmonto
    do
    BEGIN
    if (cxcmonto IS NULL) then
        cxcmonto = 0;
    if ((cxctipo = 'DEVOLCLI') or (cxctipo = 'NOTACRCL')) then
        CXCMONTO = CXCMONTO * -1;
    SELECT sum(SDCA_ABONO) FROM SALDOS_DOC_CARTERA WHERE sdca_idref = :id AND sdca_tiporef = :TIPO AND SDCA_FECHA = :FECHA AND SDCA_ABONO <> 0
        INTO :ABONO;
    if (ABONO IS NULL) then
        ABONO = 0;
    if (CXCMONTO <> ABONO) then
        BEGIN
        cxcmonto = cxcmonto - abono;
        cxcnombre = '';
        SELECT TERC_NOM FROM TERCEROS WHERE TERC_NIT = :cxcnit INTO :cxcnombre;
        SUSPEND;
        END
    END
end
^

SET TERM ; ^

/* 20140430C */
/* NI CALCULE SALDOS Y MOVIMIENTOS SI EL NIT ES DE CONTADO */
SET TERM ^ ;

CREATE OR ALTER procedure IMPR_FACTURA (
    ID integer,
    MONEDAEX char(1))
returns (
    PREF varchar(4),
    NUMERO varchar(8),
    FECHA date,
    VENCE date,
    DIASVENCE integer,
    CONTCRED char(17),
    NIT varchar(20),
    NOMTERCERO varchar(60),
    NOMCLIENTE varchar(60),
    VENDEDOR integer,
    NOMVENDEDOR varchar(60),
    PUNTOVTA integer,
    NOMPUNTOVTA varchar(60),
    CODBODEGA varchar(2),
    NOMBODEGA varchar(30),
    AUTORIZACION varchar(20),
    DESPACHO varchar(255),
    TRANSPORTADOR varchar(60),
    COTIZACION varchar(30),
    PEDIDO varchar(30),
    REMISION varchar(30),
    PACIENTE varchar(20),
    NOMPACIENTE varchar(60),
    COMIPORC numeric(9,2),
    COMIMONTO numeric(18,2),
    SUBTOTAL numeric(18,2),
    INGTERCEROS numeric(18,2),
    INGPROPIOS numeric(18,2),
    DTOPORC numeric(9,2),
    DTOMONTO numeric(18,2),
    ADICIONAL numeric(18,2),
    IVAMONTO numeric(18,2),
    DEC2799 numeric(18,2),
    RTEFTEPORC numeric(9,2),
    RTEFTEMONTO numeric(18,2),
    RTEIVAPORC numeric(9,2),
    RTEIVAMONTO numeric(18,2),
    RTEICAPORC numeric(9,2),
    RTEICAMONTO numeric(18,2),
    RTECREEP numeric(9,2),
    RTECREEM numeric(18,2),
    EXTRA numeric(18,2),
    DTOFPORC numeric(9,2),
    DTOFMONTO numeric(18,2),
    FECHADTO date,
    ANTICIPO numeric(18,2),
    RETGARANTIA numeric(18,2),
    TOTALFAC numeric(18,2),
    TOTALPAGAR numeric(18,2),
    TOTALNETO numeric(18,2),
    ENTREGA date,
    OBS blob sub_type 1 segment size 80,
    ITEM integer,
    ARTICULO varchar(15),
    CODBAR varchar(15),
    ARTIDES varchar(60),
    DESCORTA varchar(30),
    CANT numeric(18,4),
    LOTE varchar(15),
    VLOTE date,
    UNIDAD varchar(8),
    CAJAS numeric(18,4),
    FACTOR numeric(18,4),
    LISTAPR integer,
    REFITEM varchar(60),
    BODITEM varchar(2),
    STAND varchar(20),
    PRUNIT numeric(18,2),
    DTOITPORC numeric(9,2),
    DTOITMONTO numeric(18,2),
    PRNETO numeric(18,2),
    PRNETOSINIVA numeric(18,2),
    BASE numeric(18,2),
    PORCBASE numeric(9,2),
    DTOIT1 numeric(9,2),
    DTOIT2 numeric(9,2),
    DTOIT3 numeric(9,2),
    IVAPORC numeric(9,2),
    IVAITMONTO numeric(18,2),
    CONSUMO numeric(18,2),
    INALC numeric(18,2),
    SUBTOTIT numeric(18,2),
    TOTAL numeric(18,2),
    PESOTOT numeric(18,2),
    CODIGOCL varchar(20),
    ZONACOD varchar(2),
    ZONANOM varchar(60),
    DV char(1),
    DIRECCION varchar(60),
    CIUDAD varchar(40),
    TELEFONO varchar(40),
    CONTACTO varchar(60),
    FAX varchar(25),
    CEL varchar(25),
    GRUPO varchar(2),
    NOMGRUPO varchar(30),
    SUBGRUPO varchar(3),
    NOMSUBG varchar(30),
    MARCA varchar(3),
    NOMMARCA varchar(30),
    PESO numeric(18,4),
    ANCHO numeric(18,4),
    ALTO numeric(18,4),
    LARGO numeric(18,4),
    SUMA1 numeric(18,2),
    SUMA2 numeric(18,2),
    SUMA3 numeric(18,2),
    SUMA4 numeric(18,2),
    SUMA5 numeric(18,2),
    IVA1 numeric(18,2),
    IVA2 numeric(18,2),
    IVA3 numeric(18,2),
    IVA4 numeric(18,2),
    IVA5 numeric(18,2),
    SUMAEX numeric(18,2),
    SUMAGR numeric(18,2),
    TOTCONSUMO numeric(18,2),
    TOTINALC numeric(18,2),
    DTOIT1M numeric(18,2),
    DTOIT2M numeric(18,2),
    DTOIT3M numeric(18,2),
    TOTCAJAS numeric(18,2),
    TOTBASE numeric(18,2),
    VEHICULO varchar(8),
    RECIBIDO numeric(18,2),
    CAMBIO numeric(18,2),
    HORA time,
    FORMAPAGO1 varchar(30),
    MONTOPAGO1 numeric(18,2),
    FORMAPAGO2 varchar(30),
    MONTOPAGO2 numeric(18,2),
    FORMAPAGO3 varchar(30),
    MONTOPAGO3 numeric(18,2),
    PUNTOS integer,
    PUNTOSACUM integer,
    PUNTOSVENC integer,
    FECPTOS date,
    OBSITEM blob sub_type 1 segment size 80,
    SUCUR varchar(10),
    ALTERNATIVAS numeric(18,4),
    PRINCIPALES numeric(18,4),
    FECINI date,
    FECFIN date,
    CARTINI numeric(18,2),
    CARTFIN numeric(18,2),
    ABONOS numeric(18,2),
    CARGOS numeric(18,2),
    CODRECAUDO varchar(65),
    CODRECAUDOR varchar(65))
AS
DECLARE VARIABLE IMPTOS CHAR(1);
DECLARE VARIABLE TARIFA INTEGER;
declare variable DEVUELTO NUMERIC(18,2);
declare variable ORDENCOD CHAR(8);
declare variable IMPRDEV CHAR(2);
declare variable IMPR CHAR(1);
declare variable ITEMFP INTEGER;
declare variable FORMAP VARCHAR(30);
declare variable MONTOP NUMERIC(18,2);
declare variable ICOINC CHAR(2);
declare variable DTOITM1 NUMERIC(18,2);
declare variable DTOITM2 NUMERIC(18,2);
declare variable DTOITM3 NUMERIC(18,2);
declare variable DTOITE3 CHAR(2);
declare variable SUMDTOIT NUMERIC(18,2);
declare variable AUTORET VARCHAR(10);
declare variable FAUTORET DATE;
declare variable AUTORCREE VARCHAR(10);
declare variable FAUTORCREE DATE;
declare variable FACTCANT NUMERIC(18,4);
declare variable ANULADO CHAR(1);
declare variable INGTER CHAR(2);
declare variable FACTENC NUMERIC(18,4);
declare variable CODGS1 VARCHAR(13);
declare variable STRVALOR VARCHAR(11);
declare variable AUXVALOR VARCHAR(15);
declare variable TRM NUMERIC(18,4);
declare variable NITCONTADO VARCHAR(20);
BEGIN
execute procedure lee_configuracion('FACTURACION', 'ARTICULOS', 'IMPOCONSUMO INCLUIDO EN EL PRECIO BASE DE VENTA ANTES DE IVA') returning_values (icoinc);
execute procedure lee_configuracion('FACTURACION', 'FACTURAS', 'COLUMNAS DE DESCUENTO POR ITEM ADICIONALES') returning_values (DTOITE3);
execute procedure lee_configuracion('FACTURACION', 'FACTURAS', 'GRUPO DE MERCANCIA PARA INGRESOS DE TERCEROS') returning_values (INGTER);
SELECT F.PREF_PRE, FACT_NUMERO, FACT_FECHA, FACT_VENCE, F.BODE_COD, BODE_NOM, F.TERC_NIT, FACT_NOMCLIENTE, F.VEND_COD, VEND_NOMBRE, F.PTVT_ID, PTVT_NOM,
    AUTO_NUMERO, FACT_DESPACHO, FACT_TRANSP, FACT_COTIZACI, FACT_PEDIDO, FACT_REMISION, FACT_COMIPORC, FACT_COMIMONTO, FACT_IVAINC, 
    FACT_DTOPOR, FACT_DTOMONTO, FACT_ADICIONAL, FACT_IVAMONTO, FACT_RTFTEPOR, FACT_RTFTEMONTO, FACT_RTIVAPOR, FACT_RTIVAMONTO,
    FACT_RTICAPOR, FACT_RTICAMONTO, FACT_RTCREE, FACT_RTCREEM, FACT_EXTRA, FACT_DTOFPOR, FACT_DTOFMONTO, FACT_DTOFFECHA, FACT_TOTAL,
    TERC_DIR, TERC_CIU, TERC_TEL, TERC_CONTACTO, TERC_FAX, TERC_DV, TERC_CEL, FACT_DTOIT1, FACT_DTOIT2, FACT_DTOIT3, FACT_DEC2799, FACT_ENTREGA, FACT_TRM,
    FACT_OBS, VEHI_COD, /*FACT_NROCOPIA,*/ FACT_RECIBIDO, FACT_SUCURSAL, FACT_DETCLI, FACT_DETCLINOM, TERC_NOM, FACT_ANULADO, FACT_ANTICIPO,
    FACT_GARANTIA, FACT_FACTOR, FACT_FECINI, FACT_FECFIN, p.terc_nit
    FROM FACTURAS F, BODEGA B, VENDEDORES V, PUNTO_VENTA P, TERCEROS T
    WHERE F.BODE_COD = B.BODE_COD AND F.VEND_COD = V.VEND_COD AND F.PTVT_ID = P.PTVT_ID AND F.TERC_NIT = T.TERC_NIT AND F.FACT_ID = :ID
    into :PREF, :NUMERO, :FECHA, :VENCE, :CODBODEGA, :NOMBODEGA, :NIT, :NOMTERCERO, :VENDEDOR, :NOMVENDEDOR, :PUNTOVTA, :NOMPUNTOVTA,
    :AUTORIZACION, :DESPACHO, :TRANSPORTADOR, :COTIZACION, :PEDIDO, :REMISION, :COMIPORC, :COMIMONTO, :IMPTOS,
    :DTOPORC, :DTOMONTO, :ADICIONAL, :IVAMONTO, :RTEFTEPORC, :RTEFTEMONTO, :RTEIVAPORC, :RTEIVAMONTO,
    :RTEICAPORC, :RTEICAMONTO, :rtecreep, :rtecreem, :EXTRA, :DTOFPORC, :DTOFMONTO, :FECHADTO, :TOTALFAC,
    :DIRECCION, :CIUDAD, :TELEFONO, :CONTACTO, :FAX, :DV, :CEL, :dtoit1m, :dtoit2m, :dtoit3m, :dec2799, :ENTREGA, :TRM,
    :OBS, :VEHICULO,/* :NROCOPIA,*/ :RECIBIDO, :SUCUR, :paciente, :nompaciente, :nomcliente, :ANULADO, :anticipo,
    :retgarantia, :factenc, :FECINI, :FECFIN, :NITCONTADO;

/* ACUMULE LOS PUNTOS, SE HACE ACA POR SER POSTERIOR AL DETALLE */
if (ANULADO = 'N') then
    EXECUTE PROCEDURE acumula_puntos_cliente (31, :id, :nit, :fecha) returning_values (:PUNTOS);
EXECUTE PROCEDURE consulta_puntos_cliente (:id, :nit, :fecha) returning_values (:puntos, :puntosacum, :puntosvenc, :fecptos);
if (DTOIT1M IS NULL) then
    DTOIT1M = 0;
if (DTOIT2M IS NULL) then
    DTOIT2M = 0;
if (DTOIT3M IS NULL) then
    DTOIT3M = 0;
SELECT CLIE_COD, C.ZONA_COD FROM CLIENTES C
    WHERE TERC_NIT = :NIT INTO :CODIGOCL, :ZONACOD;
SELECT CLSU_DIR, CLSU_CIUDAD, CLSU_TEL, ZONA_COD FROM CLIENTE_SUCURSALES WHERE TERC_NIT = :NIT AND CLCU_COD = :SUCUR
    INTO :DIRECCION, :CIUDAD, :TELEFONO, :ZONACOD;
ZONANOM = '';
SELECT ZONA_NOM FROM ZONAS Z WHERE ZONA_COD = :zonacod INTO :ZONANOM;
DIASVENCE = VENCE - FECHA;
if (DIASVENCE > 0) then
    CONTCRED = 'CREDITO ' || CAST(DIASVENCE AS VARCHAR(3)) || ' DIAS';
ELSE
    CONTCRED = 'CONTADO';
SUBTOTAL = TOTALFAC - EXTRA - IVAMONTO - ADICIONAL + DTOMONTO + dec2799;
SELECT SUM(FADE_DTOMONTO*FADE_CANT) FROM FACTURAS_DETALLE WHERE FACT_ID = :id INTO :sumdtoit;
if (DTOITE3 = 'SI') then
    BEGIN
    SUBTOTAL = SUBTOTAL + sumdtoit + dtoit1m + dtoit2m + dtoit3m;
    END
if (INGTER <> '') then
    BEGIN
    SELECT SUM(FADE_TOTAL) FROM FACTURAS_DETALLE D, ARTICULO A WHERE A.arti_cod = D.arti_cod AND FACT_ID = :id AND GRUP_COD = :ingter
        INTO :ingterceros;
    INGPROPIOS = SUBTOTAL - INGTERCEROS;
    END
EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'FECHA AUTORETENEDOR NO DESCONTAR RETENCIONES DEL SALDO PERO SI CONTABILIZARLAS') returning_values (AUTORET);
if (AUTORET <> '') then
    FAUTORET = CAST(AUTORET AS DATE);
else
    FAUTORET = '9999/12/31';
EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'FECHA AUTORETENEDOR DE RETENCION CREE') returning_values (AUTORCREE);
if (AUTORCREE <> '') then
    FAUTORCREE = CAST(AUTORCREE AS DATE);
else
    FAUTORCREE = '9999/12/31';
if (FECHA > fautoret) then
    if (FECHA >= fautorcree) then
        TOTALPAGAR = TOTALFAC - RTEIVAMONTO - RTEICAMONTO - ANTICIPO - RETGARANTIA;
    else
        TOTALPAGAR = TOTALFAC - RTEIVAMONTO - RTEICAMONTO - rtecreem - ANTICIPO - RETGARANTIA;
ELSE
    if (FECHA >= fautorcree) then
        TOTALPAGAR = TOTALFAC - RTEFTEMONTO - RTEIVAMONTO - RTEICAMONTO - ANTICIPO - RETGARANTIA;
    else
        TOTALPAGAR = TOTALFAC - RTEFTEMONTO - rtecreem - RTEIVAMONTO - RTEICAMONTO - ANTICIPO - RETGARANTIA;
TOTALNETO = TOTALFAC - ANTICIPO - RETGARANTIA;
if (RECIBIDO <> 0) then
    CAMBIO = RECIBIDO - totalpagar;
ELSE
    CAMBIO = 0;
/* si no hay cotización pero hay pedido llame la cotizacion del pedido */
if ((cotizacion is null) or (cotizacion = '')) then
    if ((pedido <> '') AND (STRLEN(:PEDIDO) > 6)) then
        select pedi_cotizaci from pedidos p where pedi_numero = right(:pedido, 6) and pref_pre = left(:pedido,  strlen(:pedido)-6) into :cotizacion;
/* CARTERA Y ABONOS */
if (NIT <> NITCONTADO) then
    BEGIN
    SELECT SUM(SALDO) FROM cartera_cliente(:nit, :fecini-1, :sucur, 0, 'N', 0) INTO :cartini;
    SELECT SUM(SALDO) FROM cartera_cliente(:nit, :fecfin, :sucur, 0, 'N', 0) INTO :cartfin;
    SELECT SUM(M.mvcl_monto) FROM movimiento_clientes M WHERE TERC_NIT = :NIT AND M.mvcl_sucursal = :sucur AND
        M.mvcl_abono = 'S' AND M.mvcl_fecha >= :fecini AND M.mvcl_fecha <= :fecfin INTO :abonos;
    SELECT SUM(M.mvcl_monto) FROM movimiento_clientes M WHERE TERC_NIT = :NIT AND M.mvcl_sucursal = :sucur AND
        M.mvcl_abono = 'N' AND M.mvcl_fecha >= :fecini AND M.mvcl_fecha <= :fecfin INTO :cargos;
    END
if (cartini IS NULL) then
    CARTINI = 0;
if (cartfin IS NULL) then
    cartfin = 0;
if (abonos IS NULL) then
    abonos = 0;
if (cargos IS NULL) then
    cargos = 0;
/* CODIGO DE RECAUDO
STRVALOR = substring(cast(:totalfac as varchar(10)) from 1 for strlen(cast(:totalfac as varchar(10)))-3);
auxvalor = '000000' || strvalor;
strvalor = SUBSTR(auxvalor, (STRLEN(auxvalor) - 8), STRLEN(auxvalor));
EXECUTE PROCEDURE lee_configuracion('FACTURACION', 'FACTURAS', 'CODIGO DE IDENTIFICACION EAN-13 PARA EL GENERADOR DE RECAUDOS') returning_values (codgs1);
if (mod(strlen(:codigocl), 2) = 1) then
    codigocl = '0' || codigocl;
if (mod(strlen(strvalor), 2) = 1) then
    strvalor = '0' || strvalor;
CODRECAUDO = 'ñ415' || :CODGS1 || '8020' || :codigocl || 'ñ3900' || :strvalor || 'ñ96' || substring(:vence from 1 for 4) || substring(:vence from 6 for 2) || substring(:vence from 9 for 2);
CODRECAUDOR = '(415)' || :CODGS1 || '(8020)' || :codigocl || '(3900)' || :strvalor || '(96)' || substring(:vence from 1 for 4) || substring(:vence from 6 for 2) || substring(:vence from 9 for 2);
*/
SUMAEX = 0;
SUMA1 = 0;
SUMA2 = 0;
SUMA3 = 0;
SUMA4 = 0;
SUMA5 = 0;
IVA1 = 0;
IVA2 = 0;
IVA3 = 0;
IVA4 = 0;
IVA5 = 0;
TOTCONSUMO = 0;
TOTINALC = 0;
MONTOPAGO1 = 0;
PESOTOT = 0;
SELECT MAX(AUDI_HORA) FROM AUDITORIA WHERE TIDO_COD = 31 AND AUDI_IDDOC = :ID AND AUDI_OPER = 'I' INTO :HORA;
/* AHORA LAS FORMAS DE PAGO, BUSQUE EL ABONO DE HOY A LA FACTURA */
ITEMFP = 1;
MONTOPAGO1 = 0;
MONTOPAGO2 = 0;
MONTOPAGO3 = 0;
FOR SELECT FOPA_NOM, RCPA_MONTO FROM RECIBOS_CAJA_PAGO P, FORMAS_PAGO F, RECIBOS_CAJA R, RECIBOS_CAJA_DETALLE D
    WHERE R.RECA_ID = P.RECA_ID AND R.RECA_ID = D.RECA_ID AND P.FOPA_ID = F.FOPA_ID AND RECA_FECHA = :FECHA AND RCDE_TIPODOC = 31 AND RCDE_IDDOC = :ID
    INTO :formap, :MONTOP
    DO
    BEGIN
    if (ITEMFP = 1) then
        BEGIN
        FORMAPAGO1 = FORMAP;
        MONTOPAGO1 = MONTOP;
        END
    if (ITEMFP = 2) then
        BEGIN
        FORMAPAGO2 = FORMAP;
        MONTOPAGO2 = MONTOP;
        END
    if (ITEMFP = 3) then
        BEGIN
        FORMAPAGO3 = FORMAP;
        MONTOPAGO3 = MONTOP;
        END
    ITEMFP = ITEMFP + 1;
    END
if ((MONEDAEX = 'S') AND (TRM <> 1)) then
    BEGIN
    SUBTOTAL = SUBTOTAL / TRM;
    INGTERCEROS = INGTERCEROS / TRM;
    INGPROPIOS = INGPROPIOS / TRM;
    DTOMONTO = DTOMONTO / TRM;
    ADICIONAL = ADICIONAL / TRM;
    IVAMONTO = IVAMONTO / TRM;
    RTEFTEMONTO = RTEFTEMONTO / TRM;
    RTEIVAMONTO = RTEIVAMONTO / TRM;
    RTEICAMONTO = RTEICAMONTO / TRM;
    RTECREEM = RTECREEM / TRM;
    EXTRA = EXTRA / TRM;
    DTOFMONTO = DTOFMONTO / TRM;
    ANTICIPO = ANTICIPO / TRM;
    RETGARANTIA = RETGARANTIA / TRM;
    TOTALFAC = TOTALFAC / TRM;
    TOTALPAGAR = TOTALPAGAR / TRM;
    TOTALNETO = TOTALNETO / TRM;
    SUMA1 = SUMA1 / TRM;
    SUMA2 = SUMA2 / TRM;
    SUMA3 = SUMA3 / TRM;
    SUMA4 = SUMA4 / TRM;
    SUMA5 = SUMA5 / TRM;
    IVA1 = IVA1 / TRM;
    IVA2 = IVA2 / TRM;
    IVA3 = IVA3 / TRM;
    IVA4 = IVA4 / TRM;
    IVA5 = IVA5 / TRM;
    SUMAEX = SUMAEX / TRM;
    SUMAGR = SUMAGR / TRM;
    TOTCONSUMO = TOTCONSUMO / TRM;
    TOTINALC = TOTINALC / TRM;
    DTOIT1M = DTOIT1M / TRM;
    DTOIT2M = DTOIT2M / TRM;
    DTOIT3M = DTOIT3M / TRM;
    END
EXECUTE PROCEDURE lee_configuracion ('FACTURACION','DOCUMENTOS','ORDENAR ITEMS POR CODIGO DE ARTICULO') returning_values (:ORDENCOD);
EXECUTE PROCEDURE lee_configuracion ('FACTURACION','POS', 'IMPRIMIR DEVOLUCIONES DE ARTICULOS NEGATIVOS') returning_values (:imprdev);
totcajas = 0;
totbase = 0;
if (ORDENCOD = 'SI') then
    BEGIN
    FOR SELECT FADE_ITEM, D.ARTI_COD, FADE_CODBAR, SUBSTRING(FADE_DESC FROM 1 FOR 60), ARTI_DESCORTA, FADE_CANT, FADE_UNIDAD, FADE_FACTOR, BODE_COD, FADE_LOTE, LIPR_COD, FADE_PRUNIT, FADE_DTOPORC, FADE_DTOMONTO, FADE_IVAPORC, FADE_IVAMONTO, FADE_CONSUMO, FADE_TOTAL, FADE_REFERENCIA,
        GRUP_COD, SUBG_COD, MARC_COD, ARTI_PESO, ARTI_ANCHO, ARTI_ALTO, ARTI_LARGO, TAIV_COD, FADE_DEVUELTO, FADE_OBS, FADE_DTO1, FADE_DTO2, FADE_DTO3, FADE_DTOM1, FADE_DTOM2, FADE_DTOM3, FADE_CAJAS, FADE_BASE, FADE_PORCBASE, FADE_INALCM
        FROM FACTURAS_DETALLE D, ARTICULO A
        WHERE D.ARTI_COD = A.ARTI_COD AND D.FACT_ID = :ID
        ORDER BY D.ARTI_COD
        INTO :ITEM, :ARTICULO, :CODBAR, :ARTIDES, :DESCORTA, :CANT, :UNIDAD, :FACTOR, :BODITEM, :LOTE, :LISTAPR, :PRUNIT, :DTOITPORC, :DTOITMONTO, :IVAPORC, :IVAITMONTO, :CONSUMO, :TOTAL, :refitem,
        :GRUPO, :SUBGRUPO, :MARCA, :PESO, :ANCHO, :ALTO, :LARGO, :TARIFA, :devuelto, :obsitem, :dtoit1, :dtoit2, :dtoit3, :dtoitm1, :dtoitm2, :dtoitm3, :cajas, :base, :porcbase, :inalc
        DO
          BEGIN
          if (ARTICULO = CODBAR) then
            SELECT FIRST 1 COBA_COD FROM barras_articulo WHERE ARTI_COD = :articulo INTO :CODBAR;
          if (DTOIT1 IS NULL) then
            DTOIT1 = 0;
          if (DTOIT2 IS NULL) then
            DTOIT2 = 0;
          if (DTOIT3 IS NULL) then
            DTOIT3 = 0;
          if (IMPRDEV <> 'SI') then
            BEGIN
            if ((CANT >= 0) AND (DEVUELTO = 0)) then
                IMPR = 'S';
            ELSE
                begin
                if (EXISTS (SELECT FADE_ITEM FROM FACTURAS_DETALLE WHERE FADE_CANT < 0 AND FACT_ID = :ID AND ARTI_COD = :ARTICULO)) then
                    IMPR = 'N'; /* ES DEVOLUCION HECHA EN LA FACTURA */
                ELSE
                    IMPR = 'S'; /* ES DEVOLUCION HECHA FUERA DE LA FACTURA */
                end
            END
          ELSE
            IMPR = 'S';
          if (IMPR = 'S') then
            BEGIN
            if (CANT <> 0) then
                prneto = (PRUNIT - DTOITMONTO) * ((100 - dtoit1)/100) * ((100-dtoit2)/100) * ((100-dtoit3)/100);
            ELSE
                prneto = PRUNIT - DTOITMONTO;
            if (IMPTOS = 'S') then
                if (cant <> 0) then
                    begin
                    prnetosiniva = (PRUNIT - DTOITMONTO - ((IVAITMONTO + CONSUMO + INALC) / CANT));
                    prnetosiniva = prnetosiniva * ((100 - dtoit1)/100) * ((100-dtoit2)/100) * ((100-dtoit3)/100);
                    end
                else
                    prnetosiniva = PRUNIT - DTOITMONTO;
            if (ICOINC = 'SI') then
                SUBTOTIT = TOTAL - IVAITMONTO;
            else
                SUBTOTIT = TOTAL - IVAITMONTO - CONSUMO - INALC;
            TOTCONSUMO = TOTCONSUMO + CONSUMO;
            TOTINALC = TOTINALC + INALC;
            TOTBASE = TOTBASE + BASE;
            SELECT LOTE_VENCE FROM LOTES WHERE LOTE_NRO = :lote AND ARTI_COD = :ARTICULO AND BODE_COD = :boditem INTO :vlote;
            if ((REFITEM <> '.t') or (REFITEM IS NULL)) then
                BEGIN
                /* NO SUME LOS ENSAMBLES */
                if (IVAPORC = 0) then
                    SUMAEX = SUMAEX + (TOTAL - CONSUMO - INALC)*FACTENC;
                if (TARIFA = 1) then
                    BEGIN
                    SUMA1 = SUMA1 + (TOTAL - IVAITMONTO - CONSUMO - INALC)*FACTENC;
                    IVA1 = IVA1 + IVAITMONTO*FACTENC;
                    END
                if (TARIFA = 2) then
                    BEGIN
                    SUMA2 = SUMA2 + (TOTAL - IVAITMONTO - CONSUMO - INALC)*FACTENC;
                    IVA2 = IVA2 + IVAITMONTO*FACTENC;
                    END
                if (TARIFA = 3) then
                    BEGIN
                    SUMA3 = SUMA3 + (TOTAL - IVAITMONTO - CONSUMO - INALC)*FACTENC;
                    IVA3 = IVA3 + IVAITMONTO*FACTENC;
                    END
                if (TARIFA = 4) then
                    BEGIN
                    SUMA4 = SUMA4 + (TOTAL - IVAITMONTO - CONSUMO - INALC)*FACTENC;
                    IVA4 = IVA4 + IVAITMONTO*FACTENC;
                    END
                if (TARIFA = 5) then
                    BEGIN
                    SUMA5 = SUMA5 + (TOTAL - IVAITMONTO - CONSUMO - INALC)*FACTENC;
                    IVA5 = IVA5 + IVAITMONTO*FACTENC;
                    END
                SUMAGR = 0;
                if (IVA1 <> 0) then
                    SUMAGR = SUMAGR + SUMA1;
                if (IVA2 <> 0) then
                    SUMAGR = SUMAGR + SUMA2;
                if (IVA3 <> 0) then
                    SUMAGR = SUMAGR + SUMA3;
                if (IVA4 <> 0) then
                    SUMAGR = SUMAGR + SUMA4;
                if (IVA5 <> 0) then
                    SUMAGR = SUMAGR + SUMA5;
                END
            if (ANCHO IS NULL) then
                ANCHO = 0;
            if (ALTO IS NULL) then
                ALTO = 0;
            if (LARGO IS NULL) then
                LARGO = 0;
            if (PESO IS NULL) then
                PESO = 0;
            PESO = (PESO / 1000) * CANT * FACTOR;
            PESOTOT = PESOTOT + PESO;
            totcajas = totcajas + cajas;
            if (substr(ARTICULO,1,2) = '.t') then
                BEGIN
                REFITEM = '';
                TOTAL = 0;
                SUBTOTIT = 0;
                END
            SELECT STAND_COD FROM STANDS WHERE ARTI_COD = :ARTICULO AND STAND_BODEGA = :boditem INTO :stand;
            factcant = NULL;
            SELECT FIRST 1 UNAR_FACCAN FROM unidad_articulo WHERE ARTI_COD = :articulo INTO :factcant;
            if (factcant IS NULL) then
                BEGIN
                ALTERNATIVAS = 0;
                PRINCIPALES = (CANT * FACTOR);
                END
            ELSE
                BEGIN
                ALTERNATIVAS = FLOOR(CANT * factor / factcant);
                PRINCIPALES = (CANT * FACTOR) - (alternativas * factcant);
                END
            if ((MONEDAEX = 'S') AND (TRM <> 1)) then
                BEGIN
                PRUNIT = PRUNIT / TRM;
                DTOITMONTO = DTOITMONTO / TRM;
                PRNETO = PRNETO / TRM;
                PRNETOSINIVA = PRNETOSINIVA / TRM;
                BASE = base / TRM;
                IVAITMONTO = IVAITMONTO / TRM;
                CONSUMO = consumo / TRM;
                INALC = INALC / TRM;
                SUBTOTIT = SUBTOTIT / TRM;
                TOTAL = TOTAL / TRM;
                END
            SUSPEND;
            END
          END
    END
ELSE
  if (ORDENCOD = 'UNIDAD') then
    BEGIN
    FOR SELECT FADE_ITEM, D.ARTI_COD, FADE_CODBAR, SUBSTRING(FADE_DESC FROM 1 FOR 60), ARTI_DESCORTA, FADE_CANT, FADE_UNIDAD, FADE_FACTOR, BODE_COD, FADE_LOTE, LIPR_COD, FADE_PRUNIT, FADE_DTOPORC, FADE_DTOMONTO, FADE_IVAPORC, FADE_IVAMONTO, FADE_CONSUMO, FADE_TOTAL, FADE_REFERENCIA,
        GRUP_COD, SUBG_COD, MARC_COD, ARTI_PESO, ARTI_ANCHO, ARTI_ALTO, ARTI_LARGO, TAIV_COD, FADE_DEVUELTO, FADE_OBS, FADE_DTO1, FADE_DTO2, FADE_DTO3, FADE_DTOM1, FADE_DTOM2, FADE_DTOM3, FADE_CAJAS, FADE_BASE, FADE_PORCBASE, FADE_INALCM
        FROM FACTURAS_DETALLE D, ARTICULO A
        WHERE D.ARTI_COD = A.ARTI_COD AND D.FACT_ID = :ID
        ORDER BY D.fade_unidad, D.fade_desc
        INTO :ITEM, :ARTICULO, :CODBAR, :ARTIDES, :DESCORTA, :CANT, :UNIDAD, :FACTOR, :BODITEM, :LOTE, :LISTAPR, :PRUNIT, :DTOITPORC, :DTOITMONTO, :IVAPORC, :IVAITMONTO, :CONSUMO, :TOTAL, :refitem,
        :GRUPO, :SUBGRUPO, :MARCA, :PESO, :ANCHO, :ALTO, :LARGO, :TARIFA, :devuelto, :obsitem, :dtoit1, :dtoit2, :dtoit3, :dtoitm1, :dtoitm2, :dtoitm3, :cajas, :base, :porcbase, :INALC
        DO
          BEGIN
          if (ARTICULO = CODBAR) then
            SELECT FIRST 1 COBA_COD FROM barras_articulo WHERE ARTI_COD = :articulo INTO :CODBAR;
          if (IMPRDEV <> 'SI') then
            BEGIN
            if ((CANT >= 0) AND (DEVUELTO = 0)) then
                IMPR = 'S';
            ELSE
                begin
                if (EXISTS (SELECT FADE_ITEM FROM FACTURAS_DETALLE WHERE FADE_CANT < 0 AND FACT_ID = :ID AND ARTI_COD = :ARTICULO)) then
                    IMPR = 'N'; /* ES DEVOLUCION HECHA EN LA FACTURA */
                ELSE
                    IMPR = 'S'; /* ES DEVOLUCION HECHA FUERA DE LA FACTURA */
                end
            END
          ELSE
            IMPR = 'S';
          if (IMPR = 'S') then
            BEGIN
            if (CANT <> 0) then
                prneto = (PRUNIT - DTOITMONTO) * ((100 - dtoit1)/100) * ((100-dtoit2)/100) * ((100-dtoit3)/100);
            ELSE
                prneto = PRUNIT - DTOITMONTO;
            if (IMPTOS = 'S') then
                if (cant <> 0) then
                    begin
                    prnetosiniva = (PRUNIT - DTOITMONTO - ((IVAITMONTO + CONSUMO + INALC) / CANT));
                    prnetosiniva = prnetosiniva * ((100 - dtoit1)/100) * ((100-dtoit2)/100) * ((100-dtoit3)/100);
                    end
                else
                    prnetosiniva = PRUNIT - DTOITMONTO;
            if (ICOINC = 'SI') then
                SUBTOTIT = TOTAL - IVAITMONTO;
            else
                SUBTOTIT = TOTAL - IVAITMONTO - CONSUMO - INALC;
            TOTCONSUMO = TOTCONSUMO + CONSUMO;
            TOTINALC = TOTINALC + INALC;
            TOTBASE = TOTBASE + BASE;
            SELECT LOTE_VENCE FROM LOTES WHERE LOTE_NRO = :lote AND ARTI_COD = :ARTICULO AND BODE_COD = :boditem INTO :vlote;
            if ((REFITEM <> '.t') or (REFITEM IS NULL)) then
                BEGIN
                /* NO SUME LOS ENSAMBLES */
                if (IVAPORC = 0) then
                    SUMAEX = SUMAEX + (TOTAL - CONSUMO - INALC)*FACTENC;
                if (TARIFA = 1) then
                    BEGIN
                    SUMA1 = SUMA1 + (TOTAL - IVAITMONTO - CONSUMO - INALC)*FACTENC;
                    IVA1 = IVA1 + IVAITMONTO*FACTENC;
                    END
                if (TARIFA = 2) then
                    BEGIN
                    SUMA2 = SUMA2 + (TOTAL - IVAITMONTO - CONSUMO - INALC)*FACTENC;
                    IVA2 = IVA2 + IVAITMONTO*FACTENC;
                    END
                if (TARIFA = 3) then
                    BEGIN
                    SUMA3 = SUMA3 + (TOTAL - IVAITMONTO - CONSUMO - INALC)*FACTENC;
                    IVA3 = IVA3 + IVAITMONTO*FACTENC;
                    END
                if (TARIFA = 4) then
                    BEGIN
                    SUMA4 = SUMA4 + (TOTAL - IVAITMONTO - CONSUMO - INALC)*FACTENC;
                    IVA4 = IVA4 + IVAITMONTO*FACTENC;
                    END
                if (TARIFA = 5) then
                    BEGIN
                    SUMA5 = SUMA5 + (TOTAL - IVAITMONTO - CONSUMO - INALC)*FACTENC;
                    IVA5 = IVA5 + IVAITMONTO*FACTENC;
                    END
                SUMAGR = 0;
                if (IVA1 <> 0) then
                    SUMAGR = SUMAGR + SUMA1;
                if (IVA2 <> 0) then
                    SUMAGR = SUMAGR + SUMA2;
                if (IVA3 <> 0) then
                    SUMAGR = SUMAGR + SUMA3;
                if (IVA4 <> 0) then
                    SUMAGR = SUMAGR + SUMA4;
                if (IVA5 <> 0) then
                    SUMAGR = SUMAGR + SUMA5;
                END
            if (ANCHO IS NULL) then
                ANCHO = 0;
            if (ALTO IS NULL) then
                ALTO = 0;
            if (LARGO IS NULL) then
                LARGO = 0;
            if (PESO IS NULL) then
                PESO = 0;
            PESO = (PESO / 1000) * CANT * FACTOR;
            PESOTOT = PESOTOT + PESO;
            totcajas = totcajas + cajas;
            if (substr(ARTICULO,1,2) = '.t') then
                BEGIN
                REFITEM = '';
                TOTAL = 0;
                SUBTOTIT = 0;
                END
            SELECT STAND_COD FROM STANDS WHERE ARTI_COD = :ARTICULO AND STAND_BODEGA = :boditem INTO :stand;
            factcant = NULL;
            SELECT FIRST 1 UNAR_FACCAN FROM unidad_articulo WHERE ARTI_COD = :articulo INTO :factcant;
            if ((factcant IS NULL) or (factcant = 0)) then
                BEGIN
                ALTERNATIVAS = 0;
                PRINCIPALES = (CANT * FACTOR);
                END
            ELSE
                BEGIN
                ALTERNATIVAS = FLOOR(CANT * factor / factcant);
                PRINCIPALES = (CANT * FACTOR) - (alternativas * factcant);
                END
            if ((MONEDAEX = 'S') AND (TRM <> 1)) then
                BEGIN
                PRUNIT = PRUNIT / TRM;
                DTOITMONTO = DTOITMONTO / TRM;
                PRNETO = PRNETO / TRM;
                PRNETOSINIVA = PRNETOSINIVA / TRM;
                BASE = base / TRM;
                IVAITMONTO = IVAITMONTO / TRM;
                CONSUMO = consumo / TRM;
                INALC = INALC / TRM;
                SUBTOTIT = SUBTOTIT / TRM;
                TOTAL = TOTAL / TRM;
                END
            SUSPEND;
            END
          END
    END
  ELSE
    if (ORDENCOD = 'STAND') then
      BEGIN
      FOR SELECT FADE_ITEM, D.ARTI_COD, FADE_CODBAR, SUBSTRING(FADE_DESC FROM 1 FOR 60), ARTI_DESCORTA, FADE_CANT, FADE_UNIDAD, FADE_FACTOR, BODE_COD, FADE_LOTE, LIPR_COD, FADE_PRUNIT, FADE_DTOPORC, FADE_DTOMONTO, FADE_IVAPORC, FADE_IVAMONTO, FADE_CONSUMO, FADE_TOTAL, FADE_REFERENCIA,
            GRUP_COD, SUBG_COD, MARC_COD, ARTI_PESO, ARTI_ANCHO, ARTI_ALTO, ARTI_LARGO, TAIV_COD, FADE_DEVUELTO, FADE_OBS, FADE_DTO1, FADE_DTO2, FADE_DTO3, FADE_DTOM1, FADE_DTOM2, FADE_DTOM3, FADE_CAJAS, FADE_BASE, FADE_PORCBASE, S.stand_cod, FADE_INALCM
            FROM FACTURAS_DETALLE D, ARTICULO A, STANDS S
            WHERE D.ARTI_COD = A.ARTI_COD AND D.FACT_ID = :ID AND A.arti_cod = S.arti_cod AND S.stand_bodega = D.bode_cod
            ORDER BY S.stand_cod, D.fade_desc
            INTO :ITEM, :ARTICULO, :CODBAR, :ARTIDES, :DESCORTA, :CANT, :UNIDAD, :FACTOR, :BODITEM, :LOTE, :LISTAPR, :PRUNIT, :DTOITPORC, :DTOITMONTO, :IVAPORC, :IVAITMONTO, :CONSUMO, :TOTAL, :refitem,
            :GRUPO, :SUBGRUPO, :MARCA, :PESO, :ANCHO, :ALTO, :LARGO, :TARIFA, :devuelto, :obsitem, :dtoit1, :dtoit2, :dtoit3, :dtoitm1, :dtoitm2, :dtoitm3, :cajas, :base, :porcbase, :STAND, :INALC
            DO
              BEGIN
              if (ARTICULO = CODBAR) then
                SELECT FIRST 1 COBA_COD FROM barras_articulo WHERE ARTI_COD = :articulo INTO :CODBAR;
              if (IMPRDEV <> 'SI') then
                BEGIN
                if ((CANT >= 0) AND (DEVUELTO = 0)) then
                    IMPR = 'S';
                ELSE
                    begin
                    if (EXISTS (SELECT FADE_ITEM FROM FACTURAS_DETALLE WHERE FADE_CANT < 0 AND FACT_ID = :ID AND ARTI_COD = :ARTICULO)) then
                        IMPR = 'N'; /* ES DEVOLUCION HECHA EN LA FACTURA */
                    ELSE
                        IMPR = 'S'; /* ES DEVOLUCION HECHA FUERA DE LA FACTURA */
                    end
                END
              ELSE
                IMPR = 'S';
              if (IMPR = 'S') then
                BEGIN
                if (CANT <> 0) then
                    prneto = (PRUNIT - DTOITMONTO) * ((100 - dtoit1)/100) * ((100-dtoit2)/100) * ((100-dtoit3)/100);
                ELSE
                    prneto = PRUNIT - DTOITMONTO;
                if (IMPTOS = 'S') then
                    if (cant <> 0) then
                        begin
                        prnetosiniva = (PRUNIT - DTOITMONTO - ((IVAITMONTO + CONSUMO + INALC) / CANT));
                        prnetosiniva = prnetosiniva * ((100 - dtoit1)/100) * ((100-dtoit2)/100) * ((100-dtoit3)/100);
                        end
                    else
                        prnetosiniva = PRUNIT - DTOITMONTO;
                if (ICOINC = 'SI') then
                    SUBTOTIT = TOTAL - IVAITMONTO;
                else
                    SUBTOTIT = TOTAL - IVAITMONTO - CONSUMO - INALC;
                TOTCONSUMO = TOTCONSUMO + CONSUMO;
                TOTINALC = TOTINALC + INALC;
                TOTBASE = TOTBASE + BASE;
                SELECT LOTE_VENCE FROM LOTES WHERE LOTE_NRO = :lote AND ARTI_COD = :ARTICULO AND BODE_COD = :boditem INTO :vlote;
                if ((REFITEM <> '.t') or (REFITEM IS NULL)) then
                    BEGIN
                    /* NO SUME LOS ENSAMBLES */
                    if (IVAPORC = 0) then
                        SUMAEX = SUMAEX + (TOTAL - CONSUMO - INALC)*FACTENC;
                    if (TARIFA = 1) then
                        BEGIN
                        SUMA1 = SUMA1 + (TOTAL - IVAITMONTO - CONSUMO - INALC)*FACTENC;
                        IVA1 = IVA1 + IVAITMONTO*FACTENC;
                        END
                    if (TARIFA = 2) then
                        BEGIN
                        SUMA2 = SUMA2 + (TOTAL - IVAITMONTO - CONSUMO - INALC)*FACTENC;
                        IVA2 = IVA2 + IVAITMONTO*FACTENC;
                        END
                    if (TARIFA = 3) then
                        BEGIN
                        SUMA3 = SUMA3 + (TOTAL - IVAITMONTO - CONSUMO - INALC)*FACTENC;
                        IVA3 = IVA3 + IVAITMONTO*FACTENC;
                        END
                    if (TARIFA = 4) then
                        BEGIN
                        SUMA4 = SUMA4 + (TOTAL - IVAITMONTO - CONSUMO - INALC)*FACTENC;
                        IVA4 = IVA4 + IVAITMONTO*FACTENC;
                        END
                    if (TARIFA = 5) then
                        BEGIN
                        SUMA5 = SUMA5 + (TOTAL - IVAITMONTO - CONSUMO - INALC)*FACTENC;
                        IVA5 = IVA5 + IVAITMONTO*FACTENC;
                        END
                    SUMAGR = 0;
                    if (IVA1 <> 0) then
                        SUMAGR = SUMAGR + SUMA1;
                    if (IVA2 <> 0) then
                        SUMAGR = SUMAGR + SUMA2;
                    if (IVA3 <> 0) then
                        SUMAGR = SUMAGR + SUMA3;
                    if (IVA4 <> 0) then
                        SUMAGR = SUMAGR + SUMA4;
                    if (IVA5 <> 0) then
                        SUMAGR = SUMAGR + SUMA5;
                    END
                if (ANCHO IS NULL) then
                    ANCHO = 0;
                if (ALTO IS NULL) then
                    ALTO = 0;
                if (LARGO IS NULL) then
                    LARGO = 0;
                if (PESO IS NULL) then
                    PESO = 0;
                PESO = (PESO / 1000) * CANT * FACTOR;
                PESOTOT = PESOTOT + PESO;
                totcajas = totcajas + cajas;
                if (substr(ARTICULO,1,2) = '.t') then
                    BEGIN
                    REFITEM = '';
                    TOTAL = 0;
                    SUBTOTIT = 0;
                    END
                SELECT STAND_COD FROM STANDS WHERE ARTI_COD = :ARTICULO AND STAND_BODEGA = :boditem INTO :stand;
                factcant = NULL;
                SELECT FIRST 1 UNAR_FACCAN FROM unidad_articulo WHERE ARTI_COD = :articulo INTO :factcant;
                if ((factcant IS NULL) or (factcant = 0)) then
                    BEGIN
                    ALTERNATIVAS = 0;
                    PRINCIPALES = (CANT * FACTOR);
                    END
                ELSE
                    BEGIN
                    ALTERNATIVAS = FLOOR(CANT * factor / factcant);
                    PRINCIPALES = (CANT * FACTOR) - (alternativas * factcant);
                    END
                if ((MONEDAEX = 'S') AND (TRM <> 1)) then
                    BEGIN
                    PRUNIT = PRUNIT / TRM;
                    DTOITMONTO = DTOITMONTO / TRM;
                    PRNETO = PRNETO / TRM;
                    PRNETOSINIVA = PRNETOSINIVA / TRM;
                    BASE = base / TRM;
                    IVAITMONTO = IVAITMONTO / TRM;
                    CONSUMO = consumo / TRM;
                    INALC = INALC / TRM;
                    SUBTOTIT = SUBTOTIT / TRM;
                    TOTAL = TOTAL / TRM;
                    END
                SUSPEND;
                END
              END
      END
    ELSE
        BEGIN
        FOR SELECT FADE_ITEM, D.ARTI_COD, FADE_CODBAR, SUBSTRING(FADE_DESC from 1 FOR 60), ARTI_DESCORTA, FADE_CANT, FADE_UNIDAD, FADE_FACTOR, BODE_COD, FADE_LOTE, LIPR_COD, FADE_PRUNIT, FADE_DTOPORC, FADE_DTOMONTO, FADE_IVAPORC, FADE_IVAMONTO, FADE_CONSUMO, FADE_TOTAL, FADE_REFERENCIA,
            GRUP_COD, SUBG_COD, MARC_COD, ARTI_PESO, ARTI_ANCHO, ARTI_ALTO, ARTI_LARGO, TAIV_COD, FADE_DEVUELTO, FADE_OBS, FADE_DTO1, FADE_DTO2, FADE_DTO3, FADE_DTOM1, FADE_DTOM2, FADE_DTOM3, FADE_CAJAS, FADE_BASE, FADE_PORCBASE, FADE_INALCM
            FROM FACTURAS_DETALLE D, ARTICULO A
            WHERE D.ARTI_COD = A.ARTI_COD AND D.FACT_ID = :ID
            ORDER BY FADE_ITEM
            INTO :ITEM, :ARTICULO, :CODBAR, :ARTIDES, :DESCORTA, :CANT, :UNIDAD, :FACTOR, :BODITEM, :LOTE, :LISTAPR, :PRUNIT, :DTOITPORC, :DTOITMONTO, :IVAPORC, :IVAITMONTO, :CONSUMO, :TOTAL, :refitem,
            :GRUPO, :SUBGRUPO, :MARCA, :PESO, :ANCHO, :ALTO, :LARGO, :TARIFA, :devuelto, :obsitem, :dtoit1, :dtoit2, :dtoit3, :dtoitm1, :dtoitm2, :dtoitm3, :cajas, :base, :porcbase, :INALC
            DO
              BEGIN
              if (IMPRDEV <> 'SI') then
                BEGIN
                if ((CANT >= 0) AND (DEVUELTO = 0)) then
                    IMPR = 'S';
                ELSE
                    begin
                    if (EXISTS (SELECT FADE_ITEM FROM FACTURAS_DETALLE WHERE FADE_CANT < 0 AND FACT_ID = :ID AND ARTI_COD = :ARTICULO)) then
                        IMPR = 'N'; /* ES DEVOLUCION HECHA EN LA FACTURA */
                    ELSE
                        IMPR = 'S'; /* ES DEVOLUCION HECHA FUERA DE LA FACTURA */
                    end
                END
              ELSE
                IMPR = 'S';
              if (IMPR = 'S') then
                BEGIN
                SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :GRUPO INTO NOMGRUPO;
                SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :MARCA INTO NOMMARCA;
                SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :SUBGRUPO AND GRUP_COD = :GRUPO INTO :NOMSUBG;
                if (CANT <> 0) then
                    prneto = (PRUNIT - DTOITMONTO) * ((100 - dtoit1)/100) * ((100-dtoit2)/100) * ((100-dtoit3)/100);
                ELSE
                    prneto = PRUNIT - DTOITMONTO;
                if (IMPTOS = 'S') then
                    if (cant <> 0) then
                        begin
                        prnetosiniva = (PRUNIT - DTOITMONTO - ((IVAITMONTO + CONSUMO + INALC) / CANT));
                        prnetosiniva = prnetosiniva * ((100 - dtoit1)/100) * ((100-dtoit2)/100) * ((100-dtoit3)/100);
                        end
                    else
                        prnetosiniva = PRUNIT - DTOITMONTO;
                if (ICOINC = 'SI') then
                    SUBTOTIT = TOTAL - IVAITMONTO;
                else
                    SUBTOTIT = TOTAL - IVAITMONTO - CONSUMO - INALC;
                TOTCONSUMO = TOTCONSUMO + CONSUMO;
                TOTINALC = TOTINALC + INALC;
                TOTBASE = TOTBASE + BASE;
                SELECT LOTE_VENCE FROM LOTES WHERE LOTE_NRO = :lote AND ARTI_COD = :ARTICULO AND BODE_COD = :boditem INTO :vlote;
                if ((REFITEM <> '.t') or (REFITEM IS NULL)) then
                    BEGIN
                    /* NO SUME LOS ENSAMBLES */
                    if (IVAPORC = 0) then
                        SUMAEX = SUMAEX + (TOTAL - CONSUMO - INALC)*FACTENC;
                    if (TARIFA = 1) then
                        BEGIN
                        SUMA1 = SUMA1 + (TOTAL - IVAITMONTO - CONSUMO - INALC)*FACTENC;
                        IVA1 = IVA1 + IVAITMONTO*FACTENC;
                        END
                    if (TARIFA = 2) then
                        BEGIN
                        SUMA2 = SUMA2 + (TOTAL - IVAITMONTO - CONSUMO - INALC)*FACTENC;
                        IVA2 = IVA2 + IVAITMONTO*FACTENC;
                        END
                    if (TARIFA = 3) then
                        BEGIN
                        SUMA3 = SUMA3 + (TOTAL - IVAITMONTO - CONSUMO - INALC)*FACTENC;
                        IVA3 = IVA3 + IVAITMONTO*FACTENC;
                        END
                    if (TARIFA = 4) then
                        BEGIN
                        SUMA4 = SUMA4 + (TOTAL - IVAITMONTO - CONSUMO - INALC)*FACTENC;
                        IVA4 = IVA4 + IVAITMONTO*FACTENC;
                        END
                    if (TARIFA = 5) then
                        BEGIN
                        SUMA5 = SUMA5 + (TOTAL - IVAITMONTO - CONSUMO - INALC)*FACTENC;
                        IVA5 = IVA5 + IVAITMONTO*FACTENC;
                        END
                    SUMAGR = 0;
                    if (IVA1 <> 0) then
                        SUMAGR = SUMAGR + SUMA1;
                    if (IVA2 <> 0) then
                        SUMAGR = SUMAGR + SUMA2;
                    if (IVA3 <> 0) then
                        SUMAGR = SUMAGR + SUMA3;
                    if (IVA4 <> 0) then
                        SUMAGR = SUMAGR + SUMA4;
                    if (IVA5 <> 0) then
                        SUMAGR = SUMAGR + SUMA5;
                    END
                if (ANCHO IS NULL) then
                    ANCHO = 0;
                if (ALTO IS NULL) then
                    ALTO = 0;
                if (LARGO IS NULL) then
                    LARGO = 0;
                if (PESO IS NULL) then
                    PESO = 0;
                PESO = (PESO / 1000)* CANT * FACTOR;
                PESOTOT = PESOTOT + PESO;
                totcajas = totcajas + cajas;
                if (substr(ARTICULO,1,2) = '.t') then
                    BEGIN
                    REFITEM = '';
                    TOTAL = 0;
                    SUBTOTIT = 0;
                    END
                SELECT STAND_COD FROM STANDS WHERE ARTI_COD = :ARTICULO AND STAND_BODEGA = :boditem INTO :stand;
                factcant = NULL;
                SELECT FIRST 1 UNAR_FACCAN FROM unidad_articulo WHERE ARTI_COD = :articulo INTO :factcant;
                if ((factcant IS NULL) or (factcant = 0)) then
                    BEGIN
                    ALTERNATIVAS = 0;
                    PRINCIPALES = (CANT * FACTOR);
                    END
                ELSE
                    BEGIN
                    ALTERNATIVAS = FLOOR(CANT * factor / factcant);
                    PRINCIPALES = (CANT * FACTOR) - (alternativas * factcant);
                    END
                if ((MONEDAEX = 'S') AND (TRM <> 1)) then
                    BEGIN
                    PRUNIT = PRUNIT / TRM;
                    DTOITMONTO = DTOITMONTO / TRM;
                    PRNETO = PRNETO / TRM;
                    PRNETOSINIVA = PRNETOSINIVA / TRM;
                    BASE = base / TRM;
                    IVAITMONTO = IVAITMONTO / TRM;
                    CONSUMO = consumo / TRM;
                    INALC = INALC / TRM;
                    SUBTOTIT = SUBTOTIT / TRM;
                    TOTAL = TOTAL / TRM;
                    END
                SUSPEND;
                END
              END
        END
END
^

SET TERM ; ^

/* 20140501 */
/* redondeo en calculo de descuntos, IVA y total por item */
SET TERM ^ ;

CREATE OR ALTER TRIGGER PEDIDO_WEB_DETALLE_BI FOR PEDIDO_WEB_DETALLE
ACTIVE BEFORE INSERT POSITION 0
as
declare variable itemax integer;
declare variable UNIDAD VARCHAR(8);
declare variable DTOGRUPO VARCHAR(10);
declare variable DTOG NUMERIC(9,4);
declare variable DTOL NUMERIC(9,4);
declare variable IVAP NUMERIC(18,2);
declare variable BOD VARCHAR(2);
declare variable PREF VARCHAR(4);
declare variable IVAINC CHAR(1);
declare variable ICOINC char(2);
declare variable DIGITOS INTEGER;
BEGIN
execute procedure lee_configuracion('FACTURACION', 'ARTICULOS', 'IMPOCONSUMO INCLUIDO EN EL PRECIO BASE DE VENTA ANTES DE IVA') returning_values (:ICOINC);
execute procedure lee_configuracion('FACTURACION','DOCUMENTOS', 'REDONDEO AL MULTIPLO DE DIEZ EN TOTALES') returning_values (DIGITOS);
if (new.pewd_item is null) then
    begin
    select max(pewd_item) from pedido_web_detalle where pewe_id = new.pewe_id into :itemax;
    if (itemax is null) then
        new.pewd_item = 1;
    else
        new.pewd_item = :itemax + 1;
    end
if (new.arti_cod is null) then
    begin
    SELECT FIRST 1 ARTI_COD, COBA_UNIDAD from BARRAS_ARTICULO WHERE COBA_COD = new.pewd_codbar AND COBA_ACTIVO = 'S'
        INTO new.arti_cod, :UNIDAD;
    if (new.arti_cod is null) then
        begin
        SELECT ARTI_COD, ARTI_UNIDAD FROM ARTICULO WHERE ARTI_COD = new.pewd_codbar and esar_cod = 'A'
            INTO new.arti_cod, :UNIDAD;
        if (new.arti_cod is null) then
            exception articulo_no_existe 'No se encontro el artículo ' || new.pewd_codbar;
        ELSE
            if (new.pewd_unidad is null) then
                NEW.pewd_unidad = :UNIDAD;
        end
    else
        if (new.pewd_unidad is null) then
            NEW.pewd_unidad = :UNIDAD;
    end
EXECUTE PROCEDURE factor_unidad_cant(NEW.arti_cod, NEW.pewd_unidad) returning_values(NEW.pewd_factor);

/* LOS DESCUENTOS */
EXECUTE PROCEDURE lee_configuracion('FACTURACION', 'DOCUMENTOS', 'SUGERIR DESCUENTO POR ITEM CON BASE EN GRUPO DE MERCANCIA Y LISTA DE PRECIOS') returning_values (:DTOGRUPO);
if (DTOGRUPO <> 'NINGUNO') then
    BEGIN
    if (NEW.pewd_dtop IS NULL) then
        BEGIN
        DTOG = 0;
        DTOL = 0;
        if ((dtogrupo = 'GRUPO') or (dtogrupo = 'AMBOS')) Then
            BEGIN
            select grup_dscto from grupo g, articulo a where a.grup_cod = g.grup_cod and a.arti_cod = NEW.arti_cod INTO DTOG;
            END
        if ((dtogrupo = 'LISTA') or (dtogrupo = 'AMBOS')) Then
            BEGIN
            select lipr_dscto from lista_precios where lipr_cod = NEW.lipr_cod INTO DTOL;
            END
        NEW.pewd_dtop = DTOG + DTOL;
        END
    END
ELSE
    BEGIN
    if (NEW.pewd_dtop IS NULL) then
        NEW.pewd_dtop = 0;
    END

if (NEW.pewd_dto1 IS NULL) then
    BEGIN
    select prar_dto1 from precios_articulo where arti_cod = NEW.arti_cod INTO NEW.pewd_dto1;
    if (NEW.pewd_dto1 IS NULL) then
        NEW.pewd_dto1 = 0;
    END
if (NEW.pewd_dto2 IS NULL) then
    BEGIN
    select prar_dto2 from precios_articulo where arti_cod = NEW.arti_cod INTO NEW.pewd_dto2;
    if (NEW.pewd_dto2 IS NULL) then
        NEW.pewd_dto2 = 0;
    END
if (NEW.pewd_dto3 IS NULL) then
    NEW.pewd_dto3 = 0;
/* CALCULE EL MONTO DEL DESCUENTO */
new.pewd_dtom = new.pewd_prunit * new.pewd_dtop / 100;
if (new.pewd_dto1m is null) then
    new.pewd_dto1m = round((new.pewd_cant * (new.pewd_prunit - new.pewd_dtom)) * new.pewd_dto1, :digitos*-1);
if (new.pewd_dto2m is null) then
    new.pewd_dto2m = round((new.pewd_cant * (new.pewd_prunit - new.pewd_dtom) - new.pewd_dto1m) * new.pewd_dto2, :digitos*-1);
if (new.pewd_dto3m is null) then
    new.pewd_dto3m = round((new.pewd_cant * (new.pewd_prunit - new.pewd_dtom) - new.pewd_dto1m - new.pewd_dto2m) * new.pewd_dto3, :digitos*-1);

/* LA BODEGA Y LOS IMPUESTOS DEPENDEN DEL ENCABEZADO */
SELECT PT.BODE_COD, PEWE_PREF FROM pedido_web P, PUNTO_VENTA PT, VENDEDORES V
    WHERE PEWE_ID = NEW.pewe_id AND P.vend_cod = V.vend_cod AND PT.ptvt_id = V.ptvt_id
    INTO :BOD, :PREF;
if (new.bode_cod is null) then
    new.bode_cod = :BOD;

if (new.pewd_consumo is null) then
    begin
    select PRAR_CONSUMO from PRECIOS_ARTICULO where ARTI_COD = new.ARTI_COD and LIPR_COD = new.LIPR_COD into new.pewd_consumo;
    if ((new.pewd_consumo is null) or (new.pewd_consumo <> 0)) then
        select ARTI_CONSUMO from ARTICULO where ARTI_COD = new.ARTI_COD into new.pewd_consumo;
    if (new.pewd_consumo is null) then
        new.pewd_consumo = 0;
    new.pewd_consumo = new.pewd_consumo * new.pewd_cant * new.pewd_factor;
    end

/* CALCULE EL IVA, CONSUMO Y TOTAL */
SELECT PREF_IVAINC FROM PREFIJOS WHERE TIDO_COD = 34 AND PREF_PRE = :PREF INTO :IVAINC;
SELECT TAIV_PORC FROM tarifa_iva T, ARTICULO A WHERE T.taiv_cod = A.taiv_cod AND A.arti_cod = NEW.arti_cod INTO :IVAP;
new.pewd_ivap = :ivap;
if ((new.pewd_ivamonto is null) or (NEW.pewd_ivamonto = 0)) then
    begin
    if (IVAINC = 'N') then
        begin
        if (ICOINC = 'SI') then
            new.pewd_ivamonto = round(((new.pewd_cant * (new.pewd_prunit - new.pewd_dtom) - new.pewd_dto1m - new.pewd_dto2m - new.pewd_dto3m - new.pewd_consumo) / 100) * :IVAP, :digitos*-1);
        else
            new.pewd_ivamonto = round(((new.pewd_cant * (new.pewd_prunit - new.pewd_dtom) - new.pewd_dto1m - new.pewd_dto2m - new.pewd_dto3m) / 100) * :IVAP, :digitos*-1);
        end
    else
        new.pewd_ivamonto = round(((new.pewd_cant * (new.pewd_prunit - new.pewd_dtom) - new.pewd_dto1m - new.pewd_dto2m - new.pewd_dto3m - new.pewd_consumo) / (100 + :IVAP)) * :IVAP, :digitos*-1);
    end
--if ((new.pewd_total is null) or (new.pewd_total = 0)) then
    begin
    if (ICOINC = 'SI') then
        new.pewd_total = round((new.pewd_cant * (new.pewd_prunit - new.pewd_dtom) - new.pewd_dto1m - new.pewd_dto2m - new.pewd_dto3m), :digitos*-1);
    else
        new.pewd_total = round((new.pewd_cant * (new.pewd_prunit - new.pewd_dtom) - new.pewd_dto1m - new.pewd_dto2m - new.pewd_dto3m + new.pewd_consumo), :digitos*-1);
    if (IVAINC = 'N') then
        new.pewd_total = new.pewd_total + new.pewd_ivamonto;
    end

end
^

SET TERM ; ^

/* 20140502 */
/* CHEQUEO INCLUYENDO RCREE */
SET TERM ^ ;

CREATE OR ALTER procedure CHEQUEO_MOVIMIENTO_CLIENTES (
    CLIINI varchar(20),
    CLIFIN varchar(20))
AS
declare variable FECHA DATE;
declare variable VENCE DATE;
declare variable NIT VARCHAR(20);
declare variable RTFTE NUMERIC(18, 2);
declare variable RTIVA NUMERIC(18, 2);
declare variable RTICA NUMERIC(18, 2);
declare variable RCREE NUMERIC(18, 2);
declare variable MONTO NUMERIC(18, 2);
declare variable TRM NUMERIC(18, 2);
declare variable EXISTE CHAR(1);
declare variable IDR INTEGER;
declare variable NOMCLIENTE VARCHAR(60);
declare variable CONC VARCHAR(60);
declare variable SUCURSAL VARCHAR(10);
declare variable COBR INTEGER;
declare variable FACTURA VARCHAR(10);
declare variable ID integer;
declare variable PREF varchar(4);
declare variable NUMERO varchar(8);
BEGIN
DELETE FROM anticipos_cliente WHERE RECA_ID = 0;
DELETE FROM saldos_doc_cartera WHERE TERC_NIT >= :cliini AND TERC_NIT <= :clifin;
DELETE FROM movimiento_clientes WHERE TERC_NIT >= :cliini AND TERC_NIT <= :clifin;

FOR SELECT FACT_ID, PREF_PRE, FACT_NUMERO, FACT_FECHA, FACT_VENCE, TERC_NIT, FACT_RTFTEMONTO, FACT_rtivamonto, FACT_rticamonto, fact_rtcreem, FACT_TOTAL, FACT_NOMCLIENTE, FACT_SUCURSAL, COBR_COD, FACT_TRM
    FROM FACTURAS WHERE FACT_ID <> 0 and fact_anulado = 'N' AND TERC_NIT >= :cliini AND TERC_NIT <= :clifin
    ORDER BY FACT_FECHA
    INTO :ID, :PREF, :NUMERO, :FECHA, :VENCE, :nit,  :RTFTE, :RTIVA, :RTICA, :RCREE, :MONTO, :nomcliente, :sucursal, :cobr, :TRM
    DO
    BEGIN
    if (STRLEN(:NOMCLIENTE) > 42) then
        CONC = 'FV No.' || :pref || :numero || '-' || SUBSTR(:NOMCLIENTE, 1, 42);
    ELSE
        CONC = 'FV No.' || :pref || :NUMERO || '-' || :NOMCLIENTE;
    INSERT INTO MOVIMIENTO_CLIENTES (MVCL_ID, TERC_NIT, MVCL_TIPOREF, MVCL_IDREF, MVCL_FECHA, MVCL_VENCE, MVCL_CONC, MVCL_MONTO, MVCL_RTEFTE, MVCL_RTEIVA, MVCL_RTEICA, MVCL_RCREE, MVCL_DEBITO, MVCL_ABONO, MVCL_PREFREF, MVCL_NUMREF, mvcl_sucursal, COBR_COD, MVCL_TRM)
      VALUES (GEN_ID(ID_MOVCLI, 1), :NIT, 31, :ID, :FECHA, :VENCE, :CONC, :MONTO, :rtfte, :rtiva, :rtica, :rcree, 'S', 'N', :pref, :numero, :sucursal, :cobr, :trm);
    END

FOR SELECT NDCL_ID, PREF_PRE, NDCL_NUMERO, NDCL_FECHA, NDCL_VENCE, NDCL_CONC, TERC_NIT, NDCL_RTFTEMONTO, NDCL_rtivamonto, NDCL_rticamonto, ndcl_rtcreem, ndcl_monto+ndcl_ivamonto, NDCL_SUCURSAL, COBR_COD, NDCL_TRM
    FROM notas_debito_clientes WHERE NDCL_ID <> 0 and NDCL_anulado = 'N' AND TERC_NIT >= :cliini AND TERC_NIT <= :clifin
    ORDER BY NDCL_FECHA
    INTO :ID, :PREF, :NUMERO, :FECHA, :VENCE, :CONC, :nit,  :RTFTE, :RTIVA, :RTICA, :RCREE, :MONTO, :sucursal, :cobr, :TRM
    DO
    INSERT INTO MOVIMIENTO_CLIENTES (MVCL_ID, TERC_NIT, MVCL_TIPOREF, MVCL_IDREF, MVCL_FECHA, MVCL_VENCE, MVCL_CONC, MVCL_MONTO, MVCL_RTEFTE, MVCL_RTEIVA, MVCL_RTEICA, MVCL_RCREE, MVCL_DEBITO, MVCL_ABONO, MVCL_PREFREF, MVCL_NUMREF, MVCL_SUCURSAL, COBR_COD, MVCL_TRM)
      VALUES (GEN_ID(ID_MOVCLI, 1), :NIT, 41, :ID, :FECHA, :VENCE, :CONC, :MONTO, :rtfte, :rtiva, :rtica, :rcree, 'S', 'N', :pref, :numero, :sucursal, :cobr, :TRM);

for select DVCH_ID, PRBA_PREF, DVCH_NUMDOC, DVCH_FECHA, DVCH_FECHA, DVCH_CONC, TERC_NIT, 0, 0, 0, DVCH_MONTO, DVCH_SUCURSAL, COBR_COD, DVCH_TRM
    FROM devolucion_cheques WHERE DVCH_ID <> 0 AND DVCH_ANULADO = 'N' AND TERC_NIT >= :cliini AND TERC_NIT <= :clifin AND DVCH_CARTERA = 'S'
    INTO :ID, :PREF, :NUMERO, :FECHA, :VENCE, :CONC, :nit,  :RTFTE, :RTIVA, :RTICA, :MONTO, :sucursal, :cobr, :TRM
    DO
    INSERT INTO  MOVIMIENTO_CLIENTES
        (MVCL_ID, TERC_NIT, MVCL_TIPOREF, MVCL_IDREF, MVCL_PREFREF, MVCL_NUMREF, MVCL_FECHA, MVCL_VENCE, MVCL_CONC, MVCL_MONTO, MVCL_RTEFTE, MVCL_RTEIVA, MVCL_RTEICA, MVCL_RCREE, MVCL_ABONO, MVCL_DEBITO, MVCL_SUCURSAL, COBR_COD, MVCL_TRM)
        VALUES (GEN_ID(ID_MOVCLI, 1), :NIT, 77, :ID, :PREF, :NUMERO, :FECHA, :FECHA, :CONC, :MONTO, 0, 0, 0, 0, 'N', 'S', :sucursal, :cobr, :TRM);
    
FOR SELECT DEVT_ID, PREF_PRE, DEVT_NUMERO, DEVT_FECHA, TERC_NIT, DEVT_RTFTEMONTO, DEVT_rtivamonto, DEVT_rticamonto, devt_rtcreem, devt_total, devt_sucursal, COBR_COD, DEVT_FACTURA, DEVT_TRM
    FROM devoluciones_ventas WHERE DEVT_ID <> 0 and DEVT_anulado = 'N' AND TERC_NIT >= :cliini AND TERC_NIT <= :clifin AND ((DEVT_REMID IS NULL) or (DEVT_REMID = 0))
    ORDER BY DEVT_FECHA
    INTO :ID, :PREF, :NUMERO, :FECHA, :nit,  :RTFTE, :RTIVA, :RTICA, :RCREE, :MONTO, :sucursal, :cobr, :FACTURA, :TRM
    DO
    BEGIN
    CONC = 'DEVOLUCION VENTA No.' || :pref || :NUMERO || ' EN FACTURA ' || :factura;
    INSERT INTO MOVIMIENTO_CLIENTES (MVCL_ID, TERC_NIT, MVCL_TIPOREF, MVCL_IDREF, MVCL_FECHA, MVCL_VENCE, MVCL_CONC, MVCL_MONTO, MVCL_RTEFTE, MVCL_RTEIVA, MVCL_RTEICA, MVCL_RCREE, MVCL_DEBITO, MVCL_ABONO, MVCL_PREFREF, MVCL_NUMREF, MVCL_SUCURSAL, COBR_COD, MVCL_TRM)
      VALUES (GEN_ID(ID_MOVCLI, 1), :NIT, 33, :ID, :FECHA, :FECHA, :CONC, :MONTO, :rtfte, :rtiva, :rtica, :rcree, 'N', 'N', :pref, :numero, :sucursal, :cobr, :TRM);
    END

FOR SELECT NCCL_ID, PREF_PRE, NCCL_NUMERO, NCCL_FECHA, NCCL_CONC, TERC_NIT, NCCL_RTFTEMONTO, NCCL_rtivamonto, NCCL_rticamonto, NCCL_RTCREEM, nccl_monto+nccl_ivamonto, NCCL_SUCURSAL, COBR_COD, NCCL_TRM
    FROM notas_credito_clientes WHERE NCCL_ID <> 0 and NCCL_anulado = 'N' AND TERC_NIT >= :cliini AND TERC_NIT <= :clifin
    ORDER BY NCCL_FECHA
    INTO :ID, :PREF, :NUMERO, :FECHA, :CONC, :nit,  :RTFTE, :RTIVA, :RTICA, :RCREE, :MONTO, :sucursal, :cobr, :TRM
    DO
    INSERT INTO MOVIMIENTO_CLIENTES (MVCL_ID, TERC_NIT, MVCL_TIPOREF, MVCL_IDREF, MVCL_FECHA, MVCL_VENCE, MVCL_CONC, MVCL_MONTO, MVCL_RTEFTE, MVCL_RTEIVA, MVCL_RTEICA, MVCL_RCREE, MVCL_DEBITO, MVCL_ABONO, MVCL_PREFREF, MVCL_NUMREF, MVCL_SUCURSAL, COBR_COD, MVCL_TRM)
      VALUES (GEN_ID(ID_MOVCLI, 1), :NIT, 42, :ID, :FECHA, :FECHA, :CONC, :monto, :rtfte, :rtiva, :rtica, :RCREE, 'N', 'N', :pref, :numero, :sucursal, :cobr, :TRM);

FOR SELECT ANCL_ID, PREF_PRE, ANCL_NUMERO, ANCL_FECHA, ANCL_CONC, TERC_NIT, ANCL_RTFTEMONTO, ANCL_rtivamonto, ANCL_rticamonto, ancl_rtcreem, ancl_base+ancl_ivamonto, ancl_sucursal, COBR_COD, ANCL_TRM
    FROM anticipos_cliente WHERE ANCL_ID <> 0 and ANCL_anulado = 'N' AND TERC_NIT >= :cliini AND TERC_NIT <= :clifin
    ORDER BY ANCL_FECHA
    INTO :ID, :PREF, :NUMERO, :FECHA, :CONC, :nit,  :RTFTE, :RTIVA, :RTICA, :RCREE, :MONTO, :sucursal, :cobr, :TRM
    DO
    INSERT INTO MOVIMIENTO_CLIENTES (MVCL_ID, TERC_NIT, MVCL_TIPOREF, MVCL_IDREF, MVCL_FECHA, MVCL_VENCE, MVCL_CONC, MVCL_MONTO, MVCL_RTEFTE, MVCL_RTEIVA, MVCL_RTEICA, MVCL_RCREE, MVCL_DEBITO, MVCL_ABONO, MVCL_PREFREF, MVCL_NUMREF, MVCL_SUCURSAL, COBR_COD, MVCL_TRM)
      VALUES (GEN_ID(ID_MOVCLI, 1), :NIT, 45, :ID, :FECHA, :FECHA, :CONC, :monto, :rtfte, :rtiva, :rtica, :rcree, 'N', 'N', :pref, :numero, :sucursal, :cobr, :TRM);

FOR SELECT A.apcl_id, PREF_PRE, APCL_NUMERO, APCL_FECHA, A.apcl_concepto, TERC_NIT, D.acde_aplicado, D.acde_rtfte, D.acde_rtiva, D.acde_rtica, D.acde_rcree, APCL_SUCURSAL, COBR_COD, APCL_TRM
    FROM aplicacion_cliente_detalle D, aplicacion_cliente A
    WHERE A.apcl_id = D.apcl_id AND A.apcl_id <> 0 AND APCL_ANULADO = 'N' AND TERC_NIT >= :cliini AND TERC_NIT <= :clifin
    ORDER BY APCL_FECHA
    INTO :ID, :PREF, :NUMERO, :FECHA, :CONC, :NIT, :MONTO, :RTFTE, :RTIVA, :RTICA, :RCREE, :sucursal, :cobr, :TRM
    DO
    BEGIN
    EXISTE = 'N';
    SELECT 'S' FROM MOVIMIENTO_CLIENTES WHERE MVCL_TIPOREF = 43 AND MVCL_IDREF = :ID AND MVCL_SUCURSAL = :sucursal INTO :EXISTE;
    if (EXISTE = 'S') then
        begin
        UPDATE movimiento_clientes
            SET MVCL_MONTO = MVCL_MONTO + :monto,
                MVCL_RTEFTE = MVCL_RTEFTE + :rtfte,
                MVCL_RTEIVA = MVCL_RTEIVA + :rtiva,
                MVCL_RTEICA = MVCL_RTEICA + :rtica,
                MVCL_RCREE = MVCL_RCREE + :rcree
            WHERE MVCL_TIPOREF = 43 AND MVCL_IDREF = :ID AND MVCL_SUCURSAL = :sucursal;
        end
    ELSE
        INSERT INTO MOVIMIENTO_CLIENTES (MVCL_ID, TERC_NIT, MVCL_TIPOREF, MVCL_IDREF, MVCL_FECHA, MVCL_VENCE, MVCL_CONC, MVCL_MONTO, MVCL_RTEFTE, MVCL_RTEIVA, MVCL_RTEICA, MVCL_RCREE, MVCL_DEBITO, MVCL_ABONO, MVCL_PREFREF, MVCL_NUMREF, MVCL_SUCURSAL, COBR_COD, MVCL_TRM)
            VALUES (GEN_ID(ID_MOVCLI, 1), :NIT, 43, :ID, :FECHA, :FECHA, :CONC, :MONTO, :RTFTE, :RTIVA, :RTICA, :RCREE, 'N', 'S', :pref, :numero, :SUCURSAL, :COBR, :TRM);
    END

FOR SELECT R.reca_id, PREF_PRE, RECA_NUMERO, RECA_FECHA, RECA_CONC, TERC_NIT, RCDE_ABONO+RCDE_DTOF, RCDE_RTFTE, RCDE_RTIVA, RCDE_RTICA, rcde_rcree, D.rcde_sucursal, R.cobr_cod, RECA_TRM
    FROM recibos_caja_detalle D, recibos_caja R
    WHERE R.reca_id = D.reca_id AND R.reca_id <> 0 AND RECA_ANULADO = 'N' AND TERC_NIT >= :cliini AND TERC_NIT <= :clifin
    ORDER BY RECA_FECHA
    INTO :IDR, :PREF, :NUMERO, :FECHA, :CONC, :NIT, :MONTO, :RTFTE, :RTIVA, :RTICA, :RCREE, :sucursal, :cobr, :TRM
    DO
    BEGIN
    EXISTE = 'N';
    SELECT 'S' FROM MOVIMIENTO_CLIENTES WHERE MVCL_TIPOREF = 61 AND MVCL_IDREF = :IDR AND MVCL_SUCURSAL = :sucursal INTO :EXISTE;
    if (EXISTE = 'S') then
        begin
        UPDATE movimiento_clientes
            SET MVCL_MONTO = MVCL_MONTO + :MONTO,
                MVCL_RTEFTE = MVCL_RTEFTE + :rtfte,
                MVCL_RTEIVA = MVCL_RTEIVA + :rtiva,
                MVCL_RTEICA = MVCL_RTEICA + :rtica,
                MVCL_RCREE = MVCL_RCREE + :rcree
            WHERE MVCL_TIPOREF = 61 AND MVCL_IDREF = :IDR AND MVCL_SUCURSAL = :sucursal;
        end
    ELSE
        INSERT INTO MOVIMIENTO_CLIENTES (MVCL_ID, TERC_NIT, MVCL_TIPOREF, MVCL_IDREF, MVCL_FECHA, MVCL_VENCE, MVCL_CONC, MVCL_MONTO, MVCL_RTEFTE, MVCL_RTEIVA, MVCL_RTEICA, MVCL_RCREE, MVCL_DEBITO, MVCL_ABONO, MVCL_PREFREF, MVCL_NUMREF, MVCL_SUCURSAL, COBR_COD, MVCL_TRM)
            VALUES (GEN_ID(ID_MOVCLI, 1), :NIT, 61, :IDR, :FECHA, :FECHA, :CONC, :MONTO, :RTFTE, :RTIVA, :RTICA, :RCREE, 'N', 'S', :pref, :numero, :sucursal, :cobr, :TRM);
    END
FOR SELECT R.egre_id, PREF_PRE, EGRE_NUMERO, EGRE_FECHA, EGRE_CONC, TERC_NIT, EGCC_ABONO+EGCC_DTOF, EGCC_RTFTE, EGCC_RTIVA, EGCC_RTICA, EGCC_RCREE, D.egcc_sucursal, EGRE_TRM
    FROM egresos_crucec D, egresos R
    WHERE R.egre_id = D.egre_id AND R.egre_id <> 0 AND EGRE_ANULADO = 'N' AND TERC_NIT >= :cliini AND TERC_NIT <= :clifin
    ORDER BY EGRE_FECHA
    INTO :IDR, :PREF, :NUMERO, :FECHA, :CONC, :NIT, :MONTO, :RTFTE, :RTIVA, :RTICA, :RCREE, :sucursal, :TRM
    DO
    BEGIN
    SELECT COBR_COD FROM cliente_sucursales WHERE TERC_NIT = :NIT AND CLCU_COD = :sucursal INTO :COBR;
    EXISTE = 'N';
    SELECT 'S' FROM MOVIMIENTO_CLIENTES WHERE MVCL_TIPOREF = 62 AND MVCL_IDREF = :IDR AND MVCL_SUCURSAL = :sucursal INTO :EXISTE;
    if (EXISTE = 'S') then
        begin
        UPDATE movimiento_clientes
            SET MVCL_MONTO = MVCL_MONTO + :MONTO,
                MVCL_RTEFTE = MVCL_RTEFTE + :rtfte,
                MVCL_RTEIVA = MVCL_RTEIVA + :rtiva,
                MVCL_RTEICA = MVCL_RTEICA + :rtica,
                MVCL_RCREE = MVCL_RCREE + :rcree
            WHERE MVCL_TIPOREF = 62 AND MVCL_IDREF = :IDR AND MVCL_SUCURSAL = :sucursal;
        end
    ELSE
        INSERT INTO MOVIMIENTO_CLIENTES (MVCL_ID, TERC_NIT, MVCL_TIPOREF, MVCL_IDREF, MVCL_FECHA, MVCL_VENCE, MVCL_CONC, MVCL_MONTO, MVCL_RTEFTE, MVCL_RTEIVA, MVCL_RTEICA, MVCL_RCREE, MVCL_DEBITO, MVCL_ABONO, MVCL_PREFREF, MVCL_NUMREF, MVCL_SUCURSAL, COBR_COD, MVCL_TRM)
            VALUES (GEN_ID(ID_MOVCLI, 1), :NIT, 62, :IDR, :FECHA, :FECHA, :CONC, :MONTO, :RTFTE, :RTIVA, :RTICA, :RCREE, 'N', 'S', :pref, :numero, :sucursal, :cobr, :TRM);
    END
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER TRIGGER APLICACION_PROVEEDOR_DETALLE_AI FOR APLICACION_PROVEEDOR_DETALLE
ACTIVE AFTER INSERT POSITION 0
AS
declare variable EXISTE CHAR(1);
declare variable FEC DATE;
declare variable NIT VARCHAR(20);
declare variable CONCEPTO VARCHAR(60);
declare variable PREFIJO VARCHAR(4);
declare variable NUMERO VARCHAR(8);
declare variable RETES CHAR(2);
declare variable SALDO NUMERIC(18,2);
declare variable TRM NUMERIC(18,2);
declare variable EGANTI INTEGER;
BEGIN
  if ((NEW.APPR_ID <> 0) AND (new.appd_anulado = 'N')) then
    BEGIN
    /* Abone el documento referenciado en PAGOS_PROVEEDOR_DETALLE */
    select PREF_PRE, APPR_NUMERO, appr_fecha, APPR_CONC, TERC_NIT, APPR_TRM
        from aplicacion_provedor where appr_id = new.appr_id into :PREFIJO, :NUMERO, :FEC, :CONCEPTO, :NIT, :TRM;
    if (new.appd_tipodoc = 55) then
        BEGIN
        /* BUSQUE SI TIENE EGRE_ID, SI NO LO ACTUALIZA */
        SELECT EGRE_ID FROM ANTICIPOS_PROVEEDOR WHERE ANPR_ID = NEW.appd_iddoc INTO :EGANTI;
        if ((EGANTI = 0) or (EGANTI IS NULL)) then
            BEGIN
            exception anticpo_sin_origen;
            END
        END
    /* valide que no se pase del saldo */
    execute procedure saldo_doc_cxpagar(new.appd_tipodoc, new.appd_iddoc, '9999/12/31', 0) returning_values(saldo);
    execute procedure lee_configuracion('CXPAGAR', 'SALDOS', 'DESCONTAR RETENCIONES POR CAUSACION') returning_values (RETES);
    if (SALDO = 0) then
      EXCEPTION DOCUMENTO_ABONO_MAYOR 'EL SALDO DEL DOCUMENTO ' || NEW.appd_prefijo || NEW.appd_numero || ' ES INSUFICIENTE.';
    else
      if (SALDO < 0) then
        BEGIN
        if (RETES = 'SI') then
            begin
            if (saldo > (NEW.appd_aplicado+NEW.appd_difcambio)) then
                EXCEPTION DOCUMENTO_ABONO_MAYOR 'EL SALDO DEL DOCUMENTO ' || NEW.appd_prefijo || NEW.appd_numero || ' ES INSUFICIENTE.';
            end
        ELSE
            begin
            if (saldo > (NEW.appd_aplicado + NEW.appd_rtfte + NEW.appd_rtiva + NEW.appd_rtica + NEW.appd_difcambio)) then
                EXCEPTION DOCUMENTO_ABONO_MAYOR 'EL SALDO DEL DOCUMENTO ' || NEW.appd_prefijo || NEW.appd_numero || ' ES INSUFICIENTE.';
            end
        END
      else
        BEGIN
        if (RETES = 'SI') then
            begin
            if (saldo < (NEW.appd_aplicado+NEW.appd_difcambio)) then
                EXCEPTION DOCUMENTO_ABONO_MAYOR 'EL SALDO DEL DOCUMENTO ' || NEW.appd_prefijo || NEW.appd_numero || ' ES INSUFICIENTE.';
            end
        ELSE
            begin
            if (saldo < (NEW.appd_aplicado + NEW.appd_rtfte + NEW.appd_rtiva + NEW.appd_rtica + NEW.appd_difcambio)) then
                EXCEPTION DOCUMENTO_ABONO_MAYOR 'EL SALDO DEL DOCUMENTO ' || NEW.appd_prefijo || NEW.appd_numero || ' ES INSUFICIENTE.';
            end
        END
    select 'S' from saldos_doc_cxpagar where sdcp_tiporef = new.appd_tipodoc and sdcp_idref = new.appd_iddoc and sdcp_fecha = :FEC into :EXISTE;
    if (Existe = 'S') then
        begin
        /* actualice el saldo del dia */
        UPDATE saldos_doc_cxpagar
            SET SDCP_ABONO = SDCP_ABONO + NEW.appd_aplicado+NEW.appd_difcambio,
                SDCP_ABRTFTE = SDCP_ABRTFTE + NEW.appd_RTFTE,
                SDCP_ABRTIVA = SDCP_ABRTIVA + NEW.appd_RTIVA,
                SDCP_ABRTICA = SDCP_ABRTICA + NEW.appd_RTICA,
                SDCP_ABRCREE = SDCP_ABRCREE + NEW.appd_rcree,
                SDCP_TRM = :TRM
            WHERE SDCP_TIPOREF = NEW.APPD_TIPODOC AND SDCP_IDREF = NEW.appd_IDDOC AND SDCP_FECHA = :FEC;
        END
    ELSE
        BEGIN
        /* Inserte un nuevo saldo diario */
        INSERT INTO SALDOS_DOC_CXPAGAR (SDCP_TIPOREF, SDCP_IDREF, SDCP_FECHA, TERC_NIT, SDCP_RTEFTE, SDCP_RTIVA, SDCP_RTICA, SDCP_ABONO, SDCP_ABRTFTE, SDCP_ABRTIVA, SDCP_ABRTICA, SDCP_ABRCREE, SDCP_DEBITO, SDCP_MONTO, SDCP_TRM)
            VALUES (NEW.APPD_TIPODOC, NEW.APPD_IDDOC, :FEC, :NIT, 0, 0, 0, (NEW.appd_aplicado+NEW.appd_difcambio), NEW.appd_rtfte, NEW.appd_rtiva, NEW.appd_rtica, NEW.appd_rcree, 'N', 0, :TRM);
        END
    /* actualice el registro en mov_proveedor (por si son varios items) */
    EXISTE = 'N';
    SELECT 'S' FROM MOVIMIENTO_PROVEEDOR WHERE MVPR_TIPOREF = 53 AND MVPR_IDREF = NEW.APPR_ID INTO :EXISTE;
    if (EXISTE = 'S') then
        begin
        UPDATE movimiento_proveedor
            SET MVPR_MONTO = MVPR_MONTO + NEW.appd_aplicado+NEW.appd_difcambio,
                MVPR_RTFTE = MVPR_RTFTE + NEW.appd_rtfte,
                MVPR_RTIVA = MVPR_RTIVA + NEW.appd_rtiva,
                MVPR_RTICA = MVPR_RTICA + NEW.appd_rtica,
                MVPR_RCREE = MVPR_RCREE + NEW.appd_rcree,
                MVPR_TRM = :TRM
            WHERE MVPR_TIPOREF = 53 AND MVPR_IDREF = NEW.APPR_ID;
        end
    ELSE
        INSERT INTO MOVIMIENTO_PROVEEDOR (MVPR_ID, TERC_NIT, MVPR_TIPOREF, MVPR_IDREF, MVPR_FECHA, MVPR_VENCE, MVPR_CONC, MVPR_MONTO, MVPR_RTFTE, MVPR_RTIVA, MVPR_RTICA, MVPR_RCREE, MVPR_DEBITO, MVPR_ABONO, MVPR_PREFIJO, MVPR_NUMERO, MVPR_TRM)
            VALUES (GEN_ID(ID_MOVPROV, 1), :NIT, 53, NEW.APPR_ID, :FEC, :FEC, :CONCEPTO, (NEW.APPD_APLICADO+NEW.appd_difcambio), NEW.APPD_RTFTE, NEW.APPD_RTIVA, NEW.APPD_RTICA, NEW.appd_rcree, 'N', 'S', :PREFIJO, :NUMERO, :TRM);
    end
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER TRIGGER APLICACION_PROVEEDOR_DETALLE_AU FOR APLICACION_PROVEEDOR_DETALLE
ACTIVE AFTER UPDATE POSITION 0
AS
declare variable EXISTE CHAR(1);
declare variable FEC DATE;
declare variable NIT VARCHAR(20);
declare variable CONCEPTO VARCHAR(60);
declare variable PREFIJO VARCHAR(4);
declare variable NUMERO VARCHAR(8);
declare variable RETES CHAR(2);
declare variable SALDO NUMERIC(18,2);
declare variable TRM NUMERIC(18,2);
declare variable EGANTI INTEGER;
BEGIN
select PREF_PRE, APPR_NUMERO, appr_fecha, APPR_CONC, TERC_NIT, APPR_TRM from aplicacion_provedor
    where appr_id = new.appr_id into :PREFIJO, :NUMERO, :FEC, :CONCEPTO, :NIT, :TRM;
if ((old.appr_id <> 0) and (old.appd_anulado = 'N'))then
    begin
    UPDATE saldos_doc_cxpagar
        SET SDCP_ABONO = SDCP_ABONO - old.appd_aplicado - OLD.appd_difcambio,
        SDCP_ABRTFTE = SDCP_ABRTFTE - old.appd_RTFTE,
        SDCP_ABRTIVA = SDCP_ABRTIVA - old.appd_RTIVA,
        SDCP_ABRTICA = SDCP_ABRTICA - old.appd_RTICA,
        SDCP_ABRCREE = SDCP_ABRCREE - old.appd_rcree
        WHERE SDCP_TIPOREF = OLD.APPD_TIPODOC AND SDCP_IDREF = OLD.appd_IDDOC AND SDCP_FECHA = :FEC;

    UPDATE movimiento_proveedor
        SET MVPR_MONTO = MVPR_MONTO - OLD.appd_aplicado - OLD.appd_difcambio,
        MVPR_RTFTE = MVPR_RTFTE - OLD.appd_rtfte,
        MVPR_RTIVA = MVPR_RTIVA - OLD.appd_rtiva,
        MVPR_RTICA = MVPR_RTICA - OLD.appd_rtica,
        MVPR_RCREE = MVPR_RCREE - OLD.appd_rcree
        WHERE MVPR_TIPOREF = 53 AND MVPR_IDREF = NEW.APPR_ID;
    end
if ((NEW.appd_anulado = 'N') AND (NEW.APPR_ID <> 0)) then
    begin
    if (new.appd_tipodoc = 55) then
        BEGIN
        /* BUSQUE SI TIENE EGRE_ID, SI NO LO ACTUALIZA */
        SELECT EGRE_ID FROM ANTICIPOS_PROVEEDOR WHERE ANPR_ID = NEW.appd_iddoc INTO :EGANTI;
        if ((EGANTI = 0) or (EGANTI IS NULL)) then
            BEGIN
            exception anticpo_sin_origen;
            END
        END
    /* valide que no se pase del saldo */
    execute procedure saldo_doc_cxpagar(new.appd_tipodoc, new.appd_iddoc, '9999/12/31', 0) returning_values(saldo);
    execute procedure lee_configuracion('CXPAGAR', 'SALDOS', 'DESCONTAR RETENCIONES POR CAUSACION') returning_values (RETES);
    if (SALDO = 0) then
      EXCEPTION DOCUMENTO_ABONO_MAYOR 'EL SALDO DEL DOCUMENTO ' || NEW.appd_prefijo || NEW.appd_numero || ' ES INSUFICIENTE.';
    else
      if (SALDO < 0) then
        BEGIN
        if (RETES = 'SI') then
            begin
            if (saldo > (NEW.appd_aplicado+NEW.appd_difcambio)) then
                EXCEPTION DOCUMENTO_ABONO_MAYOR 'EL SALDO DEL DOCUMENTO ' || NEW.appd_prefijo || NEW.appd_numero || ' ES INSUFICIENTE.';
            end
        ELSE
            begin
            if (saldo > (NEW.appd_aplicado + NEW.appd_rtfte + NEW.appd_rtiva + NEW.appd_rtica + NEW.appd_difcambio)) then
                EXCEPTION DOCUMENTO_ABONO_MAYOR 'EL SALDO DEL DOCUMENTO ' || NEW.appd_prefijo || NEW.appd_numero || ' ES INSUFICIENTE.';
            end
        END
      else
        BEGIN
        if (RETES = 'SI') then
            begin
            if (saldo < NEW.appd_aplicado) then
                EXCEPTION DOCUMENTO_ABONO_MAYOR 'EL SALDO DEL DOCUMENTO ' || NEW.appd_prefijo || NEW.appd_numero || ' ES INSUFICIENTE.';
            end
        ELSE
            begin
            if (saldo < (NEW.appd_aplicado + NEW.appd_rtfte + NEW.appd_rtiva + NEW.appd_rtica + NEW.appd_difcambio)) then
                EXCEPTION DOCUMENTO_ABONO_MAYOR 'EL SALDO DEL DOCUMENTO ' || NEW.appd_prefijo || NEW.appd_numero || ' ES INSUFICIENTE.';
            end
        END
    select 'S' from saldos_doc_cxpagar where sdcp_tiporef = new.appd_tipodoc and sdcp_idref = new.appd_iddoc and sdcp_fecha = :FEC into :EXISTE;
    if (Existe = 'S') then
        /* actualice el saldo del dia */
        UPDATE saldos_doc_cxpagar
            SET SDCP_ABONO = SDCP_ABONO + NEW.appd_aplicado + NEW.appd_difcambio,
                SDCP_ABRTFTE = SDCP_ABRTFTE + NEW.appd_RTFTE,
                SDCP_ABRTIVA = SDCP_ABRTIVA + NEW.appd_RTIVA,
                SDCP_ABRTICA = SDCP_ABRTICA + NEW.appd_RTICA,
                SDCP_ABRCREE = SDCP_ABRCREE + NEW.appd_rcree,
                SDCP_TRM = :TRM
            WHERE SDCP_TIPOREF = NEW.APPD_TIPODOC AND SDCP_IDREF = NEW.appd_IDDOC AND SDCP_FECHA = :FEC;
    ELSE
        /* Inserte un nuevo saldo diario */
        INSERT INTO SALDOS_DOC_CXPAGAR (SDCP_TIPOREF, SDCP_IDREF, SDCP_FECHA, TERC_NIT, SDCP_RTEFTE, SDCP_RTIVA, SDCP_RTICA, SDCP_ABONO, SDCP_ABRTFTE, SDCP_ABRTIVA, SDCP_ABRTICA, SDCP_ABRCREE, SDCP_DEBITO, SDCP_MONTO, SDCP_TRM)
            VALUES (NEW.APPD_TIPODOC, NEW.APPD_IDDOC, :FEC, :NIT, 0, 0, 0, (NEW.appd_aplicado+NEW.appd_difcambio), NEW.appd_rtfte, NEW.appd_rtiva, NEW.appd_rtica, NEW.appd_rcree, 'N', 0, :TRM);

    /* Registre o actualice el registro en movimiento_proveedor */
    EXISTE = 'N';
    SELECT 'S' FROM MOVIMIENTO_PROVEEDOR WHERE MVPR_TIPOREF = 53 AND MVPR_IDREF = NEW.APPR_ID INTO :EXISTE;
    if (EXISTE = 'S') then
        begin
        /* Actualice el nuevo */
        UPDATE movimiento_proveedor
            SET MVPR_MONTO = MVPR_MONTO + NEW.appd_aplicado + NEW.appd_difcambio,
                MVPR_RTFTE = MVPR_RTFTE + NEW.appd_rtfte,
                MVPR_RTIVA = MVPR_RTIVA + NEW.appd_rtiva,
                MVPR_RTICA = MVPR_RTICA + NEW.appd_rtica,
                MVPR_RCREE = MVPR_RCREE + NEW.appd_rcree,
                MVPR_TRM = :TRM
            WHERE MVPR_TIPOREF = 53 AND MVPR_IDREF = NEW.APPR_ID;
        end
    ELSE
        INSERT INTO MOVIMIENTO_PROVEEDOR (MVPR_ID, TERC_NIT, MVPR_TIPOREF, MVPR_IDREF, MVPR_FECHA, MVPR_VENCE, MVPR_CONC, MVPR_MONTO, MVPR_RTFTE, MVPR_RTIVA, MVPR_RTICA, MVPR_RCREE, MVPR_DEBITO, MVPR_ABONO, MVPR_PREFIJO, MVPR_NUMERO, MVPR_TRM)
            VALUES (GEN_ID(ID_MOVPROV, 1), :NIT, 53, NEW.APPR_ID, :FEC, :FEC, :CONCEPTO, (NEW.APPD_APLICADO+NEW.appd_difcambio), NEW.APPD_RTFTE, NEW.APPD_RTIVA, NEW.APPD_RTICA, NEW.appd_rcree, 'N', 'S', :PREFIJO, :NUMERO, :TRM);
    end
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER TRIGGER APLICACION_PROVEEDOR_DETALLE_AD FOR APLICACION_PROVEEDOR_DETALLE
ACTIVE AFTER DELETE POSITION 0
AS
declare variable FEC DATE;
BEGIN
  if ((OLD.APPR_ID <> 0) AND (OLD.appd_anulado = 'N')) then
    BEGIN
    /* Abone el documento referenciado en APLICACION_PROVEEDOR_DETALLE */
    select appr_fecha from aplicacion_provedor where appr_id = OLD.appr_id into :FEC;
    UPDATE saldos_doc_cxpagar
        SET SDCP_ABONO = SDCP_ABONO - old.appd_aplicado - OLD.appd_difcambio,
            SDCP_ABRTFTE = SDCP_ABRTFTE - old.appd_RTFTE,
            SDCP_ABRTIVA = SDCP_ABRTIVA - old.appd_RTIVA,
            SDCP_ABRTICA = SDCP_ABRTICA - old.appd_RTICA,
            SDCP_ABRCREE = SDCP_ABRCREE - old.appd_rcree
        WHERE SDCP_TIPOREF = OLD.APPD_TIPODOC AND SDCP_IDREF = OLD.appd_IDDOC AND SDCP_FECHA = :FEC;
    UPDATE movimiento_proveedor
        SET MVPR_MONTO = MVPR_MONTO - OLD.appd_aplicado - OLD.appd_difcambio,
            MVPR_RTFTE = MVPR_RTFTE - OLD.appd_rtfte,
            MVPR_RTIVA = MVPR_RTIVA - OLD.appd_rtiva,
            MVPR_RTICA = MVPR_RTICA - OLD.appd_rtica,
            MVPR_RCREE = MVPR_RCREE - OLD.appd_rcree
        WHERE MVPR_TIPOREF = 53 AND MVPR_IDREF = OLD.APPR_ID;
    end
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER procedure CHEQUEO_MOVIMIENTO_CXPAGAR (
    PRVINI varchar(20),
    PRVFIN varchar(20))
AS
declare variable FECHA DATE;
declare variable VENCE DATE;
declare variable NIT VARCHAR(20);
declare variable RTFTE NUMERIC(18, 2);
declare variable RTIVA NUMERIC(18, 2);
declare variable RTICA NUMERIC(18, 2);
declare variable RCREE NUMERIC(18, 2);
declare variable MONTO NUMERIC(18, 2);
declare variable TRM NUMERIC(18, 2);
declare variable EXISTE CHAR(1);
declare variable IDR INTEGER;
declare variable NUMPROV VARCHAR(10);
declare variable CONC VARCHAR(60);
declare variable ID integer;
declare variable PREF varchar(4);
declare variable NUMERO varchar(8);
declare variable TIPO INTEGER;
BEGIN
DELETE FROM anticipos_proveedor WHERE EGRE_ID = 0;
DELETE FROM MOVIMIENTO_PROVEEDOR WHERE TERC_NIT >= :PRVINI AND TERC_NIT <= :PRVFIN;

FOR SELECT FACO_ID, PREF_PRE, FACO_NUMERO, FACO_FECHA, FACO_VENCE, TERC_NIT, FACO_RTFTEMONTO, FACO_rtivamonto, FACO_rticamonto, FACO_RTCREEM, FACO_TOTAL, FACO_NUMPROV, faco_trm
    FROM FACTURAS_COMPRA WHERE FACO_ID <> 0 and faco_anulado = 'N' AND TERC_NIT >= :PRVINI AND TERC_NIT <= :PRVFIN
    ORDER BY FACO_FECHA
    INTO :ID, :PREF, :NUMERO, :FECHA, :VENCE, :nit,  :RTFTE, :RTIVA, :RTICA, :RCREE, :MONTO, :NUMPROV, :TRM
    DO
    BEGIN
    CONC = 'FACTURA DE COMPRA No.' || :PREF || :NUMERO || ' - ' || :NUMPROV;
    INSERT INTO movimiento_proveedor(MVPR_ID, TERC_NIT, MVPR_TIPOREF, MVPR_IDREF, MVPR_FECHA, MVPR_VENCE, MVPR_CONC, MVPR_MONTO, MVPR_RTFTE, MVPR_RTIVA, MVPR_RTICA, MVPR_RCREE, MVPR_DEBITO, MVPR_ABONO, MVPR_PREFIJO, MVPR_NUMERO, MVPR_TRM)
      VALUES (GEN_ID(ID_MOVPROV, 1), :NIT, 21, :ID, :FECHA, :VENCE, :CONC, :MONTO, :RTFTE, :RTIVA, :RTICA, :RCREE, 'S', 'N', :pref, :numero, :TRM);
    END

FOR SELECT NDPR_ID, PREF_PRE, NDPR_NUMERO, NDPR_FECHA, NDPR_VENCE, NDPR_CONC, TERC_NIT, NDPR_RTFTEMONTO, NDPR_rtivamonto, NDPR_rticamonto, NDPR_RTCREEM, ndpr_monto+ndpr_ivamonto, NDPR_TRM
    FROM notas_debito_proveedor WHERE NDPR_ID <> 0 and NDPR_anulado = 'N' AND TERC_NIT >= :PRVINI AND TERC_NIT <= :PRVFIN
    ORDER BY NDPR_FECHA
    INTO :ID, :PREF, :NUMERO, :FECHA, :VENCE, :CONC, :nit,  :RTFTE, :RTIVA, :RTICA, :RCREE, :MONTO, :TRM
    DO
    INSERT INTO MOVIMIENTO_PROVEEDOR (MVPR_ID, TERC_NIT, MVPR_TIPOREF, MVPR_IDREF, MVPR_FECHA, MVPR_VENCE, MVPR_CONC, MVPR_MONTO, MVPR_RTFTE, MVPR_RTIVA, MVPR_RTICA, MVPR_RCREE, MVPR_DEBITO, MVPR_ABONO, MVPR_PREFIJO, MVPR_NUMERO, MVPR_TRM)
      VALUES (GEN_ID(ID_MOVPROV, 1), :NIT, 51, :ID, :FECHA, :VENCE, :CONC, :monto, :RTFTE, :RTIVA, :RTICA, :RCREE, 'S', 'N', :pref, :numero, :TRM);

FOR SELECT DVCO_ID, PREF_PRE, DVCO_NUMERO, DVCO_FECHA, TERC_NIT, DVCO_RTFTEMONTO, DVCO_rtivamonto, DVCO_rticamonto, DVCO_RTCREEM, dvco_total, DVCO_TRM
    FROM devoluciones_compras WHERE DVCO_ID <> 0 and DVCO_anulado = 'N' AND TERC_NIT >= :PRVINI AND TERC_NIT <= :PRVFIN
    ORDER BY DVCO_FECHA
    INTO :ID, :PREF, :NUMERO, :FECHA, :nit,  :RTFTE, :RTIVA, :RTICA, :RCREE, :MONTO, :TRM
    DO
    BEGIN
    CONC = 'DEVOLUCION COMPRA No.' || PREF || NUMERO;
    INSERT INTO movimiento_proveedor (MVPR_ID, TERC_NIT, MVPR_TIPOREF, MVPR_IDREF, MVPR_FECHA, MVPR_VENCE, MVPR_CONC, MVPR_MONTO, MVPR_RTFTE, MVPR_RTIVA, MVPR_RTICA, MVPR_RCREE, MVPR_DEBITO, MVPR_ABONO, MVPR_PREFIJO, MVPR_NUMERO, MVPR_TRM)
      VALUES (GEN_ID(ID_MOVPROV, 1), :NIT, 24, :ID, :FECHA, :FECHA, :CONC, :monto, :RTFTE, :RTIVA, :RTICA, :RCREE, 'N', 'N', :pref, :numero, :TRM);
    END

FOR SELECT NCPR_ID, PREF_PRE, NCPR_NUMERO, NCPR_FECHA, NCPR_CONC, TERC_NIT, NCPR_RTFTEMONTO, NCPR_rtivamonto, NCPR_rticamonto, NCPR_RTCREEM, ncpr_monto+ncpr_ivamonto, NCPR_TRM
    FROM notas_credito_proveedor WHERE NCPR_ID <> 0 and NCPR_anulado = 'N' AND TERC_NIT >= :PRVINI AND TERC_NIT <= :PRVFIN
    ORDER BY NCPR_FECHA
    INTO :ID, :PREF, :NUMERO, :FECHA, :CONC, :nit,  :RTFTE, :RTIVA, :RTICA, :RCREE, :MONTO, :TRM
    DO
    INSERT INTO MOVIMIENTO_PROVEEDOR (MVPR_ID, TERC_NIT, MVPR_TIPOREF, MVPR_IDREF, MVPR_FECHA, MVPR_VENCE, MVPR_CONC, MVPR_MONTO, MVPR_RTFTE, MVPR_RTIVA, MVPR_RTICA, MVPR_RCREE, MVPR_DEBITO, MVPR_ABONO, MVPR_PREFIJO, MVPR_NUMERO, MVPR_TRM)
      VALUES (GEN_ID(ID_MOVPROV, 1), :NIT, 52, :ID, :FECHA, :FECHA, :CONC, :MONTO, :RTFTE, :RTIVA, :RTICA, :RCREE, 'N', 'N', :pref, :numero, :TRM);

FOR SELECT ANPR_ID, PREF_PRE, ANPR_NUMERO, ANPR_FECHA, ANPR_CONC, TERC_NIT, ANPR_RTFTEMONTO, ANPR_rtivamonto, ANPR_rticamonto, ANPR_RTCREEM, anpr_base+anpr_ivamonto, ANPR_TRM
    FROM anticipos_proveedor WHERE ANPR_ID <> 0 and ANPR_anulado = 'N' AND TERC_NIT >= :PRVINI AND TERC_NIT <= :PRVFIN
    ORDER BY ANPR_FECHA
    INTO :ID, :PREF, :NUMERO, :FECHA, :CONC, :nit,  :RTFTE, :RTIVA, :RTICA, :RCREE, :MONTO, :TRM
    DO
    INSERT INTO MOVIMIENTO_PROVEEDOR (MVPR_ID, TERC_NIT, MVPR_TIPOREF, MVPR_IDREF, MVPR_FECHA, MVPR_VENCE, MVPR_CONC, MVPR_MONTO, MVPR_RTFTE, MVPR_RTIVA, MVPR_RTICA, MVPR_RCREE, MVPR_DEBITO, MVPR_ABONO, MVPR_PREFIJO, MVPR_NUMERO, MVPR_TRM)
      VALUES (GEN_ID(ID_MOVPROV, 1), :NIT, 55, :ID, :FECHA, :FECHA, :CONC, :monto, :RTFTE, :RTIVA, :RTICA, :RCREE, 'N', 'N', :pref, :numero, :TRM);

FOR SELECT A.APPR_ID, PREF_PRE, APPR_NUMERO, APPR_FECHA, APPR_CONC, TERC_NIT, APPD_APLICADO-APPD_DIFCAMBIO, APPD_RTFTE, APPD_RTIVA, APPD_RTICA, APPD_RCREE, A.appr_trm
    FROM APLICACION_PROVEEDOR_DETALLE D, aplicacion_provedor A
    WHERE A.APPR_ID = D.appr_id AND A.APPR_ID <> 0 AND APPR_ANULADO = 'N' AND TERC_NIT >= :PRVINI AND TERC_NIT <= :PRVFIN
    ORDER BY APPR_FECHA
    INTO :ID, :PREF, :NUMERO, :FECHA, :CONC, :NIT, :MONTO, :RTFTE, :RTIVA, :RTICA, :RCREE, :TRM
    DO
    BEGIN
    EXISTE = 'N';
    SELECT 'S' FROM MOVIMIENTO_PROVEEDOR WHERE MVPR_TIPOREF = 53 AND MVPR_IDREF = :ID INTO :EXISTE;
    if (EXISTE = 'S') then
        begin
        UPDATE movimiento_proveedor
            SET MVPR_MONTO = MVPR_MONTO + :MONTO,
                MVPR_RTFTE = MVPR_RTFTE + :rtfte,
                MVPR_RTIVA = MVPR_RTIVA + :rtiva,
                MVPR_RTICA = MVPR_RTICA + :rtica,
                MVPR_RCREE = MVPR_RCREE + :rcree,
                MVPR_TRM = :TRM
            WHERE MVPR_TIPOREF = 53 AND MVPR_IDREF = :ID;
        end
    ELSE
        INSERT INTO MOVIMIENTO_PROVEEDOR (MVPR_ID, TERC_NIT, MVPR_TIPOREF, MVPR_IDREF, MVPR_FECHA, MVPR_VENCE, MVPR_CONC, MVPR_MONTO, MVPR_RTFTE, MVPR_RTIVA, MVPR_RTICA, MVPR_RCREE, MVPR_DEBITO, MVPR_ABONO, MVPR_PREFIJO, MVPR_NUMERO, MVPR_TRM)
            VALUES (GEN_ID(ID_MOVPROV, 1), :NIT, 53, :ID, :FECHA, :FECHA, :CONC, :MONTO, :RTFTE, :RTIVA, :RTICA, :RCREE, 'N', 'S', :PREF, :NUMERO, :TRM);
    END

FOR SELECT E.EGRE_ID, PREF_PRE, EGRE_NUMERO, EGRE_FECHA, EGRE_CONC, TERC_NIT, EGDE_ABONO+EGDE_DTOF-EGDE_DIFCAMBIO, EGDE_RTFTE, EGDE_RTIVA, EGDE_RTICA, EGDE_RCREE, EGDE_TIPODOC, EGDE_IDDOC, E.egre_trm
    FROM EGRESOS_DETALLE D, EGRESOS E
    WHERE E.EGRE_ID = D.EGRE_ID AND E.EGRE_ID <> 0 AND EGRE_ANULADO = 'N' AND TERC_NIT >= :PRVINI AND TERC_NIT <= :PRVFIN
    ORDER BY EGRE_FECHA
    INTO :IDR, :PREF, :NUMERO, :FECHA, :CONC, :NIT, :MONTO, :RTFTE, :RTIVA, :RTICA, :RCREE, TIPO, :ID, :TRM
    DO
    BEGIN
    EXISTE = 'N';
    /* TRAIGA EL NIT DEL DOCUMENTO POR SI SE PERMITEN ABONOS DE VARIOS */
    SELECT TERC_NIT FROM movimiento_proveedor M WHERE M.mvpr_tiporef = :TIPO AND M.mvpr_idref = :ID INTO :NIT;
    SELECT 'S' FROM MOVIMIENTO_PROVEEDOR WHERE MVPR_TIPOREF = 62 AND MVPR_IDREF = :IDR AND TERC_NIT = :NIT INTO :EXISTE;
    if (EXISTE = 'S') then
        begin
        UPDATE movimiento_proveedor
            SET MVPR_MONTO = MVPR_MONTO + :MONTO,
                MVPR_RTFTE = MVPR_RTFTE + :rtfte,
                MVPR_RTIVA = MVPR_RTIVA + :rtiva,
                MVPR_RTICA = MVPR_RTICA + :rtica,
                MVPR_RCREE = MVPR_RCREE + :rcree,
                MVPR_TRM = :TRM
            WHERE MVPR_TIPOREF = 62 AND MVPR_IDREF = :IDR AND TERC_NIT = :NIT;
        end
    ELSE
        INSERT INTO MOVIMIENTO_PROVEEDOR (MVPR_ID, TERC_NIT, MVPR_TIPOREF, MVPR_IDREF, MVPR_FECHA, MVPR_VENCE, MVPR_CONC, MVPR_MONTO, MVPR_RTFTE, MVPR_RTIVA, MVPR_RTICA, MVPR_RCREE, MVPR_DEBITO, MVPR_ABONO, MVPR_PREFIJO, MVPR_NUMERO, MVPR_TRM)
            VALUES (GEN_ID(ID_MOVPROV, 1), :NIT, 62, :IDR, :FECHA, :FECHA, :CONC, :MONTO, :RTFTE, :RTIVA, :RTICA, :RCREE, 'N', 'S', :PREF, :NUMERO, :TRM);
    END

FOR SELECT R.reca_id, PREF_PRE, RECA_NUMERO, RECA_FECHA, RECA_CONC, TERC_NIT, D.rccr_abono+D.rccr_dtof-D.rccr_difcambio, D.rccr_rtfte, D.rccr_rtiva, D.rccr_rtica, D.rccr_rcree, R.reca_trm
    FROM recibos_caja_crucec D, recibos_caja R
    WHERE R.reca_id = D.reca_id AND R.reca_id <> 0 AND RECA_ANULADO = 'N' AND TERC_NIT >= :PRVINI AND TERC_NIT <= :PRVFIN
    ORDER BY RECA_FECHA
    INTO :IDR, :PREF, :NUMERO, :FECHA, :CONC, :NIT, :MONTO, :RTFTE, :RTIVA, :RTICA, :RCREE, :TRM
    DO
    BEGIN
    EXISTE = 'N';
    SELECT 'S' FROM MOVIMIENTO_PROVEEDOR WHERE MVPR_TIPOREF = 61 AND MVPR_IDREF = :IDR INTO :EXISTE;
    if (EXISTE = 'S') then
        begin
        UPDATE movimiento_proveedor
            SET MVPR_MONTO = MVPR_MONTO + :MONTO,
                MVPR_RTFTE = MVPR_RTFTE + :rtfte,
                MVPR_RTIVA = MVPR_RTIVA + :rtiva,
                MVPR_RTICA = MVPR_RTICA + :rtica,
                MVPR_RCREE = MVPR_RCREE + :rcree,
                MVPR_TRM = :TRM
            WHERE MVPR_TIPOREF = 61 AND MVPR_IDREF = :IDR;
        end
    ELSE
        INSERT INTO MOVIMIENTO_PROVEEDOR (MVPR_ID, TERC_NIT, MVPR_TIPOREF, MVPR_IDREF, MVPR_FECHA, MVPR_VENCE, MVPR_CONC, MVPR_MONTO, MVPR_RTFTE, MVPR_RTIVA, MVPR_RTICA, MVPR_RCREE, MVPR_DEBITO, MVPR_ABONO, MVPR_PREFIJO, MVPR_NUMERO, MVPR_TRM)
            VALUES (GEN_ID(ID_MOVPROV, 1), :NIT, 61, :IDR, :FECHA, :FECHA, :CONC, :MONTO, :RTFTE, :RTIVA, :RTICA, :RCREE, 'N', 'S', :PREF, :NUMERO, :TRM);
    END
END
^

SET TERM ; ^

/* 20140502B */
/* CHECK PARA INCLUIR TODOS ARTICULOS */
SET TERM ^ ;

CREATE OR ALTER procedure EXISTENCIAS_BAJO_MINIMO (
    FECHA date,
    ARTINI varchar(20),
    ARTFIN varchar(20),
    GRPINI varchar(2),
    GRPFIN varchar(2),
    ORDEN char(1),
    CEROS char(1))
returns (
    CODIGO varchar(15),
    NOMBRE varchar(60),
    CANT numeric(18,4),
    UNIDAD varchar(8),
    CODGRUPO varchar(2),
    NOMGRUPO varchar(30),
    CODSUBG varchar(3),
    NOMSUBG varchar(30),
    CODMARC varchar(3),
    NOMMARC varchar(30),
    CODBOD varchar(2),
    NOMBOD varchar(30),
    STAND varchar(20),
    MINIMO numeric(18,4),
    FALTANTE numeric(18,4),
    ULTCOSTO numeric(18,2),
    FECHACOSTO date)
AS
declare variable CODINI VARCHAR(20);
declare variable CODFIN VARCHAR(20);
declare variable DESINI VARCHAR(20);
declare variable DESFIN VARCHAR(20);
declare variable PORART VARCHAR(8);
declare variable MAXDIA VARCHAR(2);
declare variable DISPONIBILIDAD integer;
declare variable PROMEDIO numeric(18,4);
declare variable SALIDAS numeric(18,4);
BEGIN
if (ORDEN = 'C') then
    BEGIN
    CODINI = ARTINI;
    CODFIN = ARTFIN;
    DESINI = '';
    DESFIN = 'zz';
    END
ELSE
    BEGIN
    DESINI = ARTINI;
    DESFIN = ARTFIN;
    CODINI = '';
    CODFIN = 'zz';
    END
execute procedure lee_configuracion ('INVENTARIO', 'EXISTENCIAS', 'MAXIMO Y MINIMO POR STAND O POR ARTICULO') returning_values (:porart);
execute procedure lee_configuracion ('INVENTARIO', 'EXISTENCIAS', 'MINIMO INVENTARIO EN DIAS') returning_values (:maxdia);

FOR SELECT ARTI_COD, ARTI_DES, ARTI_UNIDAD, A.GRUP_COD, A.SUBG_COD, A.MARC_COD, BODE_COD, BODE_NOM, ARTI_MIN
      FROM ARTICULO A, BODEGA B
      WHERE ARTI_COD >= :CODINI AND ARTI_COD <= :CODFIN AND A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :GRPFIN AND ARTI_DES >= :DESINI AND ARTI_DES <= :DESFIN
        AND ESAR_COD <> 'I'
      INTO :CODIGO, :NOMBRE, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC, :CODBOD, :NOMBOD, :MINIMO
      DO
        BEGIN
        SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
        SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
        SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
        if (PORART = 'STAND') then
            BEGIN
            minimo = 0;
            SELECT STAND_MIN, :STAND FROM STANDS WHERE ARTI_COD = :CODIGO AND STAND_BODEGA = :codbod INTO :minimo, :STAND;
            END
        ELSE
            SELECT STAND_COD FROM STANDS WHERE ARTI_COD = :CODIGO AND STAND_BODEGA = :codbod INTO :STAND;

        if (maxdia = 'SI') then
            begin
            EXECUTE PROCEDURE DISPONIBILIDAD_ARTICULO(CODIGO, FECHA, :CODBOD) returning_values (:DISPONIBILIDAD, :CANT, :PROMEDIO, :SALIDAS);
            if (((DISPONIBILIDAD < minimo) and (PROMEDIO > 0)) or (CEROS = 'S')) then
                begin
                FALTANTE = (minimo * PROMEDIO) - cant;
                SUSPEND;
                end
            end
        else
            begin
            EXECUTE PROCEDURE SALDO_INVENTARIO(CODIGO, :CODBOD, FECHA) returning_values (CANT);
            if ((CANT < MINIMO) or (CEROS = 'S')) then
                BEGIN
                EXECUTE PROCEDURE ULTIMO_COSTO(CODIGO, FECHA, UNIDAD) returning_values (ULTCOSTO);
                SELECT FIRST 1 MVAR_FECHA FROM MOVIMIENTO_ARTICULO WHERE ARTI_COD = :CODIGO AND
                    MVAR_ENTRADA = 'S' AND MVAR_FECHA <= :FECHA ORDER BY MVAR_FECHA DESC INTO :FECHACOSTO;
                FALTANTE = MINIMO - CANT;
                SUSPEND;
                END
            end
        END
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER procedure EXISTENCIAS_SOBRE_MAXIMO (
    FECHA date,
    ARTINI varchar(20),
    ARTFIN varchar(20),
    GRPINI varchar(2),
    GRPFIN varchar(2),
    ORDEN char(1),
    CEROS char(1))
returns (
    CODIGO varchar(15),
    NOMBRE varchar(60),
    CANT numeric(18,4),
    UNIDAD varchar(8),
    CODGRUPO varchar(2),
    NOMGRUPO varchar(30),
    CODSUBG varchar(3),
    NOMSUBG varchar(30),
    CODMARC varchar(3),
    NOMMARC varchar(30),
    CODBOD varchar(2),
    NOMBOD varchar(30),
    STAND varchar(20),
    DIASMAX numeric(18,4),
    MAXIMO numeric(18,4),
    DIASINV numeric(18,4),
    EXCEDENTE numeric(18,4),
    ULTCOSTO numeric(18,2),
    COSTOTOT numeric(18,2))
AS
declare variable CODINI VARCHAR(20);
declare variable CODFIN VARCHAR(20);
declare variable DESINI VARCHAR(20);
declare variable DESFIN VARCHAR(20);
declare variable PORART VARCHAR(8);
declare variable MAXDIA VARCHAR(2);
declare variable DISPONIBILIDAD integer;
declare variable PROMEDIO numeric(18,4);
declare variable SALIDAS numeric(18,4);
BEGIN
if (ORDEN = 'C') then
    BEGIN
    CODINI = ARTINI;
    CODFIN = ARTFIN;
    DESINI = '';
    DESFIN = 'zz';
    END
ELSE
    BEGIN
    DESINI = ARTINI;
    DESFIN = ARTFIN;
    CODINI = '';
    CODFIN = 'zz';
    END
execute procedure lee_configuracion ('INVENTARIO', 'EXISTENCIAS', 'MAXIMO Y MINIMO POR STAND O POR ARTICULO') returning_values (:porart);
execute procedure lee_configuracion ('INVENTARIO', 'EXISTENCIAS', 'MAXIMO INVENTARIO EN DIAS') returning_values (:maxdia);

FOR SELECT ARTI_COD, ARTI_DES, ARTI_UNIDAD, A.GRUP_COD, A.SUBG_COD, A.MARC_COD, BODE_COD, BODE_NOM, ARTI_MAX
      FROM ARTICULO A, BODEGA B
      WHERE ARTI_COD >= :CODINI AND ARTI_COD <= :CODFIN AND A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :GRPFIN AND ARTI_DES >= :DESINI AND ARTI_DES <= :DESFIN
      INTO :CODIGO, :NOMBRE, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC, :CODBOD, :NOMBOD, :MAXIMO
      DO
        BEGIN
        SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
        SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
        SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
        if (PORART = 'STAND') then
            BEGIN
            maximo = 0;
            SELECT STAND_COD, STAND_MAX FROM STANDS WHERE ARTI_COD = :CODIGO AND STAND_BODEGA = :codbod INTO :STAND, :maximo;
            END
        else
            SELECT STAND_COD FROM STANDS WHERE ARTI_COD = :CODIGO AND STAND_BODEGA = :codbod INTO :STAND;
        if (maxdia = 'SI') then
            begin
            EXECUTE PROCEDURE DISPONIBILIDAD_ARTICULO(CODIGO, FECHA, :CODBOD) returning_values (:DISPONIBILIDAD, :CANT, :PROMEDIO, :SALIDAS);
            if ((DISPONIBILIDAD > maximo) or (CEROS = 'S')) then
                begin
                EXECUTE PROCEDURE ULTIMO_COSTO(CODIGO, FECHA, UNIDAD) returning_values (ULTCOSTO);
                DIASMAX = MAXIMO;
                MAXIMO = MAXIMO * PROMEDIO;
                DIASINV = CANT / PROMEDIO;
                excedente = cant - maximo;
                COSTOTOT = ULTCOSTO * excedente;
                SUSPEND;
                end
            end
        else
            begin
            DIASMAX = 0;
            DIASINV = 0;
            EXECUTE PROCEDURE SALDO_INVENTARIO(CODIGO, :CODBOD, FECHA) returning_values (CANT);
            if ((CANT > maximo) or (CEROS = 'S')) then
                BEGIN
                EXECUTE PROCEDURE ULTIMO_COSTO(CODIGO, FECHA, UNIDAD) returning_values (ULTCOSTO);
                excedente =  CANT - maximo;
                COSTOTOT = ULTCOSTO * excedente;
                SUSPEND;
                END
            end
        END
END
^

SET TERM ; ^

/* 20140502c */
/* si total en cero lo recalculaba con dtomonto como total y no unitario como queda grabado */
SET TERM ^ ;

CREATE OR ALTER TRIGGER DEVOLUCIONES_VENTAS_DETALLE_BI FOR DEVOLUCIONES_VENTAS_DETALLE
ACTIVE BEFORE INSERT POSITION 0
AS
declare variable TRM numeric(18,2);
declare variable IVAINC CHAR(1);
BEGIN
if (new.dvde_cant is null) then
    new.dvde_cant = 0;
if (new.dvde_prunit is null) then
    new.dvde_prunit = 0;
if (new.dvde_dtoporc is null) then
    new.dvde_dtoporc = 0;
if (new.dvde_ivaporc is null) then
    new.dvde_ivaporc = 0;
if (new.dvde_ivamonto is null) then
    new.dvde_ivamonto = 0;
if (new.dvde_consumo is null) then
    new.dvde_consumo = 0;
EXECUTE PROCEDURE factor_unidad_cant_excep(new.arti_cod, new.dvde_unidad) returning_values (new.dvde_factor);
/* CALCULE EL MONTO DEL DESCUENTO */
NEW.DVDE_DTOMONTO = NEW.dvde_prunit * NEW.dvde_dtoporc / 100;
/* si estaba en otra moneda convierta a pesos */
select devt_trm, devt_ivainc from devoluciones_ventas where devt_id = new.devt_id into :trm, :ivainc;
if ((NEW.dvde_total IS NULL) or (NEW.dvde_total = 0)) then
    BEGIN
    NEW.dvde_total = NEW.dvde_cant * (NEW.dvde_prunit - NEW.dvde_dtomonto);
    if (IVAINC = 'N') then
        NEW.dvde_total = NEW.dvde_total + NEW.dvde_ivamonto + NEW.dvde_consumo;
    END
if (trm <> 1) then
    begin
    new.dvde_prunit = new.dvde_prunit * trm;
    new.dvde_dtomonto = new.dvde_dtomonto * trm;
    new.dvde_ivamonto = new.dvde_ivamonto * trm;
    new.dvde_consumo = new.dvde_consumo * trm;
    new.dvde_total = new.dvde_total * trm;
    end
select taiv_cod from articulo where arti_cod = new.arti_cod into new.dvde_tiva;
END
^

SET TERM ; ^

/* 20140502F */
/* datos de ubicación del tercero obligatorios */
INSERT INTO CONFIGURACION (CONF_MODULO, CONF_CATEGORIA, CONF_PROPIEDAD, CONF_VALOR, CONF_POSIBLES, CONF_AYUDA) VALUES ('CONTABILIDAD', 'TERCEROS', 'DATOS DE DIRECCION, CIUDAD, PAIS, TELEFONO Y MAIL OBLIGATORIOS', 'NO', 'SI,NO', 'SI:Obliga que los datos de ubicación del tercero estén completos antes de grabar el registro.');
commit work;

CREATE EXCEPTION DATO_OBLIGATORIO 'El Dato indicado es obligatorio';

SET TERM ^ ;

CREATE OR ALTER TRIGGER TERCEROS_BI FOR TERCEROS
ACTIVE BEFORE INSERT POSITION 0
as
declare variable UBICOBL CHAR(2);
begin
if (NEW.terc_tipoid IS NULL) then
    NEW.terc_tipoid = 'J';
if (NEW.terc_clie IS NULL) then
    NEW.terc_clie = 'N';
if (NEW.terc_prov IS NULL) then
    NEW.terc_prov = 'N';
if (NEW.terc_empl IS NULL) then
    NEW.terc_empl = 'N';
if (NEW.terc_estado IS NULL) then
    NEW.terc_estado = 'S';
if (NEW.terc_admini IS NULL) then
    NEW.terc_admini = 'N';
if (NEW.terc_conductor IS NULL) then
    NEW.terc_conductor = 'N';
if (NEW.terc_nitconta IS NULL) then
    NEW.terc_nitconta = NEW.terc_nit;
if (NEW.terc_dvdian IS NULL) then
    NEW.terc_dvdian = NEW.terc_dv;
if (NEW.pais_id IS NULL) then
    NEW.pais_id = '169';
SELECT SUBSTR(CIUD_NOM,1,40) FROM CIUDADES WHERE CIUD_COD = NEW.ciud_cod INTO NEW.terc_ciu;
execute procedure lee_configuracion ('CONTABILIDAD', 'TERCEROS', 'DATOS DE DIRECCION, CIUDAD, PAIS, TELEFONO Y MAIL OBLIGATORIOS') returning_values (:UBICOBL);
if (UBICOBL = 'SI') then
    BEGIN
    if ((NEW.terc_dir IS NULL) or (NEW.terc_dir = '')) then
        exception dato_obligatorio 'Debe indicar la dirección del tercero';
    if ((NEW.terc_tel IS NULL) or (NEW.terc_tel = '')) then
        exception dato_obligatorio 'Debe indicar el teléfono del tercero';
    if ((NEW.pais_id IS NULL) or (NEW.pais_id = '')) then
        exception dato_obligatorio 'Debe indicar El pais del tercero';
    if ((NEW.ciud_cod IS NULL) or (NEW.ciud_cod = '')) then
        exception dato_obligatorio 'Debe indicar la ciudad del tercero';
    if ((NEW.terc_email IS NULL) or (NEW.terc_email = '')) then
        exception dato_obligatorio 'Debe indicar el correo electronico del tercero';
    END
end
^

SET TERM ; ^

/* 20140506 */
grant select, delete, insert, update on articulo_documentos to public;
grant execute on procedure informe_diario_ventas  to public;
grant execute on procedure informe_diario_ventas_fp  to public;
grant execute on procedure informe_diario_ventas_term  to public;
grant select, delete, insert, update on terminales_nombres to public;

/* 20140507 */
/* 1007v8 seguia usando los conceptos del 1007v7 */
SET TERM ^ ;

CREATE OR ALTER procedure MM_10078 (
    INICIO char(8),
    FINAL char(8))
AS
declare variable CONCEPTO INTEGER;
declare variable TIPODOC INTEGER;
declare variable NIT VARCHAR(20) CHARACTER SET NONE;
declare variable DV CHAR(1) CHARACTER SET NONE;
declare variable APELLIDO1 VARCHAR(60) CHARACTER SET NONE;
declare variable APELLIDO2 VARCHAR(60) CHARACTER SET NONE;
declare variable NOMBRE1 VARCHAR(60) CHARACTER SET NONE;
declare variable NOMBRE2 VARCHAR(60) CHARACTER SET NONE;
declare variable RAZONSOCIAL VARCHAR(450) CHARACTER SET NONE;
declare variable PAIS VARCHAR(3) CHARACTER SET NONE;
declare variable INGRESO NUMERIC(18,0);
declare variable DEVOLUCION NUMERIC(18,0);
declare variable ITEM INTEGER;
declare variable MINIMO NUMERIC(18,2);
declare variable MENORCUANTIAI NUMERIC(18,2);
declare variable MENORCUANTIAD NUMERIC(18,2);
declare variable TOTALTERC NUMERIC(18,2);
declare variable PAISMENOR CHAR(3) CHARACTER SET NONE;
declare variable TIPOID CHAR(1);
begin
EXECUTE PROCEDURE lee_configuracion('CONTABILIDAD', 'GENERAL', 'NIT COMPAÑIA') returning_values (:NIT);
SELECT PAIS_ID FROM TERCEROS WHERE TERC_NIT = :NIT INTO :paismenor;
ITEM = 0;
MENORCUANTIAI = 0;
MENORCUANTIAD = 0;
/* INGRESOS OPERACIONALES */
select COME_RESPUESTA, COME_MINIMO FROM configura_mediosmag WHERE COME_ITEM = 100781 INTO :CONCEPTO, :MINIMO;
FOR SELECT MAX(D.TERC_NIT), SUM(CODE_CREDITO)
    FROM COMPROBANTE_DETALLE D, COMPROBANTE_ENCABEZADO E, mediosmag_cuentas M
    WHERE M.mmcu_item = 100781 AND SUBSTR(CUEN_COD,1,STRLEN(M.mmcu_cuenta)) = M.mmcu_cuenta AND
    E.ENCO_CONSEC = D.ENCO_CONSEC AND ENCO_FECHA >= :INICIO AND ENCO_FECHA <= :FINAL AND
    (CODE_CREDITO <> 0)
    GROUP BY D.TERC_NIT
    INTO :NIT, :ingreso
    DO
    BEGIN
    SELECT SUM(CODE_CREDITO-CODE_DEBITO) FROM comprobante_detalle D WHERE TERC_NIT = :NIT AND
        SUBSTR(CUEN_COD,1,1) = '4' AND EXISTS (SELECT ENCO_CONSEC FROM comprobante_encabezado WHERE
        ENCO_FECHA >= :INICIO AND ENCO_FECHA <= :FINAL AND ENCO_CONSEC = D.enco_consec)
        INTO TOTALTERC;
    if (INGRESO IS NULL) then
        INGRESO = 0;
    SELECT SUM(CODE_DEBITO)
    FROM COMPROBANTE_DETALLE D, COMPROBANTE_ENCABEZADO E, mediosmag_cuentas M
    WHERE M.mmcu_item = 100781 AND SUBSTR(CUEN_COD,1,STRLEN(M.mmcu_ctartf)) = M.mmcu_ctartf AND
    E.ENCO_CONSEC = D.ENCO_CONSEC AND ENCO_FECHA >= :INICIO AND ENCO_FECHA <= :FINAL AND
    (CODE_DEBITO <> 0) AND D.TERC_NIT = :NIT into :devolucion;
    if (DEVOLUCION IS NULL) then
        DEVOLUCION = 0;
    if ((TOTALTERC >= MINIMO) AND ((INGRESO > 0) or (DEVOLUCION > 0))) then
        BEGIN
        SELECT TERC_NOM, TERC_NOMBRE1, TERC_NOMBRE2, TERC_APELLIDO1, TERC_APELLIDO2, TERC_DV, TIID_CODIGO, PAIS_ID, IT.tiid_cod
            FROM TERCEROS T left outer join TIPO_ID IT on (T.TERC_TIPOID = IT.TIID_COD) WHERE TERC_NIT = :NIT
            INTO :RAZONSOCIAL, :NOMBRE1, :NOMBRE2, :APELLIDO1, :APELLIDO2, :DV, :TIPODOC, :PAIS, :TIPOID;
        if (:TIPOID <> 'J') then
            RAZONSOCIAL = '';
        ITEM = ITEM + 1;
        insert into medios_magneticos_datos (memg_formato, memg_ano, memg_item, memg_concepto, memg_tipodoc, memg_nit, memg_dv,memg_apellido1, memg_apellido2, 
            memg_nombre1, memg_nombre2, memg_razonsocial, memg_pago, memg_retivacomun, memg_pais)
            values (10078, substr(:inicio,1,4), :item,  :concepto, :tipodoc, :nit, :dv, :apellido1, :apellido2,
            :nombre1, :nombre2, :razonsocial, :ingreso, :devolucion, :pais);
        END
    ELSE
        BEGIN
        MENORCUANTIAI = MENORCUANTIAI + INGRESO;
        MENORCUANTIAD = MENORCUANTIAD + DEVOLUCION;
        END
    END
if ((MENORCUANTIAI > 0) or (MENORCUANTIAD > 0)) then
    BEGIN
    ITEM = ITEM + 1;
    insert into medios_magneticos_datos (memg_formato, memg_ano, memg_item, memg_concepto, memg_tipodoc, memg_nit, memg_dv,memg_apellido1, memg_apellido2,
        memg_nombre1, memg_nombre2, memg_razonsocial, memg_pago, memg_retivacomun, memg_pais)
        values (10078, substr(:inicio,1,4), :item,  :concepto, 43, '222222222', '', '', '',
        '', '', 'CUANTIAS MENORES', :menorcuantiai, :menorcuantiad, :paismenor);
    END
/* INGRESOS NO-OPERACIONALES */
MENORCUANTIAI = 0;
MENORCUANTIAD = 0;
select COME_RESPUESTA, COME_MINIMO FROM configura_mediosmag WHERE COME_ITEM = 100782 INTO :CONCEPTO, :MINIMO;
FOR SELECT MAX(D.TERC_NIT), SUM(CODE_CREDITO)
    FROM COMPROBANTE_DETALLE D, COMPROBANTE_ENCABEZADO E, mediosmag_cuentas M
    WHERE M.mmcu_item = 100782 AND SUBSTR(CUEN_COD,1,STRLEN(M.mmcu_cuenta)) = M.mmcu_cuenta AND
    E.ENCO_CONSEC = D.ENCO_CONSEC AND ENCO_FECHA >= :INICIO AND ENCO_FECHA <= :FINAL AND
    (CODE_CREDITO <> 0)
    GROUP BY D.TERC_NIT
    INTO :NIT, :ingreso
    DO
    BEGIN
    SELECT SUM(CODE_CREDITO-CODE_DEBITO) FROM comprobante_detalle D WHERE TERC_NIT = :NIT AND
        SUBSTR(CUEN_COD,1,1) = '4' AND EXISTS (SELECT ENCO_CONSEC FROM comprobante_encabezado WHERE
        ENCO_FECHA >= :INICIO AND ENCO_FECHA <= :FINAL AND ENCO_CONSEC = D.enco_consec)
        INTO TOTALTERC;
    if (INGRESO IS NULL) then
        INGRESO = 0;
    SELECT SUM(CODE_DEBITO)
    FROM COMPROBANTE_DETALLE D, COMPROBANTE_ENCABEZADO E, mediosmag_cuentas M
    WHERE M.mmcu_item = 100782 AND SUBSTR(CUEN_COD,1,STRLEN(M.mmcu_ctartf)) = M.mmcu_ctartf AND
    E.ENCO_CONSEC = D.ENCO_CONSEC AND ENCO_FECHA >= :INICIO AND ENCO_FECHA <= :FINAL AND
    (CODE_DEBITO <> 0) AND D.TERC_NIT = :NIT into :devolucion;
    if (DEVOLUCION IS NULL) then
        DEVOLUCION = 0;
    if ((TOTALTERC >= MINIMO) AND ((INGRESO > 0) or (DEVOLUCION > 0))) then
        BEGIN
        SELECT TERC_NOM, TERC_NOMBRE1, TERC_NOMBRE2, TERC_APELLIDO1, TERC_APELLIDO2, TERC_DV, TIID_CODIGO, PAIS_ID, IT.tiid_cod
            FROM TERCEROS T left outer join TIPO_ID IT on (T.TERC_TIPOID = IT.TIID_COD) WHERE TERC_NIT = :NIT
            INTO :RAZONSOCIAL, :NOMBRE1, :NOMBRE2, :APELLIDO1, :APELLIDO2, :DV, :TIPODOC, :PAIS, :TIPOID;
        if (:TIPOID <> 'J') then
            RAZONSOCIAL = '';
        ITEM = ITEM + 1;
        insert into medios_magneticos_datos (memg_formato, memg_ano, memg_item, memg_concepto, memg_tipodoc, memg_nit, memg_dv,memg_apellido1, memg_apellido2, 
            memg_nombre1, memg_nombre2, memg_razonsocial, memg_pago, memg_retivacomun, memg_pais)
            values (10078, substr(:inicio,1,4), :item,  :concepto, :tipodoc, :nit, :dv, :apellido1, :apellido2,
            :nombre1, :nombre2, :razonsocial, :ingreso, :devolucion, :pais);
        END
    ELSE
        BEGIN
        MENORCUANTIAI = MENORCUANTIAI + INGRESO;
        MENORCUANTIAD = MENORCUANTIAD + DEVOLUCION;
        END
    END
if ((MENORCUANTIAI > 0) or (MENORCUANTIAD > 0)) then
    BEGIN
    ITEM = ITEM + 1;
    insert into medios_magneticos_datos (memg_formato, memg_ano, memg_item, memg_concepto, memg_tipodoc, memg_nit, memg_dv,memg_apellido1, memg_apellido2,
        memg_nombre1, memg_nombre2, memg_razonsocial, memg_pago, memg_retivacomun, memg_pais)
        values (10078, substr(:inicio,1,4), :item,  :concepto, 43, '222222222', '', '', '',
        '', '', 'CUANTIAS MENORES', :menorcuantiai, :menorcuantiad, :paismenor);
    END
/* INGRESOS FINANCIEROS*/
MENORCUANTIAI = 0;
MENORCUANTIAD = 0;
select COME_RESPUESTA, COME_MINIMO FROM configura_mediosmag WHERE COME_ITEM = 100783 INTO :CONCEPTO, :MINIMO;
FOR SELECT MAX(D.TERC_NIT), SUM(CODE_CREDITO)
    FROM COMPROBANTE_DETALLE D, COMPROBANTE_ENCABEZADO E, mediosmag_cuentas M
    WHERE M.mmcu_item = 100783 AND SUBSTR(CUEN_COD,1,STRLEN(M.mmcu_cuenta)) = M.mmcu_cuenta AND
    E.ENCO_CONSEC = D.ENCO_CONSEC AND ENCO_FECHA >= :INICIO AND ENCO_FECHA <= :FINAL AND
    (CODE_CREDITO <> 0)
    GROUP BY D.TERC_NIT
    INTO :NIT, :ingreso
    DO
    BEGIN
    SELECT SUM(CODE_CREDITO-CODE_DEBITO) FROM comprobante_detalle D WHERE TERC_NIT = :NIT AND
        SUBSTR(CUEN_COD,1,1) = '4' AND EXISTS (SELECT ENCO_CONSEC FROM comprobante_encabezado WHERE
        ENCO_FECHA >= :INICIO AND ENCO_FECHA <= :FINAL AND ENCO_CONSEC = D.enco_consec)
        INTO TOTALTERC;
    if (INGRESO IS NULL) then
        INGRESO = 0;
    SELECT SUM(CODE_DEBITO)
    FROM COMPROBANTE_DETALLE D, COMPROBANTE_ENCABEZADO E, mediosmag_cuentas M
    WHERE M.mmcu_item = 100783 AND SUBSTR(CUEN_COD,1,STRLEN(M.mmcu_ctartf)) = M.mmcu_ctartf AND
    E.ENCO_CONSEC = D.ENCO_CONSEC AND ENCO_FECHA >= :INICIO AND ENCO_FECHA <= :FINAL AND
    (CODE_DEBITO <> 0) AND D.TERC_NIT = :NIT into :devolucion;
    if (DEVOLUCION IS NULL) then
        DEVOLUCION = 0;
    if ((TOTALTERC >= MINIMO) AND ((INGRESO > 0) or (DEVOLUCION > 0))) then
        BEGIN
        SELECT TERC_NOM, TERC_NOMBRE1, TERC_NOMBRE2, TERC_APELLIDO1, TERC_APELLIDO2, TERC_DV, TIID_CODIGO, PAIS_ID, IT.tiid_cod
            FROM TERCEROS T left outer join TIPO_ID IT on (T.TERC_TIPOID = IT.TIID_COD) WHERE TERC_NIT = :NIT
            INTO :RAZONSOCIAL, :NOMBRE1, :NOMBRE2, :APELLIDO1, :APELLIDO2, :DV, :TIPODOC, :PAIS, :TIPOID;
        if (:TIPOID <> 'J') then
            RAZONSOCIAL = '';
        ITEM = ITEM + 1;
        insert into medios_magneticos_datos (memg_formato, memg_ano, memg_item, memg_concepto, memg_tipodoc, memg_nit, memg_dv,memg_apellido1, memg_apellido2, 
            memg_nombre1, memg_nombre2, memg_razonsocial, memg_pago, memg_retivacomun, memg_pais)
            values (10078, substr(:inicio,1,4), :item,  :concepto, :tipodoc, :nit, :dv, :apellido1, :apellido2,
            :nombre1, :nombre2, :razonsocial, :ingreso, :devolucion, :pais);
        END
    ELSE
        BEGIN
        MENORCUANTIAI = MENORCUANTIAI + INGRESO;
        MENORCUANTIAD = MENORCUANTIAD + DEVOLUCION;
        END
    END
if ((MENORCUANTIAI > 0) or (MENORCUANTIAD > 0)) then
    BEGIN
    ITEM = ITEM + 1;
    insert into medios_magneticos_datos (memg_formato, memg_ano, memg_item, memg_concepto, memg_tipodoc, memg_nit, memg_dv,memg_apellido1, memg_apellido2,
        memg_nombre1, memg_nombre2, memg_razonsocial, memg_pago, memg_retivacomun, memg_pais)
        values (10078, substr(:inicio,1,4), :item,  :concepto, 43, '222222222', '', '', '',
        '', '', 'CUANTIAS MENORES', :menorcuantiai, :menorcuantiad, :paismenor);
    END
end
^

SET TERM ; ^

/* 20140508B */
/* no descontar rtcree despues de la fecha de autoretencion */
SET TERM ^ ;

CREATE OR ALTER procedure REP_MOVIMIENTO_CLIENTE (
    DESDE varchar(20),
    HASTA varchar(20),
    GRPINI varchar(5),
    GRPFIN varchar(5),
    FECINI date,
    FECFIN date,
    DETALLE char(1),
    ORDEN char(1),
    AGRUPA char(1),
    CONTADO char(1),
    SUBEMPRESA integer,
    MONEDA integer)
returns (
    NIT varchar(20),
    NOMBRE varchar(60),
    TELEFONO varchar(40),
    CIUDAD varchar(40),
    CODZONA varchar(2),
    NOMZONA varchar(60),
    CODCOBR integer,
    NOMCOBR varchar(60),
    SUCURSAL varchar(10),
    NOMSUC varchar(60),
    DV char(1),
    CODCIUD char(5),
    NOMCIUD varchar(60),
    CALIFICA integer,
    INICIAL numeric(18,2),
    TIPODOC varchar(8),
    TIPOREF integer,
    IDDOC integer,
    PREFIJO varchar(4),
    NUMERO varchar(8),
    FECHA date,
    VENCE date,
    CONCEPTO varchar(60),
    DEBITO numeric(18,2),
    CREDITO numeric(18,2),
    TDEBITO numeric(18,2),
    TCREDITO numeric(18,2),
    SALDO numeric(18,2),
    RTFTE numeric(18,2),
    RTIVA numeric(18,2),
    RTICA numeric(18,2),
    RCREE numeric(18,2),
    CUPO numeric(18,2))
AS
declare variable NITINI VARCHAR(20);
declare variable NITFIN VARCHAR(20);
declare variable NOMINI VARCHAR(20);
declare variable NOMFIN VARCHAR(20);
declare variable OK CHAR(1);
declare variable DB CHAR(1);
declare variable AB CHAR(1);
declare variable RETES CHAR(2);
declare variable ABONOS NUMERIC(18,2);
declare variable TRM NUMERIC(18,2);
declare variable FAUTORCREE DATE;
declare variable AUTORCREE VARCHAR(10);
BEGIN
if (ORDEN = 'C') then
    BEGIN
    NITINI = DESDE;
    NITFIN = HASTA;
    NOMINI = '';
    NOMFIN = 'zz';
    END
ELSE
    BEGIN
    NOMINI = DESDE;
    NOMFIN = HASTA;
    NITINI = '';
    NITFIN = 'zz';
    END
  EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'DESCONTAR RETENCIONES POR CAUSACION') returning_values (:RETES);
  EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'FECHA AUTORETENEDOR DE RETENCION CREE') returning_values (AUTORCREE);
  if (AUTORCREE <> '') then
    FAUTORCREE = CAST(AUTORCREE AS DATE);
  else
    FAUTORCREE = '9999/12/31';
  /* Ubique el NIT */
  FOR select T.TERC_NIT, TERC_NOM, TERC_DV, CLSU_TEL, CLSU_CIUDAD, S.COBR_COD, S.ZONA_COD, T.CIUD_COD, CLIE_CUPO, CLCU_COD, CLSU_NOMBRE, CLIE_CALIFICA
    from terceros T, CLIENTES C, CLIENTE_SUCURSALES S
    where C.TERC_NIT  = T.TERC_NIT AND TERC_CLIE = 'S' AND S.TERC_NIT = C.TERC_NIT AND T.TERC_NIT >= :NITINI AND T.TERC_NIT <= :NITFIN AND
        TERC_NOM >= :NOMINI AND TERC_NOM <= :NOMFIN AND ((:CONTADO = 'S') or (NOT EXISTS (SELECT AUTO_NUMERO FROM AUTORIZACIONES WHERE AUTO_NITCONTADO = T.terc_nit))
        or (NOT EXISTS (SELECT PTVT_ID FROM punto_venta WHERE TERC_NIT = T.terc_nit)))
    INTO :NIT, :NOMBRE, :DV, :TELEFONO, :CIUDAD, :CODCOBR, :CODZONA, :CODCIUD, :CUPO, :SUCURSAL, :NOMSUC, :CALIFICA
    DO  
    BEGIN
    SELECT COBR_NOM FROM COBRADORES WHERE COBR_COD = :CODCOBR INTO :NOMCOBR;
    SELECT ZONA_NOM FROM ZONAS WHERE ZONA_COD = :CODZONA INTO :NOMZONA;
    SELECT CIUD_NOM FROM CIUDADES WHERE CIUD_COD = :CODCIUD INTO :NOMCIUD;
    OK = 'N';
    if (AGRUPA = 'Z') then
        BEGIN
        if (GRPINI = '') then
            BEGIN
            if ((CODZONA IS NULL) or (CODZONA >= :GRPINI AND CODZONA <= :GRPFIN)) then
                OK = 'S';
            END
        ELSE
            if (CODZONA >= :GRPINI AND CODZONA <= :GRPFIN) then
                OK = 'S';
        END
    if (AGRUPA = 'I') then
        BEGIN
        if (GRPINI = '') then
            BEGIN
            if ((CODCIUD IS NULL) or (CODCIUD >= :GRPINI AND CODCIUD <= :GRPFIN)) then
                OK = 'S';
            END
        ELSE
            if (CODCIUD >= :GRPINI AND CODCIUD <= :GRPFIN) then
                OK = 'S';
        END
    if (AGRUPA = 'N') then
        OK = 'S';
        
    if (OK = 'S') then
        BEGIN
        INICIAL = 0;
        FECINI = FECINI - 1;
        FOR SELECT MVCL_TIPOREF, MVCL_IDREF FROM MOVIMIENTO_CLIENTES
          WHERE TERC_NIT = :NIT AND MVCL_SUCURSAL = :SUCURSAL AND MVCL_FECHA <= :FECINI AND
            MVCL_ABONO = 'N' AND ((:SUBEMPRESA = 0) or (SUCU_ID = :SUBEMPRESA)) AND ((:MONEDA = 0) or (MVCL_TRM <> 1))
          INTO :TIPODOC, :IDDOC
          DO
            BEGIN
            EXECUTE PROCEDURE saldo_doc_cartera(TIPODOC, IDDOC, FECINI, MONEDA) returning_values (SALDO);
            INICIAL = INICIAL + SALDO;
            END
        SALDO = INICIAL;
        FECINI = FECINI + 1;
        if (DETALLE = 'S') then
          BEGIN
          FOR select mvcl_tiporef, tido_nomcorto, mvcl_idref, mvcl_prefref, mvcl_numref, mvcl_fecha, mvcl_conc, mvcl_monto, mvcl_debito, mvcl_rtefte, mvcl_rteiva, mvcl_rteica, mvcl_rcree, mvcl_abono, mvcl_vence, MVCL_TRM
            from movimiento_clientes m, tipo_documento t
            where m.mvcl_tiporef = t.tido_cod and terc_nit = :NIT and MVCL_SUCURSAL = :SUCURSAL AND
                mvcl_fecha >= :FECINI and mvcl_fecha <= :FECFIN and mvcl_tiporef <> 45 AND
                ((:SUBEMPRESA = 0) or (SUCU_ID = :SUBEMPRESA)) AND ((:MONEDA = 0) or (MVCL_TRM <> 1))
            order by mvcl_fecha, mvcl_id
            into :TIPOREF, :TIPODOC, :IDDOC, :PREFIJO, :NUMERO, :FECHA, :CONCEPTO, :DEBITO, :DB, :RTFTE, :RTIVA, :RTICA, :RCREE, :AB, :VENCE, :TRM
            DO
            BEGIN
            if (RTFTE IS NULL) then
                RTFTE = 0;
            if (RTIVA IS NULL) then
                RTIVA = 0;
            if (RTICA IS NULL) then
                RTICA = 0;
            if (RCREE IS NULL) then
                RCREE = 0;
            if (fautorcree <= :FECHA) then
                RCREE = 0;
            if (DB = 'N') then
                BEGIN
                CREDITO = DEBITO;
                DEBITO = 0;
                RTFTE = rtfte * -1;
                RTIVA = rtiva * -1;
                RTICA = rtica * -1;
                RCREE = rcree * -1;
                END
            ELSE
                CREDITO = 0;
            IF (RETES = 'SI') then
                if (AB = 'N') then
                    BEGIN
                    SALDO = SALDO + DEBITO - CREDITO - RTFTE - RTIVA - RTICA - RCREE;
                    if (debito <> 0) then
                        TDEBITO = DEBITO - RTFTE - RTIVA - RTICA - RCREE;
                    else
                        TCREDITO = CREDITO - RTFTE - RTIVA - RTICA - RCREE;
                    END
                else
                    BEGIN
                    SALDO = SALDO + DEBITO - CREDITO;
                    TDEBITO = DEBITO;
                    TCREDITO = CREDITO;
                    END
            ELSE
                if (AB = 'N') then
                    BEGIN
                    SALDO = SALDO + DEBITO - CREDITO;
                    TDEBITO = DEBITO;
                    TCREDITO = CREDITO;
                    END
                else
                    BEGIN
                    SALDO = SALDO + DEBITO - CREDITO + RTFTE + RTIVA + RTICA + RCREE;
                    TDEBITO = DEBITO;
                    TCREDITO = CREDITO - RTFTE - RTIVA - RTICA - RCREE;
                    END
            if ((MONEDA <> 0) AND (TRM <> 0)) then
                BEGIN
                SALDO = saldo / TRM;
                DEBITO = DEBITO / TRM;
                CREDITO = CREDITO / TRM;
                RTFTE = RTFTE / TRM;
                RTIVA = RTIVA / TRM;
                RTICA = RTICA / TRM;
                RCREE = RCREE / TRM;
                END
            SUSPEND;
            END
          END
        ELSE
            BEGIN
            IF (RETES = 'SI') then
                BEGIN
                if (MONEDA = 0) then
                    BEGIN
                    SELECT SUM(MVCL_MONTO-MVCL_RTEFTE-MVCL_RTEIVA-MVCL_RTEICA-MVCL_RCREE) FROM movimiento_clientes
                        WHERE TERC_NIT = :NIT AND MVCL_FECHA >= :FECINI AND MVCL_FECHA <= :FECFIN AND MVCL_DEBITO = 'S'
                            AND MVCL_SUCURSAL = :SUCURSAL AND ((:SUBEMPRESA = 0) or (SUCU_ID = :SUBEMPRESA)) INTO :DEBITO;
                    SELECT SUM(MVCL_MONTO-MVCL_RTEFTE-MVCL_RTEIVA-MVCL_RTEICA-MVCL_RCREE) FROM movimiento_clientes
                        WHERE TERC_NIT = :NIT AND MVCL_FECHA >= :FECINI AND MVCL_FECHA <= :FECFIN AND MVCL_DEBITO = 'N' and MVCL_ABONO = 'N' AND mvcl_tiporef <> 45
                            AND MVCL_SUCURSAL = :SUCURSAL AND ((:SUBEMPRESA = 0) or (SUCU_ID = :SUBEMPRESA)) INTO :CREDITO;
                    SELECT SUM(MVCL_MONTO) FROM movimiento_clientes WHERE TERC_NIT = :NIT AND MVCL_FECHA >= :FECINI
                        AND MVCL_FECHA <= :FECFIN AND MVCL_DEBITO = 'N'  and MVCL_ABONO = 'S' AND MVCL_SUCURSAL = :SUCURSAL
                            AND ((:SUBEMPRESA = 0) or (SUCU_ID = :SUBEMPRESA)) INTO :ABONOS;
                    END
                ELSE
                    BEGIN
                    SELECT SUM((MVCL_MONTO-MVCL_RTEFTE-MVCL_RTEIVA-MVCL_RTEICA-MVCL_RCREE)/MVCL_TRM) FROM movimiento_clientes
                        WHERE TERC_NIT = :NIT AND MVCL_FECHA >= :FECINI AND MVCL_FECHA <= :FECFIN AND MVCL_DEBITO = 'S'
                            AND MVCL_SUCURSAL = :SUCURSAL AND ((:SUBEMPRESA = 0) or (SUCU_ID = :SUBEMPRESA)) and
                            MVCL_TRM <> 1  INTO :DEBITO;
                    SELECT SUM((MVCL_MONTO-MVCL_RTEFTE-MVCL_RTEIVA-MVCL_RTEICA-MVCL_RCREE)/MVCL_TRM) FROM movimiento_clientes
                        WHERE TERC_NIT = :NIT AND MVCL_FECHA >= :FECINI AND MVCL_FECHA <= :FECFIN AND MVCL_DEBITO = 'N' and MVCL_ABONO = 'N' AND mvcl_tiporef <> 45
                            AND MVCL_SUCURSAL = :SUCURSAL AND ((:SUBEMPRESA = 0) or (SUCU_ID = :SUBEMPRESA)) and
                            MVCL_TRM <> 1  INTO :CREDITO;
                    SELECT SUM(MVCL_MONTO/MVCL_TRM) FROM movimiento_clientes WHERE TERC_NIT = :NIT AND MVCL_FECHA >= :FECINI
                        AND MVCL_FECHA <= :FECFIN AND MVCL_DEBITO = 'N'  and MVCL_ABONO = 'S' AND MVCL_SUCURSAL = :SUCURSAL
                            AND ((:SUBEMPRESA = 0) or (SUCU_ID = :SUBEMPRESA)) and MVCL_TRM <> 1  INTO :ABONOS;
                    END
                END
            ELSE
                BEGIN
                if (MONEDA = 0) then
                    BEGIN
                    SELECT SUM(MVCL_MONTO) FROM movimiento_clientes WHERE TERC_NIT = :NIT AND MVCL_FECHA >= :FECINI AND MVCL_FECHA <= :FECFIN AND MVCL_DEBITO = 'S'
                        AND MVCL_SUCURSAL = :SUCURSAL AND ((:SUBEMPRESA = 0) or (SUCU_ID = :SUBEMPRESA)) INTO :DEBITO;
                    SELECT SUM(MVCL_MONTO) FROM movimiento_clientes WHERE TERC_NIT = :NIT AND MVCL_FECHA >= :FECINI AND MVCL_FECHA <= :FECFIN AND MVCL_DEBITO = 'N' and MVCL_ABONO = 'N' and mvcl_tiporef <> 45
                        AND MVCL_SUCURSAL = :SUCURSAL AND ((:SUBEMPRESA = 0) or (SUCU_ID = :SUBEMPRESA)) INTO :CREDITO;
                    SELECT SUM(MVCL_MONTO+MVCL_RTEFTE+MVCL_RTEIVA+MVCL_RTEICA+MVCL_RCREE) FROM movimiento_clientes WHERE TERC_NIT = :NIT AND MVCL_FECHA >= :FECINI AND MVCL_FECHA <= :FECFIN AND MVCL_DEBITO = 'N'  and MVCL_ABONO = 'S'
                        AND MVCL_SUCURSAL = :SUCURSAL AND ((:SUBEMPRESA = 0) or (SUCU_ID = :SUBEMPRESA)) INTO :ABONOS;
                    END
                ELSE
                    BEGIN
                    SELECT SUM(MVCL_MONTO/MVCL_TRM) FROM movimiento_clientes WHERE TERC_NIT = :NIT AND MVCL_FECHA >= :FECINI AND MVCL_FECHA <= :FECFIN AND MVCL_DEBITO = 'S'
                        AND MVCL_SUCURSAL = :SUCURSAL AND ((:SUBEMPRESA = 0) or (SUCU_ID = :SUBEMPRESA)) INTO :DEBITO;
                    SELECT SUM(MVCL_MONTO/MVCL_TRM) FROM movimiento_clientes WHERE TERC_NIT = :NIT AND MVCL_FECHA >= :FECINI AND MVCL_FECHA <= :FECFIN AND MVCL_DEBITO = 'N' and MVCL_ABONO = 'N' and mvcl_tiporef <> 45
                        AND MVCL_SUCURSAL = :SUCURSAL AND ((:SUBEMPRESA = 0) or (SUCU_ID = :SUBEMPRESA)) INTO :CREDITO;
                    SELECT SUM((MVCL_MONTO+MVCL_RTEFTE+MVCL_RTEIVA+MVCL_RTEICA+MVCL_RCREE)/MVCL_TRM) FROM movimiento_clientes
                        WHERE TERC_NIT = :NIT AND MVCL_FECHA >= :FECINI AND MVCL_FECHA <= :FECFIN AND MVCL_DEBITO = 'N'  and MVCL_ABONO = 'S'
                        AND MVCL_SUCURSAL = :SUCURSAL AND ((:SUBEMPRESA = 0) or (SUCU_ID = :SUBEMPRESA)) INTO :ABONOS;
                    END
                END
            if (DEBITO IS NULL) then
                DEBITO = 0;
            if (CREDITO IS NULL) then
                CREDITO = 0;
            if (ABONOS IS NULL) then
                ABONOS = 0;
            CREDITO = CREDITO + ABONOS;
            TDEBITO = DEBITO;
            TCREDITO = CREDITO;
            SALDO = INICIAL + DEBITO - CREDITO;
            SUSPEND;
            END
        END
    if (AGRUPA = 'C') then
        BEGIN
        FOR SELECT DISTINCT COBR_COD FROM MOVIMIENTO_CLIENTES
            WHERE TERC_NIT = :NIT AND MVCL_SUCURSAL = :SUCURSAL AND MVCL_FECHA >= :FECINI AND MVCL_FECHA <= :fecfin AND
            MVCL_ABONO = 'N' AND ((:SUBEMPRESA = 0) or (SUCU_ID = :SUBEMPRESA))
            INTO :codcobr
            DO
            BEGIN
            OK = 'N';
            if (GRPINI = '') then
                BEGIN
                if ((CODCOBR IS NULL) or (CODCOBR >= :GRPINI AND CODCOBR <= :GRPFIN)) then
                    OK = 'S';
                END
            ELSE
                if (CODCOBR >= :GRPINI AND CODCOBR <= :GRPFIN) then
                    OK = 'S';
            if (OK = 'S') then
                BEGIN
                SELECT COBR_NOM FROM COBRADORES WHERE COBR_COD = :CODCOBR INTO :NOMCOBR;
                INICIAL = 0;
                FECINI = FECINI - 1;
                FOR SELECT MVCL_TIPOREF, MVCL_IDREF FROM MOVIMIENTO_CLIENTES
                  WHERE TERC_NIT = :NIT AND MVCL_SUCURSAL = :SUCURSAL AND MVCL_FECHA <= :FECINI AND ((:MONEDA = 0) or (MVCL_TRM <> 1)) AND
                  COBR_COD = :CODCOBR AND MVCL_ABONO = 'N' AND ((:SUBEMPRESA = 0) or (SUCU_ID = :SUBEMPRESA))
                  INTO :TIPODOC, :IDDOC
                  DO
                    BEGIN
                    EXECUTE PROCEDURE saldo_doc_cartera(TIPODOC, IDDOC, FECINI, MONEDA) returning_values (SALDO);
                    INICIAL = INICIAL + SALDO;
                    END
                SALDO = INICIAL;
                FECINI = FECINI + 1;
                if (DETALLE = 'S') then
                  BEGIN
                  FOR select mvcl_tiporef, tido_nomcorto, mvcl_idref, mvcl_prefref, mvcl_numref, mvcl_fecha, mvcl_conc, mvcl_monto, mvcl_debito, mvcl_rtefte, mvcl_rteiva, mvcl_rteica, mvcl_rcree, mvcl_abono, mvcl_vence, mvcl_trm
                    from movimiento_clientes m, tipo_documento t
                    where m.mvcl_tiporef = t.tido_cod and terc_nit = :NIT and MVCL_SUCURSAL = :SUCURSAL AND
                    mvcl_fecha >= :FECINI and mvcl_fecha <= :FECFIN and mvcl_tiporef <> 45 AND ((:MONEDA = 0) or (MVCL_TRM <> 1)) AND
                    COBR_COD = :CODCOBR AND ((:SUBEMPRESA = 0) or (SUCU_ID = :SUBEMPRESA))
                    order by mvcl_fecha, mvcl_id
                    into :TIPOREF, :TIPODOC, :IDDOC, :PREFIJO, :NUMERO, :FECHA, :CONCEPTO, :DEBITO, :DB, :RTFTE, :RTIVA, :RTICA, :RCREE, :AB, :VENCE, :TRM
                    DO
                    BEGIN
                    if (RTFTE IS NULL) then
                        RTFTE = 0;
                    if (RTIVA IS NULL) then
                        RTIVA = 0;
                    if (RTICA IS NULL) then
                        RTICA = 0;
                    if (RCREE IS NULL) then
                        RCREE = 0;
                    if (DB = 'N') then
                        BEGIN
                        CREDITO = DEBITO;
                        DEBITO = 0;
                        RTFTE = rtfte * -1;
                        RTIVA = rtiva * -1;
                        RTICA = rtica * -1;
                        RCREE = rcree * -1;
                        END
                    ELSE
                        CREDITO = 0;
                    IF (RETES = 'SI') then
                        if (AB = 'N') then
                            BEGIN
                            SALDO = SALDO + DEBITO - CREDITO - RTFTE - RTIVA - RTICA - RCREE;
                            if (debito <> 0) then
                                TDEBITO = DEBITO - RTFTE - RTIVA - RTICA - RCREE;
                            else
                                TCREDITO = CREDITO - RTFTE - RTIVA - RTICA - RCREE;
                            END
                        else
                            BEGIN
                            SALDO = SALDO + DEBITO - CREDITO;
                            TDEBITO = DEBITO;
                            TCREDITO = CREDITO;
                            END
                    ELSE
                        if (AB = 'N') then
                            BEGIN
                            SALDO = SALDO + DEBITO - CREDITO;
                            TDEBITO = DEBITO;
                            TCREDITO = CREDITO;
                            END
                        else
                            BEGIN
                            SALDO = SALDO + DEBITO - CREDITO + RTFTE + RTIVA + RTICA + RCREE;
                            TDEBITO = DEBITO;
                            TCREDITO = CREDITO + RTFTE + RTIVA + RTICA + RCREE;
                            END
                    if ((MONEDA <> 0) AND (TRM <> 0)) then
                        BEGIN
                        SALDO = saldo / TRM;
                        DEBITO = DEBITO / TRM;
                        CREDITO = CREDITO / TRM;
                        RTFTE = RTFTE / TRM;
                        RTIVA = RTIVA / TRM;
                        RTICA = RTICA / TRM;
                        RCREE = RCREE / TRM;
                        END
                    SUSPEND;
                    END
                  END
                ELSE
                    BEGIN
                    IF (RETES = 'SI') then
                        BEGIN
                        if (MONEDA = 0) then
                            BEGIN
                            SELECT SUM(MVCL_MONTO-MVCL_RTEFTE-MVCL_RTEIVA-MVCL_RTEICA-MVCL_RCREE)
                                FROM movimiento_clientes WHERE TERC_NIT = :NIT AND MVCL_FECHA >= :FECINI AND
                                COBR_COD = :CODCOBR AND MVCL_FECHA <= :FECFIN AND MVCL_DEBITO = 'S' AND
                                MVCL_SUCURSAL = :SUCURSAL AND ((:SUBEMPRESA = 0) or (SUCU_ID = :SUBEMPRESA)) INTO :DEBITO;
                            SELECT SUM(MVCL_MONTO-MVCL_RTEFTE-MVCL_RTEIVA-MVCL_RTEICA-MVCL_RCREE)
                                FROM movimiento_clientes WHERE TERC_NIT = :NIT AND MVCL_FECHA >= :FECINI AND
                                COBR_COD = :CODCOBR AND MVCL_FECHA <= :FECFIN AND MVCL_DEBITO = 'N' and
                                MVCL_ABONO = 'N' AND mvcl_tiporef <> 45 AND MVCL_SUCURSAL = :SUCURSAL AND
                                ((:SUBEMPRESA = 0) or (SUCU_ID = :SUBEMPRESA)) INTO :CREDITO;
                            SELECT SUM(MVCL_MONTO) FROM movimiento_clientes WHERE TERC_NIT = :NIT AND
                                COBR_COD = :CODCOBR AND MVCL_FECHA >= :FECINI AND MVCL_FECHA <= :FECFIN AND
                                MVCL_DEBITO = 'N'  and MVCL_ABONO = 'S' AND MVCL_SUCURSAL = :SUCURSAL AND
                                ((:SUBEMPRESA = 0) or (SUCU_ID = :SUBEMPRESA)) INTO :ABONOS;
                            END
                        ELSE
                            BEGIN
                            SELECT SUM((MVCL_MONTO-MVCL_RTEFTE-MVCL_RTEIVA-MVCL_RTEICA-MVCL_RCREE)/MVCL_TRM)
                                FROM movimiento_clientes WHERE TERC_NIT = :NIT AND MVCL_FECHA >= :FECINI AND
                                COBR_COD = :CODCOBR AND MVCL_FECHA <= :FECFIN AND MVCL_DEBITO = 'S' AND MVCL_TRM <> 1 AND
                                MVCL_SUCURSAL = :SUCURSAL AND ((:SUBEMPRESA = 0) or (SUCU_ID = :SUBEMPRESA)) INTO :DEBITO;
                            SELECT SUM((MVCL_MONTO-MVCL_RTEFTE-MVCL_RTEIVA-MVCL_RTEICA-MVCL_RCREE)/MVCL_TRM)
                                FROM movimiento_clientes WHERE TERC_NIT = :NIT AND MVCL_FECHA >= :FECINI AND
                                COBR_COD = :CODCOBR AND MVCL_FECHA <= :FECFIN AND MVCL_DEBITO = 'N' and MVCL_TRM <> 1 AND
                                MVCL_ABONO = 'N' AND mvcl_tiporef <> 45 AND MVCL_SUCURSAL = :SUCURSAL AND
                                ((:SUBEMPRESA = 0) or (SUCU_ID = :SUBEMPRESA)) INTO :CREDITO;
                            SELECT SUM(MVCL_MONTO/MVCL_TRM) FROM movimiento_clientes WHERE TERC_NIT = :NIT AND MVCL_TRM <> 1 AND
                                COBR_COD = :CODCOBR AND MVCL_FECHA >= :FECINI AND MVCL_FECHA <= :FECFIN AND
                                MVCL_DEBITO = 'N'  and MVCL_ABONO = 'S' AND MVCL_SUCURSAL = :SUCURSAL AND
                                ((:SUBEMPRESA = 0) or (SUCU_ID = :SUBEMPRESA)) INTO :ABONOS;
                            END
                        END
                    ELSE
                        BEGIN
                        if (MONEDA = 0) then
                            BEGIN
                            SELECT SUM(MVCL_MONTO) FROM movimiento_clientes WHERE TERC_NIT = :NIT AND
                                COBR_COD = :CODCOBR AND MVCL_FECHA >= :FECINI AND MVCL_FECHA <= :FECFIN AND
                                MVCL_DEBITO = 'S' AND MVCL_SUCURSAL = :SUCURSAL AND ((:SUBEMPRESA = 0) or (SUCU_ID = :SUBEMPRESA)) INTO :DEBITO;
                            SELECT SUM(MVCL_MONTO) FROM movimiento_clientes WHERE TERC_NIT = :NIT AND
                                COBR_COD = :CODCOBR AND MVCL_FECHA >= :FECINI AND MVCL_FECHA <= :FECFIN AND
                                MVCL_DEBITO = 'N' and MVCL_ABONO = 'N' and mvcl_tiporef <> 45 AND
                                MVCL_SUCURSAL = :SUCURSAL AND ((:SUBEMPRESA = 0) or (SUCU_ID = :SUBEMPRESA)) INTO :CREDITO;
                            SELECT SUM(MVCL_MONTO+MVCL_RTEFTE+MVCL_RTEIVA+MVCL_RTEICA+MVCL_RCREE)
                                FROM movimiento_clientes WHERE TERC_NIT = :NIT AND MVCL_FECHA >= :FECINI AND
                                MVCL_FECHA <= :FECFIN AND COBR_COD = :CODCOBR AND MVCL_DEBITO = 'N' and
                                MVCL_ABONO = 'S' AND MVCL_SUCURSAL = :SUCURSAL AND ((:SUBEMPRESA = 0) or (SUCU_ID = :SUBEMPRESA)) INTO :ABONOS;
                            END
                        ELSE
                            BEGIN
                            SELECT SUM(MVCL_MONTO/MVCL_TRM) FROM movimiento_clientes WHERE TERC_NIT = :NIT AND
                                COBR_COD = :CODCOBR AND MVCL_FECHA >= :FECINI AND MVCL_FECHA <= :FECFIN AND MVCL_TRM <> 1 AND
                                MVCL_DEBITO = 'S' AND MVCL_SUCURSAL = :SUCURSAL AND ((:SUBEMPRESA = 0) or (SUCU_ID = :SUBEMPRESA)) INTO :DEBITO;
                            SELECT SUM(MVCL_MONTO/MVCL_TRM) FROM movimiento_clientes WHERE TERC_NIT = :NIT AND
                                COBR_COD = :CODCOBR AND MVCL_FECHA >= :FECINI AND MVCL_FECHA <= :FECFIN AND
                                MVCL_DEBITO = 'N' and MVCL_ABONO = 'N' and mvcl_tiporef <> 45 AND MVCL_TRM <> 1 AND
                                MVCL_SUCURSAL = :SUCURSAL AND ((:SUBEMPRESA = 0) or (SUCU_ID = :SUBEMPRESA)) INTO :CREDITO;
                            SELECT SUM((MVCL_MONTO+MVCL_RTEFTE+MVCL_RTEIVA+MVCL_RTEICA+MVCL_RCREE)/MVCL_TRM)
                                FROM movimiento_clientes WHERE TERC_NIT = :NIT AND MVCL_FECHA >= :FECINI AND
                                MVCL_FECHA <= :FECFIN AND COBR_COD = :CODCOBR AND MVCL_DEBITO = 'N' and MVCL_TRM <> 1 AND
                                MVCL_ABONO = 'S' AND MVCL_SUCURSAL = :SUCURSAL AND ((:SUBEMPRESA = 0) or (SUCU_ID = :SUBEMPRESA)) INTO :ABONOS;
                            END
                        END
                    if (DEBITO IS NULL) then
                        DEBITO = 0;
                    if (CREDITO IS NULL) then
                        CREDITO = 0;
                    if (ABONOS IS NULL) then
                        ABONOS = 0;
                    CREDITO = CREDITO + ABONOS;
                    TDEBITO = DEBITO;
                    TCREDITO = CREDITO;
                    SALDO = INICIAL + DEBITO - CREDITO;
                    SUSPEND;
                    END
                END  /* ok = S */
            END  /* FOR COBRADOR */
        END  /* AGRUPA C */
    END  /* FOR NIT */
END
^

SET TERM ; ^

/* 20140508C */
/* NO VALIDE RESERVA DE ARTICULOS QUE NO TIENEN CONTROL EXISTENCIAS */
SET TERM ^ ;

CREATE OR ALTER TRIGGER PEDIDOS_DETALLE_AI FOR PEDIDOS_DETALLE
ACTIVE AFTER INSERT POSITION 0
as
declare variable CONSO CHAR(2);
declare variable CONSOLIDA INTEGER;
declare variable IDENTR INTEGER;
declare variable COSTO NUMERIC(18,2);
declare variable IVA NUMERIC(9,2);
declare variable IVAM NUMERIC(18,2);
declare variable CONSUMO NUMERIC(18,2);
declare variable STAND VARCHAR(20);
declare variable LOTE VARCHAR(15);
declare variable FECHA DATE;
declare variable VLOTE DATE;
declare variable CANTAUX numeric(18,4);
declare variable CANT numeric(18,4);
declare variable ITEM integer;
declare variable EXAR CHAR(1);
declare variable EXRES VARCHAR(8);
declare variable EXISTEN numeric(18,4);
declare variable RESERVA numeric(18,4);
begin
if ((NEW.pedi_id <> 0) AND (NEW.pede_anulado = 'N')) then
    BEGIN
    SELECT PEDI_CONSOLIDA, PEDI_IDENTR, PEDI_FECHA FROM PEDIDOS WHERE PEDI_ID = NEW.PEDI_ID INTO :CONSOLIDA, :IDENTR, :FECHA;
    SELECT ARTI_CONSUMO, TAIV_PORC, ARTI_EXIST FROM ARTICULO A, TARIFA_IVA T
        WHERE A.taiv_cod = T.taiv_cod AND A.arti_cod = NEW.arti_cod INTO :consumo, :iva, :EXAR;
    if (EXAR <> 'N') then
        BEGIN
        EXECUTE procedure LEE_CONFIGURACION ('INVENTARIO','EXISTENCIAS','ACCION A TOMAR SI LA EXISTENCIA ESTA RESERVADA') returning_values (EXRES);
        if (EXRES = 'PROHIBIR') then
            BEGIN
            EXECUTE PROCEDURE existencia_bodega(NEW.arti_cod, :fecha,  NEW.bode_cod) returning_values (:existen, :reserva);
            if ((NEW.pede_cant * NEW.pede_factor) > (:existen - :reserva)) then
                exception existencia_insuficiente 'La existencia del artículo ' || new.arti_cod || ' esta reservada. Cantidad:' || (new.pede_cant * new.pede_factor) || ' disponible:' || (:existen-:reserva);
            END
        END
    if (CONSOLIDA <> 0) then
        begin
        EXECUTE procedure LEE_CONFIGURACION ('FACTURACION','DOCUMENTOS','DEJAR PENDIENTES LOS ARTICULOS NO INCLUIDOS AL TRAER DOCUMENTOS RELACIONADOS') returning_values (CONSO);
        if (CONSO = 'NO') then
            update consolidado_faltantes set COFA_IDDES = new.pedi_id, COFA_CANTCR = COFA_CANT * COFA_FACTOR, COFA_FECDES = :FECHA
                where COFA_ID = :consolida AND ARTI_COD = NEW.ARTI_COD;
        else
            BEGIN
            CANTAUX = new.pede_cant * new.pede_factor;
            for select COFA_ITEM, ((COFA_CANT * COFA_FACTOR)-COFA_CANTCR) from consolidado_faltantes
                where COFA_ID = :CONSOLIDA and ARTI_COD = new.ARTI_COD
                into :ITEM, :CANT
                do
                begin
                if ((CANTAUX > 0) and (CANT > 0))then
                    if (CANT < CANTAUX) then
                        begin
                        update consolidado_faltantes
                            set COFA_IDDES = new.pedi_id, COFA_CANTCR = COFA_CANT * COFA_FACTOR, COFA_FECDES = :FECHA
                            where COFA_ID = :consolida and COFA_ITEM = :ITEM;
                        CANTAUX = CANTAUX - CANT;
                        end
                    else
                        begin
                        update consolidado_faltantes
                            set COFA_IDDES = new.pedi_id, COFA_CANTCR = COFA_CANTCR + :CANTAUX, COFA_FECDES = :FECHA
                            where COFA_ID = :consolida and COFA_ITEM = :ITEM;
                        CANTAUX = 0;
                        end
                end
            END
        end
    if (IDENTR <> 0) then
        begin
        EXECUTE PROCEDURE costo_promedio_unidad(NEW.arti_cod, :FECHA, NEW.pede_unidad) returning_values (:COSTO);
        IVAM = COSTO * IVA;
        if (EXAR = 'L') then
            BEGIN
            EXECUTE PROCEDURE seleccione_lote (NEW.arti_cod, NEW.bode_cod, NEW.pede_cant * NEW.pede_factor) returning_values (:LOTE);
            SELECT LOTE_VENCE FROM LOTES WHERE (ARTI_COD = NEW.arti_cod) AND (BODE_COD = NEW.bode_cod) AND (LOTE_NRO = :LOTE) INTO :VLOTE;
            END
        ELSE
            BEGIN
            LOTE = NULL;
            VLOTE = NULL;
            END
        SELECT STAND_COD FROM STANDS WHERE ARTI_COD = NEW.arti_cod AND STAND_BODEGA = NEW.bode_cod INTO :STAND;
        INSERT INTO ENTRADAS_DETALLE (ENTR_ID, ENDE_ITEM, ARTI_COD, BODE_COD, ENDE_CANT, ENDE_UNIDAD, ENDE_COSTO,
            ENDE_LOTE, ENDE_FACTOR, ENDE_DESC, ENDE_OBS, ENDE_DTOPORC, ENDE_DTOMONTO, ENDE_IVAPORC, ENDE_IVAMONTO,
            ENDE_CONSUMO, ENDE_CODBAR, ENDE_TOTAL, ENDE_ANULADO, ENDE_TRANSMIT, LOTE_VENCE, ENDE_STAND)
            VALUES(:IDENTR, NEW.pede_item, NEW.arti_cod, NEW.bode_cod, NEW.pede_cant, NEW.pede_unidad, :COSTO,
            :LOTE, NEW.pede_factor, NEW.pede_desc, NEW.pede_obs, 0, 0, :IVA, :IVAM,
            :CONSUMO, NEW.pede_codbar, :COSTO * NEW.pede_cant * NEW.pede_factor, 'N', 'N', :VLOTE, :STAND);
        end
    END
end
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER TRIGGER PEDIDOS_DETALLE_AU FOR PEDIDOS_DETALLE
ACTIVE AFTER UPDATE POSITION 0
as
declare variable CONSO CHAR(2);
declare variable CONSOLIDA INTEGER;
declare variable IDENTR INTEGER;
declare variable COSTO NUMERIC(18,2);
declare variable IVA NUMERIC(9,2);
declare variable IVAM NUMERIC(18,2);
declare variable CONSUMO NUMERIC(18,2);
declare variable STAND VARCHAR(20);
declare variable LOTE VARCHAR(15);
declare variable FECHA DATE;
declare variable VLOTE DATE;
declare variable CANTAUX NUMERIC(18,2);
declare variable CANT NUMERIC(18,2);
declare variable ITEM integer;
declare variable EXAR CHAR(1);
declare variable EXRES VARCHAR(8);
declare variable EXISTEN numeric(18,4);
declare variable RESERVA numeric(18,4);
begin
if ((OLD.pedi_id <> 0) AND (OLD.pede_anulado = 'N')) then
    BEGIN
    SELECT PEDI_CONSOLIDA, PEDI_IDENTR, PEDI_FECHA FROM PEDIDOS WHERE PEDI_ID = OLD.PEDI_ID INTO :CONSOLIDA, :IDENTR, :FECHA;
    if (CONSOLIDA <> 0) then
        BEGIN
        /* DESHAGA LOS PENDIENTES */
        CANTAUX = old.pede_cant * old.pede_factor;
        for select COFA_ITEM, COFA_CANTCR from consolidado_faltantes
            where COFA_ID = :CONSOLIDA and ARTI_COD = old.ARTI_COD
            into :ITEM, :CANT
            do
            begin
            if ((CANTAUX > 0) and (CANT > 0))then
                begin
                if (CANTAUX > CANT) then
                    BEGIN
                    update consolidado_faltantes
                        set COFA_IDDES = 0, COFA_CANTCR = 0
                        where COFA_ID = :consolida and COFA_ITEM = :ITEM;
                    CANTAUX = CANTAUX - CANT;
                    END
                ELSE
                    BEGIN
                    update consolidado_faltantes
                        set COFA_IDDES = 0, COFA_CANTCR = COFA_CANTCR - :CANTAUX
                        where COFA_ID = :consolida and COFA_ITEM = :ITEM;
                    CANTAUX = 0;
                    END
                end
            end
        END
    if (IDENTR <> 0) then
        DELETE FROM ENTRADAS WHERE ENTR_ID = :IDENTR;
    END

if ((NEW.pedi_id <> 0) AND (NEW.pede_anulado = 'N')) then
    BEGIN
    SELECT PEDI_CONSOLIDA, PEDI_IDENTR, PEDI_FECHA FROM PEDIDOS WHERE PEDI_ID = NEW.PEDI_ID INTO :CONSOLIDA, :IDENTR, :FECHA;
    SELECT ARTI_CONSUMO, TAIV_PORC, ARTI_EXIST FROM ARTICULO A, TARIFA_IVA T
        WHERE A.taiv_cod = T.taiv_cod AND A.arti_cod = NEW.arti_cod INTO :consumo, :iva, :EXAR;
    if (EXAR <> 'N') then
        BEGIN
        EXECUTE procedure LEE_CONFIGURACION ('INVENTARIO','EXISTENCIAS','ACCION A TOMAR SI LA EXISTENCIA ESTA RESERVADA') returning_values (EXRES);
        if (EXRES = 'PROHIBIR') then
            BEGIN
            EXECUTE PROCEDURE existencia_bodega(NEW.arti_cod, :fecha,  NEW.bode_cod) returning_values (:existen, :reserva);
            if ((NEW.pede_cant * NEW.pede_factor) > (:existen - :reserva)) then
                exception existencia_insuficiente 'La existencia del artículo ' || new.arti_cod || ' esta reservada. Cantidad:' || (new.pede_cant * new.pede_factor) || ' disponible:' || (:existen-:reserva);
            END
        END
    if (CONSOLIDA <> 0) then
        begin
        EXECUTE procedure LEE_CONFIGURACION ('FACTURACION','DOCUMENTOS','DEJAR PENDIENTES LOS ARTICULOS NO INCLUIDOS AL TRAER DOCUMENTOS RELACIONADOS') returning_values (CONSO);
        if (CONSO = 'NO') then
            update consolidado_faltantes set COFA_IDDES = new.pedi_id, COFA_CANTCR = COFA_CANT * COFA_FACTOR, COFA_FECDES = :fecha
                where COFA_ID = :consolida AND ARTI_COD = NEW.ARTI_COD;
        else
            begin
            CANTAUX = new.pede_cant * new.pede_factor;
            for select COFA_ITEM, ((COFA_CANT * COFA_FACTOR)-COFA_CANTCR) from consolidado_faltantes
                where COFA_ID = :CONSOLIDA and ARTI_COD = new.ARTI_COD
                into :ITEM, :CANT
                do
                begin
                if ((CANTAUX > 0) and (CANT > 0))then
                    if (CANT < CANTAUX) then
                        begin
                        update consolidado_faltantes
                            set COFA_IDDES = new.pedi_id, COFA_CANTCR = COFA_CANT * COFA_FACTOR, COFA_FECDES = :fecha
                            where COFA_ID = :consolida and COFA_ITEM = :ITEM;
                        CANTAUX = CANTAUX - CANT;
                        end
                    else
                        begin
                        update consolidado_faltantes
                            set COFA_IDDES = new.pedi_id, COFA_CANTCR = COFA_CANTCR + :CANTAUX, COFA_FECDES = :fecha
                            where COFA_ID = :consolida and COFA_ITEM = :ITEM;
                        CANTAUX = 0;
                        end
                end
            end
        end
    if (IDENTR <> 0) then
        begin
        EXECUTE PROCEDURE costo_promedio_unidad(NEW.arti_cod, :FECHA, NEW.pede_unidad) returning_values (:COSTO);
        IVAM = COSTO * IVA;
        if (EXAR = 'L') then
            BEGIN
            EXECUTE PROCEDURE seleccione_lote (NEW.arti_cod, NEW.bode_cod, NEW.pede_cant * NEW.pede_factor) returning_values (:LOTE);
            SELECT LOTE_VENCE FROM LOTES WHERE (ARTI_COD = NEW.arti_cod) AND (BODE_COD = NEW.bode_cod) AND (LOTE_NRO = :LOTE) INTO :VLOTE;
            END
        ELSE
            BEGIN
            LOTE = NULL;
            VLOTE = NULL;
            END
        SELECT STAND_COD FROM STANDS WHERE ARTI_COD = NEW.arti_cod AND STAND_BODEGA = NEW.bode_cod INTO :STAND;
        INSERT INTO ENTRADAS_DETALLE (ENTR_ID, ENDE_ITEM, ARTI_COD, BODE_COD, ENDE_CANT, ENDE_UNIDAD, ENDE_COSTO,
            ENDE_LOTE, ENDE_FACTOR, ENDE_DESC, ENDE_OBS, ENDE_DTOPORC, ENDE_DTOMONTO, ENDE_IVAPORC, ENDE_IVAMONTO,
            ENDE_CONSUMO, ENDE_CODBAR, ENDE_TOTAL, ENDE_ANULADO, ENDE_TRANSMIT, LOTE_VENCE, ENDE_STAND)
            VALUES(:IDENTR, NEW.pede_item, NEW.arti_cod, NEW.bode_cod, NEW.pede_cant, NEW.pede_unidad, :COSTO,
            :LOTE, NEW.pede_factor, NEW.pede_desc, NEW.pede_obs, 0, 0, :IVA, :IVAM,
            :CONSUMO, NEW.pede_codbar, :COSTO * NEW.pede_cant * NEW.pede_factor, 'N', 'N', :VLOTE, :STAND);
        end
    END
end
^

SET TERM ; ^

/* 20140509 */
/* COSTO EN FALTANTE POR DOCUMENTO PARA EVALUAR DIFERENCIAS CONTABLES */
SET TERM ^ ;

CREATE OR ALTER procedure REP_FALTANTES_VENTA (
    TIPOORI integer,
    FECINI date,
    FECFIN date,
    CORTE date,
    TIPODES integer,
    SOLOFALT char(1),
    DETALLE char(1),
    SUBEMPRESA integer)
returns (
    PREFIJO varchar(4),
    NUMERO varchar(8),
    FECHA date,
    PTVTA integer,
    NIT varchar(20),
    NOMCLIENTE varchar(60),
    VEND integer,
    NOMVEND varchar(60),
    VENCE date,
    ARTICULO varchar(15),
    DESCRIPCION varchar(60),
    CODGRUPO varchar(2),
    NOMGRUPO varchar(30),
    CODSUBG varchar(3),
    NOMSUBG varchar(30),
    CODMARC varchar(3),
    NOMMARC varchar(30),
    CANTIDAD numeric(18,4),
    CRUCE numeric(18,4),
    UNIDAD varchar(8),
    PRECIO numeric(18,2),
    COSTO numeric(18,2),
    TOTPRE numeric(18,2),
    TOTCOS numeric(18,2),
    DESCUENTO numeric(9,4),
    FALTANTE numeric(18,4),
    OBS varchar(255),
    NUMCRUCE varchar(60))
AS
declare variable ID INTEGER;
declare variable ITEM INTEGER;
declare variable FACTOR NUMERIC(18,4);
declare variable NUM VARCHAR(12);
declare variable FALTA NUMERIC(18, 4);
declare variable PRUNIT NUMERIC(18, 2);
BEGIN
if (detalle = 'S') then
  BEGIN
  if (TIPOORI = 32) then
    FOR SELECT R.REVT_ID, R.PREF_PRE, REVT_NUMERO, REVT_FECHA, REVT_FECHA VENCE, RVDE_ITEM, R.TERC_NIT, REVT_NOMTERC, ARTI_COD, SUBSTR(RVDE_DESC,1,60), RVDE_UNIDAD, RVDE_CANT, RVDE_PRUNIT, RVDE_DTOPORC, SUBSTRING(REVT_OBS FROM 1 FOR 255), R.ptvt_id
      FROM REMISIONES_VENTA R, REMISIONES_VENTA_DETALLE D, PREFIJOS P
      WHERE R.REVT_ID = D.REVT_ID AND REVT_FECHA >= :FECINI AND REVT_FECHA <= :FECFIN and REVT_ANULADO = 'N'
       AND P.PREF_PRE = R.PREF_PRE AND P.TIDO_COD = 32 AND ((P.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
      ORDER BY REVT_FECHA, R.PREF_PRE, REVT_NUMERO, RVDE_ITEM
      INTO :ID, :PREFIJO, :NUMERO, :FECHA, :VENCE, :ITEM, :NIT, :NOMCLIENTE, :ARTICULO, :DESCRIPCION, :UNIDAD, :CANTIDAD, :PRECIO, :DESCUENTO, :OBS, :PTVTA
      DO
        BEGIN
        NUMCRUCE = '';
        EXECUTE PROCEDURE FALTANTE_CORTE(:TIPOORI, :TIPODES, :ID,  :ITEM, :corte) returning_values (:FALTANTE, :UNIDAD, :FACTOR);
        CRUCE = CANTIDAD - FALTANTE;
        if (TIPODES = 31) then
            FOR SELECT PREF_PRE || FACT_NUMERO FROM FACTURAS F, consolidado_faltantes C
                WHERE F.fact_consolida = C.cofa_id AND C.cofa_tipoori = 32 AND C.cofa_idori = :ID AND
                C.cofa_tipodes = 31 AND C.cofa_itemori = :ITEM AND C.cofa_cantcr <> 0 AND FACT_ANULADO = 'N'
                INTO :num
                DO
                if (strlen(NUMCRUCE) < 47) then
                    NUMCRUCE = NUMCRUCE || NUM || '-';
        if ((SOLOFALT = 'N') or (FALTANTE <> 0)) then
            BEGIN
            SELECT GRUP_COD, SUBG_COD, MARC_COD FROM articulo WHERE ARTI_COD = :ARTICULO INTO :CODGRUPO, :CODSUBG, :CODMARC;
            EXECUTE procedure nombres_grupos_inventario (CODGRUPO, CODSUBG, CODMARC)
                returning_values (NOMGRUPO, NOMSUBG, NOMMARC);
            EXECUTE PROCEDURE costo_promedio_unidad(:ARTICULO, :FECHA, :unidad) returning_values (:COSTO);
            TOTPRE = PRECIO * FALTANTE;
            TOTCOS = COSTO * FALTANTE;
            SUSPEND;
            END
        END
  if (TIPOORI = 34) then
    FOR SELECT P.PEDI_ID, P.PREF_PRE, PEDI_NUMERO, PEDI_FECHA, (PEDI_FECHA + PEDI_VALIDEZ), PEDE_ITEM, P.TERC_NIT, PEDI_NOMTERC, ARTI_COD, SUBSTR(PEDE_DESC,1,60), PEDE_UNIDAD, PEDE_CANT, PEDE_PRUNIT, PEDE_DTOPORC, SUBSTRING(PEDI_OBS FROM 1 FOR 255), p.ptvt_id
      FROM PEDIDOS P, PEDIDOS_DETALLE D, PREFIJOS PR
      WHERE P.PEDI_ID = D.PEDI_ID AND PEDI_FECHA >= :FECINI AND PEDI_FECHA <= :FECFIN AND PEDI_ANULADO = 'N' AND PEDI_VALIDEZ >= 0
       AND PR.PREF_PRE = P.PREF_PRE AND PR.TIDO_COD = 34 AND ((PR.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
      ORDER BY PEDI_FECHA, P.PREF_PRE, PEDI_NUMERO, PEDE_ITEM
      INTO :ID, :PREFIJO, :NUMERO, :FECHA, :VENCE, :ITEM, :NIT, :NOMCLIENTE, :ARTICULO, :DESCRIPCION, :UNIDAD, :CANTIDAD, :PRECIO, :DESCUENTO, :OBS, :PTVTA
      DO
        BEGIN
        NUMCRUCE = '';
        EXECUTE PROCEDURE FALTANTE_CORTE(:TIPOORI, :TIPODES, :ID,  :ITEM, :corte) returning_values (:FALTANTE, :UNIDAD, :FACTOR);
        CRUCE = CANTIDAD - FALTANTE;
        if (TIPODES = 31) then
            FOR SELECT PREF_PRE || FACT_NUMERO FROM FACTURAS F, consolidado_faltantes C
                WHERE F.fact_consolida = C.cofa_id AND C.cofa_tipoori = 34 AND C.cofa_idori = :ID AND
                C.cofa_tipodes = 31 AND C.cofa_itemori = :ITEM AND C.cofa_cantcr <> 0 AND FACT_ANULADO = 'N'
                INTO :num
                DO
                if (strlen(NUMCRUCE) < 47) then
                    NUMCRUCE = NUMCRUCE || NUM || '-';
        if (TIPODES = 32) then
            FOR SELECT PREF_PRE || REVT_NUMERO FROM remisiones_venta F, consolidado_faltantes C
                WHERE F.revt_consolida = C.cofa_id AND C.cofa_tipoori = 34 AND C.cofa_idori = :ID AND
                C.cofa_tipodes = 32 AND C.cofa_itemori = :ITEM AND C.cofa_cantcr <> 0 AND REVT_ANULADO = 'N'
                INTO :num
                DO
                if (strlen(NUMCRUCE) < 50) then
                    NUMCRUCE = NUMCRUCE || NUM || '-';
        if ((SOLOFALT = 'N') or (FALTANTE <> 0)) then
            BEGIN
            SELECT GRUP_COD, SUBG_COD, MARC_COD FROM articulo WHERE ARTI_COD = :ARTICULO INTO :CODGRUPO, :CODSUBG, :CODMARC;
            EXECUTE procedure nombres_grupos_inventario (CODGRUPO, CODSUBG, CODMARC)
                returning_values (NOMGRUPO, NOMSUBG, NOMMARC);
            EXECUTE PROCEDURE costo_promedio_unidad(:ARTICULO, :FECHA, :unidad) returning_values (:COSTO);
            TOTPRE = PRECIO * FALTANTE;
            TOTCOS = COSTO * FALTANTE;
            SUSPEND;
            END
        END
  if (TIPOORI = 35) then
    FOR SELECT C.COTI_ID, C.PREF_PRE, COTI_NUMERO, COTI_FECHA, (COTI_FECHA + COTI_VALIDEZ), CTDE_ITEM, C.TERC_NIT, COTI_NOMTERC, ARTI_COD, SUBSTR(CTDE_DESC,1,60), CTDE_UNIDAD, CTDE_CANT, CTDE_PRUNIT, CTDE_DTOPORC, SUBSTRING(COTI_OBS FROM 1 FOR 255), c.ptvt_id
      FROM COTIZACIONES C, COTIZACIONES_DETALLE D, PREFIJOS P
      WHERE C.COTI_ID = D.COTI_ID AND COTI_FECHA >= :FECINI AND COTI_FECHA <= :FECFIN AND COTI_ANULADO = 'N'
       AND P.PREF_PRE = C.PREF_PRE AND P.TIDO_COD = 35 AND ((P.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
      ORDER BY COTI_FECHA, C.PREF_PRE, COTI_NUMERO, CTDE_ITEM
      INTO :ID, :PREFIJO, :NUMERO, :FECHA, :VENCE, :ITEM, :NIT, :NOMCLIENTE, :ARTICULO, :DESCRIPCION, :UNIDAD, :CANTIDAD, :PRECIO, :DESCUENTO, :OBS, :PTVTA
      DO
        BEGIN
        NUMCRUCE = '';
        EXECUTE PROCEDURE FALTANTE_CORTE(:TIPOORI, :TIPODES, :ID,  :ITEM, :CORTE) returning_values (:FALTANTE, :UNIDAD, :FACTOR);
        CRUCE = CANTIDAD - FALTANTE;
        if (TIPODES = 31) then
            FOR SELECT PREF_PRE || FACT_NUMERO FROM FACTURAS F, consolidado_faltantes C
                WHERE F.fact_consolida = C.cofa_id AND C.cofa_tipoori = 35 AND C.cofa_idori = :ID AND
                C.cofa_tipodes = 31 AND C.cofa_itemori = :ITEM AND C.cofa_cantcr <> 0 AND FACT_ANULADO = 'N'
                INTO :num
                DO
                if (strlen(NUMCRUCE) < 47) then
                    NUMCRUCE = NUMCRUCE || NUM || '-';
        if (TIPODES = 32) then
            FOR SELECT PREF_PRE || REVT_NUMERO FROM remisiones_venta F, consolidado_faltantes C
                WHERE F.revt_consolida = C.cofa_id AND C.cofa_tipoori = 35 AND C.cofa_idori = :ID AND
                C.cofa_tipodes = 32 AND C.cofa_itemori = :ITEM AND C.cofa_cantcr <> 0 AND REVT_ANULADO = 'N'
                INTO :num
                DO
                if (strlen(NUMCRUCE) < 50) then
                    NUMCRUCE = NUMCRUCE || NUM || '-';
        if (TIPODES = 34) then
            FOR SELECT PREF_PRE || PEDI_NUMERO FROM pedidos F, consolidado_faltantes C
                WHERE F.pedi_consolida = C.cofa_id AND C.cofa_tipoori = 35 AND C.cofa_idori = :ID AND
                C.cofa_tipodes = 34 AND C.cofa_itemori = :ITEM AND C.cofa_cantcr <> 0 AND PEDI_ANULADO = 'N'
                INTO :num
                DO
                if (strlen(NUMCRUCE) < 50) then
                    NUMCRUCE = NUMCRUCE || NUM || '-';
        if ((SOLOFALT = 'N') or (FALTANTE <> 0)) then
            BEGIN
            SELECT GRUP_COD, SUBG_COD, MARC_COD FROM articulo WHERE ARTI_COD = :ARTICULO INTO :CODGRUPO, :CODSUBG, :CODMARC;
            EXECUTE procedure nombres_grupos_inventario (CODGRUPO, CODSUBG, CODMARC)
                returning_values (NOMGRUPO, NOMSUBG, NOMMARC);
            EXECUTE PROCEDURE costo_promedio_unidad(:ARTICULO, :FECHA, :unidad) returning_values (:COSTO);
            TOTPRE = PRECIO * FALTANTE;
            TOTCOS = COSTO * FALTANTE;
            SUSPEND;
            END
        END
  if (TIPOORI = 40) then /* pendientes */
    FOR SELECT P.pend_id, P.pref_pre, p.pend_numero, p.pend_fecha, p.pend_fecha VENCE, d.pevd_item, P.terc_nit, p.pend_nomcli, d.arti_cod, SUBSTR(d.pevd_desc,1,60), d.pevd_unidad, d.pevd_cant, d.pevd_prunit, d.pevd_dtoporc, SUBSTRING(p.pend_obs FROM 1 FOR 255)
      FROM pendiente_ventas P, pendiente_ventas_detalle D, PREFIJOS PR
      WHERE P.pend_id = D.pend_id AND PEND_FECHA >= :FECINI AND PEND_FECHA <= :FECFIN AND PEND_ANULADO = 'N'
       AND PR.PREF_PRE = P.PREF_PRE AND PR.TIDO_COD = 40 AND ((PR.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
      ORDER BY PEND_FECHA, P.PREF_PRE, PEND_NUMERO, pevd_item
      INTO :ID, :PREFIJO, :NUMERO, :FECHA, :VENCE, :ITEM, :NIT, :NOMCLIENTE, :ARTICULO, :DESCRIPCION, :UNIDAD, :CANTIDAD, :PRECIO, :DESCUENTO, :OBS
      DO
        BEGIN
        EXECUTE PROCEDURE faltante_corte(:TIPOORI, :TIPODES, :ID,  :ITEM, :corte) returning_values (:FALTANTE, :UNIDAD, :FACTOR);
        if ((SOLOFALT = 'N') or (FALTANTE <> 0)) then
            BEGIN
            CRUCE = CANTIDAD - FALTANTE;
            SELECT GRUP_COD, SUBG_COD, MARC_COD FROM articulo WHERE ARTI_COD = :ARTICULO INTO :CODGRUPO, :CODSUBG, :CODMARC;
            EXECUTE procedure nombres_grupos_inventario (CODGRUPO, CODSUBG, CODMARC)
                returning_values (NOMGRUPO, NOMSUBG, NOMMARC);
            if (TIPODES = 32) then
                FOR SELECT PREF_PRE || REVT_NUMERO FROM remisiones_venta F, consolidado_faltantes C
                    WHERE F.revt_consolida = C.cofa_id AND C.cofa_tipoori = 40 AND C.cofa_idori = :ID AND
                    C.cofa_tipodes = 32 AND C.cofa_itemori = :ITEM AND C.cofa_cantcr <> 0 AND REVT_ANULADO = 'N'
                    INTO :num
                    DO
                    if (strlen(NUMCRUCE) < 50) then
                        NUMCRUCE = NUMCRUCE || NUM || '-';
            EXECUTE PROCEDURE costo_promedio_unidad(:ARTICULO, :FECHA, :unidad) returning_values (:COSTO);
            TOTPRE = PRECIO * FALTANTE;
            TOTCOS = COSTO * FALTANTE;
            SUSPEND;
            END
        END
  END
ELSE
  BEGIN
  if (TIPOORI = 32) then
    FOR SELECT R.REVT_ID, R.PREF_PRE, REVT_NUMERO, REVT_FECHA, REVT_FECHA VENCE, R.TERC_NIT,
        REVT_NOMTERC, SUBSTRING(REVT_OBS FROM 1 FOR 255), R.VEND_COD, REVT_TOTAL, R.ptvt_id
      FROM REMISIONES_VENTA R, PREFIJOS P
      WHERE REVT_FECHA >= :FECINI AND REVT_FECHA <= :FECFIN and REVT_ANULADO = 'N'
       AND P.PREF_PRE = R.PREF_PRE AND P.TIDO_COD = 32 AND ((P.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
      ORDER BY REVT_FECHA, R.PREF_PRE, REVT_NUMERO
      INTO :ID, :PREFIJO, :NUMERO, :FECHA, :VENCE, :NIT, :NOMCLIENTE, :OBS, :VEND, :PRECIO, :PTVTA
      DO
        BEGIN
        FALTANTE = 0;
        NUMCRUCE = '';
        SELECT VEND_NOMBRE FROM VENDEDORES WHERE VEND_COD = :VEND INTO :NOMVEND;
        if (TIPODES = 31) then
            FOR SELECT PREF_PRE || FACT_NUMERO FROM FACTURAS F, consolidado_faltantes C
                WHERE F.fact_consolida = C.cofa_id AND C.cofa_tipoori = 32 AND C.cofa_idori = :ID AND
                C.cofa_tipodes = 31 AND C.cofa_cantcr <> 0 AND FACT_ANULADO = 'N'
                INTO :num
                DO
                if (strlen(NUMCRUCE) < 47) then
                    NUMCRUCE = NUMCRUCE || NUM || '-';
        TOTPRE = 0;
        TOTCOS = 0;
        FOR SELECT RVDE_ITEM, RVDE_PRUNIT, RVDE_UNIDAD FROM remisiones_venta_detalle WHERE REVT_ID = :ID INTO :ITEM, :PRUNIT, :UNIDAD
            DO
            BEGIN
            EXECUTE PROCEDURE FALTANTE_CORTE(:TIPOORI, :TIPODES, :ID, :ITEM, :CORTE) returning_values (:FALTA, :UNIDAD, :FACTOR);
            FALTANTE = FALTANTE + FALTA;
            TOTPRE = TOTPRE + FALTA * PRUNIT;
            EXECUTE PROCEDURE costo_promedio_unidad(:ARTICULO, :FECHA, :unidad) returning_values (:COSTO);
            TOTCOS = TOTCOS + FALTA * COSTO;
            END
        if ((SOLOFALT = 'N') or (FALTANTE <> 0)) then
            BEGIN
            SUSPEND;
            END
        END
  if (TIPOORI = 34) then
    FOR SELECT P.PEDI_ID, P.PREF_PRE, PEDI_NUMERO, PEDI_FECHA, (PEDI_FECHA + PEDI_VALIDEZ), P.TERC_NIT,
    PEDI_NOMTERC, SUBSTRING(PEDI_OBS FROM 1 FOR 255), P.VEND_COD, PEDI_TOTAL, p.ptvt_id
      FROM PEDIDOS P, PREFIJOS PR
      WHERE PEDI_FECHA >= :FECINI AND PEDI_FECHA <= :FECFIN AND PEDI_ANULADO = 'N' AND PEDI_VALIDEZ >= 0
       AND PR.PREF_PRE = P.PREF_PRE AND PR.TIDO_COD = 34 AND ((PR.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
      ORDER BY PEDI_FECHA, P.PREF_PRE, PEDI_NUMERO
      INTO :ID, :PREFIJO, :NUMERO, :FECHA, :VENCE, :NIT, :NOMCLIENTE, :OBS, :VEND, :PRECIO, :PTVTA
      DO
        BEGIN
        FALTANTE = 0;
        NUMCRUCE = '';
        SELECT VEND_NOMBRE FROM VENDEDORES WHERE VEND_COD = :VEND INTO :NOMVEND;
        TOTPRE = 0;
        TOTCOS = 0;
        FOR SELECT PEDE_ITEM FROM pedidos_detalle WHERE PEDI_ID = :ID INTO :ITEM
            DO
            BEGIN
            EXECUTE PROCEDURE FALTANTE_CORTE(:TIPOORI, :TIPODES, :ID, :ITEM, :CORTE) returning_values (:FALTA, :UNIDAD, :FACTOR);
            FALTANTE = FALTANTE + FALTA;
            TOTPRE = TOTPRE + FALTA * PRUNIT;
            EXECUTE PROCEDURE costo_promedio_unidad(:ARTICULO, :FECHA, :unidad) returning_values (:COSTO);
            TOTCOS = TOTCOS + FALTA * COSTO;
            END
        if (TIPODES = 31) then
            FOR SELECT PREF_PRE || FACT_NUMERO FROM FACTURAS F, consolidado_faltantes C
                WHERE F.fact_consolida = C.cofa_id AND C.cofa_tipoori = 34 AND C.cofa_idori = :ID AND
                C.cofa_tipodes = 31 AND C.cofa_cantcr <> 0 AND FACT_ANULADO = 'N'
                INTO :num
                DO
                if (strlen(NUMCRUCE) < 47) then
                    NUMCRUCE = NUMCRUCE || NUM || '-';
        if (TIPODES = 32) then
            FOR SELECT PREF_PRE || REVT_NUMERO FROM remisiones_venta F, consolidado_faltantes C
                WHERE F.revt_consolida = C.cofa_id AND C.cofa_tipoori = 34 AND C.cofa_idori = :ID AND
                C.cofa_tipodes = 32 AND C.cofa_cantcr <> 0 AND REVT_ANULADO = 'N'
                INTO :num
                DO
                if (strlen(NUMCRUCE) < 50) then
                    NUMCRUCE = NUMCRUCE || NUM || '-';
        if ((SOLOFALT = 'N') or (FALTANTE <> 0)) then
            SUSPEND;
        END
  if (TIPOORI = 35) then
    FOR SELECT C.COTI_ID, C.PREF_PRE, COTI_NUMERO, COTI_FECHA, (COTI_FECHA + COTI_VALIDEZ), C.TERC_NIT,
      COTI_NOMTERC, SUBSTRING(COTI_OBS FROM 1 FOR 255), C.VEND_COD, COTI_TOTAL, C.ptvt_id
      FROM COTIZACIONES C, PREFIJOS P
      WHERE COTI_FECHA >= :FECINI AND COTI_FECHA <= :FECFIN AND COTI_ANULADO = 'N'
       AND P.PREF_PRE = C.PREF_PRE AND P.TIDO_COD = 35 AND ((P.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
      ORDER BY COTI_FECHA, C.PREF_PRE, COTI_NUMERO
      INTO :ID, :PREFIJO, :NUMERO, :FECHA, :VENCE, :NIT, :NOMCLIENTE, :OBS, :VEND, :PRECIO, :PTVTA
      DO
        BEGIN
        FALTANTE = 0;
        NUMCRUCE = '';
        SELECT VEND_NOMBRE FROM VENDEDORES WHERE VEND_COD = :VEND INTO :NOMVEND;
        TOTPRE = 0;
        TOTCOS = 0;
        FOR SELECT CTDE_ITEM FROM cotizaciones_detalle WHERE COTI_ID = :ID INTO :ITEM
            DO
            BEGIN
            EXECUTE PROCEDURE FALTANTE_CORTE(:TIPOORI, :TIPODES, :ID, :ITEM, :CORTE) returning_values (:FALTA, :UNIDAD, :FACTOR);
            FALTANTE = FALTANTE + FALTA;
            TOTPRE = TOTPRE + FALTA * PRUNIT;
            EXECUTE PROCEDURE costo_promedio_unidad(:ARTICULO, :FECHA, :unidad) returning_values (:COSTO);
            TOTCOS = TOTCOS + FALTA * COSTO;
            END
        if (TIPODES = 31) then
            FOR SELECT PREF_PRE || FACT_NUMERO FROM FACTURAS F, consolidado_faltantes C
                WHERE F.fact_consolida = C.cofa_id AND C.cofa_tipoori = 35 AND C.cofa_idori = :ID AND
                C.cofa_tipodes = 31 AND C.cofa_cantcr <> 0 AND FACT_ANULADO = 'N'
                INTO :num
                DO
                if (strlen(NUMCRUCE) < 47) then
                    NUMCRUCE = NUMCRUCE || NUM || '-';
        if (TIPODES = 32) then
            FOR SELECT PREF_PRE || REVT_NUMERO FROM remisiones_venta F, consolidado_faltantes C
                WHERE F.revt_consolida = C.cofa_id AND C.cofa_tipoori = 35 AND C.cofa_idori = :ID AND
                C.cofa_tipodes = 32 AND C.cofa_cantcr <> 0 AND REVT_ANULADO = 'N'
                INTO :num
                DO
                if (strlen(NUMCRUCE) < 50) then
                    NUMCRUCE = NUMCRUCE || NUM || '-';
        if (TIPODES = 34) then
            FOR SELECT PREF_PRE || PEDI_NUMERO FROM PEDIDOS F, consolidado_faltantes C
                WHERE F.pedi_consolida = C.cofa_id AND C.cofa_tipoori = 35 AND C.cofa_idori = :ID AND
                C.cofa_tipodes = 34 AND C.cofa_cantcr <> 0 AND PEDI_ANULADO = 'N'
                INTO :num
                DO
                if (strlen(NUMCRUCE) < 50) then
                    NUMCRUCE = NUMCRUCE || NUM || '-';
        if ((SOLOFALT = 'N') or (FALTANTE <> 0)) then
            SUSPEND;
        END
  if (TIPOORI = 40) then
    FOR SELECT P.pend_id, P.PREF_PRE, PEND_NUMERO, PEND_FECHA, PEND_FECHA VENCE, P.TERC_NIT,
    PEND_NOMCLI, SUBSTRING(PEND_OBS FROM 1 FOR 255), P.VEND_COD, P.pend_total
      FROM pendiente_ventas P, PREFIJOS PR
      WHERE PEND_FECHA >= :FECINI AND PEND_FECHA <= :FECFIN AND PEND_ANULADO = 'N'
       AND PR.PREF_PRE = P.PREF_PRE AND PR.TIDO_COD = 40 AND ((PR.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
      ORDER BY PEND_FECHA, P.PREF_PRE, PEND_NUMERO
      INTO :ID, :PREFIJO, :NUMERO, :FECHA, :VENCE, :NIT, :NOMCLIENTE, :OBS, :VEND, :PRECIO
      DO
        BEGIN
        NUMCRUCE = '';
        SELECT VEND_NOMBRE FROM VENDEDORES WHERE VEND_COD = :VEND INTO :NOMVEND;
        if (TIPODES = 32) then
            SELECT FIRST 1 PREF_PRE || REVT_NUMERO FROM remisiones_venta F, consolidado_faltantes C
                WHERE F.revt_consolida = C.cofa_id AND C.cofa_tipoori = 40 AND C.cofa_idori = :ID AND
                C.cofa_tipodes = 32 AND C.cofa_ok = 'S' AND REVT_ANULADO = 'N'
                INTO :numcruce;
        if ((SOLOFALT = 'N') or (FALTANTE <> 0)) then
          SUSPEND;
        END
  END
END
^

SET TERM ; ^

/* 20140512 */

/* COLORES FINALES CONFIGURABLES */
INSERT INTO CONFIGURACION (CONF_MODULO, CONF_CATEGORIA, CONF_PROPIEDAD, CONF_VALOR, CONF_POSIBLES, CONF_AYUDA) VALUES ('FACTURACION', 'GENERAL', 'COLOR FINAL VENTANA PRINCIPAL', '$00FF8077', '0x00000-0xFFFFFF', 'Indique el color en formato RGB que quiere de fondo en la ventana principal del módulo');
INSERT INTO CONFIGURACION (CONF_MODULO, CONF_CATEGORIA, CONF_PROPIEDAD, CONF_VALOR, CONF_POSIBLES, CONF_AYUDA) VALUES ('INVENTARIO', 'GENERAL', 'COLOR FINAL VENTANA PRINCIPAL', '$001ADC77', '0x00000-0xFFFFFF', 'Indique el color en formato RGB que quiere de fondo en la ventana principal del módulo');
INSERT INTO CONFIGURACION (CONF_MODULO, CONF_CATEGORIA, CONF_PROPIEDAD, CONF_VALOR, CONF_POSIBLES, CONF_AYUDA) VALUES ('CONTABILIDAD', 'GENERAL', 'COLOR FINAL VENTANA PRINCIPAL', '0xFF0077', '0x00000-0xFFFFFF', 'Indique el color en formato RGB que quiere de fondo en la ventana principal del módulo');
INSERT INTO CONFIGURACION (CONF_MODULO, CONF_CATEGORIA, CONF_PROPIEDAD, CONF_VALOR, CONF_POSIBLES, CONF_AYUDA) VALUES ('CARTERA', 'GENERAL', 'COLOR FINAL VENTANA PRINCIPAL', '$00007977', '0x00000-0xFFFFFF', 'Indique el color en formato RGB que quiere de fondo en la ventana principal del módulo');
INSERT INTO CONFIGURACION (CONF_MODULO, CONF_CATEGORIA, CONF_PROPIEDAD, CONF_VALOR, CONF_POSIBLES, CONF_AYUDA) VALUES ('CXPAGAR', 'GENERAL', 'COLOR FINAL VENTANA PRINCIPAL', '$00000077', '0x00000-0xFFFFFF', 'Indique el color en formato RGB que quiere de fondo en la ventana principal del módulo');
INSERT INTO CONFIGURACION (CONF_MODULO, CONF_CATEGORIA, CONF_PROPIEDAD, CONF_VALOR, CONF_POSIBLES, CONF_AYUDA) VALUES ('COMPRAS', 'GENERAL', 'COLOR FINAL VENTANA PRINCIPAL', '$00FF0077', '0x00000-0xFFFFFF', 'Indique el color en formato RGB que quiere de fondo en la ventana principal del módulo');
INSERT INTO CONFIGURACION (CONF_MODULO, CONF_CATEGORIA, CONF_PROPIEDAD, CONF_VALOR, CONF_POSIBLES, CONF_AYUDA) VALUES ('CAJA', 'GENERAL', 'COLOR FINAL VENTANA PRINCIPAL', '$000AB777', '0x00000-0xFFFFFF', 'Indique el color en formato RGB que quiere de fondo en la ventana principal del módulo');

/* 20140513 */
/* NO VALIDE RESERVA DE ARTICULOS QUE NO TIENEN CONTROL EXISTENCIAS */
/* VALIDE ANTES DE GRABAR YA QUE DESPUES YA EXISTE LA RESERVA */
SET TERM ^ ;

CREATE OR ALTER TRIGGER PEDIDOS_DETALLE_BI FOR PEDIDOS_DETALLE
ACTIVE BEFORE INSERT POSITION 0
AS
declare variable FECHA DATE;
declare variable EXRES VARCHAR(8);
declare variable EXISTEN numeric(18,4);
declare variable RESERVA numeric(18,4);
DECLARE VARIABLE EXIS CHAR(1);
BEGIN
/* VALIDE LA RESERVA */
EXECUTE procedure LEE_CONFIGURACION ('INVENTARIO','EXISTENCIAS','ACCION A TOMAR SI LA EXISTENCIA ESTA RESERVADA') returning_values (EXRES);
if (EXRES = 'PROHIBIR') then
    BEGIN
    SELECT ARTI_EXIST FROM ARTICULO WHERE ARTI_COD = NEW.ARTI_COD INTO :EXIS;
    IF (EXIS <> 'N') THEN
        BEGIN
        SELECT PEDI_FECHA FROM PEDIDOS WHERE PEDI_ID = NEW.PEDI_ID INTO :FECHA;
        EXECUTE PROCEDURE existencia_bodega(NEW.arti_cod, :fecha,  NEW.bode_cod) returning_values (:existen, :reserva);
        if ((NEW.pede_cant * NEW.pede_factor) > (:existen - :reserva)) then
            exception existencia_insuficiente 'La existencia del artículo ' || new.arti_cod || ' esta reservada. Cantidad:' || (new.pede_cant * new.pede_factor) || ' disponible:' || (:existen-:reserva);
        END
    END
  /* CALCULE LO POR LIBERAR */
  EXECUTE PROCEDURE factor_unidad_cant_excep(NEW.ARTI_COD, NEW.pede_unidad) returning_values (new.pede_factor);
  NEW.pede_reserva = NEW.pede_cant * new.pede_factor;
  if (NEW.pede_dtoporc IS NULL) then
    NEW.pede_dtoporc = 0;
  /* CALCULE EL MONTO DEL DESCUENTO */
  NEW.PEDE_DTOMONTO = NEW.pede_prunit * NEW.pede_dtoporc / 100;
if (new.bode_cod is null) then
    new.bode_cod = '01';
if (new.pede_devuelto is null) then
    new.pede_devuelto = 0;
SELECT PRAR_FIJO FROM PRECIOS_ARTICULO WHERE LIPR_COD = NEW.lipr_cod AND ARTI_COD = NEW.arti_cod INTO NEW.pede_prlista;
if (NEW.pede_desc IS NULL) then
    SELECT ARTI_DES FROM ARTICULO WHERE ARTI_COD = NEW.arti_cod INTO NEW.pede_desc;
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER TRIGGER PEDIDOS_DETALLE_AI FOR PEDIDOS_DETALLE
ACTIVE AFTER INSERT POSITION 0
as
declare variable CONSO CHAR(2);
declare variable CONSOLIDA INTEGER;
declare variable IDENTR INTEGER;
declare variable COSTO NUMERIC(18,2);
declare variable IVA NUMERIC(9,2);
declare variable IVAM NUMERIC(18,2);
declare variable CONSUMO NUMERIC(18,2);
declare variable STAND VARCHAR(20);
declare variable LOTE VARCHAR(15);
declare variable FECHA DATE;
declare variable VLOTE DATE;
declare variable CANTAUX numeric(18,4);
declare variable CANT numeric(18,4);
declare variable ITEM integer;
declare variable EXAR CHAR(1);
begin
if ((NEW.pedi_id <> 0) AND (NEW.pede_anulado = 'N')) then
    BEGIN
    SELECT PEDI_CONSOLIDA, PEDI_IDENTR, PEDI_FECHA FROM PEDIDOS WHERE PEDI_ID = NEW.PEDI_ID INTO :CONSOLIDA, :IDENTR, :FECHA;
    if (CONSOLIDA <> 0) then
        begin
        EXECUTE procedure LEE_CONFIGURACION ('FACTURACION','DOCUMENTOS','DEJAR PENDIENTES LOS ARTICULOS NO INCLUIDOS AL TRAER DOCUMENTOS RELACIONADOS') returning_values (CONSO);
        if (CONSO = 'NO') then
            update consolidado_faltantes set COFA_IDDES = new.pedi_id, COFA_CANTCR = COFA_CANT * COFA_FACTOR, COFA_FECDES = :FECHA
                where COFA_ID = :consolida AND ARTI_COD = NEW.ARTI_COD;
        else
            BEGIN
            CANTAUX = new.pede_cant * new.pede_factor;
            for select COFA_ITEM, ((COFA_CANT * COFA_FACTOR)-COFA_CANTCR) from consolidado_faltantes
                where COFA_ID = :CONSOLIDA and ARTI_COD = new.ARTI_COD
                into :ITEM, :CANT
                do
                begin
                if ((CANTAUX > 0) and (CANT > 0))then
                    if (CANT < CANTAUX) then
                        begin
                        update consolidado_faltantes
                            set COFA_IDDES = new.pedi_id, COFA_CANTCR = COFA_CANT * COFA_FACTOR, COFA_FECDES = :FECHA
                            where COFA_ID = :consolida and COFA_ITEM = :ITEM;
                        CANTAUX = CANTAUX - CANT;
                        end
                    else
                        begin
                        update consolidado_faltantes
                            set COFA_IDDES = new.pedi_id, COFA_CANTCR = COFA_CANTCR + :CANTAUX, COFA_FECDES = :FECHA
                            where COFA_ID = :consolida and COFA_ITEM = :ITEM;
                        CANTAUX = 0;
                        end
                end
            END
        end
    if (IDENTR <> 0) then
        begin
        EXECUTE PROCEDURE costo_promedio_unidad(NEW.arti_cod, :FECHA, NEW.pede_unidad) returning_values (:COSTO);
        SELECT ARTI_CONSUMO, TAIV_PORC, ARTI_EXIST FROM ARTICULO A, TARIFA_IVA T
            WHERE A.taiv_cod = T.taiv_cod AND A.arti_cod = NEW.arti_cod INTO :consumo, :iva, :EXAR;
        IVAM = COSTO * IVA;
        if (EXAR = 'L') then
            BEGIN
            EXECUTE PROCEDURE seleccione_lote (NEW.arti_cod, NEW.bode_cod, NEW.pede_cant * NEW.pede_factor) returning_values (:LOTE);
            SELECT LOTE_VENCE FROM LOTES WHERE (ARTI_COD = NEW.arti_cod) AND (BODE_COD = NEW.bode_cod) AND (LOTE_NRO = :LOTE) INTO :VLOTE;
            END
        ELSE
            BEGIN
            LOTE = NULL;
            VLOTE = NULL;
            END
        SELECT STAND_COD FROM STANDS WHERE ARTI_COD = NEW.arti_cod AND STAND_BODEGA = NEW.bode_cod INTO :STAND;
        INSERT INTO ENTRADAS_DETALLE (ENTR_ID, ENDE_ITEM, ARTI_COD, BODE_COD, ENDE_CANT, ENDE_UNIDAD, ENDE_COSTO,
            ENDE_LOTE, ENDE_FACTOR, ENDE_DESC, ENDE_OBS, ENDE_DTOPORC, ENDE_DTOMONTO, ENDE_IVAPORC, ENDE_IVAMONTO,
            ENDE_CONSUMO, ENDE_CODBAR, ENDE_TOTAL, ENDE_ANULADO, ENDE_TRANSMIT, LOTE_VENCE, ENDE_STAND)
            VALUES(:IDENTR, NEW.pede_item, NEW.arti_cod, NEW.bode_cod, NEW.pede_cant, NEW.pede_unidad, :COSTO,
            :LOTE, NEW.pede_factor, NEW.pede_desc, NEW.pede_obs, 0, 0, :IVA, :IVAM,
            :CONSUMO, NEW.pede_codbar, :COSTO * NEW.pede_cant * NEW.pede_factor, 'N', 'N', :VLOTE, :STAND);
        end
    END
end
^

SET TERM ; ^

/* 20140513B */
/* no anulaba el pedido por la diferencia de digitos del numero */
SET TERM ^ ;

CREATE OR ALTER TRIGGER FACTURAS_AU FOR FACTURAS
ACTIVE AFTER UPDATE POSITION 0
AS
declare variable ABONOS integer;
declare variable AUX VARCHAR(100);
declare variable CONC VARCHAR(60);
declare variable PEDAUTO CHAR(2);
declare variable DIAS INTEGER;
declare variable NUMERO VARCHAR(8);
declare variable AUTOM CHAR(1);
declare variable NUMROWS INTEGER;
declare variable consec INTEGER;
declare variable ESPOS CHAR(1);
declare variable UNIVND CHAR(2);
BEGIN
/* borre la contabilización */
if (NEW.fact_anulado = 'S') then
    BEGIN
    select enco_consec from comprobante_encabezado where enco_tiporef = 31 and enco_idref = old.fact_id into :consec;
    if (NOT consec is null) then
      delete from comprobante_detalle where enco_consec = :consec;
    delete from comprobante_encabezado where enco_tiporef = 31 and enco_idref = old.fact_id;

    DELETE FROM puntos_cliente WHERE PTCL_TIPODOC = 31 AND PTCL_IDDOC = OLD.fact_id;
    DELETE FROM envio_resumdia WHERE ENRE_FACTID = OLD.fact_id;
    delete from crm_eventos where crev_tipo = 901 and crev_origen = old.fact_id;

    INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
        VALUES (USER, 31, NEW.fact_id, 'A', NEW.pref_pre || NEW.fact_numero);
    END
EXECUTE PROCEDURE LEE_CONFIGURACION('FACTURACION','FACTURAS','GENERAR PEDIDO AUTOMATICAMENTE CON LA FACTURA') RETURNING_VALUES (PEDAUTO);
SELECT MIN(AUTO_ESPOS) FROM AUTORIZACIONES WHERE PREF_PRE = NEW.pref_pre INTO :ESPOS;
if (ESPOS = 'S') then
    PEDAUTO = 'NO';
/* BORRE EL REGISTRO PREVIO */
if ((old.FACT_id <> 0) and (old.fact_anulado = 'N') AND (((OLD.fact_transmit = 'S') and (NEW.fact_transmit = 'N')) or (NEW.fact_anulado = 'S')) ) then
    begin
    /* VERIFIQUE QUE NO HAY DEVOLUCIONES */
    SELECT COUNT(*) FROM DEVOLUCIONES_VENTAS WHERE DEVT_FACTID = OLD.fact_id AND DEVT_ANULADO = 'N' INTO :abonos;
    if (abonos > 0) then
        exception documento_devuelto 'La factura ' || old.pref_pre || old.fact_numero || ' tiene devoluciones registradas.';

    /* Verifique si habia abonos a la nota */
    ABONOS = 0;
    select COUNT(*) FROM SALDOS_DOC_CARTERA WHERE SDCA_TIPOREF = 31 AND SDCA_IDREF = OLD.FACT_ID AND SDCA_ABONO <> 0 INTO :ABONOS;
    if (ABONOS = 0) then
        BEGIN
        /* BORRE EL REGISTRO PREVIO */
        delete from saldos_doc_cartera where sdca_tiporef = 31 and sdca_idref = old.fact_id;
        delete from movimiento_clientes where (mvcl_tiporef = 31) and (mvcl_idref = old.fact_id);
        if (PEDAUTO = 'SI') then
            BEGIN
            /* INTENTE ANULAR EL PEDIDO DEL MISMO NUMERO */
            UPDATE PEDIDOS SET PEDI_ANULADO = 'S' WHERE PREF_PRE = OLD.pref_pre AND PEDI_NUMERO = right(OLD.fact_numero,6);
            END
        END
    else
        exception DOCUMENTO_CON_ABONOS 'La factura ' || old.pref_pre || old.fact_numero || ' tiene abonos registrados.';
    end
if ((NEW.FACT_ID <> 0) AND (new.fact_anulado = 'N')) then
    BEGIN
    if (OLD.fact_id = 0) then
        BEGIN
        /* actualice el prefijo si se pasaron de una hoja impresa */
        execute procedure lee_configuracion('FACTURACION','FACTURAS','INCREMENTAR NUMERACION AUTOMATICAMENTE EN FACTURAS DE VARIAS HOJAS') returning_values (:CONC);
        if (CONC = 'SI') then
            BEGIN
            select FORM_NROITEMS from FORMATOS where tido_cod = 31 and pref_pre = new.pref_pre into :dias;
            select count(*) from facturas_detalle where fact_id = old.fact_id into :numrows;
            if (numrows > dias) then
                begin
                SELECT PREF_ACTUAL, PREF_AUTO FROM PREFIJOS WHERE TIDO_COD = 31 AND PREF_PRE = NEW.PREF_PRE INTO :NUMERO, :AUTOM;
                if (AUTOM = 'S' or NUMERO = NEW.fact_numero) then
                    BEGIN
                    NUMROWS = CAST(NUMERO AS INTEGER) + DIV(numrows,dias);
                    NUMERO = CAST(NUMROWS AS CHAR(8));
                    update prefijos set pref_actual = :NUMERO WHERE TIDO_COD = 31 AND PREF_PRE = NEW.PREF_PRE;
                    END
                end
            END
        END

    if ((OLD.fact_transmit = 'S') and (NEW.fact_transmit = 'N')) then
        BEGIN
        AUX = 'FACTURA DE VENTA No.' || NEW.PREF_PRE || NEW.FACT_NUMERO || '-' || SUBSTRING(NEW.FACT_NOMCLIENTE FROM 1 FOR 29);
        if (STRLEN(AUX) > 60) then
            CONC = SUBSTR(AUX, 1, 60);
        else
            CONC = AUX;
        INSERT INTO MOVIMIENTO_CLIENTES (MVCL_ID, TERC_NIT, MVCL_TIPOREF, MVCL_IDREF, MVCL_FECHA, MVCL_VENCE, MVCL_CONC, MVCL_MONTO, MVCL_RTEFTE, MVCL_RTEIVA, MVCL_RTEICA, MVCL_RCREE, MVCL_DEBITO, MVCL_ABONO, MVCL_PREFREF, MVCL_NUMREF, MVCL_SUCURSAL, COBR_COD, MVCL_TRM)
            VALUES (GEN_ID(ID_MOVCLI, 1), NEW.TERC_NIT, 31, NEW.FACT_ID, NEW.FACT_FECHA, NEW.fact_vence, :CONC, NEW.FACT_TOTAL, NEW.FACT_RTFTEMONTO, NEW.FACT_RTIVAMONTO, NEW.FACT_RTICAMONTO, NEW.fact_rtcreem, 'S', 'N', NEW.pref_pre, NEW.FACT_numero, NEW.fact_sucursal, NEW.cobr_cod, NEW.fact_trm);
        /* Registre el nuevo saldo del documento */
        INSERT INTO SALDOS_DOC_CARTERA (SDCA_TIPOREF, SDCA_IDREF, SDCA_FECHA, TERC_NIT, SDCA_RTFTE, SDCA_RTIVA, SDCA_RTICA, SDCA_RCREE, SDCA_ABONO, SDCA_ABRTFTE, SDCA_ABRTIVA, SDCA_ABRTICA, SDCA_ABRCREE, SDCA_DEBITO, SDCA_MONTO, SDCA_TRM)
            VALUES (31, NEW.FACT_ID, NEW.FACT_fecha, NEW.terc_nit, NEW.FACT_rtftemonto, NEW.FACT_rtivamonto, NEW.FACT_rticamonto, NEW.fact_rtcreem, 0, 0, 0, 0, 0, 'S', NEW.FACT_TOTAL, NEW.fact_trm);
        if (PEDAUTO = 'SI') then
            BEGIN
            EXECUTE PROCEDURE LEE_CONFIGURACION('FACTURACION','PEDIDOS','DIAS DE VALIDEZ') RETURNING_VALUES (DIAS);
            INSERT INTO PEDIDOS (PEDI_ID, TERC_NIT, VEND_COD, TIDO_COD, PREF_PRE, PEDI_NUMERO, PEDI_FECHA, PEDI_VALIDEZ, PEDI_DESPACHO, PEDI_OBS, PEDI_IVAINC, PEDI_NOMTERC, PEDI_DTOPOR, PEDI_DTOMONTO, PEDI_ADICIONAL, PEDI_IVAMONTO, PEDI_EXTRA, PEDI_TOTAL, PEDI_ANULADO, PEDI_TRANSMIT, PTVT_ID, PEDI_COTIZACI, PEDI_RTFTEPORC, PEDI_RTFTEMONTO, PEDI_RTIVAPORC, PEDI_RTIVAMONTO, PEDI_RTICAPORC, PEDI_RTICAMONTO, PEDI_SUCURSAL)
                VALUES (GEN_ID(ID_PEDIDO, 1), NEW.TERC_NIT, NEW.VEND_COD, 34, NEW.PREF_PRE, NEW.FACT_NUMERO, NEW.FACT_FECHA, :DIAS, NEW.FACT_DESPACHO, NEW.FACT_OBS, NEW.FACT_IVAINC, NEW.FACT_NOMCLIENTE, NEW.FACT_DTOPOR, NEW.FACT_DTOMONTO, NEW.FACT_ADICIONAL, NEW.FACT_IVAMONTO, NEW.FACT_EXTRA, NEW.FACT_TOTAL, 'N', 'N', NEW.PTVT_ID, NULL, NEW.FACT_RTFTEPOR, NEW.FACT_RTFTEMONTO, NEW.FACT_RTIVAPOR, NEW.FACT_RTIVAMONTO, NEW.FACT_RTICAPOR, NEW.FACT_RTICAMONTO, NEW.fact_sucursal);
            END
        INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
            VALUES (USER, 31, NEW.fact_id, 'U', NEW.pref_pre || NEW.fact_numero);
        END
    end
/* SI CAMBIA VENDEDOR O VENCIMIENTO ACTUALICE EL MOVIMIENTO_CLIENTE */
if ((OLD.cobr_cod <> NEW.cobr_cod) or (OLD.fact_vence <> NEW.fact_vence))  then
    BEGIN
    UPDATE movimiento_clientes M SET M.cobr_cod = NEW.cobr_cod, M.mvcl_vence = NEW.fact_vence
        WHERE M.mvcl_tiporef = 31 AND M.mvcl_idref = NEW.fact_id;
    END
/* SI CAMBIA EL NUEMRO O LA FECHA CAMBIE EL DETALLE */
if ((OLD.pref_pre <> NEW.pref_pre) or
    (OLD.fact_numero <> NEW.fact_numero) or
    (OLD.fact_fecha <> NEW.fact_fecha)) then
    UPDATE FACTURAS_DETALLE SET FADE_TRANSMIT = 'N' WHERE FACT_ID = NEW.FACT_ID;
/* ACTUALICE EL ANULADO EN LOS DETALLES */
if (OLD.FACT_anulado <> NEW.FACT_anulado) then
    UPDATE FACTURAS_DETALLE SET FADE_ANULADO = NEW.FACT_anulado WHERE FACT_ID = NEW.FACT_ID;
if ((OLD.fact_transmit = 'S') AND (OLD.fact_transmit <> NEW.fact_transmit)) then
    UPDATE FACTURAS_DETALLE SET FADE_TRANSMIT = NEW.fact_transmit WHERE FACT_ID = NEW.FACT_ID;
END
^

SET TERM ; ^

/* 20140513C */
/* CONTABILICE Y MUESTRE EL REPORTE DE COMPROBANTES CON EL COSTO PROMEDIO Y NO CON EL COSTO DE LA SALIDA/ENSAMBLE */
SET TERM ^ ;

CREATE OR ALTER procedure COSTO_EN_VENTAS (
    TIPO integer,
    ID integer)
AS
declare variable FECHA DATE;
declare variable ARTICULO VARCHAR(20);
declare variable CANTIDAD NUMERIC(18,4);
declare variable COSTO NUMERIC(18,2);
declare variable CTACOSTO VARCHAR(20);
declare variable CTAINVEN VARCHAR(20);
declare variable ITEM INTEGER;
BEGIN
DELETE FROM COSTO_VENTAS WHERE TIDO_COD = :TIPO AND COVE_ID = :ID;
if (TIPO = 12) then
    BEGIN
    FOR SELECT D.ARTI_COD, SADE_CANT * SADE_FACTOR, SALI_FECHA, sade_item
        FROM ARTICULO A, SALIDAS F, SALIDAS_DETALLE D
        WHERE F.sali_id = D.sali_id AND A.ARTI_COD = D.ARTI_COD AND F.sali_id = :ID AND SALI_ANULADO = 'N' AND SADE_CANT <> 0
        INTO :ARTICULO, :CANTIDAD, :FECHA, :ITEM
        DO
        BEGIN
        SELECT coar_ctaivav, COAR_CTAINV FROM CONTABIL_ARTICULO C WHERE ARTI_COD = :articulo INTO :CTACOSTO, :CTAINVEN;
        if (EXISTS (SELECT COST_SALP / COST_SALC FROM COSTOS C, MOVIMIENTO_ARTICULO M
                WHERE C.arti_cod = M.arti_cod AND COST_IDMOV = MVAR_CONS AND MVAR_TIPODOC = 12 AND MVAR_IDREF = :ID AND COST_SALC <> 0 AND MVAR_ITEM = :ITEM)) then
            SELECT COST_SALP / COST_SALC FROM COSTOS C, MOVIMIENTO_ARTICULO M
                WHERE C.arti_cod = M.arti_cod AND COST_IDMOV = MVAR_CONS AND MVAR_TIPODOC = 12 AND MVAR_IDREF = :ID AND COST_SALC <> 0 AND MVAR_ITEM = :ITEM INTO :COSTO;
        else
            EXECUTE PROCEDURE COSTO_PROMEDIO(:ARTICULO, :FECHA) returning_values (:COSTO);
        INSERT INTO COSTO_VENTAS (TIDO_COD, COVE_ID, ARTI_COD, CANT, COSTO,  CTACOS, CTAINV, COVE_ITEM)
            VALUES (:TIPO, :ID, :ARTICULO, :CANTIDAD, :COSTO, :CTACOSTO, :CTAINVEN, :ITEM);
        END
    end
if (TIPO = 15) then
    BEGIN
    FOR SELECT D.ARTI_COD, ESDE_CANT * ESDE_FACTOR, ENSA_FECHA, esde_item
        FROM ARTICULO A, ensambles e, ensambles_detalle D
        WHERE e.ensa_id = D.ensa_id AND A.ARTI_COD = D.ARTI_COD AND e.ensa_id = :ID AND ENSA_ANULADO = 'N' AND ESDE_CANT <> 0
        INTO :ARTICULO, :CANTIDAD, :FECHA, :ITEM
        DO
        BEGIN
        SELECT coar_ctaivav, COAR_CTAINV FROM CONTABIL_ARTICULO C WHERE ARTI_COD = :articulo INTO :CTACOSTO, :CTAINVEN;
        if (EXISTS (SELECT COST_SALP / COST_SALC FROM COSTOS C, MOVIMIENTO_ARTICULO M
                WHERE C.arti_cod = M.arti_cod AND COST_IDMOV = MVAR_CONS AND MVAR_TIPODOC = 15 AND MVAR_IDREF = :ID AND COST_SALC <> 0 AND MVAR_ITEM = :ITEM)) then
            SELECT COST_SALP / COST_SALC FROM COSTOS C, MOVIMIENTO_ARTICULO M
                WHERE C.arti_cod = M.arti_cod AND COST_IDMOV = MVAR_CONS AND MVAR_TIPODOC = 15 AND MVAR_IDREF = :ID AND COST_SALC <> 0 AND MVAR_ITEM = :ITEM INTO :COSTO;
        else
            EXECUTE PROCEDURE COSTO_PROMEDIO(:ARTICULO, :FECHA) returning_values (:COSTO);
        INSERT INTO COSTO_VENTAS (TIDO_COD, COVE_ID, ARTI_COD, CANT, COSTO,  CTACOS, CTAINV, COVE_ITEM)
            VALUES (:TIPO, :ID, :ARTICULO, :CANTIDAD, :COSTO, :CTACOSTO, :CTAINVEN, :ITEM);
        END
    end
if (TIPO = 31) then
    BEGIN
    /* FACTURA DE VENTA */
    FOR SELECT D.ARTI_COD, FADE_CANT * FADE_FACTOR, FACT_FECHA, fade_item
        FROM ARTICULO A, FACTURAS F, FACTURAS_DETALLE D
        WHERE F.FACT_ID = D.FACT_ID AND A.ARTI_COD = D.ARTI_COD AND F.FACT_ID = :ID AND FACT_ANULADO = 'N' AND FADE_CANT <> 0
        INTO :ARTICULO, :CANTIDAD, :FECHA, :ITEM
        DO
        BEGIN
        SELECT COAR_CTACOS, COAR_CTAINV FROM CONTABIL_ARTICULO WHERE ARTI_COD = :articulo INTO :CTACOSTO, :CTAINVEN;
        if (EXISTS (SELECT COST_SALP / COST_SALC FROM COSTOS C, MOVIMIENTO_ARTICULO M
                WHERE C.arti_cod = M.arti_cod AND COST_IDMOV = MVAR_CONS AND MVAR_TIPODOC = 31 AND MVAR_IDREF = :ID AND COST_SALC <> 0 AND MVAR_ITEM = :ITEM)) then
            SELECT COST_SALP / COST_SALC FROM COSTOS C, MOVIMIENTO_ARTICULO M
                WHERE C.arti_cod = M.arti_cod AND COST_IDMOV = MVAR_CONS AND MVAR_TIPODOC = 31 AND MVAR_IDREF = :ID AND COST_SALC <> 0 AND MVAR_ITEM = :ITEM
                INTO :COSTO;
        else
            EXECUTE PROCEDURE COSTO_PROMEDIO(:ARTICULO, :FECHA) returning_values (:COSTO);
        INSERT INTO COSTO_VENTAS (TIDO_COD, COVE_ID, ARTI_COD, CANT, COSTO,  CTACOS, CTAINV, COVE_ITEM)
            VALUES (:TIPO, :ID, :ARTICULO, :CANTIDAD, :COSTO, :CTACOSTO, :CTAINVEN, :ITEM);
        END
    END
if (TIPO = 32) then
    BEGIN
    /* REMISION */
    FOR SELECT D.ARTI_COD, RVDE_CANT * RVDE_FACTOR, REVT_FECHA, RVDE_ITEM
        FROM ARTICULO A, REMISIONES_VENTA R, REMISIONES_VENTA_DETALLE D
        WHERE R.REVT_ID = D.REVT_ID AND A.ARTI_COD = D.ARTI_COD AND R.REVT_ID = :ID AND REVT_ANULADO = 'N' AND RVDE_CANT <> 0
        INTO :ARTICULO, :CANTIDAD, :FECHA, :ITEM
        DO
        BEGIN
        SELECT COAR_CTACOS, COAR_CTAINV FROM CONTABIL_ARTICULO WHERE ARTI_COD = :articulo INTO :CTACOSTO, :CTAINVEN;
        if (EXISTS (SELECT COST_SALP / COST_SALC FROM COSTOS C, MOVIMIENTO_ARTICULO M
                WHERE C.arti_cod = M.arti_cod AND COST_IDMOV = MVAR_CONS AND MVAR_TIPODOC = 32 AND MVAR_IDREF = :ID AND COST_SALC <> 0 AND MVAR_ITEM = :ITEM)) then
            SELECT COST_SALP / COST_SALC FROM COSTOS C, MOVIMIENTO_ARTICULO M
                WHERE C.arti_cod = M.arti_cod AND COST_IDMOV = MVAR_CONS AND MVAR_TIPODOC = 31 AND MVAR_IDREF = :ID AND COST_SALC <> 0 AND MVAR_ITEM = :ITEM INTO :COSTO;
        else
            EXECUTE PROCEDURE COSTO_PROMEDIO(:ARTICULO, :FECHA) returning_values (:COSTO);
        INSERT INTO COSTO_VENTAS (TIDO_COD, COVE_ID, ARTI_COD, CANT, COSTO,  CTACOS, CTAINV, COVE_ITEM)
            VALUES (:TIPO, :ID, :ARTICULO, :CANTIDAD, :COSTO, :CTACOSTO, :CTAINVEN, :ITEM);
        END
    END
if (TIPO = 33) then
    BEGIN
    /* DEVOLUCION */
    FOR SELECT D.ARTI_COD, DVDE_CANT * DVDE_FACTOR, DEVT_FECHA, DVDE_ITEM
        FROM ARTICULO A, DEVOLUCIONES_VENTAS DV, DEVOLUCIONES_VENTAS_DETALLE D
        WHERE DV.DEVT_ID = D.DEVT_ID AND A.ARTI_COD = D.ARTI_COD AND DV.DEVT_ID = :ID AND DEVT_ANULADO = 'N' AND DVDE_CANT <> 0
        INTO :ARTICULO, :CANTIDAD, :FECHA, :ITEM
        DO
        BEGIN
        SELECT COAR_CTACOS, COAR_CTAINV FROM CONTABIL_ARTICULO WHERE ARTI_COD = :articulo INTO :CTACOSTO, :CTAINVEN;
        if (EXISTS (SELECT COST_ENTP / COST_ENTC FROM COSTOS C, MOVIMIENTO_ARTICULO M
                WHERE C.arti_cod = M.arti_cod AND COST_IDMOV = MVAR_CONS AND MVAR_TIPODOC = 33 AND MVAR_IDREF = :ID AND COST_ENTC <> 0 AND MVAR_ITEM = :ITEM)) then
            SELECT COST_ENTP / COST_ENTC FROM COSTOS C, MOVIMIENTO_ARTICULO M
                WHERE C.arti_cod = M.arti_cod AND COST_IDMOV = MVAR_CONS AND MVAR_TIPODOC = 33 AND MVAR_IDREF = :ID AND COST_ENTC <> 0 AND MVAR_ITEM = :ITEM INTO :COSTO;
        else
            EXECUTE PROCEDURE COSTO_PROMEDIO(:ARTICULO, :FECHA) returning_values (:COSTO);
        INSERT INTO COSTO_VENTAS (TIDO_COD, COVE_ID, ARTI_COD, CANT, COSTO,  CTACOS, CTAINV, COVE_ITEM)
            VALUES (:TIPO, :ID, :ARTICULO, :CANTIDAD, :COSTO, :CTACOSTO, :CTAINVEN, :ITEM);
        END
    END
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE CONTABILICE_COSTO_VENTAS(
    TIPO INTEGER,
    ID INTEGER,
    IDINTER INTEGER)
RETURNS (
    IDC INTEGER)
AS
declare variable PREF VARCHAR(4);
declare variable NUM VARCHAR(8);
declare variable NUMERO VARCHAR(12);
declare variable INVEN CHAR(1);
declare variable CTAINVEN VARCHAR(20);
declare variable COSTOS CHAR(1);
declare variable CTACOSTOS 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 ART VARCHAR(15);
declare variable ANULADO CHAR(1);
declare variable NROI INTEGER;
declare variable NUMROWS INTEGER;
declare variable CONC CHAR(120);
declare variable VENCEAUX DATE;
declare variable VENCE CHAR(8);
declare variable IDREM INTEGER;
declare variable IDPED INTEGER;
declare variable CENT CHAR(1);
declare variable ERRORC INTEGER;
begin
IDC = 0;
/* TRAIGA EL ID DEL ENCABEZADO DEL COMPROBANTE CONTABLE */
SELECT ENCO_CONSEC FROM COMPROBANTE_ENCABEZADO WHERE ENCO_TIPOREF = :TIPO AND ENCO_IDREF = :ID INTO :IDC;
if (IDC <> 0) then
    BEGIN
    SELECT MAX(CODE_ITEM) FROM COMPROBANTE_DETALLE WHERE ENCO_CONSEC = :idc INTO :NROI;
    NROI = NROI + 1;
    /* EJECUTE LA PARTE DE CONTABIL_FACTURA QUE CORRESPONDE A LOS COSTOS */
    EXISTE = 'N';
    SELECT 'S', INVE_COSTO, INVE_INVEN, INVE_CTAINVEN, INVE_CTACOSTOS, INVE_CENTRO
        FROM INTERFAZ_VENTAS
        WHERE INVE_ID = :IDINTER
        INTO :EXISTE, :COSTOS, :INVEN, :CTAINVEN, :CTACOSTOS, :cent;
    if (EXISTE = 'S') then
      BEGIN
      if (tipo = 31) then
        begin
        SELECT FACT_ANULADO, PREF_PRE, FACT_NUMERO, FACT_VENCE, TERC_NIT FROM FACTURAS F
            WHERE FACT_ID = :ID INTO :ANULADO, :PREF, :NUM, :VENCEAUX, :NIT;
        NUMERO = PREF || NUM;
        CONC = 'COSTO EN VENTAS FACTURA ' || :NUMERO;
        EXECUTE PROCEDURE FECHA_A_CONTA(:VENCEAUX) returning_values (:VENCE);
        if (ANULADO = 'N') then
            BEGIN
            SELECT BODE_CENTRO, BODE_PROY FROM BODEGA B, FACTURAS F, PUNTO_VENTA P
                WHERE B.BODE_COD = P.BODE_COD AND P.PTVT_ID = F.PTVT_ID AND F.FACT_ID = :ID INTO :CENTRO, :PROY;
            /* SE ASUME QUE NO HAN CAMBIADO LAS CUENTAS DE COSTOS, POR ESO SE HACE UPDATE A LOS MOVIMIENTOS DE ESAS CUENTAS */
            EXECUTE PROCEDURE COSTO_EN_VENTAS(31, :ID);
            if (COSTOS = 'A') then
                BEGIN
                FOR SELECT MAX(CTACOS), SUM(CANT * COSTO)
                    FROM COSTO_VENTAS WHERE TIDO_COD = 31 AND COVE_ID = :ID
                    GROUP BY CTACOS
                    INTO :CTACOSTOS, :MONTO
                    DO
                    BEGIN
                    if (MONTO <> 0) then
                        BEGIN
                        CUENTA = NULL;
                        SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                            WHERE CUEN_COD = :CTACOSTOS INTO :CUENTA, :TIPOCUEN;
                        IF (CUENTA IS NULL) THEN
                            begin
                            EXCEPTION CUENTA_NO_EXISTE 'La cuenta ' || :ctacostos || ' no existe.';
                            end
                        if (TIPOCUEN = 'I') then
                            BEGIN
                            /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                            FOR SELECT ARTI_COD, CANT * COSTO
                                FROM COSTO_VENTAS WHERE TIDO_COD = 31 AND COVE_ID = :ID AND CTACOS = :CUENTA
                                INTO :ART, :MONTO
                                DO
                                BEGIN
                                SELECT COUNT(*) FROM COMPROBANTE_DETALLE WHERE CUEN_COD = :CUENTA AND ENCO_CONSEC = :IDC AND ARTI_COD = :ART INTO :NUMROWS;
                                if (NUMROWS = 0) then
                                    BEGIN
                                    INSERT INTO comprobante_detalle (ENCO_CONSEC, CODE_ITEM, CUEN_COD, CODE_CONCEPTO, CODE_REFER, CODE_DEBITO, CODE_CREDITO, CODE_BASE, CODE_PORC, TERC_NIT, PROY_COD, CENT_COD, CNDE_DOCNUMERO, CNDE_DOCAPLICA, DOCO_VENCE, ARTI_COD, CODE_TIPOAPL, CODE_TIPONUE)
                                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                                    NROI = NROI + 1;
                                    END
                                ELSE
                                    UPDATE COMPROBANTE_DETALLE
                                        SET CODE_DEBITO = :MONTO
                                    WHERE CUEN_COD = :CUENTA AND ENCO_CONSEC = :IDC AND ARTI_COD = :ART;
                                END
                            END
                        ELSE
                            BEGIN
                            SELECT COUNT(*) FROM COMPROBANTE_DETALLE WHERE CUEN_COD = :CUENTA AND ENCO_CONSEC = :IDC INTO :NUMROWS;
                            if (NUMROWS = 0) then
                                BEGIN
                                if (TIPOCUEN = 'C') then
                                    INSERT INTO comprobante_detalle (ENCO_CONSEC, CODE_ITEM, CUEN_COD, CODE_CONCEPTO, CODE_REFER, CODE_DEBITO, CODE_CREDITO, CODE_BASE, CODE_PORC, TERC_NIT, PROY_COD, CENT_COD, CNDE_DOCNUMERO, CNDE_DOCAPLICA, DOCO_VENCE, ARTI_COD, CODE_TIPOAPL, CODE_TIPONUE)
                                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                                ELSE
                                    INSERT INTO comprobante_detalle (ENCO_CONSEC, CODE_ITEM, CUEN_COD, CODE_CONCEPTO, CODE_REFER, CODE_DEBITO, CODE_CREDITO, CODE_BASE, CODE_PORC, TERC_NIT, PROY_COD, CENT_COD, CNDE_DOCNUMERO, CNDE_DOCAPLICA, DOCO_VENCE, ARTI_COD, CODE_TIPOAPL, CODE_TIPONUE)
                                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                                NROI = NROI + 1;
                                END
                            ELSE
                                UPDATE COMPROBANTE_DETALLE
                                    SET CODE_DEBITO = :MONTO
                                WHERE CUEN_COD = :CUENTA AND ENCO_CONSEC = :IDC;
                            END
                        END /* MONTO <> 0 */
                    END /* FOR */
                END /* COSTOS */
            if (COSTOS = 'K') then
                BEGIN
                SELECT SUM(CANT * COSTO)
                    FROM COSTO_VENTAS WHERE TIDO_COD = 31 AND COVE_ID = :ID
                    INTO :MONTO;
                if (MONTO <> 0) then
                    BEGIN
                    CUENTA = NULL;
                    SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                        WHERE CUEN_COD = :CTACOSTOS INTO :CUENTA, :TIPOCUEN;
                    IF (CUENTA IS NULL) THEN
                        begin
                        EXCEPTION CUENTA_NO_EXISTE 'La cuenta ' || :ctacostos || ' no existe.';
                        end
                    if (TIPOCUEN = 'I') then
                        BEGIN
                        /* ES UNA CUENTA DE INVENTARIO, REGISTRE UNO A UNO LOS ARTICULOS */
                        FOR SELECT ARTI_COD, CANT * COSTO
                            FROM COSTO_VENTAS WHERE TIDO_COD = 31 AND COVE_ID = :ID
                            INTO :ART, :MONTO
                            DO
                            BEGIN
                            SELECT COUNT(*) FROM COMPROBANTE_DETALLE WHERE CUEN_COD = :CUENTA AND ENCO_CONSEC = :IDC AND ARTI_COD = :ART INTO :NUMROWS;
                            if (NUMROWS = 0) then
                                BEGIN
                                INSERT INTO comprobante_detalle (ENCO_CONSEC, CODE_ITEM, CUEN_COD, CODE_CONCEPTO, CODE_REFER, CODE_DEBITO, CODE_CREDITO, CODE_BASE, CODE_PORC, TERC_NIT, PROY_COD, CENT_COD, CNDE_DOCNUMERO, CNDE_DOCAPLICA, DOCO_VENCE, ARTI_COD, CODE_TIPOAPL, CODE_TIPONUE)
                                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                                NROI = NROI + 1;
                                END
                            ELSE
                                UPDATE COMPROBANTE_DETALLE
                                    SET CODE_DEBITO = :MONTO
                                WHERE CUEN_COD = :CUENTA AND ENCO_CONSEC = :IDC AND ARTI_COD = :ART;
                            END
                        END
                    ELSE
                        BEGIN
                        SELECT COUNT(*) FROM COMPROBANTE_DETALLE WHERE CUEN_COD = :CUENTA AND ENCO_CONSEC = :IDC INTO :NUMROWS;
                        if (NUMROWS = 0) then
                            BEGIN
                            if (TIPOCUEN = 'C') then
                                INSERT INTO comprobante_detalle (ENCO_CONSEC, CODE_ITEM, CUEN_COD, CODE_CONCEPTO, CODE_REFER, CODE_DEBITO, CODE_CREDITO, CODE_BASE, CODE_PORC, TERC_NIT, PROY_COD, CENT_COD, CNDE_DOCNUMERO, CNDE_DOCAPLICA, DOCO_VENCE, ARTI_COD, CODE_TIPOAPL, CODE_TIPONUE)
                                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                            ELSE
                                INSERT INTO comprobante_detalle (ENCO_CONSEC, CODE_ITEM, CUEN_COD, CODE_CONCEPTO, CODE_REFER, CODE_DEBITO, CODE_CREDITO, CODE_BASE, CODE_PORC, TERC_NIT, PROY_COD, CENT_COD, CNDE_DOCNUMERO, CNDE_DOCAPLICA, DOCO_VENCE, ARTI_COD, CODE_TIPOAPL, CODE_TIPONUE)
                                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                            NROI = NROI + 1;
                            END
                        ELSE
                            UPDATE COMPROBANTE_DETALLE
                                SET CODE_DEBITO = :MONTO
                            WHERE CUEN_COD = :CUENTA AND ENCO_CONSEC = :IDC;
                        END
                    END /* MONTO <> 0 */
                END /* COSTOS = K */
            if (INVEN = 'A') then
                BEGIN
                FOR SELECT MAX(CTAINV), SUM(CANT * COSTO)
                    FROM COSTO_VENTAS WHERE TIDO_COD = 31 AND COVE_ID = :ID
                    GROUP BY CTAINV
                    INTO :CTAINVEN, :MONTO
                    DO
                    BEGIN
                    if (MONTO <> 0) then
                        BEGIN
                        CUENTA = NULL;
                        SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                            WHERE CUEN_COD = :CTAINVEN INTO :CUENTA, :TIPOCUEN;
                        IF (CUENTA IS NULL) THEN
                            begin
                            EXCEPTION CUENTA_NO_EXISTE 'La cuenta ' || :ctainven || ' no existe.';
                            end
                        if (TIPOCUEN = 'I') then
                            BEGIN
                            /* ES UNA CUENTA DE INVENTARIO, REGISTRE UNO A UNO LOS ARTICULOS */
                            FOR SELECT ARTI_COD, CANT * COSTO
                                FROM COSTO_VENTAS WHERE TIDO_COD = 31 AND COVE_ID = :ID AND CTAINV = :CUENTA
                                INTO :ART, :MONTO
                                DO
                                BEGIN
                                SELECT COUNT(*) FROM COMPROBANTE_DETALLE WHERE CUEN_COD = :CUENTA AND ENCO_CONSEC = :IDC AND ARTI_COD = :ART INTO :NUMROWS;
                                if (NUMROWS = 0) then
                                    BEGIN
                                    INSERT INTO comprobante_detalle (ENCO_CONSEC, CODE_ITEM, CUEN_COD, CODE_CONCEPTO, CODE_REFER, CODE_DEBITO, CODE_CREDITO, CODE_BASE, CODE_PORC, TERC_NIT, PROY_COD, CENT_COD, CNDE_DOCNUMERO, CNDE_DOCAPLICA, DOCO_VENCE, ARTI_COD, CODE_TIPOAPL, CODE_TIPONUE)
                                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                                    NROI = NROI + 1;
                                    END
                                ELSE    
                                    UPDATE COMPROBANTE_DETALLE
                                        SET CODE_CREDITO = :MONTO
                                    WHERE CUEN_COD = :CUENTA AND ENCO_CONSEC = :IDC AND ARTI_COD = :ART;
                                END
                            END
                        ELSE
                            BEGIN
                            SELECT COUNT(*) FROM COMPROBANTE_DETALLE WHERE CUEN_COD = :CUENTA AND ENCO_CONSEC = :IDC INTO :NUMROWS;
                            if (NUMROWS = 0) then
                                BEGIN
                                if (TIPOCUEN = 'C') then
                                    INSERT INTO comprobante_detalle (ENCO_CONSEC, CODE_ITEM, CUEN_COD, CODE_CONCEPTO, CODE_REFER, CODE_DEBITO, CODE_CREDITO, CODE_BASE, CODE_PORC, TERC_NIT, PROY_COD, CENT_COD, CNDE_DOCNUMERO, CNDE_DOCAPLICA, DOCO_VENCE, ARTI_COD, CODE_TIPOAPL, CODE_TIPONUE)
                                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                                ELSE
                                    INSERT INTO comprobante_detalle (ENCO_CONSEC, CODE_ITEM, CUEN_COD, CODE_CONCEPTO, CODE_REFER, CODE_DEBITO, CODE_CREDITO, CODE_BASE, CODE_PORC, TERC_NIT, PROY_COD, CENT_COD, CNDE_DOCNUMERO, CNDE_DOCAPLICA, DOCO_VENCE, ARTI_COD, CODE_TIPOAPL, CODE_TIPONUE)
                                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                                NROI = NROI + 1;
                                END
                            ELSE
                                UPDATE COMPROBANTE_DETALLE
                                    SET CODE_CREDITO = :MONTO
                                WHERE CUEN_COD = :CUENTA AND ENCO_CONSEC = :IDC;
                            END
                        END /* MONTO <> 0 */
                    END /* FOR */
                END /* INVEN = A */
            if (INVEN = 'K') then
                BEGIN
                SELECT SUM(CANT * COSTO)
                    FROM COSTO_VENTAS WHERE TIDO_COD = 31 AND COVE_ID = :ID
                    INTO :MONTO;
                if (MONTO <> 0) then
                    BEGIN
                    CUENTA = NULL;
                    SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                        WHERE CUEN_COD = :CTAINVEN INTO :CUENTA, :TIPOCUEN;
                    IF (CUENTA IS NULL) THEN
                        begin
                        EXCEPTION CUENTA_NO_EXISTE 'La cuenta ' || :ctainven || ' no existe.';
                        end
                    if (TIPOCUEN = 'I') then
                        BEGIN
                        /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                        FOR SELECT ARTI_COD, CANT * COSTO
                            FROM COSTO_VENTAS WHERE TIDO_COD = 31 AND COVE_ID = :ID
                            INTO :ART, :MONTO
                            DO
                            BEGIN
                            SELECT COUNT(*) FROM COMPROBANTE_DETALLE WHERE CUEN_COD = :CUENTA AND ENCO_CONSEC = :IDC AND ARTI_COD = :ART INTO :NUMROWS;
                            if (NUMROWS = 0) then
                                BEGIN
                                INSERT INTO comprobante_detalle (ENCO_CONSEC, CODE_ITEM, CUEN_COD, CODE_CONCEPTO, CODE_REFER, CODE_DEBITO, CODE_CREDITO, CODE_BASE, CODE_PORC, TERC_NIT, PROY_COD, CENT_COD, CNDE_DOCNUMERO, CNDE_DOCAPLICA, DOCO_VENCE, ARTI_COD, CODE_TIPOAPL, CODE_TIPONUE)
                                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                                NROI = NROI + 1;
                                END
                            ELSE
                                UPDATE COMPROBANTE_DETALLE
                                    SET CODE_CREDITO = :MONTO
                                WHERE CUEN_COD = :CUENTA AND ENCO_CONSEC = :IDC AND ARTI_COD = :ART;
                            END
                        END
                    ELSE
                        BEGIN
                        SELECT COUNT(*) FROM COMPROBANTE_DETALLE WHERE CUEN_COD = :CUENTA AND ENCO_CONSEC = :IDC INTO :NUMROWS;
                        if (NUMROWS = 0) then
                            BEGIN
                            if (TIPOCUEN = 'C') then
                                INSERT INTO comprobante_detalle (ENCO_CONSEC, CODE_ITEM, CUEN_COD, CODE_CONCEPTO, CODE_REFER, CODE_DEBITO, CODE_CREDITO, CODE_BASE, CODE_PORC, TERC_NIT, PROY_COD, CENT_COD, CNDE_DOCNUMERO, CNDE_DOCAPLICA, DOCO_VENCE, ARTI_COD, CODE_TIPOAPL, CODE_TIPONUE)
                                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                            ELSE
                                INSERT INTO comprobante_detalle (ENCO_CONSEC, CODE_ITEM, CUEN_COD, CODE_CONCEPTO, CODE_REFER, CODE_DEBITO, CODE_CREDITO, CODE_BASE, CODE_PORC, TERC_NIT, PROY_COD, CENT_COD, CNDE_DOCNUMERO, CNDE_DOCAPLICA, DOCO_VENCE, ARTI_COD, CODE_TIPOAPL, CODE_TIPONUE)
                                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                            NROI = NROI + 1;
                            END
                        ELSE
                            UPDATE COMPROBANTE_DETALLE
                                SET CODE_CREDITO = :MONTO
                            WHERE CUEN_COD = :CUENTA AND ENCO_CONSEC = :IDC;
                        END
                    END /* MONTO <> 0 */
                END /* INVEN = K */
            END
        end
      if (TIPO = 33) then
        BEGIN
        SELECT DEVT_ANULADO, PREF_PRE, DEVT_NUMERO, DEVT_FECHA, TERC_NIT, DEVT_REMID, devt_pedid
            FROM DEVOLUCIONES_VENTAS
            WHERE DEVT_ID = :ID INTO :ANULADO, :PREF, :NUM, :VENCEAUX, :NIT, :IDREM, :IDPED;
        if (idrem is null) Then
            IDREM = 0;
        if (idped is null) Then
            IDPED = 0;
        if ((ANULADO = 'N') AND (IDREM = 0) AND (IDPED = 0)) then
            BEGIN
            NUMERO = PREF || NUM;
            CONC = 'COSTO EN VENTAS DEVOLUCION ' || :NUMERO;
            EXECUTE PROCEDURE FECHA_A_CONTA(:VENCEAUX) returning_values (:VENCE);
            IF (CENT = 'B') THEN
                SELECT B.BODE_CENTRO, B.BODE_PROY FROM BODEGA B, DEVOLUCIONES_VENTAS F
                    WHERE B.BODE_COD = F.BODE_COD AND F.DEVT_ID = :ID INTO :CENTRO, :PROY;
            IF (CENT = 'V') THEN
                SELECT V.CENT_COD, V.PROY_COD FROM VENDEDORES V, DEVOLUCIONES_VENTAS F
                    WHERE V.VEND_COD = F.VEND_COD AND F.DEVT_ID = :ID INTO :CENTRO, :PROY;
            IF (CENT = 'P') THEN
                SELECT P.PREF_CENTRO,P.PREF_PROY  FROM PREFIJOS P, DEVOLUCIONES_VENTAS F
                    WHERE P.PREF_PRE = F.PREF_PRE AND F.DEVT_ID = :ID AND P.TIDO_COD = 33 INTO :CENTRO, :PROY;
            EXECUTE PROCEDURE COSTO_EN_VENTAS(33, :ID);
            if (COSTOS = 'A') then
                BEGIN
                FOR SELECT MAX(CTACOS), SUM(cast(CANT as double precision) * COSTO)
                    FROM COSTO_VENTAS WHERE TIDO_COD = 33 AND COVE_ID = :ID
                    GROUP BY CTACOS
                    INTO :CTACOSTOS, :MONTO
                    DO
                    BEGIN
                    if (MONTO <> 0) then
                        BEGIN
                        EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :ID, :CTACOSTOS, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                        if (TIPOCUEN = 'I') then
                            BEGIN
                            /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                            FOR SELECT ARTI_COD, cast(CANT as double precision) * COSTO
                                FROM COSTO_VENTAS WHERE TIDO_COD = 33 AND COVE_ID = :ID AND CTACOS = :CUENTA
                                INTO :ART, :MONTO
                                DO
                                BEGIN
                                SELECT COUNT(*) FROM COMPROBANTE_DETALLE WHERE CUEN_COD = :CUENTA AND ENCO_CONSEC = :IDC AND ARTI_COD = :ART INTO :NUMROWS;
                                if (NUMROWS = 0) then
                                    BEGIN
                                    INSERT INTO comprobante_detalle (ENCO_CONSEC, CODE_ITEM, CUEN_COD, CODE_CONCEPTO, CODE_REFER, CODE_DEBITO, CODE_CREDITO, CODE_BASE, CODE_PORC, TERC_NIT, PROY_COD, CENT_COD, CNDE_DOCNUMERO, CNDE_DOCAPLICA, DOCO_VENCE, ARTI_COD, CODE_TIPOAPL, CODE_TIPONUE)
                                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                                    NROI = NROI + 1;
                                    END
                                ELSE
                                    UPDATE COMPROBANTE_DETALLE
                                        SET CODE_CREDITO = :MONTO
                                    WHERE CUEN_COD = :CUENTA AND ENCO_CONSEC = :IDC AND ARTI_COD = :ART;
                                END
                            END
                        SELECT COUNT(*) FROM COMPROBANTE_DETALLE WHERE CUEN_COD = :CUENTA AND ENCO_CONSEC = :IDC INTO :NUMROWS;
                        if (NUMROWS = 0) then
                            BEGIN
                            if (TIPOCUEN = 'C') then
                                INSERT INTO comprobante_detalle (ENCO_CONSEC, CODE_ITEM, CUEN_COD, CODE_CONCEPTO, CODE_REFER, CODE_DEBITO, CODE_CREDITO, CODE_BASE, CODE_PORC, TERC_NIT, PROY_COD, CENT_COD, CNDE_DOCNUMERO, CNDE_DOCAPLICA, DOCO_VENCE, ARTI_COD, CODE_TIPOAPL, CODE_TIPONUE)
                                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :vence, NULL, 0, 33);
                            else
                                INSERT INTO comprobante_detalle (ENCO_CONSEC, CODE_ITEM, CUEN_COD, CODE_CONCEPTO, CODE_REFER, CODE_DEBITO, CODE_CREDITO, CODE_BASE, CODE_PORC, TERC_NIT, PROY_COD, CENT_COD, CNDE_DOCNUMERO, CNDE_DOCAPLICA, DOCO_VENCE, ARTI_COD, CODE_TIPOAPL, CODE_TIPONUE)
                                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                            NROI = NROI + 1;
                            END
                        ELSE
                            UPDATE COMPROBANTE_DETALLE
                                SET CODE_CREDITO = :MONTO
                                WHERE CUEN_COD = :CUENTA AND ENCO_CONSEC = :IDC;
                        END /* MONTO <> 0 */
                    END /* FOR */
                END /* COSTOS */
            if (COSTOS = 'K') then
                BEGIN
                SELECT SUM(cast(CANT as double precision) * COSTO)
                    FROM COSTO_VENTAS WHERE TIDO_COD = 33 AND COVE_ID = :ID
                    INTO :MONTO;
                if (MONTO <> 0) then
                    BEGIN
                    EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :ID, :CTACOSTOS, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                    if (TIPOCUEN = 'I') then
                        BEGIN
                        /* ES UNA CUENTA DE INVENTARIO, REGISTRE UNO A UNO LOS ARTICULOS */
                        FOR SELECT ARTI_COD, cast(CANT as double precision) * COSTO
                            FROM COSTO_VENTAS WHERE TIDO_COD = 33 AND COVE_ID = :ID
                            INTO :ART, :MONTO
                            DO
                            BEGIN
                            SELECT COUNT(*) FROM COMPROBANTE_DETALLE WHERE CUEN_COD = :CUENTA AND ENCO_CONSEC = :IDC AND ARTI_COD = :ART INTO :NUMROWS;
                            if (NUMROWS = 0) then
                                BEGIN
                                INSERT INTO comprobante_detalle (ENCO_CONSEC, CODE_ITEM, CUEN_COD, CODE_CONCEPTO, CODE_REFER, CODE_DEBITO, CODE_CREDITO, CODE_BASE, CODE_PORC, TERC_NIT, PROY_COD, CENT_COD, CNDE_DOCNUMERO, CNDE_DOCAPLICA, DOCO_VENCE, ARTI_COD, CODE_TIPOAPL, CODE_TIPONUE)
                                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                                NROI = NROI + 1;
                                END
                            ELSE
                                UPDATE COMPROBANTE_DETALLE
                                    SET CODE_CREDITO = :MONTO
                                    WHERE CUEN_COD = :CUENTA AND ENCO_CONSEC = :IDC AND ARTI_COD = :ART;
                            END
                        END
                    SELECT COUNT(*) FROM COMPROBANTE_DETALLE WHERE CUEN_COD = :CUENTA AND ENCO_CONSEC = :IDC INTO :NUMROWS;
                    if (NUMROWS = 0) then
                        BEGIN
                        if (TIPOCUEN = 'C') then
                            INSERT INTO comprobante_detalle (ENCO_CONSEC, CODE_ITEM, CUEN_COD, CODE_CONCEPTO, CODE_REFER, CODE_DEBITO, CODE_CREDITO, CODE_BASE, CODE_PORC, TERC_NIT, PROY_COD, CENT_COD, CNDE_DOCNUMERO, CNDE_DOCAPLICA, DOCO_VENCE, ARTI_COD, CODE_TIPOAPL, CODE_TIPONUE)
                                VALUES (:IDC, :NROI, :CTACOSTOS, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :vence, NULL, 0, 33);
                        else
                            INSERT INTO comprobante_detalle (ENCO_CONSEC, CODE_ITEM, CUEN_COD, CODE_CONCEPTO, CODE_REFER, CODE_DEBITO, CODE_CREDITO, CODE_BASE, CODE_PORC, TERC_NIT, PROY_COD, CENT_COD, CNDE_DOCNUMERO, CNDE_DOCAPLICA, DOCO_VENCE, ARTI_COD, CODE_TIPOAPL, CODE_TIPONUE)
                                VALUES (:IDC, :NROI, :CTACOSTOS, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, null, NULL, null, NULL, 0, 0);
                        NROI = NROI + 1;
                        END
                    ELSE
                        UPDATE COMPROBANTE_DETALLE
                            SET CODE_CREDITO = :MONTO
                            WHERE CUEN_COD = :CUENTA AND ENCO_CONSEC = :IDC;
                    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 WHERE TIDO_COD = 33 AND COVE_ID = :ID
                    GROUP BY CTAINV
                    INTO :CTAINVEN, :MONTO
                    DO
                    BEGIN
                    if (MONTO <> 0) then
                        BEGIN
                        EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :ID, :CTAINVEN, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                        if (TIPOCUEN = 'I') then
                            BEGIN
                            /* ES UNA CUENTA DE INVENTARIO, REGISTRE UNO A UNO LOS ARTICULOS */
                            FOR SELECT ARTI_COD, cast(CANT as double precision) * COSTO
                                FROM COSTO_VENTAS WHERE TIDO_COD = 33 AND COVE_ID = :ID AND CTAINV = :CUENTA
                                INTO :ART, :MONTO
                                DO
                                BEGIN
                                SELECT COUNT(*) FROM COMPROBANTE_DETALLE WHERE CUEN_COD = :CUENTA AND ENCO_CONSEC = :IDC AND ARTI_COD = :ART INTO :NUMROWS;
                                if (NUMROWS = 0) then
                                    BEGIN
                                    INSERT INTO comprobante_detalle (ENCO_CONSEC, CODE_ITEM, CUEN_COD, CODE_CONCEPTO, CODE_REFER, CODE_DEBITO, CODE_CREDITO, CODE_BASE, CODE_PORC, TERC_NIT, PROY_COD, CENT_COD, CNDE_DOCNUMERO, CNDE_DOCAPLICA, DOCO_VENCE, ARTI_COD, CODE_TIPOAPL, CODE_TIPONUE)
                                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                                    NROI = NROI + 1;
                                    END
                                ELSE
                                    UPDATE COMPROBANTE_DETALLE
                                        SET CODE_DEBITO = :MONTO
                                        WHERE CUEN_COD = :CUENTA AND ENCO_CONSEC = :IDC AND ARTI_COD = :ART;
                                END
                            END
                        SELECT COUNT(*) FROM COMPROBANTE_DETALLE WHERE CUEN_COD = :CUENTA AND ENCO_CONSEC = :IDC INTO :NUMROWS;
                        if (NUMROWS = 0) then
                            BEGIN
                            if (TIPOCUEN = 'C') then
                                INSERT INTO comprobante_detalle (ENCO_CONSEC, CODE_ITEM, CUEN_COD, CODE_CONCEPTO, CODE_REFER, CODE_DEBITO, CODE_CREDITO, CODE_BASE, CODE_PORC, TERC_NIT, PROY_COD, CENT_COD, CNDE_DOCNUMERO, CNDE_DOCAPLICA, DOCO_VENCE, ARTI_COD, CODE_TIPOAPL, CODE_TIPONUE)
                                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :vence, NULL, 0, 33);
                            else
                                INSERT INTO comprobante_detalle (ENCO_CONSEC, CODE_ITEM, CUEN_COD, CODE_CONCEPTO, CODE_REFER, CODE_DEBITO, CODE_CREDITO, CODE_BASE, CODE_PORC, TERC_NIT, PROY_COD, CENT_COD, CNDE_DOCNUMERO, CNDE_DOCAPLICA, DOCO_VENCE, ARTI_COD, CODE_TIPOAPL, CODE_TIPONUE)
                                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                            NROI = NROI + 1;
                            END
                        ELSE
                            UPDATE COMPROBANTE_DETALLE
                                SET CODE_DEBITO = :MONTO
                                WHERE CUEN_COD = :CUENTA AND ENCO_CONSEC = :IDC;
                        END /* MONTO <> 0 */
                    END /* FOR */
                END /* INVEN = A */
            if (INVEN = 'K') then
                BEGIN
                SELECT SUM(cast(CANT as double precision) * COSTO)
                    FROM COSTO_VENTAS WHERE TIDO_COD = 33 AND COVE_ID = :ID
                    INTO :MONTO;
                if (MONTO <> 0) then
                    BEGIN
                    EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :ID, :CTAINVEN, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                    if (TIPOCUEN = 'I') then
                        BEGIN
                        /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                        FOR SELECT ARTI_COD, cast(CANT as double precision) * COSTO
                            FROM COSTO_VENTAS WHERE TIDO_COD = 33 AND COVE_ID = :ID
                            INTO :ART, :MONTO
                            DO
                            BEGIN
                            SELECT COUNT(*) FROM COMPROBANTE_DETALLE WHERE CUEN_COD = :CUENTA AND ENCO_CONSEC = :IDC AND ARTI_COD = :ART INTO :NUMROWS;
                            if (NUMROWS = 0) then
                                BEGIN
                                INSERT INTO CONTABILIZACION_DET (CNTB_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)
                                    VALUES (:IDC, :NROI, :CTAINVEN, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                                NROI = NROI + 1;
                                END
                            ELSE
                                UPDATE COMPROBANTE_DETALLE
                                    SET CODE_DEBITO = :MONTO
                                    WHERE CUEN_COD = :CUENTA AND ENCO_CONSEC = :IDC AND ARTI_COD = :ART;
                            END
                        END
                    SELECT COUNT(*) FROM COMPROBANTE_DETALLE WHERE CUEN_COD = :CUENTA AND ENCO_CONSEC = :IDC INTO :NUMROWS;
                    if (NUMROWS = 0) then
                        BEGIN
                        if (TIPOCUEN = 'C') then
                            INSERT INTO comprobante_detalle (ENCO_CONSEC, CODE_ITEM, CUEN_COD, CODE_CONCEPTO, CODE_REFER, CODE_DEBITO, CODE_CREDITO, CODE_BASE, CODE_PORC, TERC_NIT, PROY_COD, CENT_COD, CNDE_DOCNUMERO, CNDE_DOCAPLICA, DOCO_VENCE, ARTI_COD, CODE_TIPOAPL, CODE_TIPONUE)
                                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :vence, NULL, 0, 33);
                        else
                            INSERT INTO comprobante_detalle (ENCO_CONSEC, CODE_ITEM, CUEN_COD, CODE_CONCEPTO, CODE_REFER, CODE_DEBITO, CODE_CREDITO, CODE_BASE, CODE_PORC, TERC_NIT, PROY_COD, CENT_COD, CNDE_DOCNUMERO, CNDE_DOCAPLICA, DOCO_VENCE, ARTI_COD, CODE_TIPOAPL, CODE_TIPONUE)
                                VALUES (:IDC, :NROI, :CTAINVEN, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                        NROI = NROI + 1;
                        END
                    ELSE
                        UPDATE COMPROBANTE_DETALLE
                            SET CODE_DEBITO = :MONTO
                            WHERE CUEN_COD = :CUENTA AND ENCO_CONSEC = :IDC;
                    END /* MONTO <> 0 */
                END  /* INVEN = K */
            END
        END
      END
    END
end

^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE CONTABIL_DEVOLCLI(
    IDDOC INTEGER,
    IDINTER INTEGER)
RETURNS (
    ERROR INTEGER,
    VER CHAR(1),
    IDC INTEGER)
AS
declare variable PREF VARCHAR(4);
declare variable NUM VARCHAR(8);
declare variable NUMERO VARCHAR(10);
declare variable FECAUX DATE;
declare variable FECHA CHAR(8);
declare variable CONC CHAR(120);
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 PRTCREE NUMERIC(9, 2);
declare variable VRRTCREE 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 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 RTCREE CHAR(1);
declare variable CTARTCREE 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 PROY VARCHAR(4);
declare variable CENTRO VARCHAR(4);
declare variable PROYI VARCHAR(4);
declare variable CENTI 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 ART VARCHAR(15);
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 TCTARTCREE 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 CENT CHAR(1);
DECLARE VARIABLE MERCANCIA NUMERIC(18,2);
DECLARE VARIABLE INALC NUMERIC(18,2);
declare variable FACTOR DOUBLE PRECISION;
declare variable DIG INTEGER;
DECLARE VARIABLE FOMENTO VARCHAR(2);
DECLARE VARIABLE VRCONSUMO NUMERIC(18,2);
declare variable AUTORET VARCHAR(10);
declare variable FAUTORET DATE;
declare variable AUTORCREE VARCHAR(10);
declare variable FAUTORCREE DATE;
declare variable IDREM INTEGER;
declare variable IDPED INTEGER;
declare variable DTOXIT CHAR(2);
declare variable ERRORC INTEGER;
declare variable ICOING CHAR(2);
declare variable NITCONTA VARCHAR(20);
declare variable CNTNIT CHAR(2);
BEGIN
EXECUTE PROCEDURE LEE_CONFIGURACION('COMPRAS', 'FACTURAS', 'USAR IMPOCONSUMO COMO PORCENTAJE DE FOMENTO') returning_values (FOMENTO);
EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'FECHA AUTORETENEDOR NO DESCONTAR RETENCIONES DEL SALDO PERO SI CONTABILIZARLAS') returning_values (AUTORET);
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('FACTURACION', 'ARTICULOS', 'IMPOCONSUMO COMO MAYOR VALOR DEL COSTO Y DEL INGRESO') returning_values (ICOING);
if (AUTORET <> '') then
    FAUTORET = CAST(AUTORET AS DATE);
else
    FAUTORET = '9999/12/31';
EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'FECHA AUTORETENEDOR DE RETENCION CREE') returning_values (AUTORCREE);
if (AUTORCREE <> '') then
    FAUTORCREE = CAST(AUTORCREE AS DATE);
else
    FAUTORCREE = '9999/12/31';
  /* BUSQUE LA INTERFACE */
  EXISTE = 'N';
  SELECT 'S', TICO_COD, PRCO_PRE, INVE_VENTAS, INVE_IVA, INVE_CONSUMO, INVE_CARTERA, INVE_RTFTE, INVE_RTIVA, INVE_RTICA, INVE_RTCREE,
    INVE_COSTO, INVE_INVEN, INVE_CTAVENTAS, INVE_CTAIVA, INVE_CTACONSUMO, INVE_CTADTO, INVE_CTAADIC, INVE_CTAEXTRA, INVE_CTACARTERA,
    INVE_CTARTFTE, INVE_CTARTIVA, INVE_CTARTICA, INVE_CTARTCREE, INVE_CTAINVEN, INVE_CTACOSTOS, INVE_CONFIRMAR, INVE_CENTRO
    FROM INTERFAZ_VENTAS
    WHERE INVE_ID = :IDINTER
    INTO :EXISTE, :TIPOCOMP, :PREFCONT, :VENTAS, :IVA, :CONSUMO, :CARTERA, :RTFTE, :RTIVA, :RTICA, :RTCREE,
    :COSTOS, :INVEN, :CTAVENTAS, :CTAIVA, :CTACONSUMO, :CTADTO, :CTAADIC, :CTAEXTRA, :CTACARTERA, :CTARTFTE, :CTARTIVA, :CTARTICA, :CTARTCREE,
    :CTAINVEN, :CTACOSTOS, :VER, :CENT;
  if (EXISTE = 'S') then
   BEGIN
    /* BORRE CUALQUEIR CONTABILIZACION PREVIA */
    DELETE FROM CONTABILIZACION WHERE CNTB_TIPOREF = 33 AND CNTB_IDREF = :IDDOC;
    /* TRAIGA EL ENCABEZADO DE LA DEVOLUCION */
   SELECT PREF_PRE, DEVT_NUMERO, DEVT_FECHA, F.TERC_NIT, PTVT_ID, DEVT_FACTURA, DEVT_DTOMONTO, DEVT_ADICIONAL, DEVT_IVAMONTO, DEVT_EXTRA, DEVT_TOTAL,
        DEVT_RTFTEPORC, DEVT_RTFTEMONTO, DEVT_RTIVAPORC, DEVT_RTIVAMONTO, DEVT_RTICAPORC, DEVT_RTICAMONTO, DEVT_RTCREE, DEVT_RTCREEM,
        TERC_CTARTFTE, TERC_CTARTIVA, TERC_CTARTICA, TERC_CTARCREE, TERC_CTAVENTA, TERC_CTACLIENTE, DEVT_ANULADO, DEVT_REMID, DEVT_PEDID, T.terc_nitconta
        FROM DEVOLUCIONES_VENTAS F, TERCEROS T
        WHERE DEVT_ID = :IDDOC AND F.TERC_NIT = T.TERC_NIT
        INTO :PREF, :NUM, :FECAUX, :NIT, :PTOVTA, :NUMFAC, :VRDTO, :VRADIC, :VRIVA, :VREXTRA, :VRTOTAL,
        :PRTFTE, :VRRTFTE, :PORC, :VRRTIVA, :PRTICA, :VRRTICA, :PRTCREE, :VRRTCREE,
        :TCTARTFTE, TCTARTIVA, TCTARTICA, TCTARTCREE, TCTAVENTA, TCTACLIEN, ANULADO, :IDREM, :IDPED, :nitconta;
  if ((CNTNIT = 'SI') AND (NITCONTA IS NOT NULL)) then
    NIT = NITCONTA;
   if (idrem is null) Then
    IDREM = 0;
   if (idped is null) Then
    IDPED = 0;
   if ((ANULADO = 'N') AND (IDREM = 0) AND (IDPED = 0)) then
    BEGIN
    NUMERO = PREF || NUM;
    SELECT SUM(DVDE_CONSUMO) FROM devoluciones_ventas_detalle WHERE DEVT_ID = :iddoc AND ((DVDE_REFERENCIA <> '.t') or (DVDE_REFERENCIA IS NULL))
        INTO :MERCANCIA;
    SELECT SUM(DVDE_INACM) FROM devoluciones_ventas_detalle WHERE DEVT_ID = :iddoc AND ((DVDE_REFERENCIA <> '.t') or (DVDE_REFERENCIA IS NULL))
        INTO :INALC;
    VRSUBT = VRTOTAL - VREXTRA - VRIVA - MERCANCIA - INALC; /* BASE DE RETEFTE Y RETEICA */
    EXECUTE PROCEDURE lee_configuracion ('FACTURACION', 'DEVOLUCIONES', 'DESCUENTO PIE DEVOLUCION IGUAL A SUMA DE DESCUENTOS POR ITEM') returning_values (:DTOXIT);
    if (DTOXIT = 'SI') then
        VRDTO = 0;
    MERCANCIA = VRSUBT - VRADIC + VRDTO;
    IF (CENT = 'B') THEN
        SELECT B.BODE_CENTRO, B.BODE_PROY FROM BODEGA B, DEVOLUCIONES_VENTAS F
            WHERE B.BODE_COD = F.BODE_COD AND F.DEVT_ID = :IDDOC INTO :CENTRO, :PROY;
    IF (CENT = 'V') THEN
        SELECT V.CENT_COD, V.PROY_COD FROM VENDEDORES V, DEVOLUCIONES_VENTAS F
            WHERE V.VEND_COD = F.VEND_COD AND F.DEVT_ID = :IDDOC INTO :CENTRO, :PROY;
    IF (CENT = 'P') THEN
        SELECT P.PREF_CENTRO,P.PREF_PROY  FROM PREFIJOS P, DEVOLUCIONES_VENTAS F
            WHERE P.PREF_PRE = F.PREF_PRE AND F.DEVT_ID = :IDDOC AND P.TIDO_COD = 33 INTO :CENTRO, :PROY;
    EXECUTE PROCEDURE FECHA_A_CONTA(:FECAUX) returning_values (:FECHA);
    /* REGISTRE EL ENCABEZADO CONTABLE */
    IDC = GEN_ID(ID_CONTABILIZA, 1);
    CONC = 'DEVOLUCION VENTAS No. ' || NUMERO || ' EN FACTURA ' || NUMFAC;
    CONC = SUBSTR(CONC, 1, 60);
    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, '', 33, :IDDOC, :PREF, :NUM, 'N');
    NROI = 0;
    SUMA = 0;
    ERROR = 0;
    /* 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;
    /* CUENTAS DE VENTAS */
    if (VENTAS = 'A') then
        BEGIN
        FOR SELECT MAX(COAR_CTADEV), SUM(DVDE_TOTAL-DVDE_IVAMONTO-DVDE_CONSUMO-DVDE_INACM), SUM(DVDE_IVAMONTO), SUM(DVDE_CONSUMO), MAX(B.bode_proy), MAX(B.bode_centro)
            FROM ARTICULO A, CONTABIL_ARTICULO C, DEVOLUCIONES_VENTAS_DETALLE F, BODEGA B
            WHERE F.DEVT_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND B.bode_cod = F.bode_cod AND ((DVDE_REFERENCIA <> '.t') or (DVDE_REFERENCIA IS NULL))
            GROUP BY COAR_CTADEV
            INTO :CTAVENTAS, :MONTO, :IMPTOS, :VRCONSUMO, :proyi, :centi
            DO
            BEGIN
            if ((FOMENTO = 'SI') or (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(33, :IDDOC, :CTAVENTAS, '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)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
                    NROI = NROI + 1;
                    SUMA = SUMA + MONTO;
                    END
                ELSE
                    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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROYI, :CENTI, NULL, NULL, NULL, NULL, 0, 0);
                    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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    SUMA = SUMA + MONTO;
                    END
                END /* MONTO <> 0 */
            END /* FOR */
        END /* VENTAS A */
     IF ((VENTAS = 'C') OR (VENTAS = 'K')) THEN
        BEGIN
        IF (VENTAS = 'C') THEN
            CTAVENTAS = TCTAVENTA;
        SELECT SUM(DVDE_TOTAL-DVDE_IVAMONTO-DVDE_CONSUMO-DVDE_INACM), SUM(DVDE_IVAMONTO), SUM(DVDE_CONSUMO)
            FROM DEVOLUCIONES_VENTAS_DETALLE F
            WHERE F.DEVT_ID = :IDDOC  AND ((DVDE_REFERENCIA <> '.t') or (DVDE_REFERENCIA IS NULL))
            INTO :MONTO, :IMPTOS, :VRCONSUMO;
        if ((FOMENTO = 'SI') or (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(33, :IDDOC, :CTAVENTAS, '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)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
                NROI = NROI + 1;
                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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA + MONTO;
                END
            END /* MONTO <> 0 */
        END /* VENTAS C O K */

    if (IVA = 'A') then
        BEGIN
        FOR SELECT MAX(COAR_CTAIVADV), SUM(DVDE_IVAMONTO), SUM(DVDE_TOTAL-DVDE_IVAMONTO-DVDE_CONSUMO-DVDE_INACM), SUM(DVDE_CONSUMO)
            FROM ARTICULO A, CONTABIL_ARTICULO C, DEVOLUCIONES_VENTAS_DETALLE F
            WHERE F.DEVT_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND ((DVDE_REFERENCIA <> '.t') or (DVDE_REFERENCIA IS NULL))
            GROUP BY COAR_CTAIVADV
            INTO :CTAIVA, :IMPTOS, :MONTO, :VALORADIC
        DO
            BEGIN
            if (FOMENTO = 'SI') then
                MONTO = 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(33, :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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :IMPTOS, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
                    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)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :IMPTOS, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    SUMA = SUMA + IMPTOS;
                    END
                END   /* IMPTOS <> 0 */
            END /* FOR */
        END /* IVA A */
    if (IVA = 'K') then
        BEGIN
        SELECT SUM(DVDE_IVAMONTO), SUM(DVDE_TOTAL-DVDE_IVAMONTO-DVDE_CONSUMO-DVDE_INACM), SUM(DVDE_CONSUMO)
            FROM DEVOLUCIONES_VENTAS_DETALLE F
            WHERE F.DEVT_ID = :IDDOC  AND ((DVDE_REFERENCIA <> '.t') or (DVDE_REFERENCIA IS NULL))
            INTO :IMPTOS, :MONTO, :VALORADIC;
        if (FOMENTO = 'SI') then
            MONTO = 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(33, :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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTAIVA, :CONC, '', :IMPTOS, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
                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)
                    VALUES (:IDC, :NROI, :CTAIVA, :CONC, '', :IMPTOS, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA + IMPTOS;
                END
            END /* IMPTOS <> 0 */
        END /* IVA K */

    if ((CONSUMO = 'A') AND (FOMENTO <> 'SI')) then
        BEGIN
        FOR SELECT MAX(COAR_CTACONS), SUM(DVDE_CONSUMO)
            FROM ARTICULO A, CONTABIL_ARTICULO C, DEVOLUCIONES_VENTAS_DETALLE F
            WHERE F.DEVT_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND ((DVDE_REFERENCIA <> '.t') or (DVDE_REFERENCIA IS NULL))
            GROUP BY COAR_CTACONS
            INTO :CTACONSUMO, :IMPTOS
        DO
            BEGIN
            if (IMPTOS <> 0) then
                BEGIN
                EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :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)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :IMPTOS, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
                    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)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :IMPTOS, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    SUMA = SUMA + IMPTOS;
                    END
                END /* IMPTOS <> 0 */
            END /* FOR */
        END /* CONSUMO A */
    if ((CONSUMO = 'K') AND (FOMENTO <> 'SI')) then
        BEGIN
        SELECT SUM(DVDE_CONSUMO)
            FROM DEVOLUCIONES_VENTAS_DETALLE F
            WHERE F.DEVT_ID = :IDDOC AND ((DVDE_REFERENCIA <> '.t') or (DVDE_REFERENCIA IS NULL))
            INTO :IMPTOS;
        if (IMPTOS <> 0) then
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :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)
                    VALUES (:IDC, :NROI, :CTACONSUMO, :CONC, '', :IMPTOS, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 31);
                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)
                    VALUES (:IDC, :NROI, :CTACONSUMO, :CONC, '', :IMPTOS, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA + IMPTOS;
                END
            END /* IMPTOS <> 0 */
        END /* CONSUMO K */
    /* INALC */
        BEGIN
        SELECT SUM(DVDE_INACM)
            FROM DEVOLUCIONES_VENTAS_DETALLE F
            WHERE F.DEVT_ID = :IDDOC AND ((DVDE_REFERENCIA <> '.t') or (DVDE_REFERENCIA IS NULL))
            INTO :IMPTOS;
        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(33, :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)
                    VALUES (:IDC, :NROI, :CTACONSUMO, :CONC, '', :IMPTOS, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 31);
                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)
                    VALUES (:IDC, :NROI, :CTACONSUMO, :CONC, '', :IMPTOS, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA + IMPTOS;
                END
            END /* IMPTOS <> 0 */
        END /* INALC */

    if ((CTADTO IS NOT NULL) AND
        (CTADTO <> '') AND
        (VRDTO <> 0)) THEN
        BEGIN
        EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRDTO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
            NROI = NROI + 1;
            SUMA = SUMA - VRDTO;
            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)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRDTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 33);
            NROI = NROI + 1;
            SUMA = SUMA - VRDTO;
            END
        END

    if ((CTAADIC IS NOT NULL) AND
        (CTAADIC <> '') AND
        (VRADIC <> 0)) THEN
        BEGIN
        EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRADIC, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
            NROI = NROI + 1;
            SUMA = SUMA + VRADIC;
            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)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRADIC, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 33);
            NROI = NROI + 1;
            SUMA = SUMA + VRADIC;
            END
        END

    if ((CTAEXTRA IS NOT NULL) AND
        (CTAEXTRA <> '') AND
        (VREXTRA <> 0)) THEN
        BEGIN
        EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VREXTRA, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
            NROI = NROI + 1;
            SUMA = SUMA + VREXTRA;
            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)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VREXTRA, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 33);
            NROI = NROI + 1;
            SUMA = SUMA + VREXTRA;
            END
        END

    if ((RTFTE = 'C') or (RTFTE = 'K')) then
      if (VRRTFTE <> 0) then
        BEGIN
        if (RTFTE = 'C') then
            CTARTFTE = TCTARTFTE;
        EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTFTE, (:VRSUBT*-1), :PRTFTE, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
            NROI = NROI + 1;
            SUMA = SUMA - VRRTFTE;
            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)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTFTE, (:VRSUBT*-1), :PRTFTE, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            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(33, :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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTFTE, 0, :VRSUBT, :PRTFTE, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
                NROI = NROI + 1;
                SUMA = SUMA + VRRTFTE;
                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)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTFTE, 0, :VRSUBT, :PRTFTE, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA + VRRTFTE;
                END
            END
        END /* RTFTE */
    if (RTFTE = 'A') then
     if (VRRTFTE <> 0) then
      BEGIN
      FOR SELECT MAX(COAR_CTARTFTEV), MAX(COAR_RTFTE), MIN(COAR_RTBASE), SUM(DVDE_TOTAL-DVDE_IVAMONTO-DVDE_CONSUMO), SUM((DVDE_TOTAL-DVDE_IVAMONTO-DVDE_CONSUMO)*COAR_RTFTE)
        FROM CONTABIL_ARTICULO C, devoluciones_ventas_detalle F
        WHERE F.devt_id = :IDDOC AND F.ARTI_COD = C.ARTI_COD AND ((DVDE_REFERENCIA <> '.t') or (DVDE_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(33, :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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTFTE, (:MONTO*-1), :PRTFTE, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
                    NROI = NROI + 1;
                    SUMA = SUMA - VRRTFTE;
                    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)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTFTE, (:MONTO*-1), :PRTFTE, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    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(33, :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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTFTE, 0, :MONTO, :PRTFTE, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
                        NROI = NROI + 1;
                        SUMA = SUMA + VRRTFTE;
                        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)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTFTE, 0, :MONTO, :PRTFTE, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                        NROI = NROI + 1;
                        SUMA = SUMA + VRRTFTE;
                        END
                    END
                END
            END
        END /* RTFTE */
      END

    if ((RTIVA = 'C') or (RTIVA = 'K')) then
      if (VRRTIVA <> 0) then
        BEGIN
        if (RTIVA = 'C') then
            CTARTIVA = TCTARTIVA;
        EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTIVA, (:VRIVA*-1), :PORC, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
            NROI = NROI + 1;
            SUMA = SUMA - VRRTIVA;
            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)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTIVA, (:VRIVA*-1), :PORC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            SUMA = SUMA - VRRTIVA;
            END
        END /* RTIVA */

    if ((RTICA = 'C') or (RTICA = 'K')) then
      if (VRRTICA <> 0) then
        BEGIN
        if (RTICA = 'C') then
            CTARTICA = TCTARTICA;
        EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTICA, (:VRSUBT*-1), :PRTICA, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
            NROI = NROI + 1;
            SUMA = SUMA - VRRTICA;
            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)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTICA, (:VRSUBT*-1), :PRTICA, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            SUMA = SUMA - VRRTICA;
            END
        END /* RTICA */
    if (RTICA = 'A') then
      BEGIN
      if (VRRTICA <> 0) then
        BEGIN
        FOR SELECT MAX(COAR_CTARTICAV), SUM(DVDE_TOTAL-DVDE_IVAMONTO-DVDE_CONSUMO), SUM(((DVDE_TOTAL-DVDE_IVAMONTO-DVDE_CONSUMO)/1000)*:prtica)
          FROM CONTABIL_ARTICULO C, devoluciones_ventas_detalle F
          WHERE F.devt_id = :IDDOC AND F.ARTI_COD = C.ARTI_COD AND ((DVDE_REFERENCIA <> '.t') or (DVDE_REFERENCIA IS NULL))
          GROUP BY COAR_CTARTICAV
          INTO :ctartica, :MONTO, :vrrtica
          DO
          BEGIN
          MONTO = MONTO * FACTOR;
          vrrtica = vrrtica * FACTOR;
          execute procedure redondee(vrrtica, DIG) returning_values (vrrtica);
          execute procedure redondee(MONTO, DIG) returning_values (MONTO);
          if (vrrtica <> 0) then
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ(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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :vrrtica, (:MONTO*-1), :prtica/10, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :fecha, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA - vrrtica;
                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)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :vrrtica, (:MONTO*-1), :prtica/10, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA - vrrtica;
                END
            END
          END
        END
      END   /* RTICA */

    if ((RTCREE = 'C') or (RTCREE = 'K')) then
      if (VRRTCREE <> 0) then
        BEGIN
        if (RTCREE = 'C') then
            CTARTCREE = TCTARTCREE;
        EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTARTCREE, '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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTCREE, (:VRSUBT*-1), :PRTCREE, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
            NROI = NROI + 1;
            SUMA = SUMA - VRRTCREE;
            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)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTCREE, (:VRSUBT*-1), :PRTCREE, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            SUMA = SUMA - VRRTCREE;
            END
        /* AUTORETENCION */
        if (fautorcree <= fecaux) then
            BEGIN
            EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'CUENTA DE AUTORETENCION CREE') returning_values (ctartcree);
            EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :ctartcree, '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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :vrrtcree, 0, :VRSUBT, :prtcree, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
                NROI = NROI + 1;
                SUMA = SUMA + vrrtcree;
                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)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :vrrtcree, 0, :VRSUBT, :prtcree, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA + vrrtcree;
                END
            END
        END /* RTCREE */
    if (RTCREE = 'A') then
      BEGIN
      FOR SELECT MAX(COAR_CTARTCREE), MAX(COAR_RTCREE), SUM(DVDE_TOTAL-DVDE_IVAMONTO-DVDE_CONSUMO), SUM((DVDE_TOTAL-DVDE_IVAMONTO-DVDE_CONSUMO)*COAR_RTCREE)
        FROM CONTABIL_ARTICULO C, devoluciones_ventas_detalle F
        WHERE F.devt_id = :IDDOC AND F.ARTI_COD = C.ARTI_COD AND ((DVDE_REFERENCIA <> '.t') or (DVDE_REFERENCIA IS NULL))
        GROUP BY COAR_CTARTCREE
        INTO :ctartcree, :PRTFTE, :MONTO, :vrrtcree
        DO
        BEGIN
        MONTO = MONTO * FACTOR;
        VRRTCREE = VRRTCREE * FACTOR / 100;
        execute procedure redondee(VRRTCREE, DIG) returning_values (VRRTCREE);
        execute procedure redondee(MONTO, DIG) returning_values (MONTO);
        if (VRRTCREE <> 0) then
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTARTCREE, '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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :vrrtcree, (:MONTO*-1), :prtcree, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
                NROI = NROI + 1;
                SUMA = SUMA - vrrtcree;
                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)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :vrrtcree, (:MONTO*-1), :prtcree, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA - vrrtcree;
                END
            /* AUTORETENCION */
            if (fautorcree <= fecaux) then
                BEGIN
                EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'CUENTA DE AUTORETENCION CREE') returning_values (ctartcree);
                EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :ctartcree, '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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :vrrtcree, 0, :MONTO, :prtcree, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
                    NROI = NROI + 1;
                    SUMA = SUMA + vrrtcree;
                    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)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :vrrtcree, 0, :MONTO, :prtcree, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    SUMA = SUMA + vrrtcree;
                    END
                END
            END
        END /* RTCREE */
      END
    /* SI HAY ARTICULOS DE TERCEROS LLEVE ESE VALOR A LA CUENTA INDICADA */
    SELECT SUM(DVDE_TOTAL) FROM devoluciones_ventas_detalle F, ARTICULO A
        WHERE F.devt_id = :IDDOC AND ((DVDE_REFERENCIA <> '.t') or (DVDE_REFERENCIA IS NULL)) AND F.arti_cod = A.arti_cod AND A.arti_tercero = 'S'
        INTO :MONTO;
    if (MONTO IS NULL) then
        MONTO = 0;
    if (MONTO <> 0) then
        BEGIN
        if ((CTADTO IS NULL) OR (CTADTO = '')) then
            MONTO = MONTO * FACTOR;
        /* reste las retenciones en la misma cuenta (4 digitos) */
        EXECUTE PROCEDURE lee_configuracion('FACTURACION', 'FACTURAS', 'CUENTA DE CARTERA PARA INGRESOS DE TERCEROS') returning_values(:CTAVENTAS);
        select sum(cnde_debitos-cnde_creditos) from contabilizacion_det where cntb_id = :idc and substring(cnde_cuenta from 1 for 4) = substring(:ctaventas from 1 for 4)
            into :vrrtfte;
        if (vrrtfte is null) then
            vrrtfte = 0;
        monto = monto + vrrtfte;
        execute procedure redondee(MONTO, DIG) returning_values (MONTO);
        if (MONTO <> 0) then
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTAVENTAS, '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)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :fecha, NULL, 0, 31);
                NROI = NROI + 1;
                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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA - MONTO;
                END
            END
        END /* MONTO <> 0 */

    /* CIERRE CONTRA CUENTA TERCERO O CONSTANTE */
    if ((SUMA <> 0) and ((CARTERA = 'C') or (CARTERA = 'K') or (CARTERA = 'J'))) then
        BEGIN
        if (icoing = 'SI') then
            BEGIN
            /* DESCUENTE EL IMPOCONSUMO */
            SELECT SUM(DVDE_CONSUMO)
                FROM devoluciones_ventas_detalle F WHERE F.DEVT_ID = :IDDOC AND ((DVDE_REFERENCIA <> '.t') or (DVDE_REFERENCIA IS NULL)) INTO :IMPTOS;
            SUMA = SUMA - IMPTOS;
            END
        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
            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(33, :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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :DEBITO, :CREDITO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
        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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :DEBITO, :CREDITO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
        NROI = NROI + 1;
        END /* SUMA CARTERA */
    /* COSTOS VENTAS */
    EXECUTE PROCEDURE COSTO_EN_VENTAS(33, :IDDOC);
    if (COSTOS = 'A') then
        BEGIN
        FOR SELECT MAX(CTACOS), SUM(CAST(CANT AS DOUBLE PRECISION) * COSTO), SUM(DVDE_CONSUMO)
            FROM COSTO_VENTAS CV, devoluciones_ventas_detalle D WHERE CV.cove_item = D.dvde_item AND D.devt_id = :iddoc AND
            TIDO_COD = 33 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(33, :IDDOC, :CTACOSTOS, '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)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
                    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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    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 WHERE TIDO_COD = 33 AND COVE_ID = :IDDOC
            INTO :MONTO;
        if (icoing = 'SI') then
            MONTO = MONTO + imptos;
        if (MONTO <> 0) then
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTACOSTOS, '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)
                    VALUES (:IDC, :NROI, :CTACOSTOS, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
                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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTACOSTOS, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                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 WHERE TIDO_COD = 33 AND COVE_ID = :IDDOC
            GROUP BY CTAINV
            INTO :CTAINVEN, :MONTO
        DO
            BEGIN
            if (MONTO <> 0) then
                BEGIN
                EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTAINVEN, '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)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
                    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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    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 WHERE TIDO_COD = 33 AND COVE_ID = :IDDOC
            INTO :MONTO;
        if (MONTO <> 0) then
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ(33, :IDDOC, :CTAINVEN, '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)
                    VALUES (:IDC, :NROI, :CTAINVEN, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
                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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTAINVEN, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                END
            END /* MONTO <> 0 */
        END /* INVEN = K */
    /* 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(33, :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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTADIC, :CONC, '', :MONTO, 0, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
                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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTADIC, :CONC, '', 0, :MONTO, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
                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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTADIC, :CONC, '', :MONTO, 0, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTADIC, :CONC, '', 0, :MONTO, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                END
            NROI = NROI + 1;
            END
        END
    if (error > 0) then
        ver = 'S';
    SUSPEND;
    END
   END /* EXISTE INTERFAZ */
  ELSE
    BEGIN
    EXECUTE PROCEDURE ERRORINT(33, :IDDOC, :PREF, 1);
    ERROR = ERROR + 1;
    VER = 'S';
    SUSPEND;
    END
END

^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE CONTABIL_DEVOLCLI_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(10);
declare variable FECAUX DATE;
declare variable FECHA CHAR(8);
declare variable CONC CHAR(120);
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 PRTCREE NUMERIC(9, 2);
declare variable VRRTCREE 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 RTCREE CHAR(1);
declare variable CTARTCREE 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 PROY VARCHAR(4);
declare variable CENTRO VARCHAR(4);
declare variable PROYI VARCHAR(4);
declare variable CENTI 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 TCTARTCREE 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 CENT CHAR(1);
DECLARE VARIABLE MERCANCIA NUMERIC(18,2);
DECLARE VARIABLE INALC NUMERIC(18,2);
declare variable FACTOR DOUBLE PRECISION;
declare variable DIG INTEGER;
DECLARE VARIABLE FOMENTO VARCHAR(2);
DECLARE VARIABLE VRCONSUMO NUMERIC(18,2);
declare variable AUTORET VARCHAR(10);
declare variable FAUTORET DATE;
declare variable AUTORCREE VARCHAR(10);
declare variable FAUTORCREE DATE;
declare variable IDREM INTEGER;
declare variable IDPED INTEGER;
declare variable DTOXIT CHAR(2);
declare variable ERRORC INTEGER;
declare variable ICOING CHAR(2);
declare variable NITCONTA VARCHAR(20);
declare variable CNTNIT CHAR(2);
BEGIN
EXECUTE PROCEDURE LEE_CONFIGURACION('COMPRAS', 'FACTURAS', 'USAR IMPOCONSUMO COMO PORCENTAJE DE FOMENTO') returning_values (FOMENTO);
EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'FECHA AUTORETENEDOR NO DESCONTAR RETENCIONES DEL SALDO PERO SI CONTABILIZARLAS') returning_values (AUTORET);
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('FACTURACION', 'ARTICULOS', 'IMPOCONSUMO COMO MAYOR VALOR DEL COSTO Y DEL INGRESO') returning_values (ICOING);
if (AUTORET <> '') then
    FAUTORET = CAST(AUTORET AS DATE);
else
    FAUTORET = '9999/12/31';
EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'FECHA AUTORETENEDOR DE RETENCION CREE') returning_values (AUTORCREE);
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, :RTCREE,
    :COSTOS, :INVEN, :CTAVENTAS, :CTAIVA, :CTACONSUMO, :CTADTO, :CTAADIC, :CTAEXTRA,
    :CTACARTERA, :CTARTFTE, :CTARTIVA, :CTARTICA, :CTARTCREE, :CTAINVEN, :CTACOSTOS, :VER, :CENT;
  if (EXISTE = 'S') then
   BEGIN
    /* TRAIGA EL ENCABEZADO DE LA DEVOLUCION */
   SELECT PREF_PRE, DEVT_NUMERO, DEVT_FECHA, F.TERC_NIT, PTVT_ID, DEVT_FACTURA, DEVT_DTOMONTO, DEVT_ADICIONAL, DEVT_IVAMONTO, DEVT_EXTRA, DEVT_TOTAL,
        DEVT_RTFTEPORC, DEVT_RTFTEMONTO, DEVT_RTIVAPORC, DEVT_RTIVAMONTO, DEVT_RTICAPORC, DEVT_RTICAMONTO, DEVT_RTCREE, DEVT_RTCREEM,
        TERC_CTARTFTE, TERC_CTARTIVA, TERC_CTARTICA, TERC_CTARCREE, TERC_CTAVENTA, TERC_CTACLIENTE, DEVT_ANULADO, DEVT_REMID, DEVT_PEDID, T.terc_nitconta
        FROM DEVOLUCIONES_VENTAS F, TERCEROS T
        WHERE DEVT_ID = :IDDOC AND F.TERC_NIT = T.TERC_NIT
        INTO :PREF, :NUM, :FECAUX, :NIT, :PTOVTA, :NUMFAC, :VRDTO, :VRADIC, :VRIVA, :VREXTRA, :VRTOTAL,
        :PRTFTE, :VRRTFTE, :PORC, :VRRTIVA, :PRTICA, :VRRTICA, :PRTCREE, :VRRTCREE,
        :TCTARTFTE, TCTARTIVA, TCTARTICA, TCTARTCREE, TCTAVENTA, TCTACLIEN, ANULADO, :IDREM, :IDPED, :nitconta;
  if ((CNTNIT = 'SI') AND (NITCONTA IS NOT NULL)) then
    NIT = NITCONTA;
   if (idrem is null) Then
    IDREM = 0;
   if (idped is null) Then
    IDPED = 0;
   if ((ANULADO = 'N') AND (IDREM = 0) AND (IDPED = 0)) then
    BEGIN
    NUMERO = PREF || NUM;
    SELECT SUM(DVDE_CONSUMO) FROM devoluciones_ventas_detalle WHERE DEVT_ID = :iddoc AND ((DVDE_REFERENCIA <> '.t') or (DVDE_REFERENCIA IS NULL))
        INTO :MERCANCIA;
    SELECT SUM(DVDE_INACM) FROM devoluciones_ventas_detalle WHERE DEVT_ID = :iddoc AND ((DVDE_REFERENCIA <> '.t') or (DVDE_REFERENCIA IS NULL))
        INTO :INALC;
    VRSUBT = VRTOTAL - VREXTRA - VRIVA - MERCANCIA - INALC; /* BASE DE RETEFTE Y RETEICA */
    EXECUTE PROCEDURE lee_configuracion ('FACTURACION', 'DEVOLUCIONES', 'DESCUENTO PIE DEVOLUCION IGUAL A SUMA DE DESCUENTOS POR ITEM') returning_values (:DTOXIT);
    if (DTOXIT = 'SI') then
        VRDTO = 0;
    MERCANCIA = VRSUBT - VRADIC + VRDTO;
    IF (CENT = 'B') THEN
        SELECT B.BODE_CENTRO, B.BODE_PROY FROM BODEGA B, DEVOLUCIONES_VENTAS F
            WHERE B.BODE_COD = F.BODE_COD AND F.DEVT_ID = :IDDOC INTO :CENTRO, :PROY;
    IF (CENT = 'V') THEN
        SELECT V.CENT_COD, V.PROY_COD FROM VENDEDORES V, DEVOLUCIONES_VENTAS F
            WHERE V.VEND_COD = F.VEND_COD AND F.DEVT_ID = :IDDOC INTO :CENTRO, :PROY;
    IF (CENT = 'P') THEN
        SELECT P.PREF_CENTRO,P.PREF_PROY  FROM PREFIJOS P, DEVOLUCIONES_VENTAS F
            WHERE P.PREF_PRE = F.PREF_PRE AND F.DEVT_ID = :IDDOC AND P.TIDO_COD = 33 INTO :CENTRO, :PROY;
    EXECUTE PROCEDURE FECHA_A_CONTA(:FECAUX) returning_values (:FECHA);
    /* REGISTRE EL ENCABEZADO CONTABLE */
    CONC = 'DEVOLUCION VENTAS No. ' || NUMERO || ' EN FACTURA ' || NUMFAC;
    CONC = SUBSTR(CONC, 1, 60);
    NROI = 100000;
    SUMA = 0;
    ERROR = 0;
    /* 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;
    /* CUENTAS DE VENTAS */
    if (VENTAS = 'A') then
        BEGIN
        FOR SELECT MAX(COAR_CTADEV), SUM(DVDE_TOTAL-DVDE_IVAMONTO-DVDE_CONSUMO-DVDE_INACM), SUM(DVDE_IVAMONTO), SUM(DVDE_CONSUMO), MAX(B.bode_proy), MAX(B.bode_centro)
            FROM ARTICULO A, CONTABIL_ARTICULO_NIIF C, DEVOLUCIONES_VENTAS_DETALLE F, BODEGA B
            WHERE F.DEVT_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND B.bode_cod = F.bode_cod AND ((DVDE_REFERENCIA <> '.t') or (DVDE_REFERENCIA IS NULL))
            GROUP BY COAR_CTADEV
            INTO :CTAVENTAS, :MONTO, :IMPTOS, :VRCONSUMO, :proyi, :centi
            DO
            BEGIN
            if ((FOMENTO = 'SI') or (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(33, :IDDOC, :CTAVENTAS, '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)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
                    NROI = NROI + 1;
                    SUMA = SUMA + MONTO;
                    END
                ELSE
                    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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROYI, :CENTI, NULL, NULL, NULL, NULL, 0, 0);
                    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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    SUMA = SUMA + MONTO;
                    END
                END /* MONTO <> 0 */
            END /* FOR */
        END /* VENTAS A */
     IF ((VENTAS = 'C') OR (VENTAS = 'K')) THEN
        BEGIN
        IF (VENTAS = 'C') THEN
            CTAVENTAS = TCTAVENTA;
        SELECT SUM(DVDE_TOTAL-DVDE_IVAMONTO-DVDE_CONSUMO-DVDE_INACM), SUM(DVDE_IVAMONTO), SUM(DVDE_CONSUMO)
            FROM DEVOLUCIONES_VENTAS_DETALLE F
            WHERE F.DEVT_ID = :IDDOC  AND ((DVDE_REFERENCIA <> '.t') or (DVDE_REFERENCIA IS NULL))
            INTO :MONTO, :IMPTOS, :VRCONSUMO;
        if ((FOMENTO = 'SI') or (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(33, :IDDOC, :CTAVENTAS, '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)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
                NROI = NROI + 1;
                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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA + MONTO;
                END
            END /* MONTO <> 0 */
        END /* VENTAS C O K */

    if (IVA = 'A') then
        BEGIN
        FOR SELECT MAX(COAR_CTAIVADV), SUM(DVDE_IVAMONTO), SUM(DVDE_TOTAL-DVDE_IVAMONTO-DVDE_CONSUMO-DVDE_INACM), SUM(DVDE_CONSUMO)
            FROM ARTICULO A, CONTABIL_ARTICULO_NIIF C, DEVOLUCIONES_VENTAS_DETALLE F
            WHERE F.DEVT_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND ((DVDE_REFERENCIA <> '.t') or (DVDE_REFERENCIA IS NULL))
            GROUP BY COAR_CTAIVADV
            INTO :CTAIVA, :IMPTOS, :MONTO, :VALORADIC
        DO
            BEGIN
            if (FOMENTO = 'SI') then
                MONTO = 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(33, :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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :IMPTOS, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
                    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)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :IMPTOS, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    SUMA = SUMA + IMPTOS;
                    END
                END   /* IMPTOS <> 0 */
            END /* FOR */
        END /* IVA A */
    if (IVA = 'K') then
        BEGIN
        SELECT SUM(DVDE_IVAMONTO), SUM(DVDE_TOTAL-DVDE_IVAMONTO-DVDE_CONSUMO-DVDE_INACM), SUM(DVDE_CONSUMO)
            FROM DEVOLUCIONES_VENTAS_DETALLE F
            WHERE F.DEVT_ID = :IDDOC  AND ((DVDE_REFERENCIA <> '.t') or (DVDE_REFERENCIA IS NULL))
            INTO :IMPTOS, :MONTO, :VALORADIC;
        if (FOMENTO = 'SI') then
            MONTO = 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(33, :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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTAIVA, :CONC, '', :IMPTOS, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
                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)
                    VALUES (:IDC, :NROI, :CTAIVA, :CONC, '', :IMPTOS, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA + IMPTOS;
                END
            END /* IMPTOS <> 0 */
        END /* IVA K */

    if ((CONSUMO = 'A') AND (FOMENTO <> 'SI')) then
        BEGIN
        FOR SELECT MAX(COAR_CTACONS), SUM(DVDE_CONSUMO)
            FROM ARTICULO A, CONTABIL_ARTICULO_NIIF C, DEVOLUCIONES_VENTAS_DETALLE F
            WHERE F.DEVT_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND ((DVDE_REFERENCIA <> '.t') or (DVDE_REFERENCIA IS NULL))
            GROUP BY COAR_CTACONS
            INTO :CTACONSUMO, :IMPTOS
        DO
            BEGIN
            if (IMPTOS <> 0) then
                BEGIN
                EXECUTE PROCEDURE CUENTA_INTERFAZ_NIIF(33, :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)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :IMPTOS, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
                    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)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :IMPTOS, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    SUMA = SUMA + IMPTOS;
                    END
                END /* IMPTOS <> 0 */
            END /* FOR */
        END /* CONSUMO A */
    if ((CONSUMO = 'K') AND (FOMENTO <> 'SI')) then
        BEGIN
        SELECT SUM(DVDE_CONSUMO)
            FROM DEVOLUCIONES_VENTAS_DETALLE F
            WHERE F.DEVT_ID = :IDDOC AND ((DVDE_REFERENCIA <> '.t') or (DVDE_REFERENCIA IS NULL))
            INTO :IMPTOS;
        if (IMPTOS <> 0) then
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ_NIIF(33, :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)
                    VALUES (:IDC, :NROI, :CTACONSUMO, :CONC, '', :IMPTOS, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 31);
                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)
                    VALUES (:IDC, :NROI, :CTACONSUMO, :CONC, '', :IMPTOS, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA + IMPTOS;
                END
            END /* IMPTOS <> 0 */
        END /* CONSUMO K */
    /* INALC */
        BEGIN
        SELECT SUM(DVDE_INACM)
            FROM DEVOLUCIONES_VENTAS_DETALLE F
            WHERE F.DEVT_ID = :IDDOC AND ((DVDE_REFERENCIA <> '.t') or (DVDE_REFERENCIA IS NULL))
            INTO :IMPTOS;
        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(33, :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)
                    VALUES (:IDC, :NROI, :CTACONSUMO, :CONC, '', :IMPTOS, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 31);
                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)
                    VALUES (:IDC, :NROI, :CTACONSUMO, :CONC, '', :IMPTOS, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA + IMPTOS;
                END
            END /* IMPTOS <> 0 */
        END /* INALC */

    if ((CTADTO IS NOT NULL) AND
        (CTADTO <> '') AND
        (VRDTO <> 0)) THEN
        BEGIN
        EXECUTE PROCEDURE CUENTA_INTERFAZ_NIIF(33, :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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRDTO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
            NROI = NROI + 1;
            SUMA = SUMA - VRDTO;
            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)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRDTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 33);
            NROI = NROI + 1;
            SUMA = SUMA - VRDTO;
            END
        END

    if ((CTAADIC IS NOT NULL) AND
        (CTAADIC <> '') AND
        (VRADIC <> 0)) THEN
        BEGIN
        EXECUTE PROCEDURE CUENTA_INTERFAZ_NIIF(33, :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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRADIC, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
            NROI = NROI + 1;
            SUMA = SUMA + VRADIC;
            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)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRADIC, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 33);
            NROI = NROI + 1;
            SUMA = SUMA + VRADIC;
            END
        END

    if ((CTAEXTRA IS NOT NULL) AND
        (CTAEXTRA <> '') AND
        (VREXTRA <> 0)) THEN
        BEGIN
        EXECUTE PROCEDURE CUENTA_INTERFAZ_NIIF(33, :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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VREXTRA, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
            NROI = NROI + 1;
            SUMA = SUMA + VREXTRA;
            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)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VREXTRA, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 33);
            NROI = NROI + 1;
            SUMA = SUMA + VREXTRA;
            END
        END

    if ((RTFTE = 'C') or (RTFTE = 'K')) then
      if (VRRTFTE <> 0) then
        BEGIN
        if (RTFTE = 'C') then
            CTARTFTE = TCTARTFTE;
        EXECUTE PROCEDURE CUENTA_INTERFAZ_NIIF(33, :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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTFTE, (:VRSUBT*-1), :PRTFTE, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
            NROI = NROI + 1;
            SUMA = SUMA - VRRTFTE;
            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)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTFTE, (:VRSUBT*-1), :PRTFTE, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            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(33, :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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTFTE, 0, :VRSUBT, :PRTFTE, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
                NROI = NROI + 1;
                SUMA = SUMA + VRRTFTE;
                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)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTFTE, 0, :VRSUBT, :PRTFTE, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA + VRRTFTE;
                END
            END
        END /* RTFTE */
    if (RTFTE = 'A') then
     if (VRRTFTE <> 0) then
      BEGIN
      FOR SELECT MAX(COAR_CTARTFTEV), MAX(COAR_RTFTE), MIN(COAR_RTBASE), SUM(DVDE_TOTAL-DVDE_IVAMONTO-DVDE_CONSUMO), SUM((DVDE_TOTAL-DVDE_IVAMONTO-DVDE_CONSUMO)*COAR_RTFTE)
        FROM CONTABIL_ARTICULO_NIIF C, devoluciones_ventas_detalle F
        WHERE F.devt_id = :IDDOC AND F.ARTI_COD = C.ARTI_COD AND ((DVDE_REFERENCIA <> '.t') or (DVDE_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(33, :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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTFTE, (:MONTO*-1), :PRTFTE, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
                    NROI = NROI + 1;
                    SUMA = SUMA - VRRTFTE;
                    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)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTFTE, (:MONTO*-1), :PRTFTE, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    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(33, :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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTFTE, 0, :MONTO, :PRTFTE, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
                        NROI = NROI + 1;
                        SUMA = SUMA + VRRTFTE;
                        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)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTFTE, 0, :MONTO, :PRTFTE, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                        NROI = NROI + 1;
                        SUMA = SUMA + VRRTFTE;
                        END
                    END
                END
            END
        END /* RTFTE */
      END

    if ((RTIVA = 'C') or (RTIVA = 'K')) then
      if (VRRTIVA <> 0) then
        BEGIN
        if (RTIVA = 'C') then
            CTARTIVA = TCTARTIVA;
        EXECUTE PROCEDURE CUENTA_INTERFAZ_NIIF(33, :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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTIVA, (:VRIVA*-1), :PORC, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
            NROI = NROI + 1;
            SUMA = SUMA - VRRTIVA;
            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)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTIVA, (:VRIVA*-1), :PORC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            SUMA = SUMA - VRRTIVA;
            END
        END /* RTIVA */

    if ((RTICA = 'C') or (RTICA = 'K')) then
      if (VRRTICA <> 0) then
        BEGIN
        if (RTICA = 'C') then
            CTARTICA = TCTARTICA;
        EXECUTE PROCEDURE CUENTA_INTERFAZ_NIIF(33, :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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTICA, (:VRSUBT*-1), :PRTICA, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
            NROI = NROI + 1;
            SUMA = SUMA - VRRTICA;
            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)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTICA, (:VRSUBT*-1), :PRTICA, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            SUMA = SUMA - VRRTICA;
            END
        END /* RTICA */
    if (RTICA = 'A') then
      BEGIN
      if (VRRTICA <> 0) then
        BEGIN
        FOR SELECT MAX(COAR_CTARTICAV), SUM(DVDE_TOTAL-DVDE_IVAMONTO-DVDE_CONSUMO), SUM(((DVDE_TOTAL-DVDE_IVAMONTO-DVDE_CONSUMO)/1000)*:prtica)
          FROM CONTABIL_ARTICULO_NIIF C, devoluciones_ventas_detalle F
          WHERE F.devt_id = :IDDOC AND F.ARTI_COD = C.ARTI_COD AND ((DVDE_REFERENCIA <> '.t') or (DVDE_REFERENCIA IS NULL))
          GROUP BY COAR_CTARTICAV
          INTO :ctartica, :MONTO, :vrrtica
          DO
          BEGIN
          MONTO = MONTO * FACTOR;
          vrrtica = vrrtica * FACTOR;
          execute procedure redondee(vrrtica, DIG) returning_values (vrrtica);
          execute procedure redondee(MONTO, DIG) returning_values (MONTO);
          if (vrrtica <> 0) then
            BEGIN
            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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :vrrtica, (:MONTO*-1), :prtica/10, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :fecha, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA - vrrtica;
                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)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :vrrtica, (:MONTO*-1), :prtica/10, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA - vrrtica;
                END
            END
          END
        END
      END   /* RTICA */

    if ((RTCREE = 'C') or (RTCREE = 'K')) then
      if (VRRTCREE <> 0) then
        BEGIN
        if (RTCREE = 'C') then
            CTARTCREE = TCTARTCREE;
        EXECUTE PROCEDURE CUENTA_INTERFAZ_NIIF(33, :IDDOC, :CTARTCREE, '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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTCREE, (:VRSUBT*-1), :PRTCREE, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
            NROI = NROI + 1;
            SUMA = SUMA - VRRTCREE;
            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)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTCREE, (:VRSUBT*-1), :PRTCREE, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            SUMA = SUMA - VRRTCREE;
            END
        /* AUTORETENCION */
        if (fautorcree <= fecaux) then
            BEGIN
            EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'CUENTA DE AUTORETENCION CREE') returning_values (ctartcree);
            EXECUTE PROCEDURE CUENTA_INTERFAZ_NIIF(33, :IDDOC, :ctartcree, '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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :vrrtcree, 0, :VRSUBT, :prtcree, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
                NROI = NROI + 1;
                SUMA = SUMA + vrrtcree;
                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)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :vrrtcree, 0, :VRSUBT, :prtcree, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA + vrrtcree;
                END
            END
        END /* RTCREE */
    if (RTCREE = 'A') then
      BEGIN
      FOR SELECT MAX(COAR_CTARTCREE), MAX(COAR_RTCREE), SUM(DVDE_TOTAL-DVDE_IVAMONTO-DVDE_CONSUMO), SUM((DVDE_TOTAL-DVDE_IVAMONTO-DVDE_CONSUMO)*COAR_RTCREE)
        FROM CONTABIL_ARTICULO_NIIF C, devoluciones_ventas_detalle F
        WHERE F.devt_id = :IDDOC AND F.ARTI_COD = C.ARTI_COD AND ((DVDE_REFERENCIA <> '.t') or (DVDE_REFERENCIA IS NULL))
        GROUP BY COAR_CTARTCREE
        INTO :ctartcree, :PRTFTE, :MONTO, :vrrtcree
        DO
        BEGIN
        MONTO = MONTO * FACTOR;
        VRRTCREE = VRRTCREE * FACTOR / 100;
        execute procedure redondee(VRRTCREE, DIG) returning_values (VRRTCREE);
        execute procedure redondee(MONTO, DIG) returning_values (MONTO);
        if (VRRTCREE <> 0) then
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ_NIIF(33, :IDDOC, :CTARTCREE, '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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :vrrtcree, (:MONTO*-1), :prtcree, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
                NROI = NROI + 1;
                SUMA = SUMA - vrrtcree;
                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)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :vrrtcree, (:MONTO*-1), :prtcree, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA - vrrtcree;
                END
            /* AUTORETENCION */
            if (fautorcree <= fecaux) then
                BEGIN
                EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'CUENTA DE AUTORETENCION CREE') returning_values (ctartcree);
                EXECUTE PROCEDURE CUENTA_INTERFAZ_NIIF(33, :IDDOC, :ctartcree, '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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :vrrtcree, 0, :MONTO, :prtcree, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
                    NROI = NROI + 1;
                    SUMA = SUMA + vrrtcree;
                    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)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :vrrtcree, 0, :MONTO, :prtcree, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    SUMA = SUMA + vrrtcree;
                    END
                END
            END
        END /* RTCREE */
      END
    /* SI HAY ARTICULOS DE TERCEROS LLEVE ESE VALOR A LA CUENTA INDICADA */
    SELECT SUM(DVDE_TOTAL) FROM devoluciones_ventas_detalle F, ARTICULO A
        WHERE F.devt_id = :IDDOC AND ((DVDE_REFERENCIA <> '.t') or (DVDE_REFERENCIA IS NULL)) AND F.arti_cod = A.arti_cod AND A.arti_tercero = 'S'
        INTO :MONTO;
    if (MONTO IS NULL) then
        MONTO = 0;
    if (MONTO <> 0) then
        BEGIN
        if ((CTADTO IS NULL) OR (CTADTO = '')) then
            MONTO = MONTO * FACTOR;
        /* reste las retenciones en la misma cuenta (4 digitos) */
        EXECUTE PROCEDURE lee_configuracion('FACTURACION', 'FACTURAS', 'CUENTA DE CARTERA PARA INGRESOS DE TERCEROS') returning_values(:CTAVENTAS);
        select sum(cnde_debitos-cnde_creditos) from contabilizacion_det where cntb_id = :idc and substring(cnde_cuenta from 1 for 4) = substring(:ctaventas from 1 for 4)
            into :vrrtfte;
        if (vrrtfte is null) then
            vrrtfte = 0;
        monto = monto + vrrtfte;
        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 = '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)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :fecha, NULL, 0, 31);
                NROI = NROI + 1;
                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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA - MONTO;
                END
            END
        END /* MONTO <> 0 */

    /* CIERRE CONTRA CUENTA TERCERO O CONSTANTE */
    if ((SUMA <> 0) and ((CARTERA = 'C') or (CARTERA = 'K') or (CARTERA = 'J'))) then
        BEGIN
        if (icoing = 'SI') then
            BEGIN
            /* DESCUENTE EL IMPOCONSUMO */
            SELECT SUM(DVDE_CONSUMO)
                FROM devoluciones_ventas_detalle F WHERE F.DEVT_ID = :IDDOC AND ((DVDE_REFERENCIA <> '.t') or (DVDE_REFERENCIA IS NULL)) INTO :IMPTOS;
            SUMA = SUMA - IMPTOS;
            END
        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
            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(33, :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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :DEBITO, :CREDITO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
        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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :DEBITO, :CREDITO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
        NROI = NROI + 1;
        END /* SUMA CARTERA */
    /* COSTOS VENTAS */
    EXECUTE PROCEDURE COSTO_EN_VENTAS(33, :IDDOC);
    if (COSTOS = 'A') then
        BEGIN
        FOR SELECT MAX(CTACOS), SUM(CAST(CANT AS DOUBLE PRECISION) * COSTO), SUM(DVDE_CONSUMO)
            FROM COSTO_VENTAS CV, devoluciones_ventas_detalle D WHERE CV.cove_item = D.dvde_item AND D.devt_id = :iddoc AND
            TIDO_COD = 33 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(33, :IDDOC, :CTACOSTOS, '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)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
                    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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    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 WHERE TIDO_COD = 33 AND COVE_ID = :IDDOC
            INTO :MONTO;
        if (icoing = 'SI') then
            MONTO = MONTO + imptos;
        if (MONTO <> 0) then
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ_NIIF(33, :IDDOC, :CTACOSTOS, '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)
                    VALUES (:IDC, :NROI, :CTACOSTOS, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
                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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTACOSTOS, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                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 WHERE TIDO_COD = 33 AND COVE_ID = :IDDOC
            GROUP BY CTAINV
            INTO :CTAINVEN, :MONTO
        DO
            BEGIN
            if (MONTO <> 0) then
                BEGIN
                EXECUTE PROCEDURE CUENTA_INTERFAZ_NIIF(33, :IDDOC, :CTAINVEN, '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)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
                    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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    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 WHERE TIDO_COD = 33 AND COVE_ID = :IDDOC
            INTO :MONTO;
        if (MONTO <> 0) then
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ_NIIF(33, :IDDOC, :CTAINVEN, '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)
                    VALUES (:IDC, :NROI, :CTAINVEN, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
                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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTAINVEN, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                END
            END /* MONTO <> 0 */
        END /* INVEN = K */
    /* 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(33, :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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTADIC, :CONC, '', :MONTO, 0, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
                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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTADIC, :CONC, '', 0, :MONTO, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 33);
                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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTADIC, :CONC, '', :MONTO, 0, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTADIC, :CONC, '', 0, :MONTO, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                END
            NROI = NROI + 1;
            END
        END
    if (error > 0) then
        ver = 'S';
    SUSPEND;
    END
   END /* EXISTE INTERFAZ */
  ELSE
    BEGIN
    EXECUTE PROCEDURE ERRORINT(1033, :IDDOC, :PREF, 1);
    ERROR = ERROR + 1;
    VER = 'S';
    SUSPEND;
    END
END

^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE CONTABIL_FACTURA(
    IDDOC INTEGER,
    IDINTER INTEGER)
RETURNS (
    ERROR INTEGER,
    VER CHAR(1),
    IDC INTEGER)
AS
declare variable pref varchar(4);
declare variable num varchar(8);
declare variable numero varchar(12);
declare variable fecaux date;
declare variable fecha char(8);
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 prtcree numeric(9,2);
declare variable vrrtcree 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 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 rtcree char(1);
declare variable ctartcree 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 proyi varchar(4);
declare variable centi 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 tctartcree 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 fomento varchar(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('COMPRAS', 'FACTURAS', 'USAR IMPOCONSUMO COMO PORCENTAJE DE FOMENTO') returning_values (FOMENTO);
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', TICO_COD, PRCO_PRE, INVE_VENTAS, INVE_IVA, INVE_CONSUMO, INVE_CARTERA, INVE_RTFTE, INVE_RTIVA, INVE_RTICA, INVE_RTCREE,
    INVE_COSTO, INVE_INVEN, INVE_CTAVENTAS, INVE_CTAIVA, INVE_CTACONSUMO, INVE_CTADTO, INVE_CTAADIC, INVE_CTAEXTRA,
    INVE_CTACARTERA, INVE_CTARTFTE, INVE_CTARTIVA, INVE_CTARTICA, INVE_CTARTCREE, INVE_CTAINVEN, INVE_CTACOSTOS, INVE_CONFIRMAR, INVE_CENTRO
    FROM INTERFAZ_VENTAS
    WHERE INVE_ID = :IDINTER
    INTO :EXISTE, :TIPOCOMP, :PREFCONT, :VENTAS, :IVA, :CONSUMO, :CARTERA, :RTFTE, :RTIVA, :RTICA, :RTCREE,
    :COSTOS, :INVEN, :CTAVENTAS, :CTAIVA, :CTACONSUMO, :CTADTO, :CTAADIC, :CTAEXTRA,
    :CTACARTERA, :CTARTFTE, :CTARTIVA, :CTARTICA, :CTARTCREE, :CTAINVEN, :CTACOSTOS, :VER, :CENT;
if (EXISTE = 'S') then
  BEGIN
    /* BORRE CUALQUEIR CONTABILIZACION PREVIA */
    DELETE FROM CONTABILIZACION WHERE CNTB_TIPOREF = 31 AND CNTB_IDREF = :IDDOC;

  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, :prtcree, :vrrtcree,
        :NOMBRE, TCTARTFTE, TCTARTIVA, TCTARTICA, tctartcree, TCTAVENTA, TCTACLIEN, ANULADO, :nitconta, :tercexento;
  if ((CNTNIT = 'SI') AND (NITCONTA IS NOT NULL)) then
    NIT = NITCONTA;
  if (ANULADO = 'N') then
    BEGIN
    IF (CENT = 'B') THEN
        SELECT B.BODE_CENTRO, B.BODE_PROY FROM BODEGA B, FACTURAS F
            WHERE B.BODE_COD = F.BODE_COD AND F.FACT_ID = :IDDOC INTO :CENTRO, :PROY;
    IF (CENT = 'V') THEN
        SELECT V.CENT_COD, V.PROY_COD FROM VENDEDORES V, FACTURAS F
            WHERE V.VEND_COD = F.VEND_COD AND F.FACT_ID = :IDDOC INTO :CENTRO, :PROY;
    IF (CENT = 'P') THEN
        SELECT P.PREF_CENTRO,P.PREF_PROY  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;
    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;
    EXECUTE PROCEDURE FECHA_A_CONTA(:FECAUX) returning_values (:FECHA);
    EXECUTE PROCEDURE FECHA_A_CONTA(:VENCEAUX) returning_values (:VENCE);
    /* ENCABEZADO CONTABLE */
    IDC = GEN_ID(ID_CONTABILIZA, 1);
    if (STRLEN(NOMBRE)> 41 ) then
      CONC = 'FV No.' || NUMERO || '-' || SUBSTR(NOMBRE,1,41);
    ELSE
      CONC = 'FV No.' || NUMERO || '-' || NOMBRE;
    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, '', 31, :IDDOC, :PREF, :NUM, 'N');
    NROI = 0;
    SUMA = 0;
    ERROR = 0;
    /* FACTOR PARA VENTAS E IVA */
    if (MERCANCIA <> 0) then
        FACTOR = CAST(VRSUBT AS DOUBLE PRECISION) / CAST(MERCANCIA AS DOUBLE PRECISION);
    ELSE
        FACTOR = 1;
    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
     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 ((FOMENTO = 'SI') or (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(31, :IDDOC, :CTAVENTAS, '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)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                NROI = NROI + 1;
                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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA - MONTO;
                END
            END /* MONTO <> 0 */
        END /* VENTAS C O K */
    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)
            FROM ARTICULO A, CONTABIL_ARTICULO 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
            DO
            BEGIN
            if ((FOMENTO = 'SI') or (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(31, :IDDOC, :CTAVENTAS, '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)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                    NROI = NROI + 1;
                    SUMA = SUMA - MONTO;
                    END
                ELSE
                    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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROYI, :CENTI, NULL, NULL, NULL, NULL, 0, 0);
                    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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    SUMA = SUMA - MONTO;
                    END
                END /* MONTO <> 0 */
            END /* FOR */
        END /* VENTAS A */
    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 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))
            AND FADE_IVAMONTO <> 0
            GROUP BY COAR_CTAIVAV
            INTO :CTAIVA, :IMPTOS, :MONTO, :VALORADIC
            DO
            BEGIN
            if (FOMENTO = 'SI') then
                MONTO = MONTO + VALORADIC;
            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(31, :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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :IMPTOS, :MONTO, ABS(:IMPTOS*100/:MONTO), :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                    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)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :IMPTOS, :MONTO, ABS(:IMPTOS*100/:MONTO), :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    SUMA = SUMA - IMPTOS;
                    END
                END   /* IMPTOS <> 0 */
            END /* FOR */
        END /* IVA A */
    if (IVA = 'K') then
        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;
        if (FOMENTO = 'SI') then
            MONTO = 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(31, :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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTAIVA, :CONC, '', 0, :IMPTOS, :MONTO, ABS(:IMPTOS*100/:MONTO), :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                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)
                    VALUES (:IDC, :NROI, :CTAIVA, :CONC, '', 0, :IMPTOS, :MONTO, ABS(:IMPTOS*100/:MONTO), :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA - IMPTOS;
                END
            END /* IMPTOS <> 0 */
        END /* IVA K */
    if ((CONSUMO = 'A') AND (FOMENTO <> 'SI')) then
        BEGIN
        FOR SELECT MAX(COAR_CTACONS), SUM(FADE_CONSUMO)
            FROM ARTICULO A, CONTABIL_ARTICULO 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(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)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                    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)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    SUMA = SUMA - IMPTOS;
                    END
                END /* IMPTOS <> 0 */
            END /* FOR */
        END /* CONSUMO A */
    if ((CONSUMO = 'K') AND (FOMENTO <> 'SI')) then
        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(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)
                    VALUES (:IDC, :NROI, :CTACONSUMO, :CONC, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                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)
                    VALUES (:IDC, :NROI, :CTACONSUMO, :CONC, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA - IMPTOS;
                END
            END /* IMPTOS <> 0 */
        END /* CONSUMO K */
    /* IMP NACIONAL CONSUMO */
        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(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)
                    VALUES (:IDC, :NROI, :CTACONSUMO, :CONC, '', 0, :IMPTOS, :MONTO, :PORC, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                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)
                    VALUES (:IDC, :NROI, :CTACONSUMO, :CONC, '', 0, :IMPTOS, :MONTO, :PORC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA - IMPTOS;
                END
            END /* IMPTOS <> 0 */
        END /* INALC */
    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(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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRDTO, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA + VRDTO;
                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)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRDTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA + VRDTO;
                END
            END
        END /* DESCUENTO */
    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(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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRADIC, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA - VRADIC;
                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)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRADIC, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA - VRADIC;
                END
            END
        END /* VR. ADIC */
    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(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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VREXTRA, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA - VREXTRA;
                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)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VREXTRA, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA - VREXTRA;
                END
            END
        END /* VR. EXTRA */
    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(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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTFTE, 0, :VRSUBT, :PRTFTE, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
            NROI = NROI + 1;
            SUMA = SUMA + VRRTFTE;
            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)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTFTE, 0, :VRSUBT, :PRTFTE, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            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(31, :IDDOC, :CTARTFTE, 2);
                CUENTA = CTARTFTE;
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                end
            if ((TIPOCUEN = 'I') or (TIPOCUEN = 'A')) then
                begin
                EXECUTE PROCEDURE ERRORINT(31, :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)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTFTE, (:VRSUBT*-1), :PRTFTE, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTFTE, (:VRSUBT*-1), :PRTFTE, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                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 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(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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTFTE, 0, :MONTO, :PRTFTE, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                    NROI = NROI + 1;
                    SUMA = SUMA + VRRTFTE;
                    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)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTFTE, 0, :MONTO, :PRTFTE, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    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(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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTFTE, (:MONTO*-1), :PRTFTE, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                        NROI = NROI + 1;
                        SUMA = SUMA - VRRTFTE;
                        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)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTFTE, (:MONTO*-1), :PRTFTE, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                        NROI = NROI + 1;
                        SUMA = SUMA - VRRTFTE;
                        END
                    END
                END
            END
          END
        END /* RTFTE */
      END
    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(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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTIVA, 0, :VRIVA, :PORC, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
            NROI = NROI + 1;
            SUMA = SUMA + VRRTIVA;
            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)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTIVA, 0, :VRIVA, :PORC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            SUMA = SUMA + VRRTIVA;
            END
        END /* RTIVA */
      END
    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(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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTICA, 0, :VRSUBT, :PRTICA, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
            NROI = NROI + 1;
            SUMA = SUMA + VRRTICA;
            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)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTICA, 0, :VRSUBT, :PRTICA, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            SUMA = SUMA + VRRTICA;
            END
        END /* RTICA */
      END
    if (RTICA = 'A') then
      BEGIN
      if (VRRTICA <> 0) then
        BEGIN
        FOR SELECT MAX(COAR_CTARTICAV), SUM(FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO), SUM(((FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO)/1000)*:prtica)
          FROM CONTABIL_ARTICULO 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_CTARTICAV
          INTO :ctartica, :MONTO, :vrrtica
          DO
          BEGIN
          MONTO = MONTO * FACTOR;
          vrrtica = vrrtica * FACTOR;
          execute procedure redondee(vrrtica, DIG) returning_values (vrrtica);
          execute procedure redondee(MONTO, DIG) returning_values (MONTO);
          if (vrrtica <> 0) then
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ(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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :vrrtica, 0, :MONTO, :prtica/10, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA + vrrtica;
                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)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :vrrtica, 0, :MONTO, :prtica/10, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA + vrrtica;
                END
            END
          END
        END
      END   /* RTICA */
    if ((RTCREE = 'C') or (RTCREE = 'K')) then
      BEGIN
      execute procedure redondee(VRRTCREE, DIG) returning_values (VRRTCREE);
      if (VRRTCREE <> 0) then
        BEGIN
        if (RTCREE = 'C') then
            CTARTCREE = TCTARTCREE;
        EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTARTCREE, '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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTCREE, 0, :VRSUBT, :prtcree, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
            NROI = NROI + 1;
            SUMA = SUMA + VRRTCREE;
            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)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTCREE, 0, :VRSUBT, :prtcree, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            SUMA = SUMA + VRRTCREE;
            END
        /* AUTORETECREE */
        if (fautorcree <= fecaux) then
            BEGIN
            EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'CUENTA DE AUTORETENCION CREE') returning_values (ctartcree);
            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(31, :IDDOC, :ctartcree, 2);
                CUENTA = ctartcree;
                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)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :vrrtcree, (:VRSUBT*-1), :prtcree, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA - vrrtcree;
                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)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :vrrtcree, (:VRSUBT*-1), :prtcree, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA - vrrtcree;
                END
            END
        END /* RTCREE */
      END
    if (RTCREE = 'A') then
      BEGIN
      if (VRRTCREE <> 0) then
        BEGIN
        FOR SELECT MAX(COAR_CTARTCREE), MAX(COAR_RTCREE), SUM(FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO), SUM((FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO)*COAR_RTCREE)
          FROM CONTABIL_ARTICULO 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_CTARTCREE
          INTO :ctartcree, :prtcree, :MONTO, :vrrtcree
          DO
          BEGIN
          MONTO = MONTO * FACTOR;
          vrrtcree = vrrtcree * FACTOR / 100;
          execute procedure redondee(vrrtcree, DIG) returning_values (vrrtcree);
          execute procedure redondee(MONTO, DIG) returning_values (MONTO);
          if (vrrtcree <> 0) then
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :ctartcree, '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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :vrrtcree, 0, :MONTO, :prtcree, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                NROI = NROI + 1;
                SUMA = SUMA + vrrtcree;
                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)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :vrrtcree, 0, :MONTO, :prtcree, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA + vrrtcree;
                END
            /* AUTORETENCION */
            if (fautorcree <= fecaux) then
                BEGIN
                EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'CUENTA DE AUTORETENCION CREE') returning_values (ctartcree);
                EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :ctartcree, '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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :vrrtcree, (:MONTO*-1), :prtcree, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                    NROI = NROI + 1;
                    SUMA = SUMA - vrrtcree;
                    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)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :vrrtcree, (:MONTO*-1), :prtcree, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    SUMA = SUMA - vrrtcree;
                    END
                END
            END
          END
        END /* RTCREE */
      END
    /* ARTICULOS DE TERCEROS LLEVE ESE VALOR A LA CUENTA INDICADA */
    SELECT SUM(FADE_TOTAL) FROM FACTURAS_DETALLE F, ARTICULO A
        WHERE F.FACT_ID = :IDDOC AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL)) AND F.arti_cod = A.arti_cod AND A.arti_tercero = 'S'
        INTO :MONTO;
    if (MONTO IS NULL) then
        MONTO = 0;
    if (MONTO <> 0) then
        BEGIN
        if ((CTADTO IS NULL) OR (CTADTO = '')) then
            MONTO = MONTO * FACTOR;
        /* reste las retenciones en la misma cuenta (4 digitos) */
        EXECUTE PROCEDURE lee_configuracion('FACTURACION', 'FACTURAS', 'CUENTA DE CARTERA PARA INGRESOS DE TERCEROS') returning_values(:CTAVENTAS);
        select sum(cnde_debitos-cnde_creditos) from contabilizacion_det where cntb_id = :idc and substring(cnde_cuenta from 1 for 4) = substring(:ctaventas from 1 for 4)
            into :vrrtfte;
        if (vrrtfte is null) then
            vrrtfte = 0;
        monto = monto - vrrtfte;
        execute procedure redondee(MONTO, DIG) returning_values (MONTO);
        if (MONTO <> 0) then
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTAVENTAS, '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)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                NROI = NROI + 1;
                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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA + MONTO;
                END
            END /* MONTO <> 0 */
        END
    /* CIERRE 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
            BEGIN
            /* DESCUENTE IMPOCONSUMO DEL COSTO */
            SELECT SUM(FADE_CONSUMO) FROM FACTURAS_DETALLE F WHERE F.FACT_ID = :IDDOC AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
                INTO :IMPTOS;
            SUMA = SUMA + IMPTOS;
            END
        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
            /* CUENTA DE 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(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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :DEBITO, :CREDITO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
        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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :DEBITO, :CREDITO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
        NROI = NROI + 1;
        END /* SUMA EN CARTERA */
    /* CALCULE COSTOS EN VENTAS */
    EXECUTE PROCEDURE COSTO_EN_VENTAS(31, :IDDOC);
    if (COSTOS = 'A') then
        BEGIN
        FOR SELECT MAX(CTACOS), SUM(CAST(CANT AS DOUBLE PRECISION) * COSTO), SUM(FADE_CONSUMO)
            FROM COSTO_VENTAS 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(31, :IDDOC, :CTACOSTOS, '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)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                    NROI = NROI + 1;
                    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)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    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 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(31, :IDDOC, :CTACOSTOS, '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)
                    VALUES (:IDC, :NROI, :CTACOSTOS, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                NROI = NROI + 1;
                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)
                    VALUES (:IDC, :NROI, :CTACOSTOS, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                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 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(31, :IDDOC, :CTAINVEN, '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)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                    NROI = NROI + 1;
                    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)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    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 WHERE TIDO_COD = 31 AND COVE_ID = :iddoc
            INTO :MONTO;
        if (MONTO <> 0) then
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTAINVEN, '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)
                    VALUES (:IDC, :NROI, :CTAINVEN, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                NROI = NROI + 1;
                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)
                    VALUES (:IDC, :NROI, :CTAINVEN, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                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(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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTADIC, :CONC, '', :MONTO, 0, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTADIC, :CONC, '', 0, :MONTO, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                NROI = NROI + 1;
                END
            ELSE
                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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTADIC, :CONC, '', :MONTO, 0, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTADIC, :CONC, '', 0, :MONTO, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                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(31, :IDDOC, :PREF, 1);
    ERROR = ERROR + 1;
    VER = 'S';
    SUSPEND;
    END
END

^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE CONTABIL_FACTURA_FACTOR(
    IDDOC INTEGER,
    IDINTER INTEGER)
RETURNS (
    ERROR INTEGER,
    VER CHAR(1),
    IDC INTEGER)
AS
declare variable pref varchar(4);
declare variable num varchar(8);
declare variable numero varchar(10);
declare variable fecaux date;
declare variable fecha char(8);
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 vrtotal numeric(18,2);
declare variable vrextra numeric(18,2);
declare variable tipocomp varchar(3);
declare variable prefcont varchar(4);
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 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 proyi varchar(4);
declare variable centi 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 art varchar(15);
declare variable imptos numeric(18,2);
declare variable suma numeric(18,2);
declare variable porciva numeric(9,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 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 fomento varchar(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 ERRORC INTEGER;
declare variable ICOING CHAR(2);
declare variable porcajus numeric(9,2);
declare variable factoraj double precision;
BEGIN
EXECUTE PROCEDURE LEE_CONFIGURACION('COMPRAS', 'FACTURAS', 'USAR IMPOCONSUMO COMO PORCENTAJE DE FOMENTO') returning_values (FOMENTO);
EXECUTE PROCEDURE LEE_CONFIGURACION('FACTURACION', 'ARTICULOS', 'IMPOCONSUMO COMO MAYOR VALOR DEL COSTO Y DEL INGRESO') returning_values (ICOING);
EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'FECHA AUTORETENEDOR NO DESCONTAR RETENCIONES DEL SALDO PERO SI CONTABILIZARLAS') returning_values (AUTORET);
if (AUTORET <> '') then
    FAUTORET = CAST(AUTORET AS DATE);
else
    FAUTORET = '9999/12/31';
/* BUSQUE LA INTERFACE */
EXISTE = 'N';
SELECT 'S', TICO_COD, PRCO_PRE, INVE_VENTAS, INVE_IVA, INVE_CONSUMO, INVE_CARTERA, INVE_RTFTE, INVE_RTIVA, INVE_RTICA, INVE_COSTO, INVE_INVEN, INVE_CTAVENTAS, INVE_CTAIVA, INVE_CTACONSUMO, INVE_CTADTO, INVE_CTAADIC, INVE_CTAEXTRA, INVE_CTACARTERA, INVE_CTARTFTE, INVE_CTARTIVA, INVE_CTARTICA, INVE_CTAINVEN, INVE_CTACOSTOS, INVE_CONFIRMAR, INVE_CENTRO
    FROM INTERFAZ_VENTAS
    WHERE INVE_ID = :IDINTER
    INTO :EXISTE, :TIPOCOMP, :PREFCONT, :VENTAS, :IVA, :CONSUMO, :CARTERA, :RTFTE, :RTIVA, :RTICA, :COSTOS, :INVEN, :CTAVENTAS, :CTAIVA, :CTACONSUMO, :CTADTO, :CTAADIC, :CTAEXTRA, :CTACARTERA, :CTARTFTE, :CTARTIVA, :CTARTICA, :CTAINVEN, :CTACOSTOS, :VER, :CENT;
if (EXISTE = 'S') then
  BEGIN
    /* BORRE CUALQUEIR CONTABILIZACION PREVIA */
    DELETE FROM CONTABILIZACION WHERE CNTB_TIPOREF = 31 AND CNTB_IDREF = :IDDOC;

  /* 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_NOMCLIENTE, TERC_CTARTFTE, TERC_CTARTIVA, TERC_CTARTICA, TERC_CTAVENTA, TERC_CTACLIENTE, FACT_ANULADO
        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, :NOMBRE, TCTARTFTE, TCTARTIVA, TCTARTICA, TCTAVENTA, TCTACLIEN, ANULADO;
  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 FROM BODEGA B, FACTURAS F
            WHERE B.BODE_COD = F.BODE_COD AND F.FACT_ID = :IDDOC INTO :CENTRO, :PROY;
    IF (CENT = 'V') THEN
        SELECT V.CENT_COD, V.PROY_COD FROM VENDEDORES V, FACTURAS F
            WHERE V.VEND_COD = F.VEND_COD AND F.FACT_ID = :IDDOC INTO :CENTRO, :PROY;
    IF (CENT = 'P') THEN
        SELECT P.PREF_CENTRO,P.PREF_PROY  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;
    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;
    VRSUBT = VRTOTAL - VREXTRA - VRIVA - MERCANCIA; /* 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;
    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);
    if (STRLEN(NOMBRE)> 43 ) then
      CONC = 'FV No.' || NUMERO || '-' || SUBSTR(NOMBRE,1,43);
    ELSE
      CONC = 'FV No.' || NUMERO || '-' || NOMBRE;
    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, '', 31, :IDDOC, :PREF, :NUM, 'N');
    NROI = 0;
    SUMA = 0;
    ERROR = 0;
    /* 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;
    /* CUENTAS DE VENTAS */
    if (VENTAS = 'A') then
        BEGIN
        FOR SELECT MAX(COAR_CTAVNT), SUM(FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO), SUM(FADE_IVAMONTO), SUM(FADE_CONSUMO), MAX(B.bode_proy), MAX(B.bode_centro), MAX(T.taiv_porc)
            FROM ARTICULO A, CONTABIL_ARTICULO C, FACTURAS_DETALLE F, bodega b, TARIFA_IVA T
            WHERE F.FACT_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND T.taiv_cod = A.taiv_cod AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL)) and
            f.bode_cod = b.bode_cod
            GROUP BY COAR_CTAVNT, TAIV_PORC
            INTO :CTAVENTAS, :MONTO, :IMPTOS, :VRCONSUMO, :PROYI, :CENTI, :porcajus
            DO
            BEGIN
            factoraj = null;
            SELECT AJCI_FACTOR FROM AJUSTE_CIERRE
                WHERE AJCI_PORC = :porcajus AND AJCI_FECINI <= :fecaux AND AJCI_FECFIN >= :fecaux
                INTO :factoraj;
            if (factoraj is not null) then
                MONTO = MONTO * factoraj;

            if ((FOMENTO = 'SI') or (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(31, :IDDOC, :CTAVENTAS, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (TIPOCUEN = 'I') then
                    BEGIN
                    /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                    FOR SELECT F.ARTI_COD, (FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO), FADE_CONSUMO
                        FROM ARTICULO A, CONTABIL_ARTICULO C, FACTURAS_DETALLE F
                        WHERE F.FACT_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND COAR_CTAINV = :CUENTA AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
                        INTO :ART, :MONTO, :IMPTOS
                    DO
                        BEGIN
                        if ((FOMENTO = 'SI') or (ICOING = 'SI')) then
                            MONTO = MONTO + IMPTOS;
                        if ((CTADTO IS NULL) OR (CTADTO = '')) then
                            MONTO = MONTO * FACTOR;
                        execute procedure redondee(MONTO, DIG) returning_values (MONTO);
                        if (MONTO <> 0) then
                            BEGIN
                            INSERT INTO CONTABILIZACION_DET (CNTB_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)
                                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                            NROI = NROI + 1;
                            SUMA = SUMA - MONTO;
                            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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                    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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROYI, :CENTI, NULL, NULL, NULL, NULL, 0, 0);
                    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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    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), 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 ((FOMENTO = 'SI') or (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(31, :IDDOC, :CTAVENTAS, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'I') then
                BEGIN
                /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                FOR SELECT F.ARTI_COD, (FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO), FADE_CONSUMO
                    FROM ARTICULO A, FACTURAS_DETALLE F
                    WHERE F.FACT_ID = :IDDOC AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
                    INTO :ART, :MONTO, :IMPTOS
                    DO
                    BEGIN
                    if ((FOMENTO = 'SI') or (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
                        INSERT INTO CONTABILIZACION_DET (CNTB_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)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                        NROI = NROI + 1;
                        SUMA = SUMA - MONTO;
                        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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                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), sum(FADE_CONSUMO), MAX(T.taiv_porc)
            FROM ARTICULO A, CONTABIL_ARTICULO C, FACTURAS_DETALLE F, TARIFA_IVA T
            WHERE F.FACT_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND A.taiv_cod = T.taiv_cod AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
            GROUP BY COAR_CTAIVAV, T.taiv_porc
            INTO :CTAIVA, :IMPTOS, :MONTO, :VALORADIC, :porcajus
        DO
            BEGIN
            factoraj = null;
            SELECT AJCI_FACTOR FROM AJUSTE_CIERRE
                WHERE AJCI_PORC = :porcajus AND AJCI_FECINI <= :fecaux AND AJCI_FECFIN >= :fecaux
                INTO :factoraj;
            if (factoraj is not null) then
                BEGIN
                MONTO = MONTO * factoraj;
                IMPTOS = IMPTOS * factoraj;
                END

            if (FOMENTO = 'SI') then
                MONTO = MONTO + VALORADIC;
            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(31, :IDDOC, :CTAIVA, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (TIPOCUEN = 'I') then
                    BEGIN
                    /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                    FOR SELECT F.ARTI_COD, FADE_IVAMONTO, (FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO), TAIV_PORC, FADE_CONSUMO
                        FROM ARTICULO A, CONTABIL_ARTICULO C, FACTURAS_DETALLE F, TARIFA_IVA T
                        WHERE F.FACT_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 AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
                        INTO :ART, :IMPTOS, :MONTO, :PORCIVA, :VALORADIC
                    DO
                        BEGIN
                        if (FOMENTO = 'SI') then
                            MONTO = MONTO + VALORADIC;
                        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
                            INSERT INTO CONTABILIZACION_DET (CNTB_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)
                                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :IMPTOS, :MONTO, :PORCIVA, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                            NROI = NROI + 1;
                            SUMA = SUMA + DEBITO - CREDITO;
                            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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :IMPTOS, :MONTO, ABS(:IMPTOS*100/:MONTO), :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                    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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :IMPTOS, :MONTO, ABS(:IMPTOS*100/:MONTO), :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    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), 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;
        if (FOMENTO = 'SI') then
            MONTO = 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(31, :IDDOC, :CTAIVA, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'I') then
                BEGIN
                /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                FOR SELECT F.ARTI_COD, (FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO), FADE_IVAMONTO, TAIV_PORC, FADE_CONSUMO
                    FROM ARTICULO A, FACTURAS_DETALLE F, TARIFA_IVA T
                    WHERE F.FACT_ID = :IDDOC AND A.TAIV_COD = T.TAIV_COD AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
                    INTO :ART, :MONTO, :IMPTOS, :PORCIVA, :VALORADIC
                    DO
                    BEGIN
                    if (FOMENTO = 'SI') then
                        MONTO = 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
                        INSERT INTO CONTABILIZACION_DET (CNTB_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)
                            VALUES (:IDC, :NROI, :CTAIVA, :CONC, '', 0, :IMPTOS, :MONTO, :PORCIVA, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                        NROI = NROI + 1;
                        SUMA = SUMA - 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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTAIVA, :CONC, '', 0, :IMPTOS, :MONTO, ABS(:IMPTOS*100/:MONTO), :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTAIVA, :CONC, '', 0, :IMPTOS, :MONTO, ABS(:IMPTOS*100/:MONTO), :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA - IMPTOS;
                END
            END /* IMPTOS <> 0 */
        END /* IVA EN CTA CONSTANTE */
    /* EL IMPOCONSUMO */
    if ((CONSUMO = 'A') AND (FOMENTO <> 'SI')) then
        BEGIN
        FOR SELECT MAX(COAR_CTACONS), SUM(FADE_CONSUMO)
            FROM ARTICULO A, CONTABIL_ARTICULO 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(31, :IDDOC, :CTACONSUMO, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (TIPOCUEN = 'I') then
                    BEGIN
                    /* ES UNA CUENTA DE INVENTARIO, REGISTRE UNO A UNO LOS ARTICULOS */
                    FOR SELECT F.ARTI_COD, FADE_CONSUMO
                        FROM ARTICULO A, CONTABIL_ARTICULO C, FACTURAS_DETALLE F
                        WHERE F.FACT_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND COAR_CTACONS = :CUENTA AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
                        INTO :ART, :IMPTOS
                    DO
                        BEGIN
                        execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
                        if (IMPTOS <> 0) then
                            BEGIN
                            INSERT INTO CONTABILIZACION_DET (CNTB_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)
                                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                            NROI = NROI + 1;
                            SUMA = SUMA - 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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                    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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    SUMA = SUMA - IMPTOS;
                    END
                END /* IMPTOS <> 0 */
            END /* FOR */
        END /* CONSUMO X ARTICULO */
    if ((CONSUMO = 'K') AND (FOMENTO <> 'SI')) 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(31, :IDDOC, :CTACONSUMO, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'I') then
                BEGIN
                /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                FOR SELECT F.ARTI_COD, FADE_CONSUMO
                    FROM ARTICULO A, FACTURAS_DETALLE F
                    WHERE F.FACT_ID = :IDDOC AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
                    INTO :ART, :IMPTOS
                    DO
                    BEGIN
                    execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
                    if (IMPTOS <> 0) then
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_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)
                            VALUES (:IDC, :NROI, :CTACONSUMO, :CONC, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                        NROI = NROI + 1;
                        SUMA = SUMA - 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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTACONSUMO, :CONC, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTACONSUMO, :CONC, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA - IMPTOS;
                END
            END /* IMPTOS <> 0 */
        END /* CONSUMO EN CTA CONSTANTE */
    /* 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(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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRDTO, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRDTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 31);
                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(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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRADIC, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRADIC, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 31);
                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(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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VREXTRA, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VREXTRA, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 31);
                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(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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTFTE, 0, :VRSUBT, :PRTFTE, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
            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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTFTE, 0, :VRSUBT, :PRTFTE, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            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(31, :IDDOC, :CTARTFTE, 2);
                CUENTA = CTARTFTE;
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'I') then
                begin
                EXECUTE PROCEDURE ERRORINT(31, :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)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTFTE, (:VRSUBT*-1), :PRTFTE, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTFTE, (:VRSUBT*-1), :PRTFTE, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA - VRRTFTE;
                END
            END
        END /* RTFTE */
      END
    if (RTFTE = 'A') 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 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(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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTFTE, 0, :MONTO, :PRTFTE, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                    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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTFTE, 0, :MONTO, :PRTFTE, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    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(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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTFTE, (:MONTO*-1), :PRTFTE, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                        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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTFTE, (:MONTO*-1), :PRTFTE, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                        NROI = NROI + 1;
                        SUMA = SUMA - VRRTFTE;
                        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(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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTIVA, 0, :VRIVA, :PORC, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
            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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTIVA, 0, :VRIVA, :PORC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            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(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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTICA, 0, :VRSUBT, :PRTICA, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
            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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTICA, 0, :VRSUBT, :PRTICA, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            SUMA = SUMA + VRRTICA;
            END
        END /* RTICA */
      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(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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :DEBITO, :CREDITO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
        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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :DEBITO, :CREDITO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
        NROI = NROI + 1;
        END /* SUMA EN CARTERA */
    /* CALCULE COSTOS EN VENTAS */
    EXECUTE PROCEDURE COSTO_EN_VENTAS(31, :IDDOC);
    if (COSTOS = 'A') then
        BEGIN
        FOR SELECT MAX(CTACOS), SUM(CAST(CANT AS DOUBLE PRECISION) * COSTO), SUM(FADE_CONSUMO)
            FROM COSTO_VENTAS 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(31, :IDDOC, :CTACOSTOS, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (TIPOCUEN = 'I') then
                    BEGIN
                    /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                    FOR SELECT ARTI_COD, CANT * COSTO
                        FROM COSTO_VENTAS WHERE TIDO_COD = 31 AND COVE_ID = :iddoc AND CTACOS = :CUENTA
                        INTO :ART, :MONTO
                    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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                        NROI = NROI + 1;
                        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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                    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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    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 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(31, :IDDOC, :CTACOSTOS, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'I') then
                BEGIN
                /* ES UNA CUENTA DE INVENTARIO, REGISTRE UNO A UNO LOS ARTICULOS */
                FOR SELECT ARTI_COD, CANT * COSTO
                    FROM COSTO_VENTAS WHERE TIDO_COD = 31 AND COVE_ID = :iddoc
                    INTO :ART, :MONTO
                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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTACOSTOS, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                    NROI = NROI + 1;
                    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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTACOSTOS, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTACOSTOS, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                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 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(31, :IDDOC, :CTAINVEN, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (TIPOCUEN = 'I') then
                    BEGIN
                    /* ES UNA CUENTA DE INVENTARIO, REGISTRE UNO A UNO LOS ARTICULOS */
                    FOR SELECT ARTI_COD, CANT * COSTO
                        FROM COSTO_VENTAS WHERE TIDO_COD = 31 AND COVE_ID = :iddoc AND CTAINV = :CUENTA
                        INTO :ART, :MONTO
                    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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                        NROI = NROI + 1;
                        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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                    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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    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 WHERE TIDO_COD = 31 AND COVE_ID = :iddoc
            INTO :MONTO;
        if (MONTO <> 0) then
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTAINVEN, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'I') then
                BEGIN
                /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                FOR SELECT ARTI_COD, CANT * COSTO
                    FROM COSTO_VENTAS WHERE TIDO_COD = 31 AND COVE_ID = :iddoc
                    INTO :ART, :MONTO
                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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTAINVEN, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                    NROI = NROI + 1;
                    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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTAINVEN, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTAINVEN, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                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(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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTADIC, :CONC, '', :MONTO, 0, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTADIC, :CONC, '', 0, :MONTO, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTADIC, :CONC, '', :MONTO, 0, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTADIC, :CONC, '', 0, :MONTO, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                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(31, :IDDOC, :PREF, 1);
    ERROR = ERROR + 1;
    VER = 'S';
    SUSPEND;
    END
END

^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE CONTABIL_FACTURA_IVA(
    IDDOC INTEGER,
    IDINTER INTEGER)
RETURNS (
    ERROR INTEGER,
    VER CHAR(1),
    IDC INTEGER)
AS
declare variable pref varchar(4);
declare variable num varchar(8);
declare variable numero varchar(10);
declare variable fecaux date;
declare variable fecha char(8);
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 vrtotal numeric(18,2);
declare variable vrextra numeric(18,2);
declare variable tipocomp varchar(3);
declare variable prefcont varchar(4);
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 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 porc numeric(5,2);
declare variable debito numeric(18,2);
declare variable credito numeric(18,2);
declare variable nroi integer;
declare variable art varchar(15);
declare variable imptos numeric(18,2);
declare variable suma numeric(18,2);
declare variable porciva numeric(9,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 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 fomento varchar(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 ERRORC INTEGER;
BEGIN
EXECUTE PROCEDURE LEE_CONFIGURACION('COMPRAS', 'FACTURAS', 'USAR IMPOCONSUMO COMO PORCENTAJE DE FOMENTO') returning_values (FOMENTO);
EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'FECHA AUTORETENEDOR NO DESCONTAR RETENCIONES DEL SALDO PERO SI CONTABILIZARLAS') returning_values (AUTORET);
if (AUTORET <> '') then
    FAUTORET = CAST(AUTORET AS DATE);
else
    FAUTORET = '9999/12/31';
/* BUSQUE LA INTERFACE */
EXISTE = 'N';
SELECT 'S', TICO_COD, PRCO_PRE, INVE_VENTAS, INVE_IVA, INVE_CONSUMO, INVE_CARTERA, INVE_RTFTE, INVE_RTIVA, INVE_RTICA, INVE_COSTO, INVE_INVEN, INVE_CTAVENTAS, INVE_CTAIVA, INVE_CTACONSUMO, INVE_CTADTO, INVE_CTAADIC, INVE_CTAEXTRA, INVE_CTACARTERA, INVE_CTARTFTE, INVE_CTARTIVA, INVE_CTARTICA, INVE_CTAINVEN, INVE_CTACOSTOS, INVE_CONFIRMAR, INVE_CENTRO
    FROM INTERFAZ_VENTAS
    WHERE INVE_ID = :IDINTER
    INTO :EXISTE, :TIPOCOMP, :PREFCONT, :VENTAS, :IVA, :CONSUMO, :CARTERA, :RTFTE, :RTIVA, :RTICA, :COSTOS, :INVEN, :CTAVENTAS, :CTAIVA, :CTACONSUMO, :CTADTO, :CTAADIC, :CTAEXTRA, :CTACARTERA, :CTARTFTE, :CTARTIVA, :CTARTICA, :CTAINVEN, :CTACOSTOS, :VER, :CENT;
if (EXISTE = 'S') then
  BEGIN
    /* BORRE CUALQUEIR CONTABILIZACION PREVIA */
    DELETE FROM CONTABILIZACION WHERE CNTB_TIPOREF = 31 AND CNTB_IDREF = :IDDOC;

  /* 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_NOMCLIENTE, TERC_CTARTFTE, TERC_CTARTIVA, TERC_CTARTICA, TERC_CTAVENTA, TERC_CTACLIENTE, FACT_ANULADO
        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, :NOMBRE, TCTARTFTE, TCTARTIVA, TCTARTICA, TCTAVENTA, TCTACLIEN, ANULADO;
  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 FROM BODEGA B, FACTURAS F
            WHERE B.BODE_COD = F.BODE_COD AND F.FACT_ID = :IDDOC INTO :CENTRO, :PROY;
    IF (CENT = 'V') THEN
        SELECT V.CENT_COD, V.PROY_COD FROM VENDEDORES V, FACTURAS F
            WHERE V.VEND_COD = F.VEND_COD AND F.FACT_ID = :IDDOC INTO :CENTRO, :PROY;
    IF (CENT = 'P') THEN
        SELECT P.PREF_CENTRO,P.PREF_PROY  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;
    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;
    VRSUBT = VRTOTAL - VREXTRA - VRIVA - MERCANCIA; /* 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;
    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);
    if (STRLEN(NOMBRE)> 43 ) then
      CONC = 'FV No.' || NUMERO || '-' || SUBSTR(NOMBRE,1,43);
    ELSE
      CONC = 'FV No.' || NUMERO || '-' || NOMBRE;
    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, '', 31, :IDDOC, :PREF, :NUM, 'N');
    NROI = 0;
    SUMA = 0;
    ERROR = 0;
    /* 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;
    /* CUENTAS DE VENTAS */
    if (VENTAS = 'A') then
        BEGIN
        FOR SELECT MAX(TAIV_CTAVTA), SUM(FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO), SUM(FADE_IVAMONTO), SUM(FADE_CONSUMO)
            FROM TARIFA_IVA T, FACTURAS_DETALLE F
            WHERE F.FACT_ID = :IDDOC AND F.fade_ivaporc = T.taiv_porc AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
            GROUP BY TAIV_CTAVTA
            INTO :CTAVENTAS, :MONTO, :IMPTOS, :VRCONSUMO
            DO
            BEGIN
            if (FOMENTO = '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(31, :IDDOC, :CTAVENTAS, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (TIPOCUEN = 'I') then
                    BEGIN
                    /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                    FOR SELECT F.ARTI_COD, (FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO), FADE_CONSUMO
                        FROM ARTICULO A, CONTABIL_ARTICULO C, FACTURAS_DETALLE F
                        WHERE F.FACT_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND COAR_CTAINV = :CUENTA AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
                        INTO :ART, :MONTO, :IMPTOS
                    DO
                        BEGIN
                        if (FOMENTO = 'SI') then
                            MONTO = MONTO + IMPTOS;
                        if ((CTADTO IS NULL) OR (CTADTO = '')) then
                            MONTO = MONTO * FACTOR;
                        execute procedure redondee(MONTO, DIG) returning_values (MONTO);
                        if (MONTO <> 0) then
                            BEGIN
                            INSERT INTO CONTABILIZACION_DET (CNTB_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)
                                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                            NROI = NROI + 1;
                            SUMA = SUMA - MONTO;
                            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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                    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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    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), 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 (FOMENTO = '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(31, :IDDOC, :CTAVENTAS, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'I') then
                BEGIN
                /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                FOR SELECT F.ARTI_COD, (FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO), FADE_CONSUMO
                    FROM ARTICULO A, FACTURAS_DETALLE F
                    WHERE F.FACT_ID = :IDDOC AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
                    INTO :ART, :MONTO, :IMPTOS
                    DO
                    BEGIN
                    if (FOMENTO = '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
                        INSERT INTO CONTABILIZACION_DET (CNTB_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)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                        NROI = NROI + 1;
                        SUMA = SUMA - MONTO;
                        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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                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(TAIV_CTAIVAVNT), SUM(FADE_IVAMONTO), SUM(FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO), sum(FADE_CONSUMO)
            FROM TARIFA_IVA T, FACTURAS_DETALLE F
            WHERE F.FACT_ID = :IDDOC AND F.fade_ivaporc = T.taiv_porc AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
            GROUP BY TAIV_CTAIVAVNT
            INTO :CTAIVA, :IMPTOS, :MONTO, :VALORADIC
        DO
            BEGIN
            if (FOMENTO = 'SI') then
                MONTO = MONTO + VALORADIC;
            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(31, :IDDOC, :CTAIVA, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (TIPOCUEN = 'I') then
                    BEGIN
                    /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                    FOR SELECT F.ARTI_COD, FADE_IVAMONTO, (FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO), TAIV_PORC, FADE_CONSUMO
                        FROM ARTICULO A, CONTABIL_ARTICULO C, FACTURAS_DETALLE F, TARIFA_IVA T
                        WHERE F.FACT_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 AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
                        INTO :ART, :IMPTOS, :MONTO, :PORCIVA, :VALORADIC
                    DO
                        BEGIN
                        if (FOMENTO = 'SI') then
                            MONTO = MONTO + VALORADIC;
                        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
                            INSERT INTO CONTABILIZACION_DET (CNTB_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)
                                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :IMPTOS, :MONTO, :PORCIVA, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                            NROI = NROI + 1;
                            SUMA = SUMA + DEBITO - CREDITO;
                            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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :IMPTOS, :MONTO, ABS(:IMPTOS*100/:MONTO), :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                    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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :IMPTOS, :MONTO, ABS(:IMPTOS*100/:MONTO), :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    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), 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;
        if (FOMENTO = 'SI') then
            MONTO = 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(31, :IDDOC, :CTAIVA, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'I') then
                BEGIN
                /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                FOR SELECT F.ARTI_COD, (FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO), FADE_IVAMONTO, TAIV_PORC, FADE_CONSUMO
                    FROM ARTICULO A, FACTURAS_DETALLE F, TARIFA_IVA T
                    WHERE F.FACT_ID = :IDDOC AND A.TAIV_COD = T.TAIV_COD AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
                    INTO :ART, :MONTO, :IMPTOS, :PORCIVA, :VALORADIC
                    DO
                    BEGIN
                    if (FOMENTO = 'SI') then
                        MONTO = 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
                        INSERT INTO CONTABILIZACION_DET (CNTB_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)
                            VALUES (:IDC, :NROI, :CTAIVA, :CONC, '', 0, :IMPTOS, :MONTO, :PORCIVA, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                        NROI = NROI + 1;
                        SUMA = SUMA - 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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTAIVA, :CONC, '', 0, :IMPTOS, :MONTO, ABS(:IMPTOS*100/:MONTO), :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTAIVA, :CONC, '', 0, :IMPTOS, :MONTO, ABS(:IMPTOS*100/:MONTO), :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA - IMPTOS;
                END
            END /* IMPTOS <> 0 */
        END /* IVA EN CTA CONSTANTE */
    /* EL IMPOCONSUMO */
    if ((CONSUMO = 'A') AND (FOMENTO <> 'SI')) then
        BEGIN
        FOR SELECT MAX(COAR_CTACONS), SUM(FADE_CONSUMO)
            FROM ARTICULO A, CONTABIL_ARTICULO 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(31, :IDDOC, :CTACONSUMO, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (TIPOCUEN = 'I') then
                    BEGIN
                    /* ES UNA CUENTA DE INVENTARIO, REGISTRE UNO A UNO LOS ARTICULOS */
                    FOR SELECT F.ARTI_COD, FADE_CONSUMO
                        FROM ARTICULO A, CONTABIL_ARTICULO C, FACTURAS_DETALLE F
                        WHERE F.FACT_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND COAR_CTACONS = :CUENTA AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
                        INTO :ART, :IMPTOS
                    DO
                        BEGIN
                        execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
                        if (IMPTOS <> 0) then
                            BEGIN
                            INSERT INTO CONTABILIZACION_DET (CNTB_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)
                                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                            NROI = NROI + 1;
                            SUMA = SUMA - 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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                    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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    SUMA = SUMA - IMPTOS;
                    END
                END /* IMPTOS <> 0 */
            END /* FOR */
        END /* CONSUMO X ARTICULO */
    if ((CONSUMO = 'K') AND (FOMENTO <> 'SI')) 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(31, :IDDOC, :CTACONSUMO, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'I') then
                BEGIN
                /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                FOR SELECT F.ARTI_COD, FADE_CONSUMO
                    FROM ARTICULO A, FACTURAS_DETALLE F
                    WHERE F.FACT_ID = :IDDOC AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
                    INTO :ART, :IMPTOS
                    DO
                    BEGIN
                    execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
                    if (IMPTOS <> 0) then
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_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)
                            VALUES (:IDC, :NROI, :CTACONSUMO, :CONC, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                        NROI = NROI + 1;
                        SUMA = SUMA - 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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTACONSUMO, :CONC, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTACONSUMO, :CONC, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA - IMPTOS;
                END
            END /* IMPTOS <> 0 */
        END /* CONSUMO EN CTA CONSTANTE */
    /* 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(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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRDTO, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRDTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 31);
                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(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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRADIC, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRADIC, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 31);
                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(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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VREXTRA, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VREXTRA, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 31);
                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(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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTFTE, 0, :VRSUBT, :PRTFTE, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
            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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTFTE, 0, :VRSUBT, :PRTFTE, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            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(31, :IDDOC, :CTARTFTE, 2);
                CUENTA = CTARTFTE;
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'I') then
                begin
                EXECUTE PROCEDURE ERRORINT(31, :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)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTFTE, (:VRSUBT*-1), :PRTFTE, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTFTE, (:VRSUBT*-1), :PRTFTE, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA - VRRTFTE;
                END
            END
        END /* RTFTE */
      END
    if (RTFTE = 'A') 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 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(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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTFTE, 0, :MONTO, :PRTFTE, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                    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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTFTE, 0, :MONTO, :PRTFTE, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    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(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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTFTE, (:MONTO*-1), :PRTFTE, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                        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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :VRRTFTE, (:MONTO*-1), :PRTFTE, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                        NROI = NROI + 1;
                        SUMA = SUMA - VRRTFTE;
                        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(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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTIVA, 0, :VRIVA, :PORC, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
            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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTIVA, 0, :VRIVA, :PORC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            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(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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTICA, 0, :VRSUBT, :PRTICA, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
            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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :VRRTICA, 0, :VRSUBT, :PRTICA, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            SUMA = SUMA + VRRTICA;
            END
        END /* RTICA */
      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 (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(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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :DEBITO, :CREDITO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
        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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :DEBITO, :CREDITO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
        NROI = NROI + 1;
        END /* SUMA EN CARTERA */
    /* CALCULE COSTOS EN VENTAS */
    EXECUTE PROCEDURE COSTO_EN_VENTAS(31, :IDDOC);
    if (COSTOS = 'A') then
        BEGIN
        FOR SELECT MAX(CTACOS), SUM(CAST(CANT AS DOUBLE PRECISION) * COSTO)
            FROM COSTO_VENTAS WHERE TIDO_COD = 31 AND COVE_ID = :IDDOC
            GROUP BY CTACOS
            INTO :CTACOSTOS, :MONTO
        DO
            BEGIN
            if (MONTO <> 0) then
                BEGIN
                EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTACOSTOS, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (TIPOCUEN = 'I') then
                    BEGIN
                    /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                    FOR SELECT ARTI_COD, CANT * COSTO
                        FROM COSTO_VENTAS WHERE TIDO_COD = 31 AND COVE_ID = :IDDOC AND CTACOS = :CUENTA
                        INTO :ART, :MONTO
                    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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                        NROI = NROI + 1;
                        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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                    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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    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 WHERE TIDO_COD = 31 AND COVE_ID = :IDDOC
            INTO :MONTO;
        if (MONTO <> 0) then
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTACOSTOS, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'I') then
                BEGIN
                /* ES UNA CUENTA DE INVENTARIO, REGISTRE UNO A UNO LOS ARTICULOS */
                FOR SELECT ARTI_COD, CANT * COSTO
                    FROM COSTO_VENTAS WHERE TIDO_COD = 31 AND COVE_ID = :IDDOC
                    INTO :ART, :MONTO
                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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTACOSTOS, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                    NROI = NROI + 1;
                    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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTACOSTOS, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTACOSTOS, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                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 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(31, :IDDOC, :CTAINVEN, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (TIPOCUEN = 'I') then
                    BEGIN
                    /* ES UNA CUENTA DE INVENTARIO, REGISTRE UNO A UNO LOS ARTICULOS */
                    FOR SELECT ARTI_COD, CANT * COSTO
                        FROM COSTO_VENTAS WHERE TIDO_COD = 31 AND COVE_ID = :IDDOC AND CTAINV = :CUENTA
                        INTO :ART, :MONTO
                    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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                        NROI = NROI + 1;
                        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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                    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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    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 WHERE TIDO_COD = 31 AND COVE_ID = :IDDOC
            INTO :MONTO;
        if (MONTO <> 0) then
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTAINVEN, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'I') then
                BEGIN
                /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                FOR SELECT ARTI_COD, CANT * COSTO
                    FROM COSTO_VENTAS WHERE TIDO_COD = 31 AND COVE_ID = :IDDOC
                    INTO :ART, :MONTO
                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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTAINVEN, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ART, 0, 0);
                    NROI = NROI + 1;
                    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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTAINVEN, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTAINVEN, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                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(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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTADIC, :CONC, '', :MONTO, 0, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTADIC, :CONC, '', 0, :MONTO, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 31);
                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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTADIC, :CONC, '', :MONTO, 0, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTADIC, :CONC, '', 0, :MONTO, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                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(31, :IDDOC, :PREF, 1);
    ERROR = ERROR + 1;
    VER = 'S';
    SUSPEND;
    END
END

^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE CONTABIL_REMICLIE(
    IDDOC INTEGER,
    IDINTER INTEGER)
RETURNS (
    ERROR INTEGER,
    VER CHAR(1),
    IDC INTEGER)
AS
declare variable pref varchar(4);
declare variable num varchar(8);
declare variable numero varchar(12);
declare variable fecaux date;
declare variable fecha char(8);
declare variable conc varchar(60);
declare variable vrsubt numeric(18,2);
declare variable vriva numeric(18,2);
declare variable vrtotal numeric(18,2);
declare variable tipocomp varchar(3);
declare variable prefcont varchar(4);
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 inven char(1);
declare variable ctainven varchar(20);
declare variable costos char(1);
declare variable ctacostos 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 proyi varchar(4);
declare variable centi 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 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 anulado char(1);
declare variable dig integer;
declare variable mercancia numeric(18,2);
declare variable INALC numeric(18,2);
declare variable fomento varchar(2);
declare variable vrconsumo numeric(18,2);
declare variable cent char(1);
declare variable ERRORC INTEGER;
declare variable ICOING CHAR(2);
declare variable NITCONTA VARCHAR(20);
declare variable CNTNIT CHAR(2);
BEGIN
EXECUTE PROCEDURE LEE_CONFIGURACION('COMPRAS', 'FACTURAS', 'USAR IMPOCONSUMO COMO PORCENTAJE DE FOMENTO') returning_values (FOMENTO);
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);
/* BUSQUE LA INTERFACE */
EXISTE = 'N';
SELECT 'S', TICO_COD, PRCO_PRE, INVE_VENTAS, INVE_IVA, INVE_CONSUMO, INVE_CARTERA,
    INVE_COSTO, INVE_INVEN, INVE_CTAVENTAS, INVE_CTAIVA, INVE_CTACONSUMO,
    INVE_CTACARTERA, INVE_CTAINVEN, INVE_CTACOSTOS, INVE_CONFIRMAR, INVE_CENTRO
    FROM INTERFAZ_VENTAS
    WHERE INVE_ID = :IDINTER
    INTO :EXISTE, :TIPOCOMP, :PREFCONT, :VENTAS, :IVA, :CONSUMO, :CARTERA,
    :COSTOS, :INVEN, :CTAVENTAS, :CTAIVA, :CTACONSUMO,
    :CTACARTERA, :CTAINVEN, :CTACOSTOS, :VER, :CENT;
if (EXISTE = 'S') then
  BEGIN
    /* BORRE CUALQUEIR CONTABILIZACION PREVIA */
    DELETE FROM CONTABILIZACION WHERE CNTB_TIPOREF = 32 AND CNTB_IDREF = :IDDOC;

  SELECT PREF_PRE, REVT_NUMERO, REVT_FECHA, F.TERC_NIT, REVT_IVAMONTO, REVT_TOTAL,
    REVT_NOMTERC, TERC_CTAVENTA, TERC_CTACLIENTE, REVT_ANULADO, T.terc_nitconta
        FROM remisiones_venta F, TERCEROS T
        WHERE REVT_ID = :IDDOC AND F.TERC_NIT = T.TERC_NIT
        INTO :PREF, :NUM, :FECAUX, :NIT, :VRIVA, :VRTOTAL,
        :NOMBRE, TCTAVENTA, TCTACLIEN, ANULADO, :nitconta;
  if ((CNTNIT = 'SI') AND (NITCONTA IS NOT NULL)) then
    NIT = NITCONTA;
  if (ANULADO = 'N') then
    BEGIN
    IF (CENT = 'B') THEN
        SELECT B.BODE_CENTRO, B.BODE_PROY FROM BODEGA B, remisiones_venta F
            WHERE B.BODE_COD = F.BODE_COD AND F.REVT_ID = :IDDOC INTO :CENTRO, :PROY;
    IF (CENT = 'V') THEN
        SELECT V.CENT_COD, V.PROY_COD FROM VENDEDORES V, remisiones_venta F
            WHERE V.VEND_COD = F.VEND_COD AND F.REVT_ID = :IDDOC INTO :CENTRO, :PROY;
    IF (CENT = 'P') THEN
        SELECT P.PREF_CENTRO,P.PREF_PROY  FROM PREFIJOS P, remisiones_venta F
            WHERE P.PREF_PRE = F.PREF_PRE AND F.REVT_ID = :IDDOC AND P.TIDO_COD = 32 INTO :CENTRO, :PROY;
    NUMERO = PREF || NUM;
    SELECT SUM (RVDE_CONSUMO) FROM remisiones_venta_detalle WHERE REVT_ID = :IDDOC  AND ((RVDE_REFERENCIA <> '.t') or (RVDE_REFERENCIA IS NULL))
        INTO MERCANCIA;
    SELECT SUM (RVDE_INALCM) FROM remisiones_venta_detalle WHERE REVT_ID = :IDDOC  AND ((RVDE_REFERENCIA <> '.t') or (RVDE_REFERENCIA IS NULL))
        INTO INALC;
    VRSUBT = VRTOTAL - VRIVA - MERCANCIA - INALC; /* BASE DE RETEFTE Y RETEICA */

    MERCANCIA = VRSUBT;
    EXECUTE PROCEDURE FECHA_A_CONTA(:FECAUX) returning_values (:FECHA);
    /* ENCABEZADO CONTABLE */
    IDC = GEN_ID(ID_CONTABILIZA, 1);
    if (STRLEN(NOMBRE)> 38 ) then
      CONC = 'REMCLI No.' || NUMERO || '-' || SUBSTRING(NOMBRE FROM 1 FOR 38);
    ELSE
      CONC = 'REMCLI No.' || NUMERO || '-' || NOMBRE;
    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, '', 32, :IDDOC, :PREF, :NUM, 'N');
    NROI = 0;
    SUMA = 0;
    ERROR = 0;
    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 ((VENTAS = 'C') OR (VENTAS = 'K')) THEN
        BEGIN
        IF (VENTAS = 'C') THEN
            CTAVENTAS = TCTAVENTA;
        SELECT SUM(RVDE_TOTAL-RVDE_IVAMONTO-RVDE_CONSUMO-RVDE_INALCM), SUM(RVDE_IVAMONTO), SUM (RVDE_CONSUMO)
            FROM remisiones_venta_detalle F
            WHERE F.REVT_ID = :IDDOC AND ((RVDE_REFERENCIA <> '.t') or (RVDE_REFERENCIA IS NULL))
            INTO :MONTO, :IMPTOS, :VRCONSUMO;
        if ((FOMENTO = 'SI') or (ICOING = 'SI')) then
            MONTO = MONTO + VRCONSUMO;
        execute procedure redondee(MONTO, DIG) returning_values (MONTO);
        if (MONTO <> 0) then
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ(32, :IDDOC, :CTAVENTAS, '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)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 31);
                NROI = NROI + 1;
                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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA - MONTO;
                END
            END /* MONTO <> 0 */
        END /* VENTAS C O K */
    if (VENTAS = 'A') then
        BEGIN
        FOR SELECT MAX(COAR_CTAVNT), SUM(RVDE_TOTAL-RVDE_IVAMONTO-RVDE_CONSUMO-RVDE_INALCM), SUM(RVDE_IVAMONTO), SUM(RVDE_CONSUMO), MAX(B.bode_proy), MAX(B.bode_centro)
            FROM ARTICULO A, CONTABIL_ARTICULO C, remisiones_venta_detalle F, bodega b
            WHERE F.REVT_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND ((RVDE_REFERENCIA <> '.t') or (RVDE_REFERENCIA IS NULL)) and
            f.bode_cod = b.bode_cod
            GROUP BY COAR_CTAVNT
            INTO :CTAVENTAS, :MONTO, :IMPTOS, :VRCONSUMO, :PROYI, :CENTI
            DO
            BEGIN
            if ((FOMENTO = 'SI') or (icoing = 'SI')) then
                MONTO = MONTO + VRCONSUMO;
            execute procedure redondee(MONTO, DIG) returning_values (MONTO);
            if (MONTO <> 0) then
                BEGIN
                EXECUTE PROCEDURE CUENTA_INTERFAZ(32, :IDDOC, :CTAVENTAS, '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)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :fecha, NULL, 0, 31);
                    NROI = NROI + 1;
                    SUMA = SUMA - MONTO;
                    END
                ELSE
                    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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROYI, :CENTI, NULL, NULL, NULL, NULL, 0, 0);
                    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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    SUMA = SUMA - MONTO;
                    END
                END /* MONTO <> 0 */
            END /* FOR */
        END /* VENTAS A */
    if (IVA = 'A') then
        BEGIN
        FOR SELECT MAX(COAR_CTAIVAV), SUM(RVDE_IVAMONTO), SUM(RVDE_TOTAL-RVDE_IVAMONTO-RVDE_CONSUMO-RVDE_INALCM), sum(RVDE_CONSUMO)
            FROM ARTICULO A, CONTABIL_ARTICULO C, remisiones_venta_detalle F
            WHERE F.REVT_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND ((RVDE_REFERENCIA <> '.t') or (RVDE_REFERENCIA IS NULL))
            AND RVDE_IVAMONTO <> 0
            GROUP BY COAR_CTAIVAV
            INTO :CTAIVA, :IMPTOS, :MONTO, :VALORADIC
            DO
            BEGIN
            if (FOMENTO = 'SI') then
                MONTO = MONTO + VALORADIC;
            MONTO = MONTO * -1;
            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(32, :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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :IMPTOS, :MONTO, ABS(:IMPTOS*100/:MONTO), :NIT, :PROY, :CENTRO, :NUMERO, NULL, :fecha, NULL, 0, 31);
                    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)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :IMPTOS, :MONTO, ABS(:IMPTOS*100/:MONTO), :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    SUMA = SUMA - IMPTOS;
                    END
                END   /* IMPTOS <> 0 */
            END /* FOR */
        END /* IVA A */
    if (IVA = 'K') then
        BEGIN
        SELECT SUM(RVDE_IVAMONTO), SUM(RVDE_TOTAL-RVDE_IVAMONTO-RVDE_CONSUMO-RVDE_INALCM), SUM(RVDE_CONSUMO)
            FROM remisiones_venta_detalle F
            WHERE F.REVT_ID = :IDDOC and RVDE_IVAMONTO <> 0 AND ((RVDE_REFERENCIA <> '.t') or (RVDE_REFERENCIA IS NULL))
            INTO :IMPTOS, :MONTO, :valoradic;
        if (FOMENTO = 'SI') then
            MONTO = MONTO + VALORADIC;
        MONTO = MONTO * -1;
        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(32, :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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CTAIVA, :CONC, '', 0, :IMPTOS, :MONTO, ABS(:IMPTOS*100/:MONTO), :NIT, :PROY, :CENTRO, :NUMERO, NULL, :fecha, NULL, 0, 31);
                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)
                    VALUES (:IDC, :NROI, :CTAIVA, :CONC, '', 0, :IMPTOS, :MONTO, ABS(:IMPTOS*100/:MONTO), :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA - IMPTOS;
                END
            END /* IMPTOS <> 0 */
        END /* IVA K */
    if ((CONSUMO = 'A') AND (FOMENTO <> 'SI')) then
        BEGIN
        FOR SELECT MAX(COAR_CTACONS), SUM(RVDE_CONSUMO)
            FROM ARTICULO A, CONTABIL_ARTICULO C, remisiones_venta_detalle F
            WHERE F.REVT_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND ((RVDE_REFERENCIA <> '.t') or (RVDE_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(32, :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)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :fecha, NULL, 0, 31);
                    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)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    SUMA = SUMA - IMPTOS;
                    END
                END /* IMPTOS <> 0 */
            END /* FOR */
        END /* CONSUMO A */
    if ((CONSUMO = 'K') AND (FOMENTO <> 'SI')) then
        BEGIN
        SELECT SUM(RVDE_CONSUMO)
            FROM remisiones_venta_detalle F
            WHERE F.REVT_ID = :IDDOC AND ((RVDE_REFERENCIA <> '.t') or (RVDE_REFERENCIA IS NULL))
            INTO :IMPTOS;
        execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
        if (IMPTOS <> 0) then
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ(32, :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)
                    VALUES (:IDC, :NROI, :CTACONSUMO, :CONC, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :fecha, NULL, 0, 31);
                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)
                    VALUES (:IDC, :NROI, :CTACONSUMO, :CONC, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA - IMPTOS;
                END
            END /* IMPTOS <> 0 */
        END /* CONSUMO K */
    /* IMP NACIONAL CONSUMO */
        BEGIN
        SELECT SUM(RVDE_INALCM), SUM(RVDE_TOTAL-RVDE_IVAMONTO-RVDE_CONSUMO-RVDE_INALCM) FROM remisiones_venta_detalle F
            WHERE F.REVT_ID = :IDDOC AND ((RVDE_REFERENCIA <> '.t') or (RVDE_REFERENCIA IS NULL)) and
            RVDE_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(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)
                    VALUES (:IDC, :NROI, :CTACONSUMO, :CONC, '', 0, :IMPTOS, :MONTO, :PORC, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :fecha, NULL, 0, 31);
                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)
                    VALUES (:IDC, :NROI, :CTACONSUMO, :CONC, '', 0, :IMPTOS, :MONTO, :PORC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA - IMPTOS;
                END
            END /* IMPTOS <> 0 */
        END /* INALC */

    /* ARTICULOS DE TERCEROS LLEVE ESE VALOR A LA CUENTA INDICADA */
    SELECT SUM(RVDE_TOTAL) FROM remisiones_venta_detalle F, ARTICULO A
        WHERE F.REVT_ID = :IDDOC AND ((RVDE_REFERENCIA <> '.t') or (RVDE_REFERENCIA IS NULL)) AND F.arti_cod = A.arti_cod AND A.arti_tercero = 'S'
        INTO :MONTO;
    if (MONTO IS NULL) then
        MONTO = 0;
    if (MONTO <> 0) then
        BEGIN
        execute procedure redondee(MONTO, DIG) returning_values (MONTO);
        if (MONTO <> 0) then
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ(32, :IDDOC, :CTAVENTAS, '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)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :fecha, NULL, 0, 31);
                NROI = NROI + 1;
                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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA + MONTO;
                END
            END /* MONTO <> 0 */
        END
    /* CIERRE CONTRA LA CUENTA DEL TERCERO O LA CONSTANTE */
    if ((SUMA <> 0) and ((CARTERA = 'C') or (CARTERA = 'K'))) then
        BEGIN
        if (icoing = 'SI') then
            BEGIN
            /* DESCUENTE IMPOCONSUMO DEL COSTO */
            SELECT SUM(RVDE_CONSUMO) FROM remisiones_venta_detalle F WHERE F.revt_id = :IDDOC AND ((RVDE_REFERENCIA <> '.t') or (RVDE_REFERENCIA IS NULL))
                INTO :IMPTOS;
            SUMA = SUMA + IMPTOS;
            END
        if (SUMA < 0) then
            BEGIN
            DEBITO = SUMA * -1;
            CREDITO = 0;
            END
        ELSE
            BEGIN
            DEBITO = 0;
            CREDITO = SUMA;
            END
        if (CARTERA = 'C') then
            CTACARTERA = TCTACLIEN;
        EXECUTE PROCEDURE CUENTA_INTERFAZ(32, :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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :DEBITO, :CREDITO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :fecha, NULL, 0, 31);
        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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :DEBITO, :CREDITO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
        NROI = NROI + 1;
        END /* SUMA EN CARTERA */
    /* CALCULE COSTOS EN VENTAS */
    EXECUTE PROCEDURE COSTO_EN_VENTAS(32, :IDDOC);
    if (COSTOS = 'A') then
        BEGIN
        FOR SELECT MAX(CTACOS), SUM(CAST(CANT AS DOUBLE PRECISION) * COSTO), SUM(RVDE_CONSUMO)
            FROM COSTO_VENTAS CV, remisiones_venta_detalle D WHERE CV.cove_item = D.rvde_item AND D.revt_id = :iddoc AND
            TIDO_COD = 32 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(32, :IDDOC, :CTACOSTOS, '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)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :fecha, NULL, 0, 31);
                    NROI = NROI + 1;
                    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)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    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 WHERE TIDO_COD = 32 AND COVE_ID = :iddoc
            INTO :MONTO;
        if (icoing = 'SI') then
            MONTO = MONTO + imptos;
        if (MONTO <> 0) then
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ(32, :IDDOC, :CTACOSTOS, '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)
                    VALUES (:IDC, :NROI, :CTACOSTOS, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :fecha, NULL, 0, 31);
                NROI = NROI + 1;
                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)
                    VALUES (:IDC, :NROI, :CTACOSTOS, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                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 WHERE TIDO_COD = 32 AND COVE_ID = :iddoc
            GROUP BY CTAINV
            INTO :CTAINVEN, :MONTO
            DO
            BEGIN
            if (MONTO <> 0) then
                BEGIN
                EXECUTE PROCEDURE CUENTA_INTERFAZ(32, :IDDOC, :CTAINVEN, '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)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :fecha, NULL, 0, 31);
                    NROI = NROI + 1;
                    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)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    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 WHERE TIDO_COD = 32 AND COVE_ID = :iddoc
            INTO :MONTO;
        if (MONTO <> 0) then
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ(31, :IDDOC, :CTAINVEN, '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)
                    VALUES (:IDC, :NROI, :CTAINVEN, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :fecha, NULL, 0, 31);
                NROI = NROI + 1;
                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)
                    VALUES (:IDC, :NROI, :CTAINVEN, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                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 = 'IVA') then
                VALORADIC = VRIVA;
            if (:BASEADIC = 'TOTAL') then
                VALORADIC = VRTOTAL;
            MONTO = VALORADIC * PORCADIC / 100;
            END
        if (MONTO <> 0) then
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ(32, :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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTADIC, :CONC, '', :MONTO, 0, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :fecha, NULL, 0, 31);
                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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTADIC, :CONC, '', 0, :MONTO, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :fecha, NULL, 0, 31);
                NROI = NROI + 1;
                END
            ELSE
                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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTADIC, :CONC, '', :MONTO, 0, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTADIC, :CONC, '', 0, :MONTO, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                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(32, :IDDOC, :PREF, 1);
    ERROR = ERROR + 1;
    VER = 'S';
    SUSPEND;
    END
END

^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE CONTABIL_REMICLIE_NIIF(
    IDDOC INTEGER,
    IDINTER INTEGER,
    IDC INTEGER)
RETURNS (
    ERRORI 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 fecha char(8);
declare variable conc varchar(60);
declare variable vrsubt numeric(18,2);
declare variable vriva numeric(18,2);
declare variable vrtotal 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 inven char(1);
declare variable ctainven varchar(20);
declare variable costos char(1);
declare variable ctacostos 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 proyi varchar(4);
declare variable centi 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 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 anulado char(1);
declare variable dig integer;
declare variable mercancia numeric(18,2);
declare variable INALC numeric(18,2);
declare variable fomento varchar(2);
declare variable vrconsumo numeric(18,2);
declare variable cent char(1);
declare variable ERRORC INTEGER;
declare variable ICOING CHAR(2);
declare variable NITCONTA VARCHAR(20);
declare variable CNTNIT CHAR(2);
BEGIN
EXECUTE PROCEDURE LEE_CONFIGURACION('COMPRAS', 'FACTURAS', 'USAR IMPOCONSUMO COMO PORCENTAJE DE FOMENTO') returning_values (FOMENTO);
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);
/* BUSQUE LA INTERFACE */
EXISTE = 'N';
SELECT 'S', N.INVE_VENTAS, N.INVE_IVA, N.INVE_CONSUMO, N.INVE_CARTERA,
    N.INVE_COSTO, N.INVE_INVEN, N.INVE_CTAVENTAS, N.INVE_CTAIVA, N.INVE_CTACONSUMO,
    N.INVE_CTACARTERA, 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,
    :COSTOS, :INVEN, :CTAVENTAS, :CTAIVA, :CTACONSUMO,
    :CTACARTERA, :CTAINVEN, :CTACOSTOS, :VER, :CENT;
if (EXISTE = 'S') then
  BEGIN
  SELECT PREF_PRE, REVT_NUMERO, REVT_FECHA, F.TERC_NIT, REVT_IVAMONTO, REVT_TOTAL,
    REVT_NOMTERC, TERC_CTAVENTA, TERC_CTACLIENTE, REVT_ANULADO, T.terc_nitconta
        FROM remisiones_venta F, TERCEROS T
        WHERE REVT_ID = :IDDOC AND F.TERC_NIT = T.TERC_NIT
        INTO :PREF, :NUM, :FECAUX, :NIT, :VRIVA, :VRTOTAL,
        :NOMBRE, TCTAVENTA, TCTACLIEN, ANULADO, :nitconta;
  if ((CNTNIT = 'SI') AND (NITCONTA IS NOT NULL)) then
    NIT = NITCONTA;
  if (ANULADO = 'N') then
    BEGIN
    IF (CENT = 'B') THEN
        SELECT B.BODE_CENTRO, B.BODE_PROY FROM BODEGA B, remisiones_venta F
            WHERE B.BODE_COD = F.BODE_COD AND F.REVT_ID = :IDDOC INTO :CENTRO, :PROY;
    IF (CENT = 'V') THEN
        SELECT V.CENT_COD, V.PROY_COD FROM VENDEDORES V, remisiones_venta F
            WHERE V.VEND_COD = F.VEND_COD AND F.REVT_ID = :IDDOC INTO :CENTRO, :PROY;
    IF (CENT = 'P') THEN
        SELECT P.PREF_CENTRO,P.PREF_PROY  FROM PREFIJOS P, remisiones_venta F
            WHERE P.PREF_PRE = F.PREF_PRE AND F.REVT_ID = :IDDOC AND P.TIDO_COD = 32 INTO :CENTRO, :PROY;
    NUMERO = PREF || NUM;
    SELECT SUM (RVDE_CONSUMO) FROM remisiones_venta_detalle WHERE REVT_ID = :IDDOC  AND ((RVDE_REFERENCIA <> '.t') or (RVDE_REFERENCIA IS NULL))
        INTO MERCANCIA;
    SELECT SUM (RVDE_INALCM) FROM remisiones_venta_detalle WHERE REVT_ID = :IDDOC  AND ((RVDE_REFERENCIA <> '.t') or (RVDE_REFERENCIA IS NULL))
        INTO INALC;
    VRSUBT = VRTOTAL - VRIVA - MERCANCIA - INALC; /* BASE DE RETEFTE Y RETEICA */

    MERCANCIA = VRSUBT;
    EXECUTE PROCEDURE FECHA_A_CONTA(:FECAUX) returning_values (:FECHA);
    if (STRLEN(NOMBRE)> 41 ) then
      CONC = 'REMCLI No.' || NUMERO || '-' || SUBSTRING(NOMBRE FROM 1 FOR 41);
    ELSE
      CONC = 'REMCLI No.' || NUMERO || '-' || NOMBRE;
    NROI = 100000;
    SUMA = 0;
    ERRORI = 0;
    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 ((VENTAS = 'C') OR (VENTAS = 'K')) THEN
        BEGIN
        IF (VENTAS = 'C') THEN
            CTAVENTAS = TCTAVENTA;
        SELECT SUM(RVDE_TOTAL-RVDE_IVAMONTO-RVDE_CONSUMO-RVDE_INALCM), SUM(RVDE_IVAMONTO), SUM (RVDE_CONSUMO)
            FROM remisiones_venta_detalle F
            WHERE F.REVT_ID = :IDDOC AND ((RVDE_REFERENCIA <> '.t') or (RVDE_REFERENCIA IS NULL))
            INTO :MONTO, :IMPTOS, :VRCONSUMO;
        if ((FOMENTO = 'SI') or (ICOING = 'SI')) then
            MONTO = MONTO + VRCONSUMO;
        execute procedure redondee(MONTO, DIG) returning_values (MONTO);
        if (MONTO <> 0) then
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ_NIIF(32, :IDDOC, :CTAVENTAS, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERRORI = ERRORI + 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)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :FECHA, NULL, 0, 31);
                NROI = NROI + 1;
                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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA - MONTO;
                END
            END /* MONTO <> 0 */
        END /* VENTAS C O K */
    if (VENTAS = 'A') then
        BEGIN
        FOR SELECT MAX(COAR_CTAVNT), SUM(RVDE_TOTAL-RVDE_IVAMONTO-RVDE_CONSUMO-RVDE_INALCM), SUM(RVDE_IVAMONTO), SUM(RVDE_CONSUMO), MAX(B.bode_proy), MAX(B.bode_centro)
            FROM ARTICULO A, CONTABIL_ARTICULO_NIIF C, remisiones_venta_detalle F, bodega b
            WHERE F.REVT_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND ((RVDE_REFERENCIA <> '.t') or (RVDE_REFERENCIA IS NULL)) and
            f.bode_cod = b.bode_cod
            GROUP BY COAR_CTAVNT
            INTO :CTAVENTAS, :MONTO, :IMPTOS, :VRCONSUMO, :PROYI, :CENTI
            DO
            BEGIN
            if ((FOMENTO = 'SI') or (icoing = 'SI')) then
                MONTO = MONTO + VRCONSUMO;
            execute procedure redondee(MONTO, DIG) returning_values (MONTO);
            if (MONTO <> 0) then
                BEGIN
                EXECUTE PROCEDURE CUENTA_INTERFAZ_NIIF(32, :IDDOC, :CTAVENTAS, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERRORI = ERRORI + 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)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :fecha, NULL, 0, 31);
                    NROI = NROI + 1;
                    SUMA = SUMA - MONTO;
                    END
                ELSE
                    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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROYI, :CENTI, NULL, NULL, NULL, NULL, 0, 0);
                    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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    SUMA = SUMA - MONTO;
                    END
                END /* MONTO <> 0 */
            END /* FOR */
        END /* VENTAS A */
    if (IVA = 'A') then
        BEGIN
        FOR SELECT MAX(COAR_CTAIVAV), SUM(RVDE_IVAMONTO), SUM(RVDE_TOTAL-RVDE_IVAMONTO-RVDE_CONSUMO-RVDE_INALCM), sum(RVDE_CONSUMO)
            FROM ARTICULO A, CONTABIL_ARTICULO_NIIF C, remisiones_venta_detalle F
            WHERE F.REVT_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND ((RVDE_REFERENCIA <> '.t') or (RVDE_REFERENCIA IS NULL))
            AND RVDE_IVAMONTO <> 0
            GROUP BY COAR_CTAIVAV
            INTO :CTAIVA, :IMPTOS, :MONTO, :VALORADIC
            DO
            BEGIN
            if (FOMENTO = 'SI') then
                MONTO = MONTO + VALORADIC;
            MONTO = MONTO * -1;
            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(32, :IDDOC, :CTAIVA, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERRORI = ERRORI + 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)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :IMPTOS, :MONTO, ABS(:IMPTOS*100/:MONTO), :NIT, :PROY, :CENTRO, :NUMERO, NULL, :fecha, NULL, 0, 31);
                    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)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :IMPTOS, :MONTO, ABS(:IMPTOS*100/:MONTO), :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    SUMA = SUMA - IMPTOS;
                    END
                END   /* IMPTOS <> 0 */
            END /* FOR */
        END /* IVA A */
    if (IVA = 'K') then
        BEGIN
        SELECT SUM(RVDE_IVAMONTO), SUM(RVDE_TOTAL-RVDE_IVAMONTO-RVDE_CONSUMO-RVDE_INALCM), SUM(RVDE_CONSUMO)
            FROM remisiones_venta_detalle F
            WHERE F.REVT_ID = :IDDOC and RVDE_IVAMONTO <> 0 AND ((RVDE_REFERENCIA <> '.t') or (RVDE_REFERENCIA IS NULL))
            INTO :IMPTOS, :MONTO, :valoradic;
        if (FOMENTO = 'SI') then
            MONTO = MONTO + VALORADIC;
        MONTO = MONTO * -1;
        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(32, :IDDOC, :CTAIVA, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERRORI = ERRORI + 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)
                    VALUES (:IDC, :NROI, :CTAIVA, :CONC, '', 0, :IMPTOS, :MONTO, ABS(:IMPTOS*100/:MONTO), :NIT, :PROY, :CENTRO, :NUMERO, NULL, :fecha, NULL, 0, 31);
                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)
                    VALUES (:IDC, :NROI, :CTAIVA, :CONC, '', 0, :IMPTOS, :MONTO, ABS(:IMPTOS*100/:MONTO), :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA - IMPTOS;
                END
            END /* IMPTOS <> 0 */
        END /* IVA K */
    if ((CONSUMO = 'A') AND (FOMENTO <> 'SI')) then
        BEGIN
        FOR SELECT MAX(COAR_CTACONS), SUM(RVDE_CONSUMO)
            FROM ARTICULO A, CONTABIL_ARTICULO_NIIF C, remisiones_venta_detalle F
            WHERE F.REVT_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND ((RVDE_REFERENCIA <> '.t') or (RVDE_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(32, :IDDOC, :CTACONSUMO, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERRORI = ERRORI + 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)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :fecha, NULL, 0, 31);
                    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)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    SUMA = SUMA - IMPTOS;
                    END
                END /* IMPTOS <> 0 */
            END /* FOR */
        END /* CONSUMO A */
    if ((CONSUMO = 'K') AND (FOMENTO <> 'SI')) then
        BEGIN
        SELECT SUM(RVDE_CONSUMO)
            FROM remisiones_venta_detalle F
            WHERE F.REVT_ID = :IDDOC AND ((RVDE_REFERENCIA <> '.t') or (RVDE_REFERENCIA IS NULL))
            INTO :IMPTOS;
        execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
        if (IMPTOS <> 0) then
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ_NIIF(32, :IDDOC, :CTACONSUMO, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERRORI = ERRORI + 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)
                    VALUES (:IDC, :NROI, :CTACONSUMO, :CONC, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :fecha, NULL, 0, 31);
                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)
                    VALUES (:IDC, :NROI, :CTACONSUMO, :CONC, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA - IMPTOS;
                END
            END /* IMPTOS <> 0 */
        END /* CONSUMO K */
    /* IMP NACIONAL CONSUMO */
        BEGIN
        SELECT SUM(RVDE_INALCM), SUM(RVDE_TOTAL-RVDE_IVAMONTO-RVDE_CONSUMO-RVDE_INALCM) FROM remisiones_venta_detalle F
            WHERE F.REVT_ID = :IDDOC AND ((RVDE_REFERENCIA <> '.t') or (RVDE_REFERENCIA IS NULL)) and
            RVDE_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
                ERRORI = ERRORI + 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)
                    VALUES (:IDC, :NROI, :CTACONSUMO, :CONC, '', 0, :IMPTOS, :MONTO, :PORC, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :fecha, NULL, 0, 31);
                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)
                    VALUES (:IDC, :NROI, :CTACONSUMO, :CONC, '', 0, :IMPTOS, :MONTO, :PORC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA - IMPTOS;
                END
            END /* IMPTOS <> 0 */
        END /* INALC */

    /* ARTICULOS DE TERCEROS LLEVE ESE VALOR A LA CUENTA INDICADA */
    SELECT SUM(RVDE_TOTAL) FROM remisiones_venta_detalle F, ARTICULO A
        WHERE F.REVT_ID = :IDDOC AND ((RVDE_REFERENCIA <> '.t') or (RVDE_REFERENCIA IS NULL)) AND F.arti_cod = A.arti_cod AND A.arti_tercero = 'S'
        INTO :MONTO;
    if (MONTO IS NULL) then
        MONTO = 0;
    if (MONTO <> 0) then
        BEGIN
        execute procedure redondee(MONTO, DIG) returning_values (MONTO);
        if (MONTO <> 0) then
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ_NIIF(32, :IDDOC, :CTAVENTAS, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERRORI = ERRORI + 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)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :fecha, NULL, 0, 31);
                NROI = NROI + 1;
                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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA + MONTO;
                END
            END /* MONTO <> 0 */
        END
    /* CIERRE CONTRA LA CUENTA DEL TERCERO O LA CONSTANTE */
    if ((SUMA <> 0) and ((CARTERA = 'C') or (CARTERA = 'K'))) then
        BEGIN
        if (icoing = 'SI') then
            BEGIN
            /* DESCUENTE IMPOCONSUMO DEL COSTO */
            SELECT SUM(RVDE_CONSUMO) FROM remisiones_venta_detalle F WHERE F.revt_id = :IDDOC AND ((RVDE_REFERENCIA <> '.t') or (RVDE_REFERENCIA IS NULL))
                INTO :IMPTOS;
            SUMA = SUMA + IMPTOS;
            END
        if (SUMA < 0) then
            BEGIN
            DEBITO = SUMA * -1;
            CREDITO = 0;
            END
        ELSE
            BEGIN
            DEBITO = 0;
            CREDITO = SUMA;
            END
        if (CARTERA = 'C') then
            CTACARTERA = TCTACLIEN;
        EXECUTE PROCEDURE CUENTA_INTERFAZ_NIIF(32, :IDDOC, :CTACARTERA, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
        if (ERRORC <> 0) then
            ERRORI = ERRORI + 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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :DEBITO, :CREDITO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :fecha, NULL, 0, 31);
        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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :DEBITO, :CREDITO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
        NROI = NROI + 1;
        END /* SUMA EN CARTERA */
    /* CALCULE COSTOS EN VENTAS */
    EXECUTE PROCEDURE COSTO_EN_VENTAS(32, :IDDOC);
    if (COSTOS = 'A') then
        BEGIN
        FOR SELECT MAX(CTACOS), SUM(CAST(CANT AS DOUBLE PRECISION) * COSTO), SUM(RVDE_CONSUMO)
            FROM COSTO_VENTAS CV, remisiones_venta_detalle D WHERE CV.cove_item = D.rvde_item AND D.revt_id = :iddoc AND
            TIDO_COD = 32 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(32, :IDDOC, :CTACOSTOS, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERRORI = ERRORI + 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)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :fecha, NULL, 0, 31);
                    NROI = NROI + 1;
                    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)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    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 WHERE TIDO_COD = 32 AND COVE_ID = :iddoc
            INTO :MONTO;
        if (icoing = 'SI') then
            MONTO = MONTO + imptos;
        if (MONTO <> 0) then
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ_NIIF(32, :IDDOC, :CTACOSTOS, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERRORI = ERRORI + 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)
                    VALUES (:IDC, :NROI, :CTACOSTOS, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :fecha, NULL, 0, 31);
                NROI = NROI + 1;
                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)
                    VALUES (:IDC, :NROI, :CTACOSTOS, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                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 WHERE TIDO_COD = 32 AND COVE_ID = :iddoc
            GROUP BY CTAINV
            INTO :CTAINVEN, :MONTO
            DO
            BEGIN
            if (MONTO <> 0) then
                BEGIN
                EXECUTE PROCEDURE CUENTA_INTERFAZ_NIIF(32, :IDDOC, :CTAINVEN, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERRORI = ERRORI + 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)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :fecha, NULL, 0, 31);
                    NROI = NROI + 1;
                    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)
                        VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    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 WHERE TIDO_COD = 32 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
                ERRORI = ERRORI + 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)
                    VALUES (:IDC, :NROI, :CTAINVEN, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :fecha, NULL, 0, 31);
                NROI = NROI + 1;
                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)
                    VALUES (:IDC, :NROI, :CTAINVEN, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                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 = 'IVA') then
                VALORADIC = VRIVA;
            if (:BASEADIC = 'TOTAL') then
                VALORADIC = VRTOTAL;
            MONTO = VALORADIC * PORCADIC / 100;
            END
        if (MONTO <> 0) then
            BEGIN
            EXECUTE PROCEDURE CUENTA_INTERFAZ_NIIF(32, :IDDOC, :CTADIC, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERRORI = ERRORI + 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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTADIC, :CONC, '', :MONTO, 0, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :fecha, NULL, 0, 31);
                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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTADIC, :CONC, '', 0, :MONTO, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :fecha, NULL, 0, 31);
                NROI = NROI + 1;
                END
            ELSE
                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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTADIC, :CONC, '', :MONTO, 0, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NROI, :CTADIC, :CONC, '', 0, :MONTO, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                END
            NROI = NROI + 1;
            END
        END
    if (ERRORI > 0) then
        VER = 'S';
    SUSPEND;
    END /* NO ANULADO */
  END /* EXISTE LA INTERFAZ */
ELSE
    BEGIN
    EXECUTE PROCEDURE ERRORINT(32, :IDDOC, :PREF, 1);
    ERRORI = ERRORI + 1;
    VER = 'S';
    SUSPEND;
    END
END

^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE EXPORTA_FACTURAS(
    INI DATE,
    FIN DATE)
RETURNS (
    IDDOC INTEGER,
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(8),
    FECHA VARCHAR(8),
    VENCE VARCHAR(8),
    NIT VARCHAR(15),
    CODCLI VARCHAR(15),
    NOMBRE VARCHAR(22),
    VENDEDOR INTEGER,
    BODEGA VARCHAR(2),
    OBSERVACION VARCHAR(255),
    ITEM INTEGER,
    CUENTA VARCHAR(20),
    PROY VARCHAR(4),
    CENTRO VARCHAR(4),
    ARTICULO VARCHAR(15),
    DESCR VARCHAR(60),
    LOTE VARCHAR(15),
    CANT NUMERIC(18,4),
    MONTO NUMERIC(18,2),
    DB CHAR(1))
AS
declare variable TOTAL NUMERIC(18,2);
declare variable CARTERA CHAR(1);
declare variable FECAUX DATE;
declare variable VENCEAUX DATE;
declare variable SUMA NUMERIC(18,2);
BEGIN
/* FACTURAS DEL RANGO QUE NO SE HAN TRANSMITIDO */
FOR SELECT FACT_ID, F.PREF_PRE, FACT_NUMERO, FACT_FECHA, FACT_VENCE, FACT_TOTAL, TERC_NIT, PREF_PROY, PREF_CENTRO, VEND_COD, BODE_COD, FACT_OBS, SUBSTRING(FACT_NOMCLIENTE FROM 1 FOR 22)
    FROM FACTURAS F, PREFIJOS P
    WHERE F.PREF_PRE = P.PREF_PRE AND P.TIDO_COD = 31 AND FACT_FECHA >= :INI AND FACT_FECHA <= :FIN AND FACT_TRANSMIT = 'N'
    INTO :IDDOC, :PREFIJO, :NUMERO, :FECAUX, :VENCEAUX, :TOTAL, :NIT, :PROY, :CENTRO, :VENDEDOR, :BODEGA, :OBSERVACION, :NOMBRE
    DO
    BEGIN
    SELECT CLIE_COD FROM CLIENTES WHERE TERC_NIT = :NIT INTO :codcli;
    EXECUTE PROCEDURE FECHA_A_CONTA(:FECAUX) returning_values (:FECHA);
    EXECUTE PROCEDURE FECHA_A_CONTA(:VENCEAUX) returning_values (:VENCE);
    SUMA = 0;
    /* VENTAS */
    FOR SELECT F.ARTI_COD, FADE_DESC, COAR_CTAVNT, FADE_LOTE, FADE_CANT, FADE_CANT * (FADE_PRUNIT - FADE_DTOMONTO), 'C'
        FROM ARTICULO A, CONTABIL_ARTICULO 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))
        INTO :ARTICULO, :DESCR, :CUENTA, :LOTE, :CANT, :MONTO, :DB
        DO
            BEGIN
            SUMA = SUMA + MONTO;
            SUSPEND;
            END
    /* IVA */
    FOR SELECT F.FADE_ITEM, F.ARTI_COD, FADE_DESC, COAR_CTAIVAV, FADE_LOTE, FADE_CANT, FADE_IVAMONTO, 'C'
        FROM ARTICULO A, CONTABIL_ARTICULO 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))
        INTO :ITEM, :ARTICULO, :DESCR, :CUENTA, :LOTE, :CANT, :MONTO, :DB
        DO 
            BEGIN
            SUMA = SUMA + MONTO;
            SUSPEND;
            END
    /* TOTAL */
    SELECT MAX(INVE_CARTERA), MAX(INVE_CTACARTERA)
    FROM INTERFAZ_VENTAS I
    WHERE TIDO_COD = 31 AND PREF_PRE = :PREFIJO
    INTO :CARTERA, :CUENTA;
    if (CARTERA = 'C') then
        SELECT TERC_CTACLIENTE FROM TERCEROS WHERE TERC_NIT = :NIT INTO :CUENTA;
    ARTICULO = '';
    DESCR = '';
    LOTE = '000';
    CANT = 0;
    MONTO = SUMA;
    DB = 'D';
    SUSPEND;
    /* INVENTARIO */
    EXECUTE PROCEDURE COSTO_EN_VENTAS(31, :IDDOC);
    FOR SELECT C.ARTI_COD, ARTI_DES, CTAINV, '000', CANT, CANT * COSTO, 'C'
        FROM COSTO_VENTAS C, ARTICULO A
        WHERE C.ARTI_COD = A.ARTI_COD AND TIDO_COD = 31 AND COVE_ID = :IDDOC
        INTO :ARTICULO, :DESCR, :CUENTA, :LOTE, :CANT, :MONTO, :DB
        DO SUSPEND;
    /* COSTO */
    FOR SELECT C.ARTI_COD, ARTI_DES, CTACOS, '000', CANT, CANT * COSTO, 'D'
        FROM COSTO_VENTAS C, ARTICULO A
        WHERE C.ARTI_COD = A.ARTI_COD AND TIDO_COD = 31 AND COVE_ID = :IDDOC
        INTO :ARTICULO, :DESCR, :CUENTA, :LOTE, :CANT, :MONTO, :DB
        DO SUSPEND;
    END
  SUSPEND;
END

^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE RECONTABILICE_COSTOS_VENTAS(
    FECINI DATE,
    FECFIN DATE)
RETURNS (
    ID INTEGER,
    PREF VARCHAR(4),
    NUMERO VARCHAR(8),
    IDC INTEGER)
AS
declare variable IDI INTEGER;
begin
FOR SELECT FACT_ID, PREF_PRE, FACT_NUMERO FROM FACTURAS WHERE fact_anulado = 'N' and FACT_FECHA >= :FECINI AND FACT_FECHA <= :FECFIN ORDER BY FACT_FECHA, FACT_ID INTO :ID, :PREF, :NUMERO
    do  
    BEGIN
    SELECT MAX(INVE_ID) FROM INTERFAZ_VENTAS WHERE PREF_PRE = :PREF AND TIDO_COD = 31 INTO :IDI;
    EXECUTE PROCEDURE CONTABILICE_COSTO_VENTAS(31, :ID, :IDI) returning_values (:IDC);
    suspend;
    END
FOR SELECT DEVT_ID, PREF_PRE, DEVT_NUMERO FROM devoluciones_ventas WHERE devt_anulado = 'N' and DEVT_FECHA >= :FECINI AND DEVT_FECHA <= :FECFIN ORDER BY DEVT_FECHA, DEVT_ID INTO :ID, :PREF, :NUMERO
    do  
    BEGIN
    SELECT MAX(INVE_ID) FROM INTERFAZ_VENTAS WHERE PREF_PRE = :PREF AND TIDO_COD = 33 INTO :IDI;
    EXECUTE PROCEDURE CONTABILICE_COSTO_VENTAS(33, :ID, :IDI) returning_values (:IDC);
    suspend;
    END
end

^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE DEVOLUCIONES_SIN_CONTABILIDAD(
    FECINI DATE,
    FECFIN DATE)
RETURNS (
    ID INTEGER,
    PREF VARCHAR(4),
    NUMERO VARCHAR(8),
    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 DEVT_ID, PREF_PRE, DEVT_NUMERO FROM devoluciones_ventas WHERE DEVT_ANULADO = 'N' AND
    DEVT_FECHA >= :FECINI AND DEVT_FECHA <= :FECFIN
    INTO :ID, :PREF, :NUMERO
DO
  BEGIN
  idref = null;
  SELECT ENCO_IDREF FROM COMPROBANTE_ENCABEZADO WHERE ENCO_TIPOREF = 33 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(INVE_ID) FROM INTERFAZ_VENTAS WHERE PREF_PRE = :PREF AND TIDO_COD = 33 INTO :IDI;
   EXECUTE PROCEDURE contabil_devolcli (: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 CONTADO_MVERDE(
    FECINI DATE,
    FECFIN DATE,
    PREF VARCHAR(4))
RETURNS (
    FECHA DATE,
    PUNTO INTEGER,
    IDC INTEGER,
    ERROR INTEGER,
    VER CHAR(1))
AS
declare variable IDIN INTEGER;
declare variable IDF INTEGER;
declare variable NIT VARCHAR(20);
begin
FECHA = FECINI;
SELECT MAX(INVE_ID) FROM INTERFAZ_VENTAS WHERE TIDO_COD = 31 AND PREF_PRE = :PREF INTO :IDIN;
WHILE (FECHA <= fecfin) DO
    BEGIN
    /* LAS DE CONTADO */
    FOR SELECT PTVT_ID, TERC_NIT FROM punto_venta WHERE PREF_PRE = :PREF ORDER BY PTVT_ID INTO :PUNTO, :NIT
        do
        BEGIN
        EXECUTE PROCEDURE contabil_facturas_contado (FECHA, NIT, PREF, PUNTO, IDIN) returning_values (ERROR,  VER, IDC);
        EXECUTE PROCEDURE contabiliza_pendiente (IDC);
        suspend;
        END
    /* LAS DE CREDITO */
    FOR SELECT FACT_ID, PTVT_ID FROM facturas F WHERE fact_fecha = :fecha and pref_pre = :pref and
        NOT exists (select terc_nit from punto_venta p where terc_nit = f.terc_nit) into : IDF, :PUNTO
        DO
        BEGIN
        if (NOT EXISTS (SELECT ENCO_CONSEC FROM comprobante_encabezado WHERE ENCO_TIPOREF = 31 AND ENCO_IDREF = :IDF)) then
            BEGIN
            EXECUTE PROCEDURE contabil_factura(idf,  IDIN) returning_values (ERROR, VER, IDC);
            EXECUTE PROCEDURE contabiliza_pendiente (IDC);
            suspend;
            END
        END
    FECHA = FECHA + 1;
    END
end

^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE FACTURAR_CONCEPTOS(
    ID INTEGER,
    NITINI VARCHAR(20),
    NITFIN VARCHAR(20),
    AGRINI VARCHAR(20),
    AGRFIN VARCHAR(20),
    AGRUPA INTEGER,
    FECHA DATE,
    REFER VARCHAR(60),
    FECINI DATE,
    FECFIN DATE,
    MORA NUMERIC(9,4))
RETURNS (
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(8),
    NIT VARCHAR(20),
    SUCURSAL VARCHAR(10),
    NOMBRE VARCHAR(60),
    TOTAL NUMERIC(18,2))
AS
declare variable IDF INTEGER;
declare variable IDC INTEGER;
declare variable VEND INTEGER;
declare variable PTVT INTEGER;
declare variable VENDINI INTEGER;
declare variable VENDFIN INTEGER;
declare variable ZONINI CHAR(2);
declare variable ZONFIN CHAR(2);
declare variable grpini INTEGER;
declare variable grpfin INTEGER;
declare variable DIAS INTEGER;
declare variable OBS VARCHAR(255);
declare variable IVAINC CHAR(1);
declare variable ITEM INTEGER;
declare variable ARTICULO VARCHAR(20);
declare variable DESCR VARCHAR(60);
declare variable CANT NUMERIC(18,2);
declare variable PRUNIT NUMERIC(18,2);
declare variable IVAP NUMERIC(18,2);
declare variable IVAM NUMERIC(18,2);
declare variable BASE NUMERIC(18,2);
declare variable RTFTE NUMERIC(9,2);
declare variable RTIVA NUMERIC(9,2);
declare variable RTICA NUMERIC(9,2);
declare variable RTCREE NUMERIC(9,2);
declare variable RTFTEM NUMERIC(18,2);
declare variable RTIVAM NUMERIC(18,2);
declare variable RTICAM NUMERIC(18,2);
declare variable RTCREEM NUMERIC(18,2);
declare variable UNIDAD VARCHAR(8);
declare variable BOD VARCHAR(2);
declare variable ERROR INTEGER;
declare variable VER CHAR(1);
declare variable factmes varchar(2);
declare variable GRPFM VARCHAR(3);
declare variable OK CHAR(1);
declare variable SALDO NUMERIC(18,2);
declare variable REDON INTEGER;
declare variable REDONT INTEGER;
begin
if (agrupa = 0) then
    BEGIN
    VENDINI = 0;
    VENDFIN = 999999;
    GRPINI = 0;
    GRPFIN = 999999;
    ZONINI = '';
    ZONFIN = 'zz';
    END
if (agrupa = 1) then
    BEGIN
    VENDINI = 0;
    VENDFIN = 999999;
    ZONINI = '';
    ZONFIN = 'zz';
    GRPINI = AGRINI;
    GRPFIN = AGRFIN;
    END
if (agrupa = 2) then
    BEGIN
    GRPINI = 0;
    GRPFIN = 999999;
    ZONINI = '';
    ZONFIN = 'zz';
    VENDINI = AGRINI;
    VENDFIN = AGRFIN;
    END
if (agrupa = 3) then
    BEGIN
    VENDINI = 0;
    VENDFIN = 999999;
    GRPINI = 0;
    GRPFIN = 999999;
    ZONINI = AGRINI;
    ZONFIN = AGRFIN;
    END
EXECUTE procedure lee_configuracion ('FACTURACION', 'FACTURAS', 'GRUPO DE MERCANCIA PARA CONTROL MENSUAL DE FACTURACION') returning_values (:GRPFM);
EXECUTE procedure lee_configuracion ('FACTURACION', 'FACTURAS', 'CONTROLAR FACTURACION MENSUAL POR CADA CLIENTE') returning_values (:factmes);
EXECUTE procedure lee_configuracion ('FACTURACION', 'ARTICULOS', 'REDONDEO AL MULTIPLO DE DIEZ EN PRECIOS') returning_values (:redon);
EXECUTE procedure lee_configuracion ('FACTURACION', 'DOCUMENTOS', 'REDONDEO AL MULTIPLO DE DIEZ EN TOTALES') returning_values (:redont);
SELECT FACC_PREF, FACC_VEND, FACC_DIAS, FACC_PTVT, FACC_OBS FROM factura_concepto WHERE FACC_ID = :ID
    INTO :prefijo, :vend, :dias, :ptvt, :obs;
SELECT BODE_COD FROM punto_venta WHERE PTVT_ID = :PTVT INTO :BOD;

FOR SELECT T.TERC_NIT, S.clcu_cod, S.clsu_nombre, S.vend_cod, C.clie_rtefte, C.clie_rteiva, C.clie_rteica, C.clie_rtftebase, C.clie_rtcree, clie_rticabase
    FROM TERCEROS T, CLIENTES C, CLIENTE_SUCURSALES S
    WHERE T.terc_nit = C.terc_nit AND T.TERC_NIT >= :NITINI AND T.TERC_NIT <= :NITFIN AND C.terc_nit = S.terc_nit AND
        C.vend_cod >= :vendini AND C.vend_cod <= :vendfin AND ((S.grca_cod is null and :grpini = 0 ) or (S.grca_cod >= :grpini AND S.grca_cod <= :grpfin)) AND
        ((c.zona_cod is null and :zonini = '') or (C.zona_cod >= :zonini AND C.zona_cod <= :zonfin))
    INTO :NIT, :sucursal, :NOMBRE, :VEND, :RTFTE, :RTIVA, :RTICA, :RTFTEM, :rtcree, :RTICAM
    DO
    BEGIN
    SELECT PREF_ACTUAL, PREF_IVAINC FROM PREFIJOS WHERE TIDO_COD = 31 AND PREF_PRE = :prefijo
        INTO :NUMERO, :IVAINC;
    select max(INVE_ID) FROM interfaz_ventas WHERE PREF_PRE = :prefijo AND TIDO_COD = 31 INTO :IDC;

    OK = 'S';
    if (FACTMES = 'SI') then
        begin
        if (EXISTS(SELECT FAME_IDFACT FROM FACTURAS_MES WHERE FAME_NIT = :nit AND FAME_SUCURSAL = :sucursal AND FAME_ANO = EXTRACT(YEAR FROM :FECHA) AND FAME_MES = EXTRACT(MONTH FROM :FECHA))) then
            OK = 'N';
        end
    if (OK = 'S') then
        BEGIN
        IDF = GEN_ID(id_factura, 1);
        INSERT INTO FACTURAS (FACT_ID, PTVT_ID, VEND_COD, TERC_NIT, AUTO_NUMERO, FACT_NUMERO, FACT_FECHA, FACT_DESPACHO,
            FACT_VENCE, FACT_IVAINC, FACT_COMIPORC, FACT_COMIMONTO, FACT_DTOPOR, FACT_DTOMONTO, FACT_ADICIONAL,
            FACT_IVAMONTO, FACT_RTFTEPOR, FACT_RTFTEMONTO, FACT_RTIVAPOR, FACT_RTIVAMONTO, FACT_RTICAPOR, FACT_RTICAMONTO,
            FACT_EXTRA, FACT_DTOFPOR, FACT_DTOFMONTO, FACT_DTOFFECHA, PREF_PRE, FACT_TRANSP, FACT_NOMCLIENTE, FACT_COTIZACI,
            FACT_PEDIDO, FACT_REMISION, FACT_ANULADO, FACT_TRANSMIT, FACT_TOTAL, BODE_COD, FACT_OBS, VEHI_COD, FACT_CONSOLIDA,
            FACT_RECIBIDO, FACT_USUARIO, FACT_SUCURSAL, NUMOK, COBR_COD, FACT_FACTOR, FACT_DETCLI, FACT_DETCLINOM,
            FACT_DTOIT1, FACT_DTOIT2, FACT_DTOIT3, FACT_TRM, FACT_FECINI, FACT_FECFIN, FACT_RTCREE, FACT_RTCREEM)
            VALUES (:IDF, :PTVT, :VEND, :NIT, NULL, :NUMERO, :FECHA, NULL, (:FECHA + :DIAS), :IVAINC,
            0, 0, 0, 0, 0, :IVAM, :RTFTE, :RTFTEM, :RTIVA, :RTIVAM, :RTICA, :RTICAM, 0, 0, 0, :FECHA, :PREFIJO, NULL,
            :NOMBRE, NULL, NULL, NULL, 'N', 'S', :TOTAL, :BOD, :OBS, NULL, NULL, 0, USER, :sucursal, 'N', :VEND, 1, NULL,
            NULL, NULL, NULL, NULL, 1, :fecini, :fecfin, :rtcree, :rtcreem);

        FOR SELECT FACI_ITEM, FC.ARTI_COD, FACI_CANT, FACI_PRUNIT, ARTI_UNIDAD, TAIV_PORC, FACI_DESC
            FROM factura_concepto_items FC, ARTICULO A, TARIFA_IVA I
            WHERE FC.arti_cod = A.arti_cod AND A.taiv_cod = I.taiv_cod AND FC.facc_id = :ID
            INTO :item, :articulo, :CANT, :prunit, :unidad, :ivap, :descr
            DO
            BEGIN
            /* busque el precio por cliente */
            if (EXISTS(SELECT ARTI_COD FROM ARTICULO WHERE ARTI_COD = :articulo AND GRUP_COD = :GRPFM)) then
                SELECT CLSU_VALORMES FROM cliente_sucursales WHERE TERC_NIT = :NIT AND CLCU_COD = :sucursal INTO :PRUNIT;

            if (IVAINC = 'S') then
                BEGIN
                IVAM = :CANT * :PRUNIT / (100 + :IVAP) * :IVAP;
                BASE = :CANT * :PRUNIT;
                END
            ELSE
                BEGIN
                IVAM = :CANT * :PRUNIT * IVAP / 100;
                BASE = :CANT * :PRUNIT + IVAM;
                END
            EXECUTE PROCEDURE redondee(IVAM, REDON) returning_values (IVAM);
            EXECUTE PROCEDURE redondee(BASE, REDON) returning_values (BASE);
            INSERT INTO FACTURAS_DETALLE (FACT_ID, FADE_ITEM, BODE_COD, ARTI_COD, FADE_CANT, FADE_UNIDAD, FADE_LOTE,
                FADE_PRUNIT, FADE_DTOPORC, FADE_DTOMONTO, FADE_IVAPORC, FADE_IVAMONTO, FADE_CONSUMO, FADE_FACTOR,
                FADE_DESC, FADE_OBS, FADE_CODBAR, FADE_REMISIONADO, FADE_DEVUELTO, FADE_TOTAL, LIPR_COD, FADE_REFERENCIA,
                FADE_ANULADO, FADE_TRANSMIT, FADE_FACTORLISTA, FADE_DTO1, FADE_DTO2, FADE_DTO3, FADE_DTOM1, FADE_DTOM2,
                FADE_DTOM3, FADE_CAJAS)
                VALUES (:IDF, :ITEM, :BOD, :articulo, :CANT, :UNIDAD, NULL, :prunit, 0, 0, :IVAP, :ivam, 0, 1,
                :descr, NULL, :articulo, 0, 0, :BASE, 1, :refer, 'N', 'N', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
            END

        /* SI HAY TASA DE MORA AGREGUE EL ITEM */
        execute procedure lee_configuracion('FACTURACION', 'FACTURAS', 'CODIGO DE ARTICULO PARA FACTURAR INTERESES DE MORA') returning_values (:articulo);
        if ((ARTICULO <> '') AND (MORA <> 0)) then
            BEGIN
            select sum(SALDO) from vencido_cliente (:nit, :fecini, '01', 'N') INTO :SALDO;
            PRUNIT = SALDO * MORA / 100;
            EXECUTE PROCEDURE redondee(PRUNIT, REDON) returning_values (PRUNIT);
            if (PRUNIT > 0) then
                BEGIN
                ivap = 0;
                IVAM = 0;
                SELECT ARTI_DES, ARTI_UNIDAD FROM ARTICULO WHERE ARTI_COD = :ARTICULO INTO :DESCR, :UNIDAD;
                INSERT INTO FACTURAS_DETALLE (FACT_ID, FADE_ITEM, BODE_COD, ARTI_COD, FADE_CANT, FADE_UNIDAD, FADE_LOTE,
                    FADE_PRUNIT, FADE_DTOPORC, FADE_DTOMONTO, FADE_IVAPORC, FADE_IVAMONTO, FADE_CONSUMO, FADE_FACTOR,
                    FADE_DESC, FADE_OBS, FADE_CODBAR, FADE_REMISIONADO, FADE_DEVUELTO, FADE_TOTAL, LIPR_COD, FADE_REFERENCIA,
                    FADE_ANULADO, FADE_TRANSMIT, FADE_FACTORLISTA, FADE_DTO1, FADE_DTO2, FADE_DTO3, FADE_DTOM1, FADE_DTOM2,
                    FADE_DTOM3, FADE_CAJAS)
                    VALUES (:IDF, :ITEM+1, :BOD, :articulo, 1, :UNIDAD, NULL, :prunit, 0, 0, :IVAP, :ivam, 0, 1,
                    :descr, NULL, :articulo, 0, 0, :PRUNIT, 1, NULL, 'N', 'N', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
                END
            END
        /* CALCULE EL TOTAL DE LA FACTURA XA EFECTOS DE IMPUESTOS */
        SELECT SUM(FADE_TOTAL), SUM(FADE_IVAMONTO) FROM facturas_detalle WHERE FACT_ID = :idf
            INTO :TOTAL, :IVAM;
        BASE = TOTAL - IVAM;
        if (BASE >= RTFTEM) then
            BEGIN
            RTFTEM = BASE * RTFTE / 100;
            RTIVAM = IVAM * RTIVA / 100;
            END
        ELSE
            BEGIN
            RTFTEM = 0;
            RTIVAM = 0;
            END
        RTCREEM = BASE * RTCREE / 100;
        if (BASE >= RTICAM) then
            RTICAM = BASE * RTICA / 1000;
        else
            RTICAM = 0;
        EXECUTE PROCEDURE redondee(TOTAL, REDONT) returning_values (TOTAL);
        EXECUTE PROCEDURE redondee(IVAM, REDONT) returning_values (IVAM);
        EXECUTE PROCEDURE redondee(RTFTEM, REDONT) returning_values (RTFTEM);
        EXECUTE PROCEDURE redondee(RTIVAM, REDONT) returning_values (RTIVAM);
        EXECUTE PROCEDURE redondee(RTICAM, REDONT) returning_values (RTICAM);
        EXECUTE PROCEDURE redondee(RTCREEM, REDONT) returning_values (RTCREEM);
        UPDATE FACTURAS SET FACT_TOTAL = :total,  FACT_IVAMONTO = :IVAM, FACT_RTFTEMONTO = :rtftem, 
            FACT_RTIVAMONTO = :rtivam, FACT_RTICAMONTO = :rticam, FACT_RTCREEM = :rtcreem, FACT_TRANSMIT = 'N' WHERE FACT_ID = :IDF;

        /* contabilice */
        execute procedure CONTABIL_FACTURA(:idf,  :IDC) returning_values (:ERROR, :VER, :IDC);
        EXECUTE procedure contabiliza_pendiente (:IDC);
        suspend;
        END
    END
end

^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE FACTURAS_SIN_CONTABILIDAD(
    FECINI DATE,
    FECFIN DATE)
RETURNS (
    ID INTEGER,
    PREF VARCHAR(4),
    NUMERO VARCHAR(8),
    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 FACT_ID, PREF_PRE, FACT_NUMERO FROM FACTURAS WHERE FACT_ANULADO = 'N' AND
    FACT_FECHA >= :FECINI AND FACT_FECHA <= :FECFIN INTO :ID, :PREF, :NUMERO
DO
  BEGIN
  idref = null;
  SELECT ENCO_IDREF FROM COMPROBANTE_ENCABEZADO WHERE ENCO_TIPOREF = 31 AND ENCO_FECHA >= :FECICNT AND ENCO_FECHA <= :FECFCNT and ENCO_IDREF = :ID into :idref;
  if (idref IS 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 (:ID, :IDI) RETURNING_VALUES (:ERROR, VER, :IDC);
   if ((ERROR = 0) or (error IS NULL)) then
    BEGIN
    EXECUTE PROCEDURE CONTABILIZA_PENDIENTE (:IDC);
    ESTADO = 'OK';
    END
   ELSE
    ESTADO = 'ERROR';
   suspend;
  end
  END
END

^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE CONTADO_MVERDE2(
    FECINI DATE,
    FECFIN DATE,
    PREF VARCHAR(4))
RETURNS (
    FECHA DATE,
    PUNTO INTEGER,
    IDC INTEGER,
    ERROR INTEGER,
    VER CHAR(1))
AS
declare variable IDIN INTEGER;
declare variable IDF INTEGER;
declare variable NIT VARCHAR(20);
begin
FECHA = FECINI;
SELECT MAX(INVE_ID) FROM INTERFAZ_VENTAS WHERE TIDO_COD = 31 AND PREF_PRE = :PREF INTO :IDIN;
WHILE (FECHA <= fecfin) DO
    BEGIN
    FOR SELECT FACT_ID, PTVT_ID FROM facturas F WHERE fact_fecha = :fecha and pref_pre = :pref
        ORDER BY FACT_NUMERO into :IDF, :PUNTO
        DO
        BEGIN
        if (NOT EXISTS (SELECT ENCO_CONSEC FROM comprobante_encabezado WHERE ENCO_TIPOREF = 31 AND ENCO_IDREF = :IDF)) then
            BEGIN
            EXECUTE PROCEDURE contabil_factura_factor(idf,  IDIN) returning_values (ERROR, VER, IDC);
            EXECUTE PROCEDURE contabiliza_pendiente (IDC);
            suspend;
            END
        END
    FECHA = FECHA + 1;
    END
end

^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER procedure CONTABIL_ENSAMBLE (
    IDDOC integer,
    IDINTER integer)
returns (
    ERROR integer,
    VER char(1),
    IDC integer)
AS
declare variable PREFIJO VARCHAR(4);
declare variable NUMERO VARCHAR(8);
declare variable FECAUX DATE;
declare variable FECHA CHAR(8);
declare variable CONCEPTO CHAR(60);
declare variable TIPOCOMP VARCHAR(3);
declare variable PREFCONT VARCHAR(4);
declare variable BASE CHAR(1);
declare variable IVAV CHAR(1);
declare variable CONSUMO CHAR(1);
declare variable TOTAL CHAR(1);
declare variable CTABASE VARCHAR(20);
declare variable CTAIVA VARCHAR(20);
declare variable CTACONSUMO VARCHAR(20);
declare variable CTACIERRE 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 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 VRBASE NUMERIC(18,2);
declare variable VRIVA NUMERIC(18,2);
declare variable VRCONSUMO NUMERIC(18,2);
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 ANULADO CHAR(1);
declare variable CENT CHAR(1);
declare variable debito numeric(18,2);
declare variable credito numeric(18,2);
BEGIN
  /* BUSQUE LA INTERFACE */
  EXISTE = 'N';
  SELECT 'S', PREF_PRE, TICO_COD, PRCO_PREF, ININ_BASE, ININ_IVAV, ININ_CONSUMO, ININ_TOTAL, ININ_CTABASE, ININ_CTAIVA, ININ_CTACONSUMO, ININ_CTACIERRE, ININ_CONFIRMAR, ININ_CENTRO
    FROM INTERFAZ_INVENTARIO
    WHERE ININ_ID = :IDINTER
    INTO :EXISTE, :PREFIJO, :TIPOCOMP, :PREFCONT, :BASE, :IVAV, :CONSUMO, :TOTAL, :CTABASE, :CTAIVA, :CTACONSUMO, :CTACIERRE, :VER, :CENT;
  if (EXISTE = 'S') then
    BEGIN
    /* BORRE CUALQUEIR CONTABILIZACION PREVIA */
    DELETE FROM CONTABILIZACION WHERE CNTB_TIPOREF = 15 AND CNTB_IDREF = :IDDOC;
    /* TRAIGA EL ENCABEZADO DEL ENSAMBLE */
    SELECT PREF_PRE, ENSA_NUMERO, ENSA_FECHA, ENSA_CONC, ENSA_ANULADO
        FROM ENSAMBLES
        WHERE ENSA_ID = :IDDOC
        INTO :PREFIJO, :NUMERO, :FECAUX, :CONCEPTO, :ANULADO;
    if (ANULADO = 'N') then
        BEGIN
        if (CENT = 'B') then
            SELECT BODE_CENTRO, BODE_PROY FROM BODEGA B, ENSAMBLES E
                WHERE B.BODE_COD = E.BODE_COD AND E.ENSA_ID = :IDDOC INTO :CENTRO, :PROY;
        ELSE
            SELECT PREF_CENTRO, PREF_PROY FROM PREFIJOS P, ENSAMBLES E
                WHERE P.PREF_PRE = E.PREF_PRE AND E.ENSA_ID = :IDDOC AND P.TIDO_COD = 15 INTO :CENTRO, :PROY;
        /* CONVIERTA LA FECHA A CADENA */
        EXECUTE PROCEDURE FECHA_A_CONTA(:FECAUX) returning_values (:FECHA);
        IDC = GEN_ID(ID_CONTABILIZA, 1);
        /* REGISTRE EL ENCABEZADO CONTABLE */
        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, :NUMERO, :FECHA, :CONCEPTO, '', 15, :IDDOC, :PREFIJO, :NUMERO, 'N');
        NUMITEMS = 0;
        SUMA = 0;
        ERROR = 0;
        /* CALCULE COSTOS EN VENTAS */
        EXECUTE PROCEDURE COSTO_EN_VENTAS(15, :IDDOC);
        /* PRIMERO EL PRODUCTO */
        if (BASE = 'A') then
            BEGIN
            /* SUME LAS BASES DE LOS ARTICULOS DEL DOCUMENTO */
            FOR SELECT MAX(CTAINV), SUM(CAST(CANT AS DOUBLE PRECISION) * COSTO), SUM(ESDE_IVAMONTO + ESDE_CONSUMO)
                FROM ENSAMBLES_DETALLE E, COSTO_VENTAS CV
                WHERE E.ENSA_ID = :IDDOC AND E.esde_item = CV.cove_item and TIDO_COD = 15 AND COVE_ID = E.ensa_id
                GROUP BY CTAINV
                INTO :CTABASE, :MONTO, :IMPTOS
            DO
                BEGIN
                VRBASE = MONTO;
                if (MONTO <> 0) then
                    BEGIN
                    /* TRAIGA LAS CARACTERISTICAS DE LA CUENTA */
                    SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                        WHERE CUEN_COD = :CTABASE INTO :CUENTA, :TIPOCUEN;
                    if (CUENTA IS NULL) then
                        begin
                        EXECUTE PROCEDURE ERRORINT(15, :IDDOC, :CTABASE, 2);
                        CUENTA = CTABASE;
                        ERROR = ERROR + 1;
                        end
                    if (TIPOCUEN = 'I') then
                        BEGIN
                        SELECT ARTI_COD FROM ENSAMBLES WHERE ENSA_ID = :iddoc INTO :ARTICULO;
                        INSERT INTO CONTABILIZACION_DET (CNTB_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)
                            VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ARTICULO, 0, 0);
                        NUMITEMS = NUMITEMS + 1;
                        SUMA = SUMA + MONTO;
                        END
                    if (TIPOCUEN = 'C') then
                        BEGIN
                        EXECUTE PROCEDURE ERRORINT(15, :IDDOC, :CUENTA, 4);
                        TIPOCUEN = 'N';
                        ERROR = ERROR + 1;
                        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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                        NUMITEMS = NUMITEMS + 1;
                        SUMA = SUMA + MONTO;
                        END
                    END
                END /* FOR */
            /* SUME LAS BASES DE LOS ARTICULOS DEL DOCUMENTO */
            SELECT COAR_CTAINV FROM CONTABIL_ARTICULO C, ENSAMBLES E WHERE E.ENSA_ID = :IDDOC AND E.ARTI_COD = C.ARTI_COD
                INTO :CTABASE;
            if (SUMA < 0) then
                BEGIN
                DEBITO = SUMA * -1;
                CREDITO = 0;
                END
            ELSE
                BEGIN
                DEBITO = 0;
                CREDITO = SUMA;
                END
            /* TRAIGA LAS CARACTERISTICAS DE LA CUENTA */
            SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :CTABASE INTO :CUENTA, :TIPOCUEN;
            if (CUENTA IS NULL) then
                begin
                EXECUTE PROCEDURE ERRORINT (15, :IDDOC, :CTABASE, 2);
                CUENTA = CTABASE;
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'I') then
                BEGIN
                SELECT ARTI_COD FROM ENSAMBLES WHERE ENSA_ID = :iddoc INTO :ARTICULO;
                INSERT INTO CONTABILIZACION_DET (CNTB_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)
                    VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :DEBITO, :CREDITO, 0, 0, NULL, :PROY, :CENTRO, NULL, NULL, NULL, :ARTICULO, 0, 0);
                NUMITEMS = NUMITEMS + 1;
                SUMA = SUMA + MONTO;
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                EXECUTE PROCEDURE ERRORINT (15, :IDDOC, :CUENTA, 4);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :DEBITO, :CREDITO, 0, 0, NULL, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NUMITEMS = NUMITEMS + 1;
                SUMA = SUMA + MONTO;
                END
            END /* BASE */
        if (BASE = 'K') then
            BEGIN
            /* SUME LAS BASES DE LOS ARTICULOS DEL DOCUMENTO */
            SELECT SUM(CAST(CANT AS DOUBLE PRECISION) * COSTO), SUM(ESDE_IVAMONTO + ESDE_CONSUMO)
                FROM ENSAMBLES_DETALLE E, costo_ventas cv
                WHERE ENSA_ID = :IDDOC and cv.tido_cod = 15 and cv.cove_id = E.ensa_id and cv.cove_item = E.esde_item
                INTO :MONTO, :IMPTOS;
            if (MONTO <> 0) then
                BEGIN
                /* TRAIGA LAS CARACTERISTICAS DE LA CUENTA */
                SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                    WHERE CUEN_COD = :CTABASE INTO :CUENTA, :TIPOCUEN;
                if (CUENTA IS NULL) then
                    begin
                    EXECUTE PROCEDURE ERRORINT(15, :IDDOC, :CTABASE, 2);
                    CUENTA = CTABASE;
                    ERROR = ERROR + 1;
                    end
                if (TIPOCUEN = 'I') then
                    BEGIN
                    SELECT ARTI_COD FROM ENSAMBLES WHERE ENSA_ID = :IDDOC INTO :ARTICULO;
                    INSERT INTO CONTABILIZACION_DET (CNTB_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)
                        VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ARTICULO, 0, 0);
                    NUMITEMS = NUMITEMS + 1;
                    SUMA = SUMA + MONTO;
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    EXECUTE PROCEDURE ERRORINT(15, :IDDOC, :CUENTA, 4);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NUMITEMS = NUMITEMS + 1;
                    SUMA = SUMA + MONTO;
                    END
                /* LOS COMPONENTES CON LA CUENTA DE CIERRE */
                SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                    WHERE CUEN_COD = :ctacierre INTO :CUENTA, :TIPOCUEN;
                if (CUENTA IS NULL) then
                    begin
                    EXECUTE PROCEDURE ERRORINT(15, :IDDOC, :CTABASE, 2);
                    CUENTA = CTABASE;
                    ERROR = ERROR + 1;
                    end
                if (TIPOCUEN = 'I') then
                    BEGIN
                    SELECT ARTI_COD FROM ENSAMBLES WHERE ENSA_ID = :IDDOC INTO :ARTICULO;
                    INSERT INTO CONTABILIZACION_DET (CNTB_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)
                        VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ARTICULO, 0, 0);
                    NUMITEMS = NUMITEMS + 1;
                    SUMA = SUMA - MONTO;
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    EXECUTE PROCEDURE ERRORINT(15, :IDDOC, :CUENTA, 4);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NUMITEMS = NUMITEMS + 1;
                    SUMA = SUMA - MONTO;
                    END
                END
            END /* BASE K O T */
        /* recorra las cuentas adicionales */
        FOR SELECT INIC_CUENTA, INIC_BASE, INIC_PORC, INIC_VALOR, INIC_DB
            FROM INTERFAZ_INVENTARIO_CTAS
            WHERE ININ_ID = :IDINTER
            INTO :CUENTAADIC, :BASEADIC, :PORCADIC, :VALORADIC, :DBADIC
            DO
            BEGIN
            if (:BASEADIC = 'SUBTOTAL') then
                VALORADIC = VRBASE;
            if (:BASEADIC = 'IVA') then
                VALORADIC = VRIVA;
            if (:BASEADIC = 'CONSUMO') then
                VALORADIC = VRCONSUMO;
            if (:BASEADIC = 'TOTAL') then
                VALORADIC = VRBASE + VRIVA + VRCONSUMO;
            MONTO = VALORADIC * PORCADIC;
            if (MONTO <> 0) then
                BEGIN
                /* 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(15, :IDDOC, :CUENTAADIC, 2);
                    CUENTA = CUENTAADIC;
                    ERROR = ERROR + 1;
                    end
                if (TIPOCUEN = 'I') then
                    BEGIN
                    EXECUTE PROCEDURE ERRORINT(15, :IDDOC, :CUENTA, 3);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    EXECUTE PROCEDURE ERRORINT(15, :IDDOC, :CUENTA, 4);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NUMITEMS, :CUENTAADIC, :CONCEPTO, '', :MONTO, 0, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                        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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NUMITEMS, :CUENTAADIC, :CONCEPTO, '', 0, :MONTO, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                        SUMA = SUMA - MONTO;
                        END
                    NUMITEMS = NUMITEMS + 1;
                    END
                END
            END
        END
      if (ERROR > 0) then
        VER = 'S';
      SUSPEND;
      END /* EXISTE LA INTERFAZ */
  ELSE
    BEGIN
    EXECUTE PROCEDURE ERRORINT(15, :IDDOC, :PREFIJO, 1);
    ERROR = ERROR + 1;
    VER = 'S';
    SUSPEND;
    END
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE ENSAMBLES_SIN_CONTABILIDAD(
    FECINI DATE,
    FECFIN DATE)
RETURNS (
    ID INTEGER,
    PREF VARCHAR(4),
    NUMERO VARCHAR(8),
    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 ENSA_ID, PREF_PRE, ENSA_NUMERO FROM ENSAMBLES WHERE ENSA_ANULADO = 'N' AND
    ENSA_FECHA >= :FECINI AND ENSA_FECHA <= :FECFIN
    INTO :ID, :PREF, :NUMERO
DO
  BEGIN
  idref = null;
  SELECT ENCO_IDREF FROM COMPROBANTE_ENCABEZADO WHERE ENCO_TIPOREF = 15 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(ININ_ID) FROM INTERFAZ_INVENTARIO WHERE PREF_PRE = :PREF AND TIDO_COD = 15 INTO :IDI;
  EXECUTE PROCEDURE CONTABIL_ENSAMBLE (: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_SALIDA (
    IDDOC integer,
    IDINTER integer)
returns (
    ERROR integer,
    VER char(1),
    IDC integer)
AS
declare variable PREFIJO VARCHAR(4);
declare variable NUMERO VARCHAR(8);
declare variable FECAUX DATE;
declare variable FECHA CHAR(8);
declare variable CONCEPTO CHAR(60);
declare variable TIPOCOMP VARCHAR(3);
declare variable PREFCONT VARCHAR(4);
declare variable CTACIERRE VARCHAR(20);
declare variable BASE CHAR(1);
declare variable IVAV CHAR(1);
declare variable CONSUMO CHAR(1);
declare variable TOTAL CHAR(1);
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 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 CTABASE VARCHAR(20);
declare variable CTAIVA VARCHAR(20);
declare variable CTACONSUMO VARCHAR(20);
declare variable VRBASE NUMERIC(18,2);
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 PROV CHAR(1);
declare variable ANULADO CHAR(1);
declare variable CENT CHAR(1);
BEGIN
ERROR = 0;
/* BUSQUE LA INTERFACE */
EXISTE = 'N';
SELECT 'S', PREF_PRE, TICO_COD, PRCO_PREF, ININ_BASE, ININ_IVAV, ININ_CONSUMO, ININ_TOTAL, ININ_CTABASE, ININ_CTAIVA, ININ_CTACONSUMO, ININ_CTACIERRE, ININ_CONFIRMAR, ININ_CENTRO, ININ_CODPROY, ININ_CODCENT
    FROM INTERFAZ_INVENTARIO
    WHERE ININ_ID = :IDINTER
    INTO :EXISTE, :PREFIJO, :TIPOCOMP, :PREFCONT, :BASE, :IVAV, :CONSUMO, :TOTAL, :CTABASE, :CTAIVA, :CTACONSUMO, :CTACIERRE, :VER, :CENT, :proy, :centro;
if (EXISTE = 'S') then
    BEGIN
    /* TRAIGA EL ENCABEZADO DE LA SALIDA */
    SELECT PREF_PRE, SALI_NUMERO, SALI_FECHA, SALI_CONC, TERC_NIT, SALI_IMPTOS, SALI_ANULADO
        FROM SALIDAS
        WHERE SALI_ID = :IDDOC
        INTO :PREFIJO, :NUMERO, :FECAUX, :CONCEPTO, :NIT, :IMPINC, :ANULADO;
    if ((NIT IS NULL) or (NIT = '')) then
        EXECUTE PROCEDURE LEE_CONFIGURACION('CONTABILIDAD', 'GENERAL', 'NIT COMPAÑIA') RETURNING_VALUES (:NIT);
    /* BORRE CUALQUEIR CONTABILIZACION PREVIA */
    DELETE FROM CONTABILIZACION WHERE CNTB_TIPOREF = 12 AND CNTB_IDREF = :IDDOC;

    if (ANULADO = 'N') then
        BEGIN
        if (CENT = 'B') then
            SELECT BODE_CENTRO, BODE_PROY FROM BODEGA B, SALIDAS E
                WHERE B.BODE_COD = E.BODE_COD AND E.SALI_ID = :IDDOC INTO :CENTRO, :PROY;
        ELSE
          if (CENT = 'P') then
            SELECT PREF_CENTRO, PREF_PROY FROM PREFIJOS P, SALIDAS E
                WHERE P.PREF_PRE = E.PREF_PRE AND E.SALI_ID = :IDDOC AND P.TIDO_COD = 12 INTO :CENTRO, :PROY;
        /* CONVIERTA LA FECHA A CADENA */
        EXECUTE PROCEDURE FECHA_A_CONTA(:FECAUX) returning_values (:FECHA);
        IDC = GEN_ID(ID_CONTABILIZA, 1);
        /* REGISTRE EL ENCABEZADO CONTABLE */
        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, :NUMERO, :FECHA, :CONCEPTO, '', 12, :IDDOC, :PREFIJO, :NUMERO, 'N');
        NUMITEMS = 0;
        SUMA = 0;
        /* CALCULE COSTOS EN VENTAS */
        EXECUTE PROCEDURE COSTO_EN_VENTAS(12, :IDDOC);
        /* PRIMERO LA BASE */
        if (BASE = 'A') then
            BEGIN
            /* SUME LAS BASES DE LOS ARTICULOS DEL DOCUMENTO */
            FOR SELECT MAX(CTAINV), SUM(CAST(CANT AS DOUBLE PRECISION) * COSTO)
                FROM SALIDAS_DETALLE E, COSTO_VENTAS CV
                WHERE E.SALI_ID = :IDDOC AND E.sade_item = CV.cove_item and TIDO_COD = 12 AND COVE_ID = E.sali_id
                GROUP BY CTAINV
                INTO :CTABASE, :monto
            DO
                BEGIN
                VRBASE = MONTO;
                if (MONTO <> 0) then
                    BEGIN
                    /* TRAIGA LAS CARACTERISTICAS DE LA CUENTA */
                    SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                        WHERE CUEN_COD = :CTABASE INTO :CUENTA, :TIPOCUEN;
                    if (CUENTA IS NULL) then
                        begin
                        EXECUTE PROCEDURE ERRORINT(12, :IDDOC, :CTABASE, 2);
                        CUENTA = CTABASE;
                        TIPOCUEN = 'N';
                        ERROR = ERROR + 1;
                        end
                    /* DEPENDE DEL TIPO DE CUENTA */
                    if ((TIPOCUEN = 'I') or (TIPOCUEN = 'A')) then
                        BEGIN
                        /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                        FOR SELECT E.ARTI_COD, (SADE_CANT * SADE_COSTO), (SADE_IVAMONTO + (SADE_CONSUMO*SADE_CANT*SADE_FACTOR))
                            FROM ARTICULO A, CONTABIL_ARTICULO C, SALIDAS_DETALLE E
                            WHERE E.SALI_ID = :IDDOC AND E.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND COAR_CTAINV = :CUENTA
                            INTO :ARTICULO, :MONTO, :IMPTOS
                        DO
                            BEGIN
                            if (IMPINC = 'S') then
                                MONTO = MONTO - IMPTOS;
                            if (MONTO <> 0) then
                                BEGIN
                                INSERT INTO CONTABILIZACION_DET (CNTB_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)
                                    VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ARTICULO, 0, 0);
                                NUMITEMS = NUMITEMS + 1;
                                SUMA = SUMA - MONTO;
                                END
                            END
                        END
                    if (TIPOCUEN = 'C') then
                        BEGIN
                        EXECUTE PROCEDURE ERRORINT(12, :IDDOC, :CUENTA, 4);
                        TIPOCUEN = 'N';
                        ERROR = ERROR + 1;
                        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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                        NUMITEMS = NUMITEMS + 1;
                        SUMA = SUMA - MONTO;
                        END
                    END
                END /* FOR */
            END /* BASE POR ARTICULO */
        if (BASE = 'I') then
            BEGIN
            /* SUME LAS BASES DE LOS ARTICULOS DEL DOCUMENTO */
            FOR SELECT MAX(TAIV_CTAINV), SUM(SADE_CANT * SADE_COSTO), SUM(SADE_IVAMONTO + (SADE_CONSUMO*SADE_CANT*SADE_FACTOR))
                FROM ARTICULO A, TARIFA_IVA I, SALIDAS_DETALLE E
                WHERE E.SALI_ID = :IDDOC AND E.ARTI_COD = A.ARTI_COD AND A.TAIV_COD = I.TAIV_COD
                GROUP BY TAIV_CTAINV
                INTO :CTABASE, :MONTO, :IMPTOS
            DO
                BEGIN
                if (IMPINC = 'S') then
                    MONTO = MONTO - IMPTOS;
                VRBASE = MONTO;
                if (MONTO <> 0) then
                    BEGIN
                    /* TRAIGA LAS CARACTERISTICAS DE LA CUENTA */
                    SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                        WHERE CUEN_COD = :CTABASE INTO :CUENTA, :TIPOCUEN;
                    if (CUENTA IS NULL) then
                        begin
                        EXECUTE PROCEDURE ERRORINT(12, :IDDOC, :CTABASE, 2);
                        CUENTA = CTABASE;
                        TIPOCUEN = 'N';
                        ERROR = ERROR + 1;
                        end
                    /* DEPENDE DEL TIPO DE CUENTA */
                    if ((TIPOCUEN = 'I') or (TIPOCUEN = 'A')) then
                        BEGIN
                        /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                        FOR SELECT E.ARTI_COD, (SADE_CANT * SADE_COSTO), (SADE_IVAMONTO + (SADE_CONSUMO*SADE_CANT*SADE_FACTOR))
                            FROM ARTICULO A, TARIFA_IVA I, SALIDAS_DETALLE E
                            WHERE E.SALI_ID = :IDDOC AND E.ARTI_COD = A.ARTI_COD AND A.TAIV_COD = I.TAIV_COD AND TAIV_CTAINV = :CUENTA
                            INTO :ARTICULO, :MONTO, :IMPTOS
                        DO
                            BEGIN
                            if (IMPINC = 'S') then
                                MONTO = MONTO - IMPTOS;
                            if (MONTO <> 0) then
                                BEGIN
                                INSERT INTO CONTABILIZACION_DET (CNTB_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)
                                    VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ARTICULO, 0, 0);
                                NUMITEMS = NUMITEMS + 1;
                                SUMA = SUMA - MONTO;
                                END
                            END
                        END
                    if (TIPOCUEN = 'C') then
                        BEGIN
                        EXECUTE PROCEDURE ERRORINT(12, :IDDOC, :CUENTA, 4);
                        TIPOCUEN = 'N';
                        ERROR = ERROR + 1;
                        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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                        NUMITEMS = NUMITEMS + 1;
                        SUMA = SUMA - MONTO;
                        END
                    END
                END /* FOR */
            END /* BASE POR IVA */
        if ((BASE = 'K') or (BASE = 'T')) then
            BEGIN
            if (BASE = 'T') then
                BEGIN
                SELECT TERC_PROV, TERC_CTAVENTA FROM TERCEROS WHERE TERC_NIT = :NIT INTO :PROV, :CTABASE;
                if (:PROV = 'S') then
                    SELECT PROV_CTACAUSA FROM PROVEEDORES WHERE TERC_NIT = :NIT INTO :CTABASE;
                END
            /* SUME LAS BASES DE LOS ARTICULOS DEL DOCUMENTO */
            FOR SELECT SUM(CAST(CANT AS DOUBLE PRECISION) * COSTO)
                FROM SALIDAS_DETALLE d, costo_ventas cv
                WHERE SALI_ID = :IDDOC and cv.tido_cod = 12 and cv.cove_id = d.sali_id and cv.cove_item = d.sade_item
                INTO :MONTO
            DO
                BEGIN
                VRBASE = MONTO;
                if (MONTO <> 0) then
                    BEGIN
                    /* TRAIGA LAS CARACTERISTICAS DE LA CUENTA */
                    SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                        WHERE CUEN_COD = :CTABASE INTO :CUENTA, :TIPOCUEN;
                    if (CUENTA IS NULL) then
                        begin
                        EXECUTE PROCEDURE ERRORINT(12, :IDDOC, :CTABASE, 2);
                        CUENTA = CTABASE;
                        TIPOCUEN = 'N';
                        ERROR = ERROR + 1;
                        end
                    /* DEPENDE DEL TIPO DE CUENTA */
                    if (TIPOCUEN = 'I') then
                        BEGIN
                        /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                        FOR SELECT E.ARTI_COD, (SADE_CANT * SADE_COSTO), (SADE_IVAMONTO + (SADE_CONSUMO*SADE_CANT*SADE_FACTOR))
                            FROM ARTICULO A, CONTABIL_ARTICULO C, SALIDAS_DETALLE E
                            WHERE E.SALI_ID = :IDDOC AND E.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND COAR_CTAINV = :CUENTA
                            INTO :ARTICULO, :MONTO, :IMPTOS
                        DO
                            BEGIN
                            if (IMPINC = 'S') then
                                MONTO = MONTO - IMPTOS;
                            if (MONTO <> 0) then
                                BEGIN
                                INSERT INTO CONTABILIZACION_DET (CNTB_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)
                                    VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ARTICULO, 0, 0);
                                NUMITEMS = NUMITEMS + 1;
                                SUMA = SUMA - MONTO;
                                END
                            END
                        END
                    if (TIPOCUEN = 'C') then
                        BEGIN
                        EXECUTE PROCEDURE ERRORINT(12, :IDDOC, :CUENTA, 4);
                        TIPOCUEN = 'N';
                        ERROR = ERROR + 1;
                        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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                        NUMITEMS = NUMITEMS + 1;
                        SUMA = SUMA - MONTO;
                        END
                    END
                END /* FOR */
            END /* BASE K O POR TERCERO */
        /* EL IVA EN VENTAS */
        if (IVAV = 'A') then
            BEGIN
            /* SUME LAS BASES DE LOS ARTICULOS DEL DOCUMENTO */
            FOR SELECT MAX(COAR_CTAIVAV), SUM(SADE_IVAMONTO), SUM(SADE_CANT * SADE_COSTO)
                FROM ARTICULO A, CONTABIL_ARTICULO C, SALIDAS_DETALLE E
                WHERE E.SALI_ID = :IDDOC AND E.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD
                GROUP BY COAR_CTAIVAV
                INTO :CTAIVA, :IMPTOS, :MONTO
            DO
                BEGIN
                if (IMPTOS <> 0) then
                    BEGIN
                    /* TRAIGA LAS CARCATERISTICAS DE LA CUENTA */
                    SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                        WHERE CUEN_COD = :CTAIVA INTO :CUENTA, :TIPOCUEN;
                    if (CUENTA IS NULL) then
                        begin
                        EXECUTE PROCEDURE ERRORINT(12, :IDDOC, :CTAIVA, 2);
                        CUENTA = CTAIVA;
                        TIPOCUEN = 'N';
                        ERROR = ERROR + 1;
                        end
                    if (TIPOCUEN = 'I') then
                        BEGIN
                        /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                        FOR SELECT E.ARTI_COD, SADE_IVAMONTO, (SADE_CANT * SADE_COSTO)
                            FROM ARTICULO A, CONTABIL_ARTICULO C, SALIDAS_DETALLE E
                            WHERE E.SALI_ID = :IDDOC AND E.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND COAR_CTAIVAV = :CUENTA
                            INTO :ARTICULO, :IMPTOS, :MONTO
                        DO
                            BEGIN
                            if (IMPINC = 'S') then
                                MONTO = MONTO - IMPTOS;
                            MONTO = MONTO * -1;
                            if (IMPTOS <> 0) then
                                BEGIN
                                INSERT INTO CONTABILIZACION_DET (CNTB_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)
                                    VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :IMPTOS, :MONTO, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ARTICULO, 0, 0);
                                NUMITEMS = NUMITEMS + 1;
                                SUMA = SUMA - IMPTOS;
                                END
                            END
                        END
                    if (TIPOCUEN = 'C') then
                        BEGIN
                        EXECUTE PROCEDURE ERRORINT(12, :IDDOC, :CUENTA, 4);
                        TIPOCUEN = 'N';
                        ERROR = ERROR + 1;
                        END
                    if (TIPOCUEN = 'N') then
                        BEGIN
                        /* INSERTE EL REGISTRO DEL IVA EN VENTAS */
                        if (IMPINC = 'S') then
                            MONTO = MONTO - IMPTOS;
                        MONTO = MONTO * -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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :IMPTOS, :MONTO, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                        NUMITEMS = NUMITEMS + 1;
                        SUMA = SUMA - IMPTOS;
                        END
                    END
                END /* FOR */
            END /* IVA POR ARTICULO */
        if (IVAV = 'I') then
            BEGIN
            /* SUME LAS BASES DE LOS ARTICULOS DEL DOCUMENTO */
            FOR SELECT MAX(TAIV_CTAIVAVNT), SUM(SADE_IVAMONTO), SUM(SADE_CANT * SADE_COSTO)
                FROM ARTICULO A, TARIFA_IVA I, SALIDAS_DETALLE E
                WHERE E.SALI_ID = :IDDOC AND E.ARTI_COD = A.ARTI_COD AND A.TAIV_COD = I.TAIV_COD
                GROUP BY TAIV_CTAIVAVNT
                INTO :CTAIVA, :IMPTOS, :MONTO
            DO
                BEGIN
                if (IMPTOS <> 0) then
                    BEGIN
                    /* TRAIGA LAS CARCATERISTICAS DE LA CUENTA */
                    SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                        WHERE CUEN_COD = :CTAIVA INTO :CUENTA, :TIPOCUEN;
                    if (CUENTA IS NULL) then
                        begin
                        EXECUTE PROCEDURE ERRORINT(12, :IDDOC, :CTAIVA, 2);
                        CUENTA = CTAIVA;
                        TIPOCUEN = 'N';
                        ERROR = ERROR + 1;
                        end
                    if (TIPOCUEN = 'I') then
                        BEGIN
                        /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                        FOR SELECT E.ARTI_COD, SADE_IVAMONTO, (SADE_CANT * SADE_COSTO)
                            FROM ARTICULO A, TARIFA_IVA I, SALIDAS_DETALLE E
                            WHERE E.SALI_ID = :IDDOC AND E.ARTI_COD = A.ARTI_COD AND A.TAIV_COD = I.TAIV_COD AND TAIV_CTAIVAVNT = :CUENTA
                            INTO :ARTICULO, :IMPTOS, :MONTO
                        DO
                            BEGIN
                            if (IMPINC = 'S') then
                                MONTO = MONTO - IMPTOS;
                            MONTO = MONTO * -1;
                            if (IMPTOS <> 0) then
                                BEGIN
                                INSERT INTO CONTABILIZACION_DET (CNTB_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)
                                    VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :IMPTOS, :MONTO, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ARTICULO, 0, 0);
                                NUMITEMS = NUMITEMS + 1;
                                SUMA = SUMA - IMPTOS;
                                END
                            END
                        END
                    if (TIPOCUEN = 'C') then
                        BEGIN
                        EXECUTE PROCEDURE ERRORINT(12, :IDDOC, :CUENTA, 4);
                        TIPOCUEN = 'N';
                        ERROR = ERROR + 1;
                        END
                    if (TIPOCUEN = 'N') then
                        BEGIN
                        /* INSERTE EL REGISTRO DEL IVA EN VENTAS */
                        if (IMPINC = 'S') then
                            MONTO = MONTO - IMPTOS;
                        MONTO = MONTO * -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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :IMPTOS, :MONTO, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                        NUMITEMS = NUMITEMS + 1;
                        SUMA = SUMA - IMPTOS;
                        END
                    END
                END /* FOR */
            END /* IVA POR TARIFA */
        if (IVAV = 'K') then
            BEGIN
            /* SUME LAS BASES DE LOS ARTICULOS DEL DOCUMENTO */
            SELECT SUM(SADE_IVAMONTO), SUM(SADE_CANT * SADE_COSTO)
                FROM SALIDAS_DETALLE
                WHERE SALI_ID = :IDDOC
                INTO :IMPTOS, :MONTO;
            if (IMPTOS <> 0) then
                BEGIN
                /* TRAIGA LAS CARCATERISTICAS DE LA CUENTA */
                SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                    WHERE CUEN_COD = :CTAIVA INTO :CUENTA, :TIPOCUEN;
                if (CUENTA IS NULL) then
                    begin
                    EXECUTE PROCEDURE ERRORINT(12, :IDDOC, :CTAIVA, 2);
                    CUENTA = CTAIVA;
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    end
                if (TIPOCUEN = 'I') then
                    BEGIN
                    /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                    FOR SELECT E.ARTI_COD, SADE_IVAMONTO, (SADE_CANT * SADE_COSTO)
                        FROM ARTICULO A, CONTABIL_ARTICULO C, SALIDAS_DETALLE E
                        WHERE E.SALI_ID = :IDDOC AND E.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND COAR_CTAIVAV = :CUENTA
                        INTO :ARTICULO, :IMPTOS, :MONTO
                        DO
                        BEGIN
                        if (IMPTOS <> 0) then
                            BEGIN
                            if (IMPINC = 'S') then
                                MONTO = MONTO - IMPTOS;
                            MONTO = MONTO * -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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                                VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :IMPTOS, :MONTO, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ARTICULO, 0, 0);
                            NUMITEMS = NUMITEMS + 1;
                            SUMA = SUMA - IMPTOS;
                            END
                        END
                    END
                if (TIPOCUEN = 'C') then
                        BEGIN
                        EXECUTE PROCEDURE ERRORINT(12, :IDDOC, :CUENTA, 4);
                        TIPOCUEN = 'N';
                        ERROR = ERROR + 1;
                        END
                if (TIPOCUEN = 'N') then
                    BEGIN
                    /* INSERTE EL REGISTRO DEL IVA EN VENTAS */
                    if (IMPINC = 'S') then
                        MONTO = MONTO - IMPTOS;
                    MONTO = MONTO * -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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :IMPTOS, :MONTO, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NUMITEMS = NUMITEMS + 1;
                    SUMA = SUMA - IMPTOS;
                    END
                END
            END /* IVA CONSTANTE */
        /* EL IMPOCONSUMO */
        if (CONSUMO = 'A') then
            BEGIN
            /* SUME LAS BASES DE LOS ARTICULOS DEL DOCUMENTO */
            FOR SELECT MAX(COAR_CTACONS), SUM(SADE_CONSUMO*SADE_CANT*SADE_FACTOR)
                FROM ARTICULO A, CONTABIL_ARTICULO C, SALIDAS_DETALLE E
                WHERE E.SALI_ID = :IDDOC AND E.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 */
                    SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                        WHERE CUEN_COD = :CTACONSUMO INTO :CUENTA, :TIPOCUEN;
                    if (CUENTA IS NULL) then
                        begin
                        EXECUTE PROCEDURE ERRORINT(12, :IDDOC, :CTACONSUMO, 2);
                        CUENTA = CTACONSUMO;
                        TIPOCUEN = 'N';
                        ERROR = ERROR + 1;
                        end
                    if (TIPOCUEN = 'I') then
                        BEGIN
                        /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                        FOR SELECT E.ARTI_COD, SADE_CONSUMO*SADE_CANT*SADE_FACTOR
                            FROM ARTICULO A, CONTABIL_ARTICULO C, SALIDAS_DETALLE E
                            WHERE E.SALI_ID = :IDDOC AND E.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND COAR_CTACONS = :CUENTA
                            INTO :ARTICULO, :IMPTOS
                            DO
                            if (IMPTOS <> 0) then
                                BEGIN
                                INSERT INTO CONTABILIZACION_DET (CNTB_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)
                                    VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ARTICULO, 0, 0);
                                NUMITEMS = NUMITEMS + 1;
                                SUMA = SUMA - IMPTOS;
                                END
                        END
                    if (TIPOCUEN = 'C') then
                        BEGIN
                        EXECUTE PROCEDURE ERRORINT(12, :IDDOC, :CUENTA, 4);
                        TIPOCUEN = 'N';
                        ERROR = ERROR + 1;
                        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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                        NUMITEMS = NUMITEMS + 1;
                        SUMA = SUMA - IMPTOS;
                        END
                    END
                END /* FOR */
            END /* CONSUMO POR ARTICULO */
        if (CONSUMO = 'K') then
            BEGIN
            /* SUME LAS BASES DE LOS ARTICULOS DEL DOCUMENTO */
            SELECT SUM(SADE_CONSUMO*SADE_CANT*SADE_FACTOR)
                FROM SALIDAS_DETALLE
                WHERE SALI_ID = :IDDOC
                INTO :IMPTOS;
            if (IMPTOS <> 0) then
                BEGIN
                /* TRAIGA LAS CARACTERISTICAS DE LA CUENTA */
                SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                    WHERE CUEN_COD = :ctaconsumo INTO :CUENTA, :TIPOCUEN;
                if (CUENTA IS NULL) then
                    begin
                    EXECUTE PROCEDURE ERRORINT(12, :IDDOC, :CTACONSUMO, 2);
                    CUENTA = CTACONSUMO;
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    end
                if (TIPOCUEN = 'I') then
                    BEGIN
                    /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                    FOR SELECT E.ARTI_COD, SADE_CONSUMO*SADE_CANT*SADE_FACTOR
                    FROM ARTICULO A, CONTABIL_ARTICULO C, SALIDAS_DETALLE E
                        WHERE E.SALI_ID = :IDDOC AND E.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND COAR_CTACONS = :CUENTA
                        INTO :ARTICULO, :IMPTOS
                        DO
                        if (IMPTOS <> 0) then
                            BEGIN
                            INSERT INTO CONTABILIZACION_DET (CNTB_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)
                                VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, :ARTICULO, 0, 0);
                            NUMITEMS = NUMITEMS + 1;
                            SUMA = SUMA - IMPTOS;
                            END
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    EXECUTE PROCEDURE ERRORINT(12, :IDDOC, :CUENTA, 4);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NUMITEMS = NUMITEMS + 1;
                    SUMA = SUMA - IMPTOS;
                    END
                END
            END /* CONSUMO CONSTANTE */
        /* recorra las cuentas adicionales */
        FOR SELECT INIC_CUENTA, INIC_BASE, INIC_PORC, INIC_VALOR, INIC_DB
            FROM INTERFAZ_INVENTARIO_CTAS
            WHERE ININ_ID = :IDINTER
            INTO :CUENTAADIC, :BASEADIC, :PORCADIC, :VALORADIC, :DBADIC
            DO
            BEGIN
            if (VALORADIC <> 0) then
                MONTO = VALORADIC;
            ELSE
                BEGIN
                if (:BASEADIC = 'SUBTOTAL') then
                    SELECT SUM(SADE_CANT * SADE_COSTO)
                    FROM SALIDAS_DETALLE E
                    WHERE E.SALI_ID = :IDDOC 
                    INTO :VALORADIC;
                if (:BASEADIC = 'IVA') then
                    SELECT SUM(SADE_IVAMONTO)
                    FROM SALIDAS_DETALLE E
                    WHERE E.SALI_ID = :IDDOC 
                    INTO :VALORADIC;
                if (:BASEADIC = 'CONSUMO') then
                    SELECT SUM(SADE_CONSUMO*SADE_CANT*SADE_FACTOR)
                    FROM SALIDAS_DETALLE E
                    WHERE E.SALI_ID = :IDDOC 
                    INTO :VALORADIC;
                MONTO = VALORADIC * PORCADIC / 100;
                END
            if (MONTO <> 0) then
                BEGIN
                /* 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(12, :IDDOC, :CUENTAADIC, 2);
                    CUENTA = CUENTAADIC;
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    end
                if (TIPOCUEN = 'I') then
                    BEGIN
                    EXECUTE PROCEDURE ERRORINT(12, :IDDOC, :CUENTA, 3);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    EXECUTE PROCEDURE ERRORINT(12, :IDDOC, :CUENTA, 4);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NUMITEMS, :CUENTAADIC, :CONCEPTO, '', :MONTO, 0, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                        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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NUMITEMS, :CUENTAADIC, :CONCEPTO, '', 0, :MONTO, :VALORADIC, :PORCADIC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                        SUMA = SUMA - MONTO;
                        END
                    NUMITEMS = NUMITEMS + 1;
                    END
                END
            END
        /* CIERRE EL COMPROBANTE  */
        if (SUMA <> 0) then
            BEGIN
            if (SUMA > 0) then
                BEGIN
                DEBITO = 0;
                CREDITO = SUMA;
                END
            ELSE    
                BEGIN
                DEBITO = SUMA * -1;
                CREDITO = 0;
                END
            if ((TOTAL = 'K') or (TOTAL = 'T')) then
                BEGIN
                if (TOTAL = 'T') then
                    BEGIN
                    SELECT TERC_CTAPROV, TERC_PROV
                        FROM TERCEROS WHERE TERC_NIT = :NIT
                        INTO :CTACIERRE, :PROV;
                    if (PROV = 'S') then
                        SELECT PROV_CTAPAGAR FROM PROVEEDORES WHERE TERC_NIT = :nit
                        INTO :CTACIERRE;
                    END
                /* TRAIGA LAS CARACTERISTICAS DE LA CUENTA */
                SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                    WHERE CUEN_COD = :CTACIERRE INTO :CUENTA, :TIPOCUEN;
                if (CUENTA IS NULL) then
                    begin
                    EXECUTE PROCEDURE ERRORINT(12, :IDDOC, :CTACIERRE, 2);
                    CUENTA = CTACIERRE;
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    end
                if (TIPOCUEN = 'I') then
                    BEGIN
                    EXECUTE PROCEDURE ERRORINT(12, :IDDOC, :CUENTA, 3);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    EXECUTE PROCEDURE ERRORINT(12, :IDDOC, :CUENTA, 4);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    END
                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_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :DEBITO, :CREDITO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                END
            END /* SUMA */
        if (ERROR > 0) then
            VER = 'S';
        SUSPEND;
        END /* NO ANULADO */
    END /* EXISTE LA INTERFAZ */
ELSE
    BEGIN
    EXECUTE PROCEDURE ERRORINT(12, :IDDOC, :PREFIJO, 1);
    ERROR = ERROR + 1;
    VER = 'S';
    SUSPEND;
    END
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE SALIDAS_SIN_CONTABILIDAD(
    FECINI DATE,
    FECFIN DATE)
RETURNS (
    ID INTEGER,
    PREF VARCHAR(4),
    NUMERO VARCHAR(8),
    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 SALI_ID, PREF_PRE, SALI_NUMERO FROM SALIDAS WHERE SALI_ANULADO = 'N' AND
    SALI_FECHA >= :FECINI AND SALI_FECHA <= :FECFIN
    INTO :ID, :PREF, :NUMERO
DO
  BEGIN
  idref = null;
  SELECT ENCO_IDREF FROM COMPROBANTE_ENCABEZADO WHERE ENCO_TIPOREF = 12 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(ININ_ID) FROM INTERFAZ_INVENTARIO WHERE PREF_PRE = :PREF AND TIDO_COD = 12 INTO :IDI;
  EXECUTE PROCEDURE CONTABIL_SALIDA (: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 REP_COMPROBANTES_INV(
    TIPO INTEGER,
    DETALLE CHAR(1),
    FECINI DATE,
    FECFIN DATE,
    PREFIJO VARCHAR(4),
    ANULADOS CHAR(1),
    SUBEMPRESA INTEGER)
RETURNS (
    NOMTIPO VARCHAR(30),
    ID INTEGER,
    PREF VARCHAR(4),
    NUMERO VARCHAR(8),
    FECHA DATE,
    VENCE DATE,
    CONCEPTO VARCHAR(60),
    REFER VARCHAR(60),
    CODBODORI VARCHAR(2),
    NOMBODORI VARCHAR(30),
    CODBODDES VARCHAR(2),
    NOMBODDES VARCHAR(30),
    NOMTERCERO VARCHAR(60),
    PRODCODBAR VARCHAR(15),
    PRODDES VARCHAR(60),
    PRODCANT NUMERIC(18,4),
    PRODUNIDAD VARCHAR(8),
    PRODLOTE VARCHAR(15),
    TURNO VARCHAR(60),
    OPERARIO VARCHAR(60),
    MAQUINA VARCHAR(60),
    OBS BLOB SUB_TYPE 0 SEGMENT SIZE 80,
    ITEM INTEGER,
    ARTICULO VARCHAR(15),
    CODBAR VARCHAR(15),
    ARTIDES VARCHAR(60),
    CANT NUMERIC(18,4),
    EXANT NUMERIC(18,4),
    UNIDAD VARCHAR(8),
    BODITEM VARCHAR(2),
    COSTO NUMERIC(18,2),
    DTOPORC NUMERIC(9,2),
    DTOMONTO NUMERIC(18,2),
    IVAPORC NUMERIC(9,2),
    IVAMONTO NUMERIC(18,2),
    CONSUMO NUMERIC(18,2),
    SUBTOTAL NUMERIC(18,2),
    TOTAL NUMERIC(18,2),
    LOTE VARCHAR(15),
    ANULADO CHAR(1),
    OBSITEM BLOB SUB_TYPE 0 SEGMENT SIZE 80)
AS
declare variable IMPTOS CHAR(1);
declare variable ICOINC CHAR(2);
declare variable ST numeric(18,2);
declare variable IVA numeric(18,2);
declare variable TOT numeric(18,2);
declare variable FACTOR numeric(18,2);
declare variable SUMSUBT NUMERIC(18,2);
declare variable SUMIVA NUMERIC(18,2);
declare variable SUMCONS NUMERIC(18,2);
declare variable SUMTOT NUMERIC(18,2);
begin
EXECUTE PROCEDURE LEE_CONFIGURACION('FACTURACION', 'ARTICULOS', 'IMPOCONSUMO INCLUIDO EN EL PRECIO BASE DE VENTA ANTES DE IVA') returning_values (ICOINC);
  /* DETERMINE LA TABLA A EXAMINAR */
  if (bin_and(TIPO, 1) <> 0) then
  begin
    select TIDO_NOMLARGO
    from TIPO_DOCUMENTO
    where TIDO_COD = 11
    into :NOMTIPO;
    for select ENTR_ID, E.PREF_PRE, ENTR_NUMERO, ENTR_FECHA, ENTR_CONC, ENTR_REFER, E.BODE_COD, BODE_NOM, ENTR_NOMTERC,
               ENTR_OBS, ENTR_ANULADO
        from ENTRADAS E, BODEGA B, PREFIJOS P
        where E.BODE_COD = B.BODE_COD and
              ENTR_FECHA >= :FECINI and
              ENTR_FECHA <= :FECFIN and
              P.PREF_PRE = E.PREF_PRE and
              P.TIDO_COD = 11 and
              ((P.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
        order by ENTR_FECHA, ENTR_ID
        into :ID, :PREF, :NUMERO, :FECHA, :CONCEPTO, :REFER, :CODBODORI, :NOMBODORI, :NOMTERCERO, :OBS, :ANULADO
    do
    begin
      if (((:PREFIJO = '') or (:PREF = :PREFIJO)) and
          ((:ANULADOS = 'S') or (:ANULADO = 'N'))) then
      begin
        if (ANULADO = 'S') then
        begin
          ITEM = 0;
          ARTICULO = '';
          CODBAR = '';
          ARTIDES = '';
          CANT = 0;
          UNIDAD = '';
          BODITEM = '';
          LOTE = '';
          COSTO = 0;
          DTOPORC = 0;
          DTOMONTO = 0;
          IVAPORC = 0;
          IVAMONTO = 0;
          CONSUMO = 0;
          TOTAL = 0;
          OBSITEM = null;
          SUBTOTAL = 0;
          suspend;
        end
        else
        begin
          if (DETALLE = 'S') then
            for select ENDE_ITEM, A.ARTI_COD, ENDE_CODBAR, ENDE_DESC, ENDE_CANT, ENDE_UNIDAD, BODE_COD, ENDE_COSTO,
                       ENDE_DTOPORC, ENDE_DTOMONTO, ENDE_IVAPORC, ENDE_IVAMONTO, ENDE_CONSUMO, ENDE_TOTAL, ENDE_LOTE,
                       ENDE_OBS
                from ENTRADAS_DETALLE D, ARTICULO A
                where D.ARTI_COD = A.ARTI_COD and
                      D.ENTR_ID = :ID
                into :ITEM, :ARTICULO, :CODBAR, :ARTIDES, :CANT, :UNIDAD, :BODITEM, :COSTO, :DTOPORC, :DTOMONTO,
                     :IVAPORC, :IVAMONTO, :CONSUMO, :TOTAL, :LOTE, :OBSITEM
            do
            begin
              SUBTOTAL = TOTAL - IVAMONTO - CONSUMO;
              suspend;
            end
          else
          begin
            select sum(ENDE_IVAMONTO), sum(ENDE_CONSUMO), sum(ENDE_TOTAL)
            from ENTRADAS_DETALLE D
            where D.ENTR_ID = :ID
            into :IVAMONTO, :CONSUMO, :TOTAL;
            SUBTOTAL = TOTAL - IVAMONTO - CONSUMO;
            suspend;
          end
        end
      end
    end
  end
  if (bin_and(TIPO, 2) <> 0) then
  begin
    select TIDO_NOMLARGO
    from TIPO_DOCUMENTO
    where TIDO_COD = 12
    into :NOMTIPO;
    for select SALI_ID, S.PREF_PRE, SALI_NUMERO, SALI_FECHA, SALI_CONC, SALI_REFER, S.BODE_COD, BODE_NOM, SALI_NOMTERC,
               SALI_OBS, SALI_ANULADO, SALI_IMPTOS
        from SALIDAS S, BODEGA B, PREFIJOS P
        where S.BODE_COD = B.BODE_COD and
              SALI_FECHA >= :FECINI and
              SALI_FECHA <= :FECFIN and
              P.PREF_PRE = S.PREF_PRE and
              P.TIDO_COD = 12 and
              ((P.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
        order by SALI_FECHA, SALI_ID
        into :ID, :PREF, :NUMERO, :FECHA, :CONCEPTO, :REFER, :CODBODORI, :NOMBODORI, :NOMTERCERO, :OBS, :ANULADO, :imptos
    do
    begin
      if (((:PREFIJO = '') or (:PREF = :PREFIJO)) and
          ((:ANULADOS = 'S') or (:ANULADO = 'N'))) then
      begin
        if (ANULADO = 'S') then
        begin
          ITEM = 0;
          ARTICULO = '';
          CODBAR = '';
          ARTIDES = '';
          CANT = 0;
          UNIDAD = '';
          BODITEM = '';
          LOTE = '';
          COSTO = 0;
          DTOPORC = 0;
          DTOMONTO = 0;
          IVAPORC = 0;
          IVAMONTO = 0;
          CONSUMO = 0;
          EXANT = 0;
          TOTAL = 0;
          OBSITEM = null;
          SUBTOTAL = 0;
          suspend;
        end
        else
        begin
          SUMSUBT = 0;
          SUMIVA = 0;
          SUMCONS = 0;
          SUMTOT = 0;
          for select SADE_ITEM, A.ARTI_COD, SADE_CODBAR, SADE_DESC, SADE_CANT, SADE_UNIDAD, BODE_COD, SADE_COSTO,
                     SADE_IVAPORC, SADE_IVAMONTO, SADE_CONSUMO, SADE_TOTAL, SADE_LOTE, SADE_OBS, SADE_FACTOR
              from SALIDAS_DETALLE D, ARTICULO A
              where D.ARTI_COD = A.ARTI_COD and
                    D.SALI_ID = :ID
              into :ITEM, :ARTICULO, :CODBAR, :ARTIDES, :CANT, :UNIDAD, :BODITEM, :COSTO, :IVAPORC, :IVAMONTO, :CONSUMO,
                   :TOTAL, :LOTE, :OBSITEM, :FACTOR
          do
          begin
            execute procedure COSTO_PROMEDIO_UNIDAD(:ARTICULO, :FECHA, :UNIDAD)
                returning_values (:COSTO);
            SUBTOTAL = CANT * COSTO;
            if (IMPTOS = 'S') then
            begin
              COSTO = COSTO * (1 + IVAPORC / 100);
              if (ICOINC = 'SI') then
              begin
                COSTO = COSTO + (CONSUMO * FACTOR);
                SUBTOTAL = CANT * COSTO;
                TOTAL = SUBTOTAL;
                IVAMONTO = (SUBTOTAL - (CONSUMO * CANT * FACTOR)) / (100 + IVAPORC) * IVAPORC;
              end
              else
              begin
                IVAMONTO = SUBTOTAL / (100 + IVAPORC) * IVAPORC;
                TOTAL = SUBTOTAL + CONSUMO * CANT;
              end
            end
            else
            begin
              IVAMONTO = (SUBTOTAL - (CONSUMO * CANT * FACTOR)) * IVAPORC / 100;
              TOTAL = SUBTOTAL + IVAMONTO;
            end
            if (DETALLE = 'S') then
              suspend;
            else
            begin
              SUMSUBT = SUMSUBT + SUBTOTAL;
              SUMIVA = SUMIVA + IVAMONTO;
              SUMCONS = SUMCONS + CONSUMO;
              SUMTOT = SUMTOT + TOTAL;
            end
          end
          if (DETALLE = 'N') then
            suspend;
        end
      end
    end
  end
  if (bin_and(TIPO, 4) <> 0) then
  begin
    select TIDO_NOMLARGO
    from TIPO_DOCUMENTO
    where TIDO_COD = 13
    into :NOMTIPO;
    for select TRAN_ID, T.PREF_PRE, TRAN_NUMERO, TRAN_FECHA, TRAN_CONC, TRAN_REFER, T.BODE_COD, BO.BODE_NOM,
               TRAN_BODDES, BD.BODE_NOM, TRAN_OBS, TRAN_ANULADO, TRAN_IMPTOS
        from TRASFERENCIAS T, BODEGA BO, BODEGA BD, PREFIJOS P
        where T.BODE_COD = BO.BODE_COD and
              T.TRAN_BODDES = BD.BODE_COD and
              TRAN_FECHA >= :FECINI and
              TRAN_FECHA <= :FECFIN and
              P.PREF_PRE = T.PREF_PRE and
              P.TIDO_COD = 13 and
              ((P.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
        order by TRAN_FECHA, TRAN_ID
        into :ID, :PREF, :NUMERO, :FECHA, :CONCEPTO, :REFER, :CODBODORI, :NOMBODORI, :CODBODDES, :NOMBODDES, :OBS,
             :ANULADO, :imptos
    do
    begin
      if (((:PREFIJO = '') or (:PREF = :PREFIJO)) and
          ((:ANULADOS = 'S') or (:ANULADO = 'N'))) then
      begin
        if (ANULADO = 'S') then
        begin
          ITEM = 0;
          ARTICULO = '';
          CODBAR = '';
          ARTIDES = '';
          CANT = 0;
          UNIDAD = '';
          BODITEM = '';
          LOTE = '';
          COSTO = 0;
          DTOPORC = 0;
          DTOMONTO = 0;
          IVAPORC = 0;
          IVAMONTO = 0;
          CONSUMO = 0;
          EXANT = 0;
          TOTAL = 0;
          OBSITEM = null;
          SUBTOTAL = 0;
          suspend;
        end
        else
        begin
          SUMSUBT = 0;
          SUMIVA = 0;
          SUMCONS = 0;
          SUMTOT = 0;
          for select TRAS_ITEM, A.ARTI_COD, TRAS_CODBAR, TRAS_DESC, TRAS_CANT, TRAS_UNIDAD, TRAS_COSTO, TRAS_IVAPORC,
                     TRAS_IVAMONTO, TRAS_CONSUMO, TRAS_TOTAL, TRAS_LOTE, TRAS_OBS
              from TRASFERENCIAS_DETALLE D, ARTICULO A
              where D.ARTI_COD = A.ARTI_COD and
                    D.TRAN_ID = :ID
              order by TRAS_ITEM
              into :ITEM, :ARTICULO, :CODBAR, :ARTIDES, :CANT, :UNIDAD, :COSTO, :IVAPORC, :IVAMONTO, :CONSUMO, :TOTAL,
                   :LOTE, :OBSITEM
          do
          begin
            execute procedure COSTO_PROMEDIO_UNIDAD(:ARTICULO, :FECHA, :UNIDAD)
                returning_values (:COSTO);
            SUBTOTAL = CANT * COSTO;
            if (IMPTOS = 'S') then
            begin
              TOTAL = SUBTOTAL;
              IVAMONTO = (SUBTOTAL - (CONSUMO * CANT * FACTOR)) / (100 + IVAPORC) * IVAPORC;
            end
            else
            begin
              IVAMONTO = (SUBTOTAL - (CONSUMO * CANT * FACTOR)) * IVAPORC / 100;
              TOTAL = SUBTOTAL + IVAMONTO;
            end
            if (DETALLE = 'S') then
              suspend;
            else
            begin
              SUMSUBT = SUMSUBT + SUBTOTAL;
              SUMIVA = SUMIVA + IVAMONTO;
              SUMCONS = SUMCONS + CONSUMO;
              SUMTOT = SUMTOT + TOTAL;
            end
          end
          if (DETALLE = 'N') then
            suspend;
        end
      end
    end
  end
  if (bin_and(TIPO, 8) <> 0) then
  begin
    select TIDO_NOMLARGO
    from TIPO_DOCUMENTO
    where TIDO_COD = 14
    into :NOMTIPO;
    for select AJUS_ID, A.PREF_PRE, AJUS_NUMERO, AJUS_FECHA, AJUS_CONC, A.BODE_COD, BODE_NOM, AJUS_OBS, AJUS_ANULADO
        from AJUSTES A, BODEGA B, PREFIJOS P
        where A.BODE_COD = B.BODE_COD and
              AJUS_FECHA >= :FECINI and
              AJUS_FECHA <= :FECFIN and
              P.PREF_PRE = A.PREF_PRE and
              P.TIDO_COD = 14 and
              ((P.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
        order by AJUS_FECHA, AJUS_ID
        into :ID, :PREF, :NUMERO, :FECHA, :CONCEPTO, :CODBODORI, :NOMBODORI, :OBS, :ANULADO
    do
    begin
      if (((:PREFIJO = '') or (:PREF = :PREFIJO)) and
          ((:ANULADOS = 'S') or (:ANULADO = 'N'))) then
      begin
        if (ANULADO = 'S') then
        begin
          ITEM = 0;
          ARTICULO = '';
          CODBAR = '';
          ARTIDES = '';
          CANT = 0;
          UNIDAD = '';
          BODITEM = '';
          LOTE = '';
          COSTO = 0;
          DTOPORC = 0;
          DTOMONTO = 0;
          IVAPORC = 0;
          IVAMONTO = 0;
          CONSUMO = 0;
          EXANT = 0;
          TOTAL = 0;
          OBSITEM = null;
          SUBTOTAL = 0;
          suspend;
        end
        else
        begin
          if (DETALLE = 'S') then
            for select AJUS_ITEM, A.ARTI_COD, AJUS_CODBAR, AJDE_DESC, AJUS_EXANT, AJUS_UNIDAD, BODE_COD, AJUS_EXNUE,
                       AJUS_LOTE, AJDE_OBS
                from AJUSTES_DETALLE D, ARTICULO A
                where D.ARTI_COD = A.ARTI_COD and
                      D.AJUS_ID = :ID
                into :ITEM, :ARTICULO, :CODBAR, :ARTIDES, :EXANT, :UNIDAD, :BODITEM, :CANT, :LOTE, :OBSITEM
            do
            begin
              execute procedure COSTO_PROMEDIO(:ARTICULO, :FECHA)
                  returning_values (:COSTO);
              TOTAL = (CANT - EXANT) * COSTO;
              SUBTOTAL = TOTAL;
              suspend;
            end
          else
          begin
            TOTAL = 0;
            for select ARTI_COD, AJUS_EXNUE, AJUS_EXANT
                from AJUSTES_DETALLE D
                where D.AJUS_ID = :ID
                into :ARTICULO, :CANT, :EXANT
            do
            begin
              execute procedure COSTO_PROMEDIO(:ARTICULO, :FECHA)
                  returning_values (:COSTO);
              TOTAL = TOTAL + ((CANT - EXANT) * COSTO);
              SUBTOTAL = TOTAL;
            end
            suspend;
          end
        end
      end
    end
  end
  if (bin_and(TIPO, 16) <> 0) then
  begin
    select TIDO_NOMLARGO
    from TIPO_DOCUMENTO
    where TIDO_COD = 15
    into :NOMTIPO;
    for select ENSA_ID, E.PREF_PRE, ENSA_NUMERO, ENSA_FECHA, ENSA_CONC, ENSA_REFER, E.BODE_COD, BODE_NOM, ENSA_CODBAR,
               ENSA_DESC, ENSA_CANT, ENSA_UNIDAD, ENSA_LOTE, ENSA_OBS, ENSA_ANULADO, ENSA_MAQUINA, ENSA_TURNO,
               ENSA_OPER, ENSA_FACTOR
        from ENSAMBLES E, BODEGA B, PREFIJOS P
        where E.BODE_COD = B.BODE_COD and
              E.ENSA_FECHA >= :FECINI and
              E.ENSA_FECHA <= :FECFIN and
              P.PREF_PRE = E.PREF_PRE and
              P.TIDO_COD = 15 and
              ((P.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
        order by ENSA_FECHA, ENSA_ID
        into :ID, :PREF, :NUMERO, :FECHA, :CONCEPTO, :REFER, :CODBODORI, :NOMBODORI, :PRODCODBAR, :PRODDES, :PRODCANT,
             :PRODUNIDAD, :PRODLOTE, :OBS, :ANULADO, :MAQUINA, :TURNO, :OPERARIO, :FACTOR
    do
    begin
      select ENSA_NOMBRE
      from ENSAMBLE_TURNO
      where ENSA_TURNO = :TURNO
      into :TURNO;
      select ENOP_NOMBRE
      from ENSAMBLE_OPERARIO
      where ENOP_ID = :OPERARIO
      into :OPERARIO;
      select ENMA_NOMBRE
      from ENSAMBLE_MAQUINA
      where ENMA_ID = :MAQUINA
      into :MAQUINA;
      if (((:PREFIJO = '') or (:PREF = :PREFIJO)) and
          ((:ANULADOS = 'S') or (:ANULADO = 'N'))) then
      begin
        if (ANULADO = 'S') then
        begin
          ITEM = 0;
          ARTICULO = '';
          CODBAR = '';
          ARTIDES = '';
          CANT = 0;
          UNIDAD = '';
          BODITEM = '';
          LOTE = '';
          COSTO = 0;
          DTOPORC = 0;
          DTOMONTO = 0;
          IVAPORC = 0;
          IVAMONTO = 0;
          CONSUMO = 0;
          EXANT = 0;
          TOTAL = 0;
          OBSITEM = null;
          SUBTOTAL = 0;
          suspend;
        end
        else
        begin
          TOTAL = 0;
          OBSITEM = null;
          SUBTOTAL = 0;
          for select ESDE_ITEM, A.ARTI_COD, ESDE_CODBAR, ESDE_DESC, ESDE_CANT, ESDE_UNIDAD, BODE_COD, ESDE_COSTO,
                     ESDE_IVAPORC, ESDE_IVAMONTO, ESDE_CONSUMO, ESDE_LOTE, ESDE_OBS
              from ENSAMBLES_DETALLE D, ARTICULO A
              where D.ARTI_COD = A.ARTI_COD and
                    D.ENSA_ID = :ID
              into :ITEM, :ARTICULO, :CODBAR, :ARTIDES, :CANT, :UNIDAD, :BODITEM, :COSTO, :IVAPORC, :IVAMONTO, :CONSUMO,
                   :LOTE, :OBSITEM
          do
          begin
            execute procedure COSTO_PROMEDIO(:ARTICULO, :FECHA)
                returning_values (:COSTO);
            if (DETALLE = 'S') then
            begin
              TOTAL = CANT * COSTO;
              SUBTOTAL = TOTAL - IVAMONTO - CONSUMO;
              suspend;
            end
            else
            begin
              TOTAL = TOTAL + (CANT * COSTO);
              SUBTOTAL = SUBTOTAL + (CANT * COSTO) - IVAMONTO - CONSUMO;
            end
          end
          if (DETALLE = 'N') then
            suspend;
        end
      end
    end
  end
  if (bin_and(TIPO, 32) <> 0) then
  begin
    select TIDO_NOMLARGO
    from TIPO_DOCUMENTO
    where TIDO_COD = 16
    into :NOMTIPO;
    for select DESE_ID, E.PREF_PRE, DESE_NUMERO, DESE_FECHA, DESE_CONC, DESE_REFER, E.BODE_COD, BODE_NOM, DESE_CODBAR,
               DESE_DESC, DESE_CANT, DESE_UNIDAD, DESE_LOTE, DESE_OBS, DESE_ANULADO
        from DESENSAMBLES E, BODEGA B, PREFIJOS P
        where E.BODE_COD = B.BODE_COD and
              DESE_FECHA >= :FECINI and
              DESE_FECHA <= :FECFIN and
              P.PREF_PRE = E.PREF_PRE and
              P.TIDO_COD = 16 and
              ((P.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
        order by DESE_FECHA, DESE_ID
        into :ID, PREF, :NUMERO, :FECHA, :CONCEPTO, :REFER, :CODBODORI, :NOMBODORI, :PRODCODBAR, :PRODDES, :PRODCANT,
             :PRODUNIDAD, :PRODLOTE, :OBS, :ANULADO
    do
    begin
      if (((:PREFIJO = '') or (:PREF = :PREFIJO)) and
          ((:ANULADOS = 'S') or (:ANULADO = 'N'))) then
      begin
        if (ANULADO = 'S') then
        begin
          ITEM = 0;
          ARTICULO = '';
          CODBAR = '';
          ARTIDES = '';
          CANT = 0;
          UNIDAD = '';
          BODITEM = '';
          LOTE = '';
          COSTO = 0;
          DTOPORC = 0;
          DTOMONTO = 0;
          IVAPORC = 0;
          IVAMONTO = 0;
          CONSUMO = 0;
          EXANT = 0;
          TOTAL = 0;
          OBSITEM = null;
          SUBTOTAL = 0;
          suspend;
        end
        else
        begin
          if (DETALLE = 'S') then
            for select DESE_ITEM, A.ARTI_COD, DEDE_CODBAR, DEDE_DESC, DEDE_CANT, DEDE_UNIDAD, BODE_COD, DEDE_COSTO,
                       DEDE_IVAPORC, DEDE_IVAMONTO, DEDE_CONSUMO, DEDE_TOTAL, DEDE_LOTE, DEDE_OBS
                from DESENSAMBLES_DETALLE D, ARTICULO A
                where D.ARTI_COD = A.ARTI_COD and
                      D.DESE_ID = :ID
                into :ITEM, :ARTICULO, :CODBAR, :ARTIDES, :CANT, :UNIDAD, :BODITEM, :COSTO, :IVAPORC, :IVAMONTO,
                     :CONSUMO, :TOTAL, :LOTE, :OBSITEM
            do
            begin
              SUBTOTAL = TOTAL - IVAMONTO - CONSUMO;
              suspend;
            end
          else
          begin
            select sum(DEDE_IVAMONTO), sum(DEDE_CONSUMO), sum(DEDE_TOTAL)
            from DESENSAMBLES_DETALLE D
            where D.DESE_ID = :ID
            into :IVAMONTO, :CONSUMO, :TOTAL;
            SUBTOTAL = TOTAL - IVAMONTO - CONSUMO;
            suspend;
          end
        end
      end
    end
  end
  if (bin_and(TIPO, 64) <> 0) then
  begin
    select TIDO_NOMLARGO
    from TIPO_DOCUMENTO
    where TIDO_COD = 17
    into :NOMTIPO;
    for select RESE_ID, R.PREF_PRE, RESE_NUMERO, RESE_FECHA, RESE_CONC, RESE_REFER, R.BODE_COD, BODE_NOM, RESE_NOMTERC,
               RESE_OBS, RESE_ANULADO
        from RESERVAS R, BODEGA B, PREFIJOS P
        where R.BODE_COD = B.BODE_COD and
              R.RESE_FECHA >= :FECINI and
              R.RESE_FECHA <= :FECFIN and
              P.PREF_PRE = R.PREF_PRE and
              P.TIDO_COD = 17 and
              ((P.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
        order by RESE_FECHA, RESE_ID
        into :ID, :PREF, :NUMERO, :FECHA, :CONCEPTO, :REFER, :CODBODORI, :NOMBODORI, :NOMTERCERO, :OBS, :ANULADO
    do
    begin
      if (((:PREFIJO = '') or (:PREF = :PREFIJO)) and
          ((:ANULADOS = 'S') or (:ANULADO = 'N'))) then
      begin
        if (ANULADO = 'S') then
        begin
          ITEM = 0;
          ARTICULO = '';
          CODBAR = '';
          ARTIDES = '';
          CANT = 0;
          UNIDAD = '';
          BODITEM = '';
          LOTE = '';
          COSTO = 0;
          DTOPORC = 0;
          DTOMONTO = 0;
          IVAPORC = 0;
          IVAMONTO = 0;
          CONSUMO = 0;
          EXANT = 0;
          TOTAL = 0;
          OBSITEM = null;
          SUBTOTAL = 0;
          suspend;
        end
        else
        begin
          if (DETALLE = 'S') then
            for select RSDE_ITEM, A.ARTI_COD, RSDE_CODBAR, RSDE_DESC, RDSE_CANT, RSDE_UNIDAD, BODE_COD, RSDE_OBS
                from RESERVAS_DETALLE D, ARTICULO A
                where D.ARTI_COD = A.ARTI_COD and
                      D.RESE_ID = :ID
                into :ITEM, :ARTICULO, :CODBAR, :ARTIDES, :CANT, :UNIDAD, :BODITEM, :OBSITEM
            do
              suspend;
          else
          begin
            select sum(RDSE_CANT)
            from RESERVAS_DETALLE D
            where D.RESE_ID = :ID
            into :CANT;
            suspend;
          end
        end
      end
    end
  end
  if (bin_and(TIPO, 128) <> 0) then
  begin
    select TIDO_NOMLARGO
    from TIPO_DOCUMENTO
    where TIDO_COD = 18
    into :NOMTIPO;
    for select ORIN_ID, O.PREF_PRE, ORIN_NUMERO, ORIN_FECHA, ORIN_FECLLEGA, ORIN_CONC, ORIN_REFER, ORIN_NOMTERC,
               ORIN_OBS, ORIN_ANULADO
        from ORDENES_INVENTARIO O, PREFIJOS P
        where ORIN_FECHA >= :FECINI and
              ORIN_FECHA <= :FECFIN and
              P.PREF_PRE = O.PREF_PRE and
              P.TIDO_COD = 18 and
              ((P.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
        order by ORIN_FECHA, ORIN_ID
        into :ID, PREF, :NUMERO, :FECHA, :VENCE, :CONCEPTO, :REFER, :NOMTERCERO, :OBS, :ANULADO
    do
    begin
      if (((:PREFIJO = '') or (:PREF = :PREFIJO)) and
          ((:ANULADOS = 'S') or (:ANULADO = 'N'))) then
      begin
        if (ANULADO = 'S') then
        begin
          ITEM = 0;
          ARTICULO = '';
          CODBAR = '';
          ARTIDES = '';
          CANT = 0;
          UNIDAD = '';
          BODITEM = '';
          LOTE = '';
          COSTO = 0;
          DTOPORC = 0;
          DTOMONTO = 0;
          IVAPORC = 0;
          IVAMONTO = 0;
          CONSUMO = 0;
          EXANT = 0;
          TOTAL = 0;
          OBSITEM = null;
          SUBTOTAL = 0;
          suspend;
        end
        else
        begin
          if (DETALLE = 'S') then
            for select ORID_ITEM, A.ARTI_COD, ORID_CODBAR, ORID_DESC, ORID_CANT, ORID_UNIDAD, ORIN_COSTO, ORID_DTOPORC,
                       ORID_DTOMONTO, ORID_IVAPORC, ORID_IVAMONTO, ORID_CONSUMO, ORID_TOTAL, ORID_OBS, ORID_LOTE
                from ORDENINVENTARIO_DETALLE D, ARTICULO A
                where D.ARTI_COD = A.ARTI_COD and
                      D.ORIN_ID = :ID
                into :ITEM, :ARTICULO, :CODBAR, :ARTIDES, :CANT, :UNIDAD, :COSTO, :DTOPORC, :DTOMONTO, :IVAPORC,
                     :IVAMONTO, :CONSUMO, :TOTAL, :OBSITEM, :LOTE
            do
            begin
              SUBTOTAL = TOTAL - IVAMONTO - CONSUMO;
              suspend;
            end
          else
          begin
            select sum(ORID_IVAMONTO), sum(ORID_CONSUMO), sum(ORID_TOTAL)
            from ORDENINVENTARIO_DETALLE D
            where D.ORIN_ID = :ID
            into :IVAMONTO, :CONSUMO, :TOTAL;
            SUBTOTAL = TOTAL - IVAMONTO - CONSUMO;
            suspend;
          end
        end
      end
    end
  end
  if (bin_and(TIPO, 256) <> 0) then
  begin
    select TIDO_NOMLARGO
    from TIPO_DOCUMENTO
    where TIDO_COD = 27
    into :NOMTIPO;
    for select P.PLPR_ID, P.PLPR_PREF, P.PLPR_NUMERO, P.PLPR_FECFIN, P.PLPR_CONC, '', P.PLPR_BODORI, BODE_NOM,
               P.PLPR_RESPONSABLE, P.PLPR_OBS, P.PLPR_ANULADO
        from PLAN_PRODUCCION P, BODEGA B, PREFIJOS PR
        where P.PLPR_BODORI = B.BODE_COD and
              P.PLPR_FECFIN >= :FECINI and
              P.PLPR_FECFIN <= :FECFIN and
              PR.PREF_PRE = P.PLPR_PREF and
              PR.TIDO_COD = 27 and
              ((PR.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
        order by P.PLPR_FECFIN, P.PLPR_ID
        into :ID, :PREF, :NUMERO, :FECHA, :CONCEPTO, :REFER, :CODBODORI, :NOMBODORI, :NOMTERCERO, :OBS, :ANULADO
    do
    begin
      if (((:PREFIJO = '') or (:PREF = :PREFIJO)) and
          ((:ANULADOS = 'S') or (:ANULADO = 'N'))) then
      begin
        if (ANULADO = 'S') then
        begin
          ITEM = 0;
          ARTICULO = '';
          CODBAR = '';
          ARTIDES = '';
          CANT = 0;
          UNIDAD = '';
          BODITEM = '';
          LOTE = '';
          COSTO = 0;
          DTOPORC = 0;
          DTOMONTO = 0;
          IVAPORC = 0;
          IVAMONTO = 0;
          CONSUMO = 0;
          EXANT = 0;
          TOTAL = 0;
          OBSITEM = null;
          SUBTOTAL = 0;
          suspend;
        end
        else
        begin
          IVAMONTO = 0;
          TOTAL = 0;
          SUBTOTAL = 0;
          for select D.PLPD_ITEM, A.ARTI_COD, D.PLPD_CODBAR, D.PLPD_DESC, D.PLPD_CANT, D.PLPD_UNIDAD, D.PLPD_OBS,
                     T.TAIV_PORC
              from PLAN_PRODUCCION_DET D, ARTICULO A, TARIFA_IVA T
              where D.ARTI_COD = A.ARTI_COD and
                    D.PLPR_ID = :ID and
                    A.TAIV_COD = T.TAIV_COD
              into :ITEM, :ARTICULO, :CODBAR, :ARTIDES, :CANT, :UNIDAD, :OBSITEM, :IVAPORC
          do
          begin
            execute procedure ULTIMO_COSTO(:ARTICULO, :FECHA, :UNIDAD)
                returning_values (:COSTO);
            ST = COSTO * CANT;
            IVA = ST * IVAPORC;
            TOT = ST + IVA;
            if (DETALLE = 'S') then
            begin
              SUBTOTAL = ST;
              IVAMONTO = IVA;
              TOTAL = TOT;
              suspend;
            end
            else
            begin
              SUBTOTAL = SUBTOTAL + ST;
              IVAMONTO = IVAMONTO + IVA;
              TOTAL = TOTAL + TOT;
            end
          end
          if (DETALLE = 'N') then
            suspend;
        end
      end
    end
  end
end^

SET TERM ; ^


/* 20140513D */

UPDATE MEDIOSMAG_ARCHIVOS
SET MEDM_VALOR1 = 'IVA GENERADO',
    MEDM_VALOR2 = 'IMP NAL CONSUMO',
    MEDM_VALOR3 = '',
    MEDM_VALOR4 = NULL,
    MEDM_VALOR5 = 'IVA RECUPERADO',
    MEDM_VALOR6 = NULL,
    MEDM_VALOR7 = NULL,
    MEDM_VALOR8 = NULL,
    MEDM_VALOR9 = NULL
WHERE (MEDM_FORMATO = 10068);
commit work;

update revision set revi_fecha = '2014/05/13';
commit work;

