/* 20130916B */
/* RTCREE EN CONTADOS SIN RECIBO */
SET TERM ^ ;

CREATE OR ALTER procedure CONTADOS_SIN_RECIBO (
    FECINI date,
    FECFIN date)
returns (
    ID integer,
    PREF varchar(4),
    NUMERO varchar(8),
    FECHA date,
    VEND integer,
    NIT varchar(20),
    NOMBRE varchar(60),
    MONTO numeric(18,2),
    IVAM numeric(18,2),
    RTFTE numeric(18,2),
    RTIVA numeric(18,2),
    RTICA numeric(18,2),
    RCREE numeric(18,2),
    SALDO numeric(18,2),
    CAJA integer,
    SUCURSAL varchar(10))
AS
declare variable desc_rtes char(2);
declare variable AUTORCREE VARCHAR(10);
declare variable FAUTORCREE DATE;
begin
FOR SELECT FACT_ID, F.PREF_PRE, FACT_NUMERO, FACT_FECHA, F.TERC_NIT, VEND_COD, FACT_NOMCLIENTE, FACT_TOTAL, FACT_IVAMONTO, FACT_RTFTEMONTO, FACT_RTIVAMONTO, FACT_RTICAMONTO, FACT_RTCREEM, V.CAJA_ID, FACT_SUCURSAL
    FROM FACTURAS F, PREFIJOS P, AUTORIZACIONES A, punto_venta V
    WHERE F.pref_pre = P.pref_pre AND P.pref_pre = A.pref_pre AND P.tido_cod = 31 AND
    ((A.auto_contado = 'S') or (A.auto_nitcontado = F.terc_nit)) AND
    FACT_FECHA >= :FECINI AND FACT_FECHA <= :fecfin AND F.ptvt_id = V.ptvt_id
    INTO :ID, :PREF, :NUMERO, :FECHA, :NIT, :VEND, :NOMBRE, :MONTO, :IVAM, :RTFTE, :RTIVA, :RTICA, :RCREE, :CAJA, :SUCURSAL
    DO
    BEGIN
    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 (fautorcree <= FECHA) then
        RCREE = 0;
    EXECUTE PROCEDURE SALDO_DOC_CARTERA(31, :ID, '9999/12/31', 0) returning_values (:SALDO);
    if (SALDO <> 0) then
        BEGIN
        EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'DESCONTAR RETENCIONES POR CAUSACION') returning_values (DESC_RTES);
        if (DESC_RTES = 'NO') then
        SALDO = SALDO - RTFTE - RTIVA - RTICA - RCREE;
        suspend;
        END
    END
end^

SET TERM ; ^

/* 20130916c */
/* RTCREE NULL */
SET TERM ^ ;

CREATE OR ALTER TRIGGER NOTAS_DEBITO_PROVEEDOR_BI FOR NOTAS_DEBITO_PROVEEDOR
ACTIVE BEFORE INSERT POSITION 0
AS
declare variable NUMERO VARCHAR(8);
declare variable AUTOM CHAR(1);
declare variable EXISTE CHAR(1);
declare variable PREGTASA CHAR(2);
BEGIN
if (NEW.numok = 'N') then
  BEGIN
  /* Actualice el contador del prefijo */
  SELECT PREF_ACTUAL, PREF_AUTO FROM PREFIJOS WHERE TIDO_COD = NEW.TIDO_COD AND PREF_PRE = NEW.PREF_PRE INTO :NUMERO, :AUTOM;
  /* ACTUALICE EL NUMERO EN COMPROBANTE_ENCABEZADO  */
  if (AUTOM = 'S') then
    BEGIN
    NEW.NDPR_NUMERO = NUMERO;
    NUMERO = CAST((CAST(NUMERO AS INTEGER) + 1) AS CHAR(6));
    UPDATE PREFIJOS
      SET PREF_ACTUAL = :NUMERO
    WHERE TIDO_COD = NEW.TIDO_COD AND PREF_PRE = NEW.PREF_PRE;
    END
  ELSE
    BEGIN
    if (CAST(NUMERO AS INTEGER) = CAST(NEW.NDPR_NUMERO AS INTEGER)) then
        UPDATE PREFIJOS
          SET PREF_ACTUAL = CAST((CAST(PREF_ACTUAL AS INTEGER) + 1) AS CHAR(6))
        WHERE TIDO_COD = NEW.TIDO_COD AND PREF_PRE = NEW.PREF_PRE;
    END
  EXECUTE PROCEDURE COMPLETA_CEROS (NEW.NDPR_numero) returning_values (NEW.NDPR_numero);
  NEW.numok = 'S';
  END
/* Verifique que el numero no existe previamente */
EXISTE = 'N';
SELECT 'S' FROM notas_debito_proveedor WHERE PREF_PRE = NEW.PREF_PRE AND NDPR_NUMERO = NEW.NDPR_NUMERO INTO :EXISTE;
if (EXISTE = 'S') then
    EXCEPTION DOCUMENTO_REGISTRADO 'Ya existe un cargo de proveedor con el número ' || new.pref_pre || new.ndpr_numero;
/* Complete con ceros los campos nulos */
if (NEW.NDPR_MONTO IS NULL) then
    NEW.NDPR_MONTO = 0;
if (NEW.ndpr_ivaporc IS NULL) then
    NEW.ndpr_ivaporc = 0;
if (NEW.ndpr_ivamonto IS NULL) then
    NEW.ndpr_ivamonto = 0;
if (NEW.NDPR_RTFTEPORC IS NULL) then
    NEW.NDPR_RTFTEPORC = 0;
if (NEW.NDPR_RTIVAPORC IS NULL) then
    NEW.NDPR_RTIVAPORC = 0;
if (NEW.NDPR_RTICAPORC IS NULL) then
    NEW.NDPR_RTICAPORC = 0;
if (NEW.ndpr_rtcree IS NULL) then
    NEW.ndpr_rtcree = 0;
if (NEW.NDPR_RTFTEMONTO IS NULL) then
    NEW.NDPR_RTFTEMONTO = 0;
if (NEW.NDPR_RTIVAMONTO IS NULL) then
    NEW.NDPR_RTIVAMONTO = 0;
if (NEW.NDPR_RTICAMONTO IS NULL) then
    NEW.NDPR_RTICAMONTO = 0;
if (NEW.ndpr_rtcreem IS NULL) then
    NEW.ndpr_rtcreem = 0;
if (NEW.NDPR_DTOFPORC IS NULL) then
    NEW.NDPR_DTOFPORC = 0;
if (NEW.NDPR_DTOFMONTO IS NULL) then
    NEW.NDPR_DTOFMONTO = 0;
if (NEW.ndpr_basertfte IS NULL) then
    NEW.ndpr_basertfte = new.ndpr_monto;
if ((NEW.ndpr_trm IS NULL) or (new.ndpr_trm = 0)) then
    NEW.ndpr_trm = 1;
EXECUTE PROCEDURE LEE_CONFIGURACION('GENERAL', 'GENERAL', 'PREGUNTAR TASA DE CAMBIO EN DOCUMENTOS DE CUENTAS POR PAGAR') returning_values (:pregtasa);
if (PREGTASA = 'SI') then
    BEGIN
    NEW.ndpr_monto = NEW.ndpr_monto * NEW.ndpr_trm;
    NEW.ndpr_ivamonto = NEW.ndpr_ivamonto * NEW.ndpr_trm;
    NEW.ndpr_rtftemonto = NEW.ndpr_rtftemonto * NEW.ndpr_trm;
    NEW.ndpr_rtivamonto = NEW.ndpr_rtivamonto * NEW.ndpr_trm;
    NEW.ndpr_rticamonto = NEW.ndpr_rticamonto * NEW.ndpr_trm;
    NEW.ndpr_rtcreem = NEW.ndpr_rtcreem * NEW.ndpr_trm;
    NEW.ndpr_dtofmonto = NEW.ndpr_dtofmonto * NEW.ndpr_trm;
    END
if (new.ndpr_base0 is null) then
    if (new.ndpr_ivamonto <> 0) then
        new.ndpr_base0 = 0;
    else
        new.ndpr_base0 = new.ndpr_monto;
if (new.ndpr_base1 is null) then
    if (new.ndpr_ivamonto <> 0) then
        new.ndpr_base1 = new.ndpr_monto;
    else
        new.ndpr_base1 = 0;
if (new.ndpr_iva1 is null) then
    if (new.ndpr_ivamonto <> 0) then
        new.ndpr_iva1 = new.ndpr_ivamonto;
    else
        new.ndpr_iva1 = 0;
if (new.ndpr_base2 is null) then
    new.ndpr_base2 = 0;
if (new.ndpr_iva2 is null) then
    new.ndpr_iva2 = 0;
if (new.ndpr_base3 is null) then
    new.ndpr_base3 = 0;
if (new.ndpr_iva3 is null) then
    new.ndpr_iva3 = 0;
END^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER TRIGGER NOTAS_DEBITO_CLIENTES_BI FOR NOTAS_DEBITO_CLIENTES
ACTIVE BEFORE INSERT POSITION 0
AS
declare variable NUMERO VARCHAR(8);
declare variable AUTOM CHAR(1);
declare variable EXISTE CHAR(1);
declare variable CODCOBR INTEGER;
declare variable CODVEND INTEGER;
declare variable PREGTASA CHAR(2);
declare variable SITOT CHAR(2);
BEGIN
/* Complete los campos nulos */
select COBR_COD, VEND_COD FROM CLIENTES WHERE TERC_NIT = NEW.terc_nit INTO :CODCOBR, CODVEND;
if (NEW.cobr_cod IS NULL) then
    NEW.cobr_cod = :CODCOBR;
if (NEW.vend_cod IS NULL) then
    NEW.vend_cod = :CODVEND;
if (NEW.ndcl_monto IS NULL) then
    NEW.ndcl_monto = 0;
if (NEW.ndcl_ivaporc IS NULL) then
    NEW.ndcl_ivaporc = 0;
if (NEW.ndcl_ivamonto IS NULL) then
    NEW.ndcl_ivamonto = 0;
if (NEW.ndcl_rtfteporc IS NULL) then
    NEW.ndcl_rtfteporc = 0;
if (NEW.ndcl_rtivaporc IS NULL) then
    NEW.ndcl_rtivaporc = 0;
if (NEW.ndcl_rticaporc IS NULL) then
    NEW.ndcl_rticaporc = 0;
if (NEW.ndcl_rtcree IS NULL) then
    NEW.ndcl_rtcree = 0;
if (NEW.ndcl_rtftemonto IS NULL) then
    NEW.ndcl_rtftemonto = 0;
if (NEW.ndcl_rtivamonto IS NULL) then
    NEW.ndcl_rtivamonto = 0;
if (NEW.ndcl_rticamonto IS NULL) then
    NEW.ndcl_rticamonto = 0;
if (NEW.ndcl_rtcreem IS NULL) then
    NEW.ndcl_rtcreem = 0;
if (NEW.ndcl_dtofporc IS NULL) then
    NEW.ndcl_dtofporc = 0;
if (NEW.ndcl_dtofmonto IS NULL) then
    NEW.ndcl_dtofmonto = 0;
if ((NEW.ndcl_trm IS NULL) or (new.ndcl_trm = 0)) then
    NEW.ndcl_trm = 1;
EXECUTE PROCEDURE LEE_CONFIGURACION('GENERAL', 'GENERAL', 'PREGUNTAR TASA DE CAMBIO EN DOCUMENTOS DE CARTERA') returning_values (:pregtasa);
if (PREGTASA = 'SI') then
    BEGIN
    NEW.ndcl_monto = NEW.ndcl_monto * NEW.ndcl_trm;
    NEW.ndcl_ivamonto = NEW.ndcl_ivamonto * NEW.ndcl_trm;
    NEW.ndcl_rtftemonto = NEW.ndcl_rtftemonto * NEW.ndcl_trm;
    NEW.ndcl_rtivamonto = NEW.ndcl_rtivamonto * NEW.ndcl_trm;
    NEW.ndcl_rticamonto = NEW.ndcl_rticamonto * NEW.ndcl_trm;
    NEW.ndcl_rtcreem = NEW.ndcl_rtcreem * NEW.ndcl_trm;
    NEW.ndcl_dtofmonto = NEW.ndcl_dtofmonto * NEW.ndcl_trm;
    END

if (new.ndcl_vence < new.ndcl_fecha) then
    new.ndcl_vence = new.ndcl_fecha;

EXECUTE PROCEDURE LEE_CONFIGURACION('FACTURACION', 'VENDEDORES', 'COMISIONES EN VENTA INCLUYENDO IMPUESTOS') returning_values (:SITOT);
if (SITOT <> 'SI') then
    NEW.ndcl_comimonto = NEW.ndcl_monto * NEW.ndcl_comiporc / 100;
ELSE
    NEW.ndcl_comimonto = (NEW.ndcl_monto + NEW.ndcl_ivamonto) * NEW.ndcl_comiporc / 100;
if (NEW.numok = 'N') then
  BEGIN
  /* Actualice el contador del prefijo */
  SELECT PREF_ACTUAL, PREF_AUTO FROM PREFIJOS WHERE TIDO_COD = NEW.TIDO_COD AND PREF_PRE = NEW.PREF_PRE INTO :NUMERO, :AUTOM;
  /* ACTUALICE EL NUMERO EN COMPROBANTE_ENCABEZADO  */
  if (AUTOM = 'S') then
    BEGIN
    NEW.NDCL_NUMERO = NUMERO;
    NUMERO = CAST((CAST(NUMERO AS INTEGER) + 1) AS CHAR(6));
    UPDATE PREFIJOS
      SET PREF_ACTUAL = :NUMERO
    WHERE TIDO_COD = NEW.TIDO_COD AND PREF_PRE = NEW.PREF_PRE;
    END
  ELSE
    BEGIN
    if (CAST(NUMERO AS INTEGER) = CAST(NEW.NDCL_NUMERO AS INTEGER)) then
        UPDATE PREFIJOS
          SET PREF_ACTUAL = CAST((CAST(PREF_ACTUAL AS INTEGER) + 1) AS CHAR(6))
        WHERE TIDO_COD = NEW.TIDO_COD AND PREF_PRE = NEW.PREF_PRE;
    END
  EXECUTE PROCEDURE COMPLETA_CEROS (NEW.NDCL_numero) returning_values (NEW.NDCL_numero);
  NEW.numok = 'S';
  END
if (new.ndcl_exento is null) then
    if (new.ndcl_ivamonto <> 0) then
        new.ndcl_exento = 0;
    else
        new.ndcl_exento = new.ndcl_monto;
if (new.ndcl_base1 is null) then
    if (new.ndcl_ivamonto <> 0) then
        new.ndcl_base1 = new.ndcl_monto;
    else
        new.ndcl_base1 = 0;
if (new.ndcl_iva1 is null) then
    if (new.ndcl_ivamonto <> 0) then
        new.ndcl_iva1 = new.ndcl_ivamonto;
    else
        new.ndcl_iva1 = 0;
if (new.ndcl_base2 is null) then
    new.ndcl_base2 = 0;
if (new.ndcl_iva2 is null) then
    new.ndcl_iva2 = 0;
if (new.ndcl_base3 is null) then
    new.ndcl_base3 = 0;
if (new.ndcl_iva3 is null) then
    new.ndcl_iva3 = 0;
/* Verifique que el numero no existe previamente */
EXISTE = 'N';
SELECT 'S' FROM NOTAS_DEBITO_CLIENTES WHERE PREF_PRE = NEW.PREF_PRE AND NDCL_NUMERO = NEW.NDCL_NUMERO INTO :EXISTE;
if (EXISTE = 'S') then
    EXCEPTION DOCUMENTO_REGISTRADO 'Ya existe una nota débito de cliente con el número ' || new.pref_pre || new.ndcl_numero;
END^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER TRIGGER NOTAS_CREDITO_PROVEEDOR_BI FOR NOTAS_CREDITO_PROVEEDOR
ACTIVE BEFORE INSERT POSITION 0
AS
declare variable NUMERO VARCHAR(8);
declare variable AUTOM CHAR(1);
declare variable EXISTE CHAR(1);
declare variable PREGTASA CHAR(2);
BEGIN
IF (NEW.numok = 'N') THEN
  BEGIN
  /* Actualice el contador del prefijo */
  SELECT PREF_ACTUAL, PREF_AUTO FROM PREFIJOS WHERE TIDO_COD = NEW.TIDO_COD AND PREF_PRE = NEW.PREF_PRE INTO :NUMERO, :AUTOM;
  /* ACTUALICE EL NUMERO EN COMPROBANTE_ENCABEZADO  */
  if (AUTOM = 'S') then
    BEGIN
    NEW.NCPR_NUMERO = NUMERO;
    NUMERO = CAST((CAST(NUMERO AS INTEGER) + 1) AS CHAR(6));
    UPDATE PREFIJOS
      SET PREF_ACTUAL = :NUMERO
    WHERE TIDO_COD = NEW.TIDO_COD AND PREF_PRE = NEW.PREF_PRE;
    END
  ELSE
    BEGIN
    if (CAST(NUMERO AS INTEGER) = CAST(NEW.NCPR_NUMERO AS INTEGER)) then
        UPDATE PREFIJOS
          SET PREF_ACTUAL = CAST((CAST(PREF_ACTUAL AS INTEGER) + 1) AS CHAR(6))
        WHERE TIDO_COD = NEW.TIDO_COD AND PREF_PRE = NEW.PREF_PRE;
    END
  EXECUTE PROCEDURE COMPLETA_CEROS (NEW.NCPR_numero) returning_values (NEW.NCPR_numero);
  NEW.numok = 'S';
  END
/* Verifique que el numero no existe previamente */
EXISTE = 'N';
SELECT 'S' FROM NOTAS_CREDITO_PROVEEDOR WHERE PREF_PRE = NEW.PREF_PRE AND NCPR_NUMERO = NEW.NCPR_NUMERO INTO :EXISTE;
if (EXISTE = 'S') then
    EXCEPTION DOCUMENTO_REGISTRADO 'Ya existe un descuento a proveedor con el número ' || new.pref_pre || new.ncpr_numero;
/* Complete con ceros los campos nulos */
if (NEW.NCPR_MONTO IS NULL) then
    NEW.NCPR_MONTO = 0;
if (NEW.ncpr_ivaporc IS NULL) then
    NEW.ncpr_ivaporc = 0;
if (NEW.ncpr_ivamonto IS NULL) then
    NEW.ncpr_ivamonto = 0;
if (NEW.NCPR_RTFTEPORC IS NULL) then
    NEW.NCPR_RTFTEPORC = 0;
if (NEW.NCPR_RTIVAPORC IS NULL) then
    NEW.NCPR_RTIVAPORC = 0;
if (NEW.NCPR_RTICAPORC IS NULL) then
    NEW.NCPR_RTICAPORC = 0;
if (NEW.ncpr_rtcree IS NULL) then
    NEW.ncpr_rtcree = 0;
if (NEW.NCPR_RTFTEMONTO IS NULL) then
    NEW.NCPR_RTFTEMONTO = 0;
if (NEW.NCPR_RTIVAMONTO IS NULL) then
    NEW.NCPR_RTIVAMONTO = 0;
if (NEW.NCPR_RTICAMONTO IS NULL) then
    NEW.NCPR_RTICAMONTO = 0;
if (NEW.ncpr_rtcreem IS NULL) then
    NEW.ncpr_rtcreem = 0;
if (NEW.NCPR_DTOFPORC IS NULL) then
    NEW.NCPR_DTOFPORC = 0;
if (NEW.NCPR_DTOFMONTO IS NULL) then
    NEW.NCPR_DTOFMONTO = 0;
if (NEW.ncpr_basertfte IS NULL) then
    NEW.ncpr_basertfte = new.ncpr_monto;
if ((NEW.ncpr_trm IS NULL) or (new.ncpr_trm = 0)) then
    NEW.ncpr_trm = 1;
EXECUTE PROCEDURE LEE_CONFIGURACION('GENERAL', 'GENERAL', 'PREGUNTAR TASA DE CAMBIO EN DOCUMENTOS DE CUENTAS POR PAGAR') returning_values (:pregtasa);
if (PREGTASA = 'SI') then
    BEGIN
    NEW.ncpr_monto = NEW.ncpr_monto * NEW.ncpr_trm;
    NEW.ncpr_ivamonto = NEW.ncpr_ivamonto * NEW.ncpr_trm;
    NEW.ncpr_rtftemonto = NEW.ncpr_rtftemonto * NEW.ncpr_trm;
    NEW.ncpr_rtivamonto = NEW.ncpr_rtivamonto * NEW.ncpr_trm;
    NEW.ncpr_rticamonto = NEW.ncpr_rticamonto * NEW.ncpr_trm;
    NEW.ncpr_rtcreem = NEW.ncpr_rtcreem * NEW.ncpr_trm;
    NEW.ncpr_dtofmonto = NEW.ncpr_dtofmonto * NEW.ncpr_trm;
    END
if (new.ncpr_base0 is null) then
    if (new.ncpr_ivamonto <> 0) then
        new.ncpr_base0 = 0;
    else
        new.ncpr_base0 = new.ncpr_monto;
if (new.ncpr_base1 is null) then
    if (new.ncpr_ivamonto <> 0) then
        new.ncpr_base1 = new.ncpr_monto;
    else
        new.ncpr_base1 = 0;
if (new.ncpr_iva1 is null) then
    if (new.ncpr_ivamonto <> 0) then
        new.ncpr_iva1 = new.ncpr_ivamonto;
    else
        new.ncpr_iva1 = 0;
if (new.ncpr_base2 is null) then
    new.ncpr_base2 = 0;
if (new.ncpr_iva2 is null) then
    new.ncpr_iva2 = 0;
if (new.ncpr_base3 is null) then
    new.ncpr_base3 = 0;
if (new.ncpr_iva3 is null) then
    new.ncpr_iva3 = 0;
END^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER TRIGGER NOTAS_CREDITO_CLIENTES_BI FOR NOTAS_CREDITO_CLIENTES
ACTIVE BEFORE INSERT POSITION 0
AS
declare variable NUMERO VARCHAR(8);
declare variable AUTOM CHAR(1);
declare variable EXISTE CHAR(1);
declare variable CODCOBR INTEGER;
declare variable CODVEND INTEGER;
declare variable PREGTASA CHAR(2);
declare variable SITOT CHAR(2);
BEGIN
/* Complete con ceros los campos nulos */
select COBR_COD, VEND_COD FROM CLIENTES WHERE TERC_NIT = NEW.terc_nit INTO :CODCOBR, CODVEND;
if (NEW.cobr_cod IS NULL) then
    NEW.cobr_cod = :CODCOBR;
if (NEW.vend_cod IS NULL) then
    NEW.vend_cod = :CODVEND;
if (NEW.nccl_monto IS NULL) then
    NEW.nccl_monto = 0;
if (NEW.nccl_ivaporc IS NULL) then
    NEW.nccl_ivaporc = 0;
if (NEW.nccl_ivamonto IS NULL) then
    NEW.nccl_ivamonto = 0;
if (NEW.nccl_rtfteporc IS NULL) then
    NEW.nccl_rtfteporc = 0;
if (NEW.nccl_rtivaporc IS NULL) then
    NEW.nccl_rtivaporc = 0;
if (NEW.nccl_rticaporc IS NULL) then
    NEW.nccl_rticaporc = 0;
if (NEW.nccl_rtcree IS NULL) then
    NEW.nccl_rtcree = 0;
if (NEW.nccl_rtftemonto IS NULL) then
    NEW.nccl_rtftemonto = 0;
if (NEW.nccl_rtivamonto IS NULL) then
    NEW.nccl_rtivamonto = 0;
if (NEW.nccl_rticamonto IS NULL) then
    NEW.nccl_rticamonto = 0;
if (NEW.nccl_rtcreem IS NULL) then
    NEW.nccl_rtcreem = 0;
if ((NEW.nccl_trm IS NULL) or (new.nccl_trm = 0)) then
    NEW.nccl_trm = 1;
EXECUTE PROCEDURE LEE_CONFIGURACION('GENERAL', 'GENERAL', 'PREGUNTAR TASA DE CAMBIO EN DOCUMENTOS DE CARTERA') returning_values (:pregtasa);
if (PREGTASA = 'SI') then
    BEGIN
    NEW.nccl_monto = NEW.nccl_monto * NEW.nccl_trm;
    NEW.nccl_ivamonto = NEW.nccl_ivamonto * NEW.nccl_trm;
    NEW.nccl_rtftemonto = NEW.nccl_rtftemonto * NEW.nccl_trm;
    NEW.nccl_rtivamonto = NEW.nccl_rtivamonto * NEW.nccl_trm;
    NEW.nccl_rticamonto = NEW.nccl_rticamonto * NEW.nccl_trm;
    NEW.nccl_rtcreem = NEW.nccl_rtcreem * NEW.nccl_trm;
    END
EXECUTE PROCEDURE LEE_CONFIGURACION('FACTURACION', 'VENDEDORES', 'COMISIONES EN VENTA INCLUYENDO IMPUESTOS') returning_values (:SITOT);
if (SITOT <> 'SI') then
    NEW.nccl_comimonto = NEW.nccl_monto * NEW.nccl_comiporc / 100;
ELSE
    NEW.nccl_comimonto = (NEW.nccl_monto + NEW.nccl_ivamonto) * NEW.nccl_comiporc / 100;
if (NEW.numok = 'N') then
  BEGIN
  /* Actualice el contador del prefijo */
  SELECT PREF_ACTUAL, PREF_AUTO FROM PREFIJOS WHERE TIDO_COD = NEW.TIDO_COD AND PREF_PRE = NEW.PREF_PRE INTO :NUMERO, :AUTOM;
  /* ACTUALICE EL NUMERO EN COMPROBANTE_ENCABEZADO  */
  if (AUTOM = 'S') then
    BEGIN
    NEW.NCCL_NUMERO = NUMERO;
    NUMERO = CAST((CAST(NUMERO AS INTEGER) + 1) AS CHAR(6));
    UPDATE PREFIJOS
      SET PREF_ACTUAL = :NUMERO
    WHERE TIDO_COD = NEW.TIDO_COD AND PREF_PRE = NEW.PREF_PRE;
    END
  ELSE
    BEGIN
    if (CAST(NUMERO AS INTEGER) = CAST(NEW.NCCL_NUMERO AS INTEGER)) then
        UPDATE PREFIJOS
          SET PREF_ACTUAL = CAST((CAST(PREF_ACTUAL AS INTEGER) + 1) AS CHAR(6))
        WHERE TIDO_COD = NEW.TIDO_COD AND PREF_PRE = NEW.PREF_PRE;
    END
  EXECUTE PROCEDURE COMPLETA_CEROS (NEW.NCCL_numero) returning_values (NEW.NCCL_numero);
  NEW.numok = 'S';
  END
if (new.nccl_exento is null) then
    if (new.nccl_ivamonto <> 0) then
        new.nccl_exento = 0;
    else
        new.nccl_exento = new.nccl_monto;
if (new.nccl_base1 is null) then
    if (new.nccl_ivamonto <> 0) then
        new.nccl_base1 = new.nccl_monto;
    else
        new.nccl_base1 = 0;
if (new.nccl_iva1 is null) then
    if (new.nccl_ivamonto <> 0) then
        new.nccl_iva1 = new.nccl_ivamonto;
    else
        new.nccl_iva1 = 0;
if (new.nccl_base2 is null) then
    new.nccl_base2 = 0;
if (new.nccl_iva2 is null) then
    new.nccl_iva2 = 0;
if (new.nccl_base3 is null) then
    new.nccl_base3 = 0;
if (new.nccl_iva3 is null) then
    new.nccl_iva3 = 0;
/* Verifique que el numero no existe previamente */
EXISTE = 'N';
SELECT 'S' FROM NOTAS_CREDITO_CLIENTES WHERE PREF_PRE = NEW.PREF_PRE AND NCCL_NUMERO = NEW.NCCL_NUMERO INTO :EXISTE;
if (EXISTE = 'S') then
    EXCEPTION DOCUMENTO_REGISTRADO 'Ya existe una nota crédito con el número ' || new.pref_pre || new.nccl_numero;
END^

SET TERM ; ^

/* 20130917 */
/* CONTABILIZACION APLICACIONES AL REVES */

SET TERM ^ ;

CREATE OR ALTER procedure CONTABIL_APLICAPR (
    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 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 TIPOCOMP VARCHAR(3);
declare variable PREFCONT VARCHAR(4);
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);
ERROR = 0;
/* BUSQUE LA INTERFACE */
EXISTE = 'N';
SELECT 'S', TICO_COD, PRCO_PRE, INCP_BASE, INCP_PROV, INCP_CTABASE, INCP_CTAPROV, INCP_CONFIRMAR
  FROM INTERFAZ_CXPAGAR
  WHERE INCP_ID = :IDINTER
  INTO :EXISTE, :TIPOCOMP, :PREFCONT, :BASE, :CLIE, :CTABASE, :CTACLIE, :VER;

if (EXISTE = 'S') then
  BEGIN
  /* BORRE CUALQUEIR CONTABILIZACION PREVIA */
  DELETE FROM CONTABILIZACION WHERE CNTB_TIPOREF = 53 AND CNTB_IDREF = :IDDOC;
  /* 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);

    /* REGISTRE EL ENCABEZADO CONTABLE */
    IDC = GEN_ID(ID_CONTABILIZA, 1);
    INSERT INTO CONTABILIZACION (CNTB_ID, CNTB_TIPOCOMP, CNTB_PREFCNT, CNTB_NUMERO, CNTB_FECHA, CNTB_CONCEPTO, CNTB_REF, CNTB_TIPOREF, CNTB_IDREF, CNTB_PREFREF, CNTB_NUMREF, CNTB_PROCESADO)
        VALUES (:IDC, :TIPOCOMP, :PREFCONT, :NUM, :FECHA, :CONC, '', 53, :IDDOC, :PREF, :NUM, 'N');
    NROI = 0;

    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
                WHERE CUEN_COD = :CTABASE INTO :CUENTA, :TIPOCUEN;
            if (CUENTA IS NULL) then
                begin
                EXECUTE PROCEDURE ERROR (53, :IDDOC, :CTABASE, 2);
                CUENTA = CTABASE;
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'I') then
                BEGIN
                EXECUTE PROCEDURE ERROR (53, :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, 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
                WHERE CUEN_COD = :CTACLIE INTO :CUENTA, :TIPOCUEN;
            IF (CUENTA IS NULL) then
                begin
                EXECUTE PROCEDURE ERROR (53, :IDDOC, :CTACLIE, 2);
                CUENTA = CTACLIE;
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'I') then
                BEGIN
                EXECUTE PROCEDURE ERROR (53, :IDDOC, :CUENTA, 3);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                END
            if (TIPOCUEN = 'C') then
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_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 (ERROR > 0) then
    VER = 'S';
  SUSPEND;
  END /* EXISTE LA INTERFAZ */
ELSE
    BEGIN
    EXECUTE PROCEDURE ERROR (53, :IDDOC, :PREF, 1);
    ERROR = ERROR + 1;
    VER = 'S';
    SUSPEND;
    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 ; ^


/* 20130918 */
/* renombre el parametro para evitar errores del restore en versiones nuevas de Firebird */
SET TERM ^ ;

CREATE OR ALTER procedure ERROR (
    TIPODOC integer,
    IDDOC integer,
    CADENA varchar(20),
    ERRORS integer)
AS
declare variable CONC VARCHAR(30);
begin
if (errors = 1) then
    CONC = 'INTERFAZ NO EXISTE';
if (errors = 2) then
    CONC = 'CTA NO EXISTE/AFECTA';
if (errors = 3) then
    CONC = 'CUENTA DE INVENTARIO';
if (errors = 4) then
    CONC = 'CUENTA DE CARTERA';
INSERT INTO  ERRORES (ERRO_ITEM, ERRO_TIPODOC, ERRO_IDDOC, ERRO_CODIGO, ERRO_CANT, ERRO_CADENA)
    VALUES(GEN_ID(id_errores, 1), :TIPODOC, :IDDOC, :CONC, 0, :CADENA);
end^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE CONTABIL_AJUSTE(
    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 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 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, 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
    DELETE FROM contabilizacion WHERE CNTB_TIPOREF = 14 AND CNTB_IDREF = :IDDOC;

    /* TRAIGA EL ENCABEZADO DEL AJUSTE */
    SELECT PREF_PRE, AJUS_NUMERO, AJUS_FECHA, AJUS_CONC, AJUS_ANULADO
        FROM AJUSTES
        WHERE AJUS_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, 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;
        /* 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, '', 14, :IDDOC, :PREFIJO, :NUMERO, 'N');
        NUMITEMS = 0;
        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 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
                    VRBASE = MONTO;
                    /* TRAIGA LAS CARACTERISTICAS DE LA CUENTA */
                    SELECT CUEN_COD, CUEN_TERCERO, CUEN_CENTRO, CUEN_TIPO
                        FROM CUENTAS
                        WHERE CUEN_COD = :CTABASE
                        INTO :CUENTA, :ES_TERCERO, :ES_CENTRO, :TIPOCUEN;
                    if (CUENTA IS NULL) then
                        begin
                        EXECUTE PROCEDURE ERROR (14, :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 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 ERROR (14, :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 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
                    VRBASE = MONTO;
                    /* TRAIGA LAS CARACTERISTICAS DE LA CUENTA */
                    SELECT CUEN_COD, CUEN_TERCERO, CUEN_CENTRO, CUEN_TIPO
                        FROM CUENTAS
                        WHERE CUEN_COD = :CTABASE
                        INTO :CUENTA, :ES_TERCERO, :ES_CENTRO, :TIPOCUEN;
                    if (CUENTA IS NULL) then
                        begin
                        EXECUTE PROCEDURE ERROR (14, :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 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 ERROR (14, :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
                    WHERE CUEN_COD = :CTABASE
                    INTO :CUENTA, :ES_TERCERO, :ES_CENTRO, :TIPOCUEN;
                if (CUENTA IS NULL) then
                    begin
                    EXECUTE PROCEDURE ERROR (14, :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 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 ERROR (14, :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
                    WHERE CUEN_COD = :CTABASE
                    INTO :CUENTA, :ES_TERCERO, :ES_CENTRO, :TIPOCUEN;
                if (CUENTA IS NULL) then
                    begin
                    EXECUTE PROCEDURE ERROR (14, :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 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 ERROR (14, :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
                    WHERE CUEN_COD = :CUENTAADIC
                    INTO :CUENTA, :ES_TERCERO, :ES_CENTRO, :TIPOCUEN;
                if (CUENTA IS NULL) then
                    begin
                    EXECUTE PROCEDURE ERROR (14, :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 ERROR (14, :IDDOC, :CUENTA, 3);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    EXECUTE PROCEDURE ERROR (14, :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
                WHERE CUEN_COD = :CTACIERRE
                INTO :CUENTA, :ES_TERCERO, :ES_CENTRO, :TIPOCUEN;
            if (CUENTA IS NULL) then
                begin
                EXECUTE PROCEDURE ERROR (14, :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 ERROR (14, :IDDOC, :CUENTA, 3);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                EXECUTE PROCEDURE ERROR (14, :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 ERROR (14, :IDDOC, :PREFIJO, 1);
    ERROR = ERROR + 1;
    VER = 'S';
    END
SUSPEND;
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE CONTABIL_APLICACL(
    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 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 TIPOCOMP VARCHAR(3);
declare variable PREFCONT VARCHAR(4);
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', TICO_COD, PRCO_PRE, INCA_BASE, INCA_CLIE, INCA_CTABASE, INCA_CTACLIE, INCA_CONFIRMAR
    FROM INTERFAZ_CARTERA
    WHERE INCA_ID = :IDINTER
    INTO :EXISTE, :TIPOCOMP, :PREFCONT, :BASE, :CLIE, :CTABASE, :CTACLIE, :VER;
if (EXISTE = 'S') then
    BEGIN
    /* BORRE CUALQUEIR CONTABILIZACION PREVIA */
    DELETE FROM CONTABILIZACION WHERE CNTB_TIPOREF = 43 AND CNTB_IDREF = :IDDOC;
    /* 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;
        /* REGISTRE EL ENCABEZADO CONTABLE */
        IDC = GEN_ID(ID_CONTABILIZA, 1);
        INSERT INTO CONTABILIZACION (CNTB_ID, CNTB_TIPOCOMP, CNTB_PREFCNT, CNTB_NUMERO, CNTB_FECHA, CNTB_CONCEPTO, CNTB_REF, CNTB_TIPOREF, CNTB_IDREF, CNTB_PREFREF, CNTB_NUMREF, CNTB_PROCESADO)
            VALUES (:IDC, :TIPOCOMP, :PREFCONT, :NUM, :FECHA, :CONC, '', 43, :IDDOC, :PREF, :NUM, 'N');
        NROI = 0;
        ERROR = 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
                        WHERE CUEN_COD = :CTABASE INTO :CUENTA, :TIPOCUEN;
                    if (CUENTA IS NULL) then
                        begin
                        EXECUTE PROCEDURE ERROR (43, :IDDOC, :CTABASE, 2);
                        CUENTA = CTABASE;
                        TIPOCUEN = 'N';
                        ERROR = ERROR + 1;
                        end
                    if (TIPOCUEN = 'I') then
                        BEGIN
                        EXECUTE PROCEDURE ERROR (43, :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, :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
                    WHERE CUEN_COD = :CTACLIE INTO :CUENTA, :TIPOCUEN;
                IF (CUENTA IS NULL) then
                    begin
                    EXECUTE PROCEDURE ERROR (43, :IDDOC, :CTACLIE, 2);
                    CUENTA = CTACLIE;
                    ERROR = ERROR + 1;
                    end
                if (TIPOCUEN = 'I') then
                    BEGIN
                    EXECUTE PROCEDURE ERROR (43, :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, :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 (ERROR > 0) then
        VER = 'S';
    SUSPEND;
    END
ELSE
    BEGIN
    EXECUTE PROCEDURE ERROR (43, :IDDOC, :PREF, 1);
    ERROR = ERROR + 1;
    VER = 'S';
    SUSPEND;
    END
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE CONTABIL_APLICAPR(
    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 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 TIPOCOMP VARCHAR(3);
declare variable PREFCONT VARCHAR(4);
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);
ERROR = 0;
/* BUSQUE LA INTERFACE */
EXISTE = 'N';
SELECT 'S', TICO_COD, PRCO_PRE, INCP_BASE, INCP_PROV, INCP_CTABASE, INCP_CTAPROV, INCP_CONFIRMAR
  FROM INTERFAZ_CXPAGAR
  WHERE INCP_ID = :IDINTER
  INTO :EXISTE, :TIPOCOMP, :PREFCONT, :BASE, :CLIE, :CTABASE, :CTACLIE, :VER;

if (EXISTE = 'S') then
  BEGIN
  /* BORRE CUALQUEIR CONTABILIZACION PREVIA */
  DELETE FROM CONTABILIZACION WHERE CNTB_TIPOREF = 53 AND CNTB_IDREF = :IDDOC;
  /* 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);

    /* REGISTRE EL ENCABEZADO CONTABLE */
    IDC = GEN_ID(ID_CONTABILIZA, 1);
    INSERT INTO CONTABILIZACION (CNTB_ID, CNTB_TIPOCOMP, CNTB_PREFCNT, CNTB_NUMERO, CNTB_FECHA, CNTB_CONCEPTO, CNTB_REF, CNTB_TIPOREF, CNTB_IDREF, CNTB_PREFREF, CNTB_NUMREF, CNTB_PROCESADO)
        VALUES (:IDC, :TIPOCOMP, :PREFCONT, :NUM, :FECHA, :CONC, '', 53, :IDDOC, :PREF, :NUM, 'N');
    NROI = 0;

    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
                WHERE CUEN_COD = :CTABASE INTO :CUENTA, :TIPOCUEN;
            if (CUENTA IS NULL) then
                begin
                EXECUTE PROCEDURE ERROR (53, :IDDOC, :CTABASE, 2);
                CUENTA = CTABASE;
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'I') then
                BEGIN
                EXECUTE PROCEDURE ERROR (53, :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, '', ABS(:VRSUBT), 0, 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, '', ABS(:VRSUBT), 0, 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
                WHERE CUEN_COD = :CTACLIE INTO :CUENTA, :TIPOCUEN;
            IF (CUENTA IS NULL) then
                begin
                EXECUTE PROCEDURE ERROR (53, :IDDOC, :CTACLIE, 2);
                CUENTA = CTACLIE;
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'I') then
                BEGIN
                EXECUTE PROCEDURE ERROR (53, :IDDOC, :CUENTA, 3);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                END
            if (TIPOCUEN = 'C') then
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_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, :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, '', 0, :vrsubt, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            END /* CARTERA */
        END /* DO */
    END
  if (ERROR > 0) then
    VER = 'S';
  SUSPEND;
  END /* EXISTE LA INTERFAZ */
ELSE
    BEGIN
    EXECUTE PROCEDURE ERROR (53, :IDDOC, :PREF, 1);
    ERROR = ERROR + 1;
    VER = 'S';
    SUSPEND;
    END
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE CONTABIL_CHEQUE(
    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 TIPOCOMP VARCHAR(3);
declare variable PREFCONT VARCHAR(4);
declare variable BASE CHAR(1);
declare variable CTABASE VARCHAR(20);
declare variable IVA CHAR(1);
declare variable CTAIVA VARCHAR(20);
declare variable GMF CHAR(1);
declare variable CTAGMF VARCHAR(20);
declare variable BANCO CHAR(1);
declare variable CTABANCO VARCHAR(20);
declare variable EXISTE CHAR(1);
declare variable CUENTA VARCHAR(20);
declare variable MONTO NUMERIC(18,2);
declare variable VRGMF 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 NROI INTEGER;
declare variable SUMA NUMERIC(18,2);
declare variable BCTABANCO VARCHAR(20);
declare variable BCTAIVA VARCHAR(20);
declare variable BCTAGMF 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);
BEGIN
  /* BUSQUE LA INTERFACE */
  EXISTE = 'N';
  SELECT 'S', TICO_COD, PRCO_PRE, INBA_BANCO, INBA_IVA, INBA_GMF, INBA_BASE, INBA_CTABCO, INBA_CTAIVA, INBA_CTAGMF, INBA_CTABASE, INBA_CONFIRMAR
    FROM INTERFAZ_BANCOS
    WHERE INBA_ID = :IDINTER
    INTO :EXISTE, :TIPOCOMP, :PREFCONT, :BANCO, :IVA, :GMF, :BASE, :CTABANCO, CTAIVA, CTAGMF, CTABASE, :VER;
  if (EXISTE = 'S') then
    BEGIN
    DELETE FROM contabilizacion WHERE CNTB_TIPOREF = 71 AND CNTB_IDREF = :IDDOC;

    /* TRAIGA EL ENCABEZADO  */
    SELECT PRBA_PREF, CHEQ_NUMERO, CHEQ_FECHA, CHEQ_CONCEPTO, CHEQ_MONTO, CHEQ_GMFMONTO, CUBA_CTACONTA, CUBA_CTAIVA, CUBA_CTAGMF, TERC_NIT
        FROM CHEQUES C, CUENTAS_BANCO B
        WHERE CHEQ_ID = :IDDOC AND C.CUBA_COD = B.CUBA_COD
        INTO :PREF, :NUM, :FECAUX, :CONC, :MONTO, :VRGMF, :BCTABANCO, :BCTAIVA, :BCTAGMF, :NIT;
    NUMERO = PREF || NUM;
    SELECT PRBA_CENTRO, PRBA_PROY
        FROM PREFIJOS_BANCOS P, CHEQUES C
        WHERE P.PRBA_PREF = C.PRBA_PREF AND P.CUBA_COD = C.CUBA_COD AND C.CHEQ_ID = :IDDOC AND P.TIDO_COD = 72
        INTO :CENTRO, :PROY;
    EXECUTE PROCEDURE FECHA_A_CONTA(:FECAUX) returning_values (:FECHA);
    /* REGISTRE EL ENCABEZADO CONTABLE */
    IDC = GEN_ID(ID_CONTABILIZA, 1);
    INSERT INTO CONTABILIZACION (CNTB_ID, CNTB_TIPOCOMP, CNTB_PREFCNT, CNTB_NUMERO, CNTB_FECHA, CNTB_CONCEPTO, CNTB_REF, CNTB_TIPOREF, CNTB_IDREF, CNTB_PREFREF, CNTB_NUMREF, CNTB_PROCESADO)
        VALUES (:IDC, :TIPOCOMP, :PREFCONT, :NUM, :FECHA, :CONC, '', 71, :IDDOC, :PREF, :NUM, 'N');
    NROI = 0;
    SUMA = 0;
    ERROR = 0;
    /* CUENTA BASE */
    if (BASE = 'K') then
        BEGIN
        CUENTA = NULL;
        SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
            WHERE CUEN_COD = :CTABASE INTO :CUENTA, :TIPOCUEN;
      if (CUENTA IS NULL) then
            begin
            EXECUTE PROCEDURE ERROR (72, :IDDOC, :CTABASE, 2);
            CUENTA = CTABASE;
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            EXECUTE PROCEDURE ERROR (72, :IDDOC, :CUENTA, 3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'C') then
            BEGIN
            EXECUTE PROCEDURE ERROR (72, :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, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            END
        END /* BASE = K */
    /* CUENTA GMF */
    if ((GMF = 'K') or (GMF = 'B'))then
        BEGIN
        if (GMF = 'B') then
            CTAGMF = BCTAGMF;
        CUENTA = NULL;
        SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
            WHERE CUEN_COD = :CTAGMF INTO :CUENTA, :TIPOCUEN;
      if (CUENTA IS NULL) then
            begin
            EXECUTE PROCEDURE ERROR (72, :IDDOC, :CTAGMF, 2);
            CUENTA = CTAGMF;
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            EXECUTE PROCEDURE ERROR (72, :IDDOC, :CUENTA, 3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'C') then
            BEGIN
            EXECUTE PROCEDURE ERROR (72, :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, :NROI, :CUENTA, :CONC, '', :VRGMF, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            END
        END /* GMF */
    /* CUENTA BANCO */
    if ((BANCO = 'B') or (BANCO = 'K')) then
        BEGIN
        if (BANCO = 'B') then
            CTABANCO = BCTABANCO;
        SUMA = MONTO + VRGMF;
        if (SUMA <> 0) then
            BEGIN
            CUENTA = NULL;
            SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :CTABANCO INTO :CUENTA, :TIPOCUEN;
      if (CUENTA IS NULL) then
            begin
            EXECUTE PROCEDURE ERROR (72, :IDDOC, :CTABANCO, 2);
            CUENTA = CTABANCO;
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            EXECUTE PROCEDURE ERROR (72, :IDDOC, :CUENTA, 3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'C') then
            BEGIN
            EXECUTE PROCEDURE ERROR (72, :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, :NROI, :CUENTA, :CONC, '', 0, :SUMA, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                END
            END /* MONTO <> 0 */
        END /* BANCO K O B */
        
    /* recorra las cuentas adicionales */
    FOR SELECT INBC_CUENTA, INBC_BASE, INBC_PORC, INBC_VALOR, INBC_DB
        FROM INTERFAZ_BANCOS_CTAS
        WHERE INBA_ID = :IDINTER
        INTO :CUENTAADIC, :BASEADIC, :PORCADIC, :VALORADIC, :DBADIC
        DO
        BEGIN
        if (:BASEADIC = 'MONTO') then
            VALORADIC = MONTO;
        MONTO = VALORADIC * PORCADIC;
        
        /* TRAIGA LAS CARACTERISTICAS DE LA CUENTA */
        CUENTA = NULL;
        SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
            WHERE CUEN_COD = :CUENTAADIC INTO :CUENTA, :TIPOCUEN;
      if (CUENTA IS NULL) then
            begin
            EXECUTE PROCEDURE ERROR (72, :IDDOC, :CUENTAADIC, 2);
            CUENTA = CUENTAADIC;
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            EXECUTE PROCEDURE ERROR (72, :IDDOC, :CUENTA, 3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'C') then
            BEGIN
            EXECUTE PROCEDURE ERROR (72, :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, :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
    if (ERROR > 0) then
        VER = 'S';
    SUSPEND;
    END /* EXISTE */
ELSE
    BEGIN
    EXECUTE PROCEDURE ERROR (72, :IDDOC, :PREF, 1);
    ERROR = ERROR + 1;
    VER = 'S';
    SUSPEND;
    END
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE CONTABIL_CONSIGNA(
    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 AUX CHAR(120);
declare variable CONC CHAR(60);
declare variable VALOR NUMERIC(18, 2);
declare variable TIPOCOMP VARCHAR(3);
declare variable PREFCONT VARCHAR(4);
declare variable BASE CHAR(1);
declare variable CTABASE VARCHAR(20);
declare variable IVA CHAR(1);
declare variable CTAIVA VARCHAR(20);
declare variable GMF CHAR(1);
declare variable CTAGMF VARCHAR(20);
declare variable BANCO CHAR(1);
declare variable CTABANCO 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 NROI INTEGER;
declare variable SUMA NUMERIC(18,2);
declare variable BCTABANCO VARCHAR(20);
declare variable BCTAIVA VARCHAR(20);
declare variable BCTAGMF 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 ANULADO CHAR(1);
BEGIN
  /* BUSQUE LA INTERFACE */
  EXISTE = 'N';
  SELECT 'S', TICO_COD, PRCO_PRE, INBA_BANCO, INBA_IVA, INBA_GMF, INBA_BASE, INBA_CTABCO, INBA_CTAIVA, INBA_CTAGMF, INBA_CTABASE, INBA_CONFIRMAR
    FROM INTERFAZ_BANCOS
    WHERE INBA_ID = :IDINTER
    INTO :EXISTE, :TIPOCOMP, :PREFCONT, :BANCO, :IVA, :GMF, :BASE, :CTABANCO, CTAIVA, CTAGMF, CTABASE, :VER;
  /* BORRE CUALQUEIR CONTABILIZACION PREVIA */
  DELETE FROM CONTABILIZACION WHERE CNTB_TIPOREF = 71 AND CNTB_IDREF = :IDDOC;

  if (EXISTE = 'S') then
    BEGIN
    /* TRAIGA EL ENCABEZADO  */
    SELECT PRBA_PREF, CONS_NUMERO, CONS_FECHA, CONS_CONCEPTO, CUBA_CTACONTA, CUBA_CTAIVA, CUBA_CTAGMF, CONS_ANULADO, BANC_NIT
        FROM CONSIGNA C, CUENTAS_BANCO B, bancos A
        WHERE CONS_ID = :IDDOC AND C.CUBA_COD = B.CUBA_COD AND B.BANC_COD = A.BANC_COD
        INTO :PREF, :NUM, :FECAUX, :CONC, BCTABANCO, BCTAIVA, BCTAGMF, ANULADO, NIT;
    if (ANULADO = 'N') then
      BEGIN
      NUMERO = PREF || NUM;
      SELECT PRBA_CENTRO, PRBA_PROY FROM PREFIJOS_BANCOS P, CONSIGNA C
        WHERE P.PRBA_PREF = C.PRBA_PREF AND P.CUBA_COD = C.CUBA_COD AND P.TIDO_COD = 71 AND C.CONS_ID = :IDDOC
        INTO :CENTRO, :PROY;
      EXECUTE PROCEDURE FECHA_A_CONTA(:FECAUX) returning_values (:FECHA);
      /* REGISTRE EL ENCABEZADO CONTABLE */
      IDC = GEN_ID(ID_CONTABILIZA, 1);
      AUX = SUBSTR(CONC, 1, 32);
      CONC = 'CONSIGNACION No. ' || NUMERO || '-' || AUX;
      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, '', 71, :IDDOC, :PREF, :NUM, 'N');
      NROI = 0;
      SUMA = 0;
      ERROR = 0;
      /* CUENTA BANCO */
      if ((BANCO = 'B') or (BANCO = 'K')) then
        BEGIN
        SELECT SUM(CODE_MONTO) FROM CONSIGNA_DETALLE
            WHERE CONS_ID = :IDDOC INTO :VALOR;

        if (BANCO = 'B') then
            CTABANCO = BCTABANCO;
        if (VALOR <> 0) then
            BEGIN
            CUENTA = NULL;
            SELECT CUEN_COD, CUEN_TIPO
                FROM CUENTAS
                WHERE CUEN_COD = :CTABANCO
                INTO :CUENTA, :TIPOCUEN;
            if (CUENTA IS NULL) then
                begin
                EXECUTE PROCEDURE ERROR (71, :IDDOC, :CTABANCO, 2);
                CUENTA = CTABANCO;
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'I') then
                BEGIN
                EXECUTE PROCEDURE ERROR (71, :IDDOC, :CUENTA, 3);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                EXECUTE PROCEDURE ERROR (71, :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, :NROI, :CUENTA, :CONC, '', :VALOR, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA + VALOR;
                END
            END /* MONTO <> 0 */
        END /* BANCO K O B */
      /* CUENTA BASE */
      if ((BASE = 'C') or (BASE = 'K')) then
        if (BASE = 'C') then
            BEGIN
            FOR SELECT MAX(CAJA_CUENTA), SUM(CODE_MONTO) FROM CONSIGNA_DETALLE D, CAJAS C
                WHERE D.CAJA_ID = C.CAJA_ID AND CONS_ID = :IDDOC
                GROUP BY CAJA_CUENTA
                INTO :CTABASE, :VALOR
                DO
                BEGIN
                if (VALOR <> 0) then
                    BEGIN
                    CUENTA = NULL;
                    SELECT CUEN_COD, CUEN_TIPO
                        FROM CUENTAS
                        WHERE CUEN_COD = :CTABASE
                        INTO :CUENTA, :TIPOCUEN;
                    if (CUENTA IS NULL) then
                        begin
                        EXECUTE PROCEDURE ERROR (71, :IDDOC, :CTABASE, 2);
                        CUENTA = CTABASE;
                        TIPOCUEN = 'N';
                        ERROR = ERROR + 1;
                        end
                    if (TIPOCUEN = 'I') then
                        BEGIN
                        EXECUTE PROCEDURE ERROR (71, :IDDOC, :CUENTA, 3);
                        TIPOCUEN = 'N';
                        ERROR = ERROR + 1;
                        END
                    if (TIPOCUEN = 'C') then
                        BEGIN
                        EXECUTE PROCEDURE ERROR (71, :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, :NROI, :CUENTA, :CONC, '', 0, :VALOR, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                        NROI = NROI + 1;
                        SUMA = SUMA - VALOR;
                        END
                    END /* VALOR <> 0 */
                END /* FOR */
            END /* BASE = C */
        ELSE
            BEGIN
            CUENTA = NULL;
            SELECT CUEN_COD, CUEN_TIPO
                FROM CUENTAS
                WHERE CUEN_COD = :CTABASE
                INTO :CUENTA, :TIPOCUEN;
            if (CUENTA IS NULL) then
                begin
                EXECUTE PROCEDURE ERROR (71, :IDDOC, :CTABASE, 2);
                CUENTA = CTABASE;
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'I') then
                BEGIN
                EXECUTE PROCEDURE ERROR (71, :IDDOC, :CUENTA, 3);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                EXECUTE PROCEDURE ERROR (71, :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, :NROI, :CUENTA, :CONC, '', 0, :SUMA, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA - VALOR;
                END
            END /* BASE = K */
            
      /* recorra las cuentas adicionales */
      FOR SELECT INBC_CUENTA, INBC_BASE, INBC_PORC, INBC_VALOR, INBC_DB
        FROM INTERFAZ_BANCOS_CTAS
        WHERE INBA_ID = :IDINTER
        INTO :CUENTAADIC, :BASEADIC, :PORCADIC, :VALORADIC, :DBADIC
        DO
        BEGIN
        if (:BASEADIC = 'MONTO') then
            VALORADIC = MONTO;
        MONTO = VALORADIC * PORCADIC;
        
        /* TRAIGA LAS CARACTERISTICAS DE LA CUENTA */
        CUENTA = NULL;
        SELECT CUEN_COD, CUEN_TIPO
            FROM CUENTAS
            WHERE CUEN_COD = :CUENTAADIC
            INTO :CUENTA, :TIPOCUEN;
            if (CUENTA IS NULL) then
                begin
                EXECUTE PROCEDURE ERROR (71, :IDDOC, :CUENTAADIC, 2);
                CUENTA = CUENTAADIC;
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'I') then
                BEGIN
                EXECUTE PROCEDURE ERROR (71, :IDDOC, :CUENTA, 3);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                EXECUTE PROCEDURE ERROR (71, :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, :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
    if (ERROR > 0) then
        VER = 'S';
    SUSPEND;
    END  /* ANULADO = N */
  END /* EXISTE  */
ELSE
    BEGIN
    EXECUTE PROCEDURE ERROR (71, :IDDOC, :PREF, 1);
    ERROR = ERROR + 1;
    VER = 'S';
    SUSPEND;
    END
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE CONTABIL_CONSIGNATAR(
    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 VRDTO NUMERIC(18, 2);
declare variable VRRTFTE NUMERIC(18, 2);
declare variable VRRTIVA NUMERIC(18, 2);
declare variable VRRTICA NUMERIC(18, 2);
declare variable VRTOTAL NUMERIC(18, 2);
declare variable TIPOCOMP VARCHAR(3);
declare variable PREFCONT VARCHAR(4);
declare variable BASE CHAR(1);
declare variable PORC NUMERIC(8,2);
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 DTO CHAR(1);
declare variable CTADTO VARCHAR(20);
declare variable CTAGMF VARCHAR(20);
declare variable GMFPOR NUMERIC(9,2);
declare variable VRGMF NUMERIC(18,2);
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 NROI INTEGER;
declare variable SUMA 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 CHEQUE CHAR(1);
declare variable IDCAJA INTEGER;
declare variable IDBANCO INTEGER;
declare variable ANULADO CHAR(1);
declare variable VRBASE NUMERIC(18,2);
declare variable TOTALNETO CHAR(5);
BEGIN
/* BUSQUE LA INTERFACE */
EXISTE = 'N';
SELECT 'S', TICO_COD, PRCO_PRE, INCJ_BASE, INCJ_DTOPP, INCJ_RTFTE, INCJ_RTIVA, INCJ_RTICA, INCJ_CAJA, INCJ_CTABASE, INCJ_CTADTO, INCJ_CTARTFTE, INCJ_CTARTIVA, INCJ_CTARTICA, INCJ_CTACAJA, INCJ_CONFIRMAR
    FROM INTERFAZ_CAJA
    WHERE INCJ_ID = :IDINTER
    INTO :EXISTE, :TIPOCOMP, :PREFCONT, :BASE, :DTO, :RTFTE, :RTIVA, :RTICA, :CAJA, :CTABASE, :CTADTO, :CTARTFTE, :CTARTIVA, :CTARTICA, :CTACAJA, :VER;
if (EXISTE = 'S') then
    BEGIN
    DELETE FROM contabilizacion WHERE CNTB_TIPOREF = 64 AND CNTB_IDREF = :IDDOC;

    /* TRAIGA EL ENCABEZADO DE LA CONSIGNACION */
    SELECT PREF_PRE, COTJ_NUMERO, COTJ_FECHA, COTJ_CONCEPTO, COTJ_MONTO, COTJ_COMISION, COTJ_RTFTE, COTJ_RTIVA, COTJ_RTICA, COTJ_CHEQUE, CAJA_ID, CUBA_COD, COTJ_ANULADO
        FROM consigna_tarjetas
        WHERE COTJ_ID = :IDDOC
        INTO :PREF, :NUM, :FECAUX, :CONC, :VRTOTAL, :VRDTO, :VRRTFTE, :VRRTIVA, :VRRTICA, :CHEQUE, :IDCAJA, :IDBANCO, :ANULADO;
    if (ANULADO = 'N') then
        BEGIN
        EXECUTE PROCEDURE LEE_CONFIGURACION('BANCOS', 'CONSIGNACIONES', 'CONTABILIZAR EL BANCO POR EL TOTAL DE TARJETAS Y LUEGO DESCUENTOS O UN SOLO REGISTRO NETO') returning_values (:totalneto);
        /* EL NIT ES EL DEL BANCO */
        SELECT B.banc_nit FROM bancos B, CUENTAS_BANCO C WHERE C.banc_cod = B.banc_cod AND C.cuba_cod = :idbanco INTO :nit;

        NUMERO = PREF || NUM;
        SELECT PREF_CENTRO, PREF_PROY FROM PREFIJOS
            WHERE PREF_PRE = :PREF AND TIDO_COD = 64 INTO :CENTRO, :PROY;
        EXECUTE PROCEDURE FECHA_A_CONTA(:FECAUX) returning_values (:FECHA);

        /* REGISTRE EL ENCABEZADO CONTABLE */
        IDC = GEN_ID(ID_CONTABILIZA, 1);
        INSERT INTO CONTABILIZACION (CNTB_ID, CNTB_TIPOCOMP, CNTB_PREFCNT, CNTB_NUMERO, CNTB_FECHA, CNTB_CONCEPTO, CNTB_REF, CNTB_TIPOREF, CNTB_IDREF, CNTB_PREFREF, CNTB_NUMREF, CNTB_PROCESADO)
            VALUES (:IDC, :TIPOCOMP, :PREFCONT, :NUM, :FECHA, :CONC, '', 64, :IDDOC, :PREF, :NUM, 'N');

        NROI = 0;
        SUMA = 0;
        ERROR = 0;
        VRBASE = VRTOTAL;
        if (TOTALNETO = 'TOTAL') then
            VRTOTAL = VRTOTAL + vrdto + vrrtfte + vrrtica + vrrtiva;
        SELECT CUBA_CTAGMF, CUBA_GMFPOR FROM CUENTAS_BANCO WHERE CUBA_COD = :IDBANCO INTO ctagmf, :gmfpor;
        if ((CTAGMF <> '') AND (GMFPOR <> 0))then
            EXECUTE procedure REDONDEE((vrdto + vrrtfte + vrrtiva + vrrtica) * GMFPOR / 1000,0) returning_values (:VRGMF);
        else    
            VRGMF = 0;
        IF ((CAJA = 'K') or (CAJA = 'F') ) THEN
            BEGIN
            if (VRTOTAL <> 0) then
                BEGIN
                IF ((CAJA = 'F')) THEN
                    BEGIN
                    /* TRAIGA LA CUENTA DE LA CAJA O EL BANCO A ABONAR */
                    SELECT CUBA_CTACONTA FROM CUENTAS_BANCO WHERE CUBA_COD = :IDBANCO INTO CTACAJA;
--                    ELSE
--                        SELECT CAJA_CUENTA FROM CAJAS WHERE CAJA_ID = :IDCAJA INTO CTACAJA;
                    END
                
                CUENTA = NULL;
                SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                    WHERE CUEN_COD = :CTACAJA INTO :CUENTA, :TIPOCUEN;
                if (CUENTA IS NULL) then
                    begin
                    EXECUTE PROCEDURE ERROR (64, :IDDOC, :CTACAJA, 2);
                    CUENTA = CTABASE;
                    ERROR = ERROR + 1;
                    end
                if (TIPOCUEN = 'I') then
                    BEGIN
                    EXECUTE PROCEDURE ERROR (64, :IDDOC, :CUENTA, 3);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    EXECUTE PROCEDURE ERROR (64, :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, :NROI, :CUENTA, :CONC, '', :VRTOTAL, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    SUMA = SUMA + VRTOTAL;
                    if (TOTALNETO = 'TOTAL') then
                        BEGIN
                        if (VRDTO <> 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, :VRDTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                            NROI = NROI + 1;
                            SUMA = SUMA - VRDTO;
                            END
                        if (vrrtfte <> 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, :vrrtfte, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                            NROI = NROI + 1;
                            SUMA = SUMA - vrrtfte;
                            END
                        if (vrrtiva <> 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, :vrrtiva, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                            NROI = NROI + 1;
                            SUMA = SUMA - vrrtiva;
                            END
                        if (vrrtica <> 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, :vrrtica, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                            NROI = NROI + 1;
                            SUMA = SUMA - vrrtica;
                            END
                        if (vrgmf <> 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, :VRGMF, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                            NROI = NROI + 1;
                            SUMA = SUMA - VRGMF;
                            END
                        END
                    END
                END /* VRTOTAL <> 0 */
            END /* CAJA CONSTANTE */
        
        if (DTO = 'K') then /* COMISION */
            BEGIN
            if (VRDTO <> 0) then
                BEGIN
                CUENTA = NULL;
                SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                    WHERE CUEN_COD = :CTADTO INTO :CUENTA, :TIPOCUEN;
                if (CUENTA IS NULL) then
                    begin
                    EXECUTE PROCEDURE ERROR (64, :IDDOC, :CTABASE, 2);
                    CUENTA = CTABASE;
                    ERROR = ERROR + 1;
                    end
                if (TIPOCUEN = 'I') then
                    BEGIN
                    EXECUTE PROCEDURE ERROR (64, :IDDOC, :CUENTA, 3);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    EXECUTE PROCEDURE ERROR (64, :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, :NROI, :CUENTA, :CONC, '', :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 */
        
        /* RETENCION FUENTE */
        if (RTFTE = 'K') then
          if (VRRTFTE <> 0) then
            BEGIN
            PORC = vrrtfte * 100 / vrbase;
            CUENTA = NULL;
            SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :CTARTFTE INTO :CUENTA, :TIPOCUEN;
            if (CUENTA IS NULL) then
                begin
                EXECUTE PROCEDURE ERROR (64, :IDDOC, :ctartfte, 2);
                CUENTA = CTABASE;
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'I') then
                BEGIN
                EXECUTE PROCEDURE ERROR (64, :IDDOC, :CUENTA, 3);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                EXECUTE PROCEDURE ERROR (64, :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, :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 = 'K') then
          if (VRRTIVA <> 0) then
            BEGIN
            PORC = VRRTIVA / VRBASE;
            CUENTA = NULL;
            SELECT CUEN_COD, CUEN_TIPO
                FROM CUENTAS
                WHERE CUEN_COD = :CTARTIVA
                INTO :CUENTA, :TIPOCUEN;
            if (CUENTA IS NULL) then
                begin
                EXECUTE PROCEDURE ERROR (64, :IDDOC, :ctartiva, 2);
                CUENTA = CTABASE;
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'I') then
                BEGIN
                EXECUTE PROCEDURE ERROR (64, :IDDOC, :CUENTA, 3);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                EXECUTE PROCEDURE ERROR (64, :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, :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 ICA */
        if (rtica = 'K') then
          if (vrrtica <> 0) then
            BEGIN
            PORC = vrrtica / VRBASE;
            CUENTA = NULL;
            SELECT CUEN_COD, CUEN_TIPO
                FROM CUENTAS
                WHERE CUEN_COD = :ctartica
                INTO :CUENTA, :TIPOCUEN;
            if (CUENTA IS NULL) then
                begin
                EXECUTE PROCEDURE ERROR (64, :IDDOC, :ctartica, 2);
                CUENTA = ctartica;
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'I') then
                BEGIN
                EXECUTE PROCEDURE ERROR (64, :IDDOC, :CUENTA, 3);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                EXECUTE PROCEDURE ERROR (64, :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, :NROI, :CUENTA, :CONC, '', :vrrtica, 0, :VRBASE, :PORC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA + vrrtica;
                END
            END /* RTIVA */
        
        /* CUENTA GMF */
        if (VRGMF <> 0) then
            BEGIN
            CUENTA = NULL;
            SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :CTAGMF INTO :CUENTA, :TIPOCUEN;
            if (CUENTA IS NULL) then
                begin
                EXECUTE PROCEDURE ERROR (64, :IDDOC, :CTAGMF, 2);
                CUENTA = CTAGMF;
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'I') then
                BEGIN
                EXECUTE PROCEDURE ERROR (64, :IDDOC, :CUENTA, 3);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                EXECUTE PROCEDURE ERROR (64, :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, :NROI, :CUENTA, :CONC, '', :VRGMF, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA + VRGMF;
                END
            END /* GMF */

        /* CIERRE EL COMPROBANTE CONTRA LA CUENTA DE LA CAJA */
        if ((SUMA <> 0) and ((BASE = 'F') 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 = 'F') then
                SELECT CAJA_CUENTA FROM CAJAS WHERE CAJA_ID = :IDCAJA INTO CTABASE;

            CUENTA = NULL;
            SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :CTABASE INTO :CUENTA, :TIPOCUEN;
            if (CUENTA IS NULL) then
                begin
                EXECUTE PROCEDURE ERROR (64, :IDDOC, :CTABASE, 2);
                CUENTA = CTABASE;
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'I') then
                BEGIN
                EXECUTE PROCEDURE ERROR (64, :IDDOC, :CUENTA, 3);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                EXECUTE PROCEDURE ERROR (64, :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, :NROI, :CUENTA, :CONC, '', :DEBITO, :CREDITO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            END /* SUMA EN CARTERA */

        /* 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;
            MONTO = VALORADIC * PORCADIC;
        
            CUENTA = NULL;
            SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :CTADIC INTO :CUENTA, :TIPOCUEN;
            if (CUENTA IS NULL) then
                begin
                EXECUTE PROCEDURE ERROR (66, :IDDOC, :CTABASE, 2);
                CUENTA = CTABASE;
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'I') then
                BEGIN
                EXECUTE PROCEDURE ERROR (66, :IDDOC, :CUENTA, 3);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                EXECUTE PROCEDURE ERROR (66, :IDDOC, :CUENTA, 4);
                TIPOCUEN = 'N';
                ERROR = ERROR + 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 (ERROR > 0) then
            VER = 'S';
        SUSPEND;
        END
    END /* EXISTE LA INTERFAZ */
ELSE
    BEGIN
    EXECUTE PROCEDURE ERROR (64, :IDDOC, :PREF, 1);
    ERROR = ERROR + 1;
    VER = 'S';
    SUSPEND;
    END
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE CONTABIL_DESENSAMBLE(
    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);
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
    DELETE FROM contabilizacion WHERE CNTB_TIPOREF = 16 AND CNTB_IDREF = :IDDOC;
    /* TRAIGA EL ENCABEZADO DEL ENSAMBLE */
    SELECT PREF_PRE, DESE_NUMERO, DESE_FECHA, DESE_CONC, DESE_ANULADO
        FROM DESENSAMBLES
        WHERE DESE_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, 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;
        /* 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, '', 16, :IDDOC, :PREFIJO, :NUMERO, 'N');
        NUMITEMS = 0;
        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 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
                        WHERE CUEN_COD = :CTABASE INTO :CUENTA, :TIPOCUEN;
                    if (CUENTA IS NULL) then
                        begin
                        EXECUTE PROCEDURE ERROR (16, :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 ERROR (16, :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 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
                        WHERE CUEN_COD = :CTABASE INTO :CUENTA, :TIPOCUEN;
                    if (CUENTA IS NULL) then
                        begin
                        EXECUTE PROCEDURE ERROR (16, :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 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 (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 ERROR (16, :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
                    WHERE CUEN_COD = :CTABASE INTO :CUENTA, :TIPOCUEN;
                if (CUENTA IS NULL) then
                    begin
                    EXECUTE PROCEDURE ERROR (16, :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 ERROR (16, :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
                    WHERE CUEN_COD = :ctacierre INTO :CUENTA, :TIPOCUEN;
                if (CUENTA IS NULL) then
                    begin
                    EXECUTE PROCEDURE ERROR (16, :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 ERROR (16, :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 = '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 ERROR (16, :IDDOC, :CUENTAADIC, 2);
                    CUENTA = CUENTAADIC;
                    ERROR = ERROR + 1;
                    end
                if (TIPOCUEN = 'I') then
                    BEGIN
                    EXECUTE PROCEDURE ERROR (16, :IDDOC, :CUENTA, 3);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    EXECUTE PROCEDURE ERROR (16, :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 ERROR (16, :IDDOC, :PREFIJO, 1);
    ERROR = ERROR + 1;
    VER = 'S';
    SUSPEND;
    END
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE CONTABIL_DEVOLCHEQ(
    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 TIPOCOMP VARCHAR(3);
declare variable PREFCONT VARCHAR(4);
declare variable BASE CHAR(1);
declare variable CTABASE VARCHAR(20);
declare variable IVA CHAR(1);
declare variable CTAIVA VARCHAR(20);
declare variable GMF CHAR(1);
declare variable CTAGMF VARCHAR(20);
declare variable BANCO CHAR(1);
declare variable CTABANCO 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 CART CHAR(1);
declare variable IDCAJA INTEGER;
declare variable NIT VARCHAR(20);
declare variable PROY VARCHAR(4);
declare variable CENTRO VARCHAR(4);
declare variable NROI INTEGER;
declare variable SUMA NUMERIC(18,2);
declare variable BCTABANCO VARCHAR(20);
declare variable BCTAIVA VARCHAR(20);
declare variable BCTAGMF 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);
BEGIN
  /* BUSQUE LA INTERFACE */
  EXISTE = 'N';
  SELECT 'S', TICO_COD, PRCO_PRE, INBA_BANCO, INBA_IVA, INBA_GMF, INBA_BASE, INBA_CTABCO, INBA_CTAIVA, INBA_CTAGMF, INBA_CTABASE, INBA_CONFIRMAR
    FROM INTERFAZ_BANCOS
    WHERE INBA_ID = :IDINTER
    INTO :EXISTE, :TIPOCOMP, :PREFCONT, :BANCO, :IVA, :GMF, :BASE, :CTABANCO, CTAIVA, CTAGMF, CTABASE, :VER;
  if (EXISTE = 'S') then
    BEGIN
    DELETE FROM contabilizacion WHERE CNTB_TIPOREF = 77 AND CNTB_IDREF = :IDDOC;
    /* TRAIGA EL ENCABEZADO  */
    SELECT PRBA_PREF, DVCH_NUMDOC, DVCH_FECHA, DVCH_CONC, DVCH_MONTO, DVCH_CARTERA, CAJA_ID, TERC_NIT, CUBA_CTACONTA, CUBA_CTAIVA, CUBA_CTAGMF
        FROM DEVOLUCION_CHEQUES C, CUENTAS_BANCO B
        WHERE DVCH_ID = :IDDOC AND C.CUBA_COD = B.CUBA_COD
        INTO :PREF, :NUM, :FECAUX, :CONC, :MONTO, :CART, :IDCAJA, :NIT, :BCTABANCO, :BCTAIVA, :BCTAGMF;
    NUMERO = PREF || NUM;
    SELECT PRBA_CENTRO, PRBA_PROY FROM PREFIJOS_BANCOS P, devolucion_cheques C
        WHERE P.PRBA_PREF = C.PRBA_PREF AND P.CUBA_COD = C.CUBA_COD AND C.DVCH_ID = :IDDOC AND P.TIDO_COD = 77
        INTO :CENTRO, :PROY;
    EXECUTE PROCEDURE FECHA_A_CONTA(:FECAUX) returning_values (:FECHA);
    /* REGISTRE EL ENCABEZADO CONTABLE */
    IDC = GEN_ID(ID_CONTABILIZA, 1);
    INSERT INTO CONTABILIZACION (CNTB_ID, CNTB_TIPOCOMP, CNTB_PREFCNT, CNTB_NUMERO, CNTB_FECHA, CNTB_CONCEPTO, CNTB_REF, CNTB_TIPOREF, CNTB_IDREF, CNTB_PREFREF, CNTB_NUMREF, CNTB_PROCESADO)
        VALUES (:IDC, :TIPOCOMP, :PREFCONT, :NUM, :FECHA, :CONC, '', 77, :IDDOC, :PREF, :NUM, 'N');
    NROI = 0;
    SUMA = 0;
    ERROR = 0;
    /* CUENTA BASE */
    if ((BASE = 'C') or (BASE = 'K')) then
        BEGIN
        if (BASE = 'C') then
            if (CART = 'S') then /* LA CUENTA DEL CLIENTE */
                SELECT TERC_CTACLIENTE FROM TERCEROS
                    WHERE TERC_NIT = :NIT INTO :CTABASE;
            ELSE /* LA CUENTA DE CAJA */
                SELECT CAJA_CUENTA FROM CAJAS
                    WHERE CAJA_ID = :IDCAJA INTO :CTABASE;
        CUENTA = NULL;
        SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
            WHERE CUEN_COD = :CTABASE INTO :CUENTA, :TIPOCUEN;
        if (CUENTA IS NULL) then
            begin
            EXECUTE PROCEDURE ERROR (77, :IDDOC, :CTABASE, 2);
            CUENTA = CTABASE;
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            EXECUTE PROCEDURE ERROR (77, :IDDOC, :CUENTA, 3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'C') then
            BEGIN
            EXECUTE PROCEDURE ERROR (77, :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, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            END
        END /* BASE = C O K */
    /* CUENTA BANCO */
    if ((BANCO = 'B') or (BANCO = 'K')) then
        BEGIN
        if (BANCO = 'B') then
            CTABANCO = BCTABANCO;
        SUMA = MONTO;
        if (SUMA <> 0) then
            BEGIN
            CUENTA = NULL;
            SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :CTABANCO INTO :CUENTA, :TIPOCUEN;
        if (CUENTA IS NULL) then
            begin
            EXECUTE PROCEDURE ERROR (77, :IDDOC, :CTABANCO, 2);
            CUENTA = CTABANCO;
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            EXECUTE PROCEDURE ERROR (77, :IDDOC, :CUENTA, 3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'C') then
            BEGIN
            EXECUTE PROCEDURE ERROR (77, :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, :NROI, :CUENTA, :CONC, '', 0, :SUMA, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                END
            END /* MONTO <> 0 */
        END /* BANCO K O B */
        
    /* recorra las cuentas adicionales */
    FOR SELECT INBC_CUENTA, INBC_BASE, INBC_PORC, INBC_VALOR, INBC_DB
        FROM INTERFAZ_BANCOS_CTAS
        WHERE INBA_ID = :IDINTER
        INTO :CUENTAADIC, :BASEADIC, :PORCADIC, :VALORADIC, :DBADIC
        DO
        BEGIN
        if (:BASEADIC = 'MONTO') then
            VALORADIC = MONTO;
        MONTO = VALORADIC * PORCADIC;
        
        /* TRAIGA LAS CARACTERISTICAS DE LA CUENTA */
        CUENTA = NULL;
        SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
            WHERE CUEN_COD = :CUENTAADIC INTO :CUENTA, :TIPOCUEN;
        if (CUENTA IS NULL) then
            begin
            EXECUTE PROCEDURE ERROR (77, :IDDOC, :CUENTAADIC, 2);
            CUENTA = CUENTAADIC;
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            EXECUTE PROCEDURE ERROR (77, :IDDOC, :CUENTA, 3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'C') then
            BEGIN
            EXECUTE PROCEDURE ERROR (77, :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, :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
    if (ERROR > 0) then
        VER = 'S';
    SUSPEND;
    END /* EXISTE */
ELSE
    BEGIN
    EXECUTE PROCEDURE ERROR (77, :IDDOC, :PREF, 1);
    ERROR = ERROR + 1;
    VER = 'S';
    SUSPEND;
    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_CTAIVAV), 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_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(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;
            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 ERROR (33, :IDDOC, :PREF, 1);
    ERROR = ERROR + 1;
    VER = 'S';
    SUSPEND;
    END
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE CONTABIL_DEVOLCOMP(
    IDDOC INTEGER,
    IDINTER INTEGER)
RETURNS (
    ERROR INTEGER,
    VER CHAR(1),
    IDC INTEGER)
AS
declare variable PREFIJO VARCHAR(4);
declare variable NUM VARCHAR(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 TIPOCOMP VARCHAR(3);
declare variable PREFCONT VARCHAR(4);
declare variable INVEN CHAR(1);
declare variable CTAINVEN VARCHAR(20);
declare variable IVA CHAR(1);
declare variable CTAIVA VARCHAR(20);
declare variable CONSUMO CHAR(1);
declare variable CTACONSUMO VARCHAR(20);
declare variable CXP CHAR(1);
declare variable CTACXP VARCHAR(20);
declare variable RTFTE CHAR(1);
declare variable CTARTFTE VARCHAR(20);
declare variable RTIVA CHAR(1);
declare variable CTARTIVA VARCHAR(20);
declare variable RTICA CHAR(1);
declare variable CTARTICA VARCHAR(20);
declare variable 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', TICO_COD, PRCO_PRE, INCO_INVEN, INCO_IVA, INCO_CONSUMO, INCO_CXP, INCO_RTFTE, INCO_RTIVA, INCO_RTICA, INCO_RTCREE,
    INCO_CTAINVEN, INCO_CTAIVA, INCO_CTACONSUMO, INCO_CTADTO, INCO_CTAADIC, INCO_CTAEXTRA, INCO_CTACXP, INCO_CTARTFTE,
    INCO_CTARTIVA, INCO_CTARTICA, INCO_CTARTCREE, INCO_CONFIRMAR, INCO_CENTRO
    FROM INTERFAZ_COMPRAS
    WHERE INCO_ID = :IDINTER
    INTO :EXISTE, :TIPOCOMP, :PREFCONT, :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
    /* BORRE CUALQUEIR CONTABILIZACION PREVIA */
    DELETE FROM CONTABILIZACION WHERE CNTB_TIPOREF = 24 AND CNTB_IDREF = :IDDOC;
   /* TRAIGA EL ENCABEZADO DE LA DEVOLUCION */
   SELECT PREF_PRE, DVCO_NUMERO, DVCO_FECHA, D.TERC_NIT, DVCO_FACTURA, DVCO_IMPTOS, DVCO_DTOMONTO, DVCO_ADICIONAL, DVCO_IVAMONTO,
        DVCO_EXTRA, DVCO_TOTAL, DVCO_RTFTEPORC, DVCO_RTFTEMONTO, DVCO_RTIVAPORC, DVCO_RTIVAMONTO, DVCO_RTICAPORC, DVCO_RTICAMONTO,
        DVCO_RTCREE, DVCO_RTCREEM, PROV_CTARTFTE, PROV_CTARTIVA, PROV_CTARTICA, PROV_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;
    /* CONVIERTA LA FECHA A CADENA */
    EXECUTE PROCEDURE FECHA_A_CONTA(:FECAUX) returning_values (:FECHA);
    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;

    /* REGISTRE EL ENCABEZADO CONTABLE */
    CONCEPTO = 'DEVOLUCION COMPRA No. ' || NUMERO || ' EN FACTURA ' || NUMFAC;
    IDC = GEN_ID(ID_CONTABILIZA, 1);
    INSERT INTO CONTABILIZACION (CNTB_ID, CNTB_TIPOCOMP, CNTB_PREFCNT, CNTB_NUMERO, CNTB_FECHA, CNTB_CONCEPTO, CNTB_REF, CNTB_TIPOREF, CNTB_IDREF, CNTB_PREFREF, CNTB_NUMREF, CNTB_PROCESADO)
        VALUES (:IDC, :TIPOCOMP, :PREFCONT, :NUM, :FECHA, :CONCEPTO, '', 24, :IDDOC, :PREFIJO, :NUM, 'N');

    NUMITEMS = 0;
    SUMA = 0;
    ERROR = 0;
    /* CUENTAS DE INVENTARIO */
    if (INVEN = 'A') then
        BEGIN
        /* SUME LAS BASES DE LOS ARTICULOS DEL DOCUMENTO */
        FOR SELECT MAX(COAR_CTACOMP), SUM(cast(DVCD_CANT as double precision) * (DVCD_PRUNIT-DVCD_DTOMONTO)), SUM(DVCD_IVAMONTO), SUM(DVCD_CONSUMO)
            FROM ARTICULO A, CONTABIL_ARTICULO C, DEVOLUCIONES_COMPRAS_DET F
            WHERE F.DVCO_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD
            GROUP BY COAR_CTAINV
            INTO :CTAINVEN, :MONTO, :IMPTOS, :VALORADIC
            DO
            BEGIN
            if (IMPINC = 'S') then
                BEGIN
                MONTO = MONTO - IMPTOS;
                if (FOMENTO <> 'SI') then
                    MONTO = MONTO - VALORADIC;
                END
            /* TRAIGA LAS CARACTERISTICAS DE LA CUENTA */
            EXECUTE PROCEDURE CUENTA_INTERFAZ(24, :IDDOC, :CTAINVEN, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            /* DEPENDE DEL TIPO DE CUENTA */
            if ((TIPOCUEN = 'I') 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 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(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_CTAIVAC), SUM(DVCD_IVAMONTO), SUM(cast(DVCD_CANT as double precision) * (DVCD_PRUNIT-DVCD_DTOMONTO)), SUM(DVCD_CONSUMO)
            FROM ARTICULO A, CONTABIL_ARTICULO C, DEVOLUCIONES_COMPRAS_DET F
            WHERE F.DVCO_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND DVCD_IVAMONTO <> 0
            GROUP BY COAR_CTAIVAC
            INTO :CTAIVA, :IMPTOS, :MONTO, :VALORADIC
        DO
          if (IMPTOS <> 0) then
            BEGIN
            IMPTOS = CAST(IMPTOS AS DOUBLE PRECISION) * VRSUBT / MERCANCIA;
            if (IMPINC = 'S') then
                BEGIN
                MONTO = MONTO - IMPTOS;
                if (FOMENTO <> 'SI') then
                    MONTO = MONTO - VALORADIC;
                END

            /* TRAIGA LAS CARCATERISTICAS DE LA CUENTA */
            EXECUTE PROCEDURE CUENTA_INTERFAZ(24, :IDDOC, :CTAIVA, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            /* DEPENDE DEL TIPO DE CUENTA */
            if (TIPOCUEN = 'I') then
                BEGIN
                /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                FOR SELECT F.ARTI_COD, DVCD_IVAMONTO, (cast(DVCD_CANT as double precision) * (DVCD_PRUNIT-DVCD_DTOMONTO)), TAIV_PORC, DVCD_CONSUMO
                    FROM ARTICULO A, CONTABIL_ARTICULO C, DEVOLUCIONES_COMPRAS_DET F, TARIFA_IVA T
                    WHERE F.DVCO_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND COAR_CTAIVAV = :CUENTA AND A.TAIV_COD = T.TAIV_COD
                    INTO :ARTICULO, :IMPTOS, :MONTO, :PORCIVA, :VALORADIC
                DO
                    BEGIN
                    if (IMPINC = 'S') then
                        BEGIN
                        MONTO = MONTO - IMPTOS;
                        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(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 C, DEVOLUCIONES_COMPRAS_DET F
            WHERE F.DVCO_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD
            GROUP BY COAR_CTACONS
            INTO :CTACONSUMO, :IMPTOS
        DO
            BEGIN
            if (IMPTOS <> 0) then
                BEGIN
                /* TRAIGA LAS CARACTERISTICAS DE LA CUENTA */
                EXECUTE PROCEDURE CUENTA_INTERFAZ(24, :IDDOC, :CTACONSUMO, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                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(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(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(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(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(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 C, DEVOLUCIONES_COMPRAS_DET F
            WHERE F.dvco_id = :IDDOC AND F.ARTI_COD = C.ARTI_COD
            GROUP BY COAR_CTARTFTE
            INTO :CTARTFTE, :PRTFTE, :baseadic, :MONTO, :VRRTFTE
            DO
            BEGIN
            MONTO = MONTO * FACTOR;
            if (MONTO >= BASEADIC) then
                BEGIN
                VRRTFTE = VRRTFTE * FACTOR / 100;
                execute procedure redondee(VRRTFTE, DIG) returning_values (VRRTFTE);
                execute procedure redondee(MONTO, DIG) returning_values (MONTO);
                if (VRRTFTE <> 0) then
                    BEGIN
                    /* TRAIGA LAS CARACTERISTICAS DE LA CUENTA */
                    EXECUTE PROCEDURE CUENTA_INTERFAZ(24, :IDDOC, :CTARTFTE, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
                    if (ERRORC <> 0) then
                        ERROR = ERROR + 1;
                    if (TIPOCUEN = 'C') then
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_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(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(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(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(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(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 ERROR (24, :IDDOC, :PREFIJO, 1);
    ERROR = ERROR + 1;
    VER = 'S';
    SUSPEND;
    END
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE CONTABIL_EGRESO(
    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 FECAUX DATE;
declare variable FECHA CHAR(8);
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 TIPOCOMP VARCHAR(3);
declare variable PREFCONT VARCHAR(4);
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', TICO_COD, PRCO_PRE, INCJ_BASE, INCJ_DTOPP, INCJ_RTFTE, INCJ_RTIVA, INCJ_RTICA, INCJ_CAJA, INCJ_CTABASE,
    INCJ_CTADTO, INCJ_CTARTFTE, INCJ_CTARTIVA, INCJ_CTARTICA, INCJ_CTARTCREE, INCJ_CTACAJA, INCJ_CONFIRMAR
    FROM INTERFAZ_CAJA
    WHERE INCJ_ID = :IDINTER
    INTO :EXISTE, :TIPOCOMP, :PREFCONT, :BASE, :DTO, :RTFTE, :RTIVA, :RTICA, :CAJA, :CTABASE,
    :CTADTO, :CTARTFTE, :CTARTIVA, :CTARTICA, :CTARTCREE, :CTACAJA, :VER;
if (EXISTE = 'S') then
    BEGIN
    OK = 0;
    FOR SELECT CNTB_ID FROM CONTABILIZACION WHERE CNTB_TIPOREF = 62 AND CNTB_IDREF = :IDDOC INTO :OK DO
        BEGIN
        DELETE FROM CONTABILIZACION_DET WHERE CNTB_ID = :OK;
        DELETE FROM CONTABILIZACION WHERE CNTB_ID = :OK;
        END

    /* TRAIGA EL ENCABEZADO DEL EGRESO */
    SELECT PREF_PRE, EGRE_NUMERO, EGRE_FECHA, 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, :NUM, :FECAUX, :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;
    EXECUTE PROCEDURE FECHA_A_CONTA(:FECAUX) returning_values (:FECHA);
    /* REGISTRE EL ENCABEZADO CONTABLE */
    IDC = GEN_ID(ID_CONTABILIZA, 1);
    INSERT INTO CONTABILIZACION (CNTB_ID, CNTB_TIPOCOMP, CNTB_PREFCNT, CNTB_NUMERO, CNTB_FECHA, CNTB_CONCEPTO, CNTB_REF, CNTB_TIPOREF, CNTB_IDREF, CNTB_PREFREF, CNTB_NUMREF, CNTB_PROCESADO)
        VALUES (:IDC, :TIPOCOMP, :PREFCONT, :NUM, :FECHA, :CONC, '', 62, :IDDOC, :PREF, :NUM, 'N');
    /* 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 = 0;
    SUMA = 0;
    ERROR = 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
                    WHERE CUEN_COD = :CTACAJA INTO :CUENTA, :TIPOCUEN;
            ELSE
                begin
                EXECUTE PROCEDURE ERROR (62, :IDDOC, :CTACAJA, 2);
                CUENTA = CTACAJA;
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'I') then
                BEGIN
                EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 3);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                EXECUTE PROCEDURE ERROR (62, :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, :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
                        WHERE CUEN_COD = :CTACAJA INTO :CUENTA, :TIPOCUEN;
                ELSE
                    begin
                    EXECUTE PROCEDURE ERROR (62, :IDDOC, :CTACAJA, 2);
                    CUENTA = CTACAJA;
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    end
                if (TIPOCUEN = 'I') then
                    BEGIN
                    EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 3);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    EXECUTE PROCEDURE ERROR (62, :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, :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
                        WHERE CUEN_COD = :CTACAJA INTO :CUENTA, :TIPOCUEN;
                ELSE
                    begin
                    EXECUTE PROCEDURE ERROR (62, :IDDOC, :CTACAJA, 2);
                    CUENTA = CTACAJA;
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    end
                if (TIPOCUEN = 'I') then
                    BEGIN
                    EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 3);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    EXECUTE PROCEDURE ERROR (62, :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, :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
                            WHERE CUEN_COD = :CTACAJA INTO :CUENTA, :TIPOCUEN;
                    ELSE
                        begin
                        EXECUTE PROCEDURE ERROR (62, :IDDOC, :CTACAJA, 2);
                        CUENTA = CTACAJA;
                        TIPOCUEN = 'N';
                        ERROR = ERROR + 1;
                        end
                    if (TIPOCUEN = 'I') then
                        BEGIN
                        EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 3);
                        TIPOCUEN = 'N';
                        ERROR = ERROR + 1;
                        END
                    if (TIPOCUEN = 'C') then
                        BEGIN
                        EXECUTE PROCEDURE ERROR (62, :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, :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
                WHERE CUEN_COD = :tctacart INTO :CUENTA, :TIPOCUEN;
        ELSE
            begin
            EXECUTE PROCEDURE ERROR (62, :IDDOC, :tctacart, 2);
            CUENTA = tctacart;
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'C') then
            BEGIN
            EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 3);
            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, :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
                WHERE CUEN_COD = :tctacart INTO :CUENTA, :TIPOCUEN;
        ELSE
            begin
            EXECUTE PROCEDURE ERROR (62, :IDDOC, :tctacart, 2);
            CUENTA = tctacart;
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 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
                    WHERE CUEN_COD = :ctadif INTO :CUENTA, :TIPOCUEN;
            ELSE
                begin
                EXECUTE PROCEDURE ERROR (62, :IDDOC, :ctadif, 2);
                CUENTA = ctadif;
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'I') then
                BEGIN
                EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 3);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 4);
                TIPOCUEN = 'N';
                ERROR = ERROR + 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
                        WHERE CUEN_COD = :ctartfter INTO :CUENTA, :TIPOCUEN;
                ELSE
                    begin
                    EXECUTE PROCEDURE ERROR (62, :IDDOC, :ctartfter, 2);
                    CUENTA = ctartfter;
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    end
                if (TIPOCUEN = 'I') then
                    BEGIN
                    EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 3);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 4);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 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
                        WHERE CUEN_COD = :ctartivar INTO :CUENTA, :TIPOCUEN;
                ELSE
                    begin
                    EXECUTE PROCEDURE ERROR (62, :IDDOC, :ctartivar, 2);
                    CUENTA = ctartivar;
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    end
                if (TIPOCUEN = 'I') then
                    BEGIN
                    EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 3);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 4);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 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
                        WHERE CUEN_COD = :ctarticar INTO :CUENTA, :TIPOCUEN;
                ELSE
                    begin
                    EXECUTE PROCEDURE ERROR (62, :IDDOC, :ctarticar, 2);
                    CUENTA = ctarticar;
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    end
                if (TIPOCUEN = 'I') then
                    BEGIN
                    EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 3);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 4);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 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
                        WHERE CUEN_COD = :ctartcreer INTO :CUENTA, :TIPOCUEN;
                ELSE
                    begin
                    EXECUTE PROCEDURE ERROR (62, :IDDOC, :ctartcreer, 2);
                    CUENTA = ctartcreer;
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    end
                if (TIPOCUEN = 'I') then
                    BEGIN
                    EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 3);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 4);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 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
                    WHERE CUEN_COD = :CTADTO INTO :CUENTA, :TIPOCUEN;
            ELSE
                begin
                EXECUTE PROCEDURE ERROR (62, :IDDOC, :CTADTO, 2);
                CUENTA = CTADTO;
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'I') then
                BEGIN
                EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 3);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 4);
                TIPOCUEN = 'N';
                ERROR = ERROR + 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
                WHERE CUEN_COD = :ctadif INTO :CUENTA, :TIPOCUEN;
        ELSE
            begin
            EXECUTE PROCEDURE ERROR (62, :IDDOC, :ctadif, 2);
            CUENTA = ctadif;
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'C') then
            BEGIN
            EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 4);
            TIPOCUEN = 'N';
            ERROR = ERROR + 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
                WHERE CUEN_COD = :CTARTFTE INTO :CUENTA, :ES_RETENCION, :TIPOCUEN;
        ELSE
            begin
            EXECUTE PROCEDURE ERROR (62, :IDDOC, :CTARTFTE, 2);
            CUENTA = CTARTFTE;
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'C') then
            BEGIN
            EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 4);
            TIPOCUEN = 'N';
            ERROR = ERROR + 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
                WHERE CUEN_COD = :CTARTIVA INTO :CUENTA, :ES_RETENCION, :TIPOCUEN;
        ELSE
            begin
            EXECUTE PROCEDURE ERROR (62, :IDDOC, :CTARTIVA, 2);
            CUENTA = CTARTIVA;
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'C') then
            BEGIN
            EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 4);
            TIPOCUEN = 'N';
            ERROR = ERROR + 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
                WHERE CUEN_COD = :CTARTICA INTO :CUENTA, :ES_RETENCION, :TIPOCUEN;
        ELSE
            begin
            EXECUTE PROCEDURE ERROR (62, :IDDOC, :CTARTICA, 2);
            CUENTA = CTARTICA;
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'C') then
            BEGIN
            EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 4);
            TIPOCUEN = 'N';
            ERROR = ERROR + 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
                WHERE CUEN_COD = :ctartcree INTO :CUENTA, :ES_RETENCION, :TIPOCUEN;
        ELSE
            begin
            EXECUTE PROCEDURE ERROR (62, :IDDOC, :ctartcree, 2);
            CUENTA = ctartcree;
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'C') then
            BEGIN
            EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 4);
            TIPOCUEN = 'N';
            ERROR = ERROR + 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
                WHERE CUEN_COD = :CTABASE INTO :CUENTA, :TIPOCUEN;
        ELSE
            begin
            EXECUTE PROCEDURE ERROR (62, :IDDOC, :CTABASE, 2);
            CUENTA = CTABASE;
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'C') then
            BEGIN
            EXECUTE PROCEDURE ERROR (62, :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, :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
                    WHERE CUEN_COD = :CTABASE INTO :CUENTA, :TIPOCUEN;
            ELSE
                begin
                EXECUTE PROCEDURE ERROR (62, :IDDOC, :CTABASE, 2);
                CUENTA = CTABASE;
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'I') then
                BEGIN
                EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 3);
                TIPOCUEN = 'N';
                ERROR = ERROR + 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)))
                        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 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
                        WHERE CUEN_COD = :CTABASE INTO :CUENTA, :TIPOCUEN;
                ELSE
                    begin
                    EXECUTE PROCEDURE ERROR (62, :IDDOC, :CTABASE, 2);
                    CUENTA = CTABASE;
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 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 ERROR (62, :IDDOC, :CUENTA, 3);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 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
                WHERE CUEN_COD = :CTADIC INTO :CUENTA, :TIPOCUEN;
        ELSE
            begin
            EXECUTE PROCEDURE ERROR (62, :IDDOC, :CTADIC, 2);
            CUENTA = CTADIC;
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'C') then
            BEGIN
            EXECUTE PROCEDURE ERROR (62, :IDDOC, :CUENTA, 4);
            TIPOCUEN = 'N';
            ERROR = ERROR + 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 (ERROR > 0) then
        VER = 'S';
    SUSPEND;
    END /* EXISTE LA INTERFAZ */
  ELSE
    BEGIN
    EXECUTE PROCEDURE ERROR (62, :IDDOC, :PREF, 1);
    ERROR = ERROR + 1;
    VER = 'S';
    SUSPEND;
    END
END
^

SET TERM ; ^

SET TERM ^ ;

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);
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;
        /* 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 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
                        WHERE CUEN_COD = :CTABASE INTO :CUENTA, :TIPOCUEN;
                    if (CUENTA IS NULL) then
                        begin
                        EXECUTE PROCEDURE ERROR (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 ERROR (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 */

            /* 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 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
                        WHERE CUEN_COD = :CTABASE INTO :CUENTA, :TIPOCUEN;
                    if (CUENTA IS NULL) then
                        begin
                        EXECUTE PROCEDURE ERROR (15, :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 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 ERROR (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 /* 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
                    WHERE CUEN_COD = :CTABASE INTO :CUENTA, :TIPOCUEN;
                if (CUENTA IS NULL) then
                    begin
                    EXECUTE PROCEDURE ERROR (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 ERROR (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 ERROR (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 ERROR (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 ERROR (15, :IDDOC, :CUENTAADIC, 2);
                    CUENTA = CUENTAADIC;
                    ERROR = ERROR + 1;
                    end
                if (TIPOCUEN = 'I') then
                    BEGIN
                    EXECUTE PROCEDURE ERROR (15, :IDDOC, :CUENTA, 3);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    EXECUTE PROCEDURE ERROR (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 ERROR (15, :IDDOC, :PREFIJO, 1);
    ERROR = ERROR + 1;
    VER = 'S';
    SUSPEND;
    END
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE CONTABIL_ENTRADA(
    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 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, 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 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);
        
    /* BORRE CUALQUEIR CONTABILIZACION PREVIA */
    DELETE FROM CONTABILIZACION WHERE CNTB_TIPOREF = 11 AND CNTB_IDREF = :IDDOC;

    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);
        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, '', 11, :IDDOC, :PREFIJO, :NUMERO, 'N');
        NUMITEMS = 0;
        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 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
                    WHERE CUEN_COD = :CTABASE INTO :CUENTA, :TIPOCUEN;
                if (CUENTA IS NULL) then
                    begin
                    EXECUTE PROCEDURE ERROR (11, :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 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 ERROR (11, :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
                    WHERE CUEN_COD = :CTABASE INTO :CUENTA, :TIPOCUEN;
                if (CUENTA IS NULL) then
                    begin
                    EXECUTE PROCEDURE ERROR (11, :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 ERROR (11, :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
                    WHERE CUEN_COD = :CTABASE INTO :CUENTA, :TIPOCUEN;
                if (CUENTA IS NULL) then
                    begin
                    EXECUTE PROCEDURE ERROR (11, :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 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 ERROR (11, :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 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
                        WHERE CUEN_COD = :CTAIVA INTO :CUENTA, :TIPOCUEN;
                    if (CUENTA IS NULL) then
                        begin
                        EXECUTE PROCEDURE ERROR (11, :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 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 ERROR (11, :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
                        WHERE CUEN_COD = :CTAIVA INTO :CUENTA, :TIPOCUEN;
                    if (CUENTA IS NULL) then
                        begin
                        EXECUTE PROCEDURE ERROR (11, :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 ERROR (11, :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
                    WHERE CUEN_COD = :CTAIVA INTO :CUENTA, :TIPOCUEN;
                if (CUENTA IS NULL) then
                    begin
                    EXECUTE PROCEDURE ERROR (11, :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 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 ERROR (11, :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 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
                        WHERE CUEN_COD = :CTACONSUMO INTO :CUENTA, :TIPOCUEN;
                    if (CUENTA IS NULL) then
                        begin
                        EXECUTE PROCEDURE ERROR (11, :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 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 ERROR (11, :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
                    WHERE CUEN_COD = :CTACONSUMO INTO :CUENTA, :TIPOCUEN;
                if (CUENTA IS NULL) then
                    begin
                    EXECUTE PROCEDURE ERROR (11, :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 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 ERROR (11, :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
                    WHERE CUEN_COD = :CUENTAADIC INTO :CUENTA, :TIPOCUEN;
                if (CUENTA IS NULL) then
                    begin
                    EXECUTE PROCEDURE ERROR (11, :IDDOC, :CUENTAADIC, 2);
                    CUENTA = CUENTAADIC;
                    ERROR = ERROR + 1;
                    end
                /* DEPENDE DEL TIPO DE CUENTA */
                if (TIPOCUEN = 'I') then
                    BEGIN
                    EXECUTE PROCEDURE ERROR (11, :IDDOC, :CUENTA, 3);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    EXECUTE PROCEDURE ERROR (11, :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
                WHERE CUEN_COD = :CTACIERRE INTO :CUENTA, :TIPOCUEN;
            if (CUENTA IS NULL) then
                begin
                EXECUTE PROCEDURE ERROR (24, :IDDOC, :CTACIERRE, 2);
                CUENTA = CTACIERRE;
                ERROR = ERROR + 1;
                end
            /* DEPENDE DEL TIPO DE CUENTA */
            if (TIPOCUEN = 'I') then
                BEGIN
                EXECUTE PROCEDURE ERROR (11, :IDDOC, :CUENTA, 3);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                EXECUTE PROCEDURE ERROR (11, :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 ERROR (11, :IDDOC, :PREFIJO, 1);
    ERROR = ERROR + 1;
    VER = 'S';
    END
SUSPEND;
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE CONTABIL_FACTCOMP(
    IDDOC INTEGER,
    IDINTER INTEGER)
RETURNS (
    ERROR INTEGER,
    VER CHAR(1),
    IDC INTEGER)
AS
DECLARE VARIABLE PREFIJO VARCHAR(4);
DECLARE VARIABLE NUM VARCHAR(8);
DECLARE VARIABLE NUMERO VARCHAR(10);
DECLARE VARIABLE FECAUX DATE;
DECLARE VARIABLE FECHA CHAR(8);
DECLARE VARIABLE CONCEPTO CHAR(60);
DECLARE VARIABLE VENCEAUX DATE;
DECLARE VARIABLE VENCE CHAR(8);
DECLARE VARIABLE VRDTO NUMERIC(18,2);
DECLARE VARIABLE VRADIC NUMERIC(18,2);
DECLARE VARIABLE VRSUBT NUMERIC(18,2);
DECLARE VARIABLE VRIVA NUMERIC(18,2);
DECLARE VARIABLE PRTFTE NUMERIC(9,2);
DECLARE VARIABLE VRRTFTE NUMERIC(18,2);
DECLARE VARIABLE VRRTIVA NUMERIC(18,2);
DECLARE VARIABLE PRTICA NUMERIC(9,2);
DECLARE VARIABLE VRRTICA NUMERIC(18,2);
DECLARE VARIABLE 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 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', TICO_COD, PRCO_PRE, INCO_INVEN, INCO_IVA, INCO_CONSUMO, INCO_CXP, INCO_RTFTE, INCO_RTIVA, INCO_RTICA, INCO_RTCREE,
    INCO_CTAINVEN, INCO_CTAIVA, INCO_CTACONSUMO, INCO_CTADTO, INCO_CTAADIC, INCO_CTAEXTRA, INCO_CTACXP, INCO_CTARTFTE, INCO_CTARTIVA,
    INCO_CTARTICA, INCO_CTARTCREE, INCO_CONFIRMAR, INCO_CENTRO
    FROM INTERFAZ_COMPRAS WHERE INCO_ID = :IDINTER
    INTO :EXISTE, :TIPOCOMP, :PREFCONT, :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
    /* BORRE CONTABILIZACION PREVIA */
    DELETE FROM CONTABILIZACION WHERE CNTB_TIPOREF = 21 AND CNTB_IDREF = :IDDOC;
    /* ENCABEZADO DE LA FACTURA */
    SELECT PREF_PRE, FACO_NUMERO, FACO_FECHA, F.TERC_NIT, FACO_IMPTOS, FACO_VENCE, FACO_DTOMONTO, FACO_ADICIONAL, FACO_IVAMONTO,
        FACO_EXTRA, FACO_TOTAL, FACO_RTFTEPORC, FACO_RTFTEMONTO, FACO_RTIVAPOR, FACO_RTIVAMONTO, FACO_RTICAPOR, FACO_RTICAMONTO,
        FACO_RTCREE, FACO_RTCREEM, TERC_NOM, PROV_CTARTFTE, PROV_CTARTIVA, PROV_CTARTICA, PROV_CTARTCREE, PROV_CTAPAGAR, FACO_NUMPROV,
        FACO_ANULADO, 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, :FECAUX, :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(:FECAUX) returning_values (:FECHA);
        EXECUTE PROCEDURE FECHA_A_CONTA(:VENCEAUX) returning_values (:VENCE);
        if (NUMPROV IS NULL) then
            NUMPROV = NUMERO;
        CONCEPTO = 'FC No.' || NUMERO || '-' || SUBSTR(NOMBRE,1,26) || '-NPROV.' || NUMPROV;
        IDC = GEN_ID(ID_CONTABILIZA, 1);
        INSERT INTO CONTABILIZACION (CNTB_ID, CNTB_TIPOCOMP, CNTB_PREFCNT, CNTB_NUMERO, CNTB_FECHA, CNTB_CONCEPTO, CNTB_REF, CNTB_TIPOREF, CNTB_IDREF, CNTB_PREFREF, CNTB_NUMREF, CNTB_PROCESADO)
            VALUES (:IDC, :TIPOCOMP, :PREFCONT, :NUM, :FECHA, :CONCEPTO, '', 21, :IDDOC, :PREFIJO, :NUM, 'N');
        NUMITEMS = 0;
        SUMA = 0;
        NETO = 0;
        ERROR = 0;
        EXECUTE PROCEDURE LEE_CONFIGURACION('COMPRAS', 'FACTURAS', '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 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(21, :IDDOC, :CTAINVEN, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 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 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(21, :IDDOC, :CTAINVEN, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                  if (ERRORC <> 0) then
                    ERROR = ERROR + 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 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(21, :IDDOC, :CTAIVA, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (TIPOCUEN = 'I') then
                    BEGIN
                    FOR SELECT F.ARTI_COD, FCDE_IVAMONTO, (FCDE_CANT * (FCDE_PRUNIT-FCDE_DTOMONTO)), TAIV_PORC, FCDE_CONSUMO
                        FROM ARTICULO A, CONTABIL_ARTICULO C, FACTURAS_COMPRAS_DETALLE F, TARIFA_IVA T WHERE F.FACO_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND COAR_CTAIVAV = :CUENTA AND A.TAIV_COD = T.TAIV_COD
                        INTO :ARTICULO, :IMPTOS, :MONTO, :PORCIVA, :VALORADIC
                    DO
                        BEGIN
                        if (MERCANCIA <> 0) then
                            IMPTOS = CAST(IMPTOS AS DOUBLE PRECISION) * VRSUBT / MERCANCIA;
                        else
                            IMPTOS = 0;
                        if (IMPINC = 'S') then
                            BEGIN
                            MONTO = MONTO - IMPTOS;
                            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(21, :IDDOC, :CTAIVA, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (TIPOCUEN = 'I') then
                    BEGIN
                    FOR SELECT F.ARTI_COD, (FCDE_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 C, FACTURAS_COMPRAS_DETALLE F
                WHERE F.FACO_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD GROUP BY COAR_CTACONS INTO :CTACONSUMO, :IMPTOS
            DO
              if (IMPTOS <> 0) then
                BEGIN
                execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
                EXECUTE PROCEDURE CUENTA_INTERFAZ(21, :IDDOC, :CTACONSUMO, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (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(21, :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, '', :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(21, :IDDOC, :CTADTO, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_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(21, :IDDOC, :CTAADIC, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_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(21, :IDDOC, :CTAEXTRA, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'C') then
                BEGIN
                if (vrextra > 0) then
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_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(21, :IDDOC, :CTARTFTE, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_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 C, FACTURAS_COMPRAS_DETALLE F
            WHERE F.faco_id = :IDDOC AND F.ARTI_COD = C.ARTI_COD
            GROUP BY COAR_CTARTFTE
            INTO :CTARTFTE, :PRTFTE, :baseadic,  :MONTO, :VRRTFTE
            DO
            BEGIN
            MONTO = MONTO * FACTOR * -1;
            if (ABS(MONTO) >= :baseadic) then
                BEGIN
                VRRTFTE = VRRTFTE * FACTOR / 100;
                execute procedure redondee(VRRTFTE, DIG) returning_values (VRRTFTE);
                execute procedure redondee(MONTO, DIG) returning_values (MONTO);
                if (VRRTFTE <> 0) then
                    BEGIN
                    EXECUTE PROCEDURE CUENTA_INTERFAZ(21, :IDDOC, :CTARTFTE, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
                    if (ERRORC <> 0) then
                        ERROR = ERROR + 1;
                    if (TIPOCUEN = 'C') then
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_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(21, :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, '', 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(21, :IDDOC, :CTARTICA, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_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(21, :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, '', 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(21, :IDDOC, :CTACXP, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'C') then
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_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(21, :IDDOC, :CUENTAADIC, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (TIPOCUEN = 'C') then
                    BEGIN
                    if (DBADIC = 'S') then
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_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(21, :IDDOC, :CTAADIC, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (TIPOCUEN = 'C') then
                    BEGIN
                    if (NETO < 0) then
                        BEGIN
                        NETO = NETO * -1;
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_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 (ERROR > 0) then
        VER = 'S';
    SUSPEND;
    END
ELSE
    BEGIN
    EXECUTE PROCEDURE ERROR (21, :IDDOC, :PREFIJO, 1);
    ERROR = ERROR + 1;
    VER = 'S';
    SUSPEND;
    END
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE CONTABIL_FACTCOMP_IVA(
    IDDOC INTEGER,
    IDINTER INTEGER)
RETURNS (
    ERROR INTEGER,
    VER CHAR(1),
    IDC INTEGER)
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 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 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 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 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;
BEGIN
  /* INTERFACE */
  EXISTE = 'N';
  SELECT 'S', TICO_COD, PRCO_PRE, INCO_INVEN, INCO_IVA, INCO_CONSUMO, INCO_CXP, INCO_RTFTE, INCO_RTIVA, INCO_RTICA, INCO_CTAINVEN, INCO_CTAIVA, INCO_CTACONSUMO, INCO_CTADTO, INCO_CTAADIC, INCO_CTAEXTRA, INCO_CTACXP, INCO_CTARTFTE, INCO_CTARTIVA, INCO_CTARTICA, INCO_CONFIRMAR, INCO_CENTRO
    FROM INTERFAZ_COMPRAS WHERE INCO_ID = :IDINTER INTO :EXISTE, :TIPOCOMP, :PREFCONT, :INVEN, :IVA, :CONSUMO, :CXP, :RTFTE, :RTIVA, :RTICA, :CTAINVEN, :CTAIVA, :CTACONSUMO, :CTADTO, :CTAADIC, :CTAEXTRA, :CTACXP, :CTARTFTE, :CTARTIVA, :CTARTICA, :VER, :CENT;
  if (EXISTE = 'S') then
    BEGIN
    /* BORRE CONTABILIZACION PREVIA */
    DELETE FROM CONTABILIZACION WHERE CNTB_TIPOREF = 21 AND CNTB_IDREF = :IDDOC;
    /* ENCABEZADO DE LA FACTURA */
    SELECT PREF_PRE, FACO_NUMERO, FACO_FECHA, F.TERC_NIT, FACO_IMPTOS, FACO_VENCE, FACO_DTOMONTO, FACO_ADICIONAL, FACO_IVAMONTO, FACO_EXTRA, FACO_TOTAL, FACO_RTFTEPORC, FACO_RTFTEMONTO, FACO_RTIVAPOR, FACO_RTIVAMONTO, FACO_RTICAPOR, FACO_RTICAMONTO, TERC_NOM, PROV_CTARTFTE, PROV_CTARTIVA, PROV_CTARTICA, PROV_CTAPAGAR, FACO_NUMPROV, FACO_ANULADO
        FROM FACTURAS_COMPRA F, TERCEROS T, PROVEEDORES P WHERE FACO_ID = :IDDOC AND F.TERC_NIT = T.TERC_NIT AND T.TERC_NIT = P.TERC_NIT
        INTO :PREFIJO, :NUM, :FECAUX, :NIT, :IMPINC, :VENCEAUX, :VRDTO, :VRADIC, :VRIVA, :VREXTRA, :VRTOTAL, :PRTFTE, :VRRTFTE, :PORC, :VRRTIVA, :PRTICA, :VRRTICA, :NOMBRE, TCTARTFTE, TCTARTIVA, TCTARTICA, TCTAPROV, :NUMPROV, :ANULADO;
    /* 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(:FECAUX) returning_values (:FECHA);
        EXECUTE PROCEDURE FECHA_A_CONTA(:VENCEAUX) returning_values (:VENCE);
        if (NUMPROV IS NULL) then
            NUMPROV = NUMERO;
        CONCEPTO = 'FC No.' || NUMERO || '-' || SUBSTR(NOMBRE,1,26) || '-NPROV.' || NUMPROV;
        IDC = GEN_ID(ID_CONTABILIZA, 1);
        INSERT INTO CONTABILIZACION (CNTB_ID, CNTB_TIPOCOMP, CNTB_PREFCNT, CNTB_NUMERO, CNTB_FECHA, CNTB_CONCEPTO, CNTB_REF, CNTB_TIPOREF, CNTB_IDREF, CNTB_PREFREF, CNTB_NUMREF, CNTB_PROCESADO)
            VALUES (:IDC, :TIPOCOMP, :PREFCONT, :NUM, :FECHA, :CONCEPTO, '', 21, :IDDOC, :PREFIJO, :NUM, 'N');
        NUMITEMS = 0;
        SUMA = 0;
        NETO = 0;
        ERROR = 0;
        EXECUTE PROCEDURE LEE_CONFIGURACION('COMPRAS', 'FACTURAS', '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 = 'GENERAL' AND CONF_PROPIEDAD = 'REDONDEO AL MULTIPLO DE DIEZ EN TOTALES' INTO :DIG;
        if (INVEN = 'A') then
            BEGIN
            FOR SELECT MAX(TAIV_CTACOMP), SUM(CAST(FCDE_CANT AS DOUBLE PRECISION) * (FCDE_PRUNIT-FCDE_DTOMONTO)), SUM(FCDE_IVAMONTO), SUM(FCDE_CONSUMO), MAX(F.BODE_COD)
                FROM TARIFA_IVA T, FACTURAS_COMPRAS_DETALLE F WHERE F.FACO_ID = :IDDOC AND F.fcde_ivaporc = T.taiv_porc
                GROUP BY TAIV_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(21, :IDDOC, :CTAINVEN, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (TIPOCUEN = 'I') then
                    BEGIN
                    FOR SELECT F.ARTI_COD, (FCDE_CANT * (FCDE_PRUNIT-FCDE_DTOMONTO)), FCDE_IVAMONTO, FCDE_CONSUMO
                        FROM ARTICULO A, CONTABIL_ARTICULO C, FACTURAS_COMPRAS_DETALLE F WHERE F.FACO_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND COAR_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
                        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(21, :IDDOC, :CTAINVEN, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                  if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                  if (TIPOCUEN = 'I') 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') then
            BEGIN
            FOR SELECT MAX(TAIV_CTAIVACMP), SUM(FCDE_IVAMONTO), SUM(CAST(FCDE_CANT AS DOUBLE PRECISION) * (FCDE_PRUNIT-FCDE_DTOMONTO)), SUM(FCDE_CONSUMO)
                FROM TARIFA_IVA T, FACTURAS_COMPRAS_DETALLE F
                WHERE F.FACO_ID = :IDDOC AND F.fcde_ivaporc = T.taiv_porc AND FCDE_IVAMONTO <> 0
                GROUP BY TAIV_CTAIVACMP
                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
                MONTO = CAST(MONTO AS DOUBLE PRECISION) * VRSUBT / MERCANCIA;
                execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
                execute procedure redondee(MONTO, DIG) returning_values (MONTO);
                EXECUTE PROCEDURE CUENTA_INTERFAZ(21, :IDDOC, :CTAIVA, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (TIPOCUEN = 'I') then
                    BEGIN
                    FOR SELECT F.ARTI_COD, FCDE_IVAMONTO, (FCDE_CANT * (FCDE_PRUNIT-FCDE_DTOMONTO)), TAIV_PORC, FCDE_CONSUMO
                        FROM ARTICULO A, CONTABIL_ARTICULO C, FACTURAS_COMPRAS_DETALLE F, TARIFA_IVA T WHERE F.FACO_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND COAR_CTAIVAV = :CUENTA AND A.TAIV_COD = T.TAIV_COD
                        INTO :ARTICULO, :IMPTOS, :MONTO, :PORCIVA, :VALORADIC
                    DO
                        BEGIN
                        IMPTOS = CAST(IMPTOS AS DOUBLE PRECISION) * VRSUBT / MERCANCIA;
                        if (IMPINC = 'S') then
                            BEGIN
                            MONTO = MONTO - IMPTOS;
                            if (FOMENTO <> 'SI' ) then
                                MONTO = MONTO - VALORADIC;
                            END
                        MONTO = CAST(MONTO AS DOUBLE PRECISION) * VRSUBT / MERCANCIA;
                        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') 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
                IMPTOS = CAST(IMPTOS AS DOUBLE PRECISION) * VRSUBT / MERCANCIA;
                if (IMPINC = 'S') then
                    BEGIN
                    MONTO = MONTO - IMPTOS;
                    if (FOMENTO <> 'SI' ) then
                        MONTO = MONTO - VALORADIC;
                    END
                MONTO = CAST(MONTO AS DOUBLE PRECISION) * VRSUBT / MERCANCIA;
                execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
                execute procedure redondee(MONTO, DIG) returning_values (MONTO);
                EXECUTE PROCEDURE CUENTA_INTERFAZ(21, :IDDOC, :CTAIVA, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (TIPOCUEN = 'I') then
                    BEGIN
                    FOR SELECT F.ARTI_COD, (FCDE_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
                        IMPTOS = CAST(IMPTOS AS DOUBLE PRECISION) * VRSUBT / MERCANCIA;
                        if (IMPINC = 'S') then
                            BEGIN
                            MONTO = MONTO - IMPTOS;
                            if (FOMENTO <> 'SI' ) then
                                MONTO = MONTO - VALORADIC;
                            END
                        MONTO = CAST(MONTO AS DOUBLE PRECISION) * VRSUBT / MERCANCIA;
                        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 C, FACTURAS_COMPRAS_DETALLE F
                WHERE F.FACO_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD GROUP BY COAR_CTACONS INTO :CTACONSUMO, :IMPTOS
            DO
              if (IMPTOS <> 0) then
                BEGIN
                execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
                EXECUTE PROCEDURE CUENTA_INTERFAZ(21, :IDDOC, :CTACONSUMO, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (FOMENTO <> 'SI') then
                    BEGIN
                    if (TIPOCUEN = 'I') then
                        BEGIN
                        FOR SELECT F.ARTI_COD, FCDE_CONSUMO FROM ARTICULO A, FACTURAS_COMPRAS_DETALLE F WHERE F.FACO_ID = :IDDOC INTO :ARTICULO, :IMPTOS
                            DO
                            BEGIN
                            if (IMPTOS <> 0) then
                                BEGIN
                                execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
                                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_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;
                                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, :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 = 'I') then
                        BEGIN
                        FOR SELECT F.ARTI_COD, FCDE_CONSUMO FROM ARTICULO A, FACTURAS_COMPRAS_DETALLE F WHERE F.FACO_ID = :IDDOC INTO :ARTICULO, :IMPTOS
                            DO
                            BEGIN
                            if (IMPTOS <> 0) then
                                BEGIN
                                execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
                                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_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, :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, :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(21, :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 = 'I') then
                    BEGIN
                    /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                    FOR SELECT F.ARTI_COD, FCDE_CONSUMO FROM ARTICULO A, FACTURAS_COMPRAS_DETALLE F WHERE F.FACO_ID = :IDDOC INTO :ARTICULO, :IMPTOS
                        DO
                        BEGIN
                        if (IMPTOS <> 0) then
                            BEGIN
                            execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
                            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_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;
                            NETO = NETO + IMPTOS;
                            END
                        END
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    /* INSERTE EL REGISTRO DE LA BASE */
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_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 = 'I') then
                    BEGIN
                    /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                    FOR SELECT F.ARTI_COD, FCDE_CONSUMO FROM ARTICULO A, FACTURAS_COMPRAS_DETALLE F WHERE F.FACO_ID = :IDDOC INTO :ARTICULO, :IMPTOS
                        DO
                        BEGIN
                        if (IMPTOS <> 0) then
                            BEGIN
                           execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
                           INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_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, :ARTICULO, 0, 0);
                            NUMITEMS = NUMITEMS + 1;
                            NETO = NETO - IMPTOS;
                            END
                        END
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    /* INSERTE EL REGISTRO DE LA BASE */
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_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(21, :IDDOC, :CTADTO, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_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(21, :IDDOC, :CTAADIC, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_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(21, :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, :VENCE, NULL, 0, 21);
                NUMITEMS = NUMITEMS + 1;
                NETO = NETO + 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, :NUMITEMS, :CUENTA, :CONCEPTO, '', :VREXTRA, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NUMITEMS = NUMITEMS + 1;
                NETO = NETO + VREXTRA;
                END
            end
          END

        /* DESCUENTE EL IMPOCONSUMO */
        SELECT SUM(FCDE_CONSUMO) FROM FACTURAS_COMPRAS_DETALLE F WHERE F.FACO_ID = :IDDOC INTO :IMPTOS;
        if (IMPTOS IS NULL) then
            IMPTOS = 0;
        vrsubt = vrsubt - IMPTOS;
        /* RETENCION FUENTE */
        if ((RTFTE = 'P') or (RTFTE = 'K')) then
          BEGIN
          execute procedure redondee(VRRTFTE, DIG) returning_values (VRRTFTE);
          if (VRRTFTE <> 0) then
            begin
            if (RTFTE = 'P') then
                CTARTFTE = TCTARTFTE;
            EXECUTE PROCEDURE CUENTA_INTERFAZ(21, :IDDOC, :CTARTFTE, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_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 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 (MONTO >= :baseadic) then
                BEGIN
                VRRTFTE = VRRTFTE * FACTOR / 100;
                execute procedure redondee(VRRTFTE, DIG) returning_values (VRRTFTE);
                execute procedure redondee(MONTO, DIG) returning_values (MONTO);
                if (VRRTFTE <> 0) then
                    BEGIN
                    EXECUTE PROCEDURE CUENTA_INTERFAZ(21, :IDDOC, :CTARTFTE, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
                    if (ERRORC <> 0) then
                        ERROR = ERROR + 1;
                    if (TIPOCUEN = 'C') then
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :VRRTFTE, :VRSUBT, :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, :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(21, :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, '', 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(21, :IDDOC, :CTARTICA, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_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
        /* CIERRE EL COMPROBANTE CONTRA LA CUENTA DEL TERCERO O LA CONSTANTE */
        if ((CXP = 'P') or (CXP = 'K')) then
            BEGIN
            SUMA = VRTOTAL - SUMA;
            execute procedure redondee(SUMA, DIG) returning_values (SUMA);
            if (CXP = 'P') then
                CTACXP = TCTAPROV;
            EXECUTE PROCEDURE CUENTA_INTERFAZ(21, :IDDOC, :CTACXP, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'C') then
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_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(21, :IDDOC, :CUENTAADIC, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (TIPOCUEN = 'C') then
                    BEGIN
                    if (DBADIC = 'S') then
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_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(21, :IDDOC, :CTAADIC, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (TIPOCUEN = 'C') then
                    BEGIN
                    if (NETO < 0) then
                        BEGIN
                        NETO = NETO * -1;
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_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 (ERROR > 0) then
        VER = 'S';
    SUSPEND;
    END
ELSE
    BEGIN
    EXECUTE PROCEDURE ERROR (21, :IDDOC, :PREFIJO, 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))
            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 ERROR (31, :IDDOC, :CTARTFTE, 2);
                CUENTA = CTARTFTE;
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                end
            if ((TIPOCUEN = 'I') or (TIPOCUEN = 'A')) then
                begin
                EXECUTE PROCEDURE ERROR (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 ERROR (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 ERROR (31, :IDDOC, :PREF, 1);
    ERROR = ERROR + 1;
    VER = 'S';
    SUSPEND;
    END
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE CONTABIL_FACTURAS_CONTADO(
    FECFAC DATE,
    NIT VARCHAR(20),
    PREF VARCHAR(4),
    PTVTA INTEGER,
    IDINTER INTEGER)
RETURNS (
    ERROR INTEGER,
    VER CHAR(1),
    IDC INTEGER)
AS
declare variable num varchar(8);
declare variable numero varchar(10);
declare variable fecha char(8);
declare variable conc char(120);
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 nombre varchar(60);
declare variable proy varchar(4);
declare variable centro varchar(4);
declare variable porc numeric(5,2);
declare variable porcajus numeric(9,2);
declare variable debito numeric(18,2);
declare variable credito numeric(18,2);
declare variable nroi integer;
declare variable art 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 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 dig integer;
declare variable mercancia numeric(18,2);
declare variable factor double precision;
declare variable cent char(1);
declare variable factoraj double precision;
BEGIN
/* 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 = 0;
  /* BUSQUE EL CENTRO DEL PUNTO, LA BODEGA, O EL PREFIJO  */
  IF (CENT = 'B') THEN
    SELECT B.BODE_CENTRO, B.BODE_PROY FROM BODEGA B, PUNTO_VENTA P
        WHERE B.BODE_COD = P.BODE_COD AND P.ptvt_id = :ptvta INTO :CENTRO, :PROY;
  IF (CENT = 'V') THEN
    SELECT MAX(V.CENT_COD), MAX(V.PROY_COD) FROM VENDEDORES V
        WHERE V.PTVT_ID = :PTVTA INTO :CENTRO, :PROY;
  IF (CENT = 'P') THEN
    SELECT P.PREF_PROY, P.PREF_CENTRO FROM PREFIJOS P
        WHERE P.PREF_PRE = :PREF AND P.TIDO_COD = 31 INTO :CENTRO, :PROY;
  /* TRAIGA LOS DATOS DEL CLIENTE */
  SELECT TERC_NOM, TERC_CTARTFTE, TERC_CTARTIVA, TERC_CTARTICA, TERC_CTAVENTA, TERC_CTACLIENTE
        FROM TERCEROS T WHERE TERC_NIT = :NIT
        INTO :NOMBRE, TCTARTFTE, TCTARTIVA, TCTARTICA, TCTAVENTA, TCTACLIEN;
  SELECT SUM(FACT_DTOMONTO), SUM(FACT_ADICIONAL), SUM(FACT_IVAMONTO), SUM(FACT_EXTRA), SUM(FACT_TOTAL), SUM(FACT_RTFTEMONTO), SUM(FACT_RTIVAMONTO), SUM(FACT_RTICAMONTO), MAX(FACT_IVAINC)
        FROM FACTURAS F WHERE FACT_FECHA = :FECFAC AND FACT_ANULADO = 'N' AND PTVT_ID = :ptvta AND PREF_PRE = :PREF
        INTO :VRDTO, :VRADIC, :VRIVA, :VREXTRA, :VRTOTAL, :VRRTFTE, :VRRTIVA, :VRRTICA, :impinc;
  VRSUBT = VRTOTAL - VREXTRA - VRIVA; /* BASE DE RETEFTE Y RETEICA */
  MERCANCIA = VRSUBT - VRADIC + VRDTO;
  EXECUTE PROCEDURE FECHA_A_CONTA(:FECFAC) returning_values (:FECHA);
  VENCE = FECHA;
  /* REGISTRE EL ENCABEZADO CONTABLE */
  IDC = GEN_ID(ID_CONTABILIZA, 1);
  CONC = 'RESUMEN VENTAS ' || FECHA;
  NUM = SUBSTR(FECHA, 3, 8);
  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, '', 0, 0, :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), SUM(FADE_IVAMONTO+FADE_CONSUMO), MAX(TAIV_PORC)
            FROM ARTICULO A, CONTABIL_ARTICULO C, FACTURAS_DETALLE FD, FACTURAS F, tarifa_iva T
            WHERE F.FACT_ID = FD.FACT_ID AND FACT_FECHA = :FECFAC AND FD.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND A.taiv_cod = T.taiv_cod AND 
            F.PREF_PRE = :PREF AND F.PTVT_ID = :PTVTA AND FACT_ANULADO = 'N' AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
            GROUP BY COAR_CTAVNT, T.taiv_porc
            INTO :CTAVENTAS, :MONTO, :IMPTOS, :porcajus
            DO
            BEGIN
            if (IMPINC = 'S') then
                MONTO = MONTO - IMPTOS;
            factoraj = null;
            SELECT AJCI_FACTOR FROM AJUSTE_CIERRE
                WHERE AJCI_PORC = :porcajus AND AJCI_FECINI <= :fecfac AND AJCI_FECFIN >= :fecfac
                INTO :factoraj;
            if (factoraj is not null) then
                MONTO = MONTO * factoraj;

            if ((CTADTO IS NULL) OR (CTADTO = '')) then
                MONTO = MONTO * FACTOR;
            execute procedure redondee(MONTO, DIG) returning_values (MONTO);
            if (MONTO <> 0) then
                BEGIN
                CUENTA = NULL;
                SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                    WHERE CUEN_COD = :CTAVENTAS INTO :CUENTA, :TIPOCUEN;
                if (CUENTA IS NULL) then
                    begin
                    EXECUTE PROCEDURE ERROR (31, 0, :CTAVENTAS, 2);
                    CUENTA = CTAVENTAS;
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    end
                if (TIPOCUEN = 'I') then
                    BEGIN
                    /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                    FOR SELECT FD.ARTI_COD, (FADE_TOTAL), (FADE_IVAMONTO+FADE_CONSUMO)
                        FROM ARTICULO A, CONTABIL_ARTICULO C, FACTURAS_DETALLE FD, FACTURAS F
                        WHERE F.FACT_ID = FD.FACT_ID AND FACT_FECHA = :FECFAC AND F.PREF_PRE = :PREF AND F.PTVT_ID = :PTVTA AND FD.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND COAR_CTAINV = :CUENTA AND FACT_ANULADO = 'N' AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
                        INTO :ART, :MONTO, :IMPTOS
                    DO
                        BEGIN
                        if (IMPINC = 'S') 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), SUM(FADE_IVAMONTO+FADE_CONSUMO)
            FROM FACTURAS_DETALLE FD, FACTURAS F
            WHERE F.FACT_ID = FD.FACT_ID AND FACT_FECHA = :FECFAC AND F.PREF_PRE = :PREF AND F.PTVT_ID = :PTVTA AND FACT_ANULADO = 'N' AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
            INTO :MONTO, :IMPTOS;
        if (IMPINC = 'S') 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
            CUENTA = NULL;
            SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :CTAVENTAS INTO :CUENTA, :TIPOCUEN;
            if (CUENTA IS NULL) then
                begin
                EXECUTE PROCEDURE ERROR (31, 0, :CTAVENTAS, 2);
                CUENTA = CTAVENTAS;
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'I') then
                BEGIN
                /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                FOR SELECT FD.ARTI_COD, FADE_TOTAL, (FADE_IVAMONTO+FADE_CONSUMO)
                    FROM /*ARTICULO A,*/ FACTURAS_DETALLE FD, FACTURAS F
                    WHERE F.FACT_ID = FD.FACT_ID AND FACT_FECHA = :FECFAC AND F.PREF_PRE = :PREF AND F.PTVT_ID = :PTVTA AND FACT_ANULADO = 'N' AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
                    INTO :ART, :MONTO, :IMPTOS
                    DO
                    BEGIN
                    if (IMPINC = 'S') 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 /* 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), sum(FADE_CONSUMO), MAX(TAIV_PORC)
            FROM ARTICULO A, CONTABIL_ARTICULO C, FACTURAS_DETALLE FD, FACTURAS F, TARIFA_IVA T
            WHERE F.FACT_ID = FD.FACT_ID AND FACT_FECHA = :FECFAC AND F.PREF_PRE = :PREF AND F.PTVT_ID = :PTVTA AND A.taiv_cod = T.taiv_cod AND
            FD.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND FACT_ANULADO = 'N' AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
            GROUP BY COAR_CTAIVAV, T.taiv_porc
            INTO :CTAIVA, :IMPTOS, :MONTO, :VALORADIC, :porcajus
        DO
            BEGIN
            if (IMPINC = 'S') then
                MONTO = MONTO - IMPTOS - VALORADIC;
            MONTO = MONTO * -1;

            factoraj = null;
            SELECT AJCI_FACTOR FROM AJUSTE_CIERRE
                WHERE AJCI_PORC = :porcajus AND AJCI_FECINI <= :fecfac AND AJCI_FECFIN >= :fecfac
                INTO :factoraj;
            if (factoraj is not null) then
                BEGIN
                MONTO = MONTO * factoraj;
                IMPTOS = IMPTOS * factoraj;
                END

            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
                CUENTA = NULL;
                SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                    WHERE CUEN_COD = :CTAIVA INTO :CUENTA, :TIPOCUEN;
                if (CUENTA IS NULL) then
                    begin
                    EXECUTE PROCEDURE ERROR (31, 0, :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 FD.ARTI_COD, FADE_IVAMONTO, FADE_TOTAL, TAIV_PORC, FADE_CONSUMO
                        FROM ARTICULO A, CONTABIL_ARTICULO C, FACTURAS_DETALLE FD, FACTURAS F, TARIFA_IVA T
                        WHERE F.FACT_ID = FD.FACT_ID AND FACT_FECHA = :FECFAC AND F.PREF_PRE = :PREF AND F.PTVT_ID = :PTVTA AND FD.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND COAR_CTAIVAV = :CUENTA AND A.TAIV_COD = T.TAIV_COD AND FACT_ANULADO = 'N' AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
                        INTO :ART, :IMPTOS, :MONTO, :PORCIVA, :VALORADIC
                    DO
                        BEGIN
                        if (IMPINC = 'S') then
                            MONTO = MONTO - IMPTOS - 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), SUM(FADE_CONSUMO)
            FROM FACTURAS_DETALLE FD, FACTURAS F
            WHERE F.FACT_ID = FD.FACT_ID AND FACT_FECHA = :FECFAC AND F.PREF_PRE = :PREF AND F.PTVT_ID = :PTVTA AND FACT_ANULADO = 'N' AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
            INTO :IMPTOS, :MONTO, :valoradic;
        if (IMPINC = 'S') then
            MONTO = MONTO - IMPTOS - 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
            CUENTA = NULL;
            SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :CTAIVA INTO :CUENTA, :TIPOCUEN;
            if (CUENTA IS NULL) then
                begin
                EXECUTE PROCEDURE ERROR (31, 0, :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 FD.ARTI_COD, FADE_TOTAL, FADE_IVAMONTO, TAIV_PORC, FADE_CONSUMO
                    FROM ARTICULO A, FACTURAS_DETALLE FD, FACTURAS F, TARIFA_IVA T
                    WHERE F.FACT_ID = FD.FACT_ID AND FACT_FECHA = :FECFAC AND F.PREF_PRE = :PREF AND F.PTVT_ID = :PTVTA AND FD.arti_cod = A.arti_cod AND T.TAIV_COD=A.TAIV_COD AND FACT_ANULADO = 'N' AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
                    INTO :ART, :MONTO, :IMPTOS, :PORCIVA, :VALORADIC
                    DO
                    BEGIN
                    if (IMPINC = 'S') then
                        MONTO = MONTO - IMPTOS - 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') then
        BEGIN
        FOR SELECT MAX(COAR_CTACONS), SUM(FADE_CONSUMO)
            FROM ARTICULO A, CONTABIL_ARTICULO C, FACTURAS_DETALLE FD, FACTURAS F
            WHERE F.FACT_ID = FD.FACT_ID AND FACT_FECHA = :FECFAC AND F.PREF_PRE = :PREF AND F.PTVT_ID = :PTVTA AND FD.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND FACT_ANULADO = 'N' 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
                CUENTA = NULL;
                SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                    WHERE CUEN_COD = :CTACONSUMO INTO :CUENTA, :TIPOCUEN;
                if (CUENTA IS NULL) then
                    begin
                    EXECUTE PROCEDURE ERROR (31, 0, :CTACONSUMO, 2);
                    CUENTA = CTACONSUMO;
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    end
                if (TIPOCUEN = 'I') then
                    BEGIN
                    /* ES UNA CUENTA DE INVENTARIO, REGISTRE UNO A UNO LOS ARTICULOS */
                    FOR SELECT FD.ARTI_COD, FADE_CONSUMO
                        FROM ARTICULO A, CONTABIL_ARTICULO C, FACTURAS_DETALLE FD, FACTURAS F
                        WHERE F.FACT_ID = FD.FACT_ID AND FACT_FECHA = :FECFAC AND F.PREF_PRE = :PREF AND F.PTVT_ID = :PTVTA AND FD.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND COAR_CTACONS = :CUENTA AND FACT_ANULADO = 'N' 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 - CREDITO;
                    END
                END /* IMPTOS <> 0 */
            END /* FOR */
        END /* CONSUMO X ARTICULO */
    if (CONSUMO = 'K') then /* CONSUMO EN CTA CONSTANTE */
        BEGIN
        SELECT SUM(FADE_CONSUMO)
            FROM FACTURAS_DETALLE FD, FACTURAS F
            WHERE F.FACT_ID = FD.FACT_ID AND FACT_FECHA = :FECFAC AND F.PREF_PRE = :PREF AND F.PTVT_ID = :PTVTA AND FACT_ANULADO = 'N' AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
            INTO :IMPTOS;
        execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
        if (IMPTOS <> 0) then
            BEGIN
            CUENTA = NULL;
            SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :CTACONSUMO INTO :CUENTA, :TIPOCUEN;
            if (CUENTA IS NULL) then
                begin
                EXECUTE PROCEDURE ERROR (31, 0, :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 FD.ARTI_COD, FADE_CONSUMO
                    FROM /*ARTICULO A,*/ FACTURAS_DETALLE FD, FACTURAS F
                    WHERE F.FACT_ID = FD.FACT_ID AND FACT_FECHA = :FECFAC AND F.PREF_PRE = :PREF AND F.PTVT_ID = :PTVTA AND FACT_ANULADO = 'N' 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
            CUENTA = NULL;
            SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :CTADTO INTO :CUENTA, :TIPOCUEN;
            if (CUENTA IS NULL) then
                begin
                EXECUTE PROCEDURE ERROR (31, 0, :CTADTO, 2);
                CUENTA = CTADTO;
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'I') then
                begin
                EXECUTE PROCEDURE ERROR (31, 0, :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, '', :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
            CUENTA = NULL;
            SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :CTAADIC INTO :CUENTA, :TIPOCUEN;
            if (CUENTA IS NULL) then
                begin
                EXECUTE PROCEDURE ERROR (31, 0, :CTAADIC, 2);
                CUENTA = CTAADIC;
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'I') then
                begin
                EXECUTE PROCEDURE ERROR (31, 0, :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, :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
            CUENTA = NULL;
            SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :CTAEXTRA INTO :CUENTA, :TIPOCUEN;
            if (CUENTA IS NULL) then
                begin
                EXECUTE PROCEDURE ERROR (31, 0, :CTAEXTRA, 2);
                CUENTA = CTAEXTRA;
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'I') then
                begin
                EXECUTE PROCEDURE ERROR (31, 0, :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, :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 */
    /* 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;
        CUENTA = NULL;
        SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
            WHERE CUEN_COD = :CTARTFTE INTO :CUENTA, :TIPOCUEN;
        if (CUENTA IS NULL) then
            begin
            EXECUTE PROCEDURE ERROR (31, 0, :CTARTFTE, 2);
            CUENTA = CTARTFTE;
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            begin
            EXECUTE PROCEDURE ERROR (31, 0, :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, '', :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
        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;
        CUENTA = NULL;
        SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
            WHERE CUEN_COD = :CTARTIVA INTO :CUENTA, :TIPOCUEN;
        if (CUENTA IS NULL) then
            begin
            EXECUTE PROCEDURE ERROR (31, 0, :CTARTIVA, 2);
            CUENTA = CTARTIVA;
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            begin
            EXECUTE PROCEDURE ERROR (31, 0, :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, '', :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;
        CUENTA = NULL;
        SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
            WHERE CUEN_COD = :CTARTICA INTO :CUENTA, :TIPOCUEN;
        if (CUENTA IS NULL) then
            begin
            EXECUTE PROCEDURE ERROR (31, 0, :CTARTICA, 2);
            CUENTA = CTARTICA;
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            begin
            EXECUTE PROCEDURE ERROR (31, 0, :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, '', :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
        CUENTA = NULL;
        SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
            WHERE CUEN_COD = :CTACARTERA INTO :CUENTA, :TIPOCUEN;
        if (CUENTA IS NULL) then
            begin
            EXECUTE PROCEDURE ERROR (31, 0, :CTACARTERA, 2);
            CUENTA = CTACARTERA;
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            begin
            EXECUTE PROCEDURE ERROR (31, 0, :CUENTA, 3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'C') then
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_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 LOS COSTOS */
    EXECUTE PROCEDURE costo_en_ventas_contado(:fecfac,  :pref, :ptvta);
    if (COSTOS = 'A') then
        BEGIN
        FOR SELECT MAX(CTACOS), SUM(COSTO)
            FROM COSTO_VENTAS WHERE TIDO_COD = 31 AND COVE_ID = 0
            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
                    EXECUTE PROCEDURE ERROR (31, 0, :CTACOSTOS, 2);
                    CUENTA = CTARTFTE;
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    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 = 0 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(COSTO)
            FROM COSTO_VENTAS  WHERE TIDO_COD = 31 AND COVE_ID = 0
            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
                EXECUTE PROCEDURE ERROR (31, 0, :CTACOSTOS, 2);
                CUENTA = CTARTFTE;
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                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 = 0
                    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(COSTO)
            FROM COSTO_VENTAS  WHERE TIDO_COD = 31 AND COVE_ID = 0
            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
                    EXECUTE PROCEDURE ERROR (31, 0, :CTAINVEN, 2);
                    CUENTA = CTAINVEN;
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    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 = 0 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(COSTO)
            FROM COSTO_VENTAS WHERE TIDO_COD = 31 AND COVE_ID = 0
            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
                EXECUTE PROCEDURE ERROR (31, 0, :CTAINVEN, 2);
                CUENTA = CTAINVEN;
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                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 = 0
                    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
            CUENTA = NULL;
            SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :CTADIC INTO :CUENTA, :TIPOCUEN;
            if (CUENTA IS NULL) then
                begin
                EXECUTE PROCEDURE ERROR (31, 0, :CTADIC, 2);
                CUENTA = CTADIC;
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'I') then
                begin
                EXECUTE PROCEDURE ERROR (31, 0, :CUENTA, 3);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                end
            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 /* EXISTE LA INTERFAZ */
ELSE
    BEGIN
    EXECUTE PROCEDURE ERROR (31, 0, :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 ERROR (31, :IDDOC, :CTARTFTE, 2);
                CUENTA = CTARTFTE;
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'I') then
                begin
                EXECUTE PROCEDURE ERROR (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 ERROR (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 ERROR (31, :IDDOC, :CTARTFTE, 2);
                CUENTA = CTARTFTE;
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'I') then
                begin
                EXECUTE PROCEDURE ERROR (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 ERROR (31, :IDDOC, :PREF, 1);
    ERROR = ERROR + 1;
    VER = 'S';
    SUSPEND;
    END
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE CONTABIL_MANIFIESTO(
    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 TIPOCOMP VARCHAR(3);
declare variable PREFCONT VARCHAR(4);
declare variable CXPAGAR CHAR(1);
declare variable CTAPAGAR VARCHAR(20);
declare variable CTAPAGARF VARCHAR(20);
declare variable CTACONCEPTO 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 NITASOC VARCHAR(20);
declare variable PROY VARCHAR(4);
declare variable CENTRO VARCHAR(4);
declare variable NROI INTEGER;
declare variable SUMA NUMERIC(18,2);
declare variable SUMACAJA NUMERIC(18,2);
declare variable SEGURO NUMERIC(18,2);
declare variable CTASEGURO VARCHAR(20);
declare variable CTACONTRAE VARCHAR(20);
declare variable FORMA CHAR(1);
declare variable ANTICIPO NUMERIC(18,2);
declare variable CTAANTICIPO VARCHAR(20);
declare variable INGRESO NUMERIC(18,2);
declare variable CTAINGRESO VARCHAR(20);
declare variable RETENCION NUMERIC(18,2);
declare variable FONDOM NUMERIC(18,2);
declare variable CTARETENCION VARCHAR(20);
declare variable PORCRTF NUMERIC(9,2);
declare variable BASE NUMERIC(18,2);
BEGIN
/* BUSQUE LA INTERFACE */
EXISTE = 'N';
SELECT 'S', TICO_COD, PRCO_PREF, INTR_CONFIRMAR, INTR_CXPAGAR, INTR_CTAPAGAR, intr_ctartfte,
    INTR_CTAINGREM, INTR_CTASEGURO, intr_ctacontrae
    FROM interfaz_transporte
    WHERE INTR_ID = :IDINTER
    INTO :EXISTE, :TIPOCOMP, :PREFCONT, :VER, :CXPAGAR, :CTAPAGAR, :ctaretencion,
        :ctaingreso, :ctaseguro, :ctacontrae;
if (EXISTE = 'S') then
    BEGIN
    DELETE FROM contabilizacion WHERE CNTB_TIPOREF = 89 AND CNTB_IDREF = :IDDOC;

    /* TRAIGA EL ENCABEZADO  */
    SELECT MANC_PREF, MANC_NUMERO, MANC_FECHA, TERC_NIT, MANC_ANTICIPO, MANC_INGRESO, MANC_RTFTEM, MANC_DESCTO, MANC_RTFTEP
        FROM manifiesto_carga M, vehiculos v WHERE MANC_ID = :IDDOC AND M.manc_vehiculo = V.vehi_cod
        INTO :PREF, :NUM, :FECAUX, :NITASOC, :ANTICIPO, :INGRESO, :RETENCION, :FONDOM, :porcrtf;
    NUMERO = PREF || NUM;
    SELECT PREF_CENTRO, PREF_PROY FROM prefijos P, manifiesto_carga M
        WHERE P.pref_pre = M.manc_pref AND M.manc_id = :IDDOC AND P.tido_cod = 89
        INTO :CENTRO, :PROY;
    EXECUTE PROCEDURE FECHA_A_CONTA(:FECAUX) returning_values (:FECHA);
    /* REGISTRE EL ENCABEZADO CONTABLE */
    CONC = 'MANIFIESTO DE CARGA No. ' || :NUMERO;
    IDC = GEN_ID(ID_CONTABILIZA, 1);
    INSERT INTO CONTABILIZACION (CNTB_ID, CNTB_TIPOCOMP, CNTB_PREFCNT, CNTB_NUMERO, CNTB_FECHA, CNTB_CONCEPTO, CNTB_REF, CNTB_TIPOREF, CNTB_IDREF, CNTB_PREFREF, CNTB_NUMREF, CNTB_PROCESADO)
        VALUES (:IDC, :TIPOCOMP, :PREFCONT, :NUM, :FECHA, :CONC, '', 89, :IDDOC, :PREF, :NUM, 'N');
    NROI = 0;
    ERROR = 0;

    suma = 0;
    for SELECT sum(MNCD_VALOR), SUM(CGRM_SEGURO), max(f.fprm_ctacosto), max(f.fprm_ctaseguro), max(r.cgrm_fpago)
        FROM carga_remesa R, manifiesto_carga_det M, forma_pago_remesa f
        WHERE M.mncd_remesa = R.cgrm_id and R.cgrm_fpago = f.fprm_cod and M.manc_id = :iddoc
        group by r.cgrm_fpago
        INTO :sumacaja, :seguro, :ctapagarf, :ctaseguro, :forma
        do
        begin
        if (sumacaja <> 0) then
            BEGIN
            CUENTA = NULL;
            SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :ctapagarf INTO :CUENTA, :TIPOCUEN;
            if (CUENTA IS NULL) then
                begin
                EXECUTE PROCEDURE ERROR (89, :IDDOC, :ctapagarf, 2);
                CUENTA = ctapagarf;
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'I') then
                BEGIN
                EXECUTE PROCEDURE ERROR (89, :IDDOC, :CUENTA, 3);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                EXECUTE PROCEDURE ERROR (89, :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, :NROI, :CUENTA, :CONC, '', :sumacaja, 0, 0, 0, :nitasoc, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA + sumacaja;
                END
            END
        if (FORMA = 'E') then
            BEGIN
            CUENTA = NULL;
            SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :ctaseguro INTO :CUENTA, :TIPOCUEN;
            if (CUENTA IS NULL) then
                begin
                EXECUTE PROCEDURE ERROR (89, :IDDOC, :ctaseguro, 2);
                CUENTA = ctaseguro;
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'I') then
                BEGIN
                EXECUTE PROCEDURE ERROR (89, :IDDOC, :CUENTA, 3);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                EXECUTE PROCEDURE ERROR (89, :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, :NROI, :CUENTA, :CONC, '', 0, :seguro, 0, 0, :nitasoc, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA - seguro;
                END
            CUENTA = NULL;
            SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :ctacontrae INTO :CUENTA, :TIPOCUEN;
            if (CUENTA IS NULL) then
                begin
                EXECUTE PROCEDURE ERROR (89, :IDDOC, :ctacontrae, 2);
                CUENTA = ctacontrae;
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'I') then
                BEGIN
                EXECUTE PROCEDURE ERROR (89, :IDDOC, :CUENTA, 3);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                EXECUTE PROCEDURE ERROR (89, :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, :NROI, :CUENTA, :CONC, '', 0, :sumacaja, 0, 0, :nitasoc, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA - sumacaja;
                END
            END

        end /* do */
    /* ANTICIPO */
    if (ANTICIPO <> 0) then
        BEGIN
        execute procedure LEE_configuracion('TRANSPORTE', 'GENERAL', 'CUENTA CONTABLE ANTICIPOS EN MANIFIESTO DE CARGA') returning_values (:ctaanticipo);
        CUENTA = NULL;
        SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
            WHERE CUEN_COD = :ctaanticipo INTO :CUENTA, :TIPOCUEN;
        if (CUENTA IS NULL) then
            begin
            EXECUTE PROCEDURE ERROR (89, :IDDOC, :ctaanticipo, 2);
            CUENTA = ctaanticipo;
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            EXECUTE PROCEDURE ERROR (89, :IDDOC, :CUENTA, 3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'C') then
            BEGIN
            EXECUTE PROCEDURE ERROR (89, :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, :NROI, :CUENTA, :CONC, '', 0, :anticipo, 0, 0, :nitasoc, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            SUMA = SUMA - anticipo;
            END
        end /* anticipo */
    /* INGRESO COOPERATIVA */
    if ((INGRESO-FONDOM) <> 0) then
        BEGIN
        CUENTA = NULL;
        SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
            WHERE CUEN_COD = :ctaingreso INTO :CUENTA, :TIPOCUEN;
        if (CUENTA IS NULL) then
            begin
            EXECUTE PROCEDURE ERROR (89, :IDDOC, :ctaingreso, 2);
            CUENTA = ctaingreso;
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            EXECUTE PROCEDURE ERROR (89, :IDDOC, :CUENTA, 3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'C') then
            BEGIN
            EXECUTE PROCEDURE ERROR (89, :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, :NROI, :CUENTA, :CONC, '', 0, (:ingreso-:fondom), 0, 0, :nitasoc, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            SUMA = SUMA - ingreso + fondom;
            END
        end /* INGRESO COOP */
    /* FONDO MUTUAL */
    if (FONDOM <> 0) then
        BEGIN
        execute procedure LEE_configuracion('TRANSPORTE', 'GENERAL', 'CUENTA CONTABLE FONDO MUTUAL EN MANIFIESTO DE CARGA') returning_values (:ctaconcepto);
        CUENTA = NULL;
        SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
            WHERE CUEN_COD = :ctaconcepto INTO :CUENTA, :TIPOCUEN;
        if (CUENTA IS NULL) then
            begin
            EXECUTE PROCEDURE ERROR (89, :IDDOC, :ctaconcepto, 2);
            CUENTA = ctaconcepto;
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            EXECUTE PROCEDURE ERROR (89, :IDDOC, :CUENTA, 3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'C') then
            BEGIN
            EXECUTE PROCEDURE ERROR (89, :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, :NROI, :CUENTA, :CONC, '', 0, :fondom, 0, 0, :nitasoc, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            SUMA = SUMA - fondom;
            END
        end /* INGRESO COOP */
    /* RETEFUENTE */
    if (retencion <> 0) then
        BEGIN
        CUENTA = NULL;
        SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
            WHERE CUEN_COD = :ctaretencion INTO :CUENTA, :TIPOCUEN;
        if (CUENTA IS NULL) then
            begin
            EXECUTE PROCEDURE ERROR (89, :IDDOC, :ctaretencion, 2);
            CUENTA = ctaretencion;
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            EXECUTE PROCEDURE ERROR (89, :IDDOC, :CUENTA, 3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'C') then
            BEGIN
            EXECUTE PROCEDURE ERROR (89, :IDDOC, :CUENTA, 4);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            if (porcrtf <> 0) then
                BASE = RETENCION * 100 / porcrtf;
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_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, :retencion, :base, :porcrtf, :nitasoc, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            SUMA = SUMA - retencion;
            END
        end /* RETENCION */
    /* RECORRA LOS CONCEPTOS*/
    FOR SELECT copl_ctaconta, mncc_valor
        FROM manifiestos_carga_conc M, conceptos_planilla C
        WHERE m.mncc_conc = C.copl_id AND m.manc_id = :iddoc and c.copl_remesa = 'S' ORDER BY m.mncc_item
        INTO :ctaconcepto, :monto
        DO
        BEGIN
        if (MONTO <> 0) then
            BEGIN
            CUENTA = NULL;
            SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :ctaconcepto INTO :CUENTA, :TIPOCUEN;
            if (CUENTA IS NULL) then
                begin
                EXECUTE PROCEDURE ERROR (89, :IDDOC, :ctaconcepto, 2);
                CUENTA = ctaconcepto;
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'I') then
                BEGIN
                EXECUTE PROCEDURE ERROR (89, :IDDOC, :CUENTA, 3);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                EXECUTE PROCEDURE ERROR (89, :IDDOC, :CUENTA, 4);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                if (MONTO > 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, :MONTO, 0, 0, :nitasoc, :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(:MONTO), 0, 0, 0, :nitasoc, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA - MONTO;
                END
            END
        END /* CONCEPTOS */
    /* CUADRE TODO CONTRA LA cxp asociado */
    CUENTA = NULL;
    if (SUMA < 0) then
        execute procedure LEE_configuracion('TRANSPORTE', 'GENERAL', 'CUENTA CONTABLE PLANILLA NEGATIVA') returning_values (:ctapagar);
    else
        if (CXPAGAR = 'T') then
            SELECT TERC_CTACLIENTE FROM TERCEROS WHERE TERC_NIT = :nitasoc INTO :ctapagar;
    SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
        WHERE CUEN_COD = :ctapagar INTO :CUENTA, :TIPOCUEN;
    if (CUENTA IS NULL) then
        begin
        EXECUTE PROCEDURE ERROR (89, :IDDOC, :ctapagar, 2);
        CUENTA = ctapagar;
        ERROR = ERROR + 1;
        end
    if (TIPOCUEN = 'I') then
        BEGIN
        EXECUTE PROCEDURE ERROR (89, :IDDOC, :CUENTA, 3);
        TIPOCUEN = 'N';
        ERROR = ERROR + 1;
        END
    if (TIPOCUEN = 'C') then
        BEGIN
        EXECUTE PROCEDURE ERROR (89, :IDDOC, :CUENTA, 4);
        TIPOCUEN = 'N';
        ERROR = ERROR + 1;
        END
    if (TIPOCUEN = 'N') then
        BEGIN
        if (SUMA > 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, :SUMA, 0, 0, :NITASOC, :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(:SUMA), 0, 0, 0, :NITASOC, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
        END

    if (ERROR > 0) then
        VER = 'S';
    SUSPEND;
    END /* EXISTE */
ELSE
    BEGIN
    EXECUTE PROCEDURE ERROR (89, :IDDOC, :PREF, 1);
    ERROR = ERROR + 1;
    VER = 'S';
    SUSPEND;
    END
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE CONTABIL_NOMINA(
    IDDOC INTEGER)
RETURNS (
    ERROR INTEGER,
    IDC INTEGER)
AS
declare variable itemdet integer;
declare variable idcontabil integer;
declare variable aporte char(1);
declare variable entidad varchar(20);
declare variable valor numeric(18,2);
declare variable ctagast varchar(20);
declare variable ctaxp varchar(20);
declare variable tercnit varchar(20);
declare variable fecaux date;
declare variable fecha char(8);
declare variable ano char(4);
declare variable periodicidad integer;
declare variable periodo integer;
declare variable numero varchar(8);
declare variable tipocom char(3);
declare variable prefcom varchar(4);
declare variable concepto varchar(60);
declare variable numerocom varchar(8);
declare variable proyecto varchar(4) character set none;
declare variable centro varchar(4) character set none;
declare variable codconc integer;
declare variable base numeric(18,2);
declare variable basico numeric(18,2);
declare variable comision numeric(18,2);
declare variable retroact numeric(18,2);
declare variable det char(1);
declare variable ctaadmin char(1);
declare variable CONCXEMP CHAR(2);
declare variable NOMCONC VARCHAR(60);
declare variable NOMTERC VARCHAR(60);
declare variable CONTANETO CHAR(2);
declare variable DEBITO NUMERIC(18, 2);
declare variable CREDITO NUMERIC(18, 2);
declare variable DEBCTA NUMERIC(18, 2);
declare variable CREDCTA NUMERIC(18, 2);
declare variable ITECTA INTEGER;
declare variable GASTO CHAR(1);
declare variable NITGASTO VARCHAR(20);
BEGIN
SELECT N.nomi_feccausa, N.nomi_ano, N.nomi_periodocidad, N.nomi_periodo FROM NOMINA N WHERE N.nomi_id = :iddoc INTO :fecaux, :ano, :periodicidad, :periodo;
NUMERO = :periodicidad || :periodo;
SELECT I.tico_cod, I.prco_pre, I.inno_det, I.inno_dtlleadmin FROM INTERFAZ_NOMINA I WHERE I.tido_cod = 92 INTO :tipocom, :prefcom,:det,:ctaadmin;
concepto = 'CAUSACION NOMINA AÑO ' || :ano || ' PERIODO ' || :periodo || ' PERIODICIDAD ' ||:periodicidad;
EXECUTE PROCEDURE completa_ceros(:numero)RETURNING_VALUES :numero;
SELECT P.pref_numero FROM PREFIJOS_CONTA P WHERE P.tico_cod = :tipocom AND P.prco_pref = :prefcom INTO :numerocom;
idcontabil = GEN_ID(ID_CONTABILIZA,1);
EXECUTE PROCEDURE FECHA_A_CONTA(:FECAUX) RETURNING_VALUES (:FECHA);
EXECUTE PROCEDURE lee_configuracion('NOMINA', 'GENERAL', 'CONTABILIZAR CON CONCEPTO INDIVIDUAL POR CADA EMPLEADO') returning_values (:CONCXEMP);
EXECUTE PROCEDURE lee_configuracion('NOMINA', 'GENERAL', 'CONTABILIZAR CON IDENTIFICACION DEL EMPLEADO/ADMINISTRADORA EL GASTO DE APORTES') returning_values (:NITGASTO);
/* BORRE CUALQUIER OTRA ANTERIOR */
DELETE FROM CONTABILIZACION WHERE CNTB_IDREF = :iddoc AND CNTB_TIPOREF = 92;

INSERT INTO CONTABILIZACION (CNTB_ID, CNTB_TIPOREF, CNTB_IDREF, CNTB_PREFREF, CNTB_NUMREF, CNTB_FECHA, CNTB_TIPOCOMP, CNTB_PREFCNT, CNTB_CONCEPTO, CNTB_NUMERO, CNTB_PROCESADO)
    VALUES (:idcontabil, 92,:iddoc, :ano, :numero, :fecha, :tipocom, :prefcom, :concepto, :numerocom, 'N');
idc = :idcontabil;
itemdet = 0;
IF (DET = 'N') THEN
    BEGIN
    FOR SELECT max(NC.conc_cod),sum(NC.NOCO_VALORCONT), max(CN.conc_ctagast), max(NC.terc_nit), max(NC.noco_aporte), max(NC.noco_entidad), MAX(CN.conc_gtoempr)
        FROM NOMINA_CONCEPTOS NC, CONCEPTOS_NOMINA CN WHERE NC.conc_cod = CN.conc_cod AND NC.nomi_id = :iddoc and cn.conc_ctagast is not null and cn.conc_ctacxp is not null
        group by cn.conc_ctagast,nc.terc_nit
        INTO :codconc,:valor, :ctagast, :tercnit, :aporte, :entidad, :gasto
        DO
        BEGIN
        SELECT E.proy_cod,E.cent_cod FROM EMPLEADOS E WHERE E.terc_nit = :tercnit INTO :proyecto, :centro;
        if (:proyecto IS NULL) then
            SELECT D.dpto_proy, D.dpto_centro FROM EMPLEADOS E, departamento D WHERE E.terc_nit = :tercnit AND E.empl_dpto = D.dpto_cod INTO :proyecto, :centro;
        base = null;
        IF (ctagast IS NULL) THEN
            BEGIN
            EXECUTE PROCEDURE ERROR (14, :IDDOC, :ctagast, 2);
            ERROR = ERROR + 1;
            END
        IF (VALOR IS NULL) THEN
            VALOR = 0;
        IF (VALOR <> 0) THEN
            BEGIN
            IF (valor < 0) THEN
                valor = :valor * (-1);
            IF (codconc = 6) THEN
                BEGIN
                SELECT E.empl_salario FROM EMPLEADOS E WHERE E.terc_nit = :tercnit INTO :basico;
                SELECT c.ncom_monto FROM nomina_comisiones c WHERE c.ncom_ano = :ano AND c.ncom_periodo = :periodo AND c.ncom_periodicidad = :periodicidad AND c.terc_nit = :tercnit INTO :comision;
                IF (comision IS NULL) THEN
                    comision = 0;
                SELECT C.emco_monto FROM EMPLEADO_CONCEPTOS C WHERE C.terc_nit = :tercnit AND C.conc_cod = 933 INTO :retroact;
                IF (retroact IS NULL ) THEN
                    retroact = 0;
                base = :basico + :comision + :retroact;
                END
            IF ((aporte = 'N') or (GASTO = 'N')) THEN
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_TERC, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_CONC, CNDE_PROY, cnde_centro,CNDE_BASE)
                    VALUES (:idcontabil, :itemdet, :ctagast, :tercnit, :valor, 0, :concepto, :proyecto, :centro,:base);
                itemdet = itemdet + 1;
                END
            ELSE
                BEGIN
                if (NITGASTO = 'EMPLEADO') then
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_TERC, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_CONC, CNDE_PROY, cnde_centro,CNDE_BASE)
                        VALUES (:idcontabil, :itemdet, :ctagast, :tercnit, :valor, 0, :concepto, :proyecto, :centro,:base);
                else
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_TERC, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_CONC, CNDE_PROY, cnde_centro,CNDE_BASE)
                        VALUES (:idcontabil, :itemdet, :ctagast, :entidad, :valor, 0, :concepto, :proyecto, :centro,:base);
                itemdet = itemdet + 1;
                END
            END
        END
    SUSPEND;
    FOR SELECT max(NC.conc_cod),sum(NC.NOCO_VALORCONT), max(CN.conc_ctacxp), max(NC.terc_nit), max(NC.noco_aporte), max(NC.noco_entidad), MAX(CN.conc_gtoempr)
        FROM NOMINA_CONCEPTOS NC, CONCEPTOS_NOMINA CN WHERE NC.conc_cod = CN.conc_cod AND NC.nomi_id = :iddoc and cn.conc_ctagast is not null and cn.conc_ctacxp is not null
        group by cn.conc_ctacxp,nc.noco_nitcont
        INTO :codconc,:valor, :ctaxp, :tercnit, :aporte, :entidad, :gasto
        DO
        BEGIN
        base = null;
        IF (ctaxp IS NULL) THEN
            BEGIN
            EXECUTE PROCEDURE ERROR (14, :IDDOC, :ctaxp, 2);
            ERROR = ERROR + 1;
            END
        IF (VALOR IS NULL) THEN
            VALOR = 0;
        IF (VALOR <> 0) THEN
            BEGIN
            IF (valor < 0) THEN
                valor = :valor * (-1);
            IF (codconc = 6) THEN
                BEGIN
                SELECT E.empl_salario FROM EMPLEADOS E WHERE E.terc_nit = :tercnit INTO :basico;
                SELECT c.ncom_monto FROM nomina_comisiones c WHERE c.ncom_ano = :ano AND c.ncom_periodo = :periodo AND c.ncom_periodicidad = :periodicidad AND c.terc_nit = :tercnit INTO :comision;
                IF (comision IS NULL) THEN
                    comision = 0;
                SELECT C.emco_monto FROM EMPLEADO_CONCEPTOS C WHERE C.terc_nit = :tercnit AND C.conc_cod = 933 INTO :retroact;
                IF (retroact IS NULL ) THEN
                    retroact = 0;
                base = :basico + :comision + :retroact;
                END
            if ((codconc > 900) and (entidad is not null) AND (ctaadmin = 'S')) then
                begin
                SELECT A.admi_ctaconta FROM ADMINISTRADORA A WHERE A.terc_nit = :entidad INTO :ctaxp;
                if ((ctaxp is null) or (ctaxp = '')) then
                    begin
                    if ((codconc = 905) OR (codconc = 906) or (codconc = 904) OR (codconc = 934)) then
                        SELECT A.admi_ctaafp FROM ADMINISTRADORA A WHERE A.terc_nit = :entidad INTO :ctaxp;
                    ELSE if ((codconc = 914) OR (codconc = 915) or (codconc = 907) OR (codconc = 938)) then
                        SELECT A.admi_ctaeps FROM ADMINISTRADORA A WHERE A.terc_nit = :entidad INTO :ctaxp;
                    ELSE if ((codconc = 912) OR (codconc = 913) OR (codconc = 937)) then
                        SELECT A.admi_ctaafc FROM ADMINISTRADORA A WHERE A.terc_nit = :entidad INTO :ctaxp;
                    ELSE if ((codconc = 910) OR (codconc = 911) OR (codconc = 936)) then
                        SELECT A.admi_ctaccf FROM ADMINISTRADORA A WHERE A.terc_nit = :entidad INTO :ctaxp;
                    ELSE if ((codconc = 908) OR (codconc = 909) OR (codconc = 935)) then
                        SELECT A.admi_ctaarp FROM ADMINISTRADORA A WHERE A.terc_nit = :entidad INTO :ctaxp;
                    end
                end
            IF (aporte = 'N') THEN
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_TERC, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_CONC, CNDE_PROY, cnde_centro,CNDE_BASE)
                    VALUES (:idcontabil, :itemdet, :ctaxp, :tercnit, 0,:valor, :concepto, :proyecto, :centro,:base);
                itemdet = itemdet + 1;
                END
            ELSE
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_TERC, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_CONC, CNDE_PROY, cnde_centro,CNDE_BASE)
                    VALUES (:idcontabil, :itemdet, :ctaxp, :entidad, 0,:valor, :concepto, :proyecto, :centro,:base);
                itemdet = itemdet + 1;
                END
            END
        END
    SUSPEND;
    /* SI LA CONFIGURACION LO INDICA HAGA EL RESUMEN NETO */
    EXECUTE PROCEDURE lee_configuracion('NOMINA', 'LIQUIDACION', 'CONTABILIZAR NETO DEBITO MENOS CREDITO EN CONTABILIZACION RESUMIDA') returning_values (:CONTANETO);
    if (CONTANETO = 'SI') then
        BEGIN
        FOR SELECT CNDE_ITEM, CNDE_CUENTA, CNDE_TERC, CNDE_DEBITOS, CNDE_CREDITOS
            FROM CONTABILIZACION_DET WHERE CNTB_ID = :idcontabil ORDER BY CNDE_ITEM
            INTO :itemdet,  :ctagast, :tercnit, :debcta, :credcta
            DO
            BEGIN
            FOR SELECT CNDE_ITEM, CNDE_DEBITOS, CNDE_CREDITOS FROM CONTABILIZACION_DET
                WHERE CNTB_ID = :idcontabil AND CNDE_CUENTA = :ctagast AND CNDE_TERC = :tercnit AND CNDE_ITEM > :itemdet 
                INTO :itecta, :debito, :credito
                DO
                BEGIN
                if (debcta <> 0) then
                    BEGIN
                    if (CREDITO <> 0) then
                        if (credito > DEBCTA) then
                            BEGIN
                            UPDATE contabilizacion_det SET CNDE_CREDITOS = :CREDITO - CNDE_DEBITOS, CNDE_DEBITOS = 0
                                WHERE CNTB_ID = :idcontabil AND CNDE_ITEM = :itemdet;
                            CREDCTA = CREDITO - DEBCTA;
                            DEBCTA = 0;
                            END
                        else
                            BEGIN
                            UPDATE contabilizacion_det SET CNDE_DEBITOS = CNDE_DEBITOS - :CREDITO
                                WHERE CNTB_ID = :idcontabil AND CNDE_ITEM = :itemdet;
                            DEBCTA = DEBCTA - CREDITO;
                            END
                    if (DEBITO <> 0) then
                        BEGIN
                        UPDATE contabilizacion_det SET CNDE_DEBITOS = CNDE_DEBITOS + :DEBITO
                            WHERE CNTB_ID = :idcontabil AND CNDE_ITEM = :itemdet;
                        DEBCTA = DEBCTA + DEBITO;
                        END
                    END
                ELSE
                    BEGIN
                    if (DEBITO <> 0) then
                        if (debito > credcta) then
                            BEGIN
                            UPDATE contabilizacion_det SET CNDE_DEBITOS = :DEBITO - CNDE_CREDITOS, CNDE_CREDITOS = 0
                                WHERE CNTB_ID = :idcontabil AND CNDE_ITEM = :itemdet;
                            DEBCTA = DEBITO - CREDCTA;
                            CREDCTA = 0;
                            END
                        else
                            BEGIN
                            UPDATE contabilizacion_det SET CNDE_CREDITOS = CNDE_CREDITOS - :DEBITO
                                WHERE CNTB_ID = :idcontabil AND CNDE_ITEM = :itemdet;
                            CREDCTA = CREDCTA - DEBITO;
                            END
                    if (CREDITO <> 0) then
                        BEGIN
                        UPDATE contabilizacion_det SET CNDE_CREDITOS = CNDE_CREDITOS + :CREDITO
                            WHERE CNTB_ID = :idcontabil AND CNDE_ITEM = :itemdet;
                        CREDCTA = CREDCTA + CREDITO;
                        END
                    END
                DELETE FROM CONTABILIZACION_DET WHERE CNTB_ID = :idcontabil AND CNDE_ITEM = :itecta;
                END
            END     
        END
    END
ELSE
    BEGIN
    FOR SELECT NC.conc_cod,NC.NOCO_VALORCONT, CN.conc_ctagast, CN.conc_ctacxp, NC.terc_nit, NC.noco_aporte, NC.noco_entidad, SUBSTRING(CN.conc_nomcorto FROM 1 FOR 14), CN.conc_gtoempr
        FROM NOMINA_CONCEPTOS NC, CONCEPTOS_NOMINA CN WHERE NC.conc_cod = CN.conc_cod AND NC.nomi_id = :iddoc
        INTO :codconc,:valor, :ctagast, :ctaxp, :tercnit, :aporte, :entidad, :nomconc, :gasto
        DO
        BEGIN
        base = null;
        SELECT E.proy_cod,E.cent_cod FROM EMPLEADOS E WHERE E.terc_nit = :tercnit INTO :proyecto, :centro;
        if (:proyecto IS NULL) then
            SELECT D.dpto_proy, D.dpto_centro FROM EMPLEADOS E, departamento D WHERE E.terc_nit = :tercnit AND E.empl_dpto = D.dpto_cod INTO :proyecto, :centro;
        IF (ctagast IS NULL) THEN
            BEGIN
            EXECUTE PROCEDURE ERROR (14, :IDDOC, :ctagast, 2);
            ERROR = ERROR + 1;
            END
        IF (ctaxp IS NULL) THEN
            BEGIN
            EXECUTE PROCEDURE ERROR (14, :IDDOC, :ctaxp, 2);
            ERROR = ERROR + 1;
            END
        IF (VALOR IS NULL) THEN
            VALOR = 0;
        IF (VALOR <> 0) THEN
            BEGIN
            IF (valor < 0) THEN
                valor = :valor * (-1);
            IF (codconc = 6) THEN
                BEGIN
                SELECT E.empl_salario FROM EMPLEADOS E WHERE E.terc_nit = :tercnit INTO :basico;
                SELECT c.ncom_monto FROM nomina_comisiones c WHERE c.ncom_ano = :ano AND c.ncom_periodo = :periodo AND c.ncom_periodicidad = :periodicidad AND c.terc_nit = :tercnit INTO :comision;
                IF (comision IS NULL) THEN
                    comision = 0;
                SELECT C.emco_monto FROM EMPLEADO_CONCEPTOS C WHERE C.terc_nit = :tercnit AND C.conc_cod = 933 INTO :retroact;
                IF (retroact IS NULL ) THEN
                    retroact = 0;
                base = :basico + :comision + :retroact;
                END     
            if ((codconc > 900) and (entidad is not null) AND (ctaadmin = 'S')) then
                begin
                SELECT A.admi_ctaconta FROM ADMINISTRADORA A WHERE A.terc_nit = :entidad INTO :ctaxp;
                if ((ctaxp is null) or (ctaxp = '')) then
                    begin
                    if ((codconc = 905) OR (codconc = 906) or (codconc = 904) OR (codconc = 934)) then
                        SELECT A.admi_ctaafp FROM ADMINISTRADORA A WHERE A.terc_nit = :entidad INTO :ctaxp;
                    ELSE if ((codconc = 914) OR (codconc = 915) or (codconc = 907) OR (codconc = 938)) then
                        SELECT A.admi_ctaeps FROM ADMINISTRADORA A WHERE A.terc_nit = :entidad INTO :ctaxp;
                    ELSE if ((codconc = 912) OR (codconc = 913) OR (codconc = 937)) then
                        SELECT A.admi_ctaafc FROM ADMINISTRADORA A WHERE A.terc_nit = :entidad INTO :ctaxp;
                    ELSE if ((codconc = 910) OR (codconc = 911) OR (codconc = 936)) then
                        SELECT A.admi_ctaccf FROM ADMINISTRADORA A WHERE A.terc_nit = :entidad INTO :ctaxp;
                    ELSE if ((codconc = 908) OR (codconc = 909) OR (codconc = 935)) then
                        SELECT A.admi_ctaarp FROM ADMINISTRADORA A WHERE A.terc_nit = :entidad INTO :ctaxp;
                    end
                end
            if (concxemp = 'SI') then
                BEGIN
                SELECT SUBSTRING(TERC_NOM FROM 1 FOR 45) FROM TERCEROS WHERE TERC_NIT = :tercnit INTO :nomterc;
                CONCEPTO = NOMTERC || '-' || nomconc;
                END
            /* CUENTA DEL GASTO */
            IF ((aporte = 'N') or (GASTO = 'N')) THEN
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_TERC, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_CONC, CNDE_PROY, cnde_centro,CNDE_BASE)
                    VALUES (:idcontabil, :itemdet, :ctagast, :tercnit, :valor, 0, :concepto, :proyecto, :centro,:base);
                END
            ELSE
                BEGIN
                if (NITGASTO = 'EMPLEADO') then
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_TERC, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_CONC, CNDE_PROY, cnde_centro,CNDE_BASE)
                        VALUES (:idcontabil, :itemdet, :ctagast, :tercnit, :valor, 0, :concepto, :proyecto, :centro,:base);
                else
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_TERC, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_CONC, CNDE_PROY, cnde_centro,CNDE_BASE)
                        VALUES (:idcontabil, :itemdet, :ctagast, :entidad, :valor, 0, :concepto, :proyecto, :centro,:base);
                END
            /* CUENTA POR PAGAR */
            itemdet = itemdet + 1;
            if (APORTE = 'N') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_TERC, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_CONC, CNDE_PROY, cnde_centro,CNDE_BASE)
                    VALUES (:idcontabil, :itemdet, :ctaxp, :tercnit, 0,:valor, :concepto, :proyecto, :centro,:base);
                END
            ELSE
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_TERC, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_CONC, CNDE_PROY, cnde_centro,CNDE_BASE)
                         VALUES (:idcontabil, :itemdet, :ctaxp, :entidad, 0,:valor, :concepto, :proyecto, :centro,:base);
            itemdet = itemdet + 1;
            END
        END
    SUSPEND;
    END
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE CONTABIL_NOTACRBC(
    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 TIPOCOMP VARCHAR(3);
declare variable PREFCONT VARCHAR(4);
declare variable BASE CHAR(1);
declare variable CTABASE VARCHAR(20);
declare variable IVA CHAR(1);
declare variable CTAIVA VARCHAR(20);
declare variable GMF CHAR(1);
declare variable CTAGMF VARCHAR(20);
declare variable BANCO CHAR(1);
declare variable CTABANCO 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 NROI INTEGER;
declare variable SUMA NUMERIC(18,2);
declare variable BCTABANCO 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 ANULADO CHAR(1);
BEGIN
/* BUSQUE LA INTERFACE */
EXISTE = 'N';
SELECT 'S', TICO_COD, PRCO_PRE, INBA_BANCO, INBA_IVA, INBA_GMF, INBA_BASE, INBA_CTABCO, INBA_CTAIVA, INBA_CTAGMF, INBA_CTABASE, INBA_CONFIRMAR
    FROM INTERFAZ_BANCOS
    WHERE INBA_ID = :IDINTER
    INTO :EXISTE, :TIPOCOMP, :PREFCONT, :BANCO, :IVA, :GMF, :BASE, :CTABANCO, CTAIVA, CTAGMF, CTABASE, :VER;
if (EXISTE = 'S') then
  BEGIN
  /* BORRE CUALQUEIR CONTABILIZACION PREVIA */
  DELETE FROM CONTABILIZACION WHERE CNTB_TIPOREF = 75 AND CNTB_IDREF = :IDDOC;
  /* TRAIGA EL ENCABEZADO  */
  SELECT PRBA_PREF, NCBC_NUMERO, NCBC_FECHA, NCBC_CONCEPTO, NCBC_MONTO, CUBA_CTACONTA, NCBC_ANULADO, BANC_NIT
        FROM NOTAS_CREDITO N, CUENTAS_BANCO C, BANCOS B
        WHERE NCBC_ID = :IDDOC AND C.CUBA_COD = N.CUBA_COD AND B.BANC_COD = C.BANC_COD
        INTO :PREF, :NUM, :FECAUX, :CONC, :MONTO, :BCTABANCO, :ANULADO, :NIT;
  if (ANULADO = 'N') then
    BEGIN
    NUMERO = PREF || NUM;
    SELECT PRBA_CENTRO, PRBA_PROY
        FROM PREFIJOS_BANCOS P, NOTAS_CREDITO N
        WHERE P.PRBA_PREF = N.PRBA_PREF AND P.CUBA_COD = N.CUBA_COD AND p.tido_cod = 75 and N.NCBC_ID = :IDDOC
        INTO :CENTRO, :PROY;
    EXECUTE PROCEDURE FECHA_A_CONTA(:FECAUX) returning_values (:FECHA);
    /* REGISTRE EL ENCABEZADO CONTABLE */
    IDC = GEN_ID(ID_CONTABILIZA, 1);
    INSERT INTO CONTABILIZACION (CNTB_ID, CNTB_TIPOCOMP, CNTB_PREFCNT, CNTB_NUMERO, CNTB_FECHA, CNTB_CONCEPTO, CNTB_REF, CNTB_TIPOREF, CNTB_IDREF, CNTB_PREFREF, CNTB_NUMREF, CNTB_PROCESADO)
        VALUES (:IDC, :TIPOCOMP, :PREFCONT, :NUM, :FECHA, :CONC, '', 75, :IDDOC, :PREF, :NUM, 'N');
    NROI = 0;
    SUMA = 0;
    ERROR = 0;
    /* CUENTA BASE */
    if (BASE = 'K') then
        BEGIN
        CUENTA = NULL;
        SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
            WHERE CUEN_COD = :CTABASE INTO :CUENTA, :TIPOCUEN;
        if (CUENTA IS NULL) then
            begin
            EXECUTE PROCEDURE ERROR (75, :IDDOC, :CTABASE, 2);
            CUENTA = CTABASE;
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            EXECUTE PROCEDURE ERROR (75, :IDDOC, :CUENTA, 3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'C') then
            BEGIN
            EXECUTE PROCEDURE ERROR (75, :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, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            END
        END /* BASE = K */
    /* CUENTA BANCO */
    if ((BANCO = 'B') or (BANCO = 'K')) then
        BEGIN
        if (BANCO = 'B') then
            CTABANCO = BCTABANCO;
        if (MONTO <> 0) then
            BEGIN
            CUENTA = NULL;
            SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :CTABANCO INTO :CUENTA, :TIPOCUEN;
        if (CUENTA IS NULL) then
            begin
            EXECUTE PROCEDURE ERROR (75, :IDDOC, :CTABANCO, 2);
            CUENTA = CTABANCO;
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            EXECUTE PROCEDURE ERROR (75, :IDDOC, :CUENTA, 3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'C') then
            BEGIN
            EXECUTE PROCEDURE ERROR (75, :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, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                END
            END /* SUMA <> 0 */
        END /* BANCO K O B */
        
    /* recorra las cuentas adicionales */
    FOR SELECT INBC_CUENTA, INBC_BASE, INBC_PORC, INBC_VALOR, INBC_DB
        FROM INTERFAZ_BANCOS_CTAS
        WHERE INBA_ID = :IDINTER
        INTO :CUENTAADIC, :BASEADIC, :PORCADIC, :VALORADIC, :DBADIC
        DO
        BEGIN
        if (:BASEADIC = 'MONTO') then
            VALORADIC = MONTO;
        MONTO = VALORADIC * PORCADIC;
        
        /* TRAIGA LAS CARACTERISTICAS DE LA CUENTA */
        CUENTA = NULL;
        SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
            WHERE CUEN_COD = :CUENTAADIC INTO :CUENTA, :TIPOCUEN;
        if (CUENTA IS NULL) then
            begin
            EXECUTE PROCEDURE ERROR (75, :IDDOC, :CUENTAADIC, 2);
            CUENTA = CUENTAADIC;
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            EXECUTE PROCEDURE ERROR (75, :IDDOC, :CUENTA, 3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'C') then
            BEGIN
            EXECUTE PROCEDURE ERROR (75, :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, :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
    if (ERROR > 0) then
        VER = 'S';
    SUSPEND;
    END
  END /* EXISTE */
ELSE
    BEGIN
    EXECUTE PROCEDURE ERROR (75, :IDDOC, :PREF, 1);
    ERROR = ERROR + 1;
    VER = 'S';
    SUSPEND;
    END
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE CONTABIL_NOTACRCL(
    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 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 TIPOCOMP VARCHAR(3);
declare variable PREFCONT VARCHAR(4);
declare variable BASE CHAR(1);
declare variable CTABASE VARCHAR(20);
declare variable IVA CHAR(1);
declare variable CTAIVA VARCHAR(20);
declare variable CLIE CHAR(1);
declare variable CTACLIE VARCHAR(20);
declare variable RTFTE CHAR(1);
declare variable CTARTFTE VARCHAR(20);
declare variable RTIVA CHAR(1);
declare variable CTARTIVA VARCHAR(20);
declare variable RTICA CHAR(1);
declare variable CTARTICA VARCHAR(20);
declare variable RTCREE CHAR(1);
declare variable 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 NOMBRE VARCHAR(60);
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', TICO_COD, PRCO_PRE, INCA_BASE, INCA_IVA, INCA_RTFTE, INCA_RTIVA, INCA_RTICA, INCA_RTCREE, INCA_CLIE, INCA_CTABASE, INCA_CTAIVA, INCA_CTARTFTE, INCA_CTARTIVA, INCA_CTARTICA, INCA_CTARTCREE, INCA_CTACLIE, INCA_CONFIRMAR
    FROM INTERFAZ_CARTERA
    WHERE INCA_ID = :IDINTER
    INTO :EXISTE, :TIPOCOMP, :PREFCONT, :BASE, :IVA, :RTFTE, :RTIVA, :RTICA, :RTCREE, :CLIE, :CTABASE, :CTAIVA, :CTARTFTE, :CTARTIVA, :CTARTICA, :CTARCREE, :CTACLIE, :VER;
  if (EXISTE = 'S') then
    BEGIN
    /* BORRE CUALQUEIR CONTABILIZACION PREVIA */
    DELETE FROM CONTABILIZACION WHERE CNTB_TIPOREF = 42 AND CNTB_IDREF = :IDDOC;
    /* 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_NOM,
        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, :NOMBRE,
        :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);
      /* REGISTRE EL ENCABEZADO CONTABLE */
      IDC = GEN_ID(ID_CONTABILIZA, 1);
      INSERT INTO CONTABILIZACION (CNTB_ID, CNTB_TIPOCOMP, CNTB_PREFCNT, CNTB_NUMERO, CNTB_FECHA, CNTB_CONCEPTO, CNTB_REF, CNTB_TIPOREF, CNTB_IDREF, CNTB_PREFREF, CNTB_NUMREF, CNTB_PROCESADO)
        VALUES (:IDC, :TIPOCOMP, :PREFCONT, :NUM, :FECHA, :CONC, '', 42, :IDDOC, :PREF, :NUM, 'N');
      NROI = 0;
      SUMA = 0;
      ERROR = 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
                WHERE CUEN_COD = :CTABASE INTO :CUENTA, :TIPOCUEN, :ES_RETENCION;
            if (CUENTA IS NULL) then
                begin
                EXECUTE PROCEDURE ERROR (42, :IDDOC, :CTABASE, 2);
                CUENTA = CTABASE;
                TIPOCUEN = 'N';
                ERROR = ERROR + 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 ERROR (42, :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, '', :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
                WHERE CUEN_COD = :CTAIVA INTO :CUENTA, :TIPOCUEN;
            if (CUENTA IS NULL) then
                begin
                EXECUTE PROCEDURE ERROR (42, :IDDOC, :CTAIVA, 2);
                CUENTA = CTAIVA;
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'I') then
                BEGIN
                EXECUTE PROCEDURE ERROR (42, :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, :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
            WHERE CUEN_COD = :CTARTFTE INTO :CUENTA, :TIPOCUEN;
        if (CUENTA IS NULL) then
            begin
            EXECUTE PROCEDURE ERROR (42, :IDDOC, :CTARTFTE, 2);
            CUENTA = CTARTFTE;
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            EXECUTE PROCEDURE ERROR (42, :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, :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
                WHERE CUEN_COD = :CTARTFTE INTO :CUENTA, :TIPOCUEN;
            if (CUENTA IS NULL) then
                begin
                EXECUTE PROCEDURE ERROR (42, :IDDOC, :CTARTFTE, 2);
                CUENTA = CTARTFTE;
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'I') then
                BEGIN
                EXECUTE PROCEDURE ERROR (42, :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, '', :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
            WHERE CUEN_COD = :CTARTIVA INTO :CUENTA, :TIPOCUEN;
        if (CUENTA IS NULL) then
            begin
            EXECUTE PROCEDURE ERROR (42, :IDDOC, :CTARTIVA, 2);
            CUENTA = CTARTIVA;
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            EXECUTE PROCEDURE ERROR (42, :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, :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
            WHERE CUEN_COD = :CTARTICA INTO :CUENTA, :TIPOCUEN;
        if (CUENTA IS NULL) then
            begin
            EXECUTE PROCEDURE ERROR (42, :IDDOC, :CTARTICA, 2);
            CUENTA = CTARTICA;
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            EXECUTE PROCEDURE ERROR (42, :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, :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
            WHERE CUEN_COD = :CTARTICA INTO :CUENTA, :TIPOCUEN;
        if (CUENTA IS NULL) then
            begin
            EXECUTE PROCEDURE ERROR (42, :IDDOC, :ctarcree, 2);
            CUENTA = ctarcree;
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            EXECUTE PROCEDURE ERROR (42, :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, :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
                WHERE CUEN_COD = :ctarcree INTO :CUENTA, :TIPOCUEN;
            if (CUENTA IS NULL) then
                begin
                EXECUTE PROCEDURE ERROR (42, :IDDOC, :CTARTFTE, 2);
                CUENTA = CTARTFTE;
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'I') then
                BEGIN
                EXECUTE PROCEDURE ERROR (42, :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, '', :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
            WHERE CUEN_COD = :CUENTAADIC INTO :CUENTA, :TIPOCUEN;
        IF (CUENTA IS NULL) then
            begin
            EXECUTE PROCEDURE ERROR (42, :IDDOC, :CUENTAADIC, 2);
            CUENTA = CUENTAADIC;
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            end
        /* DEPENDE DEL TIPO DE CUENTA */
        if (TIPOCUEN = 'I') then
            BEGIN
            EXECUTE PROCEDURE ERROR (42, :IDDOC, :CUENTA, 3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'C') then
            BEGIN
            if (DBADIC = 'S') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_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
            WHERE CUEN_COD = :CTACLIE INTO :CUENTA, :TIPOCUEN;
        IF (CUENTA IS NULL) then
            begin
            EXECUTE PROCEDURE ERROR (42, :IDDOC, :CTACLIE, 2);
            CUENTA = CTACLIE;
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            EXECUTE PROCEDURE ERROR (42, :IDDOC, :CUENTA, 3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'C') then
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_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 (ERROR > 0) then
        VER = 'S';
    SUSPEND;
    END /* NO ANULADO */
  END /* EXISTE LA INTERFAZ */
ELSE
  BEGIN
  EXECUTE PROCEDURE ERROR (42, :IDDOC, :PREF, 1);
  ERROR = ERROR + 1;
  VER = 'S';
  SUSPEND;
  END
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE CONTABIL_NOTACRPR(
    IDDOC INTEGER,
    IDINTER INTEGER)
RETURNS (
    ERROR INTEGER,
    VER CHAR(1),
    IDC INTEGER)
AS
declare variable PREF VARCHAR(4);
declare variable NUM VARCHAR(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 TIPOCOMP VARCHAR(3);
declare variable PREFCONT VARCHAR(4);
declare variable BASE CHAR(1);
declare variable CTABASE VARCHAR(20);
declare variable IVA CHAR(1);
declare variable CTAIVA VARCHAR(20);
declare variable CLIE CHAR(1);
declare variable CTACLIE VARCHAR(20);
declare variable RTFTE CHAR(1);
declare variable CTARTFTE VARCHAR(20);
declare variable RTIVA CHAR(1);
declare variable CTARTIVA VARCHAR(20);
declare variable RTICA CHAR(1);
declare variable CTARTICA VARCHAR(20);
declare variable RTCREE CHAR(1);
declare variable CTARTCREE VARCHAR(20);
declare variable EXISTE CHAR(1);
declare variable CUENTA VARCHAR(20);
declare variable MONTO NUMERIC(18,2);
declare variable ES_RETENCION CHAR(1);
declare variable TIPOCUEN CHAR(1);
declare variable NIT VARCHAR(20);
declare variable NOMBRE VARCHAR(60);
declare variable PROY VARCHAR(4);
declare variable CENTRO VARCHAR(4);
declare variable 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
ERROR = 0;
/* BUSQUE LA INTERFACE */
EXISTE = 'N';
SELECT 'S', TICO_COD, PRCO_PRE, INCP_BASE, INCP_IVA, INCP_RTFTE, INCP_RTIVA, INCP_RTICA, INCP_RTCREE, INCP_PROV, INCP_CTABASE,
  INCP_CTAIVA, INCP_CTARTFTE, INCP_CTARTIVA, INCP_CTARTICA, INCP_CTARTCREE, INCP_CTAPROV, INCP_CONFIRMAR
  FROM INTERFAZ_CXPAGAR
  WHERE INCP_ID = :IDINTER
  INTO :EXISTE, :TIPOCOMP, :PREFCONT, :BASE, :IVA, :RTFTE, :RTIVA, :RTICA, :RTCREE, :CLIE, :CTABASE,
    :CTAIVA, :CTARTFTE, :CTARTIVA, :CTARTICA, :CTARTCREE, :CTACLIE, :VER;

if (EXISTE = 'S') then
  BEGIN
  /* BORRE CUALQUEIR CONTABILIZACION PREVIA */
  DELETE FROM CONTABILIZACION WHERE CNTB_TIPOREF = 52 AND CNTB_IDREF = :IDDOC;
  /* TRAIGA EL ENCABEZADO DE LA NOTA */
  SELECT PREF_PRE, NCPR_NUMERO, NCPR_FECHA, N.TERC_NIT, NCPR_CONC, NCPR_IVAMONTO, NCPR_MONTO, NCPR_RTFTEPORC, NCPR_RTFTEMONTO,
    NCPR_RTIVAPORC, NCPR_RTIVAMONTO, NCPR_RTICAPORC, NCPR_RTICAMONTO, NCPR_RTCREE, NCPR_RTCREEM, TERC_NOM, TERC_CTAVENTA,
    TERC_CTARTFTE, TERC_CTARTIVA, TERC_CTARTICA, TERC_CTARCREE, TERC_CTACLIENTE, NCPR_ANULADO, NCPR_BASE0, NCPR_BASE1, NCPR_BASE2, NCPR_IVA1, NCPR_IVA2, NCPR_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, :NOMBRE, 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);

    /* REGISTRE EL ENCABEZADO CONTABLE */
    IDC = GEN_ID(ID_CONTABILIZA, 1);
    INSERT INTO CONTABILIZACION (CNTB_ID, CNTB_TIPOCOMP, CNTB_PREFCNT, CNTB_NUMERO, CNTB_FECHA, CNTB_CONCEPTO, CNTB_REF, CNTB_TIPOREF, CNTB_IDREF, CNTB_PREFREF, CNTB_NUMREF, CNTB_PROCESADO)
        VALUES (:IDC, :TIPOCOMP, :PREFCONT, :NUM, :FECHA, :CONC, '', 52, :IDDOC, :PREF, :NUM, 'N');

    NROI = 0;
    SUMA = 0;

    IF ((BASE = 'T') OR (BASE = 'K')) THEN
        BEGIN
        IF (BASE = 'T') THEN
            CTABASE = TCTABASE;

        if (VRSUBT <> 0) then
            BEGIN
            CUENTA = NULL;
            SELECT CUEN_COD, CUEN_TIPO, CUEN_RETENCION FROM CUENTAS
                WHERE CUEN_COD = :CTABASE INTO :CUENTA, :TIPOCUEN, :ES_RETENCION;
            if (CUENTA IS NULL) then
                begin
                EXECUTE PROCEDURE ERROR (52, :IDDOC, :CTABASE, 2);
                CUENTA = CTABASE;
                ERROR = ERROR + 1;
                end
            if (ES_RETENCION = 'S') then
                if (PORC <> 0) then
                    montobase = FLOOR(VRSUBT / PORC * -1);
                else
                    montobase = VRSUBT * -1;
            else
                montobase = 0;
            if (TIPOCUEN = 'I') then
                BEGIN
                EXECUTE PROCEDURE ERROR (52, :IDDOC, :CUENTA, 3);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    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
                    WHERE CUEN_COD = :CTABASE INTO :CUENTA, :TIPOCUEN, :ES_RETENCION;
                if (CUENTA IS NULL) then
                    begin
                    EXECUTE PROCEDURE ERROR (52, :IDDOC, :CTABASE, 2);
                    CUENTA = CTABASE;
                    ERROR = ERROR + 1;
                    end
                montobase = 0;
                if (TIPOCUEN = 'I') then
                    BEGIN
                    EXECUTE PROCEDURE ERROR (52, :IDDOC, :CUENTA, 3);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        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
                    WHERE CUEN_COD = :CTAIVA INTO :CUENTA, :TIPOCUEN;
                if (CUENTA IS NULL) then
                    begin
                    EXECUTE PROCEDURE ERROR (52, :IDDOC, :CTAIVA, 2);
                    CUENTA = CTAIVA;
                    ERROR = ERROR + 1;
                    end
                if (TIPOCUEN = 'I') then
                    BEGIN
                    EXECUTE PROCEDURE ERROR (52, :IDDOC, :CUENTA, 3);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        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
                WHERE CUEN_COD = :CTAIVA INTO :CUENTA, :TIPOCUEN;
            if (CUENTA IS NULL) then
                begin
                EXECUTE PROCEDURE ERROR (52, :IDDOC, :CTAIVA, 2);
                CUENTA = CTAIVA;
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'I') then
                BEGIN
                EXECUTE PROCEDURE ERROR (52, :IDDOC, :CUENTA, 3);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    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
            WHERE CUEN_COD = :CTARTFTE INTO :CUENTA, :TIPOCUEN;
        if (CUENTA IS NULL) then
            begin
            EXECUTE PROCEDURE ERROR (52, :IDDOC, :CTARTFTE, 2);
            CUENTA = CTARTFTE;
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            EXECUTE PROCEDURE ERROR (52, :IDDOC, :CUENTA, 3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'C') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                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
            WHERE CUEN_COD = :CTARTIVA INTO :CUENTA, :TIPOCUEN;
        if (CUENTA IS NULL) then
            begin
            EXECUTE PROCEDURE ERROR (52, :IDDOC, :CTARTIVA, 2);
            CUENTA = CTARTIVA;
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            EXECUTE PROCEDURE ERROR (52, :IDDOC, :CUENTA, 3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'C') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                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
            WHERE CUEN_COD = :CTARTICA INTO :CUENTA, :TIPOCUEN;
        if (CUENTA IS NULL) then
            begin
            EXECUTE PROCEDURE ERROR (52, :IDDOC, :CTARTICA, 2);
            CUENTA = CTARTICA;
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            EXECUTE PROCEDURE ERROR (52, :IDDOC, :CUENTA, 3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'C') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                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
            WHERE CUEN_COD = :ctartcree INTO :CUENTA, :TIPOCUEN;
        if (CUENTA IS NULL) then
            begin
            EXECUTE PROCEDURE ERROR (52, :IDDOC, :ctartcree, 2);
            CUENTA = ctartcree;
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            EXECUTE PROCEDURE ERROR (52, :IDDOC, :CUENTA, 3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'C') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                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
            WHERE CUEN_COD = :CUENTAADIC INTO :CUENTA, :TIPOCUEN;
        IF (CUENTA IS NULL) THEN
            begin
            EXECUTE PROCEDURE ERROR (52, :IDDOC, :CUENTAADIC, 2);
            CUENTA = CUENTAADIC;
            ERROR = ERROR + 1;
            end
        /* DEPENDE DEL TIPO DE CUENTA */
        if (TIPOCUEN = 'I') then
            BEGIN
            EXECUTE PROCEDURE ERROR (52, :IDDOC, :CUENTA, 3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'C') then
            BEGIN
            if (DBADIC = 'S') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_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
            WHERE CUEN_COD = :CTACLIE INTO :CUENTA, :TIPOCUEN;
        IF (CUENTA IS NULL) then
            begin
            EXECUTE PROCEDURE ERROR (52, :IDDOC, :CTACLIE, 2);
            CUENTA = CTACLIE;
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            EXECUTE PROCEDURE ERROR (52, :IDDOC, :CUENTA, 3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'C') then
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_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 (ERROR > 0) then
        VER = 'S';
    SUSPEND;
    END /* NO ANULADO */
  END /* EXISTE LA INTERFAZ */
ELSE
    BEGIN
    EXECUTE PROCEDURE ERROR (52, :IDDOC, :PREF, 1);
    ERROR = ERROR + 1;
    VER = 'S';
    SUSPEND;
    END
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE CONTABIL_NOTADBBC(
    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 TIPOCOMP VARCHAR(3);
declare variable PREFCONT VARCHAR(4);
declare variable BASE CHAR(1);
declare variable CTABASE VARCHAR(20);
declare variable IVA CHAR(1);
declare variable CTAIVA VARCHAR(20);
declare variable GMF CHAR(1);
declare variable CTAGMF VARCHAR(20);
declare variable BANCO CHAR(1);
declare variable CTABANCO VARCHAR(20);
declare variable EXISTE CHAR(1);
declare variable CUENTA VARCHAR(20);
declare variable MONTO NUMERIC(18,2);
declare variable VRGMF NUMERIC(18,2);
declare variable VRIVA 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 NROI INTEGER;
declare variable SUMA NUMERIC(18,2);
declare variable BCTABANCO VARCHAR(20);
declare variable BCTAIVA VARCHAR(20);
declare variable BCTAGMF 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 ANULADO CHAR(1);
BEGIN
/* BUSQUE LA INTERFACE */
EXISTE = 'N';
SELECT 'S', TICO_COD, PRCO_PRE, INBA_BANCO, INBA_IVA, INBA_GMF, INBA_BASE, INBA_CTABCO, INBA_CTAIVA, INBA_CTAGMF, INBA_CTABASE, INBA_CONFIRMAR
    FROM INTERFAZ_BANCOS
    WHERE INBA_ID = :IDINTER
    INTO :EXISTE, :TIPOCOMP, :PREFCONT, :BANCO, :IVA, :GMF, :BASE, :CTABANCO, CTAIVA, CTAGMF, CTABASE, :VER;
if (EXISTE = 'S') then
  BEGIN
  /* BORRE CUALQUEIR CONTABILIZACION PREVIA */
  DELETE FROM CONTABILIZACION WHERE CNTB_TIPOREF = 74 AND CNTB_IDREF = :IDDOC;
  /* TRAIGA EL ENCABEZADO  */
  SELECT PRBA_PREF, NDBC_NUMERO, NDBC_FECHA, NDBC_CONCEPTO, NDBC_MONTO, NDBC_GMFMONTO, NDBC_IVAMONTO, CUBA_CTACONTA, CUBA_CTAIVA, CUBA_CTAGMF, NDBC_ANULADO, BANC_NIT
        FROM NOTAS_DEBITO N, CUENTAS_BANCO C, BANCOS B
        WHERE NDBC_ID = :IDDOC AND C.CUBA_COD = N.CUBA_COD AND B.BANC_COD = C.BANC_COD
        INTO :PREF, :NUM, :FECAUX, :CONC, :MONTO, :VRGMF, :VRIVA, :BCTABANCO, :BCTAIVA, :BCTAGMF, :ANULADO, :NIT;
  if (ANULADO = 'N') then
    BEGIN
    if (VRIVA IS NULL) then
        VRIVA = 0;
    if (VRGMF IS NULL) then
        VRGMF = 0;
    NUMERO = PREF || NUM;
    SELECT PRBA_CENTRO, PRBA_PROY
        FROM PREFIJOS_BANCOS P, NOTAS_DEBITO N
        WHERE P.PRBA_PREF = N.PRBA_PREF AND P.CUBA_COD = N.CUBA_COD AND p.tido_cod = 74 and N.NDBC_ID = :IDDOC
        INTO :CENTRO, :PROY;
    EXECUTE PROCEDURE FECHA_A_CONTA(:FECAUX) returning_values (:FECHA);
    /* REGISTRE EL ENCABEZADO CONTABLE */
    IDC = GEN_ID(ID_CONTABILIZA, 1);
    INSERT INTO CONTABILIZACION (CNTB_ID, CNTB_TIPOCOMP, CNTB_PREFCNT, CNTB_NUMERO, CNTB_FECHA, CNTB_CONCEPTO, CNTB_REF, CNTB_TIPOREF, CNTB_IDREF, CNTB_PREFREF, CNTB_NUMREF, CNTB_PROCESADO)
        VALUES (:IDC, :TIPOCOMP, :PREFCONT, :NUM, :FECHA, :CONC, '', 74, :IDDOC, :PREF, :NUM, 'N');
    NROI = 0;
    SUMA = 0;
    ERROR = 0;
    /* CUENTA BASE */
    if (BASE = 'K') then
        BEGIN
        CUENTA = NULL;
        SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
            WHERE CUEN_COD = :CTABASE INTO :CUENTA, :TIPOCUEN;
        if (CUENTA IS NULL) then
            begin
            EXECUTE PROCEDURE ERROR (74, :IDDOC, :CTABASE, 2);
            CUENTA = CTABASE;
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            EXECUTE PROCEDURE ERROR (74, :IDDOC, :CUENTA, 3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'C') then
            BEGIN
            EXECUTE PROCEDURE ERROR (74, :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, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            END
        END /* BASE = K */
    /* CUENTA GMF */
    if ((VRGMF <> 0) AND ((GMF = 'K') or (GMF = 'B'))) then
        BEGIN
        if (GMF = 'B') then
            CTAGMF = BCTAGMF;
        CUENTA = NULL;
        SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
            WHERE CUEN_COD = :CTAGMF INTO :CUENTA, :TIPOCUEN;
        if (CUENTA IS NULL) then
            begin
            EXECUTE PROCEDURE ERROR (74, :IDDOC, :CTAGMF, 2);
            CUENTA = CTAGMF;
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            EXECUTE PROCEDURE ERROR (74, :IDDOC, :CUENTA, 3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'C') then
            BEGIN
            EXECUTE PROCEDURE ERROR (74, :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, :NROI, :CUENTA, :CONC, '', :VRGMF, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            END
        END /* GMF */
    /* CUENTA IVA */
    if ((VRIVA <> 0) AND ((IVA = 'K') or (IVA = 'B'))) then
        BEGIN
        if (IVA = 'B') then
            CTAIVA = BCTAIVA;
        CUENTA = NULL;
        SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
            WHERE CUEN_COD = :CTAIVA INTO :CUENTA, :TIPOCUEN;
        if (CUENTA IS NULL) then
            begin
            EXECUTE PROCEDURE ERROR (74, :IDDOC, :CTAIVA, 2);
            CUENTA = CTAIVA;
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            EXECUTE PROCEDURE ERROR (74, :IDDOC, :CUENTA, 3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'C') then
            BEGIN
            EXECUTE PROCEDURE ERROR (74, :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, :NROI, :CUENTA, :CONC, '', :VRIVA, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            END
        END /* IVA */
    /* CUENTA BANCO */
    if ((BANCO = 'B') or (BANCO = 'K')) then
        BEGIN
        if (BANCO = 'B') then
            CTABANCO = BCTABANCO;
        SUMA = MONTO + VRGMF + VRIVA;
        if (SUMA <> 0) then
            BEGIN
            CUENTA = NULL;
            SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :CTABANCO INTO :CUENTA, :TIPOCUEN;
            if (CUENTA IS NULL) then
                begin
                EXECUTE PROCEDURE ERROR (74, :IDDOC, :CTABANCO, 2);
                CUENTA = CTABANCO;
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'I') then
                BEGIN
                EXECUTE PROCEDURE ERROR (74, :IDDOC, :CUENTA, 3);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                EXECUTE PROCEDURE ERROR (74, :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, :NROI, :CUENTA, :CONC, '', 0, :SUMA, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                END
            END /* SUMA <> 0 */
        END /* BANCO K O B */
        
    /* recorra las cuentas adicionales */
    FOR SELECT INBC_CUENTA, INBC_BASE, INBC_PORC, INBC_VALOR, INBC_DB
        FROM INTERFAZ_BANCOS_CTAS
        WHERE INBA_ID = :IDINTER
        INTO :CUENTAADIC, :BASEADIC, :PORCADIC, :VALORADIC, :DBADIC
        DO
        BEGIN
        if (:BASEADIC = 'MONTO') then
            VALORADIC = MONTO;
        MONTO = VALORADIC * PORCADIC;
        
        /* TRAIGA LAS CARACTERISTICAS DE LA CUENTA */
        CUENTA = NULL;
        SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
            WHERE CUEN_COD = :CUENTAADIC INTO :CUENTA, :TIPOCUEN;
        if (CUENTA IS NULL) then
            begin
            EXECUTE PROCEDURE ERROR (74, :IDDOC, :CUENTAADIC, 2);
            CUENTA = CUENTAADIC;
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            EXECUTE PROCEDURE ERROR (74, :IDDOC, :CUENTA, 3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'C') then
            BEGIN
            EXECUTE PROCEDURE ERROR (74, :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, :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
    if (ERROR > 0) then
        VER = 'S';
    SUSPEND;
    END
  END
ELSE
    BEGIN
    EXECUTE PROCEDURE ERROR (74, :IDDOC, :PREF, 1);
    ERROR = ERROR + 1;
    VER = 'S';
    SUSPEND;
    END
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE CONTABIL_NOTADBCL(
    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 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 TIPOCOMP VARCHAR(3);
declare variable PREFCONT VARCHAR(4);
declare variable BASE CHAR(1);
declare variable CTABASE VARCHAR(20);
declare variable IVA CHAR(1);
declare variable CTAIVA VARCHAR(20);
declare variable CLIE CHAR(1);
declare variable CTACLIE VARCHAR(20);
declare variable RTFTE CHAR(1);
declare variable CTARTFTE VARCHAR(20);
declare variable RTIVA CHAR(1);
declare variable CTARTIVA VARCHAR(20);
declare variable RTICA CHAR(1);
declare variable CTARTICA VARCHAR(20);
declare variable RTCREE CHAR(1);
declare variable CTARTCREE VARCHAR(20);
declare variable EXISTE CHAR(1);
declare variable CUENTA VARCHAR(20);
declare variable ES_RETENCION CHAR(1);
declare variable TIPOCUEN CHAR(1);
declare variable NIT VARCHAR(20);
declare variable NOMBRE VARCHAR(60);
declare variable PROY VARCHAR(4);
declare variable CENTRO VARCHAR(4);
declare variable 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', TICO_COD, PRCO_PRE, INCA_BASE, INCA_IVA, INCA_RTFTE, INCA_RTIVA, INCA_RTICA, INCA_RTCREE, INCA_CLIE, INCA_CTABASE, INCA_CTAIVA,
    INCA_CTARTFTE, INCA_CTARTIVA, INCA_CTARTICA, INCA_CTARTCREE, INCA_CTACLIE, INCA_CONFIRMAR
    FROM INTERFAZ_CARTERA
    WHERE INCA_ID = :IDINTER
    INTO :EXISTE, :TIPOCOMP, :PREFCONT, :BASE, :IVA, :RTFTE, :RTIVA, :RTICA, :RTCREE, :CLIE, :CTABASE, :CTAIVA,
    :CTARTFTE, :CTARTIVA, :CTARTICA, :CTARTCREE, :CTACLIE, :VER;
if (EXISTE = 'S') then
  BEGIN
  /* BORRE CUALQUEIR CONTABILIZACION PREVIA */
  DELETE FROM CONTABILIZACION WHERE CNTB_TIPOREF = 41 AND CNTB_IDREF = :IDDOC;
  /* 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_NOM, 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, :NOMBRE, 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);
    /* REGISTRE EL ENCABEZADO CONTABLE */
    IDC = GEN_ID(ID_CONTABILIZA, 1);
    INSERT INTO CONTABILIZACION (CNTB_ID, CNTB_TIPOCOMP, CNTB_PREFCNT, CNTB_NUMERO, CNTB_FECHA, CNTB_CONCEPTO, CNTB_REF, CNTB_TIPOREF, CNTB_IDREF, CNTB_PREFREF, CNTB_NUMREF, CNTB_PROCESADO)
        VALUES (:IDC, :TIPOCOMP, :PREFCONT, :NUM, :FECHA, :CONC, '', 41, :IDDOC, :PREF, :NUM, 'N');
    NROI = 0;
    SUMA = 0;
    ERROR = 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
                WHERE CUEN_COD = :CTABASE INTO :CUENTA, :TIPOCUEN, :ES_RETENCION;
            if (CUENTA IS NULL) then
                begin
                EXECUTE PROCEDURE ERROR (41, :IDDOC, :CTABASE, 2);
                CUENTA = CTABASE;
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                end
            if (ES_RETENCION = 'S') then
                if (PORC <> 0) then
                    montobase = FLOOR(VRSUBT / PORC * -1);
                else
                    montobase = VRSUBT * -1;
            else
                montobase = 0;
            if (TIPOCUEN = 'I') then
                BEGIN
                EXECUTE PROCEDURE ERROR (41, :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, :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
                WHERE CUEN_COD = :CTAIVA INTO :CUENTA, :TIPOCUEN;
            if (CUENTA IS NULL) then
                begin
                EXECUTE PROCEDURE ERROR (41, :IDDOC, :CTAIVA, 2);
                CUENTA = CTAIVA;
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'I') then
                BEGIN
                EXECUTE PROCEDURE ERROR (41, :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, :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
            WHERE CUEN_COD = :CTARTFTE INTO :CUENTA, :TIPOCUEN;
        if (CUENTA IS NULL) then
            begin
            EXECUTE PROCEDURE ERROR (41, :IDDOC, :CTARTFTE, 2);
            CUENTA = CTARTFTE;
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            EXECUTE PROCEDURE ERROR (41, :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, '', :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
                WHERE CUEN_COD = :CTARTFTE INTO :CUENTA, :TIPOCUEN;
            if (CUENTA IS NULL) then
                begin
                EXECUTE PROCEDURE ERROR (41, :IDDOC, :CTARTFTE, 2);
                CUENTA = CTARTFTE;
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'I') then
                BEGIN
                EXECUTE PROCEDURE ERROR (41, :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, 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
            WHERE CUEN_COD = :CTARTIVA INTO :CUENTA, :TIPOCUEN;
        if (CUENTA IS NULL) then
            begin
            EXECUTE PROCEDURE ERROR (41, :IDDOC, :CTARTIVA, 2);
            CUENTA = CTARTIVA;
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            EXECUTE PROCEDURE ERROR (41, :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, '', :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
            WHERE CUEN_COD = :CTARTICA INTO :CUENTA, :TIPOCUEN;
        if (CUENTA IS NULL) then
            begin
            EXECUTE PROCEDURE ERROR (41, :IDDOC, :CTARTICA, 2);
            CUENTA = CTARTICA;
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            EXECUTE PROCEDURE ERROR (41, :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, '', :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
            WHERE CUEN_COD = :CTARTCREE INTO :CUENTA, :TIPOCUEN;
        if (CUENTA IS NULL) then
            begin
            EXECUTE PROCEDURE ERROR (41, :IDDOC, :CTARTCREE, 2);
            CUENTA = CTARTCREE;
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            EXECUTE PROCEDURE ERROR (41, :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, '', :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
                WHERE CUEN_COD = :ctartcree INTO :CUENTA, :TIPOCUEN;
            if (CUENTA IS NULL) then
                begin
                EXECUTE PROCEDURE ERROR (41, :IDDOC, :ctartcree, 2);
                CUENTA = ctartcree;
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'I') then
                BEGIN
                EXECUTE PROCEDURE ERROR (41, :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, :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
            WHERE CUEN_COD = :CUENTAADIC INTO :CUENTA, :TIPOCUEN;
        IF (CUENTA IS NULL) THEN
            begin
            EXECUTE PROCEDURE ERROR (41, :IDDOC, :CUENTAADIC, 2);
            CUENTA = CUENTAADIC;
            ERROR = ERROR + 1;
            end
        /* DEPENDE DEL TIPO DE CUENTA */
        if (TIPOCUEN = 'I') then
            BEGIN
            EXECUTE PROCEDURE ERROR (41, :IDDOC, :CUENTA, 3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'C') then
            BEGIN
            if (DBADIC = 'S') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_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
            WHERE CUEN_COD = :CTACLIE INTO :CUENTA, :TIPOCUEN;
        IF (CUENTA IS NULL) then
            begin
            EXECUTE PROCEDURE ERROR (41, :IDDOC, :CTACLIE, 2);
            CUENTA = CTACLIE;
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            EXECUTE PROCEDURE ERROR (41, :IDDOC, :CUENTA, 3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'C') then
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_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 (ERROR > 0) then
        VER = 'S';
    SUSPEND;
    END /* NO ANULADO */
  END /* EXISTE LA INTERFAZ */
ELSE
    BEGIN
    EXECUTE PROCEDURE ERROR (41, :IDDOC, :PREF, 1);
    ERROR = ERROR + 1;
    VER = 'S';
    SUSPEND;
    END
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE CONTABIL_PLANILLA(
    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 TIPOCOMP VARCHAR(3);
declare variable PREFCONT VARCHAR(4);
declare variable CXPAGAR CHAR(1);
declare variable CTAPAGAR VARCHAR(20);
declare variable CAJA CHAR(1);
declare variable CTACAJA VARCHAR(20);
declare variable CARTERA CHAR(1);
declare variable CTACARTERA VARCHAR(20);
declare variable CTACONCEPTO VARCHAR(20);
declare variable CTAINGPLA VARCHAR(20);
declare variable CTAINGREM 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 NITASOC VARCHAR(20);
declare variable NITCLI VARCHAR(20);
declare variable PROY VARCHAR(4);
declare variable CENTRO VARCHAR(4);
declare variable NROI INTEGER;
declare variable SUMA NUMERIC(18,2);
declare variable SUMACAJA NUMERIC(18,2);
declare variable SUMACART NUMERIC(18,2);
declare variable INGPAS NUMERIC(18,2);
declare variable INGREM NUMERIC(18,2);
declare variable NUMDET VARCHAR(10);
declare variable SEGURO NUMERIC(18,2);
declare variable CTASEGURO VARCHAR(20);
declare variable DOMICILIO NUMERIC(18,2);
declare variable CTADOMIC VARCHAR(20);
declare variable CTACONTRAE VARCHAR(20);
declare variable CXPP NUMERIC(18,2);
declare variable CXPR NUMERIC(18,2);
declare variable CONTRAE NUMERIC(18,2);
declare variable CANT INTEGER;
BEGIN
/* BUSQUE LA INTERFACE */
EXISTE = 'N';
SELECT 'S', TICO_COD, PRCO_PREF, INTR_CONFIRMAR, INTR_CAJA, INTR_CTACAJA, INTR_CXPAGAR, INTR_CTAPAGAR,
    INTR_CARTERA, INTR_CTACARTERA, INTR_CTAINGPLA, INTR_CTAINGREM, INTR_CTASEGURO, INTR_CTADOMICIL, intr_ctacontrae
    FROM interfaz_transporte
    WHERE INTR_ID = :IDINTER
    INTO :EXISTE, :TIPOCOMP, :PREFCONT, :VER, :CAJA, :CTACAJA, :CXPAGAR, :CTAPAGAR,
        :CARTERA, :CTACARTERA, :CTAINGPLA, :CTAINGREM, :ctaseguro, :ctadomic, :ctacontrae;
if (EXISTE = 'S') then
    BEGIN
    DELETE FROM contabilizacion WHERE CNTB_TIPOREF = 88 AND CNTB_IDREF = :IDDOC;

    /* TRAIGA EL ENCABEZADO  */
    SELECT PLPA_PREF, PLPA_NUMERO, PLPA_FECHA, TERC_NIT
        FROM planilla_pasajeros P, vehiculos v WHERE PLPA_ID = :IDDOC AND P.plpa_vehiculo = V.vehi_cod
        INTO :PREF, :NUM, :FECAUX, :NITASOC;
    NUMERO = PREF || NUM;
    SELECT PREF_CENTRO, PREF_PROY FROM prefijos P, planilla_pasajeros PP
        WHERE P.pref_pre = PP.plpa_pref AND PP.plpa_id = :IDDOC AND P.tido_cod = 88
        INTO :CENTRO, :PROY;
    EXECUTE PROCEDURE FECHA_A_CONTA(:FECAUX) returning_values (:FECHA);
    /* REGISTRE EL ENCABEZADO CONTABLE */
    CONC = 'PLANILLA DE PASAJEROS No. ' || :NUMERO;
    IDC = GEN_ID(ID_CONTABILIZA, 1);
    INSERT INTO CONTABILIZACION (CNTB_ID, CNTB_TIPOCOMP, CNTB_PREFCNT, CNTB_NUMERO, CNTB_FECHA, CNTB_CONCEPTO, CNTB_REF, CNTB_TIPOREF, CNTB_IDREF, CNTB_PREFREF, CNTB_NUMREF, CNTB_PROCESADO)
        VALUES (:IDC, :TIPOCOMP, :PREFCONT, :NUM, :FECHA, :CONC, '', 88, :IDDOC, :PREF, :NUM, 'N');
    NROI = 0;
    SUMA = 0;
    CXPP = 0;
    CXPR = 0;
    ERROR = 0;

    if (CAJA = 'C') then
        SELECT FIRST 1 CAJA_CUENTA FROM CAJAS c, tiquete_pasajero T WHERE T.tiqp_formap = 'C' AND T.tiqp_caja = C.caja_id INTO :ctacaja;
    if (CXPAGAR = 'T') then
        SELECT TERC_CTACLIENTE FROM TERCEROS WHERE TERC_NIT = :nitasoc INTO :ctapagar;

    /* SOLO LA PARTE DE CONTADO */
    CONC = 'TIQUETES CONTADO PLANILLA DE PASAJEROS No. ' || :NUMERO;
    SELECT sum(PLPA_VALOR) FROM planilla_pasajeros_det P, tiquete_pasajero t
        WHERE p.plpa_tiquete = t.tiqp_id and t.tiqp_formap = 'C' and P.plpa_id = :iddoc INTO :sumacaja;
    if (sumacaja <> 0) then
        BEGIN
        /* LA CAJA */
        CUENTA = NULL;
        SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
            WHERE CUEN_COD = :ctacaja INTO :CUENTA, :TIPOCUEN;
        if (CUENTA IS NULL) then
            begin
            EXECUTE PROCEDURE ERROR (88, :IDDOC, :ctacaja, 2);
            CUENTA = ctacaja;
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            EXECUTE PROCEDURE ERROR (88, :IDDOC, :CUENTA, 3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'C') then
            BEGIN
            EXECUTE PROCEDURE ERROR (88, :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, :NROI, :CUENTA, :CONC, '', :sumacaja, 0, 0, 0, :nitasoc, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            END
        /* la cuenta por pagar al transportador */
        SELECT FPRM_CTAPASAJE FROM forma_pago_remesa WHERE FPRM_COD = 'C' INTO :ctapagar;
        CUENTA = NULL;
        SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
            WHERE CUEN_COD = :ctapagar INTO :CUENTA, :TIPOCUEN;
        if (CUENTA IS NULL) then
            begin
            EXECUTE PROCEDURE ERROR (88, :IDDOC, :ctapagar, 2);
            CUENTA = ctapagar;
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            EXECUTE PROCEDURE ERROR (88, :IDDOC, :CUENTA, 3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'C') then
            BEGIN
            EXECUTE PROCEDURE ERROR (88, :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, :NROI, :CUENTA, :CONC, '', 0, :sumacaja, 0, 0, :nitasoc, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            CXPP = SUMACAJA;
            NROI = NROI + 1;
            END
        END /* PASAJES CONTADO */

    /* PASAJES A CREDITO */
    sumacart = 0;
    FOR SELECT TIQP_NIT, PLPA_VALOR, PLPD_PREF || PLPD_NUMERO, TIQP_CANT FROM planilla_pasajeros_det P, tiquete_pasajero t
        WHERE p.plpa_tiquete = t.tiqp_id and t.tiqp_formap = 'R' and P.plpa_id = :iddoc
        INTO :nitcli, :monto, :numdet, :CANT
        DO
        BEGIN
        if (MONTO <> 0) then
            BEGIN
            /* LA CARTERA */
            CONC = 'TIQUETE CREDITO No. ' || :numdet;
            if (CARTERA = 'T') then
                SELECT TERC_CTACLIENTE FROM TERCEROS WHERE TERC_NIT = :nitcli INTO :ctacartera;

            CUENTA = NULL;
            SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :ctacartera INTO :CUENTA, :TIPOCUEN;
            if (CUENTA IS NULL) then
                begin
                EXECUTE PROCEDURE ERROR (88, :IDDOC, :ctacartera, 2);
                CUENTA = ctacartera;
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'I') then
                BEGIN
                EXECUTE PROCEDURE ERROR (88, :IDDOC, :CUENTA, 3);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                EXECUTE PROCEDURE ERROR (88, :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, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :nitcli, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                sumacart = sumacart + MONTO;
                END

            /* INGRESO PASAJES A CREDITO */
            CONC = 'TIQUETES CREDITO PLANILLA DE PASAJEROS No. ' || :NUMERO;
            execute procedure LEE_configuracion('TRANSPORTE', 'GENERAL', 'TARIFA DE INGRESO POR PASAJES A CREDITO') returning_values (:ingpas);
            MONTO = ingpas * :cant;
            if (MONTO <> 0) then
                BEGIN
                CUENTA = NULL;
                SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                    WHERE CUEN_COD = :ctaingpla INTO :CUENTA, :TIPOCUEN;
                if (CUENTA IS NULL) then
                    begin
                    EXECUTE PROCEDURE ERROR (88, :IDDOC, :ctaingpla, 2);
                    CUENTA = ctaingpla;
                    ERROR = ERROR + 1;
                    end
                if (TIPOCUEN = 'I') then
                    BEGIN
                    EXECUTE PROCEDURE ERROR (88, :IDDOC, :CUENTA, 3);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    EXECUTE PROCEDURE ERROR (88, :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, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :nitasoc, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    SUMACART = SUMACART - MONTO;
                    END
                END /* INGRESO PASAJES CREDITO */
            END
        END

    /* la cuenta por pagar al transportador */
    SELECT FPRM_CTAPASAJE FROM forma_pago_remesa WHERE FPRM_COD = 'R' INTO :ctapagar;
    if (sumacart <> 0) then
        BEGIN
        CUENTA = NULL;
        SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
            WHERE CUEN_COD = :ctapagar INTO :CUENTA, :TIPOCUEN;
        if (CUENTA IS NULL) then
            begin
            EXECUTE PROCEDURE ERROR (88, :IDDOC, :ctapagar, 2);
            CUENTA = ctapagar;
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            EXECUTE PROCEDURE ERROR (88, :IDDOC, :CUENTA, 3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'C') then
            BEGIN
            EXECUTE PROCEDURE ERROR (88, :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, :NROI, :CUENTA, :CONC, '', 0, :sumacart, 0, 0, :nitasoc, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            END
        END /* PASAJES CREDITO */

    /* REMESAS A CREDITO */
    sumacart = 0;
    FOR SELECT CGRM_NIT, PLPR_VALOR, PLPR_PREF || PLPR_NUMREM FROM planilla_pasajeros_rem P, carga_remesa R
        WHERE p.plpr_remesa = R.cgrm_id and R.cgrm_fpago = 'R' and P.plpa_id = :iddoc
        INTO :nitcli, :monto, :numdet
        DO
        BEGIN
        if (MONTO <> 0) then
            BEGIN
            CONC = 'REMESA A CREDITO No. ' || :NUMERO;
            /* LA CARTERA */
            if (CARTERA = 'T') then
                SELECT TERC_CTACLIENTE FROM TERCEROS WHERE TERC_NIT = :nitcli INTO :ctacartera;

            CUENTA = NULL;
            SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :ctacartera INTO :CUENTA, :TIPOCUEN;
            if (CUENTA IS NULL) then
                begin
                EXECUTE PROCEDURE ERROR (88, :IDDOC, :ctacartera, 2);
                CUENTA = ctacartera;
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'I') then
                BEGIN
                EXECUTE PROCEDURE ERROR (88, :IDDOC, :CUENTA, 3);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                EXECUTE PROCEDURE ERROR (88, :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, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :nitcli, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                sumacart = sumacart + MONTO;
                END
            END
        END
    /* REMESAS DE CONTADO */
    CONC = 'REMESAS CONTADO PLANILLA DE PASAJEROS No. ' || :NUMERO;
    SELECT sum(PLPR_VALOR) FROM planilla_pasajeros_rem P, carga_remesa R
        WHERE P.plpr_remesa = R.cgrm_id AND R.cgrm_fpago = 'C' AND P.plpa_id = :iddoc
        INTO :sumacaja;
    if (sumacaja <> 0) then
        BEGIN
        CUENTA = NULL;
        SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
            WHERE CUEN_COD = :ctacaja INTO :CUENTA, :TIPOCUEN;
        if (CUENTA IS NULL) then
            begin
            EXECUTE PROCEDURE ERROR (88, :IDDOC, :ctacaja, 2);
            CUENTA = ctacaja;
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            EXECUTE PROCEDURE ERROR (88, :IDDOC, :CUENTA, 3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'C') then
            BEGIN
            EXECUTE PROCEDURE ERROR (88, :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, :NROI, :CUENTA, :CONC, '', :sumacaja, 0, 0, 0, :nitasoc, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            END
        END /* REMESAS CAJA */

    /* CONTRAENTREGAS  */
    CONC = 'REMESAS CONTRAENTREGA PLANILLA DE PASAJEROS No. ' || :NUMERO;
    SELECT sum(PLPR_CONTRAE), SUM(CGRM_SEGURO), SUM(CGRM_DOMICILIO) FROM planilla_pasajeros_rem P, carga_remesa R
        WHERE P.plpr_remesa = R.cgrm_id AND R.cgrm_fpago = 'E' AND P.plpa_id = :iddoc
        INTO :sumacaja, :SEGURO, :DOMICILIO;
    execute procedure LEE_configuracion('TRANSPORTE', 'GENERAL', 'TARIFA DE INGRESO POR REMESAS DE PASAJEROS') returning_values (:ingrem);
    execute procedure redondee(((sumacaja-seguro-domicilio) * ingrem / 100)+seguro+domicilio, 0) returning_values (CONTRAE);
    if (CONTRAE <> 0) then
        BEGIN
        CUENTA = NULL;
        SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
            WHERE CUEN_COD = :ctacontrae INTO :CUENTA, :TIPOCUEN;
        if (CUENTA IS NULL) then
            begin
            EXECUTE PROCEDURE ERROR (88, :IDDOC, :ctacontrae, 2);
            CUENTA = ctacontrae;
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            EXECUTE PROCEDURE ERROR (88, :IDDOC, :CUENTA, 3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'C') then
            BEGIN
            EXECUTE PROCEDURE ERROR (88, :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, :NROI, :CUENTA, :CONC, '', :CONTRAE, 0, 0, 0, :nitasoc, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            END
        END /* CONTRAENTREGAS */

    /* INGRESO REMESAS  */
    CONC = 'REMESAS PLANILLA DE PASAJEROS No. ' || :NUMERO;
    SELECT sum(PLPR_VALOR+PLPR_CONTRAE), SUM(CGRM_SEGURO), SUM(CGRM_DOMICILIO) FROM planilla_pasajeros_rem P, carga_remesa R
        WHERE P.plpr_remesa = R.cgrm_id AND P.plpa_id = :iddoc
        INTO :sumacaja, :SEGURO, :DOMICILIO;
    execute procedure redondee((sumacaja-seguro-domicilio) * ingrem / 100, 0) returning_values (MONTO);
    if (MONTO <> 0) then
        BEGIN
        CUENTA = NULL;
        SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
            WHERE CUEN_COD = :ctaingrem INTO :CUENTA, :TIPOCUEN;
        if (CUENTA IS NULL) then
            begin
            EXECUTE PROCEDURE ERROR (88, :IDDOC, :ctaingrem, 2);
            CUENTA = ctaingrem;
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            EXECUTE PROCEDURE ERROR (88, :IDDOC, :CUENTA, 3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'C') then
            BEGIN
            EXECUTE PROCEDURE ERROR (88, :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, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :nitasoc, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            END
        END /* INGRESO REMESAS */

    /* DOMICILIO */
    if (domicilio <> 0) then
        BEGIN
        CUENTA = NULL;
        SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
            WHERE CUEN_COD = :ctadomic INTO :CUENTA, :TIPOCUEN;
        if (CUENTA IS NULL) then
            begin
            EXECUTE PROCEDURE ERROR (88, :IDDOC, :ctadomic, 2);
            CUENTA = ctadomic;
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            EXECUTE PROCEDURE ERROR (88, :IDDOC, :CUENTA, 3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'C') then
            BEGIN
            EXECUTE PROCEDURE ERROR (88, :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, :NROI, :CUENTA, :CONC, '', 0, :domicilio, 0, 0, :nitasoc, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            END
        END /* DOMICILIO */

    /* SEGUROS */
    if (seguro <> 0) then
        BEGIN
        CUENTA = NULL;
        SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
            WHERE CUEN_COD = :ctaseguro INTO :CUENTA, :TIPOCUEN;
        if (CUENTA IS NULL) then
            begin
            EXECUTE PROCEDURE ERROR (88, :IDDOC, :ctaseguro, 2);
            CUENTA = ctaseguro;
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            EXECUTE PROCEDURE ERROR (88, :IDDOC, :CUENTA, 3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'C') then
            BEGIN
            EXECUTE PROCEDURE ERROR (88, :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, :NROI, :CUENTA, :CONC, '', 0, :seguro, 0, 0, :nitasoc, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            END
        END /* SEGUROS */

    /* la cuenta por pagar al transportador */
    SELECT FPRM_CTACONTA FROM forma_pago_remesa WHERE FPRM_COD = 'C' INTO :ctapagar;
    CONC = 'REMESAS PLANILLA DE PASAJEROS No. ' || :NUMERO;
    SELECT sum(PLPR_VALOR), SUM(CGRM_SEGURO), SUM(CGRM_DOMICILIO) FROM planilla_pasajeros_rem P, carga_remesa R
        WHERE P.plpr_remesa = R.cgrm_id AND R.cgrm_fpago <> 'E' AND P.plpa_id = :iddoc
        INTO :sumacaja, :SEGURO, :DOMICILIO;
    execute procedure redondee(((sumacaja-seguro-domicilio) * ingrem / 100), 0) returning_values (MONTO);
    sumacaja = sumacaja - MONTO - domicilio - seguro;
    if (sumacaja <> 0) then
        BEGIN
        CUENTA = NULL;
        SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
            WHERE CUEN_COD = :ctapagar INTO :CUENTA, :TIPOCUEN;
        if (CUENTA IS NULL) then
            begin
            EXECUTE PROCEDURE ERROR (88, :IDDOC, :ctapagar, 2);
            CUENTA = ctapagar;
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            EXECUTE PROCEDURE ERROR (88, :IDDOC, :CUENTA, 3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'C') then
            BEGIN
            EXECUTE PROCEDURE ERROR (88, :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, :NROI, :CUENTA, :CONC, '', 0, :sumacaja, 0, 0, :nitasoc, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            END
        END /* CTA X PAGAR REMESAS */

    /* RECORRA LOS CONCEPTOS*/
    FOR SELECT copl_ctaconta, plpc_valor
        FROM planilla_pasajeros_con P, conceptos_planilla C
        WHERE P.plpc_conc = C.copl_id AND P.plpa_id = :iddoc ORDER BY P.plpc_item
        INTO :ctaconcepto, :monto
        DO
        BEGIN
        if (MONTO <> 0) then
            BEGIN
            CUENTA = NULL;
            SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :ctaconcepto INTO :CUENTA, :TIPOCUEN;
            if (CUENTA IS NULL) then
                begin
                EXECUTE PROCEDURE ERROR (88, :IDDOC, :ctaconcepto, 2);
                CUENTA = ctaconcepto;
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'I') then
                BEGIN
                EXECUTE PROCEDURE ERROR (88, :IDDOC, :CUENTA, 3);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                EXECUTE PROCEDURE ERROR (88, :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, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :nitasoc, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA - MONTO;
                END
            END
        END /* CONCEPTOS */
    /* LAS CXP */
    if (CXPP <> 0) then
        BEGIN
        SELECT FPRM_CTAPASAJE FROM forma_pago_remesa WHERE FPRM_COD = 'C' INTO :ctapagar;
        CONC = 'PASAJES PLANILLA DE PASAJEROS No. ' || :NUMERO;
        CUENTA = NULL;
        SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
            WHERE CUEN_COD = :ctapagar INTO :CUENTA, :TIPOCUEN;
        if (CUENTA IS NULL) then
            begin
            EXECUTE PROCEDURE ERROR (88, :IDDOC, :ctapagar, 2);
            CUENTA = ctapagar;
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            EXECUTE PROCEDURE ERROR (88, :IDDOC, :CUENTA, 3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'C') then
            BEGIN
            EXECUTE PROCEDURE ERROR (88, :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, :NROI, :CUENTA, :CONC, '', :CXPP, 0, 0, 0, :nitasoc, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            SUMA = suma + cxpp;
            END
        END /* CTA X PAGAR PASAJES */
    SELECT sum(PLPR_VALOR), SUM(CGRM_SEGURO), SUM(CGRM_DOMICILIO) FROM planilla_pasajeros_rem P, carga_remesa R
        WHERE P.plpr_remesa = R.cgrm_id AND R.cgrm_fpago = 'C' AND P.plpa_id = :iddoc
        INTO :sumacaja, :SEGURO, :DOMICILIO;
    execute procedure redondee(((sumacaja-seguro-domicilio) * ingrem / 100), 0) returning_values (MONTO);
    cxpr = sumacaja - MONTO - domicilio - seguro;
    if (CXPR <> 0) then
        BEGIN
        CONC = 'REMESAS PLANILLA DE PASAJEROS No. ' || :NUMERO;
        CUENTA = NULL;
        SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
            WHERE CUEN_COD = :ctapagar INTO :CUENTA, :TIPOCUEN;
        if (CUENTA IS NULL) then
            begin
            EXECUTE PROCEDURE ERROR (88, :IDDOC, :ctapagar, 2);
            CUENTA = ctapagar;
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            EXECUTE PROCEDURE ERROR (88, :IDDOC, :CUENTA, 3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'C') then
            BEGIN
            EXECUTE PROCEDURE ERROR (88, :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, :NROI, :CUENTA, :CONC, '', :CXPR, 0, 0, 0, :nitasoc, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            SUMA = suma + cxpr;
            END
        END /* CTA X PAGAR REMESAS */
    CONC = 'REMESAS CONTRAENTREGA PLANILLA DE PASAJEROS No. ' || :NUMERO;
    if (CONTRAE <> 0) then
        BEGIN
        CUENTA = NULL;
        SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
            WHERE CUEN_COD = :ctacontrae INTO :CUENTA, :TIPOCUEN;
        if (CUENTA IS NULL) then
            begin
            EXECUTE PROCEDURE ERROR (88, :IDDOC, :ctacontrae, 2);
            CUENTA = ctacontrae;
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            EXECUTE PROCEDURE ERROR (88, :IDDOC, :CUENTA, 3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'C') then
            BEGIN
            EXECUTE PROCEDURE ERROR (88, :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, :NROI, :CUENTA, :CONC, '', 0, :CONTRAE, 0, 0, :nitasoc, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            SUMA = SUMA - CONTRAE;
            END
        END /* CONTRAENTREGAS */

    /* CUADRE TODO CONTRA LA CAJA */
    CUENTA = NULL;
    SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
        WHERE CUEN_COD = :ctacaja INTO :CUENTA, :TIPOCUEN;
    if (CUENTA IS NULL) then
        begin
        EXECUTE PROCEDURE ERROR (88, :IDDOC, :ctacaja, 2);
        CUENTA = ctacaja;
        ERROR = ERROR + 1;
        end
    if (TIPOCUEN = 'I') then
        BEGIN
        EXECUTE PROCEDURE ERROR (88, :IDDOC, :CUENTA, 3);
        TIPOCUEN = 'N';
        ERROR = ERROR + 1;
        END
    if (TIPOCUEN = 'C') then
        BEGIN
        EXECUTE PROCEDURE ERROR (88, :IDDOC, :CUENTA, 4);
        TIPOCUEN = 'N';
        ERROR = ERROR + 1;
        END
    if (TIPOCUEN = 'N') then
        BEGIN
        if (SUMA > 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, :SUMA, 0, 0, :NITASOC, :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(:SUMA), 0, 0, 0, :NITASOC, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
        END

    if (ERROR > 0) then
        VER = 'S';
    SUSPEND;
    END /* EXISTE */
ELSE
    BEGIN
    EXECUTE PROCEDURE ERROR (72, :IDDOC, :PREF, 1);
    ERROR = ERROR + 1;
    VER = 'S';
    SUSPEND;
    END
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE CONTABIL_PRODUCCION(
    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 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, TICO_COD, PRCO_PREF, ININ_BASE, ININ_CTABASE, ININ_CTACIERRE, ININ_CONFIRMAR, ININ_CENTRO
    FROM INTERFAZ_INVENTARIO
    WHERE ININ_ID = :IDINTER
    INTO :EXISTE, :PREFIJO, :TIPOCOMP, :PREFCONT, :BASE, :CTABASE, :CTACIERRE, :VER, :CENT;
  if (EXISTE = 'S') then
    BEGIN
    /* BORRE CUALQUEIR CONTABILIZACION PREVIA */
    DELETE FROM CONTABILIZACION WHERE CNTB_TIPOREF = 19 AND CNTB_IDREF = :IDDOC;
    /* TRAIGA EL ENCABEZADO DEL ENSAMBLE */
    SELECT PREF_PRE, PROR_NUMERO, PROR_FECHA, PROR_NIT, PROR_NOMCLIENTE, PROR_ANULADO, ARTI_COD
        FROM PRODUCCION_ORDEN
        WHERE PROR_ID = :IDDOC
        INTO :PREFIJO, :NUMERO, :FECAUX, :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;
        /* CONVIERTA LA FECHA A CADENA */
        EXECUTE PROCEDURE FECHA_A_CONTA(:FECAUX) returning_values (:FECHA);
        /* COMPONGA UN CONCEPTO */
        CONCEPTO = 'ORDEN DE PRODUCCION ' || :prefijo || :numero || '-' || SUBSTRING (:CLIENTE FROM 1 FOR 25);
        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, '', 19, :IDDOC, :PREFIJO, :NUMERO, 'N');
        NUMITEMS = 0;
        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 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
                        WHERE CUEN_COD = :CTABASE INTO :CUENTA, :TIPOCUEN;
                    if (CUENTA IS NULL) then
                        begin
                        EXECUTE PROCEDURE ERROR (19, :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 ERROR (19, :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 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
                        WHERE CUEN_COD = :CTABASE INTO :CUENTA, :TIPOCUEN;
                    if (CUENTA IS NULL) then
                        begin
                        EXECUTE PROCEDURE ERROR (19, :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 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 ERROR (19, :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
                    WHERE CUEN_COD = :CTABASE INTO :CUENTA, :TIPOCUEN;
                if (CUENTA IS NULL) then
                    begin
                    EXECUTE PROCEDURE ERROR (19, :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 ERROR (19, :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 ERROR (19, :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 ERROR (19, :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
                    WHERE CUEN_COD = :CUENTAADIC INTO :CUENTA, :TIPOCUEN;
                if (CUENTA IS NULL) then
                    begin
                    EXECUTE PROCEDURE ERROR (19, :IDDOC, :CUENTAADIC, 2);
                    CUENTA = CUENTAADIC;
                    ERROR = ERROR + 1;
                    end
                if (TIPOCUEN = 'I') then
                    BEGIN
                    EXECUTE PROCEDURE ERROR (19, :IDDOC, :CUENTA, 3);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    EXECUTE PROCEDURE ERROR (19, :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 ERROR (19, :IDDOC, :PREFIJO, 1);
    ERROR = ERROR + 1;
    VER = 'S';
    SUSPEND;
    END
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE CONTABIL_PRODUCCION_DEV(
    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 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, TICO_COD, PRCO_PREF, ININ_BASE, ININ_CTABASE, ININ_CTACIERRE, ININ_CONFIRMAR, ININ_CENTRO
    FROM INTERFAZ_INVENTARIO
    WHERE ININ_ID = :IDINTER
    INTO :EXISTE, :PREFIJO, :TIPOCOMP, :PREFCONT, :BASE, :CTABASE, :CTACIERRE, :VER, :CENT;
  if (EXISTE = 'S') then
    BEGIN
    /* BORRE CUALQUEIR CONTABILIZACION PREVIA */
    DELETE FROM CONTABILIZACION WHERE CNTB_TIPOREF = 29 AND CNTB_IDREF = :IDDOC;
    /* TRAIGA EL ENCABEZADO DEL ENSAMBLE */
    SELECT PRDD_PREF, PRDD_NUMERO, PRDD_FECHA, 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, :FECAUX, :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;
        /* CONVIERTA LA FECHA A CADENA */
        EXECUTE PROCEDURE FECHA_A_CONTA(:FECAUX) returning_values (:FECHA);
        /* COMPONGA UN CONCEPTO */
        CONCEPTO = 'DEVOLUCION MATERIALES ' || :prefijo || :numero || ' EN ORDEN ' || :ORDEN;
        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, '', 29, :IDDOC, :PREFIJO, :NUMERO, 'N');
        NUMITEMS = 0;
        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 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
                        WHERE CUEN_COD = :CTABASE INTO :CUENTA, :TIPOCUEN;
                    if (CUENTA IS NULL) then
                        begin
                        EXECUTE PROCEDURE ERROR (29, :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 ERROR (29, :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 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
                        WHERE CUEN_COD = :CTABASE INTO :CUENTA, :TIPOCUEN;
                    if (CUENTA IS NULL) then
                        begin
                        EXECUTE PROCEDURE ERROR (29, :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 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 ERROR (29, :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
                    WHERE CUEN_COD = :CTABASE INTO :CUENTA, :TIPOCUEN;
                if (CUENTA IS NULL) then
                    begin
                    EXECUTE PROCEDURE ERROR (29, :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 ERROR (29, :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
                    WHERE CUEN_COD = :ctacierre INTO :CUENTA, :TIPOCUEN;
                if (CUENTA IS NULL) then
                    begin
                    EXECUTE PROCEDURE ERROR (29, :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 ERROR (29, :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
                    WHERE CUEN_COD = :CUENTAADIC INTO :CUENTA, :TIPOCUEN;
                if (CUENTA IS NULL) then
                    begin
                    EXECUTE PROCEDURE ERROR (29, :IDDOC, :CUENTAADIC, 2);
                    CUENTA = CUENTAADIC;
                    ERROR = ERROR + 1;
                    end
                if (TIPOCUEN = 'I') then
                    BEGIN
                    EXECUTE PROCEDURE ERROR (29, :IDDOC, :CUENTA, 3);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    EXECUTE PROCEDURE ERROR (29, :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 ERROR (29, :IDDOC, :PREFIJO, 1);
    ERROR = ERROR + 1;
    VER = 'S';
    SUSPEND;
    END
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE CONTABIL_PRODUCCION_ENT(
    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 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, TICO_COD, PRCO_PREF, ININ_BASE, ININ_CTABASE, ININ_CTACIERRE, ININ_CONFIRMAR, ININ_CENTRO
    FROM INTERFAZ_INVENTARIO
    WHERE ININ_ID = :IDINTER
    INTO :EXISTE, :PREFIJO, :TIPOCOMP, :PREFCONT, :BASE, :CTABASE, :CTACIERRE, :VER, :CENT;
  if (EXISTE = 'S') then
    BEGIN
    /* BORRE CUALQUEIR CONTABILIZACION PREVIA */
    DELETE FROM CONTABILIZACION WHERE CNTB_TIPOREF = 20 AND CNTB_IDREF = :IDDOC;
    /* TRAIGA EL ENCABEZADO DEL ENSAMBLE */
    SELECT PRDE_PREF, PRDE_NUMERO, PRDE_FECHA, 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, :FECAUX, :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;
        /* CONVIERTA LA FECHA A CADENA */
        EXECUTE PROCEDURE FECHA_A_CONTA(:FECAUX) returning_values (:FECHA);
        /* COMPONGA UN CONCEPTO */
        CONCEPTO = 'ENTRADA PRODUCCION ' || :prefijo || :numero || '-' || SUBSTRING (:CLIENTE FROM 1 FOR 25);
        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, '', 20, :IDDOC, :PREFIJO, :NUMERO, 'N');
        NUMITEMS = 0;
        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 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
                    WHERE CUEN_COD = :CTABASE INTO :CUENTA, :TIPOCUEN;
                if (CUENTA IS NULL) then
                    begin
                    EXECUTE PROCEDURE ERROR (20, :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 ERROR (20, :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 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
                    WHERE CUEN_COD = :CTABASE INTO :CUENTA, :TIPOCUEN;
                if (CUENTA IS NULL) then
                    begin
                    EXECUTE PROCEDURE ERROR (20, :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 ERROR (20, :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
                WHERE CUEN_COD = :ctacierre INTO :CUENTA, :TIPOCUEN;
            if (CUENTA IS NULL) then
                begin
                EXECUTE PROCEDURE ERROR (20, :IDDOC, :ctacierre, 2);
                CUENTA = ctacierre;
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'I') then
                BEGIN
                EXECUTE PROCEDURE ERROR (20, :IDDOC, :CUENTA, 3);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                EXECUTE PROCEDURE ERROR (20, :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
                    WHERE CUEN_COD = :CUENTAADIC INTO :CUENTA, :TIPOCUEN;
                if (CUENTA IS NULL) then
                    begin
                    EXECUTE PROCEDURE ERROR (20, :IDDOC, :CUENTAADIC, 2);
                    CUENTA = CUENTAADIC;
                    ERROR = ERROR + 1;
                    end
                if (TIPOCUEN = 'I') then
                    BEGIN
                    EXECUTE PROCEDURE ERROR (20, :IDDOC, :CUENTA, 3);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    EXECUTE PROCEDURE ERROR (20, :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 ERROR (28, :IDDOC, :PREFIJO, 1);
    ERROR = ERROR + 1;
    VER = 'S';
    SUSPEND;
    END
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE CONTABIL_PRODUCCION_SAL(
    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 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, TICO_COD, PRCO_PREF, ININ_BASE, ININ_CTABASE, ININ_CTACIERRE, ININ_CONFIRMAR, ININ_CENTRO
    FROM INTERFAZ_INVENTARIO
    WHERE ININ_ID = :IDINTER
    INTO :EXISTE, :PREFIJO, :TIPOCOMP, :PREFCONT, :BASE, :CTABASE, :CTACIERRE, :VER, :CENT;
  if (EXISTE = 'S') then
    BEGIN
    /* BORRE CUALQUEIR CONTABILIZACION PREVIA */
    DELETE FROM CONTABILIZACION WHERE CNTB_TIPOREF = 28 AND CNTB_IDREF = :IDDOC;
    /* TRAIGA EL ENCABEZADO DEL ENSAMBLE */
    SELECT PRSA_PREF, PRSA_NUMERO, PRSA_FECHA, 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, :FECAUX, :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;
        /* CONVIERTA LA FECHA A CADENA */
        EXECUTE PROCEDURE FECHA_A_CONTA(:FECAUX) returning_values (:FECHA);
        /* COMPONGA UN CONCEPTO */
        CONCEPTO = 'SALIDA A PRODUCCION ' || :prefijo || :numero || '-' || SUBSTRING (:CLIENTE FROM 1 FOR 25);
        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, '', 28, :IDDOC, :PREFIJO, :NUMERO, 'N');
        NUMITEMS = 0;
        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 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
                        WHERE CUEN_COD = :CTABASE INTO :CUENTA, :TIPOCUEN;
                    if (CUENTA IS NULL) then
                        begin
                        EXECUTE PROCEDURE ERROR (28, :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 ERROR (28, :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 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
                        WHERE CUEN_COD = :CTABASE INTO :CUENTA, :TIPOCUEN;
                    if (CUENTA IS NULL) then
                        begin
                        EXECUTE PROCEDURE ERROR (28, :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 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 ERROR (28, :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
                    WHERE CUEN_COD = :CTABASE INTO :CUENTA, :TIPOCUEN;
                if (CUENTA IS NULL) then
                    begin
                    EXECUTE PROCEDURE ERROR (28, :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 ERROR (28, :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 ERROR (28, :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 ERROR (28, :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
                    WHERE CUEN_COD = :CUENTAADIC INTO :CUENTA, :TIPOCUEN;
                if (CUENTA IS NULL) then
                    begin
                    EXECUTE PROCEDURE ERROR (28, :IDDOC, :CUENTAADIC, 2);
                    CUENTA = CUENTAADIC;
                    ERROR = ERROR + 1;
                    end
                if (TIPOCUEN = 'I') then
                    BEGIN
                    EXECUTE PROCEDURE ERROR (28, :IDDOC, :CUENTA, 3);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    EXECUTE PROCEDURE ERROR (28, :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 ERROR (28, :IDDOC, :PREFIJO, 1);
    ERROR = ERROR + 1;
    VER = 'S';
    SUSPEND;
    END
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE CONTABIL_RECICAJA(
    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 FECAUX DATE;
declare variable FECHA CHAR(8);
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 TIPOCOMP VARCHAR(3);
declare variable PREFCONT VARCHAR(4);
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);
declare variable AUTORCREE VARCHAR(10);
declare variable FAUTORCREE DATE;
BEGIN
ERROR = 0;
/* BUSQUE LA INTERFACE */
EXISTE = 'N';
SELECT 'S',TICO_COD,PRCO_PRE,INCJ_BASE,INCJ_DTOPP,INCJ_RTFTE,INCJ_RTIVA,INCJ_RTICA,INCJ_RTCREE,INCJ_CAJA,INCJ_CTABASE,INCJ_CTADTO,
    INCJ_CTARTFTE,INCJ_CTARTIVA,INCJ_CTARTICA,INCJ_CTARTCREE,INCJ_CTACAJA,INCJ_CONFIRMAR
    FROM INTERFAZ_CAJA
    WHERE INCJ_ID = :IDINTER
    INTO :EXISTE,:TIPOCOMP,:PREFCONT,:BASE,:DTO,:RTFTE,:RTIVA,:RTICA,:RTCREE,:CAJA,:CTABASE,:CTADTO,
    :CTARTFTE,:CTARTIVA,:CTARTICA,:CTARTCREE,:CTACAJA,:VER;
if (EXISTE = 'S') then
  BEGIN
  /* BORRE LA CONTABILIZACION ANTERIOR */
  execute procedure lee_configuracion('CAJA', 'RECIBOS', 'CUENTA CONTABLE PARA EXCENTES EN RECIBOS DE CAJA') returning_values (ctaexcedente);
  OK = 0;
  FOR SELECT CNTB_ID FROM CONTABILIZACION WHERE CNTB_TIPOREF = 61 AND CNTB_IDREF = :IDDOC INTO :OK DO
    BEGIN
    DELETE FROM CONTABILIZACION_DET WHERE CNTB_ID = :OK;
    DELETE FROM CONTABILIZACION WHERE CNTB_ID = :OK;
    END
  /* TRAIGA EL ENCABEZADO DEL RECIBO */
  SELECT PREF_PRE,RECA_NUMERO,RECA_FECHA,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,:NUM,:FECAUX,: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;
    EXECUTE PROCEDURE FECHA_A_CONTA(:FECAUX) returning_values (:FECHA);
    IDC = GEN_ID(ID_CONTABILIZA,1);
    INSERT INTO CONTABILIZACION (CNTB_ID,CNTB_TIPOCOMP,CNTB_PREFCNT,CNTB_NUMERO,CNTB_FECHA,CNTB_CONCEPTO,CNTB_REF,CNTB_TIPOREF,CNTB_IDREF,CNTB_PREFREF,CNTB_NUMREF,CNTB_PROCESADO)
        VALUES (:IDC,:TIPOCOMP,:PREFCONT,:NUM,:FECHA,:CONC,'',61,:IDDOC,:PREF,:NUM,'N');
    NROI = 0;
    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
                    WHERE CUEN_COD = :CTACAJA INTO :CUENTA,:TIPOCUEN;
            ELSE
                begin
                EXECUTE PROCEDURE ERROR (61,:IDDOC,:CTACAJA,2);
                CUENTA = CTACAJA;
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'I') then
                BEGIN
                EXECUTE PROCEDURE ERROR (61,:IDDOC,:CUENTA,3);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                EXECUTE PROCEDURE ERROR (61,:IDDOC,:CUENTA,4);
                TIPOCUEN = 'N';
                ERROR = ERROR + 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
                        WHERE CUEN_COD = :CTACAJA INTO :CUENTA,:TIPOCUEN;
                ELSE
                    begin
                    EXECUTE PROCEDURE ERROR (61,:IDDOC,:CTACAJA,2);
                    CUENTA = CTACAJA;
                    ERROR = ERROR + 1;
                    end
                if (TIPOCUEN = 'I') then
                    BEGIN
                    EXECUTE PROCEDURE ERROR (61,:IDDOC,:CUENTA,3);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    EXECUTE PROCEDURE ERROR (61,:IDDOC,:CUENTA,4);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 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
                        WHERE CUEN_COD = :CTACAJA INTO :CUENTA,:TIPOCUEN;
                ELSE
                    begin
                    EXECUTE PROCEDURE ERROR (61,:IDDOC,:CTACAJA,2);
                    CUENTA = CTACAJA;
                    ERROR = ERROR + 1;
                    end
                if (TIPOCUEN = 'I') then
                    BEGIN
                    EXECUTE PROCEDURE ERROR (61,:IDDOC,:CUENTA,3);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    EXECUTE PROCEDURE ERROR (61,:IDDOC,:CUENTA,4);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 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
                    WHERE CUEN_COD = :CTADTO INTO :CUENTA,:TIPOCUEN;
            ELSE
                begin
                EXECUTE PROCEDURE ERROR (61,:IDDOC,:CTADTO,2);
                CUENTA = CTADTO;
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'I') then
                BEGIN
                EXECUTE PROCEDURE ERROR (61,:IDDOC,:CUENTA,3);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                EXECUTE PROCEDURE ERROR (61,:IDDOC,:CUENTA,4);
                TIPOCUEN = 'N';
                ERROR = ERROR + 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
                WHERE CUEN_COD = :ctadif INTO :CUENTA,:TIPOCUEN;
        ELSE
            begin
            EXECUTE PROCEDURE ERROR (61,:IDDOC,:ctadif,2);
            CUENTA = ctadif;
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            EXECUTE PROCEDURE ERROR (61,:IDDOC,:CUENTA,3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'C') then
            BEGIN
            EXECUTE PROCEDURE ERROR (61,:IDDOC,:CUENTA,4);
            TIPOCUEN = 'N';
            ERROR = ERROR + 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
        CUENTA = NULL;
        EXECUTE PROCEDURE VALIDE_CUENTA_C (ctaexcedente) RETURNING_VALUES (:OK);
        IF (OK = 0) THEN
            SELECT CUEN_COD,CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :ctaexcedente INTO :CUENTA,:TIPOCUEN;
        ELSE
            begin
            EXECUTE PROCEDURE ERROR (61,:IDDOC,:ctaexcedente,2);
            CUENTA = ctaexcedente;
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            EXECUTE PROCEDURE ERROR (61,:IDDOC,:CUENTA,3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'C') then
            BEGIN
            EXECUTE PROCEDURE ERROR (61,:IDDOC,:CUENTA,4);
            TIPOCUEN = 'N';
            ERROR = ERROR + 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
                WHERE CUEN_COD = :CTARTFTE INTO :CUENTA,:ES_RETENCION,:TIPOCUEN;
        ELSE
            begin
            EXECUTE PROCEDURE ERROR (61,:IDDOC,:CTARTFTE,2);
            CUENTA = CTARTFTE;
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            EXECUTE PROCEDURE ERROR (61,:IDDOC,:CUENTA,3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'C') then
            BEGIN
            EXECUTE PROCEDURE ERROR (61,:IDDOC,:CUENTA,4);
            TIPOCUEN = 'N';
            ERROR = ERROR + 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
                WHERE CUEN_COD = :CTARTIVA INTO :CUENTA,:ES_RETENCION,:TIPOCUEN;
        ELSE
            begin
            EXECUTE PROCEDURE ERROR (61,:IDDOC,:CTARTIVA,2);
            CUENTA = CTARTIVA;
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            EXECUTE PROCEDURE ERROR (61,:IDDOC,:CUENTA,3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'C') then
            BEGIN
            EXECUTE PROCEDURE ERROR (61,:IDDOC,:CUENTA,4);
            TIPOCUEN = 'N';
            ERROR = ERROR + 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
                WHERE CUEN_COD = :CTARTICA INTO :CUENTA,:ES_RETENCION,:TIPOCUEN;
        ELSE
            begin
            EXECUTE PROCEDURE ERROR (61,:IDDOC,:CTARTICA,2);
            CUENTA = CTARTICA;
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            EXECUTE PROCEDURE ERROR (61,:IDDOC,:CUENTA,3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'C') then
            BEGIN
            EXECUTE PROCEDURE ERROR (61,:IDDOC,:CUENTA,4);
            TIPOCUEN = 'N';
            ERROR = ERROR + 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
                    WHERE CUEN_COD = :ctartcree INTO :CUENTA,:ES_RETENCION,:TIPOCUEN;
            ELSE
                begin
                EXECUTE PROCEDURE ERROR (61,:IDDOC,:ctartcree,2);
                CUENTA = CTARTICA;
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'I') then
                BEGIN
                EXECUTE PROCEDURE ERROR (61,:IDDOC,:CUENTA,3);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                EXECUTE PROCEDURE ERROR (61,:IDDOC,:CUENTA,4);
                TIPOCUEN = 'N';
                ERROR = ERROR + 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
                WHERE CUEN_COD = :CTABASE INTO :CUENTA,:TIPOCUEN;
        ELSE
            begin
            EXECUTE PROCEDURE ERROR (61,:IDDOC,:CTABASE,2);
            CUENTA = CTABASE;
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            EXECUTE PROCEDURE ERROR (61,:IDDOC,:CUENTA,3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 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
                    WHERE CUEN_COD = :ctadif INTO :CUENTA,:TIPOCUEN;
            ELSE
                begin
                EXECUTE PROCEDURE ERROR (61,:IDDOC,:ctadif,2);
                CUENTA = ctadif;
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'I') then
                BEGIN
                EXECUTE PROCEDURE ERROR (61,:IDDOC,:CUENTA,3);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                EXECUTE PROCEDURE ERROR (61,:IDDOC,:CUENTA,4);
                TIPOCUEN = 'N';
                ERROR = ERROR + 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
                        WHERE CUEN_COD = :ctartfter INTO :CUENTA,:TIPOCUEN;
                ELSE
                    begin
                    EXECUTE PROCEDURE ERROR (62,:IDDOC,:ctartfter,2);
                    CUENTA = ctartfter;
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    end
                if (TIPOCUEN = 'I') then
                    BEGIN
                    EXECUTE PROCEDURE ERROR (62,:IDDOC,:CUENTA,3);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    EXECUTE PROCEDURE ERROR (62,: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,: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
                        WHERE CUEN_COD = :ctartivar INTO :CUENTA,:TIPOCUEN;
                ELSE
                    begin
                    EXECUTE PROCEDURE ERROR (62,:IDDOC,:ctartivar,2);
                    CUENTA = ctartivar;
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    end
                if (TIPOCUEN = 'I') then
                    BEGIN
                    EXECUTE PROCEDURE ERROR (62,:IDDOC,:CUENTA,3);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    EXECUTE PROCEDURE ERROR (62,: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,: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
                        WHERE CUEN_COD = :ctarticar INTO :CUENTA,:TIPOCUEN;
                ELSE
                    begin
                    EXECUTE PROCEDURE ERROR (62,:IDDOC,:ctarticar,2);
                    CUENTA = ctarticar;
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    end
                if (TIPOCUEN = 'I') then
                    BEGIN
                    EXECUTE PROCEDURE ERROR (62,:IDDOC,:CUENTA,3);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    EXECUTE PROCEDURE ERROR (62,: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,: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
                        WHERE CUEN_COD = :ctartcreer INTO :CUENTA,:TIPOCUEN;
                ELSE
                    begin
                    EXECUTE PROCEDURE ERROR (62,:IDDOC,:ctartcreer,2);
                    CUENTA = ctartcreer;
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    end
                if (TIPOCUEN = 'I') then
                    BEGIN
                    EXECUTE PROCEDURE ERROR (62,:IDDOC,:CUENTA,3);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    EXECUTE PROCEDURE ERROR (62,: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,: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
                    WHERE CUEN_COD = :CTABASE INTO :CUENTA,:TIPOCUEN;
            ELSE
                begin
                EXECUTE PROCEDURE ERROR (61,:IDDOC,:CTABASE,2);
                CUENTA = CTABASE;
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'I') then
                BEGIN
                EXECUTE PROCEDURE ERROR (61,:IDDOC,:CUENTA,3);
                TIPOCUEN = 'N';
                ERROR = ERROR + 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
                        WHERE CUEN_COD = :CTABASE INTO :CUENTA,:TIPOCUEN;
                ELSE
                    begin
                    EXECUTE PROCEDURE ERROR (61,:IDDOC,:CTABASE,2);
                    CUENTA = CTABASE;
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 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 ERROR (61,:IDDOC,:CUENTA,3);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 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
                WHERE CUEN_COD = :CTADIC INTO :CUENTA,:TIPOCUEN;
        ELSE
            begin
            EXECUTE PROCEDURE ERROR (61,:IDDOC,:CTADIC,2);
            CUENTA = CTADIC;
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            EXECUTE PROCEDURE ERROR (61,:IDDOC,:CUENTA,3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'C') then
            BEGIN
            EXECUTE PROCEDURE ERROR (61,:IDDOC,:CUENTA,4);
            TIPOCUEN = 'N';
            ERROR = ERROR + 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 (ERROR > 0) then
        VER = 'S';
    SUSPEND;
    END /* NO ANULADO */
  END /* EXISTE LA INTERFAZ */
ELSE
    BEGIN
    EXECUTE PROCEDURE ERROR (61,:IDDOC,:PREF,1);
    ERROR = ERROR + 1;
    VER = 'S';
    SUSPEND;
    END
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE CONTABIL_RECIPROV(
    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 FECAUX DATE;
declare variable FECHA CHAR(8);
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 VRTOTAL NUMERIC(18, 2);
declare variable TIPOCOMP VARCHAR(3);
declare variable PREFCONT VARCHAR(4);
declare variable BASE CHAR(1);
declare variable CTABASE VARCHAR(20);
declare variable 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 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 TIPOIT 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;
BEGIN
ERROR = 0;
/* BUSQUE LA INTERFACE */
EXISTE = 'N';
SELECT 'S', TICO_COD, PRCO_PRE, INCJ_BASE, INCJ_DTOPP, INCJ_RTFTE, INCJ_RTIVA, INCJ_RTICA, INCJ_CAJA, INCJ_CTABASE, INCJ_CTADTO, INCJ_CTARTFTE, INCJ_CTARTIVA, INCJ_CTARTICA, INCJ_CTACAJA, INCJ_CONFIRMAR
    FROM INTERFAZ_CAJA
    WHERE INCJ_ID = :IDINTER
    INTO :EXISTE, :TIPOCOMP, :PREFCONT, :BASE, :DTO, :RTFTE, :RTIVA, :RTICA, :CAJA, :CTABASE, :CTADTO, :CTARTFTE, :CTARTIVA, :CTARTICA, :CTACAJA, :VER;
if (EXISTE = 'S') then
  BEGIN
  /* BORRE LA CONTABILIZACION ANTERIOR */
  OK = 0;
  FOR SELECT CNTB_ID FROM CONTABILIZACION WHERE CNTB_TIPOREF = 65 AND CNTB_IDREF = :IDDOC INTO :OK DO
    BEGIN
    DELETE FROM CONTABILIZACION_DET WHERE CNTB_ID = :OK;
    DELETE FROM CONTABILIZACION WHERE CNTB_ID = :OK;
    END
  /* TRAIGA EL ENCABEZADO DEL RECIBO */
  SELECT PREF_PRE, RCPR_NUMERO, RCPR_FECHA, R.TERC_NIT, RCPR_CONC, RCPR_DTOF, RCPR_MONTO, RCPR_RTFTE, RCPR_RTIVA, RCPR_RTICA, TERC_CTARTFTE, TERC_CTARTIVA, TERC_CTARTICA, TERC_CTACLIENTE, RCPR_ANULADO
    FROM recibo_provisional R, TERCEROS T
    WHERE RCPR_ID = :IDDOC AND R.TERC_NIT = T.TERC_NIT
    INTO :PREF, :NUM, :FECAUX, :NIT, :CONC, :VRDTO, :VRTOTAL, :VRRTFTE, :VRRTIVA, :VRRTICA, :TCTARTFTE, TCTARTIVA, TCTARTICA, TCTACLIEN, :ANULADO;
  if (ANULADO = 'N') then
    BEGIN
    SELECT PREF_CENTRO, PREF_PROY FROM PREFIJOS
        WHERE PREF_PRE = :PREF AND TIDO_COD = 65 INTO :CENTRO, :PROY;
    EXECUTE PROCEDURE FECHA_A_CONTA(:FECAUX) returning_values (:FECHA);
    /* REGISTRE EL ENCABEZADO CONTABLE */
    IDC = GEN_ID(ID_CONTABILIZA, 1);
    INSERT INTO CONTABILIZACION (CNTB_ID, CNTB_TIPOCOMP, CNTB_PREFCNT, CNTB_NUMERO, CNTB_FECHA, CNTB_CONCEPTO, CNTB_REF, CNTB_TIPOREF, CNTB_IDREF, CNTB_PREFREF, CNTB_NUMREF, CNTB_PROCESADO)
        VALUES (:IDC, :TIPOCOMP, :PREFCONT, :NUM, :FECHA, :CONC, '', 65, :IDDOC, :PREF, :NUM, 'N');
    NROI = 0;
    SUMA = 0;
    IF ((CAJA = 'K')) THEN
        BEGIN
        if (vrtotal <> 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
                    WHERE CUEN_COD = :CTACAJA INTO :CUENTA, :TIPOCUEN;
            ELSE
                begin
                EXECUTE PROCEDURE ERROR (65, :IDDOC, :CTACAJA, 2);
                CUENTA = CTACAJA;
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'I') then
                BEGIN
                EXECUTE PROCEDURE ERROR (65, :IDDOC, :CUENTA, 3);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                EXECUTE PROCEDURE ERROR (65, :IDDOC, :CUENTA, 4);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                IF (vrtotal > 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, '', :vrtotal, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    SUMA = SUMA + vrtotal;
                    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(:vrtotal), 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    SUMA = SUMA + vrtotal;
                    END
                NROI = NROI + 1;
                END
            END /* VRtotal <> 0 */
        END /* CAJA CONSTANTE */
    IF ((CAJA = 'F')) THEN
        BEGIN
        /* AGRUPE LAS CUENTAS DE LAS FORMAS DE PAGO */
        FOR SELECT MAX(FOPA_CTACONTA), SUM(RPPA_MONTO)
            FROM formas_pago F, recibo_provisional_pago R
            WHERE R.RCPR_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
                        WHERE CUEN_COD = :CTACAJA INTO :CUENTA, :TIPOCUEN;
                ELSE
                    begin
                    EXECUTE PROCEDURE ERROR (65, :IDDOC, :CTACAJA, 2);
                    CUENTA = CTACAJA;
                    ERROR = ERROR + 1;
                    end
                if (TIPOCUEN = 'I') then
                    BEGIN
                    EXECUTE PROCEDURE ERROR (65, :IDDOC, :CUENTA, 3);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    EXECUTE PROCEDURE ERROR (65, :IDDOC, :CUENTA, 4);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 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 (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
                    WHERE CUEN_COD = :CTADTO INTO :CUENTA, :TIPOCUEN;
            ELSE
                begin
                EXECUTE PROCEDURE ERROR (65, :IDDOC, :CTADTO, 2);
                CUENTA = CTADTO;
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'I') then
                BEGIN
                EXECUTE PROCEDURE ERROR (65, :IDDOC, :CUENTA, 3);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                EXECUTE PROCEDURE ERROR (65, :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, :NROI, :CUENTA, :CONC, '', :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 */

    /* 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
                WHERE CUEN_COD = :CTARTFTE INTO :CUENTA, :ES_RETENCION, :TIPOCUEN;
        ELSE
            begin
            EXECUTE PROCEDURE ERROR (65, :IDDOC, :CTARTFTE, 2);
            CUENTA = CTARTFTE;
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            EXECUTE PROCEDURE ERROR (65, :IDDOC, :CUENTA, 3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'C') then
            BEGIN
            EXECUTE PROCEDURE ERROR (65, :IDDOC, :CUENTA, 4);
            TIPOCUEN = 'N';
            ERROR = ERROR + 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
                WHERE CUEN_COD = :CTARTIVA INTO :CUENTA, :ES_RETENCION, :TIPOCUEN;
        ELSE
            begin
            EXECUTE PROCEDURE ERROR (65, :IDDOC, :CTARTIVA, 2);
            CUENTA = CTARTIVA;
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            EXECUTE PROCEDURE ERROR (65, :IDDOC, :CUENTA, 3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'C') then
            BEGIN
            EXECUTE PROCEDURE ERROR (65, :IDDOC, :CUENTA, 4);
            TIPOCUEN = 'N';
            ERROR = ERROR + 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
                WHERE CUEN_COD = :CTARTICA INTO :CUENTA, :ES_RETENCION, :TIPOCUEN;
        ELSE
            begin
            EXECUTE PROCEDURE ERROR (65, :IDDOC, :CTARTICA, 2);
            CUENTA = CTARTICA;
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            EXECUTE PROCEDURE ERROR (65, :IDDOC, :CUENTA, 3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'C') then
            BEGIN
            EXECUTE PROCEDURE ERROR (65, :IDDOC, :CUENTA, 4);
            TIPOCUEN = 'N';
            ERROR = ERROR + 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 */
    /* CIERRE EL COMPROBANTE CONTRA LA CUENTA DEL TERCERO O LA BASE CONSTANTE */
    if ((SUMA <> 0) and ((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
                WHERE CUEN_COD = :CTABASE INTO :CUENTA, :TIPOCUEN;
        ELSE
            begin
            EXECUTE PROCEDURE ERROR (65, :IDDOC, :CTABASE, 2);
            CUENTA = CTABASE;
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            EXECUTE PROCEDURE ERROR (65, :IDDOC, :CUENTA, 3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 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 */
    /* 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
                WHERE CUEN_COD = :CTADIC INTO :CUENTA, :TIPOCUEN;
        ELSE
            begin
            EXECUTE PROCEDURE ERROR (65, :IDDOC, :CTADIC, 2);
            CUENTA = CTADIC;
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            EXECUTE PROCEDURE ERROR (65, :IDDOC, :CUENTA, 3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'C') then
            BEGIN
            EXECUTE PROCEDURE ERROR (65, :IDDOC, :CUENTA, 4);
            TIPOCUEN = 'N';
            ERROR = ERROR + 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 (ERROR > 0) then
        VER = 'S';
    SUSPEND;
    END /* NO ANULADO */
  END /* EXISTE LA INTERFAZ */
ELSE
    BEGIN
    EXECUTE PROCEDURE ERROR (65, :IDDOC, :PREF, 1);
    ERROR = ERROR + 1;
    VER = 'S';
    SUSPEND;
    END
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE CONTABIL_REMESA(
    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 TIPOCOMP VARCHAR(3);
declare variable PREFCONT VARCHAR(4);
declare variable CTAPAGARF VARCHAR(20);
declare variable CAJA CHAR(1);
declare variable CTACAJA VARCHAR(20);
declare variable CARTERA CHAR(1);
declare variable CTACARTERA VARCHAR(20);
declare variable EXISTE CHAR(1);
declare variable CUENTA VARCHAR(20);
declare variable TIPOCUEN CHAR(1);
declare variable NITASOC VARCHAR(20);
declare variable NITCLI VARCHAR(20);
declare variable PROY VARCHAR(4);
declare variable CENTRO VARCHAR(4);
declare variable NROI INTEGER;
declare variable SEGURO NUMERIC(18,2);
declare variable CTASEGURO VARCHAR(20);
declare variable CTACONTRAE VARCHAR(20);
declare variable CTASEGXC VARCHAR(20);
declare variable FORMA CHAR(1);
declare variable VALOR NUMERIC(18,2);
BEGIN
/* BUSQUE LA INTERFACE */
EXISTE = 'N';
SELECT 'S', TICO_COD, PRCO_PREF, INTR_CONFIRMAR, INTR_CAJA, INTR_CTACAJA,
    INTR_CARTERA, INTR_CTACARTERA, INTR_CTASEGURO, intr_ctacontrae
    FROM interfaz_transporte
    WHERE INTR_ID = :IDINTER
    INTO :EXISTE, :TIPOCOMP, :PREFCONT, :VER, :CAJA, :CTACAJA,
        :CARTERA, :CTACARTERA, :ctaseguro, :ctacontrae;
if (EXISTE = 'S') then
    BEGIN
    DELETE FROM contabilizacion WHERE CNTB_TIPOREF = 85 AND CNTB_IDREF = :IDDOC;

    /* TRAIGA EL ENCABEZADO  */
    SELECT CGRM_PREF, CGRM_NUMERO, CGRM_FECHA, CGRM_TOTAL, CGRM_SEGURO, CGRM_FPAGO, CGRM_NIT
        FROM carga_remesa WHERE CGRM_ID = :IDDOC
        INTO :PREF, :NUM, :FECAUX, :valor, :seguro, :forma, :nitcli;
    NUMERO = PREF || NUM;
    SELECT PREF_CENTRO, PREF_PROY FROM prefijos P WHERE P.pref_pre = :pref AND P.tido_cod = 85
        INTO :CENTRO, :PROY;
    EXECUTE PROCEDURE FECHA_A_CONTA(:FECAUX) returning_values (:FECHA);
    /* REGISTRE EL ENCABEZADO CONTABLE */
    CONC = 'REMESA DE CARGA No. ' || :NUMERO;
    IDC = GEN_ID(ID_CONTABILIZA, 1);
    INSERT INTO CONTABILIZACION (CNTB_ID, CNTB_TIPOCOMP, CNTB_PREFCNT, CNTB_NUMERO, CNTB_FECHA, CNTB_CONCEPTO, CNTB_REF, CNTB_TIPOREF, CNTB_IDREF, CNTB_PREFREF, CNTB_NUMREF, CNTB_PROCESADO)
        VALUES (:IDC, :TIPOCOMP, :PREFCONT, :NUM, :FECHA, :CONC, '', 85, :IDDOC, :PREF, :NUM, 'N');
    NROI = 0;
    ERROR = 0;

    SELECT FPRM_CTASEGURO, FPRM_CTACONTA FROM forma_pago_remesa WHERE FPRM_COD = :FORMA INTO :ctasegxc, :ctapagarf;
    EXECUTE PROCEDURE LEE_CONFIGURACION('CONTABILIDAD', 'GENERAL', 'NIT COMPAÑIA') RETURNING_VALUES (:nitasoc);
    if (VALOR <> 0) then
      BEGIN
      /* SI ES DE CONTADO */
      if (FORMA = 'C') then
        BEGIN
        /* LA CAJA */
        if (CAJA = 'C') then
            SELECT FIRST 1 CAJA_CUENTA FROM CAJAS c, carga_remesa R WHERE r.cgrm_fpago = 'C' AND R.cgrm_caja = C.caja_id INTO :ctacaja;
        CUENTA = NULL;
        SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
            WHERE CUEN_COD = :ctacaja INTO :CUENTA, :TIPOCUEN;
        if (CUENTA IS NULL) then
            begin
            EXECUTE PROCEDURE ERROR (85, :IDDOC, :ctacaja, 2);
            CUENTA = ctacaja;
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            EXECUTE PROCEDURE ERROR (85, :IDDOC, :CUENTA, 3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'C') then
            BEGIN
            EXECUTE PROCEDURE ERROR (85, :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, :NROI, :CUENTA, :CONC, '', :valor, 0, 0, 0, :nitasoc, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            END
        END
      if (FORMA = 'R') then
        BEGIN
        /* LA CARTERA */
        if (CARTERA = 'T') then
            SELECT TERC_CTACLIENTE FROM TERCEROS WHERE TERC_NIT = :nitcli INTO :ctacartera;

        CUENTA = NULL;
        SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
            WHERE CUEN_COD = :ctacartera INTO :CUENTA, :TIPOCUEN;
        if (CUENTA IS NULL) then
            begin
            EXECUTE PROCEDURE ERROR (89, :IDDOC, :ctacartera, 2);
            CUENTA = ctacartera;
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            EXECUTE PROCEDURE ERROR (89, :IDDOC, :CUENTA, 3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'C') then
            BEGIN
            EXECUTE PROCEDURE ERROR (89, :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, :NROI, :CUENTA, :CONC, '', :valor-:seguro, 0, 0, 0, :nitcli, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            END
        /* SEGURO X COBRAR */
        if (SEGURO <> 0) then
            BEGIN
            CUENTA = NULL;
            SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :ctasegxc INTO :CUENTA, :TIPOCUEN;
            if (CUENTA IS NULL) then
                begin
                EXECUTE PROCEDURE ERROR (85, :IDDOC, :ctasegxc, 2);
                CUENTA = ctasegxc;
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'I') then
                BEGIN
                EXECUTE PROCEDURE ERROR (85, :IDDOC, :CUENTA, 3);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                EXECUTE PROCEDURE ERROR (85, :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, :NROI, :CUENTA, :CONC, '', :seguro, 0, 0, 0, :nitcli, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                END
            END
        END
      if (FORMA = 'E') then
        BEGIN
        CUENTA = NULL;
        SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
            WHERE CUEN_COD = :ctacontrae INTO :CUENTA, :TIPOCUEN;
        if (CUENTA IS NULL) then
            begin
            EXECUTE PROCEDURE ERROR (85, :IDDOC, :ctacontrae, 2);
            CUENTA = ctacontrae;
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            EXECUTE PROCEDURE ERROR (85, :IDDOC, :CUENTA, 3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'C') then
            BEGIN
            EXECUTE PROCEDURE ERROR (85, :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, :NROI, :CUENTA, :CONC, '', :valor-:seguro, 0, 0, 0, :nitasoc, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            END
        if (seguro <> 0) then
            BEGIN
            CUENTA = NULL;
            SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :ctasegxc INTO :CUENTA, :TIPOCUEN;
            if (CUENTA IS NULL) then
                begin
                EXECUTE PROCEDURE ERROR (85, :IDDOC, :ctasegxc, 2);
                CUENTA = ctasegxc;
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'I') then
                BEGIN
                EXECUTE PROCEDURE ERROR (85, :IDDOC, :CUENTA, 3);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                EXECUTE PROCEDURE ERROR (85, :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, :NROI, :CUENTA, :CONC, '', :seguro, 0, 0, 0, :nitasoc, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                END
            END /* SEGUROS */
        END
      END /* VALOR */

    /* INGRESO POR SEGUROS */
    if (seguro <> 0) then
        BEGIN
        CUENTA = NULL;
        SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
            WHERE CUEN_COD = :ctaseguro INTO :CUENTA, :TIPOCUEN;
        if (CUENTA IS NULL) then
            begin
            EXECUTE PROCEDURE ERROR (85, :IDDOC, :ctaseguro, 2);
            CUENTA = ctaseguro;
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            EXECUTE PROCEDURE ERROR (85, :IDDOC, :CUENTA, 3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'C') then
            BEGIN
            EXECUTE PROCEDURE ERROR (85, :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, :NROI, :CUENTA, :CONC, '', 0, :seguro, 0, 0, :nitasoc, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            END
        END /* SEGUROS */

    /* la cuenta por pagar al transportador */
    if ((VALOR - seguro) <> 0) then
        BEGIN
        CUENTA = NULL;
        SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
            WHERE CUEN_COD = :ctapagarf INTO :CUENTA, :TIPOCUEN;
        if (CUENTA IS NULL) then
            begin
            EXECUTE PROCEDURE ERROR (85, :IDDOC, :ctapagarf, 2);
            CUENTA = ctapagarf;
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            EXECUTE PROCEDURE ERROR (85, :IDDOC, :CUENTA, 3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'C') then
            BEGIN
            EXECUTE PROCEDURE ERROR (85, :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, :NROI, :CUENTA, :CONC, '', 0, :valor-:seguro, 0, 0, :nitasoc, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            END
        END
    if (ERROR > 0) then
        VER = 'S';
    SUSPEND;
    END /* EXISTE */
ELSE
    BEGIN
    EXECUTE PROCEDURE ERROR (85, :IDDOC, :PREF, 1);
    ERROR = ERROR + 1;
    VER = 'S';
    SUSPEND;
    END
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE CONTABIL_RETIRO(
    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 TIPOCOMP VARCHAR(3);
declare variable PREFCONT VARCHAR(4);
declare variable BASE CHAR(1);
declare variable CTABASE VARCHAR(20);
declare variable IVA CHAR(1);
declare variable CTAIVA VARCHAR(20);
declare variable GMF CHAR(1);
declare variable CTAGMF VARCHAR(20);
declare variable BANCO CHAR(1);
declare variable CTABANCO VARCHAR(20);
declare variable EXISTE CHAR(1);
declare variable CUENTA VARCHAR(20);
declare variable MONTO NUMERIC(18,2);
declare variable VRGMF NUMERIC(18,2);
declare variable VRIVA 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 NROI INTEGER;
declare variable SUMA NUMERIC(18,2);
declare variable BCTABANCO VARCHAR(20);
declare variable BCTAIVA VARCHAR(20);
declare variable BCTAGMF 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 ANULADO CHAR(1);
BEGIN
ERROR = 0;
/* BUSQUE LA INTERFACE */
EXISTE = 'N';
SELECT 'S', TICO_COD, PRCO_PRE, INBA_BANCO, INBA_IVA, INBA_GMF, INBA_BASE, INBA_CTABCO, INBA_CTAIVA, INBA_CTAGMF, INBA_CTABASE, INBA_CONFIRMAR
    FROM INTERFAZ_BANCOS
    WHERE INBA_ID = :IDINTER
    INTO :EXISTE, :TIPOCOMP, :PREFCONT, :BANCO, :IVA, :GMF, :BASE, :CTABANCO, CTAIVA, CTAGMF, CTABASE, :VER;
if (EXISTE = 'S') then
  BEGIN
  /* BORRE CUALQUEIR CONTABILIZACION PREVIA */
  DELETE FROM CONTABILIZACION WHERE CNTB_TIPOREF = 73 AND CNTB_IDREF = :IDDOC;
  /* TRAIGA EL ENCABEZADO  */
  SELECT PRBA_PREF, RETI_NUMERO, RETI_FECHA, RETI_CONCEPTO, RETI_MONTO, RETI_GMFMONTO, RETI_IVAMONTO, CUBA_CTACONTA, CUBA_CTAIVA, CUBA_CTAGMF, RETI_ANULADO, TERC_NIT
    FROM RETIROS R, CUENTAS_BANCO C
    WHERE RETI_ID = :IDDOC AND C.CUBA_COD = R.CUBA_COD
    INTO :PREF, :NUM, :FECAUX, :CONC, :MONTO, :VRGMF, :VRIVA, :BCTABANCO, :BCTAIVA, :BCTAGMF, :ANULADO, :NIT;
  if (ANULADO = 'N') then
    BEGIN
    NUMERO = PREF || NUM;
    SELECT PRBA_CENTRO, PRBA_PROY FROM PREFIJOS_BANCOS P, RETIROS R
        WHERE P.PRBA_PREF = R.PRBA_PREF AND P.CUBA_COD = R.CUBA_COD AND R.RETI_ID = :IDDOC AND P.TIDO_COD = 73
        INTO :CENTRO, :PROY;
    EXECUTE PROCEDURE FECHA_A_CONTA(:FECAUX) returning_values (:FECHA);
    /* REGISTRE EL ENCABEZADO CONTABLE */
    IDC = GEN_ID(ID_CONTABILIZA, 1);
    INSERT INTO CONTABILIZACION (CNTB_ID, CNTB_TIPOCOMP, CNTB_PREFCNT, CNTB_NUMERO, CNTB_FECHA, CNTB_CONCEPTO, CNTB_REF, CNTB_TIPOREF, CNTB_IDREF, CNTB_PREFREF, CNTB_NUMREF, CNTB_PROCESADO)
        VALUES (:IDC, :TIPOCOMP, :PREFCONT, :NUM, :FECHA, :CONC, '', 71, :IDDOC, :PREF, :NUM, 'N');
    NROI = 0;
    SUMA = 0;
    /* CUENTA BASE */
    if (BASE = 'K') then
        BEGIN
        CUENTA = NULL;
        SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
            WHERE CUEN_COD = :CTABASE INTO :CUENTA, :TIPOCUEN;
        if (CUENTA IS NULL) then
            begin
            EXECUTE PROCEDURE ERROR (73, :IDDOC, :CTABASE, 2);
            CUENTA = CTABASE;
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            EXECUTE PROCEDURE ERROR (73, :IDDOC, :CUENTA, 3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'C') then
            BEGIN
            EXECUTE PROCEDURE ERROR (73, :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, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            END
        END /* BASE = K */
    /* CUENTA GMF */
    if ((GMF = 'K') or (GMF = 'B'))then
        BEGIN
        if (GMF = 'B') then
            CTAGMF = BCTAGMF;
        CUENTA = NULL;
        SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS WHERE CUEN_COD = :CTAGMF
            INTO :CUENTA, :TIPOCUEN;
        if (CUENTA IS NULL) then
            begin
            EXECUTE PROCEDURE ERROR (73, :IDDOC, :CTAGMF, 2);
            CUENTA = CTAGMF;
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            EXECUTE PROCEDURE ERROR (73, :IDDOC, :CUENTA, 3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'C') then
            BEGIN
            EXECUTE PROCEDURE ERROR (73, :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, :NROI, :CUENTA, :CONC, '', :VRGMF, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            END
        END /* GMF */
    /* CUENTA IVA */
    if ((IVA = 'K') or (IVA = 'B'))then
        BEGIN
        if (IVA = 'B') then
            CTAIVA = BCTAIVA;
        CUENTA = NULL;
        SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS WHERE CUEN_COD = :CTAIVA
            INTO :CUENTA, :TIPOCUEN;
        if (CUENTA IS NULL) then
            begin
            EXECUTE PROCEDURE ERROR (73, :IDDOC, :CTAIVA, 2);
            CUENTA = CTAIVA;
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            EXECUTE PROCEDURE ERROR (73, :IDDOC, :CUENTA, 3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'C') then
            BEGIN
            EXECUTE PROCEDURE ERROR (73, :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, :NROI, :CUENTA, :CONC, '', :VRIVA, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            END
        END /* IVA */
    /* CUENTA BANCO */
    if ((BANCO = 'B') or (BANCO = 'K')) then
        BEGIN
        if (BANCO = 'B') then
            CTABANCO = BCTABANCO;
        SUMA = MONTO + VRGMF + VRIVA;
        if (SUMA <> 0) then
            BEGIN
            CUENTA = NULL;
            SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS WHERE CUEN_COD = :CTABANCO
                INTO :CUENTA, :TIPOCUEN;
            if (CUENTA IS NULL) then
                begin
                EXECUTE PROCEDURE ERROR (73, :IDDOC, :CTABANCO, 2);
                CUENTA = CTABANCO;
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'I') then
                BEGIN
                EXECUTE PROCEDURE ERROR (73, :IDDOC, :CUENTA, 3);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                EXECUTE PROCEDURE ERROR (73, :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, :NROI, :CUENTA, :CONC, '', 0, :SUMA, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                END
            END /* SUMA <> 0 */
        END /* BANCO K O B */
    /* recorra las cuentas adicionales */
    FOR SELECT INBC_CUENTA, INBC_BASE, INBC_PORC, INBC_VALOR, INBC_DB
        FROM INTERFAZ_BANCOS_CTAS
        WHERE INBA_ID = :IDINTER
        INTO :CUENTAADIC, :BASEADIC, :PORCADIC, :VALORADIC, :DBADIC
        DO
        BEGIN
        if (:BASEADIC = 'MONTO') then
            VALORADIC = MONTO;
        MONTO = VALORADIC * PORCADIC;
        
        /* TRAIGA LAS CARACTERISTICAS DE LA CUENTA */
        CUENTA = NULL;
        SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS WHERE CUEN_COD = :CUENTAADIC
            INTO :CUENTA, :TIPOCUEN;
        IF (CUENTA IS NULL) THEN
            begin
            EXECUTE PROCEDURE ERROR (73, :IDDOC, :CUENTAADIC, 2);
            CUENTA = CUENTAADIC;
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            EXECUTE PROCEDURE ERROR (73, :IDDOC, :CUENTA, 3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'C') then
            BEGIN
            EXECUTE PROCEDURE ERROR (73, :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, :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
    if (ERROR > 0) then
        VER = 'S';
    SUSPEND;
    END /* NO ANULADO */
  END /* EXISTE LA INTERFAZ */
ELSE
    BEGIN
    EXECUTE PROCEDURE ERROR (73, :IDDOC, :PREF, 1);
    ERROR = ERROR + 1;
    VER = 'S';
    SUSPEND;
    END
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE CONTABIL_RUTERO(
    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 VENCE CHAR(8);
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 CARTERA CHAR(1);
declare variable CTACARTERA 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 SUMA NUMERIC(18,2);
declare variable TCTACLIEN VARCHAR(20);
declare variable TCTABASE VARCHAR(20);
declare variable ANULADO CHAR(1);
BEGIN
/* BUSQUE LA INTERFACE */
EXISTE = 'N';
SELECT 'S', TICO_COD, PRCO_PRE, INVE_VENTAS, INVE_CARTERA, INVE_CTAVENTAS, INVE_CTACARTERA, INVE_CONFIRMAR
    FROM INTERFAZ_VENTAS
    WHERE INVE_ID = :IDINTER
    INTO :EXISTE, :TIPOCOMP, :PREFCONT, :VENTAS, :CARTERA, :CTAVENTAS, :CTACARTERA, :VER;
if (EXISTE = 'S') then
  BEGIN
  /* BORRE CUALQUEIR CONTABILIZACION PREVIA */
  DELETE FROM CONTABILIZACION WHERE CNTB_TIPOREF = 37 AND CNTB_IDREF = :IDDOC;
  /* TRAIGA EL ENCABEZADO DEL RUTERO */
  SELECT PREF_PRE, RUTE_NUMERO, RUTE_FECHA, RUTE_ANULADO
        FROM rutero R
        WHERE RUTE_ID = :IDDOC
        INTO :PREF, :NUM, :FECAUX, :ANULADO;
  if (ANULADO = 'N') then
    BEGIN
    SELECT PREF_CENTRO, PREF_PROY FROM PREFIJOS P, rutero R
        WHERE P.PREF_PRE = R.PREF_PRE AND P.TIDO_COD = 37 AND RUTE_ID = :IDDOC INTO :CENTRO, :PROY;
    NUMERO = PREF || NUM;

    EXECUTE PROCEDURE FECHA_A_CONTA(:FECAUX) returning_values (:FECHA);
    EXECUTE PROCEDURE FECHA_A_CONTA(:FECAUX) returning_values (:VENCE);
    /* REGISTRE EL ENCABEZADO CONTABLE */
    IDC = GEN_ID(ID_CONTABILIZA, 1);
    CONC = 'ENTREGA FACTURAS No. ' || :PREF || :NUM;
    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, '', 37, :IDDOC, :PREF, :NUM, 'N');
    NROI = 0;
    SUMA = 0;
    ERROR = 0;
    IF ((VENTAS = 'C') OR (VENTAS = 'K')) THEN
        BEGIN
        FOR SELECT RUTD_NIT, RUTD_PREF || RUTD_NUMERO, RUTD_VALOR, TERC_CTAVENTA, TERC_CTACLIENTE
            FROM RUTERO_DETALLE RD, TERCEROS T
            WHERE RD.rute_id = :iddoc AND RUTD_VALOR <> 0 AND RD.rutd_nit = T.terc_nit
            INTO :nit, :numero, :vrtotal, :tctabase, :tctaclien
            DO
            BEGIN
            IF (VENTAS = 'C') THEN
                ctaventas = TCTABASE;
            CUENTA = NULL;
            SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :ctaventas INTO :CUENTA, :TIPOCUEN;
            if (CUENTA IS NULL) then
                begin
                EXECUTE PROCEDURE ERROR (37, :IDDOC, :ctaventas, 2);
                CUENTA = ctaventas;
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'I') then
                BEGIN
                EXECUTE PROCEDURE ERROR (37, :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, '', :vrtotal, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 37);
                NROI = NROI + 1;
                SUMA = SUMA + vrtotal;
                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);
                NROI = NROI + 1;
                SUMA = SUMA + vrtotal;
                END
            END /* MONTO <> 0 */
        END /* BASE CLIENTE O CONSTANTE */
    /* CIERRE EL COMPROBANTE CONTRA LA CUENTA DEL TERCERO O LA CONSTANTE */
    if ((cartera = 'C') or (cartera = 'K')) then
        BEGIN
        FOR SELECT RUTD_NIT, RUTD_PREF || RUTD_NUMERO, RUTD_VALOR, TERC_CTAVENTA, TERC_CTACLIENTE
            FROM RUTERO_DETALLE RD, TERCEROS T
            WHERE RD.rute_id = :iddoc AND RUTD_VALOR <> 0 AND RD.rutd_nit = T.terc_nit
            INTO :nit, :numero, :vrtotal, tctabase, tctaclien
            DO
            BEGIN
            if (cartera = 'C') then
                ctacartera = TCTACLIEN;
            CUENTA = NULL;
            SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :ctacartera INTO :CUENTA, :TIPOCUEN;
            IF (CUENTA IS NULL) then
                begin
                EXECUTE PROCEDURE ERROR (37, :IDDOC, :ctacartera, 2);
                CUENTA = ctacartera;
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'I') then
                BEGIN
                EXECUTE PROCEDURE ERROR (37, :IDDOC, :CUENTA, 3);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                END
            if (TIPOCUEN = 'C') then
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :vrtotal, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 37);
            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, '', 0, :vrtotal, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            END
        END /* SUMA EN CARTERA */
    if (ERROR > 0) then
        VER = 'S';
    SUSPEND;
    END /* NO ANULADO */
  END /* EXISTE LA INTERFAZ */
ELSE
    BEGIN
    EXECUTE PROCEDURE ERROR (37, :IDDOC, :PREF, 1);
    ERROR = ERROR + 1;
    VER = 'S';
    SUSPEND;
    END
END
^

SET TERM ; ^

SET TERM ^ ;

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;
        /* 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 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;
                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 ERROR (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 ERROR (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 ERROR (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 ERROR (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(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;
                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 ERROR (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 ERROR (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 ERROR (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 ERROR (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 ERROR (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 ERROR (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 ERROR (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 ERROR (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 ERROR (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 ERROR (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 ERROR (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 ERROR (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 ERROR (12, :IDDOC, :CUENTAADIC, 2);
                    CUENTA = CUENTAADIC;
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    end
                if (TIPOCUEN = 'I') then
                    BEGIN
                    EXECUTE PROCEDURE ERROR (12, :IDDOC, :CUENTA, 3);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    EXECUTE PROCEDURE ERROR (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 ERROR (12, :IDDOC, :CTACIERRE, 2);
                    CUENTA = CTACIERRE;
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    end
                if (TIPOCUEN = 'I') then
                    BEGIN
                    EXECUTE PROCEDURE ERROR (12, :IDDOC, :CUENTA, 3);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    EXECUTE PROCEDURE ERROR (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 ERROR (12, :IDDOC, :PREFIJO, 1);
    ERROR = ERROR + 1;
    VER = 'S';
    SUSPEND;
    END
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE CONTABIL_TRASCUENTA(
    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 CTADEST INTEGER;
declare variable TIPOCOMP VARCHAR(3);
declare variable PREFCONT VARCHAR(4);
declare variable BASE CHAR(1);
declare variable CTABASE VARCHAR(20);
declare variable IVA CHAR(1);
declare variable CTAIVA VARCHAR(20);
declare variable GMF CHAR(1);
declare variable CTAGMF VARCHAR(20);
declare variable BANCO CHAR(1);
declare variable CTABANCO VARCHAR(20);
declare variable EXISTE CHAR(1);
declare variable CUENTA VARCHAR(20);
declare variable MONTO NUMERIC(18,2);
declare variable VRGMF NUMERIC(18,2);
declare variable VRIVA NUMERIC(18,2);
declare variable VRNOTA 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 NROI INTEGER;
declare variable SUMA NUMERIC(18,2);
declare variable BCTABANCO VARCHAR(20);
declare variable BCTAIVA VARCHAR(20);
declare variable BCTAGMF 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 ANULADO CHAR(1);
BEGIN
/* BUSQUE LA INTERFACE */
EXISTE = 'N';
SELECT 'S', TICO_COD, PRCO_PRE, INBA_BANCO, INBA_IVA, INBA_GMF, INBA_BASE, INBA_CTABCO, INBA_CTAIVA, INBA_CTAGMF, INBA_CTABASE, INBA_CONFIRMAR
    FROM INTERFAZ_BANCOS
    WHERE INBA_ID = :IDINTER
    INTO :EXISTE, :TIPOCOMP, :PREFCONT, :BANCO, :IVA, :GMF, :BASE, :CTABANCO, CTAIVA, CTAGMF, CTABASE, :VER;
if (EXISTE = 'S') then
  BEGIN
  /* BORRE CUALQUEIR CONTABILIZACION PREVIA */
  DELETE FROM CONTABILIZACION WHERE CNTB_TIPOREF = 76 AND CNTB_IDREF = :IDDOC;
  /* TRAIGA EL ENCABEZADO  */
  SELECT PRBA_PREF, TRAS_NUMERO, TRAS_FECHA, TRAS_CONCEPTO, TRAS_CTADEST, TRAS_MONTO, TRAS_GMFMONTO, TRAS_IVAMONTO2, TRAS_NOTAMONTO, CUBA_CTACONTA, CUBA_CTAIVA, CUBA_CTAGMF, TRAS_ANULADO, BANC_NIT
        FROM TRASLADOS T, CUENTAS_BANCO C, BANCOS B
        WHERE TRAS_ID = :IDDOC AND C.CUBA_COD = T.CUBA_COD AND C.BANC_COD = B.BANC_COD
        INTO :PREF, :NUM, :FECAUX, :CONC, :CTADEST, :MONTO, :VRGMF, :VRIVA, :VRNOTA, :BCTABANCO, :BCTAIVA, :BCTAGMF, :ANULADO, :NIT;
  if (ANULADO = 'N') then
    BEGIN
    if (VRIVA IS NULL) then
        VRIVA = 0;
    if (VRGMF IS NULL) then
        VRGMF = 0;
    if (VRNOTA IS NULL) then
        VRNOTA = 0;
    SELECT PRBA_CENTRO, PRBA_PROY FROM PREFIJOS_BANCOS P, TRASLADOS T
        WHERE P.PRBA_PREF = T.PRBA_PREF AND P.CUBA_COD = T.CUBA_COD AND P.tido_cod = 76 AND T.TRAS_ID = :IDDOC
        INTO :CENTRO, :PROY;
    NUMERO = PREF || NUM;
    EXECUTE PROCEDURE FECHA_A_CONTA(:FECAUX) returning_values (:FECHA);
    /* REGISTRE EL ENCABEZADO CONTABLE */
    IDC = GEN_ID(ID_CONTABILIZA, 1);
    INSERT INTO CONTABILIZACION (CNTB_ID, CNTB_TIPOCOMP, CNTB_PREFCNT, CNTB_NUMERO, CNTB_FECHA, CNTB_CONCEPTO, CNTB_REF, CNTB_TIPOREF, CNTB_IDREF, CNTB_PREFREF, CNTB_NUMREF, CNTB_PROCESADO)
        VALUES (:IDC, :TIPOCOMP, :PREFCONT, :NUM, :FECHA, :CONC, '', 76, :IDDOC, :PREF, :NUM, 'N');
    NROI = 0;
    SUMA = 0;
    /* CUENTA BASE */
    if ((BASE = 'K') or (BASE = 'C')) then
        BEGIN
        if (BASE = 'C') then
            BEGIN
            SELECT CUBA_CTACONTA FROM CUENTAS_BANCO
                WHERE CUBA_COD = :CTADEST INTO :CTABASE;
            END
        CUENTA = NULL;
        SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
            WHERE CUEN_COD = :CTABASE INTO :CUENTA, :TIPOCUEN;
        if (CUENTA IS NULL) then
            begin
            EXECUTE PROCEDURE ERROR (76, :IDDOC, :CTABASE, 2);
            CUENTA = CTABASE;
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            EXECUTE PROCEDURE ERROR (76, :IDDOC, :CUENTA, 3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'C') then
            BEGIN
            EXECUTE PROCEDURE ERROR (76, :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, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            SUMA = MONTO;
            END
        END /* BASE = K */
    /* CUENTA GMF */
    if ((VRGMF <> 0) AND ((GMF = 'K') or (GMF = 'B'))) then
        BEGIN
        if (GMF = 'B') then
            CTAGMF = BCTAGMF;
        CUENTA = NULL;
        SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
            WHERE CUEN_COD = :CTAGMF INTO :CUENTA, :TIPOCUEN;
        if (CUENTA IS NULL) then
            begin
            EXECUTE PROCEDURE ERROR (76, :IDDOC, :CTAGMF, 2);
            CUENTA = CTAGMF;
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            EXECUTE PROCEDURE ERROR (76, :IDDOC, :CUENTA, 3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'C') then
            BEGIN
            EXECUTE PROCEDURE ERROR (76, :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, :NROI, :CUENTA, :CONC, '', :VRGMF, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            SUMA = SUMA + VRGMF;
            END
        END /* GMF */
    /* CUENTA IVA */
    if ((VRIVA <> 0) AND ((IVA = 'K') or (IVA = 'B'))) then
        BEGIN
        if (IVA = 'B') then
            CTAIVA = BCTAIVA;
        CUENTA = NULL;
        SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
            WHERE CUEN_COD = :CTAIVA INTO :CUENTA, :TIPOCUEN;
        if (CUENTA IS NULL) then
            begin
            EXECUTE PROCEDURE ERROR (76, :IDDOC, :CTAIVA, 2);
            CUENTA = CTAIVA;
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            EXECUTE PROCEDURE ERROR (76, :IDDOC, :CUENTA, 3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'C') then
            BEGIN
            EXECUTE PROCEDURE ERROR (76, :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, :NROI, :CUENTA, :CONC, '', :VRIVA, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            SUMA = SUMA + VRIVA;
            END
        END /* IVA */
    /* CUENTA BANCO */
    if ((BANCO = 'B') or (BANCO = 'K')) then
        BEGIN
        if (BANCO = 'B') then
            CTABANCO = BCTABANCO;
        if (SUMA <> 0) then
            BEGIN
            CUENTA = NULL;
            SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :CTABANCO INTO :CUENTA, :TIPOCUEN;
            if (CUENTA IS NULL) then
                begin
                EXECUTE PROCEDURE ERROR (76, :IDDOC, :CTABANCO, 2);
                CUENTA = CTABANCO;
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'I') then
                BEGIN
                EXECUTE PROCEDURE ERROR (76, :IDDOC, :CUENTA, 3);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                EXECUTE PROCEDURE ERROR (76, :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, :NROI, :CUENTA, :CONC, '', 0, :SUMA, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                END
            END /* SUMA <> 0 */
        END /* BANCO K O B */
    /* recorra las cuentas adicionales */
    FOR SELECT INBC_CUENTA, INBC_BASE, INBC_PORC, INBC_VALOR, INBC_DB
        FROM INTERFAZ_BANCOS_CTAS
        WHERE INBA_ID = :IDINTER
        INTO :CUENTAADIC, :BASEADIC, :PORCADIC, :VALORADIC, :DBADIC
        DO
        BEGIN
        if (:BASEADIC = 'MONTO') then
            VALORADIC = MONTO;
        MONTO = VALORADIC * PORCADIC;
        
        /* TRAIGA LAS CARACTERISTICAS DE LA CUENTA */
        CUENTA = NULL;
        SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
            WHERE CUEN_COD = :CUENTAADIC INTO :CUENTA, :TIPOCUEN;
        IF (CUENTA IS NULL) THEN
            begin
            EXECUTE PROCEDURE ERROR (76, :IDDOC, :CUENTAADIC, 2);
            CUENTA = CUENTAADIC;
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            EXECUTE PROCEDURE ERROR (76, :IDDOC, :CUENTA, 3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'C') then
            BEGIN
            EXECUTE PROCEDURE ERROR (76, :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, :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
    if (ERROR > 0) then
        VER = 'S';
    SUSPEND;
    END /* NO ANULADO */
  END /* EXISTE LA INTERFAZ */
ELSE
    BEGIN
    EXECUTE PROCEDURE ERROR (76, :IDDOC, :PREF, 1);
    ERROR = ERROR + 1;
    VER = 'S';
    SUSPEND;
    END
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE CONTABIL_TRASLACAJA(
    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 VRTOTAL NUMERIC(18, 2);
declare variable TIPOCOMP VARCHAR(3);
declare variable PREFCONT VARCHAR(4);
declare variable BASE CHAR(1);
declare variable CTABASE VARCHAR(20);
declare variable 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 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 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 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 IDCAJA INTEGER;
declare variable IDDEST INTEGER;
declare variable ANULADO CHAR(1);
BEGIN
/* BUSQUE LA INTERFACE */
EXISTE = 'N';
SELECT 'S', TICO_COD, PRCO_PRE, INCJ_BASE, INCJ_DTOPP, INCJ_RTFTE, INCJ_RTIVA, INCJ_RTICA, INCJ_CAJA, INCJ_CTABASE, INCJ_CTADTO, INCJ_CTARTFTE, INCJ_CTARTIVA, INCJ_CTARTICA, INCJ_CTACAJA, INCJ_CONFIRMAR
    FROM INTERFAZ_CAJA
    WHERE INCJ_ID = :IDINTER
    INTO :EXISTE, :TIPOCOMP, :PREFCONT, :BASE, :DTO, :RTFTE, :RTIVA, :RTICA, :CAJA, :CTABASE, :CTADTO, :CTARTFTE, :CTARTIVA, :CTARTICA, :CTACAJA, :VER;
if (EXISTE = 'S') then
  BEGIN
  /* BORRE CUALQUEIR CONTABILIZACION PREVIA */
  DELETE FROM CONTABILIZACION WHERE CNTB_TIPOREF = 66 AND CNTB_IDREF = :IDDOC;
  execute procedure lee_configuracion ('CONTABILIDAD', 'GENERAL', 'NIT COMPAÑIA') returning_values (NIT);
  /* TRAIGA EL ENCABEZADO DEL TRASLADO */
  SELECT MAX(PREF_PRE), MAX(TRCJ_NUMERO), MAX(TRCJ_FECHA), MAX(TRCJ_CONC), SUM(TRCD_MONTO), MAX(CAJA_ID), MAX(TRCJ_DESTINO), max(trcj_anulado)
        FROM TRASLADOS_CAJA T, traslados_caja_det D
        WHERE T.TRCJ_ID = D.TRCJ_ID AND T.TRCJ_ID = :IDDOC
        INTO :PREF, :NUM, :FECAUX, :CONC, :VRTOTAL, :IDCAJA, :IDDEST, :ANULADO;
  if (ANULADO = 'N') then
    BEGIN
    SELECT PREF_CENTRO, PREF_PROY FROM PREFIJOS
        WHERE PREF_PRE = :PREF AND TIDO_COD = 66 INTO :CENTRO, :PROY;
    NUMERO = PREF || NUM;
    EXECUTE PROCEDURE FECHA_A_CONTA(:FECAUX) returning_values (:FECHA);

    /* REGISTRE EL ENCABEZADO CONTABLE */
    IDC = GEN_ID(ID_CONTABILIZA, 1);
    INSERT INTO CONTABILIZACION (CNTB_ID, CNTB_TIPOCOMP, CNTB_PREFCNT, CNTB_NUMERO, CNTB_FECHA, CNTB_CONCEPTO, CNTB_REF, CNTB_TIPOREF, CNTB_IDREF, CNTB_PREFREF, CNTB_NUMREF, CNTB_PROCESADO)
        VALUES (:IDC, :TIPOCOMP, :PREFCONT, :NUM, :FECHA, :CONC, '', 66, :IDDOC, :PREF, :NUM, 'N');

    NROI = 0;
    SUMA = 0;
    ERROR = 0;
    IF ((CAJA = 'K') or (CAJA = 'F') ) THEN
        BEGIN
        if (VRTOTAL <> 0) then
            BEGIN
            IF ((CAJA = 'F')) THEN
                BEGIN
                /* TRAIGA LA CUENTA DE LA CAJA DESTINO */
                SELECT CAJA_CUENTA FROM CAJAS WHERE CAJA_ID = :IDDEST INTO CTACAJA;
                END

            CUENTA = NULL;
            SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :CTACAJA INTO :CUENTA, :TIPOCUEN;
            if (CUENTA IS NULL) then
                begin
                EXECUTE PROCEDURE ERROR (66, :IDDOC, :CTACAJA, 2);
                CUENTA = CTACAJA;
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'I') then
                BEGIN
                EXECUTE PROCEDURE ERROR (66, :IDDOC, :CUENTA, 3);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                EXECUTE PROCEDURE ERROR (66, :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, :NROI, :CUENTA, :CONC, '', :VRTOTAL, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA + VRTOTAL;
                END
            END /* VRTOTAL <> 0 */
        END /* CAJA CONSTANTE */
        
    /* CIERRE EL COMPROBANTE CONTRA LA CUENTA DE LA CAJA */
    if ((SUMA <> 0) and ((BASE = 'F') 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 = 'F') then
            SELECT CAJA_CUENTA FROM CAJAS WHERE CAJA_ID = :IDCAJA INTO CTABASE;

        CUENTA = NULL;
        SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
            WHERE CUEN_COD = :CTABASE INTO :CUENTA, :TIPOCUEN;
        IF (CUENTA IS NULL) then
            begin
            EXECUTE PROCEDURE ERROR (66, :IDDOC, :CTABASE, 2);
            CUENTA = CTABASE;
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            EXECUTE PROCEDURE ERROR (66, :IDDOC, :CUENTA, 3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'C') then
            BEGIN
            EXECUTE PROCEDURE ERROR (66, :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, :NROI, :CUENTA, :CONC, '', :DEBITO, :CREDITO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
        NROI = NROI + 1;
        END /* SUMA EN CAJA */

    /* 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;
        MONTO = VALORADIC * PORCADIC;
        
        CUENTA = NULL;
        SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
            WHERE CUEN_COD = :CTADIC INTO :CUENTA, :TIPOCUEN;
        IF (CUENTA IS NULL) THEN
            begin
            EXECUTE PROCEDURE ERROR (66, :IDDOC, :CTADIC, 2);
            CUENTA = CTADIC;
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            EXECUTE PROCEDURE ERROR (66, :IDDOC, :CUENTA, 3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'C') then
            BEGIN
            EXECUTE PROCEDURE ERROR (66, :IDDOC, :CUENTA, 4);
            TIPOCUEN = 'N';
            ERROR = ERROR + 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 (ERROR > 0) then
        VER = 'S';
    SUSPEND;
    END /* NO ANULADO */
  END /* EXISTE LA INTERFAZ */
ELSE
    BEGIN
    EXECUTE PROCEDURE ERROR (66, :IDDOC, :PREF, 1);
    ERROR = ERROR + 1;
    VER = 'S';
    SUSPEND;
    END
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE CONTABIL_TRASLAMERCANCIA(
    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 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 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, :PROYDES, :CENTRODES;
if (EXISTE = 'S') then
    BEGIN
    /* TRAIGA EL ENCABEZADO DE LA SALIDA */
    SELECT PREF_PRE, TRAN_NUMERO, TRAN_FECHA, TRAN_CONC, TERC_NIT, TRAN_IMPTOS, TRAN_ANULADO
        FROM TRASFERENCIAS
        WHERE TRAN_ID = :IDDOC
        INTO :PREFIJO, :NUMERO, :FECAUX, :CONCEPTO, :NIT, :IMPINC, :ANULADO;
    /* BORRE CUALQUEIR CONTABILIZACION PREVIA */
    DELETE FROM CONTABILIZACION WHERE CNTB_TIPOREF = 13 AND CNTB_IDREF = :IDDOC;

    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
        /* 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, '', 13, :IDDOC, :PREFIJO, :NUMERO, 'N');
        NUMITEMS = 0;
        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 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;
                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 ERROR (13, :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 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 ERROR (13, :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;
                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 ERROR (13, :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 ERROR (13, :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;
                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 ERROR (13, :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 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 ERROR (13, :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 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
                        WHERE CUEN_COD = :CTAIVA INTO :CUENTA, :TIPOCUEN;
                    if (CUENTA IS NULL) then
                        begin
                        EXECUTE PROCEDURE ERROR (13, :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 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 ERROR (13, :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
                        WHERE CUEN_COD = :CTAIVA INTO :CUENTA, :TIPOCUEN;
                    if (CUENTA IS NULL) then
                        begin
                        EXECUTE PROCEDURE ERROR (13, :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 ERROR (13, :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
                    WHERE CUEN_COD = :CTAIVA INTO :CUENTA, :TIPOCUEN;
                if (CUENTA IS NULL) then
                    begin
                    EXECUTE PROCEDURE ERROR (13, :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 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 ERROR (13, :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 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
                        WHERE CUEN_COD = :CTACONSUMO INTO :CUENTA, :TIPOCUEN;
                    if (CUENTA IS NULL) then
                        begin
                        EXECUTE PROCEDURE ERROR (13, :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 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 ERROR (13, :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
                    WHERE CUEN_COD = :CUENTA INTO :CUENTA, :TIPOCUEN;
                if (CUENTA IS NULL) then
                    begin
                    EXECUTE PROCEDURE ERROR (13, :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 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 ERROR (13, :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
                    WHERE CUEN_COD = :CUENTAADIC INTO :CUENTA, :TIPOCUEN;
                if (CUENTA IS NULL) then
                    begin
                    EXECUTE PROCEDURE ERROR (13, :IDDOC, :CUENTAADIC, 2);
                    CUENTA = CUENTAADIC;
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    end
                if (TIPOCUEN = 'I') then
                    BEGIN
                    EXECUTE PROCEDURE ERROR (13, :IDDOC, :CUENTA, 3);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    EXECUTE PROCEDURE ERROR (13, :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
                    WHERE CUEN_COD = :CTACIERRE INTO :CUENTA, :TIPOCUEN;
                if (CUENTA IS NULL) then
                    begin
                    EXECUTE PROCEDURE ERROR (13, :IDDOC, :CTACIERRE, 2);
                    CUENTA = CTACIERRE;
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    end
                if (TIPOCUEN = 'I') then
                    BEGIN
                    EXECUTE PROCEDURE ERROR (13, :IDDOC, :CUENTA, 3);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    EXECUTE PROCEDURE ERROR (13, :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 ERROR (13, :IDDOC, :PREFIJO, 1);
    ERROR = ERROR + 1;
    VER = 'S';
    SUSPEND;
    END
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE CUENTA_INTERFAZ(
    TIPO INTEGER,
    ID INTEGER,
    CUENTA VARCHAR(20),
    INV CHAR(1))
RETURNS (
    CTAOK VARCHAR(20),
    TIPOCUEN CHAR(1),
    ERROR INTEGER)
AS
begin
ERROR = 0;
CTAOK = NULL;
SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
    WHERE CUEN_COD = :CUENTA INTO :CTAOK, :TIPOCUEN;
if (CTAOK IS NULL) then
    begin
    EXECUTE PROCEDURE ERROR (:TIPO, :ID, :CUENTA, 2);
    CTAOK = CUENTA;
    TIPOCUEN = 'N';
    ERROR = 1;
    end
if ((INV <> 'S') and (TIPOCUEN = 'I')) then
    begin
    EXECUTE PROCEDURE ERROR (:TIPO, :ID, :CUENTA, 3);
    TIPOCUEN = 'N';
    ERROR = 1;
    end
suspend;
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 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 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 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 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 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;
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 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
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;
   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 CONTABILICE_COMP_SIMPLIFICADO(
    IDI INTEGER)
RETURNS (
    ID INTEGER,
    PREF VARCHAR(4),
    NUMERO VARCHAR(8),
    ESTADO VARCHAR(20),
    IDC INTEGER)
AS
DECLARE VARIABLE VER CHAR(2);
declare variable ERROR INTEGER;
BEGIN
FOR SELECT FACO_ID, PREF_PRE, FACO_NUMERO FROM FACTURAS_COMPRA C, PROVEEDORES P WHERE
    C.TERC_NIT = P.TERC_NIT AND PROV_SIMPLIFICADO = 'S' AND FACO_ANULADO = 'N'
    ORDER BY FACO_ID INTO :ID, :PREF, :NUMERO
DO
  BEGIN
  ESTADO = 'PROCESANDO';
  SUSPEND;
  /* BORRE LA CONTABILIZACION */
/*  delete FROM comprobante_detalle WHERE ENCO_CONSEC IN (SELECT ENCO_CONSEC FROM COMPROBANTE_ENCABEZADO WHERE ENCO_TIPOREF = 21 AND ENCO_IDREF = :ID);
  DELETE FROM comprobante_encabezado  WHERE ENCO_TIPOREF = 21 AND ENCO_IDREF = :ID; */
  EXECUTE PROCEDURE CONTABIL_FACTCOMP (:ID, :IDI) RETURNING_VALUES (:ERROR, VER, :IDC);
  if (ERROR = 0) then
    BEGIN
/*    EXECUTE PROCEDURE CONTABILIZA_PENDIENTE (:IDC); */
    ESTADO = 'OK';
    END
  ELSE
    ESTADO = 'ERROR';
  suspend;
  END
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE FACTCOMP_SIN_CONTABILIDAD(
    FECINI DATE,
    FECFIN DATE)
RETURNS (
    ID INTEGER,
    PREF VARCHAR(4),
    NUMERO VARCHAR(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 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)
RETURNS (
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(8),
    NIT VARCHAR(20),
    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);
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);
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, TERC_NOM, C.vend_cod, C.clie_rtefte, C.clie_rteiva, C.clie_rteica, C.clie_rtftebase
    FROM TERCEROS T, CLIENTES C
    WHERE T.terc_nit = C.terc_nit AND T.TERC_NIT >= :NITINI AND T.TERC_NIT <= :NITFIN AND
        C.vend_cod >= :vendini AND C.vend_cod <= :vendfin AND ((c.grca_cod is null and :grpini = 0 ) or (C.grca_cod >= :grpini AND C.grca_cod <= :grpfin)) AND
        ((c.zona_cod is null and :zonini = '') or (C.zona_cod >= :zonini AND C.zona_cod <= :zonfin))
    INTO :NIT, :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_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)
            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', 'N', :TOTAL, :BOD, :OBS, NULL, NULL, 0, USER, '01', 'N', :VEND, 1, NULL,
            NULL, NULL, NULL, NULL, 1);

        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 CLIE_VALORMES FROM CLIENTES WHERE TERC_NIT = :NIT 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
            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, NULL, 'N', 'N', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
            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
        UPDATE FACTURAS SET FACT_TOTAL = :total,  FACT_IVAMONTO = :IVAM, FACT_RTFTEMONTO = :rtftem, 
            FACT_RTIVAMONTO = :rtivam, FACT_RTICAMONTO = :rticam 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 ^ ;

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 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 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 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 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 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 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 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 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 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 TRIGGER LIQUIDACION_BI
as
declare variable PERIODIC INTEGER;
declare variable ANO CHAR(4);
declare variable CONC INTEGER;
declare variable MONTO NUMERIC(18, 2);
declare variable ENTIDAD VARCHAR(20);
declare variable conc_deduc char(1);
declare variable conc_prov char(1);
declare variable conc_aporte char(1);
declare variable salario char(1);
declare variable gtoempr char(1);
declare variable conc_aplicaprom char(1);
declare variable ITEM INTEGER;
declare variable conc_modifi char(1);
declare variable IDC INTEGER;
declare variable ERROR INTEGER;
begin
SELECT EMPL_PPAGO FROM EMPLEADOS WHERE TERC_NIT = NEW.terc_nit INTO :periodic;
ANO = EXTRACT(YEAR FROM NEW.liqd_fecha);
if (PERIODIC = 1) then
    new.liqd_periodo = extract (MONTH FROM NEW.liqd_fecha);
if (PERIODIC = 2) then
    new.liqd_periodo = (extract (MONTH FROM NEW.liqd_fecha) * 2) - 1;
if (PERIODIC = 3) then
    new.liqd_periodo = extract (WEEK FROM NEW.liqd_fecha);
/* INSERTE UNA NOMINA POR PAGAR */
execute procedure CAMBIE_ID_NOMINA returning_values(NEW.liqd_nomid);
insert into NOMINA (NOMI_ID, NOMI_FECCAUSA, NOMI_PAGOGLOBAL, NOMI_PERIODOCIDAD, NOMI_PERIODO, NOMI_ANO, NOMI_LIQOK, NOMI_CONC, NOMI_TIPO)
    values (NEW.liqd_nomid, NEW.liqd_fecha,'N', :periodic, NEW.liqd_periodo, :ANO, 'S', 'LIQUIDACION EMPLEADO ' || NEW.TERC_NIT, 'L');
ITEM = 1;
/* INSERTE LOS PAGOS Y DEDUCCIONES */
FOR SELECT CONC_COD, VALOR, ENTIDAD FROM causa_nomina_empleado(NEW.liqd_fecha, NEW.terc_nit, NEW.liqd_diaslab, 'P', 'S')
    INTO :CONC, :MONTO, :ENTIDAD
    DO
    BEGIN
    if (MONTO < 0) then
        MONTO = MONTO * -1;
    SELECT CONC_DEDUC, CONC_APORTE, CONC_PROV, CONC_MODIFI, CONC_APLICAPROM, CONC_SALARIO, CONC_GTOEMPR
        FROM conceptos_nomina WHERE CONC_COD = :conc
        INTO :CONC_DEDUC, :CONC_APORTE, :CONC_PROV, :CONC_MODIFI, :CONC_APLICAPROM, :SALARIO, :GTOEMPR;
    insert into NOMINA_CONCEPTOS (NOMI_ID, NOCO_ITEM, CONC_COD,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, NOCO_GTOEMPR)
        values (NEW.liqd_nomid, :ITEM, :conc, NEW.terc_nit, :monto, :entidad, :CONC_DEDUC, :CONC_PROV, :CONC_APORTE, NEW.liqd_periodo, :ANO, :CONC_MODIFI, :CONC_APLICAPROM, :SALARIO, :GTOEMPR);
    ITEM = ITEM + 1;
    END
/* INSERTE LOS BENEFICIOS */
FOR SELECT CONC_COD, VALOR, ENTIDAD FROM causa_nomina_empleado(NEW.liqd_fecha, NEW.terc_nit, NEW.liqd_diaslab, 'B', 'S')
    INTO :CONC, :MONTO, :ENTIDAD
    DO
    BEGIN
    if (MONTO < 0) then
        MONTO = MONTO * -1;
    SELECT CONC_DEDUC, CONC_APORTE, CONC_PROV, CONC_MODIFI, CONC_APLICAPROM, CONC_SALARIO, CONC_GTOEMPR
        FROM conceptos_nomina WHERE CONC_COD = :conc
        INTO :CONC_DEDUC, :CONC_APORTE, :CONC_PROV, :CONC_MODIFI, :CONC_APLICAPROM, :SALARIO, :GTOEMPR;
    insert into NOMINA_CONCEPTOS (NOMI_ID, NOCO_ITEM, CONC_COD,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, NOCO_GTOEMPR)
        values (NEW.liqd_nomid, :ITEM, :conc, NEW.terc_nit, :monto, :entidad, :CONC_DEDUC, :CONC_PROV, :CONC_APORTE, NEW.liqd_periodo, :ANO, :CONC_MODIFI, :CONC_APLICAPROM, :SALARIO, :GTOEMPR);
    ITEM = ITEM + 1;
    END
/* INSERTE LOS APORTES */
FOR SELECT CONC_COD, VALOR, ENTIDAD FROM causa_nomina_empleado(NEW.liqd_fecha, NEW.terc_nit, NEW.liqd_diaslab, 'A', 'S')
    INTO :CONC, :MONTO, :ENTIDAD
    DO
    BEGIN
    SELECT CONC_DEDUC, CONC_APORTE, CONC_PROV, CONC_MODIFI, CONC_APLICAPROM, CONC_SALARIO, CONC_GTOEMPR
        FROM conceptos_nomina WHERE CONC_COD = :conc
        INTO :CONC_DEDUC, :CONC_APORTE, :CONC_PROV, :CONC_MODIFI, :CONC_APLICAPROM, :SALARIO, :GTOEMPR;
    insert into NOMINA_CONCEPTOS (NOMI_ID, NOCO_ITEM, CONC_COD,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, NOCO_GTOEMPR)
        values (NEW.liqd_nomid, :ITEM, :conc, NEW.terc_nit, :monto, :entidad, :CONC_DEDUC, :CONC_PROV, :CONC_APORTE, NEW.liqd_periodo, :ANO, :CONC_MODIFI, :CONC_APLICAPROM, :SALARIO, :GTOEMPR);
    ITEM = ITEM + 1;
    END
/* INSERTE LAS PROVISIONES */
FOR SELECT CONC_COD, VALOR, ENTIDAD FROM causa_nomina_empleado(NEW.liqd_fecha, NEW.terc_nit, NEW.liqd_diaslab, 'V', 'S')
    INTO :CONC, :MONTO, :ENTIDAD
    DO
    BEGIN
    SELECT CONC_DEDUC, CONC_APORTE, CONC_PROV, CONC_MODIFI, CONC_APLICAPROM, CONC_SALARIO, CONC_GTOEMPR
        FROM conceptos_nomina WHERE CONC_COD = :conc
        INTO :CONC_DEDUC, :CONC_APORTE, :CONC_PROV, :CONC_MODIFI, :CONC_APLICAPROM, :SALARIO, :GTOEMPR;
    insert into NOMINA_CONCEPTOS (NOMI_ID, NOCO_ITEM, CONC_COD,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, NOCO_GTOEMPR)
        values (NEW.liqd_nomid, :ITEM, :conc, NEW.terc_nit, :monto, :entidad, :CONC_DEDUC, :CONC_PROV, :CONC_APORTE, NEW.liqd_periodo, :ANO, :CONC_MODIFI, :CONC_APLICAPROM, :SALARIO, :GTOEMPR);
    ITEM = ITEM + 1;
    END
/* AGREGUE LOS CONCEPTOS DE LA LIQUIDACION */
/* INDEMINZACION */
insert into NOMINA_CONCEPTOS (NOMI_ID, NOCO_ITEM, CONC_COD,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, NOCO_GTOEMPR)
    values (NEW.liqd_nomid, :ITEM, 961, NEW.terc_nit, NEW.liqd_indemnizacion, NULL, 'N', 'N', 'N', NEW.liqd_periodo, :ANO, 'S', 'N', 'N', 'N');
ITEM = ITEM + 1;
/* CESANTIA */
insert into NOMINA_CONCEPTOS (NOMI_ID, NOCO_ITEM, CONC_COD,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, NOCO_GTOEMPR)
    values (NEW.liqd_nomid, :ITEM, 951, NEW.terc_nit, NEW.liqd_cesantia, NULL, 'N', 'N', 'N', NEW.liqd_periodo, :ANO, 'S', 'N', 'N', 'N');
ITEM = ITEM + 1;
/* INT. CESANTIA */
insert into NOMINA_CONCEPTOS (NOMI_ID, NOCO_ITEM, CONC_COD,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, NOCO_GTOEMPR)
    values (NEW.liqd_nomid, :ITEM, 5, NEW.terc_nit, NEW.liqd_intces, NULL, 'N', 'N', 'N', NEW.liqd_periodo, :ANO, 'S', 'N', 'N', 'N');
ITEM = ITEM + 1;
/* PRIMA */
if (EXTRACT(MONTH FROM NEW.liqd_fecha) > 6) then
    insert into NOMINA_CONCEPTOS (NOMI_ID, NOCO_ITEM, CONC_COD,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, NOCO_GTOEMPR)
        values (NEW.liqd_nomid, :ITEM, 18, NEW.terc_nit, NEW.liqd_prima, NULL, 'N', 'N', 'N', NEW.liqd_periodo, :ANO, 'S', 'N', 'N', 'N');
ELSE
    insert into NOMINA_CONCEPTOS (NOMI_ID, NOCO_ITEM, CONC_COD,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, NOCO_GTOEMPR)
        values (NEW.liqd_nomid, :ITEM, 17, NEW.terc_nit, NEW.liqd_prima, NULL, 'N', 'N', 'N', NEW.liqd_periodo, :ANO, 'S', 'N', 'N', 'N');
ITEM = ITEM + 1;
/* VACACIONES */
insert into NOMINA_CONCEPTOS (NOMI_ID, NOCO_ITEM, CONC_COD,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, NOCO_GTOEMPR)
    values (NEW.liqd_nomid, :ITEM, 950, NEW.terc_nit, NEW.liqd_vacacion, NULL, 'N', 'N', 'N', NEW.liqd_periodo, :ANO, 'S', 'N', 'N', 'N');
ITEM = ITEM + 1;
/* DESCUENTO PRESTAMOS */
insert into NOMINA_CONCEPTOS (NOMI_ID, NOCO_ITEM, CONC_COD,  TERC_NIT, NOCO_VALOR, NOCO_ENTIDAD, NOCO_DEDUC , NOCO_PROV, NOCO_APORTE, NOCO_PERIODO, NOCO_ANO, NOCO_MOD, NOCO_APLICAPROM, NOCO_SALARIO, NOCO_GTOEMPR)
    values (NEW.liqd_nomid, :ITEM, 922, NEW.terc_nit, NEW.liqd_dsprestamo, NULL, 'S', 'N', 'N', NEW.liqd_periodo, :ANO, 'S', 'N', 'N', 'N');
ITEM = ITEM + 1;
/* CONTABILICE LA NOMINA */
EXECUTE procedure contabil_nomina(NEW.liqd_nomid) returning_values (:ERROR, :IDC);
if (ERROR = 0) then
    EXECUTE procedure contabiliza_pendiente (:IDC);
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 ; ^

/* 20130919 */
/* TOTAL ITEM SIEMPRE SIN IVA */
SET TERM ^ ;

CREATE OR ALTER procedure IMPR_TRASFERENCIA (
    ID integer)
returns (
    PREF varchar(4),
    NUMERO varchar(8),
    FECHA date,
    CONCEPTO varchar(60),
    REFER varchar(60),
    CODBODORI varchar(2),
    NOMBODORI varchar(30),
    CODBODDES varchar(2),
    NOMBODDES varchar(30),
    OBS blob sub_type 0 segment size 80,
    ITEM integer,
    ARTICULO varchar(15),
    CODBAR varchar(15),
    ARTIDES varchar(60),
    CANT numeric(18,4),
    UNIDAD varchar(8),
    BODITEM varchar(2),
    COSTO numeric(18,2),
    IVAPORC numeric(9,2),
    IVAMONTO numeric(18,2),
    CONSUMO numeric(18,2),
    TOTAL numeric(18,2),
    PRECIO numeric(18,2),
    LOTE varchar(15),
    LOTEVENCE date,
    PESOUNIT numeric(18,4),
    PESOTOT numeric(18,4),
    VOLUMUNIT numeric(18,4),
    VOLUMTOT numeric(18,4),
    TOTALDOC numeric(18,2),
    CONSUMODOC numeric(18,2),
    TOTALMASIMP numeric(18,2))
AS
declare variable IMPTOS CHAR(1);
declare variable LARGO NUMERIC(18,4);
declare variable ANCHO NUMERIC(18,4);
declare variable ALTO NUMERIC(18,4);
declare variable LISTA CHAR(3);
BEGIN
  /*  */
  SELECT PREF_PRE, TRAN_NUMERO, TRAN_FECHA, TRAN_CONC, TRAN_REFER, T.BODE_COD, BO.BODE_NOM, TRAN_BODDES, BD.BODE_NOM, TRAN_IMPTOS, TRAN_OBS
    FROM TRASFERENCIAS T, BODEGA BO, BODEGA BD WHERE T.BODE_COD = BO.BODE_COD AND T.TRAN_BODDES = BD.BODE_COD AND T.TRAN_ID = :ID into
    :PREF, :NUMERO, :FECHA, :CONCEPTO, :REFER, :CODBODORI, :NOMBODORI, :CODBODDES, :NOMBODDES, :IMPTOS, :OBS;
  SELECT SUM(TRAS_TOTAL), SUM(TRAS_IVAMONTO), SUM(TRAS_CONSUMO*TRAS_CANT*TRAS_FACTOR) FROM TRASFERENCIAS_DETALLE 
    WHERE TRAN_ID = :ID INTO :TOTALDOC, :IVAMONTO, :CONSUMODOC;
  TOTALMASIMP = TOTALDOC + CONSUMODOC;
  if (IMPTOS = 'N') then
    TOTALDOC = TOTALDOC - IVAMONTO;
  ITEM = 0;
  boditem = codbodori;
  FOR SELECT A.ARTI_COD, TRAS_CODBAR, TRAS_DESC, TRAS_CANT, TRAS_UNIDAD, TRAS_COSTO, TRAS_IVAPORC, TRAS_IVAMONTO, TRAS_CONSUMO, TRAS_TOTAL, TRAS_LOTE,
    (ARTI_PESO / 1000 * TRAS_CANT * TRAS_FACTOR), (ARTI_LARGO / 100 * TRAS_FACTOR), (ARTI_ANCHO / 100 * TRAS_FACTOR), (ARTI_ALTO / 100 * TRAS_FACTOR)
    FROM TRASFERENCIAS_DETALLE D, ARTICULO A
    WHERE D.ARTI_COD = A.ARTI_COD AND D.TRAN_ID = :ID
    ORDER BY TRAS_ITEM
    INTO :ARTICULO, :CODBAR, :ARTIDES, :CANT, :UNIDAD, :COSTO, :IVAPORC, :IVAMONTO, :CONSUMO, :TOTAL, :LOTE,
    :PESOUNIT, :LARGO, :ANCHO, :ALTO
    DO
      BEGIN
      EXECUTE PROCEDURE LEE_CONFIGURACION('INVENTARIO','DOCUMENTOS','CODIGO DE LISTA DE PRECIOS A IMPRIMIR EN DOCUMENTOS') returning_values (:LISTA);
      if (NOT lista IS NULL) then
          SELECT PRAR_FIJO FROM PRECIOS_ARTICULO WHERE ARTI_COD = :articulo AND LIPR_COD = :LISTA INTO :PRECIO;
      ITEM = ITEM + 1;
      if (PESOUNIT IS NULL) then
        PESOUNIT = 0;
      PESOTOT = PESOTOT + PESOUNIT;
      VOLUMUNIT = ANCHO * ALTO * LARGO;
      volumunit = VOLUMUNIT * CANT;
      if (VOLUMUNIT IS NULL) then
        VOLUMUNIT = 0;
      VOLUMTOT = VOLUMTOT + VOLUMUNIT;
      TOTAL = TOTAL - IVAMONTO;
      LOTEVENCE = NULL;
      SELECT LOTE_VENCE FROM LOTES WHERE ARTI_COD = :ARTICULO AND LOTE_NRO = :LOTE and BODE_COD = :boditem INTO :lotevence;
      SUSPEND;
      END
END^

SET TERM ; ^

/* 20130920 */
/* EN ABONOS NO DESCARTE EL RTCREE SIN MIRAR LA FECHA DEL DOCUMENTO ORIGINAL */
SET TERM ^ ;

CREATE OR ALTER procedure MOVIMIENTO_CARTERA_MES (
    FECINI date,
    FECFIN date,
    SUBEMPRESA integer,
    CONTADO char(1),
    MONEDA integer)
returns (
    NIT varchar(20),
    NOMBRE varchar(60),
    ZONA varchar(2),
    VENDEDOR integer,
    COBRADOR integer,
    CONTACTO varchar(60),
    DIASMAX integer,
    TELEFONO varchar(40),
    INICIAL numeric(18,2),
    DEBITOS numeric(18,2),
    CREDITOS numeric(18,2),
    ABONOS numeric(18,2),
    FINAL numeric(18,2))
AS
declare variable RETES CHAR(2);
declare variable TIPODOC INTEGER;
declare variable IDDOC INTEGER;
declare variable SALDO NUMERIC(18,2);
declare variable NUMROWS INTEGER;
declare variable DIASF INTEGER;
declare variable DIAS INTEGER;
DECLARE VARIABLE FOV CHAR(11);
declare variable AUTORET VARCHAR(10);
declare variable FAUTORET DATE;
declare variable AUTORCREE VARCHAR(10);
declare variable FAUTORCREE DATE;
declare variable CARTXAGE CHAR(2);
BEGIN
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', 'ANALISIS DE CARTERA CON FECHA FACTURA O VENCIMIENTO') RETURNING_VALUES (FOV);
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';
EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'GENERAL', 'SEPARAR CARTERA POR AGENCIA') returning_values (:cartxage);
if (CARTXAGE = 'NO') then
    subempresa = 0;
for select T.TERC_NIT, TERC_NOM, TERC_CONTACTO, TERC_TEL, ZONA_COD, VEND_COD, COBR_COD
    from TERCEROS T, CLIENTES C WHERE T.terc_nit = C.terc_nit AND TERC_CLIE = 'S'
    into :NIT, :NOMBRE, :CONTACTO, :TELEFONO, :zona, :vendedor, :cobrador
  DO
    BEGIN
    diasmax = 0;
    SELECT COUNT(*) FROM AUTORIZACIONES WHERE AUTO_NITCONTADO = :NIT INTO :numrows;
    IF ((CONTADO = 'S') or (numrows = 0)) THEN
        BEGIN
        FECINI = FECINI - 1;
        INICIAL = 0;
        FOR SELECT MVCL_TIPOREF, MVCL_IDREF, (:FECFIN-MVCL_FECHA), (:FECFIN-MVCL_VENCE) FROM MOVIMIENTO_CLIENTES
            WHERE TERC_NIT = :NIT 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, :DIASF, DIAS
            DO
            BEGIN
            EXECUTE PROCEDURE saldo_doc_cartera(TIPODOC, IDDOC, FECINI, MONEDA) returning_values (SALDO);
            if (SALDO <> 0) then
                BEGIN
                INICIAL = INICIAL + SALDO;
                if (FOV = 'FECHA') then
                    BEGIN
                    if ((SALDO > 0) AND (DIASMAX < DIASF)) then
                        DIASMAX = DIASF;
                    END
                ELSE
                    BEGIN
                    if ((SALDO > 0) AND (DIASMAX < DIAS)) then
                        DIASMAX = DIAS;
                    END
                END
            END
        EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'DESCONTAR RETENCIONES POR CAUSACION') returning_values(:RETES);
        FECINI = FECINI + 1;
        if (RETES = 'SI') then
            BEGIN
            if (MONEDA = 0) then
                BEGIN
                if (FAUTORET <= FECINI) then
                    if (fautorcree <= FECINI) then
                        begin
                        SELECT SUM(MVCL_MONTO-MVCL_RTEIVA-MVCL_RTEICA), MAX(:FECFIN-MVCL_FECHA), MAX(:FECFIN-MVCL_VENCE) FROM movimiento_clientes
                            WHERE TERC_NIT = :NIT AND MVCL_FECHA >= :FECINI AND MVCL_FECHA <= :FECFIN
                            AND MVCL_DEBITO = 'S' AND ((:SUBEMPRESA = 0) or (SUCU_ID = :SUBEMPRESA))
                            INTO :DEBITOS, :diasf, :dias;
                        SELECT SUM(MVCL_MONTO-MVCL_RTEIVA-MVCL_RTEICA) 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 ((:SUBEMPRESA = 0) or (SUCU_ID = :SUBEMPRESA))
                            INTO :CREDITOS;
                        end
                    else
                        begin
                        SELECT SUM(MVCL_MONTO-MVCL_RTEIVA-MVCL_RTEICA-MVCL_RCREE), MAX(:FECFIN-MVCL_FECHA), MAX(:FECFIN-MVCL_VENCE) FROM movimiento_clientes
                            WHERE TERC_NIT = :NIT AND MVCL_FECHA >= :FECINI AND MVCL_FECHA <= :FECFIN
                            AND MVCL_DEBITO = 'S' AND ((:SUBEMPRESA = 0) or (SUCU_ID = :SUBEMPRESA))
                            INTO :DEBITOS, :diasf, :dias;
                        SELECT SUM(MVCL_MONTO-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 ((:SUBEMPRESA = 0) or (SUCU_ID = :SUBEMPRESA))
                            INTO :CREDITOS;
                        end
                else
                    if (fautorcree <= FECINI) then
                        begin
                        SELECT SUM(MVCL_MONTO-MVCL_RTEFTE-MVCL_RTEIVA-MVCL_RTEICA), MAX(:FECFIN-MVCL_FECHA), MAX(:FECFIN-MVCL_VENCE) FROM movimiento_clientes
                            WHERE TERC_NIT = :NIT AND MVCL_FECHA >= :FECINI AND MVCL_FECHA <= :FECFIN
                            AND MVCL_DEBITO = 'S' AND ((:SUBEMPRESA = 0) or (SUCU_ID = :SUBEMPRESA))
                            INTO :DEBITOS, :diasf, :dias;
                        SELECT SUM(MVCL_MONTO-MVCL_RTEFTE-MVCL_RTEIVA-MVCL_RTEICA) 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 ((:SUBEMPRESA = 0) or (SUCU_ID = :SUBEMPRESA))
                            INTO :CREDITOS;
                        end
                    else
                        begin
                        SELECT SUM(MVCL_MONTO-MVCL_RTEFTE-MVCL_RTEIVA-MVCL_RTEICA-MVCL_RCREE), MAX(:FECFIN-MVCL_FECHA), MAX(:FECFIN-MVCL_VENCE) FROM movimiento_clientes
                            WHERE TERC_NIT = :NIT AND MVCL_FECHA >= :FECINI AND MVCL_FECHA <= :FECFIN
                            AND MVCL_DEBITO = 'S' AND ((:SUBEMPRESA = 0) or (SUCU_ID = :SUBEMPRESA))
                            INTO :DEBITOS, :diasf, :dias;
                        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 ((:SUBEMPRESA = 0) or (SUCU_ID = :SUBEMPRESA))
                            INTO :CREDITOS;
                        end
                SELECT SUM(MVCL_MONTO) FROM movimiento_clientes
                    WHERE TERC_NIT = :NIT AND MVCL_FECHA >= :FECINI AND MVCL_FECHA <= :FECFIN
                    AND MVCL_ABONO = 'S' AND ((:SUBEMPRESA = 0) or (SUCU_ID = :SUBEMPRESA))
                    INTO :ABONOS;
                END
            ELSE
                BEGIN
                if (FAUTORET <= FECINI) then
                    if (fautorcree <= FECINI) then
                        begin
                        SELECT SUM((MVCL_MONTO-MVCL_RTEIVA-MVCL_RTEICA)/MVCL_TRM), MAX(:FECFIN-MVCL_FECHA), MAX(:FECFIN-MVCL_VENCE) FROM movimiento_clientes
                            WHERE TERC_NIT = :NIT AND MVCL_FECHA >= :FECINI AND MVCL_FECHA <= :FECFIN
                            AND MVCL_DEBITO = 'S' AND ((:SUBEMPRESA = 0) or (SUCU_ID = :SUBEMPRESA))
                            INTO :DEBITOS, :diasf, :dias;
                        SELECT SUM((MVCL_MONTO-MVCL_RTEIVA-MVCL_RTEICA)/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 ((:SUBEMPRESA = 0) or (SUCU_ID = :SUBEMPRESA))
                            INTO :CREDITOS;
                        end
                    else
                        begin
                        SELECT SUM((MVCL_MONTO-MVCL_RTEIVA-MVCL_RTEICA-MVCL_RCREE)/MVCL_TRM), MAX(:FECFIN-MVCL_FECHA), MAX(:FECFIN-MVCL_VENCE) FROM movimiento_clientes
                            WHERE TERC_NIT = :NIT AND MVCL_FECHA >= :FECINI AND MVCL_FECHA <= :FECFIN
                            AND MVCL_DEBITO = 'S' AND ((:SUBEMPRESA = 0) or (SUCU_ID = :SUBEMPRESA))
                            INTO :DEBITOS, :diasf, :dias;
                        SELECT SUM((MVCL_MONTO-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 ((:SUBEMPRESA = 0) or (SUCU_ID = :SUBEMPRESA))
                            INTO :CREDITOS;
                        end
                else
                    if (fautorcree <= FECINI) then
                        begin
                        SELECT SUM((MVCL_MONTO-MVCL_RTEFTE-MVCL_RTEIVA-MVCL_RTEICA)/MVCL_TRM), MAX(:FECFIN-MVCL_FECHA), MAX(:FECFIN-MVCL_VENCE) FROM movimiento_clientes
                            WHERE TERC_NIT = :NIT AND MVCL_FECHA >= :FECINI AND MVCL_FECHA <= :FECFIN
                            AND MVCL_DEBITO = 'S' AND ((:SUBEMPRESA = 0) or (SUCU_ID = :SUBEMPRESA))
                            INTO :DEBITOS, :diasf, :dias;
                        SELECT SUM((MVCL_MONTO-MVCL_RTEFTE-MVCL_RTEIVA-MVCL_RTEICA)/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 ((:SUBEMPRESA = 0) or (SUCU_ID = :SUBEMPRESA))
                            INTO :CREDITOS;
                        end
                    else
                        begin
                        SELECT SUM((MVCL_MONTO-MVCL_RTEFTE-MVCL_RTEIVA-MVCL_RTEICA-MVCL_RCREE)/MVCL_TRM), MAX(:FECFIN-MVCL_FECHA), MAX(:FECFIN-MVCL_VENCE) FROM movimiento_clientes
                            WHERE TERC_NIT = :NIT AND MVCL_FECHA >= :FECINI AND MVCL_FECHA <= :FECFIN
                            AND MVCL_DEBITO = 'S' AND ((:SUBEMPRESA = 0) or (SUCU_ID = :SUBEMPRESA))
                            INTO :DEBITOS, :diasf, :dias;
                        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 ((:SUBEMPRESA = 0) or (SUCU_ID = :SUBEMPRESA))
                            INTO :CREDITOS;
                        end
                SELECT SUM(MVCL_MONTO/MVCL_TRM) FROM movimiento_clientes
                    WHERE TERC_NIT = :NIT AND MVCL_FECHA >= :FECINI AND MVCL_FECHA <= :FECFIN
                    AND MVCL_ABONO = 'S' AND ((:SUBEMPRESA = 0) or (SUCU_ID = :SUBEMPRESA))
                    INTO :ABONOS;
                END
            END
        ELSE
            BEGIN
            if (MONEDA = 0) then
                BEGIN
                SELECT SUM(MVCL_MONTO), MAX(:FECFIN-MVCL_FECHA), MAX(:FECFIN-MVCL_VENCE) FROM movimiento_clientes
                    WHERE TERC_NIT = :NIT AND MVCL_FECHA >= :FECINI AND MVCL_FECHA <= :FECFIN
                    AND MVCL_DEBITO = 'S' AND ((:SUBEMPRESA = 0) or (SUCU_ID = :SUBEMPRESA))
                    INTO :DEBITOS, :diasf, :dias;
                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 ((:SUBEMPRESA = 0) or (SUCU_ID = :SUBEMPRESA))
                    INTO :CREDITOS;
/*                if (fautorcree <= FECINI) then DEBE TOMAR LA RTCREE POR SI HAY DOCUMENTOS ANTERIORES A LA AUTORET
                    SELECT SUM(MVCL_MONTO+MVCL_RTEFTE+MVCL_RTEIVA+MVCL_RTEICA) FROM movimiento_clientes
                        WHERE TERC_NIT = :NIT AND MVCL_FECHA >= :FECINI AND MVCL_FECHA <= :FECFIN
                        AND MVCL_ABONO = 'S' AND ((:SUBEMPRESA = 0) or (SUCU_ID = :SUBEMPRESA))
                        INTO :ABONOS;
                else */
                    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_ABONO = 'S' AND ((:SUBEMPRESA = 0) or (SUCU_ID = :SUBEMPRESA))
                        INTO :ABONOS;
                END
            ELSE
                BEGIN
                SELECT SUM(MVCL_MONTO/MVCL_TRM), MAX(:FECFIN-MVCL_FECHA), MAX(:FECFIN-MVCL_VENCE) FROM movimiento_clientes
                    WHERE TERC_NIT = :NIT AND MVCL_FECHA >= :FECINI AND MVCL_FECHA <= :FECFIN
                    AND MVCL_DEBITO = 'S' AND ((:SUBEMPRESA = 0) or (SUCU_ID = :SUBEMPRESA))
                    INTO :DEBITOS, :diasf, :dias;
                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 ((:SUBEMPRESA = 0) or (SUCU_ID = :SUBEMPRESA))
                    INTO :CREDITOS;
/*                if (fautorcree <= FECINI) then
                    SELECT SUM((MVCL_MONTO+MVCL_RTEFTE+MVCL_RTEIVA+MVCL_RTEICA)/MVCL_TRM) FROM movimiento_clientes
                        WHERE TERC_NIT = :NIT AND MVCL_FECHA >= :FECINI AND MVCL_FECHA <= :FECFIN
                        AND MVCL_ABONO = 'S' AND ((:SUBEMPRESA = 0) or (SUCU_ID = :SUBEMPRESA))
                        INTO :ABONOS;
                else */
                    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_ABONO = 'S' AND ((:SUBEMPRESA = 0) or (SUCU_ID = :SUBEMPRESA))
                        INTO :ABONOS;
                END
            END
        if (FOV = 'FECHA') then
            BEGIN
            if ((DIASMAX < DIASF) AND (DIASF IS NOT NULL)) then
                DIASMAX = DIASF;
            END
        ELSE
            BEGIN
            if ((DIASMAX < DIAS) AND (DIAS IS NOT NULL)) then
                DIASMAX = DIAS;
            END
        if (DEBITOS IS NULL) then
            DEBITOS = 0;
        if (CREDITOS IS NULL) then
            CREDITOS = 0;
        if (ABONOS IS NULL) then
            ABONOS = 0;
        FINAL = INICIAL + DEBITOS - CREDITOS - ABONOS;
        SUSPEND;
        END
    END
END^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER procedure MOVIMIENTO_CARTERA_DESDE_HASTA (
    NIT varchar(20),
    DESDE date,
    HASTA date,
    EMPSUCURSAL integer,
    MONEDA integer)
returns (
    INICIAL numeric(18,2),
    TIPODOC varchar(8),
    IDDOC integer,
    PREFIJO varchar(4),
    NUMERO varchar(8),
    FECHA date,
    CONCEPTO varchar(60),
    DEBITO numeric(18,2),
    CREDITO numeric(18,2),
    SALDO numeric(18,2),
    NOMBRE varchar(60),
    RTFTE numeric(18,2),
    RTIVA numeric(18,2),
    RTICA numeric(18,2),
    RCREE numeric(18,2),
    SALDODOC numeric(18,2),
    DIASPAGO integer,
    SUCURSAL varchar(10),
    RECPROV_ID integer,
    RECIPROV char(1))
AS
declare variable DB CHAR(1);
declare variable AB CHAR(1);
declare variable RETES CHAR(2);
declare variable tipo integer;
declare variable TRM NUMERIC(18,2);
declare variable i integer;
declare variable AUTORET VARCHAR(10);
declare variable FAUTORET DATE;
declare variable AUTORCREE VARCHAR(10);
declare variable FAUTORCREE DATE;
declare variable CARTXAGE CHAR(2);
declare variable FECREC DATE;
BEGIN
/* Ubique el NIT */
select terc_nom from terceros where terc_nit = :NIT INTO :NOMBRE;
DESDE = DESDE - 1;
INICIAL = 0;
i = 0;
EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'DESCONTAR RETENCIONES POR CAUSACION') returning_values(:RETES);
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', 'GENERAL', 'SEPARAR CARTERA POR AGENCIA') returning_values (:cartxage);
if (CARTXAGE = 'NO') then
empsucursal = 0;
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';
FOR SELECT MVCL_TIPOREF, MVCL_IDREF FROM MOVIMIENTO_CLIENTES
    WHERE TERC_NIT = :NIT AND MVCL_FECHA <= :DESDE AND MVCL_ABONO = 'N' AND
    ((:empsucursal = 0) or (SUCU_ID = :empsucursal)) AND ((:MONEDA = 0) or (MVCL_TRM <> 1))
    INTO :TIPODOC, :IDDOC
    DO
    BEGIN
    EXECUTE PROCEDURE saldo_doc_cartera(TIPODOC, IDDOC, DESDE, MONEDA) returning_values (SALDO);
    if (SALDO <> 0) then
        INICIAL = INICIAL + SALDO;
    END
  DESDE = DESDE + 1;
  SALDO = INICIAL;
  tipodoc = '';
  iddoc = 0;
  FOR select tido_nomcorto, MVCL_TIPOREF, 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_sucursal, MVCL_TRM
    from movimiento_clientes m, tipo_documento t
    where m.mvcl_tiporef = t.tido_cod and terc_nit = :NIT and mvcl_fecha >= :DESDE and mvcl_fecha <= :HASTA and mvcl_tiporef <> 45 AND
    ((SUCU_ID = :EMPSUCURSAL) or (:EMPSUCURSAL = 0)) AND ((:MONEDA = 0) or (MVCL_TRM <> 1))
    order by mvcl_fecha, mvcl_tiporef
    into :TIPODOC,:tipo,  :IDDOC, :PREFIJO, :NUMERO, :FECHA, :CONCEPTO, :DEBITO, :DB, :RTFTE, :RTIVA, :RTICA, :RCREE, :AB, :SUCURSAL, :TRM
    DO
    BEGIN
    i = i + 1;
    if (FAUTORET <= FECHA) then
        RTFTE = 0;
    if (fautorcree <= FECHA) then
      if (AB = 'N') then
        rcree = 0;
    if (DB = 'N') then
        BEGIN
        if (AB = 'S') then
            if (RETES = 'SI') then
                CREDITO = DEBITO;
            ELSE
                CREDITO = DEBITO + RTFTE + RTIVA + RTICA + RCREE;
        ELSE
            if (RETES = 'SI') then
                CREDITO = DEBITO - RTFTE - RTIVA - RTICA - RCREE;
            ELSE
                CREDITO = DEBITO;
        DEBITO = 0;
        END
    ELSE
        BEGIN
        if (RETES = 'SI') then
            DEBITO = DEBITO - RTFTE - RTIVA - RTICA - RCREE;
        CREDITO = 0;
        END
    if ((MONEDA <> 0) AND (TRM <> 0)) then
        BEGIN
        DEBITO = DEBITO / TRM;
        CREDITO = CREDITO / TRM;
        RTFTE = RTFTE / TRM;
        RTIVA = RTIVA / TRM;
        RTICA = RTICA / TRM;
        RCREE = RCREE / TRM;
        END
    SALDO = SALDO + DEBITO - CREDITO;
    EXECUTE PROCEDURE saldo_doc_cartera(TIPO, IDDOC, HASTA, MONEDA) returning_values (SALDODOC);
    if (SALDODOC = 0) then
        BEGIN
        SELECT MAX(SDCA_FECHA) FROM saldos_doc_cartera WHERE SDCA_TIPOREF = :tipo AND SDCA_IDREF = :iddoc AND SDCA_ABONO <> 0 INTO :FECREC;
        DIASPAGO = :FECREC - :FECHA;
        END
    ELSE
        BEGIN
        DIASPAGO = :HASTA - :FECHA;
        END
    /* IDENTIFICAR SI EL DOCUMENTO TIENE RECIBO PROVISIONAL*/
    recprov_id = 0;
    SELECT max(d.RCPR_ID) FROM recibo_provisional_detalle d, recibo_provisional r
        where r.rcpr_id = d.rcpr_id and RPDE_IDDOC = :iddoc  AND RPDE_TIPODOC = :TIPO AND RPDE_TIPODOC = :TIPO and
        RPDE_ANULADO = 'N' and r.rcpr_idcruce = 0 INTO :recprov_id;
    if (recprov_id is null) then
      BEGIN
       reciprov = 'N';
      end
    ELSE
      begin
       reciprov = 'S';
      END
    SUSPEND;
    END
if (i = 0) then
    SUSPEND;
END^

SET TERM ; ^

/* 20130920B */
/* NOMBRE DE LA SUCURSAL DEL CLIENTE EN LUGAR DEL TERCERO */
/* RANGO DE FECHAS Y TASA DE MORA EN FACTURACION PERIODICA (SE HABIA PERDIDO) */
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,
    FECINI date,
    FECFIN date,
    MORA numeric(9,4))
returns (
    PREFIJO varchar(4),
    NUMERO varchar(8),
    NIT varchar(20),
    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);
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);
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.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 S.clcu_cod = '01' AND
        C.vend_cod >= :vendini AND C.vend_cod <= :vendfin AND ((c.grca_cod is null and :grpini = 0 ) or (C.grca_cod >= :grpini AND C.grca_cod <= :grpfin)) AND
        ((c.zona_cod is null and :zonini = '') or (C.zona_cod >= :zonini AND C.zona_cod <= :zonfin))
    INTO :NIT, :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_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', 'N', :TOTAL, :BOD, :OBS, NULL, NULL, 0, USER, '01', '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 CLIE_VALORMES FROM CLIENTES WHERE TERC_NIT = :NIT 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
            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, NULL, '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;
            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
        UPDATE FACTURAS SET FACT_TOTAL = :total,  FACT_IVAMONTO = :IVAM, FACT_RTFTEMONTO = :rtftem, 
            FACT_RTIVAMONTO = :rtivam, FACT_RTICAMONTO = :rticam 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 ; ^

/* 20130925 */
/* FALTABA EN SCRIPTS DE ACTUALIZACION */
INSERT INTO CONFIGURACION (CONF_MODULO, CONF_CATEGORIA, CONF_PROPIEDAD, CONF_VALOR, CONF_POSIBLES, CONF_AYUDA) VALUES ('FACTURACION', 'GENERAL', 'DIRECCION DE CORREO ELECTRONICO PARA COPIAS DE ENVIO DE DOCUMENTOS', '', '', 'Indique una cuenta de correo electrónico a la que se le enviará una copia de todas las facturas enviadas por SYSplus');
COMMIT WORK;

/* 20130927 */
/* EXCLUIR CLIENTES DE CONTADO RELACIONADOS EN EL PUNTO DE VENTA */
SET TERM ^ ;

CREATE OR ALTER procedure MOVIMIENTO_CARTERA_MES (
    FECINI date,
    FECFIN date,
    SUBEMPRESA integer,
    CONTADO char(1),
    MONEDA integer)
returns (
    NIT varchar(20),
    NOMBRE varchar(60),
    ZONA varchar(2),
    VENDEDOR integer,
    COBRADOR integer,
    CONTACTO varchar(60),
    DIASMAX integer,
    TELEFONO varchar(40),
    INICIAL numeric(18,2),
    DEBITOS numeric(18,2),
    CREDITOS numeric(18,2),
    ABONOS numeric(18,2),
    FINAL numeric(18,2))
AS
declare variable RETES CHAR(2);
declare variable TIPODOC INTEGER;
declare variable IDDOC INTEGER;
declare variable SALDO NUMERIC(18,2);
declare variable NUMROWS INTEGER;
declare variable DIASF INTEGER;
declare variable DIAS INTEGER;
DECLARE VARIABLE FOV CHAR(11);
declare variable AUTORET VARCHAR(10);
declare variable FAUTORET DATE;
declare variable AUTORCREE VARCHAR(10);
declare variable FAUTORCREE DATE;
declare variable CARTXAGE CHAR(2);
BEGIN
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', 'ANALISIS DE CARTERA CON FECHA FACTURA O VENCIMIENTO') RETURNING_VALUES (FOV);
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';
EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'GENERAL', 'SEPARAR CARTERA POR AGENCIA') returning_values (:cartxage);
if (CARTXAGE = 'NO') then
    subempresa = 0;
for select T.TERC_NIT, TERC_NOM, TERC_CONTACTO, TERC_TEL, ZONA_COD, VEND_COD, COBR_COD
    from TERCEROS T, CLIENTES C WHERE T.terc_nit = C.terc_nit AND TERC_CLIE = 'S'
    into :NIT, :NOMBRE, :CONTACTO, :TELEFONO, :zona, :vendedor, :cobrador
  DO
    BEGIN
    diasmax = 0;
    SELECT COUNT(*) FROM AUTORIZACIONES WHERE AUTO_NITCONTADO = :NIT INTO :numrows;
    if (numrows = 0) then
        SELECT COUNT(*) FROM punto_venta WHERE TERC_NIT = :NIT INTO :numrows;
    IF ((CONTADO = 'S') or (numrows = 0)) THEN
        BEGIN
        FECINI = FECINI - 1;
        INICIAL = 0;
        FOR SELECT MVCL_TIPOREF, MVCL_IDREF, (:FECFIN-MVCL_FECHA), (:FECFIN-MVCL_VENCE) FROM MOVIMIENTO_CLIENTES
            WHERE TERC_NIT = :NIT 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, :DIASF, DIAS
            DO
            BEGIN
            EXECUTE PROCEDURE saldo_doc_cartera(TIPODOC, IDDOC, FECINI, MONEDA) returning_values (SALDO);
            if (SALDO <> 0) then
                BEGIN
                INICIAL = INICIAL + SALDO;
                if (FOV = 'FECHA') then
                    BEGIN
                    if ((SALDO > 0) AND (DIASMAX < DIASF)) then
                        DIASMAX = DIASF;
                    END
                ELSE
                    BEGIN
                    if ((SALDO > 0) AND (DIASMAX < DIAS)) then
                        DIASMAX = DIAS;
                    END
                END
            END
        EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'DESCONTAR RETENCIONES POR CAUSACION') returning_values(:RETES);
        FECINI = FECINI + 1;
        if (RETES = 'SI') then
            BEGIN
            if (MONEDA = 0) then
                BEGIN
                if (FAUTORET <= FECINI) then
                    if (fautorcree <= FECINI) then
                        begin
                        SELECT SUM(MVCL_MONTO-MVCL_RTEIVA-MVCL_RTEICA), MAX(:FECFIN-MVCL_FECHA), MAX(:FECFIN-MVCL_VENCE) FROM movimiento_clientes
                            WHERE TERC_NIT = :NIT AND MVCL_FECHA >= :FECINI AND MVCL_FECHA <= :FECFIN
                            AND MVCL_DEBITO = 'S' AND ((:SUBEMPRESA = 0) or (SUCU_ID = :SUBEMPRESA))
                            INTO :DEBITOS, :diasf, :dias;
                        SELECT SUM(MVCL_MONTO-MVCL_RTEIVA-MVCL_RTEICA) 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 ((:SUBEMPRESA = 0) or (SUCU_ID = :SUBEMPRESA))
                            INTO :CREDITOS;
                        end
                    else
                        begin
                        SELECT SUM(MVCL_MONTO-MVCL_RTEIVA-MVCL_RTEICA-MVCL_RCREE), MAX(:FECFIN-MVCL_FECHA), MAX(:FECFIN-MVCL_VENCE) FROM movimiento_clientes
                            WHERE TERC_NIT = :NIT AND MVCL_FECHA >= :FECINI AND MVCL_FECHA <= :FECFIN
                            AND MVCL_DEBITO = 'S' AND ((:SUBEMPRESA = 0) or (SUCU_ID = :SUBEMPRESA))
                            INTO :DEBITOS, :diasf, :dias;
                        SELECT SUM(MVCL_MONTO-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 ((:SUBEMPRESA = 0) or (SUCU_ID = :SUBEMPRESA))
                            INTO :CREDITOS;
                        end
                else
                    if (fautorcree <= FECINI) then
                        begin
                        SELECT SUM(MVCL_MONTO-MVCL_RTEFTE-MVCL_RTEIVA-MVCL_RTEICA), MAX(:FECFIN-MVCL_FECHA), MAX(:FECFIN-MVCL_VENCE) FROM movimiento_clientes
                            WHERE TERC_NIT = :NIT AND MVCL_FECHA >= :FECINI AND MVCL_FECHA <= :FECFIN
                            AND MVCL_DEBITO = 'S' AND ((:SUBEMPRESA = 0) or (SUCU_ID = :SUBEMPRESA))
                            INTO :DEBITOS, :diasf, :dias;
                        SELECT SUM(MVCL_MONTO-MVCL_RTEFTE-MVCL_RTEIVA-MVCL_RTEICA) 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 ((:SUBEMPRESA = 0) or (SUCU_ID = :SUBEMPRESA))
                            INTO :CREDITOS;
                        end
                    else
                        begin
                        SELECT SUM(MVCL_MONTO-MVCL_RTEFTE-MVCL_RTEIVA-MVCL_RTEICA-MVCL_RCREE), MAX(:FECFIN-MVCL_FECHA), MAX(:FECFIN-MVCL_VENCE) FROM movimiento_clientes
                            WHERE TERC_NIT = :NIT AND MVCL_FECHA >= :FECINI AND MVCL_FECHA <= :FECFIN
                            AND MVCL_DEBITO = 'S' AND ((:SUBEMPRESA = 0) or (SUCU_ID = :SUBEMPRESA))
                            INTO :DEBITOS, :diasf, :dias;
                        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 ((:SUBEMPRESA = 0) or (SUCU_ID = :SUBEMPRESA))
                            INTO :CREDITOS;
                        end
                SELECT SUM(MVCL_MONTO) FROM movimiento_clientes
                    WHERE TERC_NIT = :NIT AND MVCL_FECHA >= :FECINI AND MVCL_FECHA <= :FECFIN
                    AND MVCL_ABONO = 'S' AND ((:SUBEMPRESA = 0) or (SUCU_ID = :SUBEMPRESA))
                    INTO :ABONOS;
                END
            ELSE
                BEGIN
                if (FAUTORET <= FECINI) then
                    if (fautorcree <= FECINI) then
                        begin
                        SELECT SUM((MVCL_MONTO-MVCL_RTEIVA-MVCL_RTEICA)/MVCL_TRM), MAX(:FECFIN-MVCL_FECHA), MAX(:FECFIN-MVCL_VENCE) FROM movimiento_clientes
                            WHERE TERC_NIT = :NIT AND MVCL_FECHA >= :FECINI AND MVCL_FECHA <= :FECFIN
                            AND MVCL_DEBITO = 'S' AND ((:SUBEMPRESA = 0) or (SUCU_ID = :SUBEMPRESA))
                            INTO :DEBITOS, :diasf, :dias;
                        SELECT SUM((MVCL_MONTO-MVCL_RTEIVA-MVCL_RTEICA)/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 ((:SUBEMPRESA = 0) or (SUCU_ID = :SUBEMPRESA))
                            INTO :CREDITOS;
                        end
                    else
                        begin
                        SELECT SUM((MVCL_MONTO-MVCL_RTEIVA-MVCL_RTEICA-MVCL_RCREE)/MVCL_TRM), MAX(:FECFIN-MVCL_FECHA), MAX(:FECFIN-MVCL_VENCE) FROM movimiento_clientes
                            WHERE TERC_NIT = :NIT AND MVCL_FECHA >= :FECINI AND MVCL_FECHA <= :FECFIN
                            AND MVCL_DEBITO = 'S' AND ((:SUBEMPRESA = 0) or (SUCU_ID = :SUBEMPRESA))
                            INTO :DEBITOS, :diasf, :dias;
                        SELECT SUM((MVCL_MONTO-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 ((:SUBEMPRESA = 0) or (SUCU_ID = :SUBEMPRESA))
                            INTO :CREDITOS;
                        end
                else
                    if (fautorcree <= FECINI) then
                        begin
                        SELECT SUM((MVCL_MONTO-MVCL_RTEFTE-MVCL_RTEIVA-MVCL_RTEICA)/MVCL_TRM), MAX(:FECFIN-MVCL_FECHA), MAX(:FECFIN-MVCL_VENCE) FROM movimiento_clientes
                            WHERE TERC_NIT = :NIT AND MVCL_FECHA >= :FECINI AND MVCL_FECHA <= :FECFIN
                            AND MVCL_DEBITO = 'S' AND ((:SUBEMPRESA = 0) or (SUCU_ID = :SUBEMPRESA))
                            INTO :DEBITOS, :diasf, :dias;
                        SELECT SUM((MVCL_MONTO-MVCL_RTEFTE-MVCL_RTEIVA-MVCL_RTEICA)/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 ((:SUBEMPRESA = 0) or (SUCU_ID = :SUBEMPRESA))
                            INTO :CREDITOS;
                        end
                    else
                        begin
                        SELECT SUM((MVCL_MONTO-MVCL_RTEFTE-MVCL_RTEIVA-MVCL_RTEICA-MVCL_RCREE)/MVCL_TRM), MAX(:FECFIN-MVCL_FECHA), MAX(:FECFIN-MVCL_VENCE) FROM movimiento_clientes
                            WHERE TERC_NIT = :NIT AND MVCL_FECHA >= :FECINI AND MVCL_FECHA <= :FECFIN
                            AND MVCL_DEBITO = 'S' AND ((:SUBEMPRESA = 0) or (SUCU_ID = :SUBEMPRESA))
                            INTO :DEBITOS, :diasf, :dias;
                        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 ((:SUBEMPRESA = 0) or (SUCU_ID = :SUBEMPRESA))
                            INTO :CREDITOS;
                        end
                SELECT SUM(MVCL_MONTO/MVCL_TRM) FROM movimiento_clientes
                    WHERE TERC_NIT = :NIT AND MVCL_FECHA >= :FECINI AND MVCL_FECHA <= :FECFIN
                    AND MVCL_ABONO = 'S' AND ((:SUBEMPRESA = 0) or (SUCU_ID = :SUBEMPRESA))
                    INTO :ABONOS;
                END
            END
        ELSE
            BEGIN
            if (MONEDA = 0) then
                BEGIN
                SELECT SUM(MVCL_MONTO), MAX(:FECFIN-MVCL_FECHA), MAX(:FECFIN-MVCL_VENCE) FROM movimiento_clientes
                    WHERE TERC_NIT = :NIT AND MVCL_FECHA >= :FECINI AND MVCL_FECHA <= :FECFIN
                    AND MVCL_DEBITO = 'S' AND ((:SUBEMPRESA = 0) or (SUCU_ID = :SUBEMPRESA))
                    INTO :DEBITOS, :diasf, :dias;
                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 ((:SUBEMPRESA = 0) or (SUCU_ID = :SUBEMPRESA))
                    INTO :CREDITOS;
/*                if (fautorcree <= FECINI) then DEBE TOMAR LA RTCREE POR SI HAY DOCUMENTOS ANTERIORES A LA AUTORET
                    SELECT SUM(MVCL_MONTO+MVCL_RTEFTE+MVCL_RTEIVA+MVCL_RTEICA) FROM movimiento_clientes
                        WHERE TERC_NIT = :NIT AND MVCL_FECHA >= :FECINI AND MVCL_FECHA <= :FECFIN
                        AND MVCL_ABONO = 'S' AND ((:SUBEMPRESA = 0) or (SUCU_ID = :SUBEMPRESA))
                        INTO :ABONOS;
                else */
                    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_ABONO = 'S' AND ((:SUBEMPRESA = 0) or (SUCU_ID = :SUBEMPRESA))
                        INTO :ABONOS;
                END
            ELSE
                BEGIN
                SELECT SUM(MVCL_MONTO/MVCL_TRM), MAX(:FECFIN-MVCL_FECHA), MAX(:FECFIN-MVCL_VENCE) FROM movimiento_clientes
                    WHERE TERC_NIT = :NIT AND MVCL_FECHA >= :FECINI AND MVCL_FECHA <= :FECFIN
                    AND MVCL_DEBITO = 'S' AND ((:SUBEMPRESA = 0) or (SUCU_ID = :SUBEMPRESA))
                    INTO :DEBITOS, :diasf, :dias;
                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 ((:SUBEMPRESA = 0) or (SUCU_ID = :SUBEMPRESA))
                    INTO :CREDITOS;
/*                if (fautorcree <= FECINI) then
                    SELECT SUM((MVCL_MONTO+MVCL_RTEFTE+MVCL_RTEIVA+MVCL_RTEICA)/MVCL_TRM) FROM movimiento_clientes
                        WHERE TERC_NIT = :NIT AND MVCL_FECHA >= :FECINI AND MVCL_FECHA <= :FECFIN
                        AND MVCL_ABONO = 'S' AND ((:SUBEMPRESA = 0) or (SUCU_ID = :SUBEMPRESA))
                        INTO :ABONOS;
                else */
                    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_ABONO = 'S' AND ((:SUBEMPRESA = 0) or (SUCU_ID = :SUBEMPRESA))
                        INTO :ABONOS;
                END
            END
        if (FOV = 'FECHA') then
            BEGIN
            if ((DIASMAX < DIASF) AND (DIASF IS NOT NULL)) then
                DIASMAX = DIASF;
            END
        ELSE
            BEGIN
            if ((DIASMAX < DIAS) AND (DIAS IS NOT NULL)) then
                DIASMAX = DIAS;
            END
        if (DEBITOS IS NULL) then
            DEBITOS = 0;
        if (CREDITOS IS NULL) then
            CREDITOS = 0;
        if (ABONOS IS NULL) then
            ABONOS = 0;
        FINAL = INICIAL + DEBITOS - CREDITOS - ABONOS;
        SUSPEND;
        END
    END
END^

SET TERM ; ^

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),
    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);
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);
  /* 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 (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
                    SALDO = SALDO + DEBITO - CREDITO - RTFTE - RTIVA - RTICA - RCREE;
                else
                    SALDO = SALDO + DEBITO - CREDITO;
            ELSE
                if (AB = 'N') then
                    SALDO = SALDO + DEBITO - CREDITO;
                else
                    SALDO = SALDO + DEBITO - CREDITO + RTFTE + RTIVA + RTICA + RCREE;
            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;
            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_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
                            SALDO = SALDO + DEBITO - CREDITO - RTFTE - RTIVA - RTICA - RCREE;
                        else
                            SALDO = SALDO + DEBITO - CREDITO;
                    ELSE
                        if (AB = 'N') then
                            SALDO = SALDO + DEBITO - CREDITO;
                        else
                            SALDO = SALDO + DEBITO - CREDITO - RTFTE - RTIVA - RTICA - RCREE;
                    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;
                    SALDO = INICIAL + DEBITO - CREDITO;
                    SUSPEND;
                    END
                END  /* ok = S */
            END  /* FOR COBRADOR */
        END  /* AGRUPA C */
    END  /* FOR NIT */
END^

SET TERM ; ^

/* 20130927B */
/* TOTAL DEBITO Y CREDITO CON RETENCIONES PARA EL ESTADO DE CUENTA */
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);
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);
  /* 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 (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_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 ; ^

/* 20130927C */
/* REPLICACION DE MOVIMIENTOS DE INVENTARIO EN CIA EXISTENCIAS */
INSERT INTO CONFIGURACION (CONF_MODULO, CONF_CATEGORIA, CONF_PROPIEDAD, CONF_VALOR, CONF_POSIBLES, CONF_AYUDA) VALUES ('INVENTARIO', 'EXISTENCIAS', 'REPLICAR MOVIMIENTOS DE INVENTARIO DE COMPROBANTES DE INVENTARIO', 'NO', 'SI,NO', 'SI:Replica todos los documentos que afectan el inventario incluyendo ajustes, traslados, etc. NO: Replica solamente ventas (facturas y devoluciones) y compras (facturas y devoluciones) losd emás movimientos no se replican');
commit work;

/* 20130917 */
/* CONTABILIZACION APLICACIONES AL REVES */

SET TERM ^ ;

CREATE OR ALTER procedure CONTABIL_APLICAPR (
    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 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 TIPOCOMP VARCHAR(3);
declare variable PREFCONT VARCHAR(4);
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);
ERROR = 0;
/* BUSQUE LA INTERFACE */
EXISTE = 'N';
SELECT 'S', TICO_COD, PRCO_PRE, INCP_BASE, INCP_PROV, INCP_CTABASE, INCP_CTAPROV, INCP_CONFIRMAR
  FROM INTERFAZ_CXPAGAR
  WHERE INCP_ID = :IDINTER
  INTO :EXISTE, :TIPOCOMP, :PREFCONT, :BASE, :CLIE, :CTABASE, :CTACLIE, :VER;

if (EXISTE = 'S') then
  BEGIN
  /* BORRE CUALQUEIR CONTABILIZACION PREVIA */
  DELETE FROM CONTABILIZACION WHERE CNTB_TIPOREF = 53 AND CNTB_IDREF = :IDDOC;
  /* 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);

    /* REGISTRE EL ENCABEZADO CONTABLE */
    IDC = GEN_ID(ID_CONTABILIZA, 1);
    INSERT INTO CONTABILIZACION (CNTB_ID, CNTB_TIPOCOMP, CNTB_PREFCNT, CNTB_NUMERO, CNTB_FECHA, CNTB_CONCEPTO, CNTB_REF, CNTB_TIPOREF, CNTB_IDREF, CNTB_PREFREF, CNTB_NUMREF, CNTB_PROCESADO)
        VALUES (:IDC, :TIPOCOMP, :PREFCONT, :NUM, :FECHA, :CONC, '', 53, :IDDOC, :PREF, :NUM, 'N');
    NROI = 0;

    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
                WHERE CUEN_COD = :CTABASE INTO :CUENTA, :TIPOCUEN;
            if (CUENTA IS NULL) then
                begin
                EXECUTE PROCEDURE ERROR (53, :IDDOC, :CTABASE, 2);
                CUENTA = CTABASE;
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'I') then
                BEGIN
                EXECUTE PROCEDURE ERROR (53, :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, 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
                WHERE CUEN_COD = :CTACLIE INTO :CUENTA, :TIPOCUEN;
            IF (CUENTA IS NULL) then
                begin
                EXECUTE PROCEDURE ERROR (53, :IDDOC, :CTACLIE, 2);
                CUENTA = CTACLIE;
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'I') then
                BEGIN
                EXECUTE PROCEDURE ERROR (53, :IDDOC, :CUENTA, 3);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                END
            if (TIPOCUEN = 'C') then
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_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 (ERROR > 0) then
    VER = 'S';
  SUSPEND;
  END /* EXISTE LA INTERFAZ */
ELSE
    BEGIN
    EXECUTE PROCEDURE ERROR (53, :IDDOC, :PREF, 1);
    ERROR = ERROR + 1;
    VER = 'S';
    SUSPEND;
    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 ; ^

/* 20130930 */
/* MAL CREDITOS POR ABONOS RESTABA LA RETENCION EN LUGAR DE SUMARLA AL CREDITO */
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);
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);
  /* 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 (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_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 ; ^

/* 20130930B */
/* ACCESO A OBSERVACIONES INDEPENDIENTE */
INSERT INTO CONFIGURACION (CONF_MODULO, CONF_CATEGORIA, CONF_PROPIEDAD, CONF_VALOR, CONF_POSIBLES, CONF_AYUDA) VALUES ('CARTERA', 'GENERAL', 'CONTROLAR ACCESO AL CAMPO DE OBSERVACIONES DEL CLIENTE', 'NO', 'SI,NO', 'SI: Solo ususarios administradores o con acceso específico pueden modificar el contenido del campo observaciones del cliente. NO: Un usaurio con acceso de registrar clientes puede modificar las observaciones');
COMMIT WORK;

/* 20130930C */
/* ASIGNAR AUTOMATICAMENTE AUTORETENCION DEL CREE */
INSERT INTO CONFIGURACION (CONF_MODULO, CONF_CATEGORIA, CONF_PROPIEDAD, CONF_VALOR, CONF_POSIBLES, CONF_AYUDA) VALUES ('CARTERA', 'SALDOS', 'PORCENTAJE DE RETENCION CREE PREDETERMINADO', '0.3', '', 'Indique el porcentaje de retención que se asignara a cada nuevo cliente de la empresa');
commit work;

SET TERM ^ ;

CREATE OR ALTER TRIGGER CLIENTES_BI FOR CLIENTES
ACTIVE BEFORE INSERT POSITION 0
as
declare variable NUMCLI VARCHAR(2);
declare variable CUPO NUMERIC(18,2);
declare variable DIAS INTEGER;
declare variable UNICOB VARCHAR(2);
declare variable AGENCIA INTEGER;
begin
new.clie_fecha = cast('now' as DATE);
if (new.clie_diasbloq is null) then
    new.clie_diasbloq = 1;

if (new.vend_cod is null) then
    SELECT VEND_COD FROM USUARIO WHERE USER_COD = USER INTO NEW.vend_cod;
execute procedure lee_configuracion ('CARTERA','COMISIONES','UNIFICAR CODIGOS DE VENDEDORES Y COBRADORES') returning_values (:UNICOB);
if (UNICOB = 'SI') then
    NEW.cobr_cod = NEW.vend_cod;

if ((new.clie_rtcree is null) or (NEW.clie_rtcree = 0)) then
    execute procedure lee_configuracion ('CARTERA', 'SALDOS', 'PORCENTAJE DE RETENCION CREE PREDETERMINADO') returning_values (NEW.clie_rtcree);

if ((new.clie_cupo is null) or (NEW.clie_cupo = 0)) then
    begin
    execute procedure lee_configuracion ('CARTERA', 'GENERAL', 'CUPO DE CREDITO PREDETERMINADO AL CREAR CLIENTES') returning_values (:cupo);
    new.clie_cupo = :CUPO;
    end
if ((new.clie_dias is null) or (NEW.clie_dias = 0)) then
    begin
    execute procedure lee_configuracion ('CARTERA', 'GENERAL', 'DIAS DE CREDITO PREDETERMINADO AL CREAR CLIENTES') returning_values (:dias);
    new.clie_dias = :dias;
    end
if ((new.lipr_cod is null) or (NEW.lipr_cod = 0)) then
    begin
    select sucu_id from usuario where user_cod = user into :agencia;
    if ((agencia is null) or (agencia = 0)) then
        select first 1 lipr_cod from lista_precios where lipr_predet = 'S' into new.lipr_cod;
    else
        select first 1 lipr_cod from lista_precios where lipr_predet = 'S' and sucu_id = :agencia into new.lipr_cod;
    end
if (NEW.zona_cod IS NULL) then
    SELECT FIRST 1 ZONA_COD FROM ZONAS Z, USUARIO U WHERE U.sucu_id = Z.sucu_id AND U.user_cod = USER INTO NEW.zona_cod;
execute procedure lee_configuracion ('CARTERA', 'GENERAL', 'NUMERAR CLIENTES DE FORMA CONSECUTIVA AUTOMATICAMENTE') returning_values (:NUMCLI);
if (NUMCLI = 'SI') then
    SELECT CAST(MAX(CLIE_COD) AS INTEGER)+1 FROM CLIENTES INTO NEW.clie_cod;
end^

SET TERM ; ^

/* 20130930D */
/* DOCUMENTO APLICADO EN CARGOS CXP */

ALTER TABLE NOTAS_DEBITO_PROVEEDOR
ADD NDPR_TIPOAPL T_ID;

ALTER TABLE NOTAS_DEBITO_PROVEEDOR
ADD NDPR_NUMAPL VARCHAR(10);

SET TERM ^ ;

CREATE OR ALTER procedure IMPR_NOTADBPR (
    ID integer)
returns (
    PREFIJO varchar(4),
    NUMERO varchar(8),
    NUMPROV varchar(8),
    FECHA date,
    CONCEPTO varchar(60),
    NIT varchar(20),
    NOMBRE varchar(60),
    DIR varchar(60),
    CIU varchar(40),
    TEL varchar(40),
    CONTACTO varchar(60),
    FAX varchar(25),
    CEL varchar(25),
    EMAIL varchar(100),
    VENCE date,
    NROCTR varchar(30),
    MONTO numeric(18,2),
    IVAPORC numeric(9,2),
    IVAMONTO numeric(18,2),
    TOTAL numeric(18,2),
    TOTALPAGAR numeric(18,2),
    RTFTEPORC numeric(9,2),
    RTFTEMONTO numeric(18,2),
    RTIVAPORC numeric(9,2),
    RTIVAMONTO numeric(18,2),
    RTICAPORC numeric(9,2),
    RTICAMONTO numeric(18,2),
    RTCREE numeric(9,2),
    RTCREEM numeric(18,2),
    DTOFECHA date,
    DTOPORC numeric(9,2),
    DTOMONTO numeric(18,2),
    OBS blob sub_type 1 segment size 80,
    PROV_COD varchar(15),
    PROV_CARTERA varchar(60),
    PROV_CODIGOINT varchar(15),
    DOCAPLICADO varchar(21))
AS
declare variable tipoAPL INTEGER;
declare variable numAPL VARCHAR(12) CHARACTER SET NONE;
BEGIN
  SELECT PREF_PRE, NDPR_NUMERO, NDPR_FECHA, NDPR_CONC, N.TERC_NIT, TERC_NOM, TERC_DIR, TERC_CIU, TERC_TEL, TERC_CONTACTO, TERC_FAX, TERC_CEL, TERC_EMAIL, NDPR_VENCE, NDPR_MONTO,
    NDPR_IVAPORC, NDPR_IVAMONTO, NDPR_RTFTEPORC, NDPR_RTFTEMONTO, NDPR_RTIVAPORC, NDPR_RTIVAMONTO, NDPR_RTICAPORC, NDPR_RTICAMONTO, NDPR_RTCREE, NDPR_RTCREEM,
    NDPR_DTOFECHA, NDPR_DTOFPORC, NDPR_DTOFMONTO, NDPR_OBS, PROV_COD, PROV_CARTERA, PROV_CODIGOINT, NDPR_NUMPROV, NDPR_NUMCTR, N.ndpr_tipoapl,N.ndpr_numapl
    FROM NOTAS_DEBITO_PROVEEDOR N, TERCEROS T, PROVEEDORES P WHERE N.TERC_NIT = T.TERC_NIT AND T.TERC_NIT = P.TERC_NIT AND NDPR_ID = :ID
    INTO :PREFIJO, :NUMERO, :FECHA, :CONCEPTO, :NIT, :NOMBRE, :DIR, :CIU, :TEL, :CONTACTO, :FAX, :CEL, :EMAIL, :VENCE, :MONTO,
    :IVAPORC, :IVAMONTO, :RTFTEPORC, :RTFTEMONTO, :RTIVAPORC, :RTIVAMONTO, :RTICAPORC, :RTICAMONTO, :RTCREE, :RTCREEM,
    :DTOFECHA, :DTOPORC, :DTOMONTO, :OBS, :PROV_COD, :PROV_CARTERA, :PROV_CODIGOINT, :NUMPROV, :nroctr,:tipoapl ,:numapl;
  TOTAL = MONTO + IVAMONTO;
  TOTALPAGAR = TOTAL - RTFTEMONTO - RTIVAMONTO - RTICAMONTO - RTCREEM;
  if (tipoAPL IS NOT NULL) then
    BEGIN
    SELECT (T.TIDO_NOMCORTO||'-'||:numAPL) FROM TIPO_DOCUMENTO T WHERE T.TIDO_COD = :tipoAPL
       INTO :DOCAPLICADO;
    END
  SUSPEND;
END^

SET TERM ; ^

/* 20131004 */
/* PROGRAMACION DE PAGOS NO GRABABA LOS EGRESOS */

ALTER TABLE PROGRAMACION_PAGOS
ADD PRPG_EGRESO T_BOOLEANO;

ALTER TABLE PROGRAMACION_PAGOS
ADD PRPG_PREF VARCHAR(4);

ALTER TABLE PROGRAMACION_PAGOS
ADD PRPG_TIPOBCO T_ID;

ALTER TABLE PROGRAMACION_PAGOS
ADD PRPG_PREFBCO VARCHAR(4);

ALTER TABLE PROGRAMACION_PAGOS
ADD PRPG_IDEGRE T_ID;

SET TERM ^ ;

CREATE OR ALTER procedure DINERO_DISPONIBLE (
    FECHA date,
    AGENCIA integer)
returns (
    COB varchar(5),
    IDCAJA integer,
    CTABCO varchar(3),
    NROBCO varchar(20),
    NOMBRE varchar(60),
    SALDO numeric(18,2))
AS
begin
COB = 'CAJA';
FOR SELECT CAJA_ID, CAJA_ID, CAJA_NOMBRE FROM CAJAS WHERE (SUCU_ID = :AGENCIA) or (:AGENCIA = 0)
    INTO :IDCAJA, ctabco, :NOMBRE
    DO
    BEGIN
    EXECUTE procedure saldo_en_caja(:IDCAJA, :FECHA) returning_values (:SALDO);
    suspend;
    END
COB = 'BANCO';
FOR SELECT CUBA_COD, CUBA_CODCTA, CUBA_NUMERO, CUBA_TITULAR FROM CUENTAS_BANCO WHERE (SUCU_ID = :AGENCIA) or (:AGENCIA = 0)
    INTO :IDCAJA, :CTABCO, :NROBCO, :NOMBRE
    DO
    BEGIN
    EXECUTE procedure saldo_cuenta_banco(:IDCAJA, :FECHA) returning_values (:SALDO);
    SUSPEND;
    END
end^

SET TERM ; ^

SET TERM ^ ;


CREATE OR ALTER TRIGGER PROGRAMACION_PAGOS_BI FOR PROGRAMACION_PAGOS
ACTIVE BEFORE INSERT POSITION 0
as
begin
if (NEW.prpg_egreso = 'S') then
    BEGIN
    NEW.prpg_idegre = GEN_ID(id_egresos, 1);
    END
ELSE
    NEW.prpg_idegre = 0;
end^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER trigger PROGRAMACION_PAGOS_BU for PROGRAMACION_PAGOS
active BEFORE UPDATE position 0
as
begin
if ((OLD.prpg_egreso = 'N') AND (NEW.prpg_egreso = 'S')) then
    BEGIN
    NEW.prpg_idegre = GEN_ID(id_egresos, 1);
    END
end^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER TRIGGER PROGRAMACION_PAGOS_AI FOR PROGRAMACION_PAGOS
ACTIVE AFTER INSERT POSITION 0
as
declare variable numero varchar(8);
declare variable NIT varchar(15);
declare variable NOMTERC varchar(60);
declare variable NOMTIPO varchar(8);
declare variable CONC VARCHAR(60);
declare variable PREFDOC varchar(4);
declare variable NUMDOC varchar(8);
declare variable ERROR CHAR(1);
declare variable NUMPROV varchar(12);
declare variable MONTO NUMERIC(18,2);
declare variable IDDOC INTEGER;
declare variable SALDO NUMERIC(18,2);
declare variable RTFTEF NUMERIC(18,2);
declare variable RTIVAF NUMERIC(18,2);
declare variable RTICAF NUMERIC(18,2);
declare variable RTCREE NUMERIC(18,2);
declare variable DTOF NUMERIC(18,2);
begin
if (NEW.prpg_egreso = 'S') then
    BEGIN
    SELECT PREF_ACTUAL FROM PREFIJOS WHERE TIDO_COD = 62 and pref_activo = 'S' AND PREF_PRE = new.prpg_pref INTO :numero;
    SELECT M.TERC_NIT, TERC_NOM, M.mvpr_monto, TD.tido_nomcorto, M.mvpr_prefijo, M.mvpr_numero FROM TERCEROS T, movimiento_proveedor M, TIPO_DOCUMENTO TD
        WHERE M.terc_nit = T.terc_nit AND M.mvpr_tiporef = NEW.prpg_tipodoc AND M.mvpr_idref = NEW.prpg_iddoc AND TD.tido_cod = M.mvpr_tiporef
        INTO :NIT, :NOMTERC, :MONTO, :nomtipo, :PREFDOC, :NUMDOC;
    if (MONTO <> NEW.prpg_abono) then
        CONC = 'ABONO A ' || :NOMTIPO || ' ' || :PREFDOC || :NUMDOC;
    else
        CONC = 'CANCELA A ' || :NOMTIPO || ' ' || :PREFDOC || :NUMDOC;
    SELECT PREF_ACTUAL FROM PREFIJOS WHERE TIDO_COD = 62 and pref_activo = 'S' AND PREF_PRE = new.prpg_pref INTO :numero;
    EXECUTE PROCEDURE busca_id_doc_cxpagar(21, :prefdoc, :numdoc, :nit, NEW.prpg_fecha)
        returning_values (:IDDOC, :SALDO, :rtftef, :rtivaf, :rticaf, :rtcree, :DTOF, :ERROR, :NUMPROV);
    
    INSERT INTO EGRESOS (EGRE_ID, TIDO_COD, PREF_PRE, EGRE_NUMERO, EGRE_FECHA, EGRE_CONC, EGRE_MONTO,
        EGRE_RTFTEMONTO, EGRE_RTIVAMONTO, EGRE_RTICAMONTO, EGRE_DTOF, EGRE_OBS, EGRE_TIPOMOVBCO, EGRE_IDMOVBCO,
        EGRE_NOMTERC, EGRE_ANULADO, EGRE_TRANSMIT, TERC_NIT, EGRE_TIPO, CAJA_ID, EGRE_USUARIO, NUMOK, CLEG_ID, EGRE_TRM)
        VALUES (NEW.prpg_idegre, 62, NEW.prpg_pref, :NUMERO, NEW.prpg_fecha, :CONC, NEW.prpg_abono,
        :rtftef, :rtivaf, :rticaf, :rtcree, NULL, NULL, NULL,
        :nomterc, 'N', 'N', :nit, '1', new.prpg_idcaja, USER, 'N', 0, 1);
    
    INSERT INTO EGRESOS_DETALLE (EGRE_ID, EGDE_ITEM, EGDE_TIPODOC, EGDE_IDDOC, EGDE_PREFIJO, EGDE_NUMERO, EGDE_ABONO,
        EGDE_RTFTE, EGDE_RTIVA, EGDE_RTICA, EGDE_DTOF, EGDE_ANULADO, EGDE_TRANSMIT, EGDE_DIFCAMBIO, EGDE_NUMPROV, EGDE_RCREE)
        VALUES (NEW.prpg_idegre, 1, new.prpg_tipodoc, new.prpg_iddoc, :prefdoc, :numdoc, NEW.prpg_abono,
        :RTFTEF, :RTIVAF, :RTICAF, :DTOF, 'N', 'N', NULL, :numprov, :RTCREE);
    
    if (new.prpg_cob = 'C') then
        begin
        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 (NEW.prpg_idegre, 1, NEW.prpg_idcaja, 1, NULL, NULL, NULL, NEW.prpg_fecha, NEW.prpg_abono, 'N', 'N');
        end
    else
        begin
        SELECT b.prba_numero FROM prefijos_bancos b WHERE b.tido_cod = new.prpg_tipobco and b.prba_activo = 'S' AND b.prba_pref = new.prpg_prefbco INTO :numero;
        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 (NEW.prpg_idegre, new.prpg_tipobco, new.prpg_idcaja, :numero, new.prpg_fecha, new.prpg_prefbco, :NOMTERC, NEW.prpg_abono, :conc, 'N', 'N', 'N');
        end
    END
end^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER TRIGGER PROGRAMACION_PAGOS_AU FOR PROGRAMACION_PAGOS
ACTIVE AFTER UPDATE POSITION 0
as
declare variable numero varchar(8);
declare variable NIT varchar(15);
declare variable NOMTERC varchar(60);
declare variable NOMTIPO varchar(8);
declare variable CONC VARCHAR(60);
declare variable PREFDOC varchar(4);
declare variable NUMDOC varchar(8);
declare variable ERROR CHAR(1);
declare variable NUMPROV varchar(12);
declare variable MONTO NUMERIC(18,2);
declare variable IDDOC INTEGER;
declare variable SALDO NUMERIC(18,2);
declare variable RTFTEF NUMERIC(18,2);
declare variable RTIVAF NUMERIC(18,2);
declare variable RTICAF NUMERIC(18,2);
declare variable RTCREE NUMERIC(18,2);
declare variable DTOF NUMERIC(18,2);
begin
if ((OLD.prpg_egreso = 'N') AND (NEW.prpg_egreso = 'S')) then
    BEGIN
    SELECT PREF_ACTUAL FROM PREFIJOS WHERE TIDO_COD = 62 and pref_activo = 'S' AND PREF_PRE = new.prpg_pref INTO :numero;
    SELECT M.TERC_NIT, TERC_NOM, M.mvpr_monto, TD.tido_nomcorto, M.mvpr_prefijo, M.mvpr_numero FROM TERCEROS T, movimiento_proveedor M, TIPO_DOCUMENTO TD
        WHERE M.terc_nit = T.terc_nit AND M.mvpr_tiporef = NEW.prpg_tipodoc AND M.mvpr_idref = NEW.prpg_iddoc AND TD.tido_cod = M.mvpr_tiporef
        INTO :NIT, :NOMTERC, :MONTO, :nomtipo, :PREFDOC, :NUMDOC;
    if (MONTO <> NEW.prpg_abono) then
        CONC = 'ABONO A ' || :NOMTIPO || ' ' || :PREFDOC || :NUMDOC;
    else
        CONC = 'CANCELA A ' || :NOMTIPO || ' ' || :PREFDOC || :NUMDOC;
    SELECT PREF_ACTUAL FROM PREFIJOS WHERE TIDO_COD = 62 and pref_activo = 'S' AND PREF_PRE = new.prpg_pref INTO :numero;
    EXECUTE PROCEDURE busca_id_doc_cxpagar(21, :prefdoc, :numdoc, :nit, NEW.prpg_fecha)
        returning_values (:IDDOC, :SALDO, :rtftef, :rtivaf, :rticaf, :rtcree, :DTOF, :ERROR, :NUMPROV);
    
    INSERT INTO EGRESOS (EGRE_ID, TIDO_COD, PREF_PRE, EGRE_NUMERO, EGRE_FECHA, EGRE_CONC, EGRE_MONTO,
        EGRE_RTFTEMONTO, EGRE_RTIVAMONTO, EGRE_RTICAMONTO, EGRE_DTOF, EGRE_OBS, EGRE_TIPOMOVBCO, EGRE_IDMOVBCO,
        EGRE_NOMTERC, EGRE_ANULADO, EGRE_TRANSMIT, TERC_NIT, EGRE_TIPO, CAJA_ID, EGRE_USUARIO, NUMOK, CLEG_ID, EGRE_TRM)
        VALUES (NEW.prpg_idegre, 62, NEW.prpg_pref, :NUMERO, NEW.prpg_fecha, :CONC, NEW.prpg_abono,
        :rtftef, :rtivaf, :rticaf, :rtcree, NULL, NULL, NULL,
        :nomterc, 'N', 'N', :nit, '1', new.prpg_idcaja, USER, 'N', 0, 1);
    
    INSERT INTO EGRESOS_DETALLE (EGRE_ID, EGDE_ITEM, EGDE_TIPODOC, EGDE_IDDOC, EGDE_PREFIJO, EGDE_NUMERO, EGDE_ABONO,
        EGDE_RTFTE, EGDE_RTIVA, EGDE_RTICA, EGDE_DTOF, EGDE_ANULADO, EGDE_TRANSMIT, EGDE_DIFCAMBIO, EGDE_NUMPROV, EGDE_RCREE)
        VALUES (NEW.prpg_idegre, 1, new.prpg_tipodoc, new.prpg_iddoc, :prefdoc, :numdoc, NEW.prpg_abono,
        :RTFTEF, :RTIVAF, :RTICAF, :DTOF, 'N', 'N', NULL, :numprov, :RTCREE);
    
    if (new.prpg_cob = 'C') then
        begin
        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 (NEW.prpg_idegre, 1, NEW.prpg_idcaja, 1, NULL, NULL, NULL, NEW.prpg_fecha, NEW.prpg_abono, 'N', 'N');
        end
    else
        begin
        SELECT b.prba_numero FROM prefijos_bancos b WHERE b.tido_cod = new.prpg_tipobco and b.prba_activo = 'S' AND b.prba_pref = new.prpg_prefbco INTO :numero;
        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 (NEW.prpg_idegre, new.prpg_tipobco, new.prpg_idcaja, :numero, new.prpg_fecha, new.prpg_prefbco, :NOMTERC, NEW.prpg_abono, :conc, 'N', 'N', 'N');
        end
    END
end^

SET TERM ; ^

SET TERM ^ ;

create or alter trigger PROGRAMACION_PAGOS_AD for PROGRAMACION_PAGOS
active AFTER DELETE position 0
as
begin
if ((OLD.prpg_idegre IS NOT NULL) AND (OLD.prpg_idegre <> 0)) then
    BEGIN
    /* BORRE EL EGRESO */
    DELETE FROM egresos_detalle WHERE EGRE_ID = OLD.prpg_idegre;
    DELETE FROM egresos_caja WHERE EGRE_ID = OLD.prpg_idegre;
    DELETE FROM egresos_banco WHERE EGRE_ID = OLD.prpg_idegre;
    DELETE FROM egresos WHERE EGRE_ID = OLD.prpg_idegre;
    END
end^

SET TERM ; ^

/* 20131004f */
/* PREVIENE UN MULTIPLE ROWS SI HAY DOS REGISTROS EN MOVIMIENTO_CLIENTE DEL MISMO DOCUMENTO */
SET TERM ^ ;

CREATE OR ALTER procedure COMISIONES_COBRO (
    DESDE integer,
    HASTA integer,
    FECINI date,
    FECFIN date,
    DETALLE char(1))
returns (
    CODVEND integer,
    NOMVEND varchar(60),
    NIT varchar(20),
    CLIENTE varchar(60),
    NOMTIPO varchar(8),
    PREFIJO varchar(4),
    NUMERO varchar(8),
    FECDOC date,
    PUNTOVTA integer,
    PREFREC varchar(4),
    NUMREC varchar(8),
    FECREC date,
    DIAS integer,
    ABONO numeric(18,2),
    BASE numeric(18,2),
    COMIMONTO numeric(18,2),
    COMIPORC numeric(9,2),
    ARTICULO varchar(20),
    ARTIDES varchar(60),
    CODGRP varchar(2),
    CODMAR varchar(3),
    CANT numeric(18,4),
    DTOFIN numeric(18,2),
    VENCE date,
    RTFTE numeric(18,2),
    RTIVA numeric(18,2),
    RTICA numeric(18,2))
AS
DECLARE VARIABLE TIPO INTEGER;
DECLARE VARIABLE ID INTEGER;
DECLARE VARIABLE IVAMONTO NUMERIC(18,2);
DECLARE VARIABLE TOTAL NUMERIC(18,2);
DECLARE VARIABLE SITOT CHAR(2);
DECLARE VARIABLE VENTA CHAR(2);
DECLARE VARIABLE COMIV NUMERIC(18,2);
DECLARE VARIABLE PORCV double precision;
DECLARE VARIABLE CONSUMO NUMERIC(18,2);
declare variable ALFINAL CHAR(2);
declare variable SALDO NUMERIC(18,2);
declare variable COMISION VARCHAR(10);
declare variable porcaux NUMERIC(9,2);
declare variable BASEAUX DOUBLE PRECISION;
declare variable SUCURSAL VARCHAR(20);
declare variable COMIART VARCHAR(6);
declare variable LISTA INTEGER;
declare variable LISTAP INTEGER;
declare variable INCDTO CHAR(2);
declare variable INCANTI CHAR(2);
declare variable INCCHE CHAR(2);
declare variable OK CHAR(1);
declare variable IDF INTEGER;
declare variable COMIXVND CHAR(2);
declare variable COMIDIAS NUMERIC(9,2);
declare variable ICOINC CHAR(2);
BEGIN
EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA','COMISIONES','COMISION POR COBRO PAGADERA SOLO EN EL COBRO TOTAL') returning_values (:ALFINAL);
execute procedure lee_configuracion('CARTERA','COMISIONES','COMISION POR COBRO COMO PORCENTAJE DE LA COMISION VENTA') returning_values (:venta);
EXECUTE PROCEDURE lee_configuracion('CARTERA', 'COMISIONES', 'LIQUIDAR COMISION COBRO CON COBRADOR DEL DOCUMENTO O DEL RECIBO') returning_values (:COMISION);
EXECUTE PROCEDURE lee_configuracion ('FACTURACION','FACTURAS', 'CODIGO DE LA LISTA DE PRECIOS A MOSTRAR EN ARTICULOS') returning_values (:LISTAP);
EXECUTE PROCEDURE lee_configuracion('CARTERA', 'COMISIONES', 'COMISION POR COBRO POR ARTICULO') returning_values (:comiart);
EXECUTE PROCEDURE lee_configuracion('CARTERA', 'COMISIONES', 'INCLUIR DESCUENTO FINANCIERO EN BASE DE COMISIONES POR COBRO') returning_values (:incdto);
EXECUTE PROCEDURE lee_configuracion('CARTERA', 'COMISIONES', 'INCLUIR ANTICIPOS EN COMISIONES POR COBRO') returning_values (:incanti);
EXECUTE PROCEDURE lee_configuracion('CARTERA', 'COMISIONES', 'INCLUIR RECAUDO DE CHEQUES DEVUELTOS EN COMISIONES') returning_values (:incche);
EXECUTE PROCEDURE lee_configuracion('CARTERA', 'COMISIONES', 'COMISION POR ARTICULO Y PROPORCION POR DIAS DE RECAUDO') returning_values (:comixvnd);
EXECUTE PROCEDURE lee_configuracion('CARTERA', 'COMISIONES', 'COMISION POR COBRO INCLUYENDO EL IMPOCONSUMO') returning_values (:icoinc);
EXECUTE PROCEDURE lee_configuracion('CARTERA', 'COMISIONES', 'COMISION POR COBRO SOBRE EL TOTAL') returning_values (:SITOT);
FOR SELECT RCDE_TIPODOC, RCDE_IDDOC, RCDE_PREFIJO, RCDE_NUMERO, R.TERC_NIT, TERC_NOM, RECA_FECHA, (RCDE_ABONO+RCDE_RTFTE+RCDE_RTIVA+RCDE_RTICA), PREF_PRE, RECA_NUMERO, RCDE_COBR, RCDE_DTOF, RCDE_RTFTE, RCDE_RTIVA, RCDE_RTICA
    FROM RECIBOS_CAJA R, RECIBOS_CAJA_DETALLE RD, TERCEROS T
    WHERE R.RECA_ID = RD.RECA_ID AND RECA_FECHA >= :FECINI AND RECA_FECHA <= :FECFIN AND R.TERC_NIT = T.TERC_NIT AND RECA_ANULADO = 'N'
    AND ((RD.rcde_tipodoc <> 45) or (:INCANTI = 'SI'))
    ORDER BY TERC_NIT, RECA_FECHA
    INTO :TIPO, :ID, :PREFIJO, :NUMERO, :NIT, :CLIENTE, :FECREC, :ABONO, :PREFREC, :NUMREC, :codvend, :DTOFIN, :rtfte, :RTIVA, :RTICA
    DO
    BEGIN
    SELECT TIDO_NOMCORTO FROM TIPO_DOCUMENTO WHERE TIDO_COD = :TIPO INTO :NOMTIPO;
    if (incdto = 'SI') then
        ABONO = ABONO + DTOFIN;
    if (COMISION = 'DOCUMENTO') then
        SELECT first 1 MVCL_FECHA, COBR_COD, MVCL_VENCE FROM MOVIMIENTO_CLIENTES WHERE MVCL_TIPOREF = :TIPO AND MVCL_IDREF = :ID
            INTO :FECDOC, :codvend, :VENCE;
    else
        SELECT first 1 MVCL_FECHA, MVCL_VENCE FROM MOVIMIENTO_CLIENTES WHERE MVCL_TIPOREF = :TIPO AND MVCL_IDREF = :ID
            INTO :FECDOC, :VENCE;
    if (FECDOC IS NOT NULL) then
        DIAS = FECREC - FECDOC;
    ELSE
        DIAS = 999;
    if (TIPO = 31) then
        SELECT PTVT_ID FROM FACTURAS WHERE FACT_ID = :ID INTO :puntovta;
    else if (TIPO = 33) then
        SELECT PTVT_ID FROM devoluciones_ventas WHERE DEVT_ID = :ID INTO :puntovta;
    else    
        PUNTOVTA = 0;
    if ((codvend >= :DESDE) AND (codvend <= :hasta)) then
        BEGIN
        select COBR_NOM from COBRADORES where COBR_COD = :codvend INTO :nomvend;
        /* TRAIGA EL PORCENTAJE DE ACUERDO A LOS DIAS */
        COMIPORC = 0;
        SELECT CMCB_PORC FROM COMISION_COBRO WHERE CMCB_DIASINI <= :dias AND CMCB_DIASFIN >= :DIAS AND COBR_COD = :CODVEND
            INTO :COMIPORC;
        if (COMIPORC IS NULL) THEN
            COMIPORC = 0;
        COMIDIAS = COMIPORC;
        if (VENTA = 'NO') then
            BEGIN
            if (ALFINAL = 'SI') then
                BEGIN
                EXECUTE PROCEDURE saldo_doc_cartera(:tipo, :ID, :FECREC, 0) returning_values (:SALDO);
                if (SALDO = 0) then
                    OK = 'S';
                else
                    OK = 'N';
                end
            else
                OK = 'S';
            if (TIPO = 31) then
                BEGIN
                if (DETALLE = 'N') then
                    SELECT MAX(FACT_TOTAL), MAX(FACT_IVAMONTO-FACT_DEC2799), SUM(FADE_CONSUMO) FROM FACTURAS F, FACTURAS_DETALLE D
                        WHERE F.FACT_ID = D.FACT_ID AND F.FACT_ID = :ID INTO :TOTAL, :IVAMONTO, :CONSUMO;
                ELSE
                    FOR SELECT D.ARTI_COD, FADE_CANT, FADE_TOTAL, FADE_IVAMONTO, FADE_CONSUMO, GRUP_COD, LIPR_COD, MARC_COD, ARTI_DES
                        FROM FACTURAS F, FACTURAS_DETALLE D, ARTICULO A
                        WHERE F.FACT_ID = D.FACT_ID AND D.arti_cod = A.arti_cod AND F.FACT_ID = :ID and substring(a.arti_cod from 1 FOR 2) <> '.t'
                        INTO :ARTICULO, :CANT, :TOTAL, :IVAMONTO, :CONSUMO, :CODGRP, :lista, :codmar, :artides
                        DO
                        BEGIN
                        if (comiart = 'GRUPO') then
                            SELECT GRUP_COMIPOR FROM GRUPO WHERE GRUP_COD = :codgrp INTO :comiporc;
                        if (comiart = 'MARCA') then
                            SELECT MARC_COMIPOR FROM MARCAS WHERE MARC_COD = :codmar INTO :comiporc;
                        if (comiart = 'PRECIO') then
                            SELECT PRAR_COMIC FROM precios_articulo WHERE ARTI_COD = :articulo AND LIPR_COD = :LISTA INTO :comiporc;

                        if (SITOT = 'SI') then
                            BASEAUX = TOTAL;
                        ELSE
                            begin
                            BASEAUX = TOTAL - IVAMONTO;
                            if (ICOINC <> 'SI') then
                                BASEAUX = BASEAUX - CONSUMO;
                            end
                        if (OK = 'S') then
                            begin
                            if (alfinal = 'SI') then
                                BASE = BASEAUX;
                            else
                                begin
                                /* calcula la proporcion del abono */
                                SELECT FACT_TOTAL FROM FACTURAS WHERE FACT_ID = :ID INTO :TOTAL;
                                if (TOTAL <> 0) then
                                    BASE = BASEAUX * (ABONO / TOTAL);
                                else
                                    BASE = 0;
                                end
                            end
                        else
                            BASE = 0;
                        if (comixvnd = 'SI') then
                            BEGIN                          
                            comiporc = comiporc * comidias / 100;
                            END
                        COMIMONTO = BASE / 100 * COMIPORC;
                        SUSPEND;
                        END
                END
            if (TIPO = 33) then
                if (DETALLE = 'N') then
                    SELECT MAX(DEVT_TOTAL*-1), MAX((DEVT_IVAMONTO-DEVT_DEC2799)*-1), SUM(DVDE_CONSUMO) FROM DEVOLUCIONES_VENTAS V, DEVOLUCIONES_VENTAS_DETALLE D
                        WHERE V.DEVT_ID = D.DEVT_ID AND V.DEVT_ID = :ID INTO :TOTAL, :IVAMONTO, :CONSUMO;
                ELSE
                    FOR SELECT D.ARTI_COD, DVDE_CANT, DVDE_TOTAL*-1, DVDE_IVAMONTO*-1, DVDE_CONSUMO*-1, GRUP_COD, DEVT_FACTID, MARC_COD, ARTI_DES
                        FROM DEVOLUCIONES_VENTAS V, DEVOLUCIONES_VENTAS_DETALLE D, ARTICULO A
                        WHERE V.DEVT_ID = D.DEVT_ID AND D.arti_cod = A.arti_cod AND V.DEVT_ID = :ID and substring(a.arti_cod from 1 FOR 2) <> '.t'
                        INTO :ARTICULO, :CANT, :TOTAL, :IVAMONTO, :CONSUMO, :codgrp, :IDF, :codmar, :artides
                        DO
                        BEGIN
                        if (comiart = 'GRUPO') then
                            SELECT GRUP_COMIPOR FROM GRUPO WHERE GRUP_COD = :codgrp INTO :comiporc;
                        if (comiart = 'MARCA') then
                            SELECT MARC_COMIPOR FROM MARCAS WHERE MARC_COD = :codmar INTO :comiporc;
                        if (comiart = 'PRECIO') then
                            BEGIN
                            LISTA = 0;
                            SELECT MAX(LIPR_COD) FROM facturas_detalle d WHERE ARTI_COD = :ARTICULO AND FACT_ID = :IDF INTO :LISTA;
                            if (LISTA = 0) then
                                LISTA = LISTAP;
                            SELECT PRAR_COMIC FROM precios_articulo WHERE ARTI_COD = :articulo AND LIPR_COD = :LISTA INTO :comiporc;
                            END
                        if (SITOT = 'SI') then
                            BASEAUX = TOTAL;
                        ELSE
                            begin
                            BASEAUX = TOTAL - IVAMONTO;
                            if (ICOINC <> 'SI') then
                                BASEAUX = BASEAUX - CONSUMO;
                            end
                        if (OK = 'S') then
                            begin
                            if (alfinal = 'SI') then
                                BASE = BASEAUX;
                            else
                                begin
                                /* calcula la proporcion del abono */
                                SELECT DEVT_TOTAL FROM DEVOLUCIONES_VENTAS WHERE DEVT_ID = :ID INTO :TOTAL;
                                if (TOTAL <> 0) then
                                    BASE = BASEAUX * (ABONO / TOTAL);
                                else
                                    BASE = 0;
                                end
                            end
                        else
                            BASE = 0;
                        if (comixvnd = 'SI') then
                            BEGIN                          
                            comiporc = comiporc * comidias / 100;
                            END
                        COMIMONTO = BASE / 100 * COMIPORC;
                        SUSPEND;
                        END
            if (TIPO = 41) then
                SELECT NDCL_MONTO, NDCL_IVAMONTO, 0 FROM NOTAS_DEBITO_CLIENTES WHERE NDCL_ID = :ID INTO :TOTAL, :IVAMONTO, :CONSUMO;
            if (TIPO = 42) then
                SELECT NCCL_MONTO*-1, NCCL_IVAMONTO*-1, 0 FROM NOTAS_CREDITO_CLIENTES WHERE NCCL_ID = :ID INTO :TOTAL, :IVAMONTO, :CONSUMO;
            if (TIPO = 45) then
                SELECT ANCL_BASE, ANCL_IVAMONTO, 0 FROM anticipos_cliente WHERE ANCL_ID = :ID INTO :TOTAL, :IVAMONTO, :CONSUMO;
            if (TIPO = 77) then
                if (INCCHE = 'SI') then
                    SELECT DVCH_MONTO, 0, 0 FROM DEVOLUCION_CHEQUES WHERE DVCH_ID = :ID INTO :TOTAL, :IVAMONTO, :CONSUMO;
                ELSE
                    BEGIN
                    TOTAL = 0;
                    IVAMONTO = 0;
                    CONSUMO = 0;
                    END
            if (SITOT = 'SI') then
                BASEAUX = ABONO;
            ELSE
                if (TOTAL <> 0) then
                    if (ICOINC <> 'SI') then
                        BASEAUX = (ABONO / TOTAL) * (TOTAL - IVAMONTO - CONSUMO);
                    else
                        BASEAUX = (ABONO / TOTAL) * (TOTAL - IVAMONTO);
                ELSE
                    BASEAUX = 0;
            BASE = BASEAUX;
            if (comixvnd = 'SI') then
                BEGIN
                comiporc = comiporc * comidias / 100;
                END
            COMIMONTO = BASE / 100 * COMIPORC;
            END
        ELSE
            BEGIN
            if (TIPO = 31) then
                if (DETALLE = 'N') then
                    SELECT MAX(FACT_TOTAL), MAX(FACT_IVAMONTO-FACT_DEC2799), MAX(FACT_COMIPORC), SUM(FADE_CONSUMO)
                        FROM FACTURAS F, FACTURAS_DETALLE D WHERE F.FACT_ID = D.FACT_ID AND F.FACT_ID = :ID
                        INTO :TOTAL, :IVAMONTO, :PORCV, :CONSUMO;
                ELSE
                    FOR SELECT D.ARTI_COD, FADE_CANT, FADE_TOTAL, FADE_IVAMONTO, FADE_CONSUMO, FACT_COMIPORC, GRUP_COD, MARC_COD, ARTI_DES
                        FROM FACTURAS F, FACTURAS_DETALLE D, ARTICULO A
                        WHERE F.FACT_ID = D.FACT_ID AND D.arti_cod = A.arti_cod AND F.FACT_ID = :ID and substring(a.arti_cod from 1 FOR 2) <> '.t'
                        INTO :ARTICULO, :CANT, :TOTAL, :IVAMONTO, :CONSUMO, :porcv, :codgrp, :codmar, :artides
                        DO
                        BEGIN
                        if (SITOT = 'SI') then
                            BASEAUX = TOTAL;
                        ELSE
                            begin
                            BASEAUX = TOTAL - IVAMONTO;
                            if (ICOINC <> 'SI') then
                                BASEAUX = BASEAUX - CONSUMO;
                            end
                        /* calcula la proporcion del abono */
                        SELECT FACT_TOTAL FROM FACTURAS WHERE FACT_ID = :ID INTO :TOTAL;
                        if (TOTAL <> 0) then
                            BASE = BASEAUX * (ABONO / TOTAL);
                        else
                            BASE = 0;
                        COMIV = BASE / 100 * PORCV;
                        COMIMONTO = COMIV / 100 * COMIPORC;
                        porcaux = comiporc;
                        comiporc = PORCV * COMIPORC / 100;
                        SUSPEND;
                        END
            if (TIPO = 33) then
                if (DETALLE = 'N') then
                    SELECT MAX(DEVT_TOTAL*-1), MAX((DEVT_IVAMONTO-DEVT_DEC2799)*-1), MAX(DEVT_COMIPORC*-1), SUM(DVDE_CONSUMO*-1)
                        FROM DEVOLUCIONES_VENTAS V, DEVOLUCIONES_VENTAS_DETALLE D WHERE V.DEVT_ID = D.DEVT_ID AND D.DEVT_ID = :ID
                        INTO :TOTAL, :IVAMONTO, :PORCV, :CONSUMO;
                ELSE
                    FOR SELECT D.ARTI_COD, DVDE_CANT, DVDE_TOTAL*-1, DVDE_IVAMONTO*-1, DVDE_CONSUMO*-1, DEVT_COMIPORC, GRUP_COD, MARC_COD, ARTI_DES
                        FROM DEVOLUCIONES_VENTAS V, DEVOLUCIONES_VENTAS_DETALLE D, ARTICULO A
                        WHERE V.DEVT_ID = D.DEVT_ID AND D.arti_cod = A.arti_cod AND V.DEVT_ID = :ID and substring(a.arti_cod from 1 FOR 2) <> '.t'
                        INTO :ARTICULO, :CANT, :TOTAL, :IVAMONTO, :CONSUMO, :porcv, :codgrp, :codmar, :artides
                        DO
                        BEGIN
                        if (SITOT = 'SI') then
                            BASEAUX = TOTAL;
                        ELSE
                            begin
                            BASEAUX = TOTAL - IVAMONTO;
                            if (ICOINC <> 'SI') then
                                BASEAUX = BASEAUX - CONSUMO;
                            end
                        /* calcula la proporcion del abono */
                        SELECT DEVT_TOTAL FROM DEVOLUCIONES_VENTAS WHERE DEVT_ID = :ID INTO :TOTAL;
                        if (TOTAL <> 0) then
                            BASE = BASEAUX * (ABONO / TOTAL);
                        else
                            BASE = 0;
                        COMIV = BASE / 100 * PORCV;
                        COMIMONTO = COMIV / 100 * COMIPORC;
                        porcaux = comiporc;
                        comiporc = PORCV * COMIPORC / 100;
                        SUSPEND;
                        END
            if (TIPO = 41) then
                SELECT NDCL_MONTO, NDCL_IVAMONTO, NDCL_COMIPORC, 0 FROM NOTAS_DEBITO_CLIENTES
                    WHERE NDCL_ID = :ID INTO :TOTAL, :IVAMONTO, :PORCV, :CONSUMO;
            if (TIPO = 42) then
                SELECT NCCL_MONTO, NCCL_IVAMONTO, NCCL_COMIPORC, 0  FROM NOTAS_CREDITO_CLIENTES
                    WHERE NCCL_ID = :ID INTO :TOTAL, :IVAMONTO, :PORCV, :CONSUMO;
            if (TIPO = 45) then
                SELECT ANCL_BASE, ANCL_IVAMONTO, 0 FROM anticipos_cliente WHERE ANCL_ID = :ID INTO :TOTAL, :IVAMONTO, :CONSUMO;
            if (TIPO = 77) then
                if (INCCHE = 'SI') then
                    SELECT DVCH_MONTO, 0, 0, 0 FROM DEVOLUCION_CHEQUES WHERE DVCH_ID = :ID INTO :TOTAL, :IVAMONTO, :PORCV, :CONSUMO;
                ELSE
                    BEGIN
                    TOTAL = 0;
                    IVAMONTO = 0;
                    CONSUMO = 0;
                    PORCV = 0;
                    END
            if (SITOT = 'SI') then
                BASEAUX = ABONO;
            ELSE
                if ((total <> 0) AND (ABONO <> 0)) then
                    if (ICOINC <> 'SI') then
                        BASEAUX = (TOTAL - IVAMONTO - CONSUMO) / TOTAL * ABONO;
                    else
                        BASEAUX = (TOTAL - IVAMONTO) / TOTAL * ABONO;
                ELSE
                    BASEAUX = 0;
            COMIV = BASEAUX / 100 * PORCV;
            COMIMONTO = COMIV / 100 * COMIPORC;
            porcaux = comiporc;
            comiporc = PORCV * COMIPORC / 100;
            BASE = BASEAUX;
            END
        if (DETALLE = 'N') then
            if (ALFINAL = 'SI') then
                BEGIN
                /* VERIFIQUE EL SALDO DEL DOCUMENTO, SI ES CERO LIQUIDE COMISION SOBRE EL TOTAL */
                EXECUTE PROCEDURE saldo_doc_cartera(:tipo, :ID, :FECREC, 0) returning_values (:SALDO);
                if (SALDO = 0) then
                    BEGIN
                    if (VENTA = 'NO') then
                        begin
                        if (SITOT = 'SI') then
                            BASEAUX = TOTAL;
                        ELSE
                            if (ICOINC <> 'SI') then
                                BASEAUX = TOTAL - IVAMONTO - CONSUMO;
                            else
                                BASEAUX = TOTAL - IVAMONTO;
                        COMIMONTO = BASEAUX * COMIPORC / 100;
                        end
                    ELSE
                        BEGIN
                        if (SITOT = 'SI') then
                            BASEAUX = TOTAL;
                        ELSE
                            begin
                            BASEAUX = TOTAL - IVAMONTO;
                            if (ICOINC <> 'SI') then
                                BASEAUX = BASEAUX - CONSUMO;
                            end
                        COMIV = PORCV * BASEAUX / 100;
                        COMIMONTO = COMIV / 100 * porcaux;
                        comiporc = PORCV * porcaux / 100;
                        END
                    BASE = BASEAUX;
                    SUSPEND;
                    END
                END
            ELSE
                SUSPEND;
        ELSE
            if ((TIPO <> 31) AND (TIPO <> 33)) then
                SUSPEND;
        END
    END
FOR SELECT EGCC_TIPODOC, EGCC_IDDOC, EGCC_PREFIJO, EGCC_NUMERO, E.TERC_NIT, TERC_NOM, EGRE_FECHA, (EGCC_ABONO+EGCC_RTFTE+EGCC_RTIVA+EGCC_RTICA), PREF_PRE, EGRE_NUMERO, EGCC_SUCURSAL, EGCC_DTOF
    FROM EGRESOS E, EGRESOS_CRUCEC C, TERCEROS T
    WHERE E.EGRE_ID = C.EGRE_ID AND EGRE_FECHA >= :FECINI AND EGRE_FECHA <= :FECFIN AND E.TERC_NIT = T.TERC_NIT AND EGRE_ANULADO = 'N'
    ORDER BY TERC_NIT, EGRE_FECHA
    INTO :TIPO, :ID, :PREFIJO, :NUMERO, :NIT, :CLIENTE, :FECREC, :ABONO, :PREFREC, :NUMREC, :SUCURSAL, :dtofin
    DO
    BEGIN
    SELECT COBR_COD FROM cliente_sucursales WHERE TERC_NIT = :NIT AND CLCU_COD = :sucursal INTO :codvend;
    SELECT TIDO_NOMCORTO FROM TIPO_DOCUMENTO WHERE TIDO_COD = :TIPO INTO :NOMTIPO;
    if (incdto = 'SI') then
        ABONO = ABONO + DTOFIN;
    if (COMISION = 'DOCUMENTO') then
        SELECT MVCL_FECHA, COBR_COD FROM MOVIMIENTO_CLIENTES WHERE MVCL_TIPOREF = :TIPO AND MVCL_IDREF = :ID
            INTO :FECDOC, :codvend;
    else
        SELECT MVCL_FECHA FROM MOVIMIENTO_CLIENTES WHERE MVCL_TIPOREF = :TIPO AND MVCL_IDREF = :ID
            INTO :FECDOC;
    if (FECDOC IS NOT NULL) then
        DIAS = FECREC - FECDOC;
    ELSE
        DIAS = 999;
    if (TIPO = 31) then
        SELECT PTVT_ID FROM FACTURAS WHERE FACT_ID = :ID INTO :puntovta;
    else if (TIPO = 33) then
        SELECT PTVT_ID FROM devoluciones_ventas WHERE DEVT_ID = :ID INTO :puntovta;
    else    
        PUNTOVTA = 0;
    if ((codvend >= :DESDE) AND (codvend <= :hasta)) then
        BEGIN
        select COBR_NOM from COBRADORES where COBR_COD = :codvend INTO :nomvend;
        /* TRAIGA EL PORCENTAJE DE ACUERDO A LOS DIAS */
        COMIPORC = 0;
        SELECT CMCB_PORC FROM COMISION_COBRO WHERE CMCB_DIASINI <= :dias AND CMCB_DIASFIN >= :DIAS AND COBR_COD = :CODVEND INTO :COMIPORC;
        if (COMIPORC IS NULL) THEN
            COMIPORC = 0;
        COMIDIAS = COMIPORC;
        if (VENTA = 'NO') then
            BEGIN
            if (ALFINAL = 'SI') then
                BEGIN
                EXECUTE PROCEDURE saldo_doc_cartera(:tipo, :ID, :FECREC, 0) returning_values (:SALDO);
                if (SALDO = 0) then
                    OK = 'S';
                else
                    OK = 'N';
                end
            else
                OK = 'S';
            if (TIPO = 31) then
                BEGIN
                if (DETALLE = 'N') then
                    SELECT MAX(FACT_TOTAL), MAX(FACT_IVAMONTO-FACT_DEC2799), SUM(FADE_CONSUMO) FROM FACTURAS F, FACTURAS_DETALLE D
                        WHERE F.FACT_ID = D.FACT_ID AND F.FACT_ID = :ID INTO :TOTAL, :IVAMONTO, :CONSUMO;
                ELSE
                    FOR SELECT D.ARTI_COD, FADE_CANT, FADE_TOTAL, FADE_IVAMONTO, FADE_CONSUMO, GRUP_COD, LIPR_COD, MARC_COD, ARTI_DES
                        FROM FACTURAS F, FACTURAS_DETALLE D, ARTICULO A
                        WHERE F.FACT_ID = D.FACT_ID AND D.arti_cod = A.arti_cod AND F.FACT_ID = :ID and substring(a.arti_cod from 1 FOR 2) <> '.t'
                        INTO :ARTICULO, :CANT, :TOTAL, :IVAMONTO, :CONSUMO, :CODGRP, :LISTA, :codmar, :artides
                        DO
                        BEGIN
                        if (comiart = 'GRUPO') then
                            SELECT GRUP_COMIPOR FROM GRUPO WHERE GRUP_COD = :codgrp INTO :comiporc;
                        if (comiart = 'MARCA') then
                            SELECT MARC_COMIPOR FROM MARCAS WHERE MARC_COD = :codmar INTO :comiporc;
                        if (comiart = 'PRECIO') then
                            SELECT PRAR_COMIC FROM precios_articulo WHERE ARTI_COD = :articulo AND LIPR_COD = :LISTA INTO :comiporc;

                        if (SITOT = 'SI') then
                            BASEAUX = TOTAL;
                        ELSE
                            begin
                            BASEAUX = TOTAL - IVAMONTO;
                            if (ICOINC <> 'SI') then
                                BASEAUX = BASEAUX - CONSUMO;
                            end
                        if (OK = 'S') then
                            begin
                            if (alfinal = 'SI') then
                                BASE = BASEAUX;
                            else
                                begin
                                /* calcula la proporcion del abono */
                                SELECT FACT_TOTAL FROM FACTURAS WHERE FACT_ID = :ID INTO :TOTAL;
                                if (TOTAL <> 0) then
                                    BASE = BASEAUX * (ABONO / TOTAL);
                                else
                                    BASE = 0;
                                end
                            end
                        else
                            BASE = 0;
                        if (comixvnd = 'SI') then
                            BEGIN                          
                            comiporc = comiporc * comidias / 100;
                            END
                        COMIMONTO = BASE / 100 * COMIPORC;
                        SUSPEND;
                        END
                END
            if (TIPO = 33) then
                if (DETALLE = 'N') then
                    SELECT MAX(DEVT_TOTAL*-1), MAX((DEVT_IVAMONTO-DEVT_DEC2799)*-1), SUM(DVDE_CONSUMO) FROM DEVOLUCIONES_VENTAS V, DEVOLUCIONES_VENTAS_DETALLE D
                        WHERE V.DEVT_ID = D.DEVT_ID AND V.DEVT_ID = :ID INTO :TOTAL, :IVAMONTO, :CONSUMO;
                ELSE
                    FOR SELECT D.ARTI_COD, DVDE_CANT, DVDE_TOTAL*-1, DVDE_IVAMONTO*-1, DVDE_CONSUMO*-1, GRUP_COD, DEVT_FACTID, MARC_COD, ARTI_DES
                        FROM DEVOLUCIONES_VENTAS V, DEVOLUCIONES_VENTAS_DETALLE D, ARTICULO A
                        WHERE V.DEVT_ID = D.DEVT_ID AND D.arti_cod = A.arti_cod AND V.DEVT_ID = :ID and substring(a.arti_cod from 1 FOR 2) <> '.t'
                        INTO :ARTICULO, :CANT, :TOTAL, :IVAMONTO, :CONSUMO, :codgrp, :IDF, :codmar, :artides
                        DO
                        BEGIN
                        if (comiart = 'GRUPO') then
                            SELECT GRUP_COMIPOR FROM GRUPO WHERE GRUP_COD = :codgrp INTO :comiporc;
                        if (comiart = 'MARCA') then
                            SELECT MARC_COMIPOR FROM MARCAS WHERE MARC_COD = :codmar INTO :comiporc;
                        if (comiart = 'PRECIO') then
                            BEGIN
                            LISTA = 0;
                            SELECT MAX(LIPR_COD) FROM facturas_detalle d WHERE ARTI_COD = :ARTICULO AND FACT_ID = :IDF INTO :LISTA;
                            if (LISTA = 0) then
                                LISTA = LISTAP;
                            SELECT PRAR_COMIC FROM precios_articulo WHERE ARTI_COD = :articulo AND LIPR_COD = :LISTA INTO :comiporc;
                            END
                        if (SITOT = 'SI') then
                            BASEAUX = TOTAL;
                        ELSE
                            begin
                            BASEAUX = TOTAL - IVAMONTO;
                            if (ICOINC <> 'SI') then
                                BASEAUX = BASEAUX - CONSUMO;
                            end
                        if (OK = 'S') then
                            begin
                            if (alfinal = 'SI') then
                                BASE = BASEAUX;
                            else
                                begin
                                /* calcula la proporcion del abono */
                                SELECT DEVT_TOTAL FROM DEVOLUCIONES_VENTAS WHERE DEVT_ID = :ID INTO :TOTAL;
                                if (TOTAL <> 0) then
                                    BASE = BASEAUX * (ABONO / TOTAL);
                                else
                                    BASE = 0;
                                end
                            end
                        else
                            BASE = 0;
                        if (comixvnd = 'SI') then
                            BEGIN                          
                            comiporc = comiporc * comidias / 100;
                            END
                        COMIMONTO = BASE / 100 * COMIPORC;
                        SUSPEND;
                        END
            if (TIPO = 41) then
                SELECT NDCL_MONTO, NDCL_IVAMONTO, 0 FROM NOTAS_DEBITO_CLIENTES WHERE NDCL_ID = :ID INTO :TOTAL, :IVAMONTO, :CONSUMO;
            if (TIPO = 42) then
                SELECT NCCL_MONTO*-1, NCCL_IVAMONTO*-1, 0 FROM NOTAS_CREDITO_CLIENTES WHERE NCCL_ID = :ID INTO :TOTAL, :IVAMONTO, :CONSUMO;
            if (TIPO = 45) then
                SELECT ANCL_BASE, ANCL_IVAMONTO, 0 FROM anticipos_cliente WHERE ANCL_ID = :ID INTO :TOTAL, :IVAMONTO, :CONSUMO;
            if (TIPO = 77) then
                if (INCCHE = 'SI') then
                    SELECT DVCH_MONTO, 0, 0 FROM DEVOLUCION_CHEQUES WHERE DVCH_ID = :ID INTO :TOTAL, :IVAMONTO, :CONSUMO;
                ELSE
                    BEGIN
                    TOTAL = 0;
                    IVAMONTO = 0;
                    CONSUMO = 0;
                    END
            if (SITOT = 'SI') then
                BASEAUX = ABONO;
            ELSE
                if (TOTAL <> 0) then
                    if (ICOINC <> 'SI') then
                        BASEAUX = (ABONO / TOTAL) * (TOTAL - IVAMONTO - CONSUMO);
                    else
                        BASEAUX = (ABONO / TOTAL) * (TOTAL - IVAMONTO);
                ELSE
                    BASEAUX = 0;
            BASE = BASEAUX;
            if (comixvnd = 'SI') then
                BEGIN
                comiporc = comiporc * comidias / 100;
                END
            COMIMONTO = BASE / 100 * COMIPORC;
            END
        ELSE
            BEGIN
            if (TIPO = 31) then
                if (DETALLE = 'N') then
                    SELECT MAX(FACT_TOTAL), MAX(FACT_IVAMONTO-FACT_DEC2799), MAX(FACT_COMIPORC), SUM(FADE_CONSUMO)
                        FROM FACTURAS F, FACTURAS_DETALLE D WHERE F.FACT_ID = D.FACT_ID AND F.FACT_ID = :ID
                        INTO :TOTAL, :IVAMONTO, :PORCV, :CONSUMO;
                ELSE
                    FOR SELECT D.ARTI_COD, FADE_CANT, FADE_TOTAL, FADE_IVAMONTO, FADE_CONSUMO, FACT_COMIPORC, GRUP_COD, MARC_COD, ARTI_DES
                        FROM FACTURAS F, FACTURAS_DETALLE D, ARTICULO A
                        WHERE F.FACT_ID = D.FACT_ID AND D.arti_cod = A.arti_cod AND F.FACT_ID = :ID and substring(a.arti_cod from 1 FOR 2) <> '.t'
                        INTO :ARTICULO, :CANT, :TOTAL, :IVAMONTO, :CONSUMO, :porcv, :codgrp, :codmar, :artides
                        DO
                        BEGIN
                        if (SITOT = 'SI') then
                            BASEAUX = TOTAL;
                        ELSE
                            begin
                            BASEAUX = TOTAL - IVAMONTO;
                            if (ICOINC <> 'SI') then
                                BASEAUX = BASEAUX - CONSUMO;
                            end
                        /* calcula la proporcion del abono */
                        SELECT FACT_TOTAL FROM FACTURAS WHERE FACT_ID = :ID INTO :TOTAL;
                        if (TOTAL <> 0) then
                            BASE = BASEAUX * (ABONO / TOTAL);
                        else
                            BASE = 0;
                        COMIV = BASE / 100 * PORCV;
                        COMIMONTO = COMIV / 100 * COMIPORC;
                        porcaux = comiporc;
                        comiporc = PORCV * COMIPORC / 100;
                        SUSPEND;
                        END
            if (TIPO = 33) then
                if (DETALLE = 'N') then
                    SELECT MAX(DEVT_TOTAL*-1), MAX((DEVT_IVAMONTO-DEVT_DEC2799)*-1), MAX(DEVT_COMIPORC*-1), SUM(DVDE_CONSUMO*-1)
                        FROM DEVOLUCIONES_VENTAS V, DEVOLUCIONES_VENTAS_DETALLE D WHERE V.DEVT_ID = D.DEVT_ID AND D.DEVT_ID = :ID
                        INTO :TOTAL, :IVAMONTO, :PORCV, :CONSUMO;
                ELSE
                    FOR SELECT D.ARTI_COD, DVDE_CANT, DVDE_TOTAL*-1, DVDE_IVAMONTO*-1, DVDE_CONSUMO*-1, DEVT_COMIPORC, GRUP_COD, MARC_COD, ARTI_DES
                        FROM DEVOLUCIONES_VENTAS V, DEVOLUCIONES_VENTAS_DETALLE D, ARTICULO A
                        WHERE V.DEVT_ID = D.DEVT_ID AND D.arti_cod = A.arti_cod AND V.DEVT_ID = :ID and substring(a.arti_cod from 1 FOR 2) <> '.t'
                        INTO :ARTICULO, :CANT, :TOTAL, :IVAMONTO, :CONSUMO, :porcv, :codgrp, :codmar, :artides
                        DO
                        BEGIN
                        if (SITOT = 'SI') then
                            BASEAUX = TOTAL;
                        ELSE
                            begin
                            BASEAUX = TOTAL - IVAMONTO;
                            if (ICOINC <> 'SI') then
                                BASEAUX = BASEAUX - CONSUMO;
                            end
                        /* calcula la proporcion del abono */
                        SELECT DEVT_TOTAL FROM DEVOLUCIONES_VENTAS WHERE DEVT_ID = :ID INTO :TOTAL;
                        if (TOTAL <> 0) then
                            BASE = BASEAUX * (ABONO / TOTAL);
                        else
                            BASE = 0;
                        COMIV = BASE / 100 * PORCV;
                        COMIMONTO = COMIV / 100 * COMIPORC;
                        porcaux = comiporc;
                        comiporc = PORCV * COMIPORC / 100;
                        SUSPEND;
                        END
            if (TIPO = 41) then
                SELECT NDCL_MONTO, NDCL_IVAMONTO, NDCL_COMIPORC, 0 FROM NOTAS_DEBITO_CLIENTES
                    WHERE NDCL_ID = :ID INTO :TOTAL, :IVAMONTO, :PORCV, :CONSUMO;
            if (TIPO = 42) then
                SELECT NCCL_MONTO, NCCL_IVAMONTO, NCCL_COMIPORC, 0  FROM NOTAS_CREDITO_CLIENTES
                    WHERE NCCL_ID = :ID INTO :TOTAL, :IVAMONTO, :PORCV, :CONSUMO;
            if (TIPO = 45) then
                SELECT ANCL_BASE, ANCL_IVAMONTO, 0 FROM anticipos_cliente WHERE ANCL_ID = :ID INTO :TOTAL, :IVAMONTO, :CONSUMO;
            if (TIPO = 77) then
                if (incche = 'SI') then
                    SELECT DVCH_MONTO, 0, 0, 0 FROM DEVOLUCION_CHEQUES WHERE DVCH_ID = :ID INTO :TOTAL, :IVAMONTO, :PORCV, :CONSUMO;
                ELSE
                    BEGIN
                    TOTAL = 0;
                    IVAMONTO = 0;
                    CONSUMO = 0;
                    PORCV = 0;
                    END
            if (SITOT = 'SI') then
                BASEAUX = ABONO;
            ELSE
                if ((total <> 0) AND (ABONO <> 0)) then
                    if (ICOINC <> 'SI') then
                        BASEAUX = (TOTAL - IVAMONTO - CONSUMO) / TOTAL * ABONO;
                    else
                        BASEAUX = (TOTAL - IVAMONTO) / TOTAL * ABONO;
                ELSE
                    BASEAUX = 0;
            COMIV = BASEAUX / 100 * PORCV;
            COMIMONTO = COMIV / 100 * COMIPORC;
            porcaux = comiporc;
            comiporc = PORCV * COMIPORC / 100;
            BASE = BASEAUX;
            END
        if (DETALLE = 'N') then
            if (ALFINAL = 'SI') then
                BEGIN
                /* VERIFIQUE EL SALDO DEL DOCUMENTO, SI ES CERO LIQUIDE COMISION SOBRE EL TOTAL */
                EXECUTE PROCEDURE saldo_doc_cartera(:tipo, :ID, :FECREC, 0) returning_values (:SALDO);
                if (SALDO = 0) then
                    BEGIN
                    if (VENTA = 'NO') then
                        begin
                        if (SITOT = 'SI') then
                            BASEAUX = TOTAL;
                        ELSE
                            begin
                            BASEAUX = TOTAL - IVAMONTO;
                            if (ICOINC <> 'SI') then
                                BASEAUX = BASEAUX - CONSUMO;
                            end
                        COMIMONTO = BASEAUX * COMIPORC / 100;
                        end
                    ELSE
                        BEGIN
                        if (SITOT = 'SI') then
                            BASEAUX = TOTAL;
                        ELSE
                            begin
                            BASEAUX = TOTAL - IVAMONTO;
                            if (ICOINC <> 'SI') then
                                BASEAUX = BASEAUX - CONSUMO;
                            end
                        COMIV = PORCV * BASEAUX / 100;
                        COMIMONTO = COMIV / 100 * porcaux;
                        comiporc = PORCV * porcaux / 100;
                        END
                    BASE = BASEAUX;
                    SUSPEND;
                    END
                END
            ELSE
                SUSPEND;
        ELSE
            if ((TIPO <> 31) AND (TIPO <> 33)) then
                SUSPEND;
        END
    END
FOR SELECT 'DEVOCHEQ', DVCH_MONTO*-1, DVCH_FECHA, PRBA_PREF, DVCH_NUMDOC, DVCH_FECHA, D.TERC_NIT, DVCH_NOMTERC, '', '', D.COBR_COD
    FROM DEVOLUCION_CHEQUES D, CLIENTES C
    WHERE DVCH_FECHA >= :FECINI AND DVCH_FECHA <= :FECFIN AND D.TERC_NIT = C.TERC_NIT AND D.COBR_COD = :CODVEND
    INTO :NOMTIPO, :BASE, :FECDOC, :PREFIJO, :NUMERO, :FECREC, :NIT, :CLIENTE, :PREFREC, :NUMREC, :codvend
    DO
    BEGIN
    COMIPORC = 0;
    COMIMONTO = 0;
    VENCE = fecdoc;
    RTFTE = 0;
    RTIVA = 0;
    RTICA = 0;
    DTOFIN = 0;
    puntovta = 0;
    if ((codvend >= :DESDE) AND (codvend <= :hasta)) then
        BEGIN
        select COBR_NOM from COBRADORES where COBR_COD = :codvend INTO :nomvend;
        /* SELECT CMCB_PORC FROM COMISION_COBRO WHERE CMCB_DIASINI <= 1 AND CMCB_DIASFIN >= 1 AND COBR_COD = :CODVEND INTO :COMIPORC;
        if (COMIPORC IS NULL) THEN
            COMIPORC = 0;
        COMIMONTO = BASE * COMIPORC / 100; */
        SUSPEND;
        END
    END
END^

SET TERM ; ^

/* 20131007 */
/* string truncation si nro orden de 15 caracteres o más */
SET TERM ^ ;

CREATE OR ALTER TRIGGER FACTCOMP_DETALLE_AI FOR FACTURAS_COMPRAS_DETALLE
ACTIVE AFTER INSERT POSITION 0
AS
declare variable fec date;
declare variable fecaux date;
declare variable aux varchar(90);
declare variable CONC VARCHAR(60);
declare variable factor numeric(18,4);
declare variable Pref varchar(4);
declare variable Num varchar(8);
declare variable Nit varchar(20);
declare variable TIPO INTEGER;
declare variable INVFAC CHAR(2);
declare variable IVAINC CHAR(2);
declare variable ICOINC CHAR(2);
declare variable COSTO NUMERIC(18,2);
declare variable NUMPROV VARCHAR(10);
declare variable NUMPED VARCHAR(30);
declare variable NUMREM VARCHAR(30);
declare variable CONSO VARCHAR(2);
declare variable CONSOLIDA INTEGER;
declare variable NUMROWS INTEGER;
declare variable DTOPIE NUMERIC(18,2);
declare variable ADICIONAL NUMERIC(18,2);
declare variable TOTAL NUMERIC(18,2);
declare variable IVAMONTO NUMERIC(18,2);
declare variable EXTRA NUMERIC(18,2);
declare variable FACT NUMERIC(18,4);
declare variable MENORV CHAR(2);
declare variable ACTREM CHAR(2);
declare variable ACTCAN CHAR(2);
declare variable FECREM date;
declare variable IDREM INTEGER;
declare variable ITEREM INTEGER;
declare variable CANTREM NUMERIC(18,4);
declare variable LOTEREM VARCHAR(15);
declare variable PREFREM CHAR(4);
declare variable IDMOV INTEGER;
declare variable DTOPOR NUMERIC(18,4);
declare variable CONFEXIS VARCHAR(20);
declare variable BOD VARCHAR(2);
declare variable MERMAENT CHAR(1);
declare variable MERMAPOR NUMERIC(9,4);
declare variable IDSAL INTEGER;
declare variable PREFSAL VARCHAR(4);
declare variable UNIART VARCHAR(8);
declare variable CANTAUX numeric(18,4);
declare variable CANT numeric(18,4);
declare variable ITEM integer;
BEGIN
if ((NEW.faco_id <> 0) and (new.fcde_anulado = 'N')) then
    BEGIN
    select faco_fecha, pref_pre, faco_numero, terc_nit, faco_imptos, faco_numprov, faco_remision, faco_orden, FACO_CONSOLIDA,
        FACO_TOTAL, FACO_EXTRA, FACO_IVAMONTO, FACO_ADICIONAL, FACO_DTOMONTO, FACO_DTOPORC
        from facturas_compra where faco_id = new.faco_id
        into :fec, :Pref, :Num, :Nit, :ivainc, :numprov, :numrem, :numped, :CONSOLIDA,
        :total, :extra, :ivamonto, :adicional, :dtopie, :dtopor;
    conc = 'FACTURA COMPRA No.' || PREF || NUM || '-' || NUMPROV;
    if (NUMREM <> '') then
        BEGIN
        AUX = SUBSTR(NUMREM, 1, 15);
        conc = conc || '-REM:' || AUX;
        END
    else
        if (NUMPED <> '') then
            BEGIN
            AUX = SUBSTR(NUMPED, 1, 15);
            conc = conc || '-ORDEN ' || AUX;
            END
    SELECT MAX(CEFA_TIPOORI) FROM consolide_faltantes WHERE CEFA_ID = :CONSOLIDA INTO :TIPO;
    if (Tipo is null) then
        Tipo = 0;
    execute procedure lee_configuracion('COMPRAS', 'FACTURAS', 'AFECTAR INVENTARIO CON LA FACTURA') returning_values (:INVFAC);
    execute procedure factor_unidad_cant(new.arti_cod, new.fcde_unidad) returning_values(factor);
    COSTO = ((new.fcde_prunit - NEW.fcde_dtomonto) / :factor);
    if (IVAINC = 'S') then
        BEGIN
        EXECUTE PROCEDURE lee_configuracion ('FACTURACION', 'ARTICULOS', 'IMPOCONSUMO INCLUIDO EN EL PRECIO BASE DE VENTA ANTES DE IVA') returning_values(:icoinc);
        if (icoinc = 'SI') then
            COSTO = COSTO - (NEW.fcde_consumo/(NEW.fcde_cant * new.fcde_factor));
        COSTO = COSTO / (1 + NEW.fcde_ivaporc/100);
        END
    EXECUTE PROCEDURE lee_configuracion('COMPRAS','FACTURAS','DESCUENTO Y VALOR ADICIONAL DEL DOCUMENTO COMO MENOR VALOR DEL COSTO') returning_values (:MENORV);
    if (MENORV = 'SI') then
        BEGIN
        if ((adicional = 0) and (dtopie <> 0)) then
            FACT = (100 - DTOPOR) / 100;
        ELSE
            BEGIN
            FACT = (TOTAL - EXTRA - IVAMONTO);
            if ((FACT - ADICIONAL + DTOPIE) <> 0) then
                FACT = FACT / (FACT - ADICIONAL + DTOPIE);
            ELSE
                FACT = 1;
            END
        COSTO = COSTO * FACT;
        END
    /* si se hizo con base en una remision no afecte inventario */
    if (INVFAC = 'SI') then
      if (Tipo <> 22) then
        begin
        INSERT INTO MOVIMIENTO_ARTICULO
          (ARTI_COD, BODE_COD, MVAR_FECHA, MVAR_TIPODOC, MVAR_IDREF, MVAR_CONC, MVAR_CANT, MVAR_COSTO, MVAR_ENTRADA, MVAR_LOTE, MVAR_PREF, MVAR_NUMERO, MVAR_ITEM, TERC_NIT)
          VALUES(NEW.ARTI_COD, NEW.BODE_COD, :FEC, 21, NEW.faco_id,
          :CONC, :factor * new.fcde_cant, :COSTO, 'S', new.fcde_lote, :Pref, :Num, NEW.fcde_item, :Nit);

        if (COSTO > 0 ) then
         BEGIN
          /* ACTUALICE EL COSTO POR PROVEEDOR */
          SELECT PVAR_FECHA FROM PROVEEDOR_ARTICULO
            WHERE TERC_NIT = :Nit AND ARTI_COD = NEW.ARTI_COD
            INTO :FECAUX;
          if (FECAUX IS NULL) then
            INSERT INTO PROVEEDOR_ARTICULO (TERC_NIT, ARTI_COD, PVAR_COSTO, PVAR_FECHA, PVAR_COD,PVAR_DES)
                VALUES (:Nit, NEW.ARTI_COD, :COSTO, :fec, NEW.fcde_codprov,NEW.fcde_desc);
          else
            UPDATE PROVEEDOR_ARTICULO
                SET PVAR_COSTO = :COSTO, PVAR_FECHA = :fec, PVAR_COD = NEW.fcde_codprov
                WHERE ARTI_COD = NEW.ARTI_COD AND TERC_NIT = :Nit;
         END
        /* RECORRA LAS LISTAS DE PRECIOS Y CAMBIE EL PRECIO */
        EXECUTE PROCEDURE CALCULA_PRECIOS(NEW.ARTI_COD, :FEC);
        END /* AFECTAR INV */
    EXECUTE PROCEDURE lee_configuracion('COMPRAS', 'FACTURAS', 'ACTUALIZAR COSTOS DE LA REMISION RELACIONADA AL GRABAR LA FACTURA') returning_values (:ACTREM);
    if ((ACTREM = 'SI') and (Tipo = 22)) then
        BEGIN
        numrows = 0;
        for select mvar_cons, MVAR_ITEM, MVAR_FECHA, MVAR_IDREF, MVAR_CANT, MVAR_LOTE, MVAR_PREF, MVAR_NUMERO, BODE_COD
            from movimiento_articulo M, consolidado_faltantes C
            where C.cofa_id = :CONSOLIDA AND mvar_tipodoc = 22 and mvar_idref = C.cofa_idori AND C.cofa_tipoori = 22 and m.arti_cod = new.arti_cod and m.mvar_item = c.cofa_itemori
            into :numrows, :iterem, :fecrem, :idrem, :cantrem, :loterem, :prefrem, :numrem, :BOD
            do
            begin
            if (numrows <> 0) then
                BEGIN
                /* inserte primero para evitar existencias negativas */
                IDMOV = GEN_ID(ID_MOVARTI,1);
                EXECUTE PROCEDURE lee_configuracion('COMPRAS', 'FACTURAS', 'ACTUALIZAR CANTIDADES DE LA REMISION RELACIONADA AL GRABAR LA FACTURA') returning_values (:ACTCAN);
                if (ACTCAN = 'SI') then
                    CANTREM = NEW.fcde_cant * NEW.fcde_factor;
                INSERT INTO MOVIMIENTO_ARTICULO
                    (ARTI_COD, MVAR_CONS, BODE_COD, MVAR_FECHA, MVAR_TIPODOC, MVAR_IDREF, MVAR_CONC, MVAR_CANT, MVAR_COSTO, MVAR_ENTRADA, MVAR_LOTE, MVAR_PREF, MVAR_NUMERO, MVAR_ITEM, TERC_NIT)
                    VALUES(NEW.ARTI_COD, :IDMOV, :BOD, :fecrem, 22, :idrem,
                    :CONC, :cantrem, :costo, 'S', :loterem, :prefrem, :numrem, :iterem, :Nit);
                SELECT CONF_VALOR FROM configuracion WHERE CONF_MODULO = 'INVENTARIO' AND CONF_CATEGORIA = 'EXISTENCIAS' AND CONF_PROPIEDAD = 'ACCION A TOMAR SI LA EXISTENCIA ES INSUFICIENTE' INTO :confexis;
                update CONFIGURACION SET CONF_VALOR = 'IGNORAR' WHERE CONF_MODULO = 'INVENTARIO' AND CONF_CATEGORIA = 'EXISTENCIAS' AND CONF_PROPIEDAD = 'ACCION A TOMAR SI LA EXISTENCIA ES INSUFICIENTE';
                DELETE FROM MOVIMIENTO_ARTICULO WHERE MVAR_CONS = :numrows;
                /* reponga el consecutivo para no afectar el orden del kardex */
                update MOVIMIENTO_ARTICULO set mvar_cons = :numrows WHERE MVAR_CONS = :idmov;
                update costos set cost_idmov = :numrows WHERE cost_idmov = :idmov AND arti_cod = new.arti_cod;
                update CONFIGURACION SET CONF_VALOR = :confexis WHERE CONF_MODULO = 'INVENTARIO' AND CONF_CATEGORIA = 'EXISTENCIAS' AND CONF_PROPIEDAD = 'ACCION A TOMAR SI LA EXISTENCIA ES INSUFICIENTE';

                if (COSTO > 0 ) then
                    BEGIN
                    /* ACTUALICE EL COSTO POR PROVEEDOR */
                    SELECT PVAR_FECHA FROM PROVEEDOR_ARTICULO
                        WHERE TERC_NIT = :Nit AND ARTI_COD = NEW.ARTI_COD
                        INTO :FECAUX;
                    if (FECAUX IS NULL) then
                        INSERT INTO PROVEEDOR_ARTICULO (TERC_NIT, ARTI_COD, PVAR_COSTO, PVAR_FECHA, PVAR_COD,PVAR_DES)
                            VALUES (:Nit, NEW.ARTI_COD, :COSTO, :fec, NEW.fcde_codprov,NEW.fcde_desc);
                    else
                        UPDATE PROVEEDOR_ARTICULO
                            SET PVAR_COSTO = :COSTO, PVAR_FECHA = :fec, PVAR_COD = NEW.fcde_codprov
                            WHERE ARTI_COD = NEW.ARTI_COD AND TERC_NIT = :Nit;
                    END
                /* RECORRA LAS LISTAS DE PRECIOS Y CAMBIE EL PRECIO */
                EXECUTE PROCEDURE CALCULA_PRECIOS(NEW.ARTI_COD, :FEC);
                END
            END
        END

    /* ACTUALICE EL PENDIENTE  */
    if (CONSOLIDA <> 0) then
        BEGIN
        execute procedure LEE_CONFIGURACION ('COMPRAS','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.faco_id, COFA_CANTCR = COFA_CANT * COFA_FACTOR, COFA_FECDES = :fec
                where COFA_ID = :consolida AND ARTI_COD = NEW.ARTI_COD;
        else
            begin
            CANTAUX = new.fcde_cant * new.fcde_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.faco_id, COFA_CANTCR = COFA_CANT * COFA_FACTOR, COFA_FECDES = :fec
                            where COFA_ID = :consolida and COFA_ITEM = :ITEM;
                        CANTAUX = CANTAUX - CANT;
                        end
                    else
                        begin
                        update consolidado_faltantes
                            set COFA_IDDES = new.faco_id, COFA_CANTCR = COFA_CANTCR + :CANTAUX, COFA_FECDES = :fec
                            where COFA_ID = :consolida and COFA_ITEM = :ITEM;
                        CANTAUX = 0;
                        end
                end
            end
        END
    /* ACTUALICE EL STAND */
    if (new.fcde_stand is not null) then
      if (exists(select stand_cod from stands where arti_cod = new.arti_cod and stand_bodega = new.bode_cod)) then
        UPDATE stands set stand_cod = new.fcde_stand where arti_cod = new.arti_cod and stand_bodega = new.bode_cod;
      else
        INSERT INTO stands (ARTI_COD, STAND_BODEGA, STAND_COD) VALUES (NEW.arti_cod, NEW.bode_cod, NEW.fcde_stand);
    /* SI MERMA ALMACENAMIENTO */
    SELECT ARTI_MERMAENT, ARTI_MERMAPOR, ARTI_UNIDAD FROM ARTICULO
        WHERE ARTI_COD = NEW.arti_cod INTO :mermaent, :mermapor, :uniart;
    if (MERMAENT = 'S') then
        BEGIN
        EXECUTE PROCEDURE lee_configuracion('INVENTARIO', 'SALIDAS', 'PREFIJO PARA SALIDAS POR MERMA DE ALMACENAMIENTO') returning_values (:prefsal);
        IDSAL = gen_id(id_salida, 1);
        INSERT INTO SALIDAS (SALI_ID, TIDO_COD, PREF_PRE, BODE_COD, SALI_NUMERO, SALI_FECHA, SALI_CONC, SALI_REFER, SALI_TIPOREF, SALI_IDREF, SALI_IMPTOS,
            SALI_NOMTERC, SALI_ANULADO, SALI_TRANSMIT, SALI_OBS, TERC_NIT, SALI_RESERVA, SALI_RESEID, SALI_USUARIO, NUMOK)
            VALUES (:idsal, 12, :prefsal, NEW.bode_cod, '000001', :fec, 'SALIDA MERMA ALMACENAMIENTO EN COMPRA ' || :pref || :num, :numprov, 21, NEW.faco_id, 'N',
            NULL, 'N', 'N', NULL, NULL, NULL, NULL, USER, 'N');
        INSERT INTO SALIDAS_DETALLE (SALI_ID, SADE_ITEM, ARTI_COD, BODE_COD, SADE_CANT, SADE_UNIDAD, SADE_LOTE, SADE_FACTOR,
            SADE_DESC, SADE_OBS, SADE_IVAPORC, SADE_IVAMONTO, SADE_CONSUMO, SADE_CODBAR, SADE_ANULADO, SADE_COSTO, SADE_TOTAL, SADE_TRANSMIT)
            VALUES (:IDSAL, 1, NEW.arti_cod, NEW.bode_cod, (NEW.fcde_cant * NEW.fcde_factor * :MERMAPOR / 100), :uniart, NEW.fcde_lote, 1,
            NEW.fcde_desc, NULL, NEW.fcde_ivaporc, 0, 0, NEW.fcde_codbar, 'N', 0, 0, 'N');
        END
    END
END^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER TRIGGER FACTCOMP_DETALLE_AU FOR FACTURAS_COMPRAS_DETALLE
ACTIVE AFTER UPDATE POSITION 0
as
declare variable fec date;
declare variable fecaux date;
declare variable AUX varchar(90);
declare variable CONC VARCHAR(60);
declare variable Pref varchar(4);
declare variable Num varchar(8);
declare variable Nit varchar(20);
declare variable factor numeric(18,4);
declare variable TIPO INTEGER;
declare variable INVFAC CHAR(2);
declare variable IVAINC CHAR(2);
declare variable ICOINC CHAR(2);
declare variable COSTO NUMERIC(18,2);
declare variable NUMPROV VARCHAR(10);
declare variable NUMPED VARCHAR(30);
declare variable NUMREM VARCHAR(30);
declare variable CONSO VARCHAR(2);
declare variable CONSOLIDA INTEGER;
declare variable NUMROWS INTEGER;
declare variable DTOPIE NUMERIC(18,2);
declare variable ADICIONAL NUMERIC(18,2);
declare variable TOTAL NUMERIC(18,2);
declare variable IVAMONTO NUMERIC(18,2);
declare variable EXTRA NUMERIC(18,2);
declare variable FACT NUMERIC(18,4);
declare variable MENORV CHAR(2);
declare variable ACTREM CHAR(2);
declare variable ACTCAN CHAR(2);
declare variable FECREM date;
declare variable IDREM INTEGER;
declare variable ITEREM INTEGER;
declare variable CANTREM NUMERIC(18,4);
declare variable LOTEREM VARCHAR(15);
declare variable PREFREM CHAR(4);
declare variable IDMOV INTEGER;
declare variable DTOPOR NUMERIC(18,4);
declare variable CONFEXIS VARCHAR(20);
declare variable BOD VARCHAR(2);
declare variable MERMAENT CHAR(1);
declare variable MERMAPOR NUMERIC(9,4);
declare variable IDSAL INTEGER;
declare variable PREFSAL VARCHAR(4);
declare variable UNIART VARCHAR(8);
declare variable CANTAUX numeric(18,4);
declare variable CANT numeric(18,4);
declare variable ITEM integer;
BEGIN
if (old.fcde_devuelto = new.fcde_devuelto) then
    begin
    /* deshaga lo viejo */
    if ((old.fcde_anulado = 'N') and (OLD.faco_id <> 0)) then
        begin
        select faco_fecha, faco_consolida from facturas_compra where faco_id = old.faco_id into :fec, :consolida;
        DELETE FROM MOVIMIENTO_ARTICULO WHERE (mvar_tipodoc = 21) and (mvar_idref = old.faco_id) and (mvar_item = old.fcde_item);
        DELETE FROM SALIDAS WHERE SALI_TIPOREF = 21 AND SALI_IDREF = OLD.faco_id;
        /* RECORRA LAS LISTAS DE PRECIOS Y CAMBIE EL PRECIO */
        EXECUTE PROCEDURE CALCULA_PRECIOS(old.ARTI_COD, :FEC);
        /* LOS PENDIENTES */
        if (CONSOLIDA <> 0) then
            BEGIN
            CANTAUX = old.fcde_cant * old.fcde_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
        end
    /* Registre el nuevo */
    if ((new.fcde_anulado = 'N') and (new.faco_id <> 0)) then
        BEGIN
        select faco_fecha, pref_pre, faco_numero, terc_nit, faco_imptos, faco_numprov, faco_remision, faco_orden,
            faco_consolida, faco_dtomonto, faco_adicional, faco_total, faco_ivamonto, faco_extra, FACO_DTOPORC
            from facturas_compra where faco_id = new.faco_id
            into :fec, :Pref, :Num, :Nit, :ivainc, :numprov, :numrem, :numped,
            :consolida, :dtopie, :adicional, :total, :ivamonto, :extra, :dtopor;
        conc = 'FACTURA COMPRA No.' || PREF || NUM || '-' || NUMPROV;
        if (NUMREM <> '') then
            BEGIN
            AUX = SUBSTR(NUMREM, 1, 15);
            conc = conc || '-REM:' || AUX;
            END
        else
            if (NUMPED <> '') then
                BEGIN
                AUX = SUBSTR(NUMPED, 1, 15);
                conc = conc || '-ORDEN ' || AUX;
                END
        SELECT MAX(CEFA_TIPOORI) FROM consolide_faltantes WHERE CEFA_ID = :CONSOLIDA INTO :TIPO;
        if (Tipo is null) then
            Tipo = 0;
        execute procedure lee_configuracion('COMPRAS', 'FACTURAS', 'AFECTAR INVENTARIO CON LA FACTURA') returning_values (:INVFAC);
        /* si se hizo con base en una remision no afecte inventario */
        if ((Tipo <> 22) and (INVFAC = 'SI')) then
            begin
            execute procedure factor_unidad_cant(new.arti_cod, new.fcde_unidad) returning_values(factor);
            COSTO = ((new.fcde_prunit - NEW.fcde_dtomonto) / :factor);
            if (IVAINC = 'S') then
                BEGIN
                EXECUTE PROCEDURE lee_configuracion ('FACTURACION', 'ARTICULOS', 'IMPOCONSUMO INCLUIDO EN EL PRECIO BASE DE VENTA ANTES DE IVA') returning_values(:icoinc);
                if (icoinc = 'SI') then
                    COSTO = COSTO - (NEW.fcde_consumo/(NEW.fcde_cant * new.fcde_factor));
                COSTO = COSTO / (1 + NEW.fcde_ivaporc/100);
                END
            EXECUTE PROCEDURE lee_configuracion('COMPRAS','FACTURAS','DESCUENTO Y VALOR ADICIONAL DEL DOCUMENTO COMO MENOR VALOR DEL COSTO') returning_values (:MENORV);
            if (MENORV = 'SI') then
                BEGIN
                if ((adicional = 0) and (dtopie <> 0)) then
                    FACT = (100 - DTOPOR) / 100;
                ELSE
                    BEGIN
                    FACT = (TOTAL - EXTRA - IVAMONTO);
                    if ((FACT - ADICIONAL + DTOPIE) <> 0) then
                        FACT = FACT / (FACT - ADICIONAL + DTOPIE);
                    ELSE
                        FACT = 1;
                    END
                COSTO = COSTO * FACT;
                END
            INSERT INTO MOVIMIENTO_ARTICULO
                (ARTI_COD, BODE_COD, MVAR_FECHA, MVAR_TIPODOC, MVAR_IDREF, MVAR_CONC, MVAR_CANT, MVAR_COSTO, MVAR_ENTRADA, MVAR_LOTE, MVAR_PREF, MVAR_NUMERO, MVAR_ITEM, TERC_NIT)
                VALUES(NEW.ARTI_COD, NEW.BODE_COD, :FEC, 21, NEW.faco_id,
                :CONC, :factor * new.fcde_cant, :COSTO, 'S', new.fcde_lote, :Pref, :Num, NEW.fcde_item, :Nit);
            if (COSTO > 0 ) then
             BEGIN
              /* ACTUALICE EL COSTO POR PROVEEDOR */
              SELECT PVAR_FECHA FROM PROVEEDOR_ARTICULO
                WHERE TERC_NIT = :Nit AND ARTI_COD = NEW.ARTI_COD INTO :FECAUX;
              if (FECAUX IS NULL) then
                INSERT INTO PROVEEDOR_ARTICULO (TERC_NIT, ARTI_COD, PVAR_COSTO, PVAR_FECHA, PVAR_COD,PVAR_DES)
                    VALUES (:Nit, NEW.ARTI_COD, :COSTO, :fec, NEW.fcde_codprov,NEW.fcde_desc);
              else
                UPDATE PROVEEDOR_ARTICULO
                    SET PVAR_COSTO = :COSTO, PVAR_FECHA = :fec, PVAR_COD = NEW.fcde_codprov
                    WHERE ARTI_COD = NEW.ARTI_COD AND TERC_NIT = :Nit;
             END
            /* RECORRA LAS LISTAS DE PRECIOS Y CAMBIE EL PRECIO */
            EXECUTE PROCEDURE CALCULA_PRECIOS(NEW.ARTI_COD, :FEC);
            end
        EXECUTE PROCEDURE lee_configuracion('COMPRAS', 'FACTURAS', 'ACTUALIZAR COSTOS DE LA REMISION RELACIONADA AL GRABAR LA FACTURA') returning_values (:ACTREM);
        if ((ACTREM = 'SI') and (Tipo = 22)) then
            BEGIN
            numrows = 0;
            for select mvar_cons, MVAR_ITEM, MVAR_FECHA, MVAR_IDREF, MVAR_CANT, MVAR_LOTE, MVAR_PREF, MVAR_NUMERO, BODE_COD
                from movimiento_articulo M, consolidado_faltantes C
                where C.cofa_id = :CONSOLIDA AND mvar_tipodoc = 22 and mvar_idref = C.cofa_idori AND C.cofa_tipoori = 22 and m.arti_cod = new.arti_cod
                into :numrows, :iterem, :fecrem, :idrem, :cantrem, :loterem, :prefrem, :numrem, :BOD
                do
                BEGIN
                /* inserte primero para evitar existencias negativas */
                IDMOV = GEN_ID(ID_MOVARTI,1);
                EXECUTE PROCEDURE lee_configuracion('COMPRAS', 'FACTURAS', 'ACTUALIZAR CANTIDADES DE LA REMISION RELACIONADA AL GRABAR LA FACTURA') returning_values (:ACTCAN);
                if (ACTCAN = 'SI') then
                    CANTREM = NEW.fcde_cant * NEW.fcde_factor;
                INSERT INTO MOVIMIENTO_ARTICULO
                    (ARTI_COD, MVAR_CONS, BODE_COD, MVAR_FECHA, MVAR_TIPODOC, MVAR_IDREF, MVAR_CONC, MVAR_CANT, MVAR_COSTO, MVAR_ENTRADA, MVAR_LOTE, MVAR_PREF, MVAR_NUMERO, MVAR_ITEM, TERC_NIT)
                    VALUES(NEW.ARTI_COD, :IDMOV, :bod, :fecrem, 22, :idrem,
                    :CONC, :cantrem, :costo, 'S', :loterem, :prefrem, :numrem, :iterem, :Nit);
                SELECT CONF_VALOR FROM configuracion WHERE CONF_MODULO = 'INVENTARIO' AND CONF_CATEGORIA = 'EXISTENCIAS' AND CONF_PROPIEDAD = 'ACCION A TOMAR SI LA EXISTENCIA ES INSUFICIENTE' INTO :confexis;
                update CONFIGURACION SET CONF_VALOR = 'IGNORAR' WHERE CONF_MODULO = 'INVENTARIO' AND CONF_CATEGORIA = 'EXISTENCIAS' AND CONF_PROPIEDAD = 'ACCION A TOMAR SI LA EXISTENCIA ES INSUFICIENTE';
                DELETE FROM MOVIMIENTO_ARTICULO WHERE MVAR_CONS = :numrows;
                /* reponga el consecutivo para no afectar el orden del kardex */
                update MOVIMIENTO_ARTICULO set mvar_cons = :numrows WHERE MVAR_CONS = :idmov;
                update costos set cost_idmov = :numrows WHERE cost_idmov = :idmov AND arti_cod = new.arti_cod;
                update CONFIGURACION SET CONF_VALOR = :confexis WHERE CONF_MODULO = 'INVENTARIO' AND CONF_CATEGORIA = 'EXISTENCIAS' AND CONF_PROPIEDAD = 'ACCION A TOMAR SI LA EXISTENCIA ES INSUFICIENTE';

                if (COSTO > 0 ) then
                    BEGIN
                    /* ACTUALICE EL COSTO POR PROVEEDOR */
                    SELECT PVAR_FECHA FROM PROVEEDOR_ARTICULO
                        WHERE TERC_NIT = :Nit AND ARTI_COD = NEW.ARTI_COD
                        INTO :FECAUX;
                    if (FECAUX IS NULL) then
                        INSERT INTO PROVEEDOR_ARTICULO (TERC_NIT, ARTI_COD, PVAR_COSTO, PVAR_FECHA, PVAR_COD,PVAR_DES)
                            VALUES (:Nit, NEW.ARTI_COD, :COSTO, :fec, NEW.fcde_codprov,NEW.fcde_desc);
                    else
                        UPDATE PROVEEDOR_ARTICULO
                            SET PVAR_COSTO = :COSTO, PVAR_FECHA = :fec, PVAR_COD = NEW.fcde_codprov
                            WHERE ARTI_COD = NEW.ARTI_COD AND TERC_NIT = :Nit;
                    END
                /* RECORRA LAS LISTAS DE PRECIOS Y CAMBIE EL PRECIO */
                EXECUTE PROCEDURE CALCULA_PRECIOS(NEW.ARTI_COD, :FEC);
                END
            END

        if (CONSOLIDA <> 0) then
            begin
            execute procedure LEE_CONFIGURACION ('COMPRAS','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.faco_id, COFA_CANTCR = COFA_CANT * COFA_FACTOR, COFA_FECDES = :fec
                    where COFA_ID = :consolida AND ARTI_COD = NEW.ARTI_COD;
            else
                begin
                CANTAUX = new.fcde_cant * new.fcde_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.faco_id, COFA_CANTCR = COFA_CANT * COFA_FACTOR, COFA_FECDES = :fec
                                where COFA_ID = :consolida and COFA_ITEM = :ITEM;
                            CANTAUX = CANTAUX - CANT;
                            end
                        else
                            begin
                            update consolidado_faltantes
                                set COFA_IDDES = new.faco_id, COFA_CANTCR = COFA_CANTCR + :CANTAUX, COFA_FECDES = :fec
                                where COFA_ID = :consolida and COFA_ITEM = :ITEM;
                            CANTAUX = 0;
                            end
                    end
                end
            end
        /* ACTUALICE EL STAND */
        if (new.fcde_stand is not null) then
          if (exists(select stand_cod from stands where arti_cod = new.arti_cod and stand_bodega = new.bode_cod)) then
            UPDATE stands set stand_cod = new.fcde_stand where arti_cod = new.arti_cod and stand_bodega = new.bode_cod;
          else
            INSERT INTO stands (ARTI_COD, STAND_BODEGA, STAND_COD) VALUES (NEW.arti_cod, NEW.bode_cod, NEW.fcde_stand);
        /* SI MERMA ALMACENAMIENTO */
        SELECT ARTI_MERMAENT, ARTI_MERMAPOR, ARTI_UNIDAD FROM ARTICULO
            WHERE ARTI_COD = NEW.arti_cod INTO :mermaent, :mermapor, :uniart;
        if (MERMAENT = 'S') then
            BEGIN
            EXECUTE PROCEDURE lee_configuracion('INVENTARIO', 'SALIDAS', 'PREFIJO PARA SALIDAS POR MERMA DE ALMACENAMIENTO') returning_values (:prefsal);
            IDSAL = gen_id(id_salida, 1);
            INSERT INTO SALIDAS (SALI_ID, TIDO_COD, PREF_PRE, BODE_COD, SALI_NUMERO, SALI_FECHA, SALI_CONC, SALI_REFER, SALI_TIPOREF, SALI_IDREF, SALI_IMPTOS,
                SALI_NOMTERC, SALI_ANULADO, SALI_TRANSMIT, SALI_OBS, TERC_NIT, SALI_RESERVA, SALI_RESEID, SALI_USUARIO, NUMOK)
                VALUES (:idsal, 12, :prefsal, NEW.bode_cod, '000001', :fec, 'SALIDA MERMA ALMACENAMIENTO EN COMPRA ' || :pref || :num, :numprov, 21, NEW.faco_id, 'N',
                NULL, 'N', 'N', NULL, NULL, NULL, NULL, USER, 'N');
            INSERT INTO SALIDAS_DETALLE (SALI_ID, SADE_ITEM, ARTI_COD, BODE_COD, SADE_CANT, SADE_UNIDAD, SADE_LOTE, SADE_FACTOR,
                SADE_DESC, SADE_OBS, SADE_IVAPORC, SADE_IVAMONTO, SADE_CONSUMO, SADE_CODBAR, SADE_ANULADO, SADE_COSTO, SADE_TOTAL, SADE_TRANSMIT)
                VALUES (:IDSAL, 1, NEW.arti_cod, NEW.bode_cod, (NEW.fcde_cant * NEW.fcde_factor * :MERMAPOR / 100), :uniart, NEW.fcde_lote, 1,
                NEW.fcde_desc, NULL, NEW.fcde_ivaporc, 0, 0, NEW.fcde_codbar, 'N', 0, 0, 'N');
            END
        END
    end
END^

SET TERM ; ^

/* 20131021 */
/* NO INCLUIA LA DIF EN CAMBIO */
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 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_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, :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_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, '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_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, :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_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, 'S', 'N', :pref, :numero, :TRM);

FOR SELECT DVCO_ID, PREF_PRE, DVCO_NUMERO, DVCO_FECHA, TERC_NIT, DVCO_RTFTEMONTO, DVCO_rtivamonto, DVCO_rticamonto, 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, :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_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, '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_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, :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_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, '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_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, :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_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, '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, 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, :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_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_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, '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_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, :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_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_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, '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, 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, :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_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_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, 'N', 'S', :PREF, :NUMERO, :TRM);
    END
END^

SET TERM ; ^

/* 20131021B */
/* NO DESCONTABA LAS DEVOLUCIONES SOBRE LA FACTURA PARA LOS PEDIDOS AUTOMATICOS */
SET TERM ^ ;

CREATE OR ALTER procedure FALTANTE (
    TIPORI integer,
    TIPDES integer,
    IDDOC integer,
    ITEM integer)
returns (
    CANT numeric(18,4),
    UNIDAD varchar(8),
    FACTOR numeric(18,4))
AS
declare variable CANTAUX NUMERIC(18,4);
declare variable PEDAUTO CHAR(2);
declare variable ARTIC VARCHAR(20);
declare variable CODOMITE VARCHAR(20);
begin
/* BUSQUE EL DOCUMENTO Y RECORRA LOS ITEMS */
EXECUTE PROCEDURE LEE_CONFIGURACION('FACTURACION', 'DOCUMENTOS', 'CODIGO DE ARTICULO A OMITIR EN LA CONSOLIDACION DE PENDIENTES') returning_values (:codomite);
if (TIPORI = 21) then
    BEGIN
    SELECT ARTI_COD, ((FCDE_CANT * FCDE_FACTOR) - FCDE_DEVUELTO) / FCDE_FACTOR, FCDE_FACTOR, FCDE_UNIDAD FROM FACTURAS_COMPRAS_DETALLE
        WHERE FACO_ID = :IDDOC AND FCDE_ITEM = :ITEM AND FCDE_ANULADO = 'N' INTO :ARTIC, :CANT, :FACTOR, :UNIDAD;
    END
if (TIPORI = 22) then
    BEGIN
    SELECT ARTI_COD, ((RPVD_CANT * RPVD_FACTOR) - RPVD_DEVUELTO) / RPVD_FACTOR, RPVD_FACTOR, RPVD_UNIDAD FROM remision_proveedor_det
        WHERE REPR_ID = :IDDOC AND RPVD_ITEM = :ITEM AND RPVD_ANULADO = 'N' INTO :ARTIC, :CANT, :FACTOR, :UNIDAD;
    END
if (TIPORI = 23) then
    BEGIN
    SELECT ARTI_COD, OCDE_CANT, OCDE_FACTOR, OCDE_UNIDAD FROM ORDENES_COMPRA_DETALLE
        WHERE ORDC_ID = :IDDOC AND OCDE_ITEM = :ITEM AND OCDE_ANULADO = 'N'  INTO :ARTIC, :CANT, :FACTOR, :UNIDAD;
    END
if (TIPORI = 25) then
    BEGIN
    SELECT ARTI_COD, CPRD_CANT, CPRD_FACTOR, CPRD_UNIDAD FROM COTIZACIONES_PROVEEDOR_DET
        WHERE COPR_ID = :IDDOC AND CPRD_ITEM = :ITEM AND CPRD_ANULADO = 'N' INTO :ARTIC, :CANT, :FACTOR, :UNIDAD;
    END
if (TIPORI = 31) then
    BEGIN
    SELECT ARTI_COD, ((FADE_CANT * FADE_FACTOR)-FADE_DEVUELTO) / FADE_FACTOR, FADE_FACTOR, FADE_UNIDAD
        FROM FACTURAS_DETALLE WHERE FACT_ID = :IDDOC AND FADE_ITEM = :ITEM AND FADE_ANULADO = 'N'
        INTO :ARTIC, :CANT, :FACTOR, :UNIDAD;
    END
if (TIPORI = 32) then
    BEGIN
    SELECT ARTI_COD, ((RVDE_CANT * RVDE_FACTOR)-RVDE_DEVUELTO) / RVDE_FACTOR, RVDE_FACTOR, RVDE_UNIDAD
        FROM remisiones_venta_detalle WHERE REVT_ID = :IDDOC AND RVDE_ITEM = :ITEM AND RVDE_ANULADO = 'N'
        INTO :ARTIC, :CANT, :FACTOR, :UNIDAD;
    END
if (TIPORI = 34) then
    BEGIN
    SELECT ARTI_COD, ((PEDE_CANT * PEDE_FACTOR)-PEDE_DEVUELTO) / PEDE_FACTOR, PEDE_FACTOR, PEDE_UNIDAD FROM PEDIDOS_DETALLE
        WHERE PEDI_ID = :IDDOC AND PEDE_ITEM = :ITEM AND PEDE_ANULADO = 'N' INTO :ARTIC, :CANT, :FACTOR, :UNIDAD;
    EXECUTE PROCEDURE LEE_CONFIGURACION('FACTURACION', 'FACTURAS', 'GENERAR PEDIDO AUTOMATICAMENTE CON LA FACTURA') returning_values (pedauto);
    if ((PEDAUTO = 'SI') and (ARTIC <> :codomite)) then
        begin
        /* RESTE LAS DEVOLUCIONES DE LA FACTURA ORIGINAL */
        SELECT SUM(FADE_DEVUELTO) FROM FACTURAS_DETALLE D, FACTURAS F, PEDIDOS P
            WHERE P.pedi_id = :IDDOC AND P.pref_pre = F.pref_pre AND P.pedi_numero = RIGHT(F.fact_numero,6) AND D.fact_id = F.fact_id AND D.fade_item = :item AND FACT_ANULADO = 'N'
            INTO :cantaux;
        if (cantaux > 0) then
            CANT = (CANT * FACTOR - CANTAUX) / FACTOR;
        end
    END
if (TIPORI = 35) then
    BEGIN
    SELECT ARTI_COD, CTDE_CANT, CTDE_FACTOR, CTDE_UNIDAD FROM COTIZACIONES_DETALLE
        WHERE COTI_ID = :IDDOC AND CTDE_ITEM = :ITEM AND CTDE_ANULADO = 'N' INTO :ARTIC, :CANT, :FACTOR, :UNIDAD;
    END
if (TIPORI = 40) then
    BEGIN
    SELECT ARTI_COD, PEVD_CANT, PEVD_FACTOR, PEVD_UNIDAD FROM pendiente_ventas_detalle
        WHERE PEND_ID = :IDDOC AND PEVD_ITEM = :ITEM AND PEVD_ANULADO = 'N' INTO :ARTIC, :CANT, :FACTOR, :UNIDAD;
    END
if (TIPORI = 139) then
    BEGIN
    SELECT ARTI_COD, SLDE_CANT, SLDE_FACTOR, SLDE_UNIDAD FROM solicitud_importacion_det
        WHERE SLIM_ID = :IDDOC AND SLDE_ITEM = :ITEM AND SLDE_ANULADO = 'N' INTO :ARTIC, :CANT, :FACTOR, :UNIDAD;
    END

if (CANT IS NULL) then
    CANT = 0;
if (ARTIC <> codomite) then
    BEGIN
    /* RECORRA LOS USOS EN CONSOLIDE_DOCS */
    select sum(COFA_CANTCR) from consolidado_faltantes
        where COFA_TIPOORI = :tipori and COFA_IDORI = :IDDOC and COFA_ITEMORI = :ITEM and COFA_TIPODES = :TIPDES
        into :cantaux;
    if (CANTAUX is null) then
        CANTAUX = 0;
    if (CANTAUX > (CANT * FACTOR)) then
        CANT = 0;
    else
        CANT = ((CANT * FACTOR) - CANTAUX) / FACTOR;
    END
ELSE
    CANT = 0;
suspend;
end^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE CONSOLIDE_PENDIENTES(
    IDCONS INTEGER)
AS
declare variable TIPDES INTEGER;
declare variable TIPORI INTEGER;
declare variable IDORI INTEGER;
declare variable ITEM INTEGER;
declare variable ARTI VARCHAR(20);
declare variable CANT NUMERIC(18,4);
declare variable ITCONS INTEGER;
declare variable CODBAR VARCHAR(20);
declare variable UNIDAD VARCHAR(8);
declare variable LOTE VARCHAR(15);
declare variable LOTE_VENCE DATE;
declare variable FACTOR NUMERIC(18,4);
declare variable PRUNIT NUMERIC(18,2);
declare variable DESCITE VARCHAR(255);
declare variable BOD VARCHAR(2);
declare variable DTO NUMERIC(9,4);
declare variable LISTA INTEGER;
declare variable OBS BLOB SUB_TYPE 1 SEGMENT SIZE 8192;
declare variable REF VARCHAR(60);
begin
ITCONS = 1;
/* DADOS LOS IDS DE LOS DOCUMENTOS EN LA TABLA CONSOLIDE GENERE EL CONSOLIDADO */
FOR SELECT CEFA_TIPODES, CEFA_TIPOORI, CEFA_IDORI FROM consolide_faltantes
    WHERE CEFA_ID = :idcons ORDER BY CEFA_ITEM INTO :TIPDES, :TIPORI, :IDORI do
    BEGIN
    if (TIPORI = 21) then
        BEGIN
        FOR SELECT FCDE_ITEM, ARTI_COD, FCDE_CODBAR, FCDE_PRUNIT, FCDE_DESC, BODE_COD, FCDE_DTOPORC, FCDE_LOTE, LOTE_VENCE, FCDE_OBS, FCDE_REFERENCIA
            FROM FACTURAS_COMPRAS_DETALLE
            WHERE FACO_ID = :IDORI ORDER BY FCDE_ITEM INTO :ITEM, :ARTI, :CODBAR, :PRUNIT, :DESCITE, :BOD, :DTO, :LOTE, :LOTE_VENCE, :OBS, :REF
            DO
            BEGIN
            if (((CODBAR IS NULL) or (CODBAR = '')) AND (ARTI <> '')) then
                CODBAR = ARTI;
            EXECUTE PROCEDURE faltante(:TIPORI, :TIPDES, :IDORI, :ITEM) returning_values (:CANT, :UNIDAD, :FACTOR);
            if (CANT > 0) then
                BEGIN
                INSERT INTO CONSOLIDADO_FALTANTES (COFA_ID, COFA_ITEM, COFA_TIPODES, COFA_TIPOORI, COFA_IDORI, COFA_ITEMORI, ARTI_COD, COFA_CANT, COFA_CODBAR, COFA_UNIDAD, COFA_FACTOR, COFA_OK, COFA_PRUNIT, COFA_DESCITE, COFA_BODEGA, COFA_DTOITE, COFA_LOTE, LOTE_VENCE, CODE_OBSIT, CODE_REF)
                    VALUES (:IDCONS, :ITCONS, :tipdes,  :tipori, :idori, :item, :arti, :cant, :CODBAR, :UNIDAD, :FACTOR, 'N', :PRUNIT, :DESCITE, :BOD, :DTO, :LOTE, :LOTE_VENCE, :OBS, :REF);
                ITCONS = ITCONS + 1;
                END
            END
        END
    if (TIPORI = 22) then
        BEGIN
        FOR SELECT RPVD_ITEM, ARTI_COD, RPVD_CODBAR, RPVD_PRUNIT, RPVD_DESC, BODE_COD, RPVD_DTOPORC, RPVD_LOTE, LOTE_VENCE, RPVD_OBS
            FROM remision_proveedor_det
            WHERE REPR_ID = :IDORI ORDER BY RPVD_ITEM INTO :ITEM, :ARTI, :CODBAR, :PRUNIT, :DESCITE, :BOD, :DTO, :LOTE, :LOTE_VENCE, :OBS
            DO
            BEGIN
            if (((CODBAR IS NULL) or (CODBAR = '')) AND (ARTI <> '')) then
                CODBAR = ARTI;
            EXECUTE PROCEDURE faltante(:TIPORI, :TIPDES, :IDORI, :ITEM) returning_values (:CANT, :UNIDAD, :FACTOR);
            if (CANT > 0) then
                BEGIN
                INSERT INTO CONSOLIDADO_FALTANTES (COFA_ID, COFA_ITEM, COFA_TIPODES, COFA_TIPOORI, COFA_IDORI, COFA_ITEMORI, ARTI_COD, COFA_CANT, COFA_CODBAR, COFA_UNIDAD, COFA_FACTOR, COFA_OK, COFA_PRUNIT, COFA_DESCITE, COFA_BODEGA, COFA_DTOITE, COFA_LOTE, LOTE_VENCE, CODE_OBSIT)
                    VALUES (:IDCONS, :ITCONS, :tipdes,  :tipori, :idori, :item, :arti, :cant, :CODBAR, :UNIDAD, :FACTOR, 'N', :PRUNIT, :descite, :BOD, :DTO, :LOTE, :LOTE_VENCE, :OBS);
                ITCONS = ITCONS + 1;
                END
            END
        END
    if (TIPORI = 23) then
        BEGIN
        FOR SELECT OCDE_ITEM, ARTI_COD, OCDE_CODBAR, OCDE_PRUNIT, OCDE_DESC, BODE_COD, OCDE_DTOPORC, NULL, CAST('NOW' AS DATE), OCDE_OBS
            FROM ORDENES_COMPRA_DETALLE
            WHERE ORDC_ID = :IDORI ORDER BY OCDE_ITEM INTO :ITEM, :ARTI, :CODBAR, :PRUNIT, :DESCITE, :BOD, :DTO, :LOTE, :LOTE_VENCE, :OBS
            DO
            BEGIN
            if (((CODBAR IS NULL) or (CODBAR = '')) AND (ARTI <> '')) then
                CODBAR = ARTI;
            EXECUTE PROCEDURE faltante(:TIPORI, :TIPDES, :IDORI, :ITEM) returning_values (:CANT, :UNIDAD, :FACTOR);
            if (CANT > 0) then
                BEGIN
                INSERT INTO CONSOLIDADO_FALTANTES (COFA_ID, COFA_ITEM, COFA_TIPODES, COFA_TIPOORI, COFA_IDORI, COFA_ITEMORI, ARTI_COD, COFA_CANT, COFA_CODBAR, COFA_UNIDAD, COFA_FACTOR, COFA_OK, COFA_PRUNIT, COFA_DESCITE, COFA_BODEGA, COFA_DTOITE, COFA_LOTE, LOTE_VENCE, CODE_OBSIT)
                    VALUES (:IDCONS, :ITCONS, :tipdes,  :tipori, :idori, :item, :arti, :cant, :CODBAR, :UNIDAD, :FACTOR, 'N', :PRUNIT, :DESCITE, :BOD, :DTO, :LOTE, :LOTE_VENCE, :OBS);
                ITCONS = ITCONS + 1;
                END
            END
        END
    if (TIPORI = 25) then
        BEGIN
        FOR SELECT CPRD_ITEM, ARTI_COD, CPRD_CODBAR, CPRD_PRUNIT, CPRD_DESC, BODE_COD, CPRD_DTOPORC, NULL, CAST('NOW' AS DATE), CPRD_OBS
            FROM COTIZACIONES_PROVEEDOR_DET
            WHERE COPR_ID = :IDORI ORDER BY CPRD_ITEM INTO :ITEM, :ARTI, :CODBAR, :PRUNIT, :DESCITE, :BOD, :DTO, :LOTE, :LOTE_VENCE, :OBS
            DO
            BEGIN
            if (((CODBAR IS NULL) or (CODBAR = '')) AND (ARTI <> '')) then
                CODBAR = ARTI;
            EXECUTE PROCEDURE faltante(:TIPORI, :TIPDES, :IDORI, :ITEM) returning_values (:CANT, :UNIDAD, :FACTOR);
            if (CANT > 0) then
                BEGIN
                INSERT INTO CONSOLIDADO_FALTANTES (COFA_ID, COFA_ITEM, COFA_TIPODES, COFA_TIPOORI, COFA_IDORI, COFA_ITEMORI, ARTI_COD, COFA_CANT, COFA_CODBAR, COFA_UNIDAD, COFA_FACTOR, COFA_OK, COFA_PRUNIT, COFA_DESCITE, COFA_BODEGA, COFA_DTOITE, COFA_LOTE, LOTE_VENCE, CODE_OBSIT)
                    VALUES (:IDCONS, :ITCONS, :tipdes,  :tipori, :idori, :item, :arti, :cant, :CODBAR, :UNIDAD, :FACTOR, 'N', :PRUNIT, :DESCITE, :BOD, :DTO, :LOTE, :LOTE_VENCE, :OBS);
                ITCONS = ITCONS + 1;
                END
            END
        END
    if (TIPORI = 31) then
        BEGIN
        FOR SELECT FADE_ITEM, ARTI_COD, FADE_CODBAR, FADE_PRUNIT, SUBSTRING(FADE_DESC FROM 1 FOR 60), BODE_COD, FADE_DTOPORC, FADE_LOTE, CAST('NOW' AS DATE), LIPR_COD, FADE_OBS, FADE_REFERENCIA
            FROM FACTURAS_DETALLE
            WHERE FACT_ID = :IDORI ORDER BY FADE_ITEM INTO :ITEM, :ARTI, :CODBAR, :PRUNIT, :DESCITE, :BOD, :DTO, :LOTE, :LOTE_VENCE, :LISTA, :OBS, :REF
            DO
            BEGIN
            if (((CODBAR IS NULL) or (CODBAR = '')) AND (ARTI <> '')) then
                CODBAR = ARTI;
            EXECUTE PROCEDURE faltante(:TIPORI, :TIPDES, :IDORI, :ITEM) returning_values (:CANT, :UNIDAD, :FACTOR);
            if ((CANT > 0) or (arti = '.t')) then
                BEGIN
                INSERT INTO CONSOLIDADO_FALTANTES (COFA_ID, COFA_ITEM, COFA_TIPODES, COFA_TIPOORI, COFA_IDORI, COFA_ITEMORI, ARTI_COD, COFA_CANT, COFA_CODBAR, COFA_UNIDAD, COFA_FACTOR, COFA_OK, COFA_PRUNIT, COFA_DESCITE, COFA_BODEGA, COFA_DTOITE, COFA_LOTE, LOTE_VENCE, COFA_LISTA, CODE_OBSIT, CODE_REF)
                    VALUES (:IDCONS, :ITCONS, :tipdes,  :tipori, :idori, :item, :arti, :cant, :CODBAR, :UNIDAD, :FACTOR, 'N', :PRUNIT, :DESCITE, :BOD, :DTO, :LOTE, :LOTE_VENCE, :LISTA, :obs,  :REF);
                ITCONS = ITCONS + 1;
                END
            END
        END
    if (TIPORI = 32) then
        BEGIN
        FOR SELECT RVDE_ITEM, ARTI_COD, RVDE_CODBAR, RVDE_PRUNIT, SUBSTRING(RVDE_DESC FROM 1 FOR 60), BODE_COD, RVDE_DTOPORC, RVDE_LOTE, CAST('NOW' AS DATE), LIPR_COD, RVDE_OBS, RVDE_REFERENCIA
            FROM remisiones_venta_detalle
            WHERE REVT_ID = :IDORI ORDER BY RVDE_ITEM INTO :ITEM, :ARTI, :CODBAR, :PRUNIT, :DESCITE, :BOD, :DTO, :LOTE, :LOTE_VENCE, :LISTA, :obs, :ref DO
            BEGIN
            if (((CODBAR IS NULL) or (CODBAR = '')) AND (ARTI <> '')) then
                CODBAR = ARTI;
            EXECUTE PROCEDURE faltante(:TIPORI, :TIPDES, :IDORI, :ITEM) returning_values (:CANT, :UNIDAD, :FACTOR);
            if ((CANT > 0) or (arti = '.t')) then
                BEGIN
                INSERT INTO CONSOLIDADO_FALTANTES (COFA_ID, COFA_ITEM, COFA_TIPODES, COFA_TIPOORI, COFA_IDORI, COFA_ITEMORI, ARTI_COD, COFA_CANT, COFA_CODBAR, COFA_UNIDAD, COFA_FACTOR, COFA_OK, COFA_PRUNIT, COFA_DESCITE, COFA_BODEGA, COFA_DTOITE, COFA_LOTE, LOTE_VENCE, COFA_LISTA, CODE_OBSIT, CODE_REF)
                    VALUES (:IDCONS, :ITCONS, :tipdes,  :tipori, :idori, :item, :arti, :cant, :CODBAR, :UNIDAD, :FACTOR, 'N', :PRUNIT, :DESCITE, :BOD, :DTO, :LOTE, :LOTE_VENCE, :LISTA, :obs, :ref);
                ITCONS = ITCONS + 1;
                END
            END
        END
    if (TIPORI = 34) then
        BEGIN
        FOR SELECT PEDE_ITEM, ARTI_COD, PEDE_CODBAR, PEDE_PRUNIT, SUBSTRING(PEDE_DESC FROM 1 FOR 60), BODE_COD, PEDE_DTOPORC, NULL, CAST('NOW' AS DATE), D.LIPR_COD, PEDE_OBS, PEDE_REFERENCIA
            FROM PEDIDOS_DETALLE D, PEDIDOS P
            WHERE P.PEDI_ID = :IDORI AND P.pedi_id = D.pedi_id ORDER BY PEDE_ITEM
            INTO :ITEM, :ARTI, :CODBAR, :PRUNIT, :DESCITE, :BOD, :DTO, :LOTE, :LOTE_VENCE, :LISTA, :obs, :ref DO
            BEGIN
            if (((CODBAR IS NULL) or (CODBAR = '')) AND (ARTI <> '')) then
                CODBAR = ARTI;
            EXECUTE PROCEDURE faltante(:TIPORI, :TIPDES, :IDORI, :ITEM) returning_values (:CANT, :UNIDAD, :FACTOR);
            if ((CANT > 0) or (arti = '.t')) then
                BEGIN
                INSERT INTO CONSOLIDADO_FALTANTES (COFA_ID, COFA_ITEM, COFA_TIPODES, COFA_TIPOORI, COFA_IDORI, COFA_ITEMORI, ARTI_COD, COFA_CANT, COFA_CODBAR, COFA_UNIDAD, COFA_FACTOR, COFA_OK, COFA_PRUNIT, COFA_DESCITE, COFA_BODEGA, COFA_DTOITE, COFA_LOTE, LOTE_VENCE, COFA_LISTA, CODE_OBSIT, CODE_REF)
                    VALUES (:IDCONS, :ITCONS, :tipdes,  :tipori, :idori, :item, :arti, :cant, :CODBAR, :UNIDAD, :FACTOR, 'N', :PRUNIT, :DESCITE, :BOD, :DTO, :LOTE, :LOTE_VENCE, :LISTA, :obs, :ref);
                ITCONS = ITCONS + 1;
                END
            END
        END
    if (TIPORI = 35) then
        BEGIN
        FOR SELECT CTDE_ITEM, ARTI_COD, CTDE_CODBAR, CTDE_PRUNIT, SUBSTRING(CTDE_DESC FROM 1 FOR 60), P.BODE_COD, CTDE_DTOPORC, NULL, CAST('NOW' AS DATE), D.LIPR_COD, CTDE_OBS, CTDE_REFERENCIA
            FROM COTIZACIONES_DETALLE D, cotizaciones C, punto_venta P
            WHERE C.COTI_ID = :IDORI AND C.coti_id = D.coti_id AND C.ptvt_id = P.ptvt_id ORDER BY CTDE_ITEM INTO :ITEM, :ARTI, :CODBAR, :PRUNIT, :DESCITE, :BOD, :DTO, :LOTE, :LOTE_VENCE, :LISTA, :obs, :ref DO
            BEGIN
            if (((CODBAR IS NULL) or (CODBAR = '')) AND (ARTI <> '')) then
                CODBAR = ARTI;
            EXECUTE PROCEDURE faltante(:TIPORI, :TIPDES, :IDORI, :ITEM) returning_values (:CANT, :UNIDAD, :FACTOR);
            if ((CANT > 0) or (arti = '.t')) then
                BEGIN
                INSERT INTO CONSOLIDADO_FALTANTES (COFA_ID, COFA_ITEM, COFA_TIPODES, COFA_TIPOORI, COFA_IDORI, COFA_ITEMORI, ARTI_COD, COFA_CANT, COFA_CODBAR, COFA_UNIDAD, COFA_FACTOR, COFA_OK, COFA_PRUNIT, COFA_DESCITE, COFA_BODEGA, COFA_DTOITE, COFA_LOTE, LOTE_VENCE, COFA_LISTA, CODE_OBSIT, CODE_REF)
                    VALUES (:IDCONS, :ITCONS, :tipdes,  :tipori, :idori, :item, :arti, :cant, :CODBAR, :UNIDAD, :FACTOR, 'N', :PRUNIT, :DESCITE, :BOD, :DTO, :LOTE, :LOTE_VENCE, :LISTA, :obs, :ref);
                ITCONS = ITCONS + 1;
                END
            END
        END
    if (TIPORI = 40) then
        BEGIN
        FOR SELECT PEVD_ITEM, ARTI_COD, PEVD_CORBAR, PEVD_PRUNIT, SUBSTRING(PEVD_DESC FROM 1 FOR 60), D.BODE_COD, PEVD_DTOPORC, NULL, CAST('NOW' AS DATE), 1, PEVD_OBS, PEVD_REFERENCIA
            FROM pendiente_ventas_detalle D, pendiente_ventas P
            WHERE P.pend_id = :IDORI AND P.pend_id = D.pend_id ORDER BY PEVD_ITEM INTO :ITEM, :ARTI, :CODBAR, :PRUNIT, :DESCITE, :BOD, :DTO, :LOTE, :LOTE_VENCE, :LISTA, :obs, :ref DO
            BEGIN
            if (((CODBAR IS NULL) or (CODBAR = '')) AND (ARTI <> '')) then
                CODBAR = ARTI;
            EXECUTE PROCEDURE faltante(:TIPORI, :TIPDES, :IDORI, :ITEM) returning_values (:CANT, :UNIDAD, :FACTOR);
            if ((CANT > 0) or (arti = '.t')) then
                BEGIN
                INSERT INTO CONSOLIDADO_FALTANTES (COFA_ID, COFA_ITEM, COFA_TIPODES, COFA_TIPOORI, COFA_IDORI, COFA_ITEMORI, ARTI_COD, COFA_CANT, COFA_CODBAR, COFA_UNIDAD, COFA_FACTOR, COFA_OK, COFA_PRUNIT, COFA_DESCITE, COFA_BODEGA, COFA_DTOITE, COFA_LOTE, LOTE_VENCE, COFA_LISTA, CODE_OBSIT, CODE_REF)
                    VALUES (:IDCONS, :ITCONS, :tipdes,  :tipori, :idori, :item, :arti, :cant, :CODBAR, :UNIDAD, :FACTOR, 'N', :PRUNIT, :DESCITE, :BOD, :DTO, :LOTE, :LOTE_VENCE, :LISTA, :obs, :ref);
                ITCONS = ITCONS + 1;
                END
            END
        END
    if (TIPORI = 139) then
        BEGIN
        FOR SELECT SLDE_ITEM, ARTI_COD, SLDE_CODBAR, SLDE_FOB, SLDE_DESC, SLDE_DTOPORC, SLDE_OBS
            FROM solicitud_importacion_det
            WHERE SLIM_ID = :IDORI ORDER BY SLDE_ITEM INTO :ITEM, :ARTI, :CODBAR, :PRUNIT, :DESCITE, :DTO, :OBS
            DO
            BEGIN
            if (((CODBAR IS NULL) or (CODBAR = '')) AND (ARTI <> '')) then
                CODBAR = ARTI;
            EXECUTE PROCEDURE faltante(:TIPORI, :TIPDES, :IDORI, :ITEM) returning_values (:CANT, :UNIDAD, :FACTOR);
            if (CANT > 0) then
                BEGIN
                INSERT INTO CONSOLIDADO_FALTANTES (COFA_ID, COFA_ITEM, COFA_TIPODES, COFA_TIPOORI, COFA_IDORI, COFA_ITEMORI, ARTI_COD, COFA_CANT, COFA_CODBAR, COFA_UNIDAD, COFA_FACTOR, COFA_OK, COFA_PRUNIT, COFA_DESCITE, COFA_BODEGA, COFA_DTOITE, COFA_LOTE, LOTE_VENCE, CODE_OBSIT)
                    VALUES (:IDCONS, :ITCONS, :tipdes,  :tipori, :idori, :item, :arti, :cant, :CODBAR, :UNIDAD, :FACTOR, 'N', :PRUNIT, :descite, :BOD, :DTO, :LOTE, :LOTE_VENCE, :OBS);
                ITCONS = ITCONS + 1;
                END
            END
        END
    END /* FOR CONSOLIDE */
end
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE DOCCOMPRA_X_PROVEEDOR(
    NIT VARCHAR(20),
    TIPODOC INTEGER,
    TIPODES INTEGER,
    FECHA DATE)
RETURNS (
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(8),
    NROPROV VARCHAR(10),
    VALIDEZ INTEGER,
    ID INTEGER,
    FECDOC DATE,
    SUBTOTAL NUMERIC(18,2),
    IVA NUMERIC(18,2),
    CONSUMO NUMERIC(18,2),
    TOTAL NUMERIC(18,2))
AS
declare variable VENCE DATE;
declare variable ITEM INTEGER;
declare variable FALTA NUMERIC(18,4);
declare variable FALTAT NUMERIC(18,4);
declare variable UNIDAD VARCHAR(8);
declare variable FACTOR NUMERIC(18,4);
declare variable DIAS INTEGER;
declare variable usado CHAR(2);
declare variable NUMROWS INTEGER;
declare variable IDF INTEGER;
declare variable UNAVEZ CHAR(2);
BEGIN
EXECUTE PROCEDURE lee_configuracion('COMPRAS','DOCUMENTOS','NUMERO DE DIAS MAXIMO PARA CRUZAR DOCUMENTO') returning_values (DIAS);
EXECUTE PROCEDURE lee_configuracion('COMPRAS','DOCUMENTOS','PERMITIR LLAMAR DOCUMENTOS PREVIAMENTE USADOS EN OTRO TIPO DE DOCUMENTO') returning_values (UNAVEZ);
if (TIPODOC = 21) then /* FACTURA */
    BEGIN
    FOR SELECT FACO_ID, PREF_PRE, FACO_NUMERO, FACO_FECHA, FACO_VENCE, FACO_NUMPROV
        FROM FACTURAS_COMPRA WHERE TERC_NIT = :NIT AND FACO_FECHA <= :FECHA AND (FACO_FECHA >= (:FECHA-:DIAS)) AND FACO_ANULADO = 'N'
        INTO :ID, :PREFIJO, :NUMERO, :FECDOC, :VENCE, :nroprov DO
        BEGIN
        if ((UNAVEZ <> 'NO') or NOT EXISTS(SELECT COFA_ID FROM CONSOLIDADO_FALTANTES WHERE COFA_TIPOORI = 21 AND COFA_IDORI = :id AND COFA_CANTCR <> 0)) then
            BEGIN
            EXECUTE PROCEDURE TOTAL_DOC_COMPRA(TIPODOC, ID) returning_values (SUBTOTAL, IVA, CONSUMO);
            TOTAL = SUBTOTAL + IVA + CONSUMO;
            VALIDEZ = VENCE - FECDOC;
            if (TIPODES <> 0) then
                BEGIN
                /* RECORRA LOS ITEMS PARA VER SI TODO ESTA DEVUELTO */
                FALTAT = 0;
                FOR SELECT FCDE_ITEM, (FCDE_CANT*FCDE_FACTOR-FCDE_DEVUELTO) FROM FACTURAS_COMPRAS_DETALLE
                    WHERE FACO_ID = :ID ORDER BY FCDE_ITEM INTO :ITEM, :FALTA DO
                    BEGIN
                    if (tipodes <> 24) then
                        EXECUTE procedure FALTANTE(TIPODOC, TIPODES, :ID, :ITEM) returning_values (:FALTA, :unidad,  :FACTOR);
                    FALTAT = FALTAT + FALTA;
                    END
                if (FALTAT <> 0) then
                    SUSPEND;
                END
            ELSE
                SUSPEND;
            END
        END
    END
if (TIPODOC = 22) then /* REMISION */
    BEGIN
    FOR SELECT REPR_ID, PREF_PRE, REPR_NUMERO, REPR_FECHA, 0, REPR_NUMPROV
        FROM remision_proveedor WHERE TERC_NIT = :NIT AND REPR_FECHA <= :FECHA AND (REPR_FECHA >= (:FECHA-:DIAS)) AND REPR_ANULADO = 'N'
        INTO :ID, :PREFIJO, :NUMERO, :FECDOC, :VALIDEZ, :nroprov DO
        BEGIN
        if ((UNAVEZ <> 'NO') or NOT EXISTS(SELECT COFA_ID FROM CONSOLIDADO_FALTANTES WHERE COFA_TIPOORI = 22 AND COFA_IDORI = :id AND COFA_CANTCR <> 0)) then
            BEGIN
            EXECUTE PROCEDURE TOTAL_DOC_COMPRA(TIPODOC, ID) returning_values (SUBTOTAL, IVA, CONSUMO);
            TOTAL = SUBTOTAL + IVA + CONSUMO;
            if (TIPODES <> 0) then
                BEGIN
                /* RECORRA LOS ITEMS PARA VER SI TODO ESTA DEVUELTO */
                FALTAT = 0;
                FOR SELECT RPVD_ITEM FROM remision_proveedor_det WHERE REPR_ID = :ID ORDER BY RPVD_ITEM INTO :ITEM DO
                    BEGIN
                    EXECUTE procedure FALTANTE(TIPODOC, TIPODES, :ID, :ITEM) returning_values (:FALTA, :unidad,  :FACTOR);
                    FALTAT = FALTAT + FALTA;
                    END
                if (FALTAT <> 0) then
                    SUSPEND;
                END
            ELSE
                SUSPEND;
            END
        END
    END
if (TIPODOC = 24) then /* DEVOLUCION */
    BEGIN
    FOR SELECT DVCO_ID, PREF_PRE, DVCO_NUMERO, DVCO_FECHA, 0, DVCO_FACTID
        FROM DEVOLUCIONES_COMPRAS WHERE TERC_NIT = :NIT AND DVCO_FECHA <= :FECHA AND DVCO_ANULADO = 'N'
        INTO :ID, :PREFIJO, :NUMERO, :FECDOC, :VALIDEZ, :idf DO
        BEGIN
        nroprov = '';
        SELECT FACO_NUMPROV FROM facturas_compra WHERE FACO_ID = :idF INTO :nroprov;
        EXECUTE PROCEDURE TOTAL_DOC_COMPRA(TIPODOC, ID) returning_values (SUBTOTAL, IVA, CONSUMO);
        TOTAL = SUBTOTAL + IVA + CONSUMO;
        SUSPEND;
        END
    END
if (TIPODOC = 23) then /* ORDEN */
    BEGIN
    FOR SELECT ORDC_ID, PREF_PRE, ORDC_NUMERO, ORDC_FECHA, ORDC_VALIDEZ, ''
        FROM ORDENES_COMPRA WHERE TERC_NIT = :NIT AND ORDC_FECHA <= :FECHA AND ((ORDC_FECHA+ORDC_VALIDEZ) >= :FECHA) AND ORDC_ANULADO = 'N'
        INTO :ID, :PREFIJO, :NUMERO, :FECDOC, :VALIDEZ, :nroprov DO
        BEGIN
        if ((UNAVEZ <> 'NO') or NOT EXISTS(SELECT COFA_ID FROM CONSOLIDADO_FALTANTES WHERE COFA_TIPOORI = 23 AND COFA_IDORI = :id AND COFA_CANTCR <> 0)) then
            BEGIN
            EXECUTE PROCEDURE TOTAL_DOC_COMPRA(TIPODOC, ID) returning_values (SUBTOTAL, IVA, CONSUMO);
            TOTAL = SUBTOTAL + IVA + CONSUMO;
            if (TIPODES <> 0) then
                BEGIN
                /* RECORRA LOS ITEMS PARA VER SI TODO ESTA USADO */
                FALTAT = 0;
                EXECUTE PROCEDURE lee_configuracion('COMPRAS','DOCUMENTOS','PERMITIR LLAMAR DOCUMENTOS PREVIAMENTE USADOS EN OTRO TIPO DE DOCUMENTO') returning_values (:USADO);
                if (USADO = 'NO') then
                    SELECT COUNT(*) FROM consolidado_faltantes WHERE COFA_TIPOORI = 23 AND COFA_IDORI = :ID AND COFA_TIPODES <> :tipodes AND COFA_CANTCR <> 0 INTO :NUMROWS;
                ELSE
                    NUMROWS = 0;
                if (NUMROWS = 0) then
                    FOR SELECT OCDE_ITEM FROM ordenes_compra_detalle WHERE ORDC_ID = :ID ORDER BY OCDE_ITEM INTO :ITEM DO
                        BEGIN
                        EXECUTE procedure FALTANTE(TIPODOC, TIPODES, :ID, :ITEM) returning_values (:FALTA, :unidad,  :FACTOR);
                        FALTAT = FALTAT + FALTA;
                        END
                if (FALTAT <> 0) then
                    SUSPEND;
                END
            ELSE
                SUSPEND;
            END
        END
    END
if (TIPODOC = 25) then /* COTIZACION */
    BEGIN
    FOR SELECT COPR_ID, PREF_PRE, COPR_NUMERO, COPR_FECHA, COPR_VALIDEZ, ''
        FROM cotizacion_PROVEEDOR WHERE TERC_NIT = :NIT AND COPR_FECHA <= :FECHA AND ((COPR_FECHA+COPR_VALIDEZ) >= :FECHA) AND COPR_ANULADO = 'N'
        INTO :ID, :PREFIJO, :NUMERO, :FECDOC, :VALIDEZ, :nroprov DO
        BEGIN
        if ((UNAVEZ <> 'NO') or NOT EXISTS(SELECT COFA_ID FROM CONSOLIDADO_FALTANTES WHERE COFA_TIPOORI = 25 AND COFA_IDORI = :id AND COFA_CANTCR <> 0)) then
            BEGIN
            EXECUTE PROCEDURE TOTAL_DOC_COMPRA(TIPODOC, ID) returning_values (SUBTOTAL, IVA, CONSUMO);
            TOTAL = SUBTOTAL + IVA + CONSUMO;
            if (TIPODES <> 0) then
                BEGIN
                /* RECORRA LOS ITEMS PARA VER SI TODO ESTA DEVUELTO */
                FALTAT = 0;
                EXECUTE PROCEDURE lee_configuracion('COMPRAS','DOCUMENTOS','PERMITIR LLAMAR DOCUMENTOS PREVIAMENTE USADOS EN OTRO TIPO DE DOCUMENTO') returning_values (:USADO);
                if (USADO = 'NO') then
                    SELECT COUNT(*) FROM consolide_faltantes WHERE CEFA_TIPOORI = 25 AND CEFA_IDORI = :ID AND CEFA_TIPODES <> :tipodes INTO :NUMROWS;
                ELSE
                    NUMROWS = 0;
                if (NUMROWS = 0) then
                    FOR SELECT CPRD_ITEM FROM cotizaciones_proveedor_det WHERE COPR_ID = :ID ORDER BY CPRD_ITEM INTO :ITEM DO
                        BEGIN
                        EXECUTE procedure FALTANTE(TIPODOC, TIPODES, :ID, :ITEM) returning_values (:FALTA, :unidad,  :FACTOR);
                        FALTAT = FALTAT + FALTA;
                        END
                if (FALTAT <> 0) then
                    SUSPEND;
                END
            ELSE
                SUSPEND;
            END
        END
    END
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE DOCVENTAS_X_CLIENTE(
    NIT VARCHAR(20),
    TIPODOC INTEGER,
    TIPODES INTEGER,
    FECHA DATE,
    SUCURSAL VARCHAR(10))
RETURNS (
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(8),
    VALIDEZ INTEGER,
    VEND INTEGER,
    ID INTEGER,
    FECDOC DATE,
    SUBTOTAL NUMERIC(18,2),
    IVA NUMERIC(18,2),
    CONSUMO NUMERIC(18,2),
    TOTAL NUMERIC(18,2),
    SUCUR VARCHAR(10))
AS
declare variable VENCE DATE;
declare variable ITEM INTEGER;
declare variable FALTA NUMERIC(18,4);
declare variable FALTAT NUMERIC(18,4);
declare variable UNIDAD VARCHAR(8);
declare variable FACTOR NUMERIC(18,4);
declare variable DIAS INTEGER;
declare variable usado CHAR(2);
declare variable NUMROWS INTEGER;
declare variable TRAERCONTADO CHAR(2);
declare variable CONSOL INTEGER;
declare variable TIPOORI INTEGER;
declare variable OK CHAR(1);
declare variable ITECAN NUMERIC(18,2);
declare variable ITESUB NUMERIC(18,2);
declare variable ITEIVA NUMERIC(18,2);
declare variable ITECON NUMERIC(18,2);
BEGIN
EXECUTE PROCEDURE lee_configuracion('FACTURACION','DOCUMENTOS','NUMERO DE DIAS MAXIMO PARA CRUZAR DOCUMENTO') returning_values (DIAS);
EXECUTE PROCEDURE lee_configuracion('FACTURACION', 'DOCUMENTOS', 'TRAER DOCUMENTOS PENDIENTES DEL CLIENTE DE CONTADO EN DOCUMENTOS DE OTROS CLIENTES') returning_values (TRAERCONTADO);

if (TIPODOC = 31) then /* FACTURA */
    BEGIN
    FOR SELECT FACT_ID, PREF_PRE, FACT_NUMERO, FACT_FECHA, FACT_VENCE, FACT_SUCURSAL, VEND_COD, FACT_CONSOLIDA
        FROM FACTURAS
        WHERE TERC_NIT = :NIT AND FACT_FECHA <= :FECHA AND (FACT_FECHA >= (:FECHA - :DIAS)) AND
            FACT_ANULADO = 'N' AND ((FACT_SUCURSAL = :SUCURSAL) or (:SUCURSAL = 'Todas') or (:SUCURSAL = '0'))
        INTO :ID, :PREFIJO, :NUMERO, :FECDOC, :VENCE, :SUCUR, :VEND, :CONSOL DO
        BEGIN
        EXECUTE PROCEDURE TOTAL_DOC_VENTAS(TIPODOC, ID) returning_values (SUBTOTAL, IVA, CONSUMO);
        TOTAL = SUBTOTAL + IVA + CONSUMO;
        VALIDEZ = VENCE - FECDOC;
        if (TIPODES = 33) then
            BEGIN
            /* VERIFIQUE SI HAY PENDIENTES */
            SELECT SUM(FADE_CANT * FADE_FACTOR - FADE_DEVUELTO) FROM FACTURAS_DETALLE WHERE FACT_ID = :ID and substring(arti_cod from 1 FOR 2) <> '.t' and FADE_cant > 0 INTO :FALTA;
            if (FALTA <> 0) then
                suspend;
            END
        ELSE
            BEGIN
            /* VERIFIQUE QUE NO ESTE HECHA CON BASE EN UN DOCUMENTO DE ORIGEN */
            FALTAT = 0;
            OK = 'N';
            if ((CONSOL <> 0) AND (CONSOL IS NOT NULL)) then
                BEGIN
                SELECT MAX(COFA_TIPOORI) FROM consolidado_faltantes WHERE COFA_ID = :CONSOL AND COFA_CANTCR <> 0 INTO :tipoori;
                if (TIPOORI <> TIPODES) then
                    OK = 'S';
                END
            ELSE
                OK = 'S';
            if (OK = 'S') then
                BEGIN
                /* RECORRA LOS ITEMS PARA VER SI TODO ESTA USADO */
                FOR SELECT FADE_ITEM FROM FACTURAS_DETALLE WHERE FACT_ID = :ID and substring(arti_cod from 1 FOR 2) <> '.t' ORDER BY FADE_ITEM INTO :ITEM DO
                    BEGIN
                    EXECUTE procedure FALTANTE(TIPODOC, :TIPODES, :ID, :ITEM) returning_values (:FALTA, :UNIDAD, :FACTOR);
                    FALTAT = FALTAT + FALTA;
                    END
                if (FALTAT <> 0) then
                    SUSPEND;
                END
            END
        END
    END
  if (TIPODOC = 32) then /* REMISION */
    BEGIN
    FOR SELECT REVT_ID, PREF_PRE, REVT_NUMERO, REVT_FECHA, 0, REVT_SUCURSAL, VEND_COD, REVT_CONSOLIDA
        FROM remisiones_venta
        WHERE TERC_NIT = :NIT AND REVT_FECHA <= :FECHA AND (REVT_FECHA >= (:FECHA - :DIAS)) AND
            REVT_ANULADO = 'N' AND ((REVT_SUCURSAL = :SUCURSAL) or (:SUCURSAL = 'Todas'))
        INTO :ID, :PREFIJO, :NUMERO, :FECDOC, :VALIDEZ, :SUCUR, :VEND, :CONSOL DO
        BEGIN
        EXECUTE PROCEDURE TOTAL_DOC_VENTAS(TIPODOC, ID) returning_values (SUBTOTAL, IVA, CONSUMO);
        TOTAL = SUBTOTAL + IVA + CONSUMO;
        if (TIPODES <> 0) then
            BEGIN
            /* VERIFIQUE QUE NO ESTE HECHA CON BASE EN UN DOCUMENTO DE ORIGEN */
            FALTAT = 0;
            OK = 'N';
            if ((CONSOL <> 0) AND (CONSOL IS NOT NULL)) then
                BEGIN
                SELECT MAX(COFA_TIPOORI) FROM consolidado_faltantes WHERE COFA_ID = :CONSOL AND COFA_CANTCR <> 0 INTO :tipoori;
                if (TIPOORI <> TIPODES) then
                    OK = 'S';
                END
            ELSE
                OK = 'S';
            if (OK = 'S') then
                BEGIN
                /* RECORRA LOS ITEMS PARA VER SI TODO ESTA USADO */
                FOR SELECT RVDE_ITEM FROM REMISIONES_VENTA_DETALLE WHERE REVT_ID = :ID ORDER BY RVDE_ITEM INTO :ITEM DO
                    BEGIN
                    EXECUTE procedure FALTANTE(TIPODOC, :TIPODES, :ID, :ITEM) returning_values (:FALTA, :UNIDAD, :FACTOR);
                    FALTAT = FALTAT + FALTA;
                    END
                if (FALTAT <> 0) then
                    SUSPEND;
                END
            END
        END
    END
  if (TIPODOC = 33) then /* DEVOLUCION */
    BEGIN
    FOR SELECT DEVT_ID, PREF_PRE, DEVT_NUMERO, DEVT_FECHA, 0, DEVT_SUCURSAL, VEND_COD
        FROM DEVOLUCIONES_VENTAS
        WHERE TERC_NIT = :NIT AND DEVT_FECHA <= :FECHA AND DEVT_ANULADO = 'N' AND ((DEVT_SUCURSAL = :SUCURSAL) or (:SUCURSAL = 'Todas'))
        INTO :ID, :PREFIJO, :NUMERO, :FECDOC, :VALIDEZ, :SUCUR, :VEND DO
        BEGIN
        EXECUTE PROCEDURE TOTAL_DOC_VENTAS(TIPODOC, ID) returning_values (SUBTOTAL, IVA, CONSUMO);
        TOTAL = SUBTOTAL + IVA + CONSUMO;
        SUSPEND;
        END
    END
  if (TIPODOC = 34) then /* PEDIDO */
    BEGIN
    FOR SELECT PEDI_ID, PREF_PRE, PEDI_NUMERO, PEDI_FECHA, PEDI_VALIDEZ, PEDI_SUCURSAL, VEND_COD
        FROM PEDIDOS
        WHERE ((TERC_NIT = :NIT) OR ((:traercontado = 'SI') AND (TERC_NIT IN (SELECT TERC_NIT FROM PUNTO_VENTA))))
        AND PEDI_FECHA <= :FECHA AND PEDI_FECHA+PEDI_VALIDEZ >= :FECHA AND PEDI_ANULADO = 'N' AND ((PEDI_SUCURSAL = :SUCURSAL) or (:SUCURSAL = 'Todas'))
        INTO :ID, :PREFIJO, :NUMERO, :FECDOC, :VALIDEZ, :SUCUR, :VEND DO
        BEGIN
        EXECUTE PROCEDURE TOTAL_DOC_VENTAS(TIPODOC, ID) returning_values (SUBTOTAL, IVA, CONSUMO);
        if (TIPODES <> 0) then
            BEGIN
            /* RECORRA LOS ITEMS PARA VER SI TODO ESTA USADO */
            FALTAT = 0;
            EXECUTE PROCEDURE lee_configuracion('FACTURACION','DOCUMENTOS','PERMITIR LLAMAR DOCUMENTOS PREVIAMENTE USADOS EN OTRO TIPO DE DOCUMENTO') returning_values (:USADO);
            if (USADO = 'NO') then
                SELECT COUNT(*) FROM consolide_faltantes WHERE CEFA_TIPOORI = 34 AND CEFA_IDORI = :ID AND CEFA_TIPODES <> :tipodes INTO :NUMROWS;
            ELSE
                NUMROWS = 0;
            if (NUMROWS = 0) then
                BEGIN
                SUBTOTAL = 0;
                IVA = 0;
                CONSUMO = 0;
                FOR SELECT PEDE_ITEM, PEDE_CANT * PEDE_FACTOR, PEDE_TOTAL-PEDE_IVAMONTO-PEDE_CONSUMO, PEDE_IVAMONTO, PEDE_CONSUMO
                    FROM PEDIDOS_DETALLE WHERE PEDI_ID = :ID ORDER BY PEDE_ITEM INTO :ITEM, :ITECAN, :ITESUB, :ITEIVA, :ITECON
                    DO
                    BEGIN
                    EXECUTE procedure FALTANTE(TIPODOC, :TIPODES, :ID, :ITEM) returning_values (:FALTA, :UNIDAD, :FACTOR);
                    FALTAT = FALTAT + FALTA;
                    if (ITECAN <> 0) then
                        BEGIN
                        SUBTOTAL = SUBTOTAL + cast(cast((ITESUB/ITECAN) as double precision) * cast(FALTA * FACTOR as double precision) as numeric(18, 2));
                        IVA = IVA + cast(cast((ITEIVA/ITECAN) as double precision) * cast(FALTA * FACTOR as double precision) as numeric(18, 2));
                        CONSUMO = CONSUMO + cast(cast((ITECON/ITECAN) as double precision) * cast(FALTA * FACTOR as double precision) as numeric(18, 2));
                        END
                    END
                END
            if (FALTAT <> 0) then
                BEGIN
                TOTAL = SUBTOTAL + IVA + CONSUMO;
                SUSPEND;
                END
            END
        ELSE
            SUSPEND;
        END
    END
  if (TIPODOC = 35) then /* COTIZACION */
    BEGIN
    FOR SELECT COTI_ID, PREF_PRE, COTI_NUMERO, COTI_FECHA, COTI_VALIDEZ, COTI_SUCURSAL, VEND_COD
        FROM cotizaciones
        WHERE ((TERC_NIT = :NIT) OR ((:traercontado = 'SI') AND (TERC_NIT IN (SELECT TERC_NIT FROM PUNTO_VENTA))))
        AND COTI_FECHA <= :FECHA AND COTI_FECHA+COTI_VALIDEZ >= :FECHA AND COTI_ANULADO = 'N'
        AND ((COTI_SUCURSAL = :SUCURSAL) or (:SUCURSAL = 'Todas'))
        INTO :ID, :PREFIJO, :NUMERO, :FECDOC, :VALIDEZ, :SUCUR, :VEND DO
        BEGIN
        EXECUTE PROCEDURE TOTAL_DOC_VENTAS(TIPODOC, ID) returning_values (SUBTOTAL, IVA, CONSUMO);
        TOTAL = SUBTOTAL + IVA + CONSUMO;
        if (TIPODES <> 0) then
            BEGIN
            /* RECORRA LOS ITEMS PARA VER SI TODO ESTA USADO */
            FALTAT = 0;
            EXECUTE PROCEDURE lee_configuracion('FACTURACION','DOCUMENTOS','PERMITIR LLAMAR DOCUMENTOS PREVIAMENTE USADOS EN OTRO TIPO DE DOCUMENTO') returning_values (:USADO);
            if (USADO = 'NO') then
                SELECT COUNT(*) FROM consolide_faltantes WHERE CEFA_TIPOORI = 35 AND CEFA_IDORI = :ID AND CEFA_TIPODES <> :tipodes INTO :NUMROWS;
            ELSE
                NUMROWS = 0;
            if (NUMROWS = 0) then
                FOR SELECT CTDE_ITEM FROM COTIZACIONES_DETALLE WHERE COTI_ID = :ID ORDER BY CTDE_ITEM INTO :ITEM DO
                    BEGIN
                    EXECUTE procedure FALTANTE(TIPODOC, :TIPODES, :ID, :ITEM) returning_values (:FALTA, :UNIDAD, :FACTOR);
                    FALTAT = FALTAT + FALTA;
                    END
            if (FALTAT <> 0) then
                SUSPEND;
            END
        ELSE
            SUSPEND;
        END
    END
if (TIPODOC = 40) then /* PENDIENTE */
    BEGIN
    FOR SELECT PEND_ID, PREF_PRE, PEND_NUMERO, PEND_FECHA, 0, PEND_SUCURSAL, VEND_COD
        FROM pendiente_ventas
        WHERE (TERC_NIT = :NIT) AND PEND_FECHA <= :FECHA AND PEND_ANULADO = 'N' AND ((PEND_SUCURSAL = :SUCURSAL) or (:SUCURSAL = 'Todas'))
        INTO :ID, :PREFIJO, :NUMERO, :FECDOC, :VALIDEZ, :SUCUR, :VEND DO
        BEGIN
        EXECUTE PROCEDURE TOTAL_DOC_VENTAS(TIPODOC, ID) returning_values (SUBTOTAL, IVA, CONSUMO);
        TOTAL = SUBTOTAL + IVA + CONSUMO;
        if (TIPODES <> 0) then
            BEGIN
            /* RECORRA LOS ITEMS PARA VER SI TODO ESTA USADO */
            FALTAT = 0;
            FOR SELECT pevd_item FROM pendiente_ventas_detalle WHERE PEND_ID = :ID ORDER BY PEVD_ITEM INTO :ITEM DO
                BEGIN
                EXECUTE procedure FALTANTE(TIPODOC, :TIPODES, :ID, :ITEM) returning_values (:FALTA, :UNIDAD, :FACTOR);
                FALTAT = FALTAT + FALTA;
                END
            if (FALTAT <> 0) then
                SUSPEND;
            END
        ELSE
            SUSPEND;
        END
    END
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE EXISTENCIAS_COMPRAS(
    ARTICULO VARCHAR(15),
    FECHA DATE,
    UNIDAD VARCHAR(8))
RETURNS (
    BODEGA VARCHAR(2),
    EXISTENCIA NUMERIC(18,2),
    RESERVADO NUMERIC(18,2),
    DISPONIBLE NUMERIC(18,2),
    ORDENADO NUMERIC(18,2),
    PROMEDIO NUMERIC(18,2),
    VENTAMES NUMERIC(18,2),
    VENTAANO NUMERIC(18,2),
    FECHACMP DATE,
    CANTCMP NUMERIC(18,2),
    DIAS INTEGER,
    SUGERIDO NUMERIC(18,2),
    STAND VARCHAR(20))
AS
declare variable factor numeric(15,4);
declare variable ordenc numeric(18,4);
declare variable pedido numeric(18,4);
declare variable item integer;
declare variable id integer;
declare variable und varchar(8);
declare variable cant numeric(18,4);
declare variable factor2 numeric(18,4);
declare variable fecini date;
declare variable fechaaux varchar(10);
declare variable agencia integer;
declare variable devmes numeric(18,2);
declare variable mfac integer;
declare variable mdev integer;
declare variable ivaf numeric(18,2);
declare variable ivad numeric(18,2);
declare variable dia_art varchar(2) character set none;
declare variable diasc varchar(255);
declare variable pedauto char(2);
declare variable salidas numeric(18,4);
declare variable fecrem date;
declare variable cantrem numeric(18,4);
declare variable DIASANO INTEGER;
declare variable BODINA CHAR(2);
begin
execute procedure lee_configuracion ('INVENTARIO', 'EXISTENCIAS', 'PROMEDIAR LAS SALIDAS DEL INVENTARIO CON EL NUMERO DE DIAS ASIGNADO A CADA ARTICULO') returning_values (:DIA_ART);
execute procedure lee_configuracion ('INVENTARIO', 'EXISTENCIAS', 'NUMERO DE DIAS PARA PROMEDIO DE SALIDAS POR ARTICULO') returning_values (DIASC);
execute procedure LEE_CONFIGURACION('FACTURACION', 'FACTURAS', 'GENERAR PEDIDO AUTOMATICAMENTE CON LA FACTURA') returning_values (pedauto);
EXECUTE PROCEDURE lee_configuracion ('INVENTARIO', 'EXISTENCIAS', 'MOSTRAR BODEGAS INACTIVAS EN CONSULTA DE EXISTENCIAS') returning_values (:BODINA);

for select bode_cod, SUCU_ID from bodega where ((bode_activa = 'S') or (:BODINA = 'SI')) order by bode_cod into :bodega, :agencia
    do
    begin
    execute procedure saldo_inventario (:articulo, :bodega, :fecha) returning_values (:Existencia);
    execute procedure FACTOR_UNIDAD_CANT(:ARTICULO, :UNIDAD) returning_values (:FACTOR);
    if (FACTOR <> 0) then
        EXISTENCIA = EXISTENCIA / FACTOR;
    else
        EXISTENCIA = 0;
    STAND = '';
    select STAND_COD from STANDS where ARTI_COD = :ARTICULO and STAND_BODEGA = :BODEGA into :stand;
    execute procedure salidas_ano_anterior (:ARTICULO, :FECHA, :BODEGA) returning_values (:ventaano);
    execute procedure promedio_salidas_articulo (:ARTICULO, :FECHA, :BODEGA) returning_values (:PROMEDIO, :SALIDAS);
    if (DIA_ART = 'NO') then
        begin
        DIAS = cast(DIASC as integer);
        end
    else
        select ARTI_DIAS from ARTICULO where ARTI_COD = :ARTICULO into :DIAS;
    if (DIAS is null) then
        DIAS = 0;
    PROMEDIO = DIAS * PROMEDIO;
    if (FACTOR <> 0) then
        PROMEDIO = PROMEDIO / FACTOR;
    SUGERIDO = PROMEDIO - EXISTENCIA;
    select sum(ORID_ENTREGAR)
      from ORDENINVENTARIO_DETALLE OD, ordenes_inventario O
      where O.ORIN_ID = OD.ORIN_ID and ARTI_COD = :ARTICULO and ORIN_FECHA <= :FECHA and ORIN_FECLLEGA >= :FECHA and ORID_ANULADO = 'N' and OD.BODE_COD = :BODEGA
      into :ORDENADO;
    if (ORDENADO is null) then
        ORDENADO = 0;
    ORDENC = 0;
    for select O.ORDC_ID, OCDE_ITEM, OCDE_CANT * OCDE_FACTOR
        from ORDENES_COMPRA O, ORDENES_COMPRA_DETALLE OD
        where O.ORDC_ID = OD.ORDC_ID and OD.ARTI_COD = :ARTICULO and (ORDC_FECHA+ORDC_VALIDEZ) >= :FECHA and ORDC_FECHA <= :FECHA and OCDE_ANULADO = 'N' and OD.BODE_COD = :BODEGA
        into :ID, :ITEM, :CANT
        do
        begin
        execute procedure FALTANTE(23, 21, ID, ITEM) returning_values (PEDIDO, UND, FACTOR2);
        if (PEDIDO * FACTOR2 = CANT) then /* SI NO SE HA FACTURADO MIRE A VER SI SE REMISIONO */
            execute procedure FALTANTE(23, 22, ID, ITEM) returning_values (PEDIDO, UND, FACTOR2);
        if (PEDIDO is null) then
            PEDIDO = 0;
        ORDENC = ORDENC + PEDIDO * FACTOR2;
        end
    ORDENADO = ORDENADO + ORDENC;
    if (FACTOR <> 0) then
        ORDENADO = ORDENADO / FACTOR;
    select sum(RSDE_LIBERAR)
      from RESERVAS_DETALLE RD, RESERVAS R
      where R.RESE_ID = RD.RESE_ID and ARTI_COD = :ARTICULO and RESE_FECHA <= :FECHA and RESE_VENCE >= :FECHA and RD.BODE_COD = :BODEGA and RSDE_ANULADO = 'N'
      into :RESERVADO;
    if (RESERVADO is null) then
        RESERVADO = 0;
    PEDIDO = 0;
    for select P.PEDI_ID, PEDE_ITEM, PEDE_CANT * PEDE_FACTOR
        from PEDIDOS P, PEDIDOS_DETALLE PD
        where P.PEDI_ID = PD.PEDI_ID and PD.ARTI_COD = :ARTICULO and (PEDI_FECHA+PEDI_VALIDEZ) >= :FECHA and PEDI_FECHA <= :FECHA and PEDE_ANULADO = 'N' and BODE_COD = :BODEGA
        into :ID, :ITEM, :CANT
        do
        begin
        execute procedure FALTANTE(34, 31, ID, ITEM) returning_values (ORDENC, UND, FACTOR2);
        if ((ORDENC * FACTOR2 = CANT) or (PEDAUTO = 'SI')) then /* SI NO SE HA FACTURADO MIRE A VER SI SE REMISIONO */
            execute procedure FALTANTE(34, 32, ID, ITEM) returning_values (ORDENC, UND, FACTOR2);
        if (ORDENC is null) then
            ORDENC = 0;
        PEDIDO = PEDIDO + ORDENC * FACTOR2;
        end
    RESERVADO = RESERVADO + PEDIDO;
    if (FACTOR <> 0) then
        RESERVADO = RESERVADO / FACTOR;
    DISPONIBLE = EXISTENCIA - RESERVADO;
    /* VENTAS MES */
    FECHAAUX = cast (FECHA as varchar(10));
    FECHAAUX = SUBSTR(FECHAAUX, 1, 7) || '/01';
    FECINI = cast (FECHAAUX as date);
    execute procedure ventas_articulo (:ARTICULO, :FECINI, :FECHA, :agencia, :bodega ) returning_values (:ventames, :mfac, :devmes, :mdev, :ivaf, :ivad);
    ventames = ventames - devmes;
    if (FACTOR <> 0) then
        ventames = ventames / FACTOR;
    /* FECHA COMPRA */
    fechacmp = null;
    cantcmp = 0;
    select first 1 FACO_FECHA, FCDE_CANT * FCDE_FACTOR from FACTURAS_COMPRA F, FACTURAS_COMPRAS_DETALLE D
        where F.FACO_ID = D.faco_id and D.ARTI_COD = :articulo and FACO_FECHA <= :FECHA and D.bode_cod = :BODEGA
        order by FACO_FECHA desc, F.FACO_ID desc
        into :fechacmp, :cantcmp;
    select first 1 REPR_FECHA, RPVD_CANT * RPVD_FACTOR from remision_proveedor F, remision_proveedor_det D
        where F.repr_id = D.repr_id and D.ARTI_COD = :articulo and REPR_FECHA <= :FECHA and D.bode_cod = :BODEGA
        order by REPR_FECHA desc, F.repr_id desc
        into :fecrem, :cantrem;
    if ((FECREM is not null) and (FECREM > fechacmp)) then
        begin
        fechacmp = FECREM;
        cantcmp = cantrem;
        end
    suspend;
    end
end
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE EXISTENCIAS_DESDE_HASTA(
    FECHA DATE,
    ARTINI VARCHAR(20),
    ARTFIN VARCHAR(20),
    GRPINI VARCHAR(3),
    GRPFIN VARCHAR(3),
    BODINI VARCHAR(2),
    BODFIN VARCHAR(2),
    ORDEN CHAR(1),
    AGRUPA CHAR(1),
    DETALLE CHAR(1),
    RESERVA CHAR(1),
    ENPESO CHAR(1),
    MASIVA CHAR(1),
    INACTIVOS CHAR(1),
    SUCURSAL INTEGER)
RETURNS (
    CANT NUMERIC(18,2),
    COSTO NUMERIC(18,2),
    COSTO_LOTE NUMERIC(18,2),
    CODIGO VARCHAR(15),
    NOMBRE VARCHAR(60),
    DESCORTA VARCHAR(30),
    UNIDAD VARCHAR(8),
    STAND VARCHAR(20),
    CODGRUPO VARCHAR(2),
    NOMGRUPO VARCHAR(30),
    CODSUBG VARCHAR(3),
    NOMSUBG VARCHAR(30),
    CODMARC VARCHAR(3),
    NOMMARC VARCHAR(30),
    INVIMA VARCHAR(20),
    CODBOD VARCHAR(2),
    LOTE VARCHAR(15),
    LOTEV DATE,
    NOMBOD VARCHAR(30),
    COSTOTOT NUMERIC(18,2),
    COSTOIVA NUMERIC(18,2),
    ULTCOSTO NUMERIC(18,2),
    FECHACOSTO DATE,
    CONSUMO NUMERIC(18,2),
    RESERVADO NUMERIC(18,4),
    ORDENADO NUMERIC(18,4),
    IVA NUMERIC(9,2),
    IVAMONTO NUMERIC(18,2),
    PESOUNIT NUMERIC(18,4),
    PESOTOTAL NUMERIC(18,4),
    PRECIO NUMERIC(18,2),
    CODBAR VARCHAR(20))
AS
declare variable exist char(1);
declare variable codini varchar(20);
declare variable codfin varchar(20);
declare variable desini varchar(20);
declare variable desfin varchar(20);
declare variable ordenc numeric(18,4);
declare variable pedido numeric(18,4);
declare variable ok char(1);
declare variable id integer;
declare variable item integer;
declare variable und varchar(8);
declare variable factor numeric(18,4);
declare variable cant2 numeric(18,4);
declare variable PEDAUTO CHAR(2);
DECLARE VARIABLE LISTA INTEGER;
declare variable FACCOST NUMERIC(18,4);
BEGIN
EXECUTE PROCEDURE lee_configuracion ('FACTURACION','FACTURAS', 'CODIGO DE LA LISTA DE PRECIOS A MOSTRAR EN ARTICULOS') returning_values (:LISTA);
if (ORDEN = 'C') then
    BEGIN
    CODINI = ARTINI;
    CODFIN = ARTFIN;
    DESINI = '';
    DESFIN = 'zz';
    END
ELSE
    BEGIN
    DESINI = ARTINI;
    DESFIN = ARTFIN;
    CODINI = '';
    CODFIN = 'zz';
    END
EXECUTE PROCEDURE LEE_CONFIGURACION('FACTURACION', 'FACTURAS', 'GENERAR PEDIDO AUTOMATICAMENTE CON LA FACTURA') returning_values (pedauto);
if ((DETALLE = 'B') or (DETALLE = 'L')) then
  BEGIN
  FOR SELECT ARTI_COD, ARTI_DES, ARTI_DESCORTA, ARTI_UNIDAD, ARTI_EXIST, TAIV_PORC, A.GRUP_COD, A.SUBG_COD, A.MARC_COD, BODE_COD, BODE_NOM, ARTI_CONSUMO, ARTI_PESO/1000, ARTI_INVIMA
      FROM ARTICULO A, BODEGA B, TARIFA_IVA T
      WHERE ARTI_COD >= :CODINI AND ARTI_COD <= :CODFIN AND ARTI_DES >= :DESINI AND ARTI_DES <= :DESFIN AND ((ESAR_COD <> 'I') or (:INACTIVOS = 'S')) AND BODE_COD >= :BODINI AND
      BODE_COD <= :BODFIN AND ((SUCU_ID = :SUCURSAL) or (:SUCURSAL = 0)) AND A.TAIV_COD = T.TAIV_COD
      INTO :CODIGO, :NOMBRE, :DESCORTA, :UNIDAD, :EXIST, :IVA, :CODGRUPO, :CODSUBG, :CODMARC, :CODBOD, :NOMBOD, :CONSUMO, :pesounit, :invima
      DO
        BEGIN
        STAND = '';
        OK = 'N';
        if (AGRUPA = 'G') then
            BEGIN
            if ((CODGRUPO >= GRPINI) AND (CODGRUPO <= GRPFIN)) then
                OK = 'S';
            end
        ELSE
            if (AGRUPA = 'M') then
                BEGIN
                if ((CODMARC >= GRPINI) AND (CODMARC <= GRPFIN)) then
                    OK = 'S';
                END
        if (OK = 'S') then
            BEGIN
            NOMGRUPO = '';
            NOMMARC = '';
            NOMSUBG = '';
            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;
            CODBAR = NULL;
            SELECT FIRST 1 COBA_COD FROM BARRAS_ARTICULO
                WHERE ARTI_COD = :codigo AND COBA_UNIDAD = :unidad ORDER BY STRLEN(COBA_COD) INTO :codbar;
            if (CODBAR IS NULL) then
                CODBAR = CODIGO;
            if (EXIST <> 'N') then
                BEGIN
                SELECT STAND_COD FROM STANDS WHERE ARTI_COD = :CODIGO AND STAND_BODEGA = :CODBOD INTO :STAND;
                EXECUTE PROCEDURE costo_promedio_y_ultimo_unidad(CODIGO, FECHA-1, UNIDAD) returning_values (COSTO, ULTCOSTO);
                /* EL FACTOR */
                FACCOST = 1;
                SELECT FIRST 1 FAIN_FACTOR FROM factor_inventario WHERE FAIN_FECINI <= :FECHA AND FAIN_FECFIN >= :FECHA INTO :FACCOST;
                ULTCOSTO = ULTCOSTO * FACCOST;
                COSTO = COSTO * FACCOST;

                SELECT FIRST 1 MVAR_FECHA FROM MOVIMIENTO_ARTICULO WHERE ARTI_COD = :CODIGO AND MVAR_ENTRADA = 'S' AND MVAR_FECHA <= :FECHA
                    ORDER BY ARTI_COD DESC, MVAR_FECHA DESC INTO :FECHACOSTO;
                
                if (CONSUMO <> 0) then
                    EXECUTE PROCEDURE CONSUMO_HISTORICO (:CODIGO, :fecha) returning_values (:CONSUMO);
                if (RESERVA = 'S') then
                    BEGIN
                    SELECT SUM(ORID_ENTREGAR)
                        FROM ORDENINVENTARIO_DETALLE OD, ordenes_inventario O
                        WHERE O.ORIN_ID = OD.ORIN_ID AND ARTI_COD = :CODIGO AND ORIN_FECHA <= :FECHA AND ORIN_FECLLEGA >= :FECHA AND ORID_ANULADO = 'N' AND OD.BODE_COD = :CODBOD
                        INTO :ORDENADO;
                    if (ORDENADO IS NULL) then
                        ORDENADO = 0;
                    ORDENC = 0;
                    FOR SELECT O.ORDC_ID, OCDE_ITEM, OCDE_CANT * OCDE_FACTOR
                        FROM ORDENES_COMPRA O, ORDENES_COMPRA_DETALLE OD
                        WHERE O.ORDC_ID = OD.ORDC_ID AND OD.ARTI_COD = :CODIGO AND ORDC_VENCE >= :FECHA AND ORDC_FECHA <= :FECHA AND OCDE_ANULADO = 'N' AND OD.BODE_COD = :CODBOD
                        INTO :ID, :ITEM, :CANT2
                        do
                        BEGIN
                        EXECUTE PROCEDURE FALTANTE(23, 21, ID, ITEM) returning_values (PEDIDO, UND, FACTOR);
                        if (PEDIDO * FACTOR = CANT2) then /* SI NO SE HA FACTURADO MIRE A VER SI SE REMISIONO */
                            EXECUTE PROCEDURE FALTANTE(23, 22, ID, ITEM) returning_values (PEDIDO, UND, FACTOR);
                        if (PEDIDO IS NULL) then
                            PEDIDO = 0;
                        ORDENC = ORDENC + PEDIDO * FACTOR;
                        END
                    ORDENADO = ORDENADO + ORDENC;
                    SELECT SUM(RSDE_LIBERAR)
                        FROM RESERVAS_DETALLE RD, RESERVAS R
                        WHERE R.RESE_ID = RD.RESE_ID AND ARTI_COD = :CODIGO AND RESE_FECHA <= :FECHA AND RESE_VENCE >= :FECHA AND RD.BODE_COD = :CODBOD AND RSDE_ANULADO = 'N'
                        INTO :RESERVADO;
                    if (RESERVADO IS NULL) then
                        RESERVADO = 0;
                    PEDIDO = 0;
                    FOR SELECT P.PEDI_ID, PEDE_ITEM, PEDE_CANT * PEDE_FACTOR
                        FROM PEDIDOS P, PEDIDOS_DETALLE PD
                        WHERE P.PEDI_ID = PD.PEDI_ID AND PD.ARTI_COD = :CODIGO AND PEDI_VENCE >= :FECHA AND PEDI_FECHA <= :FECHA AND PEDE_ANULADO = 'N' AND BODE_COD = :CODBOD
                        INTO :ID, :ITEM, :CANT2
                        do
                        BEGIN
                        EXECUTE PROCEDURE FALTANTE(34, 31, ID, ITEM) returning_values (ORDENC, UND, FACTOR);
                        if ((ORDENC * FACTOR = CANT2) or (PEDAUTO = 'SI')) then /* SI NO SE HA FACTURADO MIRE A VER SI SE REMISIONO */
                            EXECUTE PROCEDURE FALTANTE(34, 32, ID, ITEM) returning_values (ORDENC, UND, FACTOR);
                        if (ORDENC IS NULL) then
                            ORDENC = 0;
                        PEDIDO = PEDIDO + ORDENC * FACTOR;
                        END
                    RESERVADO = RESERVADO + PEDIDO;
                    END
                ELSE
                    BEGIN
                    RESERVADO = 0;
                    ORDENADO = 0;
                    END
                if (LISTA > 0) then
                    SELECT prar_fijo FROM precios_articulo WHERE arti_cod = :CODIGO and lipr_cod = :LISTA INTO :PRECIO;
                if ((DETALLE = 'L') AND (EXIST = 'L')) then
                    BEGIN
                    FOR SELECT L.lote_nro, L.lote_nro||' - '||L.lote_vence, l.lote_costo, LOTE_VENCE
                        FROM LOTES L WHERE ARTI_COD = :codigo AND BODE_COD = :codbod
                        INTO :LOTE, :NOMBOD, :costo_lote, :lotev
                        DO
                        BEGIN
                        if (CONSUMO <> 0) then
                            EXECUTE PROCEDURE CONSUMO_HISTORICO (:CODIGO, :fecha) returning_values (:CONSUMO);
                        execute procedure saldo_lote_fecha(:codigo, :codbod,  :lote,  :fecha-1) returning_values (:cant);
                        if (cant <> 0) then
                            begin
                            COSTOTOT = :CANT * :COSTO;
                            IVAMONTO = COSTOTOT /100 * IVA;
                            COSTOIVA = COSTOTOT;
                            if (MASIVA = 'S') then
                                BEGIN
                                COSTOIVA = COSTOTOT + IVAMONTO;
                                COSTO = COSTO * (100 + :IVA) / 100 + :CONSUMO;
                                END
                            CONSUMO = CONSUMO * CANT;
                            COSTOIVA = COSTOIVA + CONSUMO;
                            if (ENPESO = 'S') then
                                BEGIN
                                if (pesounit IS NULL) then
                                    pesounit = 0;
                                if (PESOUNIT <> 0) then
                                    BEGIN
                                    pesototal = PESOUNIT * cant;
                                    SUSPEND;
                                    END
                                END
                            ELSE
                                SUSPEND;
                            end
                        END
                    END
                else
                    BEGIN
                    EXECUTE PROCEDURE SALDO_INICIAL_INVENTARIO(CODIGO, FECHA, :CODBOD) returning_values (CANT);
                    COSTOTOT = :CANT * :COSTO;
                    IVAMONTO = COSTOTOT /100 * IVA;
                    COSTOIVA = COSTOTOT;
                    if (MASIVA = 'S') then
                        BEGIN
                        COSTOIVA = COSTOTOT + IVAMONTO;
                        COSTO = COSTO * (100 + :IVA) / 100 + :CONSUMO;
                        END
                    CONSUMO = CONSUMO * CANT;
                    COSTOIVA = COSTOIVA + CONSUMO;
                    if (ENPESO = 'S') then
                        BEGIN
                        if (pesounit IS NULL) then
                            pesounit = 0;
                        if (PESOUNIT <> 0) then
                            BEGIN
                            pesototal = PESOUNIT * cant;
                            SUSPEND;
                            END
                        END
                    ELSE
                        SUSPEND;
                    END
                END
            END
        END
  END

if (DETALLE = 'N') then
  BEGIN
  FOR SELECT ARTI_COD, ARTI_DES, ARTI_DESCORTA, ARTI_UNIDAD, ARTI_EXIST, TAIV_PORC, A.GRUP_COD, A.SUBG_COD, A.MARC_COD, ARTI_CONSUMO, ARTI_PESO/1000, ARTI_INVIMA
      FROM ARTICULO A, TARIFA_IVA T
      WHERE ARTI_COD >= :CODINI AND ARTI_COD <= :CODFIN AND ARTI_DES >= :DESINI AND ARTI_DES <= :DESFIN AND ((ESAR_COD <> 'I') or (:INACTIVOS = 'S')) AND A.TAIV_COD = T.TAIV_COD
      INTO :CODIGO, :NOMBRE, :DESCORTA, UNIDAD, :EXIST, :IVA, :CODGRUPO, :CODSUBG, :CODMARC, :CONSUMO, :pesounit, :invima
      DO
        BEGIN
        OK = 'N';
        if (AGRUPA = 'G') then
            BEGIN
            if ((GRPINI = '0') AND (GRPFIN = 'zz')) then
                OK = 'S';
            else
                if ((CODGRUPO >= GRPINI) AND (CODGRUPO <= GRPFIN)) then
                    OK = 'S';
            end
        ELSE
            if (AGRUPA = 'M') then
                BEGIN
                if ((GRPINI = '0') AND (GRPFIN = 'zzz')) then
                    OK = 'S';
                else
                    if ((CODMARC >= GRPINI) AND (CODMARC <= GRPFIN)) then
                        OK = 'S';
                END
        if (OK = 'S') then
            BEGIN
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            CODBAR = NULL;
            SELECT MAX(COBA_COD) FROM BARRAS_ARTICULO WHERE ARTI_COD = :codigo AND COBA_UNIDAD = :unidad INTO :codbar;
            if (CODBAR IS NULL) then
                CODBAR = CODIGO;

            if (EXIST <> 'N') then
                BEGIN
                EXECUTE PROCEDURE SALDO_INICIAL_TOTAL_INV(CODIGO, FECHA) returning_values (CANT);
                EXECUTE PROCEDURE costo_promedio_y_ultimo_unidad(CODIGO, FECHA-1, UNIDAD) returning_values (COSTO, ULTCOSTO);
                /* EL FACTOR */
                FACCOST = 1;
                SELECT FIRST 1 FAIN_FACTOR FROM factor_inventario WHERE FAIN_FECINI <= :FECHA AND FAIN_FECFIN >= :FECHA INTO :FACCOST;
                ULTCOSTO = ULTCOSTO * FACCOST;
                COSTO = COSTO * FACCOST;

                SELECT FIRST 1 MVAR_FECHA FROM MOVIMIENTO_ARTICULO WHERE ARTI_COD = :CODIGO AND MVAR_ENTRADA = 'S' AND MVAR_FECHA <= :FECHA
                    ORDER BY ARTI_COD DESC, MVAR_FECHA DESC INTO :FECHACOSTO;
                COSTOTOT = :CANT * :COSTO;
                IVAMONTO = COSTOTOT /100 * IVA;
                COSTOIVA = COSTOTOT;
                if (CONSUMO <> 0) then
                    EXECUTE PROCEDURE CONSUMO_HISTORICO (:CODIGO, :fecha) returning_values (:CONSUMO);
                if (MASIVA = 'S') then
                    BEGIN
                    COSTOIVA = COSTOTOT + IVAMONTO;
                    COSTO = COSTO * (100 + :IVA) / 100 + :CONSUMO;
                    END
                CONSUMO = CONSUMO * CANT;
                COSTOIVA = COSTOIVA + CONSUMO;
                if (RESERVA = 'S') then
                    BEGIN
                    SELECT SUM(ORID_ENTREGAR)
                        FROM ORDENINVENTARIO_DETALLE OD, ordenes_inventario O
                        WHERE O.ORIN_ID = OD.ORIN_ID AND ARTI_COD = :CODIGO AND ORIN_FECHA <= :FECHA AND ORIN_FECLLEGA >= :FECHA AND ORID_ANULADO = 'N'
                        INTO :ORDENADO;
                        if (ORDENADO IS NULL) then
                            ORDENADO = 0;
                    ORDENC = 0;
                    FOR SELECT O.ORDC_ID, OCDE_ITEM, OCDE_CANT * OCDE_FACTOR
                        FROM ORDENES_COMPRA O, ORDENES_COMPRA_DETALLE OD
                        WHERE O.ORDC_ID = OD.ORDC_ID AND OD.ARTI_COD = :CODIGO AND ORDC_VENCE >= :FECHA AND ORDC_FECHA <= :FECHA AND OCDE_ANULADO = 'N'
                        INTO :ID, :ITEM, :CANT2
                        do
                        BEGIN
                        EXECUTE PROCEDURE FALTANTE(23, 21, ID, ITEM) returning_values (PEDIDO, UND, FACTOR);
                        if (PEDIDO * FACTOR = CANT2) then /* SI NO SE HA FACTURADO MIRE A VER SI SE REMISIONO */
                            EXECUTE PROCEDURE FALTANTE(23, 22, ID, ITEM) returning_values (PEDIDO, UND, FACTOR);
                        if (PEDIDO IS NULL) then
                            PEDIDO = 0;
                        ORDENC = ORDENC + PEDIDO * FACTOR;
                        END
                    ORDENADO = ORDENADO + ORDENC;
                    SELECT SUM(RSDE_LIBERAR)
                        FROM RESERVAS_DETALLE RD, RESERVAS R
                        WHERE R.RESE_ID = RD.RESE_ID AND ARTI_COD = :CODIGO AND RESE_FECHA <= :FECHA AND RESE_VENCE >= :FECHA AND RSDE_ANULADO = 'N'
                        INTO :RESERVADO;
                    if (RESERVADO IS NULL) then
                        RESERVADO = 0;
                    PEDIDO = 0;
                    FOR SELECT P.PEDI_ID, PEDE_ITEM, PEDE_CANT * PEDE_FACTOR
                        FROM PEDIDOS P, PEDIDOS_DETALLE PD, PUNTO_VENTA PT
                        WHERE P.PEDI_ID = PD.PEDI_ID AND PD.ARTI_COD = :CODIGO AND PT.ptvt_id = P.PTVT_ID AND PEDI_VENCE >= :FECHA AND PEDI_FECHA <= :FECHA AND PEDE_ANULADO = 'N'
                        INTO :ID, :ITEM, :CANT2
                        do
                        BEGIN
                        EXECUTE PROCEDURE FALTANTE(34, 31, ID, ITEM) returning_values (ORDENC, UND, FACTOR);
                        if ((ORDENC * FACTOR = CANT2) or (PEDAUTO = 'SI')) then /* SI NO SE HA FACTURADO MIRE A VER SI SE REMISIONO */
                            EXECUTE PROCEDURE FALTANTE(34, 32, ID, ITEM) returning_values (ORDENC, UND, FACTOR);
                        if (ORDENC IS NULL) then
                            ORDENC = 0;
                        PEDIDO = PEDIDO + ORDENC * FACTOR;
                        END
                    if (PEDIDO IS NULL) then
                        PEDIDO = 0;
                    RESERVADO = RESERVADO + PEDIDO;
                    END
                ELSE
                    BEGIN
                    RESERVADO = 0;
                    ORDENADO = 0;
                    END
                if (LISTA > 0) then
                    SELECT prar_fijo FROM precios_articulo WHERE arti_cod = :CODIGO and lipr_cod = :LISTA INTO :PRECIO;

                if (ENPESO = 'S') then
                    BEGIN
                    if (pesounit IS NULL) then
                        pesounit = 0;
                    if (PESOUNIT <> 0) then
                        BEGIN
                        pesototal = PESOUNIT * cant;
                        SUSPEND;
                        END
                    END
                ELSE
                    SUSPEND;
                END
            END
        END
  END
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE EXISTENCIAS_UNIDAD(
    ARTICULO VARCHAR(15),
    FECHA DATE,
    UNIDAD VARCHAR(8))
RETURNS (
    BODEGA VARCHAR(2),
    EXISTENCIA NUMERIC(18,2),
    RESERVADO NUMERIC(18,2),
    DISPONIBLE NUMERIC(18,2),
    ORDENADO NUMERIC(18,2),
    STAND VARCHAR(20))
AS
declare variable FACTOR NUMERIC(15,4);
declare variable ORDENC NUMERIC(18,4);
declare variable PEDIDO NUMERIC(18,4);
declare variable ITEM INTEGER;
declare variable ID INTEGER;
declare variable UND VARCHAR(8);
declare variable CANT NUMERIC(18,4);
declare variable factor2 NUMERIC(18,4);
declare variable PEDAUTO CHAR(2);
declare variable BODINA CHAR(2);
BEGIN
EXECUTE PROCEDURE FACTOR_UNIDAD_CANT(:ARTICULO, :UNIDAD) returning_values (:FACTOR);
EXECUTE PROCEDURE lee_configuracion ('INVENTARIO', 'EXISTENCIAS', 'MOSTRAR BODEGAS INACTIVAS EN CONSULTA DE EXISTENCIAS') returning_values (:BODINA);
for select bode_cod from bodega where ((bode_activa = 'S') or (:BODINA = 'SI')) order by bode_cod into :bodega
    do
    begin
    SELECT STAND_COD FROM STANDS WHERE ARTI_COD = :ARTICULO AND STAND_BODEGA = :BODEGA INTO :stand;
    execute procedure saldo_inventario (:articulo, :bodega, :fecha) returning_values (:Existencia);
    if (FACTOR <> 0) then
        EXISTENCIA = EXISTENCIA / FACTOR;
    else
        EXISTENCIA = 0;
    /* LO ORDENADO */
    SELECT SUM(ORID_ENTREGAR)
      FROM ORDENINVENTARIO_DETALLE OD, ordenes_inventario O
      WHERE O.ORIN_ID = OD.ORIN_ID AND ARTI_COD = :ARTICULO AND ORIN_FECHA <= :FECHA AND ORIN_FECLLEGA >= :FECHA AND ORID_ANULADO = 'N' AND OD.BODE_COD = :BODEGA
      INTO :ORDENADO;
    if (ORDENADO IS NULL) then
        ORDENADO = 0;
    ORDENC = 0;
    FOR SELECT O.ORDC_ID, OCDE_ITEM, OCDE_CANT * OCDE_FACTOR
        FROM ORDENES_COMPRA O, ORDENES_COMPRA_DETALLE OD
        WHERE O.ORDC_ID = OD.ORDC_ID AND OD.ARTI_COD = :ARTICULO AND (ORDC_FECHA+ORDC_VALIDEZ) >= :FECHA AND ORDC_FECHA <= :FECHA AND OCDE_ANULADO = 'N' AND OD.BODE_COD = :BODEGA
        INTO :ID, :ITEM, :CANT
        do
        BEGIN
        EXECUTE PROCEDURE FALTANTE(23, 21, ID, ITEM) returning_values (PEDIDO, UND, FACTOR2);
        if (PEDIDO * FACTOR2 = CANT) then /* SI NO SE HA FACTURADO MIRE A VER SI SE REMISIONO */
            EXECUTE PROCEDURE FALTANTE(23, 22, ID, ITEM) returning_values (PEDIDO, UND, FACTOR2);
        if (PEDIDO IS NULL) then
            PEDIDO = 0;
        ORDENC = ORDENC + PEDIDO * FACTOR2;
        END
    ORDENADO = ORDENADO + ORDENC;
    if (FACTOR <> 0) then
        ORDENADO = ORDENADO / FACTOR;
    /* LO RESERVADO */
    SELECT SUM(RSDE_LIBERAR)
      FROM RESERVAS_DETALLE RD, RESERVAS R
      WHERE R.RESE_ID = RD.RESE_ID AND ARTI_COD = :ARTICULO AND RESE_FECHA <= :FECHA AND RESE_VENCE >= :FECHA AND RD.BODE_COD = :BODEGA AND RSDE_ANULADO = 'N'
      INTO :RESERVADO;
    if (RESERVADO IS NULL) then
        RESERVADO = 0;
    PEDIDO = 0;
    FOR SELECT P.PEDI_ID, PEDE_ITEM, PEDE_CANT * PEDE_FACTOR
        FROM PEDIDOS P, PEDIDOS_DETALLE PD
        WHERE P.PEDI_ID = PD.PEDI_ID AND PD.ARTI_COD = :ARTICULO AND (PEDI_FECHA+PEDI_VALIDEZ) >= :FECHA AND PEDI_FECHA <= :FECHA AND PEDE_ANULADO = 'N' AND BODE_COD = :BODEGA
        INTO :ID, :ITEM, :CANT
        do
        BEGIN
        EXECUTE PROCEDURE FALTANTE(34, 31, ID, ITEM) returning_values (ORDENC, UND, FACTOR2);
        EXECUTE PROCEDURE LEE_CONFIGURACION('FACTURACION', 'FACTURAS', 'GENERAR PEDIDO AUTOMATICAMENTE CON LA FACTURA') returning_values (pedauto);
        if ((ORDENC * FACTOR2 = CANT) or (PEDAUTO = 'SI')) then /* SI NO SE HA FACTURADO MIRE A VER SI SE REMISIONO */
            EXECUTE PROCEDURE FALTANTE(34, 32, ID, ITEM) returning_values (ORDENC, UND, FACTOR2);
        if (ORDENC IS NULL) then
            ORDENC = 0;
        PEDIDO = PEDIDO + ORDENC * FACTOR2;
        END
    RESERVADO = RESERVADO + PEDIDO;
    if (FACTOR <> 0) then
        RESERVADO = RESERVADO / FACTOR;
    DISPONIBLE = EXISTENCIA - RESERVADO;
    SUSPEND;
    end
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE EXISTENCIAS_WEB(
    ARTICULO VARCHAR(15),
    FECHA DATE)
RETURNS (
    BODEGA VARCHAR(2),
    EXISTENCIA NUMERIC(18,2),
    RESERVADO NUMERIC(18,2),
    DISPONIBLE NUMERIC(18,2),
    ORDENADO NUMERIC(18,2))
AS
declare variable ordenc numeric(18,4);
declare variable pedido numeric(18,4);
declare variable item integer;
declare variable id integer;
declare variable und varchar(8);
declare variable cant numeric(18,4);
declare variable factor2 numeric(18,4);
begin
for select bode_cod from bodega order by bode_cod into :bodega
    do
    begin
    execute procedure saldo_inventario (:articulo, :bodega, :fecha) returning_values (:Existencia);
    select sum(ORID_ENTREGAR)
      from ORDENINVENTARIO_DETALLE OD, ordenes_inventario O
      where O.ORIN_ID = OD.ORIN_ID and ARTI_COD = :ARTICULO and ORIN_FECHA <= :FECHA and ORIN_FECLLEGA >= :FECHA and ORID_ANULADO = 'N' and OD.BODE_COD = :BODEGA
      into :ORDENADO;
    if (ORDENADO is null) then
        ORDENADO = 0;
    ORDENC = 0;
    for select O.ORDC_ID, OCDE_ITEM, OCDE_CANT * OCDE_FACTOR
        from ORDENES_COMPRA O, ORDENES_COMPRA_DETALLE OD
        where O.ORDC_ID = OD.ORDC_ID and OD.ARTI_COD = :ARTICULO and (ORDC_FECHA+ORDC_VALIDEZ) >= :FECHA and ORDC_FECHA <= :FECHA and OCDE_ANULADO = 'N' and OD.BODE_COD = :BODEGA
        into :ID, :ITEM, :CANT
        do
        begin
        execute procedure FALTANTE(23, 21, ID, ITEM) returning_values (PEDIDO, UND, FACTOR2);
        if (PEDIDO * FACTOR2 = CANT) then /* SI NO SE HA FACTURADO MIRE A VER SI SE REMISIONO */
            execute procedure FALTANTE(23, 22, ID, ITEM) returning_values (PEDIDO, UND, FACTOR2);
        if (PEDIDO is null) then
            PEDIDO = 0;
        ORDENC = ORDENC + PEDIDO * FACTOR2;
        end
    ORDENADO = ORDENADO + ORDENC;
    select sum(RSDE_LIBERAR)
      from RESERVAS_DETALLE RD, RESERVAS R
      where R.RESE_ID = RD.RESE_ID and ARTI_COD = :ARTICULO and RESE_FECHA <= :FECHA and RESE_VENCE >= :FECHA and RD.BODE_COD = :BODEGA and RSDE_ANULADO = 'N'
      into :RESERVADO;
    if (RESERVADO is null) then
        RESERVADO = 0;
    PEDIDO = 0;
    for select P.PEDI_ID, PEDE_ITEM, PEDE_CANT * PEDE_FACTOR
        from PEDIDOS P, PEDIDOS_DETALLE PD
        where P.PEDI_ID = PD.PEDI_ID and PD.ARTI_COD = :ARTICULO and (PEDI_FECHA+PEDI_VALIDEZ) >= :FECHA and PEDI_FECHA <= :FECHA and PEDE_ANULADO = 'N' and BODE_COD = :BODEGA
        into :ID, :ITEM, :CANT
        do
        begin
        execute procedure FALTANTE(34, 31, ID, ITEM) returning_values (ORDENC, UND, FACTOR2);
        if (ORDENC * FACTOR2 = CANT) then /* SI NO SE HA FACTURADO MIRE A VER SI SE REMISIONO */
            execute procedure FALTANTE(34, 32, ID, ITEM) returning_values (ORDENC, UND, FACTOR2);
        if (ORDENC is null) then
            ORDENC = 0;
        PEDIDO = PEDIDO + ORDENC * FACTOR2;
        end
    RESERVADO = RESERVADO + PEDIDO;
    DISPONIBLE = EXISTENCIA - RESERVADO;
    suspend;
    end
end
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE FALTANTES_VENTAS_ARTICULO(
    DESDE VARCHAR(20),
    HASTA VARCHAR(20),
    FECINI DATE,
    FECFIN DATE,
    DETALLE CHAR(1),
    TIPO INTEGER,
    DESTINO INTEGER,
    ORDEN CHAR(1),
    CEROS CHAR(1),
    CORTE DATE,
    SUCURSAL INTEGER)
RETURNS (
    ARTICULO VARCHAR(15),
    DESCRIPCION VARCHAR(60),
    CODGRUPO VARCHAR(2),
    NOMGRUPO VARCHAR(30),
    CODSUBG VARCHAR(3),
    NOMSUBG VARCHAR(30),
    CODMARC VARCHAR(3),
    NOMMARC VARCHAR(30),
    CANTIDAD NUMERIC(18,4),
    UNIDAD VARCHAR(8),
    FALTANTE NUMERIC(18,4),
    BASE NUMERIC(18,2),
    COSTOUN NUMERIC(18,2),
    COSTOTOT NUMERIC(18,2),
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(8),
    FECHA DATE,
    PTVTA INTEGER,
    NIT VARCHAR(20),
    NOMCLIENTE VARCHAR(60),
    CIUDAD VARCHAR(60),
    OBS VARCHAR(255),
    BOD VARCHAR(2))
AS
declare variable ID INTEGER;
declare variable ITEM INTEGER;
declare variable CANT NUMERIC(18,2);
declare variable CODINI VARCHAR(15);
declare variable CODFIN VARCHAR(15);
declare variable DESINI VARCHAR(15);
declare variable DESFIN VARCHAR(15);
declare variable MONTO NUMERIC(18,2);
declare variable FACTOR NUMERIC(18,4);
BEGIN
if (ORDEN = 'C') then
    BEGIN
    CODINI = DESDE;
    CODFIN = HASTA;
    DESINI = '';
    DESFIN = 'zz';
    END
ELSE
    BEGIN
    DESINI = DESDE;
    DESFIN = HASTA;
    CODINI = '';
    CODFIN = 'zz';
    END
  FOR SELECT ARTI_COD, ARTI_DES, ARTI_UNIDAD, A.GRUP_COD, A.SUBG_COD, A.MARC_COD FROM ARTICULO A
      WHERE ARTI_COD >= :CODINI AND ARTI_COD <= :CODFIN AND ARTI_DES >= :DESINI AND ARTI_DES <= :DESFIN
      INTO :ARTICULO, :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
  DO
    BEGIN
    CANTIDAD = 0;
    faltante = 0;
    base = 0;
    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 (DETALLE = 'N') then
        BEGIN
        if (TIPO = 31) then
            BEGIN
            FOR SELECT F.FACT_ID, FADE_ITEM, FADE_CANT * FADE_FACTOR, (FADE_PRUNIT-FADE_DTOMONTO), D.BODE_COD, F.ptvt_id
                FROM FACTURAS_DETALLE D, FACTURAS F, PREFIJOS P
                WHERE F.FACT_ID = D.FACT_ID AND ARTI_COD = :ARTICULO AND FACT_FECHA >= :FECINI AND FACT_FECHA <= :FECFIN AND FACT_ANULADO = 'N' AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 31 AND ((SUCU_ID = :SUCURSAL) or (:SUCURSAL = 0)) and substring(arti_cod from 1 FOR 2) <> '.t'
                ORDER BY F.FACT_ID, FADE_ITEM INTO :ID, :ITEM, :CANT, :MONTO, :BOD, :PTVTA
                DO
                BEGIN
                CANTIDAD = CANTIDAD + CANT;
                EXECUTE PROCEDURE FALTANTE_CORTE(:TIPO, :DESTINO, :ID, :ITEM, :CORTE) returning_values (:CANT, :UNIDAD, :FACTOR);
                FALTANTE = FALTANTE + CANT;
                BASE = BASE + MONTO * CANT;
                END
            execute procedure costo_promedio(:articulo, :corte) returning_values (:costoun);
            costotot = CANTIDAD * costoun;
            END
        if (TIPO = 32) then
            BEGIN
            FOR SELECT R.revt_id, rvde_item, RVDE_CANT * RVDE_FACTOR, (RVDE_PRUNIT-RVDE_DTOMONTO), D.bode_cod, R.ptvt_id
                FROM REMISIONES_VENTA_DETALLE D, REMISIONES_VENTA R, PREFIJOS P
                WHERE R.REVT_ID = D.REVT_ID AND ARTI_COD = :ARTICULO AND REVT_FECHA >= :FECINI AND REVT_FECHA <= :FECFIN AND REVT_ANULADO = 'N' AND P.PREF_PRE = R.PREF_PRE AND P.TIDO_COD = 32  AND ((SUCU_ID = :SUCURSAL) or (:SUCURSAL = 0))
                ORDER BY R.REVT_ID, RVDE_ITEM INTO :ID, :ITEM, :CANT, :MONTO, :BOD, :PTVTA
                DO
                BEGIN
                CANTIDAD = CANTIDAD + CANT;
                EXECUTE PROCEDURE FALTANTE_CORTE(:TIPO, :DESTINO, :ID, :ITEM, :CORTE) returning_values (:CANT, :UNIDAD, :FACTOR);
                FALTANTE = FALTANTE + CANT;
                BASE = BASE + MONTO * CANT;
                END
            execute procedure costo_promedio(:articulo, :corte) returning_values (:costoun);
            costotot = CANTIDAD * costoun;
            END
        if (TIPO = 34) then
            BEGIN
            FOR SELECT P.PEDI_ID, PEDE_ITEM, PEDE_CANT * PEDE_FACTOR, (PEDE_PRUNIT-PEDE_DTOMONTO), D.bode_cod, P.ptvt_id
                FROM PEDIDOS_DETALLE D, PEDIDOS P, PREFIJOS R
                WHERE P.PEDI_ID = D.PEDI_ID AND ARTI_COD = :ARTICULO AND PEDI_FECHA >= :FECINI AND PEDI_FECHA <= :FECFIN AND PEDI_VALIDEZ >= 0
                AND PEDI_ANULADO = 'N' AND P.PREF_PRE = R.PREF_PRE AND R.TIDO_COD = 34  AND ((SUCU_ID = :SUCURSAL) or (:SUCURSAL = 0))
                ORDER BY P.PEDI_ID, PEDE_ITEM INTO :ID, :ITEM, :CANT, :MONTO, :bod, :PTVTA
                DO
                BEGIN
                CANTIDAD = CANTIDAD + CANT;
                EXECUTE PROCEDURE FALTANTE_CORTE(:TIPO, :DESTINO, :ID, :ITEM, :CORTE) returning_values (:CANT, :UNIDAD, :FACTOR);
                FALTANTE = FALTANTE + CANT;
                BASE = BASE + MONTO * CANT;
                END
            execute procedure costo_promedio(:articulo, :corte) returning_values (:costoun);
            costotot = CANTIDAD * costoun;
            END
        if (TIPO = 35) then
            BEGIN
            FOR SELECT C.COTI_ID, CTDE_ITEM, CTDE_CANT * CTDE_FACTOR, (CTDE_PRUNIT-CTDE_DTOMONTO), C.ptvt_id
                FROM COTIZACIONES_DETALLE D, COTIZACIONES C, PREFIJOS P
                WHERE C.COTI_ID = D.COTI_ID AND ARTI_COD = :ARTICULO AND COTI_FECHA >= :FECINI AND COTI_FECHA <= :FECFIN AND COTI_ANULADO = 'N' AND P.PREF_PRE = C.PREF_PRE AND P.TIDO_COD = 35  AND ((SUCU_ID = :SUCURSAL) or (:SUCURSAL = 0))
                ORDER BY C.COTI_ID, CTDE_ITEM INTO :ID, :ITEM, :CANT, :MONTO, :PTVTA
                DO
                BEGIN
                BOD = '';
                CANTIDAD = CANTIDAD + CANT;
                EXECUTE PROCEDURE FALTANTE_CORTE(:TIPO, :DESTINO, :ID, :ITEM, :CORTE) returning_values (:CANT, :UNIDAD, :FACTOR);
                FALTANTE = FALTANTE + CANT;
                BASE = BASE + MONTO * CANT;
                END
            execute procedure costo_promedio(:articulo, :corte) returning_values (:costoun);
            costotot = CANTIDAD * costoun;
            END
        if (TIPO = 40) then
            BEGIN
            FOR SELECT P.pend_id, D.pevd_item, D.pevd_cant * D.pevd_factor, (D.pevd_prunit-D.pevd_dtomonto), D.bode_cod
                FROM pendiente_ventas_detalle D, pendiente_ventas P, PREFIJOS R
                WHERE P.pend_id = D.pend_id AND ARTI_COD = :ARTICULO AND PEND_FECHA >= :FECINI AND PEND_FECHA <= :FECFIN AND
                PEND_ANULADO = 'N' AND P.PREF_PRE = R.PREF_PRE AND R.TIDO_COD = 40  AND ((SUCU_ID = :SUCURSAL) or (:SUCURSAL = 0))
                ORDER BY P.pend_id, D.pevd_item INTO :ID, :ITEM, :CANT, :MONTO, :bod
                DO
                BEGIN
                CANTIDAD = CANTIDAD + CANT;
                EXECUTE PROCEDURE FALTANTE(:TIPO, :DESTINO, :ID, :ITEM) returning_values (:CANT, :UNIDAD, :FACTOR);
                FALTANTE = FALTANTE + CANT;
                BASE = BASE + MONTO * CANT;
                END
            execute procedure costo_promedio(:articulo, :corte) returning_values (:costoun);
            costotot = CANTIDAD * costoun;
            END
        if (CANTIDAD IS NULL) then
            CANTIDAD = 0;
        if (BASE IS NULL) then
            BASE = 0;
        if (FALTANTE IS NULL) then
            FALTANTE = 0;
        if (CEROS = 'S') then
            SUSPEND;
        ELSE
            if (FALTANTE <> 0) then
                SUSPEND;
        END
    ELSE
        BEGIN
        if (TIPO = 31) then
            FOR SELECT F.FACT_ID, FADE_ITEM, F.PREF_PRE, FACT_NUMERO, FACT_FECHA, FADE_CANT * FADE_FACTOR, (FADE_PRUNIT-FADE_DTOMONTO), SUBSTRING(FACT_OBS FROM 1 FOR 255), D.bode_cod, F.ptvt_id, F.terc_nit, F.fact_nomcliente
                FROM FACTURAS F, FACTURAS_DETALLE D, PREFIJOS P
                WHERE F.FACT_ID = D.FACT_ID AND ARTI_COD = :ARTICULO AND FACT_FECHA >= :FECINI AND FACT_FECHA <= :FECFIN AND FACT_ANULADO = 'N' AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 31 AND ((SUCU_ID = :SUCURSAL) or (:SUCURSAL = 0)) and substring(arti_cod from 1 FOR 2) <> '.t'
                ORDER BY F.FACT_ID, FADE_ITEM
                INTO :ID, :ITEM, :PREFIJO, :NUMERO, :FECHA, :CANTIDAD, :BASE, :OBS, :bod, :PTVTA, :nit, :nomcliente
                DO
                    BEGIN
                    EXECUTE PROCEDURE FALTANTE_CORTE(:TIPO, :DESTINO, :ID, :ITEM, :CORTE) returning_values (:FALTANTE, :UNIDAD, :FACTOR);
                    if ((CEROS = 'S') or (FALTANTE <> 0)) then
                        BEGIN
                        CIUDAD = '';
                        SELECT CIUD_NOM FROM CIUDADES C, TERCEROS T WHERE T.terc_nit = :NIT AND T.ciud_cod = C.ciud_cod INTO :CIUDAD;
                        execute procedure costo_promedio(:articulo, :corte) returning_values (:costoun);
                        costotot = CANTIDAD * costoun;
                        SUSPEND;
                        END
                    END
        if (TIPO = 32) then
            FOR SELECT R.REVT_ID, RVDE_ITEM, R.PREF_PRE, REVT_NUMERO, REVT_FECHA, RVDE_CANT * RVDE_FACTOR, (RVDE_PRUNIT-RVDE_DTOMONTO), SUBSTRING(REVT_OBS FROM 1 FOR 255), D.bode_cod, R.ptvt_id, R.terc_nit, R.revt_nomterc
                FROM REMISIONES_VENTA R, REMISIONES_VENTA_DETALLE D, PREFIJOS P
                WHERE R.REVT_ID = D.REVT_ID AND ARTI_COD = :ARTICULO AND REVT_FECHA >= :FECINI AND REVT_FECHA <= :FECFIN AND REVT_ANULADO = 'N' AND P.PREF_PRE = R.PREF_PRE AND P.TIDO_COD = 32 AND ((SUCU_ID = :SUCURSAL) or (:SUCURSAL = 0))
                INTO :ID, :ITEM, :PREFIJO, :NUMERO, :FECHA, :CANTIDAD, :BASE, :OBS, :bod, :PTVTA, :nit, :nomcliente
                DO
                    BEGIN
                    EXECUTE PROCEDURE FALTANTE_CORTE(:TIPO, :DESTINO, :ID, :ITEM, :CORTE) returning_values (:FALTANTE, :UNIDAD, :FACTOR);
                    if ((CEROS = 'S') or (FALTANTE <> 0)) then
                        BEGIN
                        CIUDAD = '';
                        SELECT CIUD_NOM FROM CIUDADES C, TERCEROS T WHERE T.terc_nit = :NIT AND T.ciud_cod = C.ciud_cod INTO :CIUDAD;
                        execute procedure costo_promedio(:articulo, :corte) returning_values (:costoun);
                        costotot = CANTIDAD * costoun;
                        SUSPEND;
                        END
                    END
        if (TIPO = 34) then
            FOR SELECT P.PEDI_ID, PEDE_ITEM, P.PREF_PRE, PEDI_NUMERO, PEDI_FECHA, PEDE_CANT * PEDE_FACTOR, (PEDE_PRUNIT-PEDE_DTOMONTO), SUBSTRING(PEDI_OBS FROM 1 FOR 255), D.bode_cod, P.ptvt_id, P.terc_nit, P.pedi_nomterc
                FROM PEDIDOS P, PEDIDOS_DETALLE D, PREFIJOS R
                WHERE P.PEDI_ID = D.PEDI_ID AND ARTI_COD = :ARTICULO AND PEDI_FECHA >= :FECINI AND PEDI_FECHA <= :FECFIN AND PEDI_VALIDEZ >= 0
                AND PEDI_ANULADO = 'N' AND P.PREF_PRE = R.PREF_PRE AND R.TIDO_COD = 34 AND ((SUCU_ID = :SUCURSAL) or (:SUCURSAL = 0))
                INTO :ID, :ITEM, PREFIJO, :NUMERO, :FECHA, :CANTIDAD, :BASE, :OBS, :bod, :PTVTA, :nit, :nomcliente
                DO
                    BEGIN
                    EXECUTE PROCEDURE FALTANTE_CORTE(:TIPO, :DESTINO, :ID, :ITEM, :CORTE) returning_values (:FALTANTE, :UNIDAD, :FACTOR);
                    if ((CEROS = 'S') or (FALTANTE <> 0)) then
                        BEGIN
                        CIUDAD = '';
                        SELECT CIUD_NOM FROM CIUDADES C, TERCEROS T WHERE T.terc_nit = :NIT AND T.ciud_cod = C.ciud_cod INTO :CIUDAD;
                        execute procedure costo_promedio(:articulo, :corte) returning_values (:costoun);
                        costotot = CANTIDAD * costoun;
                        SUSPEND;
                        END
                    END
        if (TIPO = 35) then
            FOR SELECT C.COTI_ID, CTDE_ITEM, C.PREF_PRE, COTI_NUMERO, COTI_FECHA, CTDE_CANT * CTDE_FACTOR, (CTDE_PRUNIT-CTDE_DTOMONTO), SUBSTRING(COTI_OBS FROM 1 FOR 255), C.ptvt_id, C.terc_nit, C.coti_nomterc
                FROM COTIZACIONES C, COTIZACIONES_DETALLE D, PREFIJOS P
                WHERE C.COTI_ID = D.COTI_ID AND ARTI_COD = :ARTICULO AND COTI_FECHA >= :FECINI AND COTI_FECHA <= :FECFIN AND COTI_ANULADO = 'N' AND P.PREF_PRE = C.PREF_PRE AND P.TIDO_COD = 35 AND ((SUCU_ID = :SUCURSAL) or (:SUCURSAL = 0))
                INTO :ID, :ITEM, PREFIJO, :NUMERO, :FECHA, :CANTIDAD, :BASE, :OBS, :PTVTA, :nit, :nomcliente
                DO
                    BEGIN
                    BOD = '';
                    EXECUTE PROCEDURE FALTANTE_CORTE(:TIPO, :DESTINO, :ID, :ITEM, :CORTE) returning_values (:FALTANTE, :UNIDAD, :FACTOR);
                    if ((CEROS = 'S') or (FALTANTE <> 0)) then
                        BEGIN
                        CIUDAD = '';
                        SELECT CIUD_NOM FROM CIUDADES C, TERCEROS T WHERE T.terc_nit = :NIT AND T.ciud_cod = C.ciud_cod INTO :CIUDAD;
                        execute procedure costo_promedio(:articulo, :corte) returning_values (:costoun);
                        costotot = CANTIDAD * costoun;
                        SUSPEND;
                        END
                    END
        if (TIPO = 40) then
            FOR SELECT P.pend_id, D.pevd_item, P.PREF_PRE, P.pend_numero, PEND_FECHA, D.pevd_cant * D.pevd_factor, (D.pevd_prunit-D.pevd_dtomonto), SUBSTRING(P.pend_obs FROM 1 FOR 255), D.bode_cod
                FROM pendiente_ventas P, pendiente_ventas_detalle D, PREFIJOS R
                WHERE P.pend_id = D.pend_id AND ARTI_COD = :ARTICULO AND PEND_FECHA >= :FECINI AND PEND_FECHA <= :FECFIN AND PEND_ANULADO = 'N'
                AND P.PREF_PRE = R.PREF_PRE AND R.TIDO_COD = 40 AND ((SUCU_ID = :SUCURSAL) or (:SUCURSAL = 0))
                INTO :ID, :ITEM, PREFIJO, :NUMERO, :FECHA, :CANTIDAD, :BASE, :OBS, :bod
                DO
                    BEGIN
                    EXECUTE PROCEDURE FALTANTE(:TIPO, :DESTINO, :ID, :ITEM) returning_values (:FALTANTE, :UNIDAD, :FACTOR);
                    if ((CEROS = 'S') or (FALTANTE <> 0)) then
                        BEGIN
                        CIUDAD = '';
                        SELECT CIUD_NOM FROM CIUDADES C, TERCEROS T WHERE T.terc_nit = :NIT AND T.ciud_cod = C.ciud_cod INTO :CIUDAD;
                        execute procedure costo_promedio(:articulo, :corte) returning_values (:costoun);
                        costotot = CANTIDAD * costoun;
                        SUSPEND;
                        END
                    END
        END
    END
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE FALTANTE_DOCUMENTO(
    TIPORI INTEGER,
    TIPDES INTEGER,
    IDORI INTEGER)
RETURNS (
    ARTI VARCHAR(20),
    DES VARCHAR(60),
    CANT NUMERIC(18,4),
    UNIDAD VARCHAR(8),
    BOD VARCHAR(2),
    PRUNIT NUMERIC(18,2),
    DTO NUMERIC(9,2),
    TOTAL NUMERIC(18,2))
AS
declare variable ITEM INTEGER;
declare variable FACTOR NUMERIC(18,4);
begin
    if (TIPORI = 21) then
        BEGIN
        FOR SELECT FCDE_ITEM, FCDE_CODBAR, FCDE_DESC, BODE_COD, FCDE_PRUNIT, FCDE_DTOPORC, FCDE_TOTAL FROM FACTURAS_COMPRAS_DETALLE
            WHERE FACO_ID = :IDORI ORDER BY FCDE_ITEM INTO :ITEM, :ARTI, :DES, :BOD, :PRUNIT, :DTO, :TOTAL DO
            BEGIN
            EXECUTE PROCEDURE faltante(:TIPORI, :TIPDES, :IDORI, :ITEM) returning_values (:CANT, :UNIDAD, :FACTOR);
            if (CANT <> 0) then
                SUSPEND;
            END
        END
    if (TIPORI = 22) then
        BEGIN
        FOR SELECT RPVD_ITEM, RPVD_CODBAR, RPVD_DESC, BODE_COD, RPVD_PRUNIT, RPVD_DTOPORC, RPVD_TOTAL  FROM remision_proveedor_det
            WHERE REPR_ID = :IDORI ORDER BY RPVD_ITEM INTO :ITEM, :ARTI, :DES, :BOD, :PRUNIT, :DTO, :TOTAL DO
            BEGIN
            EXECUTE PROCEDURE faltante(:TIPORI, :TIPDES, :IDORI, :ITEM) returning_values (:CANT, :UNIDAD, :FACTOR);
            if (CANT <> 0) then
                SUSPEND;
            END
        END
    if (TIPORI = 23) then
        BEGIN
        FOR SELECT OCDE_ITEM, OCDE_CODBAR, OCDE_DESC, BODE_COD, OCDE_PRUNIT, OCDE_DTOPORC, OCDE_TOTAL FROM ORDENES_COMPRA_DETALLE
            WHERE ORDC_ID = :IDORI ORDER BY OCDE_ITEM INTO :ITEM, :ARTI, :DES, :BOD, :PRUNIT, :DTO, :TOTAL DO
            BEGIN
            EXECUTE PROCEDURE faltante(:TIPORI, :TIPDES, :IDORI, :ITEM) returning_values (:CANT, :UNIDAD, :FACTOR);
            if (CANT <> 0) then
                SUSPEND;
            END
        END
    if (TIPORI = 25) then
        BEGIN
        FOR SELECT CPRD_ITEM, CPRD_CODBAR, CPRD_DESC, BODE_COD, CPRD_PRUNIT, CPRD_DTOPORC, CPRD_TOTAL FROM COTIZACIONES_PROVEEDOR_DET
            WHERE COPR_ID = :IDORI ORDER BY CPRD_ITEM INTO :ITEM, :ARTI, :DES, :BOD, :PRUNIT, :DTO, :TOTAL DO
            BEGIN
            EXECUTE PROCEDURE faltante(:TIPORI, :TIPDES, :IDORI, :ITEM) returning_values (:CANT, :UNIDAD, :FACTOR);
            if (CANT <> 0) then
                SUSPEND;
            END
        END
    if (TIPORI = 31) then
        BEGIN
        FOR SELECT FADE_ITEM, FADE_CODBAR, FADE_DESC, BODE_COD, FADE_PRUNIT, FADE_DTOPORC, FADE_TOTAL FROM FACTURAS_DETALLE
            WHERE FACT_ID = :IDORI and substring(arti_cod from 1 FOR 2) <> '.t' ORDER BY FADE_ITEM INTO :ITEM, :ARTI, :DES, :BOD, :PRUNIT, :DTO, :TOTAL DO
            BEGIN
            EXECUTE PROCEDURE faltante(:TIPORI, :TIPDES, :IDORI, :ITEM) returning_values (:CANT, :UNIDAD, :FACTOR);
            if (CANT <> 0) then
                SUSPEND;
            END
        END
    if (TIPORI = 32) then
        BEGIN
        FOR SELECT RVDE_ITEM, RVDE_CODBAR, RVDE_DESC, BODE_COD, RVDE_PRUNIT, RVDE_DTOPORC, RVDE_TOTAL FROM remisiones_venta_detalle
            WHERE REVT_ID = :IDORI ORDER BY RVDE_ITEM INTO :ITEM, :ARTI, :DES, :BOD, :PRUNIT, :DTO, :TOTAL DO
            BEGIN
            EXECUTE PROCEDURE faltante(:TIPORI, :TIPDES, :IDORI, :ITEM) returning_values (:CANT, :UNIDAD, :FACTOR);
            if (CANT <> 0) then
                SUSPEND;
            END
        END
    if (TIPORI = 34) then
        BEGIN
        FOR SELECT PEDE_ITEM, PEDE_CODBAR, PEDE_DESC, BODE_COD, PEDE_PRUNIT, PEDE_DTOPORC, PEDE_TOTAL FROM PEDIDOS_DETALLE
            WHERE PEDI_ID = :IDORI ORDER BY PEDE_ITEM INTO :ITEM, :ARTI, :DES, :BOD, :PRUNIT, :DTO, :TOTAL DO
            BEGIN
            EXECUTE PROCEDURE faltante(:TIPORI, :TIPDES, :IDORI, :ITEM) returning_values (:CANT, :UNIDAD, :FACTOR);
            if (CANT <> 0) then
                SUSPEND;
            END
        END
    if (TIPORI = 35) then
        BEGIN
        FOR SELECT CTDE_ITEM, CTDE_CODBAR, CTDE_DESC, CTDE_PRUNIT, CTDE_DTOPORC, CTDE_TOTAL FROM COTIZACIONES_DETALLE
            WHERE COTI_ID = :IDORI ORDER BY CTDE_ITEM INTO :ITEM, :ARTI, :DES, :PRUNIT, :DTO, :TOTAL DO
            BEGIN
            EXECUTE PROCEDURE faltante(:TIPORI, :TIPDES, :IDORI, :ITEM) returning_values (:CANT, :UNIDAD, :FACTOR);
            if (CANT <> 0) then
                SUSPEND;
            END
        END
    if (TIPORI = 40) then
        BEGIN
        FOR SELECT PEVD_ITEM, PEVD_CORBAR, PEVD_DESC, PEVD_PRUNIT, PEVD_DTOPORC, PEVD_TOTAL FROM pendiente_ventas_detalle
            WHERE PEND_ID = :IDORI ORDER BY PEVD_ITEM INTO :ITEM, :ARTI, :DES, :PRUNIT, :DTO, :TOTAL DO
            BEGIN
            EXECUTE PROCEDURE faltante(:TIPORI, :TIPDES, :IDORI, :ITEM) returning_values (:CANT, :UNIDAD, :FACTOR);
            if (CANT <> 0) then
                SUSPEND;
            END
        END
end
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE ORDENES_ARTICULO(
    FECHA DATE,
    DETALLE CHAR(1))
RETURNS (
    CODIGO VARCHAR(15),
    NOMBRE VARCHAR(60),
    ORDEN NUMERIC(18,4),
    EXIST NUMERIC(18,2),
    SUMA NUMERIC(18,2),
    COSTO NUMERIC(18,2),
    UNIDAD VARCHAR(8),
    CODGRUPO VARCHAR(2),
    NOMGRUPO VARCHAR(30),
    CODSUBG VARCHAR(3),
    NOMSUBG VARCHAR(30),
    CODMARC VARCHAR(3),
    NOMMARC VARCHAR(30),
    COSTOTOT NUMERIC(18,2),
    CLIENTE VARCHAR(60),
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(8),
    FECHADOC DATE)
AS
declare variable ORDENC NUMERIC(18,4);
declare variable ID INTEGER;
declare variable ITEM INTEGER;
declare variable UND VARCHAR(8);
declare variable FACTOR NUMERIC(18,4);
declare variable FACT NUMERIC(18,4);
declare variable CANT NUMERIC(18,4);
BEGIN
  FOR
    SELECT ARTI_COD, ARTI_DES, ARTI_UNIDAD, A.GRUP_COD, A.SUBG_COD, A.MARC_COD
      FROM ARTICULO A
      INTO :CODIGO, :NOMBRE, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
      DO
        BEGIN
        EXECUTE PROCEDURE SALDO_TOTAL_INVENTARIO(CODIGO, FECHA) returning_values (EXIST);
        EXECUTE PROCEDURE COSTO_PROMEDIO(CODIGO, FECHA) returning_values (COSTO);
        if (DETALLE = 'N') then
            BEGIN
            NOMMARC = '';
            NOMSUBG = '';
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            SELECT SUM(ORID_ENTREGAR) FROM ordenes_inventario O, ordeninventario_detalle OD
                WHERE O.ORIN_ID = OD.ORIN_ID AND OD.ARTI_COD = :CODIGO AND ORIN_FECHA <= :FECHA AND ORIN_FECLLEGA >= :FECHA AND ORIN_ANULADO = 'N'
                INTO :ORDEN;
            if (ORDEN IS NULL) then
                ORDEN = 0;
            FOR SELECT O.ORDC_ID, OCDE_ITEM, OCDE_CANT * OCDE_FACTOR
                FROM ORDENES_COMPRA O, ORDENES_COMPRA_DETALLE OD
                WHERE O.ORDC_ID = OD.ORDC_ID AND OD.ARTI_COD = :CODIGO AND (ORDC_FECHA+ORDC_VALIDEZ) >= :FECHA AND ORDC_FECHA <= :FECHA AND ORDC_ANULADO = 'N'
                INTO :ID, :item, :CANT
                DO
                BEGIN
                EXECUTE PROCEDURE FALTANTE(23, 21, ID, ITEM) returning_values (ORDENC, UND, FACT);
                if (ORDENC * FACT = CANT) then
                    EXECUTE PROCEDURE FALTANTE(23, 22, ID, ITEM) returning_values (ORDENC, UND, FACT);
                if (ORDENC IS NULL) then
                    ORDENC = 0;
                if (ORDENC <> 0) then
                    BEGIN
                    ORDEN = ORDEN + ORDENC;
                    END
                END
            SUMA = ORDEN + EXIST;
            COSTOTOT = ORDEN * :COSTO;
            if (ORDEN <> 0) then
                SUSPEND;
            END
        ELSE
            BEGIN
            FOR SELECT ORIN_FECHA, PREF_PRE, ORIN_NUMERO, ORIN_NOMTERC, ORID_CANT, ORID_UNIDAD, ORID_ENTREGAR
                FROM ordenes_inventario O, ordeninventario_detalle OD
                WHERE O.ORIN_ID = OD.ORIN_ID AND OD.ARTI_COD = :CODIGO AND ORIN_FECHA <= :FECHA AND ORIN_FECLLEGA > :FECHA AND ORIN_ANULADO = 'N'
                INTO :FECHADOC, :PREFIJO, :NUMERO, :CLIENTE, :EXIST, :UNIDAD, :ORDEN
                DO
                BEGIN
                COSTOTOT = ORDEN * :COSTO;
                SUSPEND;
                END
            FOR SELECT O.ORDC_ID, OCDE_ITEM, ORDC_FECHA, PREF_PRE, ORDC_NUMERO, TERC_NOM, OCDE_CANT, OCDE_UNIDAD, OCDE_ORDENADO, OCDE_FACTOR
                FROM ordenes_compra O, ordenes_compra_detalle OD, TERCEROS T
                WHERE O.ORDC_ID = OD.ORDC_ID AND OD.ARTI_COD = :CODIGO AND O.TERC_NIT = T.TERC_NIT AND ORDC_FECHA <= :FECHA AND (ORDC_FECHA+ordc_validez) > :FECHA AND ORDC_ANULADO = 'N'
                INTO :ID, :ITEM, :FECHADOC, :PREFIJO, :NUMERO, :CLIENTE, :CANT, :UNIDAD, :ORDEN, :FACTOR
                DO
                BEGIN
                EXECUTE PROCEDURE FALTANTE(23, 21, ID, ITEM) returning_values (ORDEN, UND, FACT);
                if (ORDEN * FACT = CANT * FACTOR) then
                    EXECUTE PROCEDURE FALTANTE(23, 22, ID, ITEM) returning_values (ORDEN, UND, FACTOR);
                if (ORDEN IS NULL) then
                    ORDEN = 0;
                COSTOTOT = ORDEN * :COSTO;
                if (ORDEN <> 0) then
                    SUSPEND;
                END
            END
        END
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE ORDENES_ARTICULO_FECHA(
    ARTICULO VARCHAR(15),
    FECHA DATE)
RETURNS (
    FECORD DATE,
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(8),
    FECLLEGA DATE,
    PROVEEDOR VARCHAR(60),
    CANTIDAD NUMERIC(18,2),
    UNIDAD VARCHAR(8),
    TIPO INTEGER,
    ID INTEGER)
AS
declare variable ITEM INTEGER;
declare variable FACTOR NUMERIC(18,4);
declare variable UND VARCHAR(8);
declare variable FACT NUMERIC(18,4);
declare variable ORDENC NUMERIC(18,4);
BEGIN
TIPO = 18;
  /* MUESTRA LAS RESERVAS DEL ARTICULO QUE NO SE HAN VENCIDO */
  FOR SELECT OI.ORIN_ID, ORIN_FECHA, PREF_PRE, ORIN_NUMERO, ORIN_FECLLEGA, ORIN_NOMTERC, ORID_CANT, ORID_UNIDAD
    FROM ORDENES_INVENTARIO OI, ORDENINVENTARIO_DETALLE OD
    WHERE OI.ORIN_ID = OD.ORIN_ID AND OD.ARTI_COD = :ARTICULO AND OI.ORIN_FECLLEGA > :FECHA AND ORIN_FECHA <= :FECHA AND ORID_ANULADO = 'N'
    INTO :ID, :FECORD, :PREFIJO, :NUMERO, :FECLLEGA, :PROVEEDOR, :CANTIDAD, :UNIDAD
        DO
          SUSPEND;
TIPO = 23;
  FOR SELECT O.ORDC_ID, OCDE_ITEM, ORDC_FECHA, PREF_PRE, ORDC_NUMERO, (ORDC_FECHA+ORDC_VALIDEZ), TERC_NOM, OCDE_CANT, OCDE_UNIDAD
    FROM ORDENES_COMPRA O, ORDENES_COMPRA_DETALLE OD, TERCEROS T
    WHERE O.ORDC_ID = OD.ORDC_ID AND OD.ARTI_COD = :ARTICULO AND O.TERC_NIT = T.TERC_NIT AND (ORDC_FECHA+ORDC_VALIDEZ) > :FECHA AND ORDC_FECHA <= :FECHA AND ORDC_ANULADO = 'N'
    INTO :ID, :item, :FECORD, :PREFIJO, :NUMERO, :FECLLEGA, :PROVEEDOR, :CANTIDAD, :UNIDAD
        DO
        BEGIN
        EXECUTE PROCEDURE FALTANTE(23, 21, ID, ITEM) returning_values (ORDENC, UND, FACT);
        if (ORDENC = CANTIDAD) then
            EXECUTE PROCEDURE FALTANTE(23, 22, ID, ITEM) returning_values (ORDENC, UND, FACTOR);
        if (ORDENC IS NULL) then
            ORDENC = 0;
        if (ORDENC <> 0) then
            BEGIN
            CANTIDAD = ORDENC;
            UNIDAD = UND;
            SUSPEND;
            END
        END
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE ORDEN_PROVEEDOR(
    NIT VARCHAR(20),
    FECHA DATE)
RETURNS (
    ARTICULO VARCHAR(20),
    DESCRIPCION VARCHAR(60),
    UNIDAD VARCHAR(8),
    BODEGA VARCHAR(2),
    EXISTENCIA NUMERIC(18,4),
    RESERVADO NUMERIC(18,4),
    ORDENADO NUMERIC(18,4),
    PROMEDIO NUMERIC(18,4),
    VENTAMES NUMERIC(18,4),
    FECHACMP DATE,
    DIAS INTEGER,
    SUGERIDO NUMERIC(18,4),
    STAND VARCHAR(20))
AS
declare variable FACTOR NUMERIC(15,4);
declare variable ORDENC NUMERIC(18,4);
declare variable PEDIDO NUMERIC(18,4);
declare variable ITEM INTEGER;
declare variable ID INTEGER;
declare variable UND VARCHAR(8);
declare variable CANT NUMERIC(18,4);
declare variable FACTOR2 NUMERIC(18,4);
declare variable fecini DATE;
declare variable FECHAAUX VARCHAR(10);
declare variable DEVMES NUMERIC(18,2);
declare variable DIA_ART VARCHAR(2) CHARACTER SET NONE;
declare variable DIASC VARCHAR(255);
declare variable PEDAUTO CHAR(2);
declare variable SALIDAS NUMERIC(18,4);
BEGIN
FOR SELECT A.ARTI_COD, A.ARTI_DES, A.ARTI_UNIDAD FROM ARTICULO A, proveedor_articulo P
  WHERE A.arti_cod = P.arti_cod AND P.terc_nit = :NIT INTO :articulo, :descripcion, :unidad
  DO
  for select bode_cod from bodega into :bodega
    do
    begin
    execute procedure saldo_inventario (:articulo, :bodega, :fecha) returning_values (:Existencia);
    EXECUTE PROCEDURE FACTOR_UNIDAD_CANT(:ARTICULO, :UNIDAD) returning_values (:FACTOR);
    if (FACTOR <> 0) then
        EXISTENCIA = EXISTENCIA / FACTOR;
    else
        EXISTENCIA = 0;
    SELECT STAND_COD FROM STANDS WHERE ARTI_COD = :articulo AND STAND_BODEGA = :bodega INTO :STAND;
    EXECUTE PROCEDURE promedio_salidas_articulo (:ARTICULO, :FECHA, :BODEGA) returning_values (:PROMEDIO, :SALIDAS);
    EXECUTE PROCEDURE lee_configuracion ('INVENTARIO', 'EXISTENCIAS', 'PROMEDIAR LAS SALIDAS DEL INVENTARIO CON EL NUMERO DE DIAS ASIGNADO A CADA ARTICULO') returning_values (:DIA_ART);
    if (DIA_ART = 'NO') then
        BEGIN
        EXECUTE PROCEDURE lee_configuracion ('INVENTARIO', 'EXISTENCIAS', 'NUMERO DE DIAS PARA PROMEDIO DE SALIDAS POR ARTICULO') returning_values (DIASC);
        DIAS = CAST(DIASC AS INTEGER);
        END
    ELSE
        SELECT ARTI_DIAS FROM ARTICULO WHERE ARTI_COD = :ARTICULO INTO :DIAS;
    if (DIAS is null) then
        DIAS = 0;
    PROMEDIO = DIAS * PROMEDIO;
    if (FACTOR <> 0) then
        PROMEDIO = PROMEDIO / FACTOR;
    SUGERIDO = PROMEDIO - EXISTENCIA;
    SELECT SUM(ORID_ENTREGAR)
      FROM ORDENINVENTARIO_DETALLE OD, ordenes_inventario O
      WHERE O.ORIN_ID = OD.ORIN_ID AND ARTI_COD = :ARTICULO AND ORIN_FECHA <= :FECHA AND ORIN_FECLLEGA >= :FECHA AND ORID_ANULADO = 'N' AND OD.BODE_COD = :BODEGA
      INTO :ORDENADO;
    if (ORDENADO IS NULL) then
        ORDENADO = 0;
    ORDENC = 0;
    FOR SELECT O.ORDC_ID, OCDE_ITEM, OCDE_CANT * OCDE_FACTOR
        FROM ORDENES_COMPRA O, ORDENES_COMPRA_DETALLE OD
        WHERE O.ORDC_ID = OD.ORDC_ID AND OD.ARTI_COD = :ARTICULO AND (ORDC_FECHA+ORDC_VALIDEZ) >= :FECHA AND ORDC_FECHA <= :FECHA AND OCDE_ANULADO = 'N' AND OD.BODE_COD = :BODEGA
        INTO :ID, :ITEM, :CANT
        do
        BEGIN
        EXECUTE PROCEDURE FALTANTE(23, 21, ID, ITEM) returning_values (PEDIDO, UND, FACTOR2);
        if (PEDIDO * FACTOR2 = CANT) then /* SI NO SE HA FACTURADO MIRE A VER SI SE REMISIONO */
            EXECUTE PROCEDURE FALTANTE(23, 22, ID, ITEM) returning_values (PEDIDO, UND, FACTOR2);
        if (PEDIDO IS NULL) then
            PEDIDO = 0;
        ORDENC = ORDENC + PEDIDO * FACTOR2;
        END
    ORDENADO = ORDENADO + ORDENC;
    if (FACTOR <> 0) then
        ORDENADO = ORDENADO / FACTOR;
    SELECT SUM(RSDE_LIBERAR)
      FROM RESERVAS_DETALLE RD, RESERVAS R
      WHERE R.RESE_ID = RD.RESE_ID AND ARTI_COD = :ARTICULO AND RESE_FECHA <= :FECHA AND RESE_VENCE >= :FECHA AND RD.BODE_COD = :BODEGA AND RSDE_ANULADO = 'N'
      INTO :RESERVADO;
    if (RESERVADO IS NULL) then
        RESERVADO = 0;
    PEDIDO = 0;
    FOR SELECT P.PEDI_ID, PEDE_ITEM, PEDE_CANT * PEDE_FACTOR
        FROM PEDIDOS P, PEDIDOS_DETALLE PD
        WHERE P.PEDI_ID = PD.PEDI_ID AND PD.ARTI_COD = :ARTICULO AND (PEDI_FECHA+PEDI_VALIDEZ) >= :FECHA AND PEDI_FECHA <= :FECHA AND PEDE_ANULADO = 'N' AND BODE_COD = :BODEGA
        INTO :ID, :ITEM, :CANT
        do
        BEGIN
        EXECUTE PROCEDURE FALTANTE(34, 31, ID, ITEM) returning_values (ORDENC, UND, FACTOR2);
        EXECUTE PROCEDURE LEE_CONFIGURACION('FACTURACION', 'FACTURAS', 'GENERAR PEDIDO AUTOMATICAMENTE CON LA FACTURA') returning_values (pedauto);
        if ((ORDENC * FACTOR2 = CANT) or (PEDAUTO = 'SI')) then /* SI NO SE HA FACTURADO MIRE A VER SI SE REMISIONO */
            EXECUTE PROCEDURE FALTANTE(34, 32, ID, ITEM) returning_values (ORDENC, UND, FACTOR2);
        if (ORDENC IS NULL) then
            ORDENC = 0;
        PEDIDO = PEDIDO + ORDENC * FACTOR2;
        END
    RESERVADO = RESERVADO + PEDIDO;
    if (FACTOR <> 0) then
        RESERVADO = RESERVADO / FACTOR;
    /* VENTAS MES */
    FECHAAUX = CAST (FECHA AS VARCHAR(10));
    FECHAAUX = SUBSTR(FECHAAUX, 1, 7) || '/01';
    FECINI = CAST (FECHAAUX AS DATE);
    /* VENTAS MENSUALES */
    SELECT SUM(FADE_CANT * FADE_FACTOR)
        FROM FACTURAS_DETALLE D, FACTURAS F, punto_venta P
        WHERE F.FACT_ID = D.FACT_ID AND ARTI_COD = :ARTICULO AND FACT_FECHA >= :FECINI AND FACT_FECHA < :FECHA AND FACT_ANULADO = 'N'
        AND P.ptvt_id = F.ptvt_id AND P.bode_cod = :bodega INTO :ventames;
    SELECT SUM(DVDE_CANT * DVDE_FACTOR)
        FROM DEVOLUCIONES_VENTAS F, devoluciones_ventas_DETALLE D, punto_venta P
        WHERE F.DEVT_ID = D.DEVT_ID AND ARTI_COD = :ARTICULO AND DEVT_FECHA >= :FECINI AND DEVT_FECHA < :FECHA AND DEVT_ANULADO = 'N'
        AND P.ptvt_id = F.ptvt_id AND P.bode_cod = :bodega INTO :devmes;
    if (ventames IS NULL) then
        ventames = 0;
    if (devmes IS NULL) then
        devmes = 0;
    ventames = ventames - devmes;
    if (FACTOR <> 0) then
        ventames = ventames / FACTOR;
    /* FECHA COMPRA */
    SELECT MAX(FACO_FECHA) FROM FACTURAS_COMPRA F, FACTURAS_COMPRAS_DETALLE D
        WHERE F.FACO_ID = D.faco_id AND D.ARTI_COD = :articulo AND FACO_FECHA <= :FECHA AND D.bode_cod = :BODEGA
        INTO :fechacmp;
    SUSPEND;
    end
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE ORDEN_SUGERIDA_TOTAL(
    PROVEEDOR VARCHAR(20),
    CODBOD VARCHAR(2),
    FECHA DATE)
RETURNS (
    ARTICULO VARCHAR(15),
    DESCRIPCION VARCHAR(60),
    BODEGA VARCHAR(2),
    UNIDAD VARCHAR(8),
    EXISTENCIA NUMERIC(18,2),
    RESERVADO NUMERIC(18,2),
    ORDENADO NUMERIC(18,2),
    PROMEDIO NUMERIC(18,2),
    VENTAMES NUMERIC(18,2),
    FECHACMP DATE,
    CANTCMP NUMERIC(18,2),
    SUGERIDO NUMERIC(18,2),
    COSTO NUMERIC(18,2),
    DIAS INTEGER)
AS
declare variable PEDAUTO char(2);
declare variable FACTOR NUMERIC(15,4);
declare variable DIA_ART VARCHAR(2) CHARACTER SET NONE;
declare variable DIASC VARCHAR(255);
declare variable SALIDAS NUMERIC(18,4);
declare variable MARCA VARCHAR(10);
declare variable ORDENC numeric(18,4);
declare variable PEDIDO numeric(18,4);
declare variable ITEM integer;
declare variable ID integer;
declare variable UND varchar(8);
declare variable CANT numeric(18,4);
declare variable FACTOR2 numeric(18,4);
declare variable fecini date;
declare variable FECHAAUX varchar(10);
declare variable DEVMES numeric(18,2);
declare variable MFAC integer;
declare variable MDEV integer;
declare variable IVAF numeric(18,2);
declare variable IVAD numeric(18,2);
declare variable UNABOD VARCHAR(7);
BEGIN
execute procedure lee_configuracion('COMPRAS', 'ORDENES', 'ORDEN SUGERIDA POR BODEGA O GENERAL') returning_values (:UNABOD);
FOR SELECT a.ARTI_COD, ARTI_DES, PVAR_COSTO, ARTI_UNIDAD, ARTI_DIAS FROM proveedor_articulo p, articulo a
    WHERE p.arti_cod = a.arti_cod and TERC_NIT = :proveedor and esar_cod <> 'I' order by a.arti_des
    INTO :articulo, :DESCRIPCION, :costo, :unidad, :DIAS
  DO BEGIN
  for select bode_cod from bodega where BODE_ACTIVA = 'S' AND ((:UNABOD = 'GENERAL') or (BODE_COD = :CODBOD)) into :bodega
    do
    begin
    execute procedure saldo_inventario (:articulo, :bodega, :fecha) returning_values (:Existencia);
    EXECUTE PROCEDURE FACTOR_UNIDAD_CANT(:ARTICULO, :UNIDAD) returning_values (:FACTOR);
    if (FACTOR <> 0) then
        EXISTENCIA = EXISTENCIA / FACTOR;
    else
        EXISTENCIA = 0;
    EXECUTE PROCEDURE promedio_salidas_articulo (:ARTICULO, :FECHA, :BODEGA) returning_values (:PROMEDIO, :SALIDAS);
    EXECUTE PROCEDURE lee_configuracion ('INVENTARIO', 'EXISTENCIAS', 'PROMEDIAR LAS SALIDAS DEL INVENTARIO CON EL NUMERO DE DIAS ASIGNADO A CADA ARTICULO') returning_values (:DIA_ART);
    if (DIA_ART = 'NO') then
        BEGIN
        EXECUTE PROCEDURE lee_configuracion ('INVENTARIO', 'EXISTENCIAS', 'NUMERO DE DIAS PARA PROMEDIO DE SALIDAS POR ARTICULO') returning_values (DIASC);
        DIAS = CAST(DIASC AS INTEGER);
        END
    if (DIAS is null) then
        DIAS = 0;
    PROMEDIO = DIAS * PROMEDIO;
    if (FACTOR <> 0) then
        PROMEDIO = PROMEDIO / FACTOR;
    SUGERIDO = PROMEDIO - EXISTENCIA;
    select sum(ORID_ENTREGAR)
      from ORDENINVENTARIO_DETALLE OD, ordenes_inventario O
      where O.ORIN_ID = OD.ORIN_ID and ARTI_COD = :ARTICULO and ORIN_FECHA <= :FECHA and ORIN_FECLLEGA >= :FECHA and ORID_ANULADO = 'N' and OD.BODE_COD = :BODEGA
      into :ORDENADO;
    if (ORDENADO is null) then
        ORDENADO = 0;
    ORDENC = 0;
    for select O.ORDC_ID, OCDE_ITEM, OCDE_CANT * OCDE_FACTOR
        from ORDENES_COMPRA O, ORDENES_COMPRA_DETALLE OD
        where O.ORDC_ID = OD.ORDC_ID and OD.ARTI_COD = :ARTICULO and (ORDC_FECHA+ORDC_VALIDEZ) >= :FECHA and ORDC_FECHA <= :FECHA and OCDE_ANULADO = 'N' and OD.BODE_COD = :BODEGA
        into :ID, :ITEM, :CANT
        do
        begin
        execute procedure FALTANTE(23, 21, ID, ITEM) returning_values (PEDIDO, UND, FACTOR2);
        if (PEDIDO * FACTOR2 = CANT) then /* SI NO SE HA FACTURADO MIRE A VER SI SE REMISIONO */
            execute procedure FALTANTE(23, 22, ID, ITEM) returning_values (PEDIDO, UND, FACTOR2);
        if (PEDIDO is null) then
            PEDIDO = 0;
        ORDENC = ORDENC + PEDIDO * FACTOR2;
        end
    ORDENADO = ORDENADO + ORDENC;
    if (FACTOR <> 0) then
        ORDENADO = ORDENADO / FACTOR;
    select sum(RSDE_LIBERAR)
      from RESERVAS_DETALLE RD, RESERVAS R
      where R.RESE_ID = RD.RESE_ID and ARTI_COD = :ARTICULO and RESE_FECHA <= :FECHA and RESE_VENCE >= :FECHA and RD.BODE_COD = :BODEGA and RSDE_ANULADO = 'N'
      into :RESERVADO;
    if (RESERVADO is null) then
        RESERVADO = 0;
    PEDIDO = 0;
    for select P.PEDI_ID, PEDE_ITEM, PEDE_CANT * PEDE_FACTOR
        from PEDIDOS P, PEDIDOS_DETALLE PD
        where P.PEDI_ID = PD.PEDI_ID and PD.ARTI_COD = :ARTICULO and (PEDI_FECHA+PEDI_VALIDEZ) >= :FECHA and PEDI_FECHA <= :FECHA and PEDE_ANULADO = 'N' and BODE_COD = :BODEGA
        into :ID, :ITEM, :CANT
        do
        begin
        execute procedure FALTANTE(34, 31, ID, ITEM) returning_values (ORDENC, UND, FACTOR2);
        execute procedure LEE_CONFIGURACION('FACTURACION', 'FACTURAS', 'GENERAR PEDIDO AUTOMATICAMENTE CON LA FACTURA') returning_values (pedauto);
        if ((ORDENC * FACTOR2 = CANT) or (PEDAUTO = 'SI')) then /* SI NO SE HA FACTURADO MIRE A VER SI SE REMISIONO */
            execute procedure FALTANTE(34, 32, ID, ITEM) returning_values (ORDENC, UND, FACTOR2);
        if (ORDENC is null) then
            ORDENC = 0;
        PEDIDO = PEDIDO + ORDENC * FACTOR2;
        end
    RESERVADO = RESERVADO + PEDIDO;
    if (FACTOR <> 0) then
        RESERVADO = RESERVADO / FACTOR;
    /* VENTAS MES */
    FECHAAUX = cast (FECHA as varchar(10));
    FECHAAUX = SUBSTR(FECHAAUX, 1, 7) || '/01';
    FECINI = cast (FECHAAUX as date);
    execute procedure ventas_articulo (:ARTICULO, :FECINI, :FECHA, 0, :bodega) returning_values (:ventames, :mfac, :devmes, :mdev, :ivaf, :ivad);
    ventames = ventames - devmes;
    if (FACTOR <> 0) then
        ventames = ventames / FACTOR;
    /* FECHA COMPRA */
    fechacmp = null;
    cantcmp = 0;
    select first 1 FACO_FECHA, FCDE_CANT * FCDE_FACTOR from FACTURAS_COMPRA F, FACTURAS_COMPRAS_DETALLE D
        where F.FACO_ID = D.faco_id and D.ARTI_COD = :articulo and FACO_FECHA <= :FECHA and D.bode_cod = :BODEGA
        order by FACO_FECHA desc, F.FACO_ID desc
        into :fechacmp, :cantcmp;
    if (sugerido > 0) then
        SUSPEND;
    end
  END
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE PRODUCCION_SUGERIDA(
    FECHA DATE,
    MARCA VARCHAR(3))
RETURNS (
    ARTICULO VARCHAR(15),
    CANT NUMERIC(18,4),
    UNIDAD VARCHAR(8))
AS
declare variable GRUP VARCHAR(2);
declare variable SUBG VARCHAR(3);
declare variable FACTOR NUMERIC(15,4);
declare variable DIAS INTEGER;
declare variable EXISTENCIA NUMERIC(18,4);
declare variable PROMEDIO NUMERIC(18,4);
declare variable SALIDAS NUMERIC(18,4);
declare variable RESERVADO numeric(18,4);
declare variable pedido numeric(18,4);
declare variable ORDENC numeric(18,4);
declare variable cant2 numeric(18,4);
declare variable exceso integer;
declare variable id integer;
declare variable item integer;
declare variable UND varchar(8);
declare variable PEDAUTO VARCHAR(2);
BEGIN
--execute procedure lee_configuracion('INVENTARIO', 'ENSAMBLES', 'NUMERO DE DIAS DE CONSUMO A PRODUCIR') returning_values (:dias);
execute procedure lee_configuracion('INVENTARIO', 'ENSAMBLES', 'PORCENTAJE DE EXCEDENTE A PRODUCIR') returning_values (:exceso);
EXECUTE PROCEDURE LEE_CONFIGURACION('FACTURACION', 'FACTURAS', 'GENERAR PEDIDO AUTOMATICAMENTE CON LA FACTURA') returning_values (pedauto);
execute procedure lee_configuracion('INVENTARIO', 'ENSAMBLES', 'GRUPO DE LOS ARTICULOS A PRODUCIR') returning_values (:grup);
execute procedure lee_configuracion('INVENTARIO', 'ENSAMBLES', 'SUBGRUPO DE LOS ARTICULOS A PRODUCIR') returning_values (:subg);

FOR SELECT ARTI_COD, ARTI_UNIDAD, ARTI_DIAS FROM articulo
    WHERE ((GRUP_COD = :GRUP) or (:GRUP = ''))  AND ((SUBG_COD = :SUBG) or (:SUBG = '')) AND
    MARC_COD = :marca AND ESAR_COD <> 'I' AND ARTI_EXIST <> 'N' AND ARTI_ENSAMBLE = 'N'
    order by arti_COD
    INTO :articulo, unidad, :DIAS
    DO
    BEGIN
    execute procedure saldo_total_inventario (:articulo, :fecha) returning_values (:Existencia);
    EXECUTE PROCEDURE promedio_produccion_articulo (:ARTICULO, :FECHA) returning_values (:PROMEDIO, :SALIDAS);
    SELECT SUM(RSDE_LIBERAR)
        FROM RESERVAS_DETALLE RD, RESERVAS R
        WHERE R.RESE_ID = RD.RESE_ID AND ARTI_COD = :articulo AND RESE_FECHA <= :FECHA AND RESE_VENCE >= :FECHA AND RSDE_ANULADO = 'N'
        INTO :RESERVADO;
    if (RESERVADO IS NULL) then
        RESERVADO = 0;
    PEDIDO = 0;
    FOR SELECT P.PEDI_ID, PEDE_ITEM, PEDE_CANT * PEDE_FACTOR
        FROM PEDIDOS P, PEDIDOS_DETALLE PD
        WHERE P.PEDI_ID = PD.PEDI_ID AND PD.ARTI_COD = :articulo AND PEDI_VENCE >= :FECHA AND PEDI_FECHA <= :FECHA AND PEDE_ANULADO = 'N'
        INTO :ID, :ITEM, :CANT2
        do
        BEGIN
        EXECUTE PROCEDURE FALTANTE(34, 31, ID, ITEM) returning_values (ORDENC, UND, FACTOR);
        if ((ORDENC * FACTOR = CANT2) or (PEDAUTO = 'SI')) then /* SI NO SE HA FACTURADO MIRE A VER SI SE REMISIONO */
            EXECUTE PROCEDURE FALTANTE(34, 32, ID, ITEM) returning_values (ORDENC, UND, FACTOR);
        if (ORDENC IS NULL) then
            ORDENC = 0;
        PEDIDO = PEDIDO + ORDENC * FACTOR;
        END
    RESERVADO = RESERVADO + PEDIDO;

    PROMEDIO = PROMEDIO * DIAS;
    if (reservado > PROMEDIO) then
        PROMEDIO = RESERVADO;
    CANT = (PROMEDIO * (1 + exceso/100)) - EXISTENCIA;
    if (CANT > 0) then
        SUSPEND;
    END
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE REP_CRUCES_DOCUMENTO(
    TIPOORI INTEGER,
    TIPODES INTEGER,
    FECINI DATE,
    FECFIN DATE,
    ID INTEGER,
    CEROS CHAR(1),
    SUBEMPRESA INTEGER)
RETURNS (
    IDORI INTEGER,
    PREFORI VARCHAR(4),
    NUMORI VARCHAR(6),
    FECORI DATE,
    NIT VARCHAR(20),
    NOMCLIENTE VARCHAR(60),
    ITEM INTEGER,
    IDDES INTEGER,
    PREFDES VARCHAR(4),
    NUMDES VARCHAR(6),
    FECDES DATE,
    ARTIC VARCHAR(20),
    DESCRIPCION VARCHAR(60),
    CANTORI NUMERIC(18,2),
    CANTDES NUMERIC(18,2),
    UNIDAD VARCHAR(8),
    CODBOD VARCHAR(2),
    LOTE VARCHAR(20),
    OBS VARCHAR(255))
AS
declare variable FALTANTE NUMERIC(18,2);
declare variable FACTOR NUMERIC(18,4);
begin
  if (TIPOORI = 32) then
    FOR SELECT R.REVT_ID, R.PREF_PRE, REVT_NUMERO, REVT_FECHA, RVDE_ITEM, R.TERC_NIT, REVT_NOMTERC, ARTI_COD, SUBSTR(RVDE_DESC,1,60), RVDE_UNIDAD, RVDE_CANT, SUBSTRING(D.rvde_obs FROM 1 FOR 255)
      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)) AND ((:ID = 0) or (R.revt_id = :ID))
      ORDER BY REVT_FECHA, R.PREF_PRE, REVT_NUMERO, RVDE_ITEM
      INTO :IDORI, :PREFORI, :NUMORI, :FECORI, :ITEM, :NIT, :NOMCLIENTE, :ARTIC, :DESCRIPCION, :UNIDAD, :CANTORI, :OBS
      DO
        BEGIN
        EXECUTE PROCEDURE FALTANTE(:TIPOORI, :TIPODES, :IDORI, :ITEM) returning_values (:FALTANTE, :UNIDAD, :FACTOR);
        if ((CEROS = 'S') or (FALTANTE <> 0)) then
          BEGIN
          FOR SELECT COFA_CANT, COFA_UNIDAD, COFA_BODEGA, COFA_LOTE, SUBSTRING(CODE_OBSIT FROM 1 FOR 255), COFA_ID
            FROM CONSOLIDADO_FALTANTES WHERE COFA_TIPOORI = :TIPOORI AND COFA_IDORI = :IDORI AND COFA_OK = 'S' AND COFA_ITEMORI = :ITEM
            INTO :CANTDES, :UNIDAD, :CODBOD, :LOTE, :OBS, :IDDES
            DO
            BEGIN
            if (TIPODES = 31) then
                SELECT PREF_PRE, FACT_NUMERO, FACT_FECHA FROM FACTURAS WHERE FACT_CONSOLIDA = :IDDES AND FACT_ANULADO = 'N' INTO :PREFDES, :NUMDES, :FECDES;
            if (TIPODES = 32) then
                SELECT PREF_PRE, REVT_NUMERO, REVT_FECHA FROM remisiones_venta WHERE REVT_CONSOLIDA = :IDDES AND REVT_ANULADO = 'N' INTO :PREFDES, :NUMDES, :FECDES;
            if (TIPODES = 34) then
                SELECT PREF_PRE, PEDI_NUMERO, PEDI_FECHA FROM PEDIDOS WHERE PEDI_CONSOLIDA = :IDDES AND PEDI_ANULADO = 'N' INTO :PREFDES, :NUMDES, :FECDES;
            SUSPEND;
            END
          END
        END
  if (TIPOORI = 34) then
    FOR SELECT P.PEDI_ID, P.PREF_PRE, PEDI_NUMERO, PEDI_FECHA, PEDE_ITEM, P.TERC_NIT, PEDI_NOMTERC, ARTI_COD, SUBSTR(PEDE_DESC,1,60), PEDE_UNIDAD, PEDE_CANT, SUBSTRING(D.pede_obs FROM 1 FOR 255)
      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 PR.PREF_PRE = P.PREF_PRE AND PR.TIDO_COD = 34 AND ((PR.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) AND ((:ID = 0) or (P.pedi_id = :ID))
      ORDER BY PEDI_FECHA, P.PREF_PRE, PEDI_NUMERO, PEDE_ITEM
      INTO :IDORI, :PREFORI, :NUMORI, :FECORI, :ITEM, :NIT, :NOMCLIENTE, :ARTIC, :DESCRIPCION, :UNIDAD, :CANTORI, :OBS
      DO
        BEGIN
        EXECUTE PROCEDURE FALTANTE(:TIPOORI, :TIPODES, :IDORI,  :ITEM) returning_values (:FALTANTE, :UNIDAD, :FACTOR);
        if ((CEROS = 'S') or (FALTANTE <> 0)) then
          BEGIN
          FOR SELECT COFA_CANT, COFA_UNIDAD, COFA_BODEGA, COFA_LOTE, SUBSTRING(CODE_OBSIT FROM 1 FOR 255), COFA_ID
            FROM CONSOLIDADO_FALTANTES WHERE COFA_TIPOORI = :TIPOORI AND COFA_IDORI = :IDORI AND COFA_OK = 'S' AND COFA_ITEMORI = :ITEM
            INTO :CANTDES, :UNIDAD, :CODBOD, :LOTE, :OBS, :IDDES
            DO
            BEGIN
            if (TIPODES = 31) then
                SELECT PREF_PRE, FACT_NUMERO, FACT_FECHA FROM FACTURAS WHERE FACT_CONSOLIDA = :IDDES AND FACT_ANULADO = 'N' INTO :PREFDES, :NUMDES, :FECDES;
            if (TIPODES = 32) then
                SELECT PREF_PRE, REVT_NUMERO, REVT_FECHA FROM remisiones_venta WHERE REVT_CONSOLIDA = :IDDES AND REVT_ANULADO = 'N' INTO :PREFDES, :NUMDES, :FECDES;
            if (TIPODES = 34) then
                SELECT PREF_PRE, PEDI_NUMERO, PEDI_FECHA FROM PEDIDOS WHERE PEDI_CONSOLIDA = :IDDES AND PEDI_ANULADO = 'N' INTO :PREFDES, :NUMDES, :FECDES;
            SUSPEND;
            END
          END
        END
  if (TIPOORI = 35) then
    FOR SELECT C.COTI_ID, C.PREF_PRE, COTI_NUMERO, COTI_FECHA, CTDE_ITEM, C.TERC_NIT, COTI_NOMTERC, ARTI_COD, SUBSTR(CTDE_DESC,1,60), CTDE_UNIDAD, CTDE_CANT, SUBSTRING(D.ctde_obs FROM 1 FOR 255)
      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)) AND ((:ID = 0) or (C.coti_id = :ID))
      ORDER BY COTI_FECHA, C.PREF_PRE, COTI_NUMERO, CTDE_ITEM
      INTO :IDORI, :PREFORI, :NUMORI, :FECORI, :ITEM, :NIT, :NOMCLIENTE, :ARTIC, :DESCRIPCION, :UNIDAD, :CANTORI, :OBS
      DO
        BEGIN
        EXECUTE PROCEDURE FALTANTE(:TIPOORI, :TIPODES, :IDORI,  :ITEM) returning_values (:FALTANTE, :UNIDAD, :FACTOR);
        if ((CEROS = 'S') or (FALTANTE <> 0)) then
          BEGIN
          FOR SELECT COFA_CANT, COFA_UNIDAD, COFA_BODEGA, COFA_LOTE, SUBSTRING(CODE_OBSIT FROM 1 FOR 255), COFA_ID
            FROM CONSOLIDADO_FALTANTES WHERE COFA_TIPOORI = :TIPOORI AND COFA_IDORI = :IDORI AND COFA_OK = 'S' AND COFA_ITEMORI = :ITEM
            INTO :CANTDES, :UNIDAD, :CODBOD, :LOTE, :OBS, :IDDES
            DO
            BEGIN
            if (TIPODES = 31) then
                SELECT PREF_PRE, FACT_NUMERO, FACT_FECHA FROM FACTURAS WHERE FACT_CONSOLIDA = :IDDES AND FACT_ANULADO = 'N' INTO :PREFDES, :NUMDES, :FECDES;
            if (TIPODES = 32) then
                SELECT PREF_PRE, REVT_NUMERO, REVT_FECHA FROM remisiones_venta WHERE REVT_CONSOLIDA = :IDDES AND REVT_ANULADO = 'N' INTO :PREFDES, :NUMDES, :FECDES;
            if (TIPODES = 34) then
                SELECT PREF_PRE, PEDI_NUMERO, PEDI_FECHA FROM PEDIDOS WHERE PEDI_CONSOLIDA = :IDDES AND PEDI_ANULADO = 'N' INTO :PREFDES, :NUMDES, :FECDES;
            SUSPEND;
            END
          END
        END
  if (TIPOORI = 40) then /* pendientes */
    FOR SELECT P.pend_id, P.pref_pre, p.pend_numero, p.pend_fecha, d.pevd_item, P.terc_nit, p.pend_nomcli, d.arti_cod, SUBSTR(d.pevd_desc,1,60), d.pevd_unidad, d.pevd_cant, SUBSTRING(D.pevd_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)) AND ((:ID = 0) or (P.pend_id = :ID))
      ORDER BY PEND_FECHA, P.PREF_PRE, PEND_NUMERO, pevd_item
      INTO :IDORI, :PREFORI, :NUMORI, :FECORI, :ITEM, :NIT, :NOMCLIENTE, :ARTIC, :DESCRIPCION, :UNIDAD, :CANTORI, :OBS
      DO
        BEGIN
        EXECUTE PROCEDURE FALTANTE(:TIPOORI, :TIPODES, :IDORI,  :ITEM) returning_values (:FALTANTE, :UNIDAD, :FACTOR);
        if ((CEROS = 'S') or (FALTANTE <> 0)) then
          BEGIN
          FOR SELECT COFA_CANT, COFA_UNIDAD, COFA_BODEGA, COFA_LOTE, SUBSTRING(CODE_OBSIT FROM 1 FOR 255), COFA_ID
            FROM CONSOLIDADO_FALTANTES WHERE COFA_TIPOORI = :TIPOORI AND COFA_IDORI = :IDORI AND COFA_OK = 'S' AND COFA_ITEMORI = :ITEM
            INTO :CANTDES, :UNIDAD, :CODBOD, :LOTE, :OBS, :IDDES
            DO
            BEGIN
            if (TIPODES = 31) then
                SELECT PREF_PRE, FACT_NUMERO, FACT_FECHA FROM FACTURAS WHERE FACT_CONSOLIDA = :IDDES AND FACT_ANULADO = 'N' INTO :PREFDES, :NUMDES, :FECDES;
            if (TIPODES = 32) then
                SELECT PREF_PRE, REVT_NUMERO, REVT_FECHA FROM remisiones_venta WHERE REVT_CONSOLIDA = :IDDES AND REVT_ANULADO = 'N' INTO :PREFDES, :NUMDES, :FECDES;
            if (TIPODES = 34) then
                SELECT PREF_PRE, PEDI_NUMERO, PEDI_FECHA FROM PEDIDOS WHERE PEDI_CONSOLIDA = :IDDES AND PEDI_ANULADO = 'N' INTO :PREFDES, :NUMDES, :FECDES;
            SUSPEND;
            END
          END
        END
end
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE REP_FALTANTES_CLIENTES(
    TERINI VARCHAR(20),
    TERFIN VARCHAR(20),
    FECINI DATE,
    FECFIN DATE,
    DETALLE CHAR(1),
    TIPO INTEGER,
    DESTINO INTEGER,
    ARTINI VARCHAR(15),
    ARTFIN VARCHAR(15),
    ORDEN CHAR(1),
    CEROS CHAR(1),
    CORTE DATE,
    SUBEMPRESA INTEGER)
RETURNS (
    NIT VARCHAR(20),
    SUCURSAL VARCHAR(10),
    NOMBRE VARCHAR(60),
    TELEFONO VARCHAR(40),
    CIUDAD VARCHAR(40),
    CODZONA VARCHAR(2),
    NOMZONA VARCHAR(60),
    NOMTIPO VARCHAR(50),
    ARTICULO VARCHAR(15),
    DESCRIPCION VARCHAR(60),
    CODGRUPO VARCHAR(2),
    NOMGRUPO VARCHAR(30),
    CODSUBG VARCHAR(3),
    NOMSUBG VARCHAR(30),
    CODMARC VARCHAR(3),
    NOMMARC VARCHAR(30),
    CANTIDAD NUMERIC(18,4),
    UNIDAD VARCHAR(8),
    FALTANTE NUMERIC(18,4),
    BASE NUMERIC(18,2),
    IVA NUMERIC(18,2),
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(8),
    FECHA DATE,
    PTVTA INTEGER,
    OBS VARCHAR(255))
AS
declare variable ID INTEGER;
declare variable ITEM INTEGER;
declare variable CODINI VARCHAR(15);
declare variable CODFIN VARCHAR(15);
declare variable DESINI VARCHAR(15);
declare variable DESFIN VARCHAR(15);
declare variable FACTOR NUMERIC(18,4);
declare variable CANT NUMERIC(18,4);
declare variable MONTO NUMERIC(18,2);
declare variable artiaux VARCHAR(20);
BEGIN
if (ORDEN = 'C') then
    BEGIN
    CODINI = ARTINI;
    CODFIN = ARTFIN;
    DESINI = '';
    DESFIN = 'zz';
    END
ELSE
    BEGIN
    DESINI = ARTINI;
    DESFIN = ARTFIN;
    CODINI = '';
    CODFIN = 'zz';
    END
SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = :TIPO INTO :NOMTIPO;
/*FOR select T.TERC_NIT, TERC_NOM,  TERC_TEL, TERC_CIU, ZONA_COD
    from terceros T, CLIENTES C*/
FOR select c.terc_nit,s.clsu_nombre,s.clsu_tel,s.clsu_ciudad,s.zona_cod,s.clcu_cod
    from clientes c, cliente_sucursales s
    where C.TERC_NIT = s.TERC_NIT and C.TERC_NIT >= :TERINI AND C.TERC_NIT <= :TERFIN
    INTO :NIT, :NOMBRE, :TELEFONO, :CIUDAD, :CODZONA, :sucursal
    DO  
    BEGIN
    CANTIDAD = 0;
    FALTANTE = 0;
    BASE = 0;
    SELECT ZONA_NOM FROM ZONAS WHERE ZONA_COD = :CODZONA INTO :NOMZONA;
    if (DETALLE = 'N') then
        BEGIN
        ARTICULO = '';
        if (TIPO = 31) then
            FOR SELECT F.FACT_ID, FADE_ITEM, D.ARTI_COD, FADE_CANT * FADE_FACTOR, (FADE_PRUNIT-FADE_DTOMONTO), F.ptvt_id
                FROM FACTURAS_DETALLE D, FACTURAS F, ARTICULO A, PREFIJOS P
                WHERE F.FACT_ID = D.FACT_ID AND FACT_FECHA >= :FECINI AND FACT_FECHA <= :FECFIN AND TERC_NIT = :NIT AND FACT_ANULADO = 'N' AND
                      D.ARTI_COD = A.ARTI_COD AND D.ARTI_COD >= :CODINI AND D.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
                      P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 31 AND ((P.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) and f.fact_sucursal = :sucursal and substring(a.arti_cod from 1 FOR 2) <> '.t'
                ORDER BY ARTI_COD, F.FACT_ID, FADE_ITEM INTO :ID, :ITEM, :ARTIAUX, :CANT,  :MONTO, :PTVTA
                DO
                BEGIN
                if (artiaux <> articulo) then
                    begin
                    if (ARTICULO <> '') then
                        SUSPEND;
                    SELECT ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                        FROM articulo WHERE ARTI_COD = :ARTIAUX
                        INTO :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC;
                    SELECT GRUP_NOM FROM GRUPO 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;
                    ARTICULO = ARTIAUX;
                    CANTIDAD = 0;
                    FALTANTE = 0;
                    BASE = 0;
                    end
                CANTIDAD = CANTIDAD + CANT;
                EXECUTE PROCEDURE FALTANTE_CORTE(:TIPO, :DESTINO, :ID, :ITEM, :CORTE) returning_values (:CANT, :UNIDAD, :FACTOR);
                FALTANTE = FALTANTE + CANT;
                BASE = BASE + (MONTO * CANT);
                END
        if (TIPO = 32) then
            FOR SELECT R.revt_id, rvde_item, D.ARTI_COD, RVDE_CANT * RVDE_FACTOR, (RVDE_PRUNIT-RVDE_DTOMONTO), R.ptvt_id
                FROM REMISIONES_VENTA_DETALLE D, REMISIONES_VENTA R, ARTICULO A, PREFIJOS P
                WHERE R.REVT_ID = D.REVT_ID AND REVT_FECHA >= :FECINI AND REVT_FECHA <= :FECFIN AND TERC_NIT = :NIT AND REVT_ANULADO = 'N' AND
                      D.ARTI_COD = A.ARTI_COD AND D.ARTI_COD >= :CODINI AND D.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
                      P.PREF_PRE = R.PREF_PRE AND P.TIDO_COD = 32 AND ((P.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) and r.revt_sucursal = :sucursal
                ORDER BY ARTI_COD, R.REVT_ID, RVDE_ITEM INTO :ID, :ITEM, :ARTIAUX, :CANT, :MONTO, :PTVTA
                DO
                BEGIN
                if (artiaux <> articulo) then
                    begin
                    if (ARTICULO <> '') then
                        SUSPEND;
                    SELECT ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                        FROM articulo WHERE ARTI_COD = :ARTIAUX
                        INTO :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC;
                    SELECT GRUP_NOM FROM GRUPO 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;
                    ARTICULO = ARTIAUX;
                    CANTIDAD = 0;
                    FALTANTE = 0;
                    BASE = 0;
                    end
                CANTIDAD = CANTIDAD + CANT;
                EXECUTE PROCEDURE FALTANTE_CORTE(:TIPO, :DESTINO, :ID, :ITEM, :CORTE) returning_values (:CANT, :UNIDAD, :FACTOR);
                FALTANTE = FALTANTE + CANT;
                BASE = BASE + (MONTO * CANT);
                END
        if (TIPO = 34) then
            FOR SELECT P.PEDI_ID, PEDE_ITEM, D.ARTI_COD, PEDE_CANT * PEDE_FACTOR, (PEDE_PRUNIT-PEDE_DTOMONTO), P.ptvt_id
                FROM PEDIDOS_DETALLE D, PEDIDOS P, ARTICULO A, PREFIJOS PR
                WHERE P.PEDI_ID = D.PEDI_ID AND PEDI_FECHA >= :FECINI AND PEDI_FECHA <= :FECFIN AND TERC_NIT = :NIT AND PEDI_ANULADO = 'N' AND PEDI_VALIDEZ >= 0 AND
                      D.ARTI_COD = A.ARTI_COD AND D.ARTI_COD >= :CODINI AND D.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
                      PR.PREF_PRE = P.PREF_PRE AND PR.TIDO_COD = 34 AND ((PR.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) and p.pedi_sucursal = :sucursal
                ORDER BY ARTI_COD, P.PEDI_ID, PEDE_ITEM INTO :ID, :ITEM, :ARTIAUX, :CANT, :MONTO, :PTVTA
                DO
                BEGIN
                if (artiaux <> articulo) then
                    begin
                    if (ARTICULO <> '') then
                        SUSPEND;
                    SELECT ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                        FROM articulo WHERE ARTI_COD = :ARTIAUX
                        INTO :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC;
                    SELECT GRUP_NOM FROM GRUPO 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;
                    ARTICULO = ARTIAUX;
                    CANTIDAD = 0;
                    FALTANTE = 0;
                    BASE = 0;
                    end
                CANTIDAD = CANTIDAD + CANT;
                EXECUTE PROCEDURE FALTANTE_CORTE(:TIPO, :DESTINO, :ID, :ITEM, :CORTE) returning_values (:CANT, :UNIDAD, :FACTOR);
                FALTANTE = FALTANTE + CANT;
                BASE = BASE + (MONTO * CANT);
                END
        if (TIPO = 35) then
            FOR SELECT C.COTI_ID, CTDE_ITEM, D.ARTI_COD, CTDE_CANT * CTDE_FACTOR, (CTDE_PRUNIT-CTDE_DTOMONTO), C.ptvt_id
                FROM COTIZACIONES_DETALLE D, COTIZACIONES C, ARTICULO A, PREFIJOS P
                WHERE C.COTI_ID = D.COTI_ID AND COTI_FECHA >= :FECINI AND COTI_FECHA <= :FECFIN AND TERC_NIT = :NIT AND COTI_ANULADO = 'N' AND
                      D.ARTI_COD = A.ARTI_COD AND D.ARTI_COD >= :CODINI AND D.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
                      P.PREF_PRE = C.PREF_PRE AND P.TIDO_COD = 35 AND ((P.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) and c.coti_sucursal = :sucursal
                ORDER BY ARTI_COD, C.COTI_ID, CTDE_ITEM INTO :ID, :ITEM, :ARTIAUX, :CANT, :MONTO, :PTVTA
                DO
                BEGIN
                if (artiaux <> articulo) then
                    begin
                    if (ARTICULO <> '') then
                        SUSPEND;
                    SELECT ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                        FROM articulo WHERE ARTI_COD = :ARTIAUX
                        INTO :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC;
                    SELECT GRUP_NOM FROM GRUPO 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;
                    ARTICULO = ARTIAUX;
                    CANTIDAD = 0;
                    FALTANTE = 0;
                    BASE = 0;
                    end
                CANTIDAD = CANTIDAD + CANT;
                EXECUTE PROCEDURE FALTANTE_CORTE(:TIPO, :DESTINO, :ID, :ITEM, :CORTE) returning_values (:CANT, :UNIDAD, :FACTOR);
                FALTANTE = FALTANTE + CANT;
                BASE = BASE + (MONTO * CANT);
                END
        if (TIPO = 40) then
            FOR SELECT P.pend_id, D.pevd_item, D.ARTI_COD, D.pevd_cant * D.pevd_factor, (D.pevd_prunit-D.pevd_dtomonto)
                FROM pendiente_ventas_detalle D, pendiente_ventas P, ARTICULO A, PREFIJOS PR
                WHERE P.pend_id = D.pend_id AND PEND_FECHA >= :FECINI AND PEND_FECHA <= :FECFIN AND TERC_NIT = :NIT AND PEND_ANULADO = 'N' AND
                      D.ARTI_COD = A.ARTI_COD AND D.ARTI_COD >= :CODINI AND D.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
                      PR.PREF_PRE = P.PREF_PRE AND PR.TIDO_COD = 40 AND ((PR.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) and p.pend_sucursal = :sucursal
                ORDER BY ARTI_COD, P.pend_id, D.pevd_item INTO :ID, :ITEM, :ARTIAUX, :CANT, :MONTO
                DO
                BEGIN
                if (artiaux <> articulo) then
                    begin
                    if (ARTICULO <> '') then
                        SUSPEND;
                    SELECT ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                        FROM articulo WHERE ARTI_COD = :ARTIAUX
                        INTO :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC;
                    SELECT GRUP_NOM FROM GRUPO 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;
                    ARTICULO = ARTIAUX;
                    CANTIDAD = 0;
                    FALTANTE = 0;
                    BASE = 0;
                    end
                CANTIDAD = CANTIDAD + CANT;
                EXECUTE PROCEDURE FALTANTE(:TIPO, :DESTINO, :ID, :ITEM) returning_values (:CANT, :UNIDAD, :FACTOR);
                FALTANTE = FALTANTE + CANT;
                BASE = BASE + (MONTO * CANT);
                END
        if (FALTANTE IS NULL) then
            FALTANTE = 0;
        if (BASE IS NULL) then
            BASE = 0;
        if (IVA IS NULL) then
            IVA = 0;
        if ((CEROS = 'S') or (FALTANTE <> 0)) then
            SUSPEND;
        END
    ELSE
        BEGIN
        if (TIPO = 31) then
            FOR SELECT F.FACT_ID, FADE_ITEM, F.PREF_PRE, FACT_NUMERO, FACT_FECHA, FADE_CANT * FADE_FACTOR, (FADE_PRUNIT-FADE_DTOMONTO), FADE_IVAMONTO, D.ARTI_COD, ARTI_DES, ARTI_UNIDAD, A.GRUP_COD, A.SUBG_COD, A.MARC_COD, SUBSTRING(FACT_OBS FROM 1 FOR 255), F.ptvt_id
                FROM FACTURAS F, FACTURAS_DETALLE D, ARTICULO A, PREFIJOS P
                WHERE F.FACT_ID = D.FACT_ID AND FACT_FECHA >= :FECINI AND FACT_FECHA <= :FECFIN  AND TERC_NIT = :NIT AND FACT_ANULADO = 'N' AND
                      D.ARTI_COD = A.ARTI_COD AND D.ARTI_COD >= :CODINI AND D.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
                      P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 31 AND ((P.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) and f.fact_sucursal = :sucursal and substring(a.arti_cod from 1 FOR 2) <> '.t'
                ORDER BY D.ARTI_COD, F.FACT_ID, FADE_ITEM
                INTO :ID, :ITEM, :PREFIJO, :NUMERO, :FECHA, :CANTIDAD, :BASE, :IVA, :ARTICULO, :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC, :OBS, :PTVTA
                DO
                    BEGIN
                    SELECT GRUP_NOM FROM GRUPO WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                    SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                    SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                    EXECUTE PROCEDURE FALTANTE_CORTE(:TIPO, :DESTINO, :ID, :ITEM, :CORTE) returning_values (:FALTANTE, :UNIDAD, :FACTOR);
                    if ((CEROS = 'S') or (FALTANTE <> 0)) then
                        SUSPEND;
                    END
        if (TIPO = 32) then
            FOR SELECT R.REVT_ID, RVDE_ITEM, R.PREF_PRE, REVT_NUMERO, REVT_FECHA, RVDE_CANT * RVDE_FACTOR, (RVDE_PRUNIT-RVDE_DTOMONTO), RVDE_IVAMONTO, D.ARTI_COD, ARTI_DES, ARTI_UNIDAD, A.GRUP_COD, A.SUBG_COD, A.MARC_COD, SUBSTRING(REVT_OBS FROM 1 FOR 255), R.ptvt_id
                FROM REMISIONES_VENTA R, REMISIONES_VENTA_DETALLE D, ARTICULO A, PREFIJOS P
                WHERE R.REVT_ID = D.REVT_ID AND REVT_FECHA >= :FECINI AND REVT_FECHA <= :FECFIN AND TERC_NIT = :NIT AND REVT_ANULADO = 'N' AND
                      D.ARTI_COD = A.ARTI_COD AND D.ARTI_COD >= :CODINI AND D.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
                      P.PREF_PRE = R.PREF_PRE AND P.TIDO_COD = 32 AND ((P.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) and r.revt_sucursal = :sucursal
                ORDER BY D.ARTI_COD, R.REVT_ID, RVDE_ITEM
                INTO :ID, :ITEM, :PREFIJO, :NUMERO, :FECHA, :CANTIDAD, :BASE, :IVA, :ARTICULO, :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC, :OBS, :PTVTA
                DO
                    BEGIN
                    SELECT GRUP_NOM FROM GRUPO WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                    SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                    SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                    EXECUTE PROCEDURE FALTANTE_CORTE(:TIPO, :DESTINO, :ID, :ITEM, :CORTE) returning_values (:FALTANTE, :UNIDAD, :FACTOR);
                    if ((CEROS = 'S') or (FALTANTE <> 0)) then
                        SUSPEND;
                    END
        if (TIPO = 34) then
            FOR SELECT P.PEDI_ID, PEDE_ITEM, P.PREF_PRE, PEDI_NUMERO, PEDI_FECHA, PEDE_CANT * PEDE_FACTOR, (PEDE_PRUNIT-PEDE_DTOMONTO), PEDE_IVAMONTO, D.ARTI_COD, ARTI_DES, ARTI_UNIDAD, A.GRUP_COD, A.SUBG_COD, A.MARC_COD, SUBSTRING(PEDI_OBS FROM 1 FOR 255), P.ptvt_id
                FROM PEDIDOS P, PEDIDOS_DETALLE D, ARTICULO A, PREFIJOS PR
                WHERE P.PEDI_ID = D.PEDI_ID AND PEDI_FECHA >= :FECINI AND PEDI_FECHA <= :FECFIN AND TERC_NIT = :NIT AND PEDI_ANULADO = 'N' AND PEDI_VALIDEZ >= 0 AND
                      D.ARTI_COD = A.ARTI_COD AND D.ARTI_COD >= :CODINI AND D.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
                      P.PREF_PRE = PR.PREF_PRE AND PR.TIDO_COD = 34 AND ((PR.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) and p.pedi_sucursal = :sucursal
                ORDER BY D.ARTI_COD, P.PEDI_ID, PEDE_ITEM
                INTO :ID, :ITEM, PREFIJO, :NUMERO, :FECHA, :CANTIDAD, :BASE, :IVA, :ARTICULO, :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC, :OBS, :PTVTA
                DO
                    BEGIN
                    SELECT GRUP_NOM FROM GRUPO WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                    SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                    SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                    EXECUTE PROCEDURE FALTANTE_CORTE(:TIPO, :DESTINO, :ID, :ITEM, :CORTE) returning_values (:FALTANTE, :UNIDAD, :FACTOR);
                    if ((CEROS = 'S') or (FALTANTE <> 0)) then
                        SUSPEND;
                    END
        if (TIPO = 35) then
            FOR SELECT C.COTI_ID, CTDE_ITEM, C.PREF_PRE, COTI_NUMERO, COTI_FECHA, CTDE_CANT * CTDE_FACTOR, (CTDE_PRUNIT-CTDE_DTOMONTO), CTDE_IVAMONTO, D.ARTI_COD, ARTI_DES, ARTI_UNIDAD, A.GRUP_COD, A.SUBG_COD, A.MARC_COD, SUBSTRING(COTI_OBS FROM 1 FOR 255), C.ptvt_id
                FROM COTIZACIONES C, COTIZACIONES_DETALLE D, ARTICULO A, PREFIJOS P
                WHERE C.COTI_ID = D.COTI_ID AND COTI_FECHA >= :FECINI AND COTI_FECHA <= :FECFIN AND TERC_NIT = :NIT AND COTI_ANULADO = 'N' AND
                      D.ARTI_COD = A.ARTI_COD AND D.ARTI_COD >= :CODINI AND D.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
                      P.PREF_PRE = C.PREF_PRE AND P.TIDO_COD = 35 AND ((P.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) and c.coti_sucursal = :sucursal
                ORDER BY D.ARTI_COD, C.COTI_ID, CTDE_ITEM
                INTO :ID, :ITEM, PREFIJO, :NUMERO, :FECHA, :CANTIDAD, :BASE, :IVA, :ARTICULO, :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC, :OBS, :PTVTA
                DO
                    BEGIN
                    SELECT GRUP_NOM FROM GRUPO WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                    SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                    SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                    EXECUTE PROCEDURE FALTANTE_CORTE(:TIPO, :DESTINO, :ID, :ITEM, :CORTE) returning_values (:FALTANTE, :UNIDAD, :FACTOR);
                    if ((CEROS = 'S') or (FALTANTE <> 0)) then
                        SUSPEND;
                    END
        if (TIPO = 40) then
            FOR SELECT P.pend_id, D.pevd_item, P.PREF_PRE, P.pend_numero, P.pend_fecha, D.pevd_cant * D.pevd_factor, (D.pevd_prunit-D.pevd_dtomonto), D.pevd_ivamonto, D.ARTI_COD, ARTI_DES, ARTI_UNIDAD, A.GRUP_COD, A.SUBG_COD, A.MARC_COD, SUBSTRING(P.pend_obs FROM 1 FOR 255)
                FROM pendiente_ventas P, pendiente_ventas_detalle D, ARTICULO A, PREFIJOS PR
                WHERE P.pend_id = D.pend_id AND PEND_FECHA >= :FECINI AND PEND_FECHA <= :FECFIN AND TERC_NIT = :NIT AND PEND_ANULADO = 'N' AND
                      D.ARTI_COD = A.ARTI_COD AND D.ARTI_COD >= :CODINI AND D.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
                      P.PREF_PRE = PR.PREF_PRE AND PR.TIDO_COD = 40 AND ((PR.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) and p.pend_sucursal = :sucursal
                ORDER BY D.ARTI_COD, P.pend_id, D.pevd_item
                INTO :ID, :ITEM, PREFIJO, :NUMERO, :FECHA, :CANTIDAD, :BASE, :IVA, :ARTICULO, :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC, :OBS
                DO
                    BEGIN
                    SELECT GRUP_NOM FROM GRUPO WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                    SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                    SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                    EXECUTE PROCEDURE FALTANTE(:TIPO, :DESTINO, :ID, :ITEM) returning_values (:FALTANTE, :UNIDAD, :FACTOR);
                    if ((CEROS = 'S') or (FALTANTE <> 0)) then
                        SUSPEND;
                    END
        END
    END
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE REP_FALTANTES_VENDEDOR(
    VENINI VARCHAR(20),
    VENFIN VARCHAR(20),
    FECINI DATE,
    FECFIN DATE,
    DETALLE CHAR(1),
    TIPO INTEGER,
    DESTINO INTEGER,
    ARTINI VARCHAR(15),
    ARTFIN VARCHAR(15),
    ORDEN CHAR(1),
    CEROS CHAR(1),
    CORTE DATE,
    SUBEMPRESA INTEGER)
RETURNS (
    CODVEND VARCHAR(20),
    NOMVEND VARCHAR(60),
    NOMTIPO VARCHAR(50),
    ARTICULO VARCHAR(15),
    DESCRIPCION VARCHAR(60),
    CODGRUPO VARCHAR(2),
    NOMGRUPO VARCHAR(30),
    CODSUBG VARCHAR(3),
    NOMSUBG VARCHAR(30),
    CODMARC VARCHAR(3),
    NOMMARC VARCHAR(30),
    CANTIDAD NUMERIC(18,4),
    UNIDAD VARCHAR(8),
    FALTANTE NUMERIC(18,4),
    BASE NUMERIC(18,2),
    IVA NUMERIC(18,2),
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(8),
    FECHA DATE,
    PTVTA INTEGER,
    OBS VARCHAR(255))
AS
declare variable ID INTEGER;
declare variable ITEM INTEGER;
declare variable CODINI VARCHAR(15);
declare variable CODFIN VARCHAR(15);
declare variable DESINI VARCHAR(15);
declare variable DESFIN VARCHAR(15);
declare variable FACTOR NUMERIC(18,4);
declare variable CANT NUMERIC(18,4);
declare variable MONTO NUMERIC(18,2);
declare variable artiaux VARCHAR(20);
BEGIN
if (ORDEN = 'C') then
    BEGIN
    CODINI = ARTINI;
    CODFIN = ARTFIN;
    DESINI = '';
    DESFIN = 'zz';
    END
ELSE
    BEGIN
    DESINI = ARTINI;
    DESFIN = ARTFIN;
    CODINI = '';
    CODFIN = 'zz';
    END

  SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = :TIPO INTO :NOMTIPO;
  /*FOR select VEND_COD, VEND_NOMBRE
    from VENDEDORES where VEND_COD >= :VENINI AND VEND_COD <= :VENFIN
    INTO :CODVEND, :NOMVEND
    DO  
    BEGIN*/
    if (DETALLE = 'N') then
        BEGIN
        ARTICULO = '';
        if (TIPO = 31) then
            FOR SELECT F.FACT_ID, FADE_ITEM, D.ARTI_COD, FADE_CANT * FADE_FACTOR, (FADE_PRUNIT-FADE_DTOMONTO),f.vend_cod, F.ptvt_id
                FROM FACTURAS_DETALLE D, FACTURAS F, ARTICULO A, PREFIJOS P
                WHERE F.FACT_ID = D.FACT_ID AND FACT_FECHA >= :FECINI AND FACT_FECHA <= :FECFIN AND VEND_COD >= :VENINI AND VEND_COD <= :VENFIN AND FACT_ANULADO = 'N' AND
                      D.ARTI_COD = A.ARTI_COD AND D.ARTI_COD >= :CODINI AND D.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
                      P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 31 AND ((P.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) and substring(a.arti_cod from 1 FOR 2) <> '.t'
                ORDER BY VEND_COD,ARTI_COD, F.FACT_ID, FADE_ITEM INTO :ID, :ITEM, :ARTIAUX, :CANT,  :MONTO,:CODVEND, :PTVTA
                DO
                BEGIN
                select VEND_NOMBRE from VENDEDORES where  VEND_COD = :CODVEND INTO :NOMVEND;
                if (artiaux <> articulo) then
                    begin
                    if (ARTICULO <> '') then
                      if ((CEROS = 'S') or (FALTANTE <> 0)) then
                        SUSPEND;
                    SELECT ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                        FROM articulo WHERE ARTI_COD = :ARTIAUX
                        INTO :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC;
                    SELECT GRUP_NOM FROM GRUPO 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;
                    ARTICULO = ARTIAUX;
                    CANTIDAD = 0;
                    FALTANTE = 0;
                    BASE = 0;
                    end
                CANTIDAD = CANTIDAD + CANT;
                EXECUTE PROCEDURE FALTANTE_CORTE(:TIPO, :DESTINO, :ID, :ITEM, :CORTE) returning_values (:CANT, :UNIDAD, :FACTOR);
                FALTANTE = FALTANTE + CANT;
                BASE = BASE + (MONTO * CANT);
                END
        if (TIPO = 32) then
            FOR SELECT R.revt_id, rvde_item, D.ARTI_COD, RVDE_CANT * RVDE_FACTOR, (RVDE_PRUNIT-RVDE_DTOMONTO),R.vend_cod, R.ptvt_id
                FROM REMISIONES_VENTA_DETALLE D, REMISIONES_VENTA R, ARTICULO A, PREFIJOS P
                WHERE R.REVT_ID = D.REVT_ID AND REVT_FECHA >= :FECINI AND REVT_FECHA <= :FECFIN AND VEND_COD >= :VENINI AND VEND_COD <= :VENFIN AND REVT_ANULADO = 'N' AND
                      D.ARTI_COD = A.ARTI_COD AND D.ARTI_COD >= :CODINI AND D.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
                      P.PREF_PRE = R.PREF_PRE AND P.TIDO_COD = 32 AND ((P.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
                ORDER BY VEND_COD,ARTI_COD, R.REVT_ID, RVDE_ITEM INTO :ID, :ITEM, :ARTIAUX, :CANT, :MONTO,:CODVEND, :PTVTA
                DO
                BEGIN
                select VEND_NOMBRE from VENDEDORES where  VEND_COD = :CODVEND INTO :NOMVEND;
                if (artiaux <> articulo) then
                    begin
                    if (ARTICULO <> '') then
                      if ((CEROS = 'S') or (FALTANTE <> 0)) then
                        SUSPEND;
                    SELECT ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                        FROM articulo WHERE ARTI_COD = :ARTIAUX
                        INTO :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC;
                    SELECT GRUP_NOM FROM GRUPO 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;
                    ARTICULO = ARTIAUX;
                    CANTIDAD = 0;
                    FALTANTE = 0;
                    BASE = 0;
                    end
                CANTIDAD = CANTIDAD + CANT;
                EXECUTE PROCEDURE FALTANTE_CORTE(:TIPO, :DESTINO, :ID, :ITEM, :CORTE) returning_values (:CANT, :UNIDAD, :FACTOR);
                FALTANTE = FALTANTE + CANT;
                BASE = BASE + (MONTO * CANT);
                END
        if (TIPO = 34) then
            FOR SELECT P.PEDI_ID, PEDE_ITEM, D.ARTI_COD, PEDE_CANT * PEDE_FACTOR, (PEDE_PRUNIT-PEDE_DTOMONTO),p.vend_cod, P.ptvt_id
                FROM PEDIDOS_DETALLE D, PEDIDOS P, ARTICULO A, PREFIJOS PR
                WHERE P.PEDI_ID = D.PEDI_ID AND PEDI_FECHA >= :FECINI AND PEDI_FECHA <= :FECFIN AND VEND_COD >= :VENINI AND VEND_COD <= :VENFIN AND PEDI_ANULADO = 'N' AND
                      D.ARTI_COD = A.ARTI_COD AND D.ARTI_COD >= :CODINI AND D.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
                      PR.PREF_PRE = P.PREF_PRE AND PR.TIDO_COD = 34 AND ((PR.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) AND PEDI_VALIDEZ >= 0
                ORDER BY VEND_COD,ARTI_COD, P.PEDI_ID, PEDE_ITEM INTO :ID, :ITEM, :ARTIAUX, :CANT, :MONTO,:CODVEND, :PTVTA
                DO
                BEGIN
                select VEND_NOMBRE from VENDEDORES where  VEND_COD = :CODVEND INTO :NOMVEND;
                if (artiaux <> articulo) then
                    begin
                    if (ARTICULO <> '') then
                      if ((CEROS = 'S') or (FALTANTE <> 0)) then
                        SUSPEND;
                    SELECT ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                        FROM articulo WHERE ARTI_COD = :ARTIAUX
                        INTO :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC;
                    SELECT GRUP_NOM FROM GRUPO 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;
                    ARTICULO = ARTIAUX;
                    CANTIDAD = 0;
                    FALTANTE = 0;
                    BASE = 0;
                    end
                CANTIDAD = CANTIDAD + CANT;
                EXECUTE PROCEDURE FALTANTE_CORTE(:TIPO, :DESTINO, :ID, :ITEM, :CORTE) returning_values (:CANT, :UNIDAD, :FACTOR);
                FALTANTE = FALTANTE + CANT;
                BASE = BASE + (MONTO * CANT);
                END
        if (TIPO = 35) then
            FOR SELECT C.COTI_ID, CTDE_ITEM, D.ARTI_COD, CTDE_CANT * CTDE_FACTOR, (CTDE_PRUNIT-CTDE_DTOMONTO),c.vend_cod, C.ptvt_id
                FROM COTIZACIONES_DETALLE D, COTIZACIONES C, ARTICULO A, PREFIJOS P
                WHERE C.COTI_ID = D.COTI_ID AND COTI_FECHA >= :FECINI AND COTI_FECHA <= :FECFIN AND VEND_COD >= :VENINI AND VEND_COD <= :VENFIN AND COTI_ANULADO = 'N' AND
                      D.ARTI_COD = A.ARTI_COD AND D.ARTI_COD >= :CODINI AND D.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
                      P.PREF_PRE = C.PREF_PRE AND P.TIDO_COD = 35 AND ((P.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
                ORDER BY VEND_COD,ARTI_COD, C.COTI_ID, CTDE_ITEM INTO :ID, :ITEM, :ARTIAUX, :CANT, :MONTO,:CODVEND, :PTVTA
                DO
                BEGIN
                select VEND_NOMBRE from VENDEDORES where  VEND_COD = :CODVEND INTO :NOMVEND;
                if (artiaux <> articulo) then
                    begin
                    if (ARTICULO <> '') then
                      if ((CEROS = 'S') or (FALTANTE <> 0)) then
                        SUSPEND;
                    SELECT ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                        FROM articulo WHERE ARTI_COD = :ARTIAUX
                        INTO :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC;
                    SELECT GRUP_NOM FROM GRUPO 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;
                    ARTICULO = ARTIAUX;
                    CANTIDAD = 0;
                    FALTANTE = 0;
                    BASE = 0;
                    end
                CANTIDAD = CANTIDAD + CANT;
                EXECUTE PROCEDURE FALTANTE_CORTE(:TIPO, :DESTINO, :ID, :ITEM, :CORTE) returning_values (:CANT, :UNIDAD, :FACTOR);
                FALTANTE = FALTANTE + CANT;
                BASE = BASE + (MONTO * CANT);
                END
        if (TIPO = 40) then
            FOR SELECT P.pend_id, D.pevd_item, D.ARTI_COD, D.pevd_cant * D.pevd_factor, (D.pevd_prunit-D.pevd_dtomonto),p.vend_cod
                FROM pendiente_ventas_detalle D, pendiente_ventas P, ARTICULO A, PREFIJOS PR
                WHERE P.pend_id = D.pend_id AND PEND_FECHA >= :FECINI AND PEND_FECHA <= :FECFIN AND VEND_COD >= :VENINI AND VEND_COD <= :VENFIN AND PEND_ANULADO = 'N' AND
                      D.ARTI_COD = A.ARTI_COD AND D.ARTI_COD >= :CODINI AND D.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
                      PR.PREF_PRE = P.PREF_PRE AND PR.TIDO_COD = 40 AND ((PR.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
                ORDER BY VEND_COD,ARTI_COD, P.pend_id, D.pevd_item INTO :ID, :ITEM, :ARTIAUX, :CANT, :MONTO,:CODVEND
                DO
                BEGIN
                select VEND_NOMBRE from VENDEDORES where  VEND_COD = :CODVEND INTO :NOMVEND;
                if (artiaux <> articulo) then
                    begin
                    if (ARTICULO <> '') then
                      if ((CEROS = 'S') or (FALTANTE <> 0)) then
                        SUSPEND;
                    SELECT ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                        FROM articulo WHERE ARTI_COD = :ARTIAUX
                        INTO :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC;
                    SELECT GRUP_NOM FROM GRUPO 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;
                    ARTICULO = ARTIAUX;
                    CANTIDAD = 0;
                    FALTANTE = 0;
                    BASE = 0;
                    end
                CANTIDAD = CANTIDAD + CANT;
                EXECUTE PROCEDURE FALTANTE(:TIPO, :DESTINO, :ID, :ITEM) returning_values (:CANT, :UNIDAD, :FACTOR);
                FALTANTE = FALTANTE + CANT;
                BASE = BASE + (MONTO * CANT);
                END
        if (FALTANTE IS NULL) then
            FALTANTE = 0;
        if (BASE IS NULL) then
            BASE = 0;
        if (IVA IS NULL) then
            IVA = 0;
        if ((CEROS = 'S') or (FALTANTE <> 0)) then
            SUSPEND;
        END
    ELSE
        BEGIN
        if (TIPO = 31) then
            FOR SELECT F.FACT_ID, FADE_ITEM, F.PREF_PRE, FACT_NUMERO, FACT_FECHA, FADE_CANT * FADE_FACTOR, (FADE_PRUNIT-FADE_DTOMONTO), FADE_IVAMONTO, D.ARTI_COD, ARTI_DES, ARTI_UNIDAD, A.GRUP_COD, A.SUBG_COD, A.MARC_COD,f.vend_cod, SUBSTRING(FACT_OBS FROM 1 FOR 255), F.ptvt_id
                FROM FACTURAS F, FACTURAS_DETALLE D, ARTICULO A, PREFIJOS P
                WHERE F.FACT_ID = D.FACT_ID AND FACT_FECHA >= :FECINI AND FACT_FECHA <= :FECFIN  AND VEND_COD >= :VENINI AND VEND_COD <= :VENFIN AND FACT_ANULADO = 'N' AND
                      D.ARTI_COD = A.ARTI_COD AND D.ARTI_COD >= :CODINI AND D.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
                      P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 31 AND ((P.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) and substring(a.arti_cod from 1 FOR 2) <> '.t'
                ORDER BY VEND_COD,ARTI_COD, F.FACT_ID, FADE_ITEM
                INTO :ID, :ITEM, :PREFIJO, :NUMERO, :FECHA, :CANTIDAD, :BASE, :IVA, :ARTICULO, :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC,:CODVEND, :OBS, :PTVTA
                DO
                    BEGIN
                    select VEND_NOMBRE from VENDEDORES where  VEND_COD = :CODVEND INTO :NOMVEND;
                    SELECT GRUP_NOM FROM GRUPO WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                    SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                    SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                    EXECUTE PROCEDURE FALTANTE_CORTE(:TIPO, :DESTINO, :ID, :ITEM, :CORTE) returning_values (:FALTANTE, :UNIDAD, :FACTOR);
                    if ((CEROS = 'S') or (FALTANTE <> 0)) then
                        SUSPEND;
                    END
        if (TIPO = 32) then
            FOR SELECT R.REVT_ID, RVDE_ITEM, R.PREF_PRE, REVT_NUMERO, REVT_FECHA, RVDE_CANT * RVDE_FACTOR, (RVDE_PRUNIT-RVDE_DTOMONTO), RVDE_IVAMONTO, D.ARTI_COD, ARTI_DES, ARTI_UNIDAD, A.GRUP_COD, A.SUBG_COD, A.MARC_COD,R.vend_cod, SUBSTRING(REVT_OBS FROM 1 FOR 255), R.ptvt_id
                FROM REMISIONES_VENTA R, REMISIONES_VENTA_DETALLE D, ARTICULO A, PREFIJOS P
                WHERE R.REVT_ID = D.REVT_ID AND REVT_FECHA >= :FECINI AND REVT_FECHA <= :FECFIN AND VEND_COD >= :VENINI AND VEND_COD <= :VENFIN AND REVT_ANULADO = 'N' AND
                      D.ARTI_COD = A.ARTI_COD AND D.ARTI_COD >= :CODINI AND D.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
                      P.PREF_PRE = R.PREF_PRE AND P.TIDO_COD = 33 AND ((P.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
                ORDER BY VEND_COD,ARTI_COD, R.REVT_ID, RVDE_ITEM
                INTO :ID, :ITEM, :PREFIJO, :NUMERO, :FECHA, :CANTIDAD, :BASE, :IVA, :ARTICULO, :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC,:CODVEND, :OBS, :PTVTA
                DO
                    BEGIN
                    select VEND_NOMBRE from VENDEDORES where  VEND_COD = :CODVEND INTO :NOMVEND;
                    SELECT GRUP_NOM FROM GRUPO WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                    SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                    SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                    EXECUTE PROCEDURE FALTANTE_CORTE(:TIPO, :DESTINO, :ID, :ITEM, :CORTE) returning_values (:FALTANTE, :UNIDAD, :FACTOR);
                    if ((CEROS = 'S') or (FALTANTE <> 0)) then
                        SUSPEND;
                    END
        if (TIPO = 34) then
            FOR SELECT P.PEDI_ID, PEDE_ITEM, P.PREF_PRE, PEDI_NUMERO, PEDI_FECHA, PEDE_CANT * PEDE_FACTOR, (PEDE_PRUNIT-PEDE_DTOMONTO), PEDE_IVAMONTO, D.ARTI_COD, ARTI_DES, ARTI_UNIDAD, A.GRUP_COD, A.SUBG_COD, A.MARC_COD,P.vend_cod, SUBSTRING(PEDI_OBS FROM 1 FOR 255), P.ptvt_id
                FROM PEDIDOS P, PEDIDOS_DETALLE D, ARTICULO A, PREFIJOS PR
                WHERE P.PEDI_ID = D.PEDI_ID AND PEDI_FECHA >= :FECINI AND PEDI_FECHA <= :FECFIN AND VEND_COD >= :VENINI AND VEND_COD <= :VENFIN AND PEDI_ANULADO = 'N' AND
                      D.ARTI_COD = A.ARTI_COD AND D.ARTI_COD >= :CODINI AND D.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
                      P.PREF_PRE = PR.PREF_PRE AND PR.TIDO_COD = 34 AND ((PR.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) AND PEDI_VALIDEZ >= 0
                ORDER BY VEND_COD,ARTI_COD, P.PEDI_ID, PEDE_ITEM
                INTO :ID, :ITEM, PREFIJO, :NUMERO, :FECHA, :CANTIDAD, :BASE, :IVA, :ARTICULO, :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC,:CODVEND, :OBS, :PTVTA
                DO
                    BEGIN
                    select VEND_NOMBRE from VENDEDORES where  VEND_COD = :CODVEND INTO :NOMVEND;
                    SELECT GRUP_NOM FROM GRUPO WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                    SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                    SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                    EXECUTE PROCEDURE FALTANTE_CORTE(:TIPO, :DESTINO, :ID, :ITEM, :CORTE) returning_values (:FALTANTE, :UNIDAD, :FACTOR);
                    if ((CEROS = 'S') or (FALTANTE <> 0)) then
                        SUSPEND;
                    END
        if (TIPO = 35) then
            FOR SELECT C.COTI_ID, CTDE_ITEM, C.PREF_PRE, COTI_NUMERO, COTI_FECHA, CTDE_CANT * CTDE_FACTOR, (CTDE_PRUNIT-CTDE_DTOMONTO), CTDE_IVAMONTO, D.ARTI_COD, ARTI_DES, ARTI_UNIDAD, A.GRUP_COD, A.SUBG_COD, A.MARC_COD,C.vend_cod, SUBSTRING(COTI_OBS FROM 1 FOR 255), C.ptvt_id
                FROM COTIZACIONES C, COTIZACIONES_DETALLE D, ARTICULO A, PREFIJOS P
                WHERE C.COTI_ID = D.COTI_ID AND COTI_FECHA >= :FECINI AND COTI_FECHA <= :FECFIN AND VEND_COD >= :VENINI AND VEND_COD <= :VENFIN AND COTI_ANULADO = 'N' AND
                      D.ARTI_COD = A.ARTI_COD AND D.ARTI_COD >= :CODINI AND D.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
                      P.PREF_PRE = C.PREF_PRE AND P.TIDO_COD = 35 AND ((P.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
                ORDER BY VEND_COD,ARTI_COD, C.COTI_ID, CTDE_ITEM
                INTO :ID, :ITEM, PREFIJO, :NUMERO, :FECHA, :CANTIDAD, :BASE, :IVA, :ARTICULO, :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC,:CODVEND, :OBS, :PTVTA
                DO
                    BEGIN
                    select VEND_NOMBRE from VENDEDORES where  VEND_COD = :CODVEND INTO :NOMVEND;
                    SELECT GRUP_NOM FROM GRUPO WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                    SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                    SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                    EXECUTE PROCEDURE FALTANTE_CORTE(:TIPO, :DESTINO, :ID, :ITEM, :CORTE) returning_values (:FALTANTE, :UNIDAD, :FACTOR);
                    if ((CEROS = 'S') or (FALTANTE <> 0)) then
                        SUSPEND;
                    END
        if (TIPO = 40) then
            FOR SELECT P.pend_id, D.pevd_item, P.PREF_PRE, P.pend_numero, PEND_FECHA, D.pevd_cant * D.pevd_factor, (D.pevd_prunit-D.pevd_dtomonto), D.pevd_ivamonto, D.ARTI_COD, ARTI_DES, ARTI_UNIDAD, A.GRUP_COD, A.SUBG_COD, A.MARC_COD,P.vend_cod, SUBSTRING(P.pend_obs FROM 1 FOR 255)
                FROM pendiente_ventas P, pendiente_ventas_detalle D, ARTICULO A, PREFIJOS PR
                WHERE P.pend_id = D.pend_id AND PEND_FECHA >= :FECINI AND PEND_FECHA <= :FECFIN AND VEND_COD >= :VENINI AND VEND_COD <= :VENFIN AND PEND_ANULADO = 'N' AND
                      D.ARTI_COD = A.ARTI_COD AND D.ARTI_COD >= :CODINI AND D.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
                      P.PREF_PRE = PR.PREF_PRE AND PR.TIDO_COD = 40 AND ((PR.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
                ORDER BY VEND_COD,ARTI_COD, P.pend_id, D.pevd_item
                INTO :ID, :ITEM, PREFIJO, :NUMERO, :FECHA, :CANTIDAD, :BASE, :IVA, :ARTICULO, :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC,:CODVEND, :OBS
                DO
                    BEGIN
                    select VEND_NOMBRE from VENDEDORES where  VEND_COD = :CODVEND INTO :NOMVEND;
                    SELECT GRUP_NOM FROM GRUPO WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                    SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                    SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                    EXECUTE PROCEDURE FALTANTE(:TIPO, :DESTINO, :ID, :ITEM) returning_values (:FALTANTE, :UNIDAD, :FACTOR);
                    if ((CEROS = 'S') or (FALTANTE <> 0)) then
                        SUSPEND;
                    END
        END
   /* END*/
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE REP_KARDEX_ARTICULO(
    DETALLE CHAR(1),
    FECINI DATE,
    FECFIN DATE,
    ARTINI VARCHAR(20),
    ARTFIN VARCHAR(20),
    GRPINI VARCHAR(2),
    GRPFIN VARCHAR(2),
    ORDEN CHAR(1),
    BODEGA VARCHAR(2),
    INACTIVOS CHAR(1))
RETURNS (
    CODIGO VARCHAR(15),
    NOMBRE VARCHAR(60),
    DESCORTA VARCHAR(30),
    UNIDAD VARCHAR(8),
    CODGRUPO VARCHAR(2),
    NOMGRUPO VARCHAR(30),
    CODSUBG VARCHAR(3),
    NOMSUBG VARCHAR(30),
    CODMARC VARCHAR(3),
    NOMMARC VARCHAR(30),
    CODBOD VARCHAR(2),
    SALDOINI NUMERIC(18,4),
    COSTOINI NUMERIC(18,2),
    ENTRADAS NUMERIC(18,4),
    COSTOENT NUMERIC(18,2),
    SALIDAS NUMERIC(18,4),
    COSTOSAL NUMERIC(18,2),
    SALDOFIN NUMERIC(18,4),
    COSTOFIN NUMERIC(18,2),
    TIPODOC VARCHAR(8),
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(8),
    FECHA DATE,
    CONCEPTO VARCHAR(60),
    NIT VARCHAR(20),
    CONS INTEGER,
    CANFINAL NUMERIC(18,4),
    COSFINAL NUMERIC(18,2),
    IVAPORC NUMERIC(9,2),
    RESERVADO NUMERIC(18,4))
AS
DECLARE VARIABLE ENTRADA CHAR(1);
DECLARE VARIABLE CANT NUMERIC(18,4);
DECLARE VARIABLE COSTO NUMERIC(18,2);
DECLARE VARIABLE CODINI VARCHAR(20);
DECLARE VARIABLE CODFIN VARCHAR(20);
DECLARE VARIABLE DESINI VARCHAR(20);
DECLARE VARIABLE DESFIN VARCHAR(20);
declare variable pedido numeric(18,4);
declare variable ordenc numeric(18,4);
declare variable id integer;
declare variable item integer;
declare variable und varchar(8);
declare variable factor numeric(18,4);
declare variable cant2 numeric(18,4);
declare variable PEDAUTO CHAR(2);
BEGIN
if (ORDEN = 'C') then
    BEGIN
    CODINI = ARTINI;
    CODFIN = ARTFIN;
    DESINI = '';
    DESFIN = 'zz';
    END
ELSE
    BEGIN
    DESINI = ARTINI;
    DESFIN = ARTFIN;
    CODINI = '';
    CODFIN = 'zz';
    END
EXECUTE PROCEDURE LEE_CONFIGURACION('FACTURACION', 'FACTURAS', 'GENERAR PEDIDO AUTOMATICAMENTE CON LA FACTURA') returning_values (pedauto);
  FOR
    SELECT ARTI_COD, ARTI_DES, ARTI_DESCORTA, ARTI_UNIDAD, A.GRUP_COD, A.SUBG_COD, A.MARC_COD, t.taiv_porc
      FROM ARTICULO A, tarifa_iva t
      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 ((A.ESAR_COD <> 'I') or (:INACTIVOS = 'S')) AND A.taiv_cod = T.taiv_cod
      INTO :CODIGO, :NOMBRE, :DESCORTA, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC, :ivaporc
      DO
        BEGIN
        NOMMARC = '';
        NOMSUBG = '';
        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 (BODEGA = '') then
            BEGIN
            EXECUTE PROCEDURE SALDO_INICIAL_TOTAL_INV(CODIGO, FECINI) returning_values (:SALDOINI);
            EXECUTE PROCEDURE VALOR_INICIAL_INVENTARIO(CODIGO, FECINI) returning_values (COSTOINI);
            END
        ELSE
            BEGIN
            EXECUTE PROCEDURE SALDO_INICIAL_INVENTARIO(CODIGO, FECINI, :BODEGA) returning_values (SALDOINI);
            EXECUTE PROCEDURE COSTO_PROMEDIO(CODIGO, FECINI-1) returning_values (COSTOINI);
            COSTOINI = COSTOINI * saldoini;
            END
        if (DETALLE = 'N') then
            BEGIN
            /* SUME LAS ENTRADAS */
            if (BODEGA = '') then
              SELECT SUM(COST_ENTC), SUM(COST_ENTP), SUM(COST_SALC), SUM(COST_SALP) FROM COSTOS
                WHERE (COST_FECHA >= :FECINI) AND (COST_FECHA <= :FECFIN) AND (ARTI_COD = :codigo)
                INTO :ENTRADAS, :COSTOENT, :SALIDAS, :COSTOSAL;
            ELSE
              SELECT SUM(COST_ENTC), SUM(COST_ENTP), SUM(COST_SALC), SUM(COST_SALP)
                FROM COSTOS C, MOVIMIENTO_ARTICULO M
                WHERE (COST_FECHA >= :FECINI) AND (COST_FECHA <= :FECFIN) AND (C.ARTI_COD = :codigo) AND C.cost_idmov = M.mvar_cons AND BODE_COD = :BODEGA
                INTO :ENTRADAS, :COSTOENT, :SALIDAS, :COSTOSAL;

            if (ENTRADAS IS NULL) then
              ENTRADAS = 0;
            if (COSTOENT IS NULL) then
              COSTOENT = 0;
            if (SALIDAS IS NULL) then
              SALIDAS = 0;
            if (COSTOSAL IS NULL) then
              COSTOSAL = 0;
            SALDOFIN = SALDOINI + ENTRADAS - SALIDAS;
            COSTOFIN = COSTOINI + COSTOENT - COSTOSAL;
            if (BODEGA = '') then
                BEGIN
                EXECUTE PROCEDURE SALDO_INICIAL_TOTAL_INV(CODIGO, fecfin+1) returning_values (canfinal);
                EXECUTE PROCEDURE VALOR_INICIAL_INVENTARIO(CODIGO, FECFIN+1) returning_values (cosfinal);
                SELECT SUM(RSDE_LIBERAR)
                    FROM RESERVAS_DETALLE RD, RESERVAS R
                    WHERE R.RESE_ID = RD.RESE_ID AND ARTI_COD = :CODIGO AND RESE_FECHA <= :fecfin AND RESE_VENCE >= :fecfin AND RSDE_ANULADO = 'N'
                    INTO :RESERVADO;
                if (RESERVADO IS NULL) then
                    RESERVADO = 0;
                PEDIDO = 0;
                FOR SELECT P.PEDI_ID, PEDE_ITEM, PEDE_CANT * PEDE_FACTOR
                    FROM PEDIDOS P, PEDIDOS_DETALLE PD
                    WHERE P.PEDI_ID = PD.PEDI_ID AND PD.ARTI_COD = :CODIGO AND PEDI_VENCE >= :fecfin AND PEDI_FECHA <= :fecfin AND PEDE_ANULADO = 'N'
                    INTO :ID, :ITEM, :CANT2
                    do
                    BEGIN
                    EXECUTE PROCEDURE FALTANTE(34, 31, ID, ITEM) returning_values (ORDENC, UND, FACTOR);
                    if ((ORDENC * FACTOR = CANT2) or (PEDAUTO = 'SI')) then /* SI NO SE HA FACTURADO MIRE A VER SI SE REMISIONO */
                        EXECUTE PROCEDURE FALTANTE(34, 32, ID, ITEM) returning_values (ORDENC, UND, FACTOR);
                    if (ORDENC IS NULL) then
                        ORDENC = 0;
                    PEDIDO = PEDIDO + ORDENC * FACTOR;
                    END
                RESERVADO = RESERVADO + PEDIDO;
                END
            ELSE
                BEGIN
                EXECUTE PROCEDURE SALDO_INICIAL_INVENTARIO(CODIGO, FECFIN+1, :BODEGA) returning_values (CANFINAL);
                EXECUTE PROCEDURE COSTO_PROMEDIO(CODIGO, FECFIN+1) returning_values (COSFINAL);
                COSFINAL = COSFINAL * CANFINAL;
                SELECT SUM(RSDE_LIBERAR)
                    FROM RESERVAS_DETALLE RD, RESERVAS R
                    WHERE R.RESE_ID = RD.RESE_ID AND ARTI_COD = :CODIGO AND RESE_FECHA <= :fecfin AND RESE_VENCE >= :fecfin AND RD.BODE_COD = :bodega AND RSDE_ANULADO = 'N'
                    INTO :RESERVADO;
                if (RESERVADO IS NULL) then
                    RESERVADO = 0;
                PEDIDO = 0;
                FOR SELECT P.PEDI_ID, PEDE_ITEM, PEDE_CANT * PEDE_FACTOR
                    FROM PEDIDOS P, PEDIDOS_DETALLE PD
                    WHERE P.PEDI_ID = PD.PEDI_ID AND PD.ARTI_COD = :CODIGO AND PEDI_VENCE >= :FECHA AND PEDI_FECHA <= :FECHA AND PEDE_ANULADO = 'N' AND BODE_COD = :bodega
                    INTO :ID, :ITEM, :CANT2
                    do
                    BEGIN
                    EXECUTE PROCEDURE FALTANTE(34, 31, ID, ITEM) returning_values (ORDENC, UND, FACTOR);
                    if ((ORDENC * FACTOR = CANT2) or (PEDAUTO = 'SI')) then /* SI NO SE HA FACTURADO MIRE A VER SI SE REMISIONO */
                        EXECUTE PROCEDURE FALTANTE(34, 32, ID, ITEM) returning_values (ORDENC, UND, FACTOR);
                    if (ORDENC IS NULL) then
                        ORDENC = 0;
                    PEDIDO = PEDIDO + ORDENC * FACTOR;
                    END
                RESERVADO = RESERVADO + PEDIDO;
                END
            SUSPEND;
            END
        ELSE
            BEGIN
            SALDOFIN = SALDOINI;
            COSTOFIN = COSTOINI;
            COSTOENT = 0;
            COSTOSAL = 0;
            FOR SELECT MVAR_TIPODOC, MVAR_ENTRADA, MVAR_PREF, MVAR_NUMERO, MVAR_CANT, MVAR_COSTO, MVAR_CONC, MVAR_FECHA, M.TERC_NIT, MVAR_CONS, BODE_COD, COST_SALDOP, COST_SALDOC
                FROM MOVIMIENTO_ARTICULO M, COSTOS C
                WHERE M.arti_cod = C.arti_cod AND M.mvar_cons = C.cost_idmov AND (m.ARTI_COD = :CODIGO) AND (MVAR_FECHA >= :FECINI) AND (MVAR_FECHA <= :FECFIN) AND (MVAR_TIPODOC <> 13)
                ORDER BY M.ARTI_COD, MVAR_FECHA, MVAR_CONS
                INTO :TIPODOC, :ENTRADA, :PREFIJO, :NUMERO, :ENTRADAS, :COSTOENT, :CONCEPTO, :FECHA, :NIT, :CONS, :CODBOD, :costo, :cant
                DO
                    BEGIN
                    SELECT TIDO_NOMCORTO FROM TIPO_DOCUMENTO WHERE TIDO_COD = :TIPODOC INTO :TIPODOC;
                    if (ENTRADA = 'S') then
                        BEGIN
                        SALIDAS = 0;
                        SALDOFIN = SALDOFIN + ENTRADAS;
                        COSTOFIN = COSTOFIN + (ENTRADAS * COSTOENT);
                        if (CANT > 0) then
                            COSTOSAL = COSTO / CANT;
                        else
                            COSTOSAL = 0;
                        end
                    ELSE
                        BEGIN
                        SALIDAS = ENTRADAS;
                        ENTRADAS = 0;
                        if (CANT > 0) then
                            COSTOSAL = COSTO / CANT;
                        else
                            COSTOSAL = 0;
                        SALDOFIN = SALDOFIN - SALIDAS;
                        COSTOFIN = COSTOFIN - (SALIDAS * costosal);
                        END
                    SUSPEND;
                    END
            END
        END
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE REP_MOVIMIENTO_X_ARTICULO(
    DETALLE CHAR(1),
    FECINI DATE,
    FECFIN DATE,
    ARTINI VARCHAR(20),
    ARTFIN VARCHAR(20),
    GRPINI VARCHAR(2),
    GRPFIN VARCHAR(2),
    ORDEN CHAR(1),
    SUBEMPRESA INTEGER)
RETURNS (
    CODIGO VARCHAR(15),
    NOMBRE VARCHAR(60),
    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),
    SALDOINI NUMERIC(18,4),
    ENTRADAS NUMERIC(18,4),
    SALIDAS NUMERIC(18,4),
    RESERVADO NUMERIC(18,4),
    SALDOFIN NUMERIC(18,4),
    TIPODOC VARCHAR(8),
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(8),
    FECHA DATE,
    CONCEPTO VARCHAR(60),
    LOTE VARCHAR(15),
    LO_VENCE DATE,
    NIT VARCHAR(20),
    NOMTERC VARCHAR(60),
    CONS INTEGER)
AS
declare variable ENTRADA CHAR(1);
declare variable CODINI VARCHAR(20);
declare variable CODant VARCHAR(15) CHARACTER SET NONE;
declare variable CODFIN VARCHAR(20);
declare variable DESINI VARCHAR(20);
declare variable DESFIN VARCHAR(20);
declare variable id integer;
declare variable item integer;
declare variable und varchar(8);
declare variable factor numeric(18,4);
declare variable cant2 numeric(18,4);
declare variable ordenc numeric(18,4);
declare variable PEDAUTO CHAR(2);
BEGIN
if (ORDEN = 'C') then
    BEGIN
    CODINI = ARTINI;
    CODFIN = ARTFIN;
    DESINI = '';
    DESFIN = 'zz';
    END
ELSE
    BEGIN
    DESINI = ARTINI;
    DESFIN = ARTFIN;
    CODINI = '';
    CODFIN = 'zz';
    END

EXECUTE PROCEDURE LEE_CONFIGURACION('FACTURACION', 'FACTURAS', 'GENERAR PEDIDO AUTOMATICAMENTE CON LA FACTURA') returning_values (pedauto);
if (DETALLE = 'L') then
  BEGIN
   codant = 0;
   for SELECT A.ARTI_COD, ARTI_DES, ARTI_UNIDAD, A.GRUP_COD, A.SUBG_COD, A.MARC_COD, LOTE_NRO,LOTE_VENCE, BODE_COD
     FROM ARTICULO A, LOTES L
     WHERE A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :GRPFIN AND
       ARTI_DES >= :DESINI AND ARTI_DES <= :DESFIN AND A.ESAR_COD <> 'I' AND a.arti_cod = l.arti_cod
     INTO :CODIGO, :NOMBRE, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC, :LOTE, :LO_VENCE, :codbod
     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;
      SELECT BODE_NOM FROM BODEGA WHERE BODE_COD = :codbod INTO nombod;

      SELECT SUM(RSDE_LIBERAR)
        FROM RESERVAS_DETALLE RD, RESERVAS R
        WHERE R.RESE_ID = RD.RESE_ID AND ARTI_COD = :CODIGO AND RESE_FECHA <= :FECFIN AND RESE_VENCE >= :FECFIN AND RD.BODE_COD = :CODBOD AND RSDE_ANULADO = 'N'
        INTO :RESERVADO;
      if (RESERVADO IS NULL) then
        RESERVADO = 0;
      FOR SELECT P.PEDI_ID, PEDE_ITEM, PEDE_CANT * PEDE_FACTOR
        FROM PEDIDOS P, PEDIDOS_DETALLE PD
        WHERE P.PEDI_ID = PD.PEDI_ID AND PD.ARTI_COD = :CODIGO AND PEDI_VENCE >= :FECFIN AND PEDI_FECHA <= :FECFIN AND PEDE_ANULADO = 'N' AND BODE_COD = :CODBOD
        INTO :ID, :ITEM, :CANT2
        do
        BEGIN
        EXECUTE PROCEDURE FALTANTE(34, 31, ID, ITEM) returning_values (ORDENC, UND, FACTOR);
        if ((ORDENC * FACTOR = CANT2) or (PEDAUTO = 'SI')) then /* SI NO SE HA FACTURADO MIRE A VER SI SE REMISIONO */
            EXECUTE PROCEDURE FALTANTE(34, 32, ID, ITEM) returning_values (ORDENC, UND, FACTOR);
        if (ORDENC IS NULL) then
            ORDENC = 0;
        RESERVADO = RESERVADO + ORDENC * FACTOR;
        END

      SELECT FIRST 1 (EXLO_SALDO + EXLO_ENT - EXLO_SAL) FROM existencia_lote WHERE ARTI_COD = :codigo AND LOTE_NRO = :lote AND
        BODE_COD = :codbod AND EXLO_FECHA < :fecini INTO :saldoini;
      if (SALDOINI IS NULL) then
        SALDOINI = 0;

      if (codigo <> codant) then
          SALDOFIN = SALDOINI;
      for SELECT TIPODOC, PREFIJO, NUMERO, FECHA, CONCEPTO, ENT, CANTENT, CANTSAL, NIT, CONS
        FROM MOVLOTES_DESDE_HASTA(:codigo, :codbod, :LOTE,:fecini, :fecfin,:SUBEMPRESA)
        ORDER BY FECHA,CONS
        INTO :TIPODOC, :PREFIJO, :NUMERO, :FECHA, :CONCEPTO, :ENTRADA, :ENTRADAS, :SALIDAS, :NIT, :CONS
        DO
        BEGIN
          if (nit is not null) then
            SELECT TERC_NOM FROM TERCEROS WHERE TERC_NIT = :NIT INTO :NOMTERC;
          else
            NOMTERC = '';
          if (ENTRADA = 'S') then
           BEGIN
            salidas = 0;
            SALDOFIN = SALDOFIN + ENTRADAS;
           END
          ELSE
           BEGIN
            ENTRADAS = 0;
            SALDOFIN = SALDOFIN - SALIDAS;
           END
          SUSPEND;
        END
      codant = :codigo;
    END
  END
ELSE
 BEGIN
  FOR
    SELECT ARTI_COD, ARTI_DES, ARTI_UNIDAD, A.GRUP_COD, A.SUBG_COD, A.MARC_COD, BODE_COD, BODE_NOM
      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 A.ESAR_COD <> 'I' AND ((SUCU_ID = :SUBEMPRESA) OR (:SUBEMPRESA = 0))
      INTO :CODIGO, :NOMBRE, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC, :CODBOD, :NOMBOD
      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;
        EXECUTE PROCEDURE SALDO_INICIAL_INVENTARIO(CODIGO, FECINI, :CODBOD) returning_values (:SALDOINI);
        if (DETALLE = 'N') then
            BEGIN
            /* SUME LAS ENTRADAS */
            SELECT SUM(MVAR_CANT) FROM MOVIMIENTO_ARTICULO
              WHERE (MVAR_FECHA >= :FECINI) AND (MVAR_FECHA <= :FECFIN) AND
              (ARTI_COD = :CODIGO) AND (BODE_COD = :CODBOD) AND (MVAR_ENTRADA = 'S') INTO :ENTRADAS;
            if (ENTRADAS IS NULL) then
              ENTRADAS = 0;
            /* CALCULE LAS SALIDAS A COSTO PROMEDIO */
            SALIDAS = 0;
            SELECT SUM(MVAR_CANT)
                FROM MOVIMIENTO_ARTICULO
                WHERE (MVAR_FECHA >= :FECINI) AND (MVAR_FECHA <= :FECFIN) AND
                (ARTI_COD = :CODIGO) AND (BODE_COD = :CODBOD) AND (MVAR_ENTRADA = 'N')
                INTO :SALIDAS;
            if (SALIDAS IS NULL) then
              SALIDAS = 0;
            SALDOFIN = SALDOINI + ENTRADAS - SALIDAS;
            SUSPEND;
            END
        if (DETALLE = 'B') then
            BEGIN
            SALDOFIN = SALDOINI;
            FOR SELECT TIDO_NOMCORTO, MVAR_ENTRADA, MVAR_PREF, MVAR_NUMERO, MVAR_CANT, MVAR_CONC, MVAR_FECHA, M.TERC_NIT, MVAR_CONS
                FROM MOVIMIENTO_ARTICULO M, TIPO_DOCUMENTO TD
                WHERE TD.TIDO_COD = MVAR_TIPODOC AND (MVAR_FECHA >= :FECINI) AND (MVAR_FECHA <= :FECFIN) AND (ARTI_COD = :CODIGO) AND (BODE_COD = :CODBOD)
                ORDER BY MVAR_FECHA, MVAR_CONS
                INTO :TIPODOC, :ENTRADA, :PREFIJO, :NUMERO, :ENTRADAS, :CONCEPTO, :FECHA, :NIT, :CONS
                DO
                    BEGIN
                    if (nit is not null) then
                        SELECT TERC_NOM FROM TERCEROS WHERE TERC_NIT = :NIT INTO :NOMTERC;
                    else
                        NOMTERC = '';
                    if (ENTRADA = 'S') then
                        BEGIN
                        SALIDAS = 0;
                        SALDOFIN = SALDOFIN + ENTRADAS;
                        end
                    ELSE
                        BEGIN
                        SALIDAS = ENTRADAS;
                        ENTRADAS = 0;
                        SALDOFIN = SALDOFIN - SALIDAS;
                        END
                    SUSPEND;
                    END
            END
        END
  END
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE RESERVAS_ARTICULO(
    FECHA DATE,
    DETALLE CHAR(1))
RETURNS (
    CODIGO VARCHAR(15),
    NOMBRE VARCHAR(60),
    RESERVA NUMERIC(18,4),
    EXIST NUMERIC(18,2),
    FALTANTE NUMERIC(18,2),
    COSTO NUMERIC(18,2),
    UNIDAD VARCHAR(8),
    CODGRUPO VARCHAR(2),
    NOMGRUPO VARCHAR(30),
    CODSUBG VARCHAR(3),
    NOMSUBG VARCHAR(30),
    CODMARC VARCHAR(3),
    NOMMARC VARCHAR(30),
    COSTOTOT NUMERIC(18,2),
    CLIENTE VARCHAR(60),
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(8),
    FECHADOC DATE)
AS
declare variable PEDIDO NUMERIC(18,4);
declare variable ID INTEGER;
declare variable ITEM INTEGER;
declare variable UND VARCHAR(8);
declare variable FACTOR NUMERIC(18,4);
declare variable FACT NUMERIC(18,4);
declare variable CANT NUMERIC(18,4);
declare variable PEDAUTO CHAR(2);
BEGIN
EXECUTE PROCEDURE LEE_CONFIGURACION('FACTURACION', 'FACTURAS', 'GENERAR PEDIDO AUTOMATICAMENTE CON LA FACTURA') returning_values (pedauto);
  FOR
    SELECT ARTI_COD, ARTI_DES, ARTI_UNIDAD, A.GRUP_COD, A.SUBG_COD, A.MARC_COD
      FROM ARTICULO A
      INTO :CODIGO, :NOMBRE, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
      DO
        BEGIN
        NOMMARC = '';
        NOMSUBG = '';
        SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
        SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
        SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
        EXECUTE PROCEDURE SALDO_TOTAL_INVENTARIO(CODIGO, FECHA) returning_values (EXIST);
        if (DETALLE = 'N') then
            BEGIN
            EXECUTE PROCEDURE COSTO_PROMEDIO(CODIGO, FECHA) returning_values (COSTO);
            SELECT SUM(RSDE_LIBERAR) FROM RESERVAS R, RESERVAS_DETALLE RD
                WHERE R.RESE_ID = RD.RESE_ID AND RD.ARTI_COD = :CODIGO AND RESE_FECHA <= :FECHA AND RESE_VENCE > :FECHA AND RESE_ANULADO = 'N'
                INTO :RESERVA;
            if (RESERVA IS NULL) then
                RESERVA = 0;
            FOR SELECT P.PEDI_ID, PEDE_ITEM, PEDE_CANT * PEDE_FACTOR
                FROM PEDIDOS P, PEDIDOS_DETALLE D
                WHERE P.PEDI_ID = D.PEDI_ID AND D.ARTI_COD = :CODIGO AND (PEDI_FECHA+PEDI_VALIDEZ) >= :FECHA AND PEDI_FECHA <= :FECHA AND PEDI_ANULADO = 'N'
                INTO :ID, :item, :CANT
                DO
                BEGIN
                EXECUTE PROCEDURE FALTANTE(34, 31, ID, ITEM) returning_values (PEDIDO, UND, FACT);
                if (PEDIDO * FACT = CANT) then
                    EXECUTE PROCEDURE FALTANTE(34, 32, ID, ITEM) returning_values (PEDIDO, UND, FACT);
                if (PEDIDO IS NULL) then
                    PEDIDO = 0;
                RESERVA = RESERVA + PEDIDO;
                END
            if (RESERVA > EXIST) then
                FALTANTE = RESERVA - EXIST;
            ELSE
                FALTANTE = 0;
            COSTOTOT = RESERVA * COSTO;
            if (RESERVA > 0) then
                SUSPEND;
            END
        ELSE
            BEGIN
            FOR SELECT RESE_FECHA, PREF_PRE, RESE_NUMERO, RESE_NOMTERC, RDSE_CANT, RSDE_UNIDAD, RSDE_LIBERAR
                FROM RESERVAS R, RESERVAS_DETALLE RD
                WHERE R.RESE_ID = RD.RESE_ID AND RD.ARTI_COD = :CODIGO AND RESE_FECHA <= :FECHA AND RESE_VENCE > :FECHA AND RESE_ANULADO = 'N'
                INTO :FECHADOC, :PREFIJO, :NUMERO, :CLIENTE, :RESERVA, :UNIDAD, :FALTANTE
                DO
                BEGIN
                if (RESERVA > EXIST) then
                    FALTANTE = RESERVA - EXIST;
                ELSE
                    FALTANTE = 0;
                COSTOTOT = RESERVA * COSTO;
                SUSPEND;
                END
            FOR SELECT P.PEDI_ID, PEDE_ITEM, PEDI_FECHA, PREF_PRE, PEDI_NUMERO, PEDI_NOMTERC, PEDE_CANT, PEDE_UNIDAD, PEDE_RESERVA, PEDE_FACTOR
                FROM PEDIDOS P, PEDIDOS_DETALLE PD
                WHERE P.PEDI_ID = PD.PEDI_ID AND PD.ARTI_COD = :CODIGO AND PEDI_FECHA <= :FECHA AND (PEDI_FECHA+PEDI_VALIDEZ) >= :FECHA AND PEDI_ANULADO = 'N'
                INTO :ID, :ITEM, :FECHADOC, :PREFIJO, :NUMERO, :CLIENTE, :CANT, :UNIDAD, :FALTANTE, :FACTOR
                DO
                BEGIN
                EXECUTE PROCEDURE FALTANTE(34, 31, ID, ITEM) returning_values (RESERVA, UND, FACT);
                if ((RESERVA * FACT = CANT * FACTOR) or (PEDAUTO = 'SI')) then
                    EXECUTE PROCEDURE FALTANTE(34, 31, ID, ITEM) returning_values (RESERVA, UND, FACTOR);
                if (RESERVA IS NULL) then
                    RESERVA = 0;
                if (RESERVA > 0) then
                    BEGIN
                    if (RESERVA > EXIST) then
                        FALTANTE = RESERVA - EXIST;
                    ELSE
                        FALTANTE = 0;
                    COSTOTOT = RESERVA * COSTO;
                    SUSPEND;
                    END
                END
            END
        END
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE RESERVAS_ARTICULO_FECHA(
    ARTICULO VARCHAR(15),
    FECHA DATE)
RETURNS (
    FECRES DATE,
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(8),
    VENCE DATE,
    CLIENTE VARCHAR(60),
    CANTIDAD NUMERIC(18,2),
    UNIDAD VARCHAR(8),
    TIPO INTEGER,
    ID INTEGER)
AS
declare variable ITEM INTEGER;
declare variable FACTOR NUMERIC(18,4);
declare variable UND VARCHAR(8);
declare variable FACT NUMERIC(18,4);
declare variable ORDENC NUMERIC(18,4);
declare variable PEDAUTO CHAR(2);
BEGIN
TIPO = 17;
  /* MUESTRA LAS RESERVAS DEL ARTICULO QUE NO SE HAN VENCIDO */
  FOR SELECT R.RESE_ID, RESE_FECHA, PREF_PRE, RESE_NUMERO, RESE_VENCE, RESE_NOMTERC, RDSE_CANT, RSDE_UNIDAD
    FROM RESERVAS R, RESERVAS_DETALLE RD
    WHERE R.RESE_ID = RD.RESE_ID AND RD.ARTI_COD = :ARTICULO AND RESE_VENCE >= :FECHA AND RESE_FECHA <= :FECHA AND RSDE_ANULADO = 'N'
    INTO :ID, :FECRES, :PREFIJO, :NUMERO, :VENCE, :CLIENTE, :CANTIDAD, :UNIDAD
        DO
          SUSPEND;
TIPO = 34;
  /* MUESTRA LOS PEDIDOS DEL ARTICULO QUE NO SE HAN VENCIDO */
  FOR SELECT P.PEDI_ID, PEDE_ITEM, PEDI_FECHA, PREF_PRE, PEDI_NUMERO, (PEDI_FECHA + PEDI_VALIDEZ), PEDI_NOMTERC, PEDE_CANT, PEDE_UNIDAD, PEDE_FACTOR
    FROM PEDIDOS P, PEDIDOS_DETALLE PD
    WHERE P.PEDI_ID = PD.PEDI_ID AND PD.ARTI_COD = :ARTICULO AND (PEDI_FECHA+PEDI_VALIDEZ) >= :FECHA AND PEDI_FECHA <= :FECHA AND PEDE_ANULADO = 'N'
    INTO :ID, :ITEM, :FECRES, :PREFIJO, :NUMERO, :VENCE, :CLIENTE, :CANTIDAD, :UNIDAD, :FACTOR
    DO
        BEGIN
        EXECUTE PROCEDURE FALTANTE(34, 31, ID, ITEM) returning_values (ORDENC, UND, FACT);
        if ((ORDENC * FACT = CANTIDAD * FACTOR) or (PEDAUTO = 'SI')) then
            EXECUTE PROCEDURE FALTANTE(34, 32, ID, ITEM) returning_values (ORDENC, UND, FACTOR);
        if (ORDENC IS NULL) then
            ORDENC = 0;
        if (ORDENC <> 0) then
            BEGIN
            CANTIDAD = ORDENC;
            UNIDAD = UND;
            SUSPEND;
            END
        END
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE DESCARGA_REMISION_FALTANTE(
    REMISION1 VARCHAR(10),
    REMISION2 VARCHAR(10),
    REMISION3 VARCHAR(10),
    REMISION4 VARCHAR(10),
    REMISION5 VARCHAR(10),
    REMISION6 VARCHAR(10),
    PREFAC VARCHAR(4),
    NUMFAC VARCHAR(8))
RETURNS (
    IDCON INTEGER)
AS
declare variable IDF INTEGER;
declare variable IDR6 INTEGER;
declare variable IDR5 INTEGER;
declare variable IDR4 INTEGER;
declare variable IDR3 INTEGER;
declare variable IDR2 INTEGER;
declare variable IDR1 INTEGER;
declare variable ITEM INTEGER;
begin
IDR1 = 0;
IDR2 = 0;
IDR3 = 0;
IDR4 = 0;
IDR5 = 0;
IDR6 = 0;
ITEM = 0;
SELECT REVT_ID FROM REMISIONES_VENTA WHERE PREF_PRE = SUBSTR(:remision1, 1, 4) AND REVT_NUMERO = SUBSTR(:remision1, 5, 10) INTO :IDR1;
SELECT REVT_ID FROM REMISIONES_VENTA WHERE PREF_PRE = SUBSTR(:remision2, 1, 4) AND REVT_NUMERO = SUBSTR(:remision2, 5, 10) INTO :IDR2;
SELECT REVT_ID FROM REMISIONES_VENTA WHERE PREF_PRE = SUBSTR(:remision3, 1, 4) AND REVT_NUMERO = SUBSTR(:remision3, 5, 10) INTO :IDR3;
SELECT REVT_ID FROM REMISIONES_VENTA WHERE PREF_PRE = SUBSTR(:remision4, 1, 4) AND REVT_NUMERO = SUBSTR(:remision4, 5, 10) INTO :IDR4;
SELECT REVT_ID FROM REMISIONES_VENTA WHERE PREF_PRE = SUBSTR(:remision5, 1, 4) AND REVT_NUMERO = SUBSTR(:remision5, 5, 10) INTO :IDR5;
SELECT REVT_ID FROM REMISIONES_VENTA WHERE PREF_PRE = SUBSTR(:remision6, 1, 4) AND REVT_NUMERO = SUBSTR(:remision6, 5, 10) INTO :IDR6;
IF (IDR1 <> 0) THEN
    BEGIN
    ITEM = ITEM + 1;
    SELECT FACT_ID FROM FACTURAS WHERE PREF_PRE = :prefac AND FACT_NUMERO = :numfac INTO :IDF;
    IDCON = GEN_ID(ID_CONS, 1);
    UPDATE FACTURAS SET FACT_CONSOLIDA = :idcon WHERE FACT_ID = :IDF;
    INSERT INTO CONSOLIDE_FALTANTES (CEFA_ID, CEFA_ITEM, CEFA_TIPODES, CEFA_TIPOORI, CEFA_IDORI)
        VALUES (:IDCON, :ITEM, 31, 32, :IDR1);
    IF (IDR2 <> 0) THEN
        BEGIN
        ITEM = ITEM + 1;
        INSERT INTO CONSOLIDE_FALTANTES (CEFA_ID, CEFA_ITEM, CEFA_TIPODES, CEFA_TIPOORI, CEFA_IDORI)
            VALUES (:IDCON, :ITEM, 31, 32, :IDR2);
        END
    IF (IDR3 <> 0) THEN
        BEGIN
        ITEM = ITEM + 1;
        INSERT INTO CONSOLIDE_FALTANTES (CEFA_ID, CEFA_ITEM, CEFA_TIPODES, CEFA_TIPOORI, CEFA_IDORI)
            VALUES (:IDCON, :ITEM, 31, 32, :IDR3);
        END
    IF (IDR4 <> 0) THEN
        BEGIN
        ITEM = ITEM + 1;
        INSERT INTO CONSOLIDE_FALTANTES (CEFA_ID, CEFA_ITEM, CEFA_TIPODES, CEFA_TIPOORI, CEFA_IDORI)
            VALUES (:IDCON, :ITEM, 31, 32, :IDR4);
        END
    IF (IDR5 <> 0) THEN
        BEGIN
        ITEM = ITEM + 1;
        INSERT INTO CONSOLIDE_FALTANTES (CEFA_ID, CEFA_ITEM, CEFA_TIPODES, CEFA_TIPOORI, CEFA_IDORI)
            VALUES (:IDCON, :ITEM, 31, 32, :IDR5);
        END
    IF (IDR6 <> 0) THEN
        BEGIN
        ITEM = ITEM + 1;
        INSERT INTO CONSOLIDE_FALTANTES (CEFA_ID, CEFA_ITEM, CEFA_TIPODES, CEFA_TIPOORI, CEFA_IDORI)
            VALUES (:IDCON, :ITEM, 31, 32, :IDR6);
        END
    EXECUTE PROCEDURE consolide_pendientes (:IDCON);
    suspend;
    END
end
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE RECALCULA_FALTANTES_VENTAS2(
    FECINI DATE,
    FECFIN DATE,
    PREF VARCHAR(4))
RETURNS (
    FACTURA VARCHAR(8),
    REMISION VARCHAR(30),
    IDCON INTEGER)
AS
declare variable IDF INTEGER;
declare variable IDR INTEGER;
begin
FOR SELECT FACT_REMISION, FACT_NUMERO, FACT_ID FROM FACTURAS WHERE ((FACT_CONSOLIDA IS NULL) or (FACT_CONSOLIDA = 0)) AND
    (FACT_ANULADO = 'N') AND (FACT_REMISION IS NOT NULL) AND FACT_FECHA >= :FECINI AND FACT_FECHA <= :FECFIN AND PREF_PRE = :PREF
    INTO :REMISION, :FACTURA, :IDF
    DO
    BEGIN
    if (STRLEN(REMISION) = 10) then
        BEGIN
        IDR = 0;
        SELECT REVT_ID FROM REMISIONES_VENTA WHERE PREF_PRE = SUBSTR(:remision, 1, 4) AND REVT_NUMERO = SUBSTR(:remision, 5, 10) INTO :IDR;
        IF (IDR <> 0) THEN
            BEGIN
            IDCON = GEN_ID(ID_CONS, 1);
            INSERT INTO CONSOLIDE_FALTANTES (CEFA_ID, CEFA_ITEM, CEFA_TIPODES, CEFA_TIPOORI, CEFA_IDORI)
                VALUES (:IDCON, 1, 31, 32, :IDR);
            EXECUTE PROCEDURE consolide_pendientes (:IDCON);
            UPDATE FACTURAS SET FACT_CONSOLIDA = :idcon WHERE FACT_ID = :IDF;
            suspend;
            END
        END
    END
end
^

SET TERM ; ^

SET TERM ^ ;

ALTER TRIGGER REMISIONES_VENTA_BI
AS
declare variable NUMERO VARCHAR(8);
declare variable AUTOM CHAR(1);
declare variable EXISTE CHAR(1);
declare variable PEDAUTO CHAR(2);
declare variable ITEM INTEGER;
declare variable IDF INTEGER;
declare variable IDP INTEGER;
declare variable IDC INTEGER;
declare variable FECSERVER CHAR(2);
declare variable PEDIDOREP char(2);
declare variable TIPO VARCHAR(8);
declare variable NUMROWS INTEGER;
declare variable IDPEDIDO INTEGER;
declare variable NUMPEDIDO VARCHAR(10);
BEGIN
EXECUTE PROCEDURE LEE_CONFIGURACION('FACTURACION', 'DOCUMENTOS', 'INHABILITAR FECHA EN DOCUMENTOS') returning_values (:fecserver);
if (FECSERVER = 'SI') then
    NEW.revt_fecha = CAST ('NOW' AS DATE);
if (NEW.numok = 'N') then
  BEGIN
  /* Actualice el contador del prefijo */
  SELECT PREF_ACTUAL, PREF_AUTO FROM PREFIJOS WHERE TIDO_COD = 32 AND PREF_PRE = NEW.PREF_PRE INTO :NUMERO, :AUTOM;
  /* ACTUALICE EL NUMERO EN COMPROBANTE_ENCABEZADO  */
  if (AUTOM = 'S') then
    BEGIN
    NEW.REVT_NUMERO = NUMERO;
    NUMERO = CAST((CAST(NUMERO AS INTEGER) + 1) AS CHAR(6));
    UPDATE PREFIJOS
      SET PREF_ACTUAL = :NUMERO
    WHERE TIDO_COD = 32 AND PREF_PRE = NEW.PREF_PRE;
    END
  ELSE
    BEGIN
    if (CAST(NUMERO AS INTEGER) = CAST(NEW.REVT_NUMERO AS INTEGER)) then
        UPDATE PREFIJOS
          SET PREF_ACTUAL = CAST((CAST(PREF_ACTUAL AS INTEGER) + 1) AS CHAR(6))
        WHERE TIDO_COD = 32 AND PREF_PRE = NEW.PREF_PRE;
    END
  EXECUTE PROCEDURE COMPLETA_CEROS (NEW.REVT_numero) returning_values (NEW.REVT_numero);
  NEW.numok = 'S';
  END
/* Verifique que el numero no existe previamente */
EXISTE = 'N';
SELECT 'S' FROM REMISIONES_VENTA WHERE PREF_PRE = NEW.PREF_PRE AND REVT_NUMERO = NEW.REVT_NUMERO INTO :EXISTE;
if (EXISTE = 'S') then
    EXCEPTION DOCUMENTO_REGISTRADO 'Ya existe una remisión a cliente con el número ' || new.pref_pre || new.revt_numero;

/* si hay pedido automatico saque una copia de la consolidacion */
EXECUTE PROCEDURE LEE_CONFIGURACION('FACTURACION', 'FACTURAS', 'GENERAR PEDIDO AUTOMATICAMENTE CON LA FACTURA') returning_values (pedauto);
if (PEDAUTO = 'SI') then
    begin
    IDC = gen_id(id_cons,1);
    for select cefa_item, cefa_idori from consolide_faltantes where cefa_id = new.revt_consolida
        into :item, :idf
        do
        begin
        SELECT PEDI_ID FROM PEDIDOS P, FACTURAS F WHERE P.PREF_PRE = F.pref_pre AND P.pedi_numero = F.fact_numero AND F.fact_id = :IDF INTO :IDP;
        insert into consolide_faltantes (cefa_id, cefa_item, cefa_tipodes, cefa_tipoori, cefa_idori)
            VALUES(:IDC, :item, 32, 34, :IDP);
        end
    EXECUTE PROCEDURE consolide_pendientes (:IDC);
    NEW.lipr_cod = :IDC;
    end
if (NEW.revt_consolida <> 0) then
    BEGIN
    execute procedure lee_configuracion ('FACTURACION', 'REMISIONES', 'PERMITIR VARIOS DESPACHOS PARCIALES DEL MISMO PEDIDO/FACTURA') returning_values (:pedidorep);
    if (pedidorep <> 'SI') then
        BEGIN
        SELECT COUNT(C2.COFA_ID), MAX(TIDO_NOMCORTO), max(c2.cofa_idori) FROM consolidado_faltantes C1, consolidado_faltantes C2, tipo_documento t
            WHERE C1.cofa_id <> C2.cofa_id and C1.cofa_id = NEW.revt_consolida AND C1.cofa_tipodes = 32 AND
            C2.cofa_tipodes = 32 AND C1.cofa_tipoori = C2.cofa_tipoori AND C1.cofa_idori = C2.cofa_idori and
            c1.cofa_tipoori = t.tido_cod and c1.cofa_cantcr <> 0 and c2.cofa_cantcr <> 0
            INTO :NUMROWS, :TIPO, :idpedido;
        if (NUMROWS <> 0) then
            begin
            if (TIPO = 'PEDIDCLI') then
                SELECT PREF_PRE || PEDI_NUMERO FROM PEDIDOS WHERE PEDI_ID = :idpedido INTO :numpedido;
            if (TIPO = 'FACTVENT') then
                SELECT PREF_PRE || FACT_NUMERO FROM FACTURAS WHERE FACT_ID = :idpedido INTO :numpedido;
            exception documento_cruzado 'El documento ' || :tipo || ' ' || :numpedido || ' ya fue utilizado en otra remisión.';
            end
        END
    END
END^

SET TERM ; ^

/* 20131021C */
/* numero de pedido interno CPN */
INSERT INTO CONFIGURACION (CONF_MODULO, CONF_CATEGORIA, CONF_PROPIEDAD, CONF_VALOR, CONF_POSIBLES, CONF_AYUDA) VALUES ('FACTURACION', 'PEDIDOS', 'PREGUNTAR NUMERO ORIGINAL DEL PEDIDO', 'NO', 'SI,NO', 'SI:Pregunta el número dle pedido en el talonario del vendedor o sitio web externo a SYSplus');
commit work;

ALTER TABLE PEDIDOS ADD PEDI_NROORI T_CONCEPTO;

SET TERM ^ ;

CREATE OR ALTER procedure IMPR_PEDIDO (
    ID integer)
returns (
    PREF varchar(4),
    NUMERO varchar(8),
    FECHA date,
    VALIDEZ integer,
    NIT varchar(20),
    NOMTERCERO varchar(60),
    SUCUR varchar(10),
    VENDEDOR integer,
    NOMVENDEDOR varchar(60),
    PUNTOVTA integer,
    NOMPUNTOVTA varchar(30),
    COTIZACION varchar(30),
    SUBTOTAL numeric(18,2),
    DTOPORC numeric(9,2),
    DTOMONTO numeric(18,2),
    ADICIONAL numeric(18,2),
    IVAMONTO numeric(18,2),
    EXTRA numeric(18,2),
    TOTALFAC numeric(18,2),
    ENTREGA date,
    OBS blob sub_type 1 segment size 80,
    ITEM integer,
    ARTICULO varchar(15),
    CODBAR varchar(15),
    ARTIDES varchar(60),
    BODEGA varchar(2),
    CANT numeric(18,4),
    UNIDAD varchar(8),
    FACTOR numeric(18,4),
    LISTAPR integer,
    REFITEM varchar(60),
    STAND varchar(20),
    PRUNIT numeric(18,2),
    DTOITPORC numeric(9,2),
    DTOITMONTO numeric(18,2),
    PRNETO numeric(18,2),
    PRNETOSINIVA numeric(18,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),
    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),
    INSTRUCCIONES varchar(255),
    DESPACHO varchar(255),
    CIUDAD varchar(40),
    TELEFONO varchar(40),
    CONTACTO varchar(60),
    FAX varchar(25),
    CEL varchar(25),
    ORDENCLI varchar(20),
    NUMORI VARCHAR(60),
    GRUPO varchar(2),
    NOMGRUPO varchar(30),
    SUBGRUPO varchar(3),
    NOMSUBG varchar(30),
    MARCA varchar(3),
    NOMMARCA varchar(30),
    PESO numeric(9,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),
    IVA1 numeric(18,2),
    IVA2 numeric(18,2),
    IVA3 numeric(18,2),
    SUMAEX numeric(18,2),
    SUMAGR numeric(18,2),
    DTOIT1M numeric(18,2),
    DTOIT2M numeric(18,2),
    DTOIT3M numeric(18,2),
    OBSITEM blob sub_type 1 segment size 80,
    ALTERNATIVAS numeric(18,4),
    PRINCIPALES numeric(18,4))
AS
DECLARE VARIABLE IMPTOS CHAR(1);
DECLARE VARIABLE TARIFA INTEGER;
declare variable ORDENCOD CHAR(8);
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 FACTCANT NUMERIC(18,4);
BEGIN
execute procedure lee_configuracion('FACTURACION', 'ARTICULOS', 'IMPOCONSUMO INCLUIDO EN EL PRECIO BASE DE VENTA ANTES DE IVA') returning_values (icoinc);
SELECT F.PREF_PRE, PEDI_NUMERO, PEDI_FECHA, PEDI_VALIDEZ, F.TERC_NIT, PEDI_NOMTERC, F.VEND_COD, VEND_NOMBRE, F.PTVT_ID, PTVT_NOM, PEDI_COTIZACI,
    PEDI_IVAINC, PEDI_DTOPOR, PEDI_DTOMONTO, PEDI_ADICIONAL, PEDI_IVAMONTO, PEDI_EXTRA, PEDI_TOTAL, PEDI_ENTREGA,
    TERC_CONTACTO, TERC_FAX, TERC_DV, TERC_CEL, PEDI_OBS, PEDI_SUCURSAL, PEDI_DTOIT1, PEDI_DTOIT2, PEDI_DTOIT3, PEDI_DESPACHO, PEDI_ORDENC, PEDI_NROORI
    FROM PEDIDOS F, VENDEDORES V, PUNTO_VENTA P, TERCEROS T
    WHERE F.VEND_COD = V.VEND_COD AND F.PTVT_ID = P.PTVT_ID AND F.TERC_NIT = T.TERC_NIT AND F.PEDI_ID = :ID
    into :PREF, :NUMERO, :FECHA, :VALIDEZ, :NIT, :NOMTERCERO, :VENDEDOR, :NOMVENDEDOR, :PUNTOVTA, :NOMPUNTOVTA, :COTIZACION,
    :IMPTOS, :DTOPORC, :DTOMONTO, :ADICIONAL, :IVAMONTO, :EXTRA, :TOTALFAC, :ENTREGA,
    :CONTACTO, :FAX, :DV, :CEL, :OBS, :SUCUR, :dtoit1m, :dtoit2m, :dtoit3m, :despacho, :ordencli, :NUMORI;
SUBTOTAL = TOTALFAC - EXTRA - IVAMONTO - ADICIONAL + DTOMONTO;

SELECT CLIE_COD, C.ZONA_COD, ZONA_NOM, CLIE_PEDIDOS
    FROM CLIENTES C, ZONAS Z
    WHERE TERC_NIT = :NIT AND C.ZONA_COD = Z.ZONA_COD
    INTO :CODIGOCL, :ZONACOD, :ZONANOM, :instrucciones;
SELECT CLSU_DIR, CLSU_CIUDAD, CLSU_TEL FROM CLIENTE_SUCURSALES WHERE TERC_NIT = :NIT AND CLCU_COD = :SUCUR
    INTO :DIRECCION, :CIUDAD, :TELEFONO;
    
SUMAEX = 0;
SUMA1 = 0;
SUMA2 = 0;
SUMA3 = 0;
IVA1 = 0;
IVA2 = 0;
IVA3 = 0;
ITEM = 0;
PESOTOT = 0;
EXECUTE PROCEDURE lee_configuracion ('FACTURACION','DOCUMENTOS','ORDENAR ITEMS POR CODIGO DE ARTICULO') returning_values (:ORDENCOD);
if (ORDENCOD = 'SI') then
    BEGIN
    FOR SELECT D.ARTI_COD, PEDE_CODBAR, SUBSTR(PEDE_DESC,1,60), PEDE_CANT, PEDE_UNIDAD, LIPR_COD, PEDE_PRUNIT, PEDE_DTOPORC, PEDE_DTOMONTO, PEDE_IVAPORC, PEDE_IVAMONTO, PEDE_CONSUMO, PEDE_TOTAL, PEDE_REFERENCIA,
        GRUP_COD, SUBG_COD, MARC_COD, ARTI_PESO, ARTI_ANCHO, ARTI_ALTO, ARTI_LARGO, TAIV_COD, BODE_COD, PEDE_OBS, PEDE_DTO1, PEDE_DTO2, PEDE_DTO3, PEDE_DTOM1, PEDE_DTOM2, PEDE_DTOM3, PEDE_FACTOR
        FROM PEDIDOS_DETALLE D, ARTICULO A
        WHERE D.ARTI_COD = A.ARTI_COD AND D.PEDI_ID = :ID
        ORDER BY PEDE_CODBAR
        INTO :ARTICULO, :CODBAR, :ARTIDES, :CANT, :UNIDAD, :LISTAPR, :PRUNIT, :DTOITPORC, :DTOITMONTO, :IVAPORC, :IVAITMONTO, :CONSUMO, :TOTAL, :REFITEM,
        :GRUPO, :SUBGRUPO, :MARCA, :PESO, :ANCHO, :ALTO, :LARGO, :TARIFA, :BODEGA, :OBSITEM,  :dtoit1, :dtoit2, :dtoit3, :dtoitm1, :dtoitm2, :dtoitm3, :FACTOR
        DO
        BEGIN
        if (ARTICULO = CODBAR) then
            SELECT FIRST 1 COBA_COD FROM barras_articulo WHERE ARTI_COD = :articulo INTO :CODBAR;
        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;
        SELECT STAND_COD FROM STANDS WHERE ARTI_COD = :ARTICULO AND STAND_BODEGA = :bodega INTO :stand;
        if (ICOINC = 'SI') then
            SUBTOTIT = TOTAL - IVAITMONTO;
        else
            SUBTOTIT = TOTAL - IVAITMONTO - CONSUMO;
        ITEM = ITEM + 1;
        prneto = PRUNIT - DTOITMONTO - dtoitm1 - dtoitm2 - dtoitm3;
        if (PESO IS NULL) then
            PESO = 0;
        PESO = PESO / 1000 * CANT * FACTOR;
        PESOTOT = PESOTOT + PESO;
        if (IMPTOS = 'S') then
            if (cant <> 0) then
                prnetosiniva = PRUNIT - DTOITMONTO - ((IVAITMONTO+CONSUMO) / CANT) - dtoitm1 - dtoitm2 - dtoitm3;
            else
                prnetosiniva = PRUNIT - DTOITMONTO - dtoitm1 - dtoitm2 - dtoitm3;
        ELSE
            prnetosiniva = PRUNIT - DTOITMONTO - dtoit1m - dtoit2m - dtoit3m;
        if (TARIFA = 0) then
            SUMAEX = SUMAEX + TOTAL;
        if (TARIFA = 1) then
            BEGIN
            SUMA1 = SUMA1 + TOTAL - IVAITMONTO;
            IVA1 = IVA1 + IVAITMONTO;
            END
        if (TARIFA = 2) then
            BEGIN
            SUMA2 = SUMA2 + TOTAL - IVAITMONTO;
            IVA2 = IVA2 + IVAITMONTO;
            END
        if (TARIFA = 3) then
            BEGIN
            SUMA3 = SUMA3 + TOTAL - IVAITMONTO;
            IVA3 = IVA3 + IVAITMONTO;
            END
        SUMAGR = SUMA1 + SUMA2 + SUMA3;
        factcant = NULL;
        SELECT FIRST 1 UNAR_FACCAN FROM unidad_articulo WHERE ARTI_COD = :articulo INTO :factcant;
        if (factcant IS NULL) then
            factcant = 1;
        if ((factcant = 1) or (factcant = 0))  then
            BEGIN
            ALTERNATIVAS = 0;
            PRINCIPALES = (CANT * FACTOR);
            END
        ELSE
            BEGIN
            ALTERNATIVAS = FLOOR(CANT * factor / factcant);
            PRINCIPALES = (CANT * FACTOR) - (alternativas * factcant);
            END
        SUSPEND;
        END
    END
ELSE
  if (ORDENCOD = 'UNIDAD') then
    BEGIN
    FOR SELECT D.ARTI_COD, PEDE_CODBAR, SUBSTR(PEDE_DESC,1,60), PEDE_CANT, PEDE_UNIDAD, LIPR_COD, PEDE_PRUNIT, PEDE_DTOPORC, PEDE_DTOMONTO, PEDE_IVAPORC, PEDE_IVAMONTO, PEDE_CONSUMO, PEDE_TOTAL, PEDE_REFERENCIA,
        GRUP_COD, SUBG_COD, MARC_COD, ARTI_PESO, ARTI_ANCHO, ARTI_ALTO, ARTI_LARGO, TAIV_COD, BODE_COD, PEDE_OBS, PEDE_DTO1, PEDE_DTO2, PEDE_DTO3, PEDE_DTOM1, PEDE_DTOM2, PEDE_DTOM3, PEDE_FACTOR
        FROM PEDIDOS_DETALLE D, ARTICULO A
        WHERE D.ARTI_COD = A.ARTI_COD AND D.PEDI_ID = :ID
        ORDER BY D.pede_unidad, D.pede_desc
        INTO :ARTICULO, :CODBAR, :ARTIDES, :CANT, :UNIDAD, :LISTAPR, :PRUNIT, :DTOITPORC, :DTOITMONTO, :IVAPORC, :IVAITMONTO, :CONSUMO, :TOTAL, :REFITEM,
        :GRUPO, :SUBGRUPO, :MARCA, :PESO, :ANCHO, :ALTO, :LARGO, :TARIFA, :BODEGA, :OBSITEM,  :dtoit1, :dtoit2, :dtoit3, :dtoitm1, :dtoitm2, :dtoitm3, :FACTOR
        DO
        BEGIN
        if (ARTICULO = CODBAR) then
            SELECT FIRST 1 COBA_COD FROM barras_articulo WHERE ARTI_COD = :articulo INTO :CODBAR;
        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;
        SELECT STAND_COD FROM STANDS WHERE ARTI_COD = :ARTICULO AND STAND_BODEGA = :bodega INTO :stand;
        if (ICOINC = 'SI') then
            SUBTOTIT = TOTAL - IVAITMONTO;
        else
            SUBTOTIT = TOTAL - IVAITMONTO - CONSUMO;
        ITEM = ITEM + 1;
        prneto = PRUNIT - DTOITMONTO - dtoitm1 - dtoitm2 - dtoitm3;
        if (PESO IS NULL) then
            PESO = 0;
        PESO = PESO / 1000 * CANT * FACTOR;
        PESOTOT = PESOTOT + PESO;
        if (IMPTOS = 'S') then
            if (cant <> 0) then
                prnetosiniva = PRUNIT - DTOITMONTO - ((IVAITMONTO+CONSUMO) / CANT) - dtoitm1 - dtoitm2 - dtoitm3;
            else
                prnetosiniva = PRUNIT - DTOITMONTO - dtoitm1 - dtoitm2 - dtoitm3;
        ELSE
            prnetosiniva = PRUNIT - DTOITMONTO - dtoit1m - dtoit2m - dtoit3m;
        if (TARIFA = 0) then
            SUMAEX = SUMAEX + TOTAL;
        if (TARIFA = 1) then
            BEGIN
            SUMA1 = SUMA1 + TOTAL - IVAITMONTO;
            IVA1 = IVA1 + IVAITMONTO;
            END
        if (TARIFA = 2) then
            BEGIN
            SUMA2 = SUMA2 + TOTAL - IVAITMONTO;
            IVA2 = IVA2 + IVAITMONTO;
            END
        if (TARIFA = 3) then
            BEGIN
            SUMA3 = SUMA3 + TOTAL - IVAITMONTO;
            IVA3 = IVA3 + IVAITMONTO;
            END
        SUMAGR = SUMA1 + SUMA2 + SUMA3;
        factcant = NULL;
        SELECT FIRST 1 UNAR_FACCAN FROM unidad_articulo WHERE ARTI_COD = :articulo INTO :factcant;
        if (factcant IS NULL) then
            factcant = 1;
        if ((factcant = 1) or (factcant = 0))  then
            BEGIN
            ALTERNATIVAS = 0;
            PRINCIPALES = (CANT * FACTOR);
            END
        ELSE
            BEGIN
            ALTERNATIVAS = FLOOR(CANT * factor / factcant);
            PRINCIPALES = (CANT * FACTOR) - (alternativas * factcant);
            END
        SUSPEND;
        END
    END
  ELSE
    BEGIN
    FOR SELECT PEDE_ITEM, D.ARTI_COD, PEDE_CODBAR, SUBSTR(PEDE_DESC,1,60), PEDE_CANT, PEDE_UNIDAD, LIPR_COD, PEDE_PRUNIT, PEDE_DTOPORC, PEDE_DTOMONTO, PEDE_IVAPORC, PEDE_IVAMONTO, PEDE_CONSUMO, PEDE_TOTAL, PEDE_REFERENCIA,
        GRUP_COD, SUBG_COD, MARC_COD, ARTI_PESO, ARTI_ANCHO, ARTI_ALTO, ARTI_LARGO, TAIV_COD, BODE_COD, PEDE_OBS, PEDE_DTO1, PEDE_DTO2, PEDE_DTO3, PEDE_DTOM1, PEDE_DTOM2, PEDE_DTOM3, PEDE_FACTOR
        FROM PEDIDOS_DETALLE D, ARTICULO A
        WHERE D.ARTI_COD = A.ARTI_COD AND D.PEDI_ID = :ID
        ORDER BY PEDE_ITEM
        INTO :ITEM, :ARTICULO, :CODBAR, :ARTIDES, :CANT, :UNIDAD, :LISTAPR, :PRUNIT, :DTOITPORC, :DTOITMONTO, :IVAPORC, :IVAITMONTO, :CONSUMO, :TOTAL, :REFITEM,
        :GRUPO, :SUBGRUPO, :MARCA, :PESO, :ANCHO, :ALTO, :LARGO, :TARIFA, :BODEGA, :obsitem,  :dtoit1, :dtoit2, :dtoit3, :dtoitm1, :dtoitm2, :dtoitm3, :FACTOR
        DO
        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;
        SELECT STAND_COD FROM STANDS WHERE ARTI_COD = :ARTICULO AND STAND_BODEGA = :bodega INTO :stand;
        if (ICOINC = 'SI') then
            SUBTOTIT = TOTAL - IVAITMONTO;
        else
            SUBTOTIT = TOTAL - IVAITMONTO - CONSUMO;
        ITEM = ITEM + 1;
        prneto = PRUNIT - DTOITMONTO - dtoitm1 - dtoitm2 - dtoitm3;
        if (PESO IS NULL) then
            PESO = 0;
        PESO = PESO / 1000 * CANT * FACTOR;
        PESOTOT = PESOTOT + PESO;
        if (IMPTOS = 'S') then
            if (cant <> 0) then
                prnetosiniva = PRUNIT - DTOITMONTO - ((IVAITMONTO+CONSUMO) / CANT) - dtoitm1 - dtoitm2 - dtoitm3;
            else
                prnetosiniva = PRUNIT - DTOITMONTO - dtoitm1 - dtoitm2 - dtoitm3;
        ELSE
            prnetosiniva = PRUNIT - DTOITMONTO - dtoit1m - dtoit2m - dtoit3m;
        if (IVAPORC = 0) then
            SUMAEX = SUMAEX + TOTAL;
        if (TARIFA = 1) then
            BEGIN
            SUMA1 = SUMA1 + TOTAL - IVAITMONTO;
            IVA1 = IVA1 + IVAITMONTO;
            END
        if (TARIFA = 2) then
            BEGIN
            SUMA2 = SUMA2 + TOTAL - IVAITMONTO;
            IVA2 = IVA2 + IVAITMONTO;
            END
        if (TARIFA = 3) then
            BEGIN
            SUMA3 = SUMA3 + TOTAL - IVAITMONTO;
            IVA3 = IVA3 + IVAITMONTO;
            END
        SUMAGR = SUMA1 + SUMA2 + SUMA3;
        factcant = NULL;
        SELECT FIRST 1 UNAR_FACCAN FROM unidad_articulo WHERE ARTI_COD = :articulo INTO :factcant;
        if (factcant IS NULL) then
            factcant = 1;
        if ((factcant = 1) or (factcant = 0))  then
            BEGIN
            ALTERNATIVAS = 0;
            PRINCIPALES = (CANT * FACTOR);
            END
        ELSE
            BEGIN
            ALTERNATIVAS = FLOOR(CANT * factor / factcant);
            PRINCIPALES = (CANT * FACTOR) - (alternativas * factcant);
            END
        SUSPEND;
        END
    END
END^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER procedure REP_VENTAS_CANAL (
    TIPO integer,
    DESDE varchar(20),
    HASTA varchar(20),
    FECINI date,
    FECFIN date,
    DETALLE char(1),
    CEROS char(1),
    SUBEMPRESA integer)
returns (
    CODCAN integer,
    NOMCAN varchar(60),
    NOMTIPO varchar(50),
    PREFIJO varchar(4),
    NUMERO varchar(8),
    NUMORI varchar(60),
    NIT varchar(20),
    NOMBRE varchar(60),
    VEND integer,
    NOMVEND varchar(60),
    ID integer,
    FECDOC date,
    CANTIDAD integer,
    SUBTOTAL numeric(18,2),
    DTO numeric(18,2),
    ADICIONAL numeric(18,2),
    CONSUMO numeric(18,2),
    IVA numeric(18,2),
    EXTRA numeric(18,2),
    TOTAL numeric(18,2),
    RTFTE numeric(18,2),
    RTIVA numeric(18,2),
    RTICA numeric(18,2),
    NETO numeric(18,2))
AS
BEGIN
if (DETALLE = 'N') then
    BEGIN
    NIT = '';
    NOMBRE = '';
    if (BIN_AND(TIPO, 8) <> 0) then
        BEGIN
        SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 34 INTO :NOMTIPO;
        FOR SELECT MAX(P.pedi_canal), MAX(CANA_NOM), COUNT(*), SUM(PEDI_DTOMONTO), SUM(PEDI_ADICIONAL), SUM(PEDI_IVAMONTO), SUM(PEDI_EXTRA), 0, 0, 0, SUM(PEDI_TOTAL)
            FROM PEDIDOS P, PREFIJOS PR, CANAL V
            WHERE V.cana_id >= :DESDE AND V.cana_id <= :HASTA
             AND P.pedi_canal = V.cana_id AND PEDI_FECHA >= :FECINI AND PEDI_FECHA <= :FECFIN AND PEDI_ANULADO = 'N'
             AND P.PREF_PRE = PR.PREF_PRE AND PR.TIDO_COD = 34 AND ((PR.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            GROUP BY P.pedi_canal
            INTO :CODCAN, :NOMCAN, :CANTIDAD, :DTO, :ADICIONAL, :IVA, :EXTRA, :RTFTE, :RTIVA, :RTICA, :TOTAL
            DO
            BEGIN
            SELECT SUM(PEDE_CONSUMO) FROM PEDIDOS P, PEDIDOS_DETALLE D WHERE P.PEDI_ID = D.PEDI_ID AND
                VEND_COD = :CODCAN AND PEDI_FECHA >= :FECINI AND PEDI_FECHA <= :FECFIN AND PEDI_ANULADO = 'N'
                INTO :CONSUMO;
            if (CONSUMO IS NULL) then
                CONSUMO = 0;
            if (CANTIDAD IS NULL) then
                CANTIDAD = 0;
            if (DTO IS NULL) then
                DTO = 0;
            if (ADICIONAL IS NULL) then
                ADICIONAL = 0;
            if (IVA IS NULL) then
                IVA = 0;
            if (EXTRA IS NULL) then
                EXTRA = 0;
            if (RTFTE IS NULL) then
                RTFTE = 0;
            if (RTIVA IS NULL) then
                RTIVA = 0;
            if (RTICA IS NULL) then
                RTICA = 0;
            SUBTOTAL = TOTAL - EXTRA - IVA - ADICIONAL + DTO - CONSUMO;
            NETO = TOTAL - RTFTE - RTIVA - RTICA;
            if (CEROS = 'S') then
              SUSPEND;
            ELSE
              if (CANTIDAD > 0) then
                SUSPEND;
            END
        END
    END
ELSE
    BEGIN
    if (BIN_AND(TIPO, 8) <> 0) then
        BEGIN
        SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 34 INTO :NOMTIPO;
        FOR SELECT P.pedi_canal, CANA_NOM, PEDI_ID, P.PREF_PRE, PEDI_NUMERO, PEDI_FECHA, PEDI_DTOMONTO, PEDI_ADICIONAL, PEDI_IVAMONTO, PEDI_EXTRA, PEDI_TOTAL, 0, 0, 0, TERC_NIT, PEDI_NOMTERC, VEND_COD, PEDI_NROORI
            FROM PEDIDOS P, PREFIJOS PR, CANAL V WHERE P.pedi_canal = V.cana_id AND P.pedi_canal >= :DESDE AND P.pedi_canal <= :HASTA AND PEDI_FECHA >= :FECINI AND PEDI_FECHA <= :FECFIN AND PEDI_ANULADO = 'N'
             AND P.PREF_PRE = PR.PREF_PRE AND PR.TIDO_COD = 34 AND ((PR.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            ORDER BY V.cana_id, PEDI_FECHA, PEDI_ID
            INTO :CODCAN, :NOMCAN, :ID, :PREFIJO, :NUMERO, :FECDOC, :DTO, :ADICIONAL, :IVA, :EXTRA, :TOTAL, :RTFTE, :RTIVA, :RTICA, :NIT, :NOMBRE, :VEND, :NUMORI
            DO
            BEGIN
            SELECT VEND_NOMBRE FROM vendedores WHERE VEND_COD = :VEND INTO :NOMVEND;
            SELECT SUM(PEDE_CONSUMO) FROM PEDIDOS_DETALLE WHERE PEDI_ID = :ID
                INTO :CONSUMO;
            if (CONSUMO IS NULL) then
                CONSUMO = 0;
            SUBTOTAL = TOTAL - EXTRA - IVA - ADICIONAL + DTO - CONSUMO;
            NETO = TOTAL - RTFTE - RTIVA - RTICA;
            SUSPEND;
            END
         END
    END
END^

SET TERM ; ^

/* 20131021d */
/* NO TOMABA LA DIFERENCIA EN CAMBIO DE EGRESOS Y APLICACIONES EN EL SALDO */
SET TERM ^ ;

CREATE OR ALTER procedure CHEQUEO_SALDOS_DOC_CXPAGAR (
    PRVINI varchar(20),
    PRVFIN varchar(20))
returns (
    ERROR varchar(60),
    TIPO integer,
    ID integer,
    PREF varchar(4),
    NUMERO varchar(8))
AS
declare variable FECHA 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 EXISTE CHAR(1);
declare variable IDR INTEGER;
declare variable EGREID INTEGER;
declare variable TRM NUMERIC(18, 2);
declare variable INGPAS INTEGER;
declare variable CANT INTEGER;
declare variable IDT INTEGER;
BEGIN
DELETE FROM anticipos_proveedor WHERE EGRE_ID = 0 AND TERC_NIT >= :PRVINI AND TERC_NIT <= :PRVFIN;
DELETE FROM saldos_doc_cxpagar WHERE TERC_NIT >= :PRVINI AND TERC_NIT <= :PRVFIN;

FOR SELECT FACO_ID, FACO_FECHA, TERC_NIT, FACO_RTFTEMONTO, FACO_rtivamonto, FACO_rticamonto, FACO_RTCREEM, FACO_TOTAL, 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, :FECHA, :nit,  :RTFTE, :RTIVA, :RTICA, :RCREE, MONTO, :TRM
    DO
    INSERT INTO saldos_doc_cxpagar (SDCP_TIPOREF, SDCP_IDREF, SDCP_FECHA, TERC_NIT, SDCP_RTEFTE, SDCP_RTIVA, SDCP_RTICA, SDCP_RCREE, SDCP_ABONO, SDCP_ABRTFTE, SDCP_ABRTIVA, SDCP_ABRTICA, SDCP_ABRCREE, SDCP_DEBITO, SDCP_MONTO, SDCP_TRM)
        VALUES (21, :ID, :fecha, :nit, :rtfte, :rtiva, :rtica, :RCREE, 0, 0, 0, 0, 0, 'S', :MONTO, :TRM);

FOR SELECT NDPR_ID, NDPR_FECHA, 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, :FECHA, :nit,  :RTFTE, :RTIVA, :RTICA, :RCREE, :MONTO, :TRM
    DO
    INSERT INTO saldos_doc_cxpagar (SDCP_TIPOREF, SDCP_IDREF, SDCP_FECHA, TERC_NIT, SDCP_RTEFTE, SDCP_RTIVA, SDCP_RTICA, SDCP_RCREE, SDCP_ABONO, SDCP_ABRTFTE, SDCP_ABRTIVA, SDCP_ABRTICA, SDCP_ABRCREE, SDCP_DEBITO, SDCP_MONTO, SDCP_TRM)
        VALUES (51, :ID, :fecha, :nit, :rtfte, :rtiva, :rtica, :RCREE, 0, 0, 0, 0, 0, 'S', :MONTO, :TRM);

FOR SELECT MANC_ID, MANC_FECHA, TERC_NIT, 0, 0, 0, MANC_APAGAR
    FROM manifiesto_carga M, vehiculos V WHERE V.vehi_cod = manc_vehiculo AND MANC_ID <> 0 and MANC_anulado = 'N' AND TERC_NIT >= :PRVINI AND TERC_NIT <= :PRVFIN and manc_apagar > 0
    ORDER BY MANC_FECHA
    INTO :ID, :FECHA, :nit,  :RTFTE, :RTIVA, :RTICA, :MONTO
    DO
    INSERT INTO saldos_doc_cxpagar (SDCP_TIPOREF, SDCP_IDREF, SDCP_FECHA, TERC_NIT, SDCP_RTEFTE, SDCP_RTIVA, SDCP_RTICA, SDCP_RCREE, SDCP_ABONO, SDCP_ABRTFTE, SDCP_ABRTIVA, SDCP_ABRTICA, SDCP_ABRCREE, SDCP_DEBITO, SDCP_MONTO)
        VALUES (89, :ID, :fecha, :nit, :rtfte, :rtiva, :rtica, :RCREE, 0, 0, 0, 0, 0, 'S', :MONTO);

FOR SELECT DVCO_ID, 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, :FECHA, :nit,  :RTFTE, :RTIVA, :RTICA, :RCREE, :MONTO, :TRM
    DO
    INSERT INTO saldos_doc_cxpagar (SDCP_TIPOREF, SDCP_IDREF, SDCP_FECHA, TERC_NIT, SDCP_RTEFTE, SDCP_RTIVA, SDCP_RTICA, SDCP_RCREE, SDCP_ABONO, SDCP_ABRTFTE, SDCP_ABRTIVA, SDCP_ABRTICA, SDCP_ABRCREE, SDCP_DEBITO, SDCP_MONTO, SDCP_TRM)
        VALUES (24, :ID, :fecha, :nit, :rtfte*-1, :rtiva*-1, :rtica*-1, :rcree*-1, 0, 0, 0, 0, 0, 'N', :MONTO * -1, :TRM);

FOR SELECT NCPR_ID, NCPR_FECHA, 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, :FECHA, :nit,  :RTFTE, :RTIVA, :RTICA, :RCREE, :MONTO, :TRM
    DO
    INSERT INTO saldos_doc_cxpagar (SDCP_TIPOREF, SDCP_IDREF, SDCP_FECHA, TERC_NIT, SDCP_RTEFTE, SDCP_RTIVA, SDCP_RTICA, SDCP_RCREE, SDCP_ABONO, SDCP_ABRTFTE, SDCP_ABRTIVA, SDCP_ABRTICA, SDCP_ABRCREE, SDCP_DEBITO, SDCP_MONTO, SDCP_TRM)
        VALUES (52, :ID, :fecha, :nit, :rtfte*-1, :rtiva*-1, :rtica*-1, :rcree*-1, 0, 0, 0, 0, 0, 'N', :MONTO * -1, :TRM);

FOR SELECT ANPR_ID, ANPR_FECHA, 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, :FECHA, :nit,  :RTFTE, :RTIVA, :RTICA, :RCREE, :MONTO, :TRM
    DO
    INSERT INTO saldos_doc_cxpagar (SDCP_TIPOREF, SDCP_IDREF, SDCP_FECHA, TERC_NIT, SDCP_RTEFTE, SDCP_RTIVA, SDCP_RTICA, SDCP_RCREE, SDCP_ABONO, SDCP_ABRTFTE, SDCP_ABRTIVA, SDCP_ABRTICA, SDCP_ABRCREE, SDCP_DEBITO, SDCP_MONTO, SDCP_TRM)
        VALUES (55, :ID, :fecha, :nit, :rtfte*-1, :rtiva*-1, :rtica*-1, :rcree*-1, 0, 0, 0, 0, 0, 'N', :MONTO * -1, :TRM);

execute procedure LEE_configuracion('TRANSPORTE', 'GENERAL', 'TARIFA DE INGRESO POR PASAJES A CREDITO') returning_values (:ingpas);
FOR SELECT P.plpa_id, P.plpa_fecha, V.terc_nit, 0, 0, 0, D.plpa_valor, D.plpa_tiquete
    FROM planilla_pasajeros_det D, planilla_pasajeros P, VEHICULOS V
    WHERE P.plpa_id = D.plpa_id AND P.plpa_vehiculo = V.vehi_cod AND P.plpa_id <> 0 and p.PLPA_anulado = 'N' AND
    V.TERC_NIT >= :PRVINI AND V.TERC_NIT <= :PRVFIN
    ORDER BY P.plpa_fecha, P.plpa_id
    INTO :ID, :FECHA, :nit,  :RTFTE, :RTIVA, :RTICA, :MONTO, :idt
    DO
    BEGIN
    CANT = 0;
    SELECT TIQP_CANT FROM tiquete_pasajero WHERE TIQP_ID = :IDT and TIQP_FORMAP = 'R' INTO :CANT;
    if (CANT IS NULL) then
        CANT = 0;
    EXISTE = 'N';
    select 'S' from saldos_doc_cxpagar where sdcp_tiporef = 88 and
        sdcp_idref = :id and sdcp_fecha = :fecha into :EXISTE;
    if (Existe = 'S') then
        UPDATE saldos_doc_cxpagar
            SET SDCP_MONTO = SDCP_MONTO + (:monto-(:INGPAS*:cant))
            WHERE SDCP_TIPOREF = 88 AND SDCP_IDREF = :id AND SDCP_FECHA = :fecha;
    ELSE
        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_DEBITO, SDCP_MONTO)
            VALUES (88, :id, :fecha, :nit, 0, 0, 0, 0, 0, 0, 0, 'S', (:monto-(:INGPAS*:CANT)));
    end

execute procedure LEE_configuracion('TRANSPORTE', 'GENERAL', 'TARIFA DE INGRESO POR REMESAS DE PASAJEROS') returning_values (:ingpas);
FOR SELECT P.plpa_id, P.plpa_fecha, V.terc_nit, 0, 0, 0, D.plpr_remesa
    FROM planilla_pasajeros_rem D, planilla_pasajeros P, VEHICULOS V WHERE P.plpa_id = D.plpa_id AND P.plpa_vehiculo = V.vehi_cod AND P.plpa_id <> 0 and P.PLPA_anulado = 'N' AND V.TERC_NIT >= :PRVINI AND V.TERC_NIT <= :PRVFIN
    ORDER BY P.plpa_fecha, P.plpa_id
    INTO :ID, :FECHA, :nit,  :RTFTE, :RTIVA, :RTICA, :idr
    DO
    BEGIN
    SELECT CGRM_TOTAL-CGRM_DOMICILIO-CGRM_SEGURO FROM carga_remesa WHERE CGRM_ID = :IDR INTO :MONTO;
    execute procedure redondee(MONTO * (100-ingpas) / 100, 0) returning_values (MONTO);
    if (MONTO <> 0) then
        BEGIN
        EXISTE = 'N';
        select 'S' from saldos_doc_cxpagar where sdcp_tiporef = 88 and
            sdcp_idref = :id and sdcp_fecha = :fecha into :EXISTE;
        if (Existe = 'S') then
            UPDATE saldos_doc_cxpagar
                SET SDCP_MONTO = SDCP_MONTO + :monto
                WHERE SDCP_TIPOREF = 88 AND SDCP_IDREF = :id AND SDCP_FECHA = :fecha;
        ELSE
            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_DEBITO, SDCP_MONTO)
                VALUES (88, :id, :fecha, :nit, 0, 0, 0, 0, 0, 0, 0, 'S', :monto);
        end
    end

FOR SELECT APPD_TIPODOC, APPD_IDDOC, APPR_FECHA, TERC_NIT, APPD_APLICADO+APPD_DIFCAMBIO, APPD_RTFTE, APPD_RTIVA, APPD_RTICA, APPD_RCREE, 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 :TIPO, :ID, :FECHA, :NIT, :MONTO, :RTFTE, :RTIVA, :RTICA, :RCREE, :TRM
    DO
    BEGIN
    EXISTE = 'N';
    select 'S' from saldos_doc_cxpagar where sdcp_tiporef = :TIPO and sdcp_idref = :ID and sdcp_fecha = :fecha into :EXISTE;
    if (Existe = 'S') then
        begin
        /* actualice el saldo del dia */
        UPDATE saldos_doc_cxpagar
            SET SDCP_ABONO = SDCP_ABONO + :MONTO,
                SDCP_ABRTFTE = SDCP_ABRTFTE + :RTFTE,
                SDCP_ABRTIVA = SDCP_ABRTIVA + :RTIVA,
                SDCP_ABRTICA = SDCP_ABRTICA + :RTICA,
                SDCP_ABRCREE = SDCP_ABRCREE + :RCREE,
                SDCP_TRM = :TRM
            WHERE SDCP_TIPOREF = :TIPO AND SDCP_IDREF = :ID AND SDCP_FECHA = :fecha;
        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_RCREE, SDCP_ABONO, SDCP_ABRTFTE, SDCP_ABRTIVA, SDCP_ABRTICA, SDCP_ABRCREE, SDCP_DEBITO, SDCP_MONTO, SDCP_TRM)
            VALUES (:TIPO, :ID, :fecha, :NIT, 0, 0, 0, 0, :MONTO, :rtfte, :rtiva, :rtica, :RCREE, 'N', 0, :TRM);
        END
    END

FOR SELECT E.EGRE_ID, EGDE_TIPODOC, EGDE_IDDOC, EGRE_FECHA, TERC_NIT, EGDE_ABONO+EGDE_DTOF+EGDE_DIFCAMBIO, EGDE_RTFTE, EGDE_RTIVA, EGDE_RTICA, EGDE_RCREE, 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, :TIPO, :ID, :FECHA, :NIT, :MONTO, :RTFTE, :RTIVA, :RTICA, :RCREE, :TRM
    DO
    BEGIN
    EXISTE = 'N';
    if (TIPO = 55) then
        BEGIN
        SELECT EGRE_ID FROM anticipos_proveedor WHERE ANPR_ID = :ID INTO :EGREID;
        if (EGREID = IDR) then
            EXISTE = 'S';
        END
    if (EXISTE = 'N') then
        BEGIN
        select 'S' from saldos_doc_cxpagar where sdcp_tiporef = :TIPO and sdcp_idref = :ID and sdcp_fecha = :fecha into :EXISTE;
        if (Existe = 'S') then
            begin
            /* actualice el saldo del dia */
            UPDATE saldos_doc_cxpagar
                SET SDCP_ABONO = SDCP_ABONO + :MONTO,
                    SDCP_ABRTFTE = SDCP_ABRTFTE + :RTFTE,
                    SDCP_ABRTIVA = SDCP_ABRTIVA + :RTIVA,
                    SDCP_ABRTICA = SDCP_ABRTICA + :RTICA,
                    SDCP_ABRCREE = SDCP_ABRCREE + :RCREE,
                    SDCP_TRM = :TRM
                WHERE SDCP_TIPOREF = :TIPO AND SDCP_IDREF = :ID AND SDCP_FECHA = :fecha;
            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_RCREE, SDCP_ABONO, SDCP_ABRTFTE, SDCP_ABRTIVA, SDCP_ABRTICA, SDCP_ABRCREE, SDCP_DEBITO, SDCP_MONTO, SDCP_TRM)
                VALUES (:TIPO, :ID, :fecha, :NIT, 0, 0, 0, 0, :MONTO, :rtfte, :rtiva, :rtica, :RCREE, 'N', 0, :TRM);
            END
        END
    END

FOR SELECT R.reca_id, D.rccr_tipodoc, D.rccr_iddoc, RECA_FECHA, TERC_NIT, D.rccr_abono+D.rccr_dtof+rccr_difcambio, D.rccr_rtfte, D.rccr_rtiva, D.rccr_rtica, D.rccr_rcree, 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, :TIPO, :ID, :FECHA, :NIT, :MONTO, :RTFTE, :RTIVA, :RTICA, :RCREE, :TRM
    DO
    BEGIN
    EXISTE = 'N';
    select 'S' from saldos_doc_cxpagar where sdcp_tiporef = :TIPO and sdcp_idref = :ID and sdcp_fecha = :fecha into :EXISTE;
    if (Existe = 'S') then
        begin
        /* actualice el saldo del dia */
        UPDATE saldos_doc_cxpagar
            SET SDCP_ABONO = SDCP_ABONO + :MONTO,
            SDCP_ABRTFTE = SDCP_ABRTFTE + :RTFTE,
            SDCP_ABRTIVA = SDCP_ABRTIVA + :RTIVA,
            SDCP_ABRTICA = SDCP_ABRTICA + :RTICA,
            SDCP_ABRCREE = SDCP_ABRCREE + :RCREE,
            SDCP_TRM = :TRM
            WHERE SDCP_TIPOREF = :TIPO AND SDCP_IDREF = :ID AND SDCP_FECHA = :fecha;
        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_RCREE, SDCP_ABONO, SDCP_ABRTFTE, SDCP_ABRTIVA, SDCP_ABRTICA, SDCP_ABRCREE, SDCP_DEBITO, SDCP_MONTO, SDCP_TRM)
            VALUES (:TIPO, :ID, :fecha, :NIT, 0, 0, 0, 0, :MONTO, :rtfte, :rtiva, :rtica, :RCREE, 'N', 0, :TRM);
        END
    END

for select anpr_id, anpr_base+anpr_ivamonto, PREF_PRE, ANPR_NUMERO, ANPR_TRM from anticipos_proveedor
    where anpr_anulado = 'N' and egre_id not in (select egre_id from egresos where egre_anulado = 'N')
    into :ID, :MONTO, :PREF, :NUMERO, :TRM
    do
    begin
    FECHA = cast('now' as date);
/*    execute procedure saldo_doc_cxpagar(55, :id, :FECHA) returning_values (:RTFTE);*/
    if ((MONTO = RTFTE) or (RTFTE IS NULL)) then
        DELETE FROM anticipos_proveedor WHERE ANPR_ID = :ID;
    ELSE
        BEGIN
        TIPO = 55;
        ERROR = 'DOCUMENTO ANULADO CON ABONOS';
        SUSPEND;
        END
    end
END^

SET TERM ; ^

/* 20131021e */
/* RESTE LA DIF EN CAMBIO EN LUGR DE SUMARLA PORQUE ESTA CON SIGNO CONTRARIO */
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 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_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, :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_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, '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_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, :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_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, 'S', 'N', :pref, :numero, :TRM);

FOR SELECT DVCO_ID, PREF_PRE, DVCO_NUMERO, DVCO_FECHA, TERC_NIT, DVCO_RTFTEMONTO, DVCO_rtivamonto, DVCO_rticamonto, 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, :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_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, '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_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, :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_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, '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_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, :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_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, '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, 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, :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_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_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, '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_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, :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_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_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, '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, 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, :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_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_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, 'N', 'S', :PREF, :NUMERO, :TRM);
    END
END^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER procedure CHEQUEO_SALDOS_DOC_CXPAGAR (
    PRVINI varchar(20),
    PRVFIN varchar(20))
returns (
    ERROR varchar(60),
    TIPO integer,
    ID integer,
    PREF varchar(4),
    NUMERO varchar(8))
AS
declare variable FECHA 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 EXISTE CHAR(1);
declare variable IDR INTEGER;
declare variable EGREID INTEGER;
declare variable TRM NUMERIC(18, 2);
declare variable INGPAS INTEGER;
declare variable CANT INTEGER;
declare variable IDT INTEGER;
BEGIN
DELETE FROM anticipos_proveedor WHERE EGRE_ID = 0 AND TERC_NIT >= :PRVINI AND TERC_NIT <= :PRVFIN;
DELETE FROM saldos_doc_cxpagar WHERE TERC_NIT >= :PRVINI AND TERC_NIT <= :PRVFIN;

FOR SELECT FACO_ID, FACO_FECHA, TERC_NIT, FACO_RTFTEMONTO, FACO_rtivamonto, FACO_rticamonto, FACO_RTCREEM, FACO_TOTAL, 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, :FECHA, :nit,  :RTFTE, :RTIVA, :RTICA, :RCREE, MONTO, :TRM
    DO
    INSERT INTO saldos_doc_cxpagar (SDCP_TIPOREF, SDCP_IDREF, SDCP_FECHA, TERC_NIT, SDCP_RTEFTE, SDCP_RTIVA, SDCP_RTICA, SDCP_RCREE, SDCP_ABONO, SDCP_ABRTFTE, SDCP_ABRTIVA, SDCP_ABRTICA, SDCP_ABRCREE, SDCP_DEBITO, SDCP_MONTO, SDCP_TRM)
        VALUES (21, :ID, :fecha, :nit, :rtfte, :rtiva, :rtica, :RCREE, 0, 0, 0, 0, 0, 'S', :MONTO, :TRM);

FOR SELECT NDPR_ID, NDPR_FECHA, 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, :FECHA, :nit,  :RTFTE, :RTIVA, :RTICA, :RCREE, :MONTO, :TRM
    DO
    INSERT INTO saldos_doc_cxpagar (SDCP_TIPOREF, SDCP_IDREF, SDCP_FECHA, TERC_NIT, SDCP_RTEFTE, SDCP_RTIVA, SDCP_RTICA, SDCP_RCREE, SDCP_ABONO, SDCP_ABRTFTE, SDCP_ABRTIVA, SDCP_ABRTICA, SDCP_ABRCREE, SDCP_DEBITO, SDCP_MONTO, SDCP_TRM)
        VALUES (51, :ID, :fecha, :nit, :rtfte, :rtiva, :rtica, :RCREE, 0, 0, 0, 0, 0, 'S', :MONTO, :TRM);

FOR SELECT MANC_ID, MANC_FECHA, TERC_NIT, 0, 0, 0, MANC_APAGAR
    FROM manifiesto_carga M, vehiculos V WHERE V.vehi_cod = manc_vehiculo AND MANC_ID <> 0 and MANC_anulado = 'N' AND TERC_NIT >= :PRVINI AND TERC_NIT <= :PRVFIN and manc_apagar > 0
    ORDER BY MANC_FECHA
    INTO :ID, :FECHA, :nit,  :RTFTE, :RTIVA, :RTICA, :MONTO
    DO
    INSERT INTO saldos_doc_cxpagar (SDCP_TIPOREF, SDCP_IDREF, SDCP_FECHA, TERC_NIT, SDCP_RTEFTE, SDCP_RTIVA, SDCP_RTICA, SDCP_RCREE, SDCP_ABONO, SDCP_ABRTFTE, SDCP_ABRTIVA, SDCP_ABRTICA, SDCP_ABRCREE, SDCP_DEBITO, SDCP_MONTO)
        VALUES (89, :ID, :fecha, :nit, :rtfte, :rtiva, :rtica, :RCREE, 0, 0, 0, 0, 0, 'S', :MONTO);

FOR SELECT DVCO_ID, 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, :FECHA, :nit,  :RTFTE, :RTIVA, :RTICA, :RCREE, :MONTO, :TRM
    DO
    INSERT INTO saldos_doc_cxpagar (SDCP_TIPOREF, SDCP_IDREF, SDCP_FECHA, TERC_NIT, SDCP_RTEFTE, SDCP_RTIVA, SDCP_RTICA, SDCP_RCREE, SDCP_ABONO, SDCP_ABRTFTE, SDCP_ABRTIVA, SDCP_ABRTICA, SDCP_ABRCREE, SDCP_DEBITO, SDCP_MONTO, SDCP_TRM)
        VALUES (24, :ID, :fecha, :nit, :rtfte*-1, :rtiva*-1, :rtica*-1, :rcree*-1, 0, 0, 0, 0, 0, 'N', :MONTO * -1, :TRM);

FOR SELECT NCPR_ID, NCPR_FECHA, 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, :FECHA, :nit,  :RTFTE, :RTIVA, :RTICA, :RCREE, :MONTO, :TRM
    DO
    INSERT INTO saldos_doc_cxpagar (SDCP_TIPOREF, SDCP_IDREF, SDCP_FECHA, TERC_NIT, SDCP_RTEFTE, SDCP_RTIVA, SDCP_RTICA, SDCP_RCREE, SDCP_ABONO, SDCP_ABRTFTE, SDCP_ABRTIVA, SDCP_ABRTICA, SDCP_ABRCREE, SDCP_DEBITO, SDCP_MONTO, SDCP_TRM)
        VALUES (52, :ID, :fecha, :nit, :rtfte*-1, :rtiva*-1, :rtica*-1, :rcree*-1, 0, 0, 0, 0, 0, 'N', :MONTO * -1, :TRM);

FOR SELECT ANPR_ID, ANPR_FECHA, 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, :FECHA, :nit,  :RTFTE, :RTIVA, :RTICA, :RCREE, :MONTO, :TRM
    DO
    INSERT INTO saldos_doc_cxpagar (SDCP_TIPOREF, SDCP_IDREF, SDCP_FECHA, TERC_NIT, SDCP_RTEFTE, SDCP_RTIVA, SDCP_RTICA, SDCP_RCREE, SDCP_ABONO, SDCP_ABRTFTE, SDCP_ABRTIVA, SDCP_ABRTICA, SDCP_ABRCREE, SDCP_DEBITO, SDCP_MONTO, SDCP_TRM)
        VALUES (55, :ID, :fecha, :nit, :rtfte*-1, :rtiva*-1, :rtica*-1, :rcree*-1, 0, 0, 0, 0, 0, 'N', :MONTO * -1, :TRM);

execute procedure LEE_configuracion('TRANSPORTE', 'GENERAL', 'TARIFA DE INGRESO POR PASAJES A CREDITO') returning_values (:ingpas);
FOR SELECT P.plpa_id, P.plpa_fecha, V.terc_nit, 0, 0, 0, D.plpa_valor, D.plpa_tiquete
    FROM planilla_pasajeros_det D, planilla_pasajeros P, VEHICULOS V
    WHERE P.plpa_id = D.plpa_id AND P.plpa_vehiculo = V.vehi_cod AND P.plpa_id <> 0 and p.PLPA_anulado = 'N' AND
    V.TERC_NIT >= :PRVINI AND V.TERC_NIT <= :PRVFIN
    ORDER BY P.plpa_fecha, P.plpa_id
    INTO :ID, :FECHA, :nit,  :RTFTE, :RTIVA, :RTICA, :MONTO, :idt
    DO
    BEGIN
    CANT = 0;
    SELECT TIQP_CANT FROM tiquete_pasajero WHERE TIQP_ID = :IDT and TIQP_FORMAP = 'R' INTO :CANT;
    if (CANT IS NULL) then
        CANT = 0;
    EXISTE = 'N';
    select 'S' from saldos_doc_cxpagar where sdcp_tiporef = 88 and
        sdcp_idref = :id and sdcp_fecha = :fecha into :EXISTE;
    if (Existe = 'S') then
        UPDATE saldos_doc_cxpagar
            SET SDCP_MONTO = SDCP_MONTO + (:monto-(:INGPAS*:cant))
            WHERE SDCP_TIPOREF = 88 AND SDCP_IDREF = :id AND SDCP_FECHA = :fecha;
    ELSE
        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_DEBITO, SDCP_MONTO)
            VALUES (88, :id, :fecha, :nit, 0, 0, 0, 0, 0, 0, 0, 'S', (:monto-(:INGPAS*:CANT)));
    end

execute procedure LEE_configuracion('TRANSPORTE', 'GENERAL', 'TARIFA DE INGRESO POR REMESAS DE PASAJEROS') returning_values (:ingpas);
FOR SELECT P.plpa_id, P.plpa_fecha, V.terc_nit, 0, 0, 0, D.plpr_remesa
    FROM planilla_pasajeros_rem D, planilla_pasajeros P, VEHICULOS V WHERE P.plpa_id = D.plpa_id AND P.plpa_vehiculo = V.vehi_cod AND P.plpa_id <> 0 and P.PLPA_anulado = 'N' AND V.TERC_NIT >= :PRVINI AND V.TERC_NIT <= :PRVFIN
    ORDER BY P.plpa_fecha, P.plpa_id
    INTO :ID, :FECHA, :nit,  :RTFTE, :RTIVA, :RTICA, :idr
    DO
    BEGIN
    SELECT CGRM_TOTAL-CGRM_DOMICILIO-CGRM_SEGURO FROM carga_remesa WHERE CGRM_ID = :IDR INTO :MONTO;
    execute procedure redondee(MONTO * (100-ingpas) / 100, 0) returning_values (MONTO);
    if (MONTO <> 0) then
        BEGIN
        EXISTE = 'N';
        select 'S' from saldos_doc_cxpagar where sdcp_tiporef = 88 and
            sdcp_idref = :id and sdcp_fecha = :fecha into :EXISTE;
        if (Existe = 'S') then
            UPDATE saldos_doc_cxpagar
                SET SDCP_MONTO = SDCP_MONTO + :monto
                WHERE SDCP_TIPOREF = 88 AND SDCP_IDREF = :id AND SDCP_FECHA = :fecha;
        ELSE
            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_DEBITO, SDCP_MONTO)
                VALUES (88, :id, :fecha, :nit, 0, 0, 0, 0, 0, 0, 0, 'S', :monto);
        end
    end

FOR SELECT APPD_TIPODOC, APPD_IDDOC, APPR_FECHA, TERC_NIT, APPD_APLICADO-APPD_DIFCAMBIO, APPD_RTFTE, APPD_RTIVA, APPD_RTICA, APPD_RCREE, 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 :TIPO, :ID, :FECHA, :NIT, :MONTO, :RTFTE, :RTIVA, :RTICA, :RCREE, :TRM
    DO
    BEGIN
    EXISTE = 'N';
    select 'S' from saldos_doc_cxpagar where sdcp_tiporef = :TIPO and sdcp_idref = :ID and sdcp_fecha = :fecha into :EXISTE;
    if (Existe = 'S') then
        begin
        /* actualice el saldo del dia */
        UPDATE saldos_doc_cxpagar
            SET SDCP_ABONO = SDCP_ABONO + :MONTO,
                SDCP_ABRTFTE = SDCP_ABRTFTE + :RTFTE,
                SDCP_ABRTIVA = SDCP_ABRTIVA + :RTIVA,
                SDCP_ABRTICA = SDCP_ABRTICA + :RTICA,
                SDCP_ABRCREE = SDCP_ABRCREE + :RCREE,
                SDCP_TRM = :TRM
            WHERE SDCP_TIPOREF = :TIPO AND SDCP_IDREF = :ID AND SDCP_FECHA = :fecha;
        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_RCREE, SDCP_ABONO, SDCP_ABRTFTE, SDCP_ABRTIVA, SDCP_ABRTICA, SDCP_ABRCREE, SDCP_DEBITO, SDCP_MONTO, SDCP_TRM)
            VALUES (:TIPO, :ID, :fecha, :NIT, 0, 0, 0, 0, :MONTO, :rtfte, :rtiva, :rtica, :RCREE, 'N', 0, :TRM);
        END
    END

FOR SELECT E.EGRE_ID, EGDE_TIPODOC, EGDE_IDDOC, EGRE_FECHA, TERC_NIT, EGDE_ABONO+EGDE_DTOF-EGDE_DIFCAMBIO, EGDE_RTFTE, EGDE_RTIVA, EGDE_RTICA, EGDE_RCREE, 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, :TIPO, :ID, :FECHA, :NIT, :MONTO, :RTFTE, :RTIVA, :RTICA, :RCREE, :TRM
    DO
    BEGIN
    EXISTE = 'N';
    if (TIPO = 55) then
        BEGIN
        SELECT EGRE_ID FROM anticipos_proveedor WHERE ANPR_ID = :ID INTO :EGREID;
        if (EGREID = IDR) then
            EXISTE = 'S';
        END
    if (EXISTE = 'N') then
        BEGIN
        select 'S' from saldos_doc_cxpagar where sdcp_tiporef = :TIPO and sdcp_idref = :ID and sdcp_fecha = :fecha into :EXISTE;
        if (Existe = 'S') then
            begin
            /* actualice el saldo del dia */
            UPDATE saldos_doc_cxpagar
                SET SDCP_ABONO = SDCP_ABONO + :MONTO,
                    SDCP_ABRTFTE = SDCP_ABRTFTE + :RTFTE,
                    SDCP_ABRTIVA = SDCP_ABRTIVA + :RTIVA,
                    SDCP_ABRTICA = SDCP_ABRTICA + :RTICA,
                    SDCP_ABRCREE = SDCP_ABRCREE + :RCREE,
                    SDCP_TRM = :TRM
                WHERE SDCP_TIPOREF = :TIPO AND SDCP_IDREF = :ID AND SDCP_FECHA = :fecha;
            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_RCREE, SDCP_ABONO, SDCP_ABRTFTE, SDCP_ABRTIVA, SDCP_ABRTICA, SDCP_ABRCREE, SDCP_DEBITO, SDCP_MONTO, SDCP_TRM)
                VALUES (:TIPO, :ID, :fecha, :NIT, 0, 0, 0, 0, :MONTO, :rtfte, :rtiva, :rtica, :RCREE, 'N', 0, :TRM);
            END
        END
    END

FOR SELECT R.reca_id, D.rccr_tipodoc, D.rccr_iddoc, RECA_FECHA, TERC_NIT, D.rccr_abono+D.rccr_dtof-rccr_difcambio, D.rccr_rtfte, D.rccr_rtiva, D.rccr_rtica, D.rccr_rcree, 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, :TIPO, :ID, :FECHA, :NIT, :MONTO, :RTFTE, :RTIVA, :RTICA, :RCREE, :TRM
    DO
    BEGIN
    EXISTE = 'N';
    select 'S' from saldos_doc_cxpagar where sdcp_tiporef = :TIPO and sdcp_idref = :ID and sdcp_fecha = :fecha into :EXISTE;
    if (Existe = 'S') then
        begin
        /* actualice el saldo del dia */
        UPDATE saldos_doc_cxpagar
            SET SDCP_ABONO = SDCP_ABONO + :MONTO,
            SDCP_ABRTFTE = SDCP_ABRTFTE + :RTFTE,
            SDCP_ABRTIVA = SDCP_ABRTIVA + :RTIVA,
            SDCP_ABRTICA = SDCP_ABRTICA + :RTICA,
            SDCP_ABRCREE = SDCP_ABRCREE + :RCREE,
            SDCP_TRM = :TRM
            WHERE SDCP_TIPOREF = :TIPO AND SDCP_IDREF = :ID AND SDCP_FECHA = :fecha;
        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_RCREE, SDCP_ABONO, SDCP_ABRTFTE, SDCP_ABRTIVA, SDCP_ABRTICA, SDCP_ABRCREE, SDCP_DEBITO, SDCP_MONTO, SDCP_TRM)
            VALUES (:TIPO, :ID, :fecha, :NIT, 0, 0, 0, 0, :MONTO, :rtfte, :rtiva, :rtica, :RCREE, 'N', 0, :TRM);
        END
    END

for select anpr_id, anpr_base+anpr_ivamonto, PREF_PRE, ANPR_NUMERO, ANPR_TRM from anticipos_proveedor
    where anpr_anulado = 'N' and egre_id not in (select egre_id from egresos where egre_anulado = 'N')
    into :ID, :MONTO, :PREF, :NUMERO, :TRM
    do
    begin
    FECHA = cast('now' as date);
/*    execute procedure saldo_doc_cxpagar(55, :id, :FECHA) returning_values (:RTFTE);*/
    if ((MONTO = RTFTE) or (RTFTE IS NULL)) then
        DELETE FROM anticipos_proveedor WHERE ANPR_ID = :ID;
    ELSE
        BEGIN
        TIPO = 55;
        ERROR = 'DOCUMENTO ANULADO CON ABONOS';
        SUSPEND;
        END
    end
END^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER TRIGGER EGRESOS_DETALLE_AI FOR EGRESOS_DETALLE
ACTIVE AFTER INSERT POSITION 0
AS
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 OK CHAR(1);
declare variable EGANTI INTEGER;
declare variable RETES CHAR(2);
declare variable SALDO NUMERIC(18,2);
declare variable TRM NUMERIC(18,2);
declare variable NITDOC VARCHAR(20);
BEGIN
/* Abone el documento referenciado en EGRESOS_DETALLE */
select PREF_PRE, EGRE_NUMERO, EGRE_FECHA, EGRE_CONC, TERC_NIT, EGRE_TRM
    from EGRESOS where EGRE_ID = new.EGRE_ID into :PREFIJO, :NUMERO, :FEC, :CONCEPTO, :NIT, :TRM;
if ((NEW.EGRE_ID <> 0) and (new.egde_anulado = 'N')) then
    BEGIN
    OK = 'N';
    if (new.EGDE_TIPODOC = 55) then
        BEGIN
        /* BUSQUE SI TIENE EGRE_ID, SI NO LO ACTUALIZA */
        SELECT EGRE_ID FROM ANTICIPOS_PROVEEDOR WHERE ANPR_ID = NEW.EGDE_IDDOC INTO :EGANTI;
        if (EGANTI = 0) then
            BEGIN
            OK = 'S';
            UPDATE ANTICIPOS_PROVEEDOR SET EGRE_ID = NEW.EGRE_ID WHERE ANPR_ID = NEW.EGDE_IDDOC;
            END
        END
    /* valide que no se pase del saldo */
    execute procedure saldo_doc_cxpagar(new.egde_tipodoc, new.egde_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.egde_prefijo || NEW.egde_numero || ' ES INSUFICIENTE.';
    else
      if (SALDO < 0) then
        BEGIN
        if (RETES = 'SI') then
            begin
            if (saldo > (NEW.egde_abono+NEW.egde_dtof-NEW.egde_difcambio)) then
                EXCEPTION DOCUMENTO_ABONO_MAYOR 'EL SALDO DEL DOCUMENTO ' || NEW.egde_prefijo || NEW.egde_numero || ' ES INSUFICIENTE.';
            end
        ELSE
            begin
            if (saldo > (NEW.egde_abono + NEW.egde_rtfte + NEW.egde_rtiva + NEW.egde_rtica + NEW.egde_rcree + new.egde_dtof - NEW.egde_difcambio)) then
                EXCEPTION DOCUMENTO_ABONO_MAYOR 'EL SALDO DEL DOCUMENTO ' || NEW.egde_prefijo || NEW.egde_numero || ' ES INSUFICIENTE.';
            end
        END
      else
        BEGIN
        if (RETES = 'SI') then
            begin
            if (saldo < (NEW.egde_abono + NEW.egde_dtof - NEW.egde_difcambio)) then
                EXCEPTION DOCUMENTO_ABONO_MAYOR 'EL SALDO DEL DOCUMENTO ' || NEW.egde_prefijo || NEW.egde_numero || ' ES INSUFICIENTE.';
            end
        ELSE
            begin
            if (saldo < (NEW.egde_abono + NEW.egde_rtfte + NEW.egde_rtiva + NEW.egde_rtica + NEW.egde_rcree + NEW.egde_dtof - NEW.egde_difcambio)) then
                EXCEPTION DOCUMENTO_ABONO_MAYOR 'EL SALDO DEL DOCUMENTO ' || NEW.egde_prefijo || NEW.egde_numero || ' ES INSUFICIENTE.';
            end
        END
    if (OK = 'N') then
        BEGIN
        if (exists (select sdcp_idref from saldos_doc_cxpagar where sdcp_tiporef = new.egde_tipodoc and
            sdcp_idref = new.egde_iddoc and sdcp_fecha = :FEC)) then
            begin
            /* actualice el saldo del dia */
            UPDATE saldos_doc_cxpagar
                SET SDCP_ABONO = SDCP_ABONO + (NEW.egde_abono + NEW.egde_dtof - NEW.egde_difcambio),
                    SDCP_ABRTFTE = SDCP_ABRTFTE + NEW.egde_RTFTE,
                    SDCP_ABRTIVA = SDCP_ABRTIVA + NEW.egde_RTIVA,
                    SDCP_ABRTICA = SDCP_ABRTICA + NEW.egde_RTICA,
                    SDCP_ABRCREE = SDCP_ABRCREE + NEW.egde_rcree,
                    SDCP_TRM = :TRM
                WHERE SDCP_TIPOREF = NEW.EGDE_TIPODOC AND SDCP_IDREF = NEW.egde_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_RCREE, SDCP_ABONO, SDCP_ABRTFTE, SDCP_ABRTIVA, SDCP_ABRTICA, SDCP_ABRCREE, SDCP_DEBITO, SDCP_MONTO, SDCP_TRM)
                VALUES (NEW.EGDE_TIPODOC, NEW.EGDE_IDDOC, :FEC, :NIT, 0, 0, 0, 0, (NEW.egde_abono+NEW.egde_dtof-NEW.egde_difcambio), NEW.egde_rtfte, NEW.egde_rtiva, NEW.egde_rtica, NEW.egde_rcree, 'N', 0, :TRM);
            END
        END
    /* actualice el registro en mov_proveedor (por si son varios items) */
    SELECT TERC_NIT FROM movimiento_proveedor M WHERE M.mvpr_tiporef = NEW.egde_tipodoc AND M.mvpr_idref = NEW.egde_iddoc INTO :NITDOC;
    if (EXISTS (SELECT MVPR_ID FROM MOVIMIENTO_PROVEEDOR WHERE MVPR_TIPOREF = 62 AND MVPR_IDREF = NEW.EGRE_ID AND TERC_NIT = :NITDOC)) then
        begin
        UPDATE movimiento_proveedor
            SET MVPR_MONTO = MVPR_MONTO + (NEW.egde_abono + NEW.egde_dtof - NEW.egde_difcambio),
                MVPR_RTFTE = MVPR_RTFTE + NEW.egde_rtfte,
                MVPR_RTIVA = MVPR_RTIVA + NEW.egde_rtiva,
                MVPR_RTICA = MVPR_RTICA + NEW.egde_rtica,
                MVPR_RCREE = MVPR_RCREE + NEW.egde_rcree,
                MVPR_TRM = :TRM
            WHERE MVPR_TIPOREF = 62 AND MVPR_IDREF = NEW.EGRE_ID AND TERC_NIT = :NITDOC;
        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), :NITDOC, 62, NEW.EGRE_ID, :FEC, :FEC, :CONCEPTO, (NEW.EGDE_ABONO+NEW.egde_dtof-NEW.egde_difcambio), NEW.EGDE_RTFTE, NEW.EGDE_RTIVA, NEW.EGDE_RTICA, NEW.egde_rcree, 'N', 'S', :PREFIJO, :NUMERO, :TRM);
    END
END^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER TRIGGER EGRESOS_DETALLE_AU FOR EGRESOS_DETALLE
ACTIVE AFTER UPDATE POSITION 0
AS
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 OK CHAR(1);
declare variable EGANTI INTEGER;
declare variable RETES CHAR(2);
declare variable SALDO NUMERIC(18,2);
declare variable TRM NUMERIC(18,2);
declare variable NITDOC VARCHAR(20);
BEGIN
NITDOC = NULL;
select PREF_PRE, EGRE_NUMERO, EGRE_FECHA, EGRE_CONC, TERC_NIT, EGRE_TRM from EGRESOS
    where egre_id = new.egre_id into :PREFIJO, :NUMERO, :FEC, :CONCEPTO, :NIT, :TRM;
if ((OLD.EGRE_ID <> 0) and (old.egde_anulado = 'N')) then
    BEGIN
    /* BORRE EL ANTICIPO SI FUE EL QUIEN LO CREO */
    OK = 'N';
    if (OLD.EGDE_TIPODOC = 55) then
        BEGIN
        SELECT EGRE_ID FROM ANTICIPOS_PROVEEDOR WHERE ANPR_ID = OLD.EGDE_IDDOC INTO :EGANTI;
        if (EGANTI = old.egre_id) then
            begin
            OK = 'S';
            UPDATE anticipos_proveedor SET ANPR_ANULADO = 'S' where ANPR_ID = OLD.EGDE_IDDOC;
            end
        END
    if (OK = 'N') then
        BEGIN
        if (exists (select sdcp_idref from saldos_doc_cxpagar where sdcp_tiporef = old.egde_tipodoc and
            sdcp_idref = old.egde_iddoc and sdcp_fecha = :FEC)) then
            begin
            /* Borre el viejo */
            if (old.EGRE_ID <> 0) then
                UPDATE saldos_doc_cxpagar
                    SET SDCP_ABONO = SDCP_ABONO - (old.egde_abono + OLD.egde_dtof - OLD.egde_difcambio),
                    SDCP_ABRTFTE = SDCP_ABRTFTE - old.egde_RTFTE,
                    SDCP_ABRTIVA = SDCP_ABRTIVA - old.egde_RTIVA,
                    SDCP_ABRTICA = SDCP_ABRTICA - old.egde_RTICA,
                    SDCP_ABRCREE = SDCP_ABRCREE - old.egde_rcree
                    WHERE SDCP_TIPOREF = OLD.EGDE_TIPODOC AND SDCP_IDREF = OLD.egde_IDDOC AND SDCP_FECHA = :FEC;
            end
        END
    SELECT TERC_NIT FROM movimiento_proveedor M WHERE M.mvpr_tiporef = OLD.egde_tipodoc AND M.mvpr_idref = OLD.egde_iddoc INTO :NITDOC;
    if (NITDOC IS NULL) then
        NITDOC = NIT;
    if (EXISTS (SELECT MVPR_ID FROM MOVIMIENTO_PROVEEDOR WHERE MVPR_TIPOREF = 62 AND MVPR_IDREF = OLD.EGRE_ID AND TERC_NIT = :NITDOC)) then
        begin
        /* Deshaga el viejo */
        UPDATE movimiento_proveedor
            SET MVPR_MONTO = MVPR_MONTO - (OLD.egde_abono + OLD.egde_dtof - OLD.egde_difcambio),
            MVPR_RTFTE = MVPR_RTFTE - OLD.egde_rtfte,
            MVPR_RTIVA = MVPR_RTIVA - OLD.egde_rtiva,
            MVPR_RTICA = MVPR_RTICA - OLD.egde_rtica,
            MVPR_RCREE = MVPR_RCREE - OLD.egde_rcree
            WHERE MVPR_TIPOREF = 62 AND MVPR_IDREF = OLD.EGRE_ID AND TERC_NIT = :nitdoc;
        end
    END /* OLD.EGRE_ID <> 0 */
if ((NEW.EGRE_ID <> 0) and (NEW.egde_anulado = 'N')) then
    BEGIN
    /* valide que no se pase del saldo */
    execute procedure saldo_doc_cxpagar(new.egde_tipodoc, new.egde_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.egde_prefijo || NEW.egde_numero || ' ES INSUFICIENTE.';
    else
      if (SALDO < 0) then
        BEGIN
        if (RETES = 'SI') then
            begin
            if (saldo > (NEW.egde_abono + NEW.egde_dtof - NEW.egde_difcambio)) then
                EXCEPTION DOCUMENTO_ABONO_MAYOR 'EL SALDO DEL DOCUMENTO ' || NEW.egde_prefijo || NEW.egde_numero || ' ES INSUFICIENTE.';
            end
        ELSE
            begin
            if (saldo > (NEW.egde_abono + NEW.egde_rtfte + NEW.egde_rtiva + NEW.egde_rtica + NEW.egde_rcree + new.egde_dtof - NEW.egde_difcambio)) then
                EXCEPTION DOCUMENTO_ABONO_MAYOR 'EL SALDO DEL DOCUMENTO ' || NEW.egde_prefijo || NEW.egde_numero || ' ES INSUFICIENTE.';
            end
        END
      else
        BEGIN
        if (RETES = 'SI') then
            begin
            if (saldo < (NEW.egde_abono + NEW.egde_dtof - NEW.egde_difcambio)) then
                EXCEPTION DOCUMENTO_ABONO_MAYOR 'EL SALDO DEL DOCUMENTO ' || NEW.egde_prefijo || NEW.egde_numero || ' ES INSUFICIENTE.';
            end
        ELSE
            begin
            if (saldo < (NEW.egde_abono + NEW.egde_rtfte + NEW.egde_rtiva + NEW.egde_rtica + NEW.egde_rcree + NEW.egde_dtof - NEW.egde_difcambio)) then
                EXCEPTION DOCUMENTO_ABONO_MAYOR 'EL SALDO DEL DOCUMENTO ' || NEW.egde_prefijo || NEW.egde_numero || ' ES INSUFICIENTE.';
            end
        END
    /* AHORA REGISTRE LO NUEVO */
    OK = 'N';
    if (new.EGDE_TIPODOC = 55) then
        BEGIN
        /* BUSQUE SI TIENE EGRE_ID, SI NO LO ACTUALIZA */
        SELECT EGRE_ID FROM ANTICIPOS_PROVEEDOR WHERE ANPR_ID = NEW.EGDE_IDDOC INTO :EGANTI;
        if (EGANTI = 0) then
            BEGIN
            OK = 'S';
            UPDATE ANTICIPOS_PROVEEDOR SET EGRE_ID = NEW.EGRE_ID WHERE ANPR_ID = NEW.EGDE_IDDOC;
            END
        END
    if (OK = 'N') then
        BEGIN
        if (exists (select sdcp_idref from saldos_doc_cxpagar where sdcp_tiporef = new.egde_tipodoc and
            sdcp_idref = new.egde_iddoc and sdcp_fecha = :FEC)) then
            /* actualice el saldo del dia */
            UPDATE saldos_doc_cxpagar
                SET SDCP_ABONO = SDCP_ABONO + (NEW.egde_abono + NEW.egde_dtof - NEW.egde_difcambio),
                SDCP_ABRTFTE = SDCP_ABRTFTE + NEW.egde_RTFTE,
                SDCP_ABRTIVA = SDCP_ABRTIVA + NEW.egde_RTIVA,
                SDCP_ABRTICA = SDCP_ABRTICA + NEW.egde_RTICA,
                SDCP_ABRCREE = SDCP_ABRCREE + NEW.egde_rcree,
                SDCP_TRM = :TRM
                WHERE SDCP_TIPOREF = NEW.EGDE_TIPODOC AND SDCP_IDREF = NEW.egde_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_RCREE, SDCP_ABONO, SDCP_ABRTFTE, SDCP_ABRTIVA, SDCP_ABRTICA, SDCP_ABRCREE, SDCP_DEBITO, SDCP_MONTO, SDCP_TRM)
                VALUES (NEW.EGDE_TIPODOC, NEW.EGDE_IDDOC, :FEC, :NIT, 0, 0, 0, 0, (NEW.egde_abono + NEW.egde_dtof - NEW.egde_difcambio), NEW.egde_rtfte, NEW.egde_rtiva, NEW.egde_rtica, NEW.egde_rcree, 'N', 0, :TRM);
        END /* ok = n */
    /* Registre o actualice el registro en movimiento_proveedor */
    SELECT TERC_NIT FROM movimiento_proveedor M WHERE M.mvpr_tiporef = NEW.egde_tipodoc AND M.mvpr_idref = NEW.egde_iddoc INTO :NITDOC;
    if (EXISTS (SELECT MVPR_ID FROM MOVIMIENTO_PROVEEDOR WHERE MVPR_TIPOREF = 62 AND MVPR_IDREF = NEW.EGRE_ID AND TERC_NIT = :NITDOC)) then
        begin
        UPDATE movimiento_proveedor
            SET MVPR_MONTO = MVPR_MONTO + (NEW.egde_abono + NEW.egde_dtof - NEW.egde_difcambio),
                MVPR_RTFTE = MVPR_RTFTE + NEW.egde_rtfte,
                MVPR_RTIVA = MVPR_RTIVA + NEW.egde_rtiva,
                MVPR_RTICA = MVPR_RTICA + NEW.egde_rtica,
                MVPR_RCREE = MVPR_RCREE + NEW.egde_rcree,
                MVPR_TRM = :TRM
            WHERE MVPR_TIPOREF = 62 AND MVPR_IDREF = NEW.EGRE_ID AND TERC_NIT = :NITDOC;
        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), :NITDOC, 62, NEW.EGRE_ID, :FEC, :FEC, :CONCEPTO, (NEW.EGDE_ABONO+NEW.egde_dtof-NEW.egde_difcambio), NEW.EGDE_RTFTE, NEW.EGDE_RTIVA, NEW.EGDE_RTICA, NEW.egde_rcree, 'N', 'S', :PREFIJO, :NUMERO, :TRM);
    end
END^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER TRIGGER EGRESOS_DETALLE_AD FOR EGRESOS_DETALLE
ACTIVE AFTER DELETE POSITION 0
AS
declare variable FEC DATE;
declare variable OK CHAR(1);
declare variable EGANTI INTEGER;
declare variable NIT VARCHAR(20);
declare variable NITDOC VARCHAR(20);
BEGIN
if (OLD.EGRE_ID <> 0) then
    BEGIN
    SELECT EGRE_FECHA, TERC_NIT FROM EGRESOS WHERE EGRE_ID = OLD.egre_id INTO :FEC, :NIT;
    OK = 'N';
    if (OLD.EGDE_TIPODOC = 55) then
        BEGIN
        SELECT EGRE_ID FROM ANTICIPOS_PROVEEDOR WHERE ANPR_ID = OLD.EGDE_IDDOC INTO :EGANTI;
        if (EGANTI = old.egre_id) then
            begin
            OK = 'S';
            delete from anticipos_proveedor where egre_id = old.egre_id;
            end
        END
    if (old.egde_anulado = 'N') then
      begin
       if (OK = 'N') then
        UPDATE saldos_doc_cxpagar
            SET SDCP_ABONO = SDCP_ABONO - (old.egde_abono+old.egde_dtof-OLD.egde_difcambio),
            SDCP_ABRTFTE = SDCP_ABRTFTE - old.egde_RTFTE,
            SDCP_ABRTIVA = SDCP_ABRTIVA - old.egde_RTIVA,
            SDCP_ABRTICA = SDCP_ABRTICA - old.egde_RTICA,
            SDCP_ABRCREE = SDCP_ABRCREE - old.egde_rcree
            WHERE SDCP_TIPOREF = OLD.EGDE_TIPODOC AND SDCP_IDREF = OLD.egde_IDDOC AND SDCP_FECHA = :FEC;
      /* Deshaga el viejo */
      SELECT TERC_NIT FROM movimiento_proveedor M WHERE M.mvpr_tiporef = OLD.egde_tipodoc AND M.mvpr_idref = OLD.egde_iddoc INTO :NITDOC;
      if (NITDOC IS NULL) then
        NITDOC = NIT;
      UPDATE movimiento_proveedor
        SET MVPR_MONTO = MVPR_MONTO - (OLD.egde_abono+old.egde_dtof-OLD.egde_difcambio),
        MVPR_RTFTE = MVPR_RTFTE - OLD.egde_rtfte,
        MVPR_RTIVA = MVPR_RTIVA - OLD.egde_rtiva,
        MVPR_RTICA = MVPR_RTICA - OLD.egde_rtica,
        MVPR_RCREE = MVPR_RCREE - OLD.egde_rcree
        WHERE MVPR_TIPOREF = 62 AND MVPR_IDREF = OLD.EGRE_ID and terc_nit = :nitdoc;
      end
    END
END^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER procedure MOVIMIENTO_CXPAGAR_DESDE_HASTA (
    NIT varchar(20),
    DESDE date,
    HASTA date,
    MONEDA integer)
returns (
    INICIAL numeric(18,2),
    TIPODOC varchar(8),
    IDDOC integer,
    PREFIJO varchar(4),
    NUMERO varchar(8),
    FECHA date,
    CONCEPTO varchar(60),
    DEBITO numeric(18,2),
    CREDITO numeric(18,2),
    SALDO numeric(18,2),
    NOMBRE varchar(60),
    RTFTE numeric(18,2),
    RTIVA numeric(18,2),
    RTICA numeric(18,2),
    RCREE numeric(18,2),
    NUMPROV varchar(20))
AS
declare variable DB CHAR(1);
declare variable AB CHAR(1);
declare variable RETES CHAR(2);
declare variable TRM NUMERIC(18,2);
declare variable DIFCAMBIO NUMERIC(18,2);
declare variable TIPO INTEGER;
BEGIN
  /* Ubique el NIT */
  select terc_nom from terceros where terc_nit = :NIT INTO :NOMBRE;
  execute procedure saldo_inicial_proveedor (NIT, DESDE, MONEDA) returning_values (INICIAL);
  if (INICIAL is null) then
    INICIAL = 0;
  SALDO = INICIAL;
  EXECUTE PROCEDURE LEE_CONFIGURACION('CXPAGAR', 'SALDOS', 'DESCONTAR RETENCIONES POR CAUSACION') returning_values(:RETES);
  FOR select tido_nomcorto, mvpr_idref, mvpr_prefijo, mvpr_numero, mvpr_fecha, mvpr_conc, mvpr_monto, mvpr_debito, mvpr_rtfte, mvpr_rtiva, mvpr_rtica, mvpr_rcree, mvpr_abono, MVPR_TRM, MVPR_TIPOREF
    from movimiento_proveedor m, tipo_documento t
    where m.mvpr_tiporef = t.tido_cod and terc_nit = :NIT and mvpr_fecha >= :DESDE and mvpr_fecha <= :HASTA AND mvpr_tiporef <> 55 AND ((:MONEDA = 0) or (MVPR_TRM <> 1))
    order by mvpr_fecha, mvpr_tiporef
    into :TIPODOC, :IDDOC, :PREFIJO, :NUMERO, :FECHA, :CONCEPTO, :DEBITO, :DB, :RTFTE, :RTIVA, :RTICA, :RCREE, :AB, :TRM, :TIPO
    DO
    BEGIN
    DIFCAMBIO = 0;
    if (DB = 'N') then
        BEGIN
        if (AB = 'S') then
            if (RETES = 'SI') then
                CREDITO = DEBITO;
            ELSE
                CREDITO = DEBITO + RTFTE + RTIVA + RTICA + RCREE;
        ELSE
            if (RETES = 'SI') then
                CREDITO = DEBITO - RTFTE - RTIVA - RTICA - RCREE;
            ELSE
                CREDITO = DEBITO;
        DEBITO = 0;
        END
    ELSE
        BEGIN
        if (RETES = 'SI') then
            DEBITO = DEBITO - RTFTE - RTIVA - RTICA - RCREE;
        CREDITO = 0;
        END
    if ((MONEDA <> 0) AND (TRM <> 0)) then
        BEGIN
        DEBITO = DEBITO / TRM;
        if (TIPO = 53) then
            SELECT SUM(AD.appd_difcambio) FROM aplicacion_proveedor_detalle AD, aplicacion_provedor A
                WHERE A.appr_id = AD.appr_id AND A.appr_anulado = 'N' AND A.appr_id = :iddoc INTO :difcambio;
        if (TIPO = 62) then
            SELECT SUM(ED.egde_difcambio) FROM egresos_detalle ED, EGRESOS E
                WHERE E.egre_id = ED.egre_id AND E.egre_anulado = 'N' AND E.egre_id = :iddoc INTO :difcambio;
        if (DIFCAMBIO IS NULL) then
            DIFCAMBIO = 0;
        CREDITO = CREDITO + DIFCAMBIO;
        CREDITO = CREDITO / TRM;
        RTFTE = RTFTE / TRM;
        RTIVA = RTIVA / TRM;
        RTICA = RTICA / TRM;
        RCREE = RCREE / TRM;
        END
    SALDO = SALDO + DEBITO - CREDITO;
    NUMPROV = '';
    if (TIPODOC = 'CARGOACR') then
        SELECT NDPR_NUMPROV FROM NOTAS_DEBITO_PROVEEDOR WHERE NDPR_ID = :IDDOC INTO :NUMPROV;
    if (TIPODOC = 'FACTCOMP') then
        SELECT FACO_NUMPROV FROM FACTURAS_COMPRA WHERE FACO_ID = :IDDOC INTO :NUMPROV;
    SUSPEND;
    END
END^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER procedure MOVIMIENTO_CXPAGAR_MES (
    FECINI date,
    FECFIN date,
    MONEDA integer)
returns (
    NIT varchar(20),
    NOMBRE varchar(60),
    GRUPO varchar(2),
    INICIAL numeric(18,4),
    DEBITOS numeric(18,4),
    CREDITOS numeric(18,4),
    ABONOS numeric(18,4),
    FINAL numeric(18,4))
AS
declare variable RETES CHAR(2);
declare variable DIFCAMBIO NUMERIC(18, 2);
BEGIN
  for select TERC_NIT, TERC_NOM from TERCEROS WHERE TERC_PROV = 'S' into :NIT, :NOMBRE
  DO
    BEGIN
    SELECT GRPR_COD FROM PROVEEDORES WHERE TERC_NIT = :NIT INTO :grupo;
    EXECUTE PROCEDURE saldo_inicial_proveedor (NIT, FECINI, MONEDA) returning_values (INICIAL);
    EXECUTE PROCEDURE LEE_CONFIGURACION('CXPAGAR', 'SALDOS', 'DESCONTAR RETENCIONES POR CAUSACION') returning_values(:RETES);
    if (MONEDA <> 0) then
      BEGIN
      if (RETES = 'SI') then
        BEGIN
        SELECT SUM((MVPR_MONTO-MVPR_RTFTE-MVPR_RTIVA-MVPR_RTICA-MVPR_RCREE)/MVPR_TRM)
            FROM movimiento_proveedor
            WHERE TERC_NIT = :NIT AND MVPR_FECHA >= :FECINI AND MVPR_FECHA <= :FECFIN AND MVPR_DEBITO = 'S' AND ((:MONEDA = 0) or (MVPR_TRM <> 1))
            INTO :DEBITOS;
        SELECT SUM((MVPR_MONTO-MVPR_RTFTE-MVPR_RTIVA-MVPR_RTICA-MVPR_RCREE)/MVPR_TRM)
            FROM movimiento_proveedor
            WHERE TERC_NIT = :NIT AND MVPR_FECHA >= :FECINI AND MVPR_FECHA <= :FECFIN AND MVPR_DEBITO = 'N' AND MVPR_ABONO = 'N' and MVPR_TIPOREF <> 55 AND ((:MONEDA = 0) or (MVPR_TRM <> 1))
            INTO :CREDITOS;
        SELECT SUM(MVPR_MONTO/MVPR_TRM) FROM movimiento_proveedor
            WHERE TERC_NIT = :NIT AND MVPR_FECHA >= :FECINI AND MVPR_FECHA <= :FECFIN AND MVPR_ABONO = 'S' AND ((:MONEDA = 0) or (MVPR_TRM <> 1))
            INTO :ABONOS;
        SELECT SUM(ED.egde_difcambio/E.egre_trm) FROM egresos_detalle ED, EGRESOS E
            WHERE E.egre_id = ED.egre_id AND E.egre_anulado = 'N' AND E.egre_fecha >= :fecini AND E.egre_fecha <= :fecfin
            AND E.egre_trm <> 1 AND E.terc_nit = :NIT INTO :difcambio;
        if (DIFCAMBIO IS NULL) then
            DIFCAMBIO = 0;
        ABONOS = ABONOS + DIFCAMBIO;
        SELECT SUM(AD.appd_difcambio/A.appr_trm) FROM aplicacion_proveedor_detalle AD, aplicacion_provedor A
            WHERE A.appr_id = AD.appr_id AND A.appr_anulado = 'N' AND A.appr_fecha >= :fecini AND A.appr_fecha <= :fecfin AND A.appr_trm <> 1 AND A.terc_nit = :NIT INTO :difcambio;
        if (DIFCAMBIO IS NULL) then
            DIFCAMBIO = 0;
        ABONOS = ABONOS + DIFCAMBIO;
        END
    ELSE
        BEGIN
        SELECT SUM(MVPR_MONTO/MVPR_TRM)
            FROM movimiento_proveedor
            WHERE TERC_NIT = :NIT AND MVPR_FECHA >= :FECINI AND MVPR_FECHA <= :FECFIN AND MVPR_DEBITO = 'S' AND ((:MONEDA = 0) or (MVPR_TRM <> 1))
            INTO :DEBITOS;
        SELECT SUM(MVPR_MONTO/MVPR_TRM)
            FROM movimiento_proveedor
            WHERE TERC_NIT = :NIT AND MVPR_FECHA >= :FECINI AND MVPR_FECHA <= :FECFIN AND MVPR_DEBITO = 'N' AND MVPR_ABONO = 'N' AND MVPR_TIPOREF <> 55 AND ((:MONEDA = 0) or (MVPR_TRM <> 1))
            INTO :CREDITOS;
        SELECT SUM((MVPR_MONTO+MVPR_RTFTE+MVPR_RTIVA+MVPR_RTICA+MVPR_RCREE)/MVPR_TRM)
            FROM movimiento_proveedor
            WHERE TERC_NIT = :NIT AND MVPR_FECHA >= :FECINI AND MVPR_FECHA <= :FECFIN AND MVPR_ABONO = 'S' AND ((:MONEDA = 0) or (MVPR_TRM <> 1))
            INTO :ABONOS;
        SELECT SUM(ED.egde_difcambio/E.egre_trm) FROM egresos_detalle ED, EGRESOS E
            WHERE E.egre_id = ED.egre_id AND E.egre_anulado = 'N' AND E.egre_fecha >= :fecini AND E.egre_fecha <= :fecfin AND E.egre_trm <> 1 AND E.terc_nit = :NIT INTO :difcambio;
        if (DIFCAMBIO IS NULL) then
            DIFCAMBIO = 0;
        ABONOS = ABONOS + DIFCAMBIO;
        SELECT SUM(AD.appd_difcambio/A.appr_trm) FROM aplicacion_proveedor_detalle AD, aplicacion_provedor A
            WHERE A.appr_id = AD.appr_id AND A.appr_anulado = 'N' AND A.appr_fecha >= :fecini AND A.appr_fecha <= :fecfin AND A.appr_trm <> 1 AND A.terc_nit = :NIT INTO :difcambio;
        if (DIFCAMBIO IS NULL) then
            DIFCAMBIO = 0;
        ABONOS = ABONOS + DIFCAMBIO;
        END 
      END
    ELSE
      BEGIN
      if (RETES = 'SI') then
        BEGIN
        SELECT SUM(MVPR_MONTO-MVPR_RTFTE-MVPR_RTIVA-MVPR_RTICA-MVPR_RCREE)
            FROM movimiento_proveedor
            WHERE TERC_NIT = :NIT AND MVPR_FECHA >= :FECINI AND MVPR_FECHA <= :FECFIN AND MVPR_DEBITO = 'S'
            INTO :DEBITOS;
        SELECT SUM(MVPR_MONTO-MVPR_RTFTE-MVPR_RTIVA-MVPR_RTICA-MVPR_RCREE)
            FROM movimiento_proveedor
            WHERE TERC_NIT = :NIT AND MVPR_FECHA >= :FECINI AND MVPR_FECHA <= :FECFIN AND MVPR_DEBITO = 'N' AND MVPR_ABONO = 'N' and MVPR_TIPOREF <> 55
            INTO :CREDITOS;
        SELECT SUM(MVPR_MONTO) FROM movimiento_proveedor
            WHERE TERC_NIT = :NIT AND MVPR_FECHA >= :FECINI AND MVPR_FECHA <= :FECFIN AND MVPR_ABONO = 'S'
            INTO :ABONOS;
        END
    ELSE
        BEGIN
        SELECT SUM(MVPR_MONTO)
            FROM movimiento_proveedor
            WHERE TERC_NIT = :NIT AND MVPR_FECHA >= :FECINI AND MVPR_FECHA <= :FECFIN AND MVPR_DEBITO = 'S'
            INTO :DEBITOS;
        SELECT SUM(MVPR_MONTO)
            FROM movimiento_proveedor
            WHERE TERC_NIT = :NIT AND MVPR_FECHA >= :FECINI AND MVPR_FECHA <= :FECFIN AND MVPR_DEBITO = 'N' AND MVPR_ABONO = 'N' AND MVPR_TIPOREF <> 55
            INTO :CREDITOS;
        SELECT SUM(MVPR_MONTO+MVPR_RTFTE+MVPR_RTIVA+MVPR_RTICA+MVPR_RCREE)
            FROM movimiento_proveedor
            WHERE TERC_NIT = :NIT AND MVPR_FECHA >= :FECINI AND MVPR_FECHA <= :FECFIN AND MVPR_ABONO = 'S'
            INTO :ABONOS;
        END 
      END
    if (DEBITOS IS NULL) then
        DEBITOS = 0;
    if (CREDITOS IS NULL) then
        CREDITOS = 0;
    if (ABONOS IS NULL) then
        ABONOS = 0;
    FINAL = INICIAL + DEBITOS - CREDITOS - ABONOS;
    SUSPEND;
    END
END^

SET TERM ; ^

/* 20131022B */
INSERT INTO CONFIGURACION (CONF_MODULO, CONF_CATEGORIA, CONF_PROPIEDAD, CONF_VALOR, CONF_POSIBLES, CONF_AYUDA) VALUES ('CRM', 'PROSPECTOS', 'NOMBRE CAMPO GRUPO', 'Grupo', NULL, 'Indique el nombre de la columna o dato del prospecto');
commit work;

/* 20131028 */
/* REPORTE NO UNA SI NO DOS ESCALAS */
SET TERM ^ ;

CREATE OR ALTER procedure LISTA_PRECIOS_CON_ESCALA (
    FECINI date,
    FECFIN date,
    AGENCIA integer,
    LISTA integer,
    GRUPO varchar(2))
returns (
    ARTICULO varchar(20),
    DESCRIPCION varchar(60),
    PRECIO numeric(18,2),
    PRECIOESCALA1 numeric(18,2),
    ESCALA1 numeric(18,4),
    PRECIOESCALA2 numeric(18,2),
    ESCALA2 numeric(18,4),
    IVA numeric(9,2))
AS
declare variable LISTA1 INTEGER;
begin
FOR SELECT P.ARTI_COD, ARTI_DES, TAIV_PORC, P.prar_fijo
    FROM ARTICULO A, TARIFA_IVA T, PRECIOS_ARTICULO P
    WHERE A.taiv_cod = T.taiv_cod AND A.esar_cod = 'A' AND A.arti_cod = P.arti_cod AND P.lipr_cod = :lista
    AND ((GRUP_COD = :GRUPO) or (:GRUPO IS NULL) or (:GRUPO = ''))
    INTO :ARTICULO, :descripcion, :IVA, :PRECIO
    DO
    BEGIN
    PRECIOESCALA1 = 0;
    ESCALA1 = 0;
    PRECIOESCALA2 = 0;
    ESCALA2 = 0;
    SELECT FIRST 1 P.prar_cantmin, P.prar_fijo, l.lipr_cod FROM precios_articulo P, lista_precios L
        WHERE ARTI_COD = :ARTICULO AND P.LIPR_COD <> :LISTA AND P.lipr_cod = L.lipr_cod AND L.sucu_id = :AGENCIA
        ORDER BY P.prar_cantmin DESC
        INTO :ESCALA1, :precioescala1, :LISTA1;
    SELECT FIRST 1 P.prar_cantmin, P.prar_fijo FROM precios_articulo P, lista_precios L
        WHERE ARTI_COD = :ARTICULO AND P.LIPR_COD <> :LISTA AND P.lipr_cod = L.lipr_cod AND L.sucu_id = :AGENCIA AND P.lipr_cod <> :LISTA1
        ORDER BY P.prar_cantmin DESC
        INTO :ESCALA2, :precioescala2;
    suspend;
    END
end^

SET TERM ; ^

/* 20131028B */
/* LISTA DE ARTICULOS COMO PARAMETRO  */
SET TERM ^ ;

CREATE OR ALTER procedure REP_LISTA_PRECIOS (
    ARTINI varchar(20),
    ARTFIN varchar(20),
    GRPINI varchar(2),
    GRPFIN varchar(2),
    ORDEN char(1),
    LISTA integer,
    LINI integer,
    LFIN integer,
    FECHA date,
    DEATRES char(1),
    MASIVA char(1),
    HOY char(1),
    EXIST char(1),
    CODBOD varchar(2))
returns (
    CODIGO varchar(15),
    NOMBRE varchar(60),
    DESCORTA varchar(30),
    REFERENCIA varchar(20),
    UNIDAD varchar(8),
    UNIDAD2 varchar(8),
    FACTOR2 numeric(18,4),
    UNIDAD3 varchar(8),
    FACTOR3 numeric(18,4),
    UNIDAD4 varchar(8),
    FACTOR4 numeric(18,4),
    CODGRUPO varchar(2),
    NOMGRUPO varchar(30),
    CODSUBG varchar(3),
    NOMSUBG varchar(30),
    CODMARC varchar(3),
    NOMMARC varchar(30),
    NOMLISTA varchar(30),
    PRECIO numeric(18,2),
    PRECIO2 numeric(18,2),
    PRECIO3 numeric(18,2),
    MARGEN numeric(9,2),
    IVA numeric(9,2),
    IVAMONTO numeric(18,2),
    CONSUMO numeric(18,2),
    CANTMIN numeric(18,4),
    PESO numeric(18,4),
    ANCHO numeric(18,4),
    ALTO numeric(18,4),
    LARGO numeric(18,4),
    CANT numeric(18,4),
    DTO1 numeric(9,4),
    DTO2 numeric(9,4),
    COMI numeric(9,4),
    COMIC numeric(9,4),
    FECPRE date,
    FOTO blob sub_type 1 segment size 80,
    OBS blob sub_type 1 segment size 80,
    TOTAL 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 UTIL NUMERIC(9,2);
declare variable MOU CHAR(10);
declare variable LISIVA CHAR(2);
declare variable i integer;
declare variable J integer;
declare variable PRECAUX NUMERIC(18,2);
declare variable DIG INTEGER;
declare variable UNIDADA VARCHAR(8);
declare variable FACTORA NUMERIC(18,4);
declare variable FECHOY DATE;
declare variable CODLISTA INTEGER;
BEGIN
if (ORDEN = 'C') then
    BEGIN
    CODINI = ARTINI;
    CODFIN = ARTFIN;
    DESINI = '';
    DESFIN = 'zz';
    END
ELSE
    BEGIN
    DESINI = ARTINI;
    DESFIN = ARTFIN;
    CODINI = '';
    CODFIN = 'zz';
    END
FECHOY = cast('now' as DATE);
EXECUTE PROCEDURE LEE_CONFIGURACION ('FACTURACION', 'ARTICULOS', 'SUGERIR PRECIOS CON PORCENTAJE DE MARGEN O UTILIDAD') returning_values (MOU);
EXECUTE PROCEDURE LEE_CONFIGURACION ('FACTURACION', 'ARTICULOS', 'REDONDEO AL MULTIPLO DE DIEZ EN PRECIOS') returning_values (DIG);
if (LISTA = 0) then
    BEGIN
    FOR SELECT a.ARTI_COD, ARTI_DES, ARTI_DESCORTA, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD, TAIV_PORC, ARTI_CONSUMO,
        ARTI_FOTO, ARTI_PESO, ARTI_LARGO, ARTI_ANCHO, ARTI_ALTO, ARTI_OBS
        FROM ARTICULO A, TARIFA_IVA T
        WHERE A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :GRPFIN AND
        ARTI_DES >= :DESINI AND ARTI_DES <= :DESFIN AND ESAR_COD = 'A' AND A.TAIV_COD = T.TAIV_COD
        ORDER BY ARTI_COD
        INTO :CODIGO, :NOMBRE, :DESCORTA, UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC, :IVA, :CONSUMO,
            :FOTO, :PESO, :LARGO, :ANCHO, :ALTO, :OBS
        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;
        SELECT MIN(COBA_COD) FROM barras_articulo WHERE ARTI_COD = :codigo INTO :referencia;
        J = 0;
        UNIDAD2 = '';
        UNIDAD3 = '';
        UNIDAD4 = '';
        factor2 = 0;
        factor3 = 0;
        factor4 = 0;
        CANT = 0;
        for SELECT UNAR_UNIDAD, UNAR_FACPRE FROM unidad_articulo WHERE ARTI_COD = :codigo INTO :unidada, :factora
            DO
            BEGIN
            if (J = 0) then
                BEGIN
                UNIDAD2 = UNIDADA;
                FACTOR2 = FACTORA;
                END
            if (J = 1) then
                BEGIN
                UNIDAD3 = UNIDADA;
                FACTOR3 = FACTORA;
                END
            if ( J = 2) then
                BEGIN
                UNIDAD4 = UNIDADA;
                FACTOR4 = FACTORA;
                END
            J = J + 1;
            END
        I = 0;
        FOR SELECT P.LIPR_COD, LIPR_NOM, PRAR_FIJO, PRAR_MARGEN, PRAR_UTIL, LIPR_MODIF, PRAR_CANTMIN, PRAR_DTO1, PRAR_DTO2, PRAR_COMIC, PRAR_COMI
            FROM LISTA_PRECIOS L, PRECIOS_ARTICULO P
            WHERE L.LIPR_COD = P.LIPR_COD AND p.arti_cod = :codigo and l.lipr_cod >= :lini and l.lipr_cod <= :lfin AND
            ((:fecha IS NULL) or ((L.lipr_fecini <= :FECHA) AND (L.lipr_fecfin >= :FECHA)))
            ORDER BY L.LIPR_COD
            INTO :CODLISTA, :NOMLISTA, :PRECIO, :MARGEN, :UTIL, :LISIVA, :cantmin, :DTO1, :DTO2, :COMIC, :COMI
            do
            BEGIN
            if ((HOY = 'N') or (exists (select capr_id FROM cambia_precios WHERE ARTI_COD = :CODIGO AND CAPR_FECHA = :FECHOY AND LIPR_COD = :codlista))) then
                BEGIN
                FECPRE = NULL;
                SELECT FIRST 1 CAPR_FECHA FROM cambia_precios
                    WHERE ARTI_COD = :CODIGO AND LIPR_COD = :codlista AND CAPR_FECHA <= :fechoy ORDER BY CAPR_FECHA DESC
                    INTO :fecpre;
                if (MOU = 'UTILIDAD') then
                    MARGEN = UTIL;
                if (LISIVA = 'N') then
                    IVAMONTO = PRECIO * IVA / 100;
                ELSE
                    BEGIN
                    IVAMONTO = (PRECIO - CONSUMO) * IVA / (100 + IVA);
                    PRECIO = (PRECIO - CONSUMO) / (1 + (IVA/100));
    /*              EXECUTE PROCEDURE redondee(PRECIO, DIG) returning_values (PRECIO); */
                    END
                TOTAL = PRECIO + IVAMONTO + CONSUMO;
                EXECUTE PROCEDURE redondee(TOTAL, DIG) returning_values (TOTAL);
                if (DEATRES = 'N') then
                    BEGIN
                    if (EXIST = 'S') then
                        BEGIN
                        if (CODBOD = '0') then
                            EXECUTE procedure SALDO_TOTAL_INVENTARIO (CODIGO, FECHA) returning_values (CANT);
                        else
                            EXECUTE procedure SALDO_INVENTARIO (CODIGO, :codbod, :FECHA) returning_values (CANT);
                        if (CANT > 0) then
                            SUSPEND;
                        END
                    ELSE
                        SUSPEND;
                    END
                else
                    BEGIN
                    I = I + 1;
                    if (MASIVA = 'S') then
                        PRECIO = TOTAL;
                    TOTAL = 0;
                    if (MOD(I,3) = 1) then
                        BEGIN
                        PRECAUX = PRECIO;
                        PRECIO2 = 0;
                        PRECIO3 = 0;
                        END
                    if (MOD(I,3) = 2) then
                        BEGIN
                        PRECIO2 = PRECIO;
                        PRECIO = PRECAUX;
                        END
                    if (MOD(I,3) = 0) then
                        BEGIN
                        PRECIO3 = PRECIO;
                        PRECIO = PRECAUX;
                        SUSPEND;
                        END
                    END
                END
            end
        if ((DEATRES = 'S') AND (MOD(I,3) <> 0)) then
            if (EXIST = 'S') then
                begin
                if (CODBOD = '0') then
                    EXECUTE procedure SALDO_TOTAL_INVENTARIO (CODIGO, FECHA) returning_values (CANT);
                else
                    EXECUTE procedure SALDO_INVENTARIO (CODIGO, :codbod, :FECHA) returning_values (CANT);
                if (CANT > 0) then
                    suspend;
                end
            else
                suspend;
        end
    END
ELSE
    BEGIN
    FOR SELECT a.ARTI_COD, ARTI_DES, ARTI_DESCORTA, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD, TAIV_PORC, ARTI_CONSUMO,
        ARTI_FOTO, ARTI_PESO, ARTI_LARGO, ARTI_ANCHO, ARTI_ALTO, ARTI_OBS
        FROM ARTICULO A, TARIFA_IVA T, lista_articulos_det LA
        WHERE A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :GRPFIN AND
        ARTI_DES >= :DESINI AND ARTI_DES <= :DESFIN AND ESAR_COD = 'A' AND A.TAIV_COD = T.TAIV_COD AND LA.liar_id = :LISTA AND LA.arti_cod = A.arti_cod
        ORDER BY ARTI_COD
        INTO :CODIGO, :NOMBRE, :DESCORTA, UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC, :IVA, :CONSUMO,
            :FOTO, :PESO, :LARGO, :ANCHO, :ALTO, :OBS
        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;
        SELECT MIN(COBA_COD) FROM barras_articulo WHERE ARTI_COD = :codigo INTO :referencia;
        J = 0;
        UNIDAD2 = '';
        UNIDAD3 = '';
        UNIDAD4 = '';
        factor2 = 0;
        factor3 = 0;
        factor4 = 0;
        CANT = 0;
        for SELECT UNAR_UNIDAD, UNAR_FACPRE FROM unidad_articulo WHERE ARTI_COD = :codigo INTO :unidada, :factora
            DO
            BEGIN
            if (J = 0) then
                BEGIN
                UNIDAD2 = UNIDADA;
                FACTOR2 = FACTORA;
                END
            if (J = 1) then
                BEGIN
                UNIDAD3 = UNIDADA;
                FACTOR3 = FACTORA;
                END
            if ( J = 2) then
                BEGIN
                UNIDAD4 = UNIDADA;
                FACTOR4 = FACTORA;
                END
            J = J + 1;
            END
        I = 0;
        FOR SELECT P.LIPR_COD, LIPR_NOM, PRAR_FIJO, PRAR_MARGEN, PRAR_UTIL, LIPR_MODIF, PRAR_CANTMIN, PRAR_DTO1, PRAR_DTO2, PRAR_COMIC, PRAR_COMI
            FROM LISTA_PRECIOS L, PRECIOS_ARTICULO P
            WHERE L.LIPR_COD = P.LIPR_COD AND p.arti_cod = :codigo and l.lipr_cod >= :lini and l.lipr_cod <= :lfin AND
            ((:fecha IS NULL) or ((L.lipr_fecini <= :FECHA) AND (L.lipr_fecfin >= :FECHA)))
            ORDER BY L.LIPR_COD
            INTO :CODLISTA, :NOMLISTA, :PRECIO, :MARGEN, :UTIL, :LISIVA, :cantmin, :DTO1, :DTO2, :COMIC, :COMI
            do
            BEGIN
            if ((HOY = 'N') or (exists (select capr_id FROM cambia_precios WHERE ARTI_COD = :CODIGO AND CAPR_FECHA = :FECHOY AND LIPR_COD = :codlista))) then
                BEGIN
                FECPRE = NULL;
                SELECT FIRST 1 CAPR_FECHA FROM cambia_precios
                    WHERE ARTI_COD = :CODIGO AND LIPR_COD = :codlista AND CAPR_FECHA <= :fechoy ORDER BY CAPR_FECHA DESC
                    INTO :fecpre;
                if (MOU = 'UTILIDAD') then
                    MARGEN = UTIL;
                if (LISIVA = 'N') then
                    IVAMONTO = PRECIO * IVA / 100;
                ELSE
                    BEGIN
                    IVAMONTO = (PRECIO - CONSUMO) * IVA / (100 + IVA);
                    PRECIO = (PRECIO - CONSUMO) / (1 + (IVA/100));
    /*              EXECUTE PROCEDURE redondee(PRECIO, DIG) returning_values (PRECIO); */
                    END
                TOTAL = PRECIO + IVAMONTO + CONSUMO;
                EXECUTE PROCEDURE redondee(TOTAL, DIG) returning_values (TOTAL);
                if (DEATRES = 'N') then
                    BEGIN
                    if (EXIST = 'S') then
                        BEGIN
                        if (CODBOD = '0') then
                            EXECUTE procedure SALDO_TOTAL_INVENTARIO (CODIGO, FECHA) returning_values (CANT);
                        else
                            EXECUTE procedure SALDO_INVENTARIO (CODIGO, :codbod, :FECHA) returning_values (CANT);
                        if (CANT > 0) then
                            SUSPEND;
                        END
                    ELSE
                        SUSPEND;
                    END
                else
                    BEGIN
                    I = I + 1;
                    if (MASIVA = 'S') then
                        PRECIO = TOTAL;
                    TOTAL = 0;
                    if (MOD(I,3) = 1) then
                        BEGIN
                        PRECAUX = PRECIO;
                        PRECIO2 = 0;
                        PRECIO3 = 0;
                        END
                    if (MOD(I,3) = 2) then
                        BEGIN
                        PRECIO2 = PRECIO;
                        PRECIO = PRECAUX;
                        END
                    if (MOD(I,3) = 0) then
                        BEGIN
                        PRECIO3 = PRECIO;
                        PRECIO = PRECAUX;
                        SUSPEND;
                        END
                    END
                END
            end
        if ((DEATRES = 'S') AND (MOD(I,3) <> 0)) then
            if (EXIST = 'S') then
                begin
                if (CODBOD = '0') then
                    EXECUTE procedure SALDO_TOTAL_INVENTARIO (CODIGO, FECHA) returning_values (CANT);
                else
                    EXECUTE procedure SALDO_INVENTARIO (CODIGO, :codbod, :FECHA) returning_values (CANT);
                if (CANT > 0) then
                    suspend;
                end
            else
                suspend;
        end
    END
END^

SET TERM ; ^

/* 20131028C */
/* CONVIERTA EL DETALLE CON LA TRM DEL DIA Y NO CON LA DEL DOC. LA CXP SE AJUSTA CON LA DIF. CAMBIO */
SET TERM ^ ;

CREATE OR ALTER TRIGGER EGRESOS_DETALLE_BI FOR EGRESOS_DETALLE
ACTIVE BEFORE INSERT POSITION 0
as
declare variable PREGTASA CHAR(2);
declare variable TRM NUMERIC(18,2);
declare variable TRMDOC NUMERIC(18,2);
declare variable FECREC DATE;
declare variable FECDOC DATE;
declare variable OTROSTERC CHAR(2);
declare variable NITE VARCHAR(20);
declare variable NITDOC VARCHAR(20);
begin
if (NEW.egde_rcree IS NULL) then
    NEW.egde_rcree = 0;
/* SI TRM <> 1 CONVIERTA A PESOS LOS VALORES */
EXECUTE PROCEDURE LEE_CONFIGURACION('GENERAL', 'GENERAL', 'PREGUNTAR TASA DE CAMBIO EN DOCUMENTOS DE CUENTAS POR PAGAR') returning_values (:pregtasa);
EXECUTE PROCEDURE LEE_CONFIGURACION('CAJA', 'EGRESOS', 'PERMITIR ABONAR/CANCELAR DOCUMENTOS DE VARIOS TERCEROS EN UN SOLO EGRESO') returning_values (:otrosterc);
if (PREGTASA = 'SI') then
    BEGIN
    SELECT EGRE_TRM FROM EGRESOS WHERE EGRE_ID = NEW.egre_id INTO :TRM;
    SELECT MVPR_TRM FROM MOVIMIENTO_PROVEEDOR M WHERE M.mvpr_tiporef = NEW.egde_tipodoc AND M.mvpr_idref = NEW.egde_iddoc INTO :TRMDOC;
    NEW.egde_difcambio = (NEW.egde_abono + NEW.egde_dtof) * (TRM - TRMDOC);
    NEW.egde_abono = NEW.egde_abono * :trm;
    NEW.egde_rtfte = NEW.egde_rtfte * :trm;
    NEW.egde_rtiva = NEW.egde_rtiva * :trm;
    NEW.egde_rtica = NEW.egde_rtica * :trm;
    NEW.egde_rcree = NEW.egde_rcree * :trm;
    NEW.egde_dtof = NEW.egde_dtof * :trm;
    END
if ((new.egde_abono+new.egde_rtfte+new.egde_rtiva+new.egde_rtica+new.egde_rcree+new.egde_dtof) = 0) then
    exception ABONO_CERO 'El monto del abono al documento ' || new.egde_prefijo || new.egde_numero || ' no puede ser cero.';
/* valide que la fecha no sea anterior al documento */
SELECT EGRE_FECHA, TERC_NIT FROM EGRESOS WHERE EGRE_ID = NEW.egre_id INTO :FECREC, :NITE;
SELECT MVPR_FECHA, TERC_NIT FROM movimiento_proveedor M WHERE M.mvpr_tiporef = NEW.egde_tipodoc AND M.mvpr_idref = NEW.egde_iddoc INTO :FECDOC, :NITDOC;
if (FECDOC > FECREC) then
    exception fecha_anterior_documento 'EL EGRESO DE FECHA ' || :FECREC || ' INTENTA ABONAR UN DOCUMENTO DE FECHA ' || FECDOC;
if ((otrosterc = 'NO') AND (NITE <> NITDOC)) then
    exception documento_de_otro_tercero 'EL EGRESO CON NIT ' || :nite || ' INTENTA ABONAR EL DOCUMENTO ' || NEW.egde_prefijo || NEW.egde_numero || ' DEL PROVEEDOR ' || :nitdoc;
END^

SET TERM ; ^

/* 20131028D */
/* SALDO DEL DOCUMENTO EN CUADRE CAJA */
SET TERM ^ ;

CREATE OR ALTER procedure CUADRE_CAJA_ABONOS (
    FECHA date,
    AGENCIA integer)
returns (
    AXCTIPO varchar(10),
    AXCNUMERO varchar(12),
    AXCNIT varchar(20),
    AXCNOMBRE varchar(60),
    AXCMONTO numeric(18,2),
    AXCSALDO numeric(18,2))
AS
declare variable TIPO integer;
declare variable IDDOC integer;
begin
/* DETALLE DE LOS ABONOS DE OTROS DIAS */
for select tido_nomcorto, rcde_prefijo || rcde_numero, rcde_abono, R.terc_nit, rcde_tipodoc, rcde_iddoc
    from recibos_caja_detalle d, recibos_caja r, movimiento_clientes m, tipo_documento t, PREFIJOS P
    where r.reca_id = d.reca_id and r.reca_fecha = :fecha and d.rcde_tipodoc = m.mvcl_tiporef and
    d.rcde_iddoc = m.mvcl_idref AND RCDE_ANULADO = 'N' and t.tido_cod = d.rcde_tipodoc AND
    P.tido_cod = 61 AND P.pref_pre = R.pref_pre AND ((:AGENCIA = 0) or (P.sucu_id = :AGENCIA)) AND
    ((MVCL_TIPOREF <> 31 AND MVCL_TIPOREF <> 33) OR mvcl_fecha <> :fecha)
    into :axctipo, :axcnumero, axcmonto, :axcnit, :tipo, :iddoc
    do
    begin
    if (axcmonto IS NULL) then
        axcmonto = 0;
    axcnombre = '';
    SELECT TERC_NOM FROM TERCEROS WHERE TERC_NIT = :axcnit INTO :axcnombre;
    EXECUTE PROCEDURE saldo_doc_cartera(:tipo, :iddoc, :fecha, 0) returning_values (:AXCSALDO);
    SUSPEND;
    end
end^

SET TERM ; ^

/* 20131029 */
/* NUMERO DE PEDIDO DE 6 DIGITOS Y FACTURA DE 8, COMPARAR LOS ULTIMOS 6 */
SET TERM ^ ;

CREATE OR ALTER TRIGGER DEVOLUCIONES_VENTAS_DETALLE_AI FOR DEVOLUCIONES_VENTAS_DETALLE
ACTIVE AFTER INSERT POSITION 0
AS
declare variable fec date;
declare variable fecfac date;
declare variable CONC VARCHAR(60);
declare variable factor numeric(18,4);
declare variable Pref varchar(4);
declare variable Num varchar(8);
declare variable Nit varchar(20);
declare variable ID INTEGER;
declare variable ITEM INTEGER;
declare variable DEVUELTO NUMERIC(18,4);
declare variable CANT NUMERIC(18, 4);
declare variable CANTAUX NUMERIC(18, 4);
declare variable CNTFAC NUMERIC(18, 4);
declare variable FACT VARCHAR(12);
declare variable COSTO NUMERIC(18,2);
declare variable ULTIMO NUMERIC(18,2);
declare variable devnof CHAR(2);
declare variable numrows INTEGER;
declare variable OK CHAR(1);
declare variable PEDAUTO CHAR(2);
declare variable IDPED INTEGER;
declare variable IDREM INTEGER;
declare variable devrem CHAR(6);
declare variable EXIST CHAR(1);
BEGIN
execute procedure lee_configuracion ('FACTURACION', 'DEVOLUCIONES', 'HACER DEVOLUCIONES SOBRE REMISIONES') returning_values (:devrem);
if ((NEW.devt_id <> 0) and (new.dvde_anulado = 'N')) then
    BEGIN
    ID = 0;
    select devt_fecha, pref_pre, devt_numero, terc_nit, devt_factura, devt_remid, DEVT_FACTID , devt_pedid
        from devoluciones_ventas where devt_id = new.devt_id into :fec, :Pref, :Num, :Nit, :Fact, :idrem, :ID, :idped;
    execute procedure factor_unidad_cant(new.arti_cod, new.dvde_unidad) returning_values(factor);
    CONC = 'DEVOLUCION VENTA No.' || PREF || NUM || ' - FACTURA ' || FACT;
    /* si la factura afecto el inventario, afectelo */
    execute procedure lee_configuracion ('FACTURACION', 'DEVOLUCIONES', 'PERMITIR DEVOLVER ITEMS NO FACTURADOS') returning_values (:devnof);
    if (devnof = 'SI') then
        OK = 'S';
    else
        BEGIN
        if (id <> 0) then
            begin
            SELECT SUM(FADE_CANT * FADE_FACTOR) FROM FACTURAS_DETALLE WHERE FACT_ID = :ID AND ARTI_COD = NEW.arti_cod INTO :cntfac;
            /* verifique si afecto el inventario */
            select count(mvar_cons) from movimiento_articulo where mvar_tipodoc = 31 and mvar_idref = :id and arti_cod = new.arti_cod into :numrows;
            if (numrows > 0) then
                OK = 'S';
            else
                BEGIN
                /* busque remisiones que pudieron afectarlo */
                /* primero posteriores a la factura */
                select sum(cofa_cantcr) from consolidado_faltantes where cofa_tipoori = 31 and cofa_idori = :id and cofa_tipodes = 32 and arti_cod = new.arti_cod and cofa_cantcr <> 0 into :cantaux;
                if ((cantaux <> 0) and (cantaux is not null)) then
                    BEGIN
                    if ((CNTFAC - (NEW.dvde_cant * NEW.dvde_factor)) <> CANTAUX) then
                        OK = 'S';
                    ELSE
                        OK = 'N';
                    END
                else
                    begin
                    /* si no, anteriores a la factura */
                    select sum(cofa_cantcr) from consolidado_faltantes C, FACTURAS f where f.fact_consolida = c.cofa_id and cofa_tipoori = 32 and f.fact_id = :id and cofa_tipodes = 31 and arti_cod = new.arti_cod and cofa_cantcr <> 0 into :cantaux;
                    if ((cantaux <> 0) and (cantaux is not null)) then
                        OK = 'S';
                    else
                        BEGIN
                        /* si hacen pedido automatico, puede que la remisión este hecha con el pedido */
                        EXECUTE PROCEDURE LEE_CONFIGURACION('FACTURACION','FACTURAS','GENERAR PEDIDO AUTOMATICAMENTE CON LA FACTURA') RETURNING_VALUES (PEDAUTO);
                        if (PEDAUTO = 'SI') then
                            BEGIN
                            SELECT PEDI_ID FROM PEDIDOS P, FACTURAS F WHERE P.PREF_PRE = F.pref_pre AND P.pedi_numero = right(F.fact_numero,6) AND F.fact_id = :id INTO :IDped;
                            select sum(cofa_cantcr) from consolidado_faltantes where cofa_tipoori = 34 and cofa_idori = :idped and cofa_tipodes = 32 and arti_cod = new.arti_cod and cofa_cantcr <> 0 into :cantaux;
                            if ((cantaux <> 0) and (cantaux is not null)) then
                                if ((CNTFAC - (NEW.dvde_cant * NEW.dvde_factor)) <> CANTAUX) then
                                    OK = 'S';
                                else
                                    OK = 'N';
                            else
                                OK = 'N';
                            END
                        ELSE
                            OK = 'N';
                        END
                    end
                END
            end
        else
          if ((idrem <> 0) and (devrem = 'SI')) then
            begin
            /* verifique si afecto el inventario */
            select count(mvar_cons) from movimiento_articulo where mvar_tipodoc = 32 and mvar_idref = :idrem and arti_cod = new.arti_cod into :numrows;
            if (numrows > 0) then
                OK = 'S';
            else
                OK = 'N';
            end
        END
    if (OK = 'S') then
        begin
        /* calcule el costo al que salio o el promedio */
        execute procedure costo_promedio(new.arti_cod, :FEC) returning_values (:COSTO);
        if (COSTO = 0) then
            BEGIN
            if (id <> 0) then
                begin
                SELECT FACT_FECHA FROM FACTURAS WHERE FACT_ID = :ID INTO :fecfac;
                execute procedure costo_promedio_y_ultimo(new.arti_cod, :FECFAC) returning_values (:COSTO, :ULTIMO);
                if (COSTO = 0) then
                    COSTO = ULTIMO;
                end
            if (idrem <> 0) then
                begin
                SELECT REVT_FECHA FROM remisiones_venta WHERE REVT_ID = :ID INTO :fecfac;
                execute procedure costo_promedio_y_ultimo(new.arti_cod, :FECFAC) returning_values (:COSTO, :ULTIMO);
                if (COSTO = 0) then
                    COSTO = ULTIMO;
                end
            END

        INSERT INTO MOVIMIENTO_ARTICULO
            (ARTI_COD, BODE_COD, MVAR_FECHA, MVAR_TIPODOC, MVAR_IDREF,
            MVAR_CONC, MVAR_CANT, MVAR_COSTO, MVAR_ENTRADA, MVAR_LOTE, MVAR_PREF, MVAR_NUMERO, MVAR_ITEM, TERC_NIT)
            VALUES(NEW.ARTI_COD, NEW.BODE_COD, :FEC, 33, NEW.devt_id,
            :CONC, :factor * new.dvde_cant, :COSTO, 'S', new.dvde_lote, :Pref, :Num, new.dvde_item, :Nit);
        end
    /* ACTUALICE LO DEVUELTO EN LA FACTURA */
    select ARTI_EXIST from ARTICULO where ARTI_COD = new.ARTI_COD into :EXIST;
    if (ID <> 0) then
        BEGIN
        CANTAUX = NEW.dvde_cant * NEW.dvde_factor;
        if (EXIST <> 'L') then
            begin
            FOR SELECT FADE_ITEM, FADE_CANT, FADE_FACTOR, FADE_DEVUELTO
                FROM FACTURAS_DETALLE
                WHERE FACT_ID = :ID AND ARTI_COD = NEW.ARTI_COD and FADE_CANT > 0
                INTO :ITEM, :CANT, :FACTOR, :DEVUELTO
                DO
                BEGIN
                if ((CANTAUX > 0) and ((CANT * FACTOR) > 0))then
                    if ((CANT * FACTOR - DEVUELTO) < CANTAUX) then
                      BEGIN
                      UPDATE FACTURAS_DETALLE
                        SET FADE_DEVUELTO = (:CANT * :FACTOR)
                        WHERE FACT_ID = :ID AND FADE_ITEM = :ITEM AND ARTI_COD = NEW.ARTI_COD;
                      CANTAUX = CANTAUX - (CANT * FACTOR - DEVUELTO);
                      END
                    ELSE
                      BEGIN
                      UPDATE FACTURAS_DETALLE
                        SET FADE_DEVUELTO = FADE_DEVUELTO + :CANTAUX
                        WHERE FACT_ID = :ID AND FADE_ITEM = :ITEM AND ARTI_COD = NEW.ARTI_COD;
                      CANTAUX = 0;
                      END
                END
            end
        else
            begin
            FOR SELECT FADE_ITEM, FADE_CANT, FADE_FACTOR, FADE_DEVUELTO
                FROM FACTURAS_DETALLE WHERE FACT_ID = :ID AND ARTI_COD = NEW.ARTI_COD AND BODE_COD = NEW.bode_cod
                    AND FADE_LOTE = NEW.dvde_lote AND FADE_CANT > 0
                INTO :ITEM, :CANT, :FACTOR, :DEVUELTO
                DO
                BEGIN
                if ((CANTAUX > 0) and ((CANT * FACTOR) > 0))then
                    if ((CANT * FACTOR - DEVUELTO) < CANTAUX) then
                      BEGIN
                      UPDATE FACTURAS_DETALLE
                        SET FADE_DEVUELTO = (:CANT * :FACTOR)
                        WHERE FACT_ID = :ID AND FADE_ITEM = :ITEM AND ARTI_COD = NEW.ARTI_COD;
                      CANTAUX = CANTAUX - (CANT * FACTOR - DEVUELTO);
                      END
                    ELSE
                      BEGIN
                      UPDATE FACTURAS_DETALLE
                        SET FADE_DEVUELTO = FADE_DEVUELTO + :CANTAUX
                        WHERE FACT_ID = :ID AND FADE_ITEM = :ITEM AND ARTI_COD = NEW.ARTI_COD;
                      CANTAUX = 0;
                      END
                END
            end
        if (CANTAUX > 0) then
            EXCEPTION DEVOLUCION_MAYOR 'Esta devolviendo una cantidad mayor a la facturada del articulo ' || new.arti_cod;
        END
    if ((idrem <> 0) and (devrem = 'SI')) then
        BEGIN
        CANTAUX = NEW.dvde_cant * NEW.dvde_factor;
        if (EXIST <> 'L') then
            begin
            FOR SELECT RVDE_ITEM, RVDE_CANT, RVDE_FACTOR, RVDE_DEVUELTO
                FROM remisiones_venta_detalle
                WHERE REVT_ID = :idrem AND ARTI_COD = NEW.ARTI_COD
                INTO :ITEM, :CANT, :FACTOR, :DEVUELTO
                DO
                BEGIN
                if (CANTAUX > 0) then
                    if ((CANT * FACTOR - DEVUELTO) < CANTAUX) then
                      BEGIN
                      UPDATE remisiones_venta_detalle
                        SET RVDE_DEVUELTO = (:CANT * :FACTOR)
                        WHERE REVT_ID = :IDREM AND RVDE_ITEM = :ITEM AND ARTI_COD = NEW.ARTI_COD;
                      CANTAUX = CANTAUX - (CANT * FACTOR - DEVUELTO);
                      END
                    ELSE
                      BEGIN
                      UPDATE remisiones_venta_detalle
                        SET RVDE_DEVUELTO = RVDE_DEVUELTO + :CANTAUX
                        WHERE REVT_ID = :IDREM AND RVDE_ITEM = :ITEM AND ARTI_COD = NEW.ARTI_COD;
                      CANTAUX = 0;
                      END
                END
            end
        else
            begin
            FOR SELECT RVDE_ITEM, RVDE_CANT, RVDE_FACTOR, RVDE_DEVUELTO
                FROM remisiones_venta_detalle
                WHERE REVT_ID = :idrem AND ARTI_COD = NEW.ARTI_COD AND BODE_COD = NEW.bode_cod AND RVDE_LOTE = NEW.dvde_lote
                INTO :ITEM, :CANT, :FACTOR, :DEVUELTO
                DO
                BEGIN
                if (CANTAUX > 0) then
                    if ((CANT * FACTOR - DEVUELTO) < CANTAUX) then
                      BEGIN
                      UPDATE remisiones_venta_detalle
                        SET RVDE_DEVUELTO = (:CANT * :FACTOR)
                        WHERE REVT_ID = :IDREM AND RVDE_ITEM = :ITEM AND ARTI_COD = NEW.ARTI_COD;
                      CANTAUX = CANTAUX - (CANT * FACTOR - DEVUELTO);
                      END
                    ELSE
                      BEGIN
                      UPDATE remisiones_venta_detalle
                        SET RVDE_DEVUELTO = RVDE_DEVUELTO + :CANTAUX
                        WHERE REVT_ID = :IDREM AND RVDE_ITEM = :ITEM AND ARTI_COD = NEW.ARTI_COD;
                      CANTAUX = 0;
                      END
                END
            end
        if (CANTAUX > 0) then
            EXCEPTION DEVOLUCION_MAYOR 'Esta devolviendo una cantidad mayor a la remisionada del articulo ' || new.arti_cod;
        END
    if ((idped <> 0) and (devrem = 'PEDIDO')) then
        BEGIN
        CANTAUX = NEW.dvde_cant * NEW.dvde_factor;
        FOR SELECT PEDE_ITEM, PEDE_CANT, PEDE_FACTOR, PEDE_DEVUELTO
            FROM pedidos_detalle
            WHERE PEDI_ID = :idped AND ARTI_COD = NEW.ARTI_COD
            INTO :ITEM, :CANT, :FACTOR, :DEVUELTO
            DO
                BEGIN
                if (CANTAUX > 0) then
                    if ((CANT * FACTOR - DEVUELTO) < CANTAUX) then
                      BEGIN
                      UPDATE pedidos_detalle
                        SET PEDE_DEVUELTO = (:CANT * :FACTOR)
                        WHERE PEDI_ID = :IDPED AND PEDE_ITEM = :ITEM AND ARTI_COD = NEW.ARTI_COD;
                      CANTAUX = CANTAUX - (CANT * FACTOR - DEVUELTO);
                      END
                    ELSE
                      BEGIN
                      UPDATE pedidos_detalle
                        SET PEDE_DEVUELTO = PEDE_DEVUELTO + :CANTAUX
                        WHERE PEDI_ID = :IDPED AND PEDE_ITEM = :ITEM AND ARTI_COD = NEW.ARTI_COD;
                      CANTAUX = 0;
                      END
                END
        if (CANTAUX > 0) then
            EXCEPTION DEVOLUCION_MAYOR 'Esta devolviendo una cantidad mayor a la pedido del articulo ' || new.arti_cod;
        END
    END
END^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER TRIGGER DEVOLUCIONES_VENTAS_DETALLE_AU FOR DEVOLUCIONES_VENTAS_DETALLE
ACTIVE AFTER UPDATE POSITION 0
AS
declare variable fec date;
declare variable fecfac date;
declare variable CONC VARCHAR(60);
declare variable Pref varchar(4);
declare variable Num varchar(8);
declare variable Nit varchar(20);
declare variable CANT NUMERIC(18, 4);
declare variable CANTAUX NUMERIC(18,4);
declare variable CNTFAC NUMERIC(18, 4);
declare variable COSTO NUMERIC(18,2);
declare variable ULTIMO NUMERIC(18,2);
declare variable factor numeric(18,4);
declare variable DEVUELTO NUMERIC(18,4);
declare variable ID integer;
declare variable ITEM INTEGER;
declare variable FACT varchar(10);
declare variable devnof CHAR(2);
declare variable numrows INTEGER;
declare variable OK CHAR(1);
declare variable PEDAUTO CHAR(2);
declare variable IDPED INTEGER;
declare variable IDREM INTEGER;
declare variable devrem CHAR(6);
declare variable EXIST CHAR(1);
BEGIN
execute procedure lee_configuracion ('FACTURACION', 'DEVOLUCIONES', 'HACER DEVOLUCIONES SOBRE REMISIONES') returning_values (:devrem);
/* Anule el anterior */
if ((OLD.DEVT_ID <> 0) AND (OLD.dvde_anulado = 'N')) then
    BEGIN
    select ARTI_EXIST from ARTICULO where ARTI_COD = old.ARTI_COD into :EXIST;
    DELETE FROM MOVIMIENTO_ARTICULO WHERE (mvar_tipodoc = 33) and (mvar_idref = new.devt_id) and (mvar_item = old.dvde_item);
    /* DESHAGA LO DEVUELTO EN LA FACTURA */
    ID = 0;
    SELECT DEVT_FACTID FROM DEVOLUCIONES_VENTAS
        WHERE DEVT_ID = OLD.DEVT_ID INTO :ID;
    if (ID <> 0) then
        BEGIN
        CANTAUX = OLD.dvde_cant * OLD.dvde_factor;
        if (EXIST <> 'L') then
            begin
            FOR SELECT FADE_CANT, FADE_FACTOR, FADE_DEVUELTO, FADE_ITEM
                FROM FACTURAS_DETALLE
                WHERE FACT_ID = :ID AND ARTI_COD = OLD.ARTI_COD AND FADE_CANT > 0
                INTO :CANT, :FACTOR, :DEVUELTO, :ITEM
                DO
                BEGIN
                if (cantaux > 0) then
                    if (CANTAUX > DEVUELTO) then
                        BEGIN
                        UPDATE FACTURAS_DETALLE
                            SET FADE_DEVUELTO = 0
                            WHERE FACT_ID = :ID AND ARTI_COD = OLD.ARTI_COD AND FADE_ITEM = :ITEM;
                        CANTAUX = CANTAUX - DEVUELTO;
                        END
                    ELSE
                        BEGIN
                        UPDATE FACTURAS_DETALLE
                            SET FADE_DEVUELTO = FADE_DEVUELTO - :CANTAUX
                            WHERE FACT_ID = :ID AND ARTI_COD = OLD.ARTI_COD AND FADE_ITEM = :ITEM;
                        CANTAUX = 0;
                        END
                END
            end
        else
            begin
            FOR SELECT FADE_CANT, FADE_FACTOR, FADE_DEVUELTO, FADE_ITEM
                FROM FACTURAS_DETALLE
                WHERE FACT_ID = :ID AND ARTI_COD = OLD.ARTI_COD AND FADE_CANT > 0 and BODE_COD = old.bode_cod AND FADE_LOTE = OLD.dvde_lote
                INTO :CANT, :FACTOR, :DEVUELTO, :ITEM
                DO
                BEGIN
                if (cantaux > 0) then
                    if (CANTAUX > DEVUELTO) then
                        BEGIN
                        UPDATE FACTURAS_DETALLE
                            SET FADE_DEVUELTO = 0
                            WHERE FACT_ID = :ID AND ARTI_COD = OLD.ARTI_COD AND FADE_ITEM = :ITEM;
                        CANTAUX = CANTAUX - DEVUELTO;
                        END
                    ELSE
                        BEGIN
                        UPDATE FACTURAS_DETALLE
                            SET FADE_DEVUELTO = FADE_DEVUELTO - :CANTAUX
                            WHERE FACT_ID = :ID AND ARTI_COD = OLD.ARTI_COD AND FADE_ITEM = :ITEM;
                        CANTAUX = 0;
                        END
                END
            end
        END
    if (devrem = 'SI') then
        begin
        idrem = 0;
        SELECT DEVT_REMID FROM DEVOLUCIONES_VENTAS
            WHERE DEVT_ID = OLD.DEVT_ID INTO :idrem;
        if (idrem <> 0) then
            BEGIN
            CANTAUX = OLD.dvde_cant * OLD.dvde_factor;
            if (EXIST <> 'L') then
                begin
                FOR SELECT RVDE_CANT, RVDE_FACTOR, RVDE_DEVUELTO, RVDE_ITEM
                    FROM remisiones_venta_detalle
                    WHERE REVT_ID = :idrem AND ARTI_COD = OLD.ARTI_COD
                    INTO :CANT, :FACTOR, :DEVUELTO, :ITEM
                    DO
                    BEGIN
                    if (cantaux > 0) then
                        if (CANTAUX > DEVUELTO) then
                            BEGIN
                            UPDATE remisiones_venta_detalle
                                SET RVDE_DEVUELTO = 0
                                WHERE REVT_ID = :idrem AND ARTI_COD = OLD.ARTI_COD AND RVDE_ITEM = :ITEM;
                            CANTAUX = CANTAUX - DEVUELTO;
                            END
                        ELSE
                            BEGIN
                            UPDATE remisiones_venta_detalle
                                SET RVDE_DEVUELTO = RVDE_DEVUELTO - :CANTAUX
                                WHERE REVT_ID = :idrem AND ARTI_COD = OLD.ARTI_COD AND RVDE_ITEM = :ITEM;
                            CANTAUX = 0;
                            END
                        END
                end
            else
                begin
                FOR SELECT RVDE_CANT, RVDE_FACTOR, RVDE_DEVUELTO, RVDE_ITEM
                    FROM remisiones_venta_detalle
                    WHERE REVT_ID = :idrem AND ARTI_COD = OLD.ARTI_COD and BODE_COD = OLD.bode_cod AND RVDE_LOTE = OLD.dvde_lote
                    INTO :CANT, :FACTOR, :DEVUELTO, :ITEM
                    DO
                    BEGIN
                    if (cantaux > 0) then
                        if (CANTAUX > DEVUELTO) then
                            BEGIN
                            UPDATE remisiones_venta_detalle
                                SET RVDE_DEVUELTO = 0
                                WHERE REVT_ID = :idrem AND ARTI_COD = OLD.ARTI_COD AND RVDE_ITEM = :ITEM;
                            CANTAUX = CANTAUX - DEVUELTO;
                            END
                        ELSE
                            BEGIN
                            UPDATE remisiones_venta_detalle
                                SET RVDE_DEVUELTO = RVDE_DEVUELTO - :CANTAUX
                                WHERE REVT_ID = :idrem AND ARTI_COD = OLD.ARTI_COD AND RVDE_ITEM = :ITEM;
                            CANTAUX = 0;
                            END
                        END
                end
            END
        end
    if (devrem = 'PEDIDO') then
        begin
        idped = 0;
        SELECT DEVT_PEDID FROM DEVOLUCIONES_VENTAS
            WHERE DEVT_ID = OLD.DEVT_ID INTO :idped;
        if (idped <> 0) then
            BEGIN
            CANTAUX = OLD.dvde_cant * OLD.dvde_factor;
            FOR SELECT PEDE_CANT, PEDE_FACTOR, PEDE_DEVUELTO, PEDE_ITEM
                FROM pedidos_detalle
                WHERE PEDI_ID = :idped AND ARTI_COD = OLD.ARTI_COD
                INTO :CANT, :FACTOR, :DEVUELTO, :ITEM
                DO
                BEGIN
                if (cantaux > 0) then
                    if (CANTAUX > DEVUELTO) then
                        BEGIN
                        UPDATE pedidos_detalle
                            SET PEDE_DEVUELTO = 0
                            WHERE PEDI_ID = :idped AND ARTI_COD = OLD.ARTI_COD AND PEDE_ITEM = :ITEM;
                        CANTAUX = CANTAUX - DEVUELTO;
                        END
                    ELSE
                        BEGIN
                        UPDATE pedidos_detalle
                            SET PEDE_DEVUELTO = PEDE_DEVUELTO - :CANTAUX
                            WHERE PEDI_ID = :idped AND ARTI_COD = OLD.ARTI_COD AND PEDE_ITEM = :ITEM;
                        CANTAUX = 0;
                        END
                    END
            END
        end
    END
/* Registre el nuevo */
if ((NEW.DEVT_ID <> 0) AND (NEW.dvde_anulado = 'N')) then
    begin
    ID = 0;
    select ARTI_EXIST from ARTICULO where ARTI_COD = NEW.ARTI_COD into :EXIST;
    select devt_fecha, pref_pre, devt_numero, terc_nit, devt_factura, devt_remid, DEVT_FACTID, DEVT_PEDID
        from devoluciones_ventas where devt_id = new.devt_id into :fec, :Pref, :Num, :Nit, :Fact, :idrem, :ID, :idped;
    execute procedure factor_unidad_cant(new.arti_cod, new.dvde_unidad) returning_values(factor);
    CONC = 'DEVOLUCION VENTA No.' || PREF || NUM || '- FACTURA ' || FACT;
    execute procedure lee_configuracion ('FACTURACION', 'DEVOLUCIONES', 'PERMITIR DEVOLVER ITEMS NO FACTURADOS') returning_values (:devnof);
    if (devnof = 'SI') then
        OK = 'S';
    else
        if (id <> 0) then
            begin
            SELECT SUM(FADE_CANT * FADE_FACTOR) FROM FACTURAS_DETALLE WHERE FACT_ID = :ID AND ARTI_COD = NEW.arti_cod INTO :cntfac;
            /* verifique si afecto el inventario */
            select count(mvar_cons) from movimiento_articulo where mvar_tipodoc = 31 and mvar_idref = :id and arti_cod = new.arti_cod into :numrows;
            if (numrows > 0) then
                OK = 'S';
            else
                BEGIN
                /* busque remisiones que pudieron afectarlo */
                /* primero posteriores a la factura */
                select sum(cofa_cantcr) from consolidado_faltantes where cofa_tipoori = 31 and cofa_idori = :id and cofa_tipodes = 32 and arti_cod = new.arti_cod and cofa_cantcr <> 0 into :cantaux;
                if ((cantaux <> 0) and (cantaux is not null)) then
                    BEGIN
                    if ((CNTFAC - (NEW.dvde_cant * NEW.dvde_factor)) <> CANTAUX) then
                        OK = 'S';
                    ELSE
                        OK = 'N';
                    END
                else
                    begin
                    /* si no, anteriores a la factura */
                    select sum(cofa_cantcr) from consolidado_faltantes C, FACTURAS f where f.fact_consolida = c.cofa_id and cofa_tipoori = 32 and f.fact_id = :id and cofa_tipodes = 31 and arti_cod = new.arti_cod and cofa_cantcr <> 0 into :cantaux;
                    if ((cantaux <> 0) and (cantaux is not null)) then
                        OK = 'S';
                    else
                        BEGIN
                        /* si hacen pedido automatico, puede que la remisión este hecha con el pedido */
                        EXECUTE PROCEDURE LEE_CONFIGURACION('FACTURACION','FACTURAS','GENERAR PEDIDO AUTOMATICAMENTE CON LA FACTURA') RETURNING_VALUES (PEDAUTO);
                        if (PEDAUTO = 'SI') then
                            BEGIN
                            SELECT PEDI_ID FROM PEDIDOS P, FACTURAS F WHERE P.PREF_PRE = F.pref_pre AND P.pedi_numero = RIGHT(F.fact_numero,6) AND F.fact_id = :id INTO :IDped;
                            select sum(cofa_cantcr) from consolidado_faltantes where cofa_tipoori = 34 and cofa_idori = :idped and cofa_tipodes = 32 and arti_cod = new.arti_cod and cofa_cantcr <> 0 into :cantaux;
                            if ((cantaux <> 0) and (cantaux is not null)) then
                                if ((CNTFAC - (NEW.dvde_cant * NEW.dvde_factor)) <> CANTAUX) then
                                    OK = 'S';
                                else
                                    OK = 'N';
                            else
                                OK = 'N';
                            END
                        ELSE
                            OK = 'N';
                        END
                    end
                END
            end
        else
          if ((idrem <> 0) and (devrem = 'SI')) then
            begin
            /* verifique si afecto el inventario */
            select count(mvar_cons) from movimiento_articulo where mvar_tipodoc = 32 and mvar_idref = :idrem and arti_cod = new.arti_cod into :numrows;
            if (numrows > 0) then
                OK = 'S';
            else
                OK = 'N';
            end
    if (OK = 'S') then
        begin
        execute procedure costo_promedio(new.arti_cod, :FEC) returning_values (:COSTO);
        if (COSTO = 0) then
            BEGIN
            if (id <> 0) then
                begin
                SELECT FACT_FECHA FROM FACTURAS WHERE FACT_ID = :ID INTO :fecfac;
                execute procedure costo_promedio_y_ultimo(new.arti_cod, :FECFAC) returning_values (:COSTO, :ULTIMO);
                if (COSTO = 0) then
                    COSTO = ULTIMO;
                end
            if (idrem <> 0) then
                begin
                SELECT REVT_FECHA FROM remisiones_venta WHERE REVT_ID = :ID INTO :fecfac;
                execute procedure costo_promedio_y_ultimo(new.arti_cod, :FECFAC) returning_values (:COSTO, :ULTIMO);
                if (COSTO = 0) then
                    COSTO = ULTIMO;
                end
            END
        INSERT INTO MOVIMIENTO_ARTICULO
            (ARTI_COD, BODE_COD, MVAR_FECHA, MVAR_TIPODOC, MVAR_IDREF,
            MVAR_CONC, MVAR_CANT, MVAR_COSTO, MVAR_ENTRADA, MVAR_LOTE, MVAR_PREF, MVAR_NUMERO, MVAR_ITEM, TERC_NIT)
            VALUES(NEW.ARTI_COD, NEW.BODE_COD, :FEC, 33, NEW.devt_id,
            :CONC, :factor * new.dvde_cant, :COSTO, 'S', new.dvde_lote, :Pref, :Num, new.dvde_item, :Nit);
        end
    /* ACTUALICE LO DEVUELTO EN LA FACTURA */
    if (ID <> 0) then
        BEGIN
        CANTAUX = NEW.dvde_cant * NEW.dvde_factor;
        if (EXIST <> 'L') then
            begin
            FOR SELECT FADE_ITEM, FADE_CANT, FADE_FACTOR, FADE_DEVUELTO
                FROM FACTURAS_DETALLE
                WHERE FACT_ID = :ID AND ARTI_COD = NEW.ARTI_COD AND FADE_CANT > 0
                INTO :ITEM, :CANT, :FACTOR, :DEVUELTO
                DO
                BEGIN
                if ((CANTAUX > 0) and ((CANT * FACTOR) > 0))then
                    if ((CANT * FACTOR - DEVUELTO) < CANTAUX) then
                        BEGIN
                        UPDATE FACTURAS_DETALLE
                            SET FADE_DEVUELTO = (:CANT * :FACTOR - :DEVUELTO)
                            WHERE FACT_ID = :ID AND FADE_ITEM = :ITEM AND ARTI_COD = NEW.ARTI_COD;
                        CANTAUX = CANTAUX - (CANT * FACTOR - DEVUELTO);
                        END
                    ELSE
                        BEGIN
                        UPDATE FACTURAS_DETALLE
                            SET FADE_DEVUELTO = FADE_DEVUELTO + :CANTAUX
                            WHERE FACT_ID = :ID AND FADE_ITEM = :ITEM AND ARTI_COD = NEW.ARTI_COD;
                        CANTAUX = 0;
                        END
                END
            end
        else
            begin
            FOR SELECT FADE_ITEM, FADE_CANT, FADE_FACTOR, FADE_DEVUELTO
                FROM FACTURAS_DETALLE WHERE FACT_ID = :ID AND ARTI_COD = NEW.ARTI_COD AND BODE_COD = NEW.bode_cod
                    AND FADE_LOTE = NEW.dvde_lote AND FADE_CANT > 0
                INTO :ITEM, :CANT, :FACTOR, :DEVUELTO
                DO
                BEGIN
                if ((CANTAUX > 0) and ((CANT * FACTOR) > 0))then
                    if ((CANT * FACTOR - DEVUELTO) < CANTAUX) then
                        BEGIN
                        UPDATE FACTURAS_DETALLE
                            SET FADE_DEVUELTO = (:CANT * :FACTOR - :DEVUELTO)
                            WHERE FACT_ID = :ID AND FADE_ITEM = :ITEM AND ARTI_COD = NEW.ARTI_COD;
                        CANTAUX = CANTAUX - (CANT * FACTOR - DEVUELTO);
                        END
                    ELSE
                        BEGIN
                        UPDATE FACTURAS_DETALLE
                            SET FADE_DEVUELTO = FADE_DEVUELTO + :CANTAUX
                            WHERE FACT_ID = :ID AND FADE_ITEM = :ITEM AND ARTI_COD = NEW.ARTI_COD;
                        CANTAUX = 0;
                        END
                END
            end
        if (CANTAUX > 0) then
            EXCEPTION DEVOLUCION_MAYOR 'Esta devolviendo una cantidad mayor a la facturada del articulo ' || new.arti_cod;
        END
    if ((idrem <> 0) and (devrem = 'SI')) then
        BEGIN
        CANTAUX = NEW.dvde_cant * NEW.dvde_factor;
        if (EXIST <> 'L') then
            begin
            FOR SELECT RVDE_ITEM, RVDE_CANT, RVDE_FACTOR, RVDE_DEVUELTO
                FROM remisiones_venta_detalle
                WHERE REVT_ID = :idrem AND ARTI_COD = NEW.ARTI_COD
                INTO :ITEM, :CANT, :FACTOR, :DEVUELTO
                DO
                BEGIN
                if (CANTAUX > 0) then
                    if ((CANT * FACTOR - DEVUELTO) < CANTAUX) then
                      BEGIN
                      UPDATE remisiones_venta_detalle
                        SET RVDE_DEVUELTO = (:CANT * :FACTOR - :DEVUELTO)
                        WHERE REVT_ID = :ID AND RVDE_ITEM = :ITEM AND ARTI_COD = NEW.ARTI_COD;
                      CANTAUX = CANTAUX - (CANT * FACTOR - DEVUELTO);
                      END
                    ELSE
                      BEGIN
                      UPDATE remisiones_venta_detalle
                        SET RVDE_DEVUELTO = RVDE_DEVUELTO + :CANTAUX
                        WHERE REVT_ID = :ID AND RVDE_ITEM = :ITEM AND ARTI_COD = NEW.ARTI_COD;
                      CANTAUX = 0;
                      END
                END
            end
        else
            begin
            FOR SELECT RVDE_ITEM, RVDE_CANT, RVDE_FACTOR, RVDE_DEVUELTO
                FROM remisiones_venta_detalle
                WHERE REVT_ID = :idrem AND ARTI_COD = NEW.ARTI_COD and BODE_COD = NEW.bode_cod AND RVDE_LOTE = NEW.dvde_lote
                INTO :ITEM, :CANT, :FACTOR, :DEVUELTO
                DO
                BEGIN
                if (CANTAUX > 0) then
                    if ((CANT * FACTOR - DEVUELTO) < CANTAUX) then
                      BEGIN
                      UPDATE remisiones_venta_detalle
                        SET RVDE_DEVUELTO = (:CANT * :FACTOR - :DEVUELTO)
                        WHERE REVT_ID = :ID AND RVDE_ITEM = :ITEM AND ARTI_COD = NEW.ARTI_COD;
                      CANTAUX = CANTAUX - (CANT * FACTOR - DEVUELTO);
                      END
                    ELSE
                      BEGIN
                      UPDATE remisiones_venta_detalle
                        SET RVDE_DEVUELTO = RVDE_DEVUELTO + :CANTAUX
                        WHERE REVT_ID = :ID AND RVDE_ITEM = :ITEM AND ARTI_COD = NEW.ARTI_COD;
                      CANTAUX = 0;
                      END
                END
            end
        if (CANTAUX > 0) then
            EXCEPTION DEVOLUCION_MAYOR 'Esta devolviendo una cantidad mayor a la remisionada del articulo ' || new.arti_cod;
        END
    if ((idped <> 0) and (devrem = 'PEDIDO')) then
        BEGIN
        CANTAUX = NEW.dvde_cant * NEW.dvde_factor;
        FOR SELECT PEDE_ITEM, PEDE_CANT, PEDE_FACTOR, PEDE_DEVUELTO
            FROM pedidos_detalle
            WHERE PEDI_ID = :idped AND ARTI_COD = NEW.ARTI_COD
            INTO :ITEM, :CANT, :FACTOR, :DEVUELTO
            DO
                BEGIN
                if (CANTAUX > 0) then
                    if ((CANT * FACTOR - DEVUELTO) < CANTAUX) then
                      BEGIN
                      UPDATE pedidos_detalle
                        SET PEDE_DEVUELTO = (:CANT * :FACTOR - :DEVUELTO)
                        WHERE PEDI_ID = :ID AND PEDE_ITEM = :ITEM AND ARTI_COD = NEW.ARTI_COD;
                      CANTAUX = CANTAUX - (CANT * FACTOR - DEVUELTO);
                      END
                    ELSE
                      BEGIN
                      UPDATE pedidos_detalle
                        SET PEDE_DEVUELTO = PEDE_DEVUELTO + :CANTAUX
                        WHERE PEDI_ID = :ID AND PEDE_ITEM = :ITEM AND ARTI_COD = NEW.ARTI_COD;
                      CANTAUX = 0;
                      END
                END
        if (CANTAUX > 0) then
            EXCEPTION DEVOLUCION_MAYOR 'Esta devolviendo una cantidad mayor a la pedida del articulo ' || new.arti_cod;
        END
    END
END^

SET TERM ; ^

/* 20131029B */
/* MEJORA EN EL RENDIMIENTO */
SET TERM ^ ;

CREATE OR ALTER procedure DOCVENTAS_X_CLIENTE (
    NIT varchar(20),
    TIPODOC integer,
    TIPODES integer,
    FECHA date,
    SUCURSAL varchar(10))
returns (
    PREFIJO varchar(4),
    NUMERO varchar(8),
    VALIDEZ integer,
    VEND integer,
    ID integer,
    FECDOC date,
    SUBTOTAL numeric(18,2),
    IVA numeric(18,2),
    CONSUMO numeric(18,2),
    TOTAL numeric(18,2),
    SUCUR varchar(10))
AS
declare variable VENCE DATE;
declare variable ITEM INTEGER;
declare variable FALTA NUMERIC(18,4);
declare variable FALTAT NUMERIC(18,4);
declare variable UNIDAD VARCHAR(8);
declare variable FACTOR NUMERIC(18,4);
declare variable DIAS INTEGER;
declare variable usado CHAR(2);
declare variable NUMROWS INTEGER;
declare variable TRAERCONTADO CHAR(2);
declare variable CONSOL INTEGER;
declare variable TIPOORI INTEGER;
declare variable OK CHAR(1);
declare variable ITECAN NUMERIC(18,2);
declare variable ITESUB NUMERIC(18,2);
declare variable ITEIVA NUMERIC(18,2);
declare variable ITECON NUMERIC(18,2);
BEGIN
EXECUTE PROCEDURE lee_configuracion('FACTURACION','DOCUMENTOS','NUMERO DE DIAS MAXIMO PARA CRUZAR DOCUMENTO') returning_values (DIAS);
EXECUTE PROCEDURE lee_configuracion('FACTURACION', 'DOCUMENTOS', 'TRAER DOCUMENTOS PENDIENTES DEL CLIENTE DE CONTADO EN DOCUMENTOS DE OTROS CLIENTES') returning_values (TRAERCONTADO);
EXECUTE PROCEDURE lee_configuracion('FACTURACION','DOCUMENTOS','PERMITIR LLAMAR DOCUMENTOS PREVIAMENTE USADOS EN OTRO TIPO DE DOCUMENTO') returning_values (:USADO);
if (TIPODOC = 31) then /* FACTURA */
    BEGIN
    FOR SELECT FACT_ID, PREF_PRE, FACT_NUMERO, FACT_FECHA, FACT_VENCE, FACT_SUCURSAL, VEND_COD, FACT_CONSOLIDA
        FROM FACTURAS
        WHERE TERC_NIT = :NIT AND FACT_FECHA <= :FECHA AND (FACT_FECHA >= (:FECHA - :DIAS)) AND
            FACT_ANULADO = 'N' AND ((FACT_SUCURSAL = :SUCURSAL) or (:SUCURSAL = 'Todas') or (:SUCURSAL = '0'))
        INTO :ID, :PREFIJO, :NUMERO, :FECDOC, :VENCE, :SUCUR, :VEND, :CONSOL DO
        BEGIN
        EXECUTE PROCEDURE TOTAL_DOC_VENTAS(TIPODOC, ID) returning_values (SUBTOTAL, IVA, CONSUMO);
        TOTAL = SUBTOTAL + IVA + CONSUMO;
        VALIDEZ = VENCE - FECDOC;
        if (TIPODES = 33) then
            BEGIN
            /* VERIFIQUE SI HAY PENDIENTES */
            SELECT SUM(FADE_CANT * FADE_FACTOR - FADE_DEVUELTO) FROM FACTURAS_DETALLE WHERE FACT_ID = :ID and substring(arti_cod from 1 FOR 2) <> '.t' and FADE_cant > 0 INTO :FALTA;
            if (FALTA <> 0) then
                suspend;
            END
        ELSE
            BEGIN
            /* VERIFIQUE QUE NO ESTE HECHA CON BASE EN UN DOCUMENTO DE ORIGEN */
            FALTAT = 0;
            OK = 'N';
            if ((CONSOL <> 0) AND (CONSOL IS NOT NULL)) then
                BEGIN
                SELECT MAX(COFA_TIPOORI) FROM consolidado_faltantes WHERE COFA_ID = :CONSOL AND COFA_CANTCR <> 0 INTO :tipoori;
                if (TIPOORI <> TIPODES) then
                    OK = 'S';
                END
            ELSE
                OK = 'S';
            if (OK = 'S') then
                BEGIN
                /* RECORRA LOS ITEMS PARA VER SI TODO ESTA USADO */
                FOR SELECT FADE_ITEM FROM FACTURAS_DETALLE WHERE FACT_ID = :ID and substring(arti_cod from 1 FOR 2) <> '.t' ORDER BY FADE_ITEM INTO :ITEM DO
                    BEGIN
                    EXECUTE procedure FALTANTE(TIPODOC, :TIPODES, :ID, :ITEM) returning_values (:FALTA, :UNIDAD, :FACTOR);
                    FALTAT = FALTAT + FALTA;
                    END
                if (FALTAT <> 0) then
                    SUSPEND;
                END
            END
        END
    END
  if (TIPODOC = 32) then /* REMISION */
    BEGIN
    FOR SELECT REVT_ID, PREF_PRE, REVT_NUMERO, REVT_FECHA, 0, REVT_SUCURSAL, VEND_COD, REVT_CONSOLIDA
        FROM remisiones_venta
        WHERE TERC_NIT = :NIT AND REVT_FECHA <= :FECHA AND (REVT_FECHA >= (:FECHA - :DIAS)) AND
            REVT_ANULADO = 'N' AND ((REVT_SUCURSAL = :SUCURSAL) or (:SUCURSAL = 'Todas'))
        INTO :ID, :PREFIJO, :NUMERO, :FECDOC, :VALIDEZ, :SUCUR, :VEND, :CONSOL DO
        BEGIN
        EXECUTE PROCEDURE TOTAL_DOC_VENTAS(TIPODOC, ID) returning_values (SUBTOTAL, IVA, CONSUMO);
        TOTAL = SUBTOTAL + IVA + CONSUMO;
        if (TIPODES <> 0) then
            BEGIN
            /* VERIFIQUE QUE NO ESTE HECHA CON BASE EN UN DOCUMENTO DE ORIGEN */
            FALTAT = 0;
            OK = 'N';
            if ((CONSOL <> 0) AND (CONSOL IS NOT NULL)) then
                BEGIN
                SELECT MAX(COFA_TIPOORI) FROM consolidado_faltantes WHERE COFA_ID = :CONSOL AND COFA_CANTCR <> 0 INTO :tipoori;
                if (TIPOORI <> TIPODES) then
                    OK = 'S';
                END
            ELSE
                OK = 'S';
            if (OK = 'S') then
                BEGIN
                /* RECORRA LOS ITEMS PARA VER SI TODO ESTA USADO */
                FOR SELECT RVDE_ITEM FROM REMISIONES_VENTA_DETALLE WHERE REVT_ID = :ID ORDER BY RVDE_ITEM INTO :ITEM DO
                    BEGIN
                    EXECUTE procedure FALTANTE(TIPODOC, :TIPODES, :ID, :ITEM) returning_values (:FALTA, :UNIDAD, :FACTOR);
                    FALTAT = FALTAT + FALTA;
                    END
                if (FALTAT <> 0) then
                    SUSPEND;
                END
            END
        END
    END
  if (TIPODOC = 33) then /* DEVOLUCION */
    BEGIN
    FOR SELECT DEVT_ID, PREF_PRE, DEVT_NUMERO, DEVT_FECHA, 0, DEVT_SUCURSAL, VEND_COD
        FROM DEVOLUCIONES_VENTAS
        WHERE TERC_NIT = :NIT AND DEVT_FECHA <= :FECHA AND DEVT_ANULADO = 'N' AND ((DEVT_SUCURSAL = :SUCURSAL) or (:SUCURSAL = 'Todas'))
        INTO :ID, :PREFIJO, :NUMERO, :FECDOC, :VALIDEZ, :SUCUR, :VEND DO
        BEGIN
        EXECUTE PROCEDURE TOTAL_DOC_VENTAS(TIPODOC, ID) returning_values (SUBTOTAL, IVA, CONSUMO);
        TOTAL = SUBTOTAL + IVA + CONSUMO;
        SUSPEND;
        END
    END
  if (TIPODOC = 34) then /* PEDIDO */
    BEGIN
    FOR SELECT PEDI_ID, PREF_PRE, PEDI_NUMERO, PEDI_FECHA, PEDI_VALIDEZ, PEDI_SUCURSAL, VEND_COD
        FROM PEDIDOS
        WHERE ((TERC_NIT = :NIT) OR ((:traercontado = 'SI') AND (TERC_NIT IN (SELECT TERC_NIT FROM PUNTO_VENTA))))
        AND PEDI_FECHA <= :FECHA AND PEDI_FECHA+PEDI_VALIDEZ >= :FECHA AND PEDI_ANULADO = 'N' AND ((PEDI_SUCURSAL = :SUCURSAL) or (:SUCURSAL = 'Todas'))
        INTO :ID, :PREFIJO, :NUMERO, :FECDOC, :VALIDEZ, :SUCUR, :VEND DO
        BEGIN
        EXECUTE PROCEDURE TOTAL_DOC_VENTAS(TIPODOC, ID) returning_values (SUBTOTAL, IVA, CONSUMO);
        if (TIPODES <> 0) then
            BEGIN
            /* RECORRA LOS ITEMS PARA VER SI TODO ESTA USADO */
            FALTAT = 0;
            if (USADO = 'NO') then
                BEGIN
                if (EXISTS (SELECT CEFA_ID FROM consolide_faltantes WHERE CEFA_TIPOORI = 34 AND CEFA_IDORI = :ID AND CEFA_TIPODES <> :tipodes)) then
                    NUMROWS = 1;
--                SELECT COUNT(*) FROM consolide_faltantes WHERE CEFA_TIPOORI = 34 AND CEFA_IDORI = :ID AND CEFA_TIPODES <> :tipodes INTO :NUMROWS;
                END
            ELSE
                NUMROWS = 0;
            if (NUMROWS = 0) then
                BEGIN
                SUBTOTAL = 0;
                IVA = 0;
                CONSUMO = 0;
                FOR SELECT PEDE_ITEM, PEDE_CANT * PEDE_FACTOR, PEDE_TOTAL-PEDE_IVAMONTO-PEDE_CONSUMO, PEDE_IVAMONTO, PEDE_CONSUMO
                    FROM PEDIDOS_DETALLE WHERE PEDI_ID = :ID ORDER BY PEDE_ITEM INTO :ITEM, :ITECAN, :ITESUB, :ITEIVA, :ITECON
                    DO
                    BEGIN
                    EXECUTE procedure FALTANTE(TIPODOC, :TIPODES, :ID, :ITEM) returning_values (:FALTA, :UNIDAD, :FACTOR);
                    FALTAT = FALTAT + FALTA;
                    if (ITECAN <> 0) then
                        BEGIN
                        SUBTOTAL = SUBTOTAL + cast(cast((ITESUB/ITECAN) as double precision) * cast(FALTA * FACTOR as double precision) as numeric(18, 2));
                        IVA = IVA + cast(cast((ITEIVA/ITECAN) as double precision) * cast(FALTA * FACTOR as double precision) as numeric(18, 2));
                        CONSUMO = CONSUMO + cast(cast((ITECON/ITECAN) as double precision) * cast(FALTA * FACTOR as double precision) as numeric(18, 2));
                        END
                    END
                END
            if (FALTAT <> 0) then
                BEGIN
                TOTAL = SUBTOTAL + IVA + CONSUMO;
                SUSPEND;
                END
            END
        ELSE
            SUSPEND;
        END
    END
  if (TIPODOC = 35) then /* COTIZACION */
    BEGIN
    FOR SELECT COTI_ID, PREF_PRE, COTI_NUMERO, COTI_FECHA, COTI_VALIDEZ, COTI_SUCURSAL, VEND_COD
        FROM cotizaciones
        WHERE ((TERC_NIT = :NIT) OR ((:traercontado = 'SI') AND (TERC_NIT IN (SELECT TERC_NIT FROM PUNTO_VENTA))))
        AND COTI_FECHA <= :FECHA AND COTI_FECHA+COTI_VALIDEZ >= :FECHA AND COTI_ANULADO = 'N'
        AND ((COTI_SUCURSAL = :SUCURSAL) or (:SUCURSAL = 'Todas'))
        INTO :ID, :PREFIJO, :NUMERO, :FECDOC, :VALIDEZ, :SUCUR, :VEND DO
        BEGIN
        EXECUTE PROCEDURE TOTAL_DOC_VENTAS(TIPODOC, ID) returning_values (SUBTOTAL, IVA, CONSUMO);
        TOTAL = SUBTOTAL + IVA + CONSUMO;
        if (TIPODES <> 0) then
            BEGIN
            /* RECORRA LOS ITEMS PARA VER SI TODO ESTA USADO */
            FALTAT = 0;
            if (USADO = 'NO') then
                BEGIN
                if (EXISTS (SELECT CEFA_ID FROM consolide_faltantes WHERE CEFA_TIPOORI = 35 AND CEFA_IDORI = :ID AND CEFA_TIPODES <> :tipodes)) then
                    NUMROWS = 1;
--                SELECT COUNT(*) FROM consolide_faltantes WHERE CEFA_TIPOORI = 35 AND CEFA_IDORI = :ID AND CEFA_TIPODES <> :tipodes INTO :NUMROWS;
                END
            ELSE
                NUMROWS = 0;
            if (NUMROWS = 0) then
                FOR SELECT CTDE_ITEM FROM COTIZACIONES_DETALLE WHERE COTI_ID = :ID ORDER BY CTDE_ITEM INTO :ITEM DO
                    BEGIN
                    EXECUTE procedure FALTANTE(TIPODOC, :TIPODES, :ID, :ITEM) returning_values (:FALTA, :UNIDAD, :FACTOR);
                    FALTAT = FALTAT + FALTA;
                    END
            if (FALTAT <> 0) then
                SUSPEND;
            END
        ELSE
            SUSPEND;
        END
    END
if (TIPODOC = 40) then /* PENDIENTE */
    BEGIN
    FOR SELECT PEND_ID, PREF_PRE, PEND_NUMERO, PEND_FECHA, 0, PEND_SUCURSAL, VEND_COD
        FROM pendiente_ventas
        WHERE (TERC_NIT = :NIT) AND PEND_FECHA <= :FECHA AND PEND_ANULADO = 'N' AND ((PEND_SUCURSAL = :SUCURSAL) or (:SUCURSAL = 'Todas'))
        INTO :ID, :PREFIJO, :NUMERO, :FECDOC, :VALIDEZ, :SUCUR, :VEND DO
        BEGIN
        EXECUTE PROCEDURE TOTAL_DOC_VENTAS(TIPODOC, ID) returning_values (SUBTOTAL, IVA, CONSUMO);
        TOTAL = SUBTOTAL + IVA + CONSUMO;
        if (TIPODES <> 0) then
            BEGIN
            /* RECORRA LOS ITEMS PARA VER SI TODO ESTA USADO */
            FALTAT = 0;
            FOR SELECT pevd_item FROM pendiente_ventas_detalle WHERE PEND_ID = :ID ORDER BY PEVD_ITEM INTO :ITEM DO
                BEGIN
                EXECUTE procedure FALTANTE(TIPODOC, :TIPODES, :ID, :ITEM) returning_values (:FALTA, :UNIDAD, :FACTOR);
                FALTAT = FALTAT + FALTA;
                END
            if (FALTAT <> 0) then
                SUSPEND;
            END
        ELSE
            SUSPEND;
        END
    END
END^

SET TERM ; ^

/* 20131030 */
/* OJO PROVISIONAL '00' + PEDIDO = FACTURA EN LUGAR DE RIGHT( SE DEMORA MUCHISIMO) */
SET TERM ^ ;

CREATE OR ALTER procedure FALTANTE (
    TIPORI integer,
    TIPDES integer,
    IDDOC integer,
    ITEM integer)
returns (
    CANT numeric(18,4),
    UNIDAD varchar(8),
    FACTOR numeric(18,4))
AS
declare variable CANTAUX NUMERIC(18,4);
declare variable PEDAUTO CHAR(2);
declare variable ARTIC VARCHAR(20);
declare variable CODOMITE VARCHAR(20);
declare variable pref varchar(4);
declare variable num varchar(8);
begin
/* BUSQUE EL DOCUMENTO Y RECORRA LOS ITEMS */
EXECUTE PROCEDURE LEE_CONFIGURACION('FACTURACION', 'DOCUMENTOS', 'CODIGO DE ARTICULO A OMITIR EN LA CONSOLIDACION DE PENDIENTES') returning_values (:codomite);
if (TIPORI = 21) then
    BEGIN
    SELECT ARTI_COD, ((FCDE_CANT * FCDE_FACTOR) - FCDE_DEVUELTO) / FCDE_FACTOR, FCDE_FACTOR, FCDE_UNIDAD FROM FACTURAS_COMPRAS_DETALLE
        WHERE FACO_ID = :IDDOC AND FCDE_ITEM = :ITEM AND FCDE_ANULADO = 'N' INTO :ARTIC, :CANT, :FACTOR, :UNIDAD;
    END
if (TIPORI = 22) then
    BEGIN
    SELECT ARTI_COD, ((RPVD_CANT * RPVD_FACTOR) - RPVD_DEVUELTO) / RPVD_FACTOR, RPVD_FACTOR, RPVD_UNIDAD FROM remision_proveedor_det
        WHERE REPR_ID = :IDDOC AND RPVD_ITEM = :ITEM AND RPVD_ANULADO = 'N' INTO :ARTIC, :CANT, :FACTOR, :UNIDAD;
    END
if (TIPORI = 23) then
    BEGIN
    SELECT ARTI_COD, OCDE_CANT, OCDE_FACTOR, OCDE_UNIDAD FROM ORDENES_COMPRA_DETALLE
        WHERE ORDC_ID = :IDDOC AND OCDE_ITEM = :ITEM AND OCDE_ANULADO = 'N'  INTO :ARTIC, :CANT, :FACTOR, :UNIDAD;
    END
if (TIPORI = 25) then
    BEGIN
    SELECT ARTI_COD, CPRD_CANT, CPRD_FACTOR, CPRD_UNIDAD FROM COTIZACIONES_PROVEEDOR_DET
        WHERE COPR_ID = :IDDOC AND CPRD_ITEM = :ITEM AND CPRD_ANULADO = 'N' INTO :ARTIC, :CANT, :FACTOR, :UNIDAD;
    END
if (TIPORI = 31) then
    BEGIN
    SELECT ARTI_COD, ((FADE_CANT * FADE_FACTOR)-FADE_DEVUELTO) / FADE_FACTOR, FADE_FACTOR, FADE_UNIDAD
        FROM FACTURAS_DETALLE WHERE FACT_ID = :IDDOC AND FADE_ITEM = :ITEM AND FADE_ANULADO = 'N'
        INTO :ARTIC, :CANT, :FACTOR, :UNIDAD;
    END
if (TIPORI = 32) then
    BEGIN
    SELECT ARTI_COD, ((RVDE_CANT * RVDE_FACTOR)-RVDE_DEVUELTO) / RVDE_FACTOR, RVDE_FACTOR, RVDE_UNIDAD
        FROM remisiones_venta_detalle WHERE REVT_ID = :IDDOC AND RVDE_ITEM = :ITEM AND RVDE_ANULADO = 'N'
        INTO :ARTIC, :CANT, :FACTOR, :UNIDAD;
    END
if (TIPORI = 34) then
    BEGIN
    SELECT ARTI_COD, ((PEDE_CANT * PEDE_FACTOR)-PEDE_DEVUELTO) / PEDE_FACTOR, PEDE_FACTOR, PEDE_UNIDAD FROM PEDIDOS_DETALLE
        WHERE PEDI_ID = :IDDOC AND PEDE_ITEM = :ITEM AND PEDE_ANULADO = 'N' INTO :ARTIC, :CANT, :FACTOR, :UNIDAD;
    EXECUTE PROCEDURE LEE_CONFIGURACION('FACTURACION', 'FACTURAS', 'GENERAR PEDIDO AUTOMATICAMENTE CON LA FACTURA') returning_values (pedauto);
    if ((PEDAUTO = 'SI') and (ARTIC <> :codomite)) then
        begin
        /* RESTE LAS DEVOLUCIONES DE LA FACTURA ORIGINAL */
        select pref_pre, '00' || pedi_numero from pedidos where pedi_id = :iddoc into :pref, :num;
        SELECT SUM(FADE_DEVUELTO) FROM FACTURAS_DETALLE D, FACTURAS F
            WHERE pref_pre = :pref AND fact_numero = :num AND D.fact_id = F.fact_id AND D.fade_item = :item AND FACT_ANULADO = 'N'
            INTO :cantaux;
        if (cantaux > 0) then
            CANT = (CANT * FACTOR - CANTAUX) / FACTOR;
        end
    END
if (TIPORI = 35) then
    BEGIN
    SELECT ARTI_COD, CTDE_CANT, CTDE_FACTOR, CTDE_UNIDAD FROM COTIZACIONES_DETALLE
        WHERE COTI_ID = :IDDOC AND CTDE_ITEM = :ITEM AND CTDE_ANULADO = 'N' INTO :ARTIC, :CANT, :FACTOR, :UNIDAD;
    END
if (TIPORI = 40) then
    BEGIN
    SELECT ARTI_COD, PEVD_CANT, PEVD_FACTOR, PEVD_UNIDAD FROM pendiente_ventas_detalle
        WHERE PEND_ID = :IDDOC AND PEVD_ITEM = :ITEM AND PEVD_ANULADO = 'N' INTO :ARTIC, :CANT, :FACTOR, :UNIDAD;
    END
if (TIPORI = 139) then
    BEGIN
    SELECT ARTI_COD, SLDE_CANT, SLDE_FACTOR, SLDE_UNIDAD FROM solicitud_importacion_det
        WHERE SLIM_ID = :IDDOC AND SLDE_ITEM = :ITEM AND SLDE_ANULADO = 'N' INTO :ARTIC, :CANT, :FACTOR, :UNIDAD;
    END

if (CANT IS NULL) then
    CANT = 0;
if (ARTIC <> codomite) then
    BEGIN
    /* RECORRA LOS USOS EN CONSOLIDE_DOCS */
    select sum(COFA_CANTCR) from consolidado_faltantes
        where COFA_TIPOORI = :tipori and COFA_IDORI = :IDDOC and COFA_ITEMORI = :ITEM and COFA_TIPODES = :TIPDES
        into :cantaux;
    if (CANTAUX is null) then
        CANTAUX = 0;
    if (CANTAUX > (CANT * FACTOR)) then
        CANT = 0;
    else
        CANT = ((CANT * FACTOR) - CANTAUX) / FACTOR;
    END
ELSE
    CANT = 0;
suspend;
end^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE CONSOLIDE_PENDIENTES(
    IDCONS INTEGER)
AS
declare variable TIPDES INTEGER;
declare variable TIPORI INTEGER;
declare variable IDORI INTEGER;
declare variable ITEM INTEGER;
declare variable ARTI VARCHAR(20);
declare variable CANT NUMERIC(18,4);
declare variable ITCONS INTEGER;
declare variable CODBAR VARCHAR(20);
declare variable UNIDAD VARCHAR(8);
declare variable LOTE VARCHAR(15);
declare variable LOTE_VENCE DATE;
declare variable FACTOR NUMERIC(18,4);
declare variable PRUNIT NUMERIC(18,2);
declare variable DESCITE VARCHAR(255);
declare variable BOD VARCHAR(2);
declare variable DTO NUMERIC(9,4);
declare variable LISTA INTEGER;
declare variable OBS BLOB SUB_TYPE 1 SEGMENT SIZE 8192;
declare variable REF VARCHAR(60);
begin
ITCONS = 1;
/* DADOS LOS IDS DE LOS DOCUMENTOS EN LA TABLA CONSOLIDE GENERE EL CONSOLIDADO */
FOR SELECT CEFA_TIPODES, CEFA_TIPOORI, CEFA_IDORI FROM consolide_faltantes
    WHERE CEFA_ID = :idcons ORDER BY CEFA_ITEM INTO :TIPDES, :TIPORI, :IDORI do
    BEGIN
    if (TIPORI = 21) then
        BEGIN
        FOR SELECT FCDE_ITEM, ARTI_COD, FCDE_CODBAR, FCDE_PRUNIT, FCDE_DESC, BODE_COD, FCDE_DTOPORC, FCDE_LOTE, LOTE_VENCE, FCDE_OBS, FCDE_REFERENCIA
            FROM FACTURAS_COMPRAS_DETALLE
            WHERE FACO_ID = :IDORI ORDER BY FCDE_ITEM INTO :ITEM, :ARTI, :CODBAR, :PRUNIT, :DESCITE, :BOD, :DTO, :LOTE, :LOTE_VENCE, :OBS, :REF
            DO
            BEGIN
            if (((CODBAR IS NULL) or (CODBAR = '')) AND (ARTI <> '')) then
                CODBAR = ARTI;
            EXECUTE PROCEDURE faltante(:TIPORI, :TIPDES, :IDORI, :ITEM) returning_values (:CANT, :UNIDAD, :FACTOR);
            if (CANT > 0) then
                BEGIN
                INSERT INTO CONSOLIDADO_FALTANTES (COFA_ID, COFA_ITEM, COFA_TIPODES, COFA_TIPOORI, COFA_IDORI, COFA_ITEMORI, ARTI_COD, COFA_CANT, COFA_CODBAR, COFA_UNIDAD, COFA_FACTOR, COFA_OK, COFA_PRUNIT, COFA_DESCITE, COFA_BODEGA, COFA_DTOITE, COFA_LOTE, LOTE_VENCE, CODE_OBSIT, CODE_REF)
                    VALUES (:IDCONS, :ITCONS, :tipdes,  :tipori, :idori, :item, :arti, :cant, :CODBAR, :UNIDAD, :FACTOR, 'N', :PRUNIT, :DESCITE, :BOD, :DTO, :LOTE, :LOTE_VENCE, :OBS, :REF);
                ITCONS = ITCONS + 1;
                END
            END
        END
    if (TIPORI = 22) then
        BEGIN
        FOR SELECT RPVD_ITEM, ARTI_COD, RPVD_CODBAR, RPVD_PRUNIT, RPVD_DESC, BODE_COD, RPVD_DTOPORC, RPVD_LOTE, LOTE_VENCE, RPVD_OBS
            FROM remision_proveedor_det
            WHERE REPR_ID = :IDORI ORDER BY RPVD_ITEM INTO :ITEM, :ARTI, :CODBAR, :PRUNIT, :DESCITE, :BOD, :DTO, :LOTE, :LOTE_VENCE, :OBS
            DO
            BEGIN
            if (((CODBAR IS NULL) or (CODBAR = '')) AND (ARTI <> '')) then
                CODBAR = ARTI;
            EXECUTE PROCEDURE faltante(:TIPORI, :TIPDES, :IDORI, :ITEM) returning_values (:CANT, :UNIDAD, :FACTOR);
            if (CANT > 0) then
                BEGIN
                INSERT INTO CONSOLIDADO_FALTANTES (COFA_ID, COFA_ITEM, COFA_TIPODES, COFA_TIPOORI, COFA_IDORI, COFA_ITEMORI, ARTI_COD, COFA_CANT, COFA_CODBAR, COFA_UNIDAD, COFA_FACTOR, COFA_OK, COFA_PRUNIT, COFA_DESCITE, COFA_BODEGA, COFA_DTOITE, COFA_LOTE, LOTE_VENCE, CODE_OBSIT)
                    VALUES (:IDCONS, :ITCONS, :tipdes,  :tipori, :idori, :item, :arti, :cant, :CODBAR, :UNIDAD, :FACTOR, 'N', :PRUNIT, :descite, :BOD, :DTO, :LOTE, :LOTE_VENCE, :OBS);
                ITCONS = ITCONS + 1;
                END
            END
        END
    if (TIPORI = 23) then
        BEGIN
        FOR SELECT OCDE_ITEM, ARTI_COD, OCDE_CODBAR, OCDE_PRUNIT, OCDE_DESC, BODE_COD, OCDE_DTOPORC, NULL, CAST('NOW' AS DATE), OCDE_OBS
            FROM ORDENES_COMPRA_DETALLE
            WHERE ORDC_ID = :IDORI ORDER BY OCDE_ITEM INTO :ITEM, :ARTI, :CODBAR, :PRUNIT, :DESCITE, :BOD, :DTO, :LOTE, :LOTE_VENCE, :OBS
            DO
            BEGIN
            if (((CODBAR IS NULL) or (CODBAR = '')) AND (ARTI <> '')) then
                CODBAR = ARTI;
            EXECUTE PROCEDURE faltante(:TIPORI, :TIPDES, :IDORI, :ITEM) returning_values (:CANT, :UNIDAD, :FACTOR);
            if (CANT > 0) then
                BEGIN
                INSERT INTO CONSOLIDADO_FALTANTES (COFA_ID, COFA_ITEM, COFA_TIPODES, COFA_TIPOORI, COFA_IDORI, COFA_ITEMORI, ARTI_COD, COFA_CANT, COFA_CODBAR, COFA_UNIDAD, COFA_FACTOR, COFA_OK, COFA_PRUNIT, COFA_DESCITE, COFA_BODEGA, COFA_DTOITE, COFA_LOTE, LOTE_VENCE, CODE_OBSIT)
                    VALUES (:IDCONS, :ITCONS, :tipdes,  :tipori, :idori, :item, :arti, :cant, :CODBAR, :UNIDAD, :FACTOR, 'N', :PRUNIT, :DESCITE, :BOD, :DTO, :LOTE, :LOTE_VENCE, :OBS);
                ITCONS = ITCONS + 1;
                END
            END
        END
    if (TIPORI = 25) then
        BEGIN
        FOR SELECT CPRD_ITEM, ARTI_COD, CPRD_CODBAR, CPRD_PRUNIT, CPRD_DESC, BODE_COD, CPRD_DTOPORC, NULL, CAST('NOW' AS DATE), CPRD_OBS
            FROM COTIZACIONES_PROVEEDOR_DET
            WHERE COPR_ID = :IDORI ORDER BY CPRD_ITEM INTO :ITEM, :ARTI, :CODBAR, :PRUNIT, :DESCITE, :BOD, :DTO, :LOTE, :LOTE_VENCE, :OBS
            DO
            BEGIN
            if (((CODBAR IS NULL) or (CODBAR = '')) AND (ARTI <> '')) then
                CODBAR = ARTI;
            EXECUTE PROCEDURE faltante(:TIPORI, :TIPDES, :IDORI, :ITEM) returning_values (:CANT, :UNIDAD, :FACTOR);
            if (CANT > 0) then
                BEGIN
                INSERT INTO CONSOLIDADO_FALTANTES (COFA_ID, COFA_ITEM, COFA_TIPODES, COFA_TIPOORI, COFA_IDORI, COFA_ITEMORI, ARTI_COD, COFA_CANT, COFA_CODBAR, COFA_UNIDAD, COFA_FACTOR, COFA_OK, COFA_PRUNIT, COFA_DESCITE, COFA_BODEGA, COFA_DTOITE, COFA_LOTE, LOTE_VENCE, CODE_OBSIT)
                    VALUES (:IDCONS, :ITCONS, :tipdes,  :tipori, :idori, :item, :arti, :cant, :CODBAR, :UNIDAD, :FACTOR, 'N', :PRUNIT, :DESCITE, :BOD, :DTO, :LOTE, :LOTE_VENCE, :OBS);
                ITCONS = ITCONS + 1;
                END
            END
        END
    if (TIPORI = 31) then
        BEGIN
        FOR SELECT FADE_ITEM, ARTI_COD, FADE_CODBAR, FADE_PRUNIT, SUBSTRING(FADE_DESC FROM 1 FOR 60), BODE_COD, FADE_DTOPORC, FADE_LOTE, CAST('NOW' AS DATE), LIPR_COD, FADE_OBS, FADE_REFERENCIA
            FROM FACTURAS_DETALLE
            WHERE FACT_ID = :IDORI ORDER BY FADE_ITEM INTO :ITEM, :ARTI, :CODBAR, :PRUNIT, :DESCITE, :BOD, :DTO, :LOTE, :LOTE_VENCE, :LISTA, :OBS, :REF
            DO
            BEGIN
            if (((CODBAR IS NULL) or (CODBAR = '')) AND (ARTI <> '')) then
                CODBAR = ARTI;
            EXECUTE PROCEDURE faltante(:TIPORI, :TIPDES, :IDORI, :ITEM) returning_values (:CANT, :UNIDAD, :FACTOR);
            if ((CANT > 0) or (arti = '.t')) then
                BEGIN
                INSERT INTO CONSOLIDADO_FALTANTES (COFA_ID, COFA_ITEM, COFA_TIPODES, COFA_TIPOORI, COFA_IDORI, COFA_ITEMORI, ARTI_COD, COFA_CANT, COFA_CODBAR, COFA_UNIDAD, COFA_FACTOR, COFA_OK, COFA_PRUNIT, COFA_DESCITE, COFA_BODEGA, COFA_DTOITE, COFA_LOTE, LOTE_VENCE, COFA_LISTA, CODE_OBSIT, CODE_REF)
                    VALUES (:IDCONS, :ITCONS, :tipdes,  :tipori, :idori, :item, :arti, :cant, :CODBAR, :UNIDAD, :FACTOR, 'N', :PRUNIT, :DESCITE, :BOD, :DTO, :LOTE, :LOTE_VENCE, :LISTA, :obs,  :REF);
                ITCONS = ITCONS + 1;
                END
            END
        END
    if (TIPORI = 32) then
        BEGIN
        FOR SELECT RVDE_ITEM, ARTI_COD, RVDE_CODBAR, RVDE_PRUNIT, SUBSTRING(RVDE_DESC FROM 1 FOR 60), BODE_COD, RVDE_DTOPORC, RVDE_LOTE, CAST('NOW' AS DATE), LIPR_COD, RVDE_OBS, RVDE_REFERENCIA
            FROM remisiones_venta_detalle
            WHERE REVT_ID = :IDORI ORDER BY RVDE_ITEM INTO :ITEM, :ARTI, :CODBAR, :PRUNIT, :DESCITE, :BOD, :DTO, :LOTE, :LOTE_VENCE, :LISTA, :obs, :ref DO
            BEGIN
            if (((CODBAR IS NULL) or (CODBAR = '')) AND (ARTI <> '')) then
                CODBAR = ARTI;
            EXECUTE PROCEDURE faltante(:TIPORI, :TIPDES, :IDORI, :ITEM) returning_values (:CANT, :UNIDAD, :FACTOR);
            if ((CANT > 0) or (arti = '.t')) then
                BEGIN
                INSERT INTO CONSOLIDADO_FALTANTES (COFA_ID, COFA_ITEM, COFA_TIPODES, COFA_TIPOORI, COFA_IDORI, COFA_ITEMORI, ARTI_COD, COFA_CANT, COFA_CODBAR, COFA_UNIDAD, COFA_FACTOR, COFA_OK, COFA_PRUNIT, COFA_DESCITE, COFA_BODEGA, COFA_DTOITE, COFA_LOTE, LOTE_VENCE, COFA_LISTA, CODE_OBSIT, CODE_REF)
                    VALUES (:IDCONS, :ITCONS, :tipdes,  :tipori, :idori, :item, :arti, :cant, :CODBAR, :UNIDAD, :FACTOR, 'N', :PRUNIT, :DESCITE, :BOD, :DTO, :LOTE, :LOTE_VENCE, :LISTA, :obs, :ref);
                ITCONS = ITCONS + 1;
                END
            END
        END
    if (TIPORI = 34) then
        BEGIN
        FOR SELECT PEDE_ITEM, ARTI_COD, PEDE_CODBAR, PEDE_PRUNIT, SUBSTRING(PEDE_DESC FROM 1 FOR 60), BODE_COD, PEDE_DTOPORC, NULL, CAST('NOW' AS DATE), D.LIPR_COD, PEDE_OBS, PEDE_REFERENCIA
            FROM PEDIDOS_DETALLE D, PEDIDOS P
            WHERE P.PEDI_ID = :IDORI AND P.pedi_id = D.pedi_id ORDER BY PEDE_ITEM
            INTO :ITEM, :ARTI, :CODBAR, :PRUNIT, :DESCITE, :BOD, :DTO, :LOTE, :LOTE_VENCE, :LISTA, :obs, :ref DO
            BEGIN
            if (((CODBAR IS NULL) or (CODBAR = '')) AND (ARTI <> '')) then
                CODBAR = ARTI;
            EXECUTE PROCEDURE faltante(:TIPORI, :TIPDES, :IDORI, :ITEM) returning_values (:CANT, :UNIDAD, :FACTOR);
            if ((CANT > 0) or (arti = '.t')) then
                BEGIN
                INSERT INTO CONSOLIDADO_FALTANTES (COFA_ID, COFA_ITEM, COFA_TIPODES, COFA_TIPOORI, COFA_IDORI, COFA_ITEMORI, ARTI_COD, COFA_CANT, COFA_CODBAR, COFA_UNIDAD, COFA_FACTOR, COFA_OK, COFA_PRUNIT, COFA_DESCITE, COFA_BODEGA, COFA_DTOITE, COFA_LOTE, LOTE_VENCE, COFA_LISTA, CODE_OBSIT, CODE_REF)
                    VALUES (:IDCONS, :ITCONS, :tipdes,  :tipori, :idori, :item, :arti, :cant, :CODBAR, :UNIDAD, :FACTOR, 'N', :PRUNIT, :DESCITE, :BOD, :DTO, :LOTE, :LOTE_VENCE, :LISTA, :obs, :ref);
                ITCONS = ITCONS + 1;
                END
            END
        END
    if (TIPORI = 35) then
        BEGIN
        FOR SELECT CTDE_ITEM, ARTI_COD, CTDE_CODBAR, CTDE_PRUNIT, SUBSTRING(CTDE_DESC FROM 1 FOR 60), P.BODE_COD, CTDE_DTOPORC, NULL, CAST('NOW' AS DATE), D.LIPR_COD, CTDE_OBS, CTDE_REFERENCIA
            FROM COTIZACIONES_DETALLE D, cotizaciones C, punto_venta P
            WHERE C.COTI_ID = :IDORI AND C.coti_id = D.coti_id AND C.ptvt_id = P.ptvt_id ORDER BY CTDE_ITEM INTO :ITEM, :ARTI, :CODBAR, :PRUNIT, :DESCITE, :BOD, :DTO, :LOTE, :LOTE_VENCE, :LISTA, :obs, :ref DO
            BEGIN
            if (((CODBAR IS NULL) or (CODBAR = '')) AND (ARTI <> '')) then
                CODBAR = ARTI;
            EXECUTE PROCEDURE faltante(:TIPORI, :TIPDES, :IDORI, :ITEM) returning_values (:CANT, :UNIDAD, :FACTOR);
            if ((CANT > 0) or (arti = '.t')) then
                BEGIN
                INSERT INTO CONSOLIDADO_FALTANTES (COFA_ID, COFA_ITEM, COFA_TIPODES, COFA_TIPOORI, COFA_IDORI, COFA_ITEMORI, ARTI_COD, COFA_CANT, COFA_CODBAR, COFA_UNIDAD, COFA_FACTOR, COFA_OK, COFA_PRUNIT, COFA_DESCITE, COFA_BODEGA, COFA_DTOITE, COFA_LOTE, LOTE_VENCE, COFA_LISTA, CODE_OBSIT, CODE_REF)
                    VALUES (:IDCONS, :ITCONS, :tipdes,  :tipori, :idori, :item, :arti, :cant, :CODBAR, :UNIDAD, :FACTOR, 'N', :PRUNIT, :DESCITE, :BOD, :DTO, :LOTE, :LOTE_VENCE, :LISTA, :obs, :ref);
                ITCONS = ITCONS + 1;
                END
            END
        END
    if (TIPORI = 40) then
        BEGIN
        FOR SELECT PEVD_ITEM, ARTI_COD, PEVD_CORBAR, PEVD_PRUNIT, SUBSTRING(PEVD_DESC FROM 1 FOR 60), D.BODE_COD, PEVD_DTOPORC, NULL, CAST('NOW' AS DATE), 1, PEVD_OBS, PEVD_REFERENCIA
            FROM pendiente_ventas_detalle D, pendiente_ventas P
            WHERE P.pend_id = :IDORI AND P.pend_id = D.pend_id ORDER BY PEVD_ITEM INTO :ITEM, :ARTI, :CODBAR, :PRUNIT, :DESCITE, :BOD, :DTO, :LOTE, :LOTE_VENCE, :LISTA, :obs, :ref DO
            BEGIN
            if (((CODBAR IS NULL) or (CODBAR = '')) AND (ARTI <> '')) then
                CODBAR = ARTI;
            EXECUTE PROCEDURE faltante(:TIPORI, :TIPDES, :IDORI, :ITEM) returning_values (:CANT, :UNIDAD, :FACTOR);
            if ((CANT > 0) or (arti = '.t')) then
                BEGIN
                INSERT INTO CONSOLIDADO_FALTANTES (COFA_ID, COFA_ITEM, COFA_TIPODES, COFA_TIPOORI, COFA_IDORI, COFA_ITEMORI, ARTI_COD, COFA_CANT, COFA_CODBAR, COFA_UNIDAD, COFA_FACTOR, COFA_OK, COFA_PRUNIT, COFA_DESCITE, COFA_BODEGA, COFA_DTOITE, COFA_LOTE, LOTE_VENCE, COFA_LISTA, CODE_OBSIT, CODE_REF)
                    VALUES (:IDCONS, :ITCONS, :tipdes,  :tipori, :idori, :item, :arti, :cant, :CODBAR, :UNIDAD, :FACTOR, 'N', :PRUNIT, :DESCITE, :BOD, :DTO, :LOTE, :LOTE_VENCE, :LISTA, :obs, :ref);
                ITCONS = ITCONS + 1;
                END
            END
        END
    if (TIPORI = 139) then
        BEGIN
        FOR SELECT SLDE_ITEM, ARTI_COD, SLDE_CODBAR, SLDE_FOB, SLDE_DESC, SLDE_DTOPORC, SLDE_OBS
            FROM solicitud_importacion_det
            WHERE SLIM_ID = :IDORI ORDER BY SLDE_ITEM INTO :ITEM, :ARTI, :CODBAR, :PRUNIT, :DESCITE, :DTO, :OBS
            DO
            BEGIN
            if (((CODBAR IS NULL) or (CODBAR = '')) AND (ARTI <> '')) then
                CODBAR = ARTI;
            EXECUTE PROCEDURE faltante(:TIPORI, :TIPDES, :IDORI, :ITEM) returning_values (:CANT, :UNIDAD, :FACTOR);
            if (CANT > 0) then
                BEGIN
                INSERT INTO CONSOLIDADO_FALTANTES (COFA_ID, COFA_ITEM, COFA_TIPODES, COFA_TIPOORI, COFA_IDORI, COFA_ITEMORI, ARTI_COD, COFA_CANT, COFA_CODBAR, COFA_UNIDAD, COFA_FACTOR, COFA_OK, COFA_PRUNIT, COFA_DESCITE, COFA_BODEGA, COFA_DTOITE, COFA_LOTE, LOTE_VENCE, CODE_OBSIT)
                    VALUES (:IDCONS, :ITCONS, :tipdes,  :tipori, :idori, :item, :arti, :cant, :CODBAR, :UNIDAD, :FACTOR, 'N', :PRUNIT, :descite, :BOD, :DTO, :LOTE, :LOTE_VENCE, :OBS);
                ITCONS = ITCONS + 1;
                END
            END
        END
    END /* FOR CONSOLIDE */
end
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE DOCCOMPRA_X_PROVEEDOR(
    NIT VARCHAR(20),
    TIPODOC INTEGER,
    TIPODES INTEGER,
    FECHA DATE)
RETURNS (
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(8),
    NROPROV VARCHAR(10),
    VALIDEZ INTEGER,
    ID INTEGER,
    FECDOC DATE,
    SUBTOTAL NUMERIC(18,2),
    IVA NUMERIC(18,2),
    CONSUMO NUMERIC(18,2),
    TOTAL NUMERIC(18,2))
AS
declare variable VENCE DATE;
declare variable ITEM INTEGER;
declare variable FALTA NUMERIC(18,4);
declare variable FALTAT NUMERIC(18,4);
declare variable UNIDAD VARCHAR(8);
declare variable FACTOR NUMERIC(18,4);
declare variable DIAS INTEGER;
declare variable usado CHAR(2);
declare variable NUMROWS INTEGER;
declare variable IDF INTEGER;
declare variable UNAVEZ CHAR(2);
BEGIN
EXECUTE PROCEDURE lee_configuracion('COMPRAS','DOCUMENTOS','NUMERO DE DIAS MAXIMO PARA CRUZAR DOCUMENTO') returning_values (DIAS);
EXECUTE PROCEDURE lee_configuracion('COMPRAS','DOCUMENTOS','PERMITIR LLAMAR DOCUMENTOS PREVIAMENTE USADOS EN OTRO TIPO DE DOCUMENTO') returning_values (UNAVEZ);
if (TIPODOC = 21) then /* FACTURA */
    BEGIN
    FOR SELECT FACO_ID, PREF_PRE, FACO_NUMERO, FACO_FECHA, FACO_VENCE, FACO_NUMPROV
        FROM FACTURAS_COMPRA WHERE TERC_NIT = :NIT AND FACO_FECHA <= :FECHA AND (FACO_FECHA >= (:FECHA-:DIAS)) AND FACO_ANULADO = 'N'
        INTO :ID, :PREFIJO, :NUMERO, :FECDOC, :VENCE, :nroprov DO
        BEGIN
        if ((UNAVEZ <> 'NO') or NOT EXISTS(SELECT COFA_ID FROM CONSOLIDADO_FALTANTES WHERE COFA_TIPOORI = 21 AND COFA_IDORI = :id AND COFA_CANTCR <> 0)) then
            BEGIN
            EXECUTE PROCEDURE TOTAL_DOC_COMPRA(TIPODOC, ID) returning_values (SUBTOTAL, IVA, CONSUMO);
            TOTAL = SUBTOTAL + IVA + CONSUMO;
            VALIDEZ = VENCE - FECDOC;
            if (TIPODES <> 0) then
                BEGIN
                /* RECORRA LOS ITEMS PARA VER SI TODO ESTA DEVUELTO */
                FALTAT = 0;
                FOR SELECT FCDE_ITEM, (FCDE_CANT*FCDE_FACTOR-FCDE_DEVUELTO) FROM FACTURAS_COMPRAS_DETALLE
                    WHERE FACO_ID = :ID ORDER BY FCDE_ITEM INTO :ITEM, :FALTA DO
                    BEGIN
                    if (tipodes <> 24) then
                        EXECUTE procedure FALTANTE(TIPODOC, TIPODES, :ID, :ITEM) returning_values (:FALTA, :unidad,  :FACTOR);
                    FALTAT = FALTAT + FALTA;
                    END
                if (FALTAT <> 0) then
                    SUSPEND;
                END
            ELSE
                SUSPEND;
            END
        END
    END
if (TIPODOC = 22) then /* REMISION */
    BEGIN
    FOR SELECT REPR_ID, PREF_PRE, REPR_NUMERO, REPR_FECHA, 0, REPR_NUMPROV
        FROM remision_proveedor WHERE TERC_NIT = :NIT AND REPR_FECHA <= :FECHA AND (REPR_FECHA >= (:FECHA-:DIAS)) AND REPR_ANULADO = 'N'
        INTO :ID, :PREFIJO, :NUMERO, :FECDOC, :VALIDEZ, :nroprov DO
        BEGIN
        if ((UNAVEZ <> 'NO') or NOT EXISTS(SELECT COFA_ID FROM CONSOLIDADO_FALTANTES WHERE COFA_TIPOORI = 22 AND COFA_IDORI = :id AND COFA_CANTCR <> 0)) then
            BEGIN
            EXECUTE PROCEDURE TOTAL_DOC_COMPRA(TIPODOC, ID) returning_values (SUBTOTAL, IVA, CONSUMO);
            TOTAL = SUBTOTAL + IVA + CONSUMO;
            if (TIPODES <> 0) then
                BEGIN
                /* RECORRA LOS ITEMS PARA VER SI TODO ESTA DEVUELTO */
                FALTAT = 0;
                FOR SELECT RPVD_ITEM FROM remision_proveedor_det WHERE REPR_ID = :ID ORDER BY RPVD_ITEM INTO :ITEM DO
                    BEGIN
                    EXECUTE procedure FALTANTE(TIPODOC, TIPODES, :ID, :ITEM) returning_values (:FALTA, :unidad,  :FACTOR);
                    FALTAT = FALTAT + FALTA;
                    END
                if (FALTAT <> 0) then
                    SUSPEND;
                END
            ELSE
                SUSPEND;
            END
        END
    END
if (TIPODOC = 24) then /* DEVOLUCION */
    BEGIN
    FOR SELECT DVCO_ID, PREF_PRE, DVCO_NUMERO, DVCO_FECHA, 0, DVCO_FACTID
        FROM DEVOLUCIONES_COMPRAS WHERE TERC_NIT = :NIT AND DVCO_FECHA <= :FECHA AND DVCO_ANULADO = 'N'
        INTO :ID, :PREFIJO, :NUMERO, :FECDOC, :VALIDEZ, :idf DO
        BEGIN
        nroprov = '';
        SELECT FACO_NUMPROV FROM facturas_compra WHERE FACO_ID = :idF INTO :nroprov;
        EXECUTE PROCEDURE TOTAL_DOC_COMPRA(TIPODOC, ID) returning_values (SUBTOTAL, IVA, CONSUMO);
        TOTAL = SUBTOTAL + IVA + CONSUMO;
        SUSPEND;
        END
    END
if (TIPODOC = 23) then /* ORDEN */
    BEGIN
    FOR SELECT ORDC_ID, PREF_PRE, ORDC_NUMERO, ORDC_FECHA, ORDC_VALIDEZ, ''
        FROM ORDENES_COMPRA WHERE TERC_NIT = :NIT AND ORDC_FECHA <= :FECHA AND ((ORDC_FECHA+ORDC_VALIDEZ) >= :FECHA) AND ORDC_ANULADO = 'N'
        INTO :ID, :PREFIJO, :NUMERO, :FECDOC, :VALIDEZ, :nroprov DO
        BEGIN
        if ((UNAVEZ <> 'NO') or NOT EXISTS(SELECT COFA_ID FROM CONSOLIDADO_FALTANTES WHERE COFA_TIPOORI = 23 AND COFA_IDORI = :id AND COFA_CANTCR <> 0)) then
            BEGIN
            EXECUTE PROCEDURE TOTAL_DOC_COMPRA(TIPODOC, ID) returning_values (SUBTOTAL, IVA, CONSUMO);
            TOTAL = SUBTOTAL + IVA + CONSUMO;
            if (TIPODES <> 0) then
                BEGIN
                /* RECORRA LOS ITEMS PARA VER SI TODO ESTA USADO */
                FALTAT = 0;
                EXECUTE PROCEDURE lee_configuracion('COMPRAS','DOCUMENTOS','PERMITIR LLAMAR DOCUMENTOS PREVIAMENTE USADOS EN OTRO TIPO DE DOCUMENTO') returning_values (:USADO);
                if (USADO = 'NO') then
                    SELECT COUNT(*) FROM consolidado_faltantes WHERE COFA_TIPOORI = 23 AND COFA_IDORI = :ID AND COFA_TIPODES <> :tipodes AND COFA_CANTCR <> 0 INTO :NUMROWS;
                ELSE
                    NUMROWS = 0;
                if (NUMROWS = 0) then
                    FOR SELECT OCDE_ITEM FROM ordenes_compra_detalle WHERE ORDC_ID = :ID ORDER BY OCDE_ITEM INTO :ITEM DO
                        BEGIN
                        EXECUTE procedure FALTANTE(TIPODOC, TIPODES, :ID, :ITEM) returning_values (:FALTA, :unidad,  :FACTOR);
                        FALTAT = FALTAT + FALTA;
                        END
                if (FALTAT <> 0) then
                    SUSPEND;
                END
            ELSE
                SUSPEND;
            END
        END
    END
if (TIPODOC = 25) then /* COTIZACION */
    BEGIN
    FOR SELECT COPR_ID, PREF_PRE, COPR_NUMERO, COPR_FECHA, COPR_VALIDEZ, ''
        FROM cotizacion_PROVEEDOR WHERE TERC_NIT = :NIT AND COPR_FECHA <= :FECHA AND ((COPR_FECHA+COPR_VALIDEZ) >= :FECHA) AND COPR_ANULADO = 'N'
        INTO :ID, :PREFIJO, :NUMERO, :FECDOC, :VALIDEZ, :nroprov DO
        BEGIN
        if ((UNAVEZ <> 'NO') or NOT EXISTS(SELECT COFA_ID FROM CONSOLIDADO_FALTANTES WHERE COFA_TIPOORI = 25 AND COFA_IDORI = :id AND COFA_CANTCR <> 0)) then
            BEGIN
            EXECUTE PROCEDURE TOTAL_DOC_COMPRA(TIPODOC, ID) returning_values (SUBTOTAL, IVA, CONSUMO);
            TOTAL = SUBTOTAL + IVA + CONSUMO;
            if (TIPODES <> 0) then
                BEGIN
                /* RECORRA LOS ITEMS PARA VER SI TODO ESTA DEVUELTO */
                FALTAT = 0;
                EXECUTE PROCEDURE lee_configuracion('COMPRAS','DOCUMENTOS','PERMITIR LLAMAR DOCUMENTOS PREVIAMENTE USADOS EN OTRO TIPO DE DOCUMENTO') returning_values (:USADO);
                if (USADO = 'NO') then
                    SELECT COUNT(*) FROM consolide_faltantes WHERE CEFA_TIPOORI = 25 AND CEFA_IDORI = :ID AND CEFA_TIPODES <> :tipodes INTO :NUMROWS;
                ELSE
                    NUMROWS = 0;
                if (NUMROWS = 0) then
                    FOR SELECT CPRD_ITEM FROM cotizaciones_proveedor_det WHERE COPR_ID = :ID ORDER BY CPRD_ITEM INTO :ITEM DO
                        BEGIN
                        EXECUTE procedure FALTANTE(TIPODOC, TIPODES, :ID, :ITEM) returning_values (:FALTA, :unidad,  :FACTOR);
                        FALTAT = FALTAT + FALTA;
                        END
                if (FALTAT <> 0) then
                    SUSPEND;
                END
            ELSE
                SUSPEND;
            END
        END
    END
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE DOCVENTAS_X_CLIENTE(
    NIT VARCHAR(20),
    TIPODOC INTEGER,
    TIPODES INTEGER,
    FECHA DATE,
    SUCURSAL VARCHAR(10))
RETURNS (
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(8),
    VALIDEZ INTEGER,
    VEND INTEGER,
    ID INTEGER,
    FECDOC DATE,
    SUBTOTAL NUMERIC(18,2),
    IVA NUMERIC(18,2),
    CONSUMO NUMERIC(18,2),
    TOTAL NUMERIC(18,2),
    SUCUR VARCHAR(10))
AS
declare variable VENCE DATE;
declare variable ITEM INTEGER;
declare variable FALTA NUMERIC(18,4);
declare variable FALTAT NUMERIC(18,4);
declare variable UNIDAD VARCHAR(8);
declare variable FACTOR NUMERIC(18,4);
declare variable DIAS INTEGER;
declare variable usado CHAR(2);
declare variable NUMROWS INTEGER;
declare variable TRAERCONTADO CHAR(2);
declare variable CONSOL INTEGER;
declare variable TIPOORI INTEGER;
declare variable OK CHAR(1);
declare variable ITECAN NUMERIC(18,2);
declare variable ITESUB NUMERIC(18,2);
declare variable ITEIVA NUMERIC(18,2);
declare variable ITECON NUMERIC(18,2);
BEGIN
EXECUTE PROCEDURE lee_configuracion('FACTURACION','DOCUMENTOS','NUMERO DE DIAS MAXIMO PARA CRUZAR DOCUMENTO') returning_values (DIAS);
EXECUTE PROCEDURE lee_configuracion('FACTURACION', 'DOCUMENTOS', 'TRAER DOCUMENTOS PENDIENTES DEL CLIENTE DE CONTADO EN DOCUMENTOS DE OTROS CLIENTES') returning_values (TRAERCONTADO);
EXECUTE PROCEDURE lee_configuracion('FACTURACION','DOCUMENTOS','PERMITIR LLAMAR DOCUMENTOS PREVIAMENTE USADOS EN OTRO TIPO DE DOCUMENTO') returning_values (:USADO);
if (TIPODOC = 31) then /* FACTURA */
    BEGIN
    FOR SELECT FACT_ID, PREF_PRE, FACT_NUMERO, FACT_FECHA, FACT_VENCE, FACT_SUCURSAL, VEND_COD, FACT_CONSOLIDA
        FROM FACTURAS
        WHERE TERC_NIT = :NIT AND FACT_FECHA <= :FECHA AND (FACT_FECHA >= (:FECHA - :DIAS)) AND
            FACT_ANULADO = 'N' AND ((FACT_SUCURSAL = :SUCURSAL) or (:SUCURSAL = 'Todas') or (:SUCURSAL = '0'))
        INTO :ID, :PREFIJO, :NUMERO, :FECDOC, :VENCE, :SUCUR, :VEND, :CONSOL DO
        BEGIN
        EXECUTE PROCEDURE TOTAL_DOC_VENTAS(TIPODOC, ID) returning_values (SUBTOTAL, IVA, CONSUMO);
        TOTAL = SUBTOTAL + IVA + CONSUMO;
        VALIDEZ = VENCE - FECDOC;
        if (TIPODES = 33) then
            BEGIN
            /* VERIFIQUE SI HAY PENDIENTES */
            SELECT SUM(FADE_CANT * FADE_FACTOR - FADE_DEVUELTO) FROM FACTURAS_DETALLE WHERE FACT_ID = :ID and substring(arti_cod from 1 FOR 2) <> '.t' and FADE_cant > 0 INTO :FALTA;
            if (FALTA <> 0) then
                suspend;
            END
        ELSE
            BEGIN
            /* VERIFIQUE QUE NO ESTE HECHA CON BASE EN UN DOCUMENTO DE ORIGEN */
            FALTAT = 0;
            OK = 'N';
            if ((CONSOL <> 0) AND (CONSOL IS NOT NULL)) then
                BEGIN
                SELECT MAX(COFA_TIPOORI) FROM consolidado_faltantes WHERE COFA_ID = :CONSOL AND COFA_CANTCR <> 0 INTO :tipoori;
                if (TIPOORI <> TIPODES) then
                    OK = 'S';
                END
            ELSE
                OK = 'S';
            if (OK = 'S') then
                BEGIN
                /* RECORRA LOS ITEMS PARA VER SI TODO ESTA USADO */
                FOR SELECT FADE_ITEM FROM FACTURAS_DETALLE WHERE FACT_ID = :ID and substring(arti_cod from 1 FOR 2) <> '.t' ORDER BY FADE_ITEM INTO :ITEM DO
                    BEGIN
                    EXECUTE procedure FALTANTE(TIPODOC, :TIPODES, :ID, :ITEM) returning_values (:FALTA, :UNIDAD, :FACTOR);
                    FALTAT = FALTAT + FALTA;
                    END
                if (FALTAT <> 0) then
                    SUSPEND;
                END
            END
        END
    END
  if (TIPODOC = 32) then /* REMISION */
    BEGIN
    FOR SELECT REVT_ID, PREF_PRE, REVT_NUMERO, REVT_FECHA, 0, REVT_SUCURSAL, VEND_COD, REVT_CONSOLIDA
        FROM remisiones_venta
        WHERE TERC_NIT = :NIT AND REVT_FECHA <= :FECHA AND (REVT_FECHA >= (:FECHA - :DIAS)) AND
            REVT_ANULADO = 'N' AND ((REVT_SUCURSAL = :SUCURSAL) or (:SUCURSAL = 'Todas'))
        INTO :ID, :PREFIJO, :NUMERO, :FECDOC, :VALIDEZ, :SUCUR, :VEND, :CONSOL DO
        BEGIN
        EXECUTE PROCEDURE TOTAL_DOC_VENTAS(TIPODOC, ID) returning_values (SUBTOTAL, IVA, CONSUMO);
        TOTAL = SUBTOTAL + IVA + CONSUMO;
        if (TIPODES <> 0) then
            BEGIN
            /* VERIFIQUE QUE NO ESTE HECHA CON BASE EN UN DOCUMENTO DE ORIGEN */
            FALTAT = 0;
            OK = 'N';
            if ((CONSOL <> 0) AND (CONSOL IS NOT NULL)) then
                BEGIN
                SELECT MAX(COFA_TIPOORI) FROM consolidado_faltantes WHERE COFA_ID = :CONSOL AND COFA_CANTCR <> 0 INTO :tipoori;
                if (TIPOORI <> TIPODES) then
                    OK = 'S';
                END
            ELSE
                OK = 'S';
            if (OK = 'S') then
                BEGIN
                /* RECORRA LOS ITEMS PARA VER SI TODO ESTA USADO */
                FOR SELECT RVDE_ITEM FROM REMISIONES_VENTA_DETALLE WHERE REVT_ID = :ID ORDER BY RVDE_ITEM INTO :ITEM DO
                    BEGIN
                    EXECUTE procedure FALTANTE(TIPODOC, :TIPODES, :ID, :ITEM) returning_values (:FALTA, :UNIDAD, :FACTOR);
                    FALTAT = FALTAT + FALTA;
                    END
                if (FALTAT <> 0) then
                    SUSPEND;
                END
            END
        END
    END
  if (TIPODOC = 33) then /* DEVOLUCION */
    BEGIN
    FOR SELECT DEVT_ID, PREF_PRE, DEVT_NUMERO, DEVT_FECHA, 0, DEVT_SUCURSAL, VEND_COD
        FROM DEVOLUCIONES_VENTAS
        WHERE TERC_NIT = :NIT AND DEVT_FECHA <= :FECHA AND DEVT_ANULADO = 'N' AND ((DEVT_SUCURSAL = :SUCURSAL) or (:SUCURSAL = 'Todas'))
        INTO :ID, :PREFIJO, :NUMERO, :FECDOC, :VALIDEZ, :SUCUR, :VEND DO
        BEGIN
        EXECUTE PROCEDURE TOTAL_DOC_VENTAS(TIPODOC, ID) returning_values (SUBTOTAL, IVA, CONSUMO);
        TOTAL = SUBTOTAL + IVA + CONSUMO;
        SUSPEND;
        END
    END
  if (TIPODOC = 34) then /* PEDIDO */
    BEGIN
    FOR SELECT PEDI_ID, PREF_PRE, PEDI_NUMERO, PEDI_FECHA, PEDI_VALIDEZ, PEDI_SUCURSAL, VEND_COD
        FROM PEDIDOS
        WHERE ((TERC_NIT = :NIT) OR ((:traercontado = 'SI') AND (TERC_NIT IN (SELECT TERC_NIT FROM PUNTO_VENTA))))
        AND PEDI_FECHA <= :FECHA AND PEDI_FECHA+PEDI_VALIDEZ >= :FECHA AND PEDI_ANULADO = 'N' AND ((PEDI_SUCURSAL = :SUCURSAL) or (:SUCURSAL = 'Todas'))
        INTO :ID, :PREFIJO, :NUMERO, :FECDOC, :VALIDEZ, :SUCUR, :VEND DO
        BEGIN
        EXECUTE PROCEDURE TOTAL_DOC_VENTAS(TIPODOC, ID) returning_values (SUBTOTAL, IVA, CONSUMO);
        if (TIPODES <> 0) then
            BEGIN
            /* RECORRA LOS ITEMS PARA VER SI TODO ESTA USADO */
            FALTAT = 0;
            if (USADO = 'NO') then
                BEGIN
                if (EXISTS (SELECT CEFA_ID FROM consolide_faltantes WHERE CEFA_TIPOORI = 34 AND CEFA_IDORI = :ID AND CEFA_TIPODES <> :tipodes)) then
                    NUMROWS = 1;
--                SELECT COUNT(*) FROM consolide_faltantes WHERE CEFA_TIPOORI = 34 AND CEFA_IDORI = :ID AND CEFA_TIPODES <> :tipodes INTO :NUMROWS;
                END
            ELSE
                NUMROWS = 0;
            if (NUMROWS = 0) then
                BEGIN
                SUBTOTAL = 0;
                IVA = 0;
                CONSUMO = 0;
                FOR SELECT PEDE_ITEM, PEDE_CANT * PEDE_FACTOR, PEDE_TOTAL-PEDE_IVAMONTO-PEDE_CONSUMO, PEDE_IVAMONTO, PEDE_CONSUMO
                    FROM PEDIDOS_DETALLE WHERE PEDI_ID = :ID ORDER BY PEDE_ITEM INTO :ITEM, :ITECAN, :ITESUB, :ITEIVA, :ITECON
                    DO
                    BEGIN
                    EXECUTE procedure FALTANTE(TIPODOC, :TIPODES, :ID, :ITEM) returning_values (:FALTA, :UNIDAD, :FACTOR);
                    FALTAT = FALTAT + FALTA;
                    if (ITECAN <> 0) then
                        BEGIN
                        SUBTOTAL = SUBTOTAL + cast(cast((ITESUB/ITECAN) as double precision) * cast(FALTA * FACTOR as double precision) as numeric(18, 2));
                        IVA = IVA + cast(cast((ITEIVA/ITECAN) as double precision) * cast(FALTA * FACTOR as double precision) as numeric(18, 2));
                        CONSUMO = CONSUMO + cast(cast((ITECON/ITECAN) as double precision) * cast(FALTA * FACTOR as double precision) as numeric(18, 2));
                        END
                    END
                END
            if (FALTAT <> 0) then
                BEGIN
                TOTAL = SUBTOTAL + IVA + CONSUMO;
                SUSPEND;
                END
            END
        ELSE
            SUSPEND;
        END
    END
  if (TIPODOC = 35) then /* COTIZACION */
    BEGIN
    FOR SELECT COTI_ID, PREF_PRE, COTI_NUMERO, COTI_FECHA, COTI_VALIDEZ, COTI_SUCURSAL, VEND_COD
        FROM cotizaciones
        WHERE ((TERC_NIT = :NIT) OR ((:traercontado = 'SI') AND (TERC_NIT IN (SELECT TERC_NIT FROM PUNTO_VENTA))))
        AND COTI_FECHA <= :FECHA AND COTI_FECHA+COTI_VALIDEZ >= :FECHA AND COTI_ANULADO = 'N'
        AND ((COTI_SUCURSAL = :SUCURSAL) or (:SUCURSAL = 'Todas'))
        INTO :ID, :PREFIJO, :NUMERO, :FECDOC, :VALIDEZ, :SUCUR, :VEND DO
        BEGIN
        EXECUTE PROCEDURE TOTAL_DOC_VENTAS(TIPODOC, ID) returning_values (SUBTOTAL, IVA, CONSUMO);
        TOTAL = SUBTOTAL + IVA + CONSUMO;
        if (TIPODES <> 0) then
            BEGIN
            /* RECORRA LOS ITEMS PARA VER SI TODO ESTA USADO */
            FALTAT = 0;
            if (USADO = 'NO') then
                BEGIN
                if (EXISTS (SELECT CEFA_ID FROM consolide_faltantes WHERE CEFA_TIPOORI = 35 AND CEFA_IDORI = :ID AND CEFA_TIPODES <> :tipodes)) then
                    NUMROWS = 1;
--                SELECT COUNT(*) FROM consolide_faltantes WHERE CEFA_TIPOORI = 35 AND CEFA_IDORI = :ID AND CEFA_TIPODES <> :tipodes INTO :NUMROWS;
                END
            ELSE
                NUMROWS = 0;
            if (NUMROWS = 0) then
                FOR SELECT CTDE_ITEM FROM COTIZACIONES_DETALLE WHERE COTI_ID = :ID ORDER BY CTDE_ITEM INTO :ITEM DO
                    BEGIN
                    EXECUTE procedure FALTANTE(TIPODOC, :TIPODES, :ID, :ITEM) returning_values (:FALTA, :UNIDAD, :FACTOR);
                    FALTAT = FALTAT + FALTA;
                    END
            if (FALTAT <> 0) then
                SUSPEND;
            END
        ELSE
            SUSPEND;
        END
    END
if (TIPODOC = 40) then /* PENDIENTE */
    BEGIN
    FOR SELECT PEND_ID, PREF_PRE, PEND_NUMERO, PEND_FECHA, 0, PEND_SUCURSAL, VEND_COD
        FROM pendiente_ventas
        WHERE (TERC_NIT = :NIT) AND PEND_FECHA <= :FECHA AND PEND_ANULADO = 'N' AND ((PEND_SUCURSAL = :SUCURSAL) or (:SUCURSAL = 'Todas'))
        INTO :ID, :PREFIJO, :NUMERO, :FECDOC, :VALIDEZ, :SUCUR, :VEND DO
        BEGIN
        EXECUTE PROCEDURE TOTAL_DOC_VENTAS(TIPODOC, ID) returning_values (SUBTOTAL, IVA, CONSUMO);
        TOTAL = SUBTOTAL + IVA + CONSUMO;
        if (TIPODES <> 0) then
            BEGIN
            /* RECORRA LOS ITEMS PARA VER SI TODO ESTA USADO */
            FALTAT = 0;
            FOR SELECT pevd_item FROM pendiente_ventas_detalle WHERE PEND_ID = :ID ORDER BY PEVD_ITEM INTO :ITEM DO
                BEGIN
                EXECUTE procedure FALTANTE(TIPODOC, :TIPODES, :ID, :ITEM) returning_values (:FALTA, :UNIDAD, :FACTOR);
                FALTAT = FALTAT + FALTA;
                END
            if (FALTAT <> 0) then
                SUSPEND;
            END
        ELSE
            SUSPEND;
        END
    END
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE EXISTENCIAS_COMPRAS(
    ARTICULO VARCHAR(15),
    FECHA DATE,
    UNIDAD VARCHAR(8))
RETURNS (
    BODEGA VARCHAR(2),
    EXISTENCIA NUMERIC(18,2),
    RESERVADO NUMERIC(18,2),
    DISPONIBLE NUMERIC(18,2),
    ORDENADO NUMERIC(18,2),
    PROMEDIO NUMERIC(18,2),
    VENTAMES NUMERIC(18,2),
    VENTAANO NUMERIC(18,2),
    FECHACMP DATE,
    CANTCMP NUMERIC(18,2),
    DIAS INTEGER,
    SUGERIDO NUMERIC(18,2),
    STAND VARCHAR(20))
AS
declare variable factor numeric(15,4);
declare variable ordenc numeric(18,4);
declare variable pedido numeric(18,4);
declare variable item integer;
declare variable id integer;
declare variable und varchar(8);
declare variable cant numeric(18,4);
declare variable factor2 numeric(18,4);
declare variable fecini date;
declare variable fechaaux varchar(10);
declare variable agencia integer;
declare variable devmes numeric(18,2);
declare variable mfac integer;
declare variable mdev integer;
declare variable ivaf numeric(18,2);
declare variable ivad numeric(18,2);
declare variable dia_art varchar(2) character set none;
declare variable diasc varchar(255);
declare variable pedauto char(2);
declare variable salidas numeric(18,4);
declare variable fecrem date;
declare variable cantrem numeric(18,4);
declare variable DIASANO INTEGER;
declare variable BODINA CHAR(2);
begin
execute procedure lee_configuracion ('INVENTARIO', 'EXISTENCIAS', 'PROMEDIAR LAS SALIDAS DEL INVENTARIO CON EL NUMERO DE DIAS ASIGNADO A CADA ARTICULO') returning_values (:DIA_ART);
execute procedure lee_configuracion ('INVENTARIO', 'EXISTENCIAS', 'NUMERO DE DIAS PARA PROMEDIO DE SALIDAS POR ARTICULO') returning_values (DIASC);
execute procedure LEE_CONFIGURACION('FACTURACION', 'FACTURAS', 'GENERAR PEDIDO AUTOMATICAMENTE CON LA FACTURA') returning_values (pedauto);
EXECUTE PROCEDURE lee_configuracion ('INVENTARIO', 'EXISTENCIAS', 'MOSTRAR BODEGAS INACTIVAS EN CONSULTA DE EXISTENCIAS') returning_values (:BODINA);

for select bode_cod, SUCU_ID from bodega where ((bode_activa = 'S') or (:BODINA = 'SI')) order by bode_cod into :bodega, :agencia
    do
    begin
    execute procedure saldo_inventario (:articulo, :bodega, :fecha) returning_values (:Existencia);
    execute procedure FACTOR_UNIDAD_CANT(:ARTICULO, :UNIDAD) returning_values (:FACTOR);
    if (FACTOR <> 0) then
        EXISTENCIA = EXISTENCIA / FACTOR;
    else
        EXISTENCIA = 0;
    STAND = '';
    select STAND_COD from STANDS where ARTI_COD = :ARTICULO and STAND_BODEGA = :BODEGA into :stand;
    execute procedure salidas_ano_anterior (:ARTICULO, :FECHA, :BODEGA) returning_values (:ventaano);
    execute procedure promedio_salidas_articulo (:ARTICULO, :FECHA, :BODEGA) returning_values (:PROMEDIO, :SALIDAS);
    if (DIA_ART = 'NO') then
        begin
        DIAS = cast(DIASC as integer);
        end
    else
        select ARTI_DIAS from ARTICULO where ARTI_COD = :ARTICULO into :DIAS;
    if (DIAS is null) then
        DIAS = 0;
    PROMEDIO = DIAS * PROMEDIO;
    if (FACTOR <> 0) then
        PROMEDIO = PROMEDIO / FACTOR;
    SUGERIDO = PROMEDIO - EXISTENCIA;
    select sum(ORID_ENTREGAR)
      from ORDENINVENTARIO_DETALLE OD, ordenes_inventario O
      where O.ORIN_ID = OD.ORIN_ID and ARTI_COD = :ARTICULO and ORIN_FECHA <= :FECHA and ORIN_FECLLEGA >= :FECHA and ORID_ANULADO = 'N' and OD.BODE_COD = :BODEGA
      into :ORDENADO;
    if (ORDENADO is null) then
        ORDENADO = 0;
    ORDENC = 0;
    for select O.ORDC_ID, OCDE_ITEM, OCDE_CANT * OCDE_FACTOR
        from ORDENES_COMPRA O, ORDENES_COMPRA_DETALLE OD
        where O.ORDC_ID = OD.ORDC_ID and OD.ARTI_COD = :ARTICULO and (ORDC_FECHA+ORDC_VALIDEZ) >= :FECHA and ORDC_FECHA <= :FECHA and OCDE_ANULADO = 'N' and OD.BODE_COD = :BODEGA
        into :ID, :ITEM, :CANT
        do
        begin
        execute procedure FALTANTE(23, 21, ID, ITEM) returning_values (PEDIDO, UND, FACTOR2);
        if (PEDIDO * FACTOR2 = CANT) then /* SI NO SE HA FACTURADO MIRE A VER SI SE REMISIONO */
            execute procedure FALTANTE(23, 22, ID, ITEM) returning_values (PEDIDO, UND, FACTOR2);
        if (PEDIDO is null) then
            PEDIDO = 0;
        ORDENC = ORDENC + PEDIDO * FACTOR2;
        end
    ORDENADO = ORDENADO + ORDENC;
    if (FACTOR <> 0) then
        ORDENADO = ORDENADO / FACTOR;
    select sum(RSDE_LIBERAR)
      from RESERVAS_DETALLE RD, RESERVAS R
      where R.RESE_ID = RD.RESE_ID and ARTI_COD = :ARTICULO and RESE_FECHA <= :FECHA and RESE_VENCE >= :FECHA and RD.BODE_COD = :BODEGA and RSDE_ANULADO = 'N'
      into :RESERVADO;
    if (RESERVADO is null) then
        RESERVADO = 0;
    PEDIDO = 0;
    for select P.PEDI_ID, PEDE_ITEM, PEDE_CANT * PEDE_FACTOR
        from PEDIDOS P, PEDIDOS_DETALLE PD
        where P.PEDI_ID = PD.PEDI_ID and PD.ARTI_COD = :ARTICULO and (PEDI_FECHA+PEDI_VALIDEZ) >= :FECHA and PEDI_FECHA <= :FECHA and PEDE_ANULADO = 'N' and BODE_COD = :BODEGA
        into :ID, :ITEM, :CANT
        do
        begin
        execute procedure FALTANTE(34, 31, ID, ITEM) returning_values (ORDENC, UND, FACTOR2);
        if ((ORDENC * FACTOR2 = CANT) or (PEDAUTO = 'SI')) then /* SI NO SE HA FACTURADO MIRE A VER SI SE REMISIONO */
            execute procedure FALTANTE(34, 32, ID, ITEM) returning_values (ORDENC, UND, FACTOR2);
        if (ORDENC is null) then
            ORDENC = 0;
        PEDIDO = PEDIDO + ORDENC * FACTOR2;
        end
    RESERVADO = RESERVADO + PEDIDO;
    if (FACTOR <> 0) then
        RESERVADO = RESERVADO / FACTOR;
    DISPONIBLE = EXISTENCIA - RESERVADO;
    /* VENTAS MES */
    FECHAAUX = cast (FECHA as varchar(10));
    FECHAAUX = SUBSTR(FECHAAUX, 1, 7) || '/01';
    FECINI = cast (FECHAAUX as date);
    execute procedure ventas_articulo (:ARTICULO, :FECINI, :FECHA, :agencia, :bodega ) returning_values (:ventames, :mfac, :devmes, :mdev, :ivaf, :ivad);
    ventames = ventames - devmes;
    if (FACTOR <> 0) then
        ventames = ventames / FACTOR;
    /* FECHA COMPRA */
    fechacmp = null;
    cantcmp = 0;
    select first 1 FACO_FECHA, FCDE_CANT * FCDE_FACTOR from FACTURAS_COMPRA F, FACTURAS_COMPRAS_DETALLE D
        where F.FACO_ID = D.faco_id and D.ARTI_COD = :articulo and FACO_FECHA <= :FECHA and D.bode_cod = :BODEGA
        order by FACO_FECHA desc, F.FACO_ID desc
        into :fechacmp, :cantcmp;
    select first 1 REPR_FECHA, RPVD_CANT * RPVD_FACTOR from remision_proveedor F, remision_proveedor_det D
        where F.repr_id = D.repr_id and D.ARTI_COD = :articulo and REPR_FECHA <= :FECHA and D.bode_cod = :BODEGA
        order by REPR_FECHA desc, F.repr_id desc
        into :fecrem, :cantrem;
    if ((FECREM is not null) and (FECREM > fechacmp)) then
        begin
        fechacmp = FECREM;
        cantcmp = cantrem;
        end
    suspend;
    end
end
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE EXISTENCIAS_DESDE_HASTA(
    FECHA DATE,
    ARTINI VARCHAR(20),
    ARTFIN VARCHAR(20),
    GRPINI VARCHAR(3),
    GRPFIN VARCHAR(3),
    BODINI VARCHAR(2),
    BODFIN VARCHAR(2),
    ORDEN CHAR(1),
    AGRUPA CHAR(1),
    DETALLE CHAR(1),
    RESERVA CHAR(1),
    ENPESO CHAR(1),
    MASIVA CHAR(1),
    INACTIVOS CHAR(1),
    SUCURSAL INTEGER)
RETURNS (
    CANT NUMERIC(18,2),
    COSTO NUMERIC(18,2),
    COSTO_LOTE NUMERIC(18,2),
    CODIGO VARCHAR(15),
    NOMBRE VARCHAR(60),
    DESCORTA VARCHAR(30),
    UNIDAD VARCHAR(8),
    STAND VARCHAR(20),
    CODGRUPO VARCHAR(2),
    NOMGRUPO VARCHAR(30),
    CODSUBG VARCHAR(3),
    NOMSUBG VARCHAR(30),
    CODMARC VARCHAR(3),
    NOMMARC VARCHAR(30),
    INVIMA VARCHAR(20),
    CODBOD VARCHAR(2),
    LOTE VARCHAR(15),
    LOTEV DATE,
    NOMBOD VARCHAR(30),
    COSTOTOT NUMERIC(18,2),
    COSTOIVA NUMERIC(18,2),
    ULTCOSTO NUMERIC(18,2),
    FECHACOSTO DATE,
    CONSUMO NUMERIC(18,2),
    RESERVADO NUMERIC(18,4),
    ORDENADO NUMERIC(18,4),
    IVA NUMERIC(9,2),
    IVAMONTO NUMERIC(18,2),
    PESOUNIT NUMERIC(18,4),
    PESOTOTAL NUMERIC(18,4),
    PRECIO NUMERIC(18,2),
    CODBAR VARCHAR(20))
AS
declare variable exist char(1);
declare variable codini varchar(20);
declare variable codfin varchar(20);
declare variable desini varchar(20);
declare variable desfin varchar(20);
declare variable ordenc numeric(18,4);
declare variable pedido numeric(18,4);
declare variable ok char(1);
declare variable id integer;
declare variable item integer;
declare variable und varchar(8);
declare variable factor numeric(18,4);
declare variable cant2 numeric(18,4);
declare variable PEDAUTO CHAR(2);
DECLARE VARIABLE LISTA INTEGER;
declare variable FACCOST NUMERIC(18,4);
BEGIN
EXECUTE PROCEDURE lee_configuracion ('FACTURACION','FACTURAS', 'CODIGO DE LA LISTA DE PRECIOS A MOSTRAR EN ARTICULOS') returning_values (:LISTA);
if (ORDEN = 'C') then
    BEGIN
    CODINI = ARTINI;
    CODFIN = ARTFIN;
    DESINI = '';
    DESFIN = 'zz';
    END
ELSE
    BEGIN
    DESINI = ARTINI;
    DESFIN = ARTFIN;
    CODINI = '';
    CODFIN = 'zz';
    END
EXECUTE PROCEDURE LEE_CONFIGURACION('FACTURACION', 'FACTURAS', 'GENERAR PEDIDO AUTOMATICAMENTE CON LA FACTURA') returning_values (pedauto);
if ((DETALLE = 'B') or (DETALLE = 'L')) then
  BEGIN
  FOR SELECT ARTI_COD, ARTI_DES, ARTI_DESCORTA, ARTI_UNIDAD, ARTI_EXIST, TAIV_PORC, A.GRUP_COD, A.SUBG_COD, A.MARC_COD, BODE_COD, BODE_NOM, ARTI_CONSUMO, ARTI_PESO/1000, ARTI_INVIMA
      FROM ARTICULO A, BODEGA B, TARIFA_IVA T
      WHERE ARTI_COD >= :CODINI AND ARTI_COD <= :CODFIN AND ARTI_DES >= :DESINI AND ARTI_DES <= :DESFIN AND ((ESAR_COD <> 'I') or (:INACTIVOS = 'S')) AND BODE_COD >= :BODINI AND
      BODE_COD <= :BODFIN AND ((SUCU_ID = :SUCURSAL) or (:SUCURSAL = 0)) AND A.TAIV_COD = T.TAIV_COD
      INTO :CODIGO, :NOMBRE, :DESCORTA, :UNIDAD, :EXIST, :IVA, :CODGRUPO, :CODSUBG, :CODMARC, :CODBOD, :NOMBOD, :CONSUMO, :pesounit, :invima
      DO
        BEGIN
        STAND = '';
        OK = 'N';
        if (AGRUPA = 'G') then
            BEGIN
            if ((CODGRUPO >= GRPINI) AND (CODGRUPO <= GRPFIN)) then
                OK = 'S';
            end
        ELSE
            if (AGRUPA = 'M') then
                BEGIN
                if ((CODMARC >= GRPINI) AND (CODMARC <= GRPFIN)) then
                    OK = 'S';
                END
        if (OK = 'S') then
            BEGIN
            NOMGRUPO = '';
            NOMMARC = '';
            NOMSUBG = '';
            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;
            CODBAR = NULL;
            SELECT FIRST 1 COBA_COD FROM BARRAS_ARTICULO
                WHERE ARTI_COD = :codigo AND COBA_UNIDAD = :unidad ORDER BY STRLEN(COBA_COD) INTO :codbar;
            if (CODBAR IS NULL) then
                CODBAR = CODIGO;
            if (EXIST <> 'N') then
                BEGIN
                SELECT STAND_COD FROM STANDS WHERE ARTI_COD = :CODIGO AND STAND_BODEGA = :CODBOD INTO :STAND;
                EXECUTE PROCEDURE costo_promedio_y_ultimo_unidad(CODIGO, FECHA-1, UNIDAD) returning_values (COSTO, ULTCOSTO);
                /* EL FACTOR */
                FACCOST = 1;
                SELECT FIRST 1 FAIN_FACTOR FROM factor_inventario WHERE FAIN_FECINI <= :FECHA AND FAIN_FECFIN >= :FECHA INTO :FACCOST;
                ULTCOSTO = ULTCOSTO * FACCOST;
                COSTO = COSTO * FACCOST;

                SELECT FIRST 1 MVAR_FECHA FROM MOVIMIENTO_ARTICULO WHERE ARTI_COD = :CODIGO AND MVAR_ENTRADA = 'S' AND MVAR_FECHA <= :FECHA
                    ORDER BY ARTI_COD DESC, MVAR_FECHA DESC INTO :FECHACOSTO;
                
                if (CONSUMO <> 0) then
                    EXECUTE PROCEDURE CONSUMO_HISTORICO (:CODIGO, :fecha) returning_values (:CONSUMO);
                if (RESERVA = 'S') then
                    BEGIN
                    SELECT SUM(ORID_ENTREGAR)
                        FROM ORDENINVENTARIO_DETALLE OD, ordenes_inventario O
                        WHERE O.ORIN_ID = OD.ORIN_ID AND ARTI_COD = :CODIGO AND ORIN_FECHA <= :FECHA AND ORIN_FECLLEGA >= :FECHA AND ORID_ANULADO = 'N' AND OD.BODE_COD = :CODBOD
                        INTO :ORDENADO;
                    if (ORDENADO IS NULL) then
                        ORDENADO = 0;
                    ORDENC = 0;
                    FOR SELECT O.ORDC_ID, OCDE_ITEM, OCDE_CANT * OCDE_FACTOR
                        FROM ORDENES_COMPRA O, ORDENES_COMPRA_DETALLE OD
                        WHERE O.ORDC_ID = OD.ORDC_ID AND OD.ARTI_COD = :CODIGO AND ORDC_VENCE >= :FECHA AND ORDC_FECHA <= :FECHA AND OCDE_ANULADO = 'N' AND OD.BODE_COD = :CODBOD
                        INTO :ID, :ITEM, :CANT2
                        do
                        BEGIN
                        EXECUTE PROCEDURE FALTANTE(23, 21, ID, ITEM) returning_values (PEDIDO, UND, FACTOR);
                        if (PEDIDO * FACTOR = CANT2) then /* SI NO SE HA FACTURADO MIRE A VER SI SE REMISIONO */
                            EXECUTE PROCEDURE FALTANTE(23, 22, ID, ITEM) returning_values (PEDIDO, UND, FACTOR);
                        if (PEDIDO IS NULL) then
                            PEDIDO = 0;
                        ORDENC = ORDENC + PEDIDO * FACTOR;
                        END
                    ORDENADO = ORDENADO + ORDENC;
                    SELECT SUM(RSDE_LIBERAR)
                        FROM RESERVAS_DETALLE RD, RESERVAS R
                        WHERE R.RESE_ID = RD.RESE_ID AND ARTI_COD = :CODIGO AND RESE_FECHA <= :FECHA AND RESE_VENCE >= :FECHA AND RD.BODE_COD = :CODBOD AND RSDE_ANULADO = 'N'
                        INTO :RESERVADO;
                    if (RESERVADO IS NULL) then
                        RESERVADO = 0;
                    PEDIDO = 0;
                    FOR SELECT P.PEDI_ID, PEDE_ITEM, PEDE_CANT * PEDE_FACTOR
                        FROM PEDIDOS P, PEDIDOS_DETALLE PD
                        WHERE P.PEDI_ID = PD.PEDI_ID AND PD.ARTI_COD = :CODIGO AND PEDI_VENCE >= :FECHA AND PEDI_FECHA <= :FECHA AND PEDE_ANULADO = 'N' AND BODE_COD = :CODBOD
                        INTO :ID, :ITEM, :CANT2
                        do
                        BEGIN
                        EXECUTE PROCEDURE FALTANTE(34, 31, ID, ITEM) returning_values (ORDENC, UND, FACTOR);
                        if ((ORDENC * FACTOR = CANT2) or (PEDAUTO = 'SI')) then /* SI NO SE HA FACTURADO MIRE A VER SI SE REMISIONO */
                            EXECUTE PROCEDURE FALTANTE(34, 32, ID, ITEM) returning_values (ORDENC, UND, FACTOR);
                        if (ORDENC IS NULL) then
                            ORDENC = 0;
                        PEDIDO = PEDIDO + ORDENC * FACTOR;
                        END
                    RESERVADO = RESERVADO + PEDIDO;
                    END
                ELSE
                    BEGIN
                    RESERVADO = 0;
                    ORDENADO = 0;
                    END
                if (LISTA > 0) then
                    SELECT prar_fijo FROM precios_articulo WHERE arti_cod = :CODIGO and lipr_cod = :LISTA INTO :PRECIO;
                if ((DETALLE = 'L') AND (EXIST = 'L')) then
                    BEGIN
                    FOR SELECT L.lote_nro, L.lote_nro||' - '||L.lote_vence, l.lote_costo, LOTE_VENCE
                        FROM LOTES L WHERE ARTI_COD = :codigo AND BODE_COD = :codbod
                        INTO :LOTE, :NOMBOD, :costo_lote, :lotev
                        DO
                        BEGIN
                        if (CONSUMO <> 0) then
                            EXECUTE PROCEDURE CONSUMO_HISTORICO (:CODIGO, :fecha) returning_values (:CONSUMO);
                        execute procedure saldo_lote_fecha(:codigo, :codbod,  :lote,  :fecha-1) returning_values (:cant);
                        if (cant <> 0) then
                            begin
                            COSTOTOT = :CANT * :COSTO;
                            IVAMONTO = COSTOTOT /100 * IVA;
                            COSTOIVA = COSTOTOT;
                            if (MASIVA = 'S') then
                                BEGIN
                                COSTOIVA = COSTOTOT + IVAMONTO;
                                COSTO = COSTO * (100 + :IVA) / 100 + :CONSUMO;
                                END
                            CONSUMO = CONSUMO * CANT;
                            COSTOIVA = COSTOIVA + CONSUMO;
                            if (ENPESO = 'S') then
                                BEGIN
                                if (pesounit IS NULL) then
                                    pesounit = 0;
                                if (PESOUNIT <> 0) then
                                    BEGIN
                                    pesototal = PESOUNIT * cant;
                                    SUSPEND;
                                    END
                                END
                            ELSE
                                SUSPEND;
                            end
                        END
                    END
                else
                    BEGIN
                    EXECUTE PROCEDURE SALDO_INICIAL_INVENTARIO(CODIGO, FECHA, :CODBOD) returning_values (CANT);
                    COSTOTOT = :CANT * :COSTO;
                    IVAMONTO = COSTOTOT /100 * IVA;
                    COSTOIVA = COSTOTOT;
                    if (MASIVA = 'S') then
                        BEGIN
                        COSTOIVA = COSTOTOT + IVAMONTO;
                        COSTO = COSTO * (100 + :IVA) / 100 + :CONSUMO;
                        END
                    CONSUMO = CONSUMO * CANT;
                    COSTOIVA = COSTOIVA + CONSUMO;
                    if (ENPESO = 'S') then
                        BEGIN
                        if (pesounit IS NULL) then
                            pesounit = 0;
                        if (PESOUNIT <> 0) then
                            BEGIN
                            pesototal = PESOUNIT * cant;
                            SUSPEND;
                            END
                        END
                    ELSE
                        SUSPEND;
                    END
                END
            END
        END
  END

if (DETALLE = 'N') then
  BEGIN
  FOR SELECT ARTI_COD, ARTI_DES, ARTI_DESCORTA, ARTI_UNIDAD, ARTI_EXIST, TAIV_PORC, A.GRUP_COD, A.SUBG_COD, A.MARC_COD, ARTI_CONSUMO, ARTI_PESO/1000, ARTI_INVIMA
      FROM ARTICULO A, TARIFA_IVA T
      WHERE ARTI_COD >= :CODINI AND ARTI_COD <= :CODFIN AND ARTI_DES >= :DESINI AND ARTI_DES <= :DESFIN AND ((ESAR_COD <> 'I') or (:INACTIVOS = 'S')) AND A.TAIV_COD = T.TAIV_COD
      INTO :CODIGO, :NOMBRE, :DESCORTA, UNIDAD, :EXIST, :IVA, :CODGRUPO, :CODSUBG, :CODMARC, :CONSUMO, :pesounit, :invima
      DO
        BEGIN
        OK = 'N';
        if (AGRUPA = 'G') then
            BEGIN
            if ((GRPINI = '0') AND (GRPFIN = 'zz')) then
                OK = 'S';
            else
                if ((CODGRUPO >= GRPINI) AND (CODGRUPO <= GRPFIN)) then
                    OK = 'S';
            end
        ELSE
            if (AGRUPA = 'M') then
                BEGIN
                if ((GRPINI = '0') AND (GRPFIN = 'zzz')) then
                    OK = 'S';
                else
                    if ((CODMARC >= GRPINI) AND (CODMARC <= GRPFIN)) then
                        OK = 'S';
                END
        if (OK = 'S') then
            BEGIN
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            CODBAR = NULL;
            SELECT MAX(COBA_COD) FROM BARRAS_ARTICULO WHERE ARTI_COD = :codigo AND COBA_UNIDAD = :unidad INTO :codbar;
            if (CODBAR IS NULL) then
                CODBAR = CODIGO;

            if (EXIST <> 'N') then
                BEGIN
                EXECUTE PROCEDURE SALDO_INICIAL_TOTAL_INV(CODIGO, FECHA) returning_values (CANT);
                EXECUTE PROCEDURE costo_promedio_y_ultimo_unidad(CODIGO, FECHA-1, UNIDAD) returning_values (COSTO, ULTCOSTO);
                /* EL FACTOR */
                FACCOST = 1;
                SELECT FIRST 1 FAIN_FACTOR FROM factor_inventario WHERE FAIN_FECINI <= :FECHA AND FAIN_FECFIN >= :FECHA INTO :FACCOST;
                ULTCOSTO = ULTCOSTO * FACCOST;
                COSTO = COSTO * FACCOST;

                SELECT FIRST 1 MVAR_FECHA FROM MOVIMIENTO_ARTICULO WHERE ARTI_COD = :CODIGO AND MVAR_ENTRADA = 'S' AND MVAR_FECHA <= :FECHA
                    ORDER BY ARTI_COD DESC, MVAR_FECHA DESC INTO :FECHACOSTO;
                COSTOTOT = :CANT * :COSTO;
                IVAMONTO = COSTOTOT /100 * IVA;
                COSTOIVA = COSTOTOT;
                if (CONSUMO <> 0) then
                    EXECUTE PROCEDURE CONSUMO_HISTORICO (:CODIGO, :fecha) returning_values (:CONSUMO);
                if (MASIVA = 'S') then
                    BEGIN
                    COSTOIVA = COSTOTOT + IVAMONTO;
                    COSTO = COSTO * (100 + :IVA) / 100 + :CONSUMO;
                    END
                CONSUMO = CONSUMO * CANT;
                COSTOIVA = COSTOIVA + CONSUMO;
                if (RESERVA = 'S') then
                    BEGIN
                    SELECT SUM(ORID_ENTREGAR)
                        FROM ORDENINVENTARIO_DETALLE OD, ordenes_inventario O
                        WHERE O.ORIN_ID = OD.ORIN_ID AND ARTI_COD = :CODIGO AND ORIN_FECHA <= :FECHA AND ORIN_FECLLEGA >= :FECHA AND ORID_ANULADO = 'N'
                        INTO :ORDENADO;
                        if (ORDENADO IS NULL) then
                            ORDENADO = 0;
                    ORDENC = 0;
                    FOR SELECT O.ORDC_ID, OCDE_ITEM, OCDE_CANT * OCDE_FACTOR
                        FROM ORDENES_COMPRA O, ORDENES_COMPRA_DETALLE OD
                        WHERE O.ORDC_ID = OD.ORDC_ID AND OD.ARTI_COD = :CODIGO AND ORDC_VENCE >= :FECHA AND ORDC_FECHA <= :FECHA AND OCDE_ANULADO = 'N'
                        INTO :ID, :ITEM, :CANT2
                        do
                        BEGIN
                        EXECUTE PROCEDURE FALTANTE(23, 21, ID, ITEM) returning_values (PEDIDO, UND, FACTOR);
                        if (PEDIDO * FACTOR = CANT2) then /* SI NO SE HA FACTURADO MIRE A VER SI SE REMISIONO */
                            EXECUTE PROCEDURE FALTANTE(23, 22, ID, ITEM) returning_values (PEDIDO, UND, FACTOR);
                        if (PEDIDO IS NULL) then
                            PEDIDO = 0;
                        ORDENC = ORDENC + PEDIDO * FACTOR;
                        END
                    ORDENADO = ORDENADO + ORDENC;
                    SELECT SUM(RSDE_LIBERAR)
                        FROM RESERVAS_DETALLE RD, RESERVAS R
                        WHERE R.RESE_ID = RD.RESE_ID AND ARTI_COD = :CODIGO AND RESE_FECHA <= :FECHA AND RESE_VENCE >= :FECHA AND RSDE_ANULADO = 'N'
                        INTO :RESERVADO;
                    if (RESERVADO IS NULL) then
                        RESERVADO = 0;
                    PEDIDO = 0;
                    FOR SELECT P.PEDI_ID, PEDE_ITEM, PEDE_CANT * PEDE_FACTOR
                        FROM PEDIDOS P, PEDIDOS_DETALLE PD, PUNTO_VENTA PT
                        WHERE P.PEDI_ID = PD.PEDI_ID AND PD.ARTI_COD = :CODIGO AND PT.ptvt_id = P.PTVT_ID AND PEDI_VENCE >= :FECHA AND PEDI_FECHA <= :FECHA AND PEDE_ANULADO = 'N'
                        INTO :ID, :ITEM, :CANT2
                        do
                        BEGIN
                        EXECUTE PROCEDURE FALTANTE(34, 31, ID, ITEM) returning_values (ORDENC, UND, FACTOR);
                        if ((ORDENC * FACTOR = CANT2) or (PEDAUTO = 'SI')) then /* SI NO SE HA FACTURADO MIRE A VER SI SE REMISIONO */
                            EXECUTE PROCEDURE FALTANTE(34, 32, ID, ITEM) returning_values (ORDENC, UND, FACTOR);
                        if (ORDENC IS NULL) then
                            ORDENC = 0;
                        PEDIDO = PEDIDO + ORDENC * FACTOR;
                        END
                    if (PEDIDO IS NULL) then
                        PEDIDO = 0;
                    RESERVADO = RESERVADO + PEDIDO;
                    END
                ELSE
                    BEGIN
                    RESERVADO = 0;
                    ORDENADO = 0;
                    END
                if (LISTA > 0) then
                    SELECT prar_fijo FROM precios_articulo WHERE arti_cod = :CODIGO and lipr_cod = :LISTA INTO :PRECIO;

                if (ENPESO = 'S') then
                    BEGIN
                    if (pesounit IS NULL) then
                        pesounit = 0;
                    if (PESOUNIT <> 0) then
                        BEGIN
                        pesototal = PESOUNIT * cant;
                        SUSPEND;
                        END
                    END
                ELSE
                    SUSPEND;
                END
            END
        END
  END
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE EXISTENCIAS_UNIDAD(
    ARTICULO VARCHAR(15),
    FECHA DATE,
    UNIDAD VARCHAR(8))
RETURNS (
    BODEGA VARCHAR(2),
    EXISTENCIA NUMERIC(18,2),
    RESERVADO NUMERIC(18,2),
    DISPONIBLE NUMERIC(18,2),
    ORDENADO NUMERIC(18,2),
    STAND VARCHAR(20))
AS
declare variable FACTOR NUMERIC(15,4);
declare variable ORDENC NUMERIC(18,4);
declare variable PEDIDO NUMERIC(18,4);
declare variable ITEM INTEGER;
declare variable ID INTEGER;
declare variable UND VARCHAR(8);
declare variable CANT NUMERIC(18,4);
declare variable factor2 NUMERIC(18,4);
declare variable PEDAUTO CHAR(2);
declare variable BODINA CHAR(2);
BEGIN
EXECUTE PROCEDURE FACTOR_UNIDAD_CANT(:ARTICULO, :UNIDAD) returning_values (:FACTOR);
EXECUTE PROCEDURE lee_configuracion ('INVENTARIO', 'EXISTENCIAS', 'MOSTRAR BODEGAS INACTIVAS EN CONSULTA DE EXISTENCIAS') returning_values (:BODINA);
for select bode_cod from bodega where ((bode_activa = 'S') or (:BODINA = 'SI')) order by bode_cod into :bodega
    do
    begin
    SELECT STAND_COD FROM STANDS WHERE ARTI_COD = :ARTICULO AND STAND_BODEGA = :BODEGA INTO :stand;
    execute procedure saldo_inventario (:articulo, :bodega, :fecha) returning_values (:Existencia);
    if (FACTOR <> 0) then
        EXISTENCIA = EXISTENCIA / FACTOR;
    else
        EXISTENCIA = 0;
    /* LO ORDENADO */
    SELECT SUM(ORID_ENTREGAR)
      FROM ORDENINVENTARIO_DETALLE OD, ordenes_inventario O
      WHERE O.ORIN_ID = OD.ORIN_ID AND ARTI_COD = :ARTICULO AND ORIN_FECHA <= :FECHA AND ORIN_FECLLEGA >= :FECHA AND ORID_ANULADO = 'N' AND OD.BODE_COD = :BODEGA
      INTO :ORDENADO;
    if (ORDENADO IS NULL) then
        ORDENADO = 0;
    ORDENC = 0;
    FOR SELECT O.ORDC_ID, OCDE_ITEM, OCDE_CANT * OCDE_FACTOR
        FROM ORDENES_COMPRA O, ORDENES_COMPRA_DETALLE OD
        WHERE O.ORDC_ID = OD.ORDC_ID AND OD.ARTI_COD = :ARTICULO AND (ORDC_FECHA+ORDC_VALIDEZ) >= :FECHA AND ORDC_FECHA <= :FECHA AND OCDE_ANULADO = 'N' AND OD.BODE_COD = :BODEGA
        INTO :ID, :ITEM, :CANT
        do
        BEGIN
        EXECUTE PROCEDURE FALTANTE(23, 21, ID, ITEM) returning_values (PEDIDO, UND, FACTOR2);
        if (PEDIDO * FACTOR2 = CANT) then /* SI NO SE HA FACTURADO MIRE A VER SI SE REMISIONO */
            EXECUTE PROCEDURE FALTANTE(23, 22, ID, ITEM) returning_values (PEDIDO, UND, FACTOR2);
        if (PEDIDO IS NULL) then
            PEDIDO = 0;
        ORDENC = ORDENC + PEDIDO * FACTOR2;
        END
    ORDENADO = ORDENADO + ORDENC;
    if (FACTOR <> 0) then
        ORDENADO = ORDENADO / FACTOR;
    /* LO RESERVADO */
    SELECT SUM(RSDE_LIBERAR)
      FROM RESERVAS_DETALLE RD, RESERVAS R
      WHERE R.RESE_ID = RD.RESE_ID AND ARTI_COD = :ARTICULO AND RESE_FECHA <= :FECHA AND RESE_VENCE >= :FECHA AND RD.BODE_COD = :BODEGA AND RSDE_ANULADO = 'N'
      INTO :RESERVADO;
    if (RESERVADO IS NULL) then
        RESERVADO = 0;
    PEDIDO = 0;
    FOR SELECT P.PEDI_ID, PEDE_ITEM, PEDE_CANT * PEDE_FACTOR
        FROM PEDIDOS P, PEDIDOS_DETALLE PD
        WHERE P.PEDI_ID = PD.PEDI_ID AND PD.ARTI_COD = :ARTICULO AND (PEDI_FECHA+PEDI_VALIDEZ) >= :FECHA AND PEDI_FECHA <= :FECHA AND PEDE_ANULADO = 'N' AND BODE_COD = :BODEGA
        INTO :ID, :ITEM, :CANT
        do
        BEGIN
        EXECUTE PROCEDURE FALTANTE(34, 31, ID, ITEM) returning_values (ORDENC, UND, FACTOR2);
        EXECUTE PROCEDURE LEE_CONFIGURACION('FACTURACION', 'FACTURAS', 'GENERAR PEDIDO AUTOMATICAMENTE CON LA FACTURA') returning_values (pedauto);
        if ((ORDENC * FACTOR2 = CANT) or (PEDAUTO = 'SI')) then /* SI NO SE HA FACTURADO MIRE A VER SI SE REMISIONO */
            EXECUTE PROCEDURE FALTANTE(34, 32, ID, ITEM) returning_values (ORDENC, UND, FACTOR2);
        if (ORDENC IS NULL) then
            ORDENC = 0;
        PEDIDO = PEDIDO + ORDENC * FACTOR2;
        END
    RESERVADO = RESERVADO + PEDIDO;
    if (FACTOR <> 0) then
        RESERVADO = RESERVADO / FACTOR;
    DISPONIBLE = EXISTENCIA - RESERVADO;
    SUSPEND;
    end
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE EXISTENCIAS_WEB(
    ARTICULO VARCHAR(15),
    FECHA DATE)
RETURNS (
    BODEGA VARCHAR(2),
    EXISTENCIA NUMERIC(18,2),
    RESERVADO NUMERIC(18,2),
    DISPONIBLE NUMERIC(18,2),
    ORDENADO NUMERIC(18,2))
AS
declare variable ordenc numeric(18,4);
declare variable pedido numeric(18,4);
declare variable item integer;
declare variable id integer;
declare variable und varchar(8);
declare variable cant numeric(18,4);
declare variable factor2 numeric(18,4);
begin
for select bode_cod from bodega order by bode_cod into :bodega
    do
    begin
    execute procedure saldo_inventario (:articulo, :bodega, :fecha) returning_values (:Existencia);
    select sum(ORID_ENTREGAR)
      from ORDENINVENTARIO_DETALLE OD, ordenes_inventario O
      where O.ORIN_ID = OD.ORIN_ID and ARTI_COD = :ARTICULO and ORIN_FECHA <= :FECHA and ORIN_FECLLEGA >= :FECHA and ORID_ANULADO = 'N' and OD.BODE_COD = :BODEGA
      into :ORDENADO;
    if (ORDENADO is null) then
        ORDENADO = 0;
    ORDENC = 0;
    for select O.ORDC_ID, OCDE_ITEM, OCDE_CANT * OCDE_FACTOR
        from ORDENES_COMPRA O, ORDENES_COMPRA_DETALLE OD
        where O.ORDC_ID = OD.ORDC_ID and OD.ARTI_COD = :ARTICULO and (ORDC_FECHA+ORDC_VALIDEZ) >= :FECHA and ORDC_FECHA <= :FECHA and OCDE_ANULADO = 'N' and OD.BODE_COD = :BODEGA
        into :ID, :ITEM, :CANT
        do
        begin
        execute procedure FALTANTE(23, 21, ID, ITEM) returning_values (PEDIDO, UND, FACTOR2);
        if (PEDIDO * FACTOR2 = CANT) then /* SI NO SE HA FACTURADO MIRE A VER SI SE REMISIONO */
            execute procedure FALTANTE(23, 22, ID, ITEM) returning_values (PEDIDO, UND, FACTOR2);
        if (PEDIDO is null) then
            PEDIDO = 0;
        ORDENC = ORDENC + PEDIDO * FACTOR2;
        end
    ORDENADO = ORDENADO + ORDENC;
    select sum(RSDE_LIBERAR)
      from RESERVAS_DETALLE RD, RESERVAS R
      where R.RESE_ID = RD.RESE_ID and ARTI_COD = :ARTICULO and RESE_FECHA <= :FECHA and RESE_VENCE >= :FECHA and RD.BODE_COD = :BODEGA and RSDE_ANULADO = 'N'
      into :RESERVADO;
    if (RESERVADO is null) then
        RESERVADO = 0;
    PEDIDO = 0;
    for select P.PEDI_ID, PEDE_ITEM, PEDE_CANT * PEDE_FACTOR
        from PEDIDOS P, PEDIDOS_DETALLE PD
        where P.PEDI_ID = PD.PEDI_ID and PD.ARTI_COD = :ARTICULO and (PEDI_FECHA+PEDI_VALIDEZ) >= :FECHA and PEDI_FECHA <= :FECHA and PEDE_ANULADO = 'N' and BODE_COD = :BODEGA
        into :ID, :ITEM, :CANT
        do
        begin
        execute procedure FALTANTE(34, 31, ID, ITEM) returning_values (ORDENC, UND, FACTOR2);
        if (ORDENC * FACTOR2 = CANT) then /* SI NO SE HA FACTURADO MIRE A VER SI SE REMISIONO */
            execute procedure FALTANTE(34, 32, ID, ITEM) returning_values (ORDENC, UND, FACTOR2);
        if (ORDENC is null) then
            ORDENC = 0;
        PEDIDO = PEDIDO + ORDENC * FACTOR2;
        end
    RESERVADO = RESERVADO + PEDIDO;
    DISPONIBLE = EXISTENCIA - RESERVADO;
    suspend;
    end
end
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE FALTANTES_VENTAS_ARTICULO(
    DESDE VARCHAR(20),
    HASTA VARCHAR(20),
    FECINI DATE,
    FECFIN DATE,
    DETALLE CHAR(1),
    TIPO INTEGER,
    DESTINO INTEGER,
    ORDEN CHAR(1),
    CEROS CHAR(1),
    CORTE DATE,
    SUCURSAL INTEGER)
RETURNS (
    ARTICULO VARCHAR(15),
    DESCRIPCION VARCHAR(60),
    CODGRUPO VARCHAR(2),
    NOMGRUPO VARCHAR(30),
    CODSUBG VARCHAR(3),
    NOMSUBG VARCHAR(30),
    CODMARC VARCHAR(3),
    NOMMARC VARCHAR(30),
    CANTIDAD NUMERIC(18,4),
    UNIDAD VARCHAR(8),
    FALTANTE NUMERIC(18,4),
    BASE NUMERIC(18,2),
    COSTOUN NUMERIC(18,2),
    COSTOTOT NUMERIC(18,2),
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(8),
    FECHA DATE,
    PTVTA INTEGER,
    NIT VARCHAR(20),
    NOMCLIENTE VARCHAR(60),
    CIUDAD VARCHAR(60),
    OBS VARCHAR(255),
    BOD VARCHAR(2))
AS
declare variable ID INTEGER;
declare variable ITEM INTEGER;
declare variable CANT NUMERIC(18,2);
declare variable CODINI VARCHAR(15);
declare variable CODFIN VARCHAR(15);
declare variable DESINI VARCHAR(15);
declare variable DESFIN VARCHAR(15);
declare variable MONTO NUMERIC(18,2);
declare variable FACTOR NUMERIC(18,4);
BEGIN
if (ORDEN = 'C') then
    BEGIN
    CODINI = DESDE;
    CODFIN = HASTA;
    DESINI = '';
    DESFIN = 'zz';
    END
ELSE
    BEGIN
    DESINI = DESDE;
    DESFIN = HASTA;
    CODINI = '';
    CODFIN = 'zz';
    END
  FOR SELECT ARTI_COD, ARTI_DES, ARTI_UNIDAD, A.GRUP_COD, A.SUBG_COD, A.MARC_COD FROM ARTICULO A
      WHERE ARTI_COD >= :CODINI AND ARTI_COD <= :CODFIN AND ARTI_DES >= :DESINI AND ARTI_DES <= :DESFIN
      INTO :ARTICULO, :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
  DO
    BEGIN
    CANTIDAD = 0;
    faltante = 0;
    base = 0;
    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 (DETALLE = 'N') then
        BEGIN
        if (TIPO = 31) then
            BEGIN
            FOR SELECT F.FACT_ID, FADE_ITEM, FADE_CANT * FADE_FACTOR, (FADE_PRUNIT-FADE_DTOMONTO), D.BODE_COD, F.ptvt_id
                FROM FACTURAS_DETALLE D, FACTURAS F, PREFIJOS P
                WHERE F.FACT_ID = D.FACT_ID AND ARTI_COD = :ARTICULO AND FACT_FECHA >= :FECINI AND FACT_FECHA <= :FECFIN AND FACT_ANULADO = 'N' AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 31 AND ((SUCU_ID = :SUCURSAL) or (:SUCURSAL = 0)) and substring(arti_cod from 1 FOR 2) <> '.t'
                ORDER BY F.FACT_ID, FADE_ITEM INTO :ID, :ITEM, :CANT, :MONTO, :BOD, :PTVTA
                DO
                BEGIN
                CANTIDAD = CANTIDAD + CANT;
                EXECUTE PROCEDURE FALTANTE_CORTE(:TIPO, :DESTINO, :ID, :ITEM, :CORTE) returning_values (:CANT, :UNIDAD, :FACTOR);
                FALTANTE = FALTANTE + CANT;
                BASE = BASE + MONTO * CANT;
                END
            execute procedure costo_promedio(:articulo, :corte) returning_values (:costoun);
            costotot = CANTIDAD * costoun;
            END
        if (TIPO = 32) then
            BEGIN
            FOR SELECT R.revt_id, rvde_item, RVDE_CANT * RVDE_FACTOR, (RVDE_PRUNIT-RVDE_DTOMONTO), D.bode_cod, R.ptvt_id
                FROM REMISIONES_VENTA_DETALLE D, REMISIONES_VENTA R, PREFIJOS P
                WHERE R.REVT_ID = D.REVT_ID AND ARTI_COD = :ARTICULO AND REVT_FECHA >= :FECINI AND REVT_FECHA <= :FECFIN AND REVT_ANULADO = 'N' AND P.PREF_PRE = R.PREF_PRE AND P.TIDO_COD = 32  AND ((SUCU_ID = :SUCURSAL) or (:SUCURSAL = 0))
                ORDER BY R.REVT_ID, RVDE_ITEM INTO :ID, :ITEM, :CANT, :MONTO, :BOD, :PTVTA
                DO
                BEGIN
                CANTIDAD = CANTIDAD + CANT;
                EXECUTE PROCEDURE FALTANTE_CORTE(:TIPO, :DESTINO, :ID, :ITEM, :CORTE) returning_values (:CANT, :UNIDAD, :FACTOR);
                FALTANTE = FALTANTE + CANT;
                BASE = BASE + MONTO * CANT;
                END
            execute procedure costo_promedio(:articulo, :corte) returning_values (:costoun);
            costotot = CANTIDAD * costoun;
            END
        if (TIPO = 34) then
            BEGIN
            FOR SELECT P.PEDI_ID, PEDE_ITEM, PEDE_CANT * PEDE_FACTOR, (PEDE_PRUNIT-PEDE_DTOMONTO), D.bode_cod, P.ptvt_id
                FROM PEDIDOS_DETALLE D, PEDIDOS P, PREFIJOS R
                WHERE P.PEDI_ID = D.PEDI_ID AND ARTI_COD = :ARTICULO AND PEDI_FECHA >= :FECINI AND PEDI_FECHA <= :FECFIN AND PEDI_VALIDEZ >= 0
                AND PEDI_ANULADO = 'N' AND P.PREF_PRE = R.PREF_PRE AND R.TIDO_COD = 34  AND ((SUCU_ID = :SUCURSAL) or (:SUCURSAL = 0))
                ORDER BY P.PEDI_ID, PEDE_ITEM INTO :ID, :ITEM, :CANT, :MONTO, :bod, :PTVTA
                DO
                BEGIN
                CANTIDAD = CANTIDAD + CANT;
                EXECUTE PROCEDURE FALTANTE_CORTE(:TIPO, :DESTINO, :ID, :ITEM, :CORTE) returning_values (:CANT, :UNIDAD, :FACTOR);
                FALTANTE = FALTANTE + CANT;
                BASE = BASE + MONTO * CANT;
                END
            execute procedure costo_promedio(:articulo, :corte) returning_values (:costoun);
            costotot = CANTIDAD * costoun;
            END
        if (TIPO = 35) then
            BEGIN
            FOR SELECT C.COTI_ID, CTDE_ITEM, CTDE_CANT * CTDE_FACTOR, (CTDE_PRUNIT-CTDE_DTOMONTO), C.ptvt_id
                FROM COTIZACIONES_DETALLE D, COTIZACIONES C, PREFIJOS P
                WHERE C.COTI_ID = D.COTI_ID AND ARTI_COD = :ARTICULO AND COTI_FECHA >= :FECINI AND COTI_FECHA <= :FECFIN AND COTI_ANULADO = 'N' AND P.PREF_PRE = C.PREF_PRE AND P.TIDO_COD = 35  AND ((SUCU_ID = :SUCURSAL) or (:SUCURSAL = 0))
                ORDER BY C.COTI_ID, CTDE_ITEM INTO :ID, :ITEM, :CANT, :MONTO, :PTVTA
                DO
                BEGIN
                BOD = '';
                CANTIDAD = CANTIDAD + CANT;
                EXECUTE PROCEDURE FALTANTE_CORTE(:TIPO, :DESTINO, :ID, :ITEM, :CORTE) returning_values (:CANT, :UNIDAD, :FACTOR);
                FALTANTE = FALTANTE + CANT;
                BASE = BASE + MONTO * CANT;
                END
            execute procedure costo_promedio(:articulo, :corte) returning_values (:costoun);
            costotot = CANTIDAD * costoun;
            END
        if (TIPO = 40) then
            BEGIN
            FOR SELECT P.pend_id, D.pevd_item, D.pevd_cant * D.pevd_factor, (D.pevd_prunit-D.pevd_dtomonto), D.bode_cod
                FROM pendiente_ventas_detalle D, pendiente_ventas P, PREFIJOS R
                WHERE P.pend_id = D.pend_id AND ARTI_COD = :ARTICULO AND PEND_FECHA >= :FECINI AND PEND_FECHA <= :FECFIN AND
                PEND_ANULADO = 'N' AND P.PREF_PRE = R.PREF_PRE AND R.TIDO_COD = 40  AND ((SUCU_ID = :SUCURSAL) or (:SUCURSAL = 0))
                ORDER BY P.pend_id, D.pevd_item INTO :ID, :ITEM, :CANT, :MONTO, :bod
                DO
                BEGIN
                CANTIDAD = CANTIDAD + CANT;
                EXECUTE PROCEDURE FALTANTE(:TIPO, :DESTINO, :ID, :ITEM) returning_values (:CANT, :UNIDAD, :FACTOR);
                FALTANTE = FALTANTE + CANT;
                BASE = BASE + MONTO * CANT;
                END
            execute procedure costo_promedio(:articulo, :corte) returning_values (:costoun);
            costotot = CANTIDAD * costoun;
            END
        if (CANTIDAD IS NULL) then
            CANTIDAD = 0;
        if (BASE IS NULL) then
            BASE = 0;
        if (FALTANTE IS NULL) then
            FALTANTE = 0;
        if (CEROS = 'S') then
            SUSPEND;
        ELSE
            if (FALTANTE <> 0) then
                SUSPEND;
        END
    ELSE
        BEGIN
        if (TIPO = 31) then
            FOR SELECT F.FACT_ID, FADE_ITEM, F.PREF_PRE, FACT_NUMERO, FACT_FECHA, FADE_CANT * FADE_FACTOR, (FADE_PRUNIT-FADE_DTOMONTO), SUBSTRING(FACT_OBS FROM 1 FOR 255), D.bode_cod, F.ptvt_id, F.terc_nit, F.fact_nomcliente
                FROM FACTURAS F, FACTURAS_DETALLE D, PREFIJOS P
                WHERE F.FACT_ID = D.FACT_ID AND ARTI_COD = :ARTICULO AND FACT_FECHA >= :FECINI AND FACT_FECHA <= :FECFIN AND FACT_ANULADO = 'N' AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 31 AND ((SUCU_ID = :SUCURSAL) or (:SUCURSAL = 0)) and substring(arti_cod from 1 FOR 2) <> '.t'
                ORDER BY F.FACT_ID, FADE_ITEM
                INTO :ID, :ITEM, :PREFIJO, :NUMERO, :FECHA, :CANTIDAD, :BASE, :OBS, :bod, :PTVTA, :nit, :nomcliente
                DO
                    BEGIN
                    EXECUTE PROCEDURE FALTANTE_CORTE(:TIPO, :DESTINO, :ID, :ITEM, :CORTE) returning_values (:FALTANTE, :UNIDAD, :FACTOR);
                    if ((CEROS = 'S') or (FALTANTE <> 0)) then
                        BEGIN
                        CIUDAD = '';
                        SELECT CIUD_NOM FROM CIUDADES C, TERCEROS T WHERE T.terc_nit = :NIT AND T.ciud_cod = C.ciud_cod INTO :CIUDAD;
                        execute procedure costo_promedio(:articulo, :corte) returning_values (:costoun);
                        costotot = CANTIDAD * costoun;
                        SUSPEND;
                        END
                    END
        if (TIPO = 32) then
            FOR SELECT R.REVT_ID, RVDE_ITEM, R.PREF_PRE, REVT_NUMERO, REVT_FECHA, RVDE_CANT * RVDE_FACTOR, (RVDE_PRUNIT-RVDE_DTOMONTO), SUBSTRING(REVT_OBS FROM 1 FOR 255), D.bode_cod, R.ptvt_id, R.terc_nit, R.revt_nomterc
                FROM REMISIONES_VENTA R, REMISIONES_VENTA_DETALLE D, PREFIJOS P
                WHERE R.REVT_ID = D.REVT_ID AND ARTI_COD = :ARTICULO AND REVT_FECHA >= :FECINI AND REVT_FECHA <= :FECFIN AND REVT_ANULADO = 'N' AND P.PREF_PRE = R.PREF_PRE AND P.TIDO_COD = 32 AND ((SUCU_ID = :SUCURSAL) or (:SUCURSAL = 0))
                INTO :ID, :ITEM, :PREFIJO, :NUMERO, :FECHA, :CANTIDAD, :BASE, :OBS, :bod, :PTVTA, :nit, :nomcliente
                DO
                    BEGIN
                    EXECUTE PROCEDURE FALTANTE_CORTE(:TIPO, :DESTINO, :ID, :ITEM, :CORTE) returning_values (:FALTANTE, :UNIDAD, :FACTOR);
                    if ((CEROS = 'S') or (FALTANTE <> 0)) then
                        BEGIN
                        CIUDAD = '';
                        SELECT CIUD_NOM FROM CIUDADES C, TERCEROS T WHERE T.terc_nit = :NIT AND T.ciud_cod = C.ciud_cod INTO :CIUDAD;
                        execute procedure costo_promedio(:articulo, :corte) returning_values (:costoun);
                        costotot = CANTIDAD * costoun;
                        SUSPEND;
                        END
                    END
        if (TIPO = 34) then
            FOR SELECT P.PEDI_ID, PEDE_ITEM, P.PREF_PRE, PEDI_NUMERO, PEDI_FECHA, PEDE_CANT * PEDE_FACTOR, (PEDE_PRUNIT-PEDE_DTOMONTO), SUBSTRING(PEDI_OBS FROM 1 FOR 255), D.bode_cod, P.ptvt_id, P.terc_nit, P.pedi_nomterc
                FROM PEDIDOS P, PEDIDOS_DETALLE D, PREFIJOS R
                WHERE P.PEDI_ID = D.PEDI_ID AND ARTI_COD = :ARTICULO AND PEDI_FECHA >= :FECINI AND PEDI_FECHA <= :FECFIN AND PEDI_VALIDEZ >= 0
                AND PEDI_ANULADO = 'N' AND P.PREF_PRE = R.PREF_PRE AND R.TIDO_COD = 34 AND ((SUCU_ID = :SUCURSAL) or (:SUCURSAL = 0))
                INTO :ID, :ITEM, PREFIJO, :NUMERO, :FECHA, :CANTIDAD, :BASE, :OBS, :bod, :PTVTA, :nit, :nomcliente
                DO
                    BEGIN
                    EXECUTE PROCEDURE FALTANTE_CORTE(:TIPO, :DESTINO, :ID, :ITEM, :CORTE) returning_values (:FALTANTE, :UNIDAD, :FACTOR);
                    if ((CEROS = 'S') or (FALTANTE <> 0)) then
                        BEGIN
                        CIUDAD = '';
                        SELECT CIUD_NOM FROM CIUDADES C, TERCEROS T WHERE T.terc_nit = :NIT AND T.ciud_cod = C.ciud_cod INTO :CIUDAD;
                        execute procedure costo_promedio(:articulo, :corte) returning_values (:costoun);
                        costotot = CANTIDAD * costoun;
                        SUSPEND;
                        END
                    END
        if (TIPO = 35) then
            FOR SELECT C.COTI_ID, CTDE_ITEM, C.PREF_PRE, COTI_NUMERO, COTI_FECHA, CTDE_CANT * CTDE_FACTOR, (CTDE_PRUNIT-CTDE_DTOMONTO), SUBSTRING(COTI_OBS FROM 1 FOR 255), C.ptvt_id, C.terc_nit, C.coti_nomterc
                FROM COTIZACIONES C, COTIZACIONES_DETALLE D, PREFIJOS P
                WHERE C.COTI_ID = D.COTI_ID AND ARTI_COD = :ARTICULO AND COTI_FECHA >= :FECINI AND COTI_FECHA <= :FECFIN AND COTI_ANULADO = 'N' AND P.PREF_PRE = C.PREF_PRE AND P.TIDO_COD = 35 AND ((SUCU_ID = :SUCURSAL) or (:SUCURSAL = 0))
                INTO :ID, :ITEM, PREFIJO, :NUMERO, :FECHA, :CANTIDAD, :BASE, :OBS, :PTVTA, :nit, :nomcliente
                DO
                    BEGIN
                    BOD = '';
                    EXECUTE PROCEDURE FALTANTE_CORTE(:TIPO, :DESTINO, :ID, :ITEM, :CORTE) returning_values (:FALTANTE, :UNIDAD, :FACTOR);
                    if ((CEROS = 'S') or (FALTANTE <> 0)) then
                        BEGIN
                        CIUDAD = '';
                        SELECT CIUD_NOM FROM CIUDADES C, TERCEROS T WHERE T.terc_nit = :NIT AND T.ciud_cod = C.ciud_cod INTO :CIUDAD;
                        execute procedure costo_promedio(:articulo, :corte) returning_values (:costoun);
                        costotot = CANTIDAD * costoun;
                        SUSPEND;
                        END
                    END
        if (TIPO = 40) then
            FOR SELECT P.pend_id, D.pevd_item, P.PREF_PRE, P.pend_numero, PEND_FECHA, D.pevd_cant * D.pevd_factor, (D.pevd_prunit-D.pevd_dtomonto), SUBSTRING(P.pend_obs FROM 1 FOR 255), D.bode_cod
                FROM pendiente_ventas P, pendiente_ventas_detalle D, PREFIJOS R
                WHERE P.pend_id = D.pend_id AND ARTI_COD = :ARTICULO AND PEND_FECHA >= :FECINI AND PEND_FECHA <= :FECFIN AND PEND_ANULADO = 'N'
                AND P.PREF_PRE = R.PREF_PRE AND R.TIDO_COD = 40 AND ((SUCU_ID = :SUCURSAL) or (:SUCURSAL = 0))
                INTO :ID, :ITEM, PREFIJO, :NUMERO, :FECHA, :CANTIDAD, :BASE, :OBS, :bod
                DO
                    BEGIN
                    EXECUTE PROCEDURE FALTANTE(:TIPO, :DESTINO, :ID, :ITEM) returning_values (:FALTANTE, :UNIDAD, :FACTOR);
                    if ((CEROS = 'S') or (FALTANTE <> 0)) then
                        BEGIN
                        CIUDAD = '';
                        SELECT CIUD_NOM FROM CIUDADES C, TERCEROS T WHERE T.terc_nit = :NIT AND T.ciud_cod = C.ciud_cod INTO :CIUDAD;
                        execute procedure costo_promedio(:articulo, :corte) returning_values (:costoun);
                        costotot = CANTIDAD * costoun;
                        SUSPEND;
                        END
                    END
        END
    END
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE FALTANTE_DOCUMENTO(
    TIPORI INTEGER,
    TIPDES INTEGER,
    IDORI INTEGER)
RETURNS (
    ARTI VARCHAR(20),
    DES VARCHAR(60),
    CANT NUMERIC(18,4),
    UNIDAD VARCHAR(8),
    BOD VARCHAR(2),
    PRUNIT NUMERIC(18,2),
    DTO NUMERIC(9,2),
    TOTAL NUMERIC(18,2))
AS
declare variable ITEM INTEGER;
declare variable FACTOR NUMERIC(18,4);
begin
    if (TIPORI = 21) then
        BEGIN
        FOR SELECT FCDE_ITEM, FCDE_CODBAR, FCDE_DESC, BODE_COD, FCDE_PRUNIT, FCDE_DTOPORC, FCDE_TOTAL FROM FACTURAS_COMPRAS_DETALLE
            WHERE FACO_ID = :IDORI ORDER BY FCDE_ITEM INTO :ITEM, :ARTI, :DES, :BOD, :PRUNIT, :DTO, :TOTAL DO
            BEGIN
            EXECUTE PROCEDURE faltante(:TIPORI, :TIPDES, :IDORI, :ITEM) returning_values (:CANT, :UNIDAD, :FACTOR);
            if (CANT <> 0) then
                SUSPEND;
            END
        END
    if (TIPORI = 22) then
        BEGIN
        FOR SELECT RPVD_ITEM, RPVD_CODBAR, RPVD_DESC, BODE_COD, RPVD_PRUNIT, RPVD_DTOPORC, RPVD_TOTAL  FROM remision_proveedor_det
            WHERE REPR_ID = :IDORI ORDER BY RPVD_ITEM INTO :ITEM, :ARTI, :DES, :BOD, :PRUNIT, :DTO, :TOTAL DO
            BEGIN
            EXECUTE PROCEDURE faltante(:TIPORI, :TIPDES, :IDORI, :ITEM) returning_values (:CANT, :UNIDAD, :FACTOR);
            if (CANT <> 0) then
                SUSPEND;
            END
        END
    if (TIPORI = 23) then
        BEGIN
        FOR SELECT OCDE_ITEM, OCDE_CODBAR, OCDE_DESC, BODE_COD, OCDE_PRUNIT, OCDE_DTOPORC, OCDE_TOTAL FROM ORDENES_COMPRA_DETALLE
            WHERE ORDC_ID = :IDORI ORDER BY OCDE_ITEM INTO :ITEM, :ARTI, :DES, :BOD, :PRUNIT, :DTO, :TOTAL DO
            BEGIN
            EXECUTE PROCEDURE faltante(:TIPORI, :TIPDES, :IDORI, :ITEM) returning_values (:CANT, :UNIDAD, :FACTOR);
            if (CANT <> 0) then
                SUSPEND;
            END
        END
    if (TIPORI = 25) then
        BEGIN
        FOR SELECT CPRD_ITEM, CPRD_CODBAR, CPRD_DESC, BODE_COD, CPRD_PRUNIT, CPRD_DTOPORC, CPRD_TOTAL FROM COTIZACIONES_PROVEEDOR_DET
            WHERE COPR_ID = :IDORI ORDER BY CPRD_ITEM INTO :ITEM, :ARTI, :DES, :BOD, :PRUNIT, :DTO, :TOTAL DO
            BEGIN
            EXECUTE PROCEDURE faltante(:TIPORI, :TIPDES, :IDORI, :ITEM) returning_values (:CANT, :UNIDAD, :FACTOR);
            if (CANT <> 0) then
                SUSPEND;
            END
        END
    if (TIPORI = 31) then
        BEGIN
        FOR SELECT FADE_ITEM, FADE_CODBAR, FADE_DESC, BODE_COD, FADE_PRUNIT, FADE_DTOPORC, FADE_TOTAL FROM FACTURAS_DETALLE
            WHERE FACT_ID = :IDORI and substring(arti_cod from 1 FOR 2) <> '.t' ORDER BY FADE_ITEM INTO :ITEM, :ARTI, :DES, :BOD, :PRUNIT, :DTO, :TOTAL DO
            BEGIN
            EXECUTE PROCEDURE faltante(:TIPORI, :TIPDES, :IDORI, :ITEM) returning_values (:CANT, :UNIDAD, :FACTOR);
            if (CANT <> 0) then
                SUSPEND;
            END
        END
    if (TIPORI = 32) then
        BEGIN
        FOR SELECT RVDE_ITEM, RVDE_CODBAR, RVDE_DESC, BODE_COD, RVDE_PRUNIT, RVDE_DTOPORC, RVDE_TOTAL FROM remisiones_venta_detalle
            WHERE REVT_ID = :IDORI ORDER BY RVDE_ITEM INTO :ITEM, :ARTI, :DES, :BOD, :PRUNIT, :DTO, :TOTAL DO
            BEGIN
            EXECUTE PROCEDURE faltante(:TIPORI, :TIPDES, :IDORI, :ITEM) returning_values (:CANT, :UNIDAD, :FACTOR);
            if (CANT <> 0) then
                SUSPEND;
            END
        END
    if (TIPORI = 34) then
        BEGIN
        FOR SELECT PEDE_ITEM, PEDE_CODBAR, PEDE_DESC, BODE_COD, PEDE_PRUNIT, PEDE_DTOPORC, PEDE_TOTAL FROM PEDIDOS_DETALLE
            WHERE PEDI_ID = :IDORI ORDER BY PEDE_ITEM INTO :ITEM, :ARTI, :DES, :BOD, :PRUNIT, :DTO, :TOTAL DO
            BEGIN
            EXECUTE PROCEDURE faltante(:TIPORI, :TIPDES, :IDORI, :ITEM) returning_values (:CANT, :UNIDAD, :FACTOR);
            if (CANT <> 0) then
                SUSPEND;
            END
        END
    if (TIPORI = 35) then
        BEGIN
        FOR SELECT CTDE_ITEM, CTDE_CODBAR, CTDE_DESC, CTDE_PRUNIT, CTDE_DTOPORC, CTDE_TOTAL FROM COTIZACIONES_DETALLE
            WHERE COTI_ID = :IDORI ORDER BY CTDE_ITEM INTO :ITEM, :ARTI, :DES, :PRUNIT, :DTO, :TOTAL DO
            BEGIN
            EXECUTE PROCEDURE faltante(:TIPORI, :TIPDES, :IDORI, :ITEM) returning_values (:CANT, :UNIDAD, :FACTOR);
            if (CANT <> 0) then
                SUSPEND;
            END
        END
    if (TIPORI = 40) then
        BEGIN
        FOR SELECT PEVD_ITEM, PEVD_CORBAR, PEVD_DESC, PEVD_PRUNIT, PEVD_DTOPORC, PEVD_TOTAL FROM pendiente_ventas_detalle
            WHERE PEND_ID = :IDORI ORDER BY PEVD_ITEM INTO :ITEM, :ARTI, :DES, :PRUNIT, :DTO, :TOTAL DO
            BEGIN
            EXECUTE PROCEDURE faltante(:TIPORI, :TIPDES, :IDORI, :ITEM) returning_values (:CANT, :UNIDAD, :FACTOR);
            if (CANT <> 0) then
                SUSPEND;
            END
        END
end
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE ORDENES_ARTICULO(
    FECHA DATE,
    DETALLE CHAR(1))
RETURNS (
    CODIGO VARCHAR(15),
    NOMBRE VARCHAR(60),
    ORDEN NUMERIC(18,4),
    EXIST NUMERIC(18,2),
    SUMA NUMERIC(18,2),
    COSTO NUMERIC(18,2),
    UNIDAD VARCHAR(8),
    CODGRUPO VARCHAR(2),
    NOMGRUPO VARCHAR(30),
    CODSUBG VARCHAR(3),
    NOMSUBG VARCHAR(30),
    CODMARC VARCHAR(3),
    NOMMARC VARCHAR(30),
    COSTOTOT NUMERIC(18,2),
    CLIENTE VARCHAR(60),
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(8),
    FECHADOC DATE)
AS
declare variable ORDENC NUMERIC(18,4);
declare variable ID INTEGER;
declare variable ITEM INTEGER;
declare variable UND VARCHAR(8);
declare variable FACTOR NUMERIC(18,4);
declare variable FACT NUMERIC(18,4);
declare variable CANT NUMERIC(18,4);
BEGIN
  FOR
    SELECT ARTI_COD, ARTI_DES, ARTI_UNIDAD, A.GRUP_COD, A.SUBG_COD, A.MARC_COD
      FROM ARTICULO A
      INTO :CODIGO, :NOMBRE, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
      DO
        BEGIN
        EXECUTE PROCEDURE SALDO_TOTAL_INVENTARIO(CODIGO, FECHA) returning_values (EXIST);
        EXECUTE PROCEDURE COSTO_PROMEDIO(CODIGO, FECHA) returning_values (COSTO);
        if (DETALLE = 'N') then
            BEGIN
            NOMMARC = '';
            NOMSUBG = '';
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            SELECT SUM(ORID_ENTREGAR) FROM ordenes_inventario O, ordeninventario_detalle OD
                WHERE O.ORIN_ID = OD.ORIN_ID AND OD.ARTI_COD = :CODIGO AND ORIN_FECHA <= :FECHA AND ORIN_FECLLEGA >= :FECHA AND ORIN_ANULADO = 'N'
                INTO :ORDEN;
            if (ORDEN IS NULL) then
                ORDEN = 0;
            FOR SELECT O.ORDC_ID, OCDE_ITEM, OCDE_CANT * OCDE_FACTOR
                FROM ORDENES_COMPRA O, ORDENES_COMPRA_DETALLE OD
                WHERE O.ORDC_ID = OD.ORDC_ID AND OD.ARTI_COD = :CODIGO AND (ORDC_FECHA+ORDC_VALIDEZ) >= :FECHA AND ORDC_FECHA <= :FECHA AND ORDC_ANULADO = 'N'
                INTO :ID, :item, :CANT
                DO
                BEGIN
                EXECUTE PROCEDURE FALTANTE(23, 21, ID, ITEM) returning_values (ORDENC, UND, FACT);
                if (ORDENC * FACT = CANT) then
                    EXECUTE PROCEDURE FALTANTE(23, 22, ID, ITEM) returning_values (ORDENC, UND, FACT);
                if (ORDENC IS NULL) then
                    ORDENC = 0;
                if (ORDENC <> 0) then
                    BEGIN
                    ORDEN = ORDEN + ORDENC;
                    END
                END
            SUMA = ORDEN + EXIST;
            COSTOTOT = ORDEN * :COSTO;
            if (ORDEN <> 0) then
                SUSPEND;
            END
        ELSE
            BEGIN
            FOR SELECT ORIN_FECHA, PREF_PRE, ORIN_NUMERO, ORIN_NOMTERC, ORID_CANT, ORID_UNIDAD, ORID_ENTREGAR
                FROM ordenes_inventario O, ordeninventario_detalle OD
                WHERE O.ORIN_ID = OD.ORIN_ID AND OD.ARTI_COD = :CODIGO AND ORIN_FECHA <= :FECHA AND ORIN_FECLLEGA > :FECHA AND ORIN_ANULADO = 'N'
                INTO :FECHADOC, :PREFIJO, :NUMERO, :CLIENTE, :EXIST, :UNIDAD, :ORDEN
                DO
                BEGIN
                COSTOTOT = ORDEN * :COSTO;
                SUSPEND;
                END
            FOR SELECT O.ORDC_ID, OCDE_ITEM, ORDC_FECHA, PREF_PRE, ORDC_NUMERO, TERC_NOM, OCDE_CANT, OCDE_UNIDAD, OCDE_ORDENADO, OCDE_FACTOR
                FROM ordenes_compra O, ordenes_compra_detalle OD, TERCEROS T
                WHERE O.ORDC_ID = OD.ORDC_ID AND OD.ARTI_COD = :CODIGO AND O.TERC_NIT = T.TERC_NIT AND ORDC_FECHA <= :FECHA AND (ORDC_FECHA+ordc_validez) > :FECHA AND ORDC_ANULADO = 'N'
                INTO :ID, :ITEM, :FECHADOC, :PREFIJO, :NUMERO, :CLIENTE, :CANT, :UNIDAD, :ORDEN, :FACTOR
                DO
                BEGIN
                EXECUTE PROCEDURE FALTANTE(23, 21, ID, ITEM) returning_values (ORDEN, UND, FACT);
                if (ORDEN * FACT = CANT * FACTOR) then
                    EXECUTE PROCEDURE FALTANTE(23, 22, ID, ITEM) returning_values (ORDEN, UND, FACTOR);
                if (ORDEN IS NULL) then
                    ORDEN = 0;
                COSTOTOT = ORDEN * :COSTO;
                if (ORDEN <> 0) then
                    SUSPEND;
                END
            END
        END
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE ORDENES_ARTICULO_FECHA(
    ARTICULO VARCHAR(15),
    FECHA DATE)
RETURNS (
    FECORD DATE,
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(8),
    FECLLEGA DATE,
    PROVEEDOR VARCHAR(60),
    CANTIDAD NUMERIC(18,2),
    UNIDAD VARCHAR(8),
    TIPO INTEGER,
    ID INTEGER)
AS
declare variable ITEM INTEGER;
declare variable FACTOR NUMERIC(18,4);
declare variable UND VARCHAR(8);
declare variable FACT NUMERIC(18,4);
declare variable ORDENC NUMERIC(18,4);
BEGIN
TIPO = 18;
  /* MUESTRA LAS RESERVAS DEL ARTICULO QUE NO SE HAN VENCIDO */
  FOR SELECT OI.ORIN_ID, ORIN_FECHA, PREF_PRE, ORIN_NUMERO, ORIN_FECLLEGA, ORIN_NOMTERC, ORID_CANT, ORID_UNIDAD
    FROM ORDENES_INVENTARIO OI, ORDENINVENTARIO_DETALLE OD
    WHERE OI.ORIN_ID = OD.ORIN_ID AND OD.ARTI_COD = :ARTICULO AND OI.ORIN_FECLLEGA > :FECHA AND ORIN_FECHA <= :FECHA AND ORID_ANULADO = 'N'
    INTO :ID, :FECORD, :PREFIJO, :NUMERO, :FECLLEGA, :PROVEEDOR, :CANTIDAD, :UNIDAD
        DO
          SUSPEND;
TIPO = 23;
  FOR SELECT O.ORDC_ID, OCDE_ITEM, ORDC_FECHA, PREF_PRE, ORDC_NUMERO, (ORDC_FECHA+ORDC_VALIDEZ), TERC_NOM, OCDE_CANT, OCDE_UNIDAD
    FROM ORDENES_COMPRA O, ORDENES_COMPRA_DETALLE OD, TERCEROS T
    WHERE O.ORDC_ID = OD.ORDC_ID AND OD.ARTI_COD = :ARTICULO AND O.TERC_NIT = T.TERC_NIT AND (ORDC_FECHA+ORDC_VALIDEZ) > :FECHA AND ORDC_FECHA <= :FECHA AND ORDC_ANULADO = 'N'
    INTO :ID, :item, :FECORD, :PREFIJO, :NUMERO, :FECLLEGA, :PROVEEDOR, :CANTIDAD, :UNIDAD
        DO
        BEGIN
        EXECUTE PROCEDURE FALTANTE(23, 21, ID, ITEM) returning_values (ORDENC, UND, FACT);
        if (ORDENC = CANTIDAD) then
            EXECUTE PROCEDURE FALTANTE(23, 22, ID, ITEM) returning_values (ORDENC, UND, FACTOR);
        if (ORDENC IS NULL) then
            ORDENC = 0;
        if (ORDENC <> 0) then
            BEGIN
            CANTIDAD = ORDENC;
            UNIDAD = UND;
            SUSPEND;
            END
        END
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE ORDEN_PROVEEDOR(
    NIT VARCHAR(20),
    FECHA DATE)
RETURNS (
    ARTICULO VARCHAR(20),
    DESCRIPCION VARCHAR(60),
    UNIDAD VARCHAR(8),
    BODEGA VARCHAR(2),
    EXISTENCIA NUMERIC(18,4),
    RESERVADO NUMERIC(18,4),
    ORDENADO NUMERIC(18,4),
    PROMEDIO NUMERIC(18,4),
    VENTAMES NUMERIC(18,4),
    FECHACMP DATE,
    DIAS INTEGER,
    SUGERIDO NUMERIC(18,4),
    STAND VARCHAR(20))
AS
declare variable FACTOR NUMERIC(15,4);
declare variable ORDENC NUMERIC(18,4);
declare variable PEDIDO NUMERIC(18,4);
declare variable ITEM INTEGER;
declare variable ID INTEGER;
declare variable UND VARCHAR(8);
declare variable CANT NUMERIC(18,4);
declare variable FACTOR2 NUMERIC(18,4);
declare variable fecini DATE;
declare variable FECHAAUX VARCHAR(10);
declare variable DEVMES NUMERIC(18,2);
declare variable DIA_ART VARCHAR(2) CHARACTER SET NONE;
declare variable DIASC VARCHAR(255);
declare variable PEDAUTO CHAR(2);
declare variable SALIDAS NUMERIC(18,4);
BEGIN
FOR SELECT A.ARTI_COD, A.ARTI_DES, A.ARTI_UNIDAD FROM ARTICULO A, proveedor_articulo P
  WHERE A.arti_cod = P.arti_cod AND P.terc_nit = :NIT INTO :articulo, :descripcion, :unidad
  DO
  for select bode_cod from bodega into :bodega
    do
    begin
    execute procedure saldo_inventario (:articulo, :bodega, :fecha) returning_values (:Existencia);
    EXECUTE PROCEDURE FACTOR_UNIDAD_CANT(:ARTICULO, :UNIDAD) returning_values (:FACTOR);
    if (FACTOR <> 0) then
        EXISTENCIA = EXISTENCIA / FACTOR;
    else
        EXISTENCIA = 0;
    SELECT STAND_COD FROM STANDS WHERE ARTI_COD = :articulo AND STAND_BODEGA = :bodega INTO :STAND;
    EXECUTE PROCEDURE promedio_salidas_articulo (:ARTICULO, :FECHA, :BODEGA) returning_values (:PROMEDIO, :SALIDAS);
    EXECUTE PROCEDURE lee_configuracion ('INVENTARIO', 'EXISTENCIAS', 'PROMEDIAR LAS SALIDAS DEL INVENTARIO CON EL NUMERO DE DIAS ASIGNADO A CADA ARTICULO') returning_values (:DIA_ART);
    if (DIA_ART = 'NO') then
        BEGIN
        EXECUTE PROCEDURE lee_configuracion ('INVENTARIO', 'EXISTENCIAS', 'NUMERO DE DIAS PARA PROMEDIO DE SALIDAS POR ARTICULO') returning_values (DIASC);
        DIAS = CAST(DIASC AS INTEGER);
        END
    ELSE
        SELECT ARTI_DIAS FROM ARTICULO WHERE ARTI_COD = :ARTICULO INTO :DIAS;
    if (DIAS is null) then
        DIAS = 0;
    PROMEDIO = DIAS * PROMEDIO;
    if (FACTOR <> 0) then
        PROMEDIO = PROMEDIO / FACTOR;
    SUGERIDO = PROMEDIO - EXISTENCIA;
    SELECT SUM(ORID_ENTREGAR)
      FROM ORDENINVENTARIO_DETALLE OD, ordenes_inventario O
      WHERE O.ORIN_ID = OD.ORIN_ID AND ARTI_COD = :ARTICULO AND ORIN_FECHA <= :FECHA AND ORIN_FECLLEGA >= :FECHA AND ORID_ANULADO = 'N' AND OD.BODE_COD = :BODEGA
      INTO :ORDENADO;
    if (ORDENADO IS NULL) then
        ORDENADO = 0;
    ORDENC = 0;
    FOR SELECT O.ORDC_ID, OCDE_ITEM, OCDE_CANT * OCDE_FACTOR
        FROM ORDENES_COMPRA O, ORDENES_COMPRA_DETALLE OD
        WHERE O.ORDC_ID = OD.ORDC_ID AND OD.ARTI_COD = :ARTICULO AND (ORDC_FECHA+ORDC_VALIDEZ) >= :FECHA AND ORDC_FECHA <= :FECHA AND OCDE_ANULADO = 'N' AND OD.BODE_COD = :BODEGA
        INTO :ID, :ITEM, :CANT
        do
        BEGIN
        EXECUTE PROCEDURE FALTANTE(23, 21, ID, ITEM) returning_values (PEDIDO, UND, FACTOR2);
        if (PEDIDO * FACTOR2 = CANT) then /* SI NO SE HA FACTURADO MIRE A VER SI SE REMISIONO */
            EXECUTE PROCEDURE FALTANTE(23, 22, ID, ITEM) returning_values (PEDIDO, UND, FACTOR2);
        if (PEDIDO IS NULL) then
            PEDIDO = 0;
        ORDENC = ORDENC + PEDIDO * FACTOR2;
        END
    ORDENADO = ORDENADO + ORDENC;
    if (FACTOR <> 0) then
        ORDENADO = ORDENADO / FACTOR;
    SELECT SUM(RSDE_LIBERAR)
      FROM RESERVAS_DETALLE RD, RESERVAS R
      WHERE R.RESE_ID = RD.RESE_ID AND ARTI_COD = :ARTICULO AND RESE_FECHA <= :FECHA AND RESE_VENCE >= :FECHA AND RD.BODE_COD = :BODEGA AND RSDE_ANULADO = 'N'
      INTO :RESERVADO;
    if (RESERVADO IS NULL) then
        RESERVADO = 0;
    PEDIDO = 0;
    FOR SELECT P.PEDI_ID, PEDE_ITEM, PEDE_CANT * PEDE_FACTOR
        FROM PEDIDOS P, PEDIDOS_DETALLE PD
        WHERE P.PEDI_ID = PD.PEDI_ID AND PD.ARTI_COD = :ARTICULO AND (PEDI_FECHA+PEDI_VALIDEZ) >= :FECHA AND PEDI_FECHA <= :FECHA AND PEDE_ANULADO = 'N' AND BODE_COD = :BODEGA
        INTO :ID, :ITEM, :CANT
        do
        BEGIN
        EXECUTE PROCEDURE FALTANTE(34, 31, ID, ITEM) returning_values (ORDENC, UND, FACTOR2);
        EXECUTE PROCEDURE LEE_CONFIGURACION('FACTURACION', 'FACTURAS', 'GENERAR PEDIDO AUTOMATICAMENTE CON LA FACTURA') returning_values (pedauto);
        if ((ORDENC * FACTOR2 = CANT) or (PEDAUTO = 'SI')) then /* SI NO SE HA FACTURADO MIRE A VER SI SE REMISIONO */
            EXECUTE PROCEDURE FALTANTE(34, 32, ID, ITEM) returning_values (ORDENC, UND, FACTOR2);
        if (ORDENC IS NULL) then
            ORDENC = 0;
        PEDIDO = PEDIDO + ORDENC * FACTOR2;
        END
    RESERVADO = RESERVADO + PEDIDO;
    if (FACTOR <> 0) then
        RESERVADO = RESERVADO / FACTOR;
    /* VENTAS MES */
    FECHAAUX = CAST (FECHA AS VARCHAR(10));
    FECHAAUX = SUBSTR(FECHAAUX, 1, 7) || '/01';
    FECINI = CAST (FECHAAUX AS DATE);
    /* VENTAS MENSUALES */
    SELECT SUM(FADE_CANT * FADE_FACTOR)
        FROM FACTURAS_DETALLE D, FACTURAS F, punto_venta P
        WHERE F.FACT_ID = D.FACT_ID AND ARTI_COD = :ARTICULO AND FACT_FECHA >= :FECINI AND FACT_FECHA < :FECHA AND FACT_ANULADO = 'N'
        AND P.ptvt_id = F.ptvt_id AND P.bode_cod = :bodega INTO :ventames;
    SELECT SUM(DVDE_CANT * DVDE_FACTOR)
        FROM DEVOLUCIONES_VENTAS F, devoluciones_ventas_DETALLE D, punto_venta P
        WHERE F.DEVT_ID = D.DEVT_ID AND ARTI_COD = :ARTICULO AND DEVT_FECHA >= :FECINI AND DEVT_FECHA < :FECHA AND DEVT_ANULADO = 'N'
        AND P.ptvt_id = F.ptvt_id AND P.bode_cod = :bodega INTO :devmes;
    if (ventames IS NULL) then
        ventames = 0;
    if (devmes IS NULL) then
        devmes = 0;
    ventames = ventames - devmes;
    if (FACTOR <> 0) then
        ventames = ventames / FACTOR;
    /* FECHA COMPRA */
    SELECT MAX(FACO_FECHA) FROM FACTURAS_COMPRA F, FACTURAS_COMPRAS_DETALLE D
        WHERE F.FACO_ID = D.faco_id AND D.ARTI_COD = :articulo AND FACO_FECHA <= :FECHA AND D.bode_cod = :BODEGA
        INTO :fechacmp;
    SUSPEND;
    end
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE ORDEN_SUGERIDA_TOTAL(
    PROVEEDOR VARCHAR(20),
    CODBOD VARCHAR(2),
    FECHA DATE)
RETURNS (
    ARTICULO VARCHAR(15),
    DESCRIPCION VARCHAR(60),
    BODEGA VARCHAR(2),
    UNIDAD VARCHAR(8),
    EXISTENCIA NUMERIC(18,2),
    RESERVADO NUMERIC(18,2),
    ORDENADO NUMERIC(18,2),
    PROMEDIO NUMERIC(18,2),
    VENTAMES NUMERIC(18,2),
    FECHACMP DATE,
    CANTCMP NUMERIC(18,2),
    SUGERIDO NUMERIC(18,2),
    COSTO NUMERIC(18,2),
    DIAS INTEGER)
AS
declare variable PEDAUTO char(2);
declare variable FACTOR NUMERIC(15,4);
declare variable DIA_ART VARCHAR(2) CHARACTER SET NONE;
declare variable DIASC VARCHAR(255);
declare variable SALIDAS NUMERIC(18,4);
declare variable MARCA VARCHAR(10);
declare variable ORDENC numeric(18,4);
declare variable PEDIDO numeric(18,4);
declare variable ITEM integer;
declare variable ID integer;
declare variable UND varchar(8);
declare variable CANT numeric(18,4);
declare variable FACTOR2 numeric(18,4);
declare variable fecini date;
declare variable FECHAAUX varchar(10);
declare variable DEVMES numeric(18,2);
declare variable MFAC integer;
declare variable MDEV integer;
declare variable IVAF numeric(18,2);
declare variable IVAD numeric(18,2);
declare variable UNABOD VARCHAR(7);
BEGIN
execute procedure lee_configuracion('COMPRAS', 'ORDENES', 'ORDEN SUGERIDA POR BODEGA O GENERAL') returning_values (:UNABOD);
FOR SELECT a.ARTI_COD, ARTI_DES, PVAR_COSTO, ARTI_UNIDAD, ARTI_DIAS FROM proveedor_articulo p, articulo a
    WHERE p.arti_cod = a.arti_cod and TERC_NIT = :proveedor and esar_cod <> 'I' order by a.arti_des
    INTO :articulo, :DESCRIPCION, :costo, :unidad, :DIAS
  DO BEGIN
  for select bode_cod from bodega where BODE_ACTIVA = 'S' AND ((:UNABOD = 'GENERAL') or (BODE_COD = :CODBOD)) into :bodega
    do
    begin
    execute procedure saldo_inventario (:articulo, :bodega, :fecha) returning_values (:Existencia);
    EXECUTE PROCEDURE FACTOR_UNIDAD_CANT(:ARTICULO, :UNIDAD) returning_values (:FACTOR);
    if (FACTOR <> 0) then
        EXISTENCIA = EXISTENCIA / FACTOR;
    else
        EXISTENCIA = 0;
    EXECUTE PROCEDURE promedio_salidas_articulo (:ARTICULO, :FECHA, :BODEGA) returning_values (:PROMEDIO, :SALIDAS);
    EXECUTE PROCEDURE lee_configuracion ('INVENTARIO', 'EXISTENCIAS', 'PROMEDIAR LAS SALIDAS DEL INVENTARIO CON EL NUMERO DE DIAS ASIGNADO A CADA ARTICULO') returning_values (:DIA_ART);
    if (DIA_ART = 'NO') then
        BEGIN
        EXECUTE PROCEDURE lee_configuracion ('INVENTARIO', 'EXISTENCIAS', 'NUMERO DE DIAS PARA PROMEDIO DE SALIDAS POR ARTICULO') returning_values (DIASC);
        DIAS = CAST(DIASC AS INTEGER);
        END
    if (DIAS is null) then
        DIAS = 0;
    PROMEDIO = DIAS * PROMEDIO;
    if (FACTOR <> 0) then
        PROMEDIO = PROMEDIO / FACTOR;
    SUGERIDO = PROMEDIO - EXISTENCIA;
    select sum(ORID_ENTREGAR)
      from ORDENINVENTARIO_DETALLE OD, ordenes_inventario O
      where O.ORIN_ID = OD.ORIN_ID and ARTI_COD = :ARTICULO and ORIN_FECHA <= :FECHA and ORIN_FECLLEGA >= :FECHA and ORID_ANULADO = 'N' and OD.BODE_COD = :BODEGA
      into :ORDENADO;
    if (ORDENADO is null) then
        ORDENADO = 0;
    ORDENC = 0;
    for select O.ORDC_ID, OCDE_ITEM, OCDE_CANT * OCDE_FACTOR
        from ORDENES_COMPRA O, ORDENES_COMPRA_DETALLE OD
        where O.ORDC_ID = OD.ORDC_ID and OD.ARTI_COD = :ARTICULO and (ORDC_FECHA+ORDC_VALIDEZ) >= :FECHA and ORDC_FECHA <= :FECHA and OCDE_ANULADO = 'N' and OD.BODE_COD = :BODEGA
        into :ID, :ITEM, :CANT
        do
        begin
        execute procedure FALTANTE(23, 21, ID, ITEM) returning_values (PEDIDO, UND, FACTOR2);
        if (PEDIDO * FACTOR2 = CANT) then /* SI NO SE HA FACTURADO MIRE A VER SI SE REMISIONO */
            execute procedure FALTANTE(23, 22, ID, ITEM) returning_values (PEDIDO, UND, FACTOR2);
        if (PEDIDO is null) then
            PEDIDO = 0;
        ORDENC = ORDENC + PEDIDO * FACTOR2;
        end
    ORDENADO = ORDENADO + ORDENC;
    if (FACTOR <> 0) then
        ORDENADO = ORDENADO / FACTOR;
    select sum(RSDE_LIBERAR)
      from RESERVAS_DETALLE RD, RESERVAS R
      where R.RESE_ID = RD.RESE_ID and ARTI_COD = :ARTICULO and RESE_FECHA <= :FECHA and RESE_VENCE >= :FECHA and RD.BODE_COD = :BODEGA and RSDE_ANULADO = 'N'
      into :RESERVADO;
    if (RESERVADO is null) then
        RESERVADO = 0;
    PEDIDO = 0;
    for select P.PEDI_ID, PEDE_ITEM, PEDE_CANT * PEDE_FACTOR
        from PEDIDOS P, PEDIDOS_DETALLE PD
        where P.PEDI_ID = PD.PEDI_ID and PD.ARTI_COD = :ARTICULO and (PEDI_FECHA+PEDI_VALIDEZ) >= :FECHA and PEDI_FECHA <= :FECHA and PEDE_ANULADO = 'N' and BODE_COD = :BODEGA
        into :ID, :ITEM, :CANT
        do
        begin
        execute procedure FALTANTE(34, 31, ID, ITEM) returning_values (ORDENC, UND, FACTOR2);
        execute procedure LEE_CONFIGURACION('FACTURACION', 'FACTURAS', 'GENERAR PEDIDO AUTOMATICAMENTE CON LA FACTURA') returning_values (pedauto);
        if ((ORDENC * FACTOR2 = CANT) or (PEDAUTO = 'SI')) then /* SI NO SE HA FACTURADO MIRE A VER SI SE REMISIONO */
            execute procedure FALTANTE(34, 32, ID, ITEM) returning_values (ORDENC, UND, FACTOR2);
        if (ORDENC is null) then
            ORDENC = 0;
        PEDIDO = PEDIDO + ORDENC * FACTOR2;
        end
    RESERVADO = RESERVADO + PEDIDO;
    if (FACTOR <> 0) then
        RESERVADO = RESERVADO / FACTOR;
    /* VENTAS MES */
    FECHAAUX = cast (FECHA as varchar(10));
    FECHAAUX = SUBSTR(FECHAAUX, 1, 7) || '/01';
    FECINI = cast (FECHAAUX as date);
    execute procedure ventas_articulo (:ARTICULO, :FECINI, :FECHA, 0, :bodega) returning_values (:ventames, :mfac, :devmes, :mdev, :ivaf, :ivad);
    ventames = ventames - devmes;
    if (FACTOR <> 0) then
        ventames = ventames / FACTOR;
    /* FECHA COMPRA */
    fechacmp = null;
    cantcmp = 0;
    select first 1 FACO_FECHA, FCDE_CANT * FCDE_FACTOR from FACTURAS_COMPRA F, FACTURAS_COMPRAS_DETALLE D
        where F.FACO_ID = D.faco_id and D.ARTI_COD = :articulo and FACO_FECHA <= :FECHA and D.bode_cod = :BODEGA
        order by FACO_FECHA desc, F.FACO_ID desc
        into :fechacmp, :cantcmp;
    if (sugerido > 0) then
        SUSPEND;
    end
  END
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE PRODUCCION_SUGERIDA(
    FECHA DATE,
    MARCA VARCHAR(3))
RETURNS (
    ARTICULO VARCHAR(15),
    CANT NUMERIC(18,4),
    UNIDAD VARCHAR(8))
AS
declare variable GRUP VARCHAR(2);
declare variable SUBG VARCHAR(3);
declare variable FACTOR NUMERIC(15,4);
declare variable DIAS INTEGER;
declare variable EXISTENCIA NUMERIC(18,4);
declare variable PROMEDIO NUMERIC(18,4);
declare variable SALIDAS NUMERIC(18,4);
declare variable RESERVADO numeric(18,4);
declare variable pedido numeric(18,4);
declare variable ORDENC numeric(18,4);
declare variable cant2 numeric(18,4);
declare variable exceso integer;
declare variable id integer;
declare variable item integer;
declare variable UND varchar(8);
declare variable PEDAUTO VARCHAR(2);
BEGIN
--execute procedure lee_configuracion('INVENTARIO', 'ENSAMBLES', 'NUMERO DE DIAS DE CONSUMO A PRODUCIR') returning_values (:dias);
execute procedure lee_configuracion('INVENTARIO', 'ENSAMBLES', 'PORCENTAJE DE EXCEDENTE A PRODUCIR') returning_values (:exceso);
EXECUTE PROCEDURE LEE_CONFIGURACION('FACTURACION', 'FACTURAS', 'GENERAR PEDIDO AUTOMATICAMENTE CON LA FACTURA') returning_values (pedauto);
execute procedure lee_configuracion('INVENTARIO', 'ENSAMBLES', 'GRUPO DE LOS ARTICULOS A PRODUCIR') returning_values (:grup);
execute procedure lee_configuracion('INVENTARIO', 'ENSAMBLES', 'SUBGRUPO DE LOS ARTICULOS A PRODUCIR') returning_values (:subg);

FOR SELECT ARTI_COD, ARTI_UNIDAD, ARTI_DIAS FROM articulo
    WHERE ((GRUP_COD = :GRUP) or (:GRUP = ''))  AND ((SUBG_COD = :SUBG) or (:SUBG = '')) AND
    MARC_COD = :marca AND ESAR_COD <> 'I' AND ARTI_EXIST <> 'N' AND ARTI_ENSAMBLE = 'N'
    order by arti_COD
    INTO :articulo, unidad, :DIAS
    DO
    BEGIN
    execute procedure saldo_total_inventario (:articulo, :fecha) returning_values (:Existencia);
    EXECUTE PROCEDURE promedio_produccion_articulo (:ARTICULO, :FECHA) returning_values (:PROMEDIO, :SALIDAS);
    SELECT SUM(RSDE_LIBERAR)
        FROM RESERVAS_DETALLE RD, RESERVAS R
        WHERE R.RESE_ID = RD.RESE_ID AND ARTI_COD = :articulo AND RESE_FECHA <= :FECHA AND RESE_VENCE >= :FECHA AND RSDE_ANULADO = 'N'
        INTO :RESERVADO;
    if (RESERVADO IS NULL) then
        RESERVADO = 0;
    PEDIDO = 0;
    FOR SELECT P.PEDI_ID, PEDE_ITEM, PEDE_CANT * PEDE_FACTOR
        FROM PEDIDOS P, PEDIDOS_DETALLE PD
        WHERE P.PEDI_ID = PD.PEDI_ID AND PD.ARTI_COD = :articulo AND PEDI_VENCE >= :FECHA AND PEDI_FECHA <= :FECHA AND PEDE_ANULADO = 'N'
        INTO :ID, :ITEM, :CANT2
        do
        BEGIN
        EXECUTE PROCEDURE FALTANTE(34, 31, ID, ITEM) returning_values (ORDENC, UND, FACTOR);
        if ((ORDENC * FACTOR = CANT2) or (PEDAUTO = 'SI')) then /* SI NO SE HA FACTURADO MIRE A VER SI SE REMISIONO */
            EXECUTE PROCEDURE FALTANTE(34, 32, ID, ITEM) returning_values (ORDENC, UND, FACTOR);
        if (ORDENC IS NULL) then
            ORDENC = 0;
        PEDIDO = PEDIDO + ORDENC * FACTOR;
        END
    RESERVADO = RESERVADO + PEDIDO;

    PROMEDIO = PROMEDIO * DIAS;
    if (reservado > PROMEDIO) then
        PROMEDIO = RESERVADO;
    CANT = (PROMEDIO * (1 + exceso/100)) - EXISTENCIA;
    if (CANT > 0) then
        SUSPEND;
    END
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE REP_CRUCES_DOCUMENTO(
    TIPOORI INTEGER,
    TIPODES INTEGER,
    FECINI DATE,
    FECFIN DATE,
    ID INTEGER,
    CEROS CHAR(1),
    SUBEMPRESA INTEGER)
RETURNS (
    IDORI INTEGER,
    PREFORI VARCHAR(4),
    NUMORI VARCHAR(6),
    FECORI DATE,
    NIT VARCHAR(20),
    NOMCLIENTE VARCHAR(60),
    ITEM INTEGER,
    IDDES INTEGER,
    PREFDES VARCHAR(4),
    NUMDES VARCHAR(6),
    FECDES DATE,
    ARTIC VARCHAR(20),
    DESCRIPCION VARCHAR(60),
    CANTORI NUMERIC(18,2),
    CANTDES NUMERIC(18,2),
    UNIDAD VARCHAR(8),
    CODBOD VARCHAR(2),
    LOTE VARCHAR(20),
    OBS VARCHAR(255))
AS
declare variable FALTANTE NUMERIC(18,2);
declare variable FACTOR NUMERIC(18,4);
begin
  if (TIPOORI = 32) then
    FOR SELECT R.REVT_ID, R.PREF_PRE, REVT_NUMERO, REVT_FECHA, RVDE_ITEM, R.TERC_NIT, REVT_NOMTERC, ARTI_COD, SUBSTR(RVDE_DESC,1,60), RVDE_UNIDAD, RVDE_CANT, SUBSTRING(D.rvde_obs FROM 1 FOR 255)
      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)) AND ((:ID = 0) or (R.revt_id = :ID))
      ORDER BY REVT_FECHA, R.PREF_PRE, REVT_NUMERO, RVDE_ITEM
      INTO :IDORI, :PREFORI, :NUMORI, :FECORI, :ITEM, :NIT, :NOMCLIENTE, :ARTIC, :DESCRIPCION, :UNIDAD, :CANTORI, :OBS
      DO
        BEGIN
        EXECUTE PROCEDURE FALTANTE(:TIPOORI, :TIPODES, :IDORI, :ITEM) returning_values (:FALTANTE, :UNIDAD, :FACTOR);
        if ((CEROS = 'S') or (FALTANTE <> 0)) then
          BEGIN
          FOR SELECT COFA_CANT, COFA_UNIDAD, COFA_BODEGA, COFA_LOTE, SUBSTRING(CODE_OBSIT FROM 1 FOR 255), COFA_ID
            FROM CONSOLIDADO_FALTANTES WHERE COFA_TIPOORI = :TIPOORI AND COFA_IDORI = :IDORI AND COFA_OK = 'S' AND COFA_ITEMORI = :ITEM
            INTO :CANTDES, :UNIDAD, :CODBOD, :LOTE, :OBS, :IDDES
            DO
            BEGIN
            if (TIPODES = 31) then
                SELECT PREF_PRE, FACT_NUMERO, FACT_FECHA FROM FACTURAS WHERE FACT_CONSOLIDA = :IDDES AND FACT_ANULADO = 'N' INTO :PREFDES, :NUMDES, :FECDES;
            if (TIPODES = 32) then
                SELECT PREF_PRE, REVT_NUMERO, REVT_FECHA FROM remisiones_venta WHERE REVT_CONSOLIDA = :IDDES AND REVT_ANULADO = 'N' INTO :PREFDES, :NUMDES, :FECDES;
            if (TIPODES = 34) then
                SELECT PREF_PRE, PEDI_NUMERO, PEDI_FECHA FROM PEDIDOS WHERE PEDI_CONSOLIDA = :IDDES AND PEDI_ANULADO = 'N' INTO :PREFDES, :NUMDES, :FECDES;
            SUSPEND;
            END
          END
        END
  if (TIPOORI = 34) then
    FOR SELECT P.PEDI_ID, P.PREF_PRE, PEDI_NUMERO, PEDI_FECHA, PEDE_ITEM, P.TERC_NIT, PEDI_NOMTERC, ARTI_COD, SUBSTR(PEDE_DESC,1,60), PEDE_UNIDAD, PEDE_CANT, SUBSTRING(D.pede_obs FROM 1 FOR 255)
      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 PR.PREF_PRE = P.PREF_PRE AND PR.TIDO_COD = 34 AND ((PR.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) AND ((:ID = 0) or (P.pedi_id = :ID))
      ORDER BY PEDI_FECHA, P.PREF_PRE, PEDI_NUMERO, PEDE_ITEM
      INTO :IDORI, :PREFORI, :NUMORI, :FECORI, :ITEM, :NIT, :NOMCLIENTE, :ARTIC, :DESCRIPCION, :UNIDAD, :CANTORI, :OBS
      DO
        BEGIN
        EXECUTE PROCEDURE FALTANTE(:TIPOORI, :TIPODES, :IDORI,  :ITEM) returning_values (:FALTANTE, :UNIDAD, :FACTOR);
        if ((CEROS = 'S') or (FALTANTE <> 0)) then
          BEGIN
          FOR SELECT COFA_CANT, COFA_UNIDAD, COFA_BODEGA, COFA_LOTE, SUBSTRING(CODE_OBSIT FROM 1 FOR 255), COFA_ID
            FROM CONSOLIDADO_FALTANTES WHERE COFA_TIPOORI = :TIPOORI AND COFA_IDORI = :IDORI AND COFA_OK = 'S' AND COFA_ITEMORI = :ITEM
            INTO :CANTDES, :UNIDAD, :CODBOD, :LOTE, :OBS, :IDDES
            DO
            BEGIN
            if (TIPODES = 31) then
                SELECT PREF_PRE, FACT_NUMERO, FACT_FECHA FROM FACTURAS WHERE FACT_CONSOLIDA = :IDDES AND FACT_ANULADO = 'N' INTO :PREFDES, :NUMDES, :FECDES;
            if (TIPODES = 32) then
                SELECT PREF_PRE, REVT_NUMERO, REVT_FECHA FROM remisiones_venta WHERE REVT_CONSOLIDA = :IDDES AND REVT_ANULADO = 'N' INTO :PREFDES, :NUMDES, :FECDES;
            if (TIPODES = 34) then
                SELECT PREF_PRE, PEDI_NUMERO, PEDI_FECHA FROM PEDIDOS WHERE PEDI_CONSOLIDA = :IDDES AND PEDI_ANULADO = 'N' INTO :PREFDES, :NUMDES, :FECDES;
            SUSPEND;
            END
          END
        END
  if (TIPOORI = 35) then
    FOR SELECT C.COTI_ID, C.PREF_PRE, COTI_NUMERO, COTI_FECHA, CTDE_ITEM, C.TERC_NIT, COTI_NOMTERC, ARTI_COD, SUBSTR(CTDE_DESC,1,60), CTDE_UNIDAD, CTDE_CANT, SUBSTRING(D.ctde_obs FROM 1 FOR 255)
      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)) AND ((:ID = 0) or (C.coti_id = :ID))
      ORDER BY COTI_FECHA, C.PREF_PRE, COTI_NUMERO, CTDE_ITEM
      INTO :IDORI, :PREFORI, :NUMORI, :FECORI, :ITEM, :NIT, :NOMCLIENTE, :ARTIC, :DESCRIPCION, :UNIDAD, :CANTORI, :OBS
      DO
        BEGIN
        EXECUTE PROCEDURE FALTANTE(:TIPOORI, :TIPODES, :IDORI,  :ITEM) returning_values (:FALTANTE, :UNIDAD, :FACTOR);
        if ((CEROS = 'S') or (FALTANTE <> 0)) then
          BEGIN
          FOR SELECT COFA_CANT, COFA_UNIDAD, COFA_BODEGA, COFA_LOTE, SUBSTRING(CODE_OBSIT FROM 1 FOR 255), COFA_ID
            FROM CONSOLIDADO_FALTANTES WHERE COFA_TIPOORI = :TIPOORI AND COFA_IDORI = :IDORI AND COFA_OK = 'S' AND COFA_ITEMORI = :ITEM
            INTO :CANTDES, :UNIDAD, :CODBOD, :LOTE, :OBS, :IDDES
            DO
            BEGIN
            if (TIPODES = 31) then
                SELECT PREF_PRE, FACT_NUMERO, FACT_FECHA FROM FACTURAS WHERE FACT_CONSOLIDA = :IDDES AND FACT_ANULADO = 'N' INTO :PREFDES, :NUMDES, :FECDES;
            if (TIPODES = 32) then
                SELECT PREF_PRE, REVT_NUMERO, REVT_FECHA FROM remisiones_venta WHERE REVT_CONSOLIDA = :IDDES AND REVT_ANULADO = 'N' INTO :PREFDES, :NUMDES, :FECDES;
            if (TIPODES = 34) then
                SELECT PREF_PRE, PEDI_NUMERO, PEDI_FECHA FROM PEDIDOS WHERE PEDI_CONSOLIDA = :IDDES AND PEDI_ANULADO = 'N' INTO :PREFDES, :NUMDES, :FECDES;
            SUSPEND;
            END
          END
        END
  if (TIPOORI = 40) then /* pendientes */
    FOR SELECT P.pend_id, P.pref_pre, p.pend_numero, p.pend_fecha, d.pevd_item, P.terc_nit, p.pend_nomcli, d.arti_cod, SUBSTR(d.pevd_desc,1,60), d.pevd_unidad, d.pevd_cant, SUBSTRING(D.pevd_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)) AND ((:ID = 0) or (P.pend_id = :ID))
      ORDER BY PEND_FECHA, P.PREF_PRE, PEND_NUMERO, pevd_item
      INTO :IDORI, :PREFORI, :NUMORI, :FECORI, :ITEM, :NIT, :NOMCLIENTE, :ARTIC, :DESCRIPCION, :UNIDAD, :CANTORI, :OBS
      DO
        BEGIN
        EXECUTE PROCEDURE FALTANTE(:TIPOORI, :TIPODES, :IDORI,  :ITEM) returning_values (:FALTANTE, :UNIDAD, :FACTOR);
        if ((CEROS = 'S') or (FALTANTE <> 0)) then
          BEGIN
          FOR SELECT COFA_CANT, COFA_UNIDAD, COFA_BODEGA, COFA_LOTE, SUBSTRING(CODE_OBSIT FROM 1 FOR 255), COFA_ID
            FROM CONSOLIDADO_FALTANTES WHERE COFA_TIPOORI = :TIPOORI AND COFA_IDORI = :IDORI AND COFA_OK = 'S' AND COFA_ITEMORI = :ITEM
            INTO :CANTDES, :UNIDAD, :CODBOD, :LOTE, :OBS, :IDDES
            DO
            BEGIN
            if (TIPODES = 31) then
                SELECT PREF_PRE, FACT_NUMERO, FACT_FECHA FROM FACTURAS WHERE FACT_CONSOLIDA = :IDDES AND FACT_ANULADO = 'N' INTO :PREFDES, :NUMDES, :FECDES;
            if (TIPODES = 32) then
                SELECT PREF_PRE, REVT_NUMERO, REVT_FECHA FROM remisiones_venta WHERE REVT_CONSOLIDA = :IDDES AND REVT_ANULADO = 'N' INTO :PREFDES, :NUMDES, :FECDES;
            if (TIPODES = 34) then
                SELECT PREF_PRE, PEDI_NUMERO, PEDI_FECHA FROM PEDIDOS WHERE PEDI_CONSOLIDA = :IDDES AND PEDI_ANULADO = 'N' INTO :PREFDES, :NUMDES, :FECDES;
            SUSPEND;
            END
          END
        END
end
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE REP_FALTANTES_CLIENTES(
    TERINI VARCHAR(20),
    TERFIN VARCHAR(20),
    FECINI DATE,
    FECFIN DATE,
    DETALLE CHAR(1),
    TIPO INTEGER,
    DESTINO INTEGER,
    ARTINI VARCHAR(15),
    ARTFIN VARCHAR(15),
    ORDEN CHAR(1),
    CEROS CHAR(1),
    CORTE DATE,
    SUBEMPRESA INTEGER)
RETURNS (
    NIT VARCHAR(20),
    SUCURSAL VARCHAR(10),
    NOMBRE VARCHAR(60),
    TELEFONO VARCHAR(40),
    CIUDAD VARCHAR(40),
    CODZONA VARCHAR(2),
    NOMZONA VARCHAR(60),
    NOMTIPO VARCHAR(50),
    ARTICULO VARCHAR(15),
    DESCRIPCION VARCHAR(60),
    CODGRUPO VARCHAR(2),
    NOMGRUPO VARCHAR(30),
    CODSUBG VARCHAR(3),
    NOMSUBG VARCHAR(30),
    CODMARC VARCHAR(3),
    NOMMARC VARCHAR(30),
    CANTIDAD NUMERIC(18,4),
    UNIDAD VARCHAR(8),
    FALTANTE NUMERIC(18,4),
    BASE NUMERIC(18,2),
    IVA NUMERIC(18,2),
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(8),
    FECHA DATE,
    PTVTA INTEGER,
    OBS VARCHAR(255))
AS
declare variable ID INTEGER;
declare variable ITEM INTEGER;
declare variable CODINI VARCHAR(15);
declare variable CODFIN VARCHAR(15);
declare variable DESINI VARCHAR(15);
declare variable DESFIN VARCHAR(15);
declare variable FACTOR NUMERIC(18,4);
declare variable CANT NUMERIC(18,4);
declare variable MONTO NUMERIC(18,2);
declare variable artiaux VARCHAR(20);
BEGIN
if (ORDEN = 'C') then
    BEGIN
    CODINI = ARTINI;
    CODFIN = ARTFIN;
    DESINI = '';
    DESFIN = 'zz';
    END
ELSE
    BEGIN
    DESINI = ARTINI;
    DESFIN = ARTFIN;
    CODINI = '';
    CODFIN = 'zz';
    END
SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = :TIPO INTO :NOMTIPO;
/*FOR select T.TERC_NIT, TERC_NOM,  TERC_TEL, TERC_CIU, ZONA_COD
    from terceros T, CLIENTES C*/
FOR select c.terc_nit,s.clsu_nombre,s.clsu_tel,s.clsu_ciudad,s.zona_cod,s.clcu_cod
    from clientes c, cliente_sucursales s
    where C.TERC_NIT = s.TERC_NIT and C.TERC_NIT >= :TERINI AND C.TERC_NIT <= :TERFIN
    INTO :NIT, :NOMBRE, :TELEFONO, :CIUDAD, :CODZONA, :sucursal
    DO  
    BEGIN
    CANTIDAD = 0;
    FALTANTE = 0;
    BASE = 0;
    SELECT ZONA_NOM FROM ZONAS WHERE ZONA_COD = :CODZONA INTO :NOMZONA;
    if (DETALLE = 'N') then
        BEGIN
        ARTICULO = '';
        if (TIPO = 31) then
            FOR SELECT F.FACT_ID, FADE_ITEM, D.ARTI_COD, FADE_CANT * FADE_FACTOR, (FADE_PRUNIT-FADE_DTOMONTO), F.ptvt_id
                FROM FACTURAS_DETALLE D, FACTURAS F, ARTICULO A, PREFIJOS P
                WHERE F.FACT_ID = D.FACT_ID AND FACT_FECHA >= :FECINI AND FACT_FECHA <= :FECFIN AND TERC_NIT = :NIT AND FACT_ANULADO = 'N' AND
                      D.ARTI_COD = A.ARTI_COD AND D.ARTI_COD >= :CODINI AND D.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
                      P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 31 AND ((P.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) and f.fact_sucursal = :sucursal and substring(a.arti_cod from 1 FOR 2) <> '.t'
                ORDER BY ARTI_COD, F.FACT_ID, FADE_ITEM INTO :ID, :ITEM, :ARTIAUX, :CANT,  :MONTO, :PTVTA
                DO
                BEGIN
                if (artiaux <> articulo) then
                    begin
                    if (ARTICULO <> '') then
                        SUSPEND;
                    SELECT ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                        FROM articulo WHERE ARTI_COD = :ARTIAUX
                        INTO :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC;
                    SELECT GRUP_NOM FROM GRUPO 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;
                    ARTICULO = ARTIAUX;
                    CANTIDAD = 0;
                    FALTANTE = 0;
                    BASE = 0;
                    end
                CANTIDAD = CANTIDAD + CANT;
                EXECUTE PROCEDURE FALTANTE_CORTE(:TIPO, :DESTINO, :ID, :ITEM, :CORTE) returning_values (:CANT, :UNIDAD, :FACTOR);
                FALTANTE = FALTANTE + CANT;
                BASE = BASE + (MONTO * CANT);
                END
        if (TIPO = 32) then
            FOR SELECT R.revt_id, rvde_item, D.ARTI_COD, RVDE_CANT * RVDE_FACTOR, (RVDE_PRUNIT-RVDE_DTOMONTO), R.ptvt_id
                FROM REMISIONES_VENTA_DETALLE D, REMISIONES_VENTA R, ARTICULO A, PREFIJOS P
                WHERE R.REVT_ID = D.REVT_ID AND REVT_FECHA >= :FECINI AND REVT_FECHA <= :FECFIN AND TERC_NIT = :NIT AND REVT_ANULADO = 'N' AND
                      D.ARTI_COD = A.ARTI_COD AND D.ARTI_COD >= :CODINI AND D.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
                      P.PREF_PRE = R.PREF_PRE AND P.TIDO_COD = 32 AND ((P.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) and r.revt_sucursal = :sucursal
                ORDER BY ARTI_COD, R.REVT_ID, RVDE_ITEM INTO :ID, :ITEM, :ARTIAUX, :CANT, :MONTO, :PTVTA
                DO
                BEGIN
                if (artiaux <> articulo) then
                    begin
                    if (ARTICULO <> '') then
                        SUSPEND;
                    SELECT ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                        FROM articulo WHERE ARTI_COD = :ARTIAUX
                        INTO :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC;
                    SELECT GRUP_NOM FROM GRUPO 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;
                    ARTICULO = ARTIAUX;
                    CANTIDAD = 0;
                    FALTANTE = 0;
                    BASE = 0;
                    end
                CANTIDAD = CANTIDAD + CANT;
                EXECUTE PROCEDURE FALTANTE_CORTE(:TIPO, :DESTINO, :ID, :ITEM, :CORTE) returning_values (:CANT, :UNIDAD, :FACTOR);
                FALTANTE = FALTANTE + CANT;
                BASE = BASE + (MONTO * CANT);
                END
        if (TIPO = 34) then
            FOR SELECT P.PEDI_ID, PEDE_ITEM, D.ARTI_COD, PEDE_CANT * PEDE_FACTOR, (PEDE_PRUNIT-PEDE_DTOMONTO), P.ptvt_id
                FROM PEDIDOS_DETALLE D, PEDIDOS P, ARTICULO A, PREFIJOS PR
                WHERE P.PEDI_ID = D.PEDI_ID AND PEDI_FECHA >= :FECINI AND PEDI_FECHA <= :FECFIN AND TERC_NIT = :NIT AND PEDI_ANULADO = 'N' AND PEDI_VALIDEZ >= 0 AND
                      D.ARTI_COD = A.ARTI_COD AND D.ARTI_COD >= :CODINI AND D.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
                      PR.PREF_PRE = P.PREF_PRE AND PR.TIDO_COD = 34 AND ((PR.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) and p.pedi_sucursal = :sucursal
                ORDER BY ARTI_COD, P.PEDI_ID, PEDE_ITEM INTO :ID, :ITEM, :ARTIAUX, :CANT, :MONTO, :PTVTA
                DO
                BEGIN
                if (artiaux <> articulo) then
                    begin
                    if (ARTICULO <> '') then
                        SUSPEND;
                    SELECT ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                        FROM articulo WHERE ARTI_COD = :ARTIAUX
                        INTO :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC;
                    SELECT GRUP_NOM FROM GRUPO 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;
                    ARTICULO = ARTIAUX;
                    CANTIDAD = 0;
                    FALTANTE = 0;
                    BASE = 0;
                    end
                CANTIDAD = CANTIDAD + CANT;
                EXECUTE PROCEDURE FALTANTE_CORTE(:TIPO, :DESTINO, :ID, :ITEM, :CORTE) returning_values (:CANT, :UNIDAD, :FACTOR);
                FALTANTE = FALTANTE + CANT;
                BASE = BASE + (MONTO * CANT);
                END
        if (TIPO = 35) then
            FOR SELECT C.COTI_ID, CTDE_ITEM, D.ARTI_COD, CTDE_CANT * CTDE_FACTOR, (CTDE_PRUNIT-CTDE_DTOMONTO), C.ptvt_id
                FROM COTIZACIONES_DETALLE D, COTIZACIONES C, ARTICULO A, PREFIJOS P
                WHERE C.COTI_ID = D.COTI_ID AND COTI_FECHA >= :FECINI AND COTI_FECHA <= :FECFIN AND TERC_NIT = :NIT AND COTI_ANULADO = 'N' AND
                      D.ARTI_COD = A.ARTI_COD AND D.ARTI_COD >= :CODINI AND D.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
                      P.PREF_PRE = C.PREF_PRE AND P.TIDO_COD = 35 AND ((P.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) and c.coti_sucursal = :sucursal
                ORDER BY ARTI_COD, C.COTI_ID, CTDE_ITEM INTO :ID, :ITEM, :ARTIAUX, :CANT, :MONTO, :PTVTA
                DO
                BEGIN
                if (artiaux <> articulo) then
                    begin
                    if (ARTICULO <> '') then
                        SUSPEND;
                    SELECT ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                        FROM articulo WHERE ARTI_COD = :ARTIAUX
                        INTO :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC;
                    SELECT GRUP_NOM FROM GRUPO 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;
                    ARTICULO = ARTIAUX;
                    CANTIDAD = 0;
                    FALTANTE = 0;
                    BASE = 0;
                    end
                CANTIDAD = CANTIDAD + CANT;
                EXECUTE PROCEDURE FALTANTE_CORTE(:TIPO, :DESTINO, :ID, :ITEM, :CORTE) returning_values (:CANT, :UNIDAD, :FACTOR);
                FALTANTE = FALTANTE + CANT;
                BASE = BASE + (MONTO * CANT);
                END
        if (TIPO = 40) then
            FOR SELECT P.pend_id, D.pevd_item, D.ARTI_COD, D.pevd_cant * D.pevd_factor, (D.pevd_prunit-D.pevd_dtomonto)
                FROM pendiente_ventas_detalle D, pendiente_ventas P, ARTICULO A, PREFIJOS PR
                WHERE P.pend_id = D.pend_id AND PEND_FECHA >= :FECINI AND PEND_FECHA <= :FECFIN AND TERC_NIT = :NIT AND PEND_ANULADO = 'N' AND
                      D.ARTI_COD = A.ARTI_COD AND D.ARTI_COD >= :CODINI AND D.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
                      PR.PREF_PRE = P.PREF_PRE AND PR.TIDO_COD = 40 AND ((PR.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) and p.pend_sucursal = :sucursal
                ORDER BY ARTI_COD, P.pend_id, D.pevd_item INTO :ID, :ITEM, :ARTIAUX, :CANT, :MONTO
                DO
                BEGIN
                if (artiaux <> articulo) then
                    begin
                    if (ARTICULO <> '') then
                        SUSPEND;
                    SELECT ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                        FROM articulo WHERE ARTI_COD = :ARTIAUX
                        INTO :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC;
                    SELECT GRUP_NOM FROM GRUPO 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;
                    ARTICULO = ARTIAUX;
                    CANTIDAD = 0;
                    FALTANTE = 0;
                    BASE = 0;
                    end
                CANTIDAD = CANTIDAD + CANT;
                EXECUTE PROCEDURE FALTANTE(:TIPO, :DESTINO, :ID, :ITEM) returning_values (:CANT, :UNIDAD, :FACTOR);
                FALTANTE = FALTANTE + CANT;
                BASE = BASE + (MONTO * CANT);
                END
        if (FALTANTE IS NULL) then
            FALTANTE = 0;
        if (BASE IS NULL) then
            BASE = 0;
        if (IVA IS NULL) then
            IVA = 0;
        if ((CEROS = 'S') or (FALTANTE <> 0)) then
            SUSPEND;
        END
    ELSE
        BEGIN
        if (TIPO = 31) then
            FOR SELECT F.FACT_ID, FADE_ITEM, F.PREF_PRE, FACT_NUMERO, FACT_FECHA, FADE_CANT * FADE_FACTOR, (FADE_PRUNIT-FADE_DTOMONTO), FADE_IVAMONTO, D.ARTI_COD, ARTI_DES, ARTI_UNIDAD, A.GRUP_COD, A.SUBG_COD, A.MARC_COD, SUBSTRING(FACT_OBS FROM 1 FOR 255), F.ptvt_id
                FROM FACTURAS F, FACTURAS_DETALLE D, ARTICULO A, PREFIJOS P
                WHERE F.FACT_ID = D.FACT_ID AND FACT_FECHA >= :FECINI AND FACT_FECHA <= :FECFIN  AND TERC_NIT = :NIT AND FACT_ANULADO = 'N' AND
                      D.ARTI_COD = A.ARTI_COD AND D.ARTI_COD >= :CODINI AND D.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
                      P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 31 AND ((P.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) and f.fact_sucursal = :sucursal and substring(a.arti_cod from 1 FOR 2) <> '.t'
                ORDER BY D.ARTI_COD, F.FACT_ID, FADE_ITEM
                INTO :ID, :ITEM, :PREFIJO, :NUMERO, :FECHA, :CANTIDAD, :BASE, :IVA, :ARTICULO, :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC, :OBS, :PTVTA
                DO
                    BEGIN
                    SELECT GRUP_NOM FROM GRUPO WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                    SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                    SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                    EXECUTE PROCEDURE FALTANTE_CORTE(:TIPO, :DESTINO, :ID, :ITEM, :CORTE) returning_values (:FALTANTE, :UNIDAD, :FACTOR);
                    if ((CEROS = 'S') or (FALTANTE <> 0)) then
                        SUSPEND;
                    END
        if (TIPO = 32) then
            FOR SELECT R.REVT_ID, RVDE_ITEM, R.PREF_PRE, REVT_NUMERO, REVT_FECHA, RVDE_CANT * RVDE_FACTOR, (RVDE_PRUNIT-RVDE_DTOMONTO), RVDE_IVAMONTO, D.ARTI_COD, ARTI_DES, ARTI_UNIDAD, A.GRUP_COD, A.SUBG_COD, A.MARC_COD, SUBSTRING(REVT_OBS FROM 1 FOR 255), R.ptvt_id
                FROM REMISIONES_VENTA R, REMISIONES_VENTA_DETALLE D, ARTICULO A, PREFIJOS P
                WHERE R.REVT_ID = D.REVT_ID AND REVT_FECHA >= :FECINI AND REVT_FECHA <= :FECFIN AND TERC_NIT = :NIT AND REVT_ANULADO = 'N' AND
                      D.ARTI_COD = A.ARTI_COD AND D.ARTI_COD >= :CODINI AND D.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
                      P.PREF_PRE = R.PREF_PRE AND P.TIDO_COD = 32 AND ((P.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) and r.revt_sucursal = :sucursal
                ORDER BY D.ARTI_COD, R.REVT_ID, RVDE_ITEM
                INTO :ID, :ITEM, :PREFIJO, :NUMERO, :FECHA, :CANTIDAD, :BASE, :IVA, :ARTICULO, :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC, :OBS, :PTVTA
                DO
                    BEGIN
                    SELECT GRUP_NOM FROM GRUPO WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                    SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                    SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                    EXECUTE PROCEDURE FALTANTE_CORTE(:TIPO, :DESTINO, :ID, :ITEM, :CORTE) returning_values (:FALTANTE, :UNIDAD, :FACTOR);
                    if ((CEROS = 'S') or (FALTANTE <> 0)) then
                        SUSPEND;
                    END
        if (TIPO = 34) then
            FOR SELECT P.PEDI_ID, PEDE_ITEM, P.PREF_PRE, PEDI_NUMERO, PEDI_FECHA, PEDE_CANT * PEDE_FACTOR, (PEDE_PRUNIT-PEDE_DTOMONTO), PEDE_IVAMONTO, D.ARTI_COD, ARTI_DES, ARTI_UNIDAD, A.GRUP_COD, A.SUBG_COD, A.MARC_COD, SUBSTRING(PEDI_OBS FROM 1 FOR 255), P.ptvt_id
                FROM PEDIDOS P, PEDIDOS_DETALLE D, ARTICULO A, PREFIJOS PR
                WHERE P.PEDI_ID = D.PEDI_ID AND PEDI_FECHA >= :FECINI AND PEDI_FECHA <= :FECFIN AND TERC_NIT = :NIT AND PEDI_ANULADO = 'N' AND PEDI_VALIDEZ >= 0 AND
                      D.ARTI_COD = A.ARTI_COD AND D.ARTI_COD >= :CODINI AND D.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
                      P.PREF_PRE = PR.PREF_PRE AND PR.TIDO_COD = 34 AND ((PR.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) and p.pedi_sucursal = :sucursal
                ORDER BY D.ARTI_COD, P.PEDI_ID, PEDE_ITEM
                INTO :ID, :ITEM, PREFIJO, :NUMERO, :FECHA, :CANTIDAD, :BASE, :IVA, :ARTICULO, :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC, :OBS, :PTVTA
                DO
                    BEGIN
                    SELECT GRUP_NOM FROM GRUPO WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                    SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                    SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                    EXECUTE PROCEDURE FALTANTE_CORTE(:TIPO, :DESTINO, :ID, :ITEM, :CORTE) returning_values (:FALTANTE, :UNIDAD, :FACTOR);
                    if ((CEROS = 'S') or (FALTANTE <> 0)) then
                        SUSPEND;
                    END
        if (TIPO = 35) then
            FOR SELECT C.COTI_ID, CTDE_ITEM, C.PREF_PRE, COTI_NUMERO, COTI_FECHA, CTDE_CANT * CTDE_FACTOR, (CTDE_PRUNIT-CTDE_DTOMONTO), CTDE_IVAMONTO, D.ARTI_COD, ARTI_DES, ARTI_UNIDAD, A.GRUP_COD, A.SUBG_COD, A.MARC_COD, SUBSTRING(COTI_OBS FROM 1 FOR 255), C.ptvt_id
                FROM COTIZACIONES C, COTIZACIONES_DETALLE D, ARTICULO A, PREFIJOS P
                WHERE C.COTI_ID = D.COTI_ID AND COTI_FECHA >= :FECINI AND COTI_FECHA <= :FECFIN AND TERC_NIT = :NIT AND COTI_ANULADO = 'N' AND
                      D.ARTI_COD = A.ARTI_COD AND D.ARTI_COD >= :CODINI AND D.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
                      P.PREF_PRE = C.PREF_PRE AND P.TIDO_COD = 35 AND ((P.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) and c.coti_sucursal = :sucursal
                ORDER BY D.ARTI_COD, C.COTI_ID, CTDE_ITEM
                INTO :ID, :ITEM, PREFIJO, :NUMERO, :FECHA, :CANTIDAD, :BASE, :IVA, :ARTICULO, :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC, :OBS, :PTVTA
                DO
                    BEGIN
                    SELECT GRUP_NOM FROM GRUPO WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                    SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                    SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                    EXECUTE PROCEDURE FALTANTE_CORTE(:TIPO, :DESTINO, :ID, :ITEM, :CORTE) returning_values (:FALTANTE, :UNIDAD, :FACTOR);
                    if ((CEROS = 'S') or (FALTANTE <> 0)) then
                        SUSPEND;
                    END
        if (TIPO = 40) then
            FOR SELECT P.pend_id, D.pevd_item, P.PREF_PRE, P.pend_numero, P.pend_fecha, D.pevd_cant * D.pevd_factor, (D.pevd_prunit-D.pevd_dtomonto), D.pevd_ivamonto, D.ARTI_COD, ARTI_DES, ARTI_UNIDAD, A.GRUP_COD, A.SUBG_COD, A.MARC_COD, SUBSTRING(P.pend_obs FROM 1 FOR 255)
                FROM pendiente_ventas P, pendiente_ventas_detalle D, ARTICULO A, PREFIJOS PR
                WHERE P.pend_id = D.pend_id AND PEND_FECHA >= :FECINI AND PEND_FECHA <= :FECFIN AND TERC_NIT = :NIT AND PEND_ANULADO = 'N' AND
                      D.ARTI_COD = A.ARTI_COD AND D.ARTI_COD >= :CODINI AND D.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
                      P.PREF_PRE = PR.PREF_PRE AND PR.TIDO_COD = 40 AND ((PR.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) and p.pend_sucursal = :sucursal
                ORDER BY D.ARTI_COD, P.pend_id, D.pevd_item
                INTO :ID, :ITEM, PREFIJO, :NUMERO, :FECHA, :CANTIDAD, :BASE, :IVA, :ARTICULO, :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC, :OBS
                DO
                    BEGIN
                    SELECT GRUP_NOM FROM GRUPO WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                    SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                    SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                    EXECUTE PROCEDURE FALTANTE(:TIPO, :DESTINO, :ID, :ITEM) returning_values (:FALTANTE, :UNIDAD, :FACTOR);
                    if ((CEROS = 'S') or (FALTANTE <> 0)) then
                        SUSPEND;
                    END
        END
    END
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE REP_FALTANTES_VENDEDOR(
    VENINI VARCHAR(20),
    VENFIN VARCHAR(20),
    FECINI DATE,
    FECFIN DATE,
    DETALLE CHAR(1),
    TIPO INTEGER,
    DESTINO INTEGER,
    ARTINI VARCHAR(15),
    ARTFIN VARCHAR(15),
    ORDEN CHAR(1),
    CEROS CHAR(1),
    CORTE DATE,
    SUBEMPRESA INTEGER)
RETURNS (
    CODVEND VARCHAR(20),
    NOMVEND VARCHAR(60),
    NOMTIPO VARCHAR(50),
    ARTICULO VARCHAR(15),
    DESCRIPCION VARCHAR(60),
    CODGRUPO VARCHAR(2),
    NOMGRUPO VARCHAR(30),
    CODSUBG VARCHAR(3),
    NOMSUBG VARCHAR(30),
    CODMARC VARCHAR(3),
    NOMMARC VARCHAR(30),
    CANTIDAD NUMERIC(18,4),
    UNIDAD VARCHAR(8),
    FALTANTE NUMERIC(18,4),
    BASE NUMERIC(18,2),
    IVA NUMERIC(18,2),
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(8),
    FECHA DATE,
    PTVTA INTEGER,
    OBS VARCHAR(255))
AS
declare variable ID INTEGER;
declare variable ITEM INTEGER;
declare variable CODINI VARCHAR(15);
declare variable CODFIN VARCHAR(15);
declare variable DESINI VARCHAR(15);
declare variable DESFIN VARCHAR(15);
declare variable FACTOR NUMERIC(18,4);
declare variable CANT NUMERIC(18,4);
declare variable MONTO NUMERIC(18,2);
declare variable artiaux VARCHAR(20);
BEGIN
if (ORDEN = 'C') then
    BEGIN
    CODINI = ARTINI;
    CODFIN = ARTFIN;
    DESINI = '';
    DESFIN = 'zz';
    END
ELSE
    BEGIN
    DESINI = ARTINI;
    DESFIN = ARTFIN;
    CODINI = '';
    CODFIN = 'zz';
    END

  SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = :TIPO INTO :NOMTIPO;
  /*FOR select VEND_COD, VEND_NOMBRE
    from VENDEDORES where VEND_COD >= :VENINI AND VEND_COD <= :VENFIN
    INTO :CODVEND, :NOMVEND
    DO  
    BEGIN*/
    if (DETALLE = 'N') then
        BEGIN
        ARTICULO = '';
        if (TIPO = 31) then
            FOR SELECT F.FACT_ID, FADE_ITEM, D.ARTI_COD, FADE_CANT * FADE_FACTOR, (FADE_PRUNIT-FADE_DTOMONTO),f.vend_cod, F.ptvt_id
                FROM FACTURAS_DETALLE D, FACTURAS F, ARTICULO A, PREFIJOS P
                WHERE F.FACT_ID = D.FACT_ID AND FACT_FECHA >= :FECINI AND FACT_FECHA <= :FECFIN AND VEND_COD >= :VENINI AND VEND_COD <= :VENFIN AND FACT_ANULADO = 'N' AND
                      D.ARTI_COD = A.ARTI_COD AND D.ARTI_COD >= :CODINI AND D.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
                      P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 31 AND ((P.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) and substring(a.arti_cod from 1 FOR 2) <> '.t'
                ORDER BY VEND_COD,ARTI_COD, F.FACT_ID, FADE_ITEM INTO :ID, :ITEM, :ARTIAUX, :CANT,  :MONTO,:CODVEND, :PTVTA
                DO
                BEGIN
                select VEND_NOMBRE from VENDEDORES where  VEND_COD = :CODVEND INTO :NOMVEND;
                if (artiaux <> articulo) then
                    begin
                    if (ARTICULO <> '') then
                      if ((CEROS = 'S') or (FALTANTE <> 0)) then
                        SUSPEND;
                    SELECT ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                        FROM articulo WHERE ARTI_COD = :ARTIAUX
                        INTO :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC;
                    SELECT GRUP_NOM FROM GRUPO 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;
                    ARTICULO = ARTIAUX;
                    CANTIDAD = 0;
                    FALTANTE = 0;
                    BASE = 0;
                    end
                CANTIDAD = CANTIDAD + CANT;
                EXECUTE PROCEDURE FALTANTE_CORTE(:TIPO, :DESTINO, :ID, :ITEM, :CORTE) returning_values (:CANT, :UNIDAD, :FACTOR);
                FALTANTE = FALTANTE + CANT;
                BASE = BASE + (MONTO * CANT);
                END
        if (TIPO = 32) then
            FOR SELECT R.revt_id, rvde_item, D.ARTI_COD, RVDE_CANT * RVDE_FACTOR, (RVDE_PRUNIT-RVDE_DTOMONTO),R.vend_cod, R.ptvt_id
                FROM REMISIONES_VENTA_DETALLE D, REMISIONES_VENTA R, ARTICULO A, PREFIJOS P
                WHERE R.REVT_ID = D.REVT_ID AND REVT_FECHA >= :FECINI AND REVT_FECHA <= :FECFIN AND VEND_COD >= :VENINI AND VEND_COD <= :VENFIN AND REVT_ANULADO = 'N' AND
                      D.ARTI_COD = A.ARTI_COD AND D.ARTI_COD >= :CODINI AND D.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
                      P.PREF_PRE = R.PREF_PRE AND P.TIDO_COD = 32 AND ((P.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
                ORDER BY VEND_COD,ARTI_COD, R.REVT_ID, RVDE_ITEM INTO :ID, :ITEM, :ARTIAUX, :CANT, :MONTO,:CODVEND, :PTVTA
                DO
                BEGIN
                select VEND_NOMBRE from VENDEDORES where  VEND_COD = :CODVEND INTO :NOMVEND;
                if (artiaux <> articulo) then
                    begin
                    if (ARTICULO <> '') then
                      if ((CEROS = 'S') or (FALTANTE <> 0)) then
                        SUSPEND;
                    SELECT ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                        FROM articulo WHERE ARTI_COD = :ARTIAUX
                        INTO :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC;
                    SELECT GRUP_NOM FROM GRUPO 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;
                    ARTICULO = ARTIAUX;
                    CANTIDAD = 0;
                    FALTANTE = 0;
                    BASE = 0;
                    end
                CANTIDAD = CANTIDAD + CANT;
                EXECUTE PROCEDURE FALTANTE_CORTE(:TIPO, :DESTINO, :ID, :ITEM, :CORTE) returning_values (:CANT, :UNIDAD, :FACTOR);
                FALTANTE = FALTANTE + CANT;
                BASE = BASE + (MONTO * CANT);
                END
        if (TIPO = 34) then
            FOR SELECT P.PEDI_ID, PEDE_ITEM, D.ARTI_COD, PEDE_CANT * PEDE_FACTOR, (PEDE_PRUNIT-PEDE_DTOMONTO),p.vend_cod, P.ptvt_id
                FROM PEDIDOS_DETALLE D, PEDIDOS P, ARTICULO A, PREFIJOS PR
                WHERE P.PEDI_ID = D.PEDI_ID AND PEDI_FECHA >= :FECINI AND PEDI_FECHA <= :FECFIN AND VEND_COD >= :VENINI AND VEND_COD <= :VENFIN AND PEDI_ANULADO = 'N' AND
                      D.ARTI_COD = A.ARTI_COD AND D.ARTI_COD >= :CODINI AND D.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
                      PR.PREF_PRE = P.PREF_PRE AND PR.TIDO_COD = 34 AND ((PR.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) AND PEDI_VALIDEZ >= 0
                ORDER BY VEND_COD,ARTI_COD, P.PEDI_ID, PEDE_ITEM INTO :ID, :ITEM, :ARTIAUX, :CANT, :MONTO,:CODVEND, :PTVTA
                DO
                BEGIN
                select VEND_NOMBRE from VENDEDORES where  VEND_COD = :CODVEND INTO :NOMVEND;
                if (artiaux <> articulo) then
                    begin
                    if (ARTICULO <> '') then
                      if ((CEROS = 'S') or (FALTANTE <> 0)) then
                        SUSPEND;
                    SELECT ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                        FROM articulo WHERE ARTI_COD = :ARTIAUX
                        INTO :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC;
                    SELECT GRUP_NOM FROM GRUPO 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;
                    ARTICULO = ARTIAUX;
                    CANTIDAD = 0;
                    FALTANTE = 0;
                    BASE = 0;
                    end
                CANTIDAD = CANTIDAD + CANT;
                EXECUTE PROCEDURE FALTANTE_CORTE(:TIPO, :DESTINO, :ID, :ITEM, :CORTE) returning_values (:CANT, :UNIDAD, :FACTOR);
                FALTANTE = FALTANTE + CANT;
                BASE = BASE + (MONTO * CANT);
                END
        if (TIPO = 35) then
            FOR SELECT C.COTI_ID, CTDE_ITEM, D.ARTI_COD, CTDE_CANT * CTDE_FACTOR, (CTDE_PRUNIT-CTDE_DTOMONTO),c.vend_cod, C.ptvt_id
                FROM COTIZACIONES_DETALLE D, COTIZACIONES C, ARTICULO A, PREFIJOS P
                WHERE C.COTI_ID = D.COTI_ID AND COTI_FECHA >= :FECINI AND COTI_FECHA <= :FECFIN AND VEND_COD >= :VENINI AND VEND_COD <= :VENFIN AND COTI_ANULADO = 'N' AND
                      D.ARTI_COD = A.ARTI_COD AND D.ARTI_COD >= :CODINI AND D.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
                      P.PREF_PRE = C.PREF_PRE AND P.TIDO_COD = 35 AND ((P.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
                ORDER BY VEND_COD,ARTI_COD, C.COTI_ID, CTDE_ITEM INTO :ID, :ITEM, :ARTIAUX, :CANT, :MONTO,:CODVEND, :PTVTA
                DO
                BEGIN
                select VEND_NOMBRE from VENDEDORES where  VEND_COD = :CODVEND INTO :NOMVEND;
                if (artiaux <> articulo) then
                    begin
                    if (ARTICULO <> '') then
                      if ((CEROS = 'S') or (FALTANTE <> 0)) then
                        SUSPEND;
                    SELECT ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                        FROM articulo WHERE ARTI_COD = :ARTIAUX
                        INTO :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC;
                    SELECT GRUP_NOM FROM GRUPO 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;
                    ARTICULO = ARTIAUX;
                    CANTIDAD = 0;
                    FALTANTE = 0;
                    BASE = 0;
                    end
                CANTIDAD = CANTIDAD + CANT;
                EXECUTE PROCEDURE FALTANTE_CORTE(:TIPO, :DESTINO, :ID, :ITEM, :CORTE) returning_values (:CANT, :UNIDAD, :FACTOR);
                FALTANTE = FALTANTE + CANT;
                BASE = BASE + (MONTO * CANT);
                END
        if (TIPO = 40) then
            FOR SELECT P.pend_id, D.pevd_item, D.ARTI_COD, D.pevd_cant * D.pevd_factor, (D.pevd_prunit-D.pevd_dtomonto),p.vend_cod
                FROM pendiente_ventas_detalle D, pendiente_ventas P, ARTICULO A, PREFIJOS PR
                WHERE P.pend_id = D.pend_id AND PEND_FECHA >= :FECINI AND PEND_FECHA <= :FECFIN AND VEND_COD >= :VENINI AND VEND_COD <= :VENFIN AND PEND_ANULADO = 'N' AND
                      D.ARTI_COD = A.ARTI_COD AND D.ARTI_COD >= :CODINI AND D.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
                      PR.PREF_PRE = P.PREF_PRE AND PR.TIDO_COD = 40 AND ((PR.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
                ORDER BY VEND_COD,ARTI_COD, P.pend_id, D.pevd_item INTO :ID, :ITEM, :ARTIAUX, :CANT, :MONTO,:CODVEND
                DO
                BEGIN
                select VEND_NOMBRE from VENDEDORES where  VEND_COD = :CODVEND INTO :NOMVEND;
                if (artiaux <> articulo) then
                    begin
                    if (ARTICULO <> '') then
                      if ((CEROS = 'S') or (FALTANTE <> 0)) then
                        SUSPEND;
                    SELECT ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                        FROM articulo WHERE ARTI_COD = :ARTIAUX
                        INTO :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC;
                    SELECT GRUP_NOM FROM GRUPO 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;
                    ARTICULO = ARTIAUX;
                    CANTIDAD = 0;
                    FALTANTE = 0;
                    BASE = 0;
                    end
                CANTIDAD = CANTIDAD + CANT;
                EXECUTE PROCEDURE FALTANTE(:TIPO, :DESTINO, :ID, :ITEM) returning_values (:CANT, :UNIDAD, :FACTOR);
                FALTANTE = FALTANTE + CANT;
                BASE = BASE + (MONTO * CANT);
                END
        if (FALTANTE IS NULL) then
            FALTANTE = 0;
        if (BASE IS NULL) then
            BASE = 0;
        if (IVA IS NULL) then
            IVA = 0;
        if ((CEROS = 'S') or (FALTANTE <> 0)) then
            SUSPEND;
        END
    ELSE
        BEGIN
        if (TIPO = 31) then
            FOR SELECT F.FACT_ID, FADE_ITEM, F.PREF_PRE, FACT_NUMERO, FACT_FECHA, FADE_CANT * FADE_FACTOR, (FADE_PRUNIT-FADE_DTOMONTO), FADE_IVAMONTO, D.ARTI_COD, ARTI_DES, ARTI_UNIDAD, A.GRUP_COD, A.SUBG_COD, A.MARC_COD,f.vend_cod, SUBSTRING(FACT_OBS FROM 1 FOR 255), F.ptvt_id
                FROM FACTURAS F, FACTURAS_DETALLE D, ARTICULO A, PREFIJOS P
                WHERE F.FACT_ID = D.FACT_ID AND FACT_FECHA >= :FECINI AND FACT_FECHA <= :FECFIN  AND VEND_COD >= :VENINI AND VEND_COD <= :VENFIN AND FACT_ANULADO = 'N' AND
                      D.ARTI_COD = A.ARTI_COD AND D.ARTI_COD >= :CODINI AND D.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
                      P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 31 AND ((P.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) and substring(a.arti_cod from 1 FOR 2) <> '.t'
                ORDER BY VEND_COD,ARTI_COD, F.FACT_ID, FADE_ITEM
                INTO :ID, :ITEM, :PREFIJO, :NUMERO, :FECHA, :CANTIDAD, :BASE, :IVA, :ARTICULO, :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC,:CODVEND, :OBS, :PTVTA
                DO
                    BEGIN
                    select VEND_NOMBRE from VENDEDORES where  VEND_COD = :CODVEND INTO :NOMVEND;
                    SELECT GRUP_NOM FROM GRUPO WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                    SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                    SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                    EXECUTE PROCEDURE FALTANTE_CORTE(:TIPO, :DESTINO, :ID, :ITEM, :CORTE) returning_values (:FALTANTE, :UNIDAD, :FACTOR);
                    if ((CEROS = 'S') or (FALTANTE <> 0)) then
                        SUSPEND;
                    END
        if (TIPO = 32) then
            FOR SELECT R.REVT_ID, RVDE_ITEM, R.PREF_PRE, REVT_NUMERO, REVT_FECHA, RVDE_CANT * RVDE_FACTOR, (RVDE_PRUNIT-RVDE_DTOMONTO), RVDE_IVAMONTO, D.ARTI_COD, ARTI_DES, ARTI_UNIDAD, A.GRUP_COD, A.SUBG_COD, A.MARC_COD,R.vend_cod, SUBSTRING(REVT_OBS FROM 1 FOR 255), R.ptvt_id
                FROM REMISIONES_VENTA R, REMISIONES_VENTA_DETALLE D, ARTICULO A, PREFIJOS P
                WHERE R.REVT_ID = D.REVT_ID AND REVT_FECHA >= :FECINI AND REVT_FECHA <= :FECFIN AND VEND_COD >= :VENINI AND VEND_COD <= :VENFIN AND REVT_ANULADO = 'N' AND
                      D.ARTI_COD = A.ARTI_COD AND D.ARTI_COD >= :CODINI AND D.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
                      P.PREF_PRE = R.PREF_PRE AND P.TIDO_COD = 33 AND ((P.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
                ORDER BY VEND_COD,ARTI_COD, R.REVT_ID, RVDE_ITEM
                INTO :ID, :ITEM, :PREFIJO, :NUMERO, :FECHA, :CANTIDAD, :BASE, :IVA, :ARTICULO, :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC,:CODVEND, :OBS, :PTVTA
                DO
                    BEGIN
                    select VEND_NOMBRE from VENDEDORES where  VEND_COD = :CODVEND INTO :NOMVEND;
                    SELECT GRUP_NOM FROM GRUPO WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                    SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                    SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                    EXECUTE PROCEDURE FALTANTE_CORTE(:TIPO, :DESTINO, :ID, :ITEM, :CORTE) returning_values (:FALTANTE, :UNIDAD, :FACTOR);
                    if ((CEROS = 'S') or (FALTANTE <> 0)) then
                        SUSPEND;
                    END
        if (TIPO = 34) then
            FOR SELECT P.PEDI_ID, PEDE_ITEM, P.PREF_PRE, PEDI_NUMERO, PEDI_FECHA, PEDE_CANT * PEDE_FACTOR, (PEDE_PRUNIT-PEDE_DTOMONTO), PEDE_IVAMONTO, D.ARTI_COD, ARTI_DES, ARTI_UNIDAD, A.GRUP_COD, A.SUBG_COD, A.MARC_COD,P.vend_cod, SUBSTRING(PEDI_OBS FROM 1 FOR 255), P.ptvt_id
                FROM PEDIDOS P, PEDIDOS_DETALLE D, ARTICULO A, PREFIJOS PR
                WHERE P.PEDI_ID = D.PEDI_ID AND PEDI_FECHA >= :FECINI AND PEDI_FECHA <= :FECFIN AND VEND_COD >= :VENINI AND VEND_COD <= :VENFIN AND PEDI_ANULADO = 'N' AND
                      D.ARTI_COD = A.ARTI_COD AND D.ARTI_COD >= :CODINI AND D.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
                      P.PREF_PRE = PR.PREF_PRE AND PR.TIDO_COD = 34 AND ((PR.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) AND PEDI_VALIDEZ >= 0
                ORDER BY VEND_COD,ARTI_COD, P.PEDI_ID, PEDE_ITEM
                INTO :ID, :ITEM, PREFIJO, :NUMERO, :FECHA, :CANTIDAD, :BASE, :IVA, :ARTICULO, :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC,:CODVEND, :OBS, :PTVTA
                DO
                    BEGIN
                    select VEND_NOMBRE from VENDEDORES where  VEND_COD = :CODVEND INTO :NOMVEND;
                    SELECT GRUP_NOM FROM GRUPO WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                    SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                    SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                    EXECUTE PROCEDURE FALTANTE_CORTE(:TIPO, :DESTINO, :ID, :ITEM, :CORTE) returning_values (:FALTANTE, :UNIDAD, :FACTOR);
                    if ((CEROS = 'S') or (FALTANTE <> 0)) then
                        SUSPEND;
                    END
        if (TIPO = 35) then
            FOR SELECT C.COTI_ID, CTDE_ITEM, C.PREF_PRE, COTI_NUMERO, COTI_FECHA, CTDE_CANT * CTDE_FACTOR, (CTDE_PRUNIT-CTDE_DTOMONTO), CTDE_IVAMONTO, D.ARTI_COD, ARTI_DES, ARTI_UNIDAD, A.GRUP_COD, A.SUBG_COD, A.MARC_COD,C.vend_cod, SUBSTRING(COTI_OBS FROM 1 FOR 255), C.ptvt_id
                FROM COTIZACIONES C, COTIZACIONES_DETALLE D, ARTICULO A, PREFIJOS P
                WHERE C.COTI_ID = D.COTI_ID AND COTI_FECHA >= :FECINI AND COTI_FECHA <= :FECFIN AND VEND_COD >= :VENINI AND VEND_COD <= :VENFIN AND COTI_ANULADO = 'N' AND
                      D.ARTI_COD = A.ARTI_COD AND D.ARTI_COD >= :CODINI AND D.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
                      P.PREF_PRE = C.PREF_PRE AND P.TIDO_COD = 35 AND ((P.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
                ORDER BY VEND_COD,ARTI_COD, C.COTI_ID, CTDE_ITEM
                INTO :ID, :ITEM, PREFIJO, :NUMERO, :FECHA, :CANTIDAD, :BASE, :IVA, :ARTICULO, :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC,:CODVEND, :OBS, :PTVTA
                DO
                    BEGIN
                    select VEND_NOMBRE from VENDEDORES where  VEND_COD = :CODVEND INTO :NOMVEND;
                    SELECT GRUP_NOM FROM GRUPO WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                    SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                    SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                    EXECUTE PROCEDURE FALTANTE_CORTE(:TIPO, :DESTINO, :ID, :ITEM, :CORTE) returning_values (:FALTANTE, :UNIDAD, :FACTOR);
                    if ((CEROS = 'S') or (FALTANTE <> 0)) then
                        SUSPEND;
                    END
        if (TIPO = 40) then
            FOR SELECT P.pend_id, D.pevd_item, P.PREF_PRE, P.pend_numero, PEND_FECHA, D.pevd_cant * D.pevd_factor, (D.pevd_prunit-D.pevd_dtomonto), D.pevd_ivamonto, D.ARTI_COD, ARTI_DES, ARTI_UNIDAD, A.GRUP_COD, A.SUBG_COD, A.MARC_COD,P.vend_cod, SUBSTRING(P.pend_obs FROM 1 FOR 255)
                FROM pendiente_ventas P, pendiente_ventas_detalle D, ARTICULO A, PREFIJOS PR
                WHERE P.pend_id = D.pend_id AND PEND_FECHA >= :FECINI AND PEND_FECHA <= :FECFIN AND VEND_COD >= :VENINI AND VEND_COD <= :VENFIN AND PEND_ANULADO = 'N' AND
                      D.ARTI_COD = A.ARTI_COD AND D.ARTI_COD >= :CODINI AND D.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
                      P.PREF_PRE = PR.PREF_PRE AND PR.TIDO_COD = 40 AND ((PR.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
                ORDER BY VEND_COD,ARTI_COD, P.pend_id, D.pevd_item
                INTO :ID, :ITEM, PREFIJO, :NUMERO, :FECHA, :CANTIDAD, :BASE, :IVA, :ARTICULO, :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC,:CODVEND, :OBS
                DO
                    BEGIN
                    select VEND_NOMBRE from VENDEDORES where  VEND_COD = :CODVEND INTO :NOMVEND;
                    SELECT GRUP_NOM FROM GRUPO WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                    SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                    SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                    EXECUTE PROCEDURE FALTANTE(:TIPO, :DESTINO, :ID, :ITEM) returning_values (:FALTANTE, :UNIDAD, :FACTOR);
                    if ((CEROS = 'S') or (FALTANTE <> 0)) then
                        SUSPEND;
                    END
        END
   /* END*/
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE REP_KARDEX_ARTICULO(
    DETALLE CHAR(1),
    FECINI DATE,
    FECFIN DATE,
    ARTINI VARCHAR(20),
    ARTFIN VARCHAR(20),
    GRPINI VARCHAR(2),
    GRPFIN VARCHAR(2),
    ORDEN CHAR(1),
    BODEGA VARCHAR(2),
    INACTIVOS CHAR(1))
RETURNS (
    CODIGO VARCHAR(15),
    NOMBRE VARCHAR(60),
    DESCORTA VARCHAR(30),
    UNIDAD VARCHAR(8),
    CODGRUPO VARCHAR(2),
    NOMGRUPO VARCHAR(30),
    CODSUBG VARCHAR(3),
    NOMSUBG VARCHAR(30),
    CODMARC VARCHAR(3),
    NOMMARC VARCHAR(30),
    CODBOD VARCHAR(2),
    SALDOINI NUMERIC(18,4),
    COSTOINI NUMERIC(18,2),
    ENTRADAS NUMERIC(18,4),
    COSTOENT NUMERIC(18,2),
    SALIDAS NUMERIC(18,4),
    COSTOSAL NUMERIC(18,2),
    SALDOFIN NUMERIC(18,4),
    COSTOFIN NUMERIC(18,2),
    TIPODOC VARCHAR(8),
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(8),
    FECHA DATE,
    CONCEPTO VARCHAR(60),
    NIT VARCHAR(20),
    CONS INTEGER,
    CANFINAL NUMERIC(18,4),
    COSFINAL NUMERIC(18,2),
    IVAPORC NUMERIC(9,2),
    RESERVADO NUMERIC(18,4))
AS
DECLARE VARIABLE ENTRADA CHAR(1);
DECLARE VARIABLE CANT NUMERIC(18,4);
DECLARE VARIABLE COSTO NUMERIC(18,2);
DECLARE VARIABLE CODINI VARCHAR(20);
DECLARE VARIABLE CODFIN VARCHAR(20);
DECLARE VARIABLE DESINI VARCHAR(20);
DECLARE VARIABLE DESFIN VARCHAR(20);
declare variable pedido numeric(18,4);
declare variable ordenc numeric(18,4);
declare variable id integer;
declare variable item integer;
declare variable und varchar(8);
declare variable factor numeric(18,4);
declare variable cant2 numeric(18,4);
declare variable PEDAUTO CHAR(2);
BEGIN
if (ORDEN = 'C') then
    BEGIN
    CODINI = ARTINI;
    CODFIN = ARTFIN;
    DESINI = '';
    DESFIN = 'zz';
    END
ELSE
    BEGIN
    DESINI = ARTINI;
    DESFIN = ARTFIN;
    CODINI = '';
    CODFIN = 'zz';
    END
EXECUTE PROCEDURE LEE_CONFIGURACION('FACTURACION', 'FACTURAS', 'GENERAR PEDIDO AUTOMATICAMENTE CON LA FACTURA') returning_values (pedauto);
  FOR
    SELECT ARTI_COD, ARTI_DES, ARTI_DESCORTA, ARTI_UNIDAD, A.GRUP_COD, A.SUBG_COD, A.MARC_COD, t.taiv_porc
      FROM ARTICULO A, tarifa_iva t
      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 ((A.ESAR_COD <> 'I') or (:INACTIVOS = 'S')) AND A.taiv_cod = T.taiv_cod
      INTO :CODIGO, :NOMBRE, :DESCORTA, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC, :ivaporc
      DO
        BEGIN
        NOMMARC = '';
        NOMSUBG = '';
        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 (BODEGA = '') then
            BEGIN
            EXECUTE PROCEDURE SALDO_INICIAL_TOTAL_INV(CODIGO, FECINI) returning_values (:SALDOINI);
            EXECUTE PROCEDURE VALOR_INICIAL_INVENTARIO(CODIGO, FECINI) returning_values (COSTOINI);
            END
        ELSE
            BEGIN
            EXECUTE PROCEDURE SALDO_INICIAL_INVENTARIO(CODIGO, FECINI, :BODEGA) returning_values (SALDOINI);
            EXECUTE PROCEDURE COSTO_PROMEDIO(CODIGO, FECINI-1) returning_values (COSTOINI);
            COSTOINI = COSTOINI * saldoini;
            END
        if (DETALLE = 'N') then
            BEGIN
            /* SUME LAS ENTRADAS */
            if (BODEGA = '') then
              SELECT SUM(COST_ENTC), SUM(COST_ENTP), SUM(COST_SALC), SUM(COST_SALP) FROM COSTOS
                WHERE (COST_FECHA >= :FECINI) AND (COST_FECHA <= :FECFIN) AND (ARTI_COD = :codigo)
                INTO :ENTRADAS, :COSTOENT, :SALIDAS, :COSTOSAL;
            ELSE
              SELECT SUM(COST_ENTC), SUM(COST_ENTP), SUM(COST_SALC), SUM(COST_SALP)
                FROM COSTOS C, MOVIMIENTO_ARTICULO M
                WHERE (COST_FECHA >= :FECINI) AND (COST_FECHA <= :FECFIN) AND (C.ARTI_COD = :codigo) AND C.cost_idmov = M.mvar_cons AND BODE_COD = :BODEGA
                INTO :ENTRADAS, :COSTOENT, :SALIDAS, :COSTOSAL;

            if (ENTRADAS IS NULL) then
              ENTRADAS = 0;
            if (COSTOENT IS NULL) then
              COSTOENT = 0;
            if (SALIDAS IS NULL) then
              SALIDAS = 0;
            if (COSTOSAL IS NULL) then
              COSTOSAL = 0;
            SALDOFIN = SALDOINI + ENTRADAS - SALIDAS;
            COSTOFIN = COSTOINI + COSTOENT - COSTOSAL;
            if (BODEGA = '') then
                BEGIN
                EXECUTE PROCEDURE SALDO_INICIAL_TOTAL_INV(CODIGO, fecfin+1) returning_values (canfinal);
                EXECUTE PROCEDURE VALOR_INICIAL_INVENTARIO(CODIGO, FECFIN+1) returning_values (cosfinal);
                SELECT SUM(RSDE_LIBERAR)
                    FROM RESERVAS_DETALLE RD, RESERVAS R
                    WHERE R.RESE_ID = RD.RESE_ID AND ARTI_COD = :CODIGO AND RESE_FECHA <= :fecfin AND RESE_VENCE >= :fecfin AND RSDE_ANULADO = 'N'
                    INTO :RESERVADO;
                if (RESERVADO IS NULL) then
                    RESERVADO = 0;
                PEDIDO = 0;
                FOR SELECT P.PEDI_ID, PEDE_ITEM, PEDE_CANT * PEDE_FACTOR
                    FROM PEDIDOS P, PEDIDOS_DETALLE PD
                    WHERE P.PEDI_ID = PD.PEDI_ID AND PD.ARTI_COD = :CODIGO AND PEDI_VENCE >= :fecfin AND PEDI_FECHA <= :fecfin AND PEDE_ANULADO = 'N'
                    INTO :ID, :ITEM, :CANT2
                    do
                    BEGIN
                    EXECUTE PROCEDURE FALTANTE(34, 31, ID, ITEM) returning_values (ORDENC, UND, FACTOR);
                    if ((ORDENC * FACTOR = CANT2) or (PEDAUTO = 'SI')) then /* SI NO SE HA FACTURADO MIRE A VER SI SE REMISIONO */
                        EXECUTE PROCEDURE FALTANTE(34, 32, ID, ITEM) returning_values (ORDENC, UND, FACTOR);
                    if (ORDENC IS NULL) then
                        ORDENC = 0;
                    PEDIDO = PEDIDO + ORDENC * FACTOR;
                    END
                RESERVADO = RESERVADO + PEDIDO;
                END
            ELSE
                BEGIN
                EXECUTE PROCEDURE SALDO_INICIAL_INVENTARIO(CODIGO, FECFIN+1, :BODEGA) returning_values (CANFINAL);
                EXECUTE PROCEDURE COSTO_PROMEDIO(CODIGO, FECFIN+1) returning_values (COSFINAL);
                COSFINAL = COSFINAL * CANFINAL;
                SELECT SUM(RSDE_LIBERAR)
                    FROM RESERVAS_DETALLE RD, RESERVAS R
                    WHERE R.RESE_ID = RD.RESE_ID AND ARTI_COD = :CODIGO AND RESE_FECHA <= :fecfin AND RESE_VENCE >= :fecfin AND RD.BODE_COD = :bodega AND RSDE_ANULADO = 'N'
                    INTO :RESERVADO;
                if (RESERVADO IS NULL) then
                    RESERVADO = 0;
                PEDIDO = 0;
                FOR SELECT P.PEDI_ID, PEDE_ITEM, PEDE_CANT * PEDE_FACTOR
                    FROM PEDIDOS P, PEDIDOS_DETALLE PD
                    WHERE P.PEDI_ID = PD.PEDI_ID AND PD.ARTI_COD = :CODIGO AND PEDI_VENCE >= :FECHA AND PEDI_FECHA <= :FECHA AND PEDE_ANULADO = 'N' AND BODE_COD = :bodega
                    INTO :ID, :ITEM, :CANT2
                    do
                    BEGIN
                    EXECUTE PROCEDURE FALTANTE(34, 31, ID, ITEM) returning_values (ORDENC, UND, FACTOR);
                    if ((ORDENC * FACTOR = CANT2) or (PEDAUTO = 'SI')) then /* SI NO SE HA FACTURADO MIRE A VER SI SE REMISIONO */
                        EXECUTE PROCEDURE FALTANTE(34, 32, ID, ITEM) returning_values (ORDENC, UND, FACTOR);
                    if (ORDENC IS NULL) then
                        ORDENC = 0;
                    PEDIDO = PEDIDO + ORDENC * FACTOR;
                    END
                RESERVADO = RESERVADO + PEDIDO;
                END
            SUSPEND;
            END
        ELSE
            BEGIN
            SALDOFIN = SALDOINI;
            COSTOFIN = COSTOINI;
            COSTOENT = 0;
            COSTOSAL = 0;
            FOR SELECT MVAR_TIPODOC, MVAR_ENTRADA, MVAR_PREF, MVAR_NUMERO, MVAR_CANT, MVAR_COSTO, MVAR_CONC, MVAR_FECHA, M.TERC_NIT, MVAR_CONS, BODE_COD, COST_SALDOP, COST_SALDOC
                FROM MOVIMIENTO_ARTICULO M, COSTOS C
                WHERE M.arti_cod = C.arti_cod AND M.mvar_cons = C.cost_idmov AND (m.ARTI_COD = :CODIGO) AND (MVAR_FECHA >= :FECINI) AND (MVAR_FECHA <= :FECFIN) AND (MVAR_TIPODOC <> 13)
                ORDER BY M.ARTI_COD, MVAR_FECHA, MVAR_CONS
                INTO :TIPODOC, :ENTRADA, :PREFIJO, :NUMERO, :ENTRADAS, :COSTOENT, :CONCEPTO, :FECHA, :NIT, :CONS, :CODBOD, :costo, :cant
                DO
                    BEGIN
                    SELECT TIDO_NOMCORTO FROM TIPO_DOCUMENTO WHERE TIDO_COD = :TIPODOC INTO :TIPODOC;
                    if (ENTRADA = 'S') then
                        BEGIN
                        SALIDAS = 0;
                        SALDOFIN = SALDOFIN + ENTRADAS;
                        COSTOFIN = COSTOFIN + (ENTRADAS * COSTOENT);
                        if (CANT > 0) then
                            COSTOSAL = COSTO / CANT;
                        else
                            COSTOSAL = 0;
                        end
                    ELSE
                        BEGIN
                        SALIDAS = ENTRADAS;
                        ENTRADAS = 0;
                        if (CANT > 0) then
                            COSTOSAL = COSTO / CANT;
                        else
                            COSTOSAL = 0;
                        SALDOFIN = SALDOFIN - SALIDAS;
                        COSTOFIN = COSTOFIN - (SALIDAS * costosal);
                        END
                    SUSPEND;
                    END
            END
        END
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE REP_MOVIMIENTO_X_ARTICULO(
    DETALLE CHAR(1),
    FECINI DATE,
    FECFIN DATE,
    ARTINI VARCHAR(20),
    ARTFIN VARCHAR(20),
    GRPINI VARCHAR(2),
    GRPFIN VARCHAR(2),
    ORDEN CHAR(1),
    SUBEMPRESA INTEGER)
RETURNS (
    CODIGO VARCHAR(15),
    NOMBRE VARCHAR(60),
    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),
    SALDOINI NUMERIC(18,4),
    ENTRADAS NUMERIC(18,4),
    SALIDAS NUMERIC(18,4),
    RESERVADO NUMERIC(18,4),
    SALDOFIN NUMERIC(18,4),
    TIPODOC VARCHAR(8),
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(8),
    FECHA DATE,
    CONCEPTO VARCHAR(60),
    LOTE VARCHAR(15),
    LO_VENCE DATE,
    NIT VARCHAR(20),
    NOMTERC VARCHAR(60),
    CONS INTEGER)
AS
declare variable ENTRADA CHAR(1);
declare variable CODINI VARCHAR(20);
declare variable CODant VARCHAR(15) CHARACTER SET NONE;
declare variable CODFIN VARCHAR(20);
declare variable DESINI VARCHAR(20);
declare variable DESFIN VARCHAR(20);
declare variable id integer;
declare variable item integer;
declare variable und varchar(8);
declare variable factor numeric(18,4);
declare variable cant2 numeric(18,4);
declare variable ordenc numeric(18,4);
declare variable PEDAUTO CHAR(2);
BEGIN
if (ORDEN = 'C') then
    BEGIN
    CODINI = ARTINI;
    CODFIN = ARTFIN;
    DESINI = '';
    DESFIN = 'zz';
    END
ELSE
    BEGIN
    DESINI = ARTINI;
    DESFIN = ARTFIN;
    CODINI = '';
    CODFIN = 'zz';
    END

EXECUTE PROCEDURE LEE_CONFIGURACION('FACTURACION', 'FACTURAS', 'GENERAR PEDIDO AUTOMATICAMENTE CON LA FACTURA') returning_values (pedauto);
if (DETALLE = 'L') then
  BEGIN
   codant = 0;
   for SELECT A.ARTI_COD, ARTI_DES, ARTI_UNIDAD, A.GRUP_COD, A.SUBG_COD, A.MARC_COD, LOTE_NRO,LOTE_VENCE, BODE_COD
     FROM ARTICULO A, LOTES L
     WHERE A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :GRPFIN AND
       ARTI_DES >= :DESINI AND ARTI_DES <= :DESFIN AND A.ESAR_COD <> 'I' AND a.arti_cod = l.arti_cod
     INTO :CODIGO, :NOMBRE, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC, :LOTE, :LO_VENCE, :codbod
     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;
      SELECT BODE_NOM FROM BODEGA WHERE BODE_COD = :codbod INTO nombod;

      SELECT SUM(RSDE_LIBERAR)
        FROM RESERVAS_DETALLE RD, RESERVAS R
        WHERE R.RESE_ID = RD.RESE_ID AND ARTI_COD = :CODIGO AND RESE_FECHA <= :FECFIN AND RESE_VENCE >= :FECFIN AND RD.BODE_COD = :CODBOD AND RSDE_ANULADO = 'N'
        INTO :RESERVADO;
      if (RESERVADO IS NULL) then
        RESERVADO = 0;
      FOR SELECT P.PEDI_ID, PEDE_ITEM, PEDE_CANT * PEDE_FACTOR
        FROM PEDIDOS P, PEDIDOS_DETALLE PD
        WHERE P.PEDI_ID = PD.PEDI_ID AND PD.ARTI_COD = :CODIGO AND PEDI_VENCE >= :FECFIN AND PEDI_FECHA <= :FECFIN AND PEDE_ANULADO = 'N' AND BODE_COD = :CODBOD
        INTO :ID, :ITEM, :CANT2
        do
        BEGIN
        EXECUTE PROCEDURE FALTANTE(34, 31, ID, ITEM) returning_values (ORDENC, UND, FACTOR);
        if ((ORDENC * FACTOR = CANT2) or (PEDAUTO = 'SI')) then /* SI NO SE HA FACTURADO MIRE A VER SI SE REMISIONO */
            EXECUTE PROCEDURE FALTANTE(34, 32, ID, ITEM) returning_values (ORDENC, UND, FACTOR);
        if (ORDENC IS NULL) then
            ORDENC = 0;
        RESERVADO = RESERVADO + ORDENC * FACTOR;
        END

      SELECT FIRST 1 (EXLO_SALDO + EXLO_ENT - EXLO_SAL) FROM existencia_lote WHERE ARTI_COD = :codigo AND LOTE_NRO = :lote AND
        BODE_COD = :codbod AND EXLO_FECHA < :fecini INTO :saldoini;
      if (SALDOINI IS NULL) then
        SALDOINI = 0;

      if (codigo <> codant) then
          SALDOFIN = SALDOINI;
      for SELECT TIPODOC, PREFIJO, NUMERO, FECHA, CONCEPTO, ENT, CANTENT, CANTSAL, NIT, CONS
        FROM MOVLOTES_DESDE_HASTA(:codigo, :codbod, :LOTE,:fecini, :fecfin,:SUBEMPRESA)
        ORDER BY FECHA,CONS
        INTO :TIPODOC, :PREFIJO, :NUMERO, :FECHA, :CONCEPTO, :ENTRADA, :ENTRADAS, :SALIDAS, :NIT, :CONS
        DO
        BEGIN
          if (nit is not null) then
            SELECT TERC_NOM FROM TERCEROS WHERE TERC_NIT = :NIT INTO :NOMTERC;
          else
            NOMTERC = '';
          if (ENTRADA = 'S') then
           BEGIN
            salidas = 0;
            SALDOFIN = SALDOFIN + ENTRADAS;
           END
          ELSE
           BEGIN
            ENTRADAS = 0;
            SALDOFIN = SALDOFIN - SALIDAS;
           END
          SUSPEND;
        END
      codant = :codigo;
    END
  END
ELSE
 BEGIN
  FOR
    SELECT ARTI_COD, ARTI_DES, ARTI_UNIDAD, A.GRUP_COD, A.SUBG_COD, A.MARC_COD, BODE_COD, BODE_NOM
      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 A.ESAR_COD <> 'I' AND ((SUCU_ID = :SUBEMPRESA) OR (:SUBEMPRESA = 0))
      INTO :CODIGO, :NOMBRE, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC, :CODBOD, :NOMBOD
      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;
        EXECUTE PROCEDURE SALDO_INICIAL_INVENTARIO(CODIGO, FECINI, :CODBOD) returning_values (:SALDOINI);
        if (DETALLE = 'N') then
            BEGIN
            /* SUME LAS ENTRADAS */
            SELECT SUM(MVAR_CANT) FROM MOVIMIENTO_ARTICULO
              WHERE (MVAR_FECHA >= :FECINI) AND (MVAR_FECHA <= :FECFIN) AND
              (ARTI_COD = :CODIGO) AND (BODE_COD = :CODBOD) AND (MVAR_ENTRADA = 'S') INTO :ENTRADAS;
            if (ENTRADAS IS NULL) then
              ENTRADAS = 0;
            /* CALCULE LAS SALIDAS A COSTO PROMEDIO */
            SALIDAS = 0;
            SELECT SUM(MVAR_CANT)
                FROM MOVIMIENTO_ARTICULO
                WHERE (MVAR_FECHA >= :FECINI) AND (MVAR_FECHA <= :FECFIN) AND
                (ARTI_COD = :CODIGO) AND (BODE_COD = :CODBOD) AND (MVAR_ENTRADA = 'N')
                INTO :SALIDAS;
            if (SALIDAS IS NULL) then
              SALIDAS = 0;
            SALDOFIN = SALDOINI + ENTRADAS - SALIDAS;
            SUSPEND;
            END
        if (DETALLE = 'B') then
            BEGIN
            SALDOFIN = SALDOINI;
            FOR SELECT TIDO_NOMCORTO, MVAR_ENTRADA, MVAR_PREF, MVAR_NUMERO, MVAR_CANT, MVAR_CONC, MVAR_FECHA, M.TERC_NIT, MVAR_CONS
                FROM MOVIMIENTO_ARTICULO M, TIPO_DOCUMENTO TD
                WHERE TD.TIDO_COD = MVAR_TIPODOC AND (MVAR_FECHA >= :FECINI) AND (MVAR_FECHA <= :FECFIN) AND (ARTI_COD = :CODIGO) AND (BODE_COD = :CODBOD)
                ORDER BY MVAR_FECHA, MVAR_CONS
                INTO :TIPODOC, :ENTRADA, :PREFIJO, :NUMERO, :ENTRADAS, :CONCEPTO, :FECHA, :NIT, :CONS
                DO
                    BEGIN
                    if (nit is not null) then
                        SELECT TERC_NOM FROM TERCEROS WHERE TERC_NIT = :NIT INTO :NOMTERC;
                    else
                        NOMTERC = '';
                    if (ENTRADA = 'S') then
                        BEGIN
                        SALIDAS = 0;
                        SALDOFIN = SALDOFIN + ENTRADAS;
                        end
                    ELSE
                        BEGIN
                        SALIDAS = ENTRADAS;
                        ENTRADAS = 0;
                        SALDOFIN = SALDOFIN - SALIDAS;
                        END
                    SUSPEND;
                    END
            END
        END
  END
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE RESERVAS_ARTICULO(
    FECHA DATE,
    DETALLE CHAR(1))
RETURNS (
    CODIGO VARCHAR(15),
    NOMBRE VARCHAR(60),
    RESERVA NUMERIC(18,4),
    EXIST NUMERIC(18,2),
    FALTANTE NUMERIC(18,2),
    COSTO NUMERIC(18,2),
    UNIDAD VARCHAR(8),
    CODGRUPO VARCHAR(2),
    NOMGRUPO VARCHAR(30),
    CODSUBG VARCHAR(3),
    NOMSUBG VARCHAR(30),
    CODMARC VARCHAR(3),
    NOMMARC VARCHAR(30),
    COSTOTOT NUMERIC(18,2),
    CLIENTE VARCHAR(60),
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(8),
    FECHADOC DATE)
AS
declare variable PEDIDO NUMERIC(18,4);
declare variable ID INTEGER;
declare variable ITEM INTEGER;
declare variable UND VARCHAR(8);
declare variable FACTOR NUMERIC(18,4);
declare variable FACT NUMERIC(18,4);
declare variable CANT NUMERIC(18,4);
declare variable PEDAUTO CHAR(2);
BEGIN
EXECUTE PROCEDURE LEE_CONFIGURACION('FACTURACION', 'FACTURAS', 'GENERAR PEDIDO AUTOMATICAMENTE CON LA FACTURA') returning_values (pedauto);
  FOR
    SELECT ARTI_COD, ARTI_DES, ARTI_UNIDAD, A.GRUP_COD, A.SUBG_COD, A.MARC_COD
      FROM ARTICULO A
      INTO :CODIGO, :NOMBRE, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
      DO
        BEGIN
        NOMMARC = '';
        NOMSUBG = '';
        SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
        SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
        SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
        EXECUTE PROCEDURE SALDO_TOTAL_INVENTARIO(CODIGO, FECHA) returning_values (EXIST);
        if (DETALLE = 'N') then
            BEGIN
            EXECUTE PROCEDURE COSTO_PROMEDIO(CODIGO, FECHA) returning_values (COSTO);
            SELECT SUM(RSDE_LIBERAR) FROM RESERVAS R, RESERVAS_DETALLE RD
                WHERE R.RESE_ID = RD.RESE_ID AND RD.ARTI_COD = :CODIGO AND RESE_FECHA <= :FECHA AND RESE_VENCE > :FECHA AND RESE_ANULADO = 'N'
                INTO :RESERVA;
            if (RESERVA IS NULL) then
                RESERVA = 0;
            FOR SELECT P.PEDI_ID, PEDE_ITEM, PEDE_CANT * PEDE_FACTOR
                FROM PEDIDOS P, PEDIDOS_DETALLE D
                WHERE P.PEDI_ID = D.PEDI_ID AND D.ARTI_COD = :CODIGO AND (PEDI_FECHA+PEDI_VALIDEZ) >= :FECHA AND PEDI_FECHA <= :FECHA AND PEDI_ANULADO = 'N'
                INTO :ID, :item, :CANT
                DO
                BEGIN
                EXECUTE PROCEDURE FALTANTE(34, 31, ID, ITEM) returning_values (PEDIDO, UND, FACT);
                if (PEDIDO * FACT = CANT) then
                    EXECUTE PROCEDURE FALTANTE(34, 32, ID, ITEM) returning_values (PEDIDO, UND, FACT);
                if (PEDIDO IS NULL) then
                    PEDIDO = 0;
                RESERVA = RESERVA + PEDIDO;
                END
            if (RESERVA > EXIST) then
                FALTANTE = RESERVA - EXIST;
            ELSE
                FALTANTE = 0;
            COSTOTOT = RESERVA * COSTO;
            if (RESERVA > 0) then
                SUSPEND;
            END
        ELSE
            BEGIN
            FOR SELECT RESE_FECHA, PREF_PRE, RESE_NUMERO, RESE_NOMTERC, RDSE_CANT, RSDE_UNIDAD, RSDE_LIBERAR
                FROM RESERVAS R, RESERVAS_DETALLE RD
                WHERE R.RESE_ID = RD.RESE_ID AND RD.ARTI_COD = :CODIGO AND RESE_FECHA <= :FECHA AND RESE_VENCE > :FECHA AND RESE_ANULADO = 'N'
                INTO :FECHADOC, :PREFIJO, :NUMERO, :CLIENTE, :RESERVA, :UNIDAD, :FALTANTE
                DO
                BEGIN
                if (RESERVA > EXIST) then
                    FALTANTE = RESERVA - EXIST;
                ELSE
                    FALTANTE = 0;
                COSTOTOT = RESERVA * COSTO;
                SUSPEND;
                END
            FOR SELECT P.PEDI_ID, PEDE_ITEM, PEDI_FECHA, PREF_PRE, PEDI_NUMERO, PEDI_NOMTERC, PEDE_CANT, PEDE_UNIDAD, PEDE_RESERVA, PEDE_FACTOR
                FROM PEDIDOS P, PEDIDOS_DETALLE PD
                WHERE P.PEDI_ID = PD.PEDI_ID AND PD.ARTI_COD = :CODIGO AND PEDI_FECHA <= :FECHA AND (PEDI_FECHA+PEDI_VALIDEZ) >= :FECHA AND PEDI_ANULADO = 'N'
                INTO :ID, :ITEM, :FECHADOC, :PREFIJO, :NUMERO, :CLIENTE, :CANT, :UNIDAD, :FALTANTE, :FACTOR
                DO
                BEGIN
                EXECUTE PROCEDURE FALTANTE(34, 31, ID, ITEM) returning_values (RESERVA, UND, FACT);
                if ((RESERVA * FACT = CANT * FACTOR) or (PEDAUTO = 'SI')) then
                    EXECUTE PROCEDURE FALTANTE(34, 31, ID, ITEM) returning_values (RESERVA, UND, FACTOR);
                if (RESERVA IS NULL) then
                    RESERVA = 0;
                if (RESERVA > 0) then
                    BEGIN
                    if (RESERVA > EXIST) then
                        FALTANTE = RESERVA - EXIST;
                    ELSE
                        FALTANTE = 0;
                    COSTOTOT = RESERVA * COSTO;
                    SUSPEND;
                    END
                END
            END
        END
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE RESERVAS_ARTICULO_FECHA(
    ARTICULO VARCHAR(15),
    FECHA DATE)
RETURNS (
    FECRES DATE,
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(8),
    VENCE DATE,
    CLIENTE VARCHAR(60),
    CANTIDAD NUMERIC(18,2),
    UNIDAD VARCHAR(8),
    TIPO INTEGER,
    ID INTEGER)
AS
declare variable ITEM INTEGER;
declare variable FACTOR NUMERIC(18,4);
declare variable UND VARCHAR(8);
declare variable FACT NUMERIC(18,4);
declare variable ORDENC NUMERIC(18,4);
declare variable PEDAUTO CHAR(2);
BEGIN
TIPO = 17;
  /* MUESTRA LAS RESERVAS DEL ARTICULO QUE NO SE HAN VENCIDO */
  FOR SELECT R.RESE_ID, RESE_FECHA, PREF_PRE, RESE_NUMERO, RESE_VENCE, RESE_NOMTERC, RDSE_CANT, RSDE_UNIDAD
    FROM RESERVAS R, RESERVAS_DETALLE RD
    WHERE R.RESE_ID = RD.RESE_ID AND RD.ARTI_COD = :ARTICULO AND RESE_VENCE >= :FECHA AND RESE_FECHA <= :FECHA AND RSDE_ANULADO = 'N'
    INTO :ID, :FECRES, :PREFIJO, :NUMERO, :VENCE, :CLIENTE, :CANTIDAD, :UNIDAD
        DO
          SUSPEND;
TIPO = 34;
  /* MUESTRA LOS PEDIDOS DEL ARTICULO QUE NO SE HAN VENCIDO */
  FOR SELECT P.PEDI_ID, PEDE_ITEM, PEDI_FECHA, PREF_PRE, PEDI_NUMERO, (PEDI_FECHA + PEDI_VALIDEZ), PEDI_NOMTERC, PEDE_CANT, PEDE_UNIDAD, PEDE_FACTOR
    FROM PEDIDOS P, PEDIDOS_DETALLE PD
    WHERE P.PEDI_ID = PD.PEDI_ID AND PD.ARTI_COD = :ARTICULO AND (PEDI_FECHA+PEDI_VALIDEZ) >= :FECHA AND PEDI_FECHA <= :FECHA AND PEDE_ANULADO = 'N'
    INTO :ID, :ITEM, :FECRES, :PREFIJO, :NUMERO, :VENCE, :CLIENTE, :CANTIDAD, :UNIDAD, :FACTOR
    DO
        BEGIN
        EXECUTE PROCEDURE FALTANTE(34, 31, ID, ITEM) returning_values (ORDENC, UND, FACT);
        if ((ORDENC * FACT = CANTIDAD * FACTOR) or (PEDAUTO = 'SI')) then
            EXECUTE PROCEDURE FALTANTE(34, 32, ID, ITEM) returning_values (ORDENC, UND, FACTOR);
        if (ORDENC IS NULL) then
            ORDENC = 0;
        if (ORDENC <> 0) then
            BEGIN
            CANTIDAD = ORDENC;
            UNIDAD = UND;
            SUSPEND;
            END
        END
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE DESCARGA_REMISION_FALTANTE(
    REMISION1 VARCHAR(10),
    REMISION2 VARCHAR(10),
    REMISION3 VARCHAR(10),
    REMISION4 VARCHAR(10),
    REMISION5 VARCHAR(10),
    REMISION6 VARCHAR(10),
    PREFAC VARCHAR(4),
    NUMFAC VARCHAR(8))
RETURNS (
    IDCON INTEGER)
AS
declare variable IDF INTEGER;
declare variable IDR6 INTEGER;
declare variable IDR5 INTEGER;
declare variable IDR4 INTEGER;
declare variable IDR3 INTEGER;
declare variable IDR2 INTEGER;
declare variable IDR1 INTEGER;
declare variable ITEM INTEGER;
begin
IDR1 = 0;
IDR2 = 0;
IDR3 = 0;
IDR4 = 0;
IDR5 = 0;
IDR6 = 0;
ITEM = 0;
SELECT REVT_ID FROM REMISIONES_VENTA WHERE PREF_PRE = SUBSTR(:remision1, 1, 4) AND REVT_NUMERO = SUBSTR(:remision1, 5, 10) INTO :IDR1;
SELECT REVT_ID FROM REMISIONES_VENTA WHERE PREF_PRE = SUBSTR(:remision2, 1, 4) AND REVT_NUMERO = SUBSTR(:remision2, 5, 10) INTO :IDR2;
SELECT REVT_ID FROM REMISIONES_VENTA WHERE PREF_PRE = SUBSTR(:remision3, 1, 4) AND REVT_NUMERO = SUBSTR(:remision3, 5, 10) INTO :IDR3;
SELECT REVT_ID FROM REMISIONES_VENTA WHERE PREF_PRE = SUBSTR(:remision4, 1, 4) AND REVT_NUMERO = SUBSTR(:remision4, 5, 10) INTO :IDR4;
SELECT REVT_ID FROM REMISIONES_VENTA WHERE PREF_PRE = SUBSTR(:remision5, 1, 4) AND REVT_NUMERO = SUBSTR(:remision5, 5, 10) INTO :IDR5;
SELECT REVT_ID FROM REMISIONES_VENTA WHERE PREF_PRE = SUBSTR(:remision6, 1, 4) AND REVT_NUMERO = SUBSTR(:remision6, 5, 10) INTO :IDR6;
IF (IDR1 <> 0) THEN
    BEGIN
    ITEM = ITEM + 1;
    SELECT FACT_ID FROM FACTURAS WHERE PREF_PRE = :prefac AND FACT_NUMERO = :numfac INTO :IDF;
    IDCON = GEN_ID(ID_CONS, 1);
    UPDATE FACTURAS SET FACT_CONSOLIDA = :idcon WHERE FACT_ID = :IDF;
    INSERT INTO CONSOLIDE_FALTANTES (CEFA_ID, CEFA_ITEM, CEFA_TIPODES, CEFA_TIPOORI, CEFA_IDORI)
        VALUES (:IDCON, :ITEM, 31, 32, :IDR1);
    IF (IDR2 <> 0) THEN
        BEGIN
        ITEM = ITEM + 1;
        INSERT INTO CONSOLIDE_FALTANTES (CEFA_ID, CEFA_ITEM, CEFA_TIPODES, CEFA_TIPOORI, CEFA_IDORI)
            VALUES (:IDCON, :ITEM, 31, 32, :IDR2);
        END
    IF (IDR3 <> 0) THEN
        BEGIN
        ITEM = ITEM + 1;
        INSERT INTO CONSOLIDE_FALTANTES (CEFA_ID, CEFA_ITEM, CEFA_TIPODES, CEFA_TIPOORI, CEFA_IDORI)
            VALUES (:IDCON, :ITEM, 31, 32, :IDR3);
        END
    IF (IDR4 <> 0) THEN
        BEGIN
        ITEM = ITEM + 1;
        INSERT INTO CONSOLIDE_FALTANTES (CEFA_ID, CEFA_ITEM, CEFA_TIPODES, CEFA_TIPOORI, CEFA_IDORI)
            VALUES (:IDCON, :ITEM, 31, 32, :IDR4);
        END
    IF (IDR5 <> 0) THEN
        BEGIN
        ITEM = ITEM + 1;
        INSERT INTO CONSOLIDE_FALTANTES (CEFA_ID, CEFA_ITEM, CEFA_TIPODES, CEFA_TIPOORI, CEFA_IDORI)
            VALUES (:IDCON, :ITEM, 31, 32, :IDR5);
        END
    IF (IDR6 <> 0) THEN
        BEGIN
        ITEM = ITEM + 1;
        INSERT INTO CONSOLIDE_FALTANTES (CEFA_ID, CEFA_ITEM, CEFA_TIPODES, CEFA_TIPOORI, CEFA_IDORI)
            VALUES (:IDCON, :ITEM, 31, 32, :IDR6);
        END
    EXECUTE PROCEDURE consolide_pendientes (:IDCON);
    suspend;
    END
end
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE RECALCULA_FALTANTES_VENTAS2(
    FECINI DATE,
    FECFIN DATE,
    PREF VARCHAR(4))
RETURNS (
    FACTURA VARCHAR(8),
    REMISION VARCHAR(30),
    IDCON INTEGER)
AS
declare variable IDF INTEGER;
declare variable IDR INTEGER;
begin
FOR SELECT FACT_REMISION, FACT_NUMERO, FACT_ID FROM FACTURAS WHERE ((FACT_CONSOLIDA IS NULL) or (FACT_CONSOLIDA = 0)) AND
    (FACT_ANULADO = 'N') AND (FACT_REMISION IS NOT NULL) AND FACT_FECHA >= :FECINI AND FACT_FECHA <= :FECFIN AND PREF_PRE = :PREF
    INTO :REMISION, :FACTURA, :IDF
    DO
    BEGIN
    if (STRLEN(REMISION) = 10) then
        BEGIN
        IDR = 0;
        SELECT REVT_ID FROM REMISIONES_VENTA WHERE PREF_PRE = SUBSTR(:remision, 1, 4) AND REVT_NUMERO = SUBSTR(:remision, 5, 10) INTO :IDR;
        IF (IDR <> 0) THEN
            BEGIN
            IDCON = GEN_ID(ID_CONS, 1);
            INSERT INTO CONSOLIDE_FALTANTES (CEFA_ID, CEFA_ITEM, CEFA_TIPODES, CEFA_TIPOORI, CEFA_IDORI)
                VALUES (:IDCON, 1, 31, 32, :IDR);
            EXECUTE PROCEDURE consolide_pendientes (:IDCON);
            UPDATE FACTURAS SET FACT_CONSOLIDA = :idcon WHERE FACT_ID = :IDF;
            suspend;
            END
        END
    END
end
^

SET TERM ; ^

SET TERM ^ ;

ALTER TRIGGER REMISIONES_VENTA_BI
AS
declare variable NUMERO VARCHAR(8);
declare variable AUTOM CHAR(1);
declare variable EXISTE CHAR(1);
declare variable PEDAUTO CHAR(2);
declare variable ITEM INTEGER;
declare variable IDF INTEGER;
declare variable IDP INTEGER;
declare variable IDC INTEGER;
declare variable FECSERVER CHAR(2);
declare variable PEDIDOREP char(2);
declare variable TIPO VARCHAR(8);
declare variable NUMROWS INTEGER;
declare variable IDPEDIDO INTEGER;
declare variable NUMPEDIDO VARCHAR(10);
BEGIN
EXECUTE PROCEDURE LEE_CONFIGURACION('FACTURACION', 'DOCUMENTOS', 'INHABILITAR FECHA EN DOCUMENTOS') returning_values (:fecserver);
if (FECSERVER = 'SI') then
    NEW.revt_fecha = CAST ('NOW' AS DATE);
if (NEW.numok = 'N') then
  BEGIN
  /* Actualice el contador del prefijo */
  SELECT PREF_ACTUAL, PREF_AUTO FROM PREFIJOS WHERE TIDO_COD = 32 AND PREF_PRE = NEW.PREF_PRE INTO :NUMERO, :AUTOM;
  /* ACTUALICE EL NUMERO EN COMPROBANTE_ENCABEZADO  */
  if (AUTOM = 'S') then
    BEGIN
    NEW.REVT_NUMERO = NUMERO;
    NUMERO = CAST((CAST(NUMERO AS INTEGER) + 1) AS CHAR(6));
    UPDATE PREFIJOS
      SET PREF_ACTUAL = :NUMERO
    WHERE TIDO_COD = 32 AND PREF_PRE = NEW.PREF_PRE;
    END
  ELSE
    BEGIN
    if (CAST(NUMERO AS INTEGER) = CAST(NEW.REVT_NUMERO AS INTEGER)) then
        UPDATE PREFIJOS
          SET PREF_ACTUAL = CAST((CAST(PREF_ACTUAL AS INTEGER) + 1) AS CHAR(6))
        WHERE TIDO_COD = 32 AND PREF_PRE = NEW.PREF_PRE;
    END
  EXECUTE PROCEDURE COMPLETA_CEROS (NEW.REVT_numero) returning_values (NEW.REVT_numero);
  NEW.numok = 'S';
  END
/* Verifique que el numero no existe previamente */
EXISTE = 'N';
SELECT 'S' FROM REMISIONES_VENTA WHERE PREF_PRE = NEW.PREF_PRE AND REVT_NUMERO = NEW.REVT_NUMERO INTO :EXISTE;
if (EXISTE = 'S') then
    EXCEPTION DOCUMENTO_REGISTRADO 'Ya existe una remisión a cliente con el número ' || new.pref_pre || new.revt_numero;

/* si hay pedido automatico saque una copia de la consolidacion */
EXECUTE PROCEDURE LEE_CONFIGURACION('FACTURACION', 'FACTURAS', 'GENERAR PEDIDO AUTOMATICAMENTE CON LA FACTURA') returning_values (pedauto);
if (PEDAUTO = 'SI') then
    begin
    IDC = gen_id(id_cons,1);
    for select cefa_item, cefa_idori from consolide_faltantes where cefa_id = new.revt_consolida
        into :item, :idf
        do
        begin
        SELECT PEDI_ID FROM PEDIDOS P, FACTURAS F WHERE P.PREF_PRE = F.pref_pre AND P.pedi_numero = F.fact_numero AND F.fact_id = :IDF INTO :IDP;
        insert into consolide_faltantes (cefa_id, cefa_item, cefa_tipodes, cefa_tipoori, cefa_idori)
            VALUES(:IDC, :item, 32, 34, :IDP);
        end
    EXECUTE PROCEDURE consolide_pendientes (:IDC);
    NEW.lipr_cod = :IDC;
    end
if (NEW.revt_consolida <> 0) then
    BEGIN
    execute procedure lee_configuracion ('FACTURACION', 'REMISIONES', 'PERMITIR VARIOS DESPACHOS PARCIALES DEL MISMO PEDIDO/FACTURA') returning_values (:pedidorep);
    if (pedidorep <> 'SI') then
        BEGIN
        SELECT COUNT(C2.COFA_ID), MAX(TIDO_NOMCORTO), max(c2.cofa_idori) FROM consolidado_faltantes C1, consolidado_faltantes C2, tipo_documento t
            WHERE C1.cofa_id <> C2.cofa_id and C1.cofa_id = NEW.revt_consolida AND C1.cofa_tipodes = 32 AND
            C2.cofa_tipodes = 32 AND C1.cofa_tipoori = C2.cofa_tipoori AND C1.cofa_idori = C2.cofa_idori and
            c1.cofa_tipoori = t.tido_cod and c1.cofa_cantcr <> 0 and c2.cofa_cantcr <> 0
            INTO :NUMROWS, :TIPO, :idpedido;
        if (NUMROWS <> 0) then
            begin
            if (TIPO = 'PEDIDCLI') then
                SELECT PREF_PRE || PEDI_NUMERO FROM PEDIDOS WHERE PEDI_ID = :idpedido INTO :numpedido;
            if (TIPO = 'FACTVENT') then
                SELECT PREF_PRE || FACT_NUMERO FROM FACTURAS WHERE FACT_ID = :idpedido INTO :numpedido;
            exception documento_cruzado 'El documento ' || :tipo || ' ' || :numpedido || ' ya fue utilizado en otra remisión.';
            end
        END
    END
END^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER procedure DOCVENTAS_X_CLIENTE (
    NIT varchar(20),
    TIPODOC integer,
    TIPODES integer,
    FECHA date,
    SUCURSAL varchar(10))
returns (
    PREFIJO varchar(4),
    NUMERO varchar(8),
    VALIDEZ integer,
    VEND integer,
    ID integer,
    FECDOC date,
    SUBTOTAL numeric(18,2),
    IVA numeric(18,2),
    CONSUMO numeric(18,2),
    TOTAL numeric(18,2),
    SUCUR varchar(10))
AS
declare variable VENCE DATE;
declare variable ITEM INTEGER;
declare variable FALTA NUMERIC(18,4);
declare variable FALTAT NUMERIC(18,4);
declare variable UNIDAD VARCHAR(8);
declare variable FACTOR NUMERIC(18,4);
declare variable DIAS INTEGER;
declare variable usado CHAR(2);
declare variable NUMROWS INTEGER;
declare variable TRAERCONTADO CHAR(2);
declare variable CONSOL INTEGER;
declare variable TIPOORI INTEGER;
declare variable OK CHAR(1);
declare variable ITECAN NUMERIC(18,2);
declare variable ITESUB NUMERIC(18,2);
declare variable ITEIVA NUMERIC(18,2);
declare variable ITECON NUMERIC(18,2);
BEGIN
EXECUTE PROCEDURE lee_configuracion('FACTURACION','DOCUMENTOS','NUMERO DE DIAS MAXIMO PARA CRUZAR DOCUMENTO') returning_values (DIAS);
EXECUTE PROCEDURE lee_configuracion('FACTURACION', 'DOCUMENTOS', 'TRAER DOCUMENTOS PENDIENTES DEL CLIENTE DE CONTADO EN DOCUMENTOS DE OTROS CLIENTES') returning_values (TRAERCONTADO);
EXECUTE PROCEDURE lee_configuracion('FACTURACION','DOCUMENTOS','PERMITIR LLAMAR DOCUMENTOS PREVIAMENTE USADOS EN OTRO TIPO DE DOCUMENTO') returning_values (:USADO);

if (TIPODOC = 31) then /* FACTURA */
    BEGIN
    FOR SELECT FACT_ID, PREF_PRE, FACT_NUMERO, FACT_FECHA, FACT_VENCE, FACT_SUCURSAL, VEND_COD, FACT_CONSOLIDA
        FROM FACTURAS
        WHERE TERC_NIT = :NIT AND FACT_FECHA <= :FECHA AND (FACT_FECHA >= (:FECHA - :DIAS)) AND
            FACT_ANULADO = 'N' AND ((FACT_SUCURSAL = :SUCURSAL) or (:SUCURSAL = 'Todas') or (:SUCURSAL = '0'))
        INTO :ID, :PREFIJO, :NUMERO, :FECDOC, :VENCE, :SUCUR, :VEND, :CONSOL DO
        BEGIN
        EXECUTE PROCEDURE TOTAL_DOC_VENTAS(TIPODOC, ID) returning_values (SUBTOTAL, IVA, CONSUMO);
        TOTAL = SUBTOTAL + IVA + CONSUMO;
        VALIDEZ = VENCE - FECDOC;
        if (TIPODES = 33) then
            BEGIN
            /* VERIFIQUE SI HAY PENDIENTES */
            SELECT SUM(FADE_CANT * FADE_FACTOR - FADE_DEVUELTO) FROM FACTURAS_DETALLE WHERE FACT_ID = :ID and substring(arti_cod from 1 FOR 2) <> '.t' and FADE_cant > 0 INTO :FALTA;
            if (FALTA <> 0) then
                suspend;
            END
        ELSE
            BEGIN
            /* VERIFIQUE QUE NO ESTE HECHA CON BASE EN UN DOCUMENTO DE ORIGEN */
            FALTAT = 0;
            OK = 'N';
            if ((CONSOL <> 0) AND (CONSOL IS NOT NULL)) then
                BEGIN
                SELECT MAX(COFA_TIPOORI) FROM consolidado_faltantes WHERE COFA_ID = :CONSOL AND COFA_CANTCR <> 0 INTO :tipoori;
                if (TIPOORI <> TIPODES) then
                    OK = 'S';
                END
            ELSE
                OK = 'S';
            if (OK = 'S') then
                BEGIN
                /* RECORRA LOS ITEMS PARA VER SI TODO ESTA USADO */
                FOR SELECT FADE_ITEM FROM FACTURAS_DETALLE WHERE FACT_ID = :ID and substring(arti_cod from 1 FOR 2) <> '.t' ORDER BY FADE_ITEM INTO :ITEM DO
                    BEGIN
                    EXECUTE procedure FALTANTE(TIPODOC, :TIPODES, :ID, :ITEM) returning_values (:FALTA, :UNIDAD, :FACTOR);
                    FALTAT = FALTAT + FALTA;
                    END
                if (FALTAT <> 0) then
                    SUSPEND;
                END
            END
        END
    END
  if (TIPODOC = 32) then /* REMISION */
    BEGIN
    FOR SELECT REVT_ID, PREF_PRE, REVT_NUMERO, REVT_FECHA, 0, REVT_SUCURSAL, VEND_COD, REVT_CONSOLIDA
        FROM remisiones_venta
        WHERE TERC_NIT = :NIT AND REVT_FECHA <= :FECHA AND (REVT_FECHA >= (:FECHA - :DIAS)) AND
            REVT_ANULADO = 'N' AND ((REVT_SUCURSAL = :SUCURSAL) or (:SUCURSAL = 'Todas'))
        INTO :ID, :PREFIJO, :NUMERO, :FECDOC, :VALIDEZ, :SUCUR, :VEND, :CONSOL DO
        BEGIN
        EXECUTE PROCEDURE TOTAL_DOC_VENTAS(TIPODOC, ID) returning_values (SUBTOTAL, IVA, CONSUMO);
        TOTAL = SUBTOTAL + IVA + CONSUMO;
        if (TIPODES <> 0) then
            BEGIN
            /* VERIFIQUE QUE NO ESTE HECHA CON BASE EN UN DOCUMENTO DE ORIGEN */
            FALTAT = 0;
            OK = 'N';
            if ((CONSOL <> 0) AND (CONSOL IS NOT NULL)) then
                BEGIN
                SELECT MAX(COFA_TIPOORI) FROM consolidado_faltantes WHERE COFA_ID = :CONSOL AND COFA_CANTCR <> 0 INTO :tipoori;
                if (TIPOORI <> TIPODES) then
                    OK = 'S';
                END
            ELSE
                OK = 'S';
            if (OK = 'S') then
                BEGIN
                /* RECORRA LOS ITEMS PARA VER SI TODO ESTA USADO */
                FOR SELECT RVDE_ITEM FROM REMISIONES_VENTA_DETALLE WHERE REVT_ID = :ID ORDER BY RVDE_ITEM INTO :ITEM DO
                    BEGIN
                    EXECUTE procedure FALTANTE(TIPODOC, :TIPODES, :ID, :ITEM) returning_values (:FALTA, :UNIDAD, :FACTOR);
                    FALTAT = FALTAT + FALTA;
                    END
                if (FALTAT <> 0) then
                    SUSPEND;
                END
            END
        END
    END
  if (TIPODOC = 33) then /* DEVOLUCION */
    BEGIN
    FOR SELECT DEVT_ID, PREF_PRE, DEVT_NUMERO, DEVT_FECHA, 0, DEVT_SUCURSAL, VEND_COD
        FROM DEVOLUCIONES_VENTAS
        WHERE TERC_NIT = :NIT AND DEVT_FECHA <= :FECHA AND DEVT_ANULADO = 'N' AND ((DEVT_SUCURSAL = :SUCURSAL) or (:SUCURSAL = 'Todas'))
        INTO :ID, :PREFIJO, :NUMERO, :FECDOC, :VALIDEZ, :SUCUR, :VEND DO
        BEGIN
        EXECUTE PROCEDURE TOTAL_DOC_VENTAS(TIPODOC, ID) returning_values (SUBTOTAL, IVA, CONSUMO);
        TOTAL = SUBTOTAL + IVA + CONSUMO;
        SUSPEND;
        END
    END
  if (TIPODOC = 34) then /* PEDIDO */
    BEGIN
    FOR SELECT PEDI_ID, PREF_PRE, PEDI_NUMERO, PEDI_FECHA, PEDI_VALIDEZ, PEDI_SUCURSAL, VEND_COD
        FROM PEDIDOS
        WHERE ((TERC_NIT = :NIT) OR ((:traercontado = 'SI') AND (exists (SELECT PTVT_ID FROM PUNTO_VENTA where TERC_NIT = :NIT))))
        AND PEDI_FECHA <= :FECHA AND PEDI_FECHA+PEDI_VALIDEZ >= :FECHA AND PEDI_ANULADO = 'N' AND ((PEDI_SUCURSAL = :SUCURSAL) or (:SUCURSAL = 'Todas'))
        INTO :ID, :PREFIJO, :NUMERO, :FECDOC, :VALIDEZ, :SUCUR, :VEND DO
        BEGIN
        EXECUTE PROCEDURE TOTAL_DOC_VENTAS(TIPODOC, ID) returning_values (SUBTOTAL, IVA, CONSUMO);
        if (TIPODES <> 0) then
            BEGIN
            /* RECORRA LOS ITEMS PARA VER SI TODO ESTA USADO */
            FALTAT = 0;
            if (USADO = 'NO') then
                SELECT COUNT(*) FROM consolide_faltantes WHERE CEFA_TIPOORI = 34 AND CEFA_IDORI = :ID AND CEFA_TIPODES <> :tipodes INTO :NUMROWS;
            ELSE
                NUMROWS = 0;
            if (NUMROWS = 0) then
                BEGIN
                SUBTOTAL = 0;
                IVA = 0;
                CONSUMO = 0;
                FOR SELECT PEDE_ITEM, PEDE_CANT * PEDE_FACTOR, PEDE_TOTAL-PEDE_IVAMONTO-PEDE_CONSUMO, PEDE_IVAMONTO, PEDE_CONSUMO
                    FROM PEDIDOS_DETALLE WHERE PEDI_ID = :ID ORDER BY PEDE_ITEM INTO :ITEM, :ITECAN, :ITESUB, :ITEIVA, :ITECON
                    DO
                    BEGIN
                    EXECUTE procedure FALTANTE(TIPODOC, :TIPODES, :ID, :ITEM) returning_values (:FALTA, :UNIDAD, :FACTOR);
                    FALTAT = FALTAT + FALTA;
                    if (ITECAN <> 0) then
                        BEGIN
                        SUBTOTAL = SUBTOTAL + cast(cast((ITESUB/ITECAN) as double precision) * cast(FALTA * FACTOR as double precision) as numeric(18, 2));
                        IVA = IVA + cast(cast((ITEIVA/ITECAN) as double precision) * cast(FALTA * FACTOR as double precision) as numeric(18, 2));
                        CONSUMO = CONSUMO + cast(cast((ITECON/ITECAN) as double precision) * cast(FALTA * FACTOR as double precision) as numeric(18, 2));
                        END
                    END
                END
            if (FALTAT <> 0) then
                BEGIN
                TOTAL = SUBTOTAL + IVA + CONSUMO;
                SUSPEND;
                END
            END
        ELSE
            SUSPEND;
        END
    END
  if (TIPODOC = 35) then /* COTIZACION */
    BEGIN
    FOR SELECT COTI_ID, PREF_PRE, COTI_NUMERO, COTI_FECHA, COTI_VALIDEZ, COTI_SUCURSAL, VEND_COD
        FROM cotizaciones
        WHERE ((TERC_NIT = :NIT) OR ((:traercontado = 'SI') AND (TERC_NIT IN (SELECT TERC_NIT FROM PUNTO_VENTA))))
        AND COTI_FECHA <= :FECHA AND COTI_FECHA+COTI_VALIDEZ >= :FECHA AND COTI_ANULADO = 'N'
        AND ((COTI_SUCURSAL = :SUCURSAL) or (:SUCURSAL = 'Todas'))
        INTO :ID, :PREFIJO, :NUMERO, :FECDOC, :VALIDEZ, :SUCUR, :VEND DO
        BEGIN
        EXECUTE PROCEDURE TOTAL_DOC_VENTAS(TIPODOC, ID) returning_values (SUBTOTAL, IVA, CONSUMO);
        TOTAL = SUBTOTAL + IVA + CONSUMO;
        if (TIPODES <> 0) then
            BEGIN
            /* RECORRA LOS ITEMS PARA VER SI TODO ESTA USADO */
            FALTAT = 0;
            EXECUTE PROCEDURE lee_configuracion('FACTURACION','DOCUMENTOS','PERMITIR LLAMAR DOCUMENTOS PREVIAMENTE USADOS EN OTRO TIPO DE DOCUMENTO') returning_values (:USADO);
            if (USADO = 'NO') then
                SELECT COUNT(*) FROM consolide_faltantes WHERE CEFA_TIPOORI = 35 AND CEFA_IDORI = :ID AND CEFA_TIPODES <> :tipodes INTO :NUMROWS;
            ELSE
                NUMROWS = 0;
            if (NUMROWS = 0) then
                FOR SELECT CTDE_ITEM FROM COTIZACIONES_DETALLE WHERE COTI_ID = :ID ORDER BY CTDE_ITEM INTO :ITEM DO
                    BEGIN
                    EXECUTE procedure FALTANTE(TIPODOC, :TIPODES, :ID, :ITEM) returning_values (:FALTA, :UNIDAD, :FACTOR);
                    FALTAT = FALTAT + FALTA;
                    END
            if (FALTAT <> 0) then
                SUSPEND;
            END
        ELSE
            SUSPEND;
        END
    END
if (TIPODOC = 40) then /* PENDIENTE */
    BEGIN
    FOR SELECT PEND_ID, PREF_PRE, PEND_NUMERO, PEND_FECHA, 0, PEND_SUCURSAL, VEND_COD
        FROM pendiente_ventas
        WHERE (TERC_NIT = :NIT) AND PEND_FECHA <= :FECHA AND PEND_ANULADO = 'N' AND ((PEND_SUCURSAL = :SUCURSAL) or (:SUCURSAL = 'Todas'))
        INTO :ID, :PREFIJO, :NUMERO, :FECDOC, :VALIDEZ, :SUCUR, :VEND DO
        BEGIN
        EXECUTE PROCEDURE TOTAL_DOC_VENTAS(TIPODOC, ID) returning_values (SUBTOTAL, IVA, CONSUMO);
        TOTAL = SUBTOTAL + IVA + CONSUMO;
        if (TIPODES <> 0) then
            BEGIN
            /* RECORRA LOS ITEMS PARA VER SI TODO ESTA USADO */
            FALTAT = 0;
            FOR SELECT pevd_item FROM pendiente_ventas_detalle WHERE PEND_ID = :ID ORDER BY PEVD_ITEM INTO :ITEM DO
                BEGIN
                EXECUTE procedure FALTANTE(TIPODOC, :TIPODES, :ID, :ITEM) returning_values (:FALTA, :UNIDAD, :FACTOR);
                FALTAT = FALTAT + FALTA;
                END
            if (FALTAT <> 0) then
                SUSPEND;
            END
        ELSE
            SUSPEND;
        END
    END
END^

SET TERM ; ^

/* 20131101 */

CREATE TABLE COTIZACION_WEB (
    COWE_ID         T_ID NOT NULL /* T_ID = INTEGER */,
    COWE_FECHA      FECHA /* FECHA = DATE */,
    TERC_NIT        T_NIT /* T_NIT = VARCHAR(20) */,
    COWE_SUCURSAL   VARCHAR(10),
    COWE_OBS        BLOB SUB_TYPE 1 SEGMENT SIZE 80,
    COWE_ENTREGA    FECHA /* FECHA = DATE */,
    COWE_DIAS       INTEGER,
    VEND_COD        T_ID /* T_ID = INTEGER */,
    COWE_DTOPORC    T_PORCENTAJE /* T_PORCENTAJE = NUMERIC(9,4) DEFAULT 0 */,
    COWE_ADICIONAL  T_MONTO /* T_MONTO = NUMERIC(18,2) DEFAULT 0 */,
    COWE_EXTRA      T_MONTO /* T_MONTO = NUMERIC(18,2) DEFAULT 0 */,
    COWE_IVAMONTO   T_MONTO /* T_MONTO = NUMERIC(18,2) DEFAULT 0 */,
    COWE_TOTAL      T_MONTO /* T_MONTO = NUMERIC(18,2) DEFAULT 0 */,
    COWE_PREF       VARCHAR(4),
    COWE_DTOMONTO   T_MONTO /* T_MONTO = NUMERIC(18,2) DEFAULT 0 */,
    COWE_NUMPED     VARCHAR(10)
);

ALTER TABLE COTIZACION_WEB ADD CONSTRAINT PK_COTIZACION_WEB PRIMARY KEY (COWE_ID);

CREATE TABLE COTIZACION_WEB_DETALLE (
    COWE_ID          T_ID NOT NULL /* T_ID = INTEGER */,
    COWD_ITEM        T_ID NOT NULL /* T_ID = INTEGER */,
    ARTI_COD         T_COD_ARTICULO /* T_COD_ARTICULO = VARCHAR(15) */,
    COWD_CODBAR      T_COD_ARTICULO /* T_COD_ARTICULO = VARCHAR(15) */,
    COWD_CANT        T_CANTIDAD /* T_CANTIDAD = NUMERIC(18,4) */,
    COWD_UNIDAD      T_UNIDAD /* T_UNIDAD = VARCHAR(8) */,
    COWD_FACTOR      T_CANTIDAD /* T_CANTIDAD = NUMERIC(18,4) */,
    LIPR_COD         T_ID /* T_ID = INTEGER */,
    COWD_PRUNIT      T_MONTO /* T_MONTO = NUMERIC(18,2) DEFAULT 0 */,
    COWD_DTOP        T_PORCENTAJE /* T_PORCENTAJE = NUMERIC(9,4) DEFAULT 0 */,
    COWD_IVAP        T_PORCENTAJE /* T_PORCENTAJE = NUMERIC(9,4) DEFAULT 0 */,
    COWD_IVAMONTO    T_MONTO /* T_MONTO = NUMERIC(18,2) DEFAULT 0 */,
    COWD_CONSUMO     T_MONTO /* T_MONTO = NUMERIC(18,2) DEFAULT 0 */,
    COWD_TOTAL       T_MONTO /* T_MONTO = NUMERIC(18,2) DEFAULT 0 */,
    COWD_REFERENCIA  T_CONCEPTO /* T_CONCEPTO = VARCHAR(60) */,
    COWD_DTOM        T_MONTO /* T_MONTO = NUMERIC(18,2) DEFAULT 0 */
);


ALTER TABLE COTIZACION_WEB_DETALLE ADD CONSTRAINT PK_COTI_WEB_DETALLE PRIMARY KEY (COWE_ID, COWD_ITEM);

SET TERM ^ ;

/* Trigger: COTIZACION_WEB_AD */
CREATE OR ALTER TRIGGER COTIZACION_WEB_AD FOR COTIZACION_WEB
ACTIVE AFTER DELETE POSITION 0
as
begin
INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
    VALUES (USER, 235, OLD.cowe_id, 'D', OLD.terc_nit);
end
^


/* Trigger: COTIZACION_WEB_AI */
CREATE OR ALTER TRIGGER COTIZACION_WEB_AI FOR COTIZACION_WEB
ACTIVE AFTER INSERT POSITION 0
as
begin
INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
    VALUES (USER, 235, NEW.cowe_id, 'I', NEW.terc_nit);
end
^


/* Trigger: COTIZACION_WEB_AU */
CREATE OR ALTER TRIGGER COTIZACION_WEB_AU FOR COTIZACION_WEB
ACTIVE AFTER UPDATE POSITION 0
as
begin
INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
    VALUES (USER, 235, NEW.cowe_id, 'U', NEW.terc_nit);
end
^


/* Trigger: COTIZACION_WEB_BI */
CREATE OR ALTER TRIGGER COTIZACION_WEB_BI FOR COTIZACION_WEB
ACTIVE BEFORE INSERT POSITION 0
as
declare variable FECSERVER CHAR(2);
begin
EXECUTE PROCEDURE LEE_CONFIGURACION('FACTURACION', 'DOCUMENTOS', 'INHABILITAR FECHA EN DOCUMENTOS') returning_values (:fecserver);
if (FECSERVER = 'SI') then
    NEW.cowe_fecha = CAST ('NOW' AS DATE);
SELECT VEND_COD FROM CLIENTES WHERE TERC_NIT = NEW.TERC_NIT INTO NEW.VEND_COD;
SELECT PREF_PRE FROM PUNTO_VENTA PT, VENDEDORES V WHERE V.vend_cod = new.vend_cod AND V.ptvt_id = PT.ptvt_id INTO new.cowe_pref;
if (NEW.cowe_ivamonto IS NULL) then
    NEW.cowe_ivamonto = 0;
if (NEW.cowe_total IS NULL) then
    NEW.cowe_total = 0;
if (NEW.cowe_dtoporc IS NULL) then
    NEW.cowe_dtoporc = 0;
ELSE
    if (NEW.cowe_dtomonto IS NULL) then
        NEW.cowe_dtomonto = (NEW.cowe_total - NEW.cowe_ivamonto) * NEW.cowe_dtoporc / 100;
if (NEW.cowe_adicional IS NULL) then
    NEW.cowe_adicional = 0;
if (NEW.cowe_extra IS NULL) then
    NEW.cowe_extra = 0;
end
^


/* Trigger: COTIZACION_WEB_BU */
CREATE OR ALTER TRIGGER COTIZACION_WEB_BU FOR COTIZACION_WEB
ACTIVE BEFORE UPDATE POSITION 0
as
declare variable TOTAL NUMERIC(18,2);
declare variable IVAMONTO NUMERIC(18,2);
begin
if (NEW.cowe_dtoporc IS NULL) then
    NEW.cowe_dtoporc = 0;
ELSE
    if ((NEW.cowe_dtomonto IS NULL) or (new.cowe_dtomonto = 0)) then
        NEW.cowe_dtomonto = (NEW.cowe_total - NEW.cowe_ivamonto) * NEW.cowe_dtoporc / 100;
if (NEW.cowe_adicional IS NULL) then
    NEW.cowe_adicional = 0;
if (NEW.cowe_extra IS NULL) then
    NEW.cowe_extra = 0;
/* actualice los totales del encabezado */
SELECT SUM(COWD_TOTAL), SUM(COWD_IVAMONTO) FROM cotizacion_web_detalle PD
    WHERE COWE_ID = NEW.cowe_id INTO :TOTAL, :IVAMONTO;

NEW.COWE_IVAMONTO = :IVAMONTO * (100 - new.COWE_DTOPORC) / 100;
NEW.COWE_TOTAL = :TOTAL - NEW.COWE_DTOMONTO + NEW.COWE_ADICIONAL + NEW.COWE_EXTRA;
end
^


SET TERM ; ^

/* Privileges of users */
GRANT SELECT, INSERT, UPDATE, DELETE ON COTIZACION_WEB TO PUBLIC;

SET TERM ^ ;

CREATE OR ALTER TRIGGER COTIZACION_WEB_BI FOR COTIZACION_WEB
ACTIVE BEFORE INSERT POSITION 0
as
declare variable FECSERVER CHAR(2);
begin
EXECUTE PROCEDURE LEE_CONFIGURACION('FACTURACION', 'DOCUMENTOS', 'INHABILITAR FECHA EN DOCUMENTOS') returning_values (:fecserver);
if (FECSERVER = 'SI') then
    NEW.cowe_fecha = CAST ('NOW' AS DATE);
SELECT VEND_COD FROM CLIENTES WHERE TERC_NIT = NEW.TERC_NIT INTO NEW.VEND_COD;
SELECT PREF_PRE FROM PUNTO_VENTA PT, VENDEDORES V WHERE V.vend_cod = new.vend_cod AND V.ptvt_id = PT.ptvt_id INTO new.cowe_pref;
if (NEW.cowe_ivamonto IS NULL) then
    NEW.cowe_ivamonto = 0;
if (NEW.cowe_total IS NULL) then
    NEW.cowe_total = 0;
if (NEW.cowe_dtoporc IS NULL) then
    NEW.cowe_dtoporc = 0;
ELSE
    if (NEW.cowe_dtomonto IS NULL) then
        NEW.cowe_dtomonto = (NEW.cowe_total - NEW.cowe_ivamonto) * NEW.cowe_dtoporc / 100;
if (NEW.cowe_adicional IS NULL) then
    NEW.cowe_adicional = 0;
if (NEW.cowe_extra IS NULL) then
    NEW.cowe_extra = 0;
if (NEW.cowe_pref IS NULL) then
    NEW.cowe_pref = 'PL';
end^

SET TERM ; ^

SET TERM ^ ;

/* Trigger: COTIZACION_WEB_DETALLE_AI */
CREATE OR ALTER TRIGGER COTIZACION_WEB_DETALLE_AI FOR COTIZACION_WEB_DETALLE
ACTIVE AFTER INSERT POSITION 0
as
declare variable TOTAL NUMERIC(18,2);
declare variable IVAMONTO NUMERIC(18,2);
begin
/* actualice los totales del encabezado */
SELECT SUM(COWD_TOTAL), SUM(COWD_IVAMONTO) FROM cotizacion_web_detalle PD
    WHERE COWE_ID = NEW.cowe_id INTO :TOTAL, :IVAMONTO;
UPDATE COTIZACION_WEB
    SET COWE_IVAMONTO = :IVAMONTO * (100 - COWE_DTOPORC) / 100,
        COWE_DTOMONTO = (:TOTAL - :IVAMONTO) * COWE_DTOPORC / 100,
        COWE_TOTAL = :TOTAL - COWE_DTOMONTO + COWE_ADICIONAL + COWE_EXTRA
    WHERE COWE_ID = NEW.cowe_id;
end
^


/* Trigger: COTIZACION_WEB_DETALLE_BI */
CREATE OR ALTER TRIGGER COTIZACION_WEB_DETALLE_BI FOR COTIZACION_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 NIT VARCHAR(20);
declare variable PREF VARCHAR(4);
declare variable IVAINC CHAR(1);
declare variable ICOINC char(2);
BEGIN
execute procedure lee_configuracion('FACTURACION', 'ARTICULOS', 'IMPOCONSUMO INCLUIDO EN EL PRECIO BASE DE VENTA ANTES DE IVA') returning_values (:ICOINC);
/* LOS IMPUESTOS DEPENDEN DEL ENCABEZADO */
SELECT COWE_PREF, TERC_NIT FROM cotizacion_web P WHERE COWE_ID = NEW.cowe_id INTO :PREF, :NIT;
if (NEW.LIPR_COD IS NULL) then
    SELECT LIPR_COD FROM CLIENTES WHERE TERC_NIT = :NIT INTO NEW.LIPR_COD;

if (new.cowd_item is null) then
    begin
    select max(cowd_item) from cotizacion_web_detalle where cowe_id = new.cowe_id into :itemax;
    if (itemax is null) then
        new.cowd_item = 1;
    else
        new.cowd_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.cowd_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.cowd_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.cowd_codbar;
        ELSE
            if (new.cowd_unidad is null) then
                NEW.cowd_unidad = :UNIDAD;
        end
    else
        if (new.cowd_unidad is null) then
            NEW.cowd_unidad = :UNIDAD;
    end
EXECUTE PROCEDURE factor_unidad_cant(NEW.arti_cod, NEW.cowd_unidad) returning_values(NEW.cowd_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.cowd_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.cowd_dtop = DTOG + DTOL;
        END
    END
ELSE
    BEGIN
    if (NEW.cowd_dtop IS NULL) then
        NEW.cowd_dtop = 0;
    END

new.cowd_dtom = new.cowd_prunit * new.cowd_dtop / 100;

if (new.cowd_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.cowd_consumo;
    if ((new.cowd_consumo is null) or (new.cowd_consumo <> 0)) then
        select ARTI_CONSUMO from ARTICULO where ARTI_COD = new.ARTI_COD into new.cowd_consumo;
    if (new.cowd_consumo is null) then
        new.cowd_consumo = 0;
    new.cowd_consumo = new.cowd_consumo * new.cowd_cant * new.cowd_factor;
    end

/* CALCULE EL IVA, CONSUMO Y TOTAL */
SELECT PREF_IVAINC FROM PREFIJOS WHERE TIDO_COD = 35 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.cowd_ivap = :ivap;
if ((new.cowd_ivamonto is null) or (NEW.cowd_ivamonto = 0)) then
    begin
    if (IVAINC = 'N') then
        begin
        if (ICOINC = 'SI') then
            new.cowd_ivamonto = ((new.cowd_cant * (new.cowd_prunit - new.cowd_dtom) - new.cowd_consumo) / 100) * :IVAP;
        else
            new.cowd_ivamonto = ((new.cowd_cant * (new.cowd_prunit - new.cowd_dtom)) / 100) * :IVAP;
        end
    else
        new.cowd_ivamonto = ((new.cowd_cant * (new.cowd_prunit - new.cowd_dtom) - new.cowd_consumo) / (100 + :IVAP)) * :IVAP;
    end
if (ICOINC = 'SI') then
    new.cowd_total = (new.cowd_cant * (new.cowd_prunit - new.cowd_dtom));
else
    new.cowd_total = (new.cowd_cant * (new.cowd_prunit - new.cowd_dtom) + new.cowd_consumo);
if (IVAINC = 'N') then
    new.cowd_total = new.cowd_total + new.cowd_ivamonto;
end
^


SET TERM ; ^

/* Privileges of users */
GRANT SELECT, INSERT, UPDATE, DELETE ON COTIZACION_WEB_DETALLE TO PUBLIC;

SET TERM ^ ;

CREATE OR ALTER TRIGGER COTIZACION_WEB_DETALLE_BI FOR COTIZACION_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 NIT VARCHAR(20);
declare variable PREF VARCHAR(4);
declare variable IVAINC CHAR(1);
declare variable ICOINC char(2);
BEGIN
execute procedure lee_configuracion('FACTURACION', 'ARTICULOS', 'IMPOCONSUMO INCLUIDO EN EL PRECIO BASE DE VENTA ANTES DE IVA') returning_values (:ICOINC);
/* LOS IMPUESTOS DEPENDEN DEL ENCABEZADO */
SELECT COWE_PREF, TERC_NIT FROM cotizacion_web P WHERE COWE_ID = NEW.cowe_id INTO :PREF, :NIT;
if (NEW.LIPR_COD IS NULL) then
    SELECT LIPR_COD FROM CLIENTES WHERE TERC_NIT = :NIT INTO NEW.LIPR_COD;
if (NEW.lipr_cod IS NULL) then
    NEW.lipr_cod = 1;
if (new.cowd_item is null) then
    begin
    select max(cowd_item) from cotizacion_web_detalle where cowe_id = new.cowe_id into :itemax;
    if (itemax is null) then
        new.cowd_item = 1;
    else
        new.cowd_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.cowd_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.cowd_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.cowd_codbar;
        ELSE
            if (new.cowd_unidad is null) then
                NEW.cowd_unidad = :UNIDAD;
        end
    else
        if (new.cowd_unidad is null) then
            NEW.cowd_unidad = :UNIDAD;
    end
EXECUTE PROCEDURE factor_unidad_cant(NEW.arti_cod, NEW.cowd_unidad) returning_values(NEW.cowd_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.cowd_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.cowd_dtop = DTOG + DTOL;
        END
    END
ELSE
    BEGIN
    if (NEW.cowd_dtop IS NULL) then
        NEW.cowd_dtop = 0;
    END

new.cowd_dtom = new.cowd_prunit * new.cowd_dtop / 100;

if (new.cowd_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.cowd_consumo;
    if ((new.cowd_consumo is null) or (new.cowd_consumo <> 0)) then
        select ARTI_CONSUMO from ARTICULO where ARTI_COD = new.ARTI_COD into new.cowd_consumo;
    if (new.cowd_consumo is null) then
        new.cowd_consumo = 0;
    new.cowd_consumo = new.cowd_consumo * new.cowd_cant * new.cowd_factor;
    end

/* CALCULE EL IVA, CONSUMO Y TOTAL */
SELECT PREF_IVAINC FROM PREFIJOS WHERE TIDO_COD = 35 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.cowd_ivap = :ivap;
if ((new.cowd_ivamonto is null) or (NEW.cowd_ivamonto = 0)) then
    begin
    if (IVAINC = 'N') then
        begin
        if (ICOINC = 'SI') then
            new.cowd_ivamonto = ((new.cowd_cant * (new.cowd_prunit - new.cowd_dtom) - new.cowd_consumo) / 100) * :IVAP;
        else
            new.cowd_ivamonto = ((new.cowd_cant * (new.cowd_prunit - new.cowd_dtom)) / 100) * :IVAP;
        end
    else
        new.cowd_ivamonto = ((new.cowd_cant * (new.cowd_prunit - new.cowd_dtom) - new.cowd_consumo) / (100 + :IVAP)) * :IVAP;
    end
if (ICOINC = 'SI') then
    new.cowd_total = (new.cowd_cant * (new.cowd_prunit - new.cowd_dtom));
else
    new.cowd_total = (new.cowd_cant * (new.cowd_prunit - new.cowd_dtom) + new.cowd_consumo);
if (IVAINC = 'N') then
    new.cowd_total = new.cowd_total + new.cowd_ivamonto;
end^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER TRIGGER COTIZACION_WEB_DETALLE_AI FOR COTIZACION_WEB_DETALLE
ACTIVE AFTER INSERT POSITION 0
as
declare variable TOTAL NUMERIC(18,2);
declare variable IVAMONTO NUMERIC(18,2);
begin
/* actualice los totales del encabezado */
SELECT SUM(COWD_TOTAL), SUM(COWD_IVAMONTO) FROM cotizacion_web_detalle PD
    WHERE COWE_ID = NEW.cowe_id INTO :TOTAL, :IVAMONTO;
UPDATE COTIZACION_WEB
    SET COWE_IVAMONTO = :IVAMONTO * (100 - COWE_DTOPORC) / 100,
        COWE_DTOMONTO = (:TOTAL - :IVAMONTO) * COWE_DTOPORC / 100,
        COWE_TOTAL = :TOTAL - COWE_DTOMONTO + COWE_ADICIONAL + COWE_EXTRA
    WHERE COWE_ID = NEW.cowe_id;
end^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER procedure GRABE_COTIZA_WEB (
    ID integer)
returns (
    IDCOT integer)
AS
declare variable PREF VARCHAR(4);
declare variable IVAINC CHAR(1);
declare variable NIT VARCHAR(20);
declare variable NOMCLI VARCHAR(60);
declare variable VEN INTEGER;
declare variable PUNTO INTEGER;
declare variable USR VARCHAR(10);
declare variable NUM VARCHAR(10);
begin
IDCOT = gen_id(id_cotizaci, 1);
SELECT COWE_PREF, TERC_NIT, VEND_COD, COWE_ID FROM COTIZACION_WEB WHERE COWE_ID = :ID INTO :PREF, :NIT, :VEN, :NUM;
SELECT PREF_IVAINC FROM PREFIJOS WHERE TIDO_COD = 35 AND PREF_PRE = :PREF INTO :IVAINC;
SELECT TERC_NOM FROM TERCEROS WHERE TERC_NIT = :NIT INTO :NOMCLI;
SELECT PTVT_ID FROM VENDEDORES WHERE VEND_cOD = :VEN INTO :PUNTO;
/* EL ENCABEZADO */
INSERT INTO COTIZACIONES (COTI_ID, TERC_NIT, VEND_COD, TIDO_COD, PREF_PRE, COTI_NUMERO, COTI_FECHA, COTI_VALIDEZ,
    COTI_OBS, COTI_IMPTOS, COTI_NOMTERC, COTI_DTOPORC, COTI_DTOMONTO, COTI_ADICIONAL, COTI_IVAMONTO,
    COTI_EXTRA, COTI_TOTAL, COTI_ANULADO, COTI_TRANSMIT, PTVT_ID, COTI_NROCOPIA, COTI_USUARIO,
    COTI_SUCURSAL, NUMOK, COTI_FACTOR, COTI_TRM)
    SELECT :IDCOT, TERC_NIT, VEND_COD, 35, 'PL', COWE_ID, COWE_FECHA, 30,
    COWE_OBS, :IVAINC, :NOMCLI, COWE_DTOPORC, COWE_DTOMONTO, COWE_ADICIONAL, COWE_IVAMONTO,
    COWE_EXTRA, COWE_TOTAL, 'N', 'N', 1, 0, user, COWE_SUCURSAL, 'N', 1, 1
    FROM COTIZACION_WEB WHERE COWE_ID = :ID;
/* LOS ITEMS */
INSERT INTO COTIZACIONES_DETALLE (COTI_ID, CTDE_ITEM, ARTI_COD, CTDE_CANT, CTDE_UNIDAD, CTDE_DTOPORC, CTDE_DTOMONTO,
    CTDE_IVAPORC, CTDE_IVAMONTO, CTDE_CONSUMO, CTDE_FACTOR, CTDE_DESC, CTDE_OBS, CTDE_CODBAR, CTDE_TOTAL,
    CTDE_ANULADO, CTDE_TRANSMIT, LIPR_COD, CTDE_REFERENCIA, CTDE_PRUNIT, CTDE_REMISIONADO)
    SELECT :IDCOT, COWD_ITEM, ARTI_COD, COWD_CANT, COWD_UNIDAD, COWD_DTOP, COWD_DTOM,
    COWD_IVAP, COWD_IVAMONTO, COWD_CONSUMO, COWD_FACTOR, NULL, NULL, COWD_CODBAR, COWD_TOTAL,
    'N', 'N', LIPR_COD, COWD_REFERENCIA, COWD_PRUNIT, 0
    FROM COTIZACION_WEB_DETALLE WHERE COWE_ID = :ID;
if ((VEN IS NOT NULL) AND (VEN <> '')) then
    BEGIN
    SELECT USER_COD FROM USUARIO WHERE VEND_COD = :VEN INTO :USR;
    if ((USR <> '') AND (USR IS NOT NULL)) then
        BEGIN
        INSERT INTO MENSAJERIA(MENS_ID, MENS_AUTOR, MENS_MENSAJE,
            MENS_FECHA, MENS_HORA, MENS_NIVEL, MENS_DESTINO, MENS_LEIDO)
            VALUES (gen_id(id_mensaje, 1), USER, 'NUEVA COTIZACION CLIENTE ' || :nomcli || ' No.' || :NUM,
            CAST('NOW' AS DATE), CAST('NOW' AS TIME), 1, :USR, 'N');
        END
    END
suspend;
end^

SET TERM ; ^

/* 20131113 */
/* SI IVA POR ARTICULO ASEGURARSE QUE AL MONTO DEL IVA SEA DIFERENTE DE CERO */
SET TERM ^ ;

CREATE OR 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 ERROR (31, :IDDOC, :CTARTFTE, 2);
                CUENTA = CTARTFTE;
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                end
            if ((TIPOCUEN = 'I') or (TIPOCUEN = 'A')) then
                begin
                EXECUTE PROCEDURE ERROR (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 ERROR (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 ERROR (31, :IDDOC, :PREF, 1);
    ERROR = ERROR + 1;
    VER = 'S';
    SUSPEND;
    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,
    FECINI DATE,
    FECFIN DATE,
    MORA NUMERIC(9,4))
RETURNS (
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(8),
    NIT VARCHAR(20),
    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);
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);
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.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 S.clcu_cod = '01' AND
        C.vend_cod >= :vendini AND C.vend_cod <= :vendfin AND ((c.grca_cod is null and :grpini = 0 ) or (C.grca_cod >= :grpini AND C.grca_cod <= :grpfin)) AND
        ((c.zona_cod is null and :zonini = '') or (C.zona_cod >= :zonini AND C.zona_cod <= :zonfin))
    INTO :NIT, :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_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', 'N', :TOTAL, :BOD, :OBS, NULL, NULL, 0, USER, '01', '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 CLIE_VALORMES FROM CLIENTES WHERE TERC_NIT = :NIT 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
            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, NULL, '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;
            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
        UPDATE FACTURAS SET FACT_TOTAL = :total,  FACT_IVAMONTO = :IVAM, FACT_RTFTEMONTO = :rtftem, 
            FACT_RTIVAMONTO = :rtivam, FACT_RTICAMONTO = :rticam 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 ; ^

/* 20131114 */
/* JALE LA COTIZACION DEL PEDIDO SI NO LA TIENE LA FACTURA */
SET TERM ^ ;

CREATE OR ALTER procedure IMPR_FACTURA (
    ID integer)
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);
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_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
    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,
    :OBS, :VEHICULO,/* :NROCOPIA,*/ :RECIBIDO, :SUCUR, :paciente, :nompaciente, :nomcliente, :ANULADO, :anticipo, :retgarantia, :factenc, :FECINI, :FECFIN;

/* 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 <> '') 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 */
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;
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
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, SUBSTR(FADE_DESC,1,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 = SUMA1 + SUMA2 + SUMA3 + SUMA4 + 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
            SUSPEND;
            END
          END
    END
ELSE
  if (ORDENCOD = 'UNIDAD') then
    BEGIN
    FOR SELECT FADE_ITEM, D.ARTI_COD, FADE_CODBAR, SUBSTR(FADE_DESC,1,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 = SUMA1 + SUMA2 + SUMA3 + SUMA4 + 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
            SUSPEND;
            END
          END
    END
  ELSE
    if (ORDENCOD = 'STAND') then
      BEGIN
      FOR SELECT FADE_ITEM, D.ARTI_COD, FADE_CODBAR, SUBSTR(FADE_DESC,1,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 = SUMA1 + SUMA2 + SUMA3 + SUMA4 + 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
                SUSPEND;
                END
              END
      END
    ELSE
        BEGIN
        FOR SELECT FADE_ITEM, D.ARTI_COD, FADE_CODBAR, SUBSTR(FADE_DESC,1,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 = SUMA1 + SUMA2 + SUMA3 + SUMA4 + 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
                SUSPEND;
                END
              END
        END
END^

SET TERM ; ^

/* 20131115 */
/* CAMBIE EL SELECT COUNT(*) POR EXISTS PARA MEJORAR RENDIMIENTO */
SET TERM ^ ;

CREATE OR ALTER procedure CHEQUEO_SALDOS_CAJAS (
    CAJAINI integer,
    CAJAFIN integer)
AS
declare variable ID INTEGER;
declare variable Fec date;
declare variable Caja integer;
declare variable Conc VARCHAR(60);
declare variable Pref varchar(4);
declare variable Num varchar(8);
declare variable FORMA INTEGER;
declare variable BANCO VARCHAR(2);
declare variable CUENTA VARCHAR(20);
declare variable NUMERO VARCHAR(20);
declare variable FECHA DATE;
declare variable MONTO NUMERIC(18,2);
declare variable Dest INTEGER;
declare variable item integer;
declare variable idd integer;
declare variable TIPO INTEGER;
begin
/* BORRE LOS MOVIMIENTOS CAJA, LOS DOCUMENTOS PAGO CAJA Y SALDO EFECTIVO */
DELETE FROM ANTICIPOS_CLIENTE WHERE RECA_ID = 0;
DELETE FROM ANTICIPOS_PROVEEDOR WHERE EGRE_ID = 0;
UPDATE DOCUMENTOS_PAGO_CAJA SET dpca_idsal = 0 WHERE CAJA_ID >= :cajaini AND CAJA_ID <= :cajafin;
DELETE FROM MOVIMIENTO_CAJA WHERE CAJA_ID >= :cajaini AND CAJA_ID <= :cajafin;
DELETE FROM DOCUMENTOS_PAGO_CAJA WHERE CAJA_ID >= :cajaini AND CAJA_ID <= :cajafin;
DELETE FROM SALDO_EFECTIVO WHERE CAJA_ID >= :cajaini AND CAJA_ID <= :cajafin;
DELETE FROM saldo_caja WHERE CAJA_ID >= :cajaini AND CAJA_ID <= :cajafin;

/* INCORPORE LOS RECIBOS DE CAJA */
FOR SELECT R.RECA_ID, reca_fecha, caja_id, reca_conc, pref_pre, reca_numero, FOPA_ID, RCPA_BANCO, RCPA_CUENTA, RCPA_NUMERO, RCPA_FECHA, RCPA_MONTO
    FROM recibos_caja R, RECIBOS_CAJA_PAGO P where R.reca_id = P.reca_id and reca_anulado = 'N' AND CAJA_ID >= :cajaini AND CAJA_ID <= :cajafin
    ORDER BY CAJA_ID, R.RECA_FECHA, R.RECA_ID, RCPA_ITEM
    INTO :ID, :Fec, :Caja, :Conc, :Pref, :Num, :forma,  :banco, :cuenta, :numero, :fecha, :monto
    DO
    BEGIN
    if (exists (select moca_id from movimiento_caja where moca_tiporef = 61 and moca_idref = :id)) then
        update movimiento_caja
        set moca_debitos = moca_debitos + :monto
        where moca_tiporef = 61 and moca_idref = :id;
    else
        INSERT INTO MOVIMIENTO_CAJA
            (MOCA_ID, CAJA_ID, MOCA_TIPOREF, MOCA_PREFREF, MOCA_NUMREF, MOCA_FECHA, MOCA_CONC, MOCA_DEBITOS, MOCA_CREDITOS, MOCA_DB, MOCA_IDREF)
            VALUES(GEN_ID(id_movcaja,1), :Caja, 61, :Pref, :Num, :Fec, :Conc, :monto, 0, 'S', :id);
        /* GRABE EL DOCUMENTO DE PAGO EN CAJA */
        if (FORMA <> 1) then
            INSERT INTO DOCUMENTOS_PAGO_CAJA (DPCA_ID, FOPA_ID, CAJA_ID, DPCA_BANCO, DPCA_CUENTA, DPCA_NUMERO, DPCA_FECHA, DPCA_MONTO, DPCA_TIPOENT, DPCA_IDENT, DPCA_TIPOSAL, DPCA_IDSAL)
                VALUES (GEN_ID(ID_DOCPAGOCAJA, 1), :FORMA, :CAJA, :BANCO, :CUENTA, :NUMERO, :FECHA, :MONTO, 61, :ID, 0, 0);
        ELSE
            EXECUTE PROCEDURE SUME_SALDO_EFECTIVO (:CAJA, :FEC, :MONTO, 'N');
    END

/* LOS EGRESOS POR TRASLADO A CAJA */
for SELECT EGRE_ID, CAJA_ID, PREF_PRE, EGRE_NUMERO, EGRE_FECHA, EGRE_CONC, EGRE_MONTO FROM EGRESOS
    WHERE EGRE_TIPO = '2' AND CAJA_ID <> 0 AND egre_id <> 0 AND egre_anulado = 'N' AND CAJA_ID >= :cajaini AND CAJA_ID <= :cajafin
    ORDER BY CAJA_ID, EGRE_FECHA
    INTO :ID, :CAJA, :PREF, :NUM, :FEC, :CONC, :MONTO
    DO
    BEGIN
    if (exists (SELECT MOCA_IDREF FROM movimiento_caja WHERE MOCA_TIPOREF = 62 AND MOCA_IDREF = :ID)) Then
     BEGIN
     INSERT INTO MOVIMIENTO_CAJA
        (MOCA_ID, CAJA_ID, MOCA_TIPOREF, MOCA_PREFREF, MOCA_NUMREF, MOCA_FECHA, MOCA_CONC, MOCA_DEBITOS, MOCA_CREDITOS, MOCA_DB, MOCA_IDREF)
        VALUES(GEN_ID(id_movcaja,1), :CAJA, 62, :PREF, :NUM, :FEC, :CONC, :MONTO, 0, 'S', :ID);
      /* GRABE EL DOCUMENTO DE PAGO EN CAJA */
      EXECUTE PROCEDURE SUME_SALDO_EFECTIVO (:caja, :fec, :monto, 'N');
     END
    END
/* las planillas de pasajeros */
FOR SELECT PLPA_ID, PLPA_fecha, PLPA_pref, PLPA_numero, PLPA_caja, PLPA_NETO
    from planilla_pasajeros where plpa_anulado = 'N' and plpa_neto < 0
    order by PLPA_FECHA, PLPA_ID
    INTO :ID, :Fec, :Pref, :Num, :Caja, :monto
    DO
    BEGIN
    CONC = 'PLANILLA DE PASAJEROS No. ' || :pref || :num;
    INSERT INTO MOVIMIENTO_CAJA
        (MOCA_ID, CAJA_ID, MOCA_TIPOREF, MOCA_PREFREF, MOCA_NUMREF, MOCA_FECHA, MOCA_CONC, MOCA_DEBITOS, MOCA_CREDITOS, MOCA_DB, MOCA_IDREF)
        VALUES(GEN_ID(id_movcaja,1), :caja, 88, :pref, :num, :fec, :Conc, ABS(:monto), 0, 'S', :id);
    EXECUTE PROCEDURE SUME_SALDO_EFECTIVO (:caja, :fec, ABS(:monto), 'N');
    END

/* REMESAS CARGA   */
FOR SELECT CGRM_ID, CGRM_fecha, CGRM_pref, CGRM_numero, CGRM_caja, CGRM_TOTAL, TIDO_COD
    from carga_remesa where (CGRM_anulado = 'N') AND (cgrm_fpago = 'C') AND (cgrm_caja <> 0) AND (cgrm_caja IS NOT NULL)
    order by CGRM_FECHA, CGRM_ID
    INTO :ID, :Fec, :Pref, :Num, :Caja, :monto, :tipo
    DO
    BEGIN
    CONC = 'REMESA No. ' || :pref || :num;
    INSERT INTO MOVIMIENTO_CAJA
        (MOCA_ID, CAJA_ID, MOCA_TIPOREF, MOCA_PREFREF, MOCA_NUMREF, MOCA_FECHA, MOCA_CONC, MOCA_DEBITOS, MOCA_CREDITOS, MOCA_DB, MOCA_IDREF)
        VALUES(GEN_ID(id_movcaja,1), :caja, :tipo, :pref, :num, :fec, :Conc, :monto, 0, 'S', :id);
    EXECUTE PROCEDURE SUME_SALDO_EFECTIVO (:caja, :fec, :monto, 'N');
    END

/* TIQUETES PASAJEROS */
FOR SELECT TIQP_ID, TIQP_fecha, TIQP_pref, TIQP_numero, TIQP_caja, TIQP_TOTAL
    from tiquete_pasajero where (TIQP_anulado = 'N') AND (TIQP_formap = 'C') AND (TIQP_caja <> 0) AND (TIQP_caja IS NOT NULL)
    order by TIQP_FECHA, TIQP_ID
    INTO :ID, :Fec, :Pref, :Num, :Caja, :monto
    DO
    BEGIN
    CONC = 'TIQUETE DE PASAJEROS No. ' || :pref || :num;
    INSERT INTO MOVIMIENTO_CAJA
        (MOCA_ID, CAJA_ID, MOCA_TIPOREF, MOCA_PREFREF, MOCA_NUMREF, MOCA_FECHA, MOCA_CONC, MOCA_DEBITOS, MOCA_CREDITOS, MOCA_DB, MOCA_IDREF)
        VALUES(GEN_ID(id_movcaja,1), :caja, 86, :pref, :num, :fec, :Conc, :monto, 0, 'S', :id);
    EXECUTE PROCEDURE SUME_SALDO_EFECTIVO (:caja, :fec, :monto, 'N');
    END

/* LOS CAMBIOS */
FOR SELECT C.CADO_ID, cado_fecha, cado_conc, pref_pre, cado_numero, caja_id, FOPA_ID, CDSA_BANCO, CDSA_CUENTA, CDSA_NUMERO, CDSA_FECHA, CDSA_MONTO
    FROM CAMBIO_DOCUMENTOS C, CAMBIODOC_SALIDAS D where C.CADO_ID = D.CADO_ID and cado_anulado = 'N' AND CAJA_ID >= :cajaini AND CAJA_ID <= :cajafin
    ORDER BY CAJA_ID, C.CADO_FECHA, C.CADO_ID, CDSA_ITEM
    INTO :ID, :Fec, :Conc, :Pref, :Num, :Caja, :forma, :banco, :cuenta, :numero, :fecha, :monto
    DO
    BEGIN
    if (exists (select moca_id from movimiento_caja where moca_tiporef = 63 and moca_idref = :id and caja_id = :CAJA)) Then
        begin
        update movimiento_caja
            set moca_debitos = moca_debitos + :monto
            where moca_tiporef = 63 and moca_idref = :id and caja_id = :CAJA;
        end
    else
        INSERT INTO MOVIMIENTO_CAJA
            (MOCA_ID, CAJA_ID, MOCA_TIPOREF, MOCA_PREFREF, MOCA_NUMREF, MOCA_FECHA, MOCA_CONC, MOCA_DEBITOS, MOCA_CREDITOS, MOCA_DB, MOCA_IDREF)
            VALUES(GEN_ID(ID_MOVCAJA,1), :CAJA, 63, :Pref, :Num, :Fec, :Conc, :monto, 0, 'S', :id);
        
    if (FORMA <> 1) then
        INSERT INTO DOCUMENTOS_PAGO_CAJA (DPCA_ID, FOPA_ID, CAJA_ID, DPCA_BANCO, DPCA_CUENTA, DPCA_NUMERO, DPCA_FECHA, DPCA_MONTO, DPCA_TIPOENT, DPCA_IDENT, DPCA_TIPOSAL, DPCA_IDSAL)
            VALUES (GEN_ID(ID_DOCPAGOCAJA, 1), :FORMA, :CAJA, :BANCO, :CUENTA, :NUMERO, :FECHA, :MONTO, 63, :ID, 0, 0);
    ELSE
        EXECUTE PROCEDURE SUME_SALDO_EFECTIVO(:CAJA, :FEC, :MONTO, 'N');
    END
/* DEVOLUCIONES DE CHEQUES ojo fopa_id = 2 */
FOR SELECT DVCH_ID, dvch_fecha, caja_id, dvch_conc, prba_pref, dvch_numdoc, 2, DVCH_BANCO, DVCH_CUENTA, DVCH_NROCH, DVCH_FECCH, DVCH_MONTO
    FROM DEVOLUCION_CHEQUES where dvch_anulado = 'N' AND dvch_cartera <> 'S' AND CAJA_ID >= :cajaini AND CAJA_ID <= :cajafin
    ORDER BY CAJA_ID, DVCH_FECHA, DVCH_ID
    INTO :ID, :Fec, :Caja, :Conc, :Pref, :Num, :forma,  :banco, :cuenta, :numero, :fecha, :monto
    DO
    BEGIN
    if (exists (select moca_id from movimiento_caja where moca_tiporef = 77 and moca_idref = :id)) Then
        update movimiento_caja
        set moca_debitos = moca_debitos + :monto
        where moca_tiporef = 77 and moca_idref = :id;
    else
        INSERT INTO MOVIMIENTO_CAJA
            (MOCA_ID, CAJA_ID, MOCA_TIPOREF, MOCA_PREFREF, MOCA_NUMREF, MOCA_FECHA, MOCA_CONC, MOCA_DEBITOS, MOCA_CREDITOS, MOCA_DB, MOCA_IDREF)
            VALUES(GEN_ID(id_movcaja,1), :Caja, 77, :Pref, :Num, :Fec, :Conc, :monto, 0, 'S', :id);
        /* GRABE EL DOCUMENTO DE PAGO EN CAJA */
        INSERT INTO DOCUMENTOS_PAGO_CAJA (DPCA_ID, FOPA_ID, CAJA_ID, DPCA_BANCO, DPCA_CUENTA, DPCA_NUMERO, DPCA_FECHA, DPCA_MONTO, DPCA_TIPOENT, DPCA_IDENT, DPCA_TIPOSAL, DPCA_IDSAL)
            VALUES (GEN_ID(ID_DOCPAGOCAJA, 1), 2, :CAJA, :BANCO, :CUENTA, :NUMERO, :FECHA, :MONTO, 77, :ID, 0, 0);
    END

/* TRASLADOS ENTRE CAJAS INGRESOS */
FOR SELECT T.TRCJ_ID, trcj_fecha, caja_id, trcj_destino, trcj_conc, pref_pre, trcj_numero, fopa_id, TRCD_BANCO, TRCD_CUENTA, TRCD_NUMERO, TRCD_FECHA, TRCD_MONTO
    FROM TRASLADOS_CAJA T, TRASLADOS_CAJA_DET D where T.TRCJ_ID = D.TRCJ_ID AND trcj_anulado = 'N' AND TRCJ_DESTINO >= :cajaini AND TRCJ_DESTINO <= :cajafin
    ORDER BY CAJA_ID, TRCJ_FECHA, T.TRCJ_ID, TRCD_ITEM
    INTO :ID, :Fec, :Caja, :Dest, :Conc, :Pref, :Num, :forma,  :banco, :cuenta, :numero, :fecha, :monto
    DO
    BEGIN
    /* INGRESO A LA CAJA DESTINO */
    if (exists (select moca_id from movimiento_caja where moca_tiporef = 66 and moca_idref = :id and caja_id = :Dest)) then
        begin
        update movimiento_caja
            set moca_debitos = moca_debitos + :monto
            where moca_tiporef = 66 and moca_idref = :id and caja_id = :Dest;
        end
    else
        INSERT INTO MOVIMIENTO_CAJA
            (MOCA_ID, CAJA_ID, MOCA_TIPOREF, MOCA_PREFREF, MOCA_NUMREF, MOCA_FECHA, MOCA_CONC, MOCA_DEBITOS, MOCA_CREDITOS, MOCA_DB, MOCA_IDREF)
            VALUES(GEN_ID(ID_MOVCAJA,1), :Dest, 66, :Pref, :Num, :Fec, :Conc, :monto, 0, 'S', :id);
    /* Ingrese el doc. de pago */
    if (FORMA <> 1) then
        INSERT INTO DOCUMENTOS_PAGO_CAJA (DPCA_ID, FOPA_ID, CAJA_ID, DPCA_BANCO, DPCA_CUENTA, DPCA_NUMERO, DPCA_FECHA, DPCA_MONTO, DPCA_TIPOENT, DPCA_IDENT, DPCA_TIPOSAL, DPCA_IDSAL)
            VALUES (GEN_ID(ID_DOCPAGOCAJA, 1), :FORMA, :Dest, :BANCO, :CUENTA, :NUMERO, :FECHA, :MONTO, 66, :ID, 0, 0);
    else
        EXECUTE PROCEDURE SUME_SALDO_EFECTIVO (:Dest, :Fec, :MONTO, 'N');
    END

/* TRASLADOS ENTRE CAJAS EGRESOS */
FOR SELECT T.TRCJ_ID, trcj_fecha, caja_id, trcj_destino, trcj_conc, pref_pre, trcj_numero, fopa_id, TRCD_BANCO, TRCD_CUENTA, TRCD_NUMERO, TRCD_FECHA, TRCD_MONTO, TRCD_ITEM
    FROM TRASLADOS_CAJA T, TRASLADOS_CAJA_DET D where T.TRCJ_ID = D.TRCJ_ID AND trcj_anulado = 'N' AND CAJA_ID >= :cajaini AND CAJA_ID <= :cajafin
    ORDER BY CAJA_ID, TRCJ_FECHA, T.TRCJ_ID, TRCD_ITEM
    INTO :ID, :Fec, :Caja, :Dest, :Conc, :Pref, :Num, :forma,  :banco, :cuenta, :numero, :fecha, :monto, :item
    DO
    BEGIN
    if (exists (select moca_id from movimiento_caja where moca_tiporef = 66 and moca_idref = :id and caja_id = :caja)) then
        begin
        update movimiento_caja
            set moca_creditos = moca_creditos + :monto
            where moca_tiporef = 66 and moca_idref = :id and caja_id = :caja;
        end
    else
        INSERT INTO MOVIMIENTO_CAJA
            (MOCA_ID, CAJA_ID, MOCA_TIPOREF, MOCA_PREFREF, MOCA_NUMREF, MOCA_FECHA, MOCA_CONC, MOCA_DEBITOS, MOCA_CREDITOS, MOCA_DB, MOCA_IDREF)
            VALUES(GEN_ID(ID_MOVCAJA,1), :CAJA, 66, :Pref, :Num, :Fec, :Conc, 0, :monto, 'N', :id);
    /* Actualice la salida del documento en la caja origen */
    if (FORMA <> 1) then
        BEGIN
        IDD = 0;
        SELECT FIRST 1 DPCA_ID FROM DOCUMENTOS_PAGO_CAJA WHERE FOPA_ID = :FORMA AND DPCA_BANCO = :BANCO AND DPCA_CUENTA = :CUENTA AND
            DPCA_NUMERO = :NUMERO AND CAJA_ID = :CAJA AND DPCA_TIPOSAL = 0 AND DPCA_IDSAL = 0 AND DPCA_MONTO = :MONTO
            ORDER BY DPCA_TIPOENT, DPCA_IDENT INTO :IDD;
        if (IDD <> 0) then
            UPDATE DOCUMENTOS_PAGO_CAJA
                SET DPCA_TIPOSAL = 66, DPCA_IDSAL = :ID
                WHERE DPCA_ID = :IDD;
        else
            BEGIN
/*            update traslados_caja_det set fopa_id = 1 where TRCJ_ID = :id and TRCD_ITEM = :item;*/
            EXECUTE PROCEDURE RESTE_SALDO_EFECTIVO(:CAJA, :FEC, :MONTO, 'N');
            END
        END
    else
        EXECUTE PROCEDURE RESTE_SALDO_EFECTIVO (:CAJA, :Fec, :MONTO, 'N');
    END

/* las planillas de pasajeros   */
FOR SELECT PLPA_ID, PLPA_fecha, PLPA_pref, PLPA_numero, PLPA_caja, PLPA_NETO
    from planilla_pasajeros where plpa_anulado = 'N' and plpa_neto > 0
    order by PLPA_FECHA, PLPA_ID
    INTO :ID, :Fec, :Pref, :Num, :Caja, :monto
    DO
    BEGIN
    CONC = 'PLANILLA DE PASAJEROS No. ' || :pref || :num;
    INSERT INTO MOVIMIENTO_CAJA
        (MOCA_ID, CAJA_ID, MOCA_TIPOREF, MOCA_PREFREF, MOCA_NUMREF, MOCA_FECHA, MOCA_CONC, MOCA_DEBITOS, MOCA_CREDITOS, MOCA_DB, MOCA_IDREF)
        VALUES(GEN_ID(ID_MOVCAJA,1), :caja, 88, :pref, :numero, :fec, :Conc, 0, :monto, 'N', :id);
    EXECUTE PROCEDURE RESTE_SALDO_EFECTIVO(:caja, :fec, :monto, 'N');
    END

/* INCORPORE LOS EGRESOS DE CAJA */
FOR SELECT E.EGRE_ID, egre_fecha, egre_conc, pref_pre, egre_numero, C.caja_id, FOPA_ID, EGCA_BANCO, EGCA_CUENTA, EGCA_NUMERO, EGCA_FECHA, EGCA_MONTO, EGCA_ITEM
    FROM EGRESOS E, EGRESOS_CAJA C where E.egre_id = C.egre_id and egre_anulado = 'N' AND C.CAJA_ID >= :cajaini AND C.CAJA_ID <= :cajafin
    ORDER BY CAJA_ID, E.EGRE_FECHA, E.EGRE_ID, EGCA_ITEM
    INTO :ID, :Fec, :Conc, :Pref, :Num, :Caja, :forma, :banco, :cuenta, :numero, :fecha, :monto, :item
    DO
    BEGIN
    if (exists (select moca_id from movimiento_caja where moca_tiporef = 62 and moca_idref = :id and caja_id = :caja)) then
        update movimiento_caja
        set moca_creditos = moca_creditos + :monto
        where moca_tiporef = 62 and moca_idref = :id and caja_id = :caja;
    else
        INSERT INTO MOVIMIENTO_CAJA
            (MOCA_ID, CAJA_ID, MOCA_TIPOREF, MOCA_PREFREF, MOCA_NUMREF, MOCA_FECHA, MOCA_CONC, MOCA_DEBITOS, MOCA_CREDITOS, MOCA_DB, MOCA_IDREF)
            VALUES(GEN_ID(ID_MOVCAJA,1), :caja, 62, :Pref, :Num, :Fec, :Conc, 0, :monto, 'N', :id);
    /* ACTUALICE LA SALIDA DEL DOCUMENTO */
    if (FORMA <> 1) then
        begin
        IDD = 0;
        SELECT FIRST 1 DPCA_ID FROM DOCUMENTOS_PAGO_CAJA WHERE FOPA_ID = :FORMA AND DPCA_BANCO = :BANCO AND DPCA_CUENTA = :CUENTA AND
            DPCA_NUMERO = :NUMERO AND CAJA_ID = :CAJA AND DPCA_TIPOSAL = 0 AND DPCA_IDSAL = 0 AND DPCA_MONTO = :MONTO
            ORDER BY DPCA_TIPOENT, DPCA_IDENT INTO :IDD;
        if (IDD <> 0) then
            UPDATE DOCUMENTOS_PAGO_CAJA
                SET DPCA_TIPOSAL = 62, DPCA_IDSAL = :ID
                WHERE DPCA_ID = :IDD;
        else
            begin
/*            update egresos_caja set fopa_id = 1 where egre_id = :id and EGCA_ITEM = :item;*/
            EXECUTE PROCEDURE RESTE_SALDO_EFECTIVO(:CAJA, :FEC, :MONTO, 'N');
            end
        end
    ELSE
        EXECUTE PROCEDURE RESTE_SALDO_EFECTIVO(:CAJA, :FEC, :MONTO, 'N');
    END

/* INCORPORE LAS CONSIGNACIONES */
FOR SELECT C.CONS_ID, cons_fecha, cons_concepto, prba_pref, cons_numero, caja_id, FOPA_ID, CODE_BANCO, CODE_CUENTA, CODE_NUMERO, CODE_FECHA, CODE_MONTO, CODE_ITEM2
    FROM CONSIGNA C, CONSIGNA_DETALLE D where C.CONS_ID = D.CONS_ID and cons_anulado = 'N' AND CAJA_ID >= :cajaini AND CAJA_ID <= :cajafin
    ORDER BY CAJA_ID, C.CONS_FECHA, C.CONS_ID, CODE_ITEM2
    INTO :ID, :Fec, :Conc, :Pref, :Num, :Caja, :forma, :banco, :cuenta, :numero, :fecha, :monto, :item
    DO
    BEGIN
    if (exists (select moca_id from movimiento_caja where moca_tiporef = 71 and moca_idref = :id and caja_id = :caja)) then
        update movimiento_caja
            set moca_creditos = moca_creditos + :monto
            where moca_tiporef = 71 and moca_idref = :id and caja_id = :caja;
    else
        INSERT INTO MOVIMIENTO_CAJA
            (MOCA_ID, CAJA_ID, MOCA_TIPOREF, MOCA_PREFREF, MOCA_NUMREF, MOCA_FECHA, MOCA_CONC, MOCA_DEBITOS, MOCA_CREDITOS, MOCA_DB, MOCA_IDREF)
            VALUES(GEN_ID(ID_MOVCAJA,1), :CAJA, 71, :Pref, :Num, :Fec, :Conc, 0, :monto, 'N', :id);
    /* ACTUALICE LA SALIDA DEL DOCUMENTO DE PAGO */
    if (FORMA <> 1) then
        BEGIN
        IDD = 0;
        SELECT FIRST 1 DPCA_ID FROM DOCUMENTOS_PAGO_CAJA WHERE FOPA_ID = :FORMA AND DPCA_BANCO = :BANCO AND DPCA_CUENTA = :CUENTA AND
            DPCA_NUMERO = :NUMERO AND CAJA_ID = :CAJA AND DPCA_TIPOSAL = 0 AND DPCA_IDSAL = 0 AND DPCA_MONTO = :MONTO
            ORDER BY DPCA_TIPOENT, DPCA_IDENT INTO :IDD;
        if (IDD <> 0) then
            UPDATE DOCUMENTOS_PAGO_CAJA
                SET DPCA_TIPOSAL = 71, DPCA_IDSAL = :id
                WHERE DPCA_ID = :IDD;
        ELSE
            BEGIN
/*            update consigna_detalle set fopa_id = 1 where CONS_ID = :id and CODE_ITEM2 = :item;*/
            EXECUTE PROCEDURE RESTE_SALDO_EFECTIVO(:CAJA, :FEC, :MONTO, 'N');
            END
        END
    ELSE
        EXECUTE PROCEDURE RESTE_SALDO_EFECTIVO(:CAJA, :FEC, :MONTO, 'N');
    END

/* CONSIGNACIONES DE TARJETAS */
FOR SELECT C.COTJ_ID, cotj_fecha, cotj_concepto, pref_pre, cotj_numero, caja_id, FOPA_ID, TARJ_COD, CTJD_NROTJ, CTJD_COMPROB, COTJ_FECHA, CTJD_BASE
    FROM CONSIGNA_TARJETAS C, CONSIGNA_TARJETAS_DET D where C.cotj_id = D.cotj_id and cotj_anulado = 'N' AND CAJA_ID >= :cajaini AND CAJA_ID <= :cajafin
    ORDER BY CAJA_ID, C.COTJ_FECHA, C.cotj_id, CTJD_ITEM
    INTO :ID, :Fec, :Conc, :Pref, :Num, :Caja, :forma, :banco, :cuenta, :numero, :fecha, :monto
    DO
    BEGIN
    if (exists (select moca_id from movimiento_caja where moca_tiporef = 64 and moca_idref = :id)) then
        update movimiento_caja
            set moca_creditos = moca_creditos + :monto
            where moca_tiporef = 64 and moca_idref = :id;
    else
        INSERT INTO MOVIMIENTO_CAJA
            (MOCA_ID, CAJA_ID, MOCA_TIPOREF, MOCA_PREFREF, MOCA_NUMREF, MOCA_FECHA, MOCA_CONC, MOCA_DEBITOS, MOCA_CREDITOS, MOCA_DB, MOCA_IDREF)
            VALUES(GEN_ID(ID_MOVCAJA,1), :Caja, 64, :Pref, :Num, :Fec, :Conc, 0, :monto, 'N', :id);

  /* ACTUALICE LA SALIDA DEL DOCUMENTO DE PAGO */
  IDD = 0;
  SELECT FIRST 1 DPCA_ID FROM DOCUMENTOS_PAGO_CAJA WHERE FOPA_ID = :FORMA AND DPCA_BANCO = :BANCO AND DPCA_CUENTA = :CUENTA AND
    DPCA_NUMERO = :NUMERO AND CAJA_ID = :CAJA AND DPCA_TIPOSAL = 0 AND DPCA_IDSAL = 0 AND DPCA_MONTO = :MONTO
    ORDER BY DPCA_TIPOENT, DPCA_IDENT INTO :IDD;
  if (IDD <> 0) then
      UPDATE DOCUMENTOS_PAGO_CAJA
        SET DPCA_TIPOSAL = 64, DPCA_IDSAL = :id
        WHERE DPCA_ID = :IDD;
  ELSE
    begin
    EXECUTE PROCEDURE RESTE_SALDO_EFECTIVO(:CAJA, :FEC, :MONTO, 'N');
    end
  end

/* INCORPORE LOS CAMBIOS DE DOCUMENTOS */
FOR SELECT C.CADO_ID, cado_fecha, cado_conc, pref_pre, cado_numero, caja_id, FOPA_ID, CDEN_BANCO, CDEN_CUENTA, CDEN_NUMERO, CDEN_FECHA, CDEN_MONTO, CDEN_ITEM
    FROM CAMBIO_DOCUMENTOS C, CAMBIODOC_ENTRADAS D where C.CADO_ID = D.CADO_ID and cado_anulado = 'N' AND CAJA_ID >= :cajaini AND CAJA_ID <= :cajafin
    ORDER BY CAJA_ID, C.CADO_FECHA, C.CADO_ID, CDEN_ITEM
    INTO :ID, :Fec, :Conc, :Pref, :Num, :Caja, :forma, :banco, :cuenta, :numero, :fecha, :monto, :item
    DO
    BEGIN
    if (exists (select moca_id from movimiento_caja where moca_tiporef = 63 and moca_idref = :id and caja_id = :CAJA)) then
        begin
        update movimiento_caja
            set moca_creditos = moca_creditos + :monto
            where moca_tiporef = 63 and moca_idref = :id and caja_id = :CAJA;
        end
    else
        INSERT INTO MOVIMIENTO_CAJA
            (MOCA_ID, CAJA_ID, MOCA_TIPOREF, MOCA_PREFREF, MOCA_NUMREF, MOCA_FECHA, MOCA_CONC, MOCA_DEBITOS, MOCA_CREDITOS, MOCA_DB, MOCA_IDREF)
            VALUES(GEN_ID(ID_MOVCAJA,1), :CAJA, 63, :Pref, :Num, :Fec, :Conc, 0, :monto, 'N', :id);
        
    /* ACTUALICE LA SALIDA DEL DOCUMENTO */
    if (FORMA <> 1) then
        BEGIN
        IDD = 0;
        SELECT FIRST 1 DPCA_ID FROM DOCUMENTOS_PAGO_CAJA WHERE FOPA_ID = :FORMA AND DPCA_BANCO = :BANCO AND DPCA_CUENTA = :CUENTA AND
            DPCA_NUMERO = :NUMERO AND CAJA_ID = :CAJA AND DPCA_TIPOSAL = 0 AND DPCA_IDSAL = 0 AND DPCA_MONTO = :MONTO
            ORDER BY DPCA_TIPOENT, DPCA_IDENT INTO :IDD;
        if (IDD <> 0) then
            UPDATE DOCUMENTOS_PAGO_CAJA
                SET DPCA_TIPOSAL = 63, DPCA_IDSAL = :id
                WHERE DPCA_ID = :IDD;
        ELSE
            BEGIN
/*            update cambiodoc_entradas set fopa_id = 1 where CADO_ID = :id and CDEN_ITEM = :item;*/
            EXECUTE PROCEDURE RESTE_SALDO_EFECTIVO(:CAJA, :FEC, :MONTO, 'N');
            END
        END
    ELSE
        EXECUTE PROCEDURE RESTE_SALDO_EFECTIVO(:CAJA, :FEC, :MONTO, 'N');
    END
end^

SET TERM ; ^

update REVISION SET REVI_FECHA = '2013/11/15';
COMMIT WORK;

/* 20131122 */
/* RECIBA DESCRIPCION DESDE EL SITIO WEB */
ALTER TABLE COTIZACION_WEB_DETALLE
ADD COWD_DESC T_CONCEPTO;

SET TERM ^ ;

CREATE OR ALTER TRIGGER COTIZACION_WEB_DETALLE_BI FOR COTIZACION_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 NIT VARCHAR(20);
declare variable PREF VARCHAR(4);
declare variable IVAINC CHAR(1);
declare variable ICOINC char(2);
BEGIN
execute procedure lee_configuracion('FACTURACION', 'ARTICULOS', 'IMPOCONSUMO INCLUIDO EN EL PRECIO BASE DE VENTA ANTES DE IVA') returning_values (:ICOINC);
/* LOS IMPUESTOS DEPENDEN DEL ENCABEZADO */
SELECT COWE_PREF, TERC_NIT FROM cotizacion_web P WHERE COWE_ID = NEW.cowe_id INTO :PREF, :NIT;
if (NEW.LIPR_COD IS NULL) then
    SELECT LIPR_COD FROM CLIENTES WHERE TERC_NIT = :NIT INTO NEW.LIPR_COD;

if (new.cowd_item is null) then
    begin
    select max(cowd_item) from cotizacion_web_detalle where cowe_id = new.cowe_id into :itemax;
    if (itemax is null) then
        new.cowd_item = 1;
    else
        new.cowd_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.cowd_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.cowd_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.cowd_codbar;
        ELSE
            if (new.cowd_unidad is null) then
                NEW.cowd_unidad = :UNIDAD;
        end
    else
        if (new.cowd_unidad is null) then
            NEW.cowd_unidad = :UNIDAD;
    end
if (new.cowd_desc is null) then
    SELECT ARTI_DES from ARTICULO WHERE ARTI_COD = new.arti_cod INTO new.cowd_desc;

EXECUTE PROCEDURE factor_unidad_cant(NEW.arti_cod, NEW.cowd_unidad) returning_values(NEW.cowd_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.cowd_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.cowd_dtop = DTOG + DTOL;
        END
    END
ELSE
    BEGIN
    if (NEW.cowd_dtop IS NULL) then
        NEW.cowd_dtop = 0;
    END

new.cowd_dtom = new.cowd_prunit * new.cowd_dtop / 100;

if (new.cowd_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.cowd_consumo;
    if ((new.cowd_consumo is null) or (new.cowd_consumo <> 0)) then
        select ARTI_CONSUMO from ARTICULO where ARTI_COD = new.ARTI_COD into new.cowd_consumo;
    if (new.cowd_consumo is null) then
        new.cowd_consumo = 0;
    new.cowd_consumo = new.cowd_consumo * new.cowd_cant * new.cowd_factor;
    end

/* CALCULE EL IVA, CONSUMO Y TOTAL */
SELECT PREF_IVAINC FROM PREFIJOS WHERE TIDO_COD = 35 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.cowd_ivap = :ivap;
if ((new.cowd_ivamonto is null) or (NEW.cowd_ivamonto = 0)) then
    begin
    if (IVAINC = 'N') then
        begin
        if (ICOINC = 'SI') then
            new.cowd_ivamonto = ((new.cowd_cant * (new.cowd_prunit - new.cowd_dtom) - new.cowd_consumo) / 100) * :IVAP;
        else
            new.cowd_ivamonto = ((new.cowd_cant * (new.cowd_prunit - new.cowd_dtom)) / 100) * :IVAP;
        end
    else
        new.cowd_ivamonto = ((new.cowd_cant * (new.cowd_prunit - new.cowd_dtom) - new.cowd_consumo) / (100 + :IVAP)) * :IVAP;
    end
if (ICOINC = 'SI') then
    new.cowd_total = (new.cowd_cant * (new.cowd_prunit - new.cowd_dtom));
else
    new.cowd_total = (new.cowd_cant * (new.cowd_prunit - new.cowd_dtom) + new.cowd_consumo);
if (IVAINC = 'N') then
    new.cowd_total = new.cowd_total + new.cowd_ivamonto;
end^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER procedure GRABE_COTIZA_WEB (
    ID integer)
returns (
    IDCOT integer)
AS
declare variable PREF VARCHAR(4);
declare variable IVAINC CHAR(1);
declare variable NIT VARCHAR(20);
declare variable NOMCLI VARCHAR(60);
declare variable VEN INTEGER;
declare variable PUNTO INTEGER;
begin
IDCOT = gen_id(id_cotizaci, 1);
SELECT COWE_PREF, TERC_NIT, VEND_COD FROM COTIZACION_WEB WHERE COWE_ID = :ID INTO :PREF, :NIT, :VEN;
SELECT PREF_IVAINC FROM PREFIJOS WHERE TIDO_COD = 35 AND PREF_PRE = :PREF INTO :IVAINC;
SELECT TERC_NOM FROM TERCEROS WHERE TERC_NIT = :NIT INTO :NOMCLI;
SELECT PTVT_ID FROM VENDEDORES WHERE VEND_cOD = :VEN INTO :PUNTO;
/* EL ENCABEZADO */
INSERT INTO COTIZACIONES (COTI_ID, TERC_NIT, VEND_COD, TIDO_COD, PREF_PRE, COTI_NUMERO, COTI_FECHA, COTI_VALIDEZ,
    COTI_OBS, COTI_IMPTOS, COTI_NOMTERC, COTI_DTOPORC, COTI_DTOMONTO, COTI_ADICIONAL, COTI_IVAMONTO,
    COTI_EXTRA, COTI_TOTAL, COTI_ANULADO, COTI_TRANSMIT, PTVT_ID, COTI_NROCOPIA, COTI_USUARIO,
    COTI_SUCURSAL, NUMOK, COTI_FACTOR, COTI_TRM)
    SELECT :IDCOT, TERC_NIT, VEND_COD, 35, COWE_PREF, '000001', COWE_FECHA, COWE_DIAS,
    COWE_OBS, :IVAINC, :NOMCLI, COWE_DTOPORC, COWE_DTOMONTO, COWE_ADICIONAL, COWE_IVAMONTO,
    COWE_EXTRA, COWE_TOTAL, 'N', 'N', :PUNTO, 0, user, COWE_SUCURSAL, 'N', 1, 1
    FROM COTIZACION_WEB WHERE COWE_ID = :ID;
/* LOS ITEMS */
INSERT INTO COTIZACIONES_DETALLE (COTI_ID, CTDE_ITEM, ARTI_COD, CTDE_CANT, CTDE_UNIDAD, CTDE_DTOPORC, CTDE_DTOMONTO,
    CTDE_IVAPORC, CTDE_IVAMONTO, CTDE_CONSUMO, CTDE_FACTOR, CTDE_DESC, CTDE_OBS, CTDE_CODBAR, CTDE_TOTAL,
    CTDE_ANULADO, CTDE_TRANSMIT, LIPR_COD, CTDE_REFERENCIA, CTDE_PRUNIT, CTDE_REMISIONADO)
    SELECT :IDCOT, COWD_ITEM, ARTI_COD, COWD_CANT, COWD_UNIDAD, COWD_DTOP, COWD_DTOM,
    COWD_IVAP, COWD_IVAMONTO, COWD_CONSUMO, COWD_FACTOR, COWD_DESC, NULL, COWD_CODBAR, COWD_TOTAL,
    'N', 'N', LIPR_COD, COWD_REFERENCIA, COWD_PRUNIT, 0
    FROM COTIZACION_WEB_DETALLE WHERE COWE_ID = :ID;

suspend;
end^

SET TERM ; ^

/* 20131127B */
/* ORDEN DEL CLIENTE EN COTIZACION */
ALTER TABLE COTIZACIONES
ADD COTI_ORDENC VARCHAR(20);

SET TERM ^ ;

CREATE OR ALTER PROCEDURE GRABE_COTIZA_WEB(
    ID INTEGER)
RETURNS (
    IDCOT INTEGER)
AS
declare variable PREF VARCHAR(4);
declare variable IVAINC CHAR(1);
declare variable NIT VARCHAR(20);
declare variable NOMCLI VARCHAR(60);
declare variable VEN INTEGER;
declare variable PUNTO INTEGER;
declare variable USR VARCHAR(10);
declare variable NUM VARCHAR(10);
begin
IDCOT = gen_id(id_cotizaci, 1);
SELECT COWE_PREF, TERC_NIT, VEND_COD, COWE_ID FROM COTIZACION_WEB WHERE COWE_ID = :ID INTO :PREF, :NIT, :VEN, :NUM;
SELECT PREF_IVAINC FROM PREFIJOS WHERE TIDO_COD = 35 AND PREF_PRE = :PREF INTO :IVAINC;
SELECT TERC_NOM FROM TERCEROS WHERE TERC_NIT = :NIT INTO :NOMCLI;
SELECT PTVT_ID FROM VENDEDORES WHERE VEND_cOD = :VEN INTO :PUNTO;
/* EL ENCABEZADO */
INSERT INTO COTIZACIONES (COTI_ID, TERC_NIT, VEND_COD, TIDO_COD, PREF_PRE, COTI_NUMERO, COTI_FECHA, COTI_VALIDEZ,
    COTI_OBS, COTI_IMPTOS, COTI_NOMTERC, COTI_DTOPORC, COTI_DTOMONTO, COTI_ADICIONAL, COTI_IVAMONTO,
    COTI_EXTRA, COTI_TOTAL, COTI_ANULADO, COTI_TRANSMIT, PTVT_ID, COTI_NROCOPIA, COTI_USUARIO,
    COTI_SUCURSAL, NUMOK, COTI_FACTOR, COTI_TRM, COTI_ORDENC)
    SELECT :IDCOT, TERC_NIT, VEND_COD, 35, 'PL', COWE_ID, COWE_FECHA, 30,
    COWE_OBS, :IVAINC, :NOMCLI, COWE_DTOPORC, COWE_DTOMONTO, COWE_ADICIONAL, COWE_IVAMONTO,
    COWE_EXTRA, COWE_TOTAL, 'N', 'N', 1, 0, user, COWE_SUCURSAL, 'N', 1, 1, COWE_NUMPED
    FROM COTIZACION_WEB WHERE COWE_ID = :ID;
/* LOS ITEMS */
INSERT INTO COTIZACIONES_DETALLE (COTI_ID, CTDE_ITEM, ARTI_COD, CTDE_CANT, CTDE_UNIDAD, CTDE_DTOPORC, CTDE_DTOMONTO,
    CTDE_IVAPORC, CTDE_IVAMONTO, CTDE_CONSUMO, CTDE_FACTOR, CTDE_DESC, CTDE_OBS, CTDE_CODBAR, CTDE_TOTAL,
    CTDE_ANULADO, CTDE_TRANSMIT, LIPR_COD, CTDE_REFERENCIA, CTDE_PRUNIT, CTDE_REMISIONADO)
    SELECT :IDCOT, COWD_ITEM, ARTI_COD, COWD_CANT, COWD_UNIDAD, COWD_DTOP, COWD_DTOM,
    COWD_IVAP, COWD_IVAMONTO, COWD_CONSUMO, COWD_FACTOR, COWD_DESC, NULL, COWD_CODBAR, COWD_TOTAL,
    'N', 'N', LIPR_COD, COWD_REFERENCIA, COWD_PRUNIT, 0
    FROM COTIZACION_WEB_DETALLE WHERE COWE_ID = :ID;
if (VEN IS NOT NULL) then
    BEGIN
    SELECT USER_COD FROM USUARIO WHERE VEND_COD = :VEN INTO :USR;
    if ((USR <> '') AND (USR IS NOT NULL)) then
        BEGIN
        INSERT INTO MENSAJERIA(MENS_ID, MENS_AUTOR, MENS_MENSAJE,
            MENS_FECHA, MENS_HORA, MENS_NIVEL, MENS_DESTINO, MENS_LEIDO)
            VALUES (gen_id(id_mensaje, 1), USER, 'NUEVA COTIZACION CLIENTE ' || :nomcli || ' No.' || :NUM,
            CAST('NOW' AS DATE), CAST('NOW' AS TIME), 1, :USR, 'N');
        END
    END
suspend;
end
^

SET TERM ; ^

/* 20131130 */
/* NOMBRE DE LA BODEGA EN EXISTENCIAS */
SET TERM ^ ;

CREATE OR ALTER procedure EXISTENCIAS_COMPRAS (
    ARTICULO varchar(15),
    FECHA date,
    UNIDAD varchar(8))
returns (
    BODEGA varchar(2),
    EXISTENCIA numeric(18,2),
    RESERVADO numeric(18,2),
    DISPONIBLE numeric(18,2),
    ORDENADO numeric(18,2),
    PROMEDIO numeric(18,2),
    VENTAMES numeric(18,2),
    VENTAANO numeric(18,2),
    FECHACMP date,
    CANTCMP numeric(18,2),
    DIAS integer,
    SUGERIDO numeric(18,2),
    STAND varchar(20),
    NOMBOD VARCHAR(30))
AS
declare variable factor numeric(15,4);
declare variable ordenc numeric(18,4);
declare variable pedido numeric(18,4);
declare variable item integer;
declare variable id integer;
declare variable und varchar(8);
declare variable cant numeric(18,4);
declare variable factor2 numeric(18,4);
declare variable fecini date;
declare variable fechaaux varchar(10);
declare variable agencia integer;
declare variable devmes numeric(18,2);
declare variable mfac integer;
declare variable mdev integer;
declare variable ivaf numeric(18,2);
declare variable ivad numeric(18,2);
declare variable dia_art varchar(2) character set none;
declare variable diasc varchar(255);
declare variable pedauto char(2);
declare variable salidas numeric(18,4);
declare variable fecrem date;
declare variable cantrem numeric(18,4);
declare variable DIASANO INTEGER;
declare variable BODINA CHAR(2);
begin
execute procedure lee_configuracion ('INVENTARIO', 'EXISTENCIAS', 'PROMEDIAR LAS SALIDAS DEL INVENTARIO CON EL NUMERO DE DIAS ASIGNADO A CADA ARTICULO') returning_values (:DIA_ART);
execute procedure lee_configuracion ('INVENTARIO', 'EXISTENCIAS', 'NUMERO DE DIAS PARA PROMEDIO DE SALIDAS POR ARTICULO') returning_values (DIASC);
execute procedure LEE_CONFIGURACION('FACTURACION', 'FACTURAS', 'GENERAR PEDIDO AUTOMATICAMENTE CON LA FACTURA') returning_values (pedauto);
EXECUTE PROCEDURE lee_configuracion ('INVENTARIO', 'EXISTENCIAS', 'MOSTRAR BODEGAS INACTIVAS EN CONSULTA DE EXISTENCIAS') returning_values (:BODINA);

for select bode_cod, SUCU_ID, BODE_NOM from bodega where ((bode_activa = 'S') or (:BODINA = 'SI')) order by bode_cod
    into :bodega, :agencia, :nombod
    do
    begin
    execute procedure saldo_inventario (:articulo, :bodega, :fecha) returning_values (:Existencia);
    execute procedure FACTOR_UNIDAD_CANT(:ARTICULO, :UNIDAD) returning_values (:FACTOR);
    if (FACTOR <> 0) then
        EXISTENCIA = EXISTENCIA / FACTOR;
    else
        EXISTENCIA = 0;
    STAND = '';
    select STAND_COD from STANDS where ARTI_COD = :ARTICULO and STAND_BODEGA = :BODEGA into :stand;
    execute procedure salidas_ano_anterior (:ARTICULO, :FECHA, :BODEGA) returning_values (:ventaano);
    execute procedure promedio_salidas_articulo (:ARTICULO, :FECHA, :BODEGA) returning_values (:PROMEDIO, :SALIDAS);
    if (DIA_ART = 'NO') then
        begin
        DIAS = cast(DIASC as integer);
        end
    else
        select ARTI_DIAS from ARTICULO where ARTI_COD = :ARTICULO into :DIAS;
    if (DIAS is null) then
        DIAS = 0;
    PROMEDIO = DIAS * PROMEDIO;
    if (FACTOR <> 0) then
        PROMEDIO = PROMEDIO / FACTOR;
    SUGERIDO = PROMEDIO - EXISTENCIA;
    select sum(ORID_ENTREGAR)
      from ORDENINVENTARIO_DETALLE OD, ordenes_inventario O
      where O.ORIN_ID = OD.ORIN_ID and ARTI_COD = :ARTICULO and ORIN_FECHA <= :FECHA and ORIN_FECLLEGA >= :FECHA and ORID_ANULADO = 'N' and OD.BODE_COD = :BODEGA
      into :ORDENADO;
    if (ORDENADO is null) then
        ORDENADO = 0;
    ORDENC = 0;
    for select O.ORDC_ID, OCDE_ITEM, OCDE_CANT * OCDE_FACTOR
        from ORDENES_COMPRA O, ORDENES_COMPRA_DETALLE OD
        where O.ORDC_ID = OD.ORDC_ID and OD.ARTI_COD = :ARTICULO and (ORDC_FECHA+ORDC_VALIDEZ) >= :FECHA and ORDC_FECHA <= :FECHA and OCDE_ANULADO = 'N' and OD.BODE_COD = :BODEGA
        into :ID, :ITEM, :CANT
        do
        begin
        execute procedure FALTANTE(23, 21, ID, ITEM) returning_values (PEDIDO, UND, FACTOR2);
        if (PEDIDO * FACTOR2 = CANT) then /* SI NO SE HA FACTURADO MIRE A VER SI SE REMISIONO */
            execute procedure FALTANTE(23, 22, ID, ITEM) returning_values (PEDIDO, UND, FACTOR2);
        if (PEDIDO is null) then
            PEDIDO = 0;
        ORDENC = ORDENC + PEDIDO * FACTOR2;
        end
    ORDENADO = ORDENADO + ORDENC;
    if (FACTOR <> 0) then
        ORDENADO = ORDENADO / FACTOR;
    select sum(RSDE_LIBERAR)
      from RESERVAS_DETALLE RD, RESERVAS R
      where R.RESE_ID = RD.RESE_ID and ARTI_COD = :ARTICULO and RESE_FECHA <= :FECHA and RESE_VENCE >= :FECHA and RD.BODE_COD = :BODEGA and RSDE_ANULADO = 'N'
      into :RESERVADO;
    if (RESERVADO is null) then
        RESERVADO = 0;
    PEDIDO = 0;
    for select P.PEDI_ID, PEDE_ITEM, PEDE_CANT * PEDE_FACTOR
        from PEDIDOS P, PEDIDOS_DETALLE PD
        where P.PEDI_ID = PD.PEDI_ID and PD.ARTI_COD = :ARTICULO and (PEDI_FECHA+PEDI_VALIDEZ) >= :FECHA and PEDI_FECHA <= :FECHA and PEDE_ANULADO = 'N' and BODE_COD = :BODEGA
        into :ID, :ITEM, :CANT
        do
        begin
        execute procedure FALTANTE(34, 31, ID, ITEM) returning_values (ORDENC, UND, FACTOR2);
        if ((ORDENC * FACTOR2 = CANT) or (PEDAUTO = 'SI')) then /* SI NO SE HA FACTURADO MIRE A VER SI SE REMISIONO */
            execute procedure FALTANTE(34, 32, ID, ITEM) returning_values (ORDENC, UND, FACTOR2);
        if (ORDENC is null) then
            ORDENC = 0;
        PEDIDO = PEDIDO + ORDENC * FACTOR2;
        end
    RESERVADO = RESERVADO + PEDIDO;
    if (FACTOR <> 0) then
        RESERVADO = RESERVADO / FACTOR;
    DISPONIBLE = EXISTENCIA - RESERVADO;
    /* VENTAS MES */
    FECHAAUX = cast (FECHA as varchar(10));
    FECHAAUX = SUBSTR(FECHAAUX, 1, 7) || '/01';
    FECINI = cast (FECHAAUX as date);
    execute procedure ventas_articulo (:ARTICULO, :FECINI, :FECHA, :agencia, :bodega ) returning_values (:ventames, :mfac, :devmes, :mdev, :ivaf, :ivad);
    ventames = ventames - devmes;
    if (FACTOR <> 0) then
        ventames = ventames / FACTOR;
    /* FECHA COMPRA */
    fechacmp = null;
    cantcmp = 0;
    select first 1 FACO_FECHA, FCDE_CANT * FCDE_FACTOR from FACTURAS_COMPRA F, FACTURAS_COMPRAS_DETALLE D
        where F.FACO_ID = D.faco_id and D.ARTI_COD = :articulo and FACO_FECHA <= :FECHA and D.bode_cod = :BODEGA
        order by FACO_FECHA desc, F.FACO_ID desc
        into :fechacmp, :cantcmp;
    select first 1 REPR_FECHA, RPVD_CANT * RPVD_FACTOR from remision_proveedor F, remision_proveedor_det D
        where F.repr_id = D.repr_id and D.ARTI_COD = :articulo and REPR_FECHA <= :FECHA and D.bode_cod = :BODEGA
        order by REPR_FECHA desc, F.repr_id desc
        into :fecrem, :cantrem;
    if ((FECREM is not null) and (FECREM > fechacmp)) then
        begin
        fechacmp = FECREM;
        cantcmp = cantrem;
        end
    suspend;
    end
end^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER procedure EXISTENCIAS_UNIDAD (
    ARTICULO varchar(15),
    FECHA date,
    UNIDAD varchar(8))
returns (
    BODEGA varchar(2),
    EXISTENCIA numeric(18,2),
    RESERVADO numeric(18,2),
    DISPONIBLE numeric(18,2),
    ORDENADO numeric(18,2),
    STAND varchar(20),
    NOMBOD VARCHAR(30))
AS
declare variable FACTOR NUMERIC(15,4);
declare variable ORDENC NUMERIC(18,4);
declare variable PEDIDO NUMERIC(18,4);
declare variable ITEM INTEGER;
declare variable ID INTEGER;
declare variable UND VARCHAR(8);
declare variable CANT NUMERIC(18,4);
declare variable factor2 NUMERIC(18,4);
declare variable PEDAUTO CHAR(2);
declare variable BODINA CHAR(2);
BEGIN
EXECUTE PROCEDURE FACTOR_UNIDAD_CANT(:ARTICULO, :UNIDAD) returning_values (:FACTOR);
EXECUTE PROCEDURE lee_configuracion ('INVENTARIO', 'EXISTENCIAS', 'MOSTRAR BODEGAS INACTIVAS EN CONSULTA DE EXISTENCIAS') returning_values (:BODINA);
for select bode_cod, BODE_NOM from bodega where ((bode_activa = 'S') or (:BODINA = 'SI')) order by bode_cod into :bodega, :nombod
    do
    begin
    SELECT STAND_COD FROM STANDS WHERE ARTI_COD = :ARTICULO AND STAND_BODEGA = :BODEGA INTO :stand;
    execute procedure saldo_inventario (:articulo, :bodega, :fecha) returning_values (:Existencia);
    if (FACTOR <> 0) then
        EXISTENCIA = EXISTENCIA / FACTOR;
    else
        EXISTENCIA = 0;
    /* LO ORDENADO */
    SELECT SUM(ORID_ENTREGAR)
      FROM ORDENINVENTARIO_DETALLE OD, ordenes_inventario O
      WHERE O.ORIN_ID = OD.ORIN_ID AND ARTI_COD = :ARTICULO AND ORIN_FECHA <= :FECHA AND ORIN_FECLLEGA >= :FECHA AND ORID_ANULADO = 'N' AND OD.BODE_COD = :BODEGA
      INTO :ORDENADO;
    if (ORDENADO IS NULL) then
        ORDENADO = 0;
    ORDENC = 0;
    FOR SELECT O.ORDC_ID, OCDE_ITEM, OCDE_CANT * OCDE_FACTOR
        FROM ORDENES_COMPRA O, ORDENES_COMPRA_DETALLE OD
        WHERE O.ORDC_ID = OD.ORDC_ID AND OD.ARTI_COD = :ARTICULO AND (ORDC_FECHA+ORDC_VALIDEZ) >= :FECHA AND ORDC_FECHA <= :FECHA AND OCDE_ANULADO = 'N' AND OD.BODE_COD = :BODEGA
        INTO :ID, :ITEM, :CANT
        do
        BEGIN
        EXECUTE PROCEDURE FALTANTE(23, 21, ID, ITEM) returning_values (PEDIDO, UND, FACTOR2);
        if (PEDIDO * FACTOR2 = CANT) then /* SI NO SE HA FACTURADO MIRE A VER SI SE REMISIONO */
            EXECUTE PROCEDURE FALTANTE(23, 22, ID, ITEM) returning_values (PEDIDO, UND, FACTOR2);
        if (PEDIDO IS NULL) then
            PEDIDO = 0;
        ORDENC = ORDENC + PEDIDO * FACTOR2;
        END
    ORDENADO = ORDENADO + ORDENC;
    if (FACTOR <> 0) then
        ORDENADO = ORDENADO / FACTOR;
    /* LO RESERVADO */
    SELECT SUM(RSDE_LIBERAR)
      FROM RESERVAS_DETALLE RD, RESERVAS R
      WHERE R.RESE_ID = RD.RESE_ID AND ARTI_COD = :ARTICULO AND RESE_FECHA <= :FECHA AND RESE_VENCE >= :FECHA AND RD.BODE_COD = :BODEGA AND RSDE_ANULADO = 'N'
      INTO :RESERVADO;
    if (RESERVADO IS NULL) then
        RESERVADO = 0;
    PEDIDO = 0;
    FOR SELECT P.PEDI_ID, PEDE_ITEM, PEDE_CANT * PEDE_FACTOR
        FROM PEDIDOS P, PEDIDOS_DETALLE PD
        WHERE P.PEDI_ID = PD.PEDI_ID AND PD.ARTI_COD = :ARTICULO AND (PEDI_FECHA+PEDI_VALIDEZ) >= :FECHA AND PEDI_FECHA <= :FECHA AND PEDE_ANULADO = 'N' AND BODE_COD = :BODEGA
        INTO :ID, :ITEM, :CANT
        do
        BEGIN
        EXECUTE PROCEDURE FALTANTE(34, 31, ID, ITEM) returning_values (ORDENC, UND, FACTOR2);
        EXECUTE PROCEDURE LEE_CONFIGURACION('FACTURACION', 'FACTURAS', 'GENERAR PEDIDO AUTOMATICAMENTE CON LA FACTURA') returning_values (pedauto);
        if ((ORDENC * FACTOR2 = CANT) or (PEDAUTO = 'SI')) then /* SI NO SE HA FACTURADO MIRE A VER SI SE REMISIONO */
            EXECUTE PROCEDURE FALTANTE(34, 32, ID, ITEM) returning_values (ORDENC, UND, FACTOR2);
        if (ORDENC IS NULL) then
            ORDENC = 0;
        PEDIDO = PEDIDO + ORDENC * FACTOR2;
        END
    RESERVADO = RESERVADO + PEDIDO;
    if (FACTOR <> 0) then
        RESERVADO = RESERVADO / FACTOR;
    DISPONIBLE = EXISTENCIA - RESERVADO;
    SUSPEND;
    end
END^

SET TERM ; ^

/* 20131202 */
/* mejora velocidad al grabar documentos en caja */
CREATE INDEX DOCUMENTOS_PAGO_CAJA_IDX2
ON DOCUMENTOS_PAGO_CAJA (FOPA_ID,DPCA_BANCO,DPCA_CUENTA,DPCA_NUMERO);

SET TERM ^ ;

CREATE OR ALTER TRIGGER TRASLADOS_CAJA_DET_AI FOR TRASLADOS_CAJA_DET
ACTIVE AFTER INSERT POSITION 0
AS
declare variable Fec DATE;
declare variable Conc VARCHAR(60);
declare variable Pref varchar(4);
declare variable Num varchar(8);
declare variable Ori integer;
declare variable Des integer;
declare variable Existe char(1);
declare variable VALFP char(2);
BEGIN
EXECUTE PROCEDURE LEE_CONFIGURACION('BANCOS','CONSIGNACIONES','VALIDAR FORMAS DE PAGO EN CAJA') RETURNING_VALUES (VALFP);
if ((NEW.trcj_id <> 0) and (new.trcd_anulado = 'N')) then
  BEGIN
  select pref_pre, trcj_numero, trcj_fecha, trcj_conc, caja_id, trcj_destino
    from traslados_caja where trcj_id = new.trcj_id
    into :pref, :num, :fec, :conc, :Ori, :Des;
  /* PRIMERO LA SALIDA DEL ORIGEN */
  /* Actualice el movimiento en caja origen */
  if (exists(select moca_id from movimiento_caja where moca_tiporef = 66 and moca_idref = new.trcj_id and caja_id = :Ori)) then
    begin
    update movimiento_caja
        set moca_creditos = moca_creditos + new.trcd_monto
        where moca_tiporef = 66 and moca_idref = new.trcj_id and caja_id = :Ori;
    end
  else
    INSERT INTO MOVIMIENTO_CAJA
        (MOCA_ID, CAJA_ID, MOCA_TIPOREF, MOCA_PREFREF, MOCA_NUMREF, MOCA_FECHA, MOCA_CONC, MOCA_DEBITOS, MOCA_CREDITOS, MOCA_DB, MOCA_IDREF)
        VALUES(GEN_ID(ID_MOVCAJA,1), :Ori, 66, :Pref, :Num, :Fec, :Conc, 0, NEW.trcd_monto, 'N', new.trcj_id);
        
  /* ACTUALICE LA SALIDA DEL DOCUMENTO DEL ORIGEN */
  if (NEW.FOPA_ID <> 1) then
    BEGIN
    if (EXISTS(SELECT dpca_id FROM DOCUMENTOS_PAGO_CAJA WHERE FOPA_ID = NEW.FOPA_ID AND DPCA_BANCO = NEW.TRCD_BANCO AND DPCA_CUENTA = NEW.TRCD_CUENTA AND
        DPCA_NUMERO = NEW.TRCD_NUMERO AND DPCA_TIPOSAL = 0 AND DPCA_IDSAL = 0 AND CAJA_ID = :ori)) then
      UPDATE DOCUMENTOS_PAGO_CAJA
        SET DPCA_TIPOSAL = 66, DPCA_IDSAL = NEW.TRCJ_ID
        WHERE FOPA_ID = NEW.FOPA_ID AND DPCA_BANCO = NEW.TRCD_BANCO AND DPCA_CUENTA = NEW.TRCD_CUENTA AND
        DPCA_NUMERO = NEW.TRCD_NUMERO AND DPCA_TIPOSAL = 0 AND DPCA_IDSAL = 0 AND CAJA_ID = :ori AND DPCA_MONTO = NEW.trcd_monto;
    ELSE
        IF (VALFP = 'SI') THEN
          EXCEPTION documento_pago_salido 'La forma de pago ' || new.trcd_banco || ' ' || new.trcd_cuenta || ' ' || new.trcd_numero || ' no esta en la caja.';
    END
  ELSE
    EXECUTE PROCEDURE RESTE_SALDO_EFECTIVO (:Ori, :Fec, NEW.TRCD_MONTO, 'N');
    
  /* AHORA EL INGRESO A LA CAJA DESTINO */
  /* Actualice el movimiento en caja destino */
  if (exists(select moca_id from movimiento_caja where moca_tiporef = 66 and moca_idref = new.trcj_id and caja_id = :Des)) then
    begin
    update movimiento_caja
        set moca_debitos = moca_debitos + new.trcd_monto
        where moca_tiporef = 66 and moca_idref = new.trcj_id and caja_id = :Des;
    end
  else
    INSERT INTO MOVIMIENTO_CAJA
        (MOCA_ID, CAJA_ID, MOCA_TIPOREF, MOCA_PREFREF, MOCA_NUMREF, MOCA_FECHA, MOCA_CONC, MOCA_DEBITOS, MOCA_CREDITOS, MOCA_DB, MOCA_IDREF)
        VALUES(GEN_ID(ID_MOVCAJA,1), :Des, 66, :Pref, :Num, :Fec, :Conc, NEW.trcd_monto, 0, 'S', new.trcj_id);
        
  /* INGRESE EL DOCUMENTO DE PAGO */
  if (NEW.FOPA_ID <> 1) then
      INSERT INTO DOCUMENTOS_PAGO_CAJA (DPCA_ID, FOPA_ID, CAJA_ID, DPCA_BANCO, DPCA_CUENTA, DPCA_NUMERO, DPCA_FECHA, DPCA_MONTO, DPCA_TIPOENT, DPCA_IDENT, DPCA_TIPOSAL, DPCA_IDSAL)
        VALUES (GEN_ID(ID_DOCPAGOCAJA, 1), NEW.FOPA_ID, :Des, NEW.TRCD_BANCO, NEW.TRCD_CUENTA, NEW.TRCD_NUMERO, NEW.TRCD_FECHA, NEW.TRCD_MONTO, 66, NEW.TRCJ_ID, 0, 0);
  ELSE
      EXECUTE PROCEDURE SUME_SALDO_EFECTIVO (:Des, :Fec, NEW.TRCD_MONTO, 'N');
  END
END^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER procedure CHEQUEO_SALDOS_CAJAS (
    CAJAINI integer,
    CAJAFIN integer)
AS
declare variable ID INTEGER;
declare variable Fec date;
declare variable Caja integer;
declare variable Conc VARCHAR(60);
declare variable Pref varchar(4);
declare variable Num varchar(8);
declare variable FORMA INTEGER;
declare variable BANCO VARCHAR(2);
declare variable CUENTA VARCHAR(20);
declare variable NUMERO VARCHAR(20);
declare variable FECHA DATE;
declare variable MONTO NUMERIC(18,2);
declare variable Dest INTEGER;
declare variable item integer;
declare variable idd integer;
declare variable TIPO INTEGER;
begin
/* BORRE LOS MOVIMIENTOS CAJA, LOS DOCUMENTOS PAGO CAJA Y SALDO EFECTIVO */
DELETE FROM ANTICIPOS_CLIENTE WHERE RECA_ID = 0;
DELETE FROM ANTICIPOS_PROVEEDOR WHERE EGRE_ID = 0;
UPDATE DOCUMENTOS_PAGO_CAJA SET dpca_idsal = 0 WHERE CAJA_ID >= :cajaini AND CAJA_ID <= :cajafin;
DELETE FROM MOVIMIENTO_CAJA WHERE CAJA_ID >= :cajaini AND CAJA_ID <= :cajafin;
DELETE FROM DOCUMENTOS_PAGO_CAJA WHERE CAJA_ID >= :cajaini AND CAJA_ID <= :cajafin;
DELETE FROM SALDO_EFECTIVO WHERE CAJA_ID >= :cajaini AND CAJA_ID <= :cajafin;
DELETE FROM saldo_caja WHERE CAJA_ID >= :cajaini AND CAJA_ID <= :cajafin;

/* INCORPORE LOS RECIBOS DE CAJA */
FOR SELECT R.RECA_ID, reca_fecha, caja_id, reca_conc, pref_pre, reca_numero, FOPA_ID, RCPA_BANCO, RCPA_CUENTA, RCPA_NUMERO, RCPA_FECHA, RCPA_MONTO
    FROM recibos_caja R, RECIBOS_CAJA_PAGO P where R.reca_id = P.reca_id and reca_anulado = 'N' AND CAJA_ID >= :cajaini AND CAJA_ID <= :cajafin
    ORDER BY CAJA_ID, R.RECA_FECHA, R.RECA_ID, RCPA_ITEM
    INTO :ID, :Fec, :Caja, :Conc, :Pref, :Num, :forma,  :banco, :cuenta, :numero, :fecha, :monto
    DO
    BEGIN
    if (exists (select moca_id from movimiento_caja where moca_tiporef = 61 and moca_idref = :id)) then
        update movimiento_caja
        set moca_debitos = moca_debitos + :monto
        where moca_tiporef = 61 and moca_idref = :id;
    else
        INSERT INTO MOVIMIENTO_CAJA
            (MOCA_ID, CAJA_ID, MOCA_TIPOREF, MOCA_PREFREF, MOCA_NUMREF, MOCA_FECHA, MOCA_CONC, MOCA_DEBITOS, MOCA_CREDITOS, MOCA_DB, MOCA_IDREF)
            VALUES(GEN_ID(id_movcaja,1), :Caja, 61, :Pref, :Num, :Fec, :Conc, :monto, 0, 'S', :id);
        /* GRABE EL DOCUMENTO DE PAGO EN CAJA */
        if (FORMA <> 1) then
            INSERT INTO DOCUMENTOS_PAGO_CAJA (DPCA_ID, FOPA_ID, CAJA_ID, DPCA_BANCO, DPCA_CUENTA, DPCA_NUMERO, DPCA_FECHA, DPCA_MONTO, DPCA_TIPOENT, DPCA_IDENT, DPCA_TIPOSAL, DPCA_IDSAL)
                VALUES (GEN_ID(ID_DOCPAGOCAJA, 1), :FORMA, :CAJA, :BANCO, :CUENTA, :NUMERO, :FECHA, :MONTO, 61, :ID, 0, 0);
        ELSE
            EXECUTE PROCEDURE SUME_SALDO_EFECTIVO (:CAJA, :FEC, :MONTO, 'N');
    END

/* LOS EGRESOS POR TRASLADO A CAJA */
for SELECT EGRE_ID, CAJA_ID, PREF_PRE, EGRE_NUMERO, EGRE_FECHA, EGRE_CONC, EGRE_MONTO FROM EGRESOS
    WHERE EGRE_TIPO = '2' AND CAJA_ID <> 0 AND egre_id <> 0 AND egre_anulado = 'N' AND CAJA_ID >= :cajaini AND CAJA_ID <= :cajafin
    ORDER BY CAJA_ID, EGRE_FECHA
    INTO :ID, :CAJA, :PREF, :NUM, :FEC, :CONC, :MONTO
    DO
    BEGIN
    if (exists (SELECT MOCA_IDREF FROM movimiento_caja WHERE MOCA_TIPOREF = 62 AND MOCA_IDREF = :ID)) Then
     BEGIN
     INSERT INTO MOVIMIENTO_CAJA
        (MOCA_ID, CAJA_ID, MOCA_TIPOREF, MOCA_PREFREF, MOCA_NUMREF, MOCA_FECHA, MOCA_CONC, MOCA_DEBITOS, MOCA_CREDITOS, MOCA_DB, MOCA_IDREF)
        VALUES(GEN_ID(id_movcaja,1), :CAJA, 62, :PREF, :NUM, :FEC, :CONC, :MONTO, 0, 'S', :ID);
      /* GRABE EL DOCUMENTO DE PAGO EN CAJA */
      EXECUTE PROCEDURE SUME_SALDO_EFECTIVO (:caja, :fec, :monto, 'N');
     END
    END
/* las planillas de pasajeros */
FOR SELECT PLPA_ID, PLPA_fecha, PLPA_pref, PLPA_numero, PLPA_caja, PLPA_NETO
    from planilla_pasajeros where plpa_anulado = 'N' and plpa_neto < 0
    order by PLPA_FECHA, PLPA_ID
    INTO :ID, :Fec, :Pref, :Num, :Caja, :monto
    DO
    BEGIN
    CONC = 'PLANILLA DE PASAJEROS No. ' || :pref || :num;
    INSERT INTO MOVIMIENTO_CAJA
        (MOCA_ID, CAJA_ID, MOCA_TIPOREF, MOCA_PREFREF, MOCA_NUMREF, MOCA_FECHA, MOCA_CONC, MOCA_DEBITOS, MOCA_CREDITOS, MOCA_DB, MOCA_IDREF)
        VALUES(GEN_ID(id_movcaja,1), :caja, 88, :pref, :num, :fec, :Conc, ABS(:monto), 0, 'S', :id);
    EXECUTE PROCEDURE SUME_SALDO_EFECTIVO (:caja, :fec, ABS(:monto), 'N');
    END

/* REMESAS CARGA   */
FOR SELECT CGRM_ID, CGRM_fecha, CGRM_pref, CGRM_numero, CGRM_caja, CGRM_TOTAL, TIDO_COD
    from carga_remesa where (CGRM_anulado = 'N') AND (cgrm_fpago = 'C') AND (cgrm_caja <> 0) AND (cgrm_caja IS NOT NULL)
    order by CGRM_FECHA, CGRM_ID
    INTO :ID, :Fec, :Pref, :Num, :Caja, :monto, :tipo
    DO
    BEGIN
    CONC = 'REMESA No. ' || :pref || :num;
    INSERT INTO MOVIMIENTO_CAJA
        (MOCA_ID, CAJA_ID, MOCA_TIPOREF, MOCA_PREFREF, MOCA_NUMREF, MOCA_FECHA, MOCA_CONC, MOCA_DEBITOS, MOCA_CREDITOS, MOCA_DB, MOCA_IDREF)
        VALUES(GEN_ID(id_movcaja,1), :caja, :tipo, :pref, :num, :fec, :Conc, :monto, 0, 'S', :id);
    EXECUTE PROCEDURE SUME_SALDO_EFECTIVO (:caja, :fec, :monto, 'N');
    END

/* TIQUETES PASAJEROS */
FOR SELECT TIQP_ID, TIQP_fecha, TIQP_pref, TIQP_numero, TIQP_caja, TIQP_TOTAL
    from tiquete_pasajero where (TIQP_anulado = 'N') AND (TIQP_formap = 'C') AND (TIQP_caja <> 0) AND (TIQP_caja IS NOT NULL)
    order by TIQP_FECHA, TIQP_ID
    INTO :ID, :Fec, :Pref, :Num, :Caja, :monto
    DO
    BEGIN
    CONC = 'TIQUETE DE PASAJEROS No. ' || :pref || :num;
    INSERT INTO MOVIMIENTO_CAJA
        (MOCA_ID, CAJA_ID, MOCA_TIPOREF, MOCA_PREFREF, MOCA_NUMREF, MOCA_FECHA, MOCA_CONC, MOCA_DEBITOS, MOCA_CREDITOS, MOCA_DB, MOCA_IDREF)
        VALUES(GEN_ID(id_movcaja,1), :caja, 86, :pref, :num, :fec, :Conc, :monto, 0, 'S', :id);
    EXECUTE PROCEDURE SUME_SALDO_EFECTIVO (:caja, :fec, :monto, 'N');
    END

/* LOS CAMBIOS */
FOR SELECT C.CADO_ID, cado_fecha, cado_conc, pref_pre, cado_numero, caja_id, FOPA_ID, CDSA_BANCO, CDSA_CUENTA, CDSA_NUMERO, CDSA_FECHA, CDSA_MONTO
    FROM CAMBIO_DOCUMENTOS C, CAMBIODOC_SALIDAS D where C.CADO_ID = D.CADO_ID and cado_anulado = 'N' AND CAJA_ID >= :cajaini AND CAJA_ID <= :cajafin
    ORDER BY CAJA_ID, C.CADO_FECHA, C.CADO_ID, CDSA_ITEM
    INTO :ID, :Fec, :Conc, :Pref, :Num, :Caja, :forma, :banco, :cuenta, :numero, :fecha, :monto
    DO
    BEGIN
    if (exists (select moca_id from movimiento_caja where moca_tiporef = 63 and moca_idref = :id and caja_id = :CAJA)) Then
        begin
        update movimiento_caja
            set moca_debitos = moca_debitos + :monto
            where moca_tiporef = 63 and moca_idref = :id and caja_id = :CAJA;
        end
    else
        INSERT INTO MOVIMIENTO_CAJA
            (MOCA_ID, CAJA_ID, MOCA_TIPOREF, MOCA_PREFREF, MOCA_NUMREF, MOCA_FECHA, MOCA_CONC, MOCA_DEBITOS, MOCA_CREDITOS, MOCA_DB, MOCA_IDREF)
            VALUES(GEN_ID(ID_MOVCAJA,1), :CAJA, 63, :Pref, :Num, :Fec, :Conc, :monto, 0, 'S', :id);
        
    if (FORMA <> 1) then
        INSERT INTO DOCUMENTOS_PAGO_CAJA (DPCA_ID, FOPA_ID, CAJA_ID, DPCA_BANCO, DPCA_CUENTA, DPCA_NUMERO, DPCA_FECHA, DPCA_MONTO, DPCA_TIPOENT, DPCA_IDENT, DPCA_TIPOSAL, DPCA_IDSAL)
            VALUES (GEN_ID(ID_DOCPAGOCAJA, 1), :FORMA, :CAJA, :BANCO, :CUENTA, :NUMERO, :FECHA, :MONTO, 63, :ID, 0, 0);
    ELSE
        EXECUTE PROCEDURE SUME_SALDO_EFECTIVO(:CAJA, :FEC, :MONTO, 'N');
    END
/* DEVOLUCIONES DE CHEQUES ojo fopa_id = 2 */
FOR SELECT DVCH_ID, dvch_fecha, caja_id, dvch_conc, prba_pref, dvch_numdoc, 2, DVCH_BANCO, DVCH_CUENTA, DVCH_NROCH, DVCH_FECCH, DVCH_MONTO
    FROM DEVOLUCION_CHEQUES where dvch_anulado = 'N' AND dvch_cartera <> 'S' AND CAJA_ID >= :cajaini AND CAJA_ID <= :cajafin
    ORDER BY CAJA_ID, DVCH_FECHA, DVCH_ID
    INTO :ID, :Fec, :Caja, :Conc, :Pref, :Num, :forma,  :banco, :cuenta, :numero, :fecha, :monto
    DO
    BEGIN
    if (exists (select moca_id from movimiento_caja where moca_tiporef = 77 and moca_idref = :id)) Then
        update movimiento_caja
        set moca_debitos = moca_debitos + :monto
        where moca_tiporef = 77 and moca_idref = :id;
    else
        INSERT INTO MOVIMIENTO_CAJA
            (MOCA_ID, CAJA_ID, MOCA_TIPOREF, MOCA_PREFREF, MOCA_NUMREF, MOCA_FECHA, MOCA_CONC, MOCA_DEBITOS, MOCA_CREDITOS, MOCA_DB, MOCA_IDREF)
            VALUES(GEN_ID(id_movcaja,1), :Caja, 77, :Pref, :Num, :Fec, :Conc, :monto, 0, 'S', :id);
        /* GRABE EL DOCUMENTO DE PAGO EN CAJA */
        INSERT INTO DOCUMENTOS_PAGO_CAJA (DPCA_ID, FOPA_ID, CAJA_ID, DPCA_BANCO, DPCA_CUENTA, DPCA_NUMERO, DPCA_FECHA, DPCA_MONTO, DPCA_TIPOENT, DPCA_IDENT, DPCA_TIPOSAL, DPCA_IDSAL)
            VALUES (GEN_ID(ID_DOCPAGOCAJA, 1), 2, :CAJA, :BANCO, :CUENTA, :NUMERO, :FECHA, :MONTO, 77, :ID, 0, 0);
    END

/* TRASLADOS ENTRE CAJAS INGRESOS */
FOR SELECT T.TRCJ_ID, trcj_fecha, caja_id, trcj_destino, trcj_conc, pref_pre, trcj_numero, fopa_id, TRCD_BANCO, TRCD_CUENTA, TRCD_NUMERO, TRCD_FECHA, TRCD_MONTO
    FROM TRASLADOS_CAJA T, TRASLADOS_CAJA_DET D where T.TRCJ_ID = D.TRCJ_ID AND trcj_anulado = 'N' AND TRCJ_DESTINO >= :cajaini AND TRCJ_DESTINO <= :cajafin
    ORDER BY CAJA_ID, TRCJ_FECHA, T.TRCJ_ID, TRCD_ITEM
    INTO :ID, :Fec, :Caja, :Dest, :Conc, :Pref, :Num, :forma,  :banco, :cuenta, :numero, :fecha, :monto
    DO
    BEGIN
    /* INGRESO A LA CAJA DESTINO */
    if (exists (select moca_id from movimiento_caja where moca_tiporef = 66 and moca_idref = :id and caja_id = :Dest)) then
        begin
        update movimiento_caja
            set moca_debitos = moca_debitos + :monto
            where moca_tiporef = 66 and moca_idref = :id and caja_id = :Dest;
        end
    else
        INSERT INTO MOVIMIENTO_CAJA
            (MOCA_ID, CAJA_ID, MOCA_TIPOREF, MOCA_PREFREF, MOCA_NUMREF, MOCA_FECHA, MOCA_CONC, MOCA_DEBITOS, MOCA_CREDITOS, MOCA_DB, MOCA_IDREF)
            VALUES(GEN_ID(ID_MOVCAJA,1), :Dest, 66, :Pref, :Num, :Fec, :Conc, :monto, 0, 'S', :id);
    /* Ingrese el doc. de pago */
    if (FORMA <> 1) then
        INSERT INTO DOCUMENTOS_PAGO_CAJA (DPCA_ID, FOPA_ID, CAJA_ID, DPCA_BANCO, DPCA_CUENTA, DPCA_NUMERO, DPCA_FECHA, DPCA_MONTO, DPCA_TIPOENT, DPCA_IDENT, DPCA_TIPOSAL, DPCA_IDSAL)
            VALUES (GEN_ID(ID_DOCPAGOCAJA, 1), :FORMA, :Dest, :BANCO, :CUENTA, :NUMERO, :FECHA, :MONTO, 66, :ID, 0, 0);
    else
        EXECUTE PROCEDURE SUME_SALDO_EFECTIVO (:Dest, :Fec, :MONTO, 'N');
    END

/* TRASLADOS ENTRE CAJAS EGRESOS */
FOR SELECT T.TRCJ_ID, trcj_fecha, caja_id, trcj_destino, trcj_conc, pref_pre, trcj_numero, fopa_id, TRCD_BANCO, TRCD_CUENTA, TRCD_NUMERO, TRCD_FECHA, TRCD_MONTO, TRCD_ITEM
    FROM TRASLADOS_CAJA T, TRASLADOS_CAJA_DET D where T.TRCJ_ID = D.TRCJ_ID AND trcj_anulado = 'N' AND CAJA_ID >= :cajaini AND CAJA_ID <= :cajafin
    ORDER BY CAJA_ID, TRCJ_FECHA, T.TRCJ_ID, TRCD_ITEM
    INTO :ID, :Fec, :Caja, :Dest, :Conc, :Pref, :Num, :forma,  :banco, :cuenta, :numero, :fecha, :monto, :item
    DO
    BEGIN
    if (exists (select moca_id from movimiento_caja where moca_tiporef = 66 and moca_idref = :id and caja_id = :caja)) then
        begin
        update movimiento_caja
            set moca_creditos = moca_creditos + :monto
            where moca_tiporef = 66 and moca_idref = :id and caja_id = :caja;
        end
    else
        INSERT INTO MOVIMIENTO_CAJA
            (MOCA_ID, CAJA_ID, MOCA_TIPOREF, MOCA_PREFREF, MOCA_NUMREF, MOCA_FECHA, MOCA_CONC, MOCA_DEBITOS, MOCA_CREDITOS, MOCA_DB, MOCA_IDREF)
            VALUES(GEN_ID(ID_MOVCAJA,1), :CAJA, 66, :Pref, :Num, :Fec, :Conc, 0, :monto, 'N', :id);
    /* Actualice la salida del documento en la caja origen */
    if (FORMA <> 1) then
        BEGIN
        IDD = 0;
        SELECT FIRST 1 DPCA_ID FROM DOCUMENTOS_PAGO_CAJA WHERE FOPA_ID = :FORMA AND DPCA_BANCO = :BANCO AND DPCA_CUENTA = :CUENTA AND
            DPCA_NUMERO = :NUMERO AND CAJA_ID = :CAJA AND DPCA_TIPOSAL = 0 AND DPCA_IDSAL = 0 AND DPCA_MONTO = :MONTO
            ORDER BY DPCA_ID INTO :IDD;
        if (IDD <> 0) then
            UPDATE DOCUMENTOS_PAGO_CAJA
                SET DPCA_TIPOSAL = 66, DPCA_IDSAL = :ID
                WHERE DPCA_ID = :IDD;
        else
            BEGIN
/*            update traslados_caja_det set fopa_id = 1 where TRCJ_ID = :id and TRCD_ITEM = :item;*/
            EXECUTE PROCEDURE RESTE_SALDO_EFECTIVO(:CAJA, :FEC, :MONTO, 'N');
            END
        END
    else
        EXECUTE PROCEDURE RESTE_SALDO_EFECTIVO (:CAJA, :Fec, :MONTO, 'N');
    END

/* las planillas de pasajeros   */
FOR SELECT PLPA_ID, PLPA_fecha, PLPA_pref, PLPA_numero, PLPA_caja, PLPA_NETO
    from planilla_pasajeros where plpa_anulado = 'N' and plpa_neto > 0
    order by PLPA_FECHA, PLPA_ID
    INTO :ID, :Fec, :Pref, :Num, :Caja, :monto
    DO
    BEGIN
    CONC = 'PLANILLA DE PASAJEROS No. ' || :pref || :num;
    INSERT INTO MOVIMIENTO_CAJA
        (MOCA_ID, CAJA_ID, MOCA_TIPOREF, MOCA_PREFREF, MOCA_NUMREF, MOCA_FECHA, MOCA_CONC, MOCA_DEBITOS, MOCA_CREDITOS, MOCA_DB, MOCA_IDREF)
        VALUES(GEN_ID(ID_MOVCAJA,1), :caja, 88, :pref, :numero, :fec, :Conc, 0, :monto, 'N', :id);
    EXECUTE PROCEDURE RESTE_SALDO_EFECTIVO(:caja, :fec, :monto, 'N');
    END

/* INCORPORE LOS EGRESOS DE CAJA */
FOR SELECT E.EGRE_ID, egre_fecha, egre_conc, pref_pre, egre_numero, C.caja_id, FOPA_ID, EGCA_BANCO, EGCA_CUENTA, EGCA_NUMERO, EGCA_FECHA, EGCA_MONTO, EGCA_ITEM
    FROM EGRESOS E, EGRESOS_CAJA C where E.egre_id = C.egre_id and egre_anulado = 'N' AND C.CAJA_ID >= :cajaini AND C.CAJA_ID <= :cajafin
    ORDER BY CAJA_ID, E.EGRE_FECHA, E.EGRE_ID, EGCA_ITEM
    INTO :ID, :Fec, :Conc, :Pref, :Num, :Caja, :forma, :banco, :cuenta, :numero, :fecha, :monto, :item
    DO
    BEGIN
    if (exists (select moca_id from movimiento_caja where moca_tiporef = 62 and moca_idref = :id and caja_id = :caja)) then
        update movimiento_caja
        set moca_creditos = moca_creditos + :monto
        where moca_tiporef = 62 and moca_idref = :id and caja_id = :caja;
    else
        INSERT INTO MOVIMIENTO_CAJA
            (MOCA_ID, CAJA_ID, MOCA_TIPOREF, MOCA_PREFREF, MOCA_NUMREF, MOCA_FECHA, MOCA_CONC, MOCA_DEBITOS, MOCA_CREDITOS, MOCA_DB, MOCA_IDREF)
            VALUES(GEN_ID(ID_MOVCAJA,1), :caja, 62, :Pref, :Num, :Fec, :Conc, 0, :monto, 'N', :id);
    /* ACTUALICE LA SALIDA DEL DOCUMENTO */
    if (FORMA <> 1) then
        begin
        IDD = 0;
        SELECT FIRST 1 DPCA_ID FROM DOCUMENTOS_PAGO_CAJA WHERE FOPA_ID = :FORMA AND DPCA_BANCO = :BANCO AND DPCA_CUENTA = :CUENTA AND
            DPCA_NUMERO = :NUMERO AND CAJA_ID = :CAJA AND DPCA_TIPOSAL = 0 AND DPCA_IDSAL = 0 AND DPCA_MONTO = :MONTO
            ORDER BY dpca_id INTO :IDD;
        if (IDD <> 0) then
            UPDATE DOCUMENTOS_PAGO_CAJA
                SET DPCA_TIPOSAL = 62, DPCA_IDSAL = :ID
                WHERE DPCA_ID = :IDD;
        else
            begin
/*            update egresos_caja set fopa_id = 1 where egre_id = :id and EGCA_ITEM = :item;*/
            EXECUTE PROCEDURE RESTE_SALDO_EFECTIVO(:CAJA, :FEC, :MONTO, 'N');
            end
        end
    ELSE
        EXECUTE PROCEDURE RESTE_SALDO_EFECTIVO(:CAJA, :FEC, :MONTO, 'N');
    END

/* INCORPORE LAS CONSIGNACIONES */
FOR SELECT C.CONS_ID, cons_fecha, cons_concepto, prba_pref, cons_numero, caja_id, FOPA_ID, CODE_BANCO, CODE_CUENTA, CODE_NUMERO, CODE_FECHA, CODE_MONTO, CODE_ITEM2
    FROM CONSIGNA C, CONSIGNA_DETALLE D where C.CONS_ID = D.CONS_ID and cons_anulado = 'N' AND CAJA_ID >= :cajaini AND CAJA_ID <= :cajafin
    ORDER BY CAJA_ID, C.CONS_FECHA, C.CONS_ID, CODE_ITEM2
    INTO :ID, :Fec, :Conc, :Pref, :Num, :Caja, :forma, :banco, :cuenta, :numero, :fecha, :monto, :item
    DO
    BEGIN
    if (exists (select moca_id from movimiento_caja where moca_tiporef = 71 and moca_idref = :id and caja_id = :caja)) then
        update movimiento_caja
            set moca_creditos = moca_creditos + :monto
            where moca_tiporef = 71 and moca_idref = :id and caja_id = :caja;
    else
        INSERT INTO MOVIMIENTO_CAJA
            (MOCA_ID, CAJA_ID, MOCA_TIPOREF, MOCA_PREFREF, MOCA_NUMREF, MOCA_FECHA, MOCA_CONC, MOCA_DEBITOS, MOCA_CREDITOS, MOCA_DB, MOCA_IDREF)
            VALUES(GEN_ID(ID_MOVCAJA,1), :CAJA, 71, :Pref, :Num, :Fec, :Conc, 0, :monto, 'N', :id);
    /* ACTUALICE LA SALIDA DEL DOCUMENTO DE PAGO */
    if (FORMA <> 1) then
        BEGIN
        IDD = 0;
        SELECT FIRST 1 DPCA_ID FROM DOCUMENTOS_PAGO_CAJA WHERE FOPA_ID = :FORMA AND DPCA_BANCO = :BANCO AND DPCA_CUENTA = :CUENTA AND
            DPCA_NUMERO = :NUMERO AND CAJA_ID = :CAJA AND DPCA_TIPOSAL = 0 AND DPCA_IDSAL = 0 AND DPCA_MONTO = :MONTO
            ORDER BY DPCA_ID INTO :IDD;
        if (IDD <> 0) then
            UPDATE DOCUMENTOS_PAGO_CAJA
                SET DPCA_TIPOSAL = 71, DPCA_IDSAL = :id
                WHERE DPCA_ID = :IDD;
        ELSE
            BEGIN
/*            update consigna_detalle set fopa_id = 1 where CONS_ID = :id and CODE_ITEM2 = :item;*/
            EXECUTE PROCEDURE RESTE_SALDO_EFECTIVO(:CAJA, :FEC, :MONTO, 'N');
            END
        END
    ELSE
        EXECUTE PROCEDURE RESTE_SALDO_EFECTIVO(:CAJA, :FEC, :MONTO, 'N');
    END

/* CONSIGNACIONES DE TARJETAS */
FOR SELECT C.COTJ_ID, cotj_fecha, cotj_concepto, pref_pre, cotj_numero, caja_id, FOPA_ID, TARJ_COD, CTJD_NROTJ, CTJD_COMPROB, COTJ_FECHA, CTJD_BASE
    FROM CONSIGNA_TARJETAS C, CONSIGNA_TARJETAS_DET D where C.cotj_id = D.cotj_id and cotj_anulado = 'N' AND CAJA_ID >= :cajaini AND CAJA_ID <= :cajafin
    ORDER BY CAJA_ID, C.COTJ_FECHA, C.cotj_id, CTJD_ITEM
    INTO :ID, :Fec, :Conc, :Pref, :Num, :Caja, :forma, :banco, :cuenta, :numero, :fecha, :monto
    DO
    BEGIN
    if (exists (select moca_id from movimiento_caja where moca_tiporef = 64 and moca_idref = :id)) then
        update movimiento_caja
            set moca_creditos = moca_creditos + :monto
            where moca_tiporef = 64 and moca_idref = :id;
    else
        INSERT INTO MOVIMIENTO_CAJA
            (MOCA_ID, CAJA_ID, MOCA_TIPOREF, MOCA_PREFREF, MOCA_NUMREF, MOCA_FECHA, MOCA_CONC, MOCA_DEBITOS, MOCA_CREDITOS, MOCA_DB, MOCA_IDREF)
            VALUES(GEN_ID(ID_MOVCAJA,1), :Caja, 64, :Pref, :Num, :Fec, :Conc, 0, :monto, 'N', :id);

  /* ACTUALICE LA SALIDA DEL DOCUMENTO DE PAGO */
  IDD = 0;
  SELECT FIRST 1 DPCA_ID FROM DOCUMENTOS_PAGO_CAJA WHERE FOPA_ID = :FORMA AND DPCA_BANCO = :BANCO AND DPCA_CUENTA = :CUENTA AND
    DPCA_NUMERO = :NUMERO AND CAJA_ID = :CAJA AND DPCA_TIPOSAL = 0 AND DPCA_IDSAL = 0 AND DPCA_MONTO = :MONTO
    ORDER BY DPCA_ID INTO :IDD;
  if (IDD <> 0) then
      UPDATE DOCUMENTOS_PAGO_CAJA
        SET DPCA_TIPOSAL = 64, DPCA_IDSAL = :id
        WHERE DPCA_ID = :IDD;
  ELSE
    begin
    EXECUTE PROCEDURE RESTE_SALDO_EFECTIVO(:CAJA, :FEC, :MONTO, 'N');
    end
  end

/* INCORPORE LOS CAMBIOS DE DOCUMENTOS */
FOR SELECT C.CADO_ID, cado_fecha, cado_conc, pref_pre, cado_numero, caja_id, FOPA_ID, CDEN_BANCO, CDEN_CUENTA, CDEN_NUMERO, CDEN_FECHA, CDEN_MONTO, CDEN_ITEM
    FROM CAMBIO_DOCUMENTOS C, CAMBIODOC_ENTRADAS D where C.CADO_ID = D.CADO_ID and cado_anulado = 'N' AND CAJA_ID >= :cajaini AND CAJA_ID <= :cajafin
    ORDER BY CAJA_ID, C.CADO_FECHA, C.CADO_ID, CDEN_ITEM
    INTO :ID, :Fec, :Conc, :Pref, :Num, :Caja, :forma, :banco, :cuenta, :numero, :fecha, :monto, :item
    DO
    BEGIN
    if (exists (select moca_id from movimiento_caja where moca_tiporef = 63 and moca_idref = :id and caja_id = :CAJA)) then
        begin
        update movimiento_caja
            set moca_creditos = moca_creditos + :monto
            where moca_tiporef = 63 and moca_idref = :id and caja_id = :CAJA;
        end
    else
        INSERT INTO MOVIMIENTO_CAJA
            (MOCA_ID, CAJA_ID, MOCA_TIPOREF, MOCA_PREFREF, MOCA_NUMREF, MOCA_FECHA, MOCA_CONC, MOCA_DEBITOS, MOCA_CREDITOS, MOCA_DB, MOCA_IDREF)
            VALUES(GEN_ID(ID_MOVCAJA,1), :CAJA, 63, :Pref, :Num, :Fec, :Conc, 0, :monto, 'N', :id);
        
    /* ACTUALICE LA SALIDA DEL DOCUMENTO */
    if (FORMA <> 1) then
        BEGIN
        IDD = 0;
        SELECT FIRST 1 DPCA_ID FROM DOCUMENTOS_PAGO_CAJA WHERE FOPA_ID = :FORMA AND DPCA_BANCO = :BANCO AND DPCA_CUENTA = :CUENTA AND
            DPCA_NUMERO = :NUMERO AND CAJA_ID = :CAJA AND DPCA_TIPOSAL = 0 AND DPCA_IDSAL = 0 AND DPCA_MONTO = :MONTO
            ORDER BY DPCA_ID INTO :IDD;
        if (IDD <> 0) then
            UPDATE DOCUMENTOS_PAGO_CAJA
                SET DPCA_TIPOSAL = 63, DPCA_IDSAL = :id
                WHERE DPCA_ID = :IDD;
        ELSE
            BEGIN
/*            update cambiodoc_entradas set fopa_id = 1 where CADO_ID = :id and CDEN_ITEM = :item;*/
            EXECUTE PROCEDURE RESTE_SALDO_EFECTIVO(:CAJA, :FEC, :MONTO, 'N');
            END
        END
    ELSE
        EXECUTE PROCEDURE RESTE_SALDO_EFECTIVO(:CAJA, :FEC, :MONTO, 'N');
    END
end^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER TRIGGER EGRESOS_CAJA_AI FOR EGRESOS_CAJA
ACTIVE AFTER INSERT POSITION 0
AS
declare variable Fec DATE;
declare variable Conc VARCHAR(60);
declare variable Pref varchar(4);
declare variable Num varchar(8);
declare variable Existe integer;
declare variable VALFP char(2);
BEGIN
if ((NEW.egre_id <> 0) and (new.egca_anulado = 'N')) then
  BEGIN
  EXECUTE PROCEDURE LEE_CONFIGURACION('BANCOS','CONSIGNACIONES','VALIDAR FORMAS DE PAGO EN CAJA') RETURNING_VALUES (VALFP);
  select pref_pre, egre_numero, egre_fecha, egre_conc
    from egresos where egre_id = new.egre_id
    into :pref, :num, :fec, :conc;
  /* Actualice el movimiento en caja */
  select count(moca_id) from movimiento_caja where moca_tiporef = 62 and moca_idref = new.egre_id and caja_id = new.caja_id into :Existe;
  if (Existe > 0) then
    update movimiento_caja
        set moca_creditos = moca_creditos + new.egca_monto
        where moca_tiporef = 62 and moca_idref = new.egre_id and caja_id = new.caja_id;
  else
    INSERT INTO MOVIMIENTO_CAJA
        (MOCA_ID, CAJA_ID, MOCA_TIPOREF, MOCA_PREFREF, MOCA_NUMREF, MOCA_FECHA, MOCA_CONC, MOCA_DEBITOS, MOCA_CREDITOS, MOCA_DB, MOCA_IDREF)
        VALUES(GEN_ID(ID_MOVCAJA,1), NEW.caja_id, 62, :Pref, :Num, :Fec, :Conc, 0, NEW.egca_monto, 'N', new.egre_id);
        
  /* ACTUALICE LA SALIDA DEL DOCUMENTO */
  if (NEW.FOPA_ID <> 1) then
      BEGIN
      if (EXISTS(SELECT dpca_id FROM DOCUMENTOS_PAGO_CAJA WHERE CAJA_ID = NEW.caja_id AND FOPA_ID = NEW.FOPA_ID AND DPCA_BANCO = NEW.EGCA_BANCO AND
        DPCA_CUENTA = NEW.EGCA_CUENTA AND DPCA_NUMERO = NEW.EGCA_NUMERO AND DPCA_TIPOSAL = 0 AND DPCA_IDSAL = 0)) then
          UPDATE DOCUMENTOS_PAGO_CAJA
            SET DPCA_TIPOSAL = 62, DPCA_IDSAL = NEW.EGRE_ID
            WHERE CAJA_ID = NEW.caja_id AND FOPA_ID = NEW.FOPA_ID AND DPCA_BANCO = NEW.EGCA_BANCO AND DPCA_CUENTA = NEW.EGCA_CUENTA AND
            DPCA_NUMERO = NEW.EGCA_NUMERO AND DPCA_TIPOSAL = 0 AND DPCA_IDSAL = 0 AND DPCA_MONTO = NEW.egca_monto;
      ELSE
        IF (VALFP = 'SI') THEN
          EXCEPTION documento_pago_salido 'La forma de pago ' || new.egca_banco || ' ' || new.egca_cuenta || ' ' || new.egca_numero || ' no esta en la caja.';
      END
  ELSE
      EXECUTE PROCEDURE RESTE_SALDO_EFECTIVO(NEW.CAJA_ID, :FEC, NEW.EGCA_MONTO, 'N');
  END
END^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER TRIGGER EGRESOS_CAJA_AU FOR EGRESOS_CAJA
ACTIVE AFTER UPDATE POSITION 0
AS
declare variable Fec DATE;
declare variable Conc VARCHAR(60);
declare variable Pref varchar(4);
declare variable Num varchar(8);
declare variable Existe char(1);
declare variable VALFP char(2);
BEGIN
EXECUTE PROCEDURE LEE_CONFIGURACION('BANCOS','CONSIGNACIONES','VALIDAR FORMAS DE PAGO EN CAJA') RETURNING_VALUES (VALFP);
select pref_pre, egre_numero, egre_fecha, egre_conc
  from egresos where egre_id = new.egre_id into :pref, :num, :fec, :conc;
if (old.egca_anulado <> new.egca_anulado) then
 if (new.egca_anulado = 'S') then
    begin
/*if ((old.egre_id <> 0) and (old.egca_anulado = 'N')) then
    begin*/
    /* Actualice el total del movimiento caja */
    if (exists(select moca_id from movimiento_caja where moca_tiporef = 62 and moca_idref = new.egre_id and caja_id = new.caja_id)) then
        update movimiento_caja
            set moca_creditos = moca_creditos - new.egca_monto
            where moca_tiporef = 62 and moca_idref = new.egre_id and caja_id = new.caja_id;
    /* ANULE LA SALIDA DEL DOCUMENTO DE PAGO */
    if (OLD.FOPA_ID <> 1) then
        UPDATE DOCUMENTOS_PAGO_CAJA
            SET DPCA_TIPOSAL = 0, DPCA_IDSAL = 0
            WHERE CAJA_ID = OLD.caja_id AND FOPA_ID = OLD.FOPA_ID AND DPCA_BANCO = OLD.EGCA_BANCO AND
            DPCA_CUENTA = OLD.EGCA_CUENTA AND DPCA_NUMERO = OLD.EGCA_NUMERO AND
            DPCA_TIPOSAL = 62 AND DPCA_IDSAL = OLD.EGRE_ID AND DPCA_MONTO = OLD.egca_monto;
    ELSE
        EXECUTE PROCEDURE RESTE_SALDO_EFECTIVO(OLD.CAJA_ID, :FEC, OLD.EGCA_MONTO, 'S');
    END
 else
    begin
    if (new.egre_id <> 0) then /*and (new.egca_anulado = 'N')) then*/
      begin
      /* AHORA AFECTE LA CAJA POR EL EGRESO DE CAJA */
      if (exists(select moca_id from movimiento_caja where moca_tiporef = 62 and moca_idref = new.egre_id and caja_id = new.caja_id)) then
        update movimiento_caja
            set moca_creditos = moca_creditos + new.egca_monto
            where moca_tiporef = 62 and moca_idref = new.egre_id and caja_id = new.caja_id;
      else
        INSERT INTO MOVIMIENTO_CAJA
            (MOCA_ID, CAJA_ID, MOCA_TIPOREF, MOCA_PREFREF, MOCA_NUMREF, MOCA_FECHA, MOCA_CONC, MOCA_DEBITOS, MOCA_CREDITOS, MOCA_DB, MOCA_IDREF)
            VALUES(GEN_ID(id_movcaja,1), new.Caja_id, 62, :Pref, :Num, :Fec, :Conc, 0, NEW.egca_monto, 'N', new.egre_id);
      /* ACTUALICE LA SALIDA DEL DOCUMENTO */
      if (NEW.FOPA_ID <> 1) then
        BEGIN
        if (EXISTS(SELECT DPCA_ID FROM DOCUMENTOS_PAGO_CAJA WHERE CAJA_ID = NEW.caja_id AND FOPA_ID = NEW.FOPA_ID AND DPCA_BANCO = NEW.EGCA_BANCO AND
            DPCA_CUENTA = NEW.EGCA_CUENTA AND DPCA_NUMERO = NEW.EGCA_NUMERO AND DPCA_TIPOSAL = 0 AND DPCA_IDSAL = 0)) then
            UPDATE DOCUMENTOS_PAGO_CAJA
                SET DPCA_TIPOSAL = 62, DPCA_IDSAL = NEW.EGRE_ID
                WHERE CAJA_ID = NEW.caja_id AND FOPA_ID = NEW.FOPA_ID AND DPCA_BANCO = NEW.EGCA_BANCO AND DPCA_CUENTA = NEW.EGCA_CUENTA AND
                DPCA_NUMERO = NEW.EGCA_NUMERO AND DPCA_TIPOSAL = 0 AND DPCA_IDSAL = 0 AND DPCA_MONTO = NEW.egca_monto;
        ELSE
            IF (VALFP = 'SI') THEN
                EXCEPTION documento_pago_salido 'La forma de pago ' || new.egca_banco || ' ' || new.egca_cuenta || ' ' || new.egca_numero || ' no esta en la caja.';
        END
      ELSE
        EXECUTE PROCEDURE RESTE_SALDO_EFECTIVO(NEW.CAJA_ID, :FEC, NEW.EGCA_MONTO, 'N');
      END
    end
ELSE
 if (new.egre_id <> 0) then
    begin
    if (OLD.egre_id <> 0) then
      BEGIN
      /* No estan anulando, pudo haber cambiado el monto */
      if (exists(select moca_id from movimiento_caja where moca_tiporef = 62 and moca_idref = old.egre_id and caja_id = new.caja_id)) then
         update movimiento_caja
          set moca_creditos = moca_creditos - old.egca_monto
          where moca_tiporef = 62 and moca_idref = old.egre_id and caja_id = new.caja_id;
       /* ANULE LA SALIDA DEL DOCUMENTO DE PAGO */
       if (NEW.FOPA_ID <> 1) then
          UPDATE DOCUMENTOS_PAGO_CAJA
           SET DPCA_TIPOSAL = 0, DPCA_IDSAL = 0
           WHERE CAJA_ID = OLD.caja_id AND FOPA_ID = OLD.FOPA_ID AND DPCA_BANCO = OLD.EGCA_BANCO AND
               DPCA_CUENTA = OLD.EGCA_CUENTA AND DPCA_NUMERO = OLD.EGCA_NUMERO AND
               DPCA_TIPOSAL = 62 AND DPCA_IDSAL = OLD.EGRE_ID;
       ELSE
          EXECUTE PROCEDURE RESTE_SALDO_EFECTIVO(OLD.CAJA_ID, :FEC, OLD.EGCA_MONTO, 'S');
       END
        /* AHORA AFECTE LA CAJA POR EL EGRESO DE CAJA */
    if (exists(select moca_id from movimiento_caja where moca_tiporef = 62 and moca_idref = new.egre_id and caja_id = new.caja_id)) then
       update movimiento_caja
         set moca_creditos = moca_creditos + new.egca_monto
         where moca_tiporef = 62 and moca_idref = new.egre_id and caja_id = new.caja_id;
    else
       INSERT INTO MOVIMIENTO_CAJA
        (MOCA_ID, CAJA_ID, MOCA_TIPOREF, MOCA_PREFREF, MOCA_NUMREF, MOCA_FECHA, MOCA_CONC, MOCA_DEBITOS, MOCA_CREDITOS, MOCA_DB, MOCA_IDREF)
        VALUES(GEN_ID(id_movcaja,1), new.Caja_id, 62, :Pref, :Num, :Fec, :Conc, 0, NEW.egca_monto, 'N', new.egre_id);
      /* ACTUALICE LA SALIDA DEL DOCUMENTO */
    if (NEW.FOPA_ID <> 1) then
     BEGIN
      if (EXISTS(SELECT DPCA_ID FROM DOCUMENTOS_PAGO_CAJA WHERE CAJA_ID = NEW.caja_id AND FOPA_ID = NEW.FOPA_ID AND DPCA_BANCO = NEW.EGCA_BANCO AND
         DPCA_CUENTA = NEW.EGCA_CUENTA AND DPCA_NUMERO = NEW.EGCA_NUMERO AND DPCA_TIPOSAL = 0 AND DPCA_IDSAL = 0)) then
        UPDATE DOCUMENTOS_PAGO_CAJA
         SET DPCA_TIPOSAL = 62, DPCA_IDSAL = NEW.EGRE_ID
         WHERE CAJA_ID = NEW.caja_id AND FOPA_ID = NEW.FOPA_ID AND DPCA_BANCO = NEW.EGCA_BANCO AND DPCA_CUENTA = NEW.EGCA_CUENTA AND
           DPCA_NUMERO = NEW.EGCA_NUMERO AND DPCA_TIPOSAL = 0 AND DPCA_IDSAL = 0;
      ELSE
        IF (VALFP = 'SI') THEN
           EXCEPTION documento_pago_salido 'La forma de pago ' || new.egca_banco || ' ' || new.egca_cuenta || ' ' || new.egca_numero || ' no esta en la caja.';
     END
    ELSE
      EXECUTE PROCEDURE RESTE_SALDO_EFECTIVO(NEW.CAJA_ID, :FEC, NEW.EGCA_MONTO, 'N');
    end
END^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER TRIGGER EGRESOS_CAJA_AD FOR EGRESOS_CAJA
ACTIVE AFTER DELETE POSITION 0
AS
declare variable Existe char(1);
declare variable FEC DATE;
BEGIN
if ((OLD.egre_id <> 0) AND (OLD.egca_anulado = 'N')) then
    BEGIN
    select egre_fecha from egresos where egre_id = OLD.egre_id
        into :fec;
  
    /* Actualice el total del movimiento caja */
    if (exists(select MOCA_ID from movimiento_caja where moca_tiporef = 62 and moca_idref = old.egre_id and caja_id = old.caja_id)) then
        update movimiento_caja
            set moca_creditos = moca_creditos - old.egca_monto
            where moca_tiporef = 62 and moca_idref = old.egre_id and caja_id = old.caja_id;
    /* ANULE LA SALIDA DEL DOCUMENTO DE PAGO */
    if (OLD.FOPA_ID <> 1) then
        UPDATE DOCUMENTOS_PAGO_CAJA
            SET DPCA_TIPOSAL = 0, DPCA_IDSAL = 0
            WHERE CAJA_ID = OLD.caja_id AND FOPA_ID = OLD.FOPA_ID AND DPCA_BANCO = OLD.EGCA_BANCO AND
            DPCA_CUENTA = OLD.EGCA_CUENTA AND DPCA_NUMERO = OLD.EGCA_NUMERO AND
            DPCA_TIPOSAL = 62 AND DPCA_IDSAL = OLD.EGRE_ID AND DPCA_MONTO = OLD.egca_monto;
    ELSE
        EXECUTE PROCEDURE RESTE_SALDO_EFECTIVO(OLD.CAJA_ID, :FEC, OLD.EGCA_MONTO, 'S');
    END
END^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER TRIGGER TRASLADOS_CAJA_DET_AU FOR TRASLADOS_CAJA_DET
ACTIVE AFTER UPDATE POSITION 0
AS
declare variable Fec DATE;
declare variable Conc VARCHAR(60);
declare variable Pref varchar(4);
declare variable Num varchar(8);
declare variable Ori integer;
declare variable Des integer;
declare variable Existe char(1);
declare variable VALFP char(2);
BEGIN
EXECUTE PROCEDURE LEE_CONFIGURACION('BANCOS','CONSIGNACIONES','VALIDAR FORMAS DE PAGO EN CAJA') RETURNING_VALUES (VALFP);
select pref_pre, trcj_numero, trcj_fecha, trcj_conc, caja_id, trcj_destino
    from traslados_caja where trcj_id = new.trcj_id
    into :pref, :num, :fec, :conc, :Ori, :Des;
if ((old.trcj_id <> 0) and (old.trcd_anulado = 'N')) then
  BEGIN
  /* 1. Borre lo viejo */
  /* 1.1 La caja origen */
  /* 1.1.1 Deshaga el mov. en la caja */
  if (exists(select moca_id from movimiento_caja where moca_tiporef = 66 and moca_idref = old.trcj_id and caja_id = :Ori)) then
    begin
    update movimiento_caja
        set moca_creditos = moca_creditos - old.trcd_monto
        where moca_tiporef = 66 and moca_idref = old.trcj_id and caja_id = :Ori;
    end
  /* 1.1.2 Borre la salida del documento en la caja origen */
  if (OLD.FOPA_ID <> 1) then
    UPDATE DOCUMENTOS_PAGO_CAJA
        SET DPCA_TIPOSAL = 0, DPCA_IDSAL = 0
        WHERE FOPA_ID = OLD.FOPA_ID AND DPCA_BANCO = OLD.TRCD_BANCO AND DPCA_CUENTA = OLD.TRCD_CUENTA AND
        DPCA_NUMERO = OLD.TRCD_NUMERO AND DPCA_TIPOSAL = 66 AND DPCA_IDSAL = old.trcj_id AND CAJA_ID = :ori AND DPCA_MONTO = OLD.trcd_monto;
  ELSE
    EXECUTE PROCEDURE RESTE_SALDO_EFECTIVO (:Ori, :Fec, OLD.TRCD_MONTO, 'S');
  /* 1.2 La caja destino */
  /* 1.2.1 Actualice el movimiento en caja destino */
  if (exists(select moca_id from movimiento_caja where moca_tiporef = 66 and moca_idref = old.trcj_id and caja_id = :Des)) then
    begin
    update movimiento_caja
        set moca_debitos = moca_debitos - old.trcd_monto
        where moca_tiporef = 66 and moca_idref = old.trcj_id and caja_id = :Des;
    end
  /* 1.2.2 Borre el doc. de pago */
  if (OLD.FOPA_ID <> 1) then
    delete from DOCUMENTOS_PAGO_CAJA
        WHERE FOPA_ID = OLD.FOPA_ID AND DPCA_BANCO = OLD.TRCD_BANCO AND DPCA_CUENTA = OLD.TRCD_CUENTA AND
        DPCA_NUMERO = OLD.TRCD_NUMERO AND DPCA_TIPOENT = 66 and DPCA_IDENT = old.TRCJ_ID AND DPCA_MONTO = OLD.trcd_monto;/* AND CAJA_ID = :DES;*/
  ELSE
    EXECUTE PROCEDURE SUME_SALDO_EFECTIVO (:Des, :Fec, OLD.TRCD_MONTO, 'S');
  END
if ((NEW.trcj_id <> 0) and (new.trcd_anulado = 'N')) then
    BEGIN
    /* PRIMERO LA SALIDA DEL ORIGEN */
    /* Actualice el movimiento en caja origen */
    if (exists(select moca_id from movimiento_caja where moca_tiporef = 66 and moca_idref = new.trcj_id and caja_id = :Ori)) then
        begin
        update movimiento_caja
            set moca_creditos = moca_creditos + new.trcd_monto
            where moca_tiporef = 66 and moca_idref = new.trcj_id and caja_id = :Ori;
        end
    else
        INSERT INTO MOVIMIENTO_CAJA
            (MOCA_ID, CAJA_ID, MOCA_TIPOREF, MOCA_PREFREF, MOCA_NUMREF, MOCA_FECHA, MOCA_CONC, MOCA_DEBITOS, MOCA_CREDITOS, MOCA_DB, MOCA_IDREF)
            VALUES(GEN_ID(ID_MOVCAJA,1), :Ori, 66, :Pref, :Num, :Fec, :Conc, 0, NEW.trcd_monto, 'N', new.trcj_id);
        
    /* Actualice la salida del documento en la caja origen */
    if (new.fopa_id <> 1) then
      BEGIN
      if (EXISTS(SELECT DPCA_ID FROM DOCUMENTOS_PAGO_CAJA WHERE FOPA_ID = NEW.FOPA_ID AND DPCA_BANCO = NEW.TRCD_BANCO AND DPCA_CUENTA = NEW.TRCD_CUENTA AND
        DPCA_NUMERO = NEW.TRCD_NUMERO AND DPCA_TIPOSAL = 0 AND DPCA_IDSAL = 0 AND CAJA_ID = :ORI)) then
        UPDATE DOCUMENTOS_PAGO_CAJA
            SET DPCA_TIPOSAL = 66, DPCA_IDSAL = NEW.TRCJ_ID
            WHERE FOPA_ID = NEW.FOPA_ID AND DPCA_BANCO = NEW.TRCD_BANCO AND DPCA_CUENTA = NEW.TRCD_CUENTA AND
            DPCA_NUMERO = NEW.TRCD_NUMERO AND DPCA_TIPOSAL = 0 AND DPCA_IDSAL = 0 AND CAJA_ID = :ORI AND DPCA_MONTO = NEW.trcd_monto;
      ELSE
        IF (VALFP = 'SI') THEN
          EXCEPTION documento_pago_salido 'La forma de pago ' || new.trcd_banco || ' ' || new.trcd_cuenta || ' ' || new.trcd_numero || ' no esta en la caja.';
      END
    else
        EXECUTE PROCEDURE RESTE_SALDO_EFECTIVO (:Ori, :Fec, NEW.TRCD_MONTO, 'N');
        
    /* AHORA EL INGRESO A LA CAJA DESTINO */
    /* Actualice el movimiento en caja destino */
    if (exists(select moca_id from movimiento_caja where moca_tiporef = 66 and moca_idref = new.trcj_id and caja_id = :Des)) then
        begin
        update movimiento_caja
            set moca_debitos = moca_debitos + new.trcd_monto
            where moca_tiporef = 66 and moca_idref = new.trcj_id and caja_id = :Des;
        end
    else
        INSERT INTO MOVIMIENTO_CAJA
            (MOCA_ID, CAJA_ID, MOCA_TIPOREF, MOCA_PREFREF, MOCA_NUMREF, MOCA_FECHA, MOCA_CONC, MOCA_DEBITOS, MOCA_CREDITOS, MOCA_DB, MOCA_IDREF)
            VALUES(GEN_ID(ID_MOVCAJA,1), :Des, 66, :Pref, :Num, :Fec, :Conc, NEW.trcd_monto, 0, 'S', new.trcj_id);
        
    /* Ingrese el doc. de pago */
    if (NEW.FOPA_ID <> 1) then
        INSERT INTO DOCUMENTOS_PAGO_CAJA (DPCA_ID, FOPA_ID, CAJA_ID, DPCA_BANCO, DPCA_CUENTA, DPCA_NUMERO, DPCA_FECHA, DPCA_MONTO, DPCA_TIPOENT, DPCA_IDENT, DPCA_TIPOSAL, DPCA_IDSAL)
            VALUES (GEN_ID(ID_DOCPAGOCAJA, 1), NEW.FOPA_ID, :Des, NEW.TRCD_BANCO, NEW.TRCD_CUENTA, NEW.TRCD_NUMERO, NEW.TRCD_FECHA, NEW.TRCD_MONTO, 66, NEW.TRCJ_ID, 0, 0);
    else
        EXECUTE PROCEDURE SUME_SALDO_EFECTIVO (:Des, :Fec, NEW.TRCD_MONTO, 'N');
    END
END^

SET TERM ; ^

/* 20131203 */
/* ASEGURECE QUE EL FACTOR DE CONVERSION SE GRABE CORRECTAMENTE */
SET TERM ^ ;

create or alter procedure FACTOR_UNIDAD_CANT_EXCEP (
    ARTICULO varchar(15),
    UNIDAD varchar(8))
returns (
    FACTOR numeric(18,4))
AS
DECLARE VARIABLE PPAL VARCHAR(8);
BEGIN
  FACTOR = 0;
  SELECT ARTI_UNIDAD FROM ARTICULO WHERE (ARTI_COD = :ARTICULO) INTO :PPAL;
  IF (PPAL = UNIDAD) THEN
    FACTOR = 1;
  ELSE
    SELECT UNAR_FACCAN FROM UNIDAD_ARTICULO
    WHERE (ARTI_COD = :ARTICULO) AND (UNAR_UNIDAD = :UNIDAD) INTO :FACTOR;
  if (FACTOR = 0) then
    BEGIN
    exception factor_no_encontrado 'No se encontro el factor de la unidad ' || :unidad || ' para el articulo ' || :articulo;
    END
  SUSPEND;
END^

SET TERM ; ^

grant execute on procedure factor_unidad_cant_excep to public;

SET TERM ^ ;

CREATE OR ALTER TRIGGER FACTURAS_DETALLE_BI FOR FACTURAS_DETALLE
ACTIVE BEFORE INSERT POSITION 0
AS
declare variable TRM numeric(18,2);
declare variable IVAINC CHAR(1);
declare variable DISCRENS CHAR(2);
declare variable FECHA DATE;
declare variable CODPR varchar(15);
declare variable DESPR varchar(60);
declare variable UNIPR varchar(8);
declare variable CANTPR double precision;
declare variable FACTOR numeric(18,4);
declare variable COSTO numeric(18,2);
declare variable IVAPR numeric(18,2);
declare variable IVAPRM numeric(18,2);
declare variable IVATOT numeric(18,2);
declare variable TOTALPR numeric(18,2);
declare variable CONSUMOPR numeric(18,2);
declare variable COSTOT numeric(18,2);
declare variable ITEM INTEGER;
declare variable ARTIC VARCHAR(20);
BEGIN
if (new.fade_cant is null) then
    new.fade_cant = 0;
if (new.fade_prunit is null) then
    new.fade_prunit = 0;
if (new.fade_dtoporc is null) then
    new.fade_dtoporc = 0;
if (new.fade_ivaporc is null) then
    new.fade_ivaporc = 0;
if (new.fade_ivamonto is null) then
    new.fade_ivamonto = 0;
if (new.fade_consumo is null) then
    new.fade_consumo = 0;
EXECUTE PROCEDURE factor_unidad_cant_excep(new.arti_cod, new.fade_unidad) returning_values (new.fade_factor);

SELECT FACT_FECHA FROM FACTURAS WHERE FACT_ID = NEW.fact_id INTO :FECHA;
/* CALCULE EL MONTO DEL DESCUENTO */
NEW.FADE_DTOMONTO = NEW.fade_prunit * NEW.fade_dtoporc / 100;
/* si estaba en otra moneda convierta a pesos */
select fact_trm, fact_ivainc from facturas where fact_id = new.fact_id into :trm, :ivainc;
if ((NEW.FADE_TOTAL IS NULL) or (NEW.fade_total = 0)) then
    BEGIN
    NEW.FADE_TOTAL = NEW.FADE_CANT * (NEW.FADE_PRUNIT - NEW.FADE_DTOMONTO);
    if (IVAINC = 'N') then
        NEW.FADE_TOTAL = NEW.fade_total + NEW.fade_ivamonto + NEW.fade_consumo;
    END
if (trm <> 1) then
    begin
    new.fade_prunit = new.fade_prunit * trm;
    new.fade_dtomonto = new.fade_dtomonto * trm;
    new.fade_ivamonto = new.fade_ivamonto * trm;
    new.fade_consumo = new.fade_consumo * trm;
    new.fade_dtom1 = new.fade_dtom1 * trm;
    new.fade_dtom2 = new.fade_dtom2 * trm;
    new.fade_dtom3 = new.fade_dtom3 * trm;
    new.fade_total = new.fade_total * trm;
    end
select taiv_cod from articulo where arti_cod = new.arti_cod into new.fade_tiva;

/* si es un ensamble automatico y la configuración lo indica desglocelo */
execute procedure lee_configuracion('FACTURACION', 'DOCUMENTOS', 'DISCRIMINAR COMPONENTES EN ENSAMBLES AUTOMATICOS FACTURADOS') returning_values (:discrens);
if (discrens = 'SI') then
    BEGIN
    if (exists (select arti_cod from articulo a where arti_cod = new.arti_cod and arti_ensamble = 'S')) then
        BEGIN
        /* EL COSTO TOTAL */
        COSTOT = 0;
        FOR SELECT ARPR_CANT, ARPR_UNIDAD, ARPR_COMP FROM articulos_producto WHERE ARTI_COD = NEW.arti_cod
            INTO :CANTPR, :UNIPR, :CODPR
            DO
            BEGIN
            EXECUTE PROCEDURE factor_unidad_cant(:codpr, :unipr) returning_values (:factor);
            EXECUTE PROCEDURE costo_promedio_unidad (:codpr, :fecha, :UNIPR) returning_values (:COSTO);
            COSTOT = COSTOT + (COSTO * CANTPR);
            END
        ITEM = NEW.fade_item * 200;
        /* DESGLOCE EL PRECIO COMPONENTE POR COMPONENTE */
        IVATOT = 0;
        FOR SELECT ARPR_CANT, ARPR_UNIDAD, ARPR_COMP, A.arti_des, T.taiv_porc, a.arti_consumo
            FROM articulos_producto P, ARTICULO A, TARIFA_IVA T
            WHERE P.ARTI_COD = NEW.arti_cod AND A.arti_cod = P.arpr_comp AND A.taiv_cod = T.taiv_cod
            INTO :CANTPR, :UNIPR, :CODPR, :despr, :IVAPR, :consumopr
            DO
            BEGIN
            EXECUTE PROCEDURE factor_unidad_cant(:codpr, :unipr) returning_values (:factor);
            EXECUTE PROCEDURE costo_promedio_unidad (:codpr, :fecha, :UNIPR) returning_values (:COSTO);
            if (COSTOT <> 0) then
                COSTO = (NEW.fade_prunit-NEW.fade_dtomonto) * COSTO / COSTOT;
            else
                COSTO = 0;
            ivaprm = costo * ivapr / 100;
            ivatot = ivatot + ivaprm;
            TOTALPR = CANTPR * COSTO;
            if (IVAINC = 'N') then
                TOTALPR = totalPR + ivaprm + consumopr;
            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, FADE_BASE, FADE_PORCBASE)
                VALUES (NEW.fact_id, :ITEM, NEW.bode_cod, :CODPR, :cantpr * NEW.fade_cant * NEW.fade_factor, :unipr, NULL,
                :COSTO, 0, 0, :ivapr, :ivaprm, :consumopr, :factor,
                :despr, NULL, :CODPR, 0, 0, :totalpr, NEW.lipr_cod, new.fade_item || '-' || new.arti_cod,
                'N', 'N', 0, 0, 0, 0, 0, 0, 0, NULL, 0, 0);
            ITEM = ITEM + 1;
            END
        /* DEJE EL ARTICULO ORIGINAL SIN PRECIO */
        NEW.fade_prunit = 0;
        NEW.fade_dtomonto = 0;
        NEW.fade_ivamonto = 0;
        NEW.fade_consumo = 0;
        NEW.fade_total = 0;
        END
    END
if ((NEW.fade_idpend <> 0) AND (NEW.fade_itempend <> 0)) then
    BEGIN
    /* valide que el articulo sea correcto */
    select arti_cod from pendiente_ventas_detalle p where p.pend_id = new.fade_idpend and p.pevd_item = new.fade_itempend into :artic;
    if (NEW.arti_cod = :ARTIC) then
        NEW.fade_remisionado = NEW.fade_cant * NEW.fade_factor;
    else    
        exception articulo_no_existe 'El artículo pendiente ' || :artic || ' no corresponde al artículo facturado ' || new.arti_cod || 'Id:' || new.fade_idpend || '-' || new.fade_itempend;
    END
END^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER TRIGGER REMISIONES_VENTA_DETALLE_BI FOR REMISIONES_VENTA_DETALLE
ACTIVE BEFORE INSERT POSITION 0
AS
BEGIN
EXECUTE PROCEDURE factor_unidad_cant_excep(new.arti_cod, new.rvde_unidad) returning_values (new.rvde_factor);
  /* CALCULE EL MONTO DEL DESCUENTO */
  NEW.rvde_dtomonto = NEW.rvde_prunit * NEW.rvde_dtoporc / 100;
  if (new.rvde_devuelto is null) then
    new.rvde_devuelto = 0;
END^

SET TERM ; ^

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 ; ^

SET TERM ^ ;

CREATE OR ALTER TRIGGER FACTCOMP_DETALLE_BI FOR FACTURAS_COMPRAS_DETALLE
ACTIVE BEFORE INSERT POSITION 0
AS
declare variable trm numeric(18,2);
BEGIN
  /* CALCULE EL MONTO DEL DESCUENTO */
  if (new.fcde_cant is null) then
    new.fcde_cant = 0;
  if (new.fcde_prunit is null) then
    new.fcde_prunit = 0;
  if (new.fcde_dtoporc is null) then
    new.fcde_dtoporc = 0;
  if (new.fcde_ivaporc is null) then
    new.fcde_ivaporc = 0;
  if (new.fcde_ivamonto is null) then
    new.fcde_ivamonto = 0;
  if (new.fcde_consumo is null) then
    new.fcde_consumo = 0;
  NEW.FCDE_DTOMONTO = NEW.fcde_prunit * NEW.fcde_dtoporc / 100;
EXECUTE PROCEDURE factor_unidad_cant_excep(new.arti_cod, new.fcde_unidad) returning_values (new.fcde_factor);
select taiv_cod from articulo where arti_cod = new.arti_cod into new.fcde_tiva;
/* si estaba en otra moneda convierta a pesos */
select faco_trm from facturas_compra where faco_id = new.faco_id into :trm;
if (trm <> 1) then
    begin
    new.fcde_prunit = new.fcde_prunit * trm;
    new.fcde_dtomonto = new.fcde_dtomonto * trm;
    new.fcde_ivamonto = new.fcde_ivamonto * trm;
    new.fcde_consumo = new.fcde_consumo * trm;
    new.fcde_total = new.fcde_total * trm;
    end
END^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER TRIGGER REMISION_PROVEEDOR_DET_BI FOR REMISION_PROVEEDOR_DET
ACTIVE BEFORE INSERT POSITION 0
as
begin
EXECUTE PROCEDURE factor_unidad_cant_excep(new.arti_cod, new.rpvd_unidad) returning_values (new.rpvd_factor);
NEW.rpvd_dtomonto = NEW.rpvd_prunit * NEW.rpvd_dtoporc / 100;
if (new.rpvd_devuelto is null) then
    new.rpvd_devuelto = 0;
end^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER TRIGGER DEVOLUCIONES_COMPRAS_DET_BI FOR DEVOLUCIONES_COMPRAS_DET
ACTIVE BEFORE INSERT POSITION 0
AS
declare variable trm numeric(18,2);
BEGIN
if (new.dvcd_dtoporc is null) then
    new.dvcd_dtoporc = 0;
EXECUTE PROCEDURE factor_unidad_cant_excep(new.arti_cod, new.dvcd_unidad) returning_values (new.dvcd_factor);
/* CALCULE EL MONTO DEL DESCUENTO */
NEW.DVCD_DTOMONTO = NEW.dvcd_prunit * NEW.dvcd_dtoporc / 100;
select taiv_cod from articulo where arti_cod = new.arti_cod into new.dvcd_tiva;

/* si estaba en otra moneda convierta a pesos */
select dvco_trm from devoluciones_compras where dvco_id = new.dvco_id into :trm;
if (trm <> 1) then
    begin
    new.dvcd_prunit = new.dvcd_prunit * trm;
    new.dvcd_dtomonto = new.dvcd_dtomonto * trm;
    new.dvcd_ivamonto = new.dvcd_ivamonto * trm;
    new.dvcd_consumo = new.dvcd_consumo * trm;
    new.dvcd_total = new.dvcd_total * trm;
    end
END^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER TRIGGER ENTRADAS_DETALLE_BI FOR ENTRADAS_DETALLE
ACTIVE BEFORE INSERT POSITION 0
as
begin
  if (new.ende_cant is null) then
    new.ende_cant = 0;
  if (new.ende_costo is null) then
    new.ende_costo = 0;
  if (new.ende_dtoporc is null) then
    new.ende_dtoporc = 0;
  if (new.ende_ivaporc is null) then
    new.ende_ivaporc = 0;
  if (new.ende_ivamonto is null) then
    new.ende_ivamonto = 0;
  if (new.ende_consumo is null) then
    new.ende_consumo = 0;
  EXECUTE PROCEDURE factor_unidad_cant_excep(new.arti_cod, new.ende_unidad) returning_values (new.ende_factor);
  NEW.ende_dtomonto = NEW.ende_costo * NEW.ende_dtoporc / 100;
end^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER TRIGGER SALIDAS_DETALLE_BI FOR SALIDAS_DETALLE
ACTIVE BEFORE INSERT POSITION 0
as
declare variable FEC DATE;
declare variable IVAINC CHAR(1);
declare variable ICOINC CHAR(2);
declare variable SUBT double precision;
begin
SELECT SALI_FECHA, SALI_IMPTOS FROM SALIDAS WHERE SALI_ID = NEW.sali_id INTO :FEC, :IVAINC;
EXECUTE PROCEDURE factor_unidad_cant_excep(new.arti_cod, new.sade_unidad) returning_values (new.sade_factor);
execute procedure costo_promedio_unidad (NEW.arti_cod, :fec,  NEW.sade_unidad) returning_values (NEW.sade_costo);
SUBT = NEW.sade_cant * NEW.sade_costo;
NEW.sade_ivamonto = :SUBT * NEW.sade_ivaporc / 100;
NEW.sade_total = :SUBT + NEW.sade_ivamonto;
EXECUTE PROCEDURE LEE_CONFIGURACION('FACTURACION','ARTICULOS','IMPOCONSUMO INCLUIDO EN EL PRECIO BASE DE VENTA ANTES DE IVA') returning_values (:ICOINC);
if (ICOINC = 'SI') then
    NEW.sade_total = NEW.sade_total + (NEW.sade_consumo * NEW.sade_cant * NEW.sade_factor);
if (IVAINC = 'S') then
    BEGIN
    NEW.sade_costo = NEW.sade_costo * (1 + NEW.sade_ivaporc / 100);
    if (ICOINC = 'SI') then
        NEW.sade_costo = NEW.sade_costo + NEW.sade_consumo;
    END
end^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER TRIGGER PEDIDOS_DETALLE_BI FOR PEDIDOS_DETALLE
ACTIVE BEFORE INSERT POSITION 0
AS
declare variable FACTOR NUMERIC(18,4);
BEGIN
  /* 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 ORDENES_COMPRA_DETALLE_BI FOR ORDENES_COMPRA_DETALLE
ACTIVE BEFORE INSERT POSITION 0
AS
declare variable FACTOR NUMERIC(18,4);
BEGIN
  /* CALCULE LO POR LIBERAR */
  EXECUTE PROCEDURE factor_unidad_cant_excep(NEW.ARTI_COD, NEW.ocde_unidad) returning_values (new.ocde_factor);
  NEW.ocde_ordenado = NEW.ocde_cant * new.ocde_factor;
  /* CALCULE EL MONTO DEL DESCUENTO */
  NEW.OCDE_DTOMONTO = NEW.ocde_prunit * NEW.ocde_dtoporc / 100;
END^

SET TERM ; ^

/* 20131203B */
/* EVITE ERROR MULTIPLE ROWS SI EL DOCUMENTO EN CAJA YA EXISTE */
SET TERM ^ ;

CREATE OR ALTER TRIGGER CONSIGNA_DETALLE_AI FOR CONSIGNA_DETALLE
ACTIVE AFTER INSERT POSITION 0
AS
declare variable Fec DATE;
declare variable Cuenta integer;
declare variable Conc VARCHAR(60);
declare variable Pref varchar(4);
declare variable Num varchar(8);
declare variable Existe char(1);
declare variable VALFP char(2);
BEGIN
EXECUTE PROCEDURE LEE_CONFIGURACION('BANCOS','CONSIGNACIONES','VALIDAR FORMAS DE PAGO EN CAJA') RETURNING_VALUES (VALFP);
if ((new.cons_id <> 0) AND (NEW.CODE_ANULADO = 'N')) then
  begin
  /* Actualice el total del movimiento del banco */
  select cons_fecha, cuba_cod, cons_concepto, prba_pref, cons_numero from consigna where cons_id = new.cons_id into :Fec, :Cuenta, :Conc, :Pref, :Num;
  if (EXISTS (select MOBA_ID from movimiento_banco where moba_tipodoc = 71 and moba_idref = new.cons_id)) then
    update movimiento_banco
      set moba_total = moba_total + new.code_monto
      where moba_tipodoc = 71 and moba_idref = new.cons_id;
  else
    INSERT INTO MOVIMIENTO_BANCO
        (MOBA_ID, CUBA_COD, MOBA_TIPODOC, MOBA_PREF, MOBA_NUMERO, MOBA_FECHA, MOBA_CONCEPTO, MOBA_TOTAL, MOBA_DB, MOBA_IDREF, MOBA_TIPOREF)
        VALUES(GEN_ID(ID_MOVBANCO,1), :Cuenta, 71, :Pref, :Num, :Fec, :Conc, NEW.code_monto, 'S', new.cons_id, 71);
  /* afecte la caja */
  select cons_fecha, cons_concepto, prba_pref, cons_numero from consigna
    where cons_id = new.cons_id into :Fec, :Conc, :Pref, :Num;
  if (exists (select MOCA_ID from movimiento_caja where moca_tiporef = 71 and moca_idref = new.cons_id and caja_id = new.caja_id)) then
    update movimiento_caja
      set moca_creditos = moca_creditos + new.code_monto
      where moca_tiporef = 71 and moca_idref = new.cons_id and caja_id = new.caja_id;
  else
    INSERT INTO MOVIMIENTO_CAJA
        (MOCA_ID, CAJA_ID, MOCA_TIPOREF, MOCA_PREFREF, MOCA_NUMREF, MOCA_FECHA, MOCA_CONC, MOCA_DEBITOS, MOCA_CREDITOS, MOCA_DB, MOCA_IDREF)
        VALUES(GEN_ID(ID_MOVCAJA,1), NEW.CAJA_ID, 71, :Pref, :Num, :Fec, :Conc, 0, NEW.code_monto, 'N', new.cons_id);

  /* ACTUALICE LA SALIDA DEL DOCUMENTO DE PAGO */
  if (NEW.FOPA_ID <> 1) then
      BEGIN
      if (exists (SELECT DPCA_ID FROM DOCUMENTOS_PAGO_CAJA WHERE caja_id = NEW.caja_id AND FOPA_ID = NEW.FOPA_ID AND DPCA_BANCO = NEW.CODE_BANCO AND
        DPCA_CUENTA = NEW.CODE_CUENTA AND DPCA_NUMERO = NEW.CODE_NUMERO AND DPCA_TIPOSAL = 0 AND DPCA_IDSAL = 0)) then
        UPDATE DOCUMENTOS_PAGO_CAJA
          SET DPCA_TIPOSAL = 71, DPCA_IDSAL = NEW.cons_id
          WHERE caja_id = NEW.caja_id AND FOPA_ID = NEW.FOPA_ID AND DPCA_BANCO = NEW.CODE_BANCO AND DPCA_CUENTA = NEW.CODE_CUENTA AND
          DPCA_NUMERO = NEW.CODE_NUMERO AND DPCA_TIPOSAL = 0 AND DPCA_IDSAL = 0 AND DPCA_MONTO = NEW.code_monto;
      ELSE
        IF (VALFP = 'SI') THEN
          EXCEPTION documento_pago_salido 'No se encontró la forma de pago ' || new.code_banco || ' ' || new.code_cuenta || ' ' || new.code_numero || ' en la caja.';
      END
  ELSE
      EXECUTE PROCEDURE RESTE_SALDO_EFECTIVO(NEW.CAJA_ID, :FEC, NEW.CODE_MONTO, 'N');
  end
END^

SET TERM ; ^

/* 20131204 */
/* CIERRE DE FACTURACION CON EL PREFIJO DE LA AUTORIZACION POR SI EL PREFIJO DEL RECIBO NO ES IGUAL A LA FACTURA */
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),
    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 r_iddoc integer;
declare variable f_id integer;
declare variable f_total numeric(18,2);
declare variable factor numeric(18,4);
declare variable ajuste integer;
declare variable PREFRDC VARCHAR(4);
begin
AJUSTE = 0;
if (PREFIJO <> '') then
  SELECT PREF_PRE, AUTO_NUMERO, AUTO_PREFRDC FROM AUTORIZACIONES WHERE PREF_PRE = :PREFIJO INTO :PREF, :autoriza, :prefrdc;
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 */
  SELECT 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 = 1 and RECA_ANULADO = 'N'
    INTO :FORMAP1;
  SELECT 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 = 2 and RECA_ANULADO = 'N'
    INTO :FORMAP2;
  SELECT 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 = 3 and RECA_ANULADO = 'N'
    INTO :FORMAP3;
  SELECT 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 = 4 and RECA_ANULADO = 'N'
    INTO :FORMAP4;
  SELECT 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 = 5 and RECA_ANULADO = 'N'
    INTO :FORMAP5;
  SELECT 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 = 6 and RECA_ANULADO = 'N'
    INTO :FORMAP6;
  SELECT 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 = 7 and RECA_ANULADO = 'N'
    INTO :FORMAP7;
  SELECT 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 = 8 and RECA_ANULADO = 'N'
    INTO :FORMAP8;
  SELECT 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 = 9 and RECA_ANULADO = 'N'
    INTO :FORMAP9;
  SELECT 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 = 10 and RECA_ANULADO = 'N'
    INTO :FORMAP10;
  SELECT 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 = 11 and RECA_ANULADO = 'N'
    INTO :FORMAP11;
  SELECT 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 = 12 and RECA_ANULADO = 'N'
    INTO :FORMAP12;

  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 (formap1 is null) then
    formap1 = 0;
  if (formap2 is null) then
    formap2 = 0;
  if (formap3 is null) then
    formap3 = 0;
  if (formap4 is null) then
    formap4 = 0;
  if (formap5 is null) then
    formap5 = 0;
  if (formap6 is null) then
    formap6 = 0;
  if (formap7 is null) then
    formap7 = 0;
  if (formap8 is null) then
    formap8 = 0;
  if (formap9 is null) then
    formap9 = 0;
  if (formap10 is null) then
    formap10 = 0;
  if (formap11 is null) then
    formap11 = 0;
  if (formap12 is null) then
    formap12 = 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;
        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 ; ^

/* 20131204B */
/* NO INTENTE ARREGLAR EL LOTE CUANDO NO EXISTA, DE LA EXCEPCION  */
SET TERM ^ ;

CREATE OR ALTER procedure CHEQUEO_INVENTARIO_FECHA (
    ARTINI varchar(20),
    ARTFIN varchar(20),
    FECINI date)
AS
DECLARE VARIABLE FECHA DATE;
DECLARE VARIABLE CANT NUMERIC(15,4);
DECLARE VARIABLE COSTO NUMERIC(18,2);
DECLARE VARIABLE ENTRADA CHAR(1);
DECLARE VARIABLE BODEGA CHAR(2);
DECLARE VARIABLE ID INTEGER;
DECLARE VARIABLE TIPO INTEGER;
declare variable TIPOEX CHAR(1);
DECLARE VARIABLE LOTE VARCHAR(20);
declare variable ARTICULO VARCHAR(20);
declare variable IDL INTEGER;
declare variable IDDOC INTEGER;
declare variable CANTTOT varchar(2);
declare variable comp varchar(20);
declare variable cantcomp numeric(18,2);
declare variable coscomp numeric(18,2);
BEGIN
execute procedure LEE_CONFIGURACION ('INVENTARIO', 'ENSAMBLES', 'FORMACIONES CON CANTIDADES TOTALES') returning_values (CANTTOT);
for select arti_cod, ARTI_EXIST from articulo where arti_cod >= :artini and arti_cod <= :artfin into :ARTICULO, :TIPOEX
  DO
  BEGIN
  DELETE FROM existencia_lote where arti_cod = :articulo AND EXLO_FECHA >= :FECINI;
  DELETE FROM lotes where arti_cod = :articulo AND LOTE_FECHA >= :FECINI;
  delete from costos where arti_cod = :ARTICULO AND COST_FECHA >= :FECINI;
  delete from existencia WHERE ARTI_COD = :ARTICULO AND EXIS_FECHA >= :FECINI;
  for select mvar_cons, mvar_fecha, mvar_cant, mvar_costo, mvar_entrada, bode_cod, mvar_tipodoc, mvar_lote, MVAR_IDREF
    from movimiento_articulo WHERE ARTI_COD = :ARTICULO AND MVAR_FECHA >= :FECINI
    order by arti_cod, mvar_fecha, mvar_cons
    into :id, :fecha, :cant, :costo, :entrada, :bodega, :tipo, :lote, :iddoc
  do
    begin
    if ((TIPO <> 13)) then
        BEGIN
        if (TIPO = 33) then
            BEGIN
            execute procedure costo_promedio(:articulo, :FECHA) returning_values (:COSTO);
            UPDATE MOVIMIENTO_ARTICULO SET MVAR_COSTO = :costo WHERE arti_cod = :articulo and MVAR_cons = :id;
            END
        if ((TIPO = 15) AND (ENTRADA = 'S')) Then
            begin
            costo = 0;
            for select arti_cod, esde_cant * esde_factor from ensambles_detalle where ensa_id = :iddoc
                into :comp, :cantcomp
                do
                begin
                execute procedure costo_promedio(:comp, :FECHA) returning_values (:coscomp);
                costo = costo + (coscomp * cantcomp);
                end
            if ((canttot = 'SI') AND (CANT <> 0)) then
                COSTO = COSTO / CANT;
            UPDATE MOVIMIENTO_ARTICULO SET MVAR_COSTO = :costo WHERE arti_cod = :articulo and MVAR_cons = :id;
            end
        EXECUTE PROCEDURE actualice_costo(:ARTICULO, :fecha, :costo, :cant, :entrada, 'N', :id, :tipo);
        END
    /* actualice existencias */
    if (:entrada = 'S') then
        begin
        execute procedure sume_existencia(:articulo, :bodega, :fecha, :cant, 'N');
        if (TIPOEX = 'L') then
            begin
            if (EXISTS (SELECT LOTE_NRO FROM LOTES WHERE ARTI_COD = :ARTICULO AND BODE_COD = :BODEGA AND LOTE_NRO = :lote)) then
                UPDATE LOTES
                    set lote_saldo = lote_saldo + :cant
                    where (arti_cod = :ARTICULO) and (BODE_COD = :BODEGA) AND (lote_nro = :lote);
            ELSE
                INSERT INTO LOTES (ARTI_COD, BODE_COD, LOTE_NRO, LOTE_FECHA, LOTE_CANT, LOTE_COSTO, LOTE_SALDO)
                    VALUES (:ARTICULO, :bodega, :lote, :fecha, :cant, :costo, :cant);
            if (EXISTS (SELECT LOTE_NRO FROM EXISTENCIA_LOTE WHERE LOTE_NRO = :LOTE AND EXLO_FECHA = :FECHA AND ARTI_COD = :articulo AND BODE_COD = :bodega)) then
                BEGIN
                UPDATE EXISTENCIA_LOTE
                    SET EXLO_ENT = EXLO_ENT + :cant
                    WHERE LOTE_NRO = :LOTE AND EXLO_FECHA = :FECHA AND ARTI_COD = :articulo AND BODE_COD = :bodega;
                END
            ELSE
                BEGIN
                INSERT INTO EXISTENCIA_LOTE (ARTI_COD, BODE_COD, LOTE_NRO, EXLO_FECHA, EXLO_SAL, EXLO_ENT)
                    VALUES (:articulo, :bodega, :LOTE, :FECHA, 0, :CANT);
                END
            end
        end
    else
        begin
        execute procedure reste_existencia(:articulo, :bodega, :fecha, :cant, 'N');
        if (TIPOEX = 'L') then
            begin
            if (EXISTS (SELECT LOTE_NRO FROM LOTES WHERE ARTI_COD = :ARTICULO AND BODE_COD = :BODEGA AND LOTE_NRO = :lote)) then
                UPDATE LOTES
                    set lote_saldo = lote_saldo - :cant
                    where (arti_cod = :ARTICULO) AND (BODE_COD = :BODEGA) and (lote_nro = :lote);
            ELSE
                BEGIN
                /* ARREGLE EL LOTE YA QUE NO EXISTE
                SELECT MIN(LOTE_ID) FROM LOTES WHERE ARTI_COD = :articulo AND BODE_COD = :BODEGA AND LOTE_SALDO >= :cant INTO :IDL;
                SELECT LOTE_NRO FROM LOTES WHERE LOTE_ID = :IDL INTO :LOTE;
                UPDATE MOVIMIENTO_ARTICULO SET MVAR_LOTE = :LOTE WHERE ARTI_COD = :ARTICULO AND MVAR_CONS = :ID;
                UPDATE LOTES
                    set lote_saldo = lote_saldo - :cant
                    where (arti_cod = :ARTICULO) and (BODE_COD = :BODEGA) AND (lote_nro = :lote);*/
                exception lote_no_existe 'No se encontro el lote ' || :lote || ' para el articulo ' || :articulo || ' en la bodega ' || :bodega;
                END
            if (EXISTS (SELECT EXLO_FECHA FROM EXISTENCIA_LOTE WHERE LOTE_NRO = :LOTE AND EXLO_FECHA = :FECHA
                AND ARTI_COD = :ARTICULO AND BODE_COD = :bodega)) then
                UPDATE EXISTENCIA_LOTE
                       SET EXLO_SAL = EXLO_SAL + :cant
                    WHERE LOTE_NRO = :LOTE AND EXLO_FECHA = :FECHA AND ARTI_COD = :ARTICULO AND BODE_COD = :bodega;
            else
                INSERT INTO EXISTENCIA_LOTE (ARTI_COD, BODE_COD, LOTE_NRO, EXLO_FECHA, EXLO_SAL, EXLO_ENT)
                    VALUES (:ARTICULO, :BODEGA, :LOTE, :FECHA, :CANT, 0);
            end
        end
    END
  INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
    VALUES (USER, 141, 1, 'I', :ARTICULO);
  END
END^

SET TERM ; ^

/* 20131219 */
/* APLIQUE REDONDEO POR ITEM Y EN TOTALES */
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,
    FECINI date,
    FECFIN date,
    MORA numeric(9,4))
returns (
    PREFIJO varchar(4),
    NUMERO varchar(8),
    NIT varchar(20),
    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.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 S.clcu_cod = '01' AND
        C.vend_cod >= :vendini AND C.vend_cod <= :vendfin AND ((c.grca_cod is null and :grpini = 0 ) or (C.grca_cod >= :grpini AND C.grca_cod <= :grpfin)) AND
        ((c.zona_cod is null and :zonini = '') or (C.zona_cod >= :zonini AND C.zona_cod <= :zonfin))
    INTO :NIT, :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_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', 'N', :TOTAL, :BOD, :OBS, NULL, NULL, 0, USER, '01', '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 CLIE_VALORMES FROM CLIENTES WHERE TERC_NIT = :NIT 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, NULL, '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 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 ; ^

/* 20131226 */
/* no haga nada si cambia el manifiesto. aclare el mensaje de abono */
SET TERM ^ ;

CREATE OR ALTER TRIGGER CARGA_REMESA_AU FOR CARGA_REMESA
ACTIVE AFTER UPDATE POSITION 0
as
declare variable ABONOS integer;
declare variable CONC VARCHAR(60);
declare variable CONSEC INTEGER;
declare variable NUMRDC VARCHAR(12);
begin
if (new.cgrm_manif = old.cgrm_manif) then
    begin
    if (NEW.cgrm_anulado <> OLD.cgrm_anulado) then
        begin
        if (NEW.cgrm_anulado = 'S') then
            BEGIN
            select enco_consec from comprobante_encabezado where enco_tiporef = old.tido_cod and enco_idref = old.cgrm_id into :consec;
            if (NOT consec is null) then
              delete from comprobante_detalle where enco_consec = :consec;
            delete from comprobante_encabezado where enco_tiporef = old.tido_cod and enco_idref = old.cgrm_id;
            INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
                VALUES (USER, NEW.tido_cod, NEW.cgrm_id, 'A', NEW.cgrm_pref || NEW.cgrm_numero);
            END
        end
    else
        INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
            VALUES (USER, NEW.tido_cod, NEW.cgrm_id, 'U', NEW.cgrm_pref || NEW.cgrm_numero);

    if (OLD.cgrm_manif <> NEW.cgrm_manif) then
        BEGIN
        if ((OLD.cgrm_id <> 0) AND (OLD.cgrm_anulado = 'N')) then
            BEGIN
            if (OLD.cgrm_fpago = 'R') then
                BEGIN
                select COUNT(*) FROM SALDOS_DOC_CARTERA WHERE SDCA_TIPOREF = old.tido_cod AND SDCA_IDREF = OLD.cgrm_id AND SDCA_ABONO <> 0 INTO :ABONOS;
                if (ABONOS = 0) then
                    BEGIN
                    /* BORRE EL REGISTRO PREVIO */
                    delete from saldos_doc_cartera where sdca_tiporef = old.tido_cod and sdca_idref = old.cgrm_id;
                    delete from movimiento_clientes where (mvcl_tiporef = old.tido_cod) and (mvcl_idref = old.cgrm_id);
                    END
                else
                    BEGIN
                    NUMRDC = NULL;
                    SELECT FIRST 1 PREF_PRE || RECA_NUMERO FROM recibos_caja R, recibos_caja_detalle D
                        WHERE R.reca_id = D.reca_id AND D.rcde_tipodoc = 85 AND D.rcde_iddoc = OLD.cgrm_id AND D.rcde_anulado = 'N'
                        INTO :NUMRDC;
                    if (NUMRDC IS NULL) then
                        exception DOCUMENTO_CON_ABONOS;
                    else
                        exception DOCUMENTO_CON_ABONOS 'La remesa ya fue abonada con el recibo ' || :numrdc || ' anule antes el recibo.';
                    END
                END
            if ((OLD.cgrm_fpago = 'C') AND (OLD.cgrm_caja <> 0) AND (OLD.cgrm_caja IS NOT NULL)) then
                BEGIN
                DELETE FROM MOVIMIENTO_CAJA WHERE moca_tiporef = old.tido_cod and moca_idref = OLD.cgrm_id;
                EXECUTE PROCEDURE SUME_SALDO_EFECTIVO (OLD.cgrm_caja, OLD.cgrm_fecha, OLD.cgrm_total, 'S');
                END
            END
        IF ((NEW.cgrm_id <> 0) AND (NEW.cgrm_anulado = 'N')) THEN
          BEGIN
          /* AFECTE LA CAJA O LA CARTERA */
          if ((NEW.cgrm_fpago = 'C') AND (NEW.cgrm_caja <> 0) AND (NEW.cgrm_caja IS NOT NULL)) then
            BEGIN
            CONC = 'REMESA No. ' || NEW.cgrm_pref || NEW.cgrm_numero;
            INSERT INTO MOVIMIENTO_CAJA
                (MOCA_ID, CAJA_ID, MOCA_TIPOREF, MOCA_PREFREF, MOCA_NUMREF, MOCA_FECHA, MOCA_CONC, MOCA_DEBITOS, MOCA_CREDITOS, MOCA_DB, MOCA_IDREF)
                VALUES(GEN_ID(id_movcaja,1), NEW.cgrm_caja, new.tido_cod, NEW.cgrm_pref, NEW.cgrm_numero, NEW.cgrm_fecha, :Conc, NEW.cgrm_total, 0, 'S', new.cgrm_id);
            EXECUTE PROCEDURE SUME_SALDO_EFECTIVO (NEW.cgrm_caja, NEW.cgrm_fecha, NEW.cgrm_total, 'N');
            END
          if (NEW.cgrm_fpago = 'R') then
            BEGIN
            /* 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_ABONO, SDCA_ABRTFTE, SDCA_ABRTIVA, SDCA_ABRTICA, SDCA_DEBITO, SDCA_MONTO)
                VALUES (new.tido_cod, NEW.cgrm_id, NEW.cgrm_fecha, NEW.cgrm_nit, 0, 0, 0, 0, 0, 0, 0, 'S', NEW.cgrm_total);
            /* Registre el movimiento del cliente */
            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_DEBITO, MVCL_ABONO, MVCL_PREFREF, MVCL_NUMREF, mvcl_sucursal, COBR_COD)
              VALUES (GEN_ID(ID_MOVCLI, 1), NEW.cgrm_nit, new.tido_cod, NEW.cgrm_id, NEW.cgrm_fecha, NEW.cgrm_fecha, :CONC, NEW.cgrm_total, 0, 0, 0, 'S', 'N', NEW.cgrm_pref, NEW.cgrm_numero, '01', NEW.cgrm_vend);
            END
          END
        END
    end
end^

SET TERM ; ^

/* 20140108 */
/* EN CUENTAS ADICIONALES NO DIVIDIA POR 100 AL CALCULAR CON PORCENTAJE */
SET TERM ^ ;

CREATE OR 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_CTAIVAV), 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_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(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 ERROR (33, :IDDOC, :PREF, 1);
    ERROR = ERROR + 1;
    VER = 'S';
    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 ; ^

/* 20140108C */
/* EN FALTANTES INTENTE LA RELACION AL REVES PARA DESCARTAR CUANDO SE HACE EL PROCEDIMIENTO AL REVES */
SET TERM ^ ;

CREATE OR ALTER procedure FALTANTE (
    TIPORI integer,
    TIPDES integer,
    IDDOC integer,
    ITEM integer)
returns (
    CANT numeric(18,4),
    UNIDAD varchar(8),
    FACTOR numeric(18,4))
AS
declare variable CANTAUX NUMERIC(18,4);
declare variable PEDAUTO CHAR(2);
declare variable ARTIC VARCHAR(20);
declare variable CODOMITE VARCHAR(20);
declare variable pref varchar(4);
declare variable num varchar(8);
begin
/* BUSQUE EL DOCUMENTO Y RECORRA LOS ITEMS */
EXECUTE PROCEDURE LEE_CONFIGURACION('FACTURACION', 'DOCUMENTOS', 'CODIGO DE ARTICULO A OMITIR EN LA CONSOLIDACION DE PENDIENTES') returning_values (:codomite);
if (TIPORI = 21) then
    BEGIN
    SELECT ARTI_COD, ((FCDE_CANT * FCDE_FACTOR) - FCDE_DEVUELTO) / FCDE_FACTOR, FCDE_FACTOR, FCDE_UNIDAD FROM FACTURAS_COMPRAS_DETALLE
        WHERE FACO_ID = :IDDOC AND FCDE_ITEM = :ITEM AND FCDE_ANULADO = 'N' INTO :ARTIC, :CANT, :FACTOR, :UNIDAD;
    END
if (TIPORI = 22) then
    BEGIN
    SELECT ARTI_COD, ((RPVD_CANT * RPVD_FACTOR) - RPVD_DEVUELTO) / RPVD_FACTOR, RPVD_FACTOR, RPVD_UNIDAD FROM remision_proveedor_det
        WHERE REPR_ID = :IDDOC AND RPVD_ITEM = :ITEM AND RPVD_ANULADO = 'N' INTO :ARTIC, :CANT, :FACTOR, :UNIDAD;
    END
if (TIPORI = 23) then
    BEGIN
    SELECT ARTI_COD, OCDE_CANT, OCDE_FACTOR, OCDE_UNIDAD FROM ORDENES_COMPRA_DETALLE
        WHERE ORDC_ID = :IDDOC AND OCDE_ITEM = :ITEM AND OCDE_ANULADO = 'N'  INTO :ARTIC, :CANT, :FACTOR, :UNIDAD;
    END
if (TIPORI = 25) then
    BEGIN
    SELECT ARTI_COD, CPRD_CANT, CPRD_FACTOR, CPRD_UNIDAD FROM COTIZACIONES_PROVEEDOR_DET
        WHERE COPR_ID = :IDDOC AND CPRD_ITEM = :ITEM AND CPRD_ANULADO = 'N' INTO :ARTIC, :CANT, :FACTOR, :UNIDAD;
    END
if (TIPORI = 31) then
    BEGIN
    SELECT ARTI_COD, ((FADE_CANT * FADE_FACTOR)-FADE_DEVUELTO) / FADE_FACTOR, FADE_FACTOR, FADE_UNIDAD
        FROM FACTURAS_DETALLE WHERE FACT_ID = :IDDOC AND FADE_ITEM = :ITEM AND FADE_ANULADO = 'N'
        INTO :ARTIC, :CANT, :FACTOR, :UNIDAD;
    END
if (TIPORI = 32) then
    BEGIN
    SELECT ARTI_COD, ((RVDE_CANT * RVDE_FACTOR)-RVDE_DEVUELTO) / RVDE_FACTOR, RVDE_FACTOR, RVDE_UNIDAD
        FROM remisiones_venta_detalle WHERE REVT_ID = :IDDOC AND RVDE_ITEM = :ITEM AND RVDE_ANULADO = 'N'
        INTO :ARTIC, :CANT, :FACTOR, :UNIDAD;
    END
if (TIPORI = 34) then
    BEGIN
    SELECT ARTI_COD, ((PEDE_CANT * PEDE_FACTOR)-PEDE_DEVUELTO) / PEDE_FACTOR, PEDE_FACTOR, PEDE_UNIDAD FROM PEDIDOS_DETALLE
        WHERE PEDI_ID = :IDDOC AND PEDE_ITEM = :ITEM AND PEDE_ANULADO = 'N' INTO :ARTIC, :CANT, :FACTOR, :UNIDAD;
    EXECUTE PROCEDURE LEE_CONFIGURACION('FACTURACION', 'FACTURAS', 'GENERAR PEDIDO AUTOMATICAMENTE CON LA FACTURA') returning_values (pedauto);
    if ((PEDAUTO = 'SI') and (ARTIC <> :codomite)) then
        begin
        /* RESTE LAS DEVOLUCIONES DE LA FACTURA ORIGINAL */
        select pref_pre, '00' || pedi_numero from pedidos where pedi_id = :iddoc into :pref, :num;
        SELECT SUM(FADE_DEVUELTO) FROM FACTURAS_DETALLE D, FACTURAS F
            WHERE pref_pre = :pref AND fact_numero = :num AND D.fact_id = F.fact_id AND D.fade_item = :item AND FACT_ANULADO = 'N'
            INTO :cantaux;
        if (cantaux > 0) then
            CANT = (CANT * FACTOR - CANTAUX) / FACTOR;
        end
    END
if (TIPORI = 35) then
    BEGIN
    SELECT ARTI_COD, CTDE_CANT, CTDE_FACTOR, CTDE_UNIDAD FROM COTIZACIONES_DETALLE
        WHERE COTI_ID = :IDDOC AND CTDE_ITEM = :ITEM AND CTDE_ANULADO = 'N' INTO :ARTIC, :CANT, :FACTOR, :UNIDAD;
    END
if (TIPORI = 40) then
    BEGIN
    SELECT ARTI_COD, PEVD_CANT, PEVD_FACTOR, PEVD_UNIDAD FROM pendiente_ventas_detalle
        WHERE PEND_ID = :IDDOC AND PEVD_ITEM = :ITEM AND PEVD_ANULADO = 'N' INTO :ARTIC, :CANT, :FACTOR, :UNIDAD;
    END
if (TIPORI = 139) then
    BEGIN
    SELECT ARTI_COD, SLDE_CANT, SLDE_FACTOR, SLDE_UNIDAD FROM solicitud_importacion_det
        WHERE SLIM_ID = :IDDOC AND SLDE_ITEM = :ITEM AND SLDE_ANULADO = 'N' INTO :ARTIC, :CANT, :FACTOR, :UNIDAD;
    END

if (CANT IS NULL) then
    CANT = 0;
if (ARTIC <> codomite) then
    BEGIN
    /* RECORRA LOS USOS EN CONSOLIDE_DOCS */
    select sum(COFA_CANTCR) from consolidado_faltantes
        where COFA_TIPOORI = :tipori and COFA_IDORI = :IDDOC and COFA_ITEMORI = :ITEM and COFA_TIPODES = :TIPDES
        into :cantaux;
    if (CANTAUX is null) then
        CANTAUX = 0;
    if (CANTAUX > (CANT * FACTOR)) then
        CANT = 0;
    else
        CANT = ((CANT * FACTOR) - CANTAUX) / FACTOR;

    if (CANTAUX = 0 ) then
        BEGIN
        /* INTENTELO AL REVES POR SI EL PROCEDIMIENTO DEL CLIENTE ES INVERSO */
        select sum(COFA_CANTCR) from consolidado_faltantes
            where COFA_TIPODES = :tipori and COFA_IDDES = :IDDOC and ARTI_COD = :artic and COFA_TIPOORI = :TIPDES
            into :cantaux;
        if (CANTAUX is null) then
            CANTAUX = 0;
        if (CANTAUX > (CANT * FACTOR)) then
            CANT = 0;
        else
            CANT = ((CANT * FACTOR) - CANTAUX) / FACTOR;
        END
    END
ELSE
    CANT = 0;
suspend;
end^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE CONSOLIDE_PENDIENTES(
    IDCONS INTEGER)
AS
declare variable TIPDES INTEGER;
declare variable TIPORI INTEGER;
declare variable IDORI INTEGER;
declare variable ITEM INTEGER;
declare variable ARTI VARCHAR(20);
declare variable CANT NUMERIC(18,4);
declare variable ITCONS INTEGER;
declare variable CODBAR VARCHAR(20);
declare variable UNIDAD VARCHAR(8);
declare variable LOTE VARCHAR(15);
declare variable LOTE_VENCE DATE;
declare variable FACTOR NUMERIC(18,4);
declare variable PRUNIT NUMERIC(18,2);
declare variable DESCITE VARCHAR(255);
declare variable BOD VARCHAR(2);
declare variable DTO NUMERIC(9,4);
declare variable LISTA INTEGER;
declare variable OBS BLOB SUB_TYPE 1 SEGMENT SIZE 8192;
declare variable REF VARCHAR(60);
begin
ITCONS = 1;
/* DADOS LOS IDS DE LOS DOCUMENTOS EN LA TABLA CONSOLIDE GENERE EL CONSOLIDADO */
FOR SELECT CEFA_TIPODES, CEFA_TIPOORI, CEFA_IDORI FROM consolide_faltantes
    WHERE CEFA_ID = :idcons ORDER BY CEFA_ITEM INTO :TIPDES, :TIPORI, :IDORI do
    BEGIN
    if (TIPORI = 21) then
        BEGIN
        FOR SELECT FCDE_ITEM, ARTI_COD, FCDE_CODBAR, FCDE_PRUNIT, FCDE_DESC, BODE_COD, FCDE_DTOPORC, FCDE_LOTE, LOTE_VENCE, FCDE_OBS, FCDE_REFERENCIA
            FROM FACTURAS_COMPRAS_DETALLE
            WHERE FACO_ID = :IDORI ORDER BY FCDE_ITEM INTO :ITEM, :ARTI, :CODBAR, :PRUNIT, :DESCITE, :BOD, :DTO, :LOTE, :LOTE_VENCE, :OBS, :REF
            DO
            BEGIN
            if (((CODBAR IS NULL) or (CODBAR = '')) AND (ARTI <> '')) then
                CODBAR = ARTI;
            EXECUTE PROCEDURE faltante(:TIPORI, :TIPDES, :IDORI, :ITEM) returning_values (:CANT, :UNIDAD, :FACTOR);
            if (CANT > 0) then
                BEGIN
                INSERT INTO CONSOLIDADO_FALTANTES (COFA_ID, COFA_ITEM, COFA_TIPODES, COFA_TIPOORI, COFA_IDORI, COFA_ITEMORI, ARTI_COD, COFA_CANT, COFA_CODBAR, COFA_UNIDAD, COFA_FACTOR, COFA_OK, COFA_PRUNIT, COFA_DESCITE, COFA_BODEGA, COFA_DTOITE, COFA_LOTE, LOTE_VENCE, CODE_OBSIT, CODE_REF)
                    VALUES (:IDCONS, :ITCONS, :tipdes,  :tipori, :idori, :item, :arti, :cant, :CODBAR, :UNIDAD, :FACTOR, 'N', :PRUNIT, :DESCITE, :BOD, :DTO, :LOTE, :LOTE_VENCE, :OBS, :REF);
                ITCONS = ITCONS + 1;
                END
            END
        END
    if (TIPORI = 22) then
        BEGIN
        FOR SELECT RPVD_ITEM, ARTI_COD, RPVD_CODBAR, RPVD_PRUNIT, RPVD_DESC, BODE_COD, RPVD_DTOPORC, RPVD_LOTE, LOTE_VENCE, RPVD_OBS
            FROM remision_proveedor_det
            WHERE REPR_ID = :IDORI ORDER BY RPVD_ITEM INTO :ITEM, :ARTI, :CODBAR, :PRUNIT, :DESCITE, :BOD, :DTO, :LOTE, :LOTE_VENCE, :OBS
            DO
            BEGIN
            if (((CODBAR IS NULL) or (CODBAR = '')) AND (ARTI <> '')) then
                CODBAR = ARTI;
            EXECUTE PROCEDURE faltante(:TIPORI, :TIPDES, :IDORI, :ITEM) returning_values (:CANT, :UNIDAD, :FACTOR);
            if (CANT > 0) then
                BEGIN
                INSERT INTO CONSOLIDADO_FALTANTES (COFA_ID, COFA_ITEM, COFA_TIPODES, COFA_TIPOORI, COFA_IDORI, COFA_ITEMORI, ARTI_COD, COFA_CANT, COFA_CODBAR, COFA_UNIDAD, COFA_FACTOR, COFA_OK, COFA_PRUNIT, COFA_DESCITE, COFA_BODEGA, COFA_DTOITE, COFA_LOTE, LOTE_VENCE, CODE_OBSIT)
                    VALUES (:IDCONS, :ITCONS, :tipdes,  :tipori, :idori, :item, :arti, :cant, :CODBAR, :UNIDAD, :FACTOR, 'N', :PRUNIT, :descite, :BOD, :DTO, :LOTE, :LOTE_VENCE, :OBS);
                ITCONS = ITCONS + 1;
                END
            END
        END
    if (TIPORI = 23) then
        BEGIN
        FOR SELECT OCDE_ITEM, ARTI_COD, OCDE_CODBAR, OCDE_PRUNIT, OCDE_DESC, BODE_COD, OCDE_DTOPORC, NULL, CAST('NOW' AS DATE), OCDE_OBS
            FROM ORDENES_COMPRA_DETALLE
            WHERE ORDC_ID = :IDORI ORDER BY OCDE_ITEM INTO :ITEM, :ARTI, :CODBAR, :PRUNIT, :DESCITE, :BOD, :DTO, :LOTE, :LOTE_VENCE, :OBS
            DO
            BEGIN
            if (((CODBAR IS NULL) or (CODBAR = '')) AND (ARTI <> '')) then
                CODBAR = ARTI;
            EXECUTE PROCEDURE faltante(:TIPORI, :TIPDES, :IDORI, :ITEM) returning_values (:CANT, :UNIDAD, :FACTOR);
            if (CANT > 0) then
                BEGIN
                INSERT INTO CONSOLIDADO_FALTANTES (COFA_ID, COFA_ITEM, COFA_TIPODES, COFA_TIPOORI, COFA_IDORI, COFA_ITEMORI, ARTI_COD, COFA_CANT, COFA_CODBAR, COFA_UNIDAD, COFA_FACTOR, COFA_OK, COFA_PRUNIT, COFA_DESCITE, COFA_BODEGA, COFA_DTOITE, COFA_LOTE, LOTE_VENCE, CODE_OBSIT)
                    VALUES (:IDCONS, :ITCONS, :tipdes,  :tipori, :idori, :item, :arti, :cant, :CODBAR, :UNIDAD, :FACTOR, 'N', :PRUNIT, :DESCITE, :BOD, :DTO, :LOTE, :LOTE_VENCE, :OBS);
                ITCONS = ITCONS + 1;
                END
            END
        END
    if (TIPORI = 25) then
        BEGIN
        FOR SELECT CPRD_ITEM, ARTI_COD, CPRD_CODBAR, CPRD_PRUNIT, CPRD_DESC, BODE_COD, CPRD_DTOPORC, NULL, CAST('NOW' AS DATE), CPRD_OBS
            FROM COTIZACIONES_PROVEEDOR_DET
            WHERE COPR_ID = :IDORI ORDER BY CPRD_ITEM INTO :ITEM, :ARTI, :CODBAR, :PRUNIT, :DESCITE, :BOD, :DTO, :LOTE, :LOTE_VENCE, :OBS
            DO
            BEGIN
            if (((CODBAR IS NULL) or (CODBAR = '')) AND (ARTI <> '')) then
                CODBAR = ARTI;
            EXECUTE PROCEDURE faltante(:TIPORI, :TIPDES, :IDORI, :ITEM) returning_values (:CANT, :UNIDAD, :FACTOR);
            if (CANT > 0) then
                BEGIN
                INSERT INTO CONSOLIDADO_FALTANTES (COFA_ID, COFA_ITEM, COFA_TIPODES, COFA_TIPOORI, COFA_IDORI, COFA_ITEMORI, ARTI_COD, COFA_CANT, COFA_CODBAR, COFA_UNIDAD, COFA_FACTOR, COFA_OK, COFA_PRUNIT, COFA_DESCITE, COFA_BODEGA, COFA_DTOITE, COFA_LOTE, LOTE_VENCE, CODE_OBSIT)
                    VALUES (:IDCONS, :ITCONS, :tipdes,  :tipori, :idori, :item, :arti, :cant, :CODBAR, :UNIDAD, :FACTOR, 'N', :PRUNIT, :DESCITE, :BOD, :DTO, :LOTE, :LOTE_VENCE, :OBS);
                ITCONS = ITCONS + 1;
                END
            END
        END
    if (TIPORI = 31) then
        BEGIN
        FOR SELECT FADE_ITEM, ARTI_COD, FADE_CODBAR, FADE_PRUNIT, SUBSTRING(FADE_DESC FROM 1 FOR 60), BODE_COD, FADE_DTOPORC, FADE_LOTE, CAST('NOW' AS DATE), LIPR_COD, FADE_OBS, FADE_REFERENCIA
            FROM FACTURAS_DETALLE
            WHERE FACT_ID = :IDORI ORDER BY FADE_ITEM INTO :ITEM, :ARTI, :CODBAR, :PRUNIT, :DESCITE, :BOD, :DTO, :LOTE, :LOTE_VENCE, :LISTA, :OBS, :REF
            DO
            BEGIN
            if (((CODBAR IS NULL) or (CODBAR = '')) AND (ARTI <> '')) then
                CODBAR = ARTI;
            EXECUTE PROCEDURE faltante(:TIPORI, :TIPDES, :IDORI, :ITEM) returning_values (:CANT, :UNIDAD, :FACTOR);
            if ((CANT > 0) or (arti = '.t')) then
                BEGIN
                INSERT INTO CONSOLIDADO_FALTANTES (COFA_ID, COFA_ITEM, COFA_TIPODES, COFA_TIPOORI, COFA_IDORI, COFA_ITEMORI, ARTI_COD, COFA_CANT, COFA_CODBAR, COFA_UNIDAD, COFA_FACTOR, COFA_OK, COFA_PRUNIT, COFA_DESCITE, COFA_BODEGA, COFA_DTOITE, COFA_LOTE, LOTE_VENCE, COFA_LISTA, CODE_OBSIT, CODE_REF)
                    VALUES (:IDCONS, :ITCONS, :tipdes,  :tipori, :idori, :item, :arti, :cant, :CODBAR, :UNIDAD, :FACTOR, 'N', :PRUNIT, :DESCITE, :BOD, :DTO, :LOTE, :LOTE_VENCE, :LISTA, :obs,  :REF);
                ITCONS = ITCONS + 1;
                END
            END
        END
    if (TIPORI = 32) then
        BEGIN
        FOR SELECT RVDE_ITEM, ARTI_COD, RVDE_CODBAR, RVDE_PRUNIT, SUBSTRING(RVDE_DESC FROM 1 FOR 60), BODE_COD, RVDE_DTOPORC, RVDE_LOTE, CAST('NOW' AS DATE), LIPR_COD, RVDE_OBS, RVDE_REFERENCIA
            FROM remisiones_venta_detalle
            WHERE REVT_ID = :IDORI ORDER BY RVDE_ITEM INTO :ITEM, :ARTI, :CODBAR, :PRUNIT, :DESCITE, :BOD, :DTO, :LOTE, :LOTE_VENCE, :LISTA, :obs, :ref DO
            BEGIN
            if (((CODBAR IS NULL) or (CODBAR = '')) AND (ARTI <> '')) then
                CODBAR = ARTI;
            EXECUTE PROCEDURE faltante(:TIPORI, :TIPDES, :IDORI, :ITEM) returning_values (:CANT, :UNIDAD, :FACTOR);
            if ((CANT > 0) or (arti = '.t')) then
                BEGIN
                INSERT INTO CONSOLIDADO_FALTANTES (COFA_ID, COFA_ITEM, COFA_TIPODES, COFA_TIPOORI, COFA_IDORI, COFA_ITEMORI, ARTI_COD, COFA_CANT, COFA_CODBAR, COFA_UNIDAD, COFA_FACTOR, COFA_OK, COFA_PRUNIT, COFA_DESCITE, COFA_BODEGA, COFA_DTOITE, COFA_LOTE, LOTE_VENCE, COFA_LISTA, CODE_OBSIT, CODE_REF)
                    VALUES (:IDCONS, :ITCONS, :tipdes,  :tipori, :idori, :item, :arti, :cant, :CODBAR, :UNIDAD, :FACTOR, 'N', :PRUNIT, :DESCITE, :BOD, :DTO, :LOTE, :LOTE_VENCE, :LISTA, :obs, :ref);
                ITCONS = ITCONS + 1;
                END
            END
        END
    if (TIPORI = 34) then
        BEGIN
        FOR SELECT PEDE_ITEM, ARTI_COD, PEDE_CODBAR, PEDE_PRUNIT, SUBSTRING(PEDE_DESC FROM 1 FOR 60), BODE_COD, PEDE_DTOPORC, NULL, CAST('NOW' AS DATE), D.LIPR_COD, PEDE_OBS, PEDE_REFERENCIA
            FROM PEDIDOS_DETALLE D, PEDIDOS P
            WHERE P.PEDI_ID = :IDORI AND P.pedi_id = D.pedi_id ORDER BY PEDE_ITEM
            INTO :ITEM, :ARTI, :CODBAR, :PRUNIT, :DESCITE, :BOD, :DTO, :LOTE, :LOTE_VENCE, :LISTA, :obs, :ref DO
            BEGIN
            if (((CODBAR IS NULL) or (CODBAR = '')) AND (ARTI <> '')) then
                CODBAR = ARTI;
            EXECUTE PROCEDURE faltante(:TIPORI, :TIPDES, :IDORI, :ITEM) returning_values (:CANT, :UNIDAD, :FACTOR);
            if ((CANT > 0) or (arti = '.t')) then
                BEGIN
                INSERT INTO CONSOLIDADO_FALTANTES (COFA_ID, COFA_ITEM, COFA_TIPODES, COFA_TIPOORI, COFA_IDORI, COFA_ITEMORI, ARTI_COD, COFA_CANT, COFA_CODBAR, COFA_UNIDAD, COFA_FACTOR, COFA_OK, COFA_PRUNIT, COFA_DESCITE, COFA_BODEGA, COFA_DTOITE, COFA_LOTE, LOTE_VENCE, COFA_LISTA, CODE_OBSIT, CODE_REF)
                    VALUES (:IDCONS, :ITCONS, :tipdes,  :tipori, :idori, :item, :arti, :cant, :CODBAR, :UNIDAD, :FACTOR, 'N', :PRUNIT, :DESCITE, :BOD, :DTO, :LOTE, :LOTE_VENCE, :LISTA, :obs, :ref);
                ITCONS = ITCONS + 1;
                END
            END
        END
    if (TIPORI = 35) then
        BEGIN
        FOR SELECT CTDE_ITEM, ARTI_COD, CTDE_CODBAR, CTDE_PRUNIT, SUBSTRING(CTDE_DESC FROM 1 FOR 60), P.BODE_COD, CTDE_DTOPORC, NULL, CAST('NOW' AS DATE), D.LIPR_COD, CTDE_OBS, CTDE_REFERENCIA
            FROM COTIZACIONES_DETALLE D, cotizaciones C, punto_venta P
            WHERE C.COTI_ID = :IDORI AND C.coti_id = D.coti_id AND C.ptvt_id = P.ptvt_id ORDER BY CTDE_ITEM INTO :ITEM, :ARTI, :CODBAR, :PRUNIT, :DESCITE, :BOD, :DTO, :LOTE, :LOTE_VENCE, :LISTA, :obs, :ref DO
            BEGIN
            if (((CODBAR IS NULL) or (CODBAR = '')) AND (ARTI <> '')) then
                CODBAR = ARTI;
            EXECUTE PROCEDURE faltante(:TIPORI, :TIPDES, :IDORI, :ITEM) returning_values (:CANT, :UNIDAD, :FACTOR);
            if ((CANT > 0) or (arti = '.t')) then
                BEGIN
                INSERT INTO CONSOLIDADO_FALTANTES (COFA_ID, COFA_ITEM, COFA_TIPODES, COFA_TIPOORI, COFA_IDORI, COFA_ITEMORI, ARTI_COD, COFA_CANT, COFA_CODBAR, COFA_UNIDAD, COFA_FACTOR, COFA_OK, COFA_PRUNIT, COFA_DESCITE, COFA_BODEGA, COFA_DTOITE, COFA_LOTE, LOTE_VENCE, COFA_LISTA, CODE_OBSIT, CODE_REF)
                    VALUES (:IDCONS, :ITCONS, :tipdes,  :tipori, :idori, :item, :arti, :cant, :CODBAR, :UNIDAD, :FACTOR, 'N', :PRUNIT, :DESCITE, :BOD, :DTO, :LOTE, :LOTE_VENCE, :LISTA, :obs, :ref);
                ITCONS = ITCONS + 1;
                END
            END
        END
    if (TIPORI = 40) then
        BEGIN
        FOR SELECT PEVD_ITEM, ARTI_COD, PEVD_CORBAR, PEVD_PRUNIT, SUBSTRING(PEVD_DESC FROM 1 FOR 60), D.BODE_COD, PEVD_DTOPORC, NULL, CAST('NOW' AS DATE), 1, PEVD_OBS, PEVD_REFERENCIA
            FROM pendiente_ventas_detalle D, pendiente_ventas P
            WHERE P.pend_id = :IDORI AND P.pend_id = D.pend_id ORDER BY PEVD_ITEM INTO :ITEM, :ARTI, :CODBAR, :PRUNIT, :DESCITE, :BOD, :DTO, :LOTE, :LOTE_VENCE, :LISTA, :obs, :ref DO
            BEGIN
            if (((CODBAR IS NULL) or (CODBAR = '')) AND (ARTI <> '')) then
                CODBAR = ARTI;
            EXECUTE PROCEDURE faltante(:TIPORI, :TIPDES, :IDORI, :ITEM) returning_values (:CANT, :UNIDAD, :FACTOR);
            if ((CANT > 0) or (arti = '.t')) then
                BEGIN
                INSERT INTO CONSOLIDADO_FALTANTES (COFA_ID, COFA_ITEM, COFA_TIPODES, COFA_TIPOORI, COFA_IDORI, COFA_ITEMORI, ARTI_COD, COFA_CANT, COFA_CODBAR, COFA_UNIDAD, COFA_FACTOR, COFA_OK, COFA_PRUNIT, COFA_DESCITE, COFA_BODEGA, COFA_DTOITE, COFA_LOTE, LOTE_VENCE, COFA_LISTA, CODE_OBSIT, CODE_REF)
                    VALUES (:IDCONS, :ITCONS, :tipdes,  :tipori, :idori, :item, :arti, :cant, :CODBAR, :UNIDAD, :FACTOR, 'N', :PRUNIT, :DESCITE, :BOD, :DTO, :LOTE, :LOTE_VENCE, :LISTA, :obs, :ref);
                ITCONS = ITCONS + 1;
                END
            END
        END
    if (TIPORI = 139) then
        BEGIN
        FOR SELECT SLDE_ITEM, ARTI_COD, SLDE_CODBAR, SLDE_FOB, SLDE_DESC, SLDE_DTOPORC, SLDE_OBS
            FROM solicitud_importacion_det
            WHERE SLIM_ID = :IDORI ORDER BY SLDE_ITEM INTO :ITEM, :ARTI, :CODBAR, :PRUNIT, :DESCITE, :DTO, :OBS
            DO
            BEGIN
            if (((CODBAR IS NULL) or (CODBAR = '')) AND (ARTI <> '')) then
                CODBAR = ARTI;
            EXECUTE PROCEDURE faltante(:TIPORI, :TIPDES, :IDORI, :ITEM) returning_values (:CANT, :UNIDAD, :FACTOR);
            if (CANT > 0) then
                BEGIN
                INSERT INTO CONSOLIDADO_FALTANTES (COFA_ID, COFA_ITEM, COFA_TIPODES, COFA_TIPOORI, COFA_IDORI, COFA_ITEMORI, ARTI_COD, COFA_CANT, COFA_CODBAR, COFA_UNIDAD, COFA_FACTOR, COFA_OK, COFA_PRUNIT, COFA_DESCITE, COFA_BODEGA, COFA_DTOITE, COFA_LOTE, LOTE_VENCE, CODE_OBSIT)
                    VALUES (:IDCONS, :ITCONS, :tipdes,  :tipori, :idori, :item, :arti, :cant, :CODBAR, :UNIDAD, :FACTOR, 'N', :PRUNIT, :descite, :BOD, :DTO, :LOTE, :LOTE_VENCE, :OBS);
                ITCONS = ITCONS + 1;
                END
            END
        END
    END /* FOR CONSOLIDE */
end
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE DOCCOMPRA_X_PROVEEDOR(
    NIT VARCHAR(20),
    TIPODOC INTEGER,
    TIPODES INTEGER,
    FECHA DATE)
RETURNS (
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(8),
    NROPROV VARCHAR(10),
    VALIDEZ INTEGER,
    ID INTEGER,
    FECDOC DATE,
    SUBTOTAL NUMERIC(18,2),
    IVA NUMERIC(18,2),
    CONSUMO NUMERIC(18,2),
    TOTAL NUMERIC(18,2))
AS
declare variable VENCE DATE;
declare variable ITEM INTEGER;
declare variable FALTA NUMERIC(18,4);
declare variable FALTAT NUMERIC(18,4);
declare variable UNIDAD VARCHAR(8);
declare variable FACTOR NUMERIC(18,4);
declare variable DIAS INTEGER;
declare variable usado CHAR(2);
declare variable NUMROWS INTEGER;
declare variable IDF INTEGER;
declare variable UNAVEZ CHAR(2);
BEGIN
EXECUTE PROCEDURE lee_configuracion('COMPRAS','DOCUMENTOS','NUMERO DE DIAS MAXIMO PARA CRUZAR DOCUMENTO') returning_values (DIAS);
EXECUTE PROCEDURE lee_configuracion('COMPRAS','DOCUMENTOS','PERMITIR LLAMAR DOCUMENTOS PREVIAMENTE USADOS EN OTRO TIPO DE DOCUMENTO') returning_values (UNAVEZ);
if (TIPODOC = 21) then /* FACTURA */
    BEGIN
    FOR SELECT FACO_ID, PREF_PRE, FACO_NUMERO, FACO_FECHA, FACO_VENCE, FACO_NUMPROV
        FROM FACTURAS_COMPRA WHERE TERC_NIT = :NIT AND FACO_FECHA <= :FECHA AND (FACO_FECHA >= (:FECHA-:DIAS)) AND FACO_ANULADO = 'N'
        INTO :ID, :PREFIJO, :NUMERO, :FECDOC, :VENCE, :nroprov DO
        BEGIN
        if ((UNAVEZ <> 'NO') or NOT EXISTS(SELECT COFA_ID FROM CONSOLIDADO_FALTANTES WHERE COFA_TIPOORI = 21 AND COFA_IDORI = :id AND COFA_CANTCR <> 0)) then
            BEGIN
            EXECUTE PROCEDURE TOTAL_DOC_COMPRA(TIPODOC, ID) returning_values (SUBTOTAL, IVA, CONSUMO);
            TOTAL = SUBTOTAL + IVA + CONSUMO;
            VALIDEZ = VENCE - FECDOC;
            if (TIPODES <> 0) then
                BEGIN
                /* RECORRA LOS ITEMS PARA VER SI TODO ESTA DEVUELTO */
                FALTAT = 0;
                FOR SELECT FCDE_ITEM, (FCDE_CANT*FCDE_FACTOR-FCDE_DEVUELTO) FROM FACTURAS_COMPRAS_DETALLE
                    WHERE FACO_ID = :ID ORDER BY FCDE_ITEM INTO :ITEM, :FALTA DO
                    BEGIN
                    if (tipodes <> 24) then
                        EXECUTE procedure FALTANTE(TIPODOC, TIPODES, :ID, :ITEM) returning_values (:FALTA, :unidad,  :FACTOR);
                    FALTAT = FALTAT + FALTA;
                    END
                if (FALTAT <> 0) then
                    SUSPEND;
                END
            ELSE
                SUSPEND;
            END
        END
    END
if (TIPODOC = 22) then /* REMISION */
    BEGIN
    FOR SELECT REPR_ID, PREF_PRE, REPR_NUMERO, REPR_FECHA, 0, REPR_NUMPROV
        FROM remision_proveedor WHERE TERC_NIT = :NIT AND REPR_FECHA <= :FECHA AND (REPR_FECHA >= (:FECHA-:DIAS)) AND REPR_ANULADO = 'N'
        INTO :ID, :PREFIJO, :NUMERO, :FECDOC, :VALIDEZ, :nroprov DO
        BEGIN
        if ((UNAVEZ <> 'NO') or NOT EXISTS(SELECT COFA_ID FROM CONSOLIDADO_FALTANTES WHERE COFA_TIPOORI = 22 AND COFA_IDORI = :id AND COFA_CANTCR <> 0)) then
            BEGIN
            EXECUTE PROCEDURE TOTAL_DOC_COMPRA(TIPODOC, ID) returning_values (SUBTOTAL, IVA, CONSUMO);
            TOTAL = SUBTOTAL + IVA + CONSUMO;
            if (TIPODES <> 0) then
                BEGIN
                /* RECORRA LOS ITEMS PARA VER SI TODO ESTA DEVUELTO */
                FALTAT = 0;
                FOR SELECT RPVD_ITEM FROM remision_proveedor_det WHERE REPR_ID = :ID ORDER BY RPVD_ITEM INTO :ITEM DO
                    BEGIN
                    EXECUTE procedure FALTANTE(TIPODOC, TIPODES, :ID, :ITEM) returning_values (:FALTA, :unidad,  :FACTOR);
                    FALTAT = FALTAT + FALTA;
                    END
                if (FALTAT <> 0) then
                    SUSPEND;
                END
            ELSE
                SUSPEND;
            END
        END
    END
if (TIPODOC = 24) then /* DEVOLUCION */
    BEGIN
    FOR SELECT DVCO_ID, PREF_PRE, DVCO_NUMERO, DVCO_FECHA, 0, DVCO_FACTID
        FROM DEVOLUCIONES_COMPRAS WHERE TERC_NIT = :NIT AND DVCO_FECHA <= :FECHA AND DVCO_ANULADO = 'N'
        INTO :ID, :PREFIJO, :NUMERO, :FECDOC, :VALIDEZ, :idf DO
        BEGIN
        nroprov = '';
        SELECT FACO_NUMPROV FROM facturas_compra WHERE FACO_ID = :idF INTO :nroprov;
        EXECUTE PROCEDURE TOTAL_DOC_COMPRA(TIPODOC, ID) returning_values (SUBTOTAL, IVA, CONSUMO);
        TOTAL = SUBTOTAL + IVA + CONSUMO;
        SUSPEND;
        END
    END
if (TIPODOC = 23) then /* ORDEN */
    BEGIN
    FOR SELECT ORDC_ID, PREF_PRE, ORDC_NUMERO, ORDC_FECHA, ORDC_VALIDEZ, ''
        FROM ORDENES_COMPRA WHERE TERC_NIT = :NIT AND ORDC_FECHA <= :FECHA AND ((ORDC_FECHA+ORDC_VALIDEZ) >= :FECHA) AND ORDC_ANULADO = 'N'
        INTO :ID, :PREFIJO, :NUMERO, :FECDOC, :VALIDEZ, :nroprov DO
        BEGIN
        if ((UNAVEZ <> 'NO') or NOT EXISTS(SELECT COFA_ID FROM CONSOLIDADO_FALTANTES WHERE COFA_TIPOORI = 23 AND COFA_IDORI = :id AND COFA_CANTCR <> 0)) then
            BEGIN
            EXECUTE PROCEDURE TOTAL_DOC_COMPRA(TIPODOC, ID) returning_values (SUBTOTAL, IVA, CONSUMO);
            TOTAL = SUBTOTAL + IVA + CONSUMO;
            if (TIPODES <> 0) then
                BEGIN
                /* RECORRA LOS ITEMS PARA VER SI TODO ESTA USADO */
                FALTAT = 0;
                EXECUTE PROCEDURE lee_configuracion('COMPRAS','DOCUMENTOS','PERMITIR LLAMAR DOCUMENTOS PREVIAMENTE USADOS EN OTRO TIPO DE DOCUMENTO') returning_values (:USADO);
                if (USADO = 'NO') then
                    SELECT COUNT(*) FROM consolidado_faltantes WHERE COFA_TIPOORI = 23 AND COFA_IDORI = :ID AND COFA_TIPODES <> :tipodes AND COFA_CANTCR <> 0 INTO :NUMROWS;
                ELSE
                    NUMROWS = 0;
                if (NUMROWS = 0) then
                    FOR SELECT OCDE_ITEM FROM ordenes_compra_detalle WHERE ORDC_ID = :ID ORDER BY OCDE_ITEM INTO :ITEM DO
                        BEGIN
                        EXECUTE procedure FALTANTE(TIPODOC, TIPODES, :ID, :ITEM) returning_values (:FALTA, :unidad,  :FACTOR);
                        FALTAT = FALTAT + FALTA;
                        END
                if (FALTAT <> 0) then
                    SUSPEND;
                END
            ELSE
                SUSPEND;
            END
        END
    END
if (TIPODOC = 25) then /* COTIZACION */
    BEGIN
    FOR SELECT COPR_ID, PREF_PRE, COPR_NUMERO, COPR_FECHA, COPR_VALIDEZ, ''
        FROM cotizacion_PROVEEDOR WHERE TERC_NIT = :NIT AND COPR_FECHA <= :FECHA AND ((COPR_FECHA+COPR_VALIDEZ) >= :FECHA) AND COPR_ANULADO = 'N'
        INTO :ID, :PREFIJO, :NUMERO, :FECDOC, :VALIDEZ, :nroprov DO
        BEGIN
        if ((UNAVEZ <> 'NO') or NOT EXISTS(SELECT COFA_ID FROM CONSOLIDADO_FALTANTES WHERE COFA_TIPOORI = 25 AND COFA_IDORI = :id AND COFA_CANTCR <> 0)) then
            BEGIN
            EXECUTE PROCEDURE TOTAL_DOC_COMPRA(TIPODOC, ID) returning_values (SUBTOTAL, IVA, CONSUMO);
            TOTAL = SUBTOTAL + IVA + CONSUMO;
            if (TIPODES <> 0) then
                BEGIN
                /* RECORRA LOS ITEMS PARA VER SI TODO ESTA DEVUELTO */
                FALTAT = 0;
                EXECUTE PROCEDURE lee_configuracion('COMPRAS','DOCUMENTOS','PERMITIR LLAMAR DOCUMENTOS PREVIAMENTE USADOS EN OTRO TIPO DE DOCUMENTO') returning_values (:USADO);
                if (USADO = 'NO') then
                    SELECT COUNT(*) FROM consolide_faltantes WHERE CEFA_TIPOORI = 25 AND CEFA_IDORI = :ID AND CEFA_TIPODES <> :tipodes INTO :NUMROWS;
                ELSE
                    NUMROWS = 0;
                if (NUMROWS = 0) then
                    FOR SELECT CPRD_ITEM FROM cotizaciones_proveedor_det WHERE COPR_ID = :ID ORDER BY CPRD_ITEM INTO :ITEM DO
                        BEGIN
                        EXECUTE procedure FALTANTE(TIPODOC, TIPODES, :ID, :ITEM) returning_values (:FALTA, :unidad,  :FACTOR);
                        FALTAT = FALTAT + FALTA;
                        END
                if (FALTAT <> 0) then
                    SUSPEND;
                END
            ELSE
                SUSPEND;
            END
        END
    END
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE DOCVENTAS_X_CLIENTE(
    NIT VARCHAR(20),
    TIPODOC INTEGER,
    TIPODES INTEGER,
    FECHA DATE,
    SUCURSAL VARCHAR(10))
RETURNS (
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(8),
    VALIDEZ INTEGER,
    VEND INTEGER,
    ID INTEGER,
    FECDOC DATE,
    SUBTOTAL NUMERIC(18,2),
    IVA NUMERIC(18,2),
    CONSUMO NUMERIC(18,2),
    TOTAL NUMERIC(18,2),
    SUCUR VARCHAR(10))
AS
declare variable VENCE DATE;
declare variable ITEM INTEGER;
declare variable FALTA NUMERIC(18,4);
declare variable FALTAT NUMERIC(18,4);
declare variable UNIDAD VARCHAR(8);
declare variable FACTOR NUMERIC(18,4);
declare variable DIAS INTEGER;
declare variable usado CHAR(2);
declare variable NUMROWS INTEGER;
declare variable TRAERCONTADO CHAR(2);
declare variable CONSOL INTEGER;
declare variable TIPOORI INTEGER;
declare variable OK CHAR(1);
declare variable ITECAN NUMERIC(18,2);
declare variable ITESUB NUMERIC(18,2);
declare variable ITEIVA NUMERIC(18,2);
declare variable ITECON NUMERIC(18,2);
BEGIN
EXECUTE PROCEDURE lee_configuracion('FACTURACION','DOCUMENTOS','NUMERO DE DIAS MAXIMO PARA CRUZAR DOCUMENTO') returning_values (DIAS);
EXECUTE PROCEDURE lee_configuracion('FACTURACION', 'DOCUMENTOS', 'TRAER DOCUMENTOS PENDIENTES DEL CLIENTE DE CONTADO EN DOCUMENTOS DE OTROS CLIENTES') returning_values (TRAERCONTADO);
EXECUTE PROCEDURE lee_configuracion('FACTURACION','DOCUMENTOS','PERMITIR LLAMAR DOCUMENTOS PREVIAMENTE USADOS EN OTRO TIPO DE DOCUMENTO') returning_values (:USADO);

if (TIPODOC = 31) then /* FACTURA */
    BEGIN
    FOR SELECT FACT_ID, PREF_PRE, FACT_NUMERO, FACT_FECHA, FACT_VENCE, FACT_SUCURSAL, VEND_COD, FACT_CONSOLIDA
        FROM FACTURAS
        WHERE TERC_NIT = :NIT AND FACT_FECHA <= :FECHA AND (FACT_FECHA >= (:FECHA - :DIAS)) AND
            FACT_ANULADO = 'N' AND ((FACT_SUCURSAL = :SUCURSAL) or (:SUCURSAL = 'Todas') or (:SUCURSAL = '0'))
        INTO :ID, :PREFIJO, :NUMERO, :FECDOC, :VENCE, :SUCUR, :VEND, :CONSOL DO
        BEGIN
        EXECUTE PROCEDURE TOTAL_DOC_VENTAS(TIPODOC, ID) returning_values (SUBTOTAL, IVA, CONSUMO);
        TOTAL = SUBTOTAL + IVA + CONSUMO;
        VALIDEZ = VENCE - FECDOC;
        if (TIPODES = 33) then
            BEGIN
            /* VERIFIQUE SI HAY PENDIENTES */
            SELECT SUM(FADE_CANT * FADE_FACTOR - FADE_DEVUELTO) FROM FACTURAS_DETALLE WHERE FACT_ID = :ID and substring(arti_cod from 1 FOR 2) <> '.t' and FADE_cant > 0 INTO :FALTA;
            if (FALTA <> 0) then
                suspend;
            END
        ELSE
            BEGIN
            /* VERIFIQUE QUE NO ESTE HECHA CON BASE EN UN DOCUMENTO DE ORIGEN */
            FALTAT = 0;
            OK = 'N';
            if ((CONSOL <> 0) AND (CONSOL IS NOT NULL)) then
                BEGIN
                SELECT MAX(COFA_TIPOORI) FROM consolidado_faltantes WHERE COFA_ID = :CONSOL AND COFA_CANTCR <> 0 INTO :tipoori;
                if (TIPOORI <> TIPODES) then
                    OK = 'S';
                END
            ELSE
                OK = 'S';
            if (OK = 'S') then
                BEGIN
                /* RECORRA LOS ITEMS PARA VER SI TODO ESTA USADO */
                FOR SELECT FADE_ITEM FROM FACTURAS_DETALLE WHERE FACT_ID = :ID and substring(arti_cod from 1 FOR 2) <> '.t' ORDER BY FADE_ITEM INTO :ITEM DO
                    BEGIN
                    EXECUTE procedure FALTANTE(TIPODOC, :TIPODES, :ID, :ITEM) returning_values (:FALTA, :UNIDAD, :FACTOR);
                    FALTAT = FALTAT + FALTA;
                    END
                if (FALTAT <> 0) then
                    SUSPEND;
                END
            END
        END
    END
  if (TIPODOC = 32) then /* REMISION */
    BEGIN
    FOR SELECT REVT_ID, PREF_PRE, REVT_NUMERO, REVT_FECHA, 0, REVT_SUCURSAL, VEND_COD, REVT_CONSOLIDA
        FROM remisiones_venta
        WHERE TERC_NIT = :NIT AND REVT_FECHA <= :FECHA AND (REVT_FECHA >= (:FECHA - :DIAS)) AND
            REVT_ANULADO = 'N' AND ((REVT_SUCURSAL = :SUCURSAL) or (:SUCURSAL = 'Todas'))
        INTO :ID, :PREFIJO, :NUMERO, :FECDOC, :VALIDEZ, :SUCUR, :VEND, :CONSOL DO
        BEGIN
        EXECUTE PROCEDURE TOTAL_DOC_VENTAS(TIPODOC, ID) returning_values (SUBTOTAL, IVA, CONSUMO);
        TOTAL = SUBTOTAL + IVA + CONSUMO;
        if (TIPODES <> 0) then
            BEGIN
            /* VERIFIQUE QUE NO ESTE HECHA CON BASE EN UN DOCUMENTO DE ORIGEN */
            FALTAT = 0;
            OK = 'N';
            if ((CONSOL <> 0) AND (CONSOL IS NOT NULL)) then
                BEGIN
                SELECT MAX(COFA_TIPOORI) FROM consolidado_faltantes WHERE COFA_ID = :CONSOL AND COFA_CANTCR <> 0 INTO :tipoori;
                if (TIPOORI <> TIPODES) then
                    OK = 'S';
                END
            ELSE
                OK = 'S';
            if (OK = 'S') then
                BEGIN
                /* RECORRA LOS ITEMS PARA VER SI TODO ESTA USADO */
                FOR SELECT RVDE_ITEM FROM REMISIONES_VENTA_DETALLE WHERE REVT_ID = :ID ORDER BY RVDE_ITEM INTO :ITEM DO
                    BEGIN
                    EXECUTE procedure FALTANTE(TIPODOC, :TIPODES, :ID, :ITEM) returning_values (:FALTA, :UNIDAD, :FACTOR);
                    FALTAT = FALTAT + FALTA;
                    END
                if (FALTAT <> 0) then
                    SUSPEND;
                END
            END
        END
    END
  if (TIPODOC = 33) then /* DEVOLUCION */
    BEGIN
    FOR SELECT DEVT_ID, PREF_PRE, DEVT_NUMERO, DEVT_FECHA, 0, DEVT_SUCURSAL, VEND_COD
        FROM DEVOLUCIONES_VENTAS
        WHERE TERC_NIT = :NIT AND DEVT_FECHA <= :FECHA AND DEVT_ANULADO = 'N' AND ((DEVT_SUCURSAL = :SUCURSAL) or (:SUCURSAL = 'Todas'))
        INTO :ID, :PREFIJO, :NUMERO, :FECDOC, :VALIDEZ, :SUCUR, :VEND DO
        BEGIN
        EXECUTE PROCEDURE TOTAL_DOC_VENTAS(TIPODOC, ID) returning_values (SUBTOTAL, IVA, CONSUMO);
        TOTAL = SUBTOTAL + IVA + CONSUMO;
        SUSPEND;
        END
    END
  if (TIPODOC = 34) then /* PEDIDO */
    BEGIN
    FOR SELECT PEDI_ID, PREF_PRE, PEDI_NUMERO, PEDI_FECHA, PEDI_VALIDEZ, PEDI_SUCURSAL, VEND_COD
        FROM PEDIDOS
        WHERE ((TERC_NIT = :NIT) OR ((:traercontado = 'SI') AND (exists (SELECT PTVT_ID FROM PUNTO_VENTA where TERC_NIT = :NIT))))
        AND PEDI_FECHA <= :FECHA AND PEDI_FECHA+PEDI_VALIDEZ >= :FECHA AND PEDI_ANULADO = 'N' AND ((PEDI_SUCURSAL = :SUCURSAL) or (:SUCURSAL = 'Todas'))
        INTO :ID, :PREFIJO, :NUMERO, :FECDOC, :VALIDEZ, :SUCUR, :VEND DO
        BEGIN
        EXECUTE PROCEDURE TOTAL_DOC_VENTAS(TIPODOC, ID) returning_values (SUBTOTAL, IVA, CONSUMO);
        if (TIPODES <> 0) then
            BEGIN
            /* RECORRA LOS ITEMS PARA VER SI TODO ESTA USADO */
            FALTAT = 0;
            if (USADO = 'NO') then
                SELECT COUNT(*) FROM consolide_faltantes WHERE CEFA_TIPOORI = 34 AND CEFA_IDORI = :ID AND CEFA_TIPODES <> :tipodes INTO :NUMROWS;
            ELSE
                NUMROWS = 0;
            if (NUMROWS = 0) then
                BEGIN
                SUBTOTAL = 0;
                IVA = 0;
                CONSUMO = 0;
                FOR SELECT PEDE_ITEM, PEDE_CANT * PEDE_FACTOR, PEDE_TOTAL-PEDE_IVAMONTO-PEDE_CONSUMO, PEDE_IVAMONTO, PEDE_CONSUMO
                    FROM PEDIDOS_DETALLE WHERE PEDI_ID = :ID ORDER BY PEDE_ITEM INTO :ITEM, :ITECAN, :ITESUB, :ITEIVA, :ITECON
                    DO
                    BEGIN
                    EXECUTE procedure FALTANTE(TIPODOC, :TIPODES, :ID, :ITEM) returning_values (:FALTA, :UNIDAD, :FACTOR);
                    FALTAT = FALTAT + FALTA;
                    if (ITECAN <> 0) then
                        BEGIN
                        SUBTOTAL = SUBTOTAL + cast(cast((ITESUB/ITECAN) as double precision) * cast(FALTA * FACTOR as double precision) as numeric(18, 2));
                        IVA = IVA + cast(cast((ITEIVA/ITECAN) as double precision) * cast(FALTA * FACTOR as double precision) as numeric(18, 2));
                        CONSUMO = CONSUMO + cast(cast((ITECON/ITECAN) as double precision) * cast(FALTA * FACTOR as double precision) as numeric(18, 2));
                        END
                    END
                END
            if (FALTAT <> 0) then
                BEGIN
                TOTAL = SUBTOTAL + IVA + CONSUMO;
                SUSPEND;
                END
            END
        ELSE
            SUSPEND;
        END
    END
  if (TIPODOC = 35) then /* COTIZACION */
    BEGIN
    FOR SELECT COTI_ID, PREF_PRE, COTI_NUMERO, COTI_FECHA, COTI_VALIDEZ, COTI_SUCURSAL, VEND_COD
        FROM cotizaciones
        WHERE ((TERC_NIT = :NIT) OR ((:traercontado = 'SI') AND (TERC_NIT IN (SELECT TERC_NIT FROM PUNTO_VENTA))))
        AND COTI_FECHA <= :FECHA AND COTI_FECHA+COTI_VALIDEZ >= :FECHA AND COTI_ANULADO = 'N'
        AND ((COTI_SUCURSAL = :SUCURSAL) or (:SUCURSAL = 'Todas'))
        INTO :ID, :PREFIJO, :NUMERO, :FECDOC, :VALIDEZ, :SUCUR, :VEND DO
        BEGIN
        EXECUTE PROCEDURE TOTAL_DOC_VENTAS(TIPODOC, ID) returning_values (SUBTOTAL, IVA, CONSUMO);
        TOTAL = SUBTOTAL + IVA + CONSUMO;
        if (TIPODES <> 0) then
            BEGIN
            /* RECORRA LOS ITEMS PARA VER SI TODO ESTA USADO */
            FALTAT = 0;
            EXECUTE PROCEDURE lee_configuracion('FACTURACION','DOCUMENTOS','PERMITIR LLAMAR DOCUMENTOS PREVIAMENTE USADOS EN OTRO TIPO DE DOCUMENTO') returning_values (:USADO);
            if (USADO = 'NO') then
                SELECT COUNT(*) FROM consolide_faltantes WHERE CEFA_TIPOORI = 35 AND CEFA_IDORI = :ID AND CEFA_TIPODES <> :tipodes INTO :NUMROWS;
            ELSE
                NUMROWS = 0;
            if (NUMROWS = 0) then
                FOR SELECT CTDE_ITEM FROM COTIZACIONES_DETALLE WHERE COTI_ID = :ID ORDER BY CTDE_ITEM INTO :ITEM DO
                    BEGIN
                    EXECUTE procedure FALTANTE(TIPODOC, :TIPODES, :ID, :ITEM) returning_values (:FALTA, :UNIDAD, :FACTOR);
                    FALTAT = FALTAT + FALTA;
                    END
            if (FALTAT <> 0) then
                SUSPEND;
            END
        ELSE
            SUSPEND;
        END
    END
if (TIPODOC = 40) then /* PENDIENTE */
    BEGIN
    FOR SELECT PEND_ID, PREF_PRE, PEND_NUMERO, PEND_FECHA, 0, PEND_SUCURSAL, VEND_COD
        FROM pendiente_ventas
        WHERE (TERC_NIT = :NIT) AND PEND_FECHA <= :FECHA AND PEND_ANULADO = 'N' AND ((PEND_SUCURSAL = :SUCURSAL) or (:SUCURSAL = 'Todas'))
        INTO :ID, :PREFIJO, :NUMERO, :FECDOC, :VALIDEZ, :SUCUR, :VEND DO
        BEGIN
        EXECUTE PROCEDURE TOTAL_DOC_VENTAS(TIPODOC, ID) returning_values (SUBTOTAL, IVA, CONSUMO);
        TOTAL = SUBTOTAL + IVA + CONSUMO;
        if (TIPODES <> 0) then
            BEGIN
            /* RECORRA LOS ITEMS PARA VER SI TODO ESTA USADO */
            FALTAT = 0;
            FOR SELECT pevd_item FROM pendiente_ventas_detalle WHERE PEND_ID = :ID ORDER BY PEVD_ITEM INTO :ITEM DO
                BEGIN
                EXECUTE procedure FALTANTE(TIPODOC, :TIPODES, :ID, :ITEM) returning_values (:FALTA, :UNIDAD, :FACTOR);
                FALTAT = FALTAT + FALTA;
                END
            if (FALTAT <> 0) then
                SUSPEND;
            END
        ELSE
            SUSPEND;
        END
    END
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE EXISTENCIAS_COMPRAS(
    ARTICULO VARCHAR(15),
    FECHA DATE,
    UNIDAD VARCHAR(8))
RETURNS (
    BODEGA VARCHAR(2),
    EXISTENCIA NUMERIC(18,2),
    RESERVADO NUMERIC(18,2),
    DISPONIBLE NUMERIC(18,2),
    ORDENADO NUMERIC(18,2),
    PROMEDIO NUMERIC(18,2),
    VENTAMES NUMERIC(18,2),
    VENTAANO NUMERIC(18,2),
    FECHACMP DATE,
    CANTCMP NUMERIC(18,2),
    DIAS INTEGER,
    SUGERIDO NUMERIC(18,2),
    STAND VARCHAR(20),
    NOMBOD VARCHAR(30))
AS
declare variable factor numeric(15,4);
declare variable ordenc numeric(18,4);
declare variable pedido numeric(18,4);
declare variable item integer;
declare variable id integer;
declare variable und varchar(8);
declare variable cant numeric(18,4);
declare variable factor2 numeric(18,4);
declare variable fecini date;
declare variable fechaaux varchar(10);
declare variable agencia integer;
declare variable devmes numeric(18,2);
declare variable mfac integer;
declare variable mdev integer;
declare variable ivaf numeric(18,2);
declare variable ivad numeric(18,2);
declare variable dia_art varchar(2) character set none;
declare variable diasc varchar(255);
declare variable pedauto char(2);
declare variable salidas numeric(18,4);
declare variable fecrem date;
declare variable cantrem numeric(18,4);
declare variable DIASANO INTEGER;
declare variable BODINA CHAR(2);
begin
execute procedure lee_configuracion ('INVENTARIO', 'EXISTENCIAS', 'PROMEDIAR LAS SALIDAS DEL INVENTARIO CON EL NUMERO DE DIAS ASIGNADO A CADA ARTICULO') returning_values (:DIA_ART);
execute procedure lee_configuracion ('INVENTARIO', 'EXISTENCIAS', 'NUMERO DE DIAS PARA PROMEDIO DE SALIDAS POR ARTICULO') returning_values (DIASC);
execute procedure LEE_CONFIGURACION('FACTURACION', 'FACTURAS', 'GENERAR PEDIDO AUTOMATICAMENTE CON LA FACTURA') returning_values (pedauto);
EXECUTE PROCEDURE lee_configuracion ('INVENTARIO', 'EXISTENCIAS', 'MOSTRAR BODEGAS INACTIVAS EN CONSULTA DE EXISTENCIAS') returning_values (:BODINA);

for select bode_cod, SUCU_ID, BODE_NOM from bodega where ((bode_activa = 'S') or (:BODINA = 'SI')) order by bode_cod
    into :bodega, :agencia, :nombod
    do
    begin
    execute procedure saldo_inventario (:articulo, :bodega, :fecha) returning_values (:Existencia);
    execute procedure FACTOR_UNIDAD_CANT(:ARTICULO, :UNIDAD) returning_values (:FACTOR);
    if (FACTOR <> 0) then
        EXISTENCIA = EXISTENCIA / FACTOR;
    else
        EXISTENCIA = 0;
    STAND = '';
    select STAND_COD from STANDS where ARTI_COD = :ARTICULO and STAND_BODEGA = :BODEGA into :stand;
    execute procedure salidas_ano_anterior (:ARTICULO, :FECHA, :BODEGA) returning_values (:ventaano);
    execute procedure promedio_salidas_articulo (:ARTICULO, :FECHA, :BODEGA) returning_values (:PROMEDIO, :SALIDAS);
    if (DIA_ART = 'NO') then
        begin
        DIAS = cast(DIASC as integer);
        end
    else
        select ARTI_DIAS from ARTICULO where ARTI_COD = :ARTICULO into :DIAS;
    if (DIAS is null) then
        DIAS = 0;
    PROMEDIO = DIAS * PROMEDIO;
    if (FACTOR <> 0) then
        PROMEDIO = PROMEDIO / FACTOR;
    SUGERIDO = PROMEDIO - EXISTENCIA;
    select sum(ORID_ENTREGAR)
      from ORDENINVENTARIO_DETALLE OD, ordenes_inventario O
      where O.ORIN_ID = OD.ORIN_ID and ARTI_COD = :ARTICULO and ORIN_FECHA <= :FECHA and ORIN_FECLLEGA >= :FECHA and ORID_ANULADO = 'N' and OD.BODE_COD = :BODEGA
      into :ORDENADO;
    if (ORDENADO is null) then
        ORDENADO = 0;
    ORDENC = 0;
    for select O.ORDC_ID, OCDE_ITEM, OCDE_CANT * OCDE_FACTOR
        from ORDENES_COMPRA O, ORDENES_COMPRA_DETALLE OD
        where O.ORDC_ID = OD.ORDC_ID and OD.ARTI_COD = :ARTICULO and (ORDC_FECHA+ORDC_VALIDEZ) >= :FECHA and ORDC_FECHA <= :FECHA and OCDE_ANULADO = 'N' and OD.BODE_COD = :BODEGA
        into :ID, :ITEM, :CANT
        do
        begin
        execute procedure FALTANTE(23, 21, ID, ITEM) returning_values (PEDIDO, UND, FACTOR2);
        if (PEDIDO * FACTOR2 = CANT) then /* SI NO SE HA FACTURADO MIRE A VER SI SE REMISIONO */
            execute procedure FALTANTE(23, 22, ID, ITEM) returning_values (PEDIDO, UND, FACTOR2);
        if (PEDIDO is null) then
            PEDIDO = 0;
        ORDENC = ORDENC + PEDIDO * FACTOR2;
        end
    ORDENADO = ORDENADO + ORDENC;
    if (FACTOR <> 0) then
        ORDENADO = ORDENADO / FACTOR;
    select sum(RSDE_LIBERAR)
      from RESERVAS_DETALLE RD, RESERVAS R
      where R.RESE_ID = RD.RESE_ID and ARTI_COD = :ARTICULO and RESE_FECHA <= :FECHA and RESE_VENCE >= :FECHA and RD.BODE_COD = :BODEGA and RSDE_ANULADO = 'N'
      into :RESERVADO;
    if (RESERVADO is null) then
        RESERVADO = 0;
    PEDIDO = 0;
    for select P.PEDI_ID, PEDE_ITEM, PEDE_CANT * PEDE_FACTOR
        from PEDIDOS P, PEDIDOS_DETALLE PD
        where P.PEDI_ID = PD.PEDI_ID and PD.ARTI_COD = :ARTICULO and (PEDI_FECHA+PEDI_VALIDEZ) >= :FECHA and PEDI_FECHA <= :FECHA and PEDE_ANULADO = 'N' and BODE_COD = :BODEGA
        into :ID, :ITEM, :CANT
        do
        begin
        execute procedure FALTANTE(34, 31, ID, ITEM) returning_values (ORDENC, UND, FACTOR2);
        if ((ORDENC * FACTOR2 = CANT) or (PEDAUTO = 'SI')) then /* SI NO SE HA FACTURADO MIRE A VER SI SE REMISIONO */
            execute procedure FALTANTE(34, 32, ID, ITEM) returning_values (ORDENC, UND, FACTOR2);
        if (ORDENC is null) then
            ORDENC = 0;
        PEDIDO = PEDIDO + ORDENC * FACTOR2;
        end
    RESERVADO = RESERVADO + PEDIDO;
    if (FACTOR <> 0) then
        RESERVADO = RESERVADO / FACTOR;
    DISPONIBLE = EXISTENCIA - RESERVADO;
    /* VENTAS MES */
    FECHAAUX = cast (FECHA as varchar(10));
    FECHAAUX = SUBSTR(FECHAAUX, 1, 7) || '/01';
    FECINI = cast (FECHAAUX as date);
    execute procedure ventas_articulo (:ARTICULO, :FECINI, :FECHA, :agencia, :bodega ) returning_values (:ventames, :mfac, :devmes, :mdev, :ivaf, :ivad);
    ventames = ventames - devmes;
    if (FACTOR <> 0) then
        ventames = ventames / FACTOR;
    /* FECHA COMPRA */
    fechacmp = null;
    cantcmp = 0;
    select first 1 FACO_FECHA, FCDE_CANT * FCDE_FACTOR from FACTURAS_COMPRA F, FACTURAS_COMPRAS_DETALLE D
        where F.FACO_ID = D.faco_id and D.ARTI_COD = :articulo and FACO_FECHA <= :FECHA and D.bode_cod = :BODEGA
        order by FACO_FECHA desc, F.FACO_ID desc
        into :fechacmp, :cantcmp;
    select first 1 REPR_FECHA, RPVD_CANT * RPVD_FACTOR from remision_proveedor F, remision_proveedor_det D
        where F.repr_id = D.repr_id and D.ARTI_COD = :articulo and REPR_FECHA <= :FECHA and D.bode_cod = :BODEGA
        order by REPR_FECHA desc, F.repr_id desc
        into :fecrem, :cantrem;
    if ((FECREM is not null) and (FECREM > fechacmp)) then
        begin
        fechacmp = FECREM;
        cantcmp = cantrem;
        end
    suspend;
    end
end
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE EXISTENCIAS_DESDE_HASTA(
    FECHA DATE,
    ARTINI VARCHAR(20),
    ARTFIN VARCHAR(20),
    GRPINI VARCHAR(3),
    GRPFIN VARCHAR(3),
    BODINI VARCHAR(2),
    BODFIN VARCHAR(2),
    ORDEN CHAR(1),
    AGRUPA CHAR(1),
    DETALLE CHAR(1),
    RESERVA CHAR(1),
    ENPESO CHAR(1),
    MASIVA CHAR(1),
    INACTIVOS CHAR(1),
    SUCURSAL INTEGER)
RETURNS (
    CANT NUMERIC(18,2),
    COSTO NUMERIC(18,2),
    COSTO_LOTE NUMERIC(18,2),
    CODIGO VARCHAR(15),
    NOMBRE VARCHAR(60),
    DESCORTA VARCHAR(30),
    UNIDAD VARCHAR(8),
    STAND VARCHAR(20),
    CODGRUPO VARCHAR(2),
    NOMGRUPO VARCHAR(30),
    CODSUBG VARCHAR(3),
    NOMSUBG VARCHAR(30),
    CODMARC VARCHAR(3),
    NOMMARC VARCHAR(30),
    INVIMA VARCHAR(20),
    CODBOD VARCHAR(2),
    LOTE VARCHAR(15),
    LOTEV DATE,
    NOMBOD VARCHAR(30),
    COSTOTOT NUMERIC(18,2),
    COSTOIVA NUMERIC(18,2),
    ULTCOSTO NUMERIC(18,2),
    FECHACOSTO DATE,
    CONSUMO NUMERIC(18,2),
    RESERVADO NUMERIC(18,4),
    ORDENADO NUMERIC(18,4),
    IVA NUMERIC(9,2),
    IVAMONTO NUMERIC(18,2),
    PESOUNIT NUMERIC(18,4),
    PESOTOTAL NUMERIC(18,4),
    PRECIO NUMERIC(18,2),
    CODBAR VARCHAR(20))
AS
declare variable exist char(1);
declare variable codini varchar(20);
declare variable codfin varchar(20);
declare variable desini varchar(20);
declare variable desfin varchar(20);
declare variable ordenc numeric(18,4);
declare variable pedido numeric(18,4);
declare variable ok char(1);
declare variable id integer;
declare variable item integer;
declare variable und varchar(8);
declare variable factor numeric(18,4);
declare variable cant2 numeric(18,4);
declare variable PEDAUTO CHAR(2);
DECLARE VARIABLE LISTA INTEGER;
declare variable FACCOST NUMERIC(18,4);
BEGIN
EXECUTE PROCEDURE lee_configuracion ('FACTURACION','FACTURAS', 'CODIGO DE LA LISTA DE PRECIOS A MOSTRAR EN ARTICULOS') returning_values (:LISTA);
if (ORDEN = 'C') then
    BEGIN
    CODINI = ARTINI;
    CODFIN = ARTFIN;
    DESINI = '';
    DESFIN = 'zz';
    END
ELSE
    BEGIN
    DESINI = ARTINI;
    DESFIN = ARTFIN;
    CODINI = '';
    CODFIN = 'zz';
    END
EXECUTE PROCEDURE LEE_CONFIGURACION('FACTURACION', 'FACTURAS', 'GENERAR PEDIDO AUTOMATICAMENTE CON LA FACTURA') returning_values (pedauto);
if ((DETALLE = 'B') or (DETALLE = 'L')) then
  BEGIN
  FOR SELECT ARTI_COD, ARTI_DES, ARTI_DESCORTA, ARTI_UNIDAD, ARTI_EXIST, TAIV_PORC, A.GRUP_COD, A.SUBG_COD, A.MARC_COD, BODE_COD, BODE_NOM, ARTI_CONSUMO, ARTI_PESO/1000, ARTI_INVIMA
      FROM ARTICULO A, BODEGA B, TARIFA_IVA T
      WHERE ARTI_COD >= :CODINI AND ARTI_COD <= :CODFIN AND ARTI_DES >= :DESINI AND ARTI_DES <= :DESFIN AND ((ESAR_COD <> 'I') or (:INACTIVOS = 'S')) AND BODE_COD >= :BODINI AND
      BODE_COD <= :BODFIN AND ((SUCU_ID = :SUCURSAL) or (:SUCURSAL = 0)) AND A.TAIV_COD = T.TAIV_COD
      INTO :CODIGO, :NOMBRE, :DESCORTA, :UNIDAD, :EXIST, :IVA, :CODGRUPO, :CODSUBG, :CODMARC, :CODBOD, :NOMBOD, :CONSUMO, :pesounit, :invima
      DO
        BEGIN
        STAND = '';
        OK = 'N';
        if (AGRUPA = 'G') then
            BEGIN
            if ((CODGRUPO >= GRPINI) AND (CODGRUPO <= GRPFIN)) then
                OK = 'S';
            end
        ELSE
            if (AGRUPA = 'M') then
                BEGIN
                if ((CODMARC >= GRPINI) AND (CODMARC <= GRPFIN)) then
                    OK = 'S';
                END
        if (OK = 'S') then
            BEGIN
            NOMGRUPO = '';
            NOMMARC = '';
            NOMSUBG = '';
            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;
            CODBAR = NULL;
            SELECT FIRST 1 COBA_COD FROM BARRAS_ARTICULO
                WHERE ARTI_COD = :codigo AND COBA_UNIDAD = :unidad ORDER BY STRLEN(COBA_COD) INTO :codbar;
            if (CODBAR IS NULL) then
                CODBAR = CODIGO;
            if (EXIST <> 'N') then
                BEGIN
                SELECT STAND_COD FROM STANDS WHERE ARTI_COD = :CODIGO AND STAND_BODEGA = :CODBOD INTO :STAND;
                EXECUTE PROCEDURE costo_promedio_y_ultimo_unidad(CODIGO, FECHA-1, UNIDAD) returning_values (COSTO, ULTCOSTO);
                /* EL FACTOR */
                FACCOST = 1;
                SELECT FIRST 1 FAIN_FACTOR FROM factor_inventario WHERE FAIN_FECINI <= :FECHA AND FAIN_FECFIN >= :FECHA INTO :FACCOST;
                ULTCOSTO = ULTCOSTO * FACCOST;
                COSTO = COSTO * FACCOST;

                SELECT FIRST 1 MVAR_FECHA FROM MOVIMIENTO_ARTICULO WHERE ARTI_COD = :CODIGO AND MVAR_ENTRADA = 'S' AND MVAR_FECHA <= :FECHA
                    ORDER BY ARTI_COD DESC, MVAR_FECHA DESC INTO :FECHACOSTO;
                
                if (CONSUMO <> 0) then
                    EXECUTE PROCEDURE CONSUMO_HISTORICO (:CODIGO, :fecha) returning_values (:CONSUMO);
                if (RESERVA = 'S') then
                    BEGIN
                    SELECT SUM(ORID_ENTREGAR)
                        FROM ORDENINVENTARIO_DETALLE OD, ordenes_inventario O
                        WHERE O.ORIN_ID = OD.ORIN_ID AND ARTI_COD = :CODIGO AND ORIN_FECHA <= :FECHA AND ORIN_FECLLEGA >= :FECHA AND ORID_ANULADO = 'N' AND OD.BODE_COD = :CODBOD
                        INTO :ORDENADO;
                    if (ORDENADO IS NULL) then
                        ORDENADO = 0;
                    ORDENC = 0;
                    FOR SELECT O.ORDC_ID, OCDE_ITEM, OCDE_CANT * OCDE_FACTOR
                        FROM ORDENES_COMPRA O, ORDENES_COMPRA_DETALLE OD
                        WHERE O.ORDC_ID = OD.ORDC_ID AND OD.ARTI_COD = :CODIGO AND ORDC_VENCE >= :FECHA AND ORDC_FECHA <= :FECHA AND OCDE_ANULADO = 'N' AND OD.BODE_COD = :CODBOD
                        INTO :ID, :ITEM, :CANT2
                        do
                        BEGIN
                        EXECUTE PROCEDURE FALTANTE(23, 21, ID, ITEM) returning_values (PEDIDO, UND, FACTOR);
                        if (PEDIDO * FACTOR = CANT2) then /* SI NO SE HA FACTURADO MIRE A VER SI SE REMISIONO */
                            EXECUTE PROCEDURE FALTANTE(23, 22, ID, ITEM) returning_values (PEDIDO, UND, FACTOR);
                        if (PEDIDO IS NULL) then
                            PEDIDO = 0;
                        ORDENC = ORDENC + PEDIDO * FACTOR;
                        END
                    ORDENADO = ORDENADO + ORDENC;
                    SELECT SUM(RSDE_LIBERAR)
                        FROM RESERVAS_DETALLE RD, RESERVAS R
                        WHERE R.RESE_ID = RD.RESE_ID AND ARTI_COD = :CODIGO AND RESE_FECHA <= :FECHA AND RESE_VENCE >= :FECHA AND RD.BODE_COD = :CODBOD AND RSDE_ANULADO = 'N'
                        INTO :RESERVADO;
                    if (RESERVADO IS NULL) then
                        RESERVADO = 0;
                    PEDIDO = 0;
                    FOR SELECT P.PEDI_ID, PEDE_ITEM, PEDE_CANT * PEDE_FACTOR
                        FROM PEDIDOS P, PEDIDOS_DETALLE PD
                        WHERE P.PEDI_ID = PD.PEDI_ID AND PD.ARTI_COD = :CODIGO AND PEDI_VENCE >= :FECHA AND PEDI_FECHA <= :FECHA AND PEDE_ANULADO = 'N' AND BODE_COD = :CODBOD
                        INTO :ID, :ITEM, :CANT2
                        do
                        BEGIN
                        EXECUTE PROCEDURE FALTANTE(34, 31, ID, ITEM) returning_values (ORDENC, UND, FACTOR);
                        if ((ORDENC * FACTOR = CANT2) or (PEDAUTO = 'SI')) then /* SI NO SE HA FACTURADO MIRE A VER SI SE REMISIONO */
                            EXECUTE PROCEDURE FALTANTE(34, 32, ID, ITEM) returning_values (ORDENC, UND, FACTOR);
                        if (ORDENC IS NULL) then
                            ORDENC = 0;
                        PEDIDO = PEDIDO + ORDENC * FACTOR;
                        END
                    RESERVADO = RESERVADO + PEDIDO;
                    END
                ELSE
                    BEGIN
                    RESERVADO = 0;
                    ORDENADO = 0;
                    END
                if (LISTA > 0) then
                    SELECT prar_fijo FROM precios_articulo WHERE arti_cod = :CODIGO and lipr_cod = :LISTA INTO :PRECIO;
                if ((DETALLE = 'L') AND (EXIST = 'L')) then
                    BEGIN
                    FOR SELECT L.lote_nro, L.lote_nro||' - '||L.lote_vence, l.lote_costo, LOTE_VENCE
                        FROM LOTES L WHERE ARTI_COD = :codigo AND BODE_COD = :codbod
                        INTO :LOTE, :NOMBOD, :costo_lote, :lotev
                        DO
                        BEGIN
                        if (CONSUMO <> 0) then
                            EXECUTE PROCEDURE CONSUMO_HISTORICO (:CODIGO, :fecha) returning_values (:CONSUMO);
                        execute procedure saldo_lote_fecha(:codigo, :codbod,  :lote,  :fecha-1) returning_values (:cant);
                        if (cant <> 0) then
                            begin
                            COSTOTOT = :CANT * :COSTO;
                            IVAMONTO = COSTOTOT /100 * IVA;
                            COSTOIVA = COSTOTOT;
                            if (MASIVA = 'S') then
                                BEGIN
                                COSTOIVA = COSTOTOT + IVAMONTO;
                                COSTO = COSTO * (100 + :IVA) / 100 + :CONSUMO;
                                END
                            CONSUMO = CONSUMO * CANT;
                            COSTOIVA = COSTOIVA + CONSUMO;
                            if (ENPESO = 'S') then
                                BEGIN
                                if (pesounit IS NULL) then
                                    pesounit = 0;
                                if (PESOUNIT <> 0) then
                                    BEGIN
                                    pesototal = PESOUNIT * cant;
                                    SUSPEND;
                                    END
                                END
                            ELSE
                                SUSPEND;
                            end
                        END
                    END
                else
                    BEGIN
                    EXECUTE PROCEDURE SALDO_INICIAL_INVENTARIO(CODIGO, FECHA, :CODBOD) returning_values (CANT);
                    COSTOTOT = :CANT * :COSTO;
                    IVAMONTO = COSTOTOT /100 * IVA;
                    COSTOIVA = COSTOTOT;
                    if (MASIVA = 'S') then
                        BEGIN
                        COSTOIVA = COSTOTOT + IVAMONTO;
                        COSTO = COSTO * (100 + :IVA) / 100 + :CONSUMO;
                        END
                    CONSUMO = CONSUMO * CANT;
                    COSTOIVA = COSTOIVA + CONSUMO;
                    if (ENPESO = 'S') then
                        BEGIN
                        if (pesounit IS NULL) then
                            pesounit = 0;
                        if (PESOUNIT <> 0) then
                            BEGIN
                            pesototal = PESOUNIT * cant;
                            SUSPEND;
                            END
                        END
                    ELSE
                        SUSPEND;
                    END
                END
            END
        END
  END

if (DETALLE = 'N') then
  BEGIN
  FOR SELECT ARTI_COD, ARTI_DES, ARTI_DESCORTA, ARTI_UNIDAD, ARTI_EXIST, TAIV_PORC, A.GRUP_COD, A.SUBG_COD, A.MARC_COD, ARTI_CONSUMO, ARTI_PESO/1000, ARTI_INVIMA
      FROM ARTICULO A, TARIFA_IVA T
      WHERE ARTI_COD >= :CODINI AND ARTI_COD <= :CODFIN AND ARTI_DES >= :DESINI AND ARTI_DES <= :DESFIN AND ((ESAR_COD <> 'I') or (:INACTIVOS = 'S')) AND A.TAIV_COD = T.TAIV_COD
      INTO :CODIGO, :NOMBRE, :DESCORTA, UNIDAD, :EXIST, :IVA, :CODGRUPO, :CODSUBG, :CODMARC, :CONSUMO, :pesounit, :invima
      DO
        BEGIN
        OK = 'N';
        if (AGRUPA = 'G') then
            BEGIN
            if ((GRPINI = '0') AND (GRPFIN = 'zz')) then
                OK = 'S';
            else
                if ((CODGRUPO >= GRPINI) AND (CODGRUPO <= GRPFIN)) then
                    OK = 'S';
            end
        ELSE
            if (AGRUPA = 'M') then
                BEGIN
                if ((GRPINI = '0') AND (GRPFIN = 'zzz')) then
                    OK = 'S';
                else
                    if ((CODMARC >= GRPINI) AND (CODMARC <= GRPFIN)) then
                        OK = 'S';
                END
        if (OK = 'S') then
            BEGIN
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            CODBAR = NULL;
            SELECT MAX(COBA_COD) FROM BARRAS_ARTICULO WHERE ARTI_COD = :codigo AND COBA_UNIDAD = :unidad INTO :codbar;
            if (CODBAR IS NULL) then
                CODBAR = CODIGO;

            if (EXIST <> 'N') then
                BEGIN
                EXECUTE PROCEDURE SALDO_INICIAL_TOTAL_INV(CODIGO, FECHA) returning_values (CANT);
                EXECUTE PROCEDURE costo_promedio_y_ultimo_unidad(CODIGO, FECHA-1, UNIDAD) returning_values (COSTO, ULTCOSTO);
                /* EL FACTOR */
                FACCOST = 1;
                SELECT FIRST 1 FAIN_FACTOR FROM factor_inventario WHERE FAIN_FECINI <= :FECHA AND FAIN_FECFIN >= :FECHA INTO :FACCOST;
                ULTCOSTO = ULTCOSTO * FACCOST;
                COSTO = COSTO * FACCOST;

                SELECT FIRST 1 MVAR_FECHA FROM MOVIMIENTO_ARTICULO WHERE ARTI_COD = :CODIGO AND MVAR_ENTRADA = 'S' AND MVAR_FECHA <= :FECHA
                    ORDER BY ARTI_COD DESC, MVAR_FECHA DESC INTO :FECHACOSTO;
                COSTOTOT = :CANT * :COSTO;
                IVAMONTO = COSTOTOT /100 * IVA;
                COSTOIVA = COSTOTOT;
                if (CONSUMO <> 0) then
                    EXECUTE PROCEDURE CONSUMO_HISTORICO (:CODIGO, :fecha) returning_values (:CONSUMO);
                if (MASIVA = 'S') then
                    BEGIN
                    COSTOIVA = COSTOTOT + IVAMONTO;
                    COSTO = COSTO * (100 + :IVA) / 100 + :CONSUMO;
                    END
                CONSUMO = CONSUMO * CANT;
                COSTOIVA = COSTOIVA + CONSUMO;
                if (RESERVA = 'S') then
                    BEGIN
                    SELECT SUM(ORID_ENTREGAR)
                        FROM ORDENINVENTARIO_DETALLE OD, ordenes_inventario O
                        WHERE O.ORIN_ID = OD.ORIN_ID AND ARTI_COD = :CODIGO AND ORIN_FECHA <= :FECHA AND ORIN_FECLLEGA >= :FECHA AND ORID_ANULADO = 'N'
                        INTO :ORDENADO;
                        if (ORDENADO IS NULL) then
                            ORDENADO = 0;
                    ORDENC = 0;
                    FOR SELECT O.ORDC_ID, OCDE_ITEM, OCDE_CANT * OCDE_FACTOR
                        FROM ORDENES_COMPRA O, ORDENES_COMPRA_DETALLE OD
                        WHERE O.ORDC_ID = OD.ORDC_ID AND OD.ARTI_COD = :CODIGO AND ORDC_VENCE >= :FECHA AND ORDC_FECHA <= :FECHA AND OCDE_ANULADO = 'N'
                        INTO :ID, :ITEM, :CANT2
                        do
                        BEGIN
                        EXECUTE PROCEDURE FALTANTE(23, 21, ID, ITEM) returning_values (PEDIDO, UND, FACTOR);
                        if (PEDIDO * FACTOR = CANT2) then /* SI NO SE HA FACTURADO MIRE A VER SI SE REMISIONO */
                            EXECUTE PROCEDURE FALTANTE(23, 22, ID, ITEM) returning_values (PEDIDO, UND, FACTOR);
                        if (PEDIDO IS NULL) then
                            PEDIDO = 0;
                        ORDENC = ORDENC + PEDIDO * FACTOR;
                        END
                    ORDENADO = ORDENADO + ORDENC;
                    SELECT SUM(RSDE_LIBERAR)
                        FROM RESERVAS_DETALLE RD, RESERVAS R
                        WHERE R.RESE_ID = RD.RESE_ID AND ARTI_COD = :CODIGO AND RESE_FECHA <= :FECHA AND RESE_VENCE >= :FECHA AND RSDE_ANULADO = 'N'
                        INTO :RESERVADO;
                    if (RESERVADO IS NULL) then
                        RESERVADO = 0;
                    PEDIDO = 0;
                    FOR SELECT P.PEDI_ID, PEDE_ITEM, PEDE_CANT * PEDE_FACTOR
                        FROM PEDIDOS P, PEDIDOS_DETALLE PD, PUNTO_VENTA PT
                        WHERE P.PEDI_ID = PD.PEDI_ID AND PD.ARTI_COD = :CODIGO AND PT.ptvt_id = P.PTVT_ID AND PEDI_VENCE >= :FECHA AND PEDI_FECHA <= :FECHA AND PEDE_ANULADO = 'N'
                        INTO :ID, :ITEM, :CANT2
                        do
                        BEGIN
                        EXECUTE PROCEDURE FALTANTE(34, 31, ID, ITEM) returning_values (ORDENC, UND, FACTOR);
                        if ((ORDENC * FACTOR = CANT2) or (PEDAUTO = 'SI')) then /* SI NO SE HA FACTURADO MIRE A VER SI SE REMISIONO */
                            EXECUTE PROCEDURE FALTANTE(34, 32, ID, ITEM) returning_values (ORDENC, UND, FACTOR);
                        if (ORDENC IS NULL) then
                            ORDENC = 0;
                        PEDIDO = PEDIDO + ORDENC * FACTOR;
                        END
                    if (PEDIDO IS NULL) then
                        PEDIDO = 0;
                    RESERVADO = RESERVADO + PEDIDO;
                    END
                ELSE
                    BEGIN
                    RESERVADO = 0;
                    ORDENADO = 0;
                    END
                if (LISTA > 0) then
                    SELECT prar_fijo FROM precios_articulo WHERE arti_cod = :CODIGO and lipr_cod = :LISTA INTO :PRECIO;

                if (ENPESO = 'S') then
                    BEGIN
                    if (pesounit IS NULL) then
                        pesounit = 0;
                    if (PESOUNIT <> 0) then
                        BEGIN
                        pesototal = PESOUNIT * cant;
                        SUSPEND;
                        END
                    END
                ELSE
                    SUSPEND;
                END
            END
        END
  END
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE EXISTENCIAS_UNIDAD(
    ARTICULO VARCHAR(15),
    FECHA DATE,
    UNIDAD VARCHAR(8))
RETURNS (
    BODEGA VARCHAR(2),
    EXISTENCIA NUMERIC(18,2),
    RESERVADO NUMERIC(18,2),
    DISPONIBLE NUMERIC(18,2),
    ORDENADO NUMERIC(18,2),
    STAND VARCHAR(20),
    NOMBOD VARCHAR(30))
AS
declare variable FACTOR NUMERIC(15,4);
declare variable ORDENC NUMERIC(18,4);
declare variable PEDIDO NUMERIC(18,4);
declare variable ITEM INTEGER;
declare variable ID INTEGER;
declare variable UND VARCHAR(8);
declare variable CANT NUMERIC(18,4);
declare variable factor2 NUMERIC(18,4);
declare variable PEDAUTO CHAR(2);
declare variable BODINA CHAR(2);
BEGIN
EXECUTE PROCEDURE FACTOR_UNIDAD_CANT(:ARTICULO, :UNIDAD) returning_values (:FACTOR);
EXECUTE PROCEDURE lee_configuracion ('INVENTARIO', 'EXISTENCIAS', 'MOSTRAR BODEGAS INACTIVAS EN CONSULTA DE EXISTENCIAS') returning_values (:BODINA);
for select bode_cod, BODE_NOM from bodega where ((bode_activa = 'S') or (:BODINA = 'SI')) order by bode_cod into :bodega, :nombod
    do
    begin
    SELECT STAND_COD FROM STANDS WHERE ARTI_COD = :ARTICULO AND STAND_BODEGA = :BODEGA INTO :stand;
    execute procedure saldo_inventario (:articulo, :bodega, :fecha) returning_values (:Existencia);
    if (FACTOR <> 0) then
        EXISTENCIA = EXISTENCIA / FACTOR;
    else
        EXISTENCIA = 0;
    /* LO ORDENADO */
    SELECT SUM(ORID_ENTREGAR)
      FROM ORDENINVENTARIO_DETALLE OD, ordenes_inventario O
      WHERE O.ORIN_ID = OD.ORIN_ID AND ARTI_COD = :ARTICULO AND ORIN_FECHA <= :FECHA AND ORIN_FECLLEGA >= :FECHA AND ORID_ANULADO = 'N' AND OD.BODE_COD = :BODEGA
      INTO :ORDENADO;
    if (ORDENADO IS NULL) then
        ORDENADO = 0;
    ORDENC = 0;
    FOR SELECT O.ORDC_ID, OCDE_ITEM, OCDE_CANT * OCDE_FACTOR
        FROM ORDENES_COMPRA O, ORDENES_COMPRA_DETALLE OD
        WHERE O.ORDC_ID = OD.ORDC_ID AND OD.ARTI_COD = :ARTICULO AND (ORDC_FECHA+ORDC_VALIDEZ) >= :FECHA AND ORDC_FECHA <= :FECHA AND OCDE_ANULADO = 'N' AND OD.BODE_COD = :BODEGA
        INTO :ID, :ITEM, :CANT
        do
        BEGIN
        EXECUTE PROCEDURE FALTANTE(23, 21, ID, ITEM) returning_values (PEDIDO, UND, FACTOR2);
        if (PEDIDO * FACTOR2 = CANT) then /* SI NO SE HA FACTURADO MIRE A VER SI SE REMISIONO */
            EXECUTE PROCEDURE FALTANTE(23, 22, ID, ITEM) returning_values (PEDIDO, UND, FACTOR2);
        if (PEDIDO IS NULL) then
            PEDIDO = 0;
        ORDENC = ORDENC + PEDIDO * FACTOR2;
        END
    ORDENADO = ORDENADO + ORDENC;
    if (FACTOR <> 0) then
        ORDENADO = ORDENADO / FACTOR;
    /* LO RESERVADO */
    SELECT SUM(RSDE_LIBERAR)
      FROM RESERVAS_DETALLE RD, RESERVAS R
      WHERE R.RESE_ID = RD.RESE_ID AND ARTI_COD = :ARTICULO AND RESE_FECHA <= :FECHA AND RESE_VENCE >= :FECHA AND RD.BODE_COD = :BODEGA AND RSDE_ANULADO = 'N'
      INTO :RESERVADO;
    if (RESERVADO IS NULL) then
        RESERVADO = 0;
    PEDIDO = 0;
    FOR SELECT P.PEDI_ID, PEDE_ITEM, PEDE_CANT * PEDE_FACTOR
        FROM PEDIDOS P, PEDIDOS_DETALLE PD
        WHERE P.PEDI_ID = PD.PEDI_ID AND PD.ARTI_COD = :ARTICULO AND (PEDI_FECHA+PEDI_VALIDEZ) >= :FECHA AND PEDI_FECHA <= :FECHA AND PEDE_ANULADO = 'N' AND BODE_COD = :BODEGA
        INTO :ID, :ITEM, :CANT
        do
        BEGIN
        EXECUTE PROCEDURE FALTANTE(34, 31, ID, ITEM) returning_values (ORDENC, UND, FACTOR2);
        EXECUTE PROCEDURE LEE_CONFIGURACION('FACTURACION', 'FACTURAS', 'GENERAR PEDIDO AUTOMATICAMENTE CON LA FACTURA') returning_values (pedauto);
        if ((ORDENC * FACTOR2 = CANT) or (PEDAUTO = 'SI')) then /* SI NO SE HA FACTURADO MIRE A VER SI SE REMISIONO */
            EXECUTE PROCEDURE FALTANTE(34, 32, ID, ITEM) returning_values (ORDENC, UND, FACTOR2);
        if (ORDENC IS NULL) then
            ORDENC = 0;
        PEDIDO = PEDIDO + ORDENC * FACTOR2;
        END
    RESERVADO = RESERVADO + PEDIDO;
    if (FACTOR <> 0) then
        RESERVADO = RESERVADO / FACTOR;
    DISPONIBLE = EXISTENCIA - RESERVADO;
    SUSPEND;
    end
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE EXISTENCIAS_WEB(
    ARTICULO VARCHAR(15),
    FECHA DATE)
RETURNS (
    BODEGA VARCHAR(2),
    EXISTENCIA NUMERIC(18,2),
    RESERVADO NUMERIC(18,2),
    DISPONIBLE NUMERIC(18,2),
    ORDENADO NUMERIC(18,2))
AS
declare variable ordenc numeric(18,4);
declare variable pedido numeric(18,4);
declare variable item integer;
declare variable id integer;
declare variable und varchar(8);
declare variable cant numeric(18,4);
declare variable factor2 numeric(18,4);
begin
for select bode_cod from bodega order by bode_cod into :bodega
    do
    begin
    execute procedure saldo_inventario (:articulo, :bodega, :fecha) returning_values (:Existencia);
    select sum(ORID_ENTREGAR)
      from ORDENINVENTARIO_DETALLE OD, ordenes_inventario O
      where O.ORIN_ID = OD.ORIN_ID and ARTI_COD = :ARTICULO and ORIN_FECHA <= :FECHA and ORIN_FECLLEGA >= :FECHA and ORID_ANULADO = 'N' and OD.BODE_COD = :BODEGA
      into :ORDENADO;
    if (ORDENADO is null) then
        ORDENADO = 0;
    ORDENC = 0;
    for select O.ORDC_ID, OCDE_ITEM, OCDE_CANT * OCDE_FACTOR
        from ORDENES_COMPRA O, ORDENES_COMPRA_DETALLE OD
        where O.ORDC_ID = OD.ORDC_ID and OD.ARTI_COD = :ARTICULO and (ORDC_FECHA+ORDC_VALIDEZ) >= :FECHA and ORDC_FECHA <= :FECHA and OCDE_ANULADO = 'N' and OD.BODE_COD = :BODEGA
        into :ID, :ITEM, :CANT
        do
        begin
        execute procedure FALTANTE(23, 21, ID, ITEM) returning_values (PEDIDO, UND, FACTOR2);
        if (PEDIDO * FACTOR2 = CANT) then /* SI NO SE HA FACTURADO MIRE A VER SI SE REMISIONO */
            execute procedure FALTANTE(23, 22, ID, ITEM) returning_values (PEDIDO, UND, FACTOR2);
        if (PEDIDO is null) then
            PEDIDO = 0;
        ORDENC = ORDENC + PEDIDO * FACTOR2;
        end
    ORDENADO = ORDENADO + ORDENC;
    select sum(RSDE_LIBERAR)
      from RESERVAS_DETALLE RD, RESERVAS R
      where R.RESE_ID = RD.RESE_ID and ARTI_COD = :ARTICULO and RESE_FECHA <= :FECHA and RESE_VENCE >= :FECHA and RD.BODE_COD = :BODEGA and RSDE_ANULADO = 'N'
      into :RESERVADO;
    if (RESERVADO is null) then
        RESERVADO = 0;
    PEDIDO = 0;
    for select P.PEDI_ID, PEDE_ITEM, PEDE_CANT * PEDE_FACTOR
        from PEDIDOS P, PEDIDOS_DETALLE PD
        where P.PEDI_ID = PD.PEDI_ID and PD.ARTI_COD = :ARTICULO and (PEDI_FECHA+PEDI_VALIDEZ) >= :FECHA and PEDI_FECHA <= :FECHA and PEDE_ANULADO = 'N' and BODE_COD = :BODEGA
        into :ID, :ITEM, :CANT
        do
        begin
        execute procedure FALTANTE(34, 31, ID, ITEM) returning_values (ORDENC, UND, FACTOR2);
        if (ORDENC * FACTOR2 = CANT) then /* SI NO SE HA FACTURADO MIRE A VER SI SE REMISIONO */
            execute procedure FALTANTE(34, 32, ID, ITEM) returning_values (ORDENC, UND, FACTOR2);
        if (ORDENC is null) then
            ORDENC = 0;
        PEDIDO = PEDIDO + ORDENC * FACTOR2;
        end
    RESERVADO = RESERVADO + PEDIDO;
    DISPONIBLE = EXISTENCIA - RESERVADO;
    suspend;
    end
end
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE FALTANTES_VENTAS_ARTICULO(
    DESDE VARCHAR(20),
    HASTA VARCHAR(20),
    FECINI DATE,
    FECFIN DATE,
    DETALLE CHAR(1),
    TIPO INTEGER,
    DESTINO INTEGER,
    ORDEN CHAR(1),
    CEROS CHAR(1),
    CORTE DATE,
    SUCURSAL INTEGER)
RETURNS (
    ARTICULO VARCHAR(15),
    DESCRIPCION VARCHAR(60),
    CODGRUPO VARCHAR(2),
    NOMGRUPO VARCHAR(30),
    CODSUBG VARCHAR(3),
    NOMSUBG VARCHAR(30),
    CODMARC VARCHAR(3),
    NOMMARC VARCHAR(30),
    CANTIDAD NUMERIC(18,4),
    UNIDAD VARCHAR(8),
    FALTANTE NUMERIC(18,4),
    BASE NUMERIC(18,2),
    COSTOUN NUMERIC(18,2),
    COSTOTOT NUMERIC(18,2),
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(8),
    FECHA DATE,
    PTVTA INTEGER,
    NIT VARCHAR(20),
    NOMCLIENTE VARCHAR(60),
    CIUDAD VARCHAR(60),
    OBS VARCHAR(255),
    BOD VARCHAR(2))
AS
declare variable ID INTEGER;
declare variable ITEM INTEGER;
declare variable CANT NUMERIC(18,2);
declare variable CODINI VARCHAR(15);
declare variable CODFIN VARCHAR(15);
declare variable DESINI VARCHAR(15);
declare variable DESFIN VARCHAR(15);
declare variable MONTO NUMERIC(18,2);
declare variable FACTOR NUMERIC(18,4);
BEGIN
if (ORDEN = 'C') then
    BEGIN
    CODINI = DESDE;
    CODFIN = HASTA;
    DESINI = '';
    DESFIN = 'zz';
    END
ELSE
    BEGIN
    DESINI = DESDE;
    DESFIN = HASTA;
    CODINI = '';
    CODFIN = 'zz';
    END
  FOR SELECT ARTI_COD, ARTI_DES, ARTI_UNIDAD, A.GRUP_COD, A.SUBG_COD, A.MARC_COD FROM ARTICULO A
      WHERE ARTI_COD >= :CODINI AND ARTI_COD <= :CODFIN AND ARTI_DES >= :DESINI AND ARTI_DES <= :DESFIN
      INTO :ARTICULO, :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
  DO
    BEGIN
    CANTIDAD = 0;
    faltante = 0;
    base = 0;
    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 (DETALLE = 'N') then
        BEGIN
        if (TIPO = 31) then
            BEGIN
            FOR SELECT F.FACT_ID, FADE_ITEM, FADE_CANT * FADE_FACTOR, (FADE_PRUNIT-FADE_DTOMONTO), D.BODE_COD, F.ptvt_id
                FROM FACTURAS_DETALLE D, FACTURAS F, PREFIJOS P
                WHERE F.FACT_ID = D.FACT_ID AND ARTI_COD = :ARTICULO AND FACT_FECHA >= :FECINI AND FACT_FECHA <= :FECFIN AND FACT_ANULADO = 'N' AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 31 AND ((SUCU_ID = :SUCURSAL) or (:SUCURSAL = 0)) and substring(arti_cod from 1 FOR 2) <> '.t'
                ORDER BY F.FACT_ID, FADE_ITEM INTO :ID, :ITEM, :CANT, :MONTO, :BOD, :PTVTA
                DO
                BEGIN
                CANTIDAD = CANTIDAD + CANT;
                EXECUTE PROCEDURE FALTANTE_CORTE(:TIPO, :DESTINO, :ID, :ITEM, :CORTE) returning_values (:CANT, :UNIDAD, :FACTOR);
                FALTANTE = FALTANTE + CANT;
                BASE = BASE + MONTO * CANT;
                END
            execute procedure costo_promedio(:articulo, :corte) returning_values (:costoun);
            costotot = CANTIDAD * costoun;
            END
        if (TIPO = 32) then
            BEGIN
            FOR SELECT R.revt_id, rvde_item, RVDE_CANT * RVDE_FACTOR, (RVDE_PRUNIT-RVDE_DTOMONTO), D.bode_cod, R.ptvt_id
                FROM REMISIONES_VENTA_DETALLE D, REMISIONES_VENTA R, PREFIJOS P
                WHERE R.REVT_ID = D.REVT_ID AND ARTI_COD = :ARTICULO AND REVT_FECHA >= :FECINI AND REVT_FECHA <= :FECFIN AND REVT_ANULADO = 'N' AND P.PREF_PRE = R.PREF_PRE AND P.TIDO_COD = 32  AND ((SUCU_ID = :SUCURSAL) or (:SUCURSAL = 0))
                ORDER BY R.REVT_ID, RVDE_ITEM INTO :ID, :ITEM, :CANT, :MONTO, :BOD, :PTVTA
                DO
                BEGIN
                CANTIDAD = CANTIDAD + CANT;
                EXECUTE PROCEDURE FALTANTE_CORTE(:TIPO, :DESTINO, :ID, :ITEM, :CORTE) returning_values (:CANT, :UNIDAD, :FACTOR);
                FALTANTE = FALTANTE + CANT;
                BASE = BASE + MONTO * CANT;
                END
            execute procedure costo_promedio(:articulo, :corte) returning_values (:costoun);
            costotot = CANTIDAD * costoun;
            END
        if (TIPO = 34) then
            BEGIN
            FOR SELECT P.PEDI_ID, PEDE_ITEM, PEDE_CANT * PEDE_FACTOR, (PEDE_PRUNIT-PEDE_DTOMONTO), D.bode_cod, P.ptvt_id
                FROM PEDIDOS_DETALLE D, PEDIDOS P, PREFIJOS R
                WHERE P.PEDI_ID = D.PEDI_ID AND ARTI_COD = :ARTICULO AND PEDI_FECHA >= :FECINI AND PEDI_FECHA <= :FECFIN AND PEDI_VALIDEZ >= 0
                AND PEDI_ANULADO = 'N' AND P.PREF_PRE = R.PREF_PRE AND R.TIDO_COD = 34  AND ((SUCU_ID = :SUCURSAL) or (:SUCURSAL = 0))
                ORDER BY P.PEDI_ID, PEDE_ITEM INTO :ID, :ITEM, :CANT, :MONTO, :bod, :PTVTA
                DO
                BEGIN
                CANTIDAD = CANTIDAD + CANT;
                EXECUTE PROCEDURE FALTANTE_CORTE(:TIPO, :DESTINO, :ID, :ITEM, :CORTE) returning_values (:CANT, :UNIDAD, :FACTOR);
                FALTANTE = FALTANTE + CANT;
                BASE = BASE + MONTO * CANT;
                END
            execute procedure costo_promedio(:articulo, :corte) returning_values (:costoun);
            costotot = CANTIDAD * costoun;
            END
        if (TIPO = 35) then
            BEGIN
            FOR SELECT C.COTI_ID, CTDE_ITEM, CTDE_CANT * CTDE_FACTOR, (CTDE_PRUNIT-CTDE_DTOMONTO), C.ptvt_id
                FROM COTIZACIONES_DETALLE D, COTIZACIONES C, PREFIJOS P
                WHERE C.COTI_ID = D.COTI_ID AND ARTI_COD = :ARTICULO AND COTI_FECHA >= :FECINI AND COTI_FECHA <= :FECFIN AND COTI_ANULADO = 'N' AND P.PREF_PRE = C.PREF_PRE AND P.TIDO_COD = 35  AND ((SUCU_ID = :SUCURSAL) or (:SUCURSAL = 0))
                ORDER BY C.COTI_ID, CTDE_ITEM INTO :ID, :ITEM, :CANT, :MONTO, :PTVTA
                DO
                BEGIN
                BOD = '';
                CANTIDAD = CANTIDAD + CANT;
                EXECUTE PROCEDURE FALTANTE_CORTE(:TIPO, :DESTINO, :ID, :ITEM, :CORTE) returning_values (:CANT, :UNIDAD, :FACTOR);
                FALTANTE = FALTANTE + CANT;
                BASE = BASE + MONTO * CANT;
                END
            execute procedure costo_promedio(:articulo, :corte) returning_values (:costoun);
            costotot = CANTIDAD * costoun;
            END
        if (TIPO = 40) then
            BEGIN
            FOR SELECT P.pend_id, D.pevd_item, D.pevd_cant * D.pevd_factor, (D.pevd_prunit-D.pevd_dtomonto), D.bode_cod
                FROM pendiente_ventas_detalle D, pendiente_ventas P, PREFIJOS R
                WHERE P.pend_id = D.pend_id AND ARTI_COD = :ARTICULO AND PEND_FECHA >= :FECINI AND PEND_FECHA <= :FECFIN AND
                PEND_ANULADO = 'N' AND P.PREF_PRE = R.PREF_PRE AND R.TIDO_COD = 40  AND ((SUCU_ID = :SUCURSAL) or (:SUCURSAL = 0))
                ORDER BY P.pend_id, D.pevd_item INTO :ID, :ITEM, :CANT, :MONTO, :bod
                DO
                BEGIN
                CANTIDAD = CANTIDAD + CANT;
                EXECUTE PROCEDURE FALTANTE(:TIPO, :DESTINO, :ID, :ITEM) returning_values (:CANT, :UNIDAD, :FACTOR);
                FALTANTE = FALTANTE + CANT;
                BASE = BASE + MONTO * CANT;
                END
            execute procedure costo_promedio(:articulo, :corte) returning_values (:costoun);
            costotot = CANTIDAD * costoun;
            END
        if (CANTIDAD IS NULL) then
            CANTIDAD = 0;
        if (BASE IS NULL) then
            BASE = 0;
        if (FALTANTE IS NULL) then
            FALTANTE = 0;
        if (CEROS = 'S') then
            SUSPEND;
        ELSE
            if (FALTANTE <> 0) then
                SUSPEND;
        END
    ELSE
        BEGIN
        if (TIPO = 31) then
            FOR SELECT F.FACT_ID, FADE_ITEM, F.PREF_PRE, FACT_NUMERO, FACT_FECHA, FADE_CANT * FADE_FACTOR, (FADE_PRUNIT-FADE_DTOMONTO), SUBSTRING(FACT_OBS FROM 1 FOR 255), D.bode_cod, F.ptvt_id, F.terc_nit, F.fact_nomcliente
                FROM FACTURAS F, FACTURAS_DETALLE D, PREFIJOS P
                WHERE F.FACT_ID = D.FACT_ID AND ARTI_COD = :ARTICULO AND FACT_FECHA >= :FECINI AND FACT_FECHA <= :FECFIN AND FACT_ANULADO = 'N' AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 31 AND ((SUCU_ID = :SUCURSAL) or (:SUCURSAL = 0)) and substring(arti_cod from 1 FOR 2) <> '.t'
                ORDER BY F.FACT_ID, FADE_ITEM
                INTO :ID, :ITEM, :PREFIJO, :NUMERO, :FECHA, :CANTIDAD, :BASE, :OBS, :bod, :PTVTA, :nit, :nomcliente
                DO
                    BEGIN
                    EXECUTE PROCEDURE FALTANTE_CORTE(:TIPO, :DESTINO, :ID, :ITEM, :CORTE) returning_values (:FALTANTE, :UNIDAD, :FACTOR);
                    if ((CEROS = 'S') or (FALTANTE <> 0)) then
                        BEGIN
                        CIUDAD = '';
                        SELECT CIUD_NOM FROM CIUDADES C, TERCEROS T WHERE T.terc_nit = :NIT AND T.ciud_cod = C.ciud_cod INTO :CIUDAD;
                        execute procedure costo_promedio(:articulo, :corte) returning_values (:costoun);
                        costotot = CANTIDAD * costoun;
                        SUSPEND;
                        END
                    END
        if (TIPO = 32) then
            FOR SELECT R.REVT_ID, RVDE_ITEM, R.PREF_PRE, REVT_NUMERO, REVT_FECHA, RVDE_CANT * RVDE_FACTOR, (RVDE_PRUNIT-RVDE_DTOMONTO), SUBSTRING(REVT_OBS FROM 1 FOR 255), D.bode_cod, R.ptvt_id, R.terc_nit, R.revt_nomterc
                FROM REMISIONES_VENTA R, REMISIONES_VENTA_DETALLE D, PREFIJOS P
                WHERE R.REVT_ID = D.REVT_ID AND ARTI_COD = :ARTICULO AND REVT_FECHA >= :FECINI AND REVT_FECHA <= :FECFIN AND REVT_ANULADO = 'N' AND P.PREF_PRE = R.PREF_PRE AND P.TIDO_COD = 32 AND ((SUCU_ID = :SUCURSAL) or (:SUCURSAL = 0))
                INTO :ID, :ITEM, :PREFIJO, :NUMERO, :FECHA, :CANTIDAD, :BASE, :OBS, :bod, :PTVTA, :nit, :nomcliente
                DO
                    BEGIN
                    EXECUTE PROCEDURE FALTANTE_CORTE(:TIPO, :DESTINO, :ID, :ITEM, :CORTE) returning_values (:FALTANTE, :UNIDAD, :FACTOR);
                    if ((CEROS = 'S') or (FALTANTE <> 0)) then
                        BEGIN
                        CIUDAD = '';
                        SELECT CIUD_NOM FROM CIUDADES C, TERCEROS T WHERE T.terc_nit = :NIT AND T.ciud_cod = C.ciud_cod INTO :CIUDAD;
                        execute procedure costo_promedio(:articulo, :corte) returning_values (:costoun);
                        costotot = CANTIDAD * costoun;
                        SUSPEND;
                        END
                    END
        if (TIPO = 34) then
            FOR SELECT P.PEDI_ID, PEDE_ITEM, P.PREF_PRE, PEDI_NUMERO, PEDI_FECHA, PEDE_CANT * PEDE_FACTOR, (PEDE_PRUNIT-PEDE_DTOMONTO), SUBSTRING(PEDI_OBS FROM 1 FOR 255), D.bode_cod, P.ptvt_id, P.terc_nit, P.pedi_nomterc
                FROM PEDIDOS P, PEDIDOS_DETALLE D, PREFIJOS R
                WHERE P.PEDI_ID = D.PEDI_ID AND ARTI_COD = :ARTICULO AND PEDI_FECHA >= :FECINI AND PEDI_FECHA <= :FECFIN AND PEDI_VALIDEZ >= 0
                AND PEDI_ANULADO = 'N' AND P.PREF_PRE = R.PREF_PRE AND R.TIDO_COD = 34 AND ((SUCU_ID = :SUCURSAL) or (:SUCURSAL = 0))
                INTO :ID, :ITEM, PREFIJO, :NUMERO, :FECHA, :CANTIDAD, :BASE, :OBS, :bod, :PTVTA, :nit, :nomcliente
                DO
                    BEGIN
                    EXECUTE PROCEDURE FALTANTE_CORTE(:TIPO, :DESTINO, :ID, :ITEM, :CORTE) returning_values (:FALTANTE, :UNIDAD, :FACTOR);
                    if ((CEROS = 'S') or (FALTANTE <> 0)) then
                        BEGIN
                        CIUDAD = '';
                        SELECT CIUD_NOM FROM CIUDADES C, TERCEROS T WHERE T.terc_nit = :NIT AND T.ciud_cod = C.ciud_cod INTO :CIUDAD;
                        execute procedure costo_promedio(:articulo, :corte) returning_values (:costoun);
                        costotot = CANTIDAD * costoun;
                        SUSPEND;
                        END
                    END
        if (TIPO = 35) then
            FOR SELECT C.COTI_ID, CTDE_ITEM, C.PREF_PRE, COTI_NUMERO, COTI_FECHA, CTDE_CANT * CTDE_FACTOR, (CTDE_PRUNIT-CTDE_DTOMONTO), SUBSTRING(COTI_OBS FROM 1 FOR 255), C.ptvt_id, C.terc_nit, C.coti_nomterc
                FROM COTIZACIONES C, COTIZACIONES_DETALLE D, PREFIJOS P
                WHERE C.COTI_ID = D.COTI_ID AND ARTI_COD = :ARTICULO AND COTI_FECHA >= :FECINI AND COTI_FECHA <= :FECFIN AND COTI_ANULADO = 'N' AND P.PREF_PRE = C.PREF_PRE AND P.TIDO_COD = 35 AND ((SUCU_ID = :SUCURSAL) or (:SUCURSAL = 0))
                INTO :ID, :ITEM, PREFIJO, :NUMERO, :FECHA, :CANTIDAD, :BASE, :OBS, :PTVTA, :nit, :nomcliente
                DO
                    BEGIN
                    BOD = '';
                    EXECUTE PROCEDURE FALTANTE_CORTE(:TIPO, :DESTINO, :ID, :ITEM, :CORTE) returning_values (:FALTANTE, :UNIDAD, :FACTOR);
                    if ((CEROS = 'S') or (FALTANTE <> 0)) then
                        BEGIN
                        CIUDAD = '';
                        SELECT CIUD_NOM FROM CIUDADES C, TERCEROS T WHERE T.terc_nit = :NIT AND T.ciud_cod = C.ciud_cod INTO :CIUDAD;
                        execute procedure costo_promedio(:articulo, :corte) returning_values (:costoun);
                        costotot = CANTIDAD * costoun;
                        SUSPEND;
                        END
                    END
        if (TIPO = 40) then
            FOR SELECT P.pend_id, D.pevd_item, P.PREF_PRE, P.pend_numero, PEND_FECHA, D.pevd_cant * D.pevd_factor, (D.pevd_prunit-D.pevd_dtomonto), SUBSTRING(P.pend_obs FROM 1 FOR 255), D.bode_cod
                FROM pendiente_ventas P, pendiente_ventas_detalle D, PREFIJOS R
                WHERE P.pend_id = D.pend_id AND ARTI_COD = :ARTICULO AND PEND_FECHA >= :FECINI AND PEND_FECHA <= :FECFIN AND PEND_ANULADO = 'N'
                AND P.PREF_PRE = R.PREF_PRE AND R.TIDO_COD = 40 AND ((SUCU_ID = :SUCURSAL) or (:SUCURSAL = 0))
                INTO :ID, :ITEM, PREFIJO, :NUMERO, :FECHA, :CANTIDAD, :BASE, :OBS, :bod
                DO
                    BEGIN
                    EXECUTE PROCEDURE FALTANTE(:TIPO, :DESTINO, :ID, :ITEM) returning_values (:FALTANTE, :UNIDAD, :FACTOR);
                    if ((CEROS = 'S') or (FALTANTE <> 0)) then
                        BEGIN
                        CIUDAD = '';
                        SELECT CIUD_NOM FROM CIUDADES C, TERCEROS T WHERE T.terc_nit = :NIT AND T.ciud_cod = C.ciud_cod INTO :CIUDAD;
                        execute procedure costo_promedio(:articulo, :corte) returning_values (:costoun);
                        costotot = CANTIDAD * costoun;
                        SUSPEND;
                        END
                    END
        END
    END
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE FALTANTE_DOCUMENTO(
    TIPORI INTEGER,
    TIPDES INTEGER,
    IDORI INTEGER)
RETURNS (
    ARTI VARCHAR(20),
    DES VARCHAR(60),
    CANT NUMERIC(18,4),
    UNIDAD VARCHAR(8),
    BOD VARCHAR(2),
    PRUNIT NUMERIC(18,2),
    DTO NUMERIC(9,2),
    TOTAL NUMERIC(18,2))
AS
declare variable ITEM INTEGER;
declare variable FACTOR NUMERIC(18,4);
begin
    if (TIPORI = 21) then
        BEGIN
        FOR SELECT FCDE_ITEM, FCDE_CODBAR, FCDE_DESC, BODE_COD, FCDE_PRUNIT, FCDE_DTOPORC, FCDE_TOTAL FROM FACTURAS_COMPRAS_DETALLE
            WHERE FACO_ID = :IDORI ORDER BY FCDE_ITEM INTO :ITEM, :ARTI, :DES, :BOD, :PRUNIT, :DTO, :TOTAL DO
            BEGIN
            EXECUTE PROCEDURE faltante(:TIPORI, :TIPDES, :IDORI, :ITEM) returning_values (:CANT, :UNIDAD, :FACTOR);
            if (CANT <> 0) then
                SUSPEND;
            END
        END
    if (TIPORI = 22) then
        BEGIN
        FOR SELECT RPVD_ITEM, RPVD_CODBAR, RPVD_DESC, BODE_COD, RPVD_PRUNIT, RPVD_DTOPORC, RPVD_TOTAL  FROM remision_proveedor_det
            WHERE REPR_ID = :IDORI ORDER BY RPVD_ITEM INTO :ITEM, :ARTI, :DES, :BOD, :PRUNIT, :DTO, :TOTAL DO
            BEGIN
            EXECUTE PROCEDURE faltante(:TIPORI, :TIPDES, :IDORI, :ITEM) returning_values (:CANT, :UNIDAD, :FACTOR);
            if (CANT <> 0) then
                SUSPEND;
            END
        END
    if (TIPORI = 23) then
        BEGIN
        FOR SELECT OCDE_ITEM, OCDE_CODBAR, OCDE_DESC, BODE_COD, OCDE_PRUNIT, OCDE_DTOPORC, OCDE_TOTAL FROM ORDENES_COMPRA_DETALLE
            WHERE ORDC_ID = :IDORI ORDER BY OCDE_ITEM INTO :ITEM, :ARTI, :DES, :BOD, :PRUNIT, :DTO, :TOTAL DO
            BEGIN
            EXECUTE PROCEDURE faltante(:TIPORI, :TIPDES, :IDORI, :ITEM) returning_values (:CANT, :UNIDAD, :FACTOR);
            if (CANT <> 0) then
                SUSPEND;
            END
        END
    if (TIPORI = 25) then
        BEGIN
        FOR SELECT CPRD_ITEM, CPRD_CODBAR, CPRD_DESC, BODE_COD, CPRD_PRUNIT, CPRD_DTOPORC, CPRD_TOTAL FROM COTIZACIONES_PROVEEDOR_DET
            WHERE COPR_ID = :IDORI ORDER BY CPRD_ITEM INTO :ITEM, :ARTI, :DES, :BOD, :PRUNIT, :DTO, :TOTAL DO
            BEGIN
            EXECUTE PROCEDURE faltante(:TIPORI, :TIPDES, :IDORI, :ITEM) returning_values (:CANT, :UNIDAD, :FACTOR);
            if (CANT <> 0) then
                SUSPEND;
            END
        END
    if (TIPORI = 31) then
        BEGIN
        FOR SELECT FADE_ITEM, FADE_CODBAR, FADE_DESC, BODE_COD, FADE_PRUNIT, FADE_DTOPORC, FADE_TOTAL FROM FACTURAS_DETALLE
            WHERE FACT_ID = :IDORI and substring(arti_cod from 1 FOR 2) <> '.t' ORDER BY FADE_ITEM INTO :ITEM, :ARTI, :DES, :BOD, :PRUNIT, :DTO, :TOTAL DO
            BEGIN
            EXECUTE PROCEDURE faltante(:TIPORI, :TIPDES, :IDORI, :ITEM) returning_values (:CANT, :UNIDAD, :FACTOR);
            if (CANT <> 0) then
                SUSPEND;
            END
        END
    if (TIPORI = 32) then
        BEGIN
        FOR SELECT RVDE_ITEM, RVDE_CODBAR, RVDE_DESC, BODE_COD, RVDE_PRUNIT, RVDE_DTOPORC, RVDE_TOTAL FROM remisiones_venta_detalle
            WHERE REVT_ID = :IDORI ORDER BY RVDE_ITEM INTO :ITEM, :ARTI, :DES, :BOD, :PRUNIT, :DTO, :TOTAL DO
            BEGIN
            EXECUTE PROCEDURE faltante(:TIPORI, :TIPDES, :IDORI, :ITEM) returning_values (:CANT, :UNIDAD, :FACTOR);
            if (CANT <> 0) then
                SUSPEND;
            END
        END
    if (TIPORI = 34) then
        BEGIN
        FOR SELECT PEDE_ITEM, PEDE_CODBAR, PEDE_DESC, BODE_COD, PEDE_PRUNIT, PEDE_DTOPORC, PEDE_TOTAL FROM PEDIDOS_DETALLE
            WHERE PEDI_ID = :IDORI ORDER BY PEDE_ITEM INTO :ITEM, :ARTI, :DES, :BOD, :PRUNIT, :DTO, :TOTAL DO
            BEGIN
            EXECUTE PROCEDURE faltante(:TIPORI, :TIPDES, :IDORI, :ITEM) returning_values (:CANT, :UNIDAD, :FACTOR);
            if (CANT <> 0) then
                SUSPEND;
            END
        END
    if (TIPORI = 35) then
        BEGIN
        FOR SELECT CTDE_ITEM, CTDE_CODBAR, CTDE_DESC, CTDE_PRUNIT, CTDE_DTOPORC, CTDE_TOTAL FROM COTIZACIONES_DETALLE
            WHERE COTI_ID = :IDORI ORDER BY CTDE_ITEM INTO :ITEM, :ARTI, :DES, :PRUNIT, :DTO, :TOTAL DO
            BEGIN
            EXECUTE PROCEDURE faltante(:TIPORI, :TIPDES, :IDORI, :ITEM) returning_values (:CANT, :UNIDAD, :FACTOR);
            if (CANT <> 0) then
                SUSPEND;
            END
        END
    if (TIPORI = 40) then
        BEGIN
        FOR SELECT PEVD_ITEM, PEVD_CORBAR, PEVD_DESC, PEVD_PRUNIT, PEVD_DTOPORC, PEVD_TOTAL FROM pendiente_ventas_detalle
            WHERE PEND_ID = :IDORI ORDER BY PEVD_ITEM INTO :ITEM, :ARTI, :DES, :PRUNIT, :DTO, :TOTAL DO
            BEGIN
            EXECUTE PROCEDURE faltante(:TIPORI, :TIPDES, :IDORI, :ITEM) returning_values (:CANT, :UNIDAD, :FACTOR);
            if (CANT <> 0) then
                SUSPEND;
            END
        END
end
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE ORDENES_ARTICULO(
    FECHA DATE,
    DETALLE CHAR(1))
RETURNS (
    CODIGO VARCHAR(15),
    NOMBRE VARCHAR(60),
    ORDEN NUMERIC(18,4),
    EXIST NUMERIC(18,2),
    SUMA NUMERIC(18,2),
    COSTO NUMERIC(18,2),
    UNIDAD VARCHAR(8),
    CODGRUPO VARCHAR(2),
    NOMGRUPO VARCHAR(30),
    CODSUBG VARCHAR(3),
    NOMSUBG VARCHAR(30),
    CODMARC VARCHAR(3),
    NOMMARC VARCHAR(30),
    COSTOTOT NUMERIC(18,2),
    CLIENTE VARCHAR(60),
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(8),
    FECHADOC DATE)
AS
declare variable ORDENC NUMERIC(18,4);
declare variable ID INTEGER;
declare variable ITEM INTEGER;
declare variable UND VARCHAR(8);
declare variable FACTOR NUMERIC(18,4);
declare variable FACT NUMERIC(18,4);
declare variable CANT NUMERIC(18,4);
BEGIN
  FOR
    SELECT ARTI_COD, ARTI_DES, ARTI_UNIDAD, A.GRUP_COD, A.SUBG_COD, A.MARC_COD
      FROM ARTICULO A
      INTO :CODIGO, :NOMBRE, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
      DO
        BEGIN
        EXECUTE PROCEDURE SALDO_TOTAL_INVENTARIO(CODIGO, FECHA) returning_values (EXIST);
        EXECUTE PROCEDURE COSTO_PROMEDIO(CODIGO, FECHA) returning_values (COSTO);
        if (DETALLE = 'N') then
            BEGIN
            NOMMARC = '';
            NOMSUBG = '';
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            SELECT SUM(ORID_ENTREGAR) FROM ordenes_inventario O, ordeninventario_detalle OD
                WHERE O.ORIN_ID = OD.ORIN_ID AND OD.ARTI_COD = :CODIGO AND ORIN_FECHA <= :FECHA AND ORIN_FECLLEGA >= :FECHA AND ORIN_ANULADO = 'N'
                INTO :ORDEN;
            if (ORDEN IS NULL) then
                ORDEN = 0;
            FOR SELECT O.ORDC_ID, OCDE_ITEM, OCDE_CANT * OCDE_FACTOR
                FROM ORDENES_COMPRA O, ORDENES_COMPRA_DETALLE OD
                WHERE O.ORDC_ID = OD.ORDC_ID AND OD.ARTI_COD = :CODIGO AND (ORDC_FECHA+ORDC_VALIDEZ) >= :FECHA AND ORDC_FECHA <= :FECHA AND ORDC_ANULADO = 'N'
                INTO :ID, :item, :CANT
                DO
                BEGIN
                EXECUTE PROCEDURE FALTANTE(23, 21, ID, ITEM) returning_values (ORDENC, UND, FACT);
                if (ORDENC * FACT = CANT) then
                    EXECUTE PROCEDURE FALTANTE(23, 22, ID, ITEM) returning_values (ORDENC, UND, FACT);
                if (ORDENC IS NULL) then
                    ORDENC = 0;
                if (ORDENC <> 0) then
                    BEGIN
                    ORDEN = ORDEN + ORDENC;
                    END
                END
            SUMA = ORDEN + EXIST;
            COSTOTOT = ORDEN * :COSTO;
            if (ORDEN <> 0) then
                SUSPEND;
            END
        ELSE
            BEGIN
            FOR SELECT ORIN_FECHA, PREF_PRE, ORIN_NUMERO, ORIN_NOMTERC, ORID_CANT, ORID_UNIDAD, ORID_ENTREGAR
                FROM ordenes_inventario O, ordeninventario_detalle OD
                WHERE O.ORIN_ID = OD.ORIN_ID AND OD.ARTI_COD = :CODIGO AND ORIN_FECHA <= :FECHA AND ORIN_FECLLEGA > :FECHA AND ORIN_ANULADO = 'N'
                INTO :FECHADOC, :PREFIJO, :NUMERO, :CLIENTE, :EXIST, :UNIDAD, :ORDEN
                DO
                BEGIN
                COSTOTOT = ORDEN * :COSTO;
                SUSPEND;
                END
            FOR SELECT O.ORDC_ID, OCDE_ITEM, ORDC_FECHA, PREF_PRE, ORDC_NUMERO, TERC_NOM, OCDE_CANT, OCDE_UNIDAD, OCDE_ORDENADO, OCDE_FACTOR
                FROM ordenes_compra O, ordenes_compra_detalle OD, TERCEROS T
                WHERE O.ORDC_ID = OD.ORDC_ID AND OD.ARTI_COD = :CODIGO AND O.TERC_NIT = T.TERC_NIT AND ORDC_FECHA <= :FECHA AND (ORDC_FECHA+ordc_validez) > :FECHA AND ORDC_ANULADO = 'N'
                INTO :ID, :ITEM, :FECHADOC, :PREFIJO, :NUMERO, :CLIENTE, :CANT, :UNIDAD, :ORDEN, :FACTOR
                DO
                BEGIN
                EXECUTE PROCEDURE FALTANTE(23, 21, ID, ITEM) returning_values (ORDEN, UND, FACT);
                if (ORDEN * FACT = CANT * FACTOR) then
                    EXECUTE PROCEDURE FALTANTE(23, 22, ID, ITEM) returning_values (ORDEN, UND, FACTOR);
                if (ORDEN IS NULL) then
                    ORDEN = 0;
                COSTOTOT = ORDEN * :COSTO;
                if (ORDEN <> 0) then
                    SUSPEND;
                END
            END
        END
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE ORDENES_ARTICULO_FECHA(
    ARTICULO VARCHAR(15),
    FECHA DATE)
RETURNS (
    FECORD DATE,
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(8),
    FECLLEGA DATE,
    PROVEEDOR VARCHAR(60),
    CANTIDAD NUMERIC(18,2),
    UNIDAD VARCHAR(8),
    TIPO INTEGER,
    ID INTEGER)
AS
declare variable ITEM INTEGER;
declare variable FACTOR NUMERIC(18,4);
declare variable UND VARCHAR(8);
declare variable FACT NUMERIC(18,4);
declare variable ORDENC NUMERIC(18,4);
BEGIN
TIPO = 18;
  /* MUESTRA LAS RESERVAS DEL ARTICULO QUE NO SE HAN VENCIDO */
  FOR SELECT OI.ORIN_ID, ORIN_FECHA, PREF_PRE, ORIN_NUMERO, ORIN_FECLLEGA, ORIN_NOMTERC, ORID_CANT, ORID_UNIDAD
    FROM ORDENES_INVENTARIO OI, ORDENINVENTARIO_DETALLE OD
    WHERE OI.ORIN_ID = OD.ORIN_ID AND OD.ARTI_COD = :ARTICULO AND OI.ORIN_FECLLEGA > :FECHA AND ORIN_FECHA <= :FECHA AND ORID_ANULADO = 'N'
    INTO :ID, :FECORD, :PREFIJO, :NUMERO, :FECLLEGA, :PROVEEDOR, :CANTIDAD, :UNIDAD
        DO
          SUSPEND;
TIPO = 23;
  FOR SELECT O.ORDC_ID, OCDE_ITEM, ORDC_FECHA, PREF_PRE, ORDC_NUMERO, (ORDC_FECHA+ORDC_VALIDEZ), TERC_NOM, OCDE_CANT, OCDE_UNIDAD
    FROM ORDENES_COMPRA O, ORDENES_COMPRA_DETALLE OD, TERCEROS T
    WHERE O.ORDC_ID = OD.ORDC_ID AND OD.ARTI_COD = :ARTICULO AND O.TERC_NIT = T.TERC_NIT AND (ORDC_FECHA+ORDC_VALIDEZ) > :FECHA AND ORDC_FECHA <= :FECHA AND ORDC_ANULADO = 'N'
    INTO :ID, :item, :FECORD, :PREFIJO, :NUMERO, :FECLLEGA, :PROVEEDOR, :CANTIDAD, :UNIDAD
        DO
        BEGIN
        EXECUTE PROCEDURE FALTANTE(23, 21, ID, ITEM) returning_values (ORDENC, UND, FACT);
        if (ORDENC = CANTIDAD) then
            EXECUTE PROCEDURE FALTANTE(23, 22, ID, ITEM) returning_values (ORDENC, UND, FACTOR);
        if (ORDENC IS NULL) then
            ORDENC = 0;
        if (ORDENC <> 0) then
            BEGIN
            CANTIDAD = ORDENC;
            UNIDAD = UND;
            SUSPEND;
            END
        END
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE ORDEN_PROVEEDOR(
    NIT VARCHAR(20),
    FECHA DATE)
RETURNS (
    ARTICULO VARCHAR(20),
    DESCRIPCION VARCHAR(60),
    UNIDAD VARCHAR(8),
    BODEGA VARCHAR(2),
    EXISTENCIA NUMERIC(18,4),
    RESERVADO NUMERIC(18,4),
    ORDENADO NUMERIC(18,4),
    PROMEDIO NUMERIC(18,4),
    VENTAMES NUMERIC(18,4),
    FECHACMP DATE,
    DIAS INTEGER,
    SUGERIDO NUMERIC(18,4),
    STAND VARCHAR(20))
AS
declare variable FACTOR NUMERIC(15,4);
declare variable ORDENC NUMERIC(18,4);
declare variable PEDIDO NUMERIC(18,4);
declare variable ITEM INTEGER;
declare variable ID INTEGER;
declare variable UND VARCHAR(8);
declare variable CANT NUMERIC(18,4);
declare variable FACTOR2 NUMERIC(18,4);
declare variable fecini DATE;
declare variable FECHAAUX VARCHAR(10);
declare variable DEVMES NUMERIC(18,2);
declare variable DIA_ART VARCHAR(2) CHARACTER SET NONE;
declare variable DIASC VARCHAR(255);
declare variable PEDAUTO CHAR(2);
declare variable SALIDAS NUMERIC(18,4);
BEGIN
FOR SELECT A.ARTI_COD, A.ARTI_DES, A.ARTI_UNIDAD FROM ARTICULO A, proveedor_articulo P
  WHERE A.arti_cod = P.arti_cod AND P.terc_nit = :NIT INTO :articulo, :descripcion, :unidad
  DO
  for select bode_cod from bodega into :bodega
    do
    begin
    execute procedure saldo_inventario (:articulo, :bodega, :fecha) returning_values (:Existencia);
    EXECUTE PROCEDURE FACTOR_UNIDAD_CANT(:ARTICULO, :UNIDAD) returning_values (:FACTOR);
    if (FACTOR <> 0) then
        EXISTENCIA = EXISTENCIA / FACTOR;
    else
        EXISTENCIA = 0;
    SELECT STAND_COD FROM STANDS WHERE ARTI_COD = :articulo AND STAND_BODEGA = :bodega INTO :STAND;
    EXECUTE PROCEDURE promedio_salidas_articulo (:ARTICULO, :FECHA, :BODEGA) returning_values (:PROMEDIO, :SALIDAS);
    EXECUTE PROCEDURE lee_configuracion ('INVENTARIO', 'EXISTENCIAS', 'PROMEDIAR LAS SALIDAS DEL INVENTARIO CON EL NUMERO DE DIAS ASIGNADO A CADA ARTICULO') returning_values (:DIA_ART);
    if (DIA_ART = 'NO') then
        BEGIN
        EXECUTE PROCEDURE lee_configuracion ('INVENTARIO', 'EXISTENCIAS', 'NUMERO DE DIAS PARA PROMEDIO DE SALIDAS POR ARTICULO') returning_values (DIASC);
        DIAS = CAST(DIASC AS INTEGER);
        END
    ELSE
        SELECT ARTI_DIAS FROM ARTICULO WHERE ARTI_COD = :ARTICULO INTO :DIAS;
    if (DIAS is null) then
        DIAS = 0;
    PROMEDIO = DIAS * PROMEDIO;
    if (FACTOR <> 0) then
        PROMEDIO = PROMEDIO / FACTOR;
    SUGERIDO = PROMEDIO - EXISTENCIA;
    SELECT SUM(ORID_ENTREGAR)
      FROM ORDENINVENTARIO_DETALLE OD, ordenes_inventario O
      WHERE O.ORIN_ID = OD.ORIN_ID AND ARTI_COD = :ARTICULO AND ORIN_FECHA <= :FECHA AND ORIN_FECLLEGA >= :FECHA AND ORID_ANULADO = 'N' AND OD.BODE_COD = :BODEGA
      INTO :ORDENADO;
    if (ORDENADO IS NULL) then
        ORDENADO = 0;
    ORDENC = 0;
    FOR SELECT O.ORDC_ID, OCDE_ITEM, OCDE_CANT * OCDE_FACTOR
        FROM ORDENES_COMPRA O, ORDENES_COMPRA_DETALLE OD
        WHERE O.ORDC_ID = OD.ORDC_ID AND OD.ARTI_COD = :ARTICULO AND (ORDC_FECHA+ORDC_VALIDEZ) >= :FECHA AND ORDC_FECHA <= :FECHA AND OCDE_ANULADO = 'N' AND OD.BODE_COD = :BODEGA
        INTO :ID, :ITEM, :CANT
        do
        BEGIN
        EXECUTE PROCEDURE FALTANTE(23, 21, ID, ITEM) returning_values (PEDIDO, UND, FACTOR2);
        if (PEDIDO * FACTOR2 = CANT) then /* SI NO SE HA FACTURADO MIRE A VER SI SE REMISIONO */
            EXECUTE PROCEDURE FALTANTE(23, 22, ID, ITEM) returning_values (PEDIDO, UND, FACTOR2);
        if (PEDIDO IS NULL) then
            PEDIDO = 0;
        ORDENC = ORDENC + PEDIDO * FACTOR2;
        END
    ORDENADO = ORDENADO + ORDENC;
    if (FACTOR <> 0) then
        ORDENADO = ORDENADO / FACTOR;
    SELECT SUM(RSDE_LIBERAR)
      FROM RESERVAS_DETALLE RD, RESERVAS R
      WHERE R.RESE_ID = RD.RESE_ID AND ARTI_COD = :ARTICULO AND RESE_FECHA <= :FECHA AND RESE_VENCE >= :FECHA AND RD.BODE_COD = :BODEGA AND RSDE_ANULADO = 'N'
      INTO :RESERVADO;
    if (RESERVADO IS NULL) then
        RESERVADO = 0;
    PEDIDO = 0;
    FOR SELECT P.PEDI_ID, PEDE_ITEM, PEDE_CANT * PEDE_FACTOR
        FROM PEDIDOS P, PEDIDOS_DETALLE PD
        WHERE P.PEDI_ID = PD.PEDI_ID AND PD.ARTI_COD = :ARTICULO AND (PEDI_FECHA+PEDI_VALIDEZ) >= :FECHA AND PEDI_FECHA <= :FECHA AND PEDE_ANULADO = 'N' AND BODE_COD = :BODEGA
        INTO :ID, :ITEM, :CANT
        do
        BEGIN
        EXECUTE PROCEDURE FALTANTE(34, 31, ID, ITEM) returning_values (ORDENC, UND, FACTOR2);
        EXECUTE PROCEDURE LEE_CONFIGURACION('FACTURACION', 'FACTURAS', 'GENERAR PEDIDO AUTOMATICAMENTE CON LA FACTURA') returning_values (pedauto);
        if ((ORDENC * FACTOR2 = CANT) or (PEDAUTO = 'SI')) then /* SI NO SE HA FACTURADO MIRE A VER SI SE REMISIONO */
            EXECUTE PROCEDURE FALTANTE(34, 32, ID, ITEM) returning_values (ORDENC, UND, FACTOR2);
        if (ORDENC IS NULL) then
            ORDENC = 0;
        PEDIDO = PEDIDO + ORDENC * FACTOR2;
        END
    RESERVADO = RESERVADO + PEDIDO;
    if (FACTOR <> 0) then
        RESERVADO = RESERVADO / FACTOR;
    /* VENTAS MES */
    FECHAAUX = CAST (FECHA AS VARCHAR(10));
    FECHAAUX = SUBSTR(FECHAAUX, 1, 7) || '/01';
    FECINI = CAST (FECHAAUX AS DATE);
    /* VENTAS MENSUALES */
    SELECT SUM(FADE_CANT * FADE_FACTOR)
        FROM FACTURAS_DETALLE D, FACTURAS F, punto_venta P
        WHERE F.FACT_ID = D.FACT_ID AND ARTI_COD = :ARTICULO AND FACT_FECHA >= :FECINI AND FACT_FECHA < :FECHA AND FACT_ANULADO = 'N'
        AND P.ptvt_id = F.ptvt_id AND P.bode_cod = :bodega INTO :ventames;
    SELECT SUM(DVDE_CANT * DVDE_FACTOR)
        FROM DEVOLUCIONES_VENTAS F, devoluciones_ventas_DETALLE D, punto_venta P
        WHERE F.DEVT_ID = D.DEVT_ID AND ARTI_COD = :ARTICULO AND DEVT_FECHA >= :FECINI AND DEVT_FECHA < :FECHA AND DEVT_ANULADO = 'N'
        AND P.ptvt_id = F.ptvt_id AND P.bode_cod = :bodega INTO :devmes;
    if (ventames IS NULL) then
        ventames = 0;
    if (devmes IS NULL) then
        devmes = 0;
    ventames = ventames - devmes;
    if (FACTOR <> 0) then
        ventames = ventames / FACTOR;
    /* FECHA COMPRA */
    SELECT MAX(FACO_FECHA) FROM FACTURAS_COMPRA F, FACTURAS_COMPRAS_DETALLE D
        WHERE F.FACO_ID = D.faco_id AND D.ARTI_COD = :articulo AND FACO_FECHA <= :FECHA AND D.bode_cod = :BODEGA
        INTO :fechacmp;
    SUSPEND;
    end
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE ORDEN_SUGERIDA_TOTAL(
    PROVEEDOR VARCHAR(20),
    CODBOD VARCHAR(2),
    FECHA DATE)
RETURNS (
    ARTICULO VARCHAR(15),
    DESCRIPCION VARCHAR(60),
    BODEGA VARCHAR(2),
    UNIDAD VARCHAR(8),
    EXISTENCIA NUMERIC(18,2),
    RESERVADO NUMERIC(18,2),
    ORDENADO NUMERIC(18,2),
    PROMEDIO NUMERIC(18,2),
    VENTAMES NUMERIC(18,2),
    FECHACMP DATE,
    CANTCMP NUMERIC(18,2),
    SUGERIDO NUMERIC(18,2),
    COSTO NUMERIC(18,2),
    DIAS INTEGER)
AS
declare variable PEDAUTO char(2);
declare variable FACTOR NUMERIC(15,4);
declare variable DIA_ART VARCHAR(2) CHARACTER SET NONE;
declare variable DIASC VARCHAR(255);
declare variable SALIDAS NUMERIC(18,4);
declare variable MARCA VARCHAR(10);
declare variable ORDENC numeric(18,4);
declare variable PEDIDO numeric(18,4);
declare variable ITEM integer;
declare variable ID integer;
declare variable UND varchar(8);
declare variable CANT numeric(18,4);
declare variable FACTOR2 numeric(18,4);
declare variable fecini date;
declare variable FECHAAUX varchar(10);
declare variable DEVMES numeric(18,2);
declare variable MFAC integer;
declare variable MDEV integer;
declare variable IVAF numeric(18,2);
declare variable IVAD numeric(18,2);
declare variable UNABOD VARCHAR(7);
BEGIN
execute procedure lee_configuracion('COMPRAS', 'ORDENES', 'ORDEN SUGERIDA POR BODEGA O GENERAL') returning_values (:UNABOD);
FOR SELECT a.ARTI_COD, ARTI_DES, PVAR_COSTO, ARTI_UNIDAD, ARTI_DIAS FROM proveedor_articulo p, articulo a
    WHERE p.arti_cod = a.arti_cod and TERC_NIT = :proveedor and esar_cod <> 'I' order by a.arti_des
    INTO :articulo, :DESCRIPCION, :costo, :unidad, :DIAS
  DO BEGIN
  for select bode_cod from bodega where BODE_ACTIVA = 'S' AND ((:UNABOD = 'GENERAL') or (BODE_COD = :CODBOD)) into :bodega
    do
    begin
    execute procedure saldo_inventario (:articulo, :bodega, :fecha) returning_values (:Existencia);
    EXECUTE PROCEDURE FACTOR_UNIDAD_CANT(:ARTICULO, :UNIDAD) returning_values (:FACTOR);
    if (FACTOR <> 0) then
        EXISTENCIA = EXISTENCIA / FACTOR;
    else
        EXISTENCIA = 0;
    EXECUTE PROCEDURE promedio_salidas_articulo (:ARTICULO, :FECHA, :BODEGA) returning_values (:PROMEDIO, :SALIDAS);
    EXECUTE PROCEDURE lee_configuracion ('INVENTARIO', 'EXISTENCIAS', 'PROMEDIAR LAS SALIDAS DEL INVENTARIO CON EL NUMERO DE DIAS ASIGNADO A CADA ARTICULO') returning_values (:DIA_ART);
    if (DIA_ART = 'NO') then
        BEGIN
        EXECUTE PROCEDURE lee_configuracion ('INVENTARIO', 'EXISTENCIAS', 'NUMERO DE DIAS PARA PROMEDIO DE SALIDAS POR ARTICULO') returning_values (DIASC);
        DIAS = CAST(DIASC AS INTEGER);
        END
    if (DIAS is null) then
        DIAS = 0;
    PROMEDIO = DIAS * PROMEDIO;
    if (FACTOR <> 0) then
        PROMEDIO = PROMEDIO / FACTOR;
    SUGERIDO = PROMEDIO - EXISTENCIA;
    select sum(ORID_ENTREGAR)
      from ORDENINVENTARIO_DETALLE OD, ordenes_inventario O
      where O.ORIN_ID = OD.ORIN_ID and ARTI_COD = :ARTICULO and ORIN_FECHA <= :FECHA and ORIN_FECLLEGA >= :FECHA and ORID_ANULADO = 'N' and OD.BODE_COD = :BODEGA
      into :ORDENADO;
    if (ORDENADO is null) then
        ORDENADO = 0;
    ORDENC = 0;
    for select O.ORDC_ID, OCDE_ITEM, OCDE_CANT * OCDE_FACTOR
        from ORDENES_COMPRA O, ORDENES_COMPRA_DETALLE OD
        where O.ORDC_ID = OD.ORDC_ID and OD.ARTI_COD = :ARTICULO and (ORDC_FECHA+ORDC_VALIDEZ) >= :FECHA and ORDC_FECHA <= :FECHA and OCDE_ANULADO = 'N' and OD.BODE_COD = :BODEGA
        into :ID, :ITEM, :CANT
        do
        begin
        execute procedure FALTANTE(23, 21, ID, ITEM) returning_values (PEDIDO, UND, FACTOR2);
        if (PEDIDO * FACTOR2 = CANT) then /* SI NO SE HA FACTURADO MIRE A VER SI SE REMISIONO */
            execute procedure FALTANTE(23, 22, ID, ITEM) returning_values (PEDIDO, UND, FACTOR2);
        if (PEDIDO is null) then
            PEDIDO = 0;
        ORDENC = ORDENC + PEDIDO * FACTOR2;
        end
    ORDENADO = ORDENADO + ORDENC;
    if (FACTOR <> 0) then
        ORDENADO = ORDENADO / FACTOR;
    select sum(RSDE_LIBERAR)
      from RESERVAS_DETALLE RD, RESERVAS R
      where R.RESE_ID = RD.RESE_ID and ARTI_COD = :ARTICULO and RESE_FECHA <= :FECHA and RESE_VENCE >= :FECHA and RD.BODE_COD = :BODEGA and RSDE_ANULADO = 'N'
      into :RESERVADO;
    if (RESERVADO is null) then
        RESERVADO = 0;
    PEDIDO = 0;
    for select P.PEDI_ID, PEDE_ITEM, PEDE_CANT * PEDE_FACTOR
        from PEDIDOS P, PEDIDOS_DETALLE PD
        where P.PEDI_ID = PD.PEDI_ID and PD.ARTI_COD = :ARTICULO and (PEDI_FECHA+PEDI_VALIDEZ) >= :FECHA and PEDI_FECHA <= :FECHA and PEDE_ANULADO = 'N' and BODE_COD = :BODEGA
        into :ID, :ITEM, :CANT
        do
        begin
        execute procedure FALTANTE(34, 31, ID, ITEM) returning_values (ORDENC, UND, FACTOR2);
        execute procedure LEE_CONFIGURACION('FACTURACION', 'FACTURAS', 'GENERAR PEDIDO AUTOMATICAMENTE CON LA FACTURA') returning_values (pedauto);
        if ((ORDENC * FACTOR2 = CANT) or (PEDAUTO = 'SI')) then /* SI NO SE HA FACTURADO MIRE A VER SI SE REMISIONO */
            execute procedure FALTANTE(34, 32, ID, ITEM) returning_values (ORDENC, UND, FACTOR2);
        if (ORDENC is null) then
            ORDENC = 0;
        PEDIDO = PEDIDO + ORDENC * FACTOR2;
        end
    RESERVADO = RESERVADO + PEDIDO;
    if (FACTOR <> 0) then
        RESERVADO = RESERVADO / FACTOR;
    /* VENTAS MES */
    FECHAAUX = cast (FECHA as varchar(10));
    FECHAAUX = SUBSTR(FECHAAUX, 1, 7) || '/01';
    FECINI = cast (FECHAAUX as date);
    execute procedure ventas_articulo (:ARTICULO, :FECINI, :FECHA, 0, :bodega) returning_values (:ventames, :mfac, :devmes, :mdev, :ivaf, :ivad);
    ventames = ventames - devmes;
    if (FACTOR <> 0) then
        ventames = ventames / FACTOR;
    /* FECHA COMPRA */
    fechacmp = null;
    cantcmp = 0;
    select first 1 FACO_FECHA, FCDE_CANT * FCDE_FACTOR from FACTURAS_COMPRA F, FACTURAS_COMPRAS_DETALLE D
        where F.FACO_ID = D.faco_id and D.ARTI_COD = :articulo and FACO_FECHA <= :FECHA and D.bode_cod = :BODEGA
        order by FACO_FECHA desc, F.FACO_ID desc
        into :fechacmp, :cantcmp;
    if (sugerido > 0) then
        SUSPEND;
    end
  END
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE PRODUCCION_SUGERIDA(
    FECHA DATE,
    MARCA VARCHAR(3))
RETURNS (
    ARTICULO VARCHAR(15),
    CANT NUMERIC(18,4),
    UNIDAD VARCHAR(8))
AS
declare variable GRUP VARCHAR(2);
declare variable SUBG VARCHAR(3);
declare variable FACTOR NUMERIC(15,4);
declare variable DIAS INTEGER;
declare variable EXISTENCIA NUMERIC(18,4);
declare variable PROMEDIO NUMERIC(18,4);
declare variable SALIDAS NUMERIC(18,4);
declare variable RESERVADO numeric(18,4);
declare variable pedido numeric(18,4);
declare variable ORDENC numeric(18,4);
declare variable cant2 numeric(18,4);
declare variable exceso integer;
declare variable id integer;
declare variable item integer;
declare variable UND varchar(8);
declare variable PEDAUTO VARCHAR(2);
BEGIN
--execute procedure lee_configuracion('INVENTARIO', 'ENSAMBLES', 'NUMERO DE DIAS DE CONSUMO A PRODUCIR') returning_values (:dias);
execute procedure lee_configuracion('INVENTARIO', 'ENSAMBLES', 'PORCENTAJE DE EXCEDENTE A PRODUCIR') returning_values (:exceso);
EXECUTE PROCEDURE LEE_CONFIGURACION('FACTURACION', 'FACTURAS', 'GENERAR PEDIDO AUTOMATICAMENTE CON LA FACTURA') returning_values (pedauto);
execute procedure lee_configuracion('INVENTARIO', 'ENSAMBLES', 'GRUPO DE LOS ARTICULOS A PRODUCIR') returning_values (:grup);
execute procedure lee_configuracion('INVENTARIO', 'ENSAMBLES', 'SUBGRUPO DE LOS ARTICULOS A PRODUCIR') returning_values (:subg);

FOR SELECT ARTI_COD, ARTI_UNIDAD, ARTI_DIAS FROM articulo
    WHERE ((GRUP_COD = :GRUP) or (:GRUP = ''))  AND ((SUBG_COD = :SUBG) or (:SUBG = '')) AND
    MARC_COD = :marca AND ESAR_COD <> 'I' AND ARTI_EXIST <> 'N' AND ARTI_ENSAMBLE = 'N'
    order by arti_COD
    INTO :articulo, unidad, :DIAS
    DO
    BEGIN
    execute procedure saldo_total_inventario (:articulo, :fecha) returning_values (:Existencia);
    EXECUTE PROCEDURE promedio_produccion_articulo (:ARTICULO, :FECHA) returning_values (:PROMEDIO, :SALIDAS);
    SELECT SUM(RSDE_LIBERAR)
        FROM RESERVAS_DETALLE RD, RESERVAS R
        WHERE R.RESE_ID = RD.RESE_ID AND ARTI_COD = :articulo AND RESE_FECHA <= :FECHA AND RESE_VENCE >= :FECHA AND RSDE_ANULADO = 'N'
        INTO :RESERVADO;
    if (RESERVADO IS NULL) then
        RESERVADO = 0;
    PEDIDO = 0;
    FOR SELECT P.PEDI_ID, PEDE_ITEM, PEDE_CANT * PEDE_FACTOR
        FROM PEDIDOS P, PEDIDOS_DETALLE PD
        WHERE P.PEDI_ID = PD.PEDI_ID AND PD.ARTI_COD = :articulo AND PEDI_VENCE >= :FECHA AND PEDI_FECHA <= :FECHA AND PEDE_ANULADO = 'N'
        INTO :ID, :ITEM, :CANT2
        do
        BEGIN
        EXECUTE PROCEDURE FALTANTE(34, 31, ID, ITEM) returning_values (ORDENC, UND, FACTOR);
        if ((ORDENC * FACTOR = CANT2) or (PEDAUTO = 'SI')) then /* SI NO SE HA FACTURADO MIRE A VER SI SE REMISIONO */
            EXECUTE PROCEDURE FALTANTE(34, 32, ID, ITEM) returning_values (ORDENC, UND, FACTOR);
        if (ORDENC IS NULL) then
            ORDENC = 0;
        PEDIDO = PEDIDO + ORDENC * FACTOR;
        END
    RESERVADO = RESERVADO + PEDIDO;

    PROMEDIO = PROMEDIO * DIAS;
    if (reservado > PROMEDIO) then
        PROMEDIO = RESERVADO;
    CANT = (PROMEDIO * (1 + exceso/100)) - EXISTENCIA;
    if (CANT > 0) then
        SUSPEND;
    END
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE REP_CRUCES_DOCUMENTO(
    TIPOORI INTEGER,
    TIPODES INTEGER,
    FECINI DATE,
    FECFIN DATE,
    ID INTEGER,
    CEROS CHAR(1),
    SUBEMPRESA INTEGER)
RETURNS (
    IDORI INTEGER,
    PREFORI VARCHAR(4),
    NUMORI VARCHAR(6),
    FECORI DATE,
    NIT VARCHAR(20),
    NOMCLIENTE VARCHAR(60),
    ITEM INTEGER,
    IDDES INTEGER,
    PREFDES VARCHAR(4),
    NUMDES VARCHAR(6),
    FECDES DATE,
    ARTIC VARCHAR(20),
    DESCRIPCION VARCHAR(60),
    CANTORI NUMERIC(18,2),
    CANTDES NUMERIC(18,2),
    UNIDAD VARCHAR(8),
    CODBOD VARCHAR(2),
    LOTE VARCHAR(20),
    OBS VARCHAR(255))
AS
declare variable FALTANTE NUMERIC(18,2);
declare variable FACTOR NUMERIC(18,4);
begin
  if (TIPOORI = 32) then
    FOR SELECT R.REVT_ID, R.PREF_PRE, REVT_NUMERO, REVT_FECHA, RVDE_ITEM, R.TERC_NIT, REVT_NOMTERC, ARTI_COD, SUBSTR(RVDE_DESC,1,60), RVDE_UNIDAD, RVDE_CANT, SUBSTRING(D.rvde_obs FROM 1 FOR 255)
      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)) AND ((:ID = 0) or (R.revt_id = :ID))
      ORDER BY REVT_FECHA, R.PREF_PRE, REVT_NUMERO, RVDE_ITEM
      INTO :IDORI, :PREFORI, :NUMORI, :FECORI, :ITEM, :NIT, :NOMCLIENTE, :ARTIC, :DESCRIPCION, :UNIDAD, :CANTORI, :OBS
      DO
        BEGIN
        EXECUTE PROCEDURE FALTANTE(:TIPOORI, :TIPODES, :IDORI, :ITEM) returning_values (:FALTANTE, :UNIDAD, :FACTOR);
        if ((CEROS = 'S') or (FALTANTE <> 0)) then
          BEGIN
          FOR SELECT COFA_CANT, COFA_UNIDAD, COFA_BODEGA, COFA_LOTE, SUBSTRING(CODE_OBSIT FROM 1 FOR 255), COFA_ID
            FROM CONSOLIDADO_FALTANTES WHERE COFA_TIPOORI = :TIPOORI AND COFA_IDORI = :IDORI AND COFA_OK = 'S' AND COFA_ITEMORI = :ITEM
            INTO :CANTDES, :UNIDAD, :CODBOD, :LOTE, :OBS, :IDDES
            DO
            BEGIN
            if (TIPODES = 31) then
                SELECT PREF_PRE, FACT_NUMERO, FACT_FECHA FROM FACTURAS WHERE FACT_CONSOLIDA = :IDDES AND FACT_ANULADO = 'N' INTO :PREFDES, :NUMDES, :FECDES;
            if (TIPODES = 32) then
                SELECT PREF_PRE, REVT_NUMERO, REVT_FECHA FROM remisiones_venta WHERE REVT_CONSOLIDA = :IDDES AND REVT_ANULADO = 'N' INTO :PREFDES, :NUMDES, :FECDES;
            if (TIPODES = 34) then
                SELECT PREF_PRE, PEDI_NUMERO, PEDI_FECHA FROM PEDIDOS WHERE PEDI_CONSOLIDA = :IDDES AND PEDI_ANULADO = 'N' INTO :PREFDES, :NUMDES, :FECDES;
            SUSPEND;
            END
          END
        END
  if (TIPOORI = 34) then
    FOR SELECT P.PEDI_ID, P.PREF_PRE, PEDI_NUMERO, PEDI_FECHA, PEDE_ITEM, P.TERC_NIT, PEDI_NOMTERC, ARTI_COD, SUBSTR(PEDE_DESC,1,60), PEDE_UNIDAD, PEDE_CANT, SUBSTRING(D.pede_obs FROM 1 FOR 255)
      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 PR.PREF_PRE = P.PREF_PRE AND PR.TIDO_COD = 34 AND ((PR.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) AND ((:ID = 0) or (P.pedi_id = :ID))
      ORDER BY PEDI_FECHA, P.PREF_PRE, PEDI_NUMERO, PEDE_ITEM
      INTO :IDORI, :PREFORI, :NUMORI, :FECORI, :ITEM, :NIT, :NOMCLIENTE, :ARTIC, :DESCRIPCION, :UNIDAD, :CANTORI, :OBS
      DO
        BEGIN
        EXECUTE PROCEDURE FALTANTE(:TIPOORI, :TIPODES, :IDORI,  :ITEM) returning_values (:FALTANTE, :UNIDAD, :FACTOR);
        if ((CEROS = 'S') or (FALTANTE <> 0)) then
          BEGIN
          FOR SELECT COFA_CANT, COFA_UNIDAD, COFA_BODEGA, COFA_LOTE, SUBSTRING(CODE_OBSIT FROM 1 FOR 255), COFA_ID
            FROM CONSOLIDADO_FALTANTES WHERE COFA_TIPOORI = :TIPOORI AND COFA_IDORI = :IDORI AND COFA_OK = 'S' AND COFA_ITEMORI = :ITEM
            INTO :CANTDES, :UNIDAD, :CODBOD, :LOTE, :OBS, :IDDES
            DO
            BEGIN
            if (TIPODES = 31) then
                SELECT PREF_PRE, FACT_NUMERO, FACT_FECHA FROM FACTURAS WHERE FACT_CONSOLIDA = :IDDES AND FACT_ANULADO = 'N' INTO :PREFDES, :NUMDES, :FECDES;
            if (TIPODES = 32) then
                SELECT PREF_PRE, REVT_NUMERO, REVT_FECHA FROM remisiones_venta WHERE REVT_CONSOLIDA = :IDDES AND REVT_ANULADO = 'N' INTO :PREFDES, :NUMDES, :FECDES;
            if (TIPODES = 34) then
                SELECT PREF_PRE, PEDI_NUMERO, PEDI_FECHA FROM PEDIDOS WHERE PEDI_CONSOLIDA = :IDDES AND PEDI_ANULADO = 'N' INTO :PREFDES, :NUMDES, :FECDES;
            SUSPEND;
            END
          END
        END
  if (TIPOORI = 35) then
    FOR SELECT C.COTI_ID, C.PREF_PRE, COTI_NUMERO, COTI_FECHA, CTDE_ITEM, C.TERC_NIT, COTI_NOMTERC, ARTI_COD, SUBSTR(CTDE_DESC,1,60), CTDE_UNIDAD, CTDE_CANT, SUBSTRING(D.ctde_obs FROM 1 FOR 255)
      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)) AND ((:ID = 0) or (C.coti_id = :ID))
      ORDER BY COTI_FECHA, C.PREF_PRE, COTI_NUMERO, CTDE_ITEM
      INTO :IDORI, :PREFORI, :NUMORI, :FECORI, :ITEM, :NIT, :NOMCLIENTE, :ARTIC, :DESCRIPCION, :UNIDAD, :CANTORI, :OBS
      DO
        BEGIN
        EXECUTE PROCEDURE FALTANTE(:TIPOORI, :TIPODES, :IDORI,  :ITEM) returning_values (:FALTANTE, :UNIDAD, :FACTOR);
        if ((CEROS = 'S') or (FALTANTE <> 0)) then
          BEGIN
          FOR SELECT COFA_CANT, COFA_UNIDAD, COFA_BODEGA, COFA_LOTE, SUBSTRING(CODE_OBSIT FROM 1 FOR 255), COFA_ID
            FROM CONSOLIDADO_FALTANTES WHERE COFA_TIPOORI = :TIPOORI AND COFA_IDORI = :IDORI AND COFA_OK = 'S' AND COFA_ITEMORI = :ITEM
            INTO :CANTDES, :UNIDAD, :CODBOD, :LOTE, :OBS, :IDDES
            DO
            BEGIN
            if (TIPODES = 31) then
                SELECT PREF_PRE, FACT_NUMERO, FACT_FECHA FROM FACTURAS WHERE FACT_CONSOLIDA = :IDDES AND FACT_ANULADO = 'N' INTO :PREFDES, :NUMDES, :FECDES;
            if (TIPODES = 32) then
                SELECT PREF_PRE, REVT_NUMERO, REVT_FECHA FROM remisiones_venta WHERE REVT_CONSOLIDA = :IDDES AND REVT_ANULADO = 'N' INTO :PREFDES, :NUMDES, :FECDES;
            if (TIPODES = 34) then
                SELECT PREF_PRE, PEDI_NUMERO, PEDI_FECHA FROM PEDIDOS WHERE PEDI_CONSOLIDA = :IDDES AND PEDI_ANULADO = 'N' INTO :PREFDES, :NUMDES, :FECDES;
            SUSPEND;
            END
          END
        END
  if (TIPOORI = 40) then /* pendientes */
    FOR SELECT P.pend_id, P.pref_pre, p.pend_numero, p.pend_fecha, d.pevd_item, P.terc_nit, p.pend_nomcli, d.arti_cod, SUBSTR(d.pevd_desc,1,60), d.pevd_unidad, d.pevd_cant, SUBSTRING(D.pevd_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)) AND ((:ID = 0) or (P.pend_id = :ID))
      ORDER BY PEND_FECHA, P.PREF_PRE, PEND_NUMERO, pevd_item
      INTO :IDORI, :PREFORI, :NUMORI, :FECORI, :ITEM, :NIT, :NOMCLIENTE, :ARTIC, :DESCRIPCION, :UNIDAD, :CANTORI, :OBS
      DO
        BEGIN
        EXECUTE PROCEDURE FALTANTE(:TIPOORI, :TIPODES, :IDORI,  :ITEM) returning_values (:FALTANTE, :UNIDAD, :FACTOR);
        if ((CEROS = 'S') or (FALTANTE <> 0)) then
          BEGIN
          FOR SELECT COFA_CANT, COFA_UNIDAD, COFA_BODEGA, COFA_LOTE, SUBSTRING(CODE_OBSIT FROM 1 FOR 255), COFA_ID
            FROM CONSOLIDADO_FALTANTES WHERE COFA_TIPOORI = :TIPOORI AND COFA_IDORI = :IDORI AND COFA_OK = 'S' AND COFA_ITEMORI = :ITEM
            INTO :CANTDES, :UNIDAD, :CODBOD, :LOTE, :OBS, :IDDES
            DO
            BEGIN
            if (TIPODES = 31) then
                SELECT PREF_PRE, FACT_NUMERO, FACT_FECHA FROM FACTURAS WHERE FACT_CONSOLIDA = :IDDES AND FACT_ANULADO = 'N' INTO :PREFDES, :NUMDES, :FECDES;
            if (TIPODES = 32) then
                SELECT PREF_PRE, REVT_NUMERO, REVT_FECHA FROM remisiones_venta WHERE REVT_CONSOLIDA = :IDDES AND REVT_ANULADO = 'N' INTO :PREFDES, :NUMDES, :FECDES;
            if (TIPODES = 34) then
                SELECT PREF_PRE, PEDI_NUMERO, PEDI_FECHA FROM PEDIDOS WHERE PEDI_CONSOLIDA = :IDDES AND PEDI_ANULADO = 'N' INTO :PREFDES, :NUMDES, :FECDES;
            SUSPEND;
            END
          END
        END
end
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE REP_FALTANTES_CLIENTES(
    TERINI VARCHAR(20),
    TERFIN VARCHAR(20),
    FECINI DATE,
    FECFIN DATE,
    DETALLE CHAR(1),
    TIPO INTEGER,
    DESTINO INTEGER,
    ARTINI VARCHAR(15),
    ARTFIN VARCHAR(15),
    ORDEN CHAR(1),
    CEROS CHAR(1),
    CORTE DATE,
    SUBEMPRESA INTEGER)
RETURNS (
    NIT VARCHAR(20),
    SUCURSAL VARCHAR(10),
    NOMBRE VARCHAR(60),
    TELEFONO VARCHAR(40),
    CIUDAD VARCHAR(40),
    CODZONA VARCHAR(2),
    NOMZONA VARCHAR(60),
    NOMTIPO VARCHAR(50),
    ARTICULO VARCHAR(15),
    DESCRIPCION VARCHAR(60),
    CODGRUPO VARCHAR(2),
    NOMGRUPO VARCHAR(30),
    CODSUBG VARCHAR(3),
    NOMSUBG VARCHAR(30),
    CODMARC VARCHAR(3),
    NOMMARC VARCHAR(30),
    CANTIDAD NUMERIC(18,4),
    UNIDAD VARCHAR(8),
    FALTANTE NUMERIC(18,4),
    BASE NUMERIC(18,2),
    IVA NUMERIC(18,2),
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(8),
    FECHA DATE,
    PTVTA INTEGER,
    OBS VARCHAR(255))
AS
declare variable ID INTEGER;
declare variable ITEM INTEGER;
declare variable CODINI VARCHAR(15);
declare variable CODFIN VARCHAR(15);
declare variable DESINI VARCHAR(15);
declare variable DESFIN VARCHAR(15);
declare variable FACTOR NUMERIC(18,4);
declare variable CANT NUMERIC(18,4);
declare variable MONTO NUMERIC(18,2);
declare variable artiaux VARCHAR(20);
BEGIN
if (ORDEN = 'C') then
    BEGIN
    CODINI = ARTINI;
    CODFIN = ARTFIN;
    DESINI = '';
    DESFIN = 'zz';
    END
ELSE
    BEGIN
    DESINI = ARTINI;
    DESFIN = ARTFIN;
    CODINI = '';
    CODFIN = 'zz';
    END
SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = :TIPO INTO :NOMTIPO;
/*FOR select T.TERC_NIT, TERC_NOM,  TERC_TEL, TERC_CIU, ZONA_COD
    from terceros T, CLIENTES C*/
FOR select c.terc_nit,s.clsu_nombre,s.clsu_tel,s.clsu_ciudad,s.zona_cod,s.clcu_cod
    from clientes c, cliente_sucursales s
    where C.TERC_NIT = s.TERC_NIT and C.TERC_NIT >= :TERINI AND C.TERC_NIT <= :TERFIN
    INTO :NIT, :NOMBRE, :TELEFONO, :CIUDAD, :CODZONA, :sucursal
    DO  
    BEGIN
    CANTIDAD = 0;
    FALTANTE = 0;
    BASE = 0;
    SELECT ZONA_NOM FROM ZONAS WHERE ZONA_COD = :CODZONA INTO :NOMZONA;
    if (DETALLE = 'N') then
        BEGIN
        ARTICULO = '';
        if (TIPO = 31) then
            FOR SELECT F.FACT_ID, FADE_ITEM, D.ARTI_COD, FADE_CANT * FADE_FACTOR, (FADE_PRUNIT-FADE_DTOMONTO), F.ptvt_id
                FROM FACTURAS_DETALLE D, FACTURAS F, ARTICULO A, PREFIJOS P
                WHERE F.FACT_ID = D.FACT_ID AND FACT_FECHA >= :FECINI AND FACT_FECHA <= :FECFIN AND TERC_NIT = :NIT AND FACT_ANULADO = 'N' AND
                      D.ARTI_COD = A.ARTI_COD AND D.ARTI_COD >= :CODINI AND D.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
                      P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 31 AND ((P.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) and f.fact_sucursal = :sucursal and substring(a.arti_cod from 1 FOR 2) <> '.t'
                ORDER BY ARTI_COD, F.FACT_ID, FADE_ITEM INTO :ID, :ITEM, :ARTIAUX, :CANT,  :MONTO, :PTVTA
                DO
                BEGIN
                if (artiaux <> articulo) then
                    begin
                    if (ARTICULO <> '') then
                        SUSPEND;
                    SELECT ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                        FROM articulo WHERE ARTI_COD = :ARTIAUX
                        INTO :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC;
                    SELECT GRUP_NOM FROM GRUPO 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;
                    ARTICULO = ARTIAUX;
                    CANTIDAD = 0;
                    FALTANTE = 0;
                    BASE = 0;
                    end
                CANTIDAD = CANTIDAD + CANT;
                EXECUTE PROCEDURE FALTANTE_CORTE(:TIPO, :DESTINO, :ID, :ITEM, :CORTE) returning_values (:CANT, :UNIDAD, :FACTOR);
                FALTANTE = FALTANTE + CANT;
                BASE = BASE + (MONTO * CANT);
                END
        if (TIPO = 32) then
            FOR SELECT R.revt_id, rvde_item, D.ARTI_COD, RVDE_CANT * RVDE_FACTOR, (RVDE_PRUNIT-RVDE_DTOMONTO), R.ptvt_id
                FROM REMISIONES_VENTA_DETALLE D, REMISIONES_VENTA R, ARTICULO A, PREFIJOS P
                WHERE R.REVT_ID = D.REVT_ID AND REVT_FECHA >= :FECINI AND REVT_FECHA <= :FECFIN AND TERC_NIT = :NIT AND REVT_ANULADO = 'N' AND
                      D.ARTI_COD = A.ARTI_COD AND D.ARTI_COD >= :CODINI AND D.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
                      P.PREF_PRE = R.PREF_PRE AND P.TIDO_COD = 32 AND ((P.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) and r.revt_sucursal = :sucursal
                ORDER BY ARTI_COD, R.REVT_ID, RVDE_ITEM INTO :ID, :ITEM, :ARTIAUX, :CANT, :MONTO, :PTVTA
                DO
                BEGIN
                if (artiaux <> articulo) then
                    begin
                    if (ARTICULO <> '') then
                        SUSPEND;
                    SELECT ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                        FROM articulo WHERE ARTI_COD = :ARTIAUX
                        INTO :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC;
                    SELECT GRUP_NOM FROM GRUPO 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;
                    ARTICULO = ARTIAUX;
                    CANTIDAD = 0;
                    FALTANTE = 0;
                    BASE = 0;
                    end
                CANTIDAD = CANTIDAD + CANT;
                EXECUTE PROCEDURE FALTANTE_CORTE(:TIPO, :DESTINO, :ID, :ITEM, :CORTE) returning_values (:CANT, :UNIDAD, :FACTOR);
                FALTANTE = FALTANTE + CANT;
                BASE = BASE + (MONTO * CANT);
                END
        if (TIPO = 34) then
            FOR SELECT P.PEDI_ID, PEDE_ITEM, D.ARTI_COD, PEDE_CANT * PEDE_FACTOR, (PEDE_PRUNIT-PEDE_DTOMONTO), P.ptvt_id
                FROM PEDIDOS_DETALLE D, PEDIDOS P, ARTICULO A, PREFIJOS PR
                WHERE P.PEDI_ID = D.PEDI_ID AND PEDI_FECHA >= :FECINI AND PEDI_FECHA <= :FECFIN AND TERC_NIT = :NIT AND PEDI_ANULADO = 'N' AND PEDI_VALIDEZ >= 0 AND
                      D.ARTI_COD = A.ARTI_COD AND D.ARTI_COD >= :CODINI AND D.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
                      PR.PREF_PRE = P.PREF_PRE AND PR.TIDO_COD = 34 AND ((PR.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) and p.pedi_sucursal = :sucursal
                ORDER BY ARTI_COD, P.PEDI_ID, PEDE_ITEM INTO :ID, :ITEM, :ARTIAUX, :CANT, :MONTO, :PTVTA
                DO
                BEGIN
                if (artiaux <> articulo) then
                    begin
                    if (ARTICULO <> '') then
                        SUSPEND;
                    SELECT ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                        FROM articulo WHERE ARTI_COD = :ARTIAUX
                        INTO :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC;
                    SELECT GRUP_NOM FROM GRUPO 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;
                    ARTICULO = ARTIAUX;
                    CANTIDAD = 0;
                    FALTANTE = 0;
                    BASE = 0;
                    end
                CANTIDAD = CANTIDAD + CANT;
                EXECUTE PROCEDURE FALTANTE_CORTE(:TIPO, :DESTINO, :ID, :ITEM, :CORTE) returning_values (:CANT, :UNIDAD, :FACTOR);
                FALTANTE = FALTANTE + CANT;
                BASE = BASE + (MONTO * CANT);
                END
        if (TIPO = 35) then
            FOR SELECT C.COTI_ID, CTDE_ITEM, D.ARTI_COD, CTDE_CANT * CTDE_FACTOR, (CTDE_PRUNIT-CTDE_DTOMONTO), C.ptvt_id
                FROM COTIZACIONES_DETALLE D, COTIZACIONES C, ARTICULO A, PREFIJOS P
                WHERE C.COTI_ID = D.COTI_ID AND COTI_FECHA >= :FECINI AND COTI_FECHA <= :FECFIN AND TERC_NIT = :NIT AND COTI_ANULADO = 'N' AND
                      D.ARTI_COD = A.ARTI_COD AND D.ARTI_COD >= :CODINI AND D.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
                      P.PREF_PRE = C.PREF_PRE AND P.TIDO_COD = 35 AND ((P.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) and c.coti_sucursal = :sucursal
                ORDER BY ARTI_COD, C.COTI_ID, CTDE_ITEM INTO :ID, :ITEM, :ARTIAUX, :CANT, :MONTO, :PTVTA
                DO
                BEGIN
                if (artiaux <> articulo) then
                    begin
                    if (ARTICULO <> '') then
                        SUSPEND;
                    SELECT ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                        FROM articulo WHERE ARTI_COD = :ARTIAUX
                        INTO :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC;
                    SELECT GRUP_NOM FROM GRUPO 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;
                    ARTICULO = ARTIAUX;
                    CANTIDAD = 0;
                    FALTANTE = 0;
                    BASE = 0;
                    end
                CANTIDAD = CANTIDAD + CANT;
                EXECUTE PROCEDURE FALTANTE_CORTE(:TIPO, :DESTINO, :ID, :ITEM, :CORTE) returning_values (:CANT, :UNIDAD, :FACTOR);
                FALTANTE = FALTANTE + CANT;
                BASE = BASE + (MONTO * CANT);
                END
        if (TIPO = 40) then
            FOR SELECT P.pend_id, D.pevd_item, D.ARTI_COD, D.pevd_cant * D.pevd_factor, (D.pevd_prunit-D.pevd_dtomonto)
                FROM pendiente_ventas_detalle D, pendiente_ventas P, ARTICULO A, PREFIJOS PR
                WHERE P.pend_id = D.pend_id AND PEND_FECHA >= :FECINI AND PEND_FECHA <= :FECFIN AND TERC_NIT = :NIT AND PEND_ANULADO = 'N' AND
                      D.ARTI_COD = A.ARTI_COD AND D.ARTI_COD >= :CODINI AND D.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
                      PR.PREF_PRE = P.PREF_PRE AND PR.TIDO_COD = 40 AND ((PR.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) and p.pend_sucursal = :sucursal
                ORDER BY ARTI_COD, P.pend_id, D.pevd_item INTO :ID, :ITEM, :ARTIAUX, :CANT, :MONTO
                DO
                BEGIN
                if (artiaux <> articulo) then
                    begin
                    if (ARTICULO <> '') then
                        SUSPEND;
                    SELECT ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                        FROM articulo WHERE ARTI_COD = :ARTIAUX
                        INTO :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC;
                    SELECT GRUP_NOM FROM GRUPO 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;
                    ARTICULO = ARTIAUX;
                    CANTIDAD = 0;
                    FALTANTE = 0;
                    BASE = 0;
                    end
                CANTIDAD = CANTIDAD + CANT;
                EXECUTE PROCEDURE FALTANTE(:TIPO, :DESTINO, :ID, :ITEM) returning_values (:CANT, :UNIDAD, :FACTOR);
                FALTANTE = FALTANTE + CANT;
                BASE = BASE + (MONTO * CANT);
                END
        if (FALTANTE IS NULL) then
            FALTANTE = 0;
        if (BASE IS NULL) then
            BASE = 0;
        if (IVA IS NULL) then
            IVA = 0;
        if ((CEROS = 'S') or (FALTANTE <> 0)) then
            SUSPEND;
        END
    ELSE
        BEGIN
        if (TIPO = 31) then
            FOR SELECT F.FACT_ID, FADE_ITEM, F.PREF_PRE, FACT_NUMERO, FACT_FECHA, FADE_CANT * FADE_FACTOR, (FADE_PRUNIT-FADE_DTOMONTO), FADE_IVAMONTO, D.ARTI_COD, ARTI_DES, ARTI_UNIDAD, A.GRUP_COD, A.SUBG_COD, A.MARC_COD, SUBSTRING(FACT_OBS FROM 1 FOR 255), F.ptvt_id
                FROM FACTURAS F, FACTURAS_DETALLE D, ARTICULO A, PREFIJOS P
                WHERE F.FACT_ID = D.FACT_ID AND FACT_FECHA >= :FECINI AND FACT_FECHA <= :FECFIN  AND TERC_NIT = :NIT AND FACT_ANULADO = 'N' AND
                      D.ARTI_COD = A.ARTI_COD AND D.ARTI_COD >= :CODINI AND D.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
                      P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 31 AND ((P.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) and f.fact_sucursal = :sucursal and substring(a.arti_cod from 1 FOR 2) <> '.t'
                ORDER BY D.ARTI_COD, F.FACT_ID, FADE_ITEM
                INTO :ID, :ITEM, :PREFIJO, :NUMERO, :FECHA, :CANTIDAD, :BASE, :IVA, :ARTICULO, :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC, :OBS, :PTVTA
                DO
                    BEGIN
                    SELECT GRUP_NOM FROM GRUPO WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                    SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                    SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                    EXECUTE PROCEDURE FALTANTE_CORTE(:TIPO, :DESTINO, :ID, :ITEM, :CORTE) returning_values (:FALTANTE, :UNIDAD, :FACTOR);
                    if ((CEROS = 'S') or (FALTANTE <> 0)) then
                        SUSPEND;
                    END
        if (TIPO = 32) then
            FOR SELECT R.REVT_ID, RVDE_ITEM, R.PREF_PRE, REVT_NUMERO, REVT_FECHA, RVDE_CANT * RVDE_FACTOR, (RVDE_PRUNIT-RVDE_DTOMONTO), RVDE_IVAMONTO, D.ARTI_COD, ARTI_DES, ARTI_UNIDAD, A.GRUP_COD, A.SUBG_COD, A.MARC_COD, SUBSTRING(REVT_OBS FROM 1 FOR 255), R.ptvt_id
                FROM REMISIONES_VENTA R, REMISIONES_VENTA_DETALLE D, ARTICULO A, PREFIJOS P
                WHERE R.REVT_ID = D.REVT_ID AND REVT_FECHA >= :FECINI AND REVT_FECHA <= :FECFIN AND TERC_NIT = :NIT AND REVT_ANULADO = 'N' AND
                      D.ARTI_COD = A.ARTI_COD AND D.ARTI_COD >= :CODINI AND D.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
                      P.PREF_PRE = R.PREF_PRE AND P.TIDO_COD = 32 AND ((P.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) and r.revt_sucursal = :sucursal
                ORDER BY D.ARTI_COD, R.REVT_ID, RVDE_ITEM
                INTO :ID, :ITEM, :PREFIJO, :NUMERO, :FECHA, :CANTIDAD, :BASE, :IVA, :ARTICULO, :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC, :OBS, :PTVTA
                DO
                    BEGIN
                    SELECT GRUP_NOM FROM GRUPO WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                    SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                    SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                    EXECUTE PROCEDURE FALTANTE_CORTE(:TIPO, :DESTINO, :ID, :ITEM, :CORTE) returning_values (:FALTANTE, :UNIDAD, :FACTOR);
                    if ((CEROS = 'S') or (FALTANTE <> 0)) then
                        SUSPEND;
                    END
        if (TIPO = 34) then
            FOR SELECT P.PEDI_ID, PEDE_ITEM, P.PREF_PRE, PEDI_NUMERO, PEDI_FECHA, PEDE_CANT * PEDE_FACTOR, (PEDE_PRUNIT-PEDE_DTOMONTO), PEDE_IVAMONTO, D.ARTI_COD, ARTI_DES, ARTI_UNIDAD, A.GRUP_COD, A.SUBG_COD, A.MARC_COD, SUBSTRING(PEDI_OBS FROM 1 FOR 255), P.ptvt_id
                FROM PEDIDOS P, PEDIDOS_DETALLE D, ARTICULO A, PREFIJOS PR
                WHERE P.PEDI_ID = D.PEDI_ID AND PEDI_FECHA >= :FECINI AND PEDI_FECHA <= :FECFIN AND TERC_NIT = :NIT AND PEDI_ANULADO = 'N' AND PEDI_VALIDEZ >= 0 AND
                      D.ARTI_COD = A.ARTI_COD AND D.ARTI_COD >= :CODINI AND D.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
                      P.PREF_PRE = PR.PREF_PRE AND PR.TIDO_COD = 34 AND ((PR.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) and p.pedi_sucursal = :sucursal
                ORDER BY D.ARTI_COD, P.PEDI_ID, PEDE_ITEM
                INTO :ID, :ITEM, PREFIJO, :NUMERO, :FECHA, :CANTIDAD, :BASE, :IVA, :ARTICULO, :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC, :OBS, :PTVTA
                DO
                    BEGIN
                    SELECT GRUP_NOM FROM GRUPO WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                    SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                    SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                    EXECUTE PROCEDURE FALTANTE_CORTE(:TIPO, :DESTINO, :ID, :ITEM, :CORTE) returning_values (:FALTANTE, :UNIDAD, :FACTOR);
                    if ((CEROS = 'S') or (FALTANTE <> 0)) then
                        SUSPEND;
                    END
        if (TIPO = 35) then
            FOR SELECT C.COTI_ID, CTDE_ITEM, C.PREF_PRE, COTI_NUMERO, COTI_FECHA, CTDE_CANT * CTDE_FACTOR, (CTDE_PRUNIT-CTDE_DTOMONTO), CTDE_IVAMONTO, D.ARTI_COD, ARTI_DES, ARTI_UNIDAD, A.GRUP_COD, A.SUBG_COD, A.MARC_COD, SUBSTRING(COTI_OBS FROM 1 FOR 255), C.ptvt_id
                FROM COTIZACIONES C, COTIZACIONES_DETALLE D, ARTICULO A, PREFIJOS P
                WHERE C.COTI_ID = D.COTI_ID AND COTI_FECHA >= :FECINI AND COTI_FECHA <= :FECFIN AND TERC_NIT = :NIT AND COTI_ANULADO = 'N' AND
                      D.ARTI_COD = A.ARTI_COD AND D.ARTI_COD >= :CODINI AND D.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
                      P.PREF_PRE = C.PREF_PRE AND P.TIDO_COD = 35 AND ((P.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) and c.coti_sucursal = :sucursal
                ORDER BY D.ARTI_COD, C.COTI_ID, CTDE_ITEM
                INTO :ID, :ITEM, PREFIJO, :NUMERO, :FECHA, :CANTIDAD, :BASE, :IVA, :ARTICULO, :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC, :OBS, :PTVTA
                DO
                    BEGIN
                    SELECT GRUP_NOM FROM GRUPO WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                    SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                    SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                    EXECUTE PROCEDURE FALTANTE_CORTE(:TIPO, :DESTINO, :ID, :ITEM, :CORTE) returning_values (:FALTANTE, :UNIDAD, :FACTOR);
                    if ((CEROS = 'S') or (FALTANTE <> 0)) then
                        SUSPEND;
                    END
        if (TIPO = 40) then
            FOR SELECT P.pend_id, D.pevd_item, P.PREF_PRE, P.pend_numero, P.pend_fecha, D.pevd_cant * D.pevd_factor, (D.pevd_prunit-D.pevd_dtomonto), D.pevd_ivamonto, D.ARTI_COD, ARTI_DES, ARTI_UNIDAD, A.GRUP_COD, A.SUBG_COD, A.MARC_COD, SUBSTRING(P.pend_obs FROM 1 FOR 255)
                FROM pendiente_ventas P, pendiente_ventas_detalle D, ARTICULO A, PREFIJOS PR
                WHERE P.pend_id = D.pend_id AND PEND_FECHA >= :FECINI AND PEND_FECHA <= :FECFIN AND TERC_NIT = :NIT AND PEND_ANULADO = 'N' AND
                      D.ARTI_COD = A.ARTI_COD AND D.ARTI_COD >= :CODINI AND D.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
                      P.PREF_PRE = PR.PREF_PRE AND PR.TIDO_COD = 40 AND ((PR.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) and p.pend_sucursal = :sucursal
                ORDER BY D.ARTI_COD, P.pend_id, D.pevd_item
                INTO :ID, :ITEM, PREFIJO, :NUMERO, :FECHA, :CANTIDAD, :BASE, :IVA, :ARTICULO, :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC, :OBS
                DO
                    BEGIN
                    SELECT GRUP_NOM FROM GRUPO WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                    SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                    SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                    EXECUTE PROCEDURE FALTANTE(:TIPO, :DESTINO, :ID, :ITEM) returning_values (:FALTANTE, :UNIDAD, :FACTOR);
                    if ((CEROS = 'S') or (FALTANTE <> 0)) then
                        SUSPEND;
                    END
        END
    END
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE REP_FALTANTES_VENDEDOR(
    VENINI VARCHAR(20),
    VENFIN VARCHAR(20),
    FECINI DATE,
    FECFIN DATE,
    DETALLE CHAR(1),
    TIPO INTEGER,
    DESTINO INTEGER,
    ARTINI VARCHAR(15),
    ARTFIN VARCHAR(15),
    ORDEN CHAR(1),
    CEROS CHAR(1),
    CORTE DATE,
    SUBEMPRESA INTEGER)
RETURNS (
    CODVEND VARCHAR(20),
    NOMVEND VARCHAR(60),
    NOMTIPO VARCHAR(50),
    ARTICULO VARCHAR(15),
    DESCRIPCION VARCHAR(60),
    CODGRUPO VARCHAR(2),
    NOMGRUPO VARCHAR(30),
    CODSUBG VARCHAR(3),
    NOMSUBG VARCHAR(30),
    CODMARC VARCHAR(3),
    NOMMARC VARCHAR(30),
    CANTIDAD NUMERIC(18,4),
    UNIDAD VARCHAR(8),
    FALTANTE NUMERIC(18,4),
    BASE NUMERIC(18,2),
    IVA NUMERIC(18,2),
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(8),
    FECHA DATE,
    PTVTA INTEGER,
    OBS VARCHAR(255))
AS
declare variable ID INTEGER;
declare variable ITEM INTEGER;
declare variable CODINI VARCHAR(15);
declare variable CODFIN VARCHAR(15);
declare variable DESINI VARCHAR(15);
declare variable DESFIN VARCHAR(15);
declare variable FACTOR NUMERIC(18,4);
declare variable CANT NUMERIC(18,4);
declare variable MONTO NUMERIC(18,2);
declare variable artiaux VARCHAR(20);
BEGIN
if (ORDEN = 'C') then
    BEGIN
    CODINI = ARTINI;
    CODFIN = ARTFIN;
    DESINI = '';
    DESFIN = 'zz';
    END
ELSE
    BEGIN
    DESINI = ARTINI;
    DESFIN = ARTFIN;
    CODINI = '';
    CODFIN = 'zz';
    END

  SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = :TIPO INTO :NOMTIPO;
  /*FOR select VEND_COD, VEND_NOMBRE
    from VENDEDORES where VEND_COD >= :VENINI AND VEND_COD <= :VENFIN
    INTO :CODVEND, :NOMVEND
    DO  
    BEGIN*/
    if (DETALLE = 'N') then
        BEGIN
        ARTICULO = '';
        if (TIPO = 31) then
            FOR SELECT F.FACT_ID, FADE_ITEM, D.ARTI_COD, FADE_CANT * FADE_FACTOR, (FADE_PRUNIT-FADE_DTOMONTO),f.vend_cod, F.ptvt_id
                FROM FACTURAS_DETALLE D, FACTURAS F, ARTICULO A, PREFIJOS P
                WHERE F.FACT_ID = D.FACT_ID AND FACT_FECHA >= :FECINI AND FACT_FECHA <= :FECFIN AND VEND_COD >= :VENINI AND VEND_COD <= :VENFIN AND FACT_ANULADO = 'N' AND
                      D.ARTI_COD = A.ARTI_COD AND D.ARTI_COD >= :CODINI AND D.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
                      P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 31 AND ((P.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) and substring(a.arti_cod from 1 FOR 2) <> '.t'
                ORDER BY VEND_COD,ARTI_COD, F.FACT_ID, FADE_ITEM INTO :ID, :ITEM, :ARTIAUX, :CANT,  :MONTO,:CODVEND, :PTVTA
                DO
                BEGIN
                select VEND_NOMBRE from VENDEDORES where  VEND_COD = :CODVEND INTO :NOMVEND;
                if (artiaux <> articulo) then
                    begin
                    if (ARTICULO <> '') then
                      if ((CEROS = 'S') or (FALTANTE <> 0)) then
                        SUSPEND;
                    SELECT ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                        FROM articulo WHERE ARTI_COD = :ARTIAUX
                        INTO :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC;
                    SELECT GRUP_NOM FROM GRUPO 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;
                    ARTICULO = ARTIAUX;
                    CANTIDAD = 0;
                    FALTANTE = 0;
                    BASE = 0;
                    end
                CANTIDAD = CANTIDAD + CANT;
                EXECUTE PROCEDURE FALTANTE_CORTE(:TIPO, :DESTINO, :ID, :ITEM, :CORTE) returning_values (:CANT, :UNIDAD, :FACTOR);
                FALTANTE = FALTANTE + CANT;
                BASE = BASE + (MONTO * CANT);
                END
        if (TIPO = 32) then
            FOR SELECT R.revt_id, rvde_item, D.ARTI_COD, RVDE_CANT * RVDE_FACTOR, (RVDE_PRUNIT-RVDE_DTOMONTO),R.vend_cod, R.ptvt_id
                FROM REMISIONES_VENTA_DETALLE D, REMISIONES_VENTA R, ARTICULO A, PREFIJOS P
                WHERE R.REVT_ID = D.REVT_ID AND REVT_FECHA >= :FECINI AND REVT_FECHA <= :FECFIN AND VEND_COD >= :VENINI AND VEND_COD <= :VENFIN AND REVT_ANULADO = 'N' AND
                      D.ARTI_COD = A.ARTI_COD AND D.ARTI_COD >= :CODINI AND D.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
                      P.PREF_PRE = R.PREF_PRE AND P.TIDO_COD = 32 AND ((P.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
                ORDER BY VEND_COD,ARTI_COD, R.REVT_ID, RVDE_ITEM INTO :ID, :ITEM, :ARTIAUX, :CANT, :MONTO,:CODVEND, :PTVTA
                DO
                BEGIN
                select VEND_NOMBRE from VENDEDORES where  VEND_COD = :CODVEND INTO :NOMVEND;
                if (artiaux <> articulo) then
                    begin
                    if (ARTICULO <> '') then
                      if ((CEROS = 'S') or (FALTANTE <> 0)) then
                        SUSPEND;
                    SELECT ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                        FROM articulo WHERE ARTI_COD = :ARTIAUX
                        INTO :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC;
                    SELECT GRUP_NOM FROM GRUPO 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;
                    ARTICULO = ARTIAUX;
                    CANTIDAD = 0;
                    FALTANTE = 0;
                    BASE = 0;
                    end
                CANTIDAD = CANTIDAD + CANT;
                EXECUTE PROCEDURE FALTANTE_CORTE(:TIPO, :DESTINO, :ID, :ITEM, :CORTE) returning_values (:CANT, :UNIDAD, :FACTOR);
                FALTANTE = FALTANTE + CANT;
                BASE = BASE + (MONTO * CANT);
                END
        if (TIPO = 34) then
            FOR SELECT P.PEDI_ID, PEDE_ITEM, D.ARTI_COD, PEDE_CANT * PEDE_FACTOR, (PEDE_PRUNIT-PEDE_DTOMONTO),p.vend_cod, P.ptvt_id
                FROM PEDIDOS_DETALLE D, PEDIDOS P, ARTICULO A, PREFIJOS PR
                WHERE P.PEDI_ID = D.PEDI_ID AND PEDI_FECHA >= :FECINI AND PEDI_FECHA <= :FECFIN AND VEND_COD >= :VENINI AND VEND_COD <= :VENFIN AND PEDI_ANULADO = 'N' AND
                      D.ARTI_COD = A.ARTI_COD AND D.ARTI_COD >= :CODINI AND D.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
                      PR.PREF_PRE = P.PREF_PRE AND PR.TIDO_COD = 34 AND ((PR.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) AND PEDI_VALIDEZ >= 0
                ORDER BY VEND_COD,ARTI_COD, P.PEDI_ID, PEDE_ITEM INTO :ID, :ITEM, :ARTIAUX, :CANT, :MONTO,:CODVEND, :PTVTA
                DO
                BEGIN
                select VEND_NOMBRE from VENDEDORES where  VEND_COD = :CODVEND INTO :NOMVEND;
                if (artiaux <> articulo) then
                    begin
                    if (ARTICULO <> '') then
                      if ((CEROS = 'S') or (FALTANTE <> 0)) then
                        SUSPEND;
                    SELECT ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                        FROM articulo WHERE ARTI_COD = :ARTIAUX
                        INTO :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC;
                    SELECT GRUP_NOM FROM GRUPO 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;
                    ARTICULO = ARTIAUX;
                    CANTIDAD = 0;
                    FALTANTE = 0;
                    BASE = 0;
                    end
                CANTIDAD = CANTIDAD + CANT;
                EXECUTE PROCEDURE FALTANTE_CORTE(:TIPO, :DESTINO, :ID, :ITEM, :CORTE) returning_values (:CANT, :UNIDAD, :FACTOR);
                FALTANTE = FALTANTE + CANT;
                BASE = BASE + (MONTO * CANT);
                END
        if (TIPO = 35) then
            FOR SELECT C.COTI_ID, CTDE_ITEM, D.ARTI_COD, CTDE_CANT * CTDE_FACTOR, (CTDE_PRUNIT-CTDE_DTOMONTO),c.vend_cod, C.ptvt_id
                FROM COTIZACIONES_DETALLE D, COTIZACIONES C, ARTICULO A, PREFIJOS P
                WHERE C.COTI_ID = D.COTI_ID AND COTI_FECHA >= :FECINI AND COTI_FECHA <= :FECFIN AND VEND_COD >= :VENINI AND VEND_COD <= :VENFIN AND COTI_ANULADO = 'N' AND
                      D.ARTI_COD = A.ARTI_COD AND D.ARTI_COD >= :CODINI AND D.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
                      P.PREF_PRE = C.PREF_PRE AND P.TIDO_COD = 35 AND ((P.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
                ORDER BY VEND_COD,ARTI_COD, C.COTI_ID, CTDE_ITEM INTO :ID, :ITEM, :ARTIAUX, :CANT, :MONTO,:CODVEND, :PTVTA
                DO
                BEGIN
                select VEND_NOMBRE from VENDEDORES where  VEND_COD = :CODVEND INTO :NOMVEND;
                if (artiaux <> articulo) then
                    begin
                    if (ARTICULO <> '') then
                      if ((CEROS = 'S') or (FALTANTE <> 0)) then
                        SUSPEND;
                    SELECT ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                        FROM articulo WHERE ARTI_COD = :ARTIAUX
                        INTO :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC;
                    SELECT GRUP_NOM FROM GRUPO 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;
                    ARTICULO = ARTIAUX;
                    CANTIDAD = 0;
                    FALTANTE = 0;
                    BASE = 0;
                    end
                CANTIDAD = CANTIDAD + CANT;
                EXECUTE PROCEDURE FALTANTE_CORTE(:TIPO, :DESTINO, :ID, :ITEM, :CORTE) returning_values (:CANT, :UNIDAD, :FACTOR);
                FALTANTE = FALTANTE + CANT;
                BASE = BASE + (MONTO * CANT);
                END
        if (TIPO = 40) then
            FOR SELECT P.pend_id, D.pevd_item, D.ARTI_COD, D.pevd_cant * D.pevd_factor, (D.pevd_prunit-D.pevd_dtomonto),p.vend_cod
                FROM pendiente_ventas_detalle D, pendiente_ventas P, ARTICULO A, PREFIJOS PR
                WHERE P.pend_id = D.pend_id AND PEND_FECHA >= :FECINI AND PEND_FECHA <= :FECFIN AND VEND_COD >= :VENINI AND VEND_COD <= :VENFIN AND PEND_ANULADO = 'N' AND
                      D.ARTI_COD = A.ARTI_COD AND D.ARTI_COD >= :CODINI AND D.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
                      PR.PREF_PRE = P.PREF_PRE AND PR.TIDO_COD = 40 AND ((PR.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
                ORDER BY VEND_COD,ARTI_COD, P.pend_id, D.pevd_item INTO :ID, :ITEM, :ARTIAUX, :CANT, :MONTO,:CODVEND
                DO
                BEGIN
                select VEND_NOMBRE from VENDEDORES where  VEND_COD = :CODVEND INTO :NOMVEND;
                if (artiaux <> articulo) then
                    begin
                    if (ARTICULO <> '') then
                      if ((CEROS = 'S') or (FALTANTE <> 0)) then
                        SUSPEND;
                    SELECT ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                        FROM articulo WHERE ARTI_COD = :ARTIAUX
                        INTO :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC;
                    SELECT GRUP_NOM FROM GRUPO 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;
                    ARTICULO = ARTIAUX;
                    CANTIDAD = 0;
                    FALTANTE = 0;
                    BASE = 0;
                    end
                CANTIDAD = CANTIDAD + CANT;
                EXECUTE PROCEDURE FALTANTE(:TIPO, :DESTINO, :ID, :ITEM) returning_values (:CANT, :UNIDAD, :FACTOR);
                FALTANTE = FALTANTE + CANT;
                BASE = BASE + (MONTO * CANT);
                END
        if (FALTANTE IS NULL) then
            FALTANTE = 0;
        if (BASE IS NULL) then
            BASE = 0;
        if (IVA IS NULL) then
            IVA = 0;
        if ((CEROS = 'S') or (FALTANTE <> 0)) then
            SUSPEND;
        END
    ELSE
        BEGIN
        if (TIPO = 31) then
            FOR SELECT F.FACT_ID, FADE_ITEM, F.PREF_PRE, FACT_NUMERO, FACT_FECHA, FADE_CANT * FADE_FACTOR, (FADE_PRUNIT-FADE_DTOMONTO), FADE_IVAMONTO, D.ARTI_COD, ARTI_DES, ARTI_UNIDAD, A.GRUP_COD, A.SUBG_COD, A.MARC_COD,f.vend_cod, SUBSTRING(FACT_OBS FROM 1 FOR 255), F.ptvt_id
                FROM FACTURAS F, FACTURAS_DETALLE D, ARTICULO A, PREFIJOS P
                WHERE F.FACT_ID = D.FACT_ID AND FACT_FECHA >= :FECINI AND FACT_FECHA <= :FECFIN  AND VEND_COD >= :VENINI AND VEND_COD <= :VENFIN AND FACT_ANULADO = 'N' AND
                      D.ARTI_COD = A.ARTI_COD AND D.ARTI_COD >= :CODINI AND D.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
                      P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 31 AND ((P.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) and substring(a.arti_cod from 1 FOR 2) <> '.t'
                ORDER BY VEND_COD,ARTI_COD, F.FACT_ID, FADE_ITEM
                INTO :ID, :ITEM, :PREFIJO, :NUMERO, :FECHA, :CANTIDAD, :BASE, :IVA, :ARTICULO, :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC,:CODVEND, :OBS, :PTVTA
                DO
                    BEGIN
                    select VEND_NOMBRE from VENDEDORES where  VEND_COD = :CODVEND INTO :NOMVEND;
                    SELECT GRUP_NOM FROM GRUPO WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                    SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                    SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                    EXECUTE PROCEDURE FALTANTE_CORTE(:TIPO, :DESTINO, :ID, :ITEM, :CORTE) returning_values (:FALTANTE, :UNIDAD, :FACTOR);
                    if ((CEROS = 'S') or (FALTANTE <> 0)) then
                        SUSPEND;
                    END
        if (TIPO = 32) then
            FOR SELECT R.REVT_ID, RVDE_ITEM, R.PREF_PRE, REVT_NUMERO, REVT_FECHA, RVDE_CANT * RVDE_FACTOR, (RVDE_PRUNIT-RVDE_DTOMONTO), RVDE_IVAMONTO, D.ARTI_COD, ARTI_DES, ARTI_UNIDAD, A.GRUP_COD, A.SUBG_COD, A.MARC_COD,R.vend_cod, SUBSTRING(REVT_OBS FROM 1 FOR 255), R.ptvt_id
                FROM REMISIONES_VENTA R, REMISIONES_VENTA_DETALLE D, ARTICULO A, PREFIJOS P
                WHERE R.REVT_ID = D.REVT_ID AND REVT_FECHA >= :FECINI AND REVT_FECHA <= :FECFIN AND VEND_COD >= :VENINI AND VEND_COD <= :VENFIN AND REVT_ANULADO = 'N' AND
                      D.ARTI_COD = A.ARTI_COD AND D.ARTI_COD >= :CODINI AND D.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
                      P.PREF_PRE = R.PREF_PRE AND P.TIDO_COD = 33 AND ((P.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
                ORDER BY VEND_COD,ARTI_COD, R.REVT_ID, RVDE_ITEM
                INTO :ID, :ITEM, :PREFIJO, :NUMERO, :FECHA, :CANTIDAD, :BASE, :IVA, :ARTICULO, :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC,:CODVEND, :OBS, :PTVTA
                DO
                    BEGIN
                    select VEND_NOMBRE from VENDEDORES where  VEND_COD = :CODVEND INTO :NOMVEND;
                    SELECT GRUP_NOM FROM GRUPO WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                    SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                    SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                    EXECUTE PROCEDURE FALTANTE_CORTE(:TIPO, :DESTINO, :ID, :ITEM, :CORTE) returning_values (:FALTANTE, :UNIDAD, :FACTOR);
                    if ((CEROS = 'S') or (FALTANTE <> 0)) then
                        SUSPEND;
                    END
        if (TIPO = 34) then
            FOR SELECT P.PEDI_ID, PEDE_ITEM, P.PREF_PRE, PEDI_NUMERO, PEDI_FECHA, PEDE_CANT * PEDE_FACTOR, (PEDE_PRUNIT-PEDE_DTOMONTO), PEDE_IVAMONTO, D.ARTI_COD, ARTI_DES, ARTI_UNIDAD, A.GRUP_COD, A.SUBG_COD, A.MARC_COD,P.vend_cod, SUBSTRING(PEDI_OBS FROM 1 FOR 255), P.ptvt_id
                FROM PEDIDOS P, PEDIDOS_DETALLE D, ARTICULO A, PREFIJOS PR
                WHERE P.PEDI_ID = D.PEDI_ID AND PEDI_FECHA >= :FECINI AND PEDI_FECHA <= :FECFIN AND VEND_COD >= :VENINI AND VEND_COD <= :VENFIN AND PEDI_ANULADO = 'N' AND
                      D.ARTI_COD = A.ARTI_COD AND D.ARTI_COD >= :CODINI AND D.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
                      P.PREF_PRE = PR.PREF_PRE AND PR.TIDO_COD = 34 AND ((PR.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) AND PEDI_VALIDEZ >= 0
                ORDER BY VEND_COD,ARTI_COD, P.PEDI_ID, PEDE_ITEM
                INTO :ID, :ITEM, PREFIJO, :NUMERO, :FECHA, :CANTIDAD, :BASE, :IVA, :ARTICULO, :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC,:CODVEND, :OBS, :PTVTA
                DO
                    BEGIN
                    select VEND_NOMBRE from VENDEDORES where  VEND_COD = :CODVEND INTO :NOMVEND;
                    SELECT GRUP_NOM FROM GRUPO WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                    SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                    SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                    EXECUTE PROCEDURE FALTANTE_CORTE(:TIPO, :DESTINO, :ID, :ITEM, :CORTE) returning_values (:FALTANTE, :UNIDAD, :FACTOR);
                    if ((CEROS = 'S') or (FALTANTE <> 0)) then
                        SUSPEND;
                    END
        if (TIPO = 35) then
            FOR SELECT C.COTI_ID, CTDE_ITEM, C.PREF_PRE, COTI_NUMERO, COTI_FECHA, CTDE_CANT * CTDE_FACTOR, (CTDE_PRUNIT-CTDE_DTOMONTO), CTDE_IVAMONTO, D.ARTI_COD, ARTI_DES, ARTI_UNIDAD, A.GRUP_COD, A.SUBG_COD, A.MARC_COD,C.vend_cod, SUBSTRING(COTI_OBS FROM 1 FOR 255), C.ptvt_id
                FROM COTIZACIONES C, COTIZACIONES_DETALLE D, ARTICULO A, PREFIJOS P
                WHERE C.COTI_ID = D.COTI_ID AND COTI_FECHA >= :FECINI AND COTI_FECHA <= :FECFIN AND VEND_COD >= :VENINI AND VEND_COD <= :VENFIN AND COTI_ANULADO = 'N' AND
                      D.ARTI_COD = A.ARTI_COD AND D.ARTI_COD >= :CODINI AND D.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
                      P.PREF_PRE = C.PREF_PRE AND P.TIDO_COD = 35 AND ((P.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
                ORDER BY VEND_COD,ARTI_COD, C.COTI_ID, CTDE_ITEM
                INTO :ID, :ITEM, PREFIJO, :NUMERO, :FECHA, :CANTIDAD, :BASE, :IVA, :ARTICULO, :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC,:CODVEND, :OBS, :PTVTA
                DO
                    BEGIN
                    select VEND_NOMBRE from VENDEDORES where  VEND_COD = :CODVEND INTO :NOMVEND;
                    SELECT GRUP_NOM FROM GRUPO WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                    SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                    SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                    EXECUTE PROCEDURE FALTANTE_CORTE(:TIPO, :DESTINO, :ID, :ITEM, :CORTE) returning_values (:FALTANTE, :UNIDAD, :FACTOR);
                    if ((CEROS = 'S') or (FALTANTE <> 0)) then
                        SUSPEND;
                    END
        if (TIPO = 40) then
            FOR SELECT P.pend_id, D.pevd_item, P.PREF_PRE, P.pend_numero, PEND_FECHA, D.pevd_cant * D.pevd_factor, (D.pevd_prunit-D.pevd_dtomonto), D.pevd_ivamonto, D.ARTI_COD, ARTI_DES, ARTI_UNIDAD, A.GRUP_COD, A.SUBG_COD, A.MARC_COD,P.vend_cod, SUBSTRING(P.pend_obs FROM 1 FOR 255)
                FROM pendiente_ventas P, pendiente_ventas_detalle D, ARTICULO A, PREFIJOS PR
                WHERE P.pend_id = D.pend_id AND PEND_FECHA >= :FECINI AND PEND_FECHA <= :FECFIN AND VEND_COD >= :VENINI AND VEND_COD <= :VENFIN AND PEND_ANULADO = 'N' AND
                      D.ARTI_COD = A.ARTI_COD AND D.ARTI_COD >= :CODINI AND D.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
                      P.PREF_PRE = PR.PREF_PRE AND PR.TIDO_COD = 40 AND ((PR.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
                ORDER BY VEND_COD,ARTI_COD, P.pend_id, D.pevd_item
                INTO :ID, :ITEM, PREFIJO, :NUMERO, :FECHA, :CANTIDAD, :BASE, :IVA, :ARTICULO, :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC,:CODVEND, :OBS
                DO
                    BEGIN
                    select VEND_NOMBRE from VENDEDORES where  VEND_COD = :CODVEND INTO :NOMVEND;
                    SELECT GRUP_NOM FROM GRUPO WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                    SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                    SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                    EXECUTE PROCEDURE FALTANTE(:TIPO, :DESTINO, :ID, :ITEM) returning_values (:FALTANTE, :UNIDAD, :FACTOR);
                    if ((CEROS = 'S') or (FALTANTE <> 0)) then
                        SUSPEND;
                    END
        END
   /* END*/
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE REP_KARDEX_ARTICULO(
    DETALLE CHAR(1),
    FECINI DATE,
    FECFIN DATE,
    ARTINI VARCHAR(20),
    ARTFIN VARCHAR(20),
    GRPINI VARCHAR(2),
    GRPFIN VARCHAR(2),
    ORDEN CHAR(1),
    BODEGA VARCHAR(2),
    INACTIVOS CHAR(1))
RETURNS (
    CODIGO VARCHAR(15),
    NOMBRE VARCHAR(60),
    DESCORTA VARCHAR(30),
    UNIDAD VARCHAR(8),
    CODGRUPO VARCHAR(2),
    NOMGRUPO VARCHAR(30),
    CODSUBG VARCHAR(3),
    NOMSUBG VARCHAR(30),
    CODMARC VARCHAR(3),
    NOMMARC VARCHAR(30),
    CODBOD VARCHAR(2),
    SALDOINI NUMERIC(18,4),
    COSTOINI NUMERIC(18,2),
    ENTRADAS NUMERIC(18,4),
    COSTOENT NUMERIC(18,2),
    SALIDAS NUMERIC(18,4),
    COSTOSAL NUMERIC(18,2),
    SALDOFIN NUMERIC(18,4),
    COSTOFIN NUMERIC(18,2),
    TIPODOC VARCHAR(8),
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(8),
    FECHA DATE,
    CONCEPTO VARCHAR(60),
    NIT VARCHAR(20),
    CONS INTEGER,
    CANFINAL NUMERIC(18,4),
    COSFINAL NUMERIC(18,2),
    IVAPORC NUMERIC(9,2),
    RESERVADO NUMERIC(18,4))
AS
DECLARE VARIABLE ENTRADA CHAR(1);
DECLARE VARIABLE CANT NUMERIC(18,4);
DECLARE VARIABLE COSTO NUMERIC(18,2);
DECLARE VARIABLE CODINI VARCHAR(20);
DECLARE VARIABLE CODFIN VARCHAR(20);
DECLARE VARIABLE DESINI VARCHAR(20);
DECLARE VARIABLE DESFIN VARCHAR(20);
declare variable pedido numeric(18,4);
declare variable ordenc numeric(18,4);
declare variable id integer;
declare variable item integer;
declare variable und varchar(8);
declare variable factor numeric(18,4);
declare variable cant2 numeric(18,4);
declare variable PEDAUTO CHAR(2);
BEGIN
if (ORDEN = 'C') then
    BEGIN
    CODINI = ARTINI;
    CODFIN = ARTFIN;
    DESINI = '';
    DESFIN = 'zz';
    END
ELSE
    BEGIN
    DESINI = ARTINI;
    DESFIN = ARTFIN;
    CODINI = '';
    CODFIN = 'zz';
    END
EXECUTE PROCEDURE LEE_CONFIGURACION('FACTURACION', 'FACTURAS', 'GENERAR PEDIDO AUTOMATICAMENTE CON LA FACTURA') returning_values (pedauto);
  FOR
    SELECT ARTI_COD, ARTI_DES, ARTI_DESCORTA, ARTI_UNIDAD, A.GRUP_COD, A.SUBG_COD, A.MARC_COD, t.taiv_porc
      FROM ARTICULO A, tarifa_iva t
      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 ((A.ESAR_COD <> 'I') or (:INACTIVOS = 'S')) AND A.taiv_cod = T.taiv_cod
      INTO :CODIGO, :NOMBRE, :DESCORTA, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC, :ivaporc
      DO
        BEGIN
        NOMMARC = '';
        NOMSUBG = '';
        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 (BODEGA = '') then
            BEGIN
            EXECUTE PROCEDURE SALDO_INICIAL_TOTAL_INV(CODIGO, FECINI) returning_values (:SALDOINI);
            EXECUTE PROCEDURE VALOR_INICIAL_INVENTARIO(CODIGO, FECINI) returning_values (COSTOINI);
            END
        ELSE
            BEGIN
            EXECUTE PROCEDURE SALDO_INICIAL_INVENTARIO(CODIGO, FECINI, :BODEGA) returning_values (SALDOINI);
            EXECUTE PROCEDURE COSTO_PROMEDIO(CODIGO, FECINI-1) returning_values (COSTOINI);
            COSTOINI = COSTOINI * saldoini;
            END
        if (DETALLE = 'N') then
            BEGIN
            /* SUME LAS ENTRADAS */
            if (BODEGA = '') then
              SELECT SUM(COST_ENTC), SUM(COST_ENTP), SUM(COST_SALC), SUM(COST_SALP) FROM COSTOS
                WHERE (COST_FECHA >= :FECINI) AND (COST_FECHA <= :FECFIN) AND (ARTI_COD = :codigo)
                INTO :ENTRADAS, :COSTOENT, :SALIDAS, :COSTOSAL;
            ELSE
              SELECT SUM(COST_ENTC), SUM(COST_ENTP), SUM(COST_SALC), SUM(COST_SALP)
                FROM COSTOS C, MOVIMIENTO_ARTICULO M
                WHERE (COST_FECHA >= :FECINI) AND (COST_FECHA <= :FECFIN) AND (C.ARTI_COD = :codigo) AND C.cost_idmov = M.mvar_cons AND BODE_COD = :BODEGA
                INTO :ENTRADAS, :COSTOENT, :SALIDAS, :COSTOSAL;

            if (ENTRADAS IS NULL) then
              ENTRADAS = 0;
            if (COSTOENT IS NULL) then
              COSTOENT = 0;
            if (SALIDAS IS NULL) then
              SALIDAS = 0;
            if (COSTOSAL IS NULL) then
              COSTOSAL = 0;
            SALDOFIN = SALDOINI + ENTRADAS - SALIDAS;
            COSTOFIN = COSTOINI + COSTOENT - COSTOSAL;
            if (BODEGA = '') then
                BEGIN
                EXECUTE PROCEDURE SALDO_INICIAL_TOTAL_INV(CODIGO, fecfin+1) returning_values (canfinal);
                EXECUTE PROCEDURE VALOR_INICIAL_INVENTARIO(CODIGO, FECFIN+1) returning_values (cosfinal);
                SELECT SUM(RSDE_LIBERAR)
                    FROM RESERVAS_DETALLE RD, RESERVAS R
                    WHERE R.RESE_ID = RD.RESE_ID AND ARTI_COD = :CODIGO AND RESE_FECHA <= :fecfin AND RESE_VENCE >= :fecfin AND RSDE_ANULADO = 'N'
                    INTO :RESERVADO;
                if (RESERVADO IS NULL) then
                    RESERVADO = 0;
                PEDIDO = 0;
                FOR SELECT P.PEDI_ID, PEDE_ITEM, PEDE_CANT * PEDE_FACTOR
                    FROM PEDIDOS P, PEDIDOS_DETALLE PD
                    WHERE P.PEDI_ID = PD.PEDI_ID AND PD.ARTI_COD = :CODIGO AND PEDI_VENCE >= :fecfin AND PEDI_FECHA <= :fecfin AND PEDE_ANULADO = 'N'
                    INTO :ID, :ITEM, :CANT2
                    do
                    BEGIN
                    EXECUTE PROCEDURE FALTANTE(34, 31, ID, ITEM) returning_values (ORDENC, UND, FACTOR);
                    if ((ORDENC * FACTOR = CANT2) or (PEDAUTO = 'SI')) then /* SI NO SE HA FACTURADO MIRE A VER SI SE REMISIONO */
                        EXECUTE PROCEDURE FALTANTE(34, 32, ID, ITEM) returning_values (ORDENC, UND, FACTOR);
                    if (ORDENC IS NULL) then
                        ORDENC = 0;
                    PEDIDO = PEDIDO + ORDENC * FACTOR;
                    END
                RESERVADO = RESERVADO + PEDIDO;
                END
            ELSE
                BEGIN
                EXECUTE PROCEDURE SALDO_INICIAL_INVENTARIO(CODIGO, FECFIN+1, :BODEGA) returning_values (CANFINAL);
                EXECUTE PROCEDURE COSTO_PROMEDIO(CODIGO, FECFIN+1) returning_values (COSFINAL);
                COSFINAL = COSFINAL * CANFINAL;
                SELECT SUM(RSDE_LIBERAR)
                    FROM RESERVAS_DETALLE RD, RESERVAS R
                    WHERE R.RESE_ID = RD.RESE_ID AND ARTI_COD = :CODIGO AND RESE_FECHA <= :fecfin AND RESE_VENCE >= :fecfin AND RD.BODE_COD = :bodega AND RSDE_ANULADO = 'N'
                    INTO :RESERVADO;
                if (RESERVADO IS NULL) then
                    RESERVADO = 0;
                PEDIDO = 0;
                FOR SELECT P.PEDI_ID, PEDE_ITEM, PEDE_CANT * PEDE_FACTOR
                    FROM PEDIDOS P, PEDIDOS_DETALLE PD
                    WHERE P.PEDI_ID = PD.PEDI_ID AND PD.ARTI_COD = :CODIGO AND PEDI_VENCE >= :FECHA AND PEDI_FECHA <= :FECHA AND PEDE_ANULADO = 'N' AND BODE_COD = :bodega
                    INTO :ID, :ITEM, :CANT2
                    do
                    BEGIN
                    EXECUTE PROCEDURE FALTANTE(34, 31, ID, ITEM) returning_values (ORDENC, UND, FACTOR);
                    if ((ORDENC * FACTOR = CANT2) or (PEDAUTO = 'SI')) then /* SI NO SE HA FACTURADO MIRE A VER SI SE REMISIONO */
                        EXECUTE PROCEDURE FALTANTE(34, 32, ID, ITEM) returning_values (ORDENC, UND, FACTOR);
                    if (ORDENC IS NULL) then
                        ORDENC = 0;
                    PEDIDO = PEDIDO + ORDENC * FACTOR;
                    END
                RESERVADO = RESERVADO + PEDIDO;
                END
            SUSPEND;
            END
        ELSE
            BEGIN
            SALDOFIN = SALDOINI;
            COSTOFIN = COSTOINI;
            COSTOENT = 0;
            COSTOSAL = 0;
            FOR SELECT MVAR_TIPODOC, MVAR_ENTRADA, MVAR_PREF, MVAR_NUMERO, MVAR_CANT, MVAR_COSTO, MVAR_CONC, MVAR_FECHA, M.TERC_NIT, MVAR_CONS, BODE_COD, COST_SALDOP, COST_SALDOC
                FROM MOVIMIENTO_ARTICULO M, COSTOS C
                WHERE M.arti_cod = C.arti_cod AND M.mvar_cons = C.cost_idmov AND (m.ARTI_COD = :CODIGO) AND (MVAR_FECHA >= :FECINI) AND (MVAR_FECHA <= :FECFIN) AND (MVAR_TIPODOC <> 13)
                ORDER BY M.ARTI_COD, MVAR_FECHA, MVAR_CONS
                INTO :TIPODOC, :ENTRADA, :PREFIJO, :NUMERO, :ENTRADAS, :COSTOENT, :CONCEPTO, :FECHA, :NIT, :CONS, :CODBOD, :costo, :cant
                DO
                    BEGIN
                    SELECT TIDO_NOMCORTO FROM TIPO_DOCUMENTO WHERE TIDO_COD = :TIPODOC INTO :TIPODOC;
                    if (ENTRADA = 'S') then
                        BEGIN
                        SALIDAS = 0;
                        SALDOFIN = SALDOFIN + ENTRADAS;
                        COSTOFIN = COSTOFIN + (ENTRADAS * COSTOENT);
                        if (CANT > 0) then
                            COSTOSAL = COSTO / CANT;
                        else
                            COSTOSAL = 0;
                        end
                    ELSE
                        BEGIN
                        SALIDAS = ENTRADAS;
                        ENTRADAS = 0;
                        if (CANT > 0) then
                            COSTOSAL = COSTO / CANT;
                        else
                            COSTOSAL = 0;
                        SALDOFIN = SALDOFIN - SALIDAS;
                        COSTOFIN = COSTOFIN - (SALIDAS * costosal);
                        END
                    SUSPEND;
                    END
            END
        END
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE REP_MOVIMIENTO_X_ARTICULO(
    DETALLE CHAR(1),
    FECINI DATE,
    FECFIN DATE,
    ARTINI VARCHAR(20),
    ARTFIN VARCHAR(20),
    GRPINI VARCHAR(2),
    GRPFIN VARCHAR(2),
    ORDEN CHAR(1),
    SUBEMPRESA INTEGER)
RETURNS (
    CODIGO VARCHAR(15),
    NOMBRE VARCHAR(60),
    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),
    SALDOINI NUMERIC(18,4),
    ENTRADAS NUMERIC(18,4),
    SALIDAS NUMERIC(18,4),
    RESERVADO NUMERIC(18,4),
    SALDOFIN NUMERIC(18,4),
    TIPODOC VARCHAR(8),
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(8),
    FECHA DATE,
    CONCEPTO VARCHAR(60),
    LOTE VARCHAR(15),
    LO_VENCE DATE,
    NIT VARCHAR(20),
    NOMTERC VARCHAR(60),
    CONS INTEGER)
AS
declare variable ENTRADA CHAR(1);
declare variable CODINI VARCHAR(20);
declare variable CODant VARCHAR(15) CHARACTER SET NONE;
declare variable CODFIN VARCHAR(20);
declare variable DESINI VARCHAR(20);
declare variable DESFIN VARCHAR(20);
declare variable id integer;
declare variable item integer;
declare variable und varchar(8);
declare variable factor numeric(18,4);
declare variable cant2 numeric(18,4);
declare variable ordenc numeric(18,4);
declare variable PEDAUTO CHAR(2);
BEGIN
if (ORDEN = 'C') then
    BEGIN
    CODINI = ARTINI;
    CODFIN = ARTFIN;
    DESINI = '';
    DESFIN = 'zz';
    END
ELSE
    BEGIN
    DESINI = ARTINI;
    DESFIN = ARTFIN;
    CODINI = '';
    CODFIN = 'zz';
    END

EXECUTE PROCEDURE LEE_CONFIGURACION('FACTURACION', 'FACTURAS', 'GENERAR PEDIDO AUTOMATICAMENTE CON LA FACTURA') returning_values (pedauto);
if (DETALLE = 'L') then
  BEGIN
   codant = 0;
   for SELECT A.ARTI_COD, ARTI_DES, ARTI_UNIDAD, A.GRUP_COD, A.SUBG_COD, A.MARC_COD, LOTE_NRO,LOTE_VENCE, BODE_COD
     FROM ARTICULO A, LOTES L
     WHERE A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.GRUP_COD >= :GRPINI AND A.GRUP_COD <= :GRPFIN AND
       ARTI_DES >= :DESINI AND ARTI_DES <= :DESFIN AND A.ESAR_COD <> 'I' AND a.arti_cod = l.arti_cod
     INTO :CODIGO, :NOMBRE, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC, :LOTE, :LO_VENCE, :codbod
     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;
      SELECT BODE_NOM FROM BODEGA WHERE BODE_COD = :codbod INTO nombod;

      SELECT SUM(RSDE_LIBERAR)
        FROM RESERVAS_DETALLE RD, RESERVAS R
        WHERE R.RESE_ID = RD.RESE_ID AND ARTI_COD = :CODIGO AND RESE_FECHA <= :FECFIN AND RESE_VENCE >= :FECFIN AND RD.BODE_COD = :CODBOD AND RSDE_ANULADO = 'N'
        INTO :RESERVADO;
      if (RESERVADO IS NULL) then
        RESERVADO = 0;
      FOR SELECT P.PEDI_ID, PEDE_ITEM, PEDE_CANT * PEDE_FACTOR
        FROM PEDIDOS P, PEDIDOS_DETALLE PD
        WHERE P.PEDI_ID = PD.PEDI_ID AND PD.ARTI_COD = :CODIGO AND PEDI_VENCE >= :FECFIN AND PEDI_FECHA <= :FECFIN AND PEDE_ANULADO = 'N' AND BODE_COD = :CODBOD
        INTO :ID, :ITEM, :CANT2
        do
        BEGIN
        EXECUTE PROCEDURE FALTANTE(34, 31, ID, ITEM) returning_values (ORDENC, UND, FACTOR);
        if ((ORDENC * FACTOR = CANT2) or (PEDAUTO = 'SI')) then /* SI NO SE HA FACTURADO MIRE A VER SI SE REMISIONO */
            EXECUTE PROCEDURE FALTANTE(34, 32, ID, ITEM) returning_values (ORDENC, UND, FACTOR);
        if (ORDENC IS NULL) then
            ORDENC = 0;
        RESERVADO = RESERVADO + ORDENC * FACTOR;
        END

      SELECT FIRST 1 (EXLO_SALDO + EXLO_ENT - EXLO_SAL) FROM existencia_lote WHERE ARTI_COD = :codigo AND LOTE_NRO = :lote AND
        BODE_COD = :codbod AND EXLO_FECHA < :fecini INTO :saldoini;
      if (SALDOINI IS NULL) then
        SALDOINI = 0;

      if (codigo <> codant) then
          SALDOFIN = SALDOINI;
      for SELECT TIPODOC, PREFIJO, NUMERO, FECHA, CONCEPTO, ENT, CANTENT, CANTSAL, NIT, CONS
        FROM MOVLOTES_DESDE_HASTA(:codigo, :codbod, :LOTE,:fecini, :fecfin,:SUBEMPRESA)
        ORDER BY FECHA,CONS
        INTO :TIPODOC, :PREFIJO, :NUMERO, :FECHA, :CONCEPTO, :ENTRADA, :ENTRADAS, :SALIDAS, :NIT, :CONS
        DO
        BEGIN
          if (nit is not null) then
            SELECT TERC_NOM FROM TERCEROS WHERE TERC_NIT = :NIT INTO :NOMTERC;
          else
            NOMTERC = '';
          if (ENTRADA = 'S') then
           BEGIN
            salidas = 0;
            SALDOFIN = SALDOFIN + ENTRADAS;
           END
          ELSE
           BEGIN
            ENTRADAS = 0;
            SALDOFIN = SALDOFIN - SALIDAS;
           END
          SUSPEND;
        END
      codant = :codigo;
    END
  END
ELSE
 BEGIN
  FOR
    SELECT ARTI_COD, ARTI_DES, ARTI_UNIDAD, A.GRUP_COD, A.SUBG_COD, A.MARC_COD, BODE_COD, BODE_NOM
      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 A.ESAR_COD <> 'I' AND ((SUCU_ID = :SUBEMPRESA) OR (:SUBEMPRESA = 0))
      INTO :CODIGO, :NOMBRE, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC, :CODBOD, :NOMBOD
      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;
        EXECUTE PROCEDURE SALDO_INICIAL_INVENTARIO(CODIGO, FECINI, :CODBOD) returning_values (:SALDOINI);
        if (DETALLE = 'N') then
            BEGIN
            /* SUME LAS ENTRADAS */
            SELECT SUM(MVAR_CANT) FROM MOVIMIENTO_ARTICULO
              WHERE (MVAR_FECHA >= :FECINI) AND (MVAR_FECHA <= :FECFIN) AND
              (ARTI_COD = :CODIGO) AND (BODE_COD = :CODBOD) AND (MVAR_ENTRADA = 'S') INTO :ENTRADAS;
            if (ENTRADAS IS NULL) then
              ENTRADAS = 0;
            /* CALCULE LAS SALIDAS A COSTO PROMEDIO */
            SALIDAS = 0;
            SELECT SUM(MVAR_CANT)
                FROM MOVIMIENTO_ARTICULO
                WHERE (MVAR_FECHA >= :FECINI) AND (MVAR_FECHA <= :FECFIN) AND
                (ARTI_COD = :CODIGO) AND (BODE_COD = :CODBOD) AND (MVAR_ENTRADA = 'N')
                INTO :SALIDAS;
            if (SALIDAS IS NULL) then
              SALIDAS = 0;
            SALDOFIN = SALDOINI + ENTRADAS - SALIDAS;
            SUSPEND;
            END
        if (DETALLE = 'B') then
            BEGIN
            SALDOFIN = SALDOINI;
            FOR SELECT TIDO_NOMCORTO, MVAR_ENTRADA, MVAR_PREF, MVAR_NUMERO, MVAR_CANT, MVAR_CONC, MVAR_FECHA, M.TERC_NIT, MVAR_CONS
                FROM MOVIMIENTO_ARTICULO M, TIPO_DOCUMENTO TD
                WHERE TD.TIDO_COD = MVAR_TIPODOC AND (MVAR_FECHA >= :FECINI) AND (MVAR_FECHA <= :FECFIN) AND (ARTI_COD = :CODIGO) AND (BODE_COD = :CODBOD)
                ORDER BY MVAR_FECHA, MVAR_CONS
                INTO :TIPODOC, :ENTRADA, :PREFIJO, :NUMERO, :ENTRADAS, :CONCEPTO, :FECHA, :NIT, :CONS
                DO
                    BEGIN
                    if (nit is not null) then
                        SELECT TERC_NOM FROM TERCEROS WHERE TERC_NIT = :NIT INTO :NOMTERC;
                    else
                        NOMTERC = '';
                    if (ENTRADA = 'S') then
                        BEGIN
                        SALIDAS = 0;
                        SALDOFIN = SALDOFIN + ENTRADAS;
                        end
                    ELSE
                        BEGIN
                        SALIDAS = ENTRADAS;
                        ENTRADAS = 0;
                        SALDOFIN = SALDOFIN - SALIDAS;
                        END
                    SUSPEND;
                    END
            END
        END
  END
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE RESERVAS_ARTICULO(
    FECHA DATE,
    DETALLE CHAR(1))
RETURNS (
    CODIGO VARCHAR(15),
    NOMBRE VARCHAR(60),
    RESERVA NUMERIC(18,4),
    EXIST NUMERIC(18,2),
    FALTANTE NUMERIC(18,2),
    COSTO NUMERIC(18,2),
    UNIDAD VARCHAR(8),
    CODGRUPO VARCHAR(2),
    NOMGRUPO VARCHAR(30),
    CODSUBG VARCHAR(3),
    NOMSUBG VARCHAR(30),
    CODMARC VARCHAR(3),
    NOMMARC VARCHAR(30),
    COSTOTOT NUMERIC(18,2),
    CLIENTE VARCHAR(60),
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(8),
    FECHADOC DATE)
AS
declare variable PEDIDO NUMERIC(18,4);
declare variable ID INTEGER;
declare variable ITEM INTEGER;
declare variable UND VARCHAR(8);
declare variable FACTOR NUMERIC(18,4);
declare variable FACT NUMERIC(18,4);
declare variable CANT NUMERIC(18,4);
declare variable PEDAUTO CHAR(2);
BEGIN
EXECUTE PROCEDURE LEE_CONFIGURACION('FACTURACION', 'FACTURAS', 'GENERAR PEDIDO AUTOMATICAMENTE CON LA FACTURA') returning_values (pedauto);
  FOR
    SELECT ARTI_COD, ARTI_DES, ARTI_UNIDAD, A.GRUP_COD, A.SUBG_COD, A.MARC_COD
      FROM ARTICULO A
      INTO :CODIGO, :NOMBRE, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
      DO
        BEGIN
        NOMMARC = '';
        NOMSUBG = '';
        SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
        SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
        SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
        EXECUTE PROCEDURE SALDO_TOTAL_INVENTARIO(CODIGO, FECHA) returning_values (EXIST);
        if (DETALLE = 'N') then
            BEGIN
            EXECUTE PROCEDURE COSTO_PROMEDIO(CODIGO, FECHA) returning_values (COSTO);
            SELECT SUM(RSDE_LIBERAR) FROM RESERVAS R, RESERVAS_DETALLE RD
                WHERE R.RESE_ID = RD.RESE_ID AND RD.ARTI_COD = :CODIGO AND RESE_FECHA <= :FECHA AND RESE_VENCE > :FECHA AND RESE_ANULADO = 'N'
                INTO :RESERVA;
            if (RESERVA IS NULL) then
                RESERVA = 0;
            FOR SELECT P.PEDI_ID, PEDE_ITEM, PEDE_CANT * PEDE_FACTOR
                FROM PEDIDOS P, PEDIDOS_DETALLE D
                WHERE P.PEDI_ID = D.PEDI_ID AND D.ARTI_COD = :CODIGO AND (PEDI_FECHA+PEDI_VALIDEZ) >= :FECHA AND PEDI_FECHA <= :FECHA AND PEDI_ANULADO = 'N'
                INTO :ID, :item, :CANT
                DO
                BEGIN
                EXECUTE PROCEDURE FALTANTE(34, 31, ID, ITEM) returning_values (PEDIDO, UND, FACT);
                if (PEDIDO * FACT = CANT) then
                    EXECUTE PROCEDURE FALTANTE(34, 32, ID, ITEM) returning_values (PEDIDO, UND, FACT);
                if (PEDIDO IS NULL) then
                    PEDIDO = 0;
                RESERVA = RESERVA + PEDIDO;
                END
            if (RESERVA > EXIST) then
                FALTANTE = RESERVA - EXIST;
            ELSE
                FALTANTE = 0;
            COSTOTOT = RESERVA * COSTO;
            if (RESERVA > 0) then
                SUSPEND;
            END
        ELSE
            BEGIN
            FOR SELECT RESE_FECHA, PREF_PRE, RESE_NUMERO, RESE_NOMTERC, RDSE_CANT, RSDE_UNIDAD, RSDE_LIBERAR
                FROM RESERVAS R, RESERVAS_DETALLE RD
                WHERE R.RESE_ID = RD.RESE_ID AND RD.ARTI_COD = :CODIGO AND RESE_FECHA <= :FECHA AND RESE_VENCE > :FECHA AND RESE_ANULADO = 'N'
                INTO :FECHADOC, :PREFIJO, :NUMERO, :CLIENTE, :RESERVA, :UNIDAD, :FALTANTE
                DO
                BEGIN
                if (RESERVA > EXIST) then
                    FALTANTE = RESERVA - EXIST;
                ELSE
                    FALTANTE = 0;
                COSTOTOT = RESERVA * COSTO;
                SUSPEND;
                END
            FOR SELECT P.PEDI_ID, PEDE_ITEM, PEDI_FECHA, PREF_PRE, PEDI_NUMERO, PEDI_NOMTERC, PEDE_CANT, PEDE_UNIDAD, PEDE_RESERVA, PEDE_FACTOR
                FROM PEDIDOS P, PEDIDOS_DETALLE PD
                WHERE P.PEDI_ID = PD.PEDI_ID AND PD.ARTI_COD = :CODIGO AND PEDI_FECHA <= :FECHA AND (PEDI_FECHA+PEDI_VALIDEZ) >= :FECHA AND PEDI_ANULADO = 'N'
                INTO :ID, :ITEM, :FECHADOC, :PREFIJO, :NUMERO, :CLIENTE, :CANT, :UNIDAD, :FALTANTE, :FACTOR
                DO
                BEGIN
                EXECUTE PROCEDURE FALTANTE(34, 31, ID, ITEM) returning_values (RESERVA, UND, FACT);
                if ((RESERVA * FACT = CANT * FACTOR) or (PEDAUTO = 'SI')) then
                    EXECUTE PROCEDURE FALTANTE(34, 31, ID, ITEM) returning_values (RESERVA, UND, FACTOR);
                if (RESERVA IS NULL) then
                    RESERVA = 0;
                if (RESERVA > 0) then
                    BEGIN
                    if (RESERVA > EXIST) then
                        FALTANTE = RESERVA - EXIST;
                    ELSE
                        FALTANTE = 0;
                    COSTOTOT = RESERVA * COSTO;
                    SUSPEND;
                    END
                END
            END
        END
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE RESERVAS_ARTICULO_FECHA(
    ARTICULO VARCHAR(15),
    FECHA DATE)
RETURNS (
    FECRES DATE,
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(8),
    VENCE DATE,
    CLIENTE VARCHAR(60),
    CANTIDAD NUMERIC(18,2),
    UNIDAD VARCHAR(8),
    TIPO INTEGER,
    ID INTEGER)
AS
declare variable ITEM INTEGER;
declare variable FACTOR NUMERIC(18,4);
declare variable UND VARCHAR(8);
declare variable FACT NUMERIC(18,4);
declare variable ORDENC NUMERIC(18,4);
declare variable PEDAUTO CHAR(2);
BEGIN
TIPO = 17;
  /* MUESTRA LAS RESERVAS DEL ARTICULO QUE NO SE HAN VENCIDO */
  FOR SELECT R.RESE_ID, RESE_FECHA, PREF_PRE, RESE_NUMERO, RESE_VENCE, RESE_NOMTERC, RDSE_CANT, RSDE_UNIDAD
    FROM RESERVAS R, RESERVAS_DETALLE RD
    WHERE R.RESE_ID = RD.RESE_ID AND RD.ARTI_COD = :ARTICULO AND RESE_VENCE >= :FECHA AND RESE_FECHA <= :FECHA AND RSDE_ANULADO = 'N'
    INTO :ID, :FECRES, :PREFIJO, :NUMERO, :VENCE, :CLIENTE, :CANTIDAD, :UNIDAD
        DO
          SUSPEND;
TIPO = 34;
  /* MUESTRA LOS PEDIDOS DEL ARTICULO QUE NO SE HAN VENCIDO */
  FOR SELECT P.PEDI_ID, PEDE_ITEM, PEDI_FECHA, PREF_PRE, PEDI_NUMERO, (PEDI_FECHA + PEDI_VALIDEZ), PEDI_NOMTERC, PEDE_CANT, PEDE_UNIDAD, PEDE_FACTOR
    FROM PEDIDOS P, PEDIDOS_DETALLE PD
    WHERE P.PEDI_ID = PD.PEDI_ID AND PD.ARTI_COD = :ARTICULO AND (PEDI_FECHA+PEDI_VALIDEZ) >= :FECHA AND PEDI_FECHA <= :FECHA AND PEDE_ANULADO = 'N'
    INTO :ID, :ITEM, :FECRES, :PREFIJO, :NUMERO, :VENCE, :CLIENTE, :CANTIDAD, :UNIDAD, :FACTOR
    DO
        BEGIN
        EXECUTE PROCEDURE FALTANTE(34, 31, ID, ITEM) returning_values (ORDENC, UND, FACT);
        if ((ORDENC * FACT = CANTIDAD * FACTOR) or (PEDAUTO = 'SI')) then
            EXECUTE PROCEDURE FALTANTE(34, 32, ID, ITEM) returning_values (ORDENC, UND, FACTOR);
        if (ORDENC IS NULL) then
            ORDENC = 0;
        if (ORDENC <> 0) then
            BEGIN
            CANTIDAD = ORDENC;
            UNIDAD = UND;
            SUSPEND;
            END
        END
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE DESCARGA_REMISION_FALTANTE(
    REMISION1 VARCHAR(10),
    REMISION2 VARCHAR(10),
    REMISION3 VARCHAR(10),
    REMISION4 VARCHAR(10),
    REMISION5 VARCHAR(10),
    REMISION6 VARCHAR(10),
    PREFAC VARCHAR(4),
    NUMFAC VARCHAR(8))
RETURNS (
    IDCON INTEGER)
AS
declare variable IDF INTEGER;
declare variable IDR6 INTEGER;
declare variable IDR5 INTEGER;
declare variable IDR4 INTEGER;
declare variable IDR3 INTEGER;
declare variable IDR2 INTEGER;
declare variable IDR1 INTEGER;
declare variable ITEM INTEGER;
begin
IDR1 = 0;
IDR2 = 0;
IDR3 = 0;
IDR4 = 0;
IDR5 = 0;
IDR6 = 0;
ITEM = 0;
SELECT REVT_ID FROM REMISIONES_VENTA WHERE PREF_PRE = SUBSTR(:remision1, 1, 4) AND REVT_NUMERO = SUBSTR(:remision1, 5, 10) INTO :IDR1;
SELECT REVT_ID FROM REMISIONES_VENTA WHERE PREF_PRE = SUBSTR(:remision2, 1, 4) AND REVT_NUMERO = SUBSTR(:remision2, 5, 10) INTO :IDR2;
SELECT REVT_ID FROM REMISIONES_VENTA WHERE PREF_PRE = SUBSTR(:remision3, 1, 4) AND REVT_NUMERO = SUBSTR(:remision3, 5, 10) INTO :IDR3;
SELECT REVT_ID FROM REMISIONES_VENTA WHERE PREF_PRE = SUBSTR(:remision4, 1, 4) AND REVT_NUMERO = SUBSTR(:remision4, 5, 10) INTO :IDR4;
SELECT REVT_ID FROM REMISIONES_VENTA WHERE PREF_PRE = SUBSTR(:remision5, 1, 4) AND REVT_NUMERO = SUBSTR(:remision5, 5, 10) INTO :IDR5;
SELECT REVT_ID FROM REMISIONES_VENTA WHERE PREF_PRE = SUBSTR(:remision6, 1, 4) AND REVT_NUMERO = SUBSTR(:remision6, 5, 10) INTO :IDR6;
IF (IDR1 <> 0) THEN
    BEGIN
    ITEM = ITEM + 1;
    SELECT FACT_ID FROM FACTURAS WHERE PREF_PRE = :prefac AND FACT_NUMERO = :numfac INTO :IDF;
    IDCON = GEN_ID(ID_CONS, 1);
    UPDATE FACTURAS SET FACT_CONSOLIDA = :idcon WHERE FACT_ID = :IDF;
    INSERT INTO CONSOLIDE_FALTANTES (CEFA_ID, CEFA_ITEM, CEFA_TIPODES, CEFA_TIPOORI, CEFA_IDORI)
        VALUES (:IDCON, :ITEM, 31, 32, :IDR1);
    IF (IDR2 <> 0) THEN
        BEGIN
        ITEM = ITEM + 1;
        INSERT INTO CONSOLIDE_FALTANTES (CEFA_ID, CEFA_ITEM, CEFA_TIPODES, CEFA_TIPOORI, CEFA_IDORI)
            VALUES (:IDCON, :ITEM, 31, 32, :IDR2);
        END
    IF (IDR3 <> 0) THEN
        BEGIN
        ITEM = ITEM + 1;
        INSERT INTO CONSOLIDE_FALTANTES (CEFA_ID, CEFA_ITEM, CEFA_TIPODES, CEFA_TIPOORI, CEFA_IDORI)
            VALUES (:IDCON, :ITEM, 31, 32, :IDR3);
        END
    IF (IDR4 <> 0) THEN
        BEGIN
        ITEM = ITEM + 1;
        INSERT INTO CONSOLIDE_FALTANTES (CEFA_ID, CEFA_ITEM, CEFA_TIPODES, CEFA_TIPOORI, CEFA_IDORI)
            VALUES (:IDCON, :ITEM, 31, 32, :IDR4);
        END
    IF (IDR5 <> 0) THEN
        BEGIN
        ITEM = ITEM + 1;
        INSERT INTO CONSOLIDE_FALTANTES (CEFA_ID, CEFA_ITEM, CEFA_TIPODES, CEFA_TIPOORI, CEFA_IDORI)
            VALUES (:IDCON, :ITEM, 31, 32, :IDR5);
        END
    IF (IDR6 <> 0) THEN
        BEGIN
        ITEM = ITEM + 1;
        INSERT INTO CONSOLIDE_FALTANTES (CEFA_ID, CEFA_ITEM, CEFA_TIPODES, CEFA_TIPOORI, CEFA_IDORI)
            VALUES (:IDCON, :ITEM, 31, 32, :IDR6);
        END
    EXECUTE PROCEDURE consolide_pendientes (:IDCON);
    suspend;
    END
end
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE RECALCULA_FALTANTES_VENTAS2(
    FECINI DATE,
    FECFIN DATE,
    PREF VARCHAR(4))
RETURNS (
    FACTURA VARCHAR(8),
    REMISION VARCHAR(30),
    IDCON INTEGER)
AS
declare variable IDF INTEGER;
declare variable IDR INTEGER;
begin
FOR SELECT FACT_REMISION, FACT_NUMERO, FACT_ID FROM FACTURAS WHERE ((FACT_CONSOLIDA IS NULL) or (FACT_CONSOLIDA = 0)) AND
    (FACT_ANULADO = 'N') AND (FACT_REMISION IS NOT NULL) AND FACT_FECHA >= :FECINI AND FACT_FECHA <= :FECFIN AND PREF_PRE = :PREF
    INTO :REMISION, :FACTURA, :IDF
    DO
    BEGIN
    if (STRLEN(REMISION) = 10) then
        BEGIN
        IDR = 0;
        SELECT REVT_ID FROM REMISIONES_VENTA WHERE PREF_PRE = SUBSTR(:remision, 1, 4) AND REVT_NUMERO = SUBSTR(:remision, 5, 10) INTO :IDR;
        IF (IDR <> 0) THEN
            BEGIN
            IDCON = GEN_ID(ID_CONS, 1);
            INSERT INTO CONSOLIDE_FALTANTES (CEFA_ID, CEFA_ITEM, CEFA_TIPODES, CEFA_TIPOORI, CEFA_IDORI)
                VALUES (:IDCON, 1, 31, 32, :IDR);
            EXECUTE PROCEDURE consolide_pendientes (:IDCON);
            UPDATE FACTURAS SET FACT_CONSOLIDA = :idcon WHERE FACT_ID = :IDF;
            suspend;
            END
        END
    END
end
^

SET TERM ; ^

SET TERM ^ ;

ALTER TRIGGER REMISIONES_VENTA_BI
AS
declare variable NUMERO VARCHAR(8);
declare variable AUTOM CHAR(1);
declare variable EXISTE CHAR(1);
declare variable PEDAUTO CHAR(2);
declare variable ITEM INTEGER;
declare variable IDF INTEGER;
declare variable IDP INTEGER;
declare variable IDC INTEGER;
declare variable FECSERVER CHAR(2);
declare variable PEDIDOREP char(2);
declare variable TIPO VARCHAR(8);
declare variable NUMROWS INTEGER;
declare variable IDPEDIDO INTEGER;
declare variable NUMPEDIDO VARCHAR(10);
BEGIN
EXECUTE PROCEDURE LEE_CONFIGURACION('FACTURACION', 'DOCUMENTOS', 'INHABILITAR FECHA EN DOCUMENTOS') returning_values (:fecserver);
if (FECSERVER = 'SI') then
    NEW.revt_fecha = CAST ('NOW' AS DATE);
if (NEW.numok = 'N') then
  BEGIN
  /* Actualice el contador del prefijo */
  SELECT PREF_ACTUAL, PREF_AUTO FROM PREFIJOS WHERE TIDO_COD = 32 AND PREF_PRE = NEW.PREF_PRE INTO :NUMERO, :AUTOM;
  /* ACTUALICE EL NUMERO EN COMPROBANTE_ENCABEZADO  */
  if (AUTOM = 'S') then
    BEGIN
    NEW.REVT_NUMERO = NUMERO;
    NUMERO = CAST((CAST(NUMERO AS INTEGER) + 1) AS CHAR(6));
    UPDATE PREFIJOS
      SET PREF_ACTUAL = :NUMERO
    WHERE TIDO_COD = 32 AND PREF_PRE = NEW.PREF_PRE;
    END
  ELSE
    BEGIN
    if (CAST(NUMERO AS INTEGER) = CAST(NEW.REVT_NUMERO AS INTEGER)) then
        UPDATE PREFIJOS
          SET PREF_ACTUAL = CAST((CAST(PREF_ACTUAL AS INTEGER) + 1) AS CHAR(6))
        WHERE TIDO_COD = 32 AND PREF_PRE = NEW.PREF_PRE;
    END
  EXECUTE PROCEDURE COMPLETA_CEROS (NEW.REVT_numero) returning_values (NEW.REVT_numero);
  NEW.numok = 'S';
  END
/* Verifique que el numero no existe previamente */
EXISTE = 'N';
SELECT 'S' FROM REMISIONES_VENTA WHERE PREF_PRE = NEW.PREF_PRE AND REVT_NUMERO = NEW.REVT_NUMERO INTO :EXISTE;
if (EXISTE = 'S') then
    EXCEPTION DOCUMENTO_REGISTRADO 'Ya existe una remisión a cliente con el número ' || new.pref_pre || new.revt_numero;

/* si hay pedido automatico saque una copia de la consolidacion */
EXECUTE PROCEDURE LEE_CONFIGURACION('FACTURACION', 'FACTURAS', 'GENERAR PEDIDO AUTOMATICAMENTE CON LA FACTURA') returning_values (pedauto);
if (PEDAUTO = 'SI') then
    begin
    IDC = gen_id(id_cons,1);
    for select cefa_item, cefa_idori from consolide_faltantes where cefa_id = new.revt_consolida
        into :item, :idf
        do
        begin
        SELECT PEDI_ID FROM PEDIDOS P, FACTURAS F WHERE P.PREF_PRE = F.pref_pre AND P.pedi_numero = F.fact_numero AND F.fact_id = :IDF INTO :IDP;
        insert into consolide_faltantes (cefa_id, cefa_item, cefa_tipodes, cefa_tipoori, cefa_idori)
            VALUES(:IDC, :item, 32, 34, :IDP);
        end
    EXECUTE PROCEDURE consolide_pendientes (:IDC);
    NEW.lipr_cod = :IDC;
    end
if (NEW.revt_consolida <> 0) then
    BEGIN
    execute procedure lee_configuracion ('FACTURACION', 'REMISIONES', 'PERMITIR VARIOS DESPACHOS PARCIALES DEL MISMO PEDIDO/FACTURA') returning_values (:pedidorep);
    if (pedidorep <> 'SI') then
        BEGIN
        SELECT COUNT(C2.COFA_ID), MAX(TIDO_NOMCORTO), max(c2.cofa_idori) FROM consolidado_faltantes C1, consolidado_faltantes C2, tipo_documento t
            WHERE C1.cofa_id <> C2.cofa_id and C1.cofa_id = NEW.revt_consolida AND C1.cofa_tipodes = 32 AND
            C2.cofa_tipodes = 32 AND C1.cofa_tipoori = C2.cofa_tipoori AND C1.cofa_idori = C2.cofa_idori and
            c1.cofa_tipoori = t.tido_cod and c1.cofa_cantcr <> 0 and c2.cofa_cantcr <> 0
            INTO :NUMROWS, :TIPO, :idpedido;
        if (NUMROWS <> 0) then
            begin
            if (TIPO = 'PEDIDCLI') then
                SELECT PREF_PRE || PEDI_NUMERO FROM PEDIDOS WHERE PEDI_ID = :idpedido INTO :numpedido;
            if (TIPO = 'FACTVENT') then
                SELECT PREF_PRE || FACT_NUMERO FROM FACTURAS WHERE FACT_ID = :idpedido INTO :numpedido;
            exception documento_cruzado 'El documento ' || :tipo || ' ' || :numpedido || ' ya fue utilizado en otra remisión.';
            end
        END
    END
END^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER procedure FALTANTE_CORTE (
    TIPORI integer,
    TIPDES integer,
    IDDOC integer,
    ITEM integer,
    CORTE date)
returns (
    CANT numeric(18,4),
    UNIDAD varchar(8),
    FACTOR numeric(18,4))
AS
declare variable CANTAUX NUMERIC(18,4);
declare variable PEDAUTO CHAR(2);
declare variable ARTIC VARCHAR(20);
declare variable CODOMITE VARCHAR(20);
begin
/* BUSQUE EL DOCUMENTO Y RECORRA LOS ITEMS */
EXECUTE PROCEDURE LEE_CONFIGURACION('FACTURACION', 'DOCUMENTOS', 'CODIGO DE ARTICULO A OMITIR EN LA CONSOLIDACION DE PENDIENTES') returning_values (:codomite);
if (TIPORI = 21) then
    BEGIN
    SELECT ARTI_COD, ((FCDE_CANT * FCDE_FACTOR) - FCDE_DEVUELTO) / FCDE_FACTOR, FCDE_FACTOR, FCDE_UNIDAD FROM FACTURAS_COMPRAS_DETALLE
        WHERE FACO_ID = :IDDOC AND FCDE_ITEM = :ITEM AND FCDE_ANULADO = 'N' INTO :ARTIC, :CANT, :FACTOR, :UNIDAD;
    END
if (TIPORI = 22) then
    BEGIN
    SELECT ARTI_COD, ((RPVD_CANT * RPVD_FACTOR) - RPVD_DEVUELTO) / RPVD_FACTOR, RPVD_FACTOR, RPVD_UNIDAD FROM remision_proveedor_det
        WHERE REPR_ID = :IDDOC AND RPVD_ITEM = :ITEM AND RPVD_ANULADO = 'N' INTO :ARTIC, :CANT, :FACTOR, :UNIDAD;
    END
if (TIPORI = 23) then
    BEGIN
    SELECT ARTI_COD, OCDE_CANT, OCDE_FACTOR, OCDE_UNIDAD FROM ORDENES_COMPRA_DETALLE
        WHERE ORDC_ID = :IDDOC AND OCDE_ITEM = :ITEM AND OCDE_ANULADO = 'N'  INTO :ARTIC, :CANT, :FACTOR, :UNIDAD;
    END
if (TIPORI = 25) then
    BEGIN
    SELECT ARTI_COD, CPRD_CANT, CPRD_FACTOR, CPRD_UNIDAD FROM COTIZACIONES_PROVEEDOR_DET
        WHERE COPR_ID = :IDDOC AND CPRD_ITEM = :ITEM AND CPRD_ANULADO = 'N' INTO :ARTIC, :CANT, :FACTOR, :UNIDAD;
    END
if (TIPORI = 31) then
    BEGIN
    SELECT ARTI_COD, ((FADE_CANT * FADE_FACTOR)-FADE_DEVUELTO) / FADE_FACTOR, FADE_FACTOR, FADE_UNIDAD
        FROM FACTURAS_DETALLE WHERE FACT_ID = :IDDOC AND FADE_ITEM = :ITEM AND FADE_ANULADO = 'N'
        INTO :ARTIC, :CANT, :FACTOR, :UNIDAD;
    END
if (TIPORI = 32) then
    BEGIN
    SELECT ARTI_COD, ((RVDE_CANT * RVDE_FACTOR)-RVDE_DEVUELTO) / RVDE_FACTOR, RVDE_FACTOR, RVDE_UNIDAD
        FROM remisiones_venta_detalle WHERE REVT_ID = :IDDOC AND RVDE_ITEM = :ITEM AND RVDE_ANULADO = 'N'
        INTO :ARTIC, :CANT, :FACTOR, :UNIDAD;
    END
if (TIPORI = 34) then
    BEGIN
    SELECT ARTI_COD, ((PEDE_CANT * PEDE_FACTOR)-PEDE_DEVUELTO) / PEDE_FACTOR, PEDE_FACTOR, PEDE_UNIDAD FROM PEDIDOS_DETALLE
        WHERE PEDI_ID = :IDDOC AND PEDE_ITEM = :ITEM AND PEDE_ANULADO = 'N' INTO :ARTIC, :CANT, :FACTOR, :UNIDAD;
    EXECUTE PROCEDURE LEE_CONFIGURACION('FACTURACION', 'FACTURAS', 'GENERAR PEDIDO AUTOMATICAMENTE CON LA FACTURA') returning_values (pedauto);
    if ((PEDAUTO = 'SI') and (ARTIC <> :codomite)) then
        begin
        /* RESTE LAS DEVOLUCIONES DE LA FACTURA ORIGINAL */
        SELECT SUM(FADE_DEVUELTO) FROM FACTURAS_DETALLE D, FACTURAS F, PEDIDOS P
            WHERE P.pedi_id = :IDDOC AND P.pref_pre = F.pref_pre AND P.pedi_numero = RIGHT(F.fact_numero,6) AND D.fact_id = F.fact_id AND D.fade_item = :item AND FACT_ANULADO = 'N'
            INTO :cantaux;
        if (cantaux > 0) then
            CANT = (CANT * FACTOR - CANTAUX) / FACTOR;
        end
    END
if (TIPORI = 35) then
    BEGIN
    SELECT ARTI_COD, CTDE_CANT, CTDE_FACTOR, CTDE_UNIDAD FROM COTIZACIONES_DETALLE
        WHERE COTI_ID = :IDDOC AND CTDE_ITEM = :ITEM AND CTDE_ANULADO = 'N' INTO :ARTIC, :CANT, :FACTOR, :UNIDAD;
    END
if (TIPORI = 40) then
    BEGIN
    SELECT ARTI_COD, PEVD_CANT, PEVD_FACTOR, PEVD_UNIDAD FROM pendiente_ventas_detalle
        WHERE PEND_ID = :IDDOC AND PEVD_ITEM = :ITEM AND PEVD_ANULADO = 'N' INTO :ARTIC, :CANT, :FACTOR, :UNIDAD;
    END
if (TIPORI = 139) then
    BEGIN
    SELECT ARTI_COD, SLDE_CANT, SLDE_FACTOR, SLDE_UNIDAD FROM solicitud_importacion_det
        WHERE SLIM_ID = :IDDOC AND SLDE_ITEM = :ITEM AND SLDE_ANULADO = 'N' INTO :ARTIC, :CANT, :FACTOR, :UNIDAD;
    END

if (CANT IS NULL) then
    CANT = 0;
if (ARTIC <> codomite) then
    BEGIN
    /* RECORRA LOS USOS EN CONSOLIDE_DOCS */
    select sum(COFA_CANTCR) from consolidado_faltantes
        where COFA_TIPOORI = :tipori and COFA_IDORI = :IDDOC and COFA_ITEMORI = :ITEM and COFA_TIPODES = :TIPDES
        and COFA_FECDES <= :CORTE
        into :cantaux;
    if (CANTAUX is null) then
        CANTAUX = 0;
    if (CANTAUX > (CANT * FACTOR)) then
        CANT = 0;
    else
        CANT = ((CANT * FACTOR) - CANTAUX) / FACTOR;
    if (CANTAUX = 0 ) then
        BEGIN
        /* INTENTELO AL REVES POR SI EL PROCEDIMIENTO DEL CLIENTE ES INVERSO */
        select sum(COFA_CANTCR) from consolidado_faltantes
            where COFA_TIPODES = :tipori and COFA_IDDES = :IDDOC and ARTI_COD = :artic and COFA_TIPOORI = :TIPDES
            into :cantaux;
        if (CANTAUX is null) then
            CANTAUX = 0;
        if (CANTAUX > (CANT * FACTOR)) then
            CANT = 0;
        else
            CANT = ((CANT * FACTOR) - CANTAUX) / FACTOR;
        END
    END
ELSE
    CANT = 0;
suspend;
end^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE FALTANTES_COMPRAS_ARTICULO(
    DESDE VARCHAR(20),
    HASTA VARCHAR(20),
    FECINI DATE,
    FECFIN DATE,
    DETALLE CHAR(1),
    TIPO INTEGER,
    DESTINO INTEGER,
    ORDEN CHAR(1),
    CEROS CHAR(1),
    CORTE DATE,
    SUCURSAL INTEGER)
RETURNS (
    ARTICULO VARCHAR(15),
    DESCRIPCION VARCHAR(60),
    CODGRUPO VARCHAR(2),
    NOMGRUPO VARCHAR(30),
    CODSUBG VARCHAR(3),
    NOMSUBG VARCHAR(30),
    CODMARC VARCHAR(3),
    NOMMARC VARCHAR(30),
    CANTIDAD NUMERIC(18,4),
    UNIDAD VARCHAR(8),
    FALTANTE NUMERIC(18,4),
    BASE NUMERIC(18,2),
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(8),
    NROPROV VARCHAR(8),
    FECHA DATE)
AS
declare variable CODINI VARCHAR(15);
declare variable CODFIN VARCHAR(15);
declare variable DESINI VARCHAR(15);
declare variable DESFIN VARCHAR(15);
declare variable ID INTEGER;
declare variable ITEM INTEGER;
declare variable CANT NUMERIC(18,2);
declare variable MONTO NUMERIC(18,2);
declare variable FACTOR NUMERIC(18,4);
BEGIN
if (ORDEN = 'C') then
    BEGIN
    CODINI = DESDE;
    CODFIN = HASTA;
    DESINI = '';
    DESFIN = 'zz';
    END
ELSE
    BEGIN
    DESINI = DESDE;
    DESFIN = HASTA;
    CODINI = '';
    CODFIN = 'zz';
    END
FOR SELECT ARTI_COD, ARTI_DES, ARTI_UNIDAD, A.GRUP_COD, A.SUBG_COD, A.MARC_COD FROM ARTICULO A
    WHERE ARTI_COD >= :CODINI AND ARTI_COD <= :CODFIN AND ARTI_DES >= :DESINI AND ARTI_DES <= :DESFIN
    INTO :ARTICULO, :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
  DO
    BEGIN
    CANTIDAD = 0;
    faltante = 0;
    base = 0;
    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 (DETALLE = 'N') then
        BEGIN
        if (TIPO = 21) then
            BEGIN
            FOR SELECT F.FACO_ID, FCDE_ITEM, FCDE_CANT * FCDE_FACTOR, (FCDE_PRUNIT-FCDE_DTOMONTO), FACO_NUMPROV
                FROM FACTURAS_COMPRAS_DETALLE D, FACTURAS_COMPRA F, prefijos P
                WHERE F.FACO_ID = D.FACO_ID AND ARTI_COD = :ARTICULO AND FACO_FECHA >= :FECINI AND FACO_FECHA <= :FECFIN AND FACO_ANULADO = 'N' AND P.PREF_PRE = F.PREF_PRE AND ((SUCU_ID = :SUCURSAL) or (:SUCURSAL = 0))
                ORDER BY F.FACO_ID, FCDE_ITEM INTO :ID, :ITEM, :CANT, :MONTO, :nroprov
                DO
                BEGIN
                CANTIDAD = CANTIDAD + CANT;
                EXECUTE PROCEDURE FALTANTE_CORTE(:TIPO, :DESTINO, :ID, :ITEM, :CORTE) returning_values (:CANT, :UNIDAD, :FACTOR);
                FALTANTE = FALTANTE + CANT;
                BASE = BASE + MONTO * CANT;
                END
            END
        if (TIPO = 22) then
            BEGIN
            FOR SELECT R.repr_id, rpvd_item, rpvd_cant * rpvd_factor, (rpvd_prunit-rpvd_dtomonto), REPR_NUMPROV
                FROM REMISION_PROVEEDOR_DET D, REMISION_PROVEEDOR R, PREFIJOS P
                WHERE R.REPR_ID = D.REPR_ID AND ARTI_COD = :ARTICULO AND REPR_FECHA >= :FECINI AND REPR_FECHA < :FECFIN AND REPR_ANULADO = 'N' AND P.PREF_PRE = R.PREF_PRE AND ((SUCU_ID = :SUCURSAL) or (:SUCURSAL = 0))
                ORDER BY R.REPR_ID, RPVD_ITEM INTO :ID, :ITEM, :CANT, :MONTO, :nroprov
                DO
                BEGIN
                CANTIDAD = CANTIDAD + CANT;
                EXECUTE PROCEDURE FALTANTE_CORTE(:TIPO, :DESTINO, :ID, :ITEM, :CORTE) returning_values (:CANT, :UNIDAD, :FACTOR);
                FALTANTE = FALTANTE + CANT;
                BASE = BASE + MONTO * CANT;
                END
            END
        if (TIPO = 23) then
            BEGIN
            FOR SELECT O.ORDC_ID, OCDE_ITEM, OCDE_CANT * OCDE_FACTOR, (OCDE_PRUNIT-OCDE_DTOMONTO)
                FROM ORDENES_COMPRA_DETALLE D, ORDENES_COMPRA O, PREFIJOS P
                WHERE O.ORDC_ID = D.ORDC_ID AND ARTI_COD = :ARTICULO AND ORDC_FECHA >= :FECINI AND ORDC_FECHA < :FECFIN AND ORDC_ANULADO = 'N' AND P.PREF_PRE = O.PREF_PRE AND ((SUCU_ID = :SUCURSAL) or (:SUCURSAL = 0))
                ORDER BY O.ORDC_ID, OCDE_ITEM INTO :ID, :ITEM, :CANT, :MONTO
                DO
                BEGIN
                NROPROV = '';
                CANTIDAD = CANTIDAD + CANT;
                EXECUTE PROCEDURE FALTANTE_CORTE(:TIPO, :DESTINO, :ID, :ITEM, :CORTE) returning_values (:CANT, :UNIDAD, :FACTOR);
                FALTANTE = FALTANTE + CANT;
                BASE = BASE + MONTO * CANT;
                END
            END
        if (TIPO = 25) then
            BEGIN
            FOR SELECT C.COPR_ID, CPRD_ITEM, CPRD_CANT * CPRD_FACTOR, (CPRD_PRUNIT-CPRD_DTOMONTO)
                FROM COTIZACIONES_PROVEEDOR_DET D, COTIZACION_PROVEEDOR C, PREFIJOS P
                WHERE C.COPR_ID = D.COPR_ID AND ARTI_COD = :ARTICULO AND COPR_FECHA >= :FECINI AND COPR_FECHA < :FECFIN AND COPR_ANULADO = 'N' AND P.PREF_PRE = C.PREF_PRE AND ((SUCU_ID = :SUCURSAL) or (:SUCURSAL = 0))
                ORDER BY C.COPR_ID, CPRD_ITEM INTO :ID, :ITEM, :CANT, :MONTO
                DO
                BEGIN
                NROPROV = '';
                CANTIDAD = CANTIDAD + CANT;
                EXECUTE PROCEDURE FALTANTE_CORTE(:TIPO, :DESTINO, :ID, :ITEM, :CORTE) returning_values (:CANT, :UNIDAD, :FACTOR);
                FALTANTE = FALTANTE + CANT;
                BASE = BASE + MONTO * CANT;
                END
            END
        if (CANTIDAD IS NULL) then
            CANTIDAD = 0;
        if (BASE IS NULL) then
            BASE = 0;
        if (FALTANTE IS NULL) then
            FALTANTE = 0;
        if (CEROS = 'S') then
            SUSPEND;
        ELSE
            if (FALTANTE <> 0) then
                SUSPEND;
        END
    ELSE
        BEGIN
        if (TIPO = 21) then
            FOR SELECT F.FACO_ID, FCDE_ITEM, F.PREF_PRE, FACO_NUMERO, FACO_FECHA, FCDE_CANT * FCDE_FACTOR, (FCDE_PRUNIT-FCDE_DTOMONTO), FACO_NUMPROV
                FROM FACTURAS_COMPRA F, FACTURAS_COMPRAS_DETALLE D, prefijos P
                WHERE F.FACO_ID = D.FACO_ID AND ARTI_COD = :ARTICULO AND FACO_FECHA >= :FECINI AND FACO_FECHA < :FECFIN  AND FACO_ANULADO = 'N' AND P.PREF_PRE = F.PREF_PRE AND ((SUCU_ID = :SUCURSAL) or (:SUCURSAL = 0))
                ORDER BY F.FACO_ID, FCDE_ITEM
                INTO :ID, :ITEM, :PREFIJO, :NUMERO, :FECHA, :CANTIDAD, :BASE, :nroprov
                DO
                    BEGIN
                    EXECUTE PROCEDURE FALTANTE_CORTE(:TIPO, :DESTINO, :ID, :ITEM, :CORTE) returning_values (:FALTANTE, :UNIDAD, :FACTOR);
                    if ((CEROS = 'S') or (FALTANTE <> 0)) then
                        SUSPEND;
                    END
        if (TIPO = 22) then
            FOR SELECT R.REPR_ID, RPVD_ITEM, R.PREF_PRE, REPR_NUMERO, REPR_FECHA, RPVD_CANT * RPVD_FACTOR, (RPVD_PRUNIT-RPVD_DTOMONTO), REPR_NUMPROV
                FROM REMISION_PROVEEDOR R, REMISION_PROVEEDOR_DET D, PREFIJOS P
                WHERE R.REPR_ID = D.REPR_ID AND ARTI_COD = :ARTICULO AND REPR_FECHA >= :FECINI AND REPR_FECHA < :FECFIN AND REPR_ANULADO = 'N' AND P.PREF_PRE = R.PREF_PRE AND ((SUCU_ID = :SUCURSAL) or (:SUCURSAL = 0))
                INTO :ID, :ITEM, :PREFIJO, :NUMERO, :FECHA, :CANTIDAD, :BASE, :nroprov
                DO
                    BEGIN
                    EXECUTE PROCEDURE FALTANTE_CORTE(:TIPO, :DESTINO, :ID, :ITEM, :CORTE) returning_values (:FALTANTE, :UNIDAD, :FACTOR);
                    if ((CEROS = 'S') or (FALTANTE <> 0)) then
                        SUSPEND;
                    END
        if (TIPO = 23) then
            FOR SELECT O.ORDC_ID, OCDE_ITEM, O.PREF_PRE, ORDC_NUMERO, ORDC_FECHA, OCDE_CANT * OCDE_FACTOR, (OCDE_PRUNIT-OCDE_DTOMONTO)
                FROM ORDENES_COMPRA O, ORDENES_COMPRA_DETALLE D, PREFIJOS P
                WHERE O.ORDC_ID = D.ORDC_ID AND ARTI_COD = :ARTICULO AND ORDC_FECHA >= :FECINI AND ORDC_FECHA < :FECFIN AND ORDC_ANULADO = 'N' AND P.PREF_PRE = O.PREF_PRE AND ((SUCU_ID = :SUCURSAL) or (:SUCURSAL = 0))
                INTO :ID, :ITEM, PREFIJO, :NUMERO, :FECHA, :CANTIDAD, :BASE
                DO
                    BEGIN
                    NROPROV = '';
                    EXECUTE PROCEDURE FALTANTE_CORTE(:TIPO, :DESTINO, :ID, :ITEM, :CORTE) returning_values (:FALTANTE, :UNIDAD, :FACTOR);
                    if ((CEROS = 'S') or (FALTANTE <> 0)) then
                        SUSPEND;
                    END
        if (TIPO = 25) then
            FOR SELECT C.COPR_ID, CPRD_ITEM, C.PREF_PRE, COPR_NUMERO, COPR_FECHA, CPRD_CANT * CPRD_FACTOR, (CPRD_PRUNIT-CPRD_DTOMONTO)
                FROM COTIZACION_PROVEEDOR C, COTIZACIONES_PROVEEDOR_DET D, PREFIJOS P
                WHERE C.COPR_ID = D.COPR_ID AND ARTI_COD = :ARTICULO AND COPR_FECHA >= :FECINI AND COPR_FECHA < :FECFIN AND COPR_ANULADO = 'N' AND P.PREF_PRE = C.PREF_PRE AND ((SUCU_ID = :SUCURSAL) or (:SUCURSAL = 0))
                INTO :ID, :ITEM, PREFIJO, :NUMERO, :FECHA, :CANTIDAD, :BASE
                DO
                    BEGIN
                    NROPROV = '';
                    EXECUTE PROCEDURE FALTANTE_CORTE(:TIPO, :DESTINO, :ID, :ITEM, :CORTE) returning_values (:FALTANTE, :UNIDAD, :FACTOR);
                    if ((CEROS = 'S') or (FALTANTE <> 0)) then
                        SUSPEND;
                    END
        END
    END
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE FALTANTES_VENTAS_ARTICULO(
    DESDE VARCHAR(20),
    HASTA VARCHAR(20),
    FECINI DATE,
    FECFIN DATE,
    DETALLE CHAR(1),
    TIPO INTEGER,
    DESTINO INTEGER,
    ORDEN CHAR(1),
    CEROS CHAR(1),
    CORTE DATE,
    SUCURSAL INTEGER)
RETURNS (
    ARTICULO VARCHAR(15),
    DESCRIPCION VARCHAR(60),
    CODGRUPO VARCHAR(2),
    NOMGRUPO VARCHAR(30),
    CODSUBG VARCHAR(3),
    NOMSUBG VARCHAR(30),
    CODMARC VARCHAR(3),
    NOMMARC VARCHAR(30),
    CANTIDAD NUMERIC(18,4),
    UNIDAD VARCHAR(8),
    FALTANTE NUMERIC(18,4),
    BASE NUMERIC(18,2),
    COSTOUN NUMERIC(18,2),
    COSTOTOT NUMERIC(18,2),
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(8),
    FECHA DATE,
    PTVTA INTEGER,
    NIT VARCHAR(20),
    NOMCLIENTE VARCHAR(60),
    CIUDAD VARCHAR(60),
    OBS VARCHAR(255),
    BOD VARCHAR(2))
AS
declare variable ID INTEGER;
declare variable ITEM INTEGER;
declare variable CANT NUMERIC(18,2);
declare variable CODINI VARCHAR(15);
declare variable CODFIN VARCHAR(15);
declare variable DESINI VARCHAR(15);
declare variable DESFIN VARCHAR(15);
declare variable MONTO NUMERIC(18,2);
declare variable FACTOR NUMERIC(18,4);
BEGIN
if (ORDEN = 'C') then
    BEGIN
    CODINI = DESDE;
    CODFIN = HASTA;
    DESINI = '';
    DESFIN = 'zz';
    END
ELSE
    BEGIN
    DESINI = DESDE;
    DESFIN = HASTA;
    CODINI = '';
    CODFIN = 'zz';
    END
  FOR SELECT ARTI_COD, ARTI_DES, ARTI_UNIDAD, A.GRUP_COD, A.SUBG_COD, A.MARC_COD FROM ARTICULO A
      WHERE ARTI_COD >= :CODINI AND ARTI_COD <= :CODFIN AND ARTI_DES >= :DESINI AND ARTI_DES <= :DESFIN
      INTO :ARTICULO, :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
  DO
    BEGIN
    CANTIDAD = 0;
    faltante = 0;
    base = 0;
    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 (DETALLE = 'N') then
        BEGIN
        if (TIPO = 31) then
            BEGIN
            FOR SELECT F.FACT_ID, FADE_ITEM, FADE_CANT * FADE_FACTOR, (FADE_PRUNIT-FADE_DTOMONTO), D.BODE_COD, F.ptvt_id
                FROM FACTURAS_DETALLE D, FACTURAS F, PREFIJOS P
                WHERE F.FACT_ID = D.FACT_ID AND ARTI_COD = :ARTICULO AND FACT_FECHA >= :FECINI AND FACT_FECHA <= :FECFIN AND FACT_ANULADO = 'N' AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 31 AND ((SUCU_ID = :SUCURSAL) or (:SUCURSAL = 0)) and substring(arti_cod from 1 FOR 2) <> '.t'
                ORDER BY F.FACT_ID, FADE_ITEM INTO :ID, :ITEM, :CANT, :MONTO, :BOD, :PTVTA
                DO
                BEGIN
                CANTIDAD = CANTIDAD + CANT;
                EXECUTE PROCEDURE FALTANTE_CORTE(:TIPO, :DESTINO, :ID, :ITEM, :CORTE) returning_values (:CANT, :UNIDAD, :FACTOR);
                FALTANTE = FALTANTE + CANT;
                BASE = BASE + MONTO * CANT;
                END
            execute procedure costo_promedio(:articulo, :corte) returning_values (:costoun);
            costotot = CANTIDAD * costoun;
            END
        if (TIPO = 32) then
            BEGIN
            FOR SELECT R.revt_id, rvde_item, RVDE_CANT * RVDE_FACTOR, (RVDE_PRUNIT-RVDE_DTOMONTO), D.bode_cod, R.ptvt_id
                FROM REMISIONES_VENTA_DETALLE D, REMISIONES_VENTA R, PREFIJOS P
                WHERE R.REVT_ID = D.REVT_ID AND ARTI_COD = :ARTICULO AND REVT_FECHA >= :FECINI AND REVT_FECHA <= :FECFIN AND REVT_ANULADO = 'N' AND P.PREF_PRE = R.PREF_PRE AND P.TIDO_COD = 32  AND ((SUCU_ID = :SUCURSAL) or (:SUCURSAL = 0))
                ORDER BY R.REVT_ID, RVDE_ITEM INTO :ID, :ITEM, :CANT, :MONTO, :BOD, :PTVTA
                DO
                BEGIN
                CANTIDAD = CANTIDAD + CANT;
                EXECUTE PROCEDURE FALTANTE_CORTE(:TIPO, :DESTINO, :ID, :ITEM, :CORTE) returning_values (:CANT, :UNIDAD, :FACTOR);
                FALTANTE = FALTANTE + CANT;
                BASE = BASE + MONTO * CANT;
                END
            execute procedure costo_promedio(:articulo, :corte) returning_values (:costoun);
            costotot = CANTIDAD * costoun;
            END
        if (TIPO = 34) then
            BEGIN
            FOR SELECT P.PEDI_ID, PEDE_ITEM, PEDE_CANT * PEDE_FACTOR, (PEDE_PRUNIT-PEDE_DTOMONTO), D.bode_cod, P.ptvt_id
                FROM PEDIDOS_DETALLE D, PEDIDOS P, PREFIJOS R
                WHERE P.PEDI_ID = D.PEDI_ID AND ARTI_COD = :ARTICULO AND PEDI_FECHA >= :FECINI AND PEDI_FECHA <= :FECFIN AND PEDI_VALIDEZ >= 0
                AND PEDI_ANULADO = 'N' AND P.PREF_PRE = R.PREF_PRE AND R.TIDO_COD = 34  AND ((SUCU_ID = :SUCURSAL) or (:SUCURSAL = 0))
                ORDER BY P.PEDI_ID, PEDE_ITEM INTO :ID, :ITEM, :CANT, :MONTO, :bod, :PTVTA
                DO
                BEGIN
                CANTIDAD = CANTIDAD + CANT;
                EXECUTE PROCEDURE FALTANTE_CORTE(:TIPO, :DESTINO, :ID, :ITEM, :CORTE) returning_values (:CANT, :UNIDAD, :FACTOR);
                FALTANTE = FALTANTE + CANT;
                BASE = BASE + MONTO * CANT;
                END
            execute procedure costo_promedio(:articulo, :corte) returning_values (:costoun);
            costotot = CANTIDAD * costoun;
            END
        if (TIPO = 35) then
            BEGIN
            FOR SELECT C.COTI_ID, CTDE_ITEM, CTDE_CANT * CTDE_FACTOR, (CTDE_PRUNIT-CTDE_DTOMONTO), C.ptvt_id
                FROM COTIZACIONES_DETALLE D, COTIZACIONES C, PREFIJOS P
                WHERE C.COTI_ID = D.COTI_ID AND ARTI_COD = :ARTICULO AND COTI_FECHA >= :FECINI AND COTI_FECHA <= :FECFIN AND COTI_ANULADO = 'N' AND P.PREF_PRE = C.PREF_PRE AND P.TIDO_COD = 35  AND ((SUCU_ID = :SUCURSAL) or (:SUCURSAL = 0))
                ORDER BY C.COTI_ID, CTDE_ITEM INTO :ID, :ITEM, :CANT, :MONTO, :PTVTA
                DO
                BEGIN
                BOD = '';
                CANTIDAD = CANTIDAD + CANT;
                EXECUTE PROCEDURE FALTANTE_CORTE(:TIPO, :DESTINO, :ID, :ITEM, :CORTE) returning_values (:CANT, :UNIDAD, :FACTOR);
                FALTANTE = FALTANTE + CANT;
                BASE = BASE + MONTO * CANT;
                END
            execute procedure costo_promedio(:articulo, :corte) returning_values (:costoun);
            costotot = CANTIDAD * costoun;
            END
        if (TIPO = 40) then
            BEGIN
            FOR SELECT P.pend_id, D.pevd_item, D.pevd_cant * D.pevd_factor, (D.pevd_prunit-D.pevd_dtomonto), D.bode_cod
                FROM pendiente_ventas_detalle D, pendiente_ventas P, PREFIJOS R
                WHERE P.pend_id = D.pend_id AND ARTI_COD = :ARTICULO AND PEND_FECHA >= :FECINI AND PEND_FECHA <= :FECFIN AND
                PEND_ANULADO = 'N' AND P.PREF_PRE = R.PREF_PRE AND R.TIDO_COD = 40  AND ((SUCU_ID = :SUCURSAL) or (:SUCURSAL = 0))
                ORDER BY P.pend_id, D.pevd_item INTO :ID, :ITEM, :CANT, :MONTO, :bod
                DO
                BEGIN
                CANTIDAD = CANTIDAD + CANT;
                EXECUTE PROCEDURE FALTANTE(:TIPO, :DESTINO, :ID, :ITEM) returning_values (:CANT, :UNIDAD, :FACTOR);
                FALTANTE = FALTANTE + CANT;
                BASE = BASE + MONTO * CANT;
                END
            execute procedure costo_promedio(:articulo, :corte) returning_values (:costoun);
            costotot = CANTIDAD * costoun;
            END
        if (CANTIDAD IS NULL) then
            CANTIDAD = 0;
        if (BASE IS NULL) then
            BASE = 0;
        if (FALTANTE IS NULL) then
            FALTANTE = 0;
        if (CEROS = 'S') then
            SUSPEND;
        ELSE
            if (FALTANTE <> 0) then
                SUSPEND;
        END
    ELSE
        BEGIN
        if (TIPO = 31) then
            FOR SELECT F.FACT_ID, FADE_ITEM, F.PREF_PRE, FACT_NUMERO, FACT_FECHA, FADE_CANT * FADE_FACTOR, (FADE_PRUNIT-FADE_DTOMONTO), SUBSTRING(FACT_OBS FROM 1 FOR 255), D.bode_cod, F.ptvt_id, F.terc_nit, F.fact_nomcliente
                FROM FACTURAS F, FACTURAS_DETALLE D, PREFIJOS P
                WHERE F.FACT_ID = D.FACT_ID AND ARTI_COD = :ARTICULO AND FACT_FECHA >= :FECINI AND FACT_FECHA <= :FECFIN AND FACT_ANULADO = 'N' AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 31 AND ((SUCU_ID = :SUCURSAL) or (:SUCURSAL = 0)) and substring(arti_cod from 1 FOR 2) <> '.t'
                ORDER BY F.FACT_ID, FADE_ITEM
                INTO :ID, :ITEM, :PREFIJO, :NUMERO, :FECHA, :CANTIDAD, :BASE, :OBS, :bod, :PTVTA, :nit, :nomcliente
                DO
                    BEGIN
                    EXECUTE PROCEDURE FALTANTE_CORTE(:TIPO, :DESTINO, :ID, :ITEM, :CORTE) returning_values (:FALTANTE, :UNIDAD, :FACTOR);
                    if ((CEROS = 'S') or (FALTANTE <> 0)) then
                        BEGIN
                        CIUDAD = '';
                        SELECT CIUD_NOM FROM CIUDADES C, TERCEROS T WHERE T.terc_nit = :NIT AND T.ciud_cod = C.ciud_cod INTO :CIUDAD;
                        execute procedure costo_promedio(:articulo, :corte) returning_values (:costoun);
                        costotot = CANTIDAD * costoun;
                        SUSPEND;
                        END
                    END
        if (TIPO = 32) then
            FOR SELECT R.REVT_ID, RVDE_ITEM, R.PREF_PRE, REVT_NUMERO, REVT_FECHA, RVDE_CANT * RVDE_FACTOR, (RVDE_PRUNIT-RVDE_DTOMONTO), SUBSTRING(REVT_OBS FROM 1 FOR 255), D.bode_cod, R.ptvt_id, R.terc_nit, R.revt_nomterc
                FROM REMISIONES_VENTA R, REMISIONES_VENTA_DETALLE D, PREFIJOS P
                WHERE R.REVT_ID = D.REVT_ID AND ARTI_COD = :ARTICULO AND REVT_FECHA >= :FECINI AND REVT_FECHA <= :FECFIN AND REVT_ANULADO = 'N' AND P.PREF_PRE = R.PREF_PRE AND P.TIDO_COD = 32 AND ((SUCU_ID = :SUCURSAL) or (:SUCURSAL = 0))
                INTO :ID, :ITEM, :PREFIJO, :NUMERO, :FECHA, :CANTIDAD, :BASE, :OBS, :bod, :PTVTA, :nit, :nomcliente
                DO
                    BEGIN
                    EXECUTE PROCEDURE FALTANTE_CORTE(:TIPO, :DESTINO, :ID, :ITEM, :CORTE) returning_values (:FALTANTE, :UNIDAD, :FACTOR);
                    if ((CEROS = 'S') or (FALTANTE <> 0)) then
                        BEGIN
                        CIUDAD = '';
                        SELECT CIUD_NOM FROM CIUDADES C, TERCEROS T WHERE T.terc_nit = :NIT AND T.ciud_cod = C.ciud_cod INTO :CIUDAD;
                        execute procedure costo_promedio(:articulo, :corte) returning_values (:costoun);
                        costotot = CANTIDAD * costoun;
                        SUSPEND;
                        END
                    END
        if (TIPO = 34) then
            FOR SELECT P.PEDI_ID, PEDE_ITEM, P.PREF_PRE, PEDI_NUMERO, PEDI_FECHA, PEDE_CANT * PEDE_FACTOR, (PEDE_PRUNIT-PEDE_DTOMONTO), SUBSTRING(PEDI_OBS FROM 1 FOR 255), D.bode_cod, P.ptvt_id, P.terc_nit, P.pedi_nomterc
                FROM PEDIDOS P, PEDIDOS_DETALLE D, PREFIJOS R
                WHERE P.PEDI_ID = D.PEDI_ID AND ARTI_COD = :ARTICULO AND PEDI_FECHA >= :FECINI AND PEDI_FECHA <= :FECFIN AND PEDI_VALIDEZ >= 0
                AND PEDI_ANULADO = 'N' AND P.PREF_PRE = R.PREF_PRE AND R.TIDO_COD = 34 AND ((SUCU_ID = :SUCURSAL) or (:SUCURSAL = 0))
                INTO :ID, :ITEM, PREFIJO, :NUMERO, :FECHA, :CANTIDAD, :BASE, :OBS, :bod, :PTVTA, :nit, :nomcliente
                DO
                    BEGIN
                    EXECUTE PROCEDURE FALTANTE_CORTE(:TIPO, :DESTINO, :ID, :ITEM, :CORTE) returning_values (:FALTANTE, :UNIDAD, :FACTOR);
                    if ((CEROS = 'S') or (FALTANTE <> 0)) then
                        BEGIN
                        CIUDAD = '';
                        SELECT CIUD_NOM FROM CIUDADES C, TERCEROS T WHERE T.terc_nit = :NIT AND T.ciud_cod = C.ciud_cod INTO :CIUDAD;
                        execute procedure costo_promedio(:articulo, :corte) returning_values (:costoun);
                        costotot = CANTIDAD * costoun;
                        SUSPEND;
                        END
                    END
        if (TIPO = 35) then
            FOR SELECT C.COTI_ID, CTDE_ITEM, C.PREF_PRE, COTI_NUMERO, COTI_FECHA, CTDE_CANT * CTDE_FACTOR, (CTDE_PRUNIT-CTDE_DTOMONTO), SUBSTRING(COTI_OBS FROM 1 FOR 255), C.ptvt_id, C.terc_nit, C.coti_nomterc
                FROM COTIZACIONES C, COTIZACIONES_DETALLE D, PREFIJOS P
                WHERE C.COTI_ID = D.COTI_ID AND ARTI_COD = :ARTICULO AND COTI_FECHA >= :FECINI AND COTI_FECHA <= :FECFIN AND COTI_ANULADO = 'N' AND P.PREF_PRE = C.PREF_PRE AND P.TIDO_COD = 35 AND ((SUCU_ID = :SUCURSAL) or (:SUCURSAL = 0))
                INTO :ID, :ITEM, PREFIJO, :NUMERO, :FECHA, :CANTIDAD, :BASE, :OBS, :PTVTA, :nit, :nomcliente
                DO
                    BEGIN
                    BOD = '';
                    EXECUTE PROCEDURE FALTANTE_CORTE(:TIPO, :DESTINO, :ID, :ITEM, :CORTE) returning_values (:FALTANTE, :UNIDAD, :FACTOR);
                    if ((CEROS = 'S') or (FALTANTE <> 0)) then
                        BEGIN
                        CIUDAD = '';
                        SELECT CIUD_NOM FROM CIUDADES C, TERCEROS T WHERE T.terc_nit = :NIT AND T.ciud_cod = C.ciud_cod INTO :CIUDAD;
                        execute procedure costo_promedio(:articulo, :corte) returning_values (:costoun);
                        costotot = CANTIDAD * costoun;
                        SUSPEND;
                        END
                    END
        if (TIPO = 40) then
            FOR SELECT P.pend_id, D.pevd_item, P.PREF_PRE, P.pend_numero, PEND_FECHA, D.pevd_cant * D.pevd_factor, (D.pevd_prunit-D.pevd_dtomonto), SUBSTRING(P.pend_obs FROM 1 FOR 255), D.bode_cod
                FROM pendiente_ventas P, pendiente_ventas_detalle D, PREFIJOS R
                WHERE P.pend_id = D.pend_id AND ARTI_COD = :ARTICULO AND PEND_FECHA >= :FECINI AND PEND_FECHA <= :FECFIN AND PEND_ANULADO = 'N'
                AND P.PREF_PRE = R.PREF_PRE AND R.TIDO_COD = 40 AND ((SUCU_ID = :SUCURSAL) or (:SUCURSAL = 0))
                INTO :ID, :ITEM, PREFIJO, :NUMERO, :FECHA, :CANTIDAD, :BASE, :OBS, :bod
                DO
                    BEGIN
                    EXECUTE PROCEDURE FALTANTE(:TIPO, :DESTINO, :ID, :ITEM) returning_values (:FALTANTE, :UNIDAD, :FACTOR);
                    if ((CEROS = 'S') or (FALTANTE <> 0)) then
                        BEGIN
                        CIUDAD = '';
                        SELECT CIUD_NOM FROM CIUDADES C, TERCEROS T WHERE T.terc_nit = :NIT AND T.ciud_cod = C.ciud_cod INTO :CIUDAD;
                        execute procedure costo_promedio(:articulo, :corte) returning_values (:costoun);
                        costotot = CANTIDAD * costoun;
                        SUSPEND;
                        END
                    END
        END
    END
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE REP_FALTANTES_CLIENTES(
    TERINI VARCHAR(20),
    TERFIN VARCHAR(20),
    FECINI DATE,
    FECFIN DATE,
    DETALLE CHAR(1),
    TIPO INTEGER,
    DESTINO INTEGER,
    ARTINI VARCHAR(15),
    ARTFIN VARCHAR(15),
    ORDEN CHAR(1),
    CEROS CHAR(1),
    CORTE DATE,
    SUBEMPRESA INTEGER)
RETURNS (
    NIT VARCHAR(20),
    SUCURSAL VARCHAR(10),
    NOMBRE VARCHAR(60),
    TELEFONO VARCHAR(40),
    CIUDAD VARCHAR(40),
    CODZONA VARCHAR(2),
    NOMZONA VARCHAR(60),
    NOMTIPO VARCHAR(50),
    ARTICULO VARCHAR(15),
    DESCRIPCION VARCHAR(60),
    CODGRUPO VARCHAR(2),
    NOMGRUPO VARCHAR(30),
    CODSUBG VARCHAR(3),
    NOMSUBG VARCHAR(30),
    CODMARC VARCHAR(3),
    NOMMARC VARCHAR(30),
    CANTIDAD NUMERIC(18,4),
    UNIDAD VARCHAR(8),
    FALTANTE NUMERIC(18,4),
    BASE NUMERIC(18,2),
    IVA NUMERIC(18,2),
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(8),
    FECHA DATE,
    PTVTA INTEGER,
    OBS VARCHAR(255))
AS
declare variable ID INTEGER;
declare variable ITEM INTEGER;
declare variable CODINI VARCHAR(15);
declare variable CODFIN VARCHAR(15);
declare variable DESINI VARCHAR(15);
declare variable DESFIN VARCHAR(15);
declare variable FACTOR NUMERIC(18,4);
declare variable CANT NUMERIC(18,4);
declare variable MONTO NUMERIC(18,2);
declare variable artiaux VARCHAR(20);
BEGIN
if (ORDEN = 'C') then
    BEGIN
    CODINI = ARTINI;
    CODFIN = ARTFIN;
    DESINI = '';
    DESFIN = 'zz';
    END
ELSE
    BEGIN
    DESINI = ARTINI;
    DESFIN = ARTFIN;
    CODINI = '';
    CODFIN = 'zz';
    END
SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = :TIPO INTO :NOMTIPO;
/*FOR select T.TERC_NIT, TERC_NOM,  TERC_TEL, TERC_CIU, ZONA_COD
    from terceros T, CLIENTES C*/
FOR select c.terc_nit,s.clsu_nombre,s.clsu_tel,s.clsu_ciudad,s.zona_cod,s.clcu_cod
    from clientes c, cliente_sucursales s
    where C.TERC_NIT = s.TERC_NIT and C.TERC_NIT >= :TERINI AND C.TERC_NIT <= :TERFIN
    INTO :NIT, :NOMBRE, :TELEFONO, :CIUDAD, :CODZONA, :sucursal
    DO  
    BEGIN
    CANTIDAD = 0;
    FALTANTE = 0;
    BASE = 0;
    SELECT ZONA_NOM FROM ZONAS WHERE ZONA_COD = :CODZONA INTO :NOMZONA;
    if (DETALLE = 'N') then
        BEGIN
        ARTICULO = '';
        if (TIPO = 31) then
            FOR SELECT F.FACT_ID, FADE_ITEM, D.ARTI_COD, FADE_CANT * FADE_FACTOR, (FADE_PRUNIT-FADE_DTOMONTO), F.ptvt_id
                FROM FACTURAS_DETALLE D, FACTURAS F, ARTICULO A, PREFIJOS P
                WHERE F.FACT_ID = D.FACT_ID AND FACT_FECHA >= :FECINI AND FACT_FECHA <= :FECFIN AND TERC_NIT = :NIT AND FACT_ANULADO = 'N' AND
                      D.ARTI_COD = A.ARTI_COD AND D.ARTI_COD >= :CODINI AND D.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
                      P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 31 AND ((P.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) and f.fact_sucursal = :sucursal and substring(a.arti_cod from 1 FOR 2) <> '.t'
                ORDER BY ARTI_COD, F.FACT_ID, FADE_ITEM INTO :ID, :ITEM, :ARTIAUX, :CANT,  :MONTO, :PTVTA
                DO
                BEGIN
                if (artiaux <> articulo) then
                    begin
                    if (ARTICULO <> '') then
                        SUSPEND;
                    SELECT ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                        FROM articulo WHERE ARTI_COD = :ARTIAUX
                        INTO :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC;
                    SELECT GRUP_NOM FROM GRUPO 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;
                    ARTICULO = ARTIAUX;
                    CANTIDAD = 0;
                    FALTANTE = 0;
                    BASE = 0;
                    end
                CANTIDAD = CANTIDAD + CANT;
                EXECUTE PROCEDURE FALTANTE_CORTE(:TIPO, :DESTINO, :ID, :ITEM, :CORTE) returning_values (:CANT, :UNIDAD, :FACTOR);
                FALTANTE = FALTANTE + CANT;
                BASE = BASE + (MONTO * CANT);
                END
        if (TIPO = 32) then
            FOR SELECT R.revt_id, rvde_item, D.ARTI_COD, RVDE_CANT * RVDE_FACTOR, (RVDE_PRUNIT-RVDE_DTOMONTO), R.ptvt_id
                FROM REMISIONES_VENTA_DETALLE D, REMISIONES_VENTA R, ARTICULO A, PREFIJOS P
                WHERE R.REVT_ID = D.REVT_ID AND REVT_FECHA >= :FECINI AND REVT_FECHA <= :FECFIN AND TERC_NIT = :NIT AND REVT_ANULADO = 'N' AND
                      D.ARTI_COD = A.ARTI_COD AND D.ARTI_COD >= :CODINI AND D.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
                      P.PREF_PRE = R.PREF_PRE AND P.TIDO_COD = 32 AND ((P.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) and r.revt_sucursal = :sucursal
                ORDER BY ARTI_COD, R.REVT_ID, RVDE_ITEM INTO :ID, :ITEM, :ARTIAUX, :CANT, :MONTO, :PTVTA
                DO
                BEGIN
                if (artiaux <> articulo) then
                    begin
                    if (ARTICULO <> '') then
                        SUSPEND;
                    SELECT ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                        FROM articulo WHERE ARTI_COD = :ARTIAUX
                        INTO :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC;
                    SELECT GRUP_NOM FROM GRUPO 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;
                    ARTICULO = ARTIAUX;
                    CANTIDAD = 0;
                    FALTANTE = 0;
                    BASE = 0;
                    end
                CANTIDAD = CANTIDAD + CANT;
                EXECUTE PROCEDURE FALTANTE_CORTE(:TIPO, :DESTINO, :ID, :ITEM, :CORTE) returning_values (:CANT, :UNIDAD, :FACTOR);
                FALTANTE = FALTANTE + CANT;
                BASE = BASE + (MONTO * CANT);
                END
        if (TIPO = 34) then
            FOR SELECT P.PEDI_ID, PEDE_ITEM, D.ARTI_COD, PEDE_CANT * PEDE_FACTOR, (PEDE_PRUNIT-PEDE_DTOMONTO), P.ptvt_id
                FROM PEDIDOS_DETALLE D, PEDIDOS P, ARTICULO A, PREFIJOS PR
                WHERE P.PEDI_ID = D.PEDI_ID AND PEDI_FECHA >= :FECINI AND PEDI_FECHA <= :FECFIN AND TERC_NIT = :NIT AND PEDI_ANULADO = 'N' AND PEDI_VALIDEZ >= 0 AND
                      D.ARTI_COD = A.ARTI_COD AND D.ARTI_COD >= :CODINI AND D.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
                      PR.PREF_PRE = P.PREF_PRE AND PR.TIDO_COD = 34 AND ((PR.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) and p.pedi_sucursal = :sucursal
                ORDER BY ARTI_COD, P.PEDI_ID, PEDE_ITEM INTO :ID, :ITEM, :ARTIAUX, :CANT, :MONTO, :PTVTA
                DO
                BEGIN
                if (artiaux <> articulo) then
                    begin
                    if (ARTICULO <> '') then
                        SUSPEND;
                    SELECT ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                        FROM articulo WHERE ARTI_COD = :ARTIAUX
                        INTO :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC;
                    SELECT GRUP_NOM FROM GRUPO 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;
                    ARTICULO = ARTIAUX;
                    CANTIDAD = 0;
                    FALTANTE = 0;
                    BASE = 0;
                    end
                CANTIDAD = CANTIDAD + CANT;
                EXECUTE PROCEDURE FALTANTE_CORTE(:TIPO, :DESTINO, :ID, :ITEM, :CORTE) returning_values (:CANT, :UNIDAD, :FACTOR);
                FALTANTE = FALTANTE + CANT;
                BASE = BASE + (MONTO * CANT);
                END
        if (TIPO = 35) then
            FOR SELECT C.COTI_ID, CTDE_ITEM, D.ARTI_COD, CTDE_CANT * CTDE_FACTOR, (CTDE_PRUNIT-CTDE_DTOMONTO), C.ptvt_id
                FROM COTIZACIONES_DETALLE D, COTIZACIONES C, ARTICULO A, PREFIJOS P
                WHERE C.COTI_ID = D.COTI_ID AND COTI_FECHA >= :FECINI AND COTI_FECHA <= :FECFIN AND TERC_NIT = :NIT AND COTI_ANULADO = 'N' AND
                      D.ARTI_COD = A.ARTI_COD AND D.ARTI_COD >= :CODINI AND D.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
                      P.PREF_PRE = C.PREF_PRE AND P.TIDO_COD = 35 AND ((P.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) and c.coti_sucursal = :sucursal
                ORDER BY ARTI_COD, C.COTI_ID, CTDE_ITEM INTO :ID, :ITEM, :ARTIAUX, :CANT, :MONTO, :PTVTA
                DO
                BEGIN
                if (artiaux <> articulo) then
                    begin
                    if (ARTICULO <> '') then
                        SUSPEND;
                    SELECT ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                        FROM articulo WHERE ARTI_COD = :ARTIAUX
                        INTO :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC;
                    SELECT GRUP_NOM FROM GRUPO 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;
                    ARTICULO = ARTIAUX;
                    CANTIDAD = 0;
                    FALTANTE = 0;
                    BASE = 0;
                    end
                CANTIDAD = CANTIDAD + CANT;
                EXECUTE PROCEDURE FALTANTE_CORTE(:TIPO, :DESTINO, :ID, :ITEM, :CORTE) returning_values (:CANT, :UNIDAD, :FACTOR);
                FALTANTE = FALTANTE + CANT;
                BASE = BASE + (MONTO * CANT);
                END
        if (TIPO = 40) then
            FOR SELECT P.pend_id, D.pevd_item, D.ARTI_COD, D.pevd_cant * D.pevd_factor, (D.pevd_prunit-D.pevd_dtomonto)
                FROM pendiente_ventas_detalle D, pendiente_ventas P, ARTICULO A, PREFIJOS PR
                WHERE P.pend_id = D.pend_id AND PEND_FECHA >= :FECINI AND PEND_FECHA <= :FECFIN AND TERC_NIT = :NIT AND PEND_ANULADO = 'N' AND
                      D.ARTI_COD = A.ARTI_COD AND D.ARTI_COD >= :CODINI AND D.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
                      PR.PREF_PRE = P.PREF_PRE AND PR.TIDO_COD = 40 AND ((PR.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) and p.pend_sucursal = :sucursal
                ORDER BY ARTI_COD, P.pend_id, D.pevd_item INTO :ID, :ITEM, :ARTIAUX, :CANT, :MONTO
                DO
                BEGIN
                if (artiaux <> articulo) then
                    begin
                    if (ARTICULO <> '') then
                        SUSPEND;
                    SELECT ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                        FROM articulo WHERE ARTI_COD = :ARTIAUX
                        INTO :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC;
                    SELECT GRUP_NOM FROM GRUPO 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;
                    ARTICULO = ARTIAUX;
                    CANTIDAD = 0;
                    FALTANTE = 0;
                    BASE = 0;
                    end
                CANTIDAD = CANTIDAD + CANT;
                EXECUTE PROCEDURE FALTANTE(:TIPO, :DESTINO, :ID, :ITEM) returning_values (:CANT, :UNIDAD, :FACTOR);
                FALTANTE = FALTANTE + CANT;
                BASE = BASE + (MONTO * CANT);
                END
        if (FALTANTE IS NULL) then
            FALTANTE = 0;
        if (BASE IS NULL) then
            BASE = 0;
        if (IVA IS NULL) then
            IVA = 0;
        if ((CEROS = 'S') or (FALTANTE <> 0)) then
            SUSPEND;
        END
    ELSE
        BEGIN
        if (TIPO = 31) then
            FOR SELECT F.FACT_ID, FADE_ITEM, F.PREF_PRE, FACT_NUMERO, FACT_FECHA, FADE_CANT * FADE_FACTOR, (FADE_PRUNIT-FADE_DTOMONTO), FADE_IVAMONTO, D.ARTI_COD, ARTI_DES, ARTI_UNIDAD, A.GRUP_COD, A.SUBG_COD, A.MARC_COD, SUBSTRING(FACT_OBS FROM 1 FOR 255), F.ptvt_id
                FROM FACTURAS F, FACTURAS_DETALLE D, ARTICULO A, PREFIJOS P
                WHERE F.FACT_ID = D.FACT_ID AND FACT_FECHA >= :FECINI AND FACT_FECHA <= :FECFIN  AND TERC_NIT = :NIT AND FACT_ANULADO = 'N' AND
                      D.ARTI_COD = A.ARTI_COD AND D.ARTI_COD >= :CODINI AND D.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
                      P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 31 AND ((P.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) and f.fact_sucursal = :sucursal and substring(a.arti_cod from 1 FOR 2) <> '.t'
                ORDER BY D.ARTI_COD, F.FACT_ID, FADE_ITEM
                INTO :ID, :ITEM, :PREFIJO, :NUMERO, :FECHA, :CANTIDAD, :BASE, :IVA, :ARTICULO, :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC, :OBS, :PTVTA
                DO
                    BEGIN
                    SELECT GRUP_NOM FROM GRUPO WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                    SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                    SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                    EXECUTE PROCEDURE FALTANTE_CORTE(:TIPO, :DESTINO, :ID, :ITEM, :CORTE) returning_values (:FALTANTE, :UNIDAD, :FACTOR);
                    if ((CEROS = 'S') or (FALTANTE <> 0)) then
                        SUSPEND;
                    END
        if (TIPO = 32) then
            FOR SELECT R.REVT_ID, RVDE_ITEM, R.PREF_PRE, REVT_NUMERO, REVT_FECHA, RVDE_CANT * RVDE_FACTOR, (RVDE_PRUNIT-RVDE_DTOMONTO), RVDE_IVAMONTO, D.ARTI_COD, ARTI_DES, ARTI_UNIDAD, A.GRUP_COD, A.SUBG_COD, A.MARC_COD, SUBSTRING(REVT_OBS FROM 1 FOR 255), R.ptvt_id
                FROM REMISIONES_VENTA R, REMISIONES_VENTA_DETALLE D, ARTICULO A, PREFIJOS P
                WHERE R.REVT_ID = D.REVT_ID AND REVT_FECHA >= :FECINI AND REVT_FECHA <= :FECFIN AND TERC_NIT = :NIT AND REVT_ANULADO = 'N' AND
                      D.ARTI_COD = A.ARTI_COD AND D.ARTI_COD >= :CODINI AND D.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
                      P.PREF_PRE = R.PREF_PRE AND P.TIDO_COD = 32 AND ((P.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) and r.revt_sucursal = :sucursal
                ORDER BY D.ARTI_COD, R.REVT_ID, RVDE_ITEM
                INTO :ID, :ITEM, :PREFIJO, :NUMERO, :FECHA, :CANTIDAD, :BASE, :IVA, :ARTICULO, :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC, :OBS, :PTVTA
                DO
                    BEGIN
                    SELECT GRUP_NOM FROM GRUPO WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                    SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                    SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                    EXECUTE PROCEDURE FALTANTE_CORTE(:TIPO, :DESTINO, :ID, :ITEM, :CORTE) returning_values (:FALTANTE, :UNIDAD, :FACTOR);
                    if ((CEROS = 'S') or (FALTANTE <> 0)) then
                        SUSPEND;
                    END
        if (TIPO = 34) then
            FOR SELECT P.PEDI_ID, PEDE_ITEM, P.PREF_PRE, PEDI_NUMERO, PEDI_FECHA, PEDE_CANT * PEDE_FACTOR, (PEDE_PRUNIT-PEDE_DTOMONTO), PEDE_IVAMONTO, D.ARTI_COD, ARTI_DES, ARTI_UNIDAD, A.GRUP_COD, A.SUBG_COD, A.MARC_COD, SUBSTRING(PEDI_OBS FROM 1 FOR 255), P.ptvt_id
                FROM PEDIDOS P, PEDIDOS_DETALLE D, ARTICULO A, PREFIJOS PR
                WHERE P.PEDI_ID = D.PEDI_ID AND PEDI_FECHA >= :FECINI AND PEDI_FECHA <= :FECFIN AND TERC_NIT = :NIT AND PEDI_ANULADO = 'N' AND PEDI_VALIDEZ >= 0 AND
                      D.ARTI_COD = A.ARTI_COD AND D.ARTI_COD >= :CODINI AND D.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
                      P.PREF_PRE = PR.PREF_PRE AND PR.TIDO_COD = 34 AND ((PR.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) and p.pedi_sucursal = :sucursal
                ORDER BY D.ARTI_COD, P.PEDI_ID, PEDE_ITEM
                INTO :ID, :ITEM, PREFIJO, :NUMERO, :FECHA, :CANTIDAD, :BASE, :IVA, :ARTICULO, :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC, :OBS, :PTVTA
                DO
                    BEGIN
                    SELECT GRUP_NOM FROM GRUPO WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                    SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                    SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                    EXECUTE PROCEDURE FALTANTE_CORTE(:TIPO, :DESTINO, :ID, :ITEM, :CORTE) returning_values (:FALTANTE, :UNIDAD, :FACTOR);
                    if ((CEROS = 'S') or (FALTANTE <> 0)) then
                        SUSPEND;
                    END
        if (TIPO = 35) then
            FOR SELECT C.COTI_ID, CTDE_ITEM, C.PREF_PRE, COTI_NUMERO, COTI_FECHA, CTDE_CANT * CTDE_FACTOR, (CTDE_PRUNIT-CTDE_DTOMONTO), CTDE_IVAMONTO, D.ARTI_COD, ARTI_DES, ARTI_UNIDAD, A.GRUP_COD, A.SUBG_COD, A.MARC_COD, SUBSTRING(COTI_OBS FROM 1 FOR 255), C.ptvt_id
                FROM COTIZACIONES C, COTIZACIONES_DETALLE D, ARTICULO A, PREFIJOS P
                WHERE C.COTI_ID = D.COTI_ID AND COTI_FECHA >= :FECINI AND COTI_FECHA <= :FECFIN AND TERC_NIT = :NIT AND COTI_ANULADO = 'N' AND
                      D.ARTI_COD = A.ARTI_COD AND D.ARTI_COD >= :CODINI AND D.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
                      P.PREF_PRE = C.PREF_PRE AND P.TIDO_COD = 35 AND ((P.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) and c.coti_sucursal = :sucursal
                ORDER BY D.ARTI_COD, C.COTI_ID, CTDE_ITEM
                INTO :ID, :ITEM, PREFIJO, :NUMERO, :FECHA, :CANTIDAD, :BASE, :IVA, :ARTICULO, :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC, :OBS, :PTVTA
                DO
                    BEGIN
                    SELECT GRUP_NOM FROM GRUPO WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                    SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                    SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                    EXECUTE PROCEDURE FALTANTE_CORTE(:TIPO, :DESTINO, :ID, :ITEM, :CORTE) returning_values (:FALTANTE, :UNIDAD, :FACTOR);
                    if ((CEROS = 'S') or (FALTANTE <> 0)) then
                        SUSPEND;
                    END
        if (TIPO = 40) then
            FOR SELECT P.pend_id, D.pevd_item, P.PREF_PRE, P.pend_numero, P.pend_fecha, D.pevd_cant * D.pevd_factor, (D.pevd_prunit-D.pevd_dtomonto), D.pevd_ivamonto, D.ARTI_COD, ARTI_DES, ARTI_UNIDAD, A.GRUP_COD, A.SUBG_COD, A.MARC_COD, SUBSTRING(P.pend_obs FROM 1 FOR 255)
                FROM pendiente_ventas P, pendiente_ventas_detalle D, ARTICULO A, PREFIJOS PR
                WHERE P.pend_id = D.pend_id AND PEND_FECHA >= :FECINI AND PEND_FECHA <= :FECFIN AND TERC_NIT = :NIT AND PEND_ANULADO = 'N' AND
                      D.ARTI_COD = A.ARTI_COD AND D.ARTI_COD >= :CODINI AND D.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
                      P.PREF_PRE = PR.PREF_PRE AND PR.TIDO_COD = 40 AND ((PR.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) and p.pend_sucursal = :sucursal
                ORDER BY D.ARTI_COD, P.pend_id, D.pevd_item
                INTO :ID, :ITEM, PREFIJO, :NUMERO, :FECHA, :CANTIDAD, :BASE, :IVA, :ARTICULO, :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC, :OBS
                DO
                    BEGIN
                    SELECT GRUP_NOM FROM GRUPO WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                    SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                    SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                    EXECUTE PROCEDURE FALTANTE(:TIPO, :DESTINO, :ID, :ITEM) returning_values (:FALTANTE, :UNIDAD, :FACTOR);
                    if ((CEROS = 'S') or (FALTANTE <> 0)) then
                        SUSPEND;
                    END
        END
    END
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE REP_FALTANTES_COMPRA(
    TIPOORI INTEGER,
    FECINI DATE,
    FECFIN DATE,
    TIPODES INTEGER,
    CEROS CHAR(1),
    CORTE DATE,
    SUBEMPRESA INTEGER)
RETURNS (
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(8),
    FECHA DATE,
    NIT VARCHAR(20),
    NOMCLIENTE VARCHAR(60),
    NROPROV VARCHAR(8),
    VENCE DATE,
    ARTICULO VARCHAR(15),
    DESCRIPCION VARCHAR(60),
    CANTIDAD NUMERIC(18,4),
    UNIDAD VARCHAR(8),
    PRECIO NUMERIC(18,2),
    FALTANTE NUMERIC(18,4),
    NUMCRUCE VARCHAR(60))
AS
declare variable ID INTEGER;
declare variable ITEM INTEGER;
declare variable FACTOR NUMERIC(18,4);
declare variable NUM VARCHAR(10);
BEGIN
if (TIPOORI = 22) then
    FOR SELECT R.REPR_ID, R.PREF_PRE, REPR_NUMERO, REPR_FECHA, REPR_FECHA VENCE, RPVD_ITEM, R.TERC_NIT, TERC_NOM, ARTI_COD, SUBSTR(RPVD_DESC,1,60), RPVD_UNIDAD, RPVD_CANT, RPVD_PRUNIT, REPR_NUMPROV
      FROM REMISION_PROVEEDOR R, REMISION_PROVEEDOR_DET D, TERCEROS T, PREFIJOS P
      WHERE R.REPR_ID = D.REPR_ID AND REPR_FECHA >= :FECINI AND REPR_FECHA <= :FECFIN AND T.TERC_NIT = R.TERC_NIT and REPR_ANULADO = 'N'
       AND P.PREF_PRE = R.PREF_PRE AND P.TIDO_COD = 22 AND ((P.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
      ORDER BY REPR_FECHA, R.PREF_PRE, REPR_NUMERO, RPVD_ITEM
      INTO :ID, :PREFIJO, :NUMERO, :FECHA, :VENCE, :ITEM, :NIT, :NOMCLIENTE, :ARTICULO, :DESCRIPCION, :UNIDAD, :CANTIDAD, :PRECIO, :nroprov
      DO
        BEGIN
        NUMCRUCE = '';
        EXECUTE PROCEDURE FALTANTE_CORTE(:TIPOORI, :TIPODES, :ID, :ITEM, :CORTE) returning_values (:FALTANTE, :UNIDAD, :FACTOR);
        if (TIPODES = 21) then
            FOR SELECT PREF_PRE || FACO_NUMERO FROM facturas_compra F, consolidado_faltantes C
                WHERE F.faco_consolida = C.cofa_id AND C.cofa_tipoori = 22 AND C.cofa_idori = :ID AND
                C.cofa_tipodes = 21 AND C.cofa_itemori = :ITEM AND C.cofa_cantcr <> 0 AND FACO_ANULADO = 'N'
                INTO :num
                DO
                if (strlen(NUMCRUCE) < 50) then
                    NUMCRUCE = NUMCRUCE || NUM || '-';
        if ((CEROS = 'S') or (FALTANTE <> 0)) then
          SUSPEND;
        END
if (TIPOORI = 23) then
    FOR SELECT O.ORDC_ID, O.PREF_PRE, ORDC_NUMERO, ORDC_FECHA, (ORDC_FECHA + ORDC_VALIDEZ), OCDE_ITEM, O.TERC_NIT, TERC_NOM, ARTI_COD, SUBSTR(OCDE_DESC,1,60), OCDE_UNIDAD, OCDE_CANT, OCDE_PRUNIT
      FROM ORDENES_COMPRA O, ORDENES_COMPRA_DETALLE D, TERCEROS T, PREFIJOS P
      WHERE O.ORDC_ID = D.ORDC_ID AND ORDC_FECHA >= :FECINI AND ORDC_FECHA <= :FECFIN AND T.TERC_NIT = O.TERC_NIT AND ORDC_ANULADO = 'N'
       AND P.PREF_PRE = O.PREF_PRE AND P.TIDO_COD = 23 AND ((P.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
      ORDER BY ORDC_FECHA, O.PREF_PRE, ORDC_NUMERO, OCDE_ITEM
      INTO :ID, :PREFIJO, :NUMERO, :FECHA, :VENCE, :ITEM, :NIT, :NOMCLIENTE, :ARTICULO, :DESCRIPCION, :UNIDAD, :CANTIDAD, :PRECIO
      DO
        BEGIN
        NUMCRUCE = '';
        nroprov = '';
        EXECUTE PROCEDURE FALTANTE_CORTE(:TIPOORI, :TIPODES, :ID, :ITEM, :CORTE) returning_values (:FALTANTE, :UNIDAD, :FACTOR);
        if (TIPODES = 21) then
            FOR SELECT PREF_PRE || FACO_NUMERO FROM facturas_compra F, consolidado_faltantes C
                WHERE F.faco_consolida = C.cofa_id AND C.cofa_tipoori = 23 AND C.cofa_idori = :ID AND
                C.cofa_tipodes = 21 AND C.cofa_itemori = :ITEM AND C.cofa_cantcr <> 0 AND FACO_ANULADO = 'N'
                INTO :num
                DO
                if (strlen(NUMCRUCE) < 50) then
                    NUMCRUCE = NUMCRUCE || NUM || '-';
        if (TIPODES = 22) then
            FOR SELECT PREF_PRE || REPR_NUMERO FROM remision_proveedor F, consolidado_faltantes C
                WHERE F.repr_consolida = C.cofa_id AND C.cofa_tipoori = 23 AND C.cofa_idori = :ID AND
                C.cofa_tipodes = 22 AND C.cofa_itemori = :ITEM AND C.cofa_cantcr <> 0 AND REPR_ANULADO = 'N'
                INTO :num
                DO
                if (strlen(NUMCRUCE) < 50) then
                    NUMCRUCE = NUMCRUCE || NUM || '-';
        if ((CEROS = 'S') or (FALTANTE <> 0)) then
          SUSPEND;
        END
if (TIPOORI = 25) then
    FOR SELECT C.COPR_ID, C.PREF_PRE, COPR_NUMERO, COPR_FECHA, (COPR_FECHA + COPR_VALIDEZ), CPRD_ITEM, C.TERC_NIT, TERC_NOM, ARTI_COD, SUBSTR(CPRD_DESC,1,60), CPRD_UNIDAD, CPRD_CANT, CPRD_PRUNIT
      FROM COTIZACION_PROVEEDOR C, COTIZACIONES_PROVEEDOR_DET D, TERCEROS T, PREFIJOS P
      WHERE C.COPR_ID = D.COPR_ID AND COPR_FECHA >= :FECINI AND COPR_FECHA <= :FECFIN AND T.TERC_NIT = C.TERC_NIT AND COPR_ANULADO = 'N'
       AND P.PREF_PRE = C.PREF_PRE AND P.TIDO_COD = 25 AND ((P.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
      ORDER BY COPR_FECHA, PREF_PRE, COPR_NUMERO, CPRD_ITEM
      INTO :ID, :PREFIJO, :NUMERO, :FECHA, :VENCE, :ITEM, :NIT, :NOMCLIENTE, :ARTICULO, :DESCRIPCION, :UNIDAD, :CANTIDAD, :PRECIO
      DO
        BEGIN
        nroprov = '';
        NUMCRUCE = '';
        EXECUTE PROCEDURE FALTANTE_CORTE(:TIPOORI, :TIPODES, :ID, :ITEM, :CORTE) returning_values (:FALTANTE, :UNIDAD, :FACTOR);
        if (TIPODES = 21) then
            FOR SELECT PREF_PRE || FACO_NUMERO FROM facturas_compra F, consolidado_faltantes C
                WHERE F.faco_consolida = C.cofa_id AND C.cofa_tipoori = 25 AND C.cofa_idori = :ID AND
                C.cofa_tipodes = 21 AND C.cofa_itemori = :ITEM AND C.cofa_cantcr <> 0 AND FACO_ANULADO = 'N'
                INTO :num
                DO
                if (strlen(NUMCRUCE) < 50) then
                    NUMCRUCE = NUMCRUCE || NUM || '-';
        if (TIPODES = 22) then
            FOR SELECT PREF_PRE || REPR_NUMERO FROM remision_proveedor F, consolidado_faltantes C
                WHERE F.repr_consolida = C.cofa_id AND C.cofa_tipoori = 25 AND C.cofa_idori = :ID AND
                C.cofa_tipodes = 22 AND C.cofa_itemori = :ITEM AND C.cofa_cantcr <> 0 AND REPR_ANULADO = 'N'
                INTO :num
                DO
                if (strlen(NUMCRUCE) < 50) then
                    NUMCRUCE = NUMCRUCE || NUM || '-';
        if (TIPODES = 23) then
            FOR SELECT PREF_PRE || REPR_NUMERO FROM remision_proveedor F, consolidado_faltantes C
                WHERE F.repr_consolida = C.cofa_id AND C.cofa_tipoori = 25 AND C.cofa_idori = :ID AND
                C.cofa_tipodes = 23 AND C.cofa_itemori = :ITEM AND C.cofa_cantcr <> 0 AND REPR_ANULADO = 'N'
                INTO :num
                DO
                if (strlen(NUMCRUCE) < 50) then
                    NUMCRUCE = NUMCRUCE || NUM || '-';
        if ((CEROS = 'S') or (FALTANTE <> 0)) then
          SUSPEND;
        END
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE REP_FALTANTES_PROVEEDOR(
    TERINI VARCHAR(20),
    TERFIN VARCHAR(20),
    FECINI DATE,
    FECFIN DATE,
    DETALLE CHAR(1),
    TIPO INTEGER,
    DESTINO INTEGER,
    ARTINI VARCHAR(15),
    ARTFIN VARCHAR(15),
    ORDEN CHAR(1),
    CEROS CHAR(1),
    CORTE DATE,
    SUBEMPRESA INTEGER)
RETURNS (
    NIT VARCHAR(20),
    NOMBRE VARCHAR(60),
    TELEFONO VARCHAR(40),
    CIUDAD VARCHAR(40),
    CODZONA VARCHAR(2),
    NOMZONA VARCHAR(30),
    NOMTIPO VARCHAR(50),
    ARTICULO VARCHAR(15),
    DESCRIPCION VARCHAR(60),
    CODGRUPO VARCHAR(2),
    NOMGRUPO VARCHAR(30),
    CODSUBG VARCHAR(3),
    NOMSUBG VARCHAR(30),
    CODMARC VARCHAR(3),
    NOMMARC VARCHAR(30),
    CANTIDAD NUMERIC(18,4),
    UNIDAD VARCHAR(8),
    FALTANTE NUMERIC(18,4),
    BASE NUMERIC(18,2),
    IVA NUMERIC(18,2),
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(8),
    NROPROV VARCHAR(8),
    FECHA DATE)
AS
declare variable ID INTEGER;
declare variable ITEM INTEGER;
declare variable CANT NUMERIC(18,4);
declare variable MONTO NUMERIC(18,2);
declare variable FACTOR NUMERIC(18,4);
declare variable CODINI VARCHAR(15);
declare variable CODFIN VARCHAR(15);
declare variable DESINI VARCHAR(15);
declare variable DESFIN VARCHAR(15);
BEGIN
if (ORDEN = 'C') then
    BEGIN
    CODINI = ARTINI;
    CODFIN = ARTFIN;
    DESINI = '';
    DESFIN = 'zz';
    END
ELSE
    BEGIN
    DESINI = ARTINI;
    DESFIN = ARTFIN;
    CODINI = '';
    CODFIN = 'zz';
    END
SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = :TIPO INTO :NOMTIPO;
FOR select T.TERC_NIT, TERC_NOM,  TERC_TEL, TERC_CIU, P.GRPR_COD
    from terceros T, PROVEEDORES P
    where P.TERC_NIT = T.TERC_NIT AND TERC_PROV = 'S' and T.TERC_NIT >= :TERINI AND T.TERC_NIT <= :TERFIN
    INTO :NIT, :NOMBRE, :TELEFONO, :CIUDAD, :CODZONA
    DO  
    BEGIN
    select GRPR_NOM from GRUPOS_PROVEEDORES where GRPR_COD = :CODZONA INTO :NOMZONA;
    FOR SELECT ARTI_COD, ARTI_DES, ARTI_UNIDAD, A.GRUP_COD, A.SUBG_COD, A.MARC_COD FROM ARTICULO A
        WHERE ARTI_COD >= :CODINI AND ARTI_COD <= :CODFIN AND ARTI_DES >= :DESINI AND ARTI_DES <= :DESFIN
      INTO :ARTICULO, :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
    DO
      BEGIN
      SELECT GRUP_NOM FROM GRUPO 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 (DETALLE = 'N') then
        BEGIN
        FALTANTE = 0;
        CANTIDAD = 0;
        BASE = 0;
        if (TIPO = 21) then
            FOR SELECT F.FACO_ID, FCDE_ITEM, FCDE_CANT, (FCDE_PRUNIT-FCDE_DTOMONTO), FACO_NUMPROV
                FROM FACTURAS_COMPRAS_DETALLE D, FACTURAS_COMPRA F, PREFIJOS P
                WHERE F.FACO_ID = D.FACO_ID AND ARTI_COD = :ARTICULO AND FACO_FECHA >= :FECINI AND FACO_FECHA < :FECFIN AND TERC_NIT = :NIT AND FACO_ANULADO = 'N'
                 AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 21 AND ((P.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
                ORDER BY F.FACO_ID, FCDE_ITEM INTO :ID, :ITEM, :CANT, :MONTO, :nroprov
                DO
                BEGIN
                CANTIDAD = CANTIDAD + CANT;
                EXECUTE PROCEDURE FALTANTE_CORTE(:TIPO, :DESTINO, :ID, :ITEM, :CORTE) returning_values (:CANT, :UNIDAD, :FACTOR);
                FALTANTE = FALTANTE + CANT;
                BASE = BASE + MONTO;
                END
        if (TIPO = 22) then
            FOR SELECT R.REPR_ID, RPVD_ITEM, RPVD_CANT, (RPVD_PRUNIT-RPVD_DTOMONTO), REPR_NUMPROV
                FROM REMISION_PROVEEDOR_DET D, REMISION_PROVEEDOR R, PREFIJOS P
                WHERE R.REPR_ID = D.REPR_ID AND ARTI_COD = :ARTICULO AND REPR_FECHA >= :FECINI AND REPR_FECHA < :FECFIN AND TERC_NIT = :NIT AND REPR_ANULADO = 'N'
                 AND P.PREF_PRE = R.PREF_PRE AND P.TIDO_COD = 22 AND ((P.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
                ORDER BY R.REPR_ID, RPVD_ITEM INTO :ID, :ITEM, :CANT, :MONTO, :nroprov
                do
                BEGIN
                CANTIDAD = CANTIDAD + CANT;
                EXECUTE PROCEDURE FALTANTE_CORTE(:TIPO, :DESTINO, :ID, :ITEM, :CORTE) returning_values (:CANT, :UNIDAD, :FACTOR);
                FALTANTE = FALTANTE + CANT;
                BASE = BASE + MONTO;
                END
        if (TIPO = 23) then
            FOR SELECT O.ORDC_ID, OCDE_ITEM, OCDE_CANT, (OCDE_PRUNIT-OCDE_DTOMONTO)
                FROM ORDENES_COMPRA_DETALLE D, ORDENES_COMPRA O, PREFIJOS P
                WHERE O.ORDC_ID = D.ORDC_ID AND ARTI_COD = :ARTICULO AND ORDC_FECHA >= :FECINI AND ORDC_FECHA < :FECFIN AND TERC_NIT = :NIT AND ORDC_ANULADO = 'N'
                 AND P.PREF_PRE = O.PREF_PRE AND P.TIDO_COD = 23 AND ((P.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
                ORDER BY O.ORDC_ID, OCDE_ITEM INTO :ID, :ITEM, :CANT, :MONTO
                DO
                BEGIN
                NROPROV = '';
                CANTIDAD = CANTIDAD + CANT;
                EXECUTE PROCEDURE FALTANTE_CORTE(:TIPO, :DESTINO, :ID, :ITEM, :CORTE) returning_values (:CANT, :UNIDAD, :FACTOR);
                FALTANTE = FALTANTE + CANT;
                BASE = BASE + MONTO;
                END
        if (TIPO = 25) then
            FOR SELECT C.COPR_ID, CPRD_ITEM, CPRD_CANT, (CPRD_PRUNIT-CPRD_DTOMONTO)
                FROM COTIZACIONES_PROVEEDOR_DET D, COTIZACION_PROVEEDOR C, PREFIJOS P
                WHERE C.COPR_ID = D.COPR_ID AND ARTI_COD = :ARTICULO AND COPR_FECHA >= :FECINI AND COPR_FECHA < :FECFIN AND TERC_NIT = :NIT AND COPR_ANULADO = 'N'
                 AND P.PREF_PRE = C.PREF_PRE AND P.TIDO_COD = 25 AND ((P.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
                ORDER BY C.COPR_ID, CPRD_ITEM INTO :ID, :ITEM, :CANT, :MONTO
                DO
                BEGIN
                NROPROV = '';
                CANTIDAD = CANTIDAD + CANT;
                EXECUTE PROCEDURE FALTANTE_CORTE(:TIPO, :DESTINO, :ID, :ITEM, :CORTE) returning_values (:CANT, :UNIDAD, :FACTOR);
                FALTANTE = FALTANTE + CANT;
                BASE = BASE + MONTO;
                END
        if (FALTANTE IS NULL) then
            FALTANTE = 0;
        if (BASE IS NULL) then
            BASE = 0;
        if (CEROS = 'S') then
            SUSPEND;
        ELSE
            if (FALTANTE <> 0) then
                SUSPEND;
        END
      ELSE
        BEGIN
        if (TIPO = 21) then
            FOR SELECT F.FACO_ID, FCDE_ITEM, F.PREF_PRE, FACO_NUMERO, FACO_FECHA, FCDE_CANT * FCDE_FACTOR, (FCDE_PRUNIT-FCDE_DTOMONTO) * FCDE_CANT, FCDE_IVAMONTO, FACO_NUMPROV
                FROM FACTURAS_COMPRA F, FACTURAS_COMPRAS_DETALLE D, PREFIJOS P
                WHERE F.FACO_ID = D.FACO_ID AND ARTI_COD = :ARTICULO AND FACO_FECHA >= :FECINI AND FACO_FECHA < :FECFIN  AND TERC_NIT = :NIT AND FACO_ANULADO = 'N'
                 AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 21 AND ((P.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
                INTO :ID, :ITEM, :PREFIJO, :NUMERO, :FECHA, :CANTIDAD, :BASE, :IVA, :nroprov
                DO
                    BEGIN
                    EXECUTE PROCEDURE FALTANTE_CORTE(:TIPO, :DESTINO, :ID, :ITEM, :CORTE) returning_values (:FALTANTE, :UNIDAD, :FACTOR);
                    if ((CEROS = 'S') or (FALTANTE <> 0)) then
                      SUSPEND;
                    END
        if (TIPO = 22) then
            FOR SELECT R.REPR_ID, RPVD_ITEM, R.PREF_PRE, REPR_NUMERO, REPR_FECHA, RPVD_CANT * RPVD_FACTOR, (RPVD_PRUNIT-RPVD_DTOMONTO) * RPVD_CANT, RPVD_IVAMONTO, REPR_NUMPROV
                FROM REMISION_PROVEEDOR R, REMISION_PROVEEDOR_DET D, PREFIJOS P
                WHERE R.REPR_ID = D.REPR_ID AND ARTI_COD = :ARTICULO AND REPR_FECHA >= :FECINI AND REPR_FECHA < :FECFIN AND TERC_NIT = :NIT AND REPR_ANULADO = 'N'
                 AND P.PREF_PRE = R.PREF_PRE AND P.TIDO_COD = 22 AND ((P.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
                INTO :ID, :ITEM, :PREFIJO, :NUMERO, :FECHA, :CANTIDAD, :BASE, :IVA, :nroprov
                DO
                    BEGIN
                    EXECUTE PROCEDURE FALTANTE_CORTE(:TIPO, :DESTINO, :ID, :ITEM, :CORTE) returning_values (:FALTANTE, :UNIDAD, :FACTOR);
                    if ((CEROS = 'S') or (FALTANTE <> 0)) then
                      SUSPEND;
                    END
        if (TIPO = 23) then
            FOR SELECT O.ORDC_ID, OCDE_ITEM, O.PREF_PRE, ORDC_NUMERO, ORDC_FECHA, OCDE_CANT * OCDE_FACTOR, (OCDE_PRUNIT-OCDE_DTOMONTO) * OCDE_CANT, OCDE_IVAMONTO
                FROM ORDENES_COMPRA O, ORDENES_COMPRA_DETALLE D, PREFIJOS P
                WHERE O.ORDC_ID = D.ORDC_ID AND ARTI_COD = :ARTICULO AND ORDC_FECHA >= :FECINI AND ORDC_FECHA < :FECFIN AND TERC_NIT = :NIT AND ORDC_ANULADO = 'N'
                 AND P.PREF_PRE = O.PREF_PRE AND P.TIDO_COD = 23 AND ((P.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
                INTO :ID, :ITEM, :PREFIJO, :NUMERO, :FECHA, :CANTIDAD, :BASE, :IVA
                DO
                    BEGIN
                    nroprov = '';
                    EXECUTE PROCEDURE FALTANTE_CORTE(:TIPO, :DESTINO, :ID, :ITEM, :CORTE) returning_values (:FALTANTE, :UNIDAD, :FACTOR);
                    if ((CEROS = 'S') or (FALTANTE <> 0) ) then
                      SUSPEND;
                    END
        if (TIPO = 25) then
            FOR SELECT C.COPR_ID, CPRD_ITEM, C.PREF_PRE, C.COPR_NUMERO, COPR_FECHA, CPRD_CANT * CPRD_FACTOR, (CPRD_PRUNIT-CPRD_DTOMONTO) * CPRD_CANT, CPRD_IVAMONTO
                FROM COTIZACION_PROVEEDOR C, COTIZACIONES_PROVEEDOR_DET D, PREFIJOS P
                WHERE C.COPR_ID = D.COPR_ID AND ARTI_COD = :ARTICULO AND COPR_FECHA >= :FECINI AND COPR_FECHA < :FECFIN AND TERC_NIT = :NIT AND COPR_ANULADO = 'N'
                 AND P.PREF_PRE = C.PREF_PRE AND P.TIDO_COD = 25 AND ((P.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
                INTO :ID, :ITEM, :PREFIJO, :NUMERO, :FECHA, :CANTIDAD, :BASE, :IVA
                DO
                    BEGIN
                    nroprov = '';
                    EXECUTE PROCEDURE FALTANTE_CORTE(:TIPO, :DESTINO, :ID, :ITEM, :CORTE) returning_values (:FALTANTE, :UNIDAD, :FACTOR);
                    if ((CEROS = 'S') or (FALTANTE <> 0)) then
                      SUSPEND;
                    END
        END
      END
    END
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE REP_FALTANTES_VENDEDOR(
    VENINI VARCHAR(20),
    VENFIN VARCHAR(20),
    FECINI DATE,
    FECFIN DATE,
    DETALLE CHAR(1),
    TIPO INTEGER,
    DESTINO INTEGER,
    ARTINI VARCHAR(15),
    ARTFIN VARCHAR(15),
    ORDEN CHAR(1),
    CEROS CHAR(1),
    CORTE DATE,
    SUBEMPRESA INTEGER)
RETURNS (
    CODVEND VARCHAR(20),
    NOMVEND VARCHAR(60),
    NOMTIPO VARCHAR(50),
    ARTICULO VARCHAR(15),
    DESCRIPCION VARCHAR(60),
    CODGRUPO VARCHAR(2),
    NOMGRUPO VARCHAR(30),
    CODSUBG VARCHAR(3),
    NOMSUBG VARCHAR(30),
    CODMARC VARCHAR(3),
    NOMMARC VARCHAR(30),
    CANTIDAD NUMERIC(18,4),
    UNIDAD VARCHAR(8),
    FALTANTE NUMERIC(18,4),
    BASE NUMERIC(18,2),
    IVA NUMERIC(18,2),
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(8),
    FECHA DATE,
    PTVTA INTEGER,
    OBS VARCHAR(255))
AS
declare variable ID INTEGER;
declare variable ITEM INTEGER;
declare variable CODINI VARCHAR(15);
declare variable CODFIN VARCHAR(15);
declare variable DESINI VARCHAR(15);
declare variable DESFIN VARCHAR(15);
declare variable FACTOR NUMERIC(18,4);
declare variable CANT NUMERIC(18,4);
declare variable MONTO NUMERIC(18,2);
declare variable artiaux VARCHAR(20);
BEGIN
if (ORDEN = 'C') then
    BEGIN
    CODINI = ARTINI;
    CODFIN = ARTFIN;
    DESINI = '';
    DESFIN = 'zz';
    END
ELSE
    BEGIN
    DESINI = ARTINI;
    DESFIN = ARTFIN;
    CODINI = '';
    CODFIN = 'zz';
    END

  SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = :TIPO INTO :NOMTIPO;
  /*FOR select VEND_COD, VEND_NOMBRE
    from VENDEDORES where VEND_COD >= :VENINI AND VEND_COD <= :VENFIN
    INTO :CODVEND, :NOMVEND
    DO  
    BEGIN*/
    if (DETALLE = 'N') then
        BEGIN
        ARTICULO = '';
        if (TIPO = 31) then
            FOR SELECT F.FACT_ID, FADE_ITEM, D.ARTI_COD, FADE_CANT * FADE_FACTOR, (FADE_PRUNIT-FADE_DTOMONTO),f.vend_cod, F.ptvt_id
                FROM FACTURAS_DETALLE D, FACTURAS F, ARTICULO A, PREFIJOS P
                WHERE F.FACT_ID = D.FACT_ID AND FACT_FECHA >= :FECINI AND FACT_FECHA <= :FECFIN AND VEND_COD >= :VENINI AND VEND_COD <= :VENFIN AND FACT_ANULADO = 'N' AND
                      D.ARTI_COD = A.ARTI_COD AND D.ARTI_COD >= :CODINI AND D.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
                      P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 31 AND ((P.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) and substring(a.arti_cod from 1 FOR 2) <> '.t'
                ORDER BY VEND_COD,ARTI_COD, F.FACT_ID, FADE_ITEM INTO :ID, :ITEM, :ARTIAUX, :CANT,  :MONTO,:CODVEND, :PTVTA
                DO
                BEGIN
                select VEND_NOMBRE from VENDEDORES where  VEND_COD = :CODVEND INTO :NOMVEND;
                if (artiaux <> articulo) then
                    begin
                    if (ARTICULO <> '') then
                      if ((CEROS = 'S') or (FALTANTE <> 0)) then
                        SUSPEND;
                    SELECT ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                        FROM articulo WHERE ARTI_COD = :ARTIAUX
                        INTO :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC;
                    SELECT GRUP_NOM FROM GRUPO 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;
                    ARTICULO = ARTIAUX;
                    CANTIDAD = 0;
                    FALTANTE = 0;
                    BASE = 0;
                    end
                CANTIDAD = CANTIDAD + CANT;
                EXECUTE PROCEDURE FALTANTE_CORTE(:TIPO, :DESTINO, :ID, :ITEM, :CORTE) returning_values (:CANT, :UNIDAD, :FACTOR);
                FALTANTE = FALTANTE + CANT;
                BASE = BASE + (MONTO * CANT);
                END
        if (TIPO = 32) then
            FOR SELECT R.revt_id, rvde_item, D.ARTI_COD, RVDE_CANT * RVDE_FACTOR, (RVDE_PRUNIT-RVDE_DTOMONTO),R.vend_cod, R.ptvt_id
                FROM REMISIONES_VENTA_DETALLE D, REMISIONES_VENTA R, ARTICULO A, PREFIJOS P
                WHERE R.REVT_ID = D.REVT_ID AND REVT_FECHA >= :FECINI AND REVT_FECHA <= :FECFIN AND VEND_COD >= :VENINI AND VEND_COD <= :VENFIN AND REVT_ANULADO = 'N' AND
                      D.ARTI_COD = A.ARTI_COD AND D.ARTI_COD >= :CODINI AND D.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
                      P.PREF_PRE = R.PREF_PRE AND P.TIDO_COD = 32 AND ((P.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
                ORDER BY VEND_COD,ARTI_COD, R.REVT_ID, RVDE_ITEM INTO :ID, :ITEM, :ARTIAUX, :CANT, :MONTO,:CODVEND, :PTVTA
                DO
                BEGIN
                select VEND_NOMBRE from VENDEDORES where  VEND_COD = :CODVEND INTO :NOMVEND;
                if (artiaux <> articulo) then
                    begin
                    if (ARTICULO <> '') then
                      if ((CEROS = 'S') or (FALTANTE <> 0)) then
                        SUSPEND;
                    SELECT ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                        FROM articulo WHERE ARTI_COD = :ARTIAUX
                        INTO :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC;
                    SELECT GRUP_NOM FROM GRUPO 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;
                    ARTICULO = ARTIAUX;
                    CANTIDAD = 0;
                    FALTANTE = 0;
                    BASE = 0;
                    end
                CANTIDAD = CANTIDAD + CANT;
                EXECUTE PROCEDURE FALTANTE_CORTE(:TIPO, :DESTINO, :ID, :ITEM, :CORTE) returning_values (:CANT, :UNIDAD, :FACTOR);
                FALTANTE = FALTANTE + CANT;
                BASE = BASE + (MONTO * CANT);
                END
        if (TIPO = 34) then
            FOR SELECT P.PEDI_ID, PEDE_ITEM, D.ARTI_COD, PEDE_CANT * PEDE_FACTOR, (PEDE_PRUNIT-PEDE_DTOMONTO),p.vend_cod, P.ptvt_id
                FROM PEDIDOS_DETALLE D, PEDIDOS P, ARTICULO A, PREFIJOS PR
                WHERE P.PEDI_ID = D.PEDI_ID AND PEDI_FECHA >= :FECINI AND PEDI_FECHA <= :FECFIN AND VEND_COD >= :VENINI AND VEND_COD <= :VENFIN AND PEDI_ANULADO = 'N' AND
                      D.ARTI_COD = A.ARTI_COD AND D.ARTI_COD >= :CODINI AND D.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
                      PR.PREF_PRE = P.PREF_PRE AND PR.TIDO_COD = 34 AND ((PR.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) AND PEDI_VALIDEZ >= 0
                ORDER BY VEND_COD,ARTI_COD, P.PEDI_ID, PEDE_ITEM INTO :ID, :ITEM, :ARTIAUX, :CANT, :MONTO,:CODVEND, :PTVTA
                DO
                BEGIN
                select VEND_NOMBRE from VENDEDORES where  VEND_COD = :CODVEND INTO :NOMVEND;
                if (artiaux <> articulo) then
                    begin
                    if (ARTICULO <> '') then
                      if ((CEROS = 'S') or (FALTANTE <> 0)) then
                        SUSPEND;
                    SELECT ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                        FROM articulo WHERE ARTI_COD = :ARTIAUX
                        INTO :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC;
                    SELECT GRUP_NOM FROM GRUPO 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;
                    ARTICULO = ARTIAUX;
                    CANTIDAD = 0;
                    FALTANTE = 0;
                    BASE = 0;
                    end
                CANTIDAD = CANTIDAD + CANT;
                EXECUTE PROCEDURE FALTANTE_CORTE(:TIPO, :DESTINO, :ID, :ITEM, :CORTE) returning_values (:CANT, :UNIDAD, :FACTOR);
                FALTANTE = FALTANTE + CANT;
                BASE = BASE + (MONTO * CANT);
                END
        if (TIPO = 35) then
            FOR SELECT C.COTI_ID, CTDE_ITEM, D.ARTI_COD, CTDE_CANT * CTDE_FACTOR, (CTDE_PRUNIT-CTDE_DTOMONTO),c.vend_cod, C.ptvt_id
                FROM COTIZACIONES_DETALLE D, COTIZACIONES C, ARTICULO A, PREFIJOS P
                WHERE C.COTI_ID = D.COTI_ID AND COTI_FECHA >= :FECINI AND COTI_FECHA <= :FECFIN AND VEND_COD >= :VENINI AND VEND_COD <= :VENFIN AND COTI_ANULADO = 'N' AND
                      D.ARTI_COD = A.ARTI_COD AND D.ARTI_COD >= :CODINI AND D.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
                      P.PREF_PRE = C.PREF_PRE AND P.TIDO_COD = 35 AND ((P.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
                ORDER BY VEND_COD,ARTI_COD, C.COTI_ID, CTDE_ITEM INTO :ID, :ITEM, :ARTIAUX, :CANT, :MONTO,:CODVEND, :PTVTA
                DO
                BEGIN
                select VEND_NOMBRE from VENDEDORES where  VEND_COD = :CODVEND INTO :NOMVEND;
                if (artiaux <> articulo) then
                    begin
                    if (ARTICULO <> '') then
                      if ((CEROS = 'S') or (FALTANTE <> 0)) then
                        SUSPEND;
                    SELECT ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                        FROM articulo WHERE ARTI_COD = :ARTIAUX
                        INTO :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC;
                    SELECT GRUP_NOM FROM GRUPO 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;
                    ARTICULO = ARTIAUX;
                    CANTIDAD = 0;
                    FALTANTE = 0;
                    BASE = 0;
                    end
                CANTIDAD = CANTIDAD + CANT;
                EXECUTE PROCEDURE FALTANTE_CORTE(:TIPO, :DESTINO, :ID, :ITEM, :CORTE) returning_values (:CANT, :UNIDAD, :FACTOR);
                FALTANTE = FALTANTE + CANT;
                BASE = BASE + (MONTO * CANT);
                END
        if (TIPO = 40) then
            FOR SELECT P.pend_id, D.pevd_item, D.ARTI_COD, D.pevd_cant * D.pevd_factor, (D.pevd_prunit-D.pevd_dtomonto),p.vend_cod
                FROM pendiente_ventas_detalle D, pendiente_ventas P, ARTICULO A, PREFIJOS PR
                WHERE P.pend_id = D.pend_id AND PEND_FECHA >= :FECINI AND PEND_FECHA <= :FECFIN AND VEND_COD >= :VENINI AND VEND_COD <= :VENFIN AND PEND_ANULADO = 'N' AND
                      D.ARTI_COD = A.ARTI_COD AND D.ARTI_COD >= :CODINI AND D.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
                      PR.PREF_PRE = P.PREF_PRE AND PR.TIDO_COD = 40 AND ((PR.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
                ORDER BY VEND_COD,ARTI_COD, P.pend_id, D.pevd_item INTO :ID, :ITEM, :ARTIAUX, :CANT, :MONTO,:CODVEND
                DO
                BEGIN
                select VEND_NOMBRE from VENDEDORES where  VEND_COD = :CODVEND INTO :NOMVEND;
                if (artiaux <> articulo) then
                    begin
                    if (ARTICULO <> '') then
                      if ((CEROS = 'S') or (FALTANTE <> 0)) then
                        SUSPEND;
                    SELECT ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                        FROM articulo WHERE ARTI_COD = :ARTIAUX
                        INTO :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC;
                    SELECT GRUP_NOM FROM GRUPO 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;
                    ARTICULO = ARTIAUX;
                    CANTIDAD = 0;
                    FALTANTE = 0;
                    BASE = 0;
                    end
                CANTIDAD = CANTIDAD + CANT;
                EXECUTE PROCEDURE FALTANTE(:TIPO, :DESTINO, :ID, :ITEM) returning_values (:CANT, :UNIDAD, :FACTOR);
                FALTANTE = FALTANTE + CANT;
                BASE = BASE + (MONTO * CANT);
                END
        if (FALTANTE IS NULL) then
            FALTANTE = 0;
        if (BASE IS NULL) then
            BASE = 0;
        if (IVA IS NULL) then
            IVA = 0;
        if ((CEROS = 'S') or (FALTANTE <> 0)) then
            SUSPEND;
        END
    ELSE
        BEGIN
        if (TIPO = 31) then
            FOR SELECT F.FACT_ID, FADE_ITEM, F.PREF_PRE, FACT_NUMERO, FACT_FECHA, FADE_CANT * FADE_FACTOR, (FADE_PRUNIT-FADE_DTOMONTO), FADE_IVAMONTO, D.ARTI_COD, ARTI_DES, ARTI_UNIDAD, A.GRUP_COD, A.SUBG_COD, A.MARC_COD,f.vend_cod, SUBSTRING(FACT_OBS FROM 1 FOR 255), F.ptvt_id
                FROM FACTURAS F, FACTURAS_DETALLE D, ARTICULO A, PREFIJOS P
                WHERE F.FACT_ID = D.FACT_ID AND FACT_FECHA >= :FECINI AND FACT_FECHA <= :FECFIN  AND VEND_COD >= :VENINI AND VEND_COD <= :VENFIN AND FACT_ANULADO = 'N' AND
                      D.ARTI_COD = A.ARTI_COD AND D.ARTI_COD >= :CODINI AND D.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
                      P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 31 AND ((P.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) and substring(a.arti_cod from 1 FOR 2) <> '.t'
                ORDER BY VEND_COD,ARTI_COD, F.FACT_ID, FADE_ITEM
                INTO :ID, :ITEM, :PREFIJO, :NUMERO, :FECHA, :CANTIDAD, :BASE, :IVA, :ARTICULO, :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC,:CODVEND, :OBS, :PTVTA
                DO
                    BEGIN
                    select VEND_NOMBRE from VENDEDORES where  VEND_COD = :CODVEND INTO :NOMVEND;
                    SELECT GRUP_NOM FROM GRUPO WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                    SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                    SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                    EXECUTE PROCEDURE FALTANTE_CORTE(:TIPO, :DESTINO, :ID, :ITEM, :CORTE) returning_values (:FALTANTE, :UNIDAD, :FACTOR);
                    if ((CEROS = 'S') or (FALTANTE <> 0)) then
                        SUSPEND;
                    END
        if (TIPO = 32) then
            FOR SELECT R.REVT_ID, RVDE_ITEM, R.PREF_PRE, REVT_NUMERO, REVT_FECHA, RVDE_CANT * RVDE_FACTOR, (RVDE_PRUNIT-RVDE_DTOMONTO), RVDE_IVAMONTO, D.ARTI_COD, ARTI_DES, ARTI_UNIDAD, A.GRUP_COD, A.SUBG_COD, A.MARC_COD,R.vend_cod, SUBSTRING(REVT_OBS FROM 1 FOR 255), R.ptvt_id
                FROM REMISIONES_VENTA R, REMISIONES_VENTA_DETALLE D, ARTICULO A, PREFIJOS P
                WHERE R.REVT_ID = D.REVT_ID AND REVT_FECHA >= :FECINI AND REVT_FECHA <= :FECFIN AND VEND_COD >= :VENINI AND VEND_COD <= :VENFIN AND REVT_ANULADO = 'N' AND
                      D.ARTI_COD = A.ARTI_COD AND D.ARTI_COD >= :CODINI AND D.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
                      P.PREF_PRE = R.PREF_PRE AND P.TIDO_COD = 33 AND ((P.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
                ORDER BY VEND_COD,ARTI_COD, R.REVT_ID, RVDE_ITEM
                INTO :ID, :ITEM, :PREFIJO, :NUMERO, :FECHA, :CANTIDAD, :BASE, :IVA, :ARTICULO, :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC,:CODVEND, :OBS, :PTVTA
                DO
                    BEGIN
                    select VEND_NOMBRE from VENDEDORES where  VEND_COD = :CODVEND INTO :NOMVEND;
                    SELECT GRUP_NOM FROM GRUPO WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                    SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                    SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                    EXECUTE PROCEDURE FALTANTE_CORTE(:TIPO, :DESTINO, :ID, :ITEM, :CORTE) returning_values (:FALTANTE, :UNIDAD, :FACTOR);
                    if ((CEROS = 'S') or (FALTANTE <> 0)) then
                        SUSPEND;
                    END
        if (TIPO = 34) then
            FOR SELECT P.PEDI_ID, PEDE_ITEM, P.PREF_PRE, PEDI_NUMERO, PEDI_FECHA, PEDE_CANT * PEDE_FACTOR, (PEDE_PRUNIT-PEDE_DTOMONTO), PEDE_IVAMONTO, D.ARTI_COD, ARTI_DES, ARTI_UNIDAD, A.GRUP_COD, A.SUBG_COD, A.MARC_COD,P.vend_cod, SUBSTRING(PEDI_OBS FROM 1 FOR 255), P.ptvt_id
                FROM PEDIDOS P, PEDIDOS_DETALLE D, ARTICULO A, PREFIJOS PR
                WHERE P.PEDI_ID = D.PEDI_ID AND PEDI_FECHA >= :FECINI AND PEDI_FECHA <= :FECFIN AND VEND_COD >= :VENINI AND VEND_COD <= :VENFIN AND PEDI_ANULADO = 'N' AND
                      D.ARTI_COD = A.ARTI_COD AND D.ARTI_COD >= :CODINI AND D.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
                      P.PREF_PRE = PR.PREF_PRE AND PR.TIDO_COD = 34 AND ((PR.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) AND PEDI_VALIDEZ >= 0
                ORDER BY VEND_COD,ARTI_COD, P.PEDI_ID, PEDE_ITEM
                INTO :ID, :ITEM, PREFIJO, :NUMERO, :FECHA, :CANTIDAD, :BASE, :IVA, :ARTICULO, :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC,:CODVEND, :OBS, :PTVTA
                DO
                    BEGIN
                    select VEND_NOMBRE from VENDEDORES where  VEND_COD = :CODVEND INTO :NOMVEND;
                    SELECT GRUP_NOM FROM GRUPO WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                    SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                    SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                    EXECUTE PROCEDURE FALTANTE_CORTE(:TIPO, :DESTINO, :ID, :ITEM, :CORTE) returning_values (:FALTANTE, :UNIDAD, :FACTOR);
                    if ((CEROS = 'S') or (FALTANTE <> 0)) then
                        SUSPEND;
                    END
        if (TIPO = 35) then
            FOR SELECT C.COTI_ID, CTDE_ITEM, C.PREF_PRE, COTI_NUMERO, COTI_FECHA, CTDE_CANT * CTDE_FACTOR, (CTDE_PRUNIT-CTDE_DTOMONTO), CTDE_IVAMONTO, D.ARTI_COD, ARTI_DES, ARTI_UNIDAD, A.GRUP_COD, A.SUBG_COD, A.MARC_COD,C.vend_cod, SUBSTRING(COTI_OBS FROM 1 FOR 255), C.ptvt_id
                FROM COTIZACIONES C, COTIZACIONES_DETALLE D, ARTICULO A, PREFIJOS P
                WHERE C.COTI_ID = D.COTI_ID AND COTI_FECHA >= :FECINI AND COTI_FECHA <= :FECFIN AND VEND_COD >= :VENINI AND VEND_COD <= :VENFIN AND COTI_ANULADO = 'N' AND
                      D.ARTI_COD = A.ARTI_COD AND D.ARTI_COD >= :CODINI AND D.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
                      P.PREF_PRE = C.PREF_PRE AND P.TIDO_COD = 35 AND ((P.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
                ORDER BY VEND_COD,ARTI_COD, C.COTI_ID, CTDE_ITEM
                INTO :ID, :ITEM, PREFIJO, :NUMERO, :FECHA, :CANTIDAD, :BASE, :IVA, :ARTICULO, :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC,:CODVEND, :OBS, :PTVTA
                DO
                    BEGIN
                    select VEND_NOMBRE from VENDEDORES where  VEND_COD = :CODVEND INTO :NOMVEND;
                    SELECT GRUP_NOM FROM GRUPO WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                    SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                    SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                    EXECUTE PROCEDURE FALTANTE_CORTE(:TIPO, :DESTINO, :ID, :ITEM, :CORTE) returning_values (:FALTANTE, :UNIDAD, :FACTOR);
                    if ((CEROS = 'S') or (FALTANTE <> 0)) then
                        SUSPEND;
                    END
        if (TIPO = 40) then
            FOR SELECT P.pend_id, D.pevd_item, P.PREF_PRE, P.pend_numero, PEND_FECHA, D.pevd_cant * D.pevd_factor, (D.pevd_prunit-D.pevd_dtomonto), D.pevd_ivamonto, D.ARTI_COD, ARTI_DES, ARTI_UNIDAD, A.GRUP_COD, A.SUBG_COD, A.MARC_COD,P.vend_cod, SUBSTRING(P.pend_obs FROM 1 FOR 255)
                FROM pendiente_ventas P, pendiente_ventas_detalle D, ARTICULO A, PREFIJOS PR
                WHERE P.pend_id = D.pend_id AND PEND_FECHA >= :FECINI AND PEND_FECHA <= :FECFIN AND VEND_COD >= :VENINI AND VEND_COD <= :VENFIN AND PEND_ANULADO = 'N' AND
                      D.ARTI_COD = A.ARTI_COD AND D.ARTI_COD >= :CODINI AND D.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
                      P.PREF_PRE = PR.PREF_PRE AND PR.TIDO_COD = 40 AND ((PR.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
                ORDER BY VEND_COD,ARTI_COD, P.pend_id, D.pevd_item
                INTO :ID, :ITEM, PREFIJO, :NUMERO, :FECHA, :CANTIDAD, :BASE, :IVA, :ARTICULO, :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC,:CODVEND, :OBS
                DO
                    BEGIN
                    select VEND_NOMBRE from VENDEDORES where  VEND_COD = :CODVEND INTO :NOMVEND;
                    SELECT GRUP_NOM FROM GRUPO WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                    SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                    SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                    EXECUTE PROCEDURE FALTANTE(:TIPO, :DESTINO, :ID, :ITEM) returning_values (:FALTANTE, :UNIDAD, :FACTOR);
                    if ((CEROS = 'S') or (FALTANTE <> 0)) then
                        SUSPEND;
                    END
        END
   /* END*/
END
^

SET TERM ; ^

SET TERM ^ ;

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),
    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);
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);
            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);
            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);
            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 || '-';
            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 || '-';
        FOR SELECT RVDE_ITEM FROM remisiones_venta_detalle WHERE REVT_ID = :ID INTO :ITEM
            DO
            BEGIN
            EXECUTE PROCEDURE FALTANTE_CORTE(:TIPOORI, :TIPODES, :ID, :ITEM, :CORTE) returning_values (:FALTA, :UNIDAD, :FACTOR);
            FALTANTE = FALTANTE + FALTA;
            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;
        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;
            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;
        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;
            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 ; ^

/* 20140113 */
/* SI SON NOTAS O ANTICIPOS TOME EL PORCENTAJE DE COMISION DE VENTA SI ES POR ARTICULO */
SET TERM ^ ;

CREATE OR ALTER procedure COMISIONES_COBRO (
    DESDE integer,
    HASTA integer,
    FECINI date,
    FECFIN date,
    DETALLE char(1))
returns (
    CODVEND integer,
    NOMVEND varchar(60),
    NIT varchar(20),
    CLIENTE varchar(60),
    NOMTIPO varchar(8),
    PREFIJO varchar(4),
    NUMERO varchar(8),
    FECDOC date,
    PUNTOVTA integer,
    PREFREC varchar(4),
    NUMREC varchar(8),
    FECREC date,
    DIAS integer,
    ABONO numeric(18,2),
    BASE numeric(18,2),
    COMIMONTO numeric(18,2),
    COMIPORC numeric(9,2),
    ARTICULO varchar(20),
    ARTIDES varchar(60),
    CODGRP varchar(2),
    CODMAR varchar(3),
    CANT numeric(18,4),
    DTOFIN numeric(18,2),
    VENCE date,
    RTFTE numeric(18,2),
    RTIVA numeric(18,2),
    RTICA numeric(18,2))
AS
DECLARE VARIABLE TIPO INTEGER;
DECLARE VARIABLE ID INTEGER;
DECLARE VARIABLE IVAMONTO NUMERIC(18,2);
DECLARE VARIABLE TOTAL NUMERIC(18,2);
DECLARE VARIABLE SITOT CHAR(2);
DECLARE VARIABLE VENTA CHAR(2);
DECLARE VARIABLE COMIV NUMERIC(18,2);
DECLARE VARIABLE PORCV double precision;
DECLARE VARIABLE CONSUMO NUMERIC(18,2);
declare variable ALFINAL CHAR(2);
declare variable SALDO NUMERIC(18,2);
declare variable COMISION VARCHAR(10);
declare variable porcaux NUMERIC(9,2);
declare variable BASEAUX DOUBLE PRECISION;
declare variable SUCURSAL VARCHAR(20);
declare variable COMIART VARCHAR(6);
declare variable LISTA INTEGER;
declare variable LISTAP INTEGER;
declare variable INCDTO CHAR(2);
declare variable INCANTI CHAR(2);
declare variable INCCHE CHAR(2);
declare variable OK CHAR(1);
declare variable IDF INTEGER;
declare variable COMIXVND CHAR(2);
declare variable COMIDIAS NUMERIC(9,2);
declare variable ICOINC CHAR(2);
declare variable UNIVEND CHAR(2);
BEGIN
EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA','COMISIONES','UNIFICAR CODIGOS DE VENDEDORES Y COBRADORES') returning_values (:UNIVEND);
EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA','COMISIONES','COMISION POR COBRO PAGADERA SOLO EN EL COBRO TOTAL') returning_values (:ALFINAL);
execute procedure lee_configuracion('CARTERA','COMISIONES','COMISION POR COBRO COMO PORCENTAJE DE LA COMISION VENTA') returning_values (:venta);
EXECUTE PROCEDURE lee_configuracion('CARTERA', 'COMISIONES', 'LIQUIDAR COMISION COBRO CON COBRADOR DEL DOCUMENTO O DEL RECIBO') returning_values (:COMISION);
EXECUTE PROCEDURE lee_configuracion ('FACTURACION','FACTURAS', 'CODIGO DE LA LISTA DE PRECIOS A MOSTRAR EN ARTICULOS') returning_values (:LISTAP);
EXECUTE PROCEDURE lee_configuracion('CARTERA', 'COMISIONES', 'COMISION POR COBRO POR ARTICULO') returning_values (:comiart);
EXECUTE PROCEDURE lee_configuracion('CARTERA', 'COMISIONES', 'INCLUIR DESCUENTO FINANCIERO EN BASE DE COMISIONES POR COBRO') returning_values (:incdto);
EXECUTE PROCEDURE lee_configuracion('CARTERA', 'COMISIONES', 'INCLUIR ANTICIPOS EN COMISIONES POR COBRO') returning_values (:incanti);
EXECUTE PROCEDURE lee_configuracion('CARTERA', 'COMISIONES', 'INCLUIR RECAUDO DE CHEQUES DEVUELTOS EN COMISIONES') returning_values (:incche);
EXECUTE PROCEDURE lee_configuracion('CARTERA', 'COMISIONES', 'COMISION POR ARTICULO Y PROPORCION POR DIAS DE RECAUDO') returning_values (:comixvnd);
EXECUTE PROCEDURE lee_configuracion('CARTERA', 'COMISIONES', 'COMISION POR COBRO INCLUYENDO EL IMPOCONSUMO') returning_values (:icoinc);
EXECUTE PROCEDURE lee_configuracion('CARTERA', 'COMISIONES', 'COMISION POR COBRO SOBRE EL TOTAL') returning_values (:SITOT);
FOR SELECT RCDE_TIPODOC, RCDE_IDDOC, RCDE_PREFIJO, RCDE_NUMERO, R.TERC_NIT, TERC_NOM, RECA_FECHA, (RCDE_ABONO+RCDE_RTFTE+RCDE_RTIVA+RCDE_RTICA), PREF_PRE, RECA_NUMERO, RCDE_COBR, RCDE_DTOF, RCDE_RTFTE, RCDE_RTIVA, RCDE_RTICA
    FROM RECIBOS_CAJA R, RECIBOS_CAJA_DETALLE RD, TERCEROS T
    WHERE R.RECA_ID = RD.RECA_ID AND RECA_FECHA >= :FECINI AND RECA_FECHA <= :FECFIN AND R.TERC_NIT = T.TERC_NIT AND RECA_ANULADO = 'N'
    AND ((RD.rcde_tipodoc <> 45) or (:INCANTI = 'SI'))
    ORDER BY TERC_NIT, RECA_FECHA
    INTO :TIPO, :ID, :PREFIJO, :NUMERO, :NIT, :CLIENTE, :FECREC, :ABONO, :PREFREC, :NUMREC, :codvend, :DTOFIN, :rtfte, :RTIVA, :RTICA
    DO
    BEGIN
    SELECT TIDO_NOMCORTO FROM TIPO_DOCUMENTO WHERE TIDO_COD = :TIPO INTO :NOMTIPO;
    if (incdto = 'SI') then
        ABONO = ABONO + DTOFIN;
    if (COMISION = 'DOCUMENTO') then
        SELECT first 1 MVCL_FECHA, COBR_COD, MVCL_VENCE FROM MOVIMIENTO_CLIENTES WHERE MVCL_TIPOREF = :TIPO AND MVCL_IDREF = :ID
            INTO :FECDOC, :codvend, :VENCE;
    else
        SELECT first 1 MVCL_FECHA, MVCL_VENCE FROM MOVIMIENTO_CLIENTES WHERE MVCL_TIPOREF = :TIPO AND MVCL_IDREF = :ID
            INTO :FECDOC, :VENCE;
    if (FECDOC IS NOT NULL) then
        DIAS = FECREC - FECDOC;
    ELSE
        DIAS = 999;
    if (TIPO = 31) then
        SELECT PTVT_ID FROM FACTURAS WHERE FACT_ID = :ID INTO :puntovta;
    else if (TIPO = 33) then
        SELECT PTVT_ID FROM devoluciones_ventas WHERE DEVT_ID = :ID INTO :puntovta;
    else    
        PUNTOVTA = 0;
    if ((codvend >= :DESDE) AND (codvend <= :hasta)) then
        BEGIN
        select COBR_NOM from COBRADORES where COBR_COD = :codvend INTO :nomvend;
        /* TRAIGA EL PORCENTAJE DE ACUERDO A LOS DIAS */
        COMIPORC = 0;
        SELECT CMCB_PORC FROM COMISION_COBRO WHERE CMCB_DIASINI <= :dias AND CMCB_DIASFIN >= :DIAS AND COBR_COD = :CODVEND
            INTO :COMIPORC;
        if (COMIPORC IS NULL) THEN
            COMIPORC = 0;
        COMIDIAS = COMIPORC;
        if (VENTA = 'NO') then
            BEGIN
            if (ALFINAL = 'SI') then
                BEGIN
                EXECUTE PROCEDURE saldo_doc_cartera(:tipo, :ID, :FECREC, 0) returning_values (:SALDO);
                if (SALDO = 0) then
                    OK = 'S';
                else
                    OK = 'N';
                end
            else
                OK = 'S';
            if (TIPO = 31) then
                BEGIN
                if (DETALLE = 'N') then
                    SELECT MAX(FACT_TOTAL), MAX(FACT_IVAMONTO-FACT_DEC2799), SUM(FADE_CONSUMO) FROM FACTURAS F, FACTURAS_DETALLE D
                        WHERE F.FACT_ID = D.FACT_ID AND F.FACT_ID = :ID INTO :TOTAL, :IVAMONTO, :CONSUMO;
                ELSE
                    FOR SELECT D.ARTI_COD, FADE_CANT, FADE_TOTAL, FADE_IVAMONTO, FADE_CONSUMO, GRUP_COD, LIPR_COD, MARC_COD, ARTI_DES
                        FROM FACTURAS F, FACTURAS_DETALLE D, ARTICULO A
                        WHERE F.FACT_ID = D.FACT_ID AND D.arti_cod = A.arti_cod AND F.FACT_ID = :ID and substring(a.arti_cod from 1 FOR 2) <> '.t'
                        INTO :ARTICULO, :CANT, :TOTAL, :IVAMONTO, :CONSUMO, :CODGRP, :lista, :codmar, :artides
                        DO
                        BEGIN
                        if (comiart = 'GRUPO') then
                            SELECT GRUP_COMIPOR FROM GRUPO WHERE GRUP_COD = :codgrp INTO :comiporc;
                        if (comiart = 'MARCA') then
                            SELECT MARC_COMIPOR FROM MARCAS WHERE MARC_COD = :codmar INTO :comiporc;
                        if (comiart = 'PRECIO') then
                            SELECT PRAR_COMIC FROM precios_articulo WHERE ARTI_COD = :articulo AND LIPR_COD = :LISTA INTO :comiporc;

                        if (SITOT = 'SI') then
                            BASEAUX = TOTAL;
                        ELSE
                            begin
                            BASEAUX = TOTAL - IVAMONTO;
                            if (ICOINC <> 'SI') then
                                BASEAUX = BASEAUX - CONSUMO;
                            end
                        if (OK = 'S') then
                            begin
                            if (alfinal = 'SI') then
                                BASE = BASEAUX;
                            else
                                begin
                                /* calcula la proporcion del abono */
                                SELECT FACT_TOTAL FROM FACTURAS WHERE FACT_ID = :ID INTO :TOTAL;
                                if (TOTAL <> 0) then
                                    BASE = BASEAUX * (ABONO / TOTAL);
                                else
                                    BASE = 0;
                                end
                            end
                        else
                            BASE = 0;
                        if (comixvnd = 'SI') then
                            BEGIN                          
                            comiporc = comiporc * comidias / 100;
                            END
                        COMIMONTO = BASE / 100 * COMIPORC;
                        SUSPEND;
                        END
                END
            if (TIPO = 33) then
                if (DETALLE = 'N') then
                    SELECT MAX(DEVT_TOTAL*-1), MAX((DEVT_IVAMONTO-DEVT_DEC2799)*-1), SUM(DVDE_CONSUMO) FROM DEVOLUCIONES_VENTAS V, DEVOLUCIONES_VENTAS_DETALLE D
                        WHERE V.DEVT_ID = D.DEVT_ID AND V.DEVT_ID = :ID INTO :TOTAL, :IVAMONTO, :CONSUMO;
                ELSE
                    FOR SELECT D.ARTI_COD, DVDE_CANT, DVDE_TOTAL*-1, DVDE_IVAMONTO*-1, DVDE_CONSUMO*-1, GRUP_COD, DEVT_FACTID, MARC_COD, ARTI_DES
                        FROM DEVOLUCIONES_VENTAS V, DEVOLUCIONES_VENTAS_DETALLE D, ARTICULO A
                        WHERE V.DEVT_ID = D.DEVT_ID AND D.arti_cod = A.arti_cod AND V.DEVT_ID = :ID and substring(a.arti_cod from 1 FOR 2) <> '.t'
                        INTO :ARTICULO, :CANT, :TOTAL, :IVAMONTO, :CONSUMO, :codgrp, :IDF, :codmar, :artides
                        DO
                        BEGIN
                        if (comiart = 'GRUPO') then
                            SELECT GRUP_COMIPOR FROM GRUPO WHERE GRUP_COD = :codgrp INTO :comiporc;
                        if (comiart = 'MARCA') then
                            SELECT MARC_COMIPOR FROM MARCAS WHERE MARC_COD = :codmar INTO :comiporc;
                        if (comiart = 'PRECIO') then
                            BEGIN
                            LISTA = 0;
                            SELECT MAX(LIPR_COD) FROM facturas_detalle d WHERE ARTI_COD = :ARTICULO AND FACT_ID = :IDF INTO :LISTA;
                            if (LISTA = 0) then
                                LISTA = LISTAP;
                            SELECT PRAR_COMIC FROM precios_articulo WHERE ARTI_COD = :articulo AND LIPR_COD = :LISTA INTO :comiporc;
                            END
                        if (SITOT = 'SI') then
                            BASEAUX = TOTAL;
                        ELSE
                            begin
                            BASEAUX = TOTAL - IVAMONTO;
                            if (ICOINC <> 'SI') then
                                BASEAUX = BASEAUX - CONSUMO;
                            end
                        if (OK = 'S') then
                            begin
                            if (alfinal = 'SI') then
                                BASE = BASEAUX;
                            else
                                begin
                                /* calcula la proporcion del abono */
                                SELECT DEVT_TOTAL FROM DEVOLUCIONES_VENTAS WHERE DEVT_ID = :ID INTO :TOTAL;
                                if (TOTAL <> 0) then
                                    BASE = BASEAUX * (ABONO / TOTAL);
                                else
                                    BASE = 0;
                                end
                            end
                        else
                            BASE = 0;
                        if (comixvnd = 'SI') then
                            BEGIN                          
                            comiporc = comiporc * comidias / 100;
                            END
                        COMIMONTO = BASE / 100 * COMIPORC;
                        SUSPEND;
                        END
            if (TIPO = 41) then
                SELECT NDCL_MONTO, NDCL_IVAMONTO, 0 FROM NOTAS_DEBITO_CLIENTES WHERE NDCL_ID = :ID INTO :TOTAL, :IVAMONTO, :CONSUMO;
            if (TIPO = 42) then
                SELECT NCCL_MONTO*-1, NCCL_IVAMONTO*-1, 0 FROM NOTAS_CREDITO_CLIENTES WHERE NCCL_ID = :ID INTO :TOTAL, :IVAMONTO, :CONSUMO;
            if (TIPO = 45) then
                SELECT ANCL_BASE, ANCL_IVAMONTO, 0 FROM anticipos_cliente WHERE ANCL_ID = :ID INTO :TOTAL, :IVAMONTO, :CONSUMO;
            if (TIPO = 77) then
                if (INCCHE = 'SI') then
                    SELECT DVCH_MONTO, 0, 0 FROM DEVOLUCION_CHEQUES WHERE DVCH_ID = :ID INTO :TOTAL, :IVAMONTO, :CONSUMO;
                ELSE
                    BEGIN
                    TOTAL = 0;
                    IVAMONTO = 0;
                    CONSUMO = 0;
                    END
            if (SITOT = 'SI') then
                BASEAUX = ABONO;
            ELSE
                if (TOTAL <> 0) then
                    if (ICOINC <> 'SI') then
                        BASEAUX = (ABONO / TOTAL) * (TOTAL - IVAMONTO - CONSUMO);
                    else
                        BASEAUX = (ABONO / TOTAL) * (TOTAL - IVAMONTO);
                ELSE
                    BASEAUX = 0;
            BASE = BASEAUX;
            if ((univend = 'SI') AND (COMIART <> 'NO') AND (TIPO > 33))then
                SELECT FIRST 1 COMI_PORC FROM COMISIONES WHERE VEND_COD = :codvend ORDER BY COMI_ID INTO :comiporc;
            if (comixvnd = 'SI') then
                BEGIN
                comiporc = comiporc * comidias / 100;
                END

            COMIMONTO = BASE / 100 * COMIPORC;
            END
        ELSE
            BEGIN
            if (TIPO = 31) then
                if (DETALLE = 'N') then
                    SELECT MAX(FACT_TOTAL), MAX(FACT_IVAMONTO-FACT_DEC2799), MAX(FACT_COMIPORC), SUM(FADE_CONSUMO)
                        FROM FACTURAS F, FACTURAS_DETALLE D WHERE F.FACT_ID = D.FACT_ID AND F.FACT_ID = :ID
                        INTO :TOTAL, :IVAMONTO, :PORCV, :CONSUMO;
                ELSE
                    FOR SELECT D.ARTI_COD, FADE_CANT, FADE_TOTAL, FADE_IVAMONTO, FADE_CONSUMO, FACT_COMIPORC, GRUP_COD, MARC_COD, ARTI_DES
                        FROM FACTURAS F, FACTURAS_DETALLE D, ARTICULO A
                        WHERE F.FACT_ID = D.FACT_ID AND D.arti_cod = A.arti_cod AND F.FACT_ID = :ID and substring(a.arti_cod from 1 FOR 2) <> '.t'
                        INTO :ARTICULO, :CANT, :TOTAL, :IVAMONTO, :CONSUMO, :porcv, :codgrp, :codmar, :artides
                        DO
                        BEGIN
                        if (SITOT = 'SI') then
                            BASEAUX = TOTAL;
                        ELSE
                            begin
                            BASEAUX = TOTAL - IVAMONTO;
                            if (ICOINC <> 'SI') then
                                BASEAUX = BASEAUX - CONSUMO;
                            end
                        /* calcula la proporcion del abono */
                        SELECT FACT_TOTAL FROM FACTURAS WHERE FACT_ID = :ID INTO :TOTAL;
                        if (TOTAL <> 0) then
                            BASE = BASEAUX * (ABONO / TOTAL);
                        else
                            BASE = 0;
                        COMIV = BASE / 100 * PORCV;
                        COMIMONTO = COMIV / 100 * COMIPORC;
                        porcaux = comiporc;
                        comiporc = PORCV * COMIPORC / 100;
                        SUSPEND;
                        END
            if (TIPO = 33) then
                if (DETALLE = 'N') then
                    SELECT MAX(DEVT_TOTAL*-1), MAX((DEVT_IVAMONTO-DEVT_DEC2799)*-1), MAX(DEVT_COMIPORC*-1), SUM(DVDE_CONSUMO*-1)
                        FROM DEVOLUCIONES_VENTAS V, DEVOLUCIONES_VENTAS_DETALLE D WHERE V.DEVT_ID = D.DEVT_ID AND D.DEVT_ID = :ID
                        INTO :TOTAL, :IVAMONTO, :PORCV, :CONSUMO;
                ELSE
                    FOR SELECT D.ARTI_COD, DVDE_CANT, DVDE_TOTAL*-1, DVDE_IVAMONTO*-1, DVDE_CONSUMO*-1, DEVT_COMIPORC, GRUP_COD, MARC_COD, ARTI_DES
                        FROM DEVOLUCIONES_VENTAS V, DEVOLUCIONES_VENTAS_DETALLE D, ARTICULO A
                        WHERE V.DEVT_ID = D.DEVT_ID AND D.arti_cod = A.arti_cod AND V.DEVT_ID = :ID and substring(a.arti_cod from 1 FOR 2) <> '.t'
                        INTO :ARTICULO, :CANT, :TOTAL, :IVAMONTO, :CONSUMO, :porcv, :codgrp, :codmar, :artides
                        DO
                        BEGIN
                        if (SITOT = 'SI') then
                            BASEAUX = TOTAL;
                        ELSE
                            begin
                            BASEAUX = TOTAL - IVAMONTO;
                            if (ICOINC <> 'SI') then
                                BASEAUX = BASEAUX - CONSUMO;
                            end
                        /* calcula la proporcion del abono */
                        SELECT DEVT_TOTAL FROM DEVOLUCIONES_VENTAS WHERE DEVT_ID = :ID INTO :TOTAL;
                        if (TOTAL <> 0) then
                            BASE = BASEAUX * (ABONO / TOTAL);
                        else
                            BASE = 0;
                        COMIV = BASE / 100 * PORCV;
                        COMIMONTO = COMIV / 100 * COMIPORC;
                        porcaux = comiporc;
                        comiporc = PORCV * COMIPORC / 100;
                        SUSPEND;
                        END
            if (TIPO = 41) then
                SELECT NDCL_MONTO, NDCL_IVAMONTO, NDCL_COMIPORC, 0 FROM NOTAS_DEBITO_CLIENTES
                    WHERE NDCL_ID = :ID INTO :TOTAL, :IVAMONTO, :PORCV, :CONSUMO;
            if (TIPO = 42) then
                SELECT NCCL_MONTO, NCCL_IVAMONTO, NCCL_COMIPORC, 0  FROM NOTAS_CREDITO_CLIENTES
                    WHERE NCCL_ID = :ID INTO :TOTAL, :IVAMONTO, :PORCV, :CONSUMO;
            if (TIPO = 45) then
                SELECT ANCL_BASE, ANCL_IVAMONTO, 0 FROM anticipos_cliente WHERE ANCL_ID = :ID INTO :TOTAL, :IVAMONTO, :CONSUMO;
            if (TIPO = 77) then
                if (INCCHE = 'SI') then
                    SELECT DVCH_MONTO, 0, 0, 0 FROM DEVOLUCION_CHEQUES WHERE DVCH_ID = :ID INTO :TOTAL, :IVAMONTO, :PORCV, :CONSUMO;
                ELSE
                    BEGIN
                    TOTAL = 0;
                    IVAMONTO = 0;
                    CONSUMO = 0;
                    PORCV = 0;
                    END
            if (SITOT = 'SI') then
                BASEAUX = ABONO;
            ELSE
                if ((total <> 0) AND (ABONO <> 0)) then
                    if (ICOINC <> 'SI') then
                        BASEAUX = (TOTAL - IVAMONTO - CONSUMO) / TOTAL * ABONO;
                    else
                        BASEAUX = (TOTAL - IVAMONTO) / TOTAL * ABONO;
                ELSE
                    BASEAUX = 0;
            COMIV = BASEAUX / 100 * PORCV;
            COMIMONTO = COMIV / 100 * COMIPORC;
            porcaux = comiporc;
            comiporc = PORCV * COMIPORC / 100;
            BASE = BASEAUX;
            END
        if (DETALLE = 'N') then
            if (ALFINAL = 'SI') then
                BEGIN
                /* VERIFIQUE EL SALDO DEL DOCUMENTO, SI ES CERO LIQUIDE COMISION SOBRE EL TOTAL */
                EXECUTE PROCEDURE saldo_doc_cartera(:tipo, :ID, :FECREC, 0) returning_values (:SALDO);
                if (SALDO = 0) then
                    BEGIN
                    if (VENTA = 'NO') then
                        begin
                        if (SITOT = 'SI') then
                            BASEAUX = TOTAL;
                        ELSE
                            if (ICOINC <> 'SI') then
                                BASEAUX = TOTAL - IVAMONTO - CONSUMO;
                            else
                                BASEAUX = TOTAL - IVAMONTO;
                        COMIMONTO = BASEAUX * COMIPORC / 100;
                        end
                    ELSE
                        BEGIN
                        if (SITOT = 'SI') then
                            BASEAUX = TOTAL;
                        ELSE
                            begin
                            BASEAUX = TOTAL - IVAMONTO;
                            if (ICOINC <> 'SI') then
                                BASEAUX = BASEAUX - CONSUMO;
                            end
                        COMIV = PORCV * BASEAUX / 100;
                        COMIMONTO = COMIV / 100 * porcaux;
                        comiporc = PORCV * porcaux / 100;
                        END
                    BASE = BASEAUX;
                    SUSPEND;
                    END
                END
            ELSE
                SUSPEND;
        ELSE
            if ((TIPO <> 31) AND (TIPO <> 33)) then
                SUSPEND;
        END
    END
FOR SELECT EGCC_TIPODOC, EGCC_IDDOC, EGCC_PREFIJO, EGCC_NUMERO, E.TERC_NIT, TERC_NOM, EGRE_FECHA, (EGCC_ABONO+EGCC_RTFTE+EGCC_RTIVA+EGCC_RTICA), PREF_PRE, EGRE_NUMERO, EGCC_SUCURSAL, EGCC_DTOF
    FROM EGRESOS E, EGRESOS_CRUCEC C, TERCEROS T
    WHERE E.EGRE_ID = C.EGRE_ID AND EGRE_FECHA >= :FECINI AND EGRE_FECHA <= :FECFIN AND E.TERC_NIT = T.TERC_NIT AND EGRE_ANULADO = 'N'
    ORDER BY TERC_NIT, EGRE_FECHA
    INTO :TIPO, :ID, :PREFIJO, :NUMERO, :NIT, :CLIENTE, :FECREC, :ABONO, :PREFREC, :NUMREC, :SUCURSAL, :dtofin
    DO
    BEGIN
    SELECT COBR_COD FROM cliente_sucursales WHERE TERC_NIT = :NIT AND CLCU_COD = :sucursal INTO :codvend;
    SELECT TIDO_NOMCORTO FROM TIPO_DOCUMENTO WHERE TIDO_COD = :TIPO INTO :NOMTIPO;
    if (incdto = 'SI') then
        ABONO = ABONO + DTOFIN;
    if (COMISION = 'DOCUMENTO') then
        SELECT MVCL_FECHA, COBR_COD FROM MOVIMIENTO_CLIENTES WHERE MVCL_TIPOREF = :TIPO AND MVCL_IDREF = :ID
            INTO :FECDOC, :codvend;
    else
        SELECT MVCL_FECHA FROM MOVIMIENTO_CLIENTES WHERE MVCL_TIPOREF = :TIPO AND MVCL_IDREF = :ID
            INTO :FECDOC;
    if (FECDOC IS NOT NULL) then
        DIAS = FECREC - FECDOC;
    ELSE
        DIAS = 999;
    if (TIPO = 31) then
        SELECT PTVT_ID FROM FACTURAS WHERE FACT_ID = :ID INTO :puntovta;
    else if (TIPO = 33) then
        SELECT PTVT_ID FROM devoluciones_ventas WHERE DEVT_ID = :ID INTO :puntovta;
    else    
        PUNTOVTA = 0;
    if ((codvend >= :DESDE) AND (codvend <= :hasta)) then
        BEGIN
        select COBR_NOM from COBRADORES where COBR_COD = :codvend INTO :nomvend;
        /* TRAIGA EL PORCENTAJE DE ACUERDO A LOS DIAS */
        COMIPORC = 0;
        SELECT CMCB_PORC FROM COMISION_COBRO WHERE CMCB_DIASINI <= :dias AND CMCB_DIASFIN >= :DIAS AND COBR_COD = :CODVEND INTO :COMIPORC;
        if (COMIPORC IS NULL) THEN
            COMIPORC = 0;
        COMIDIAS = COMIPORC;
        if (VENTA = 'NO') then
            BEGIN
            if (ALFINAL = 'SI') then
                BEGIN
                EXECUTE PROCEDURE saldo_doc_cartera(:tipo, :ID, :FECREC, 0) returning_values (:SALDO);
                if (SALDO = 0) then
                    OK = 'S';
                else
                    OK = 'N';
                end
            else
                OK = 'S';
            if (TIPO = 31) then
                BEGIN
                if (DETALLE = 'N') then
                    SELECT MAX(FACT_TOTAL), MAX(FACT_IVAMONTO-FACT_DEC2799), SUM(FADE_CONSUMO) FROM FACTURAS F, FACTURAS_DETALLE D
                        WHERE F.FACT_ID = D.FACT_ID AND F.FACT_ID = :ID INTO :TOTAL, :IVAMONTO, :CONSUMO;
                ELSE
                    FOR SELECT D.ARTI_COD, FADE_CANT, FADE_TOTAL, FADE_IVAMONTO, FADE_CONSUMO, GRUP_COD, LIPR_COD, MARC_COD, ARTI_DES
                        FROM FACTURAS F, FACTURAS_DETALLE D, ARTICULO A
                        WHERE F.FACT_ID = D.FACT_ID AND D.arti_cod = A.arti_cod AND F.FACT_ID = :ID and substring(a.arti_cod from 1 FOR 2) <> '.t'
                        INTO :ARTICULO, :CANT, :TOTAL, :IVAMONTO, :CONSUMO, :CODGRP, :LISTA, :codmar, :artides
                        DO
                        BEGIN
                        if (comiart = 'GRUPO') then
                            SELECT GRUP_COMIPOR FROM GRUPO WHERE GRUP_COD = :codgrp INTO :comiporc;
                        if (comiart = 'MARCA') then
                            SELECT MARC_COMIPOR FROM MARCAS WHERE MARC_COD = :codmar INTO :comiporc;
                        if (comiart = 'PRECIO') then
                            SELECT PRAR_COMIC FROM precios_articulo WHERE ARTI_COD = :articulo AND LIPR_COD = :LISTA INTO :comiporc;

                        if (SITOT = 'SI') then
                            BASEAUX = TOTAL;
                        ELSE
                            begin
                            BASEAUX = TOTAL - IVAMONTO;
                            if (ICOINC <> 'SI') then
                                BASEAUX = BASEAUX - CONSUMO;
                            end
                        if (OK = 'S') then
                            begin
                            if (alfinal = 'SI') then
                                BASE = BASEAUX;
                            else
                                begin
                                /* calcula la proporcion del abono */
                                SELECT FACT_TOTAL FROM FACTURAS WHERE FACT_ID = :ID INTO :TOTAL;
                                if (TOTAL <> 0) then
                                    BASE = BASEAUX * (ABONO / TOTAL);
                                else
                                    BASE = 0;
                                end
                            end
                        else
                            BASE = 0;
                        if (comixvnd = 'SI') then
                            BEGIN                          
                            comiporc = comiporc * comidias / 100;
                            END
                        COMIMONTO = BASE / 100 * COMIPORC;
                        SUSPEND;
                        END
                END
            if (TIPO = 33) then
                if (DETALLE = 'N') then
                    SELECT MAX(DEVT_TOTAL*-1), MAX((DEVT_IVAMONTO-DEVT_DEC2799)*-1), SUM(DVDE_CONSUMO) FROM DEVOLUCIONES_VENTAS V, DEVOLUCIONES_VENTAS_DETALLE D
                        WHERE V.DEVT_ID = D.DEVT_ID AND V.DEVT_ID = :ID INTO :TOTAL, :IVAMONTO, :CONSUMO;
                ELSE
                    FOR SELECT D.ARTI_COD, DVDE_CANT, DVDE_TOTAL*-1, DVDE_IVAMONTO*-1, DVDE_CONSUMO*-1, GRUP_COD, DEVT_FACTID, MARC_COD, ARTI_DES
                        FROM DEVOLUCIONES_VENTAS V, DEVOLUCIONES_VENTAS_DETALLE D, ARTICULO A
                        WHERE V.DEVT_ID = D.DEVT_ID AND D.arti_cod = A.arti_cod AND V.DEVT_ID = :ID and substring(a.arti_cod from 1 FOR 2) <> '.t'
                        INTO :ARTICULO, :CANT, :TOTAL, :IVAMONTO, :CONSUMO, :codgrp, :IDF, :codmar, :artides
                        DO
                        BEGIN
                        if (comiart = 'GRUPO') then
                            SELECT GRUP_COMIPOR FROM GRUPO WHERE GRUP_COD = :codgrp INTO :comiporc;
                        if (comiart = 'MARCA') then
                            SELECT MARC_COMIPOR FROM MARCAS WHERE MARC_COD = :codmar INTO :comiporc;
                        if (comiart = 'PRECIO') then
                            BEGIN
                            LISTA = 0;
                            SELECT MAX(LIPR_COD) FROM facturas_detalle d WHERE ARTI_COD = :ARTICULO AND FACT_ID = :IDF INTO :LISTA;
                            if (LISTA = 0) then
                                LISTA = LISTAP;
                            SELECT PRAR_COMIC FROM precios_articulo WHERE ARTI_COD = :articulo AND LIPR_COD = :LISTA INTO :comiporc;
                            END
                        if (SITOT = 'SI') then
                            BASEAUX = TOTAL;
                        ELSE
                            begin
                            BASEAUX = TOTAL - IVAMONTO;
                            if (ICOINC <> 'SI') then
                                BASEAUX = BASEAUX - CONSUMO;
                            end
                        if (OK = 'S') then
                            begin
                            if (alfinal = 'SI') then
                                BASE = BASEAUX;
                            else
                                begin
                                /* calcula la proporcion del abono */
                                SELECT DEVT_TOTAL FROM DEVOLUCIONES_VENTAS WHERE DEVT_ID = :ID INTO :TOTAL;
                                if (TOTAL <> 0) then
                                    BASE = BASEAUX * (ABONO / TOTAL);
                                else
                                    BASE = 0;
                                end
                            end
                        else
                            BASE = 0;
                        if (comixvnd = 'SI') then
                            BEGIN                          
                            comiporc = comiporc * comidias / 100;
                            END
                        COMIMONTO = BASE / 100 * COMIPORC;
                        SUSPEND;
                        END
            if (TIPO = 41) then
                SELECT NDCL_MONTO, NDCL_IVAMONTO, 0 FROM NOTAS_DEBITO_CLIENTES WHERE NDCL_ID = :ID INTO :TOTAL, :IVAMONTO, :CONSUMO;
            if (TIPO = 42) then
                SELECT NCCL_MONTO*-1, NCCL_IVAMONTO*-1, 0 FROM NOTAS_CREDITO_CLIENTES WHERE NCCL_ID = :ID INTO :TOTAL, :IVAMONTO, :CONSUMO;
            if (TIPO = 45) then
                SELECT ANCL_BASE, ANCL_IVAMONTO, 0 FROM anticipos_cliente WHERE ANCL_ID = :ID INTO :TOTAL, :IVAMONTO, :CONSUMO;
            if (TIPO = 77) then
                if (INCCHE = 'SI') then
                    SELECT DVCH_MONTO, 0, 0 FROM DEVOLUCION_CHEQUES WHERE DVCH_ID = :ID INTO :TOTAL, :IVAMONTO, :CONSUMO;
                ELSE
                    BEGIN
                    TOTAL = 0;
                    IVAMONTO = 0;
                    CONSUMO = 0;
                    END
            if (SITOT = 'SI') then
                BASEAUX = ABONO;
            ELSE
                if (TOTAL <> 0) then
                    if (ICOINC <> 'SI') then
                        BASEAUX = (ABONO / TOTAL) * (TOTAL - IVAMONTO - CONSUMO);
                    else
                        BASEAUX = (ABONO / TOTAL) * (TOTAL - IVAMONTO);
                ELSE
                    BASEAUX = 0;
            BASE = BASEAUX;
            if ((univend = 'SI') AND (TIPO > 33))then
                SELECT FIRST 1 COMI_PORC FROM COMISIONES WHERE VEND_COD = :codvend ORDER BY COMI_ID INTO :comiporc;
            if (comixvnd = 'SI') then
                BEGIN
                comiporc = comiporc * comidias / 100;
                END
            COMIMONTO = BASE / 100 * COMIPORC;
            END
        ELSE
            BEGIN
            if (TIPO = 31) then
                if (DETALLE = 'N') then
                    SELECT MAX(FACT_TOTAL), MAX(FACT_IVAMONTO-FACT_DEC2799), MAX(FACT_COMIPORC), SUM(FADE_CONSUMO)
                        FROM FACTURAS F, FACTURAS_DETALLE D WHERE F.FACT_ID = D.FACT_ID AND F.FACT_ID = :ID
                        INTO :TOTAL, :IVAMONTO, :PORCV, :CONSUMO;
                ELSE
                    FOR SELECT D.ARTI_COD, FADE_CANT, FADE_TOTAL, FADE_IVAMONTO, FADE_CONSUMO, FACT_COMIPORC, GRUP_COD, MARC_COD, ARTI_DES
                        FROM FACTURAS F, FACTURAS_DETALLE D, ARTICULO A
                        WHERE F.FACT_ID = D.FACT_ID AND D.arti_cod = A.arti_cod AND F.FACT_ID = :ID and substring(a.arti_cod from 1 FOR 2) <> '.t'
                        INTO :ARTICULO, :CANT, :TOTAL, :IVAMONTO, :CONSUMO, :porcv, :codgrp, :codmar, :artides
                        DO
                        BEGIN
                        if (SITOT = 'SI') then
                            BASEAUX = TOTAL;
                        ELSE
                            begin
                            BASEAUX = TOTAL - IVAMONTO;
                            if (ICOINC <> 'SI') then
                                BASEAUX = BASEAUX - CONSUMO;
                            end
                        /* calcula la proporcion del abono */
                        SELECT FACT_TOTAL FROM FACTURAS WHERE FACT_ID = :ID INTO :TOTAL;
                        if (TOTAL <> 0) then
                            BASE = BASEAUX * (ABONO / TOTAL);
                        else
                            BASE = 0;
                        COMIV = BASE / 100 * PORCV;
                        COMIMONTO = COMIV / 100 * COMIPORC;
                        porcaux = comiporc;
                        comiporc = PORCV * COMIPORC / 100;
                        SUSPEND;
                        END
            if (TIPO = 33) then
                if (DETALLE = 'N') then
                    SELECT MAX(DEVT_TOTAL*-1), MAX((DEVT_IVAMONTO-DEVT_DEC2799)*-1), MAX(DEVT_COMIPORC*-1), SUM(DVDE_CONSUMO*-1)
                        FROM DEVOLUCIONES_VENTAS V, DEVOLUCIONES_VENTAS_DETALLE D WHERE V.DEVT_ID = D.DEVT_ID AND D.DEVT_ID = :ID
                        INTO :TOTAL, :IVAMONTO, :PORCV, :CONSUMO;
                ELSE
                    FOR SELECT D.ARTI_COD, DVDE_CANT, DVDE_TOTAL*-1, DVDE_IVAMONTO*-1, DVDE_CONSUMO*-1, DEVT_COMIPORC, GRUP_COD, MARC_COD, ARTI_DES
                        FROM DEVOLUCIONES_VENTAS V, DEVOLUCIONES_VENTAS_DETALLE D, ARTICULO A
                        WHERE V.DEVT_ID = D.DEVT_ID AND D.arti_cod = A.arti_cod AND V.DEVT_ID = :ID and substring(a.arti_cod from 1 FOR 2) <> '.t'
                        INTO :ARTICULO, :CANT, :TOTAL, :IVAMONTO, :CONSUMO, :porcv, :codgrp, :codmar, :artides
                        DO
                        BEGIN
                        if (SITOT = 'SI') then
                            BASEAUX = TOTAL;
                        ELSE
                            begin
                            BASEAUX = TOTAL - IVAMONTO;
                            if (ICOINC <> 'SI') then
                                BASEAUX = BASEAUX - CONSUMO;
                            end
                        /* calcula la proporcion del abono */
                        SELECT DEVT_TOTAL FROM DEVOLUCIONES_VENTAS WHERE DEVT_ID = :ID INTO :TOTAL;
                        if (TOTAL <> 0) then
                            BASE = BASEAUX * (ABONO / TOTAL);
                        else
                            BASE = 0;
                        COMIV = BASE / 100 * PORCV;
                        COMIMONTO = COMIV / 100 * COMIPORC;
                        porcaux = comiporc;
                        comiporc = PORCV * COMIPORC / 100;
                        SUSPEND;
                        END
            if (TIPO = 41) then
                SELECT NDCL_MONTO, NDCL_IVAMONTO, NDCL_COMIPORC, 0 FROM NOTAS_DEBITO_CLIENTES
                    WHERE NDCL_ID = :ID INTO :TOTAL, :IVAMONTO, :PORCV, :CONSUMO;
            if (TIPO = 42) then
                SELECT NCCL_MONTO, NCCL_IVAMONTO, NCCL_COMIPORC, 0  FROM NOTAS_CREDITO_CLIENTES
                    WHERE NCCL_ID = :ID INTO :TOTAL, :IVAMONTO, :PORCV, :CONSUMO;
            if (TIPO = 45) then
                SELECT ANCL_BASE, ANCL_IVAMONTO, 0 FROM anticipos_cliente WHERE ANCL_ID = :ID INTO :TOTAL, :IVAMONTO, :CONSUMO;
            if (TIPO = 77) then
                if (incche = 'SI') then
                    SELECT DVCH_MONTO, 0, 0, 0 FROM DEVOLUCION_CHEQUES WHERE DVCH_ID = :ID INTO :TOTAL, :IVAMONTO, :PORCV, :CONSUMO;
                ELSE
                    BEGIN
                    TOTAL = 0;
                    IVAMONTO = 0;
                    CONSUMO = 0;
                    PORCV = 0;
                    END
            if (SITOT = 'SI') then
                BASEAUX = ABONO;
            ELSE
                if ((total <> 0) AND (ABONO <> 0)) then
                    if (ICOINC <> 'SI') then
                        BASEAUX = (TOTAL - IVAMONTO - CONSUMO) / TOTAL * ABONO;
                    else
                        BASEAUX = (TOTAL - IVAMONTO) / TOTAL * ABONO;
                ELSE
                    BASEAUX = 0;
            COMIV = BASEAUX / 100 * PORCV;
            COMIMONTO = COMIV / 100 * COMIPORC;
            porcaux = comiporc;
            comiporc = PORCV * COMIPORC / 100;
            BASE = BASEAUX;
            END
        if (DETALLE = 'N') then
            if (ALFINAL = 'SI') then
                BEGIN
                /* VERIFIQUE EL SALDO DEL DOCUMENTO, SI ES CERO LIQUIDE COMISION SOBRE EL TOTAL */
                EXECUTE PROCEDURE saldo_doc_cartera(:tipo, :ID, :FECREC, 0) returning_values (:SALDO);
                if (SALDO = 0) then
                    BEGIN
                    if (VENTA = 'NO') then
                        begin
                        if (SITOT = 'SI') then
                            BASEAUX = TOTAL;
                        ELSE
                            begin
                            BASEAUX = TOTAL - IVAMONTO;
                            if (ICOINC <> 'SI') then
                                BASEAUX = BASEAUX - CONSUMO;
                            end
                        COMIMONTO = BASEAUX * COMIPORC / 100;
                        end
                    ELSE
                        BEGIN
                        if (SITOT = 'SI') then
                            BASEAUX = TOTAL;
                        ELSE
                            begin
                            BASEAUX = TOTAL - IVAMONTO;
                            if (ICOINC <> 'SI') then
                                BASEAUX = BASEAUX - CONSUMO;
                            end
                        COMIV = PORCV * BASEAUX / 100;
                        COMIMONTO = COMIV / 100 * porcaux;
                        comiporc = PORCV * porcaux / 100;
                        END
                    BASE = BASEAUX;
                    SUSPEND;
                    END
                END
            ELSE
                SUSPEND;
        ELSE
            if ((TIPO <> 31) AND (TIPO <> 33)) then
                SUSPEND;
        END
    END
FOR SELECT 'DEVOCHEQ', DVCH_MONTO*-1, DVCH_FECHA, PRBA_PREF, DVCH_NUMDOC, DVCH_FECHA, D.TERC_NIT, DVCH_NOMTERC, '', '', D.COBR_COD
    FROM DEVOLUCION_CHEQUES D, CLIENTES C
    WHERE DVCH_FECHA >= :FECINI AND DVCH_FECHA <= :FECFIN AND D.TERC_NIT = C.TERC_NIT AND D.COBR_COD = :CODVEND
    INTO :NOMTIPO, :BASE, :FECDOC, :PREFIJO, :NUMERO, :FECREC, :NIT, :CLIENTE, :PREFREC, :NUMREC, :codvend
    DO
    BEGIN
    COMIPORC = 0;
    COMIMONTO = 0;
    VENCE = fecdoc;
    RTFTE = 0;
    RTIVA = 0;
    RTICA = 0;
    DTOFIN = 0;
    puntovta = 0;
    if ((codvend >= :DESDE) AND (codvend <= :hasta)) then
        BEGIN
        select COBR_NOM from COBRADORES where COBR_COD = :codvend INTO :nomvend;
        /* SELECT CMCB_PORC FROM COMISION_COBRO WHERE CMCB_DIASINI <= 1 AND CMCB_DIASFIN >= 1 AND COBR_COD = :CODVEND INTO :COMIPORC;
        if (COMIPORC IS NULL) THEN
            COMIPORC = 0;
        COMIMONTO = BASE * COMIPORC / 100; */
        SUSPEND;
        END
    END
END^

SET TERM ; ^

/* 20140114 */
/* SI HAY NUMERO DE PEDIDO VERIFIQUE QUE SEA DE MAS DE 6 DIGITOS PARA BUSCAR LA COTIZACION, DA ERROR SUBSTRING */
SET TERM ^ ;

CREATE OR ALTER procedure IMPR_FACTURA (
    ID integer)
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);
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_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
    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,
    :OBS, :VEHICULO,/* :NROCOPIA,*/ :RECIBIDO, :SUCUR, :paciente, :nompaciente, :nomcliente, :ANULADO, :anticipo, :retgarantia, :factenc, :FECINI, :FECFIN;

/* 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 */
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;
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
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, SUBSTR(FADE_DESC,1,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 = SUMA1 + SUMA2 + SUMA3 + SUMA4 + 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
            SUSPEND;
            END
          END
    END
ELSE
  if (ORDENCOD = 'UNIDAD') then
    BEGIN
    FOR SELECT FADE_ITEM, D.ARTI_COD, FADE_CODBAR, SUBSTR(FADE_DESC,1,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 = SUMA1 + SUMA2 + SUMA3 + SUMA4 + 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
            SUSPEND;
            END
          END
    END
  ELSE
    if (ORDENCOD = 'STAND') then
      BEGIN
      FOR SELECT FADE_ITEM, D.ARTI_COD, FADE_CODBAR, SUBSTR(FADE_DESC,1,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 = SUMA1 + SUMA2 + SUMA3 + SUMA4 + 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
                SUSPEND;
                END
              END
      END
    ELSE
        BEGIN
        FOR SELECT FADE_ITEM, D.ARTI_COD, FADE_CODBAR, SUBSTR(FADE_DESC,1,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 = SUMA1 + SUMA2 + SUMA3 + SUMA4 + 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
                SUSPEND;
                END
              END
        END
END^

SET TERM ; ^

/* 20140116 */
/* CAMBIE EL NOMBRE DE ERROR POR ERRORINT PARA EVITAR ERRORES EN FIREBIRD2.1.5 */
SET TERM ^ ;

create or alter procedure ERRORINT (
    TIPODOC integer,
    IDDOC integer,
    CADENA varchar(20),
    ERRORS integer)
AS
declare variable CONC VARCHAR(30);
begin
if (errors = 1) then
    CONC = 'INTERFAZ NO EXISTE';
if (errors = 2) then
    CONC = 'CTA NO EXISTE/AFECTA';
if (errors = 3) then
    CONC = 'CUENTA DE INVENTARIO';
if (errors = 4) then
    CONC = 'CUENTA DE CARTERA';
INSERT INTO  ERRORES (ERRO_ITEM, ERRO_TIPODOC, ERRO_IDDOC, ERRO_CODIGO, ERRO_CANT, ERRO_CADENA)
    VALUES(GEN_ID(id_errores, 1), :TIPODOC, :IDDOC, :CONC, 0, :CADENA);
end^

SET TERM ; ^

GRANT EXECUTE ON PROCEDURE ERRORINT TO PUBLIC;

SET TERM ^ ;

CREATE OR ALTER procedure CONTABIL_AJUSTE (
    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 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 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, 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
    DELETE FROM contabilizacion WHERE CNTB_TIPOREF = 14 AND CNTB_IDREF = :IDDOC;

    /* TRAIGA EL ENCABEZADO DEL AJUSTE */
    SELECT PREF_PRE, AJUS_NUMERO, AJUS_FECHA, AJUS_CONC, AJUS_ANULADO
        FROM AJUSTES
        WHERE AJUS_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, 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;
        /* 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, '', 14, :IDDOC, :PREFIJO, :NUMERO, 'N');
        NUMITEMS = 0;
        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 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
                    VRBASE = MONTO;
                    /* TRAIGA LAS CARACTERISTICAS DE LA CUENTA */
                    SELECT CUEN_COD, CUEN_TERCERO, CUEN_CENTRO, CUEN_TIPO
                        FROM CUENTAS
                        WHERE CUEN_COD = :CTABASE
                        INTO :CUENTA, :ES_TERCERO, :ES_CENTRO, :TIPOCUEN;
                    if (CUENTA IS NULL) then
                        begin
                        EXECUTE PROCEDURE ERRORINT (14, :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 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 (14, :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 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
                    VRBASE = MONTO;
                    /* TRAIGA LAS CARACTERISTICAS DE LA CUENTA */
                    SELECT CUEN_COD, CUEN_TERCERO, CUEN_CENTRO, CUEN_TIPO
                        FROM CUENTAS
                        WHERE CUEN_COD = :CTABASE
                        INTO :CUENTA, :ES_TERCERO, :ES_CENTRO, :TIPOCUEN;
                    if (CUENTA IS NULL) then
                        begin
                        EXECUTE PROCEDURE ERRORINT (14, :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 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 (14, :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
                    WHERE CUEN_COD = :CTABASE
                    INTO :CUENTA, :ES_TERCERO, :ES_CENTRO, :TIPOCUEN;
                if (CUENTA IS NULL) then
                    begin
                    EXECUTE PROCEDURE ERRORINT (14, :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 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 (14, :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
                    WHERE CUEN_COD = :CTABASE
                    INTO :CUENTA, :ES_TERCERO, :ES_CENTRO, :TIPOCUEN;
                if (CUENTA IS NULL) then
                    begin
                    EXECUTE PROCEDURE ERRORINT (14, :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 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 (14, :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
                    WHERE CUEN_COD = :CUENTAADIC
                    INTO :CUENTA, :ES_TERCERO, :ES_CENTRO, :TIPOCUEN;
                if (CUENTA IS NULL) then
                    begin
                    EXECUTE PROCEDURE ERRORINT (14, :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 (14, :IDDOC, :CUENTA, 3);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    EXECUTE PROCEDURE ERRORINT (14, :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
                WHERE CUEN_COD = :CTACIERRE
                INTO :CUENTA, :ES_TERCERO, :ES_CENTRO, :TIPOCUEN;
            if (CUENTA IS NULL) then
                begin
                EXECUTE PROCEDURE ERRORINT (14, :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 (14, :IDDOC, :CUENTA, 3);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                EXECUTE PROCEDURE ERRORINT (14, :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 (14, :IDDOC, :PREFIJO, 1);
    ERROR = ERROR + 1;
    VER = 'S';
    END
SUSPEND;
END^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER procedure CONTABIL_APLICACL (
    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 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 TIPOCOMP VARCHAR(3);
declare variable PREFCONT VARCHAR(4);
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', TICO_COD, PRCO_PRE, INCA_BASE, INCA_CLIE, INCA_CTABASE, INCA_CTACLIE, INCA_CONFIRMAR
    FROM INTERFAZ_CARTERA
    WHERE INCA_ID = :IDINTER
    INTO :EXISTE, :TIPOCOMP, :PREFCONT, :BASE, :CLIE, :CTABASE, :CTACLIE, :VER;
if (EXISTE = 'S') then
    BEGIN
    /* BORRE CUALQUEIR CONTABILIZACION PREVIA */
    DELETE FROM CONTABILIZACION WHERE CNTB_TIPOREF = 43 AND CNTB_IDREF = :IDDOC;
    /* 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;
        /* REGISTRE EL ENCABEZADO CONTABLE */
        IDC = GEN_ID(ID_CONTABILIZA, 1);
        INSERT INTO CONTABILIZACION (CNTB_ID, CNTB_TIPOCOMP, CNTB_PREFCNT, CNTB_NUMERO, CNTB_FECHA, CNTB_CONCEPTO, CNTB_REF, CNTB_TIPOREF, CNTB_IDREF, CNTB_PREFREF, CNTB_NUMREF, CNTB_PROCESADO)
            VALUES (:IDC, :TIPOCOMP, :PREFCONT, :NUM, :FECHA, :CONC, '', 43, :IDDOC, :PREF, :NUM, 'N');
        NROI = 0;
        ERROR = 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
                        WHERE CUEN_COD = :CTABASE INTO :CUENTA, :TIPOCUEN;
                    if (CUENTA IS NULL) then
                        begin
                        EXECUTE PROCEDURE ERRORINT(43, :IDDOC, :CTABASE, 2);
                        CUENTA = CTABASE;
                        TIPOCUEN = 'N';
                        ERROR = ERROR + 1;
                        end
                    if (TIPOCUEN = 'I') then
                        BEGIN
                        EXECUTE PROCEDURE ERRORINT(43, :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, :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
                    WHERE CUEN_COD = :CTACLIE INTO :CUENTA, :TIPOCUEN;
                IF (CUENTA IS NULL) then
                    begin
                    EXECUTE PROCEDURE ERRORINT(43, :IDDOC, :CTACLIE, 2);
                    CUENTA = CTACLIE;
                    ERROR = ERROR + 1;
                    end
                if (TIPOCUEN = 'I') then
                    BEGIN
                    EXECUTE PROCEDURE ERRORINT(43, :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, :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 (ERROR > 0) then
        VER = 'S';
    SUSPEND;
    END
ELSE
    BEGIN
    EXECUTE PROCEDURE ERRORINT(43, :IDDOC, :PREF, 1);
    ERROR = ERROR + 1;
    VER = 'S';
    SUSPEND;
    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 ^ ;

CREATE OR ALTER procedure CONTABIL_APLICAPR (
    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 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 TIPOCOMP VARCHAR(3);
declare variable PREFCONT VARCHAR(4);
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);
ERROR = 0;
/* BUSQUE LA INTERFACE */
EXISTE = 'N';
SELECT 'S', TICO_COD, PRCO_PRE, INCP_BASE, INCP_PROV, INCP_CTABASE, INCP_CTAPROV, INCP_CONFIRMAR
  FROM INTERFAZ_CXPAGAR
  WHERE INCP_ID = :IDINTER
  INTO :EXISTE, :TIPOCOMP, :PREFCONT, :BASE, :CLIE, :CTABASE, :CTACLIE, :VER;

if (EXISTE = 'S') then
  BEGIN
  /* BORRE CUALQUEIR CONTABILIZACION PREVIA */
  DELETE FROM CONTABILIZACION WHERE CNTB_TIPOREF = 53 AND CNTB_IDREF = :IDDOC;
  /* 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);

    /* REGISTRE EL ENCABEZADO CONTABLE */
    IDC = GEN_ID(ID_CONTABILIZA, 1);
    INSERT INTO CONTABILIZACION (CNTB_ID, CNTB_TIPOCOMP, CNTB_PREFCNT, CNTB_NUMERO, CNTB_FECHA, CNTB_CONCEPTO, CNTB_REF, CNTB_TIPOREF, CNTB_IDREF, CNTB_PREFREF, CNTB_NUMREF, CNTB_PROCESADO)
        VALUES (:IDC, :TIPOCOMP, :PREFCONT, :NUM, :FECHA, :CONC, '', 53, :IDDOC, :PREF, :NUM, 'N');
    NROI = 0;

    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
                WHERE CUEN_COD = :CTABASE INTO :CUENTA, :TIPOCUEN;
            if (CUENTA IS NULL) then
                begin
                EXECUTE PROCEDURE ERRORINT(53, :IDDOC, :CTABASE, 2);
                CUENTA = CTABASE;
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'I') then
                BEGIN
                EXECUTE PROCEDURE ERRORINT(53, :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, 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
                WHERE CUEN_COD = :CTACLIE INTO :CUENTA, :TIPOCUEN;
            IF (CUENTA IS NULL) then
                begin
                EXECUTE PROCEDURE ERRORINT(53, :IDDOC, :CTACLIE, 2);
                CUENTA = CTACLIE;
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'I') then
                BEGIN
                EXECUTE PROCEDURE ERRORINT(53, :IDDOC, :CUENTA, 3);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                END
            if (TIPOCUEN = 'C') then
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_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 (ERROR > 0) then
    VER = 'S';
  SUSPEND;
  END /* EXISTE LA INTERFAZ */
ELSE
    BEGIN
    EXECUTE PROCEDURE ERRORINT(53, :IDDOC, :PREF, 1);
    ERROR = ERROR + 1;
    VER = 'S';
    SUSPEND;
    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 ^ ;

CREATE OR ALTER procedure CONTABIL_CHEQUE (
    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 TIPOCOMP VARCHAR(3);
declare variable PREFCONT VARCHAR(4);
declare variable BASE CHAR(1);
declare variable CTABASE VARCHAR(20);
declare variable IVA CHAR(1);
declare variable CTAIVA VARCHAR(20);
declare variable GMF CHAR(1);
declare variable CTAGMF VARCHAR(20);
declare variable BANCO CHAR(1);
declare variable CTABANCO VARCHAR(20);
declare variable EXISTE CHAR(1);
declare variable CUENTA VARCHAR(20);
declare variable MONTO NUMERIC(18,2);
declare variable VRGMF 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 NROI INTEGER;
declare variable SUMA NUMERIC(18,2);
declare variable BCTABANCO VARCHAR(20);
declare variable BCTAIVA VARCHAR(20);
declare variable BCTAGMF 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);
BEGIN
  /* BUSQUE LA INTERFACE */
  EXISTE = 'N';
  SELECT 'S', TICO_COD, PRCO_PRE, INBA_BANCO, INBA_IVA, INBA_GMF, INBA_BASE, INBA_CTABCO, INBA_CTAIVA, INBA_CTAGMF, INBA_CTABASE, INBA_CONFIRMAR
    FROM INTERFAZ_BANCOS
    WHERE INBA_ID = :IDINTER
    INTO :EXISTE, :TIPOCOMP, :PREFCONT, :BANCO, :IVA, :GMF, :BASE, :CTABANCO, CTAIVA, CTAGMF, CTABASE, :VER;
  if (EXISTE = 'S') then
    BEGIN
    DELETE FROM contabilizacion WHERE CNTB_TIPOREF = 71 AND CNTB_IDREF = :IDDOC;

    /* TRAIGA EL ENCABEZADO  */
    SELECT PRBA_PREF, CHEQ_NUMERO, CHEQ_FECHA, CHEQ_CONCEPTO, CHEQ_MONTO, CHEQ_GMFMONTO, CUBA_CTACONTA, CUBA_CTAIVA, CUBA_CTAGMF, TERC_NIT
        FROM CHEQUES C, CUENTAS_BANCO B
        WHERE CHEQ_ID = :IDDOC AND C.CUBA_COD = B.CUBA_COD
        INTO :PREF, :NUM, :FECAUX, :CONC, :MONTO, :VRGMF, :BCTABANCO, :BCTAIVA, :BCTAGMF, :NIT;
    NUMERO = PREF || NUM;
    SELECT PRBA_CENTRO, PRBA_PROY
        FROM PREFIJOS_BANCOS P, CHEQUES C
        WHERE P.PRBA_PREF = C.PRBA_PREF AND P.CUBA_COD = C.CUBA_COD AND C.CHEQ_ID = :IDDOC AND P.TIDO_COD = 72
        INTO :CENTRO, :PROY;
    EXECUTE PROCEDURE FECHA_A_CONTA(:FECAUX) returning_values (:FECHA);
    /* REGISTRE EL ENCABEZADO CONTABLE */
    IDC = GEN_ID(ID_CONTABILIZA, 1);
    INSERT INTO CONTABILIZACION (CNTB_ID, CNTB_TIPOCOMP, CNTB_PREFCNT, CNTB_NUMERO, CNTB_FECHA, CNTB_CONCEPTO, CNTB_REF, CNTB_TIPOREF, CNTB_IDREF, CNTB_PREFREF, CNTB_NUMREF, CNTB_PROCESADO)
        VALUES (:IDC, :TIPOCOMP, :PREFCONT, :NUM, :FECHA, :CONC, '', 71, :IDDOC, :PREF, :NUM, 'N');
    NROI = 0;
    SUMA = 0;
    ERROR = 0;
    /* CUENTA BASE */
    if (BASE = 'K') then
        BEGIN
        CUENTA = NULL;
        SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
            WHERE CUEN_COD = :CTABASE INTO :CUENTA, :TIPOCUEN;
      if (CUENTA IS NULL) then
            begin
            EXECUTE PROCEDURE ERRORINT(72, :IDDOC, :CTABASE, 2);
            CUENTA = CTABASE;
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            EXECUTE PROCEDURE ERRORINT(72, :IDDOC, :CUENTA, 3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'C') then
            BEGIN
            EXECUTE PROCEDURE ERRORINT(72, :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, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            END
        END /* BASE = K */
    /* CUENTA GMF */
    if ((GMF = 'K') or (GMF = 'B'))then
        BEGIN
        if (GMF = 'B') then
            CTAGMF = BCTAGMF;
        CUENTA = NULL;
        SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
            WHERE CUEN_COD = :CTAGMF INTO :CUENTA, :TIPOCUEN;
      if (CUENTA IS NULL) then
            begin
            EXECUTE PROCEDURE ERRORINT(72, :IDDOC, :CTAGMF, 2);
            CUENTA = CTAGMF;
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            EXECUTE PROCEDURE ERRORINT(72, :IDDOC, :CUENTA, 3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'C') then
            BEGIN
            EXECUTE PROCEDURE ERRORINT(72, :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, :NROI, :CUENTA, :CONC, '', :VRGMF, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            END
        END /* GMF */
    /* CUENTA BANCO */
    if ((BANCO = 'B') or (BANCO = 'K')) then
        BEGIN
        if (BANCO = 'B') then
            CTABANCO = BCTABANCO;
        SUMA = MONTO + VRGMF;
        if (SUMA <> 0) then
            BEGIN
            CUENTA = NULL;
            SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :CTABANCO INTO :CUENTA, :TIPOCUEN;
      if (CUENTA IS NULL) then
            begin
            EXECUTE PROCEDURE ERRORINT(72, :IDDOC, :CTABANCO, 2);
            CUENTA = CTABANCO;
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            EXECUTE PROCEDURE ERRORINT(72, :IDDOC, :CUENTA, 3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'C') then
            BEGIN
            EXECUTE PROCEDURE ERRORINT(72, :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, :NROI, :CUENTA, :CONC, '', 0, :SUMA, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                END
            END /* MONTO <> 0 */
        END /* BANCO K O B */
        
    /* recorra las cuentas adicionales */
    FOR SELECT INBC_CUENTA, INBC_BASE, INBC_PORC, INBC_VALOR, INBC_DB
        FROM INTERFAZ_BANCOS_CTAS
        WHERE INBA_ID = :IDINTER
        INTO :CUENTAADIC, :BASEADIC, :PORCADIC, :VALORADIC, :DBADIC
        DO
        BEGIN
        if (:BASEADIC = 'MONTO') then
            VALORADIC = MONTO;
        MONTO = VALORADIC * PORCADIC;
        
        /* TRAIGA LAS CARACTERISTICAS DE LA CUENTA */
        CUENTA = NULL;
        SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
            WHERE CUEN_COD = :CUENTAADIC INTO :CUENTA, :TIPOCUEN;
      if (CUENTA IS NULL) then
            begin
            EXECUTE PROCEDURE ERRORINT(72, :IDDOC, :CUENTAADIC, 2);
            CUENTA = CUENTAADIC;
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            EXECUTE PROCEDURE ERRORINT(72, :IDDOC, :CUENTA, 3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'C') then
            BEGIN
            EXECUTE PROCEDURE ERRORINT(72, :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, :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
    if (ERROR > 0) then
        VER = 'S';
    SUSPEND;
    END /* EXISTE */
ELSE
    BEGIN
    EXECUTE PROCEDURE ERRORINT(72, :IDDOC, :PREF, 1);
    ERROR = ERROR + 1;
    VER = 'S';
    SUSPEND;
    END
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 ^ ;

CREATE OR ALTER procedure CONTABIL_CONSIGNA (
    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 AUX CHAR(120);
declare variable CONC CHAR(60);
declare variable VALOR NUMERIC(18, 2);
declare variable TIPOCOMP VARCHAR(3);
declare variable PREFCONT VARCHAR(4);
declare variable BASE CHAR(1);
declare variable CTABASE VARCHAR(20);
declare variable IVA CHAR(1);
declare variable CTAIVA VARCHAR(20);
declare variable GMF CHAR(1);
declare variable CTAGMF VARCHAR(20);
declare variable BANCO CHAR(1);
declare variable CTABANCO 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 NROI INTEGER;
declare variable SUMA NUMERIC(18,2);
declare variable BCTABANCO VARCHAR(20);
declare variable BCTAIVA VARCHAR(20);
declare variable BCTAGMF 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 ANULADO CHAR(1);
BEGIN
  /* BUSQUE LA INTERFACE */
  EXISTE = 'N';
  SELECT 'S', TICO_COD, PRCO_PRE, INBA_BANCO, INBA_IVA, INBA_GMF, INBA_BASE, INBA_CTABCO, INBA_CTAIVA, INBA_CTAGMF, INBA_CTABASE, INBA_CONFIRMAR
    FROM INTERFAZ_BANCOS
    WHERE INBA_ID = :IDINTER
    INTO :EXISTE, :TIPOCOMP, :PREFCONT, :BANCO, :IVA, :GMF, :BASE, :CTABANCO, CTAIVA, CTAGMF, CTABASE, :VER;
  /* BORRE CUALQUEIR CONTABILIZACION PREVIA */
  DELETE FROM CONTABILIZACION WHERE CNTB_TIPOREF = 71 AND CNTB_IDREF = :IDDOC;

  if (EXISTE = 'S') then
    BEGIN
    /* TRAIGA EL ENCABEZADO  */
    SELECT PRBA_PREF, CONS_NUMERO, CONS_FECHA, CONS_CONCEPTO, CUBA_CTACONTA, CUBA_CTAIVA, CUBA_CTAGMF, CONS_ANULADO, BANC_NIT
        FROM CONSIGNA C, CUENTAS_BANCO B, bancos A
        WHERE CONS_ID = :IDDOC AND C.CUBA_COD = B.CUBA_COD AND B.BANC_COD = A.BANC_COD
        INTO :PREF, :NUM, :FECAUX, :CONC, BCTABANCO, BCTAIVA, BCTAGMF, ANULADO, NIT;
    if (ANULADO = 'N') then
      BEGIN
      NUMERO = PREF || NUM;
      SELECT PRBA_CENTRO, PRBA_PROY FROM PREFIJOS_BANCOS P, CONSIGNA C
        WHERE P.PRBA_PREF = C.PRBA_PREF AND P.CUBA_COD = C.CUBA_COD AND P.TIDO_COD = 71 AND C.CONS_ID = :IDDOC
        INTO :CENTRO, :PROY;
      EXECUTE PROCEDURE FECHA_A_CONTA(:FECAUX) returning_values (:FECHA);
      /* REGISTRE EL ENCABEZADO CONTABLE */
      IDC = GEN_ID(ID_CONTABILIZA, 1);
      AUX = SUBSTR(CONC, 1, 32);
      CONC = 'CONSIGNACION No. ' || NUMERO || '-' || AUX;
      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, '', 71, :IDDOC, :PREF, :NUM, 'N');
      NROI = 0;
      SUMA = 0;
      ERROR = 0;
      /* CUENTA BANCO */
      if ((BANCO = 'B') or (BANCO = 'K')) then
        BEGIN
        SELECT SUM(CODE_MONTO) FROM CONSIGNA_DETALLE
            WHERE CONS_ID = :IDDOC INTO :VALOR;

        if (BANCO = 'B') then
            CTABANCO = BCTABANCO;
        if (VALOR <> 0) then
            BEGIN
            CUENTA = NULL;
            SELECT CUEN_COD, CUEN_TIPO
                FROM CUENTAS
                WHERE CUEN_COD = :CTABANCO
                INTO :CUENTA, :TIPOCUEN;
            if (CUENTA IS NULL) then
                begin
                EXECUTE PROCEDURE ERRORINT(71, :IDDOC, :CTABANCO, 2);
                CUENTA = CTABANCO;
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'I') then
                BEGIN
                EXECUTE PROCEDURE ERRORINT(71, :IDDOC, :CUENTA, 3);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                EXECUTE PROCEDURE ERRORINT(71, :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, :NROI, :CUENTA, :CONC, '', :VALOR, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA + VALOR;
                END
            END /* MONTO <> 0 */
        END /* BANCO K O B */
      /* CUENTA BASE */
      if ((BASE = 'C') or (BASE = 'K')) then
        if (BASE = 'C') then
            BEGIN
            FOR SELECT MAX(CAJA_CUENTA), SUM(CODE_MONTO) FROM CONSIGNA_DETALLE D, CAJAS C
                WHERE D.CAJA_ID = C.CAJA_ID AND CONS_ID = :IDDOC
                GROUP BY CAJA_CUENTA
                INTO :CTABASE, :VALOR
                DO
                BEGIN
                if (VALOR <> 0) then
                    BEGIN
                    CUENTA = NULL;
                    SELECT CUEN_COD, CUEN_TIPO
                        FROM CUENTAS
                        WHERE CUEN_COD = :CTABASE
                        INTO :CUENTA, :TIPOCUEN;
                    if (CUENTA IS NULL) then
                        begin
                        EXECUTE PROCEDURE ERRORINT(71, :IDDOC, :CTABASE, 2);
                        CUENTA = CTABASE;
                        TIPOCUEN = 'N';
                        ERROR = ERROR + 1;
                        end
                    if (TIPOCUEN = 'I') then
                        BEGIN
                        EXECUTE PROCEDURE ERRORINT(71, :IDDOC, :CUENTA, 3);
                        TIPOCUEN = 'N';
                        ERROR = ERROR + 1;
                        END
                    if (TIPOCUEN = 'C') then
                        BEGIN
                        EXECUTE PROCEDURE ERRORINT(71, :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, :NROI, :CUENTA, :CONC, '', 0, :VALOR, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                        NROI = NROI + 1;
                        SUMA = SUMA - VALOR;
                        END
                    END /* VALOR <> 0 */
                END /* FOR */
            END /* BASE = C */
        ELSE
            BEGIN
            CUENTA = NULL;
            SELECT CUEN_COD, CUEN_TIPO
                FROM CUENTAS
                WHERE CUEN_COD = :CTABASE
                INTO :CUENTA, :TIPOCUEN;
            if (CUENTA IS NULL) then
                begin
                EXECUTE PROCEDURE ERRORINT(71, :IDDOC, :CTABASE, 2);
                CUENTA = CTABASE;
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'I') then
                BEGIN
                EXECUTE PROCEDURE ERRORINT(71, :IDDOC, :CUENTA, 3);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                EXECUTE PROCEDURE ERRORINT(71, :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, :NROI, :CUENTA, :CONC, '', 0, :SUMA, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA - VALOR;
                END
            END /* BASE = K */
            
      /* recorra las cuentas adicionales */
      FOR SELECT INBC_CUENTA, INBC_BASE, INBC_PORC, INBC_VALOR, INBC_DB
        FROM INTERFAZ_BANCOS_CTAS
        WHERE INBA_ID = :IDINTER
        INTO :CUENTAADIC, :BASEADIC, :PORCADIC, :VALORADIC, :DBADIC
        DO
        BEGIN
        if (:BASEADIC = 'MONTO') then
            VALORADIC = MONTO;
        MONTO = VALORADIC * PORCADIC;
        
        /* TRAIGA LAS CARACTERISTICAS DE LA CUENTA */
        CUENTA = NULL;
        SELECT CUEN_COD, CUEN_TIPO
            FROM CUENTAS
            WHERE CUEN_COD = :CUENTAADIC
            INTO :CUENTA, :TIPOCUEN;
            if (CUENTA IS NULL) then
                begin
                EXECUTE PROCEDURE ERRORINT(71, :IDDOC, :CUENTAADIC, 2);
                CUENTA = CUENTAADIC;
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'I') then
                BEGIN
                EXECUTE PROCEDURE ERRORINT(71, :IDDOC, :CUENTA, 3);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                EXECUTE PROCEDURE ERRORINT(71, :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, :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
    if (ERROR > 0) then
        VER = 'S';
    SUSPEND;
    END  /* ANULADO = N */
  END /* EXISTE  */
ELSE
    BEGIN
    EXECUTE PROCEDURE ERRORINT(71, :IDDOC, :PREF, 1);
    ERROR = ERROR + 1;
    VER = 'S';
    SUSPEND;
    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 ^ ;

CREATE OR ALTER procedure CONTABIL_CONSIGNATAR (
    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 VRDTO NUMERIC(18, 2);
declare variable VRRTFTE NUMERIC(18, 2);
declare variable VRRTIVA NUMERIC(18, 2);
declare variable VRRTICA NUMERIC(18, 2);
declare variable VRTOTAL NUMERIC(18, 2);
declare variable TIPOCOMP VARCHAR(3);
declare variable PREFCONT VARCHAR(4);
declare variable BASE CHAR(1);
declare variable PORC NUMERIC(8,2);
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 DTO CHAR(1);
declare variable CTADTO VARCHAR(20);
declare variable CTAGMF VARCHAR(20);
declare variable GMFPOR NUMERIC(9,2);
declare variable VRGMF NUMERIC(18,2);
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 NROI INTEGER;
declare variable SUMA 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 CHEQUE CHAR(1);
declare variable IDCAJA INTEGER;
declare variable IDBANCO INTEGER;
declare variable ANULADO CHAR(1);
declare variable VRBASE NUMERIC(18,2);
declare variable TOTALNETO CHAR(5);
BEGIN
/* BUSQUE LA INTERFACE */
EXISTE = 'N';
SELECT 'S', TICO_COD, PRCO_PRE, INCJ_BASE, INCJ_DTOPP, INCJ_RTFTE, INCJ_RTIVA, INCJ_RTICA, INCJ_CAJA, INCJ_CTABASE, INCJ_CTADTO, INCJ_CTARTFTE, INCJ_CTARTIVA, INCJ_CTARTICA, INCJ_CTACAJA, INCJ_CONFIRMAR
    FROM INTERFAZ_CAJA
    WHERE INCJ_ID = :IDINTER
    INTO :EXISTE, :TIPOCOMP, :PREFCONT, :BASE, :DTO, :RTFTE, :RTIVA, :RTICA, :CAJA, :CTABASE, :CTADTO, :CTARTFTE, :CTARTIVA, :CTARTICA, :CTACAJA, :VER;
if (EXISTE = 'S') then
    BEGIN
    DELETE FROM contabilizacion WHERE CNTB_TIPOREF = 64 AND CNTB_IDREF = :IDDOC;

    /* TRAIGA EL ENCABEZADO DE LA CONSIGNACION */
    SELECT PREF_PRE, COTJ_NUMERO, COTJ_FECHA, COTJ_CONCEPTO, COTJ_MONTO, COTJ_COMISION, COTJ_RTFTE, COTJ_RTIVA, COTJ_RTICA, COTJ_CHEQUE, CAJA_ID, CUBA_COD, COTJ_ANULADO
        FROM consigna_tarjetas
        WHERE COTJ_ID = :IDDOC
        INTO :PREF, :NUM, :FECAUX, :CONC, :VRTOTAL, :VRDTO, :VRRTFTE, :VRRTIVA, :VRRTICA, :CHEQUE, :IDCAJA, :IDBANCO, :ANULADO;
    if (ANULADO = 'N') then
        BEGIN
        EXECUTE PROCEDURE LEE_CONFIGURACION('BANCOS', 'CONSIGNACIONES', 'CONTABILIZAR EL BANCO POR EL TOTAL DE TARJETAS Y LUEGO DESCUENTOS O UN SOLO REGISTRO NETO') returning_values (:totalneto);
        /* EL NIT ES EL DEL BANCO */
        SELECT B.banc_nit FROM bancos B, CUENTAS_BANCO C WHERE C.banc_cod = B.banc_cod AND C.cuba_cod = :idbanco INTO :nit;

        NUMERO = PREF || NUM;
        SELECT PREF_CENTRO, PREF_PROY FROM PREFIJOS
            WHERE PREF_PRE = :PREF AND TIDO_COD = 64 INTO :CENTRO, :PROY;
        EXECUTE PROCEDURE FECHA_A_CONTA(:FECAUX) returning_values (:FECHA);

        /* REGISTRE EL ENCABEZADO CONTABLE */
        IDC = GEN_ID(ID_CONTABILIZA, 1);
        INSERT INTO CONTABILIZACION (CNTB_ID, CNTB_TIPOCOMP, CNTB_PREFCNT, CNTB_NUMERO, CNTB_FECHA, CNTB_CONCEPTO, CNTB_REF, CNTB_TIPOREF, CNTB_IDREF, CNTB_PREFREF, CNTB_NUMREF, CNTB_PROCESADO)
            VALUES (:IDC, :TIPOCOMP, :PREFCONT, :NUM, :FECHA, :CONC, '', 64, :IDDOC, :PREF, :NUM, 'N');

        NROI = 0;
        SUMA = 0;
        ERROR = 0;
        VRBASE = VRTOTAL;
        if (TOTALNETO = 'TOTAL') then
            VRTOTAL = VRTOTAL + vrdto + vrrtfte + vrrtica + vrrtiva;
        SELECT CUBA_CTAGMF, CUBA_GMFPOR FROM CUENTAS_BANCO WHERE CUBA_COD = :IDBANCO INTO ctagmf, :gmfpor;
        if ((CTAGMF <> '') AND (GMFPOR <> 0))then
            EXECUTE procedure REDONDEE((vrdto + vrrtfte + vrrtiva + vrrtica) * GMFPOR / 1000,0) returning_values (:VRGMF);
        else    
            VRGMF = 0;
        IF ((CAJA = 'K') or (CAJA = 'F') ) THEN
            BEGIN
            if (VRTOTAL <> 0) then
                BEGIN
                IF ((CAJA = 'F')) THEN
                    BEGIN
                    /* TRAIGA LA CUENTA DE LA CAJA O EL BANCO A ABONAR */
                    SELECT CUBA_CTACONTA FROM CUENTAS_BANCO WHERE CUBA_COD = :IDBANCO INTO CTACAJA;
--                    ELSE
--                        SELECT CAJA_CUENTA FROM CAJAS WHERE CAJA_ID = :IDCAJA INTO CTACAJA;
                    END
                
                CUENTA = NULL;
                SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                    WHERE CUEN_COD = :CTACAJA INTO :CUENTA, :TIPOCUEN;
                if (CUENTA IS NULL) then
                    begin
                    EXECUTE PROCEDURE ERRORINT(64, :IDDOC, :CTACAJA, 2);
                    CUENTA = CTABASE;
                    ERROR = ERROR + 1;
                    end
                if (TIPOCUEN = 'I') then
                    BEGIN
                    EXECUTE PROCEDURE ERRORINT(64, :IDDOC, :CUENTA, 3);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    EXECUTE PROCEDURE ERRORINT(64, :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, :NROI, :CUENTA, :CONC, '', :VRTOTAL, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    SUMA = SUMA + VRTOTAL;
                    if (TOTALNETO = 'TOTAL') then
                        BEGIN
                        if (VRDTO <> 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, :VRDTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                            NROI = NROI + 1;
                            SUMA = SUMA - VRDTO;
                            END
                        if (vrrtfte <> 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, :vrrtfte, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                            NROI = NROI + 1;
                            SUMA = SUMA - vrrtfte;
                            END
                        if (vrrtiva <> 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, :vrrtiva, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                            NROI = NROI + 1;
                            SUMA = SUMA - vrrtiva;
                            END
                        if (vrrtica <> 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, :vrrtica, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                            NROI = NROI + 1;
                            SUMA = SUMA - vrrtica;
                            END
                        if (vrgmf <> 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, :VRGMF, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                            NROI = NROI + 1;
                            SUMA = SUMA - VRGMF;
                            END
                        END
                    END
                END /* VRTOTAL <> 0 */
            END /* CAJA CONSTANTE */
        
        if (DTO = 'K') then /* COMISION */
            BEGIN
            if (VRDTO <> 0) then
                BEGIN
                CUENTA = NULL;
                SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                    WHERE CUEN_COD = :CTADTO INTO :CUENTA, :TIPOCUEN;
                if (CUENTA IS NULL) then
                    begin
                    EXECUTE PROCEDURE ERRORINT(64, :IDDOC, :CTABASE, 2);
                    CUENTA = CTABASE;
                    ERROR = ERROR + 1;
                    end
                if (TIPOCUEN = 'I') then
                    BEGIN
                    EXECUTE PROCEDURE ERRORINT(64, :IDDOC, :CUENTA, 3);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    EXECUTE PROCEDURE ERRORINT(64, :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, :NROI, :CUENTA, :CONC, '', :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 */
        
        /* RETENCION FUENTE */
        if (RTFTE = 'K') then
          if (VRRTFTE <> 0) then
            BEGIN
            PORC = vrrtfte * 100 / vrbase;
            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(64, :IDDOC, :ctartfte, 2);
                CUENTA = CTABASE;
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'I') then
                BEGIN
                EXECUTE PROCEDURE ERRORINT(64, :IDDOC, :CUENTA, 3);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                EXECUTE PROCEDURE ERRORINT(64, :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, :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 = 'K') then
          if (VRRTIVA <> 0) then
            BEGIN
            PORC = VRRTIVA / VRBASE;
            CUENTA = NULL;
            SELECT CUEN_COD, CUEN_TIPO
                FROM CUENTAS
                WHERE CUEN_COD = :CTARTIVA
                INTO :CUENTA, :TIPOCUEN;
            if (CUENTA IS NULL) then
                begin
                EXECUTE PROCEDURE ERRORINT(64, :IDDOC, :ctartiva, 2);
                CUENTA = CTABASE;
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'I') then
                BEGIN
                EXECUTE PROCEDURE ERRORINT(64, :IDDOC, :CUENTA, 3);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                EXECUTE PROCEDURE ERRORINT(64, :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, :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 ICA */
        if (rtica = 'K') then
          if (vrrtica <> 0) then
            BEGIN
            PORC = vrrtica / VRBASE;
            CUENTA = NULL;
            SELECT CUEN_COD, CUEN_TIPO
                FROM CUENTAS
                WHERE CUEN_COD = :ctartica
                INTO :CUENTA, :TIPOCUEN;
            if (CUENTA IS NULL) then
                begin
                EXECUTE PROCEDURE ERRORINT(64, :IDDOC, :ctartica, 2);
                CUENTA = ctartica;
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'I') then
                BEGIN
                EXECUTE PROCEDURE ERRORINT(64, :IDDOC, :CUENTA, 3);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                EXECUTE PROCEDURE ERRORINT(64, :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, :NROI, :CUENTA, :CONC, '', :vrrtica, 0, :VRBASE, :PORC, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA + vrrtica;
                END
            END /* RTIVA */
        
        /* CUENTA GMF */
        if (VRGMF <> 0) then
            BEGIN
            CUENTA = NULL;
            SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :CTAGMF INTO :CUENTA, :TIPOCUEN;
            if (CUENTA IS NULL) then
                begin
                EXECUTE PROCEDURE ERRORINT(64, :IDDOC, :CTAGMF, 2);
                CUENTA = CTAGMF;
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'I') then
                BEGIN
                EXECUTE PROCEDURE ERRORINT(64, :IDDOC, :CUENTA, 3);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                EXECUTE PROCEDURE ERRORINT(64, :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, :NROI, :CUENTA, :CONC, '', :VRGMF, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA + VRGMF;
                END
            END /* GMF */

        /* CIERRE EL COMPROBANTE CONTRA LA CUENTA DE LA CAJA */
        if ((SUMA <> 0) and ((BASE = 'F') 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 = 'F') then
                SELECT CAJA_CUENTA FROM CAJAS WHERE CAJA_ID = :IDCAJA INTO CTABASE;

            CUENTA = NULL;
            SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :CTABASE INTO :CUENTA, :TIPOCUEN;
            if (CUENTA IS NULL) then
                begin
                EXECUTE PROCEDURE ERRORINT(64, :IDDOC, :CTABASE, 2);
                CUENTA = CTABASE;
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'I') then
                BEGIN
                EXECUTE PROCEDURE ERRORINT(64, :IDDOC, :CUENTA, 3);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                EXECUTE PROCEDURE ERRORINT(64, :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, :NROI, :CUENTA, :CONC, '', :DEBITO, :CREDITO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            END /* SUMA EN CARTERA */

        /* 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;
            MONTO = VALORADIC * PORCADIC;
        
            CUENTA = NULL;
            SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :CTADIC INTO :CUENTA, :TIPOCUEN;
            if (CUENTA IS NULL) then
                begin
                EXECUTE PROCEDURE ERRORINT(66, :IDDOC, :CTABASE, 2);
                CUENTA = CTABASE;
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'I') then
                BEGIN
                EXECUTE PROCEDURE ERRORINT(66, :IDDOC, :CUENTA, 3);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                EXECUTE PROCEDURE ERRORINT(66, :IDDOC, :CUENTA, 4);
                TIPOCUEN = 'N';
                ERROR = ERROR + 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 (ERROR > 0) then
            VER = 'S';
        SUSPEND;
        END
    END /* EXISTE LA INTERFAZ */
ELSE
    BEGIN
    EXECUTE PROCEDURE ERRORINT(64, :IDDOC, :PREF, 1);
    ERROR = ERROR + 1;
    VER = 'S';
    SUSPEND;
    END
END^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER procedure CONTABIL_DESENSAMBLE (
    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);
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
    DELETE FROM contabilizacion WHERE CNTB_TIPOREF = 16 AND CNTB_IDREF = :IDDOC;
    /* TRAIGA EL ENCABEZADO DEL ENSAMBLE */
    SELECT PREF_PRE, DESE_NUMERO, DESE_FECHA, DESE_CONC, DESE_ANULADO
        FROM DESENSAMBLES
        WHERE DESE_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, 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;
        /* 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, '', 16, :IDDOC, :PREFIJO, :NUMERO, 'N');
        NUMITEMS = 0;
        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 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
                        WHERE CUEN_COD = :CTABASE INTO :CUENTA, :TIPOCUEN;
                    if (CUENTA IS NULL) then
                        begin
                        EXECUTE PROCEDURE ERRORINT(16, :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(16, :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 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
                        WHERE CUEN_COD = :CTABASE INTO :CUENTA, :TIPOCUEN;
                    if (CUENTA IS NULL) then
                        begin
                        EXECUTE PROCEDURE ERRORINT(16, :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 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 (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(16, :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
                    WHERE CUEN_COD = :CTABASE INTO :CUENTA, :TIPOCUEN;
                if (CUENTA IS NULL) then
                    begin
                    EXECUTE PROCEDURE ERRORINT(16, :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(16, :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
                    WHERE CUEN_COD = :ctacierre INTO :CUENTA, :TIPOCUEN;
                if (CUENTA IS NULL) then
                    begin
                    EXECUTE PROCEDURE ERRORINT(16, :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(16, :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 = '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(16, :IDDOC, :CUENTAADIC, 2);
                    CUENTA = CUENTAADIC;
                    ERROR = ERROR + 1;
                    end
                if (TIPOCUEN = 'I') then
                    BEGIN
                    EXECUTE PROCEDURE ERRORINT(16, :IDDOC, :CUENTA, 3);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    EXECUTE PROCEDURE ERRORINT(16, :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(16, :IDDOC, :PREFIJO, 1);
    ERROR = ERROR + 1;
    VER = 'S';
    SUSPEND;
    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 ^ ;

CREATE OR ALTER procedure CONTABIL_DEVOLCHEQ (
    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 TIPOCOMP VARCHAR(3);
declare variable PREFCONT VARCHAR(4);
declare variable BASE CHAR(1);
declare variable CTABASE VARCHAR(20);
declare variable IVA CHAR(1);
declare variable CTAIVA VARCHAR(20);
declare variable GMF CHAR(1);
declare variable CTAGMF VARCHAR(20);
declare variable BANCO CHAR(1);
declare variable CTABANCO 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 CART CHAR(1);
declare variable IDCAJA INTEGER;
declare variable NIT VARCHAR(20);
declare variable PROY VARCHAR(4);
declare variable CENTRO VARCHAR(4);
declare variable NROI INTEGER;
declare variable SUMA NUMERIC(18,2);
declare variable BCTABANCO VARCHAR(20);
declare variable BCTAIVA VARCHAR(20);
declare variable BCTAGMF 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);
BEGIN
  /* BUSQUE LA INTERFACE */
  EXISTE = 'N';
  SELECT 'S', TICO_COD, PRCO_PRE, INBA_BANCO, INBA_IVA, INBA_GMF, INBA_BASE, INBA_CTABCO, INBA_CTAIVA, INBA_CTAGMF, INBA_CTABASE, INBA_CONFIRMAR
    FROM INTERFAZ_BANCOS
    WHERE INBA_ID = :IDINTER
    INTO :EXISTE, :TIPOCOMP, :PREFCONT, :BANCO, :IVA, :GMF, :BASE, :CTABANCO, CTAIVA, CTAGMF, CTABASE, :VER;
  if (EXISTE = 'S') then
    BEGIN
    DELETE FROM contabilizacion WHERE CNTB_TIPOREF = 77 AND CNTB_IDREF = :IDDOC;
    /* TRAIGA EL ENCABEZADO  */
    SELECT PRBA_PREF, DVCH_NUMDOC, DVCH_FECHA, DVCH_CONC, DVCH_MONTO, DVCH_CARTERA, CAJA_ID, TERC_NIT, CUBA_CTACONTA, CUBA_CTAIVA, CUBA_CTAGMF
        FROM DEVOLUCION_CHEQUES C, CUENTAS_BANCO B
        WHERE DVCH_ID = :IDDOC AND C.CUBA_COD = B.CUBA_COD
        INTO :PREF, :NUM, :FECAUX, :CONC, :MONTO, :CART, :IDCAJA, :NIT, :BCTABANCO, :BCTAIVA, :BCTAGMF;
    NUMERO = PREF || NUM;
    SELECT PRBA_CENTRO, PRBA_PROY FROM PREFIJOS_BANCOS P, devolucion_cheques C
        WHERE P.PRBA_PREF = C.PRBA_PREF AND P.CUBA_COD = C.CUBA_COD AND C.DVCH_ID = :IDDOC AND P.TIDO_COD = 77
        INTO :CENTRO, :PROY;
    EXECUTE PROCEDURE FECHA_A_CONTA(:FECAUX) returning_values (:FECHA);
    /* REGISTRE EL ENCABEZADO CONTABLE */
    IDC = GEN_ID(ID_CONTABILIZA, 1);
    INSERT INTO CONTABILIZACION (CNTB_ID, CNTB_TIPOCOMP, CNTB_PREFCNT, CNTB_NUMERO, CNTB_FECHA, CNTB_CONCEPTO, CNTB_REF, CNTB_TIPOREF, CNTB_IDREF, CNTB_PREFREF, CNTB_NUMREF, CNTB_PROCESADO)
        VALUES (:IDC, :TIPOCOMP, :PREFCONT, :NUM, :FECHA, :CONC, '', 77, :IDDOC, :PREF, :NUM, 'N');
    NROI = 0;
    SUMA = 0;
    ERROR = 0;
    /* CUENTA BASE */
    if ((BASE = 'C') or (BASE = 'K')) then
        BEGIN
        if (BASE = 'C') then
            if (CART = 'S') then /* LA CUENTA DEL CLIENTE */
                SELECT TERC_CTACLIENTE FROM TERCEROS
                    WHERE TERC_NIT = :NIT INTO :CTABASE;
            ELSE /* LA CUENTA DE CAJA */
                SELECT CAJA_CUENTA FROM CAJAS
                    WHERE CAJA_ID = :IDCAJA INTO :CTABASE;
        CUENTA = NULL;
        SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
            WHERE CUEN_COD = :CTABASE INTO :CUENTA, :TIPOCUEN;
        if (CUENTA IS NULL) then
            begin
            EXECUTE PROCEDURE ERRORINT(77, :IDDOC, :CTABASE, 2);
            CUENTA = CTABASE;
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            EXECUTE PROCEDURE ERRORINT(77, :IDDOC, :CUENTA, 3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'C') then
            BEGIN
            EXECUTE PROCEDURE ERRORINT(77, :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, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            END
        END /* BASE = C O K */
    /* CUENTA BANCO */
    if ((BANCO = 'B') or (BANCO = 'K')) then
        BEGIN
        if (BANCO = 'B') then
            CTABANCO = BCTABANCO;
        SUMA = MONTO;
        if (SUMA <> 0) then
            BEGIN
            CUENTA = NULL;
            SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :CTABANCO INTO :CUENTA, :TIPOCUEN;
        if (CUENTA IS NULL) then
            begin
            EXECUTE PROCEDURE ERRORINT(77, :IDDOC, :CTABANCO, 2);
            CUENTA = CTABANCO;
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            EXECUTE PROCEDURE ERRORINT(77, :IDDOC, :CUENTA, 3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'C') then
            BEGIN
            EXECUTE PROCEDURE ERRORINT(77, :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, :NROI, :CUENTA, :CONC, '', 0, :SUMA, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                END
            END /* MONTO <> 0 */
        END /* BANCO K O B */
        
    /* recorra las cuentas adicionales */
    FOR SELECT INBC_CUENTA, INBC_BASE, INBC_PORC, INBC_VALOR, INBC_DB
        FROM INTERFAZ_BANCOS_CTAS
        WHERE INBA_ID = :IDINTER
        INTO :CUENTAADIC, :BASEADIC, :PORCADIC, :VALORADIC, :DBADIC
        DO
        BEGIN
        if (:BASEADIC = 'MONTO') then
            VALORADIC = MONTO;
        MONTO = VALORADIC * PORCADIC;
        
        /* TRAIGA LAS CARACTERISTICAS DE LA CUENTA */
        CUENTA = NULL;
        SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
            WHERE CUEN_COD = :CUENTAADIC INTO :CUENTA, :TIPOCUEN;
        if (CUENTA IS NULL) then
            begin
            EXECUTE PROCEDURE ERRORINT(77, :IDDOC, :CUENTAADIC, 2);
            CUENTA = CUENTAADIC;
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            EXECUTE PROCEDURE ERRORINT(77, :IDDOC, :CUENTA, 3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'C') then
            BEGIN
            EXECUTE PROCEDURE ERRORINT(77, :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, :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
    if (ERROR > 0) then
        VER = 'S';
    SUSPEND;
    END /* EXISTE */
ELSE
    BEGIN
    EXECUTE PROCEDURE ERRORINT(77, :IDDOC, :PREF, 1);
    ERROR = ERROR + 1;
    VER = 'S';
    SUSPEND;
    END
END^

SET TERM ; ^

SET TERM ^ ;

CREATE OR 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_CTAIVAV), 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_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(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 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 ^ ;

CREATE OR ALTER procedure CONTABIL_DEVOLCOMP (
    IDDOC integer,
    IDINTER integer)
returns (
    ERROR integer,
    VER char(1),
    IDC integer)
AS
declare variable PREFIJO VARCHAR(4);
declare variable NUM VARCHAR(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 TIPOCOMP VARCHAR(3);
declare variable PREFCONT VARCHAR(4);
declare variable INVEN CHAR(1);
declare variable CTAINVEN VARCHAR(20);
declare variable IVA CHAR(1);
declare variable CTAIVA VARCHAR(20);
declare variable CONSUMO CHAR(1);
declare variable CTACONSUMO VARCHAR(20);
declare variable CXP CHAR(1);
declare variable CTACXP VARCHAR(20);
declare variable RTFTE CHAR(1);
declare variable CTARTFTE VARCHAR(20);
declare variable RTIVA CHAR(1);
declare variable CTARTIVA VARCHAR(20);
declare variable RTICA CHAR(1);
declare variable CTARTICA VARCHAR(20);
declare variable 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', TICO_COD, PRCO_PRE, INCO_INVEN, INCO_IVA, INCO_CONSUMO, INCO_CXP, INCO_RTFTE, INCO_RTIVA, INCO_RTICA, INCO_RTCREE,
    INCO_CTAINVEN, INCO_CTAIVA, INCO_CTACONSUMO, INCO_CTADTO, INCO_CTAADIC, INCO_CTAEXTRA, INCO_CTACXP, INCO_CTARTFTE,
    INCO_CTARTIVA, INCO_CTARTICA, INCO_CTARTCREE, INCO_CONFIRMAR, INCO_CENTRO
    FROM INTERFAZ_COMPRAS
    WHERE INCO_ID = :IDINTER
    INTO :EXISTE, :TIPOCOMP, :PREFCONT, :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
    /* BORRE CUALQUEIR CONTABILIZACION PREVIA */
    DELETE FROM CONTABILIZACION WHERE CNTB_TIPOREF = 24 AND CNTB_IDREF = :IDDOC;
   /* TRAIGA EL ENCABEZADO DE LA DEVOLUCION */
   SELECT PREF_PRE, DVCO_NUMERO, DVCO_FECHA, D.TERC_NIT, DVCO_FACTURA, DVCO_IMPTOS, DVCO_DTOMONTO, DVCO_ADICIONAL, DVCO_IVAMONTO,
        DVCO_EXTRA, DVCO_TOTAL, DVCO_RTFTEPORC, DVCO_RTFTEMONTO, DVCO_RTIVAPORC, DVCO_RTIVAMONTO, DVCO_RTICAPORC, DVCO_RTICAMONTO,
        DVCO_RTCREE, DVCO_RTCREEM, PROV_CTARTFTE, PROV_CTARTIVA, PROV_CTARTICA, PROV_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;
    /* CONVIERTA LA FECHA A CADENA */
    EXECUTE PROCEDURE FECHA_A_CONTA(:FECAUX) returning_values (:FECHA);
    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;

    /* REGISTRE EL ENCABEZADO CONTABLE */
    CONCEPTO = 'DEVOLUCION COMPRA No. ' || NUMERO || ' EN FACTURA ' || NUMFAC;
    IDC = GEN_ID(ID_CONTABILIZA, 1);
    INSERT INTO CONTABILIZACION (CNTB_ID, CNTB_TIPOCOMP, CNTB_PREFCNT, CNTB_NUMERO, CNTB_FECHA, CNTB_CONCEPTO, CNTB_REF, CNTB_TIPOREF, CNTB_IDREF, CNTB_PREFREF, CNTB_NUMREF, CNTB_PROCESADO)
        VALUES (:IDC, :TIPOCOMP, :PREFCONT, :NUM, :FECHA, :CONCEPTO, '', 24, :IDDOC, :PREFIJO, :NUM, 'N');

    NUMITEMS = 0;
    SUMA = 0;
    ERROR = 0;
    /* CUENTAS DE INVENTARIO */
    if (INVEN = 'A') then
        BEGIN
        /* SUME LAS BASES DE LOS ARTICULOS DEL DOCUMENTO */
        FOR SELECT MAX(COAR_CTACOMP), SUM(cast(DVCD_CANT as double precision) * (DVCD_PRUNIT-DVCD_DTOMONTO)), SUM(DVCD_IVAMONTO), SUM(DVCD_CONSUMO)
            FROM ARTICULO A, CONTABIL_ARTICULO C, DEVOLUCIONES_COMPRAS_DET F
            WHERE F.DVCO_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD
            GROUP BY COAR_CTAINV
            INTO :CTAINVEN, :MONTO, :IMPTOS, :VALORADIC
            DO
            BEGIN
            if (IMPINC = 'S') then
                BEGIN
                MONTO = MONTO - IMPTOS;
                if (FOMENTO <> 'SI') then
                    MONTO = MONTO - VALORADIC;
                END
            /* TRAIGA LAS CARACTERISTICAS DE LA CUENTA */
            EXECUTE PROCEDURE CUENTA_INTERFAZ(24, :IDDOC, :CTAINVEN, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            /* DEPENDE DEL TIPO DE CUENTA */
            if ((TIPOCUEN = 'I') 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 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(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_CTAIVAC), SUM(DVCD_IVAMONTO), SUM(cast(DVCD_CANT as double precision) * (DVCD_PRUNIT-DVCD_DTOMONTO)), SUM(DVCD_CONSUMO)
            FROM ARTICULO A, CONTABIL_ARTICULO C, DEVOLUCIONES_COMPRAS_DET F
            WHERE F.DVCO_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND DVCD_IVAMONTO <> 0
            GROUP BY COAR_CTAIVAC
            INTO :CTAIVA, :IMPTOS, :MONTO, :VALORADIC
        DO
          if (IMPTOS <> 0) then
            BEGIN
            IMPTOS = CAST(IMPTOS AS DOUBLE PRECISION) * VRSUBT / MERCANCIA;
            if (IMPINC = 'S') then
                BEGIN
                MONTO = MONTO - IMPTOS;
                if (FOMENTO <> 'SI') then
                    MONTO = MONTO - VALORADIC;
                END

            /* TRAIGA LAS CARCATERISTICAS DE LA CUENTA */
            EXECUTE PROCEDURE CUENTA_INTERFAZ(24, :IDDOC, :CTAIVA, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            /* DEPENDE DEL TIPO DE CUENTA */
            if (TIPOCUEN = 'I') then
                BEGIN
                /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                FOR SELECT F.ARTI_COD, DVCD_IVAMONTO, (cast(DVCD_CANT as double precision) * (DVCD_PRUNIT-DVCD_DTOMONTO)), TAIV_PORC, DVCD_CONSUMO
                    FROM ARTICULO A, CONTABIL_ARTICULO C, DEVOLUCIONES_COMPRAS_DET F, TARIFA_IVA T
                    WHERE F.DVCO_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND COAR_CTAIVAV = :CUENTA AND A.TAIV_COD = T.TAIV_COD
                    INTO :ARTICULO, :IMPTOS, :MONTO, :PORCIVA, :VALORADIC
                DO
                    BEGIN
                    if (IMPINC = 'S') then
                        BEGIN
                        MONTO = MONTO - IMPTOS;
                        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(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 C, DEVOLUCIONES_COMPRAS_DET F
            WHERE F.DVCO_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD
            GROUP BY COAR_CTACONS
            INTO :CTACONSUMO, :IMPTOS
        DO
            BEGIN
            if (IMPTOS <> 0) then
                BEGIN
                /* TRAIGA LAS CARACTERISTICAS DE LA CUENTA */
                EXECUTE PROCEDURE CUENTA_INTERFAZ(24, :IDDOC, :CTACONSUMO, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                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(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(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(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(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(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 C, DEVOLUCIONES_COMPRAS_DET F
            WHERE F.dvco_id = :IDDOC AND F.ARTI_COD = C.ARTI_COD
            GROUP BY COAR_CTARTFTE
            INTO :CTARTFTE, :PRTFTE, :baseadic, :MONTO, :VRRTFTE
            DO
            BEGIN
            MONTO = MONTO * FACTOR;
            if (MONTO >= BASEADIC) then
                BEGIN
                VRRTFTE = VRRTFTE * FACTOR / 100;
                execute procedure redondee(VRRTFTE, DIG) returning_values (VRRTFTE);
                execute procedure redondee(MONTO, DIG) returning_values (MONTO);
                if (VRRTFTE <> 0) then
                    BEGIN
                    /* TRAIGA LAS CARACTERISTICAS DE LA CUENTA */
                    EXECUTE PROCEDURE CUENTA_INTERFAZ(24, :IDDOC, :CTARTFTE, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
                    if (ERRORC <> 0) then
                        ERROR = ERROR + 1;
                    if (TIPOCUEN = 'C') then
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_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(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(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(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(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(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 ^ ;

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 ^ ;

CREATE OR ALTER procedure CONTABIL_EGRESO (
    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 FECAUX DATE;
declare variable FECHA CHAR(8);
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 TIPOCOMP VARCHAR(3);
declare variable PREFCONT VARCHAR(4);
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', TICO_COD, PRCO_PRE, INCJ_BASE, INCJ_DTOPP, INCJ_RTFTE, INCJ_RTIVA, INCJ_RTICA, INCJ_CAJA, INCJ_CTABASE,
    INCJ_CTADTO, INCJ_CTARTFTE, INCJ_CTARTIVA, INCJ_CTARTICA, INCJ_CTARTCREE, INCJ_CTACAJA, INCJ_CONFIRMAR
    FROM INTERFAZ_CAJA
    WHERE INCJ_ID = :IDINTER
    INTO :EXISTE, :TIPOCOMP, :PREFCONT, :BASE, :DTO, :RTFTE, :RTIVA, :RTICA, :CAJA, :CTABASE,
    :CTADTO, :CTARTFTE, :CTARTIVA, :CTARTICA, :CTARTCREE, :CTACAJA, :VER;
if (EXISTE = 'S') then
    BEGIN
    OK = 0;
    FOR SELECT CNTB_ID FROM CONTABILIZACION WHERE CNTB_TIPOREF = 62 AND CNTB_IDREF = :IDDOC INTO :OK DO
        BEGIN
        DELETE FROM CONTABILIZACION_DET WHERE CNTB_ID = :OK;
        DELETE FROM CONTABILIZACION WHERE CNTB_ID = :OK;
        END

    /* TRAIGA EL ENCABEZADO DEL EGRESO */
    SELECT PREF_PRE, EGRE_NUMERO, EGRE_FECHA, 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, :NUM, :FECAUX, :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;
    EXECUTE PROCEDURE FECHA_A_CONTA(:FECAUX) returning_values (:FECHA);
    /* REGISTRE EL ENCABEZADO CONTABLE */
    IDC = GEN_ID(ID_CONTABILIZA, 1);
    INSERT INTO CONTABILIZACION (CNTB_ID, CNTB_TIPOCOMP, CNTB_PREFCNT, CNTB_NUMERO, CNTB_FECHA, CNTB_CONCEPTO, CNTB_REF, CNTB_TIPOREF, CNTB_IDREF, CNTB_PREFREF, CNTB_NUMREF, CNTB_PROCESADO)
        VALUES (:IDC, :TIPOCOMP, :PREFCONT, :NUM, :FECHA, :CONC, '', 62, :IDDOC, :PREF, :NUM, 'N');
    /* 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 = 0;
    SUMA = 0;
    ERROR = 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
                    WHERE CUEN_COD = :CTACAJA INTO :CUENTA, :TIPOCUEN;
            ELSE
                begin
                EXECUTE PROCEDURE ERRORINT(62, :IDDOC, :CTACAJA, 2);
                CUENTA = CTACAJA;
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'I') then
                BEGIN
                EXECUTE PROCEDURE ERRORINT(62, :IDDOC, :CUENTA, 3);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                EXECUTE PROCEDURE ERRORINT(62, :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, :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
                        WHERE CUEN_COD = :CTACAJA INTO :CUENTA, :TIPOCUEN;
                ELSE
                    begin
                    EXECUTE PROCEDURE ERRORINT(62, :IDDOC, :CTACAJA, 2);
                    CUENTA = CTACAJA;
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    end
                if (TIPOCUEN = 'I') then
                    BEGIN
                    EXECUTE PROCEDURE ERRORINT(62, :IDDOC, :CUENTA, 3);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    EXECUTE PROCEDURE ERRORINT(62, :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, :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
                        WHERE CUEN_COD = :CTACAJA INTO :CUENTA, :TIPOCUEN;
                ELSE
                    begin
                    EXECUTE PROCEDURE ERRORINT(62, :IDDOC, :CTACAJA, 2);
                    CUENTA = CTACAJA;
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    end
                if (TIPOCUEN = 'I') then
                    BEGIN
                    EXECUTE PROCEDURE ERRORINT(62, :IDDOC, :CUENTA, 3);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    EXECUTE PROCEDURE ERRORINT(62, :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, :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
                            WHERE CUEN_COD = :CTACAJA INTO :CUENTA, :TIPOCUEN;
                    ELSE
                        begin
                        EXECUTE PROCEDURE ERRORINT(62, :IDDOC, :CTACAJA, 2);
                        CUENTA = CTACAJA;
                        TIPOCUEN = 'N';
                        ERROR = ERROR + 1;
                        end
                    if (TIPOCUEN = 'I') then
                        BEGIN
                        EXECUTE PROCEDURE ERRORINT(62, :IDDOC, :CUENTA, 3);
                        TIPOCUEN = 'N';
                        ERROR = ERROR + 1;
                        END
                    if (TIPOCUEN = 'C') then
                        BEGIN
                        EXECUTE PROCEDURE ERRORINT(62, :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, :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
                WHERE CUEN_COD = :tctacart INTO :CUENTA, :TIPOCUEN;
        ELSE
            begin
            EXECUTE PROCEDURE ERRORINT(62, :IDDOC, :tctacart, 2);
            CUENTA = tctacart;
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            EXECUTE PROCEDURE ERRORINT(62, :IDDOC, :CUENTA, 3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'C') then
            BEGIN
            EXECUTE PROCEDURE ERRORINT(62, :IDDOC, :CUENTA, 3);
            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, :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
                WHERE CUEN_COD = :tctacart INTO :CUENTA, :TIPOCUEN;
        ELSE
            begin
            EXECUTE PROCEDURE ERRORINT(62, :IDDOC, :tctacart, 2);
            CUENTA = tctacart;
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            EXECUTE PROCEDURE ERRORINT(62, :IDDOC, :CUENTA, 3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 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
                    WHERE CUEN_COD = :ctadif INTO :CUENTA, :TIPOCUEN;
            ELSE
                begin
                EXECUTE PROCEDURE ERRORINT(62, :IDDOC, :ctadif, 2);
                CUENTA = ctadif;
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'I') then
                BEGIN
                EXECUTE PROCEDURE ERRORINT(62, :IDDOC, :CUENTA, 3);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                EXECUTE PROCEDURE ERRORINT(62, :IDDOC, :CUENTA, 4);
                TIPOCUEN = 'N';
                ERROR = ERROR + 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
                        WHERE CUEN_COD = :ctartfter INTO :CUENTA, :TIPOCUEN;
                ELSE
                    begin
                    EXECUTE PROCEDURE ERRORINT(62, :IDDOC, :ctartfter, 2);
                    CUENTA = ctartfter;
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    end
                if (TIPOCUEN = 'I') then
                    BEGIN
                    EXECUTE PROCEDURE ERRORINT(62, :IDDOC, :CUENTA, 3);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    EXECUTE PROCEDURE ERRORINT(62, :IDDOC, :CUENTA, 4);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 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
                        WHERE CUEN_COD = :ctartivar INTO :CUENTA, :TIPOCUEN;
                ELSE
                    begin
                    EXECUTE PROCEDURE ERRORINT(62, :IDDOC, :ctartivar, 2);
                    CUENTA = ctartivar;
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    end
                if (TIPOCUEN = 'I') then
                    BEGIN
                    EXECUTE PROCEDURE ERRORINT(62, :IDDOC, :CUENTA, 3);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    EXECUTE PROCEDURE ERRORINT(62, :IDDOC, :CUENTA, 4);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 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
                        WHERE CUEN_COD = :ctarticar INTO :CUENTA, :TIPOCUEN;
                ELSE
                    begin
                    EXECUTE PROCEDURE ERRORINT(62, :IDDOC, :ctarticar, 2);
                    CUENTA = ctarticar;
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    end
                if (TIPOCUEN = 'I') then
                    BEGIN
                    EXECUTE PROCEDURE ERRORINT(62, :IDDOC, :CUENTA, 3);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    EXECUTE PROCEDURE ERRORINT(62, :IDDOC, :CUENTA, 4);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 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
                        WHERE CUEN_COD = :ctartcreer INTO :CUENTA, :TIPOCUEN;
                ELSE
                    begin
                    EXECUTE PROCEDURE ERRORINT(62, :IDDOC, :ctartcreer, 2);
                    CUENTA = ctartcreer;
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    end
                if (TIPOCUEN = 'I') then
                    BEGIN
                    EXECUTE PROCEDURE ERRORINT(62, :IDDOC, :CUENTA, 3);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    EXECUTE PROCEDURE ERRORINT(62, :IDDOC, :CUENTA, 4);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 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
                    WHERE CUEN_COD = :CTADTO INTO :CUENTA, :TIPOCUEN;
            ELSE
                begin
                EXECUTE PROCEDURE ERRORINT(62, :IDDOC, :CTADTO, 2);
                CUENTA = CTADTO;
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'I') then
                BEGIN
                EXECUTE PROCEDURE ERRORINT(62, :IDDOC, :CUENTA, 3);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                EXECUTE PROCEDURE ERRORINT(62, :IDDOC, :CUENTA, 4);
                TIPOCUEN = 'N';
                ERROR = ERROR + 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
                WHERE CUEN_COD = :ctadif INTO :CUENTA, :TIPOCUEN;
        ELSE
            begin
            EXECUTE PROCEDURE ERRORINT(62, :IDDOC, :ctadif, 2);
            CUENTA = ctadif;
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            EXECUTE PROCEDURE ERRORINT(62, :IDDOC, :CUENTA, 3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'C') then
            BEGIN
            EXECUTE PROCEDURE ERRORINT(62, :IDDOC, :CUENTA, 4);
            TIPOCUEN = 'N';
            ERROR = ERROR + 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
                WHERE CUEN_COD = :CTARTFTE INTO :CUENTA, :ES_RETENCION, :TIPOCUEN;
        ELSE
            begin
            EXECUTE PROCEDURE ERRORINT(62, :IDDOC, :CTARTFTE, 2);
            CUENTA = CTARTFTE;
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            EXECUTE PROCEDURE ERRORINT(62, :IDDOC, :CUENTA, 3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'C') then
            BEGIN
            EXECUTE PROCEDURE ERRORINT(62, :IDDOC, :CUENTA, 4);
            TIPOCUEN = 'N';
            ERROR = ERROR + 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
                WHERE CUEN_COD = :CTARTIVA INTO :CUENTA, :ES_RETENCION, :TIPOCUEN;
        ELSE
            begin
            EXECUTE PROCEDURE ERRORINT(62, :IDDOC, :CTARTIVA, 2);
            CUENTA = CTARTIVA;
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            EXECUTE PROCEDURE ERRORINT(62, :IDDOC, :CUENTA, 3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'C') then
            BEGIN
            EXECUTE PROCEDURE ERRORINT(62, :IDDOC, :CUENTA, 4);
            TIPOCUEN = 'N';
            ERROR = ERROR + 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
                WHERE CUEN_COD = :CTARTICA INTO :CUENTA, :ES_RETENCION, :TIPOCUEN;
        ELSE
            begin
            EXECUTE PROCEDURE ERRORINT(62, :IDDOC, :CTARTICA, 2);
            CUENTA = CTARTICA;
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            EXECUTE PROCEDURE ERRORINT(62, :IDDOC, :CUENTA, 3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'C') then
            BEGIN
            EXECUTE PROCEDURE ERRORINT(62, :IDDOC, :CUENTA, 4);
            TIPOCUEN = 'N';
            ERROR = ERROR + 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
                WHERE CUEN_COD = :ctartcree INTO :CUENTA, :ES_RETENCION, :TIPOCUEN;
        ELSE
            begin
            EXECUTE PROCEDURE ERRORINT(62, :IDDOC, :ctartcree, 2);
            CUENTA = ctartcree;
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            EXECUTE PROCEDURE ERRORINT(62, :IDDOC, :CUENTA, 3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'C') then
            BEGIN
            EXECUTE PROCEDURE ERRORINT(62, :IDDOC, :CUENTA, 4);
            TIPOCUEN = 'N';
            ERROR = ERROR + 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
                WHERE CUEN_COD = :CTABASE INTO :CUENTA, :TIPOCUEN;
        ELSE
            begin
            EXECUTE PROCEDURE ERRORINT(62, :IDDOC, :CTABASE, 2);
            CUENTA = CTABASE;
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            EXECUTE PROCEDURE ERRORINT(62, :IDDOC, :CUENTA, 3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'C') then
            BEGIN
            EXECUTE PROCEDURE ERRORINT(62, :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, :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
                    WHERE CUEN_COD = :CTABASE INTO :CUENTA, :TIPOCUEN;
            ELSE
                begin
                EXECUTE PROCEDURE ERRORINT(62, :IDDOC, :CTABASE, 2);
                CUENTA = CTABASE;
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'I') then
                BEGIN
                EXECUTE PROCEDURE ERRORINT(62, :IDDOC, :CUENTA, 3);
                TIPOCUEN = 'N';
                ERROR = ERROR + 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)))
                        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 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
                        WHERE CUEN_COD = :CTABASE INTO :CUENTA, :TIPOCUEN;
                ELSE
                    begin
                    EXECUTE PROCEDURE ERRORINT(62, :IDDOC, :CTABASE, 2);
                    CUENTA = CTABASE;
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 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';
                    ERROR = ERROR + 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
                WHERE CUEN_COD = :CTADIC INTO :CUENTA, :TIPOCUEN;
        ELSE
            begin
            EXECUTE PROCEDURE ERRORINT(62, :IDDOC, :CTADIC, 2);
            CUENTA = CTADIC;
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            EXECUTE PROCEDURE ERRORINT(62, :IDDOC, :CUENTA, 3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'C') then
            BEGIN
            EXECUTE PROCEDURE ERRORINT(62, :IDDOC, :CUENTA, 4);
            TIPOCUEN = 'N';
            ERROR = ERROR + 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 (ERROR > 0) then
        VER = 'S';
    SUSPEND;
    END /* EXISTE LA INTERFAZ */
  ELSE
    BEGIN
    EXECUTE PROCEDURE ERRORINT(62, :IDDOC, :PREF, 1);
    ERROR = ERROR + 1;
    VER = 'S';
    SUSPEND;
    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;
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 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
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;
   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 ^ ;

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);
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;
        /* 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 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
                        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 */

            /* 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 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
                        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
                        /* 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 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(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 /* 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
                    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_ENTRADA (
    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 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, 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 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);
        
    /* BORRE CUALQUEIR CONTABILIZACION PREVIA */
    DELETE FROM CONTABILIZACION WHERE CNTB_TIPOREF = 11 AND CNTB_IDREF = :IDDOC;

    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);
        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, '', 11, :IDDOC, :PREFIJO, :NUMERO, 'N');
        NUMITEMS = 0;
        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 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
                    WHERE CUEN_COD = :CTABASE INTO :CUENTA, :TIPOCUEN;
                if (CUENTA IS NULL) then
                    begin
                    EXECUTE PROCEDURE ERRORINT(11, :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 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(11, :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
                    WHERE CUEN_COD = :CTABASE INTO :CUENTA, :TIPOCUEN;
                if (CUENTA IS NULL) then
                    begin
                    EXECUTE PROCEDURE ERRORINT(11, :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(11, :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
                    WHERE CUEN_COD = :CTABASE INTO :CUENTA, :TIPOCUEN;
                if (CUENTA IS NULL) then
                    begin
                    EXECUTE PROCEDURE ERRORINT(11, :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 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(11, :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 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
                        WHERE CUEN_COD = :CTAIVA INTO :CUENTA, :TIPOCUEN;
                    if (CUENTA IS NULL) then
                        begin
                        EXECUTE PROCEDURE ERRORINT(11, :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 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(11, :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
                        WHERE CUEN_COD = :CTAIVA INTO :CUENTA, :TIPOCUEN;
                    if (CUENTA IS NULL) then
                        begin
                        EXECUTE PROCEDURE ERRORINT(11, :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(11, :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
                    WHERE CUEN_COD = :CTAIVA INTO :CUENTA, :TIPOCUEN;
                if (CUENTA IS NULL) then
                    begin
                    EXECUTE PROCEDURE ERRORINT(11, :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 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(11, :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 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
                        WHERE CUEN_COD = :CTACONSUMO INTO :CUENTA, :TIPOCUEN;
                    if (CUENTA IS NULL) then
                        begin
                        EXECUTE PROCEDURE ERRORINT(11, :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 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(11, :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
                    WHERE CUEN_COD = :CTACONSUMO INTO :CUENTA, :TIPOCUEN;
                if (CUENTA IS NULL) then
                    begin
                    EXECUTE PROCEDURE ERRORINT(11, :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 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(11, :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
                    WHERE CUEN_COD = :CUENTAADIC INTO :CUENTA, :TIPOCUEN;
                if (CUENTA IS NULL) then
                    begin
                    EXECUTE PROCEDURE ERRORINT(11, :IDDOC, :CUENTAADIC, 2);
                    CUENTA = CUENTAADIC;
                    ERROR = ERROR + 1;
                    end
                /* DEPENDE DEL TIPO DE CUENTA */
                if (TIPOCUEN = 'I') then
                    BEGIN
                    EXECUTE PROCEDURE ERRORINT(11, :IDDOC, :CUENTA, 3);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    EXECUTE PROCEDURE ERRORINT(11, :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
                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(11, :IDDOC, :CUENTA, 3);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                EXECUTE PROCEDURE ERRORINT(11, :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(11, :IDDOC, :PREFIJO, 1);
    ERROR = ERROR + 1;
    VER = 'S';
    END
SUSPEND;
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 ^ ;

CREATE OR ALTER procedure CONTABIL_FACTCOMP (
    IDDOC integer,
    IDINTER integer)
returns (
    ERROR integer,
    VER char(1),
    IDC integer)
AS
DECLARE VARIABLE PREFIJO VARCHAR(4);
DECLARE VARIABLE NUM VARCHAR(8);
DECLARE VARIABLE NUMERO VARCHAR(10);
DECLARE VARIABLE FECAUX DATE;
DECLARE VARIABLE FECHA CHAR(8);
DECLARE VARIABLE CONCEPTO CHAR(60);
DECLARE VARIABLE VENCEAUX DATE;
DECLARE VARIABLE VENCE CHAR(8);
DECLARE VARIABLE VRDTO NUMERIC(18,2);
DECLARE VARIABLE VRADIC NUMERIC(18,2);
DECLARE VARIABLE VRSUBT NUMERIC(18,2);
DECLARE VARIABLE VRIVA NUMERIC(18,2);
DECLARE VARIABLE PRTFTE NUMERIC(9,2);
DECLARE VARIABLE VRRTFTE NUMERIC(18,2);
DECLARE VARIABLE VRRTIVA NUMERIC(18,2);
DECLARE VARIABLE PRTICA NUMERIC(9,2);
DECLARE VARIABLE VRRTICA NUMERIC(18,2);
DECLARE VARIABLE 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 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', TICO_COD, PRCO_PRE, INCO_INVEN, INCO_IVA, INCO_CONSUMO, INCO_CXP, INCO_RTFTE, INCO_RTIVA, INCO_RTICA, INCO_RTCREE,
    INCO_CTAINVEN, INCO_CTAIVA, INCO_CTACONSUMO, INCO_CTADTO, INCO_CTAADIC, INCO_CTAEXTRA, INCO_CTACXP, INCO_CTARTFTE, INCO_CTARTIVA,
    INCO_CTARTICA, INCO_CTARTCREE, INCO_CONFIRMAR, INCO_CENTRO
    FROM INTERFAZ_COMPRAS WHERE INCO_ID = :IDINTER
    INTO :EXISTE, :TIPOCOMP, :PREFCONT, :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
    /* BORRE CONTABILIZACION PREVIA */
    DELETE FROM CONTABILIZACION WHERE CNTB_TIPOREF = 21 AND CNTB_IDREF = :IDDOC;
    /* ENCABEZADO DE LA FACTURA */
    SELECT PREF_PRE, FACO_NUMERO, FACO_FECHA, F.TERC_NIT, FACO_IMPTOS, FACO_VENCE, FACO_DTOMONTO, FACO_ADICIONAL, FACO_IVAMONTO,
        FACO_EXTRA, FACO_TOTAL, FACO_RTFTEPORC, FACO_RTFTEMONTO, FACO_RTIVAPOR, FACO_RTIVAMONTO, FACO_RTICAPOR, FACO_RTICAMONTO,
        FACO_RTCREE, FACO_RTCREEM, TERC_NOM, PROV_CTARTFTE, PROV_CTARTIVA, PROV_CTARTICA, PROV_CTARTCREE, PROV_CTAPAGAR, FACO_NUMPROV,
        FACO_ANULADO, 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, :FECAUX, :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(:FECAUX) returning_values (:FECHA);
        EXECUTE PROCEDURE FECHA_A_CONTA(:VENCEAUX) returning_values (:VENCE);
        if (NUMPROV IS NULL) then
            NUMPROV = NUMERO;
        CONCEPTO = 'FC No.' || NUMERO || '-' || SUBSTR(NOMBRE,1,26) || '-NPROV.' || NUMPROV;
        IDC = GEN_ID(ID_CONTABILIZA, 1);
        INSERT INTO CONTABILIZACION (CNTB_ID, CNTB_TIPOCOMP, CNTB_PREFCNT, CNTB_NUMERO, CNTB_FECHA, CNTB_CONCEPTO, CNTB_REF, CNTB_TIPOREF, CNTB_IDREF, CNTB_PREFREF, CNTB_NUMREF, CNTB_PROCESADO)
            VALUES (:IDC, :TIPOCOMP, :PREFCONT, :NUM, :FECHA, :CONCEPTO, '', 21, :IDDOC, :PREFIJO, :NUM, 'N');
        NUMITEMS = 0;
        SUMA = 0;
        NETO = 0;
        ERROR = 0;
        EXECUTE PROCEDURE LEE_CONFIGURACION('COMPRAS', 'FACTURAS', '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 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(21, :IDDOC, :CTAINVEN, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 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 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(21, :IDDOC, :CTAINVEN, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                  if (ERRORC <> 0) then
                    ERROR = ERROR + 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 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(21, :IDDOC, :CTAIVA, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (TIPOCUEN = 'I') then
                    BEGIN
                    FOR SELECT F.ARTI_COD, FCDE_IVAMONTO, (FCDE_CANT * (FCDE_PRUNIT-FCDE_DTOMONTO)), TAIV_PORC, FCDE_CONSUMO
                        FROM ARTICULO A, CONTABIL_ARTICULO C, FACTURAS_COMPRAS_DETALLE F, TARIFA_IVA T WHERE F.FACO_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND COAR_CTAIVAV = :CUENTA AND A.TAIV_COD = T.TAIV_COD
                        INTO :ARTICULO, :IMPTOS, :MONTO, :PORCIVA, :VALORADIC
                    DO
                        BEGIN
                        if (MERCANCIA <> 0) then
                            IMPTOS = CAST(IMPTOS AS DOUBLE PRECISION) * VRSUBT / MERCANCIA;
                        else
                            IMPTOS = 0;
                        if (IMPINC = 'S') then
                            BEGIN
                            MONTO = MONTO - IMPTOS;
                            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(21, :IDDOC, :CTAIVA, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (TIPOCUEN = 'I') then
                    BEGIN
                    FOR SELECT F.ARTI_COD, (FCDE_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 C, FACTURAS_COMPRAS_DETALLE F
                WHERE F.FACO_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD GROUP BY COAR_CTACONS INTO :CTACONSUMO, :IMPTOS
            DO
              if (IMPTOS <> 0) then
                BEGIN
                execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
                EXECUTE PROCEDURE CUENTA_INTERFAZ(21, :IDDOC, :CTACONSUMO, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (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(21, :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, '', :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(21, :IDDOC, :CTADTO, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_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(21, :IDDOC, :CTAADIC, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_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(21, :IDDOC, :CTAEXTRA, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'C') then
                BEGIN
                if (vrextra > 0) then
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_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(21, :IDDOC, :CTARTFTE, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_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 C, FACTURAS_COMPRAS_DETALLE F
            WHERE F.faco_id = :IDDOC AND F.ARTI_COD = C.ARTI_COD
            GROUP BY COAR_CTARTFTE
            INTO :CTARTFTE, :PRTFTE, :baseadic,  :MONTO, :VRRTFTE
            DO
            BEGIN
            MONTO = MONTO * FACTOR * -1;
            if (ABS(MONTO) >= :baseadic) then
                BEGIN
                VRRTFTE = VRRTFTE * FACTOR / 100;
                execute procedure redondee(VRRTFTE, DIG) returning_values (VRRTFTE);
                execute procedure redondee(MONTO, DIG) returning_values (MONTO);
                if (VRRTFTE <> 0) then
                    BEGIN
                    EXECUTE PROCEDURE CUENTA_INTERFAZ(21, :IDDOC, :CTARTFTE, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
                    if (ERRORC <> 0) then
                        ERROR = ERROR + 1;
                    if (TIPOCUEN = 'C') then
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_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(21, :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, '', 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(21, :IDDOC, :CTARTICA, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_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(21, :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, '', 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(21, :IDDOC, :CTACXP, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'C') then
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_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(21, :IDDOC, :CUENTAADIC, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (TIPOCUEN = 'C') then
                    BEGIN
                    if (DBADIC = 'S') then
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_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(21, :IDDOC, :CTAADIC, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (TIPOCUEN = 'C') then
                    BEGIN
                    if (NETO < 0) then
                        BEGIN
                        NETO = NETO * -1;
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_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 (ERROR > 0) then
        VER = 'S';
    SUSPEND;
    END
ELSE
    BEGIN
    EXECUTE PROCEDURE ERRORINT(21, :IDDOC, :PREFIJO, 1);
    ERROR = ERROR + 1;
    VER = 'S';
    SUSPEND;
    END
END^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE CONTABILICE_COMP_SIMPLIFICADO(
    IDI INTEGER)
RETURNS (
    ID INTEGER,
    PREF VARCHAR(4),
    NUMERO VARCHAR(8),
    ESTADO VARCHAR(20),
    IDC INTEGER)
AS
DECLARE VARIABLE VER CHAR(2);
declare variable ERROR INTEGER;
BEGIN
FOR SELECT FACO_ID, PREF_PRE, FACO_NUMERO FROM FACTURAS_COMPRA C, PROVEEDORES P WHERE
    C.TERC_NIT = P.TERC_NIT AND PROV_SIMPLIFICADO = 'S' AND FACO_ANULADO = 'N'
    ORDER BY FACO_ID INTO :ID, :PREF, :NUMERO
DO
  BEGIN
  ESTADO = 'PROCESANDO';
  SUSPEND;
  /* BORRE LA CONTABILIZACION */
/*  delete FROM comprobante_detalle WHERE ENCO_CONSEC IN (SELECT ENCO_CONSEC FROM COMPROBANTE_ENCABEZADO WHERE ENCO_TIPOREF = 21 AND ENCO_IDREF = :ID);
  DELETE FROM comprobante_encabezado  WHERE ENCO_TIPOREF = 21 AND ENCO_IDREF = :ID; */
  EXECUTE PROCEDURE CONTABIL_FACTCOMP (:ID, :IDI) RETURNING_VALUES (:ERROR, VER, :IDC);
  if (ERROR = 0) then
    BEGIN
/*    EXECUTE PROCEDURE CONTABILIZA_PENDIENTE (:IDC); */
    ESTADO = 'OK';
    END
  ELSE
    ESTADO = 'ERROR';
  suspend;
  END
END
^

SET TERM ; ^

SET TERM ^ ;

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

CREATE OR ALTER procedure CONTABIL_FACTCOMP_IVA (
    IDDOC integer,
    IDINTER integer)
returns (
    ERROR integer,
    VER char(1),
    IDC integer)
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 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 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 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 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;
BEGIN
  /* INTERFACE */
  EXISTE = 'N';
  SELECT 'S', TICO_COD, PRCO_PRE, INCO_INVEN, INCO_IVA, INCO_CONSUMO, INCO_CXP, INCO_RTFTE, INCO_RTIVA, INCO_RTICA, INCO_CTAINVEN, INCO_CTAIVA, INCO_CTACONSUMO, INCO_CTADTO, INCO_CTAADIC, INCO_CTAEXTRA, INCO_CTACXP, INCO_CTARTFTE, INCO_CTARTIVA, INCO_CTARTICA, INCO_CONFIRMAR, INCO_CENTRO
    FROM INTERFAZ_COMPRAS WHERE INCO_ID = :IDINTER INTO :EXISTE, :TIPOCOMP, :PREFCONT, :INVEN, :IVA, :CONSUMO, :CXP, :RTFTE, :RTIVA, :RTICA, :CTAINVEN, :CTAIVA, :CTACONSUMO, :CTADTO, :CTAADIC, :CTAEXTRA, :CTACXP, :CTARTFTE, :CTARTIVA, :CTARTICA, :VER, :CENT;
  if (EXISTE = 'S') then
    BEGIN
    /* BORRE CONTABILIZACION PREVIA */
    DELETE FROM CONTABILIZACION WHERE CNTB_TIPOREF = 21 AND CNTB_IDREF = :IDDOC;
    /* ENCABEZADO DE LA FACTURA */
    SELECT PREF_PRE, FACO_NUMERO, FACO_FECHA, F.TERC_NIT, FACO_IMPTOS, FACO_VENCE, FACO_DTOMONTO, FACO_ADICIONAL, FACO_IVAMONTO, FACO_EXTRA, FACO_TOTAL, FACO_RTFTEPORC, FACO_RTFTEMONTO, FACO_RTIVAPOR, FACO_RTIVAMONTO, FACO_RTICAPOR, FACO_RTICAMONTO, TERC_NOM, PROV_CTARTFTE, PROV_CTARTIVA, PROV_CTARTICA, PROV_CTAPAGAR, FACO_NUMPROV, FACO_ANULADO
        FROM FACTURAS_COMPRA F, TERCEROS T, PROVEEDORES P WHERE FACO_ID = :IDDOC AND F.TERC_NIT = T.TERC_NIT AND T.TERC_NIT = P.TERC_NIT
        INTO :PREFIJO, :NUM, :FECAUX, :NIT, :IMPINC, :VENCEAUX, :VRDTO, :VRADIC, :VRIVA, :VREXTRA, :VRTOTAL, :PRTFTE, :VRRTFTE, :PORC, :VRRTIVA, :PRTICA, :VRRTICA, :NOMBRE, TCTARTFTE, TCTARTIVA, TCTARTICA, TCTAPROV, :NUMPROV, :ANULADO;
    /* 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(:FECAUX) returning_values (:FECHA);
        EXECUTE PROCEDURE FECHA_A_CONTA(:VENCEAUX) returning_values (:VENCE);
        if (NUMPROV IS NULL) then
            NUMPROV = NUMERO;
        CONCEPTO = 'FC No.' || NUMERO || '-' || SUBSTR(NOMBRE,1,26) || '-NPROV.' || NUMPROV;
        IDC = GEN_ID(ID_CONTABILIZA, 1);
        INSERT INTO CONTABILIZACION (CNTB_ID, CNTB_TIPOCOMP, CNTB_PREFCNT, CNTB_NUMERO, CNTB_FECHA, CNTB_CONCEPTO, CNTB_REF, CNTB_TIPOREF, CNTB_IDREF, CNTB_PREFREF, CNTB_NUMREF, CNTB_PROCESADO)
            VALUES (:IDC, :TIPOCOMP, :PREFCONT, :NUM, :FECHA, :CONCEPTO, '', 21, :IDDOC, :PREFIJO, :NUM, 'N');
        NUMITEMS = 0;
        SUMA = 0;
        NETO = 0;
        ERROR = 0;
        EXECUTE PROCEDURE LEE_CONFIGURACION('COMPRAS', 'FACTURAS', '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 = 'GENERAL' AND CONF_PROPIEDAD = 'REDONDEO AL MULTIPLO DE DIEZ EN TOTALES' INTO :DIG;
        if (INVEN = 'A') then
            BEGIN
            FOR SELECT MAX(TAIV_CTACOMP), SUM(CAST(FCDE_CANT AS DOUBLE PRECISION) * (FCDE_PRUNIT-FCDE_DTOMONTO)), SUM(FCDE_IVAMONTO), SUM(FCDE_CONSUMO), MAX(F.BODE_COD)
                FROM TARIFA_IVA T, FACTURAS_COMPRAS_DETALLE F WHERE F.FACO_ID = :IDDOC AND F.fcde_ivaporc = T.taiv_porc
                GROUP BY TAIV_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(21, :IDDOC, :CTAINVEN, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (TIPOCUEN = 'I') then
                    BEGIN
                    FOR SELECT F.ARTI_COD, (FCDE_CANT * (FCDE_PRUNIT-FCDE_DTOMONTO)), FCDE_IVAMONTO, FCDE_CONSUMO
                        FROM ARTICULO A, CONTABIL_ARTICULO C, FACTURAS_COMPRAS_DETALLE F WHERE F.FACO_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND COAR_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
                        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(21, :IDDOC, :CTAINVEN, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                  if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                  if (TIPOCUEN = 'I') 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') then
            BEGIN
            FOR SELECT MAX(TAIV_CTAIVACMP), SUM(FCDE_IVAMONTO), SUM(CAST(FCDE_CANT AS DOUBLE PRECISION) * (FCDE_PRUNIT-FCDE_DTOMONTO)), SUM(FCDE_CONSUMO)
                FROM TARIFA_IVA T, FACTURAS_COMPRAS_DETALLE F
                WHERE F.FACO_ID = :IDDOC AND F.fcde_ivaporc = T.taiv_porc AND FCDE_IVAMONTO <> 0
                GROUP BY TAIV_CTAIVACMP
                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
                MONTO = CAST(MONTO AS DOUBLE PRECISION) * VRSUBT / MERCANCIA;
                execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
                execute procedure redondee(MONTO, DIG) returning_values (MONTO);
                EXECUTE PROCEDURE CUENTA_INTERFAZ(21, :IDDOC, :CTAIVA, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (TIPOCUEN = 'I') then
                    BEGIN
                    FOR SELECT F.ARTI_COD, FCDE_IVAMONTO, (FCDE_CANT * (FCDE_PRUNIT-FCDE_DTOMONTO)), TAIV_PORC, FCDE_CONSUMO
                        FROM ARTICULO A, CONTABIL_ARTICULO C, FACTURAS_COMPRAS_DETALLE F, TARIFA_IVA T WHERE F.FACO_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND COAR_CTAIVAV = :CUENTA AND A.TAIV_COD = T.TAIV_COD
                        INTO :ARTICULO, :IMPTOS, :MONTO, :PORCIVA, :VALORADIC
                    DO
                        BEGIN
                        IMPTOS = CAST(IMPTOS AS DOUBLE PRECISION) * VRSUBT / MERCANCIA;
                        if (IMPINC = 'S') then
                            BEGIN
                            MONTO = MONTO - IMPTOS;
                            if (FOMENTO <> 'SI' ) then
                                MONTO = MONTO - VALORADIC;
                            END
                        MONTO = CAST(MONTO AS DOUBLE PRECISION) * VRSUBT / MERCANCIA;
                        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') 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
                IMPTOS = CAST(IMPTOS AS DOUBLE PRECISION) * VRSUBT / MERCANCIA;
                if (IMPINC = 'S') then
                    BEGIN
                    MONTO = MONTO - IMPTOS;
                    if (FOMENTO <> 'SI' ) then
                        MONTO = MONTO - VALORADIC;
                    END
                MONTO = CAST(MONTO AS DOUBLE PRECISION) * VRSUBT / MERCANCIA;
                execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
                execute procedure redondee(MONTO, DIG) returning_values (MONTO);
                EXECUTE PROCEDURE CUENTA_INTERFAZ(21, :IDDOC, :CTAIVA, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (TIPOCUEN = 'I') then
                    BEGIN
                    FOR SELECT F.ARTI_COD, (FCDE_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
                        IMPTOS = CAST(IMPTOS AS DOUBLE PRECISION) * VRSUBT / MERCANCIA;
                        if (IMPINC = 'S') then
                            BEGIN
                            MONTO = MONTO - IMPTOS;
                            if (FOMENTO <> 'SI' ) then
                                MONTO = MONTO - VALORADIC;
                            END
                        MONTO = CAST(MONTO AS DOUBLE PRECISION) * VRSUBT / MERCANCIA;
                        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 C, FACTURAS_COMPRAS_DETALLE F
                WHERE F.FACO_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD GROUP BY COAR_CTACONS INTO :CTACONSUMO, :IMPTOS
            DO
              if (IMPTOS <> 0) then
                BEGIN
                execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
                EXECUTE PROCEDURE CUENTA_INTERFAZ(21, :IDDOC, :CTACONSUMO, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (FOMENTO <> 'SI') then
                    BEGIN
                    if (TIPOCUEN = 'I') then
                        BEGIN
                        FOR SELECT F.ARTI_COD, FCDE_CONSUMO FROM ARTICULO A, FACTURAS_COMPRAS_DETALLE F WHERE F.FACO_ID = :IDDOC INTO :ARTICULO, :IMPTOS
                            DO
                            BEGIN
                            if (IMPTOS <> 0) then
                                BEGIN
                                execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
                                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_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;
                                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, :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 = 'I') then
                        BEGIN
                        FOR SELECT F.ARTI_COD, FCDE_CONSUMO FROM ARTICULO A, FACTURAS_COMPRAS_DETALLE F WHERE F.FACO_ID = :IDDOC INTO :ARTICULO, :IMPTOS
                            DO
                            BEGIN
                            if (IMPTOS <> 0) then
                                BEGIN
                                execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
                                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_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, :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, :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(21, :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 = 'I') then
                    BEGIN
                    /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                    FOR SELECT F.ARTI_COD, FCDE_CONSUMO FROM ARTICULO A, FACTURAS_COMPRAS_DETALLE F WHERE F.FACO_ID = :IDDOC INTO :ARTICULO, :IMPTOS
                        DO
                        BEGIN
                        if (IMPTOS <> 0) then
                            BEGIN
                            execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
                            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_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;
                            NETO = NETO + IMPTOS;
                            END
                        END
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    /* INSERTE EL REGISTRO DE LA BASE */
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_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 = 'I') then
                    BEGIN
                    /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                    FOR SELECT F.ARTI_COD, FCDE_CONSUMO FROM ARTICULO A, FACTURAS_COMPRAS_DETALLE F WHERE F.FACO_ID = :IDDOC INTO :ARTICULO, :IMPTOS
                        DO
                        BEGIN
                        if (IMPTOS <> 0) then
                            BEGIN
                           execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
                           INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_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, :ARTICULO, 0, 0);
                            NUMITEMS = NUMITEMS + 1;
                            NETO = NETO - IMPTOS;
                            END
                        END
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    /* INSERTE EL REGISTRO DE LA BASE */
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_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(21, :IDDOC, :CTADTO, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_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(21, :IDDOC, :CTAADIC, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_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(21, :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, :VENCE, NULL, 0, 21);
                NUMITEMS = NUMITEMS + 1;
                NETO = NETO + 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, :NUMITEMS, :CUENTA, :CONCEPTO, '', :VREXTRA, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NUMITEMS = NUMITEMS + 1;
                NETO = NETO + VREXTRA;
                END
            end
          END

        /* DESCUENTE EL IMPOCONSUMO */
        SELECT SUM(FCDE_CONSUMO) FROM FACTURAS_COMPRAS_DETALLE F WHERE F.FACO_ID = :IDDOC INTO :IMPTOS;
        if (IMPTOS IS NULL) then
            IMPTOS = 0;
        vrsubt = vrsubt - IMPTOS;
        /* RETENCION FUENTE */
        if ((RTFTE = 'P') or (RTFTE = 'K')) then
          BEGIN
          execute procedure redondee(VRRTFTE, DIG) returning_values (VRRTFTE);
          if (VRRTFTE <> 0) then
            begin
            if (RTFTE = 'P') then
                CTARTFTE = TCTARTFTE;
            EXECUTE PROCEDURE CUENTA_INTERFAZ(21, :IDDOC, :CTARTFTE, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_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 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 (MONTO >= :baseadic) then
                BEGIN
                VRRTFTE = VRRTFTE * FACTOR / 100;
                execute procedure redondee(VRRTFTE, DIG) returning_values (VRRTFTE);
                execute procedure redondee(MONTO, DIG) returning_values (MONTO);
                if (VRRTFTE <> 0) then
                    BEGIN
                    EXECUTE PROCEDURE CUENTA_INTERFAZ(21, :IDDOC, :CTARTFTE, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
                    if (ERRORC <> 0) then
                        ERROR = ERROR + 1;
                    if (TIPOCUEN = 'C') then
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :VRRTFTE, :VRSUBT, :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, :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(21, :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, '', 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(21, :IDDOC, :CTARTICA, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_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
        /* CIERRE EL COMPROBANTE CONTRA LA CUENTA DEL TERCERO O LA CONSTANTE */
        if ((CXP = 'P') or (CXP = 'K')) then
            BEGIN
            SUMA = VRTOTAL - SUMA;
            execute procedure redondee(SUMA, DIG) returning_values (SUMA);
            if (CXP = 'P') then
                CTACXP = TCTAPROV;
            EXECUTE PROCEDURE CUENTA_INTERFAZ(21, :IDDOC, :CTACXP, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'C') then
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_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(21, :IDDOC, :CUENTAADIC, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (TIPOCUEN = 'C') then
                    BEGIN
                    if (DBADIC = 'S') then
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_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(21, :IDDOC, :CTAADIC, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (TIPOCUEN = 'C') then
                    BEGIN
                    if (NETO < 0) then
                        BEGIN
                        NETO = NETO * -1;
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_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 (ERROR > 0) then
        VER = 'S';
    SUSPEND;
    END
ELSE
    BEGIN
    EXECUTE PROCEDURE ERRORINT(21, :IDDOC, :PREFIJO, 1);
    ERROR = ERROR + 1;
    VER = 'S';
    SUSPEND;
    END
END^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER procedure CONTABIL_FACTURA (
    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 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,
    FECINI DATE,
    FECFIN DATE,
    MORA NUMERIC(9,4))
RETURNS (
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(8),
    NIT VARCHAR(20),
    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.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 S.clcu_cod = '01' AND
        C.vend_cod >= :vendini AND C.vend_cod <= :vendfin AND ((c.grca_cod is null and :grpini = 0 ) or (C.grca_cod >= :grpini AND C.grca_cod <= :grpfin)) AND
        ((c.zona_cod is null and :zonini = '') or (C.zona_cod >= :zonini AND C.zona_cod <= :zonfin))
    INTO :NIT, :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_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', 'N', :TOTAL, :BOD, :OBS, NULL, NULL, 0, USER, '01', '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 CLIE_VALORMES FROM CLIENTES WHERE TERC_NIT = :NIT 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, NULL, '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 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 ^ ;

CREATE OR ALTER procedure CONTABIL_FACTURAS_CONTADO (
    FECFAC date,
    NIT varchar(20),
    PREF varchar(4),
    PTVTA integer,
    IDINTER integer)
returns (
    ERROR integer,
    VER char(1),
    IDC integer)
AS
declare variable num varchar(8);
declare variable numero varchar(10);
declare variable fecha char(8);
declare variable conc char(120);
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 nombre varchar(60);
declare variable proy varchar(4);
declare variable centro varchar(4);
declare variable porc numeric(5,2);
declare variable porcajus numeric(9,2);
declare variable debito numeric(18,2);
declare variable credito numeric(18,2);
declare variable nroi integer;
declare variable art 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 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 dig integer;
declare variable mercancia numeric(18,2);
declare variable factor double precision;
declare variable cent char(1);
declare variable factoraj double precision;
BEGIN
/* 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 = 0;
  /* BUSQUE EL CENTRO DEL PUNTO, LA BODEGA, O EL PREFIJO  */
  IF (CENT = 'B') THEN
    SELECT B.BODE_CENTRO, B.BODE_PROY FROM BODEGA B, PUNTO_VENTA P
        WHERE B.BODE_COD = P.BODE_COD AND P.ptvt_id = :ptvta INTO :CENTRO, :PROY;
  IF (CENT = 'V') THEN
    SELECT MAX(V.CENT_COD), MAX(V.PROY_COD) FROM VENDEDORES V
        WHERE V.PTVT_ID = :PTVTA INTO :CENTRO, :PROY;
  IF (CENT = 'P') THEN
    SELECT P.PREF_PROY, P.PREF_CENTRO FROM PREFIJOS P
        WHERE P.PREF_PRE = :PREF AND P.TIDO_COD = 31 INTO :CENTRO, :PROY;
  /* TRAIGA LOS DATOS DEL CLIENTE */
  SELECT TERC_NOM, TERC_CTARTFTE, TERC_CTARTIVA, TERC_CTARTICA, TERC_CTAVENTA, TERC_CTACLIENTE
        FROM TERCEROS T WHERE TERC_NIT = :NIT
        INTO :NOMBRE, TCTARTFTE, TCTARTIVA, TCTARTICA, TCTAVENTA, TCTACLIEN;
  SELECT SUM(FACT_DTOMONTO), SUM(FACT_ADICIONAL), SUM(FACT_IVAMONTO), SUM(FACT_EXTRA), SUM(FACT_TOTAL), SUM(FACT_RTFTEMONTO), SUM(FACT_RTIVAMONTO), SUM(FACT_RTICAMONTO), MAX(FACT_IVAINC)
        FROM FACTURAS F WHERE FACT_FECHA = :FECFAC AND FACT_ANULADO = 'N' AND PTVT_ID = :ptvta AND PREF_PRE = :PREF
        INTO :VRDTO, :VRADIC, :VRIVA, :VREXTRA, :VRTOTAL, :VRRTFTE, :VRRTIVA, :VRRTICA, :impinc;
  VRSUBT = VRTOTAL - VREXTRA - VRIVA; /* BASE DE RETEFTE Y RETEICA */
  MERCANCIA = VRSUBT - VRADIC + VRDTO;
  EXECUTE PROCEDURE FECHA_A_CONTA(:FECFAC) returning_values (:FECHA);
  VENCE = FECHA;
  /* REGISTRE EL ENCABEZADO CONTABLE */
  IDC = GEN_ID(ID_CONTABILIZA, 1);
  CONC = 'RESUMEN VENTAS ' || FECHA;
  NUM = SUBSTR(FECHA, 3, 8);
  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, '', 0, 0, :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), SUM(FADE_IVAMONTO+FADE_CONSUMO), MAX(TAIV_PORC)
            FROM ARTICULO A, CONTABIL_ARTICULO C, FACTURAS_DETALLE FD, FACTURAS F, tarifa_iva T
            WHERE F.FACT_ID = FD.FACT_ID AND FACT_FECHA = :FECFAC AND FD.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND A.taiv_cod = T.taiv_cod AND 
            F.PREF_PRE = :PREF AND F.PTVT_ID = :PTVTA AND FACT_ANULADO = 'N' AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
            GROUP BY COAR_CTAVNT, T.taiv_porc
            INTO :CTAVENTAS, :MONTO, :IMPTOS, :porcajus
            DO
            BEGIN
            if (IMPINC = 'S') then
                MONTO = MONTO - IMPTOS;
            factoraj = null;
            SELECT AJCI_FACTOR FROM AJUSTE_CIERRE
                WHERE AJCI_PORC = :porcajus AND AJCI_FECINI <= :fecfac AND AJCI_FECFIN >= :fecfac
                INTO :factoraj;
            if (factoraj is not null) then
                MONTO = MONTO * factoraj;

            if ((CTADTO IS NULL) OR (CTADTO = '')) then
                MONTO = MONTO * FACTOR;
            execute procedure redondee(MONTO, DIG) returning_values (MONTO);
            if (MONTO <> 0) then
                BEGIN
                CUENTA = NULL;
                SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                    WHERE CUEN_COD = :CTAVENTAS INTO :CUENTA, :TIPOCUEN;
                if (CUENTA IS NULL) then
                    begin
                    EXECUTE PROCEDURE ERRORINT(31, 0, :CTAVENTAS, 2);
                    CUENTA = CTAVENTAS;
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    end
                if (TIPOCUEN = 'I') then
                    BEGIN
                    /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                    FOR SELECT FD.ARTI_COD, (FADE_TOTAL), (FADE_IVAMONTO+FADE_CONSUMO)
                        FROM ARTICULO A, CONTABIL_ARTICULO C, FACTURAS_DETALLE FD, FACTURAS F
                        WHERE F.FACT_ID = FD.FACT_ID AND FACT_FECHA = :FECFAC AND F.PREF_PRE = :PREF AND F.PTVT_ID = :PTVTA AND FD.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND COAR_CTAINV = :CUENTA AND FACT_ANULADO = 'N' AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
                        INTO :ART, :MONTO, :IMPTOS
                    DO
                        BEGIN
                        if (IMPINC = 'S') 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), SUM(FADE_IVAMONTO+FADE_CONSUMO)
            FROM FACTURAS_DETALLE FD, FACTURAS F
            WHERE F.FACT_ID = FD.FACT_ID AND FACT_FECHA = :FECFAC AND F.PREF_PRE = :PREF AND F.PTVT_ID = :PTVTA AND FACT_ANULADO = 'N' AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
            INTO :MONTO, :IMPTOS;
        if (IMPINC = 'S') 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
            CUENTA = NULL;
            SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :CTAVENTAS INTO :CUENTA, :TIPOCUEN;
            if (CUENTA IS NULL) then
                begin
                EXECUTE PROCEDURE ERRORINT(31, 0, :CTAVENTAS, 2);
                CUENTA = CTAVENTAS;
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'I') then
                BEGIN
                /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                FOR SELECT FD.ARTI_COD, FADE_TOTAL, (FADE_IVAMONTO+FADE_CONSUMO)
                    FROM /*ARTICULO A,*/ FACTURAS_DETALLE FD, FACTURAS F
                    WHERE F.FACT_ID = FD.FACT_ID AND FACT_FECHA = :FECFAC AND F.PREF_PRE = :PREF AND F.PTVT_ID = :PTVTA AND FACT_ANULADO = 'N' AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
                    INTO :ART, :MONTO, :IMPTOS
                    DO
                    BEGIN
                    if (IMPINC = 'S') 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 /* 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), sum(FADE_CONSUMO), MAX(TAIV_PORC)
            FROM ARTICULO A, CONTABIL_ARTICULO C, FACTURAS_DETALLE FD, FACTURAS F, TARIFA_IVA T
            WHERE F.FACT_ID = FD.FACT_ID AND FACT_FECHA = :FECFAC AND F.PREF_PRE = :PREF AND F.PTVT_ID = :PTVTA AND A.taiv_cod = T.taiv_cod AND
            FD.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND FACT_ANULADO = 'N' AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
            GROUP BY COAR_CTAIVAV, T.taiv_porc
            INTO :CTAIVA, :IMPTOS, :MONTO, :VALORADIC, :porcajus
        DO
            BEGIN
            if (IMPINC = 'S') then
                MONTO = MONTO - IMPTOS - VALORADIC;
            MONTO = MONTO * -1;

            factoraj = null;
            SELECT AJCI_FACTOR FROM AJUSTE_CIERRE
                WHERE AJCI_PORC = :porcajus AND AJCI_FECINI <= :fecfac AND AJCI_FECFIN >= :fecfac
                INTO :factoraj;
            if (factoraj is not null) then
                BEGIN
                MONTO = MONTO * factoraj;
                IMPTOS = IMPTOS * factoraj;
                END

            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
                CUENTA = NULL;
                SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                    WHERE CUEN_COD = :CTAIVA INTO :CUENTA, :TIPOCUEN;
                if (CUENTA IS NULL) then
                    begin
                    EXECUTE PROCEDURE ERRORINT(31, 0, :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 FD.ARTI_COD, FADE_IVAMONTO, FADE_TOTAL, TAIV_PORC, FADE_CONSUMO
                        FROM ARTICULO A, CONTABIL_ARTICULO C, FACTURAS_DETALLE FD, FACTURAS F, TARIFA_IVA T
                        WHERE F.FACT_ID = FD.FACT_ID AND FACT_FECHA = :FECFAC AND F.PREF_PRE = :PREF AND F.PTVT_ID = :PTVTA AND FD.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND COAR_CTAIVAV = :CUENTA AND A.TAIV_COD = T.TAIV_COD AND FACT_ANULADO = 'N' AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
                        INTO :ART, :IMPTOS, :MONTO, :PORCIVA, :VALORADIC
                    DO
                        BEGIN
                        if (IMPINC = 'S') then
                            MONTO = MONTO - IMPTOS - 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), SUM(FADE_CONSUMO)
            FROM FACTURAS_DETALLE FD, FACTURAS F
            WHERE F.FACT_ID = FD.FACT_ID AND FACT_FECHA = :FECFAC AND F.PREF_PRE = :PREF AND F.PTVT_ID = :PTVTA AND FACT_ANULADO = 'N' AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
            INTO :IMPTOS, :MONTO, :valoradic;
        if (IMPINC = 'S') then
            MONTO = MONTO - IMPTOS - 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
            CUENTA = NULL;
            SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :CTAIVA INTO :CUENTA, :TIPOCUEN;
            if (CUENTA IS NULL) then
                begin
                EXECUTE PROCEDURE ERRORINT(31, 0, :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 FD.ARTI_COD, FADE_TOTAL, FADE_IVAMONTO, TAIV_PORC, FADE_CONSUMO
                    FROM ARTICULO A, FACTURAS_DETALLE FD, FACTURAS F, TARIFA_IVA T
                    WHERE F.FACT_ID = FD.FACT_ID AND FACT_FECHA = :FECFAC AND F.PREF_PRE = :PREF AND F.PTVT_ID = :PTVTA AND FD.arti_cod = A.arti_cod AND T.TAIV_COD=A.TAIV_COD AND FACT_ANULADO = 'N' AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
                    INTO :ART, :MONTO, :IMPTOS, :PORCIVA, :VALORADIC
                    DO
                    BEGIN
                    if (IMPINC = 'S') then
                        MONTO = MONTO - IMPTOS - 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') then
        BEGIN
        FOR SELECT MAX(COAR_CTACONS), SUM(FADE_CONSUMO)
            FROM ARTICULO A, CONTABIL_ARTICULO C, FACTURAS_DETALLE FD, FACTURAS F
            WHERE F.FACT_ID = FD.FACT_ID AND FACT_FECHA = :FECFAC AND F.PREF_PRE = :PREF AND F.PTVT_ID = :PTVTA AND FD.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND FACT_ANULADO = 'N' 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
                CUENTA = NULL;
                SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                    WHERE CUEN_COD = :CTACONSUMO INTO :CUENTA, :TIPOCUEN;
                if (CUENTA IS NULL) then
                    begin
                    EXECUTE PROCEDURE ERRORINT(31, 0, :CTACONSUMO, 2);
                    CUENTA = CTACONSUMO;
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    end
                if (TIPOCUEN = 'I') then
                    BEGIN
                    /* ES UNA CUENTA DE INVENTARIO, REGISTRE UNO A UNO LOS ARTICULOS */
                    FOR SELECT FD.ARTI_COD, FADE_CONSUMO
                        FROM ARTICULO A, CONTABIL_ARTICULO C, FACTURAS_DETALLE FD, FACTURAS F
                        WHERE F.FACT_ID = FD.FACT_ID AND FACT_FECHA = :FECFAC AND F.PREF_PRE = :PREF AND F.PTVT_ID = :PTVTA AND FD.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND COAR_CTACONS = :CUENTA AND FACT_ANULADO = 'N' 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 - CREDITO;
                    END
                END /* IMPTOS <> 0 */
            END /* FOR */
        END /* CONSUMO X ARTICULO */
    if (CONSUMO = 'K') then /* CONSUMO EN CTA CONSTANTE */
        BEGIN
        SELECT SUM(FADE_CONSUMO)
            FROM FACTURAS_DETALLE FD, FACTURAS F
            WHERE F.FACT_ID = FD.FACT_ID AND FACT_FECHA = :FECFAC AND F.PREF_PRE = :PREF AND F.PTVT_ID = :PTVTA AND FACT_ANULADO = 'N' AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL))
            INTO :IMPTOS;
        execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
        if (IMPTOS <> 0) then
            BEGIN
            CUENTA = NULL;
            SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :CTACONSUMO INTO :CUENTA, :TIPOCUEN;
            if (CUENTA IS NULL) then
                begin
                EXECUTE PROCEDURE ERRORINT(31, 0, :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 FD.ARTI_COD, FADE_CONSUMO
                    FROM /*ARTICULO A,*/ FACTURAS_DETALLE FD, FACTURAS F
                    WHERE F.FACT_ID = FD.FACT_ID AND FACT_FECHA = :FECFAC AND F.PREF_PRE = :PREF AND F.PTVT_ID = :PTVTA AND FACT_ANULADO = 'N' 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
            CUENTA = NULL;
            SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :CTADTO INTO :CUENTA, :TIPOCUEN;
            if (CUENTA IS NULL) then
                begin
                EXECUTE PROCEDURE ERRORINT(31, 0, :CTADTO, 2);
                CUENTA = CTADTO;
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'I') then
                begin
                EXECUTE PROCEDURE ERRORINT(31, 0, :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, '', :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
            CUENTA = NULL;
            SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :CTAADIC INTO :CUENTA, :TIPOCUEN;
            if (CUENTA IS NULL) then
                begin
                EXECUTE PROCEDURE ERRORINT(31, 0, :CTAADIC, 2);
                CUENTA = CTAADIC;
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'I') then
                begin
                EXECUTE PROCEDURE ERRORINT(31, 0, :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, :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
            CUENTA = NULL;
            SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :CTAEXTRA INTO :CUENTA, :TIPOCUEN;
            if (CUENTA IS NULL) then
                begin
                EXECUTE PROCEDURE ERRORINT(31, 0, :CTAEXTRA, 2);
                CUENTA = CTAEXTRA;
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'I') then
                begin
                EXECUTE PROCEDURE ERRORINT(31, 0, :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, :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 */
    /* 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;
        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, 0, :CTARTFTE, 2);
            CUENTA = CTARTFTE;
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            begin
            EXECUTE PROCEDURE ERRORINT(31, 0, :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, '', :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
        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;
        CUENTA = NULL;
        SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
            WHERE CUEN_COD = :CTARTIVA INTO :CUENTA, :TIPOCUEN;
        if (CUENTA IS NULL) then
            begin
            EXECUTE PROCEDURE ERRORINT(31, 0, :CTARTIVA, 2);
            CUENTA = CTARTIVA;
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            begin
            EXECUTE PROCEDURE ERRORINT(31, 0, :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, '', :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;
        CUENTA = NULL;
        SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
            WHERE CUEN_COD = :CTARTICA INTO :CUENTA, :TIPOCUEN;
        if (CUENTA IS NULL) then
            begin
            EXECUTE PROCEDURE ERRORINT(31, 0, :CTARTICA, 2);
            CUENTA = CTARTICA;
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            begin
            EXECUTE PROCEDURE ERRORINT(31, 0, :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, '', :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
        CUENTA = NULL;
        SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
            WHERE CUEN_COD = :CTACARTERA INTO :CUENTA, :TIPOCUEN;
        if (CUENTA IS NULL) then
            begin
            EXECUTE PROCEDURE ERRORINT(31, 0, :CTACARTERA, 2);
            CUENTA = CTACARTERA;
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            begin
            EXECUTE PROCEDURE ERRORINT(31, 0, :CUENTA, 3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'C') then
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_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 LOS COSTOS */
    EXECUTE PROCEDURE costo_en_ventas_contado(:fecfac,  :pref, :ptvta);
    if (COSTOS = 'A') then
        BEGIN
        FOR SELECT MAX(CTACOS), SUM(COSTO)
            FROM COSTO_VENTAS WHERE TIDO_COD = 31 AND COVE_ID = 0
            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
                    EXECUTE PROCEDURE ERRORINT(31, 0, :CTACOSTOS, 2);
                    CUENTA = CTARTFTE;
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    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 = 0 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(COSTO)
            FROM COSTO_VENTAS  WHERE TIDO_COD = 31 AND COVE_ID = 0
            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
                EXECUTE PROCEDURE ERRORINT(31, 0, :CTACOSTOS, 2);
                CUENTA = CTARTFTE;
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                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 = 0
                    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(COSTO)
            FROM COSTO_VENTAS  WHERE TIDO_COD = 31 AND COVE_ID = 0
            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
                    EXECUTE PROCEDURE ERRORINT(31, 0, :CTAINVEN, 2);
                    CUENTA = CTAINVEN;
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    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 = 0 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(COSTO)
            FROM COSTO_VENTAS WHERE TIDO_COD = 31 AND COVE_ID = 0
            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
                EXECUTE PROCEDURE ERRORINT(31, 0, :CTAINVEN, 2);
                CUENTA = CTAINVEN;
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                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 = 0
                    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
            CUENTA = NULL;
            SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :CTADIC INTO :CUENTA, :TIPOCUEN;
            if (CUENTA IS NULL) then
                begin
                EXECUTE PROCEDURE ERRORINT(31, 0, :CTADIC, 2);
                CUENTA = CTADIC;
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'I') then
                begin
                EXECUTE PROCEDURE ERRORINT(31, 0, :CUENTA, 3);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                end
            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 /* EXISTE LA INTERFAZ */
ELSE
    BEGIN
    EXECUTE PROCEDURE ERRORINT(31, 0, :PREF, 1);
    ERROR = ERROR + 1;
    VER = 'S';
    SUSPEND;
    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 ^ ;

CREATE OR 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 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_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 ^ ;

CREATE OR ALTER procedure CONTABIL_MANIFIESTO (
    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 TIPOCOMP VARCHAR(3);
declare variable PREFCONT VARCHAR(4);
declare variable CXPAGAR CHAR(1);
declare variable CTAPAGAR VARCHAR(20);
declare variable CTAPAGARF VARCHAR(20);
declare variable CTACONCEPTO 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 NITASOC VARCHAR(20);
declare variable PROY VARCHAR(4);
declare variable CENTRO VARCHAR(4);
declare variable NROI INTEGER;
declare variable SUMA NUMERIC(18,2);
declare variable SUMACAJA NUMERIC(18,2);
declare variable SEGURO NUMERIC(18,2);
declare variable CTASEGURO VARCHAR(20);
declare variable CTACONTRAE VARCHAR(20);
declare variable FORMA CHAR(1);
declare variable ANTICIPO NUMERIC(18,2);
declare variable CTAANTICIPO VARCHAR(20);
declare variable INGRESO NUMERIC(18,2);
declare variable CTAINGRESO VARCHAR(20);
declare variable RETENCION NUMERIC(18,2);
declare variable FONDOM NUMERIC(18,2);
declare variable CTARETENCION VARCHAR(20);
declare variable PORCRTF NUMERIC(9,2);
declare variable BASE NUMERIC(18,2);
BEGIN
/* BUSQUE LA INTERFACE */
EXISTE = 'N';
SELECT 'S', TICO_COD, PRCO_PREF, INTR_CONFIRMAR, INTR_CXPAGAR, INTR_CTAPAGAR, intr_ctartfte,
    INTR_CTAINGREM, INTR_CTASEGURO, intr_ctacontrae
    FROM interfaz_transporte
    WHERE INTR_ID = :IDINTER
    INTO :EXISTE, :TIPOCOMP, :PREFCONT, :VER, :CXPAGAR, :CTAPAGAR, :ctaretencion,
        :ctaingreso, :ctaseguro, :ctacontrae;
if (EXISTE = 'S') then
    BEGIN
    DELETE FROM contabilizacion WHERE CNTB_TIPOREF = 89 AND CNTB_IDREF = :IDDOC;

    /* TRAIGA EL ENCABEZADO  */
    SELECT MANC_PREF, MANC_NUMERO, MANC_FECHA, TERC_NIT, MANC_ANTICIPO, MANC_INGRESO, MANC_RTFTEM, MANC_DESCTO, MANC_RTFTEP
        FROM manifiesto_carga M, vehiculos v WHERE MANC_ID = :IDDOC AND M.manc_vehiculo = V.vehi_cod
        INTO :PREF, :NUM, :FECAUX, :NITASOC, :ANTICIPO, :INGRESO, :RETENCION, :FONDOM, :porcrtf;
    NUMERO = PREF || NUM;
    SELECT PREF_CENTRO, PREF_PROY FROM prefijos P, manifiesto_carga M
        WHERE P.pref_pre = M.manc_pref AND M.manc_id = :IDDOC AND P.tido_cod = 89
        INTO :CENTRO, :PROY;
    EXECUTE PROCEDURE FECHA_A_CONTA(:FECAUX) returning_values (:FECHA);
    /* REGISTRE EL ENCABEZADO CONTABLE */
    CONC = 'MANIFIESTO DE CARGA No. ' || :NUMERO;
    IDC = GEN_ID(ID_CONTABILIZA, 1);
    INSERT INTO CONTABILIZACION (CNTB_ID, CNTB_TIPOCOMP, CNTB_PREFCNT, CNTB_NUMERO, CNTB_FECHA, CNTB_CONCEPTO, CNTB_REF, CNTB_TIPOREF, CNTB_IDREF, CNTB_PREFREF, CNTB_NUMREF, CNTB_PROCESADO)
        VALUES (:IDC, :TIPOCOMP, :PREFCONT, :NUM, :FECHA, :CONC, '', 89, :IDDOC, :PREF, :NUM, 'N');
    NROI = 0;
    ERROR = 0;

    suma = 0;
    for SELECT sum(MNCD_VALOR), SUM(CGRM_SEGURO), max(f.fprm_ctacosto), max(f.fprm_ctaseguro), max(r.cgrm_fpago)
        FROM carga_remesa R, manifiesto_carga_det M, forma_pago_remesa f
        WHERE M.mncd_remesa = R.cgrm_id and R.cgrm_fpago = f.fprm_cod and M.manc_id = :iddoc
        group by r.cgrm_fpago
        INTO :sumacaja, :seguro, :ctapagarf, :ctaseguro, :forma
        do
        begin
        if (sumacaja <> 0) then
            BEGIN
            CUENTA = NULL;
            SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :ctapagarf INTO :CUENTA, :TIPOCUEN;
            if (CUENTA IS NULL) then
                begin
                EXECUTE PROCEDURE ERRORINT(89, :IDDOC, :ctapagarf, 2);
                CUENTA = ctapagarf;
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'I') then
                BEGIN
                EXECUTE PROCEDURE ERRORINT(89, :IDDOC, :CUENTA, 3);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                EXECUTE PROCEDURE ERRORINT(89, :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, :NROI, :CUENTA, :CONC, '', :sumacaja, 0, 0, 0, :nitasoc, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA + sumacaja;
                END
            END
        if (FORMA = 'E') then
            BEGIN
            CUENTA = NULL;
            SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :ctaseguro INTO :CUENTA, :TIPOCUEN;
            if (CUENTA IS NULL) then
                begin
                EXECUTE PROCEDURE ERRORINT(89, :IDDOC, :ctaseguro, 2);
                CUENTA = ctaseguro;
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'I') then
                BEGIN
                EXECUTE PROCEDURE ERRORINT(89, :IDDOC, :CUENTA, 3);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                EXECUTE PROCEDURE ERRORINT(89, :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, :NROI, :CUENTA, :CONC, '', 0, :seguro, 0, 0, :nitasoc, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA - seguro;
                END
            CUENTA = NULL;
            SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :ctacontrae INTO :CUENTA, :TIPOCUEN;
            if (CUENTA IS NULL) then
                begin
                EXECUTE PROCEDURE ERRORINT(89, :IDDOC, :ctacontrae, 2);
                CUENTA = ctacontrae;
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'I') then
                BEGIN
                EXECUTE PROCEDURE ERRORINT(89, :IDDOC, :CUENTA, 3);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                EXECUTE PROCEDURE ERRORINT(89, :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, :NROI, :CUENTA, :CONC, '', 0, :sumacaja, 0, 0, :nitasoc, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA - sumacaja;
                END
            END

        end /* do */
    /* ANTICIPO */
    if (ANTICIPO <> 0) then
        BEGIN
        execute procedure LEE_configuracion('TRANSPORTE', 'GENERAL', 'CUENTA CONTABLE ANTICIPOS EN MANIFIESTO DE CARGA') returning_values (:ctaanticipo);
        CUENTA = NULL;
        SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
            WHERE CUEN_COD = :ctaanticipo INTO :CUENTA, :TIPOCUEN;
        if (CUENTA IS NULL) then
            begin
            EXECUTE PROCEDURE ERRORINT(89, :IDDOC, :ctaanticipo, 2);
            CUENTA = ctaanticipo;
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            EXECUTE PROCEDURE ERRORINT(89, :IDDOC, :CUENTA, 3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'C') then
            BEGIN
            EXECUTE PROCEDURE ERRORINT(89, :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, :NROI, :CUENTA, :CONC, '', 0, :anticipo, 0, 0, :nitasoc, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            SUMA = SUMA - anticipo;
            END
        end /* anticipo */
    /* INGRESO COOPERATIVA */
    if ((INGRESO-FONDOM) <> 0) then
        BEGIN
        CUENTA = NULL;
        SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
            WHERE CUEN_COD = :ctaingreso INTO :CUENTA, :TIPOCUEN;
        if (CUENTA IS NULL) then
            begin
            EXECUTE PROCEDURE ERRORINT(89, :IDDOC, :ctaingreso, 2);
            CUENTA = ctaingreso;
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            EXECUTE PROCEDURE ERRORINT(89, :IDDOC, :CUENTA, 3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'C') then
            BEGIN
            EXECUTE PROCEDURE ERRORINT(89, :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, :NROI, :CUENTA, :CONC, '', 0, (:ingreso-:fondom), 0, 0, :nitasoc, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            SUMA = SUMA - ingreso + fondom;
            END
        end /* INGRESO COOP */
    /* FONDO MUTUAL */
    if (FONDOM <> 0) then
        BEGIN
        execute procedure LEE_configuracion('TRANSPORTE', 'GENERAL', 'CUENTA CONTABLE FONDO MUTUAL EN MANIFIESTO DE CARGA') returning_values (:ctaconcepto);
        CUENTA = NULL;
        SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
            WHERE CUEN_COD = :ctaconcepto INTO :CUENTA, :TIPOCUEN;
        if (CUENTA IS NULL) then
            begin
            EXECUTE PROCEDURE ERRORINT(89, :IDDOC, :ctaconcepto, 2);
            CUENTA = ctaconcepto;
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            EXECUTE PROCEDURE ERRORINT(89, :IDDOC, :CUENTA, 3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'C') then
            BEGIN
            EXECUTE PROCEDURE ERRORINT(89, :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, :NROI, :CUENTA, :CONC, '', 0, :fondom, 0, 0, :nitasoc, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            SUMA = SUMA - fondom;
            END
        end /* INGRESO COOP */
    /* RETEFUENTE */
    if (retencion <> 0) then
        BEGIN
        CUENTA = NULL;
        SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
            WHERE CUEN_COD = :ctaretencion INTO :CUENTA, :TIPOCUEN;
        if (CUENTA IS NULL) then
            begin
            EXECUTE PROCEDURE ERRORINT(89, :IDDOC, :ctaretencion, 2);
            CUENTA = ctaretencion;
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            EXECUTE PROCEDURE ERRORINT(89, :IDDOC, :CUENTA, 3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'C') then
            BEGIN
            EXECUTE PROCEDURE ERRORINT(89, :IDDOC, :CUENTA, 4);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'N') then
            BEGIN
            if (porcrtf <> 0) then
                BASE = RETENCION * 100 / porcrtf;
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_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, :retencion, :base, :porcrtf, :nitasoc, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            SUMA = SUMA - retencion;
            END
        end /* RETENCION */
    /* RECORRA LOS CONCEPTOS*/
    FOR SELECT copl_ctaconta, mncc_valor
        FROM manifiestos_carga_conc M, conceptos_planilla C
        WHERE m.mncc_conc = C.copl_id AND m.manc_id = :iddoc and c.copl_remesa = 'S' ORDER BY m.mncc_item
        INTO :ctaconcepto, :monto
        DO
        BEGIN
        if (MONTO <> 0) then
            BEGIN
            CUENTA = NULL;
            SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :ctaconcepto INTO :CUENTA, :TIPOCUEN;
            if (CUENTA IS NULL) then
                begin
                EXECUTE PROCEDURE ERRORINT(89, :IDDOC, :ctaconcepto, 2);
                CUENTA = ctaconcepto;
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'I') then
                BEGIN
                EXECUTE PROCEDURE ERRORINT(89, :IDDOC, :CUENTA, 3);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                EXECUTE PROCEDURE ERRORINT(89, :IDDOC, :CUENTA, 4);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                if (MONTO > 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, :MONTO, 0, 0, :nitasoc, :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(:MONTO), 0, 0, 0, :nitasoc, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA - MONTO;
                END
            END
        END /* CONCEPTOS */
    /* CUADRE TODO CONTRA LA cxp asociado */
    CUENTA = NULL;
    if (SUMA < 0) then
        execute procedure LEE_configuracion('TRANSPORTE', 'GENERAL', 'CUENTA CONTABLE PLANILLA NEGATIVA') returning_values (:ctapagar);
    else
        if (CXPAGAR = 'T') then
            SELECT TERC_CTACLIENTE FROM TERCEROS WHERE TERC_NIT = :nitasoc INTO :ctapagar;
    SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
        WHERE CUEN_COD = :ctapagar INTO :CUENTA, :TIPOCUEN;
    if (CUENTA IS NULL) then
        begin
        EXECUTE PROCEDURE ERRORINT(89, :IDDOC, :ctapagar, 2);
        CUENTA = ctapagar;
        ERROR = ERROR + 1;
        end
    if (TIPOCUEN = 'I') then
        BEGIN
        EXECUTE PROCEDURE ERRORINT(89, :IDDOC, :CUENTA, 3);
        TIPOCUEN = 'N';
        ERROR = ERROR + 1;
        END
    if (TIPOCUEN = 'C') then
        BEGIN
        EXECUTE PROCEDURE ERRORINT(89, :IDDOC, :CUENTA, 4);
        TIPOCUEN = 'N';
        ERROR = ERROR + 1;
        END
    if (TIPOCUEN = 'N') then
        BEGIN
        if (SUMA > 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, :SUMA, 0, 0, :NITASOC, :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(:SUMA), 0, 0, 0, :NITASOC, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
        END

    if (ERROR > 0) then
        VER = 'S';
    SUSPEND;
    END /* EXISTE */
ELSE
    BEGIN
    EXECUTE PROCEDURE ERRORINT(89, :IDDOC, :PREF, 1);
    ERROR = ERROR + 1;
    VER = 'S';
    SUSPEND;
    END
END^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER procedure CONTABIL_NOTACRBC (
    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 TIPOCOMP VARCHAR(3);
declare variable PREFCONT VARCHAR(4);
declare variable BASE CHAR(1);
declare variable CTABASE VARCHAR(20);
declare variable IVA CHAR(1);
declare variable CTAIVA VARCHAR(20);
declare variable GMF CHAR(1);
declare variable CTAGMF VARCHAR(20);
declare variable BANCO CHAR(1);
declare variable CTABANCO 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 NROI INTEGER;
declare variable SUMA NUMERIC(18,2);
declare variable BCTABANCO 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 ANULADO CHAR(1);
BEGIN
/* BUSQUE LA INTERFACE */
EXISTE = 'N';
SELECT 'S', TICO_COD, PRCO_PRE, INBA_BANCO, INBA_IVA, INBA_GMF, INBA_BASE, INBA_CTABCO, INBA_CTAIVA, INBA_CTAGMF, INBA_CTABASE, INBA_CONFIRMAR
    FROM INTERFAZ_BANCOS
    WHERE INBA_ID = :IDINTER
    INTO :EXISTE, :TIPOCOMP, :PREFCONT, :BANCO, :IVA, :GMF, :BASE, :CTABANCO, CTAIVA, CTAGMF, CTABASE, :VER;
if (EXISTE = 'S') then
  BEGIN
  /* BORRE CUALQUEIR CONTABILIZACION PREVIA */
  DELETE FROM CONTABILIZACION WHERE CNTB_TIPOREF = 75 AND CNTB_IDREF = :IDDOC;
  /* TRAIGA EL ENCABEZADO  */
  SELECT PRBA_PREF, NCBC_NUMERO, NCBC_FECHA, NCBC_CONCEPTO, NCBC_MONTO, CUBA_CTACONTA, NCBC_ANULADO, BANC_NIT
        FROM NOTAS_CREDITO N, CUENTAS_BANCO C, BANCOS B
        WHERE NCBC_ID = :IDDOC AND C.CUBA_COD = N.CUBA_COD AND B.BANC_COD = C.BANC_COD
        INTO :PREF, :NUM, :FECAUX, :CONC, :MONTO, :BCTABANCO, :ANULADO, :NIT;
  if (ANULADO = 'N') then
    BEGIN
    NUMERO = PREF || NUM;
    SELECT PRBA_CENTRO, PRBA_PROY
        FROM PREFIJOS_BANCOS P, NOTAS_CREDITO N
        WHERE P.PRBA_PREF = N.PRBA_PREF AND P.CUBA_COD = N.CUBA_COD AND p.tido_cod = 75 and N.NCBC_ID = :IDDOC
        INTO :CENTRO, :PROY;
    EXECUTE PROCEDURE FECHA_A_CONTA(:FECAUX) returning_values (:FECHA);
    /* REGISTRE EL ENCABEZADO CONTABLE */
    IDC = GEN_ID(ID_CONTABILIZA, 1);
    INSERT INTO CONTABILIZACION (CNTB_ID, CNTB_TIPOCOMP, CNTB_PREFCNT, CNTB_NUMERO, CNTB_FECHA, CNTB_CONCEPTO, CNTB_REF, CNTB_TIPOREF, CNTB_IDREF, CNTB_PREFREF, CNTB_NUMREF, CNTB_PROCESADO)
        VALUES (:IDC, :TIPOCOMP, :PREFCONT, :NUM, :FECHA, :CONC, '', 75, :IDDOC, :PREF, :NUM, 'N');
    NROI = 0;
    SUMA = 0;
    ERROR = 0;
    /* CUENTA BASE */
    if (BASE = 'K') then
        BEGIN
        CUENTA = NULL;
        SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
            WHERE CUEN_COD = :CTABASE INTO :CUENTA, :TIPOCUEN;
        if (CUENTA IS NULL) then
            begin
            EXECUTE PROCEDURE ERRORINT(75, :IDDOC, :CTABASE, 2);
            CUENTA = CTABASE;
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            EXECUTE PROCEDURE ERRORINT(75, :IDDOC, :CUENTA, 3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'C') then
            BEGIN
            EXECUTE PROCEDURE ERRORINT(75, :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, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            END
        END /* BASE = K */
    /* CUENTA BANCO */
    if ((BANCO = 'B') or (BANCO = 'K')) then
        BEGIN
        if (BANCO = 'B') then
            CTABANCO = BCTABANCO;
        if (MONTO <> 0) then
            BEGIN
            CUENTA = NULL;
            SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :CTABANCO INTO :CUENTA, :TIPOCUEN;
        if (CUENTA IS NULL) then
            begin
            EXECUTE PROCEDURE ERRORINT(75, :IDDOC, :CTABANCO, 2);
            CUENTA = CTABANCO;
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            EXECUTE PROCEDURE ERRORINT(75, :IDDOC, :CUENTA, 3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'C') then
            BEGIN
            EXECUTE PROCEDURE ERRORINT(75, :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, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                END
            END /* SUMA <> 0 */
        END /* BANCO K O B */
        
    /* recorra las cuentas adicionales */
    FOR SELECT INBC_CUENTA, INBC_BASE, INBC_PORC, INBC_VALOR, INBC_DB
        FROM INTERFAZ_BANCOS_CTAS
        WHERE INBA_ID = :IDINTER
        INTO :CUENTAADIC, :BASEADIC, :PORCADIC, :VALORADIC, :DBADIC
        DO
        BEGIN
        if (:BASEADIC = 'MONTO') then
            VALORADIC = MONTO;
        MONTO = VALORADIC * PORCADIC;
        
        /* TRAIGA LAS CARACTERISTICAS DE LA CUENTA */
        CUENTA = NULL;
        SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
            WHERE CUEN_COD = :CUENTAADIC INTO :CUENTA, :TIPOCUEN;
        if (CUENTA IS NULL) then
            begin
            EXECUTE PROCEDURE ERRORINT(75, :IDDOC, :CUENTAADIC, 2);
            CUENTA = CUENTAADIC;
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            EXECUTE PROCEDURE ERRORINT(75, :IDDOC, :CUENTA, 3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'C') then
            BEGIN
            EXECUTE PROCEDURE ERRORINT(75, :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, :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
    if (ERROR > 0) then
        VER = 'S';
    SUSPEND;
    END
  END /* EXISTE */
ELSE
    BEGIN
    EXECUTE PROCEDURE ERRORINT(75, :IDDOC, :PREF, 1);
    ERROR = ERROR + 1;
    VER = 'S';
    SUSPEND;
    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 ^ ;

CREATE OR ALTER procedure CONTABIL_NOTACRCL (
    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 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 TIPOCOMP VARCHAR(3);
declare variable PREFCONT VARCHAR(4);
declare variable BASE CHAR(1);
declare variable CTABASE VARCHAR(20);
declare variable IVA CHAR(1);
declare variable CTAIVA VARCHAR(20);
declare variable CLIE CHAR(1);
declare variable CTACLIE VARCHAR(20);
declare variable RTFTE CHAR(1);
declare variable CTARTFTE VARCHAR(20);
declare variable RTIVA CHAR(1);
declare variable CTARTIVA VARCHAR(20);
declare variable RTICA CHAR(1);
declare variable CTARTICA VARCHAR(20);
declare variable RTCREE CHAR(1);
declare variable 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 NOMBRE VARCHAR(60);
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', TICO_COD, PRCO_PRE, INCA_BASE, INCA_IVA, INCA_RTFTE, INCA_RTIVA, INCA_RTICA, INCA_RTCREE, INCA_CLIE, INCA_CTABASE, INCA_CTAIVA, INCA_CTARTFTE, INCA_CTARTIVA, INCA_CTARTICA, INCA_CTARTCREE, INCA_CTACLIE, INCA_CONFIRMAR
    FROM INTERFAZ_CARTERA
    WHERE INCA_ID = :IDINTER
    INTO :EXISTE, :TIPOCOMP, :PREFCONT, :BASE, :IVA, :RTFTE, :RTIVA, :RTICA, :RTCREE, :CLIE, :CTABASE, :CTAIVA, :CTARTFTE, :CTARTIVA, :CTARTICA, :CTARCREE, :CTACLIE, :VER;
  if (EXISTE = 'S') then
    BEGIN
    /* BORRE CUALQUEIR CONTABILIZACION PREVIA */
    DELETE FROM CONTABILIZACION WHERE CNTB_TIPOREF = 42 AND CNTB_IDREF = :IDDOC;
    /* 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_NOM,
        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, :NOMBRE,
        :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);
      /* REGISTRE EL ENCABEZADO CONTABLE */
      IDC = GEN_ID(ID_CONTABILIZA, 1);
      INSERT INTO CONTABILIZACION (CNTB_ID, CNTB_TIPOCOMP, CNTB_PREFCNT, CNTB_NUMERO, CNTB_FECHA, CNTB_CONCEPTO, CNTB_REF, CNTB_TIPOREF, CNTB_IDREF, CNTB_PREFREF, CNTB_NUMREF, CNTB_PROCESADO)
        VALUES (:IDC, :TIPOCOMP, :PREFCONT, :NUM, :FECHA, :CONC, '', 42, :IDDOC, :PREF, :NUM, 'N');
      NROI = 0;
      SUMA = 0;
      ERROR = 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
                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';
                ERROR = ERROR + 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';
                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, '', :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
                WHERE CUEN_COD = :CTAIVA INTO :CUENTA, :TIPOCUEN;
            if (CUENTA IS NULL) then
                begin
                EXECUTE PROCEDURE ERRORINT(42, :IDDOC, :CTAIVA, 2);
                CUENTA = CTAIVA;
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'I') then
                BEGIN
                EXECUTE PROCEDURE ERRORINT(42, :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, :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
            WHERE CUEN_COD = :CTARTFTE INTO :CUENTA, :TIPOCUEN;
        if (CUENTA IS NULL) then
            begin
            EXECUTE PROCEDURE ERRORINT(42, :IDDOC, :CTARTFTE, 2);
            CUENTA = CTARTFTE;
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            EXECUTE PROCEDURE ERRORINT(42, :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, :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
                WHERE CUEN_COD = :CTARTFTE INTO :CUENTA, :TIPOCUEN;
            if (CUENTA IS NULL) then
                begin
                EXECUTE PROCEDURE ERRORINT(42, :IDDOC, :CTARTFTE, 2);
                CUENTA = CTARTFTE;
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'I') then
                BEGIN
                EXECUTE PROCEDURE ERRORINT(42, :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, '', :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
            WHERE CUEN_COD = :CTARTIVA INTO :CUENTA, :TIPOCUEN;
        if (CUENTA IS NULL) then
            begin
            EXECUTE PROCEDURE ERRORINT(42, :IDDOC, :CTARTIVA, 2);
            CUENTA = CTARTIVA;
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            EXECUTE PROCEDURE ERRORINT(42, :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, :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
            WHERE CUEN_COD = :CTARTICA INTO :CUENTA, :TIPOCUEN;
        if (CUENTA IS NULL) then
            begin
            EXECUTE PROCEDURE ERRORINT(42, :IDDOC, :CTARTICA, 2);
            CUENTA = CTARTICA;
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            EXECUTE PROCEDURE ERRORINT(42, :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, :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
            WHERE CUEN_COD = :CTARTICA INTO :CUENTA, :TIPOCUEN;
        if (CUENTA IS NULL) then
            begin
            EXECUTE PROCEDURE ERRORINT(42, :IDDOC, :ctarcree, 2);
            CUENTA = ctarcree;
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            EXECUTE PROCEDURE ERRORINT(42, :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, :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
                WHERE CUEN_COD = :ctarcree INTO :CUENTA, :TIPOCUEN;
            if (CUENTA IS NULL) then
                begin
                EXECUTE PROCEDURE ERRORINT(42, :IDDOC, :CTARTFTE, 2);
                CUENTA = CTARTFTE;
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'I') then
                BEGIN
                EXECUTE PROCEDURE ERRORINT(42, :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, '', :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
            WHERE CUEN_COD = :CUENTAADIC INTO :CUENTA, :TIPOCUEN;
        IF (CUENTA IS NULL) then
            begin
            EXECUTE PROCEDURE ERRORINT(42, :IDDOC, :CUENTAADIC, 2);
            CUENTA = CUENTAADIC;
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            end
        /* DEPENDE DEL TIPO DE CUENTA */
        if (TIPOCUEN = 'I') then
            BEGIN
            EXECUTE PROCEDURE ERRORINT(42, :IDDOC, :CUENTA, 3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'C') then
            BEGIN
            if (DBADIC = 'S') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_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
            WHERE CUEN_COD = :CTACLIE INTO :CUENTA, :TIPOCUEN;
        IF (CUENTA IS NULL) then
            begin
            EXECUTE PROCEDURE ERRORINT(42, :IDDOC, :CTACLIE, 2);
            CUENTA = CTACLIE;
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            EXECUTE PROCEDURE ERRORINT(42, :IDDOC, :CUENTA, 3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'C') then
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_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 (ERROR > 0) then
        VER = 'S';
    SUSPEND;
    END /* NO ANULADO */
  END /* EXISTE LA INTERFAZ */
ELSE
  BEGIN
  EXECUTE PROCEDURE ERRORINT(42, :IDDOC, :PREF, 1);
  ERROR = ERROR + 1;
  VER = 'S';
  SUSPEND;
  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 ^ ;

CREATE OR ALTER procedure CONTABIL_NOTACRPR (
    IDDOC integer,
    IDINTER integer)
returns (
    ERROR integer,
    VER char(1),
    IDC integer)
AS
declare variable PREF VARCHAR(4);
declare variable NUM VARCHAR(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 TIPOCOMP VARCHAR(3);
declare variable PREFCONT VARCHAR(4);
declare variable BASE CHAR(1);
declare variable CTABASE VARCHAR(20);
declare variable IVA CHAR(1);
declare variable CTAIVA VARCHAR(20);
declare variable CLIE CHAR(1);
declare variable CTACLIE VARCHAR(20);
declare variable RTFTE CHAR(1);
declare variable CTARTFTE VARCHAR(20);
declare variable RTIVA CHAR(1);
declare variable CTARTIVA VARCHAR(20);
declare variable RTICA CHAR(1);
declare variable CTARTICA VARCHAR(20);
declare variable RTCREE CHAR(1);
declare variable CTARTCREE VARCHAR(20);
declare variable EXISTE CHAR(1);
declare variable CUENTA VARCHAR(20);
declare variable MONTO NUMERIC(18,2);
declare variable ES_RETENCION CHAR(1);
declare variable TIPOCUEN CHAR(1);
declare variable NIT VARCHAR(20);
declare variable NOMBRE VARCHAR(60);
declare variable PROY VARCHAR(4);
declare variable CENTRO VARCHAR(4);
declare variable 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
ERROR = 0;
/* BUSQUE LA INTERFACE */
EXISTE = 'N';
SELECT 'S', TICO_COD, PRCO_PRE, INCP_BASE, INCP_IVA, INCP_RTFTE, INCP_RTIVA, INCP_RTICA, INCP_RTCREE, INCP_PROV, INCP_CTABASE,
  INCP_CTAIVA, INCP_CTARTFTE, INCP_CTARTIVA, INCP_CTARTICA, INCP_CTARTCREE, INCP_CTAPROV, INCP_CONFIRMAR
  FROM INTERFAZ_CXPAGAR
  WHERE INCP_ID = :IDINTER
  INTO :EXISTE, :TIPOCOMP, :PREFCONT, :BASE, :IVA, :RTFTE, :RTIVA, :RTICA, :RTCREE, :CLIE, :CTABASE,
    :CTAIVA, :CTARTFTE, :CTARTIVA, :CTARTICA, :CTARTCREE, :CTACLIE, :VER;

if (EXISTE = 'S') then
  BEGIN
  /* BORRE CUALQUEIR CONTABILIZACION PREVIA */
  DELETE FROM CONTABILIZACION WHERE CNTB_TIPOREF = 52 AND CNTB_IDREF = :IDDOC;
  /* TRAIGA EL ENCABEZADO DE LA NOTA */
  SELECT PREF_PRE, NCPR_NUMERO, NCPR_FECHA, N.TERC_NIT, NCPR_CONC, NCPR_IVAMONTO, NCPR_MONTO, NCPR_RTFTEPORC, NCPR_RTFTEMONTO,
    NCPR_RTIVAPORC, NCPR_RTIVAMONTO, NCPR_RTICAPORC, NCPR_RTICAMONTO, NCPR_RTCREE, NCPR_RTCREEM, TERC_NOM, TERC_CTAVENTA,
    TERC_CTARTFTE, TERC_CTARTIVA, TERC_CTARTICA, TERC_CTARCREE, TERC_CTACLIENTE, NCPR_ANULADO, NCPR_BASE0, NCPR_BASE1, NCPR_BASE2, NCPR_IVA1, NCPR_IVA2, NCPR_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, :NOMBRE, 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);

    /* REGISTRE EL ENCABEZADO CONTABLE */
    IDC = GEN_ID(ID_CONTABILIZA, 1);
    INSERT INTO CONTABILIZACION (CNTB_ID, CNTB_TIPOCOMP, CNTB_PREFCNT, CNTB_NUMERO, CNTB_FECHA, CNTB_CONCEPTO, CNTB_REF, CNTB_TIPOREF, CNTB_IDREF, CNTB_PREFREF, CNTB_NUMREF, CNTB_PROCESADO)
        VALUES (:IDC, :TIPOCOMP, :PREFCONT, :NUM, :FECHA, :CONC, '', 52, :IDDOC, :PREF, :NUM, 'N');

    NROI = 0;
    SUMA = 0;

    IF ((BASE = 'T') OR (BASE = 'K')) THEN
        BEGIN
        IF (BASE = 'T') THEN
            CTABASE = TCTABASE;

        if (VRSUBT <> 0) then
            BEGIN
            CUENTA = NULL;
            SELECT CUEN_COD, CUEN_TIPO, CUEN_RETENCION FROM CUENTAS
                WHERE CUEN_COD = :CTABASE INTO :CUENTA, :TIPOCUEN, :ES_RETENCION;
            if (CUENTA IS NULL) then
                begin
                EXECUTE PROCEDURE ERRORINT(52, :IDDOC, :CTABASE, 2);
                CUENTA = CTABASE;
                ERROR = ERROR + 1;
                end
            if (ES_RETENCION = 'S') then
                if (PORC <> 0) then
                    montobase = FLOOR(VRSUBT / PORC * -1);
                else
                    montobase = VRSUBT * -1;
            else
                montobase = 0;
            if (TIPOCUEN = 'I') then
                BEGIN
                EXECUTE PROCEDURE ERRORINT(52, :IDDOC, :CUENTA, 3);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_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
                    WHERE CUEN_COD = :CTABASE INTO :CUENTA, :TIPOCUEN, :ES_RETENCION;
                if (CUENTA IS NULL) then
                    begin
                    EXECUTE PROCEDURE ERRORINT(52, :IDDOC, :CTABASE, 2);
                    CUENTA = CTABASE;
                    ERROR = ERROR + 1;
                    end
                montobase = 0;
                if (TIPOCUEN = 'I') then
                    BEGIN
                    EXECUTE PROCEDURE ERRORINT(52, :IDDOC, :CUENTA, 3);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_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
                    WHERE CUEN_COD = :CTAIVA INTO :CUENTA, :TIPOCUEN;
                if (CUENTA IS NULL) then
                    begin
                    EXECUTE PROCEDURE ERRORINT(52, :IDDOC, :CTAIVA, 2);
                    CUENTA = CTAIVA;
                    ERROR = ERROR + 1;
                    end
                if (TIPOCUEN = 'I') then
                    BEGIN
                    EXECUTE PROCEDURE ERRORINT(52, :IDDOC, :CUENTA, 3);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_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
                WHERE CUEN_COD = :CTAIVA INTO :CUENTA, :TIPOCUEN;
            if (CUENTA IS NULL) then
                begin
                EXECUTE PROCEDURE ERRORINT(52, :IDDOC, :CTAIVA, 2);
                CUENTA = CTAIVA;
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'I') then
                BEGIN
                EXECUTE PROCEDURE ERRORINT(52, :IDDOC, :CUENTA, 3);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_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
            WHERE CUEN_COD = :CTARTFTE INTO :CUENTA, :TIPOCUEN;
        if (CUENTA IS NULL) then
            begin
            EXECUTE PROCEDURE ERRORINT(52, :IDDOC, :CTARTFTE, 2);
            CUENTA = CTARTFTE;
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            EXECUTE PROCEDURE ERRORINT(52, :IDDOC, :CUENTA, 3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'C') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_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
            WHERE CUEN_COD = :CTARTIVA INTO :CUENTA, :TIPOCUEN;
        if (CUENTA IS NULL) then
            begin
            EXECUTE PROCEDURE ERRORINT(52, :IDDOC, :CTARTIVA, 2);
            CUENTA = CTARTIVA;
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            EXECUTE PROCEDURE ERRORINT(52, :IDDOC, :CUENTA, 3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'C') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_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
            WHERE CUEN_COD = :CTARTICA INTO :CUENTA, :TIPOCUEN;
        if (CUENTA IS NULL) then
            begin
            EXECUTE PROCEDURE ERRORINT(52, :IDDOC, :CTARTICA, 2);
            CUENTA = CTARTICA;
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            EXECUTE PROCEDURE ERRORINT(52, :IDDOC, :CUENTA, 3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'C') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_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
            WHERE CUEN_COD = :ctartcree INTO :CUENTA, :TIPOCUEN;
        if (CUENTA IS NULL) then
            begin
            EXECUTE PROCEDURE ERRORINT(52, :IDDOC, :ctartcree, 2);
            CUENTA = ctartcree;
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            EXECUTE PROCEDURE ERRORINT(52, :IDDOC, :CUENTA, 3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'C') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                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
            WHERE CUEN_COD = :CUENTAADIC INTO :CUENTA, :TIPOCUEN;
        IF (CUENTA IS NULL) THEN
            begin
            EXECUTE PROCEDURE ERRORINT(52, :IDDOC, :CUENTAADIC, 2);
            CUENTA = CUENTAADIC;
            ERROR = ERROR + 1;
            end
        /* DEPENDE DEL TIPO DE CUENTA */
        if (TIPOCUEN = 'I') then
            BEGIN
            EXECUTE PROCEDURE ERRORINT(52, :IDDOC, :CUENTA, 3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'C') then
            BEGIN
            if (DBADIC = 'S') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_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
            WHERE CUEN_COD = :CTACLIE INTO :CUENTA, :TIPOCUEN;
        IF (CUENTA IS NULL) then
            begin
            EXECUTE PROCEDURE ERRORINT(52, :IDDOC, :CTACLIE, 2);
            CUENTA = CTACLIE;
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            EXECUTE PROCEDURE ERRORINT(52, :IDDOC, :CUENTA, 3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'C') then
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_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 (ERROR > 0) then
        VER = 'S';
    SUSPEND;
    END /* NO ANULADO */
  END /* EXISTE LA INTERFAZ */
ELSE
    BEGIN
    EXECUTE PROCEDURE ERRORINT(52, :IDDOC, :PREF, 1);
    ERROR = ERROR + 1;
    VER = 'S';
    SUSPEND;
    END
END^

SET TERM ; ^

SET TERM ^ ;

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

CREATE OR ALTER procedure CONTABIL_NOTADBBC (
    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 TIPOCOMP VARCHAR(3);
declare variable PREFCONT VARCHAR(4);
declare variable BASE CHAR(1);
declare variable CTABASE VARCHAR(20);
declare variable IVA CHAR(1);
declare variable CTAIVA VARCHAR(20);
declare variable GMF CHAR(1);
declare variable CTAGMF VARCHAR(20);
declare variable BANCO CHAR(1);
declare variable CTABANCO VARCHAR(20);
declare variable EXISTE CHAR(1);
declare variable CUENTA VARCHAR(20);
declare variable MONTO NUMERIC(18,2);
declare variable VRGMF NUMERIC(18,2);
declare variable VRIVA 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 NROI INTEGER;
declare variable SUMA NUMERIC(18,2);
declare variable BCTABANCO VARCHAR(20);
declare variable BCTAIVA VARCHAR(20);
declare variable BCTAGMF 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 ANULADO CHAR(1);
BEGIN
/* BUSQUE LA INTERFACE */
EXISTE = 'N';
SELECT 'S', TICO_COD, PRCO_PRE, INBA_BANCO, INBA_IVA, INBA_GMF, INBA_BASE, INBA_CTABCO, INBA_CTAIVA, INBA_CTAGMF, INBA_CTABASE, INBA_CONFIRMAR
    FROM INTERFAZ_BANCOS
    WHERE INBA_ID = :IDINTER
    INTO :EXISTE, :TIPOCOMP, :PREFCONT, :BANCO, :IVA, :GMF, :BASE, :CTABANCO, CTAIVA, CTAGMF, CTABASE, :VER;
if (EXISTE = 'S') then
  BEGIN
  /* BORRE CUALQUEIR CONTABILIZACION PREVIA */
  DELETE FROM CONTABILIZACION WHERE CNTB_TIPOREF = 74 AND CNTB_IDREF = :IDDOC;
  /* TRAIGA EL ENCABEZADO  */
  SELECT PRBA_PREF, NDBC_NUMERO, NDBC_FECHA, NDBC_CONCEPTO, NDBC_MONTO, NDBC_GMFMONTO, NDBC_IVAMONTO, CUBA_CTACONTA, CUBA_CTAIVA, CUBA_CTAGMF, NDBC_ANULADO, BANC_NIT
        FROM NOTAS_DEBITO N, CUENTAS_BANCO C, BANCOS B
        WHERE NDBC_ID = :IDDOC AND C.CUBA_COD = N.CUBA_COD AND B.BANC_COD = C.BANC_COD
        INTO :PREF, :NUM, :FECAUX, :CONC, :MONTO, :VRGMF, :VRIVA, :BCTABANCO, :BCTAIVA, :BCTAGMF, :ANULADO, :NIT;
  if (ANULADO = 'N') then
    BEGIN
    if (VRIVA IS NULL) then
        VRIVA = 0;
    if (VRGMF IS NULL) then
        VRGMF = 0;
    NUMERO = PREF || NUM;
    SELECT PRBA_CENTRO, PRBA_PROY
        FROM PREFIJOS_BANCOS P, NOTAS_DEBITO N
        WHERE P.PRBA_PREF = N.PRBA_PREF AND P.CUBA_COD = N.CUBA_COD AND p.tido_cod = 74 and N.NDBC_ID = :IDDOC
        INTO :CENTRO, :PROY;
    EXECUTE PROCEDURE FECHA_A_CONTA(:FECAUX) returning_values (:FECHA);
    /* REGISTRE EL ENCABEZADO CONTABLE */
    IDC = GEN_ID(ID_CONTABILIZA, 1);
    INSERT INTO CONTABILIZACION (CNTB_ID, CNTB_TIPOCOMP, CNTB_PREFCNT, CNTB_NUMERO, CNTB_FECHA, CNTB_CONCEPTO, CNTB_REF, CNTB_TIPOREF, CNTB_IDREF, CNTB_PREFREF, CNTB_NUMREF, CNTB_PROCESADO)
        VALUES (:IDC, :TIPOCOMP, :PREFCONT, :NUM, :FECHA, :CONC, '', 74, :IDDOC, :PREF, :NUM, 'N');
    NROI = 0;
    SUMA = 0;
    ERROR = 0;
    /* CUENTA BASE */
    if (BASE = 'K') then
        BEGIN
        CUENTA = NULL;
        SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
            WHERE CUEN_COD = :CTABASE INTO :CUENTA, :TIPOCUEN;
        if (CUENTA IS NULL) then
            begin
            EXECUTE PROCEDURE ERRORINT(74, :IDDOC, :CTABASE, 2);
            CUENTA = CTABASE;
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            EXECUTE PROCEDURE ERRORINT(74, :IDDOC, :CUENTA, 3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'C') then
            BEGIN
            EXECUTE PROCEDURE ERRORINT(74, :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, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            END
        END /* BASE = K */
    /* CUENTA GMF */
    if ((VRGMF <> 0) AND ((GMF = 'K') or (GMF = 'B'))) then
        BEGIN
        if (GMF = 'B') then
            CTAGMF = BCTAGMF;
        CUENTA = NULL;
        SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
            WHERE CUEN_COD = :CTAGMF INTO :CUENTA, :TIPOCUEN;
        if (CUENTA IS NULL) then
            begin
            EXECUTE PROCEDURE ERRORINT(74, :IDDOC, :CTAGMF, 2);
            CUENTA = CTAGMF;
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            EXECUTE PROCEDURE ERRORINT(74, :IDDOC, :CUENTA, 3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'C') then
            BEGIN
            EXECUTE PROCEDURE ERRORINT(74, :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, :NROI, :CUENTA, :CONC, '', :VRGMF, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            END
        END /* GMF */
    /* CUENTA IVA */
    if ((VRIVA <> 0) AND ((IVA = 'K') or (IVA = 'B'))) then
        BEGIN
        if (IVA = 'B') then
            CTAIVA = BCTAIVA;
        CUENTA = NULL;
        SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
            WHERE CUEN_COD = :CTAIVA INTO :CUENTA, :TIPOCUEN;
        if (CUENTA IS NULL) then
            begin
            EXECUTE PROCEDURE ERRORINT(74, :IDDOC, :CTAIVA, 2);
            CUENTA = CTAIVA;
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            EXECUTE PROCEDURE ERRORINT(74, :IDDOC, :CUENTA, 3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'C') then
            BEGIN
            EXECUTE PROCEDURE ERRORINT(74, :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, :NROI, :CUENTA, :CONC, '', :VRIVA, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            END
        END /* IVA */
    /* CUENTA BANCO */
    if ((BANCO = 'B') or (BANCO = 'K')) then
        BEGIN
        if (BANCO = 'B') then
            CTABANCO = BCTABANCO;
        SUMA = MONTO + VRGMF + VRIVA;
        if (SUMA <> 0) then
            BEGIN
            CUENTA = NULL;
            SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :CTABANCO INTO :CUENTA, :TIPOCUEN;
            if (CUENTA IS NULL) then
                begin
                EXECUTE PROCEDURE ERRORINT(74, :IDDOC, :CTABANCO, 2);
                CUENTA = CTABANCO;
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'I') then
                BEGIN
                EXECUTE PROCEDURE ERRORINT(74, :IDDOC, :CUENTA, 3);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                EXECUTE PROCEDURE ERRORINT(74, :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, :NROI, :CUENTA, :CONC, '', 0, :SUMA, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                END
            END /* SUMA <> 0 */
        END /* BANCO K O B */
        
    /* recorra las cuentas adicionales */
    FOR SELECT INBC_CUENTA, INBC_BASE, INBC_PORC, INBC_VALOR, INBC_DB
        FROM INTERFAZ_BANCOS_CTAS
        WHERE INBA_ID = :IDINTER
        INTO :CUENTAADIC, :BASEADIC, :PORCADIC, :VALORADIC, :DBADIC
        DO
        BEGIN
        if (:BASEADIC = 'MONTO') then
            VALORADIC = MONTO;
        MONTO = VALORADIC * PORCADIC;
        
        /* TRAIGA LAS CARACTERISTICAS DE LA CUENTA */
        CUENTA = NULL;
        SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
            WHERE CUEN_COD = :CUENTAADIC INTO :CUENTA, :TIPOCUEN;
        if (CUENTA IS NULL) then
            begin
            EXECUTE PROCEDURE ERRORINT(74, :IDDOC, :CUENTAADIC, 2);
            CUENTA = CUENTAADIC;
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            EXECUTE PROCEDURE ERRORINT(74, :IDDOC, :CUENTA, 3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'C') then
            BEGIN
            EXECUTE PROCEDURE ERRORINT(74, :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, :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
    if (ERROR > 0) then
        VER = 'S';
    SUSPEND;
    END
  END
ELSE
    BEGIN
    EXECUTE PROCEDURE ERRORINT(74, :IDDOC, :PREF, 1);
    ERROR = ERROR + 1;
    VER = 'S';
    SUSPEND;
    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 ^ ;

CREATE OR ALTER procedure CONTABIL_NOTADBCL (
    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 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 TIPOCOMP VARCHAR(3);
declare variable PREFCONT VARCHAR(4);
declare variable BASE CHAR(1);
declare variable CTABASE VARCHAR(20);
declare variable IVA CHAR(1);
declare variable CTAIVA VARCHAR(20);
declare variable CLIE CHAR(1);
declare variable CTACLIE VARCHAR(20);
declare variable RTFTE CHAR(1);
declare variable CTARTFTE VARCHAR(20);
declare variable RTIVA CHAR(1);
declare variable CTARTIVA VARCHAR(20);
declare variable RTICA CHAR(1);
declare variable CTARTICA VARCHAR(20);
declare variable RTCREE CHAR(1);
declare variable CTARTCREE VARCHAR(20);
declare variable EXISTE CHAR(1);
declare variable CUENTA VARCHAR(20);
declare variable ES_RETENCION CHAR(1);
declare variable TIPOCUEN CHAR(1);
declare variable NIT VARCHAR(20);
declare variable NOMBRE VARCHAR(60);
declare variable PROY VARCHAR(4);
declare variable CENTRO VARCHAR(4);
declare variable 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', TICO_COD, PRCO_PRE, INCA_BASE, INCA_IVA, INCA_RTFTE, INCA_RTIVA, INCA_RTICA, INCA_RTCREE, INCA_CLIE, INCA_CTABASE, INCA_CTAIVA,
    INCA_CTARTFTE, INCA_CTARTIVA, INCA_CTARTICA, INCA_CTARTCREE, INCA_CTACLIE, INCA_CONFIRMAR
    FROM INTERFAZ_CARTERA
    WHERE INCA_ID = :IDINTER
    INTO :EXISTE, :TIPOCOMP, :PREFCONT, :BASE, :IVA, :RTFTE, :RTIVA, :RTICA, :RTCREE, :CLIE, :CTABASE, :CTAIVA,
    :CTARTFTE, :CTARTIVA, :CTARTICA, :CTARTCREE, :CTACLIE, :VER;
if (EXISTE = 'S') then
  BEGIN
  /* BORRE CUALQUEIR CONTABILIZACION PREVIA */
  DELETE FROM CONTABILIZACION WHERE CNTB_TIPOREF = 41 AND CNTB_IDREF = :IDDOC;
  /* 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_NOM, 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, :NOMBRE, 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);
    /* REGISTRE EL ENCABEZADO CONTABLE */
    IDC = GEN_ID(ID_CONTABILIZA, 1);
    INSERT INTO CONTABILIZACION (CNTB_ID, CNTB_TIPOCOMP, CNTB_PREFCNT, CNTB_NUMERO, CNTB_FECHA, CNTB_CONCEPTO, CNTB_REF, CNTB_TIPOREF, CNTB_IDREF, CNTB_PREFREF, CNTB_NUMREF, CNTB_PROCESADO)
        VALUES (:IDC, :TIPOCOMP, :PREFCONT, :NUM, :FECHA, :CONC, '', 41, :IDDOC, :PREF, :NUM, 'N');
    NROI = 0;
    SUMA = 0;
    ERROR = 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
                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';
                ERROR = ERROR + 1;
                end
            if (ES_RETENCION = 'S') then
                if (PORC <> 0) then
                    montobase = FLOOR(VRSUBT / PORC * -1);
                else
                    montobase = VRSUBT * -1;
            else
                montobase = 0;
            if (TIPOCUEN = 'I') then
                BEGIN
                EXECUTE PROCEDURE ERRORINT(41, :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, :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
                WHERE CUEN_COD = :CTAIVA INTO :CUENTA, :TIPOCUEN;
            if (CUENTA IS NULL) then
                begin
                EXECUTE PROCEDURE ERRORINT(41, :IDDOC, :CTAIVA, 2);
                CUENTA = CTAIVA;
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'I') then
                BEGIN
                EXECUTE PROCEDURE ERRORINT(41, :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, :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
            WHERE CUEN_COD = :CTARTFTE INTO :CUENTA, :TIPOCUEN;
        if (CUENTA IS NULL) then
            begin
            EXECUTE PROCEDURE ERRORINT(41, :IDDOC, :CTARTFTE, 2);
            CUENTA = CTARTFTE;
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            EXECUTE PROCEDURE ERRORINT(41, :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, '', :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
                WHERE CUEN_COD = :CTARTFTE INTO :CUENTA, :TIPOCUEN;
            if (CUENTA IS NULL) then
                begin
                EXECUTE PROCEDURE ERRORINT(41, :IDDOC, :CTARTFTE, 2);
                CUENTA = CTARTFTE;
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'I') then
                BEGIN
                EXECUTE PROCEDURE ERRORINT(41, :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, 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
            WHERE CUEN_COD = :CTARTIVA INTO :CUENTA, :TIPOCUEN;
        if (CUENTA IS NULL) then
            begin
            EXECUTE PROCEDURE ERRORINT(41, :IDDOC, :CTARTIVA, 2);
            CUENTA = CTARTIVA;
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            EXECUTE PROCEDURE ERRORINT(41, :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, '', :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
            WHERE CUEN_COD = :CTARTICA INTO :CUENTA, :TIPOCUEN;
        if (CUENTA IS NULL) then
            begin
            EXECUTE PROCEDURE ERRORINT(41, :IDDOC, :CTARTICA, 2);
            CUENTA = CTARTICA;
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            EXECUTE PROCEDURE ERRORINT(41, :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, '', :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
            WHERE CUEN_COD = :CTARTCREE INTO :CUENTA, :TIPOCUEN;
        if (CUENTA IS NULL) then
            begin
            EXECUTE PROCEDURE ERRORINT(41, :IDDOC, :CTARTCREE, 2);
            CUENTA = CTARTCREE;
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            EXECUTE PROCEDURE ERRORINT(41, :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, '', :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
                WHERE CUEN_COD = :ctartcree INTO :CUENTA, :TIPOCUEN;
            if (CUENTA IS NULL) then
                begin
                EXECUTE PROCEDURE ERRORINT(41, :IDDOC, :ctartcree, 2);
                CUENTA = ctartcree;
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'I') then
                BEGIN
                EXECUTE PROCEDURE ERRORINT(41, :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, :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
            WHERE CUEN_COD = :CUENTAADIC INTO :CUENTA, :TIPOCUEN;
        IF (CUENTA IS NULL) THEN
            begin
            EXECUTE PROCEDURE ERRORINT(41, :IDDOC, :CUENTAADIC, 2);
            CUENTA = CUENTAADIC;
            ERROR = ERROR + 1;
            end
        /* DEPENDE DEL TIPO DE CUENTA */
        if (TIPOCUEN = 'I') then
            BEGIN
            EXECUTE PROCEDURE ERRORINT(41, :IDDOC, :CUENTA, 3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'C') then
            BEGIN
            if (DBADIC = 'S') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_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
            WHERE CUEN_COD = :CTACLIE INTO :CUENTA, :TIPOCUEN;
        IF (CUENTA IS NULL) then
            begin
            EXECUTE PROCEDURE ERRORINT(41, :IDDOC, :CTACLIE, 2);
            CUENTA = CTACLIE;
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            EXECUTE PROCEDURE ERRORINT(41, :IDDOC, :CUENTA, 3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'C') then
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_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 (ERROR > 0) then
        VER = 'S';
    SUSPEND;
    END /* NO ANULADO */
  END /* EXISTE LA INTERFAZ */
ELSE
    BEGIN
    EXECUTE PROCEDURE ERRORINT(41, :IDDOC, :PREF, 1);
    ERROR = ERROR + 1;
    VER = 'S';
    SUSPEND;
    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 ^ ;

CREATE OR ALTER procedure CONTABIL_PLANILLA (
    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 TIPOCOMP VARCHAR(3);
declare variable PREFCONT VARCHAR(4);
declare variable CXPAGAR CHAR(1);
declare variable CTAPAGAR VARCHAR(20);
declare variable CAJA CHAR(1);
declare variable CTACAJA VARCHAR(20);
declare variable CARTERA CHAR(1);
declare variable CTACARTERA VARCHAR(20);
declare variable CTACONCEPTO VARCHAR(20);
declare variable CTAINGPLA VARCHAR(20);
declare variable CTAINGREM 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 NITASOC VARCHAR(20);
declare variable NITCLI VARCHAR(20);
declare variable PROY VARCHAR(4);
declare variable CENTRO VARCHAR(4);
declare variable NROI INTEGER;
declare variable SUMA NUMERIC(18,2);
declare variable SUMACAJA NUMERIC(18,2);
declare variable SUMACART NUMERIC(18,2);
declare variable INGPAS NUMERIC(18,2);
declare variable INGREM NUMERIC(18,2);
declare variable NUMDET VARCHAR(10);
declare variable SEGURO NUMERIC(18,2);
declare variable CTASEGURO VARCHAR(20);
declare variable DOMICILIO NUMERIC(18,2);
declare variable CTADOMIC VARCHAR(20);
declare variable CTACONTRAE VARCHAR(20);
declare variable CXPP NUMERIC(18,2);
declare variable CXPR NUMERIC(18,2);
declare variable CONTRAE NUMERIC(18,2);
declare variable CANT INTEGER;
BEGIN
/* BUSQUE LA INTERFACE */
EXISTE = 'N';
SELECT 'S', TICO_COD, PRCO_PREF, INTR_CONFIRMAR, INTR_CAJA, INTR_CTACAJA, INTR_CXPAGAR, INTR_CTAPAGAR,
    INTR_CARTERA, INTR_CTACARTERA, INTR_CTAINGPLA, INTR_CTAINGREM, INTR_CTASEGURO, INTR_CTADOMICIL, intr_ctacontrae
    FROM interfaz_transporte
    WHERE INTR_ID = :IDINTER
    INTO :EXISTE, :TIPOCOMP, :PREFCONT, :VER, :CAJA, :CTACAJA, :CXPAGAR, :CTAPAGAR,
        :CARTERA, :CTACARTERA, :CTAINGPLA, :CTAINGREM, :ctaseguro, :ctadomic, :ctacontrae;
if (EXISTE = 'S') then
    BEGIN
    DELETE FROM contabilizacion WHERE CNTB_TIPOREF = 88 AND CNTB_IDREF = :IDDOC;

    /* TRAIGA EL ENCABEZADO  */
    SELECT PLPA_PREF, PLPA_NUMERO, PLPA_FECHA, TERC_NIT
        FROM planilla_pasajeros P, vehiculos v WHERE PLPA_ID = :IDDOC AND P.plpa_vehiculo = V.vehi_cod
        INTO :PREF, :NUM, :FECAUX, :NITASOC;
    NUMERO = PREF || NUM;
    SELECT PREF_CENTRO, PREF_PROY FROM prefijos P, planilla_pasajeros PP
        WHERE P.pref_pre = PP.plpa_pref AND PP.plpa_id = :IDDOC AND P.tido_cod = 88
        INTO :CENTRO, :PROY;
    EXECUTE PROCEDURE FECHA_A_CONTA(:FECAUX) returning_values (:FECHA);
    /* REGISTRE EL ENCABEZADO CONTABLE */
    CONC = 'PLANILLA DE PASAJEROS No. ' || :NUMERO;
    IDC = GEN_ID(ID_CONTABILIZA, 1);
    INSERT INTO CONTABILIZACION (CNTB_ID, CNTB_TIPOCOMP, CNTB_PREFCNT, CNTB_NUMERO, CNTB_FECHA, CNTB_CONCEPTO, CNTB_REF, CNTB_TIPOREF, CNTB_IDREF, CNTB_PREFREF, CNTB_NUMREF, CNTB_PROCESADO)
        VALUES (:IDC, :TIPOCOMP, :PREFCONT, :NUM, :FECHA, :CONC, '', 88, :IDDOC, :PREF, :NUM, 'N');
    NROI = 0;
    SUMA = 0;
    CXPP = 0;
    CXPR = 0;
    ERROR = 0;

    if (CAJA = 'C') then
        SELECT FIRST 1 CAJA_CUENTA FROM CAJAS c, tiquete_pasajero T WHERE T.tiqp_formap = 'C' AND T.tiqp_caja = C.caja_id INTO :ctacaja;
    if (CXPAGAR = 'T') then
        SELECT TERC_CTACLIENTE FROM TERCEROS WHERE TERC_NIT = :nitasoc INTO :ctapagar;

    /* SOLO LA PARTE DE CONTADO */
    CONC = 'TIQUETES CONTADO PLANILLA DE PASAJEROS No. ' || :NUMERO;
    SELECT sum(PLPA_VALOR) FROM planilla_pasajeros_det P, tiquete_pasajero t
        WHERE p.plpa_tiquete = t.tiqp_id and t.tiqp_formap = 'C' and P.plpa_id = :iddoc INTO :sumacaja;
    if (sumacaja <> 0) then
        BEGIN
        /* LA CAJA */
        CUENTA = NULL;
        SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
            WHERE CUEN_COD = :ctacaja INTO :CUENTA, :TIPOCUEN;
        if (CUENTA IS NULL) then
            begin
            EXECUTE PROCEDURE ERRORINT(88, :IDDOC, :ctacaja, 2);
            CUENTA = ctacaja;
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            EXECUTE PROCEDURE ERRORINT(88, :IDDOC, :CUENTA, 3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'C') then
            BEGIN
            EXECUTE PROCEDURE ERRORINT(88, :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, :NROI, :CUENTA, :CONC, '', :sumacaja, 0, 0, 0, :nitasoc, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            END
        /* la cuenta por pagar al transportador */
        SELECT FPRM_CTAPASAJE FROM forma_pago_remesa WHERE FPRM_COD = 'C' INTO :ctapagar;
        CUENTA = NULL;
        SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
            WHERE CUEN_COD = :ctapagar INTO :CUENTA, :TIPOCUEN;
        if (CUENTA IS NULL) then
            begin
            EXECUTE PROCEDURE ERRORINT(88, :IDDOC, :ctapagar, 2);
            CUENTA = ctapagar;
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            EXECUTE PROCEDURE ERRORINT(88, :IDDOC, :CUENTA, 3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'C') then
            BEGIN
            EXECUTE PROCEDURE ERRORINT(88, :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, :NROI, :CUENTA, :CONC, '', 0, :sumacaja, 0, 0, :nitasoc, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            CXPP = SUMACAJA;
            NROI = NROI + 1;
            END
        END /* PASAJES CONTADO */

    /* PASAJES A CREDITO */
    sumacart = 0;
    FOR SELECT TIQP_NIT, PLPA_VALOR, PLPD_PREF || PLPD_NUMERO, TIQP_CANT FROM planilla_pasajeros_det P, tiquete_pasajero t
        WHERE p.plpa_tiquete = t.tiqp_id and t.tiqp_formap = 'R' and P.plpa_id = :iddoc
        INTO :nitcli, :monto, :numdet, :CANT
        DO
        BEGIN
        if (MONTO <> 0) then
            BEGIN
            /* LA CARTERA */
            CONC = 'TIQUETE CREDITO No. ' || :numdet;
            if (CARTERA = 'T') then
                SELECT TERC_CTACLIENTE FROM TERCEROS WHERE TERC_NIT = :nitcli INTO :ctacartera;

            CUENTA = NULL;
            SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :ctacartera INTO :CUENTA, :TIPOCUEN;
            if (CUENTA IS NULL) then
                begin
                EXECUTE PROCEDURE ERRORINT(88, :IDDOC, :ctacartera, 2);
                CUENTA = ctacartera;
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'I') then
                BEGIN
                EXECUTE PROCEDURE ERRORINT(88, :IDDOC, :CUENTA, 3);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                EXECUTE PROCEDURE ERRORINT(88, :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, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :nitcli, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                sumacart = sumacart + MONTO;
                END

            /* INGRESO PASAJES A CREDITO */
            CONC = 'TIQUETES CREDITO PLANILLA DE PASAJEROS No. ' || :NUMERO;
            execute procedure LEE_configuracion('TRANSPORTE', 'GENERAL', 'TARIFA DE INGRESO POR PASAJES A CREDITO') returning_values (:ingpas);
            MONTO = ingpas * :cant;
            if (MONTO <> 0) then
                BEGIN
                CUENTA = NULL;
                SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                    WHERE CUEN_COD = :ctaingpla INTO :CUENTA, :TIPOCUEN;
                if (CUENTA IS NULL) then
                    begin
                    EXECUTE PROCEDURE ERRORINT(88, :IDDOC, :ctaingpla, 2);
                    CUENTA = ctaingpla;
                    ERROR = ERROR + 1;
                    end
                if (TIPOCUEN = 'I') then
                    BEGIN
                    EXECUTE PROCEDURE ERRORINT(88, :IDDOC, :CUENTA, 3);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    EXECUTE PROCEDURE ERRORINT(88, :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, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :nitasoc, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    NROI = NROI + 1;
                    SUMACART = SUMACART - MONTO;
                    END
                END /* INGRESO PASAJES CREDITO */
            END
        END

    /* la cuenta por pagar al transportador */
    SELECT FPRM_CTAPASAJE FROM forma_pago_remesa WHERE FPRM_COD = 'R' INTO :ctapagar;
    if (sumacart <> 0) then
        BEGIN
        CUENTA = NULL;
        SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
            WHERE CUEN_COD = :ctapagar INTO :CUENTA, :TIPOCUEN;
        if (CUENTA IS NULL) then
            begin
            EXECUTE PROCEDURE ERRORINT(88, :IDDOC, :ctapagar, 2);
            CUENTA = ctapagar;
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            EXECUTE PROCEDURE ERRORINT(88, :IDDOC, :CUENTA, 3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'C') then
            BEGIN
            EXECUTE PROCEDURE ERRORINT(88, :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, :NROI, :CUENTA, :CONC, '', 0, :sumacart, 0, 0, :nitasoc, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            END
        END /* PASAJES CREDITO */

    /* REMESAS A CREDITO */
    sumacart = 0;
    FOR SELECT CGRM_NIT, PLPR_VALOR, PLPR_PREF || PLPR_NUMREM FROM planilla_pasajeros_rem P, carga_remesa R
        WHERE p.plpr_remesa = R.cgrm_id and R.cgrm_fpago = 'R' and P.plpa_id = :iddoc
        INTO :nitcli, :monto, :numdet
        DO
        BEGIN
        if (MONTO <> 0) then
            BEGIN
            CONC = 'REMESA A CREDITO No. ' || :NUMERO;
            /* LA CARTERA */
            if (CARTERA = 'T') then
                SELECT TERC_CTACLIENTE FROM TERCEROS WHERE TERC_NIT = :nitcli INTO :ctacartera;

            CUENTA = NULL;
            SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :ctacartera INTO :CUENTA, :TIPOCUEN;
            if (CUENTA IS NULL) then
                begin
                EXECUTE PROCEDURE ERRORINT(88, :IDDOC, :ctacartera, 2);
                CUENTA = ctacartera;
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'I') then
                BEGIN
                EXECUTE PROCEDURE ERRORINT(88, :IDDOC, :CUENTA, 3);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                EXECUTE PROCEDURE ERRORINT(88, :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, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :nitcli, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                sumacart = sumacart + MONTO;
                END
            END
        END
    /* REMESAS DE CONTADO */
    CONC = 'REMESAS CONTADO PLANILLA DE PASAJEROS No. ' || :NUMERO;
    SELECT sum(PLPR_VALOR) FROM planilla_pasajeros_rem P, carga_remesa R
        WHERE P.plpr_remesa = R.cgrm_id AND R.cgrm_fpago = 'C' AND P.plpa_id = :iddoc
        INTO :sumacaja;
    if (sumacaja <> 0) then
        BEGIN
        CUENTA = NULL;
        SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
            WHERE CUEN_COD = :ctacaja INTO :CUENTA, :TIPOCUEN;
        if (CUENTA IS NULL) then
            begin
            EXECUTE PROCEDURE ERRORINT(88, :IDDOC, :ctacaja, 2);
            CUENTA = ctacaja;
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            EXECUTE PROCEDURE ERRORINT(88, :IDDOC, :CUENTA, 3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'C') then
            BEGIN
            EXECUTE PROCEDURE ERRORINT(88, :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, :NROI, :CUENTA, :CONC, '', :sumacaja, 0, 0, 0, :nitasoc, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            END
        END /* REMESAS CAJA */

    /* CONTRAENTREGAS  */
    CONC = 'REMESAS CONTRAENTREGA PLANILLA DE PASAJEROS No. ' || :NUMERO;
    SELECT sum(PLPR_CONTRAE), SUM(CGRM_SEGURO), SUM(CGRM_DOMICILIO) FROM planilla_pasajeros_rem P, carga_remesa R
        WHERE P.plpr_remesa = R.cgrm_id AND R.cgrm_fpago = 'E' AND P.plpa_id = :iddoc
        INTO :sumacaja, :SEGURO, :DOMICILIO;
    execute procedure LEE_configuracion('TRANSPORTE', 'GENERAL', 'TARIFA DE INGRESO POR REMESAS DE PASAJEROS') returning_values (:ingrem);
    execute procedure redondee(((sumacaja-seguro-domicilio) * ingrem / 100)+seguro+domicilio, 0) returning_values (CONTRAE);
    if (CONTRAE <> 0) then
        BEGIN
        CUENTA = NULL;
        SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
            WHERE CUEN_COD = :ctacontrae INTO :CUENTA, :TIPOCUEN;
        if (CUENTA IS NULL) then
            begin
            EXECUTE PROCEDURE ERRORINT(88, :IDDOC, :ctacontrae, 2);
            CUENTA = ctacontrae;
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            EXECUTE PROCEDURE ERRORINT(88, :IDDOC, :CUENTA, 3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'C') then
            BEGIN
            EXECUTE PROCEDURE ERRORINT(88, :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, :NROI, :CUENTA, :CONC, '', :CONTRAE, 0, 0, 0, :nitasoc, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            END
        END /* CONTRAENTREGAS */

    /* INGRESO REMESAS  */
    CONC = 'REMESAS PLANILLA DE PASAJEROS No. ' || :NUMERO;
    SELECT sum(PLPR_VALOR+PLPR_CONTRAE), SUM(CGRM_SEGURO), SUM(CGRM_DOMICILIO) FROM planilla_pasajeros_rem P, carga_remesa R
        WHERE P.plpr_remesa = R.cgrm_id AND P.plpa_id = :iddoc
        INTO :sumacaja, :SEGURO, :DOMICILIO;
    execute procedure redondee((sumacaja-seguro-domicilio) * ingrem / 100, 0) returning_values (MONTO);
    if (MONTO <> 0) then
        BEGIN
        CUENTA = NULL;
        SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
            WHERE CUEN_COD = :ctaingrem INTO :CUENTA, :TIPOCUEN;
        if (CUENTA IS NULL) then
            begin
            EXECUTE PROCEDURE ERRORINT(88, :IDDOC, :ctaingrem, 2);
            CUENTA = ctaingrem;
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            EXECUTE PROCEDURE ERRORINT(88, :IDDOC, :CUENTA, 3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'C') then
            BEGIN
            EXECUTE PROCEDURE ERRORINT(88, :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, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :nitasoc, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            END
        END /* INGRESO REMESAS */

    /* DOMICILIO */
    if (domicilio <> 0) then
        BEGIN
        CUENTA = NULL;
        SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
            WHERE CUEN_COD = :ctadomic INTO :CUENTA, :TIPOCUEN;
        if (CUENTA IS NULL) then
            begin
            EXECUTE PROCEDURE ERRORINT(88, :IDDOC, :ctadomic, 2);
            CUENTA = ctadomic;
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            EXECUTE PROCEDURE ERRORINT(88, :IDDOC, :CUENTA, 3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'C') then
            BEGIN
            EXECUTE PROCEDURE ERRORINT(88, :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, :NROI, :CUENTA, :CONC, '', 0, :domicilio, 0, 0, :nitasoc, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            END
        END /* DOMICILIO */

    /* SEGUROS */
    if (seguro <> 0) then
        BEGIN
        CUENTA = NULL;
        SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
            WHERE CUEN_COD = :ctaseguro INTO :CUENTA, :TIPOCUEN;
        if (CUENTA IS NULL) then
            begin
            EXECUTE PROCEDURE ERRORINT(88, :IDDOC, :ctaseguro, 2);
            CUENTA = ctaseguro;
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            EXECUTE PROCEDURE ERRORINT(88, :IDDOC, :CUENTA, 3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'C') then
            BEGIN
            EXECUTE PROCEDURE ERRORINT(88, :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, :NROI, :CUENTA, :CONC, '', 0, :seguro, 0, 0, :nitasoc, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            END
        END /* SEGUROS */

    /* la cuenta por pagar al transportador */
    SELECT FPRM_CTACONTA FROM forma_pago_remesa WHERE FPRM_COD = 'C' INTO :ctapagar;
    CONC = 'REMESAS PLANILLA DE PASAJEROS No. ' || :NUMERO;
    SELECT sum(PLPR_VALOR), SUM(CGRM_SEGURO), SUM(CGRM_DOMICILIO) FROM planilla_pasajeros_rem P, carga_remesa R
        WHERE P.plpr_remesa = R.cgrm_id AND R.cgrm_fpago <> 'E' AND P.plpa_id = :iddoc
        INTO :sumacaja, :SEGURO, :DOMICILIO;
    execute procedure redondee(((sumacaja-seguro-domicilio) * ingrem / 100), 0) returning_values (MONTO);
    sumacaja = sumacaja - MONTO - domicilio - seguro;
    if (sumacaja <> 0) then
        BEGIN
        CUENTA = NULL;
        SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
            WHERE CUEN_COD = :ctapagar INTO :CUENTA, :TIPOCUEN;
        if (CUENTA IS NULL) then
            begin
            EXECUTE PROCEDURE ERRORINT(88, :IDDOC, :ctapagar, 2);
            CUENTA = ctapagar;
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            EXECUTE PROCEDURE ERRORINT(88, :IDDOC, :CUENTA, 3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'C') then
            BEGIN
            EXECUTE PROCEDURE ERRORINT(88, :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, :NROI, :CUENTA, :CONC, '', 0, :sumacaja, 0, 0, :nitasoc, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            END
        END /* CTA X PAGAR REMESAS */

    /* RECORRA LOS CONCEPTOS*/
    FOR SELECT copl_ctaconta, plpc_valor
        FROM planilla_pasajeros_con P, conceptos_planilla C
        WHERE P.plpc_conc = C.copl_id AND P.plpa_id = :iddoc ORDER BY P.plpc_item
        INTO :ctaconcepto, :monto
        DO
        BEGIN
        if (MONTO <> 0) then
            BEGIN
            CUENTA = NULL;
            SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :ctaconcepto INTO :CUENTA, :TIPOCUEN;
            if (CUENTA IS NULL) then
                begin
                EXECUTE PROCEDURE ERRORINT(88, :IDDOC, :ctaconcepto, 2);
                CUENTA = ctaconcepto;
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'I') then
                BEGIN
                EXECUTE PROCEDURE ERRORINT(88, :IDDOC, :CUENTA, 3);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                EXECUTE PROCEDURE ERRORINT(88, :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, :NROI, :CUENTA, :CONC, '', 0, :MONTO, 0, 0, :nitasoc, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA - MONTO;
                END
            END
        END /* CONCEPTOS */
    /* LAS CXP */
    if (CXPP <> 0) then
        BEGIN
        SELECT FPRM_CTAPASAJE FROM forma_pago_remesa WHERE FPRM_COD = 'C' INTO :ctapagar;
        CONC = 'PASAJES PLANILLA DE PASAJEROS No. ' || :NUMERO;
        CUENTA = NULL;
        SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
            WHERE CUEN_COD = :ctapagar INTO :CUENTA, :TIPOCUEN;
        if (CUENTA IS NULL) then
            begin
            EXECUTE PROCEDURE ERRORINT(88, :IDDOC, :ctapagar, 2);
            CUENTA = ctapagar;
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            EXECUTE PROCEDURE ERRORINT(88, :IDDOC, :CUENTA, 3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'C') then
            BEGIN
            EXECUTE PROCEDURE ERRORINT(88, :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, :NROI, :CUENTA, :CONC, '', :CXPP, 0, 0, 0, :nitasoc, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            SUMA = suma + cxpp;
            END
        END /* CTA X PAGAR PASAJES */
    SELECT sum(PLPR_VALOR), SUM(CGRM_SEGURO), SUM(CGRM_DOMICILIO) FROM planilla_pasajeros_rem P, carga_remesa R
        WHERE P.plpr_remesa = R.cgrm_id AND R.cgrm_fpago = 'C' AND P.plpa_id = :iddoc
        INTO :sumacaja, :SEGURO, :DOMICILIO;
    execute procedure redondee(((sumacaja-seguro-domicilio) * ingrem / 100), 0) returning_values (MONTO);
    cxpr = sumacaja - MONTO - domicilio - seguro;
    if (CXPR <> 0) then
        BEGIN
        CONC = 'REMESAS PLANILLA DE PASAJEROS No. ' || :NUMERO;
        CUENTA = NULL;
        SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
            WHERE CUEN_COD = :ctapagar INTO :CUENTA, :TIPOCUEN;
        if (CUENTA IS NULL) then
            begin
            EXECUTE PROCEDURE ERRORINT(88, :IDDOC, :ctapagar, 2);
            CUENTA = ctapagar;
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            EXECUTE PROCEDURE ERRORINT(88, :IDDOC, :CUENTA, 3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'C') then
            BEGIN
            EXECUTE PROCEDURE ERRORINT(88, :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, :NROI, :CUENTA, :CONC, '', :CXPR, 0, 0, 0, :nitasoc, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            SUMA = suma + cxpr;
            END
        END /* CTA X PAGAR REMESAS */
    CONC = 'REMESAS CONTRAENTREGA PLANILLA DE PASAJEROS No. ' || :NUMERO;
    if (CONTRAE <> 0) then
        BEGIN
        CUENTA = NULL;
        SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
            WHERE CUEN_COD = :ctacontrae INTO :CUENTA, :TIPOCUEN;
        if (CUENTA IS NULL) then
            begin
            EXECUTE PROCEDURE ERRORINT(88, :IDDOC, :ctacontrae, 2);
            CUENTA = ctacontrae;
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            EXECUTE PROCEDURE ERRORINT(88, :IDDOC, :CUENTA, 3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'C') then
            BEGIN
            EXECUTE PROCEDURE ERRORINT(88, :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, :NROI, :CUENTA, :CONC, '', 0, :CONTRAE, 0, 0, :nitasoc, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            SUMA = SUMA - CONTRAE;
            END
        END /* CONTRAENTREGAS */

    /* CUADRE TODO CONTRA LA CAJA */
    CUENTA = NULL;
    SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
        WHERE CUEN_COD = :ctacaja INTO :CUENTA, :TIPOCUEN;
    if (CUENTA IS NULL) then
        begin
        EXECUTE PROCEDURE ERRORINT(88, :IDDOC, :ctacaja, 2);
        CUENTA = ctacaja;
        ERROR = ERROR + 1;
        end
    if (TIPOCUEN = 'I') then
        BEGIN
        EXECUTE PROCEDURE ERRORINT(88, :IDDOC, :CUENTA, 3);
        TIPOCUEN = 'N';
        ERROR = ERROR + 1;
        END
    if (TIPOCUEN = 'C') then
        BEGIN
        EXECUTE PROCEDURE ERRORINT(88, :IDDOC, :CUENTA, 4);
        TIPOCUEN = 'N';
        ERROR = ERROR + 1;
        END
    if (TIPOCUEN = 'N') then
        BEGIN
        if (SUMA > 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, :SUMA, 0, 0, :NITASOC, :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(:SUMA), 0, 0, 0, :NITASOC, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
        END

    if (ERROR > 0) then
        VER = 'S';
    SUSPEND;
    END /* EXISTE */
ELSE
    BEGIN
    EXECUTE PROCEDURE ERRORINT(72, :IDDOC, :PREF, 1);
    ERROR = ERROR + 1;
    VER = 'S';
    SUSPEND;
    END
END^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER procedure CONTABIL_PRODUCCION (
    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 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, TICO_COD, PRCO_PREF, ININ_BASE, ININ_CTABASE, ININ_CTACIERRE, ININ_CONFIRMAR, ININ_CENTRO
    FROM INTERFAZ_INVENTARIO
    WHERE ININ_ID = :IDINTER
    INTO :EXISTE, :PREFIJO, :TIPOCOMP, :PREFCONT, :BASE, :CTABASE, :CTACIERRE, :VER, :CENT;
  if (EXISTE = 'S') then
    BEGIN
    /* BORRE CUALQUEIR CONTABILIZACION PREVIA */
    DELETE FROM CONTABILIZACION WHERE CNTB_TIPOREF = 19 AND CNTB_IDREF = :IDDOC;
    /* TRAIGA EL ENCABEZADO DEL ENSAMBLE */
    SELECT PREF_PRE, PROR_NUMERO, PROR_FECHA, PROR_NIT, PROR_NOMCLIENTE, PROR_ANULADO, ARTI_COD
        FROM PRODUCCION_ORDEN
        WHERE PROR_ID = :IDDOC
        INTO :PREFIJO, :NUMERO, :FECAUX, :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;
        /* CONVIERTA LA FECHA A CADENA */
        EXECUTE PROCEDURE FECHA_A_CONTA(:FECAUX) returning_values (:FECHA);
        /* COMPONGA UN CONCEPTO */
        CONCEPTO = 'ORDEN DE PRODUCCION ' || :prefijo || :numero || '-' || SUBSTRING (:CLIENTE FROM 1 FOR 25);
        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, '', 19, :IDDOC, :PREFIJO, :NUMERO, 'N');
        NUMITEMS = 0;
        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 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
                        WHERE CUEN_COD = :CTABASE INTO :CUENTA, :TIPOCUEN;
                    if (CUENTA IS NULL) then
                        begin
                        EXECUTE PROCEDURE ERRORINT(19, :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(19, :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 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
                        WHERE CUEN_COD = :CTABASE INTO :CUENTA, :TIPOCUEN;
                    if (CUENTA IS NULL) then
                        begin
                        EXECUTE PROCEDURE ERRORINT(19, :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 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(19, :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
                    WHERE CUEN_COD = :CTABASE INTO :CUENTA, :TIPOCUEN;
                if (CUENTA IS NULL) then
                    begin
                    EXECUTE PROCEDURE ERRORINT(19, :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(19, :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(19, :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(19, :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
                    WHERE CUEN_COD = :CUENTAADIC INTO :CUENTA, :TIPOCUEN;
                if (CUENTA IS NULL) then
                    begin
                    EXECUTE PROCEDURE ERRORINT(19, :IDDOC, :CUENTAADIC, 2);
                    CUENTA = CUENTAADIC;
                    ERROR = ERROR + 1;
                    end
                if (TIPOCUEN = 'I') then
                    BEGIN
                    EXECUTE PROCEDURE ERRORINT(19, :IDDOC, :CUENTA, 3);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    EXECUTE PROCEDURE ERRORINT(19, :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(19, :IDDOC, :PREFIJO, 1);
    ERROR = ERROR + 1;
    VER = 'S';
    SUSPEND;
    END
END^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER procedure CONTABIL_PRODUCCION_DEV (
    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 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, TICO_COD, PRCO_PREF, ININ_BASE, ININ_CTABASE, ININ_CTACIERRE, ININ_CONFIRMAR, ININ_CENTRO
    FROM INTERFAZ_INVENTARIO
    WHERE ININ_ID = :IDINTER
    INTO :EXISTE, :PREFIJO, :TIPOCOMP, :PREFCONT, :BASE, :CTABASE, :CTACIERRE, :VER, :CENT;
  if (EXISTE = 'S') then
    BEGIN
    /* BORRE CUALQUEIR CONTABILIZACION PREVIA */
    DELETE FROM CONTABILIZACION WHERE CNTB_TIPOREF = 29 AND CNTB_IDREF = :IDDOC;
    /* TRAIGA EL ENCABEZADO DEL ENSAMBLE */
    SELECT PRDD_PREF, PRDD_NUMERO, PRDD_FECHA, 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, :FECAUX, :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;
        /* CONVIERTA LA FECHA A CADENA */
        EXECUTE PROCEDURE FECHA_A_CONTA(:FECAUX) returning_values (:FECHA);
        /* COMPONGA UN CONCEPTO */
        CONCEPTO = 'DEVOLUCION MATERIALES ' || :prefijo || :numero || ' EN ORDEN ' || :ORDEN;
        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, '', 29, :IDDOC, :PREFIJO, :NUMERO, 'N');
        NUMITEMS = 0;
        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 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
                        WHERE CUEN_COD = :CTABASE INTO :CUENTA, :TIPOCUEN;
                    if (CUENTA IS NULL) then
                        begin
                        EXECUTE PROCEDURE ERRORINT(29, :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(29, :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 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
                        WHERE CUEN_COD = :CTABASE INTO :CUENTA, :TIPOCUEN;
                    if (CUENTA IS NULL) then
                        begin
                        EXECUTE PROCEDURE ERRORINT(29, :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 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(29, :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
                    WHERE CUEN_COD = :CTABASE INTO :CUENTA, :TIPOCUEN;
                if (CUENTA IS NULL) then
                    begin
                    EXECUTE PROCEDURE ERRORINT(29, :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(29, :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
                    WHERE CUEN_COD = :ctacierre INTO :CUENTA, :TIPOCUEN;
                if (CUENTA IS NULL) then
                    begin
                    EXECUTE PROCEDURE ERRORINT(29, :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(29, :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
                    WHERE CUEN_COD = :CUENTAADIC INTO :CUENTA, :TIPOCUEN;
                if (CUENTA IS NULL) then
                    begin
                    EXECUTE PROCEDURE ERRORINT(29, :IDDOC, :CUENTAADIC, 2);
                    CUENTA = CUENTAADIC;
                    ERROR = ERROR + 1;
                    end
                if (TIPOCUEN = 'I') then
                    BEGIN
                    EXECUTE PROCEDURE ERRORINT(29, :IDDOC, :CUENTA, 3);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    EXECUTE PROCEDURE ERRORINT(29, :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(29, :IDDOC, :PREFIJO, 1);
    ERROR = ERROR + 1;
    VER = 'S';
    SUSPEND;
    END
END^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER procedure CONTABIL_PRODUCCION_ENT (
    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 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, TICO_COD, PRCO_PREF, ININ_BASE, ININ_CTABASE, ININ_CTACIERRE, ININ_CONFIRMAR, ININ_CENTRO
    FROM INTERFAZ_INVENTARIO
    WHERE ININ_ID = :IDINTER
    INTO :EXISTE, :PREFIJO, :TIPOCOMP, :PREFCONT, :BASE, :CTABASE, :CTACIERRE, :VER, :CENT;
  if (EXISTE = 'S') then
    BEGIN
    /* BORRE CUALQUEIR CONTABILIZACION PREVIA */
    DELETE FROM CONTABILIZACION WHERE CNTB_TIPOREF = 20 AND CNTB_IDREF = :IDDOC;
    /* TRAIGA EL ENCABEZADO DEL ENSAMBLE */
    SELECT PRDE_PREF, PRDE_NUMERO, PRDE_FECHA, 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, :FECAUX, :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;
        /* CONVIERTA LA FECHA A CADENA */
        EXECUTE PROCEDURE FECHA_A_CONTA(:FECAUX) returning_values (:FECHA);
        /* COMPONGA UN CONCEPTO */
        CONCEPTO = 'ENTRADA PRODUCCION ' || :prefijo || :numero || '-' || SUBSTRING (:CLIENTE FROM 1 FOR 25);
        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, '', 20, :IDDOC, :PREFIJO, :NUMERO, 'N');
        NUMITEMS = 0;
        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 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
                    WHERE CUEN_COD = :CTABASE INTO :CUENTA, :TIPOCUEN;
                if (CUENTA IS NULL) then
                    begin
                    EXECUTE PROCEDURE ERRORINT(20, :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(20, :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 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
                    WHERE CUEN_COD = :CTABASE INTO :CUENTA, :TIPOCUEN;
                if (CUENTA IS NULL) then
                    begin
                    EXECUTE PROCEDURE ERRORINT(20, :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(20, :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
                WHERE CUEN_COD = :ctacierre INTO :CUENTA, :TIPOCUEN;
            if (CUENTA IS NULL) then
                begin
                EXECUTE PROCEDURE ERRORINT(20, :IDDOC, :ctacierre, 2);
                CUENTA = ctacierre;
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'I') then
                BEGIN
                EXECUTE PROCEDURE ERRORINT(20, :IDDOC, :CUENTA, 3);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                EXECUTE PROCEDURE ERRORINT(20, :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
                    WHERE CUEN_COD = :CUENTAADIC INTO :CUENTA, :TIPOCUEN;
                if (CUENTA IS NULL) then
                    begin
                    EXECUTE PROCEDURE ERRORINT(20, :IDDOC, :CUENTAADIC, 2);
                    CUENTA = CUENTAADIC;
                    ERROR = ERROR + 1;
                    end
                if (TIPOCUEN = 'I') then
                    BEGIN
                    EXECUTE PROCEDURE ERRORINT(20, :IDDOC, :CUENTA, 3);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    EXECUTE PROCEDURE ERRORINT(20, :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(28, :IDDOC, :PREFIJO, 1);
    ERROR = ERROR + 1;
    VER = 'S';
    SUSPEND;
    END
END^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER procedure CONTABIL_PRODUCCION_SAL (
    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 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, TICO_COD, PRCO_PREF, ININ_BASE, ININ_CTABASE, ININ_CTACIERRE, ININ_CONFIRMAR, ININ_CENTRO
    FROM INTERFAZ_INVENTARIO
    WHERE ININ_ID = :IDINTER
    INTO :EXISTE, :PREFIJO, :TIPOCOMP, :PREFCONT, :BASE, :CTABASE, :CTACIERRE, :VER, :CENT;
  if (EXISTE = 'S') then
    BEGIN
    /* BORRE CUALQUEIR CONTABILIZACION PREVIA */
    DELETE FROM CONTABILIZACION WHERE CNTB_TIPOREF = 28 AND CNTB_IDREF = :IDDOC;
    /* TRAIGA EL ENCABEZADO DEL ENSAMBLE */
    SELECT PRSA_PREF, PRSA_NUMERO, PRSA_FECHA, 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, :FECAUX, :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;
        /* CONVIERTA LA FECHA A CADENA */
        EXECUTE PROCEDURE FECHA_A_CONTA(:FECAUX) returning_values (:FECHA);
        /* COMPONGA UN CONCEPTO */
        CONCEPTO = 'SALIDA A PRODUCCION ' || :prefijo || :numero || '-' || SUBSTRING (:CLIENTE FROM 1 FOR 25);
        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, '', 28, :IDDOC, :PREFIJO, :NUMERO, 'N');
        NUMITEMS = 0;
        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 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
                        WHERE CUEN_COD = :CTABASE INTO :CUENTA, :TIPOCUEN;
                    if (CUENTA IS NULL) then
                        begin
                        EXECUTE PROCEDURE ERRORINT(28, :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(28, :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 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
                        WHERE CUEN_COD = :CTABASE INTO :CUENTA, :TIPOCUEN;
                    if (CUENTA IS NULL) then
                        begin
                        EXECUTE PROCEDURE ERRORINT(28, :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 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(28, :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
                    WHERE CUEN_COD = :CTABASE INTO :CUENTA, :TIPOCUEN;
                if (CUENTA IS NULL) then
                    begin
                    EXECUTE PROCEDURE ERRORINT(28, :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(28, :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(28, :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(28, :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
                    WHERE CUEN_COD = :CUENTAADIC INTO :CUENTA, :TIPOCUEN;
                if (CUENTA IS NULL) then
                    begin
                    EXECUTE PROCEDURE ERRORINT(28, :IDDOC, :CUENTAADIC, 2);
                    CUENTA = CUENTAADIC;
                    ERROR = ERROR + 1;
                    end
                if (TIPOCUEN = 'I') then
                    BEGIN
                    EXECUTE PROCEDURE ERRORINT(28, :IDDOC, :CUENTA, 3);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    EXECUTE PROCEDURE ERRORINT(28, :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(28, :IDDOC, :PREFIJO, 1);
    ERROR = ERROR + 1;
    VER = 'S';
    SUSPEND;
    END
END^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER procedure CONTABIL_RECICAJA (
    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 FECAUX DATE;
declare variable FECHA CHAR(8);
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 TIPOCOMP VARCHAR(3);
declare variable PREFCONT VARCHAR(4);
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);
declare variable AUTORCREE VARCHAR(10);
declare variable FAUTORCREE DATE;
BEGIN
ERROR = 0;
/* BUSQUE LA INTERFACE */
EXISTE = 'N';
SELECT 'S',TICO_COD,PRCO_PRE,INCJ_BASE,INCJ_DTOPP,INCJ_RTFTE,INCJ_RTIVA,INCJ_RTICA,INCJ_RTCREE,INCJ_CAJA,INCJ_CTABASE,INCJ_CTADTO,
    INCJ_CTARTFTE,INCJ_CTARTIVA,INCJ_CTARTICA,INCJ_CTARTCREE,INCJ_CTACAJA,INCJ_CONFIRMAR
    FROM INTERFAZ_CAJA
    WHERE INCJ_ID = :IDINTER
    INTO :EXISTE,:TIPOCOMP,:PREFCONT,:BASE,:DTO,:RTFTE,:RTIVA,:RTICA,:RTCREE,:CAJA,:CTABASE,:CTADTO,
    :CTARTFTE,:CTARTIVA,:CTARTICA,:CTARTCREE,:CTACAJA,:VER;
if (EXISTE = 'S') then
  BEGIN
  /* BORRE LA CONTABILIZACION ANTERIOR */
  execute procedure lee_configuracion('CAJA', 'RECIBOS', 'CUENTA CONTABLE PARA EXCENTES EN RECIBOS DE CAJA') returning_values (ctaexcedente);
  OK = 0;
  FOR SELECT CNTB_ID FROM CONTABILIZACION WHERE CNTB_TIPOREF = 61 AND CNTB_IDREF = :IDDOC INTO :OK DO
    BEGIN
    DELETE FROM CONTABILIZACION_DET WHERE CNTB_ID = :OK;
    DELETE FROM CONTABILIZACION WHERE CNTB_ID = :OK;
    END
  /* TRAIGA EL ENCABEZADO DEL RECIBO */
  SELECT PREF_PRE,RECA_NUMERO,RECA_FECHA,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,:NUM,:FECAUX,: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;
    EXECUTE PROCEDURE FECHA_A_CONTA(:FECAUX) returning_values (:FECHA);
    IDC = GEN_ID(ID_CONTABILIZA,1);
    INSERT INTO CONTABILIZACION (CNTB_ID,CNTB_TIPOCOMP,CNTB_PREFCNT,CNTB_NUMERO,CNTB_FECHA,CNTB_CONCEPTO,CNTB_REF,CNTB_TIPOREF,CNTB_IDREF,CNTB_PREFREF,CNTB_NUMREF,CNTB_PROCESADO)
        VALUES (:IDC,:TIPOCOMP,:PREFCONT,:NUM,:FECHA,:CONC,'',61,:IDDOC,:PREF,:NUM,'N');
    NROI = 0;
    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
                    WHERE CUEN_COD = :CTACAJA INTO :CUENTA,:TIPOCUEN;
            ELSE
                begin
                EXECUTE PROCEDURE ERRORINT(61,:IDDOC,:CTACAJA,2);
                CUENTA = CTACAJA;
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'I') then
                BEGIN
                EXECUTE PROCEDURE ERRORINT(61,:IDDOC,:CUENTA,3);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                EXECUTE PROCEDURE ERRORINT(61,:IDDOC,:CUENTA,4);
                TIPOCUEN = 'N';
                ERROR = ERROR + 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
                        WHERE CUEN_COD = :CTACAJA INTO :CUENTA,:TIPOCUEN;
                ELSE
                    begin
                    EXECUTE PROCEDURE ERRORINT(61,:IDDOC,:CTACAJA,2);
                    CUENTA = CTACAJA;
                    ERROR = ERROR + 1;
                    end
                if (TIPOCUEN = 'I') then
                    BEGIN
                    EXECUTE PROCEDURE ERRORINT(61,:IDDOC,:CUENTA,3);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    EXECUTE PROCEDURE ERRORINT(61,:IDDOC,:CUENTA,4);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 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
                        WHERE CUEN_COD = :CTACAJA INTO :CUENTA,:TIPOCUEN;
                ELSE
                    begin
                    EXECUTE PROCEDURE ERRORINT(61,:IDDOC,:CTACAJA,2);
                    CUENTA = CTACAJA;
                    ERROR = ERROR + 1;
                    end
                if (TIPOCUEN = 'I') then
                    BEGIN
                    EXECUTE PROCEDURE ERRORINT(61,:IDDOC,:CUENTA,3);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    EXECUTE PROCEDURE ERRORINT(61,:IDDOC,:CUENTA,4);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 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
                    WHERE CUEN_COD = :CTADTO INTO :CUENTA,:TIPOCUEN;
            ELSE
                begin
                EXECUTE PROCEDURE ERRORINT(61,:IDDOC,:CTADTO,2);
                CUENTA = CTADTO;
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'I') then
                BEGIN
                EXECUTE PROCEDURE ERRORINT(61,:IDDOC,:CUENTA,3);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                EXECUTE PROCEDURE ERRORINT(61,:IDDOC,:CUENTA,4);
                TIPOCUEN = 'N';
                ERROR = ERROR + 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
                WHERE CUEN_COD = :ctadif INTO :CUENTA,:TIPOCUEN;
        ELSE
            begin
            EXECUTE PROCEDURE ERRORINT(61,:IDDOC,:ctadif,2);
            CUENTA = ctadif;
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            EXECUTE PROCEDURE ERRORINT(61,:IDDOC,:CUENTA,3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'C') then
            BEGIN
            EXECUTE PROCEDURE ERRORINT(61,:IDDOC,:CUENTA,4);
            TIPOCUEN = 'N';
            ERROR = ERROR + 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
        CUENTA = NULL;
        EXECUTE PROCEDURE VALIDE_CUENTA_C (ctaexcedente) RETURNING_VALUES (:OK);
        IF (OK = 0) THEN
            SELECT CUEN_COD,CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :ctaexcedente INTO :CUENTA,:TIPOCUEN;
        ELSE
            begin
            EXECUTE PROCEDURE ERRORINT(61,:IDDOC,:ctaexcedente,2);
            CUENTA = ctaexcedente;
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            EXECUTE PROCEDURE ERRORINT(61,:IDDOC,:CUENTA,3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'C') then
            BEGIN
            EXECUTE PROCEDURE ERRORINT(61,:IDDOC,:CUENTA,4);
            TIPOCUEN = 'N';
            ERROR = ERROR + 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
                WHERE CUEN_COD = :CTARTFTE INTO :CUENTA,:ES_RETENCION,:TIPOCUEN;
        ELSE
            begin
            EXECUTE PROCEDURE ERRORINT(61,:IDDOC,:CTARTFTE,2);
            CUENTA = CTARTFTE;
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            EXECUTE PROCEDURE ERRORINT(61,:IDDOC,:CUENTA,3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'C') then
            BEGIN
            EXECUTE PROCEDURE ERRORINT(61,:IDDOC,:CUENTA,4);
            TIPOCUEN = 'N';
            ERROR = ERROR + 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
                WHERE CUEN_COD = :CTARTIVA INTO :CUENTA,:ES_RETENCION,:TIPOCUEN;
        ELSE
            begin
            EXECUTE PROCEDURE ERRORINT(61,:IDDOC,:CTARTIVA,2);
            CUENTA = CTARTIVA;
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            EXECUTE PROCEDURE ERRORINT(61,:IDDOC,:CUENTA,3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'C') then
            BEGIN
            EXECUTE PROCEDURE ERRORINT(61,:IDDOC,:CUENTA,4);
            TIPOCUEN = 'N';
            ERROR = ERROR + 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
                WHERE CUEN_COD = :CTARTICA INTO :CUENTA,:ES_RETENCION,:TIPOCUEN;
        ELSE
            begin
            EXECUTE PROCEDURE ERRORINT(61,:IDDOC,:CTARTICA,2);
            CUENTA = CTARTICA;
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            EXECUTE PROCEDURE ERRORINT(61,:IDDOC,:CUENTA,3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'C') then
            BEGIN
            EXECUTE PROCEDURE ERRORINT(61,:IDDOC,:CUENTA,4);
            TIPOCUEN = 'N';
            ERROR = ERROR + 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
                    WHERE CUEN_COD = :ctartcree INTO :CUENTA,:ES_RETENCION,:TIPOCUEN;
            ELSE
                begin
                EXECUTE PROCEDURE ERRORINT(61,:IDDOC,:ctartcree,2);
                CUENTA = CTARTICA;
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'I') then
                BEGIN
                EXECUTE PROCEDURE ERRORINT(61,:IDDOC,:CUENTA,3);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                EXECUTE PROCEDURE ERRORINT(61,:IDDOC,:CUENTA,4);
                TIPOCUEN = 'N';
                ERROR = ERROR + 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
                WHERE CUEN_COD = :CTABASE INTO :CUENTA,:TIPOCUEN;
        ELSE
            begin
            EXECUTE PROCEDURE ERRORINT(61,:IDDOC,:CTABASE,2);
            CUENTA = CTABASE;
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            EXECUTE PROCEDURE ERRORINT(61,:IDDOC,:CUENTA,3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 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
                    WHERE CUEN_COD = :ctadif INTO :CUENTA,:TIPOCUEN;
            ELSE
                begin
                EXECUTE PROCEDURE ERRORINT(61,:IDDOC,:ctadif,2);
                CUENTA = ctadif;
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'I') then
                BEGIN
                EXECUTE PROCEDURE ERRORINT(61,:IDDOC,:CUENTA,3);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                EXECUTE PROCEDURE ERRORINT(61,:IDDOC,:CUENTA,4);
                TIPOCUEN = 'N';
                ERROR = ERROR + 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
                        WHERE CUEN_COD = :ctartfter INTO :CUENTA,:TIPOCUEN;
                ELSE
                    begin
                    EXECUTE PROCEDURE ERRORINT(62,:IDDOC,:ctartfter,2);
                    CUENTA = ctartfter;
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    end
                if (TIPOCUEN = 'I') then
                    BEGIN
                    EXECUTE PROCEDURE ERRORINT(62,:IDDOC,:CUENTA,3);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    EXECUTE PROCEDURE ERRORINT(62,: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,: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
                        WHERE CUEN_COD = :ctartivar INTO :CUENTA,:TIPOCUEN;
                ELSE
                    begin
                    EXECUTE PROCEDURE ERRORINT(62,:IDDOC,:ctartivar,2);
                    CUENTA = ctartivar;
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    end
                if (TIPOCUEN = 'I') then
                    BEGIN
                    EXECUTE PROCEDURE ERRORINT(62,:IDDOC,:CUENTA,3);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    EXECUTE PROCEDURE ERRORINT(62,: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,: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
                        WHERE CUEN_COD = :ctarticar INTO :CUENTA,:TIPOCUEN;
                ELSE
                    begin
                    EXECUTE PROCEDURE ERRORINT(62,:IDDOC,:ctarticar,2);
                    CUENTA = ctarticar;
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    end
                if (TIPOCUEN = 'I') then
                    BEGIN
                    EXECUTE PROCEDURE ERRORINT(62,:IDDOC,:CUENTA,3);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    EXECUTE PROCEDURE ERRORINT(62,: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,: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
                        WHERE CUEN_COD = :ctartcreer INTO :CUENTA,:TIPOCUEN;
                ELSE
                    begin
                    EXECUTE PROCEDURE ERRORINT(62,:IDDOC,:ctartcreer,2);
                    CUENTA = ctartcreer;
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    end
                if (TIPOCUEN = 'I') then
                    BEGIN
                    EXECUTE PROCEDURE ERRORINT(62,:IDDOC,:CUENTA,3);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    EXECUTE PROCEDURE ERRORINT(62,: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,: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
                    WHERE CUEN_COD = :CTABASE INTO :CUENTA,:TIPOCUEN;
            ELSE
                begin
                EXECUTE PROCEDURE ERRORINT(61,:IDDOC,:CTABASE,2);
                CUENTA = CTABASE;
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'I') then
                BEGIN
                EXECUTE PROCEDURE ERRORINT(61,:IDDOC,:CUENTA,3);
                TIPOCUEN = 'N';
                ERROR = ERROR + 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
                        WHERE CUEN_COD = :CTABASE INTO :CUENTA,:TIPOCUEN;
                ELSE
                    begin
                    EXECUTE PROCEDURE ERRORINT(61,:IDDOC,:CTABASE,2);
                    CUENTA = CTABASE;
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 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';
                    ERROR = ERROR + 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
                WHERE CUEN_COD = :CTADIC INTO :CUENTA,:TIPOCUEN;
        ELSE
            begin
            EXECUTE PROCEDURE ERRORINT(61,:IDDOC,:CTADIC,2);
            CUENTA = CTADIC;
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            EXECUTE PROCEDURE ERRORINT(61,:IDDOC,:CUENTA,3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'C') then
            BEGIN
            EXECUTE PROCEDURE ERRORINT(61,:IDDOC,:CUENTA,4);
            TIPOCUEN = 'N';
            ERROR = ERROR + 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 (ERROR > 0) then
        VER = 'S';
    SUSPEND;
    END /* NO ANULADO */
  END /* EXISTE LA INTERFAZ */
ELSE
    BEGIN
    EXECUTE PROCEDURE ERRORINT(61,:IDDOC,:PREF,1);
    ERROR = ERROR + 1;
    VER = 'S';
    SUSPEND;
    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 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 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 ; ^

SET TERM ^ ;

CREATE OR ALTER procedure CONTABIL_RECIPROV (
    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 FECAUX DATE;
declare variable FECHA CHAR(8);
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 VRTOTAL NUMERIC(18, 2);
declare variable TIPOCOMP VARCHAR(3);
declare variable PREFCONT VARCHAR(4);
declare variable BASE CHAR(1);
declare variable CTABASE VARCHAR(20);
declare variable 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 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 TIPOIT 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;
BEGIN
ERROR = 0;
/* BUSQUE LA INTERFACE */
EXISTE = 'N';
SELECT 'S', TICO_COD, PRCO_PRE, INCJ_BASE, INCJ_DTOPP, INCJ_RTFTE, INCJ_RTIVA, INCJ_RTICA, INCJ_CAJA, INCJ_CTABASE, INCJ_CTADTO, INCJ_CTARTFTE, INCJ_CTARTIVA, INCJ_CTARTICA, INCJ_CTACAJA, INCJ_CONFIRMAR
    FROM INTERFAZ_CAJA
    WHERE INCJ_ID = :IDINTER
    INTO :EXISTE, :TIPOCOMP, :PREFCONT, :BASE, :DTO, :RTFTE, :RTIVA, :RTICA, :CAJA, :CTABASE, :CTADTO, :CTARTFTE, :CTARTIVA, :CTARTICA, :CTACAJA, :VER;
if (EXISTE = 'S') then
  BEGIN
  /* BORRE LA CONTABILIZACION ANTERIOR */
  OK = 0;
  FOR SELECT CNTB_ID FROM CONTABILIZACION WHERE CNTB_TIPOREF = 65 AND CNTB_IDREF = :IDDOC INTO :OK DO
    BEGIN
    DELETE FROM CONTABILIZACION_DET WHERE CNTB_ID = :OK;
    DELETE FROM CONTABILIZACION WHERE CNTB_ID = :OK;
    END
  /* TRAIGA EL ENCABEZADO DEL RECIBO */
  SELECT PREF_PRE, RCPR_NUMERO, RCPR_FECHA, R.TERC_NIT, RCPR_CONC, RCPR_DTOF, RCPR_MONTO, RCPR_RTFTE, RCPR_RTIVA, RCPR_RTICA, TERC_CTARTFTE, TERC_CTARTIVA, TERC_CTARTICA, TERC_CTACLIENTE, RCPR_ANULADO
    FROM recibo_provisional R, TERCEROS T
    WHERE RCPR_ID = :IDDOC AND R.TERC_NIT = T.TERC_NIT
    INTO :PREF, :NUM, :FECAUX, :NIT, :CONC, :VRDTO, :VRTOTAL, :VRRTFTE, :VRRTIVA, :VRRTICA, :TCTARTFTE, TCTARTIVA, TCTARTICA, TCTACLIEN, :ANULADO;
  if (ANULADO = 'N') then
    BEGIN
    SELECT PREF_CENTRO, PREF_PROY FROM PREFIJOS
        WHERE PREF_PRE = :PREF AND TIDO_COD = 65 INTO :CENTRO, :PROY;
    EXECUTE PROCEDURE FECHA_A_CONTA(:FECAUX) returning_values (:FECHA);
    /* REGISTRE EL ENCABEZADO CONTABLE */
    IDC = GEN_ID(ID_CONTABILIZA, 1);
    INSERT INTO CONTABILIZACION (CNTB_ID, CNTB_TIPOCOMP, CNTB_PREFCNT, CNTB_NUMERO, CNTB_FECHA, CNTB_CONCEPTO, CNTB_REF, CNTB_TIPOREF, CNTB_IDREF, CNTB_PREFREF, CNTB_NUMREF, CNTB_PROCESADO)
        VALUES (:IDC, :TIPOCOMP, :PREFCONT, :NUM, :FECHA, :CONC, '', 65, :IDDOC, :PREF, :NUM, 'N');
    NROI = 0;
    SUMA = 0;
    IF ((CAJA = 'K')) THEN
        BEGIN
        if (vrtotal <> 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
                    WHERE CUEN_COD = :CTACAJA INTO :CUENTA, :TIPOCUEN;
            ELSE
                begin
                EXECUTE PROCEDURE ERRORINT(65, :IDDOC, :CTACAJA, 2);
                CUENTA = CTACAJA;
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'I') then
                BEGIN
                EXECUTE PROCEDURE ERRORINT(65, :IDDOC, :CUENTA, 3);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                EXECUTE PROCEDURE ERRORINT(65, :IDDOC, :CUENTA, 4);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                END
            if (TIPOCUEN = 'N') then
                BEGIN
                IF (vrtotal > 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, '', :vrtotal, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    SUMA = SUMA + vrtotal;
                    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(:vrtotal), 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                    SUMA = SUMA + vrtotal;
                    END
                NROI = NROI + 1;
                END
            END /* VRtotal <> 0 */
        END /* CAJA CONSTANTE */
    IF ((CAJA = 'F')) THEN
        BEGIN
        /* AGRUPE LAS CUENTAS DE LAS FORMAS DE PAGO */
        FOR SELECT MAX(FOPA_CTACONTA), SUM(RPPA_MONTO)
            FROM formas_pago F, recibo_provisional_pago R
            WHERE R.RCPR_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
                        WHERE CUEN_COD = :CTACAJA INTO :CUENTA, :TIPOCUEN;
                ELSE
                    begin
                    EXECUTE PROCEDURE ERRORINT(65, :IDDOC, :CTACAJA, 2);
                    CUENTA = CTACAJA;
                    ERROR = ERROR + 1;
                    end
                if (TIPOCUEN = 'I') then
                    BEGIN
                    EXECUTE PROCEDURE ERRORINT(65, :IDDOC, :CUENTA, 3);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    EXECUTE PROCEDURE ERRORINT(65, :IDDOC, :CUENTA, 4);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 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 (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
                    WHERE CUEN_COD = :CTADTO INTO :CUENTA, :TIPOCUEN;
            ELSE
                begin
                EXECUTE PROCEDURE ERRORINT(65, :IDDOC, :CTADTO, 2);
                CUENTA = CTADTO;
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'I') then
                BEGIN
                EXECUTE PROCEDURE ERRORINT(65, :IDDOC, :CUENTA, 3);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                EXECUTE PROCEDURE ERRORINT(65, :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, :NROI, :CUENTA, :CONC, '', :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 */

    /* 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
                WHERE CUEN_COD = :CTARTFTE INTO :CUENTA, :ES_RETENCION, :TIPOCUEN;
        ELSE
            begin
            EXECUTE PROCEDURE ERRORINT(65, :IDDOC, :CTARTFTE, 2);
            CUENTA = CTARTFTE;
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            EXECUTE PROCEDURE ERRORINT(65, :IDDOC, :CUENTA, 3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'C') then
            BEGIN
            EXECUTE PROCEDURE ERRORINT(65, :IDDOC, :CUENTA, 4);
            TIPOCUEN = 'N';
            ERROR = ERROR + 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
                WHERE CUEN_COD = :CTARTIVA INTO :CUENTA, :ES_RETENCION, :TIPOCUEN;
        ELSE
            begin
            EXECUTE PROCEDURE ERRORINT(65, :IDDOC, :CTARTIVA, 2);
            CUENTA = CTARTIVA;
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            EXECUTE PROCEDURE ERRORINT(65, :IDDOC, :CUENTA, 3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'C') then
            BEGIN
            EXECUTE PROCEDURE ERRORINT(65, :IDDOC, :CUENTA, 4);
            TIPOCUEN = 'N';
            ERROR = ERROR + 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
                WHERE CUEN_COD = :CTARTICA INTO :CUENTA, :ES_RETENCION, :TIPOCUEN;
        ELSE
            begin
            EXECUTE PROCEDURE ERRORINT(65, :IDDOC, :CTARTICA, 2);
            CUENTA = CTARTICA;
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            EXECUTE PROCEDURE ERRORINT(65, :IDDOC, :CUENTA, 3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'C') then
            BEGIN
            EXECUTE PROCEDURE ERRORINT(65, :IDDOC, :CUENTA, 4);
            TIPOCUEN = 'N';
            ERROR = ERROR + 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 */
    /* CIERRE EL COMPROBANTE CONTRA LA CUENTA DEL TERCERO O LA BASE CONSTANTE */
    if ((SUMA <> 0) and ((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
                WHERE CUEN_COD = :CTABASE INTO :CUENTA, :TIPOCUEN;
        ELSE
            begin
            EXECUTE PROCEDURE ERRORINT(65, :IDDOC, :CTABASE, 2);
            CUENTA = CTABASE;
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            EXECUTE PROCEDURE ERRORINT(65, :IDDOC, :CUENTA, 3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 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 */
    /* 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
                WHERE CUEN_COD = :CTADIC INTO :CUENTA, :TIPOCUEN;
        ELSE
            begin
            EXECUTE PROCEDURE ERRORINT(65, :IDDOC, :CTADIC, 2);
            CUENTA = CTADIC;
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            EXECUTE PROCEDURE ERRORINT(65, :IDDOC, :CUENTA, 3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'C') then
            BEGIN
            EXECUTE PROCEDURE ERRORINT(65, :IDDOC, :CUENTA, 4);
            TIPOCUEN = 'N';
            ERROR = ERROR + 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 (ERROR > 0) then
        VER = 'S';
    SUSPEND;
    END /* NO ANULADO */
  END /* EXISTE LA INTERFAZ */
ELSE
    BEGIN
    EXECUTE PROCEDURE ERRORINT(65, :IDDOC, :PREF, 1);
    ERROR = ERROR + 1;
    VER = 'S';
    SUSPEND;
    END
END^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER procedure CONTABIL_REMESA (
    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 TIPOCOMP VARCHAR(3);
declare variable PREFCONT VARCHAR(4);
declare variable CTAPAGARF VARCHAR(20);
declare variable CAJA CHAR(1);
declare variable CTACAJA VARCHAR(20);
declare variable CARTERA CHAR(1);
declare variable CTACARTERA VARCHAR(20);
declare variable EXISTE CHAR(1);
declare variable CUENTA VARCHAR(20);
declare variable TIPOCUEN CHAR(1);
declare variable NITASOC VARCHAR(20);
declare variable NITCLI VARCHAR(20);
declare variable PROY VARCHAR(4);
declare variable CENTRO VARCHAR(4);
declare variable NROI INTEGER;
declare variable SEGURO NUMERIC(18,2);
declare variable CTASEGURO VARCHAR(20);
declare variable CTACONTRAE VARCHAR(20);
declare variable CTASEGXC VARCHAR(20);
declare variable FORMA CHAR(1);
declare variable VALOR NUMERIC(18,2);
BEGIN
/* BUSQUE LA INTERFACE */
EXISTE = 'N';
SELECT 'S', TICO_COD, PRCO_PREF, INTR_CONFIRMAR, INTR_CAJA, INTR_CTACAJA,
    INTR_CARTERA, INTR_CTACARTERA, INTR_CTASEGURO, intr_ctacontrae
    FROM interfaz_transporte
    WHERE INTR_ID = :IDINTER
    INTO :EXISTE, :TIPOCOMP, :PREFCONT, :VER, :CAJA, :CTACAJA,
        :CARTERA, :CTACARTERA, :ctaseguro, :ctacontrae;
if (EXISTE = 'S') then
    BEGIN
    DELETE FROM contabilizacion WHERE CNTB_TIPOREF = 85 AND CNTB_IDREF = :IDDOC;

    /* TRAIGA EL ENCABEZADO  */
    SELECT CGRM_PREF, CGRM_NUMERO, CGRM_FECHA, CGRM_TOTAL, CGRM_SEGURO, CGRM_FPAGO, CGRM_NIT
        FROM carga_remesa WHERE CGRM_ID = :IDDOC
        INTO :PREF, :NUM, :FECAUX, :valor, :seguro, :forma, :nitcli;
    NUMERO = PREF || NUM;
    SELECT PREF_CENTRO, PREF_PROY FROM prefijos P WHERE P.pref_pre = :pref AND P.tido_cod = 85
        INTO :CENTRO, :PROY;
    EXECUTE PROCEDURE FECHA_A_CONTA(:FECAUX) returning_values (:FECHA);
    /* REGISTRE EL ENCABEZADO CONTABLE */
    CONC = 'REMESA DE CARGA No. ' || :NUMERO;
    IDC = GEN_ID(ID_CONTABILIZA, 1);
    INSERT INTO CONTABILIZACION (CNTB_ID, CNTB_TIPOCOMP, CNTB_PREFCNT, CNTB_NUMERO, CNTB_FECHA, CNTB_CONCEPTO, CNTB_REF, CNTB_TIPOREF, CNTB_IDREF, CNTB_PREFREF, CNTB_NUMREF, CNTB_PROCESADO)
        VALUES (:IDC, :TIPOCOMP, :PREFCONT, :NUM, :FECHA, :CONC, '', 85, :IDDOC, :PREF, :NUM, 'N');
    NROI = 0;
    ERROR = 0;

    SELECT FPRM_CTASEGURO, FPRM_CTACONTA FROM forma_pago_remesa WHERE FPRM_COD = :FORMA INTO :ctasegxc, :ctapagarf;
    EXECUTE PROCEDURE LEE_CONFIGURACION('CONTABILIDAD', 'GENERAL', 'NIT COMPAÑIA') RETURNING_VALUES (:nitasoc);
    if (VALOR <> 0) then
      BEGIN
      /* SI ES DE CONTADO */
      if (FORMA = 'C') then
        BEGIN
        /* LA CAJA */
        if (CAJA = 'C') then
            SELECT FIRST 1 CAJA_CUENTA FROM CAJAS c, carga_remesa R WHERE r.cgrm_fpago = 'C' AND R.cgrm_caja = C.caja_id INTO :ctacaja;
        CUENTA = NULL;
        SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
            WHERE CUEN_COD = :ctacaja INTO :CUENTA, :TIPOCUEN;
        if (CUENTA IS NULL) then
            begin
            EXECUTE PROCEDURE ERRORINT(85, :IDDOC, :ctacaja, 2);
            CUENTA = ctacaja;
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            EXECUTE PROCEDURE ERRORINT(85, :IDDOC, :CUENTA, 3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'C') then
            BEGIN
            EXECUTE PROCEDURE ERRORINT(85, :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, :NROI, :CUENTA, :CONC, '', :valor, 0, 0, 0, :nitasoc, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            END
        END
      if (FORMA = 'R') then
        BEGIN
        /* LA CARTERA */
        if (CARTERA = 'T') then
            SELECT TERC_CTACLIENTE FROM TERCEROS WHERE TERC_NIT = :nitcli INTO :ctacartera;

        CUENTA = NULL;
        SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
            WHERE CUEN_COD = :ctacartera INTO :CUENTA, :TIPOCUEN;
        if (CUENTA IS NULL) then
            begin
            EXECUTE PROCEDURE ERRORINT(89, :IDDOC, :ctacartera, 2);
            CUENTA = ctacartera;
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            EXECUTE PROCEDURE ERRORINT(89, :IDDOC, :CUENTA, 3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'C') then
            BEGIN
            EXECUTE PROCEDURE ERRORINT(89, :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, :NROI, :CUENTA, :CONC, '', :valor-:seguro, 0, 0, 0, :nitcli, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            END
        /* SEGURO X COBRAR */
        if (SEGURO <> 0) then
            BEGIN
            CUENTA = NULL;
            SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :ctasegxc INTO :CUENTA, :TIPOCUEN;
            if (CUENTA IS NULL) then
                begin
                EXECUTE PROCEDURE ERRORINT(85, :IDDOC, :ctasegxc, 2);
                CUENTA = ctasegxc;
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'I') then
                BEGIN
                EXECUTE PROCEDURE ERRORINT(85, :IDDOC, :CUENTA, 3);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                EXECUTE PROCEDURE ERRORINT(85, :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, :NROI, :CUENTA, :CONC, '', :seguro, 0, 0, 0, :nitcli, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                END
            END
        END
      if (FORMA = 'E') then
        BEGIN
        CUENTA = NULL;
        SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
            WHERE CUEN_COD = :ctacontrae INTO :CUENTA, :TIPOCUEN;
        if (CUENTA IS NULL) then
            begin
            EXECUTE PROCEDURE ERRORINT(85, :IDDOC, :ctacontrae, 2);
            CUENTA = ctacontrae;
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            EXECUTE PROCEDURE ERRORINT(85, :IDDOC, :CUENTA, 3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'C') then
            BEGIN
            EXECUTE PROCEDURE ERRORINT(85, :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, :NROI, :CUENTA, :CONC, '', :valor-:seguro, 0, 0, 0, :nitasoc, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            END
        if (seguro <> 0) then
            BEGIN
            CUENTA = NULL;
            SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :ctasegxc INTO :CUENTA, :TIPOCUEN;
            if (CUENTA IS NULL) then
                begin
                EXECUTE PROCEDURE ERRORINT(85, :IDDOC, :ctasegxc, 2);
                CUENTA = ctasegxc;
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'I') then
                BEGIN
                EXECUTE PROCEDURE ERRORINT(85, :IDDOC, :CUENTA, 3);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                EXECUTE PROCEDURE ERRORINT(85, :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, :NROI, :CUENTA, :CONC, '', :seguro, 0, 0, 0, :nitasoc, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                END
            END /* SEGUROS */
        END
      END /* VALOR */

    /* INGRESO POR SEGUROS */
    if (seguro <> 0) then
        BEGIN
        CUENTA = NULL;
        SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
            WHERE CUEN_COD = :ctaseguro INTO :CUENTA, :TIPOCUEN;
        if (CUENTA IS NULL) then
            begin
            EXECUTE PROCEDURE ERRORINT(85, :IDDOC, :ctaseguro, 2);
            CUENTA = ctaseguro;
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            EXECUTE PROCEDURE ERRORINT(85, :IDDOC, :CUENTA, 3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'C') then
            BEGIN
            EXECUTE PROCEDURE ERRORINT(85, :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, :NROI, :CUENTA, :CONC, '', 0, :seguro, 0, 0, :nitasoc, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            END
        END /* SEGUROS */

    /* la cuenta por pagar al transportador */
    if ((VALOR - seguro) <> 0) then
        BEGIN
        CUENTA = NULL;
        SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
            WHERE CUEN_COD = :ctapagarf INTO :CUENTA, :TIPOCUEN;
        if (CUENTA IS NULL) then
            begin
            EXECUTE PROCEDURE ERRORINT(85, :IDDOC, :ctapagarf, 2);
            CUENTA = ctapagarf;
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            EXECUTE PROCEDURE ERRORINT(85, :IDDOC, :CUENTA, 3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'C') then
            BEGIN
            EXECUTE PROCEDURE ERRORINT(85, :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, :NROI, :CUENTA, :CONC, '', 0, :valor-:seguro, 0, 0, :nitasoc, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            END
        END
    if (ERROR > 0) then
        VER = 'S';
    SUSPEND;
    END /* EXISTE */
ELSE
    BEGIN
    EXECUTE PROCEDURE ERRORINT(85, :IDDOC, :PREF, 1);
    ERROR = ERROR + 1;
    VER = 'S';
    SUSPEND;
    END
END^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER procedure CONTABIL_RETIRO (
    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 TIPOCOMP VARCHAR(3);
declare variable PREFCONT VARCHAR(4);
declare variable BASE CHAR(1);
declare variable CTABASE VARCHAR(20);
declare variable IVA CHAR(1);
declare variable CTAIVA VARCHAR(20);
declare variable GMF CHAR(1);
declare variable CTAGMF VARCHAR(20);
declare variable BANCO CHAR(1);
declare variable CTABANCO VARCHAR(20);
declare variable EXISTE CHAR(1);
declare variable CUENTA VARCHAR(20);
declare variable MONTO NUMERIC(18,2);
declare variable VRGMF NUMERIC(18,2);
declare variable VRIVA 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 NROI INTEGER;
declare variable SUMA NUMERIC(18,2);
declare variable BCTABANCO VARCHAR(20);
declare variable BCTAIVA VARCHAR(20);
declare variable BCTAGMF 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 ANULADO CHAR(1);
BEGIN
ERROR = 0;
/* BUSQUE LA INTERFACE */
EXISTE = 'N';
SELECT 'S', TICO_COD, PRCO_PRE, INBA_BANCO, INBA_IVA, INBA_GMF, INBA_BASE, INBA_CTABCO, INBA_CTAIVA, INBA_CTAGMF, INBA_CTABASE, INBA_CONFIRMAR
    FROM INTERFAZ_BANCOS
    WHERE INBA_ID = :IDINTER
    INTO :EXISTE, :TIPOCOMP, :PREFCONT, :BANCO, :IVA, :GMF, :BASE, :CTABANCO, CTAIVA, CTAGMF, CTABASE, :VER;
if (EXISTE = 'S') then
  BEGIN
  /* BORRE CUALQUEIR CONTABILIZACION PREVIA */
  DELETE FROM CONTABILIZACION WHERE CNTB_TIPOREF = 73 AND CNTB_IDREF = :IDDOC;
  /* TRAIGA EL ENCABEZADO  */
  SELECT PRBA_PREF, RETI_NUMERO, RETI_FECHA, RETI_CONCEPTO, RETI_MONTO, RETI_GMFMONTO, RETI_IVAMONTO, CUBA_CTACONTA, CUBA_CTAIVA, CUBA_CTAGMF, RETI_ANULADO, TERC_NIT
    FROM RETIROS R, CUENTAS_BANCO C
    WHERE RETI_ID = :IDDOC AND C.CUBA_COD = R.CUBA_COD
    INTO :PREF, :NUM, :FECAUX, :CONC, :MONTO, :VRGMF, :VRIVA, :BCTABANCO, :BCTAIVA, :BCTAGMF, :ANULADO, :NIT;
  if (ANULADO = 'N') then
    BEGIN
    NUMERO = PREF || NUM;
    SELECT PRBA_CENTRO, PRBA_PROY FROM PREFIJOS_BANCOS P, RETIROS R
        WHERE P.PRBA_PREF = R.PRBA_PREF AND P.CUBA_COD = R.CUBA_COD AND R.RETI_ID = :IDDOC AND P.TIDO_COD = 73
        INTO :CENTRO, :PROY;
    EXECUTE PROCEDURE FECHA_A_CONTA(:FECAUX) returning_values (:FECHA);
    /* REGISTRE EL ENCABEZADO CONTABLE */
    IDC = GEN_ID(ID_CONTABILIZA, 1);
    INSERT INTO CONTABILIZACION (CNTB_ID, CNTB_TIPOCOMP, CNTB_PREFCNT, CNTB_NUMERO, CNTB_FECHA, CNTB_CONCEPTO, CNTB_REF, CNTB_TIPOREF, CNTB_IDREF, CNTB_PREFREF, CNTB_NUMREF, CNTB_PROCESADO)
        VALUES (:IDC, :TIPOCOMP, :PREFCONT, :NUM, :FECHA, :CONC, '', 71, :IDDOC, :PREF, :NUM, 'N');
    NROI = 0;
    SUMA = 0;
    /* CUENTA BASE */
    if (BASE = 'K') then
        BEGIN
        CUENTA = NULL;
        SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
            WHERE CUEN_COD = :CTABASE INTO :CUENTA, :TIPOCUEN;
        if (CUENTA IS NULL) then
            begin
            EXECUTE PROCEDURE ERRORINT(73, :IDDOC, :CTABASE, 2);
            CUENTA = CTABASE;
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            EXECUTE PROCEDURE ERRORINT(73, :IDDOC, :CUENTA, 3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'C') then
            BEGIN
            EXECUTE PROCEDURE ERRORINT(73, :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, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            END
        END /* BASE = K */
    /* CUENTA GMF */
    if ((GMF = 'K') or (GMF = 'B'))then
        BEGIN
        if (GMF = 'B') then
            CTAGMF = BCTAGMF;
        CUENTA = NULL;
        SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS WHERE CUEN_COD = :CTAGMF
            INTO :CUENTA, :TIPOCUEN;
        if (CUENTA IS NULL) then
            begin
            EXECUTE PROCEDURE ERRORINT(73, :IDDOC, :CTAGMF, 2);
            CUENTA = CTAGMF;
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            EXECUTE PROCEDURE ERRORINT(73, :IDDOC, :CUENTA, 3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'C') then
            BEGIN
            EXECUTE PROCEDURE ERRORINT(73, :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, :NROI, :CUENTA, :CONC, '', :VRGMF, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            END
        END /* GMF */
    /* CUENTA IVA */
    if ((IVA = 'K') or (IVA = 'B'))then
        BEGIN
        if (IVA = 'B') then
            CTAIVA = BCTAIVA;
        CUENTA = NULL;
        SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS WHERE CUEN_COD = :CTAIVA
            INTO :CUENTA, :TIPOCUEN;
        if (CUENTA IS NULL) then
            begin
            EXECUTE PROCEDURE ERRORINT(73, :IDDOC, :CTAIVA, 2);
            CUENTA = CTAIVA;
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            EXECUTE PROCEDURE ERRORINT(73, :IDDOC, :CUENTA, 3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'C') then
            BEGIN
            EXECUTE PROCEDURE ERRORINT(73, :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, :NROI, :CUENTA, :CONC, '', :VRIVA, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            END
        END /* IVA */
    /* CUENTA BANCO */
    if ((BANCO = 'B') or (BANCO = 'K')) then
        BEGIN
        if (BANCO = 'B') then
            CTABANCO = BCTABANCO;
        SUMA = MONTO + VRGMF + VRIVA;
        if (SUMA <> 0) then
            BEGIN
            CUENTA = NULL;
            SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS WHERE CUEN_COD = :CTABANCO
                INTO :CUENTA, :TIPOCUEN;
            if (CUENTA IS NULL) then
                begin
                EXECUTE PROCEDURE ERRORINT(73, :IDDOC, :CTABANCO, 2);
                CUENTA = CTABANCO;
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'I') then
                BEGIN
                EXECUTE PROCEDURE ERRORINT(73, :IDDOC, :CUENTA, 3);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                EXECUTE PROCEDURE ERRORINT(73, :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, :NROI, :CUENTA, :CONC, '', 0, :SUMA, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                END
            END /* SUMA <> 0 */
        END /* BANCO K O B */
    /* recorra las cuentas adicionales */
    FOR SELECT INBC_CUENTA, INBC_BASE, INBC_PORC, INBC_VALOR, INBC_DB
        FROM INTERFAZ_BANCOS_CTAS
        WHERE INBA_ID = :IDINTER
        INTO :CUENTAADIC, :BASEADIC, :PORCADIC, :VALORADIC, :DBADIC
        DO
        BEGIN
        if (:BASEADIC = 'MONTO') then
            VALORADIC = MONTO;
        MONTO = VALORADIC * PORCADIC;
        
        /* TRAIGA LAS CARACTERISTICAS DE LA CUENTA */
        CUENTA = NULL;
        SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS WHERE CUEN_COD = :CUENTAADIC
            INTO :CUENTA, :TIPOCUEN;
        IF (CUENTA IS NULL) THEN
            begin
            EXECUTE PROCEDURE ERRORINT(73, :IDDOC, :CUENTAADIC, 2);
            CUENTA = CUENTAADIC;
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            EXECUTE PROCEDURE ERRORINT(73, :IDDOC, :CUENTA, 3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'C') then
            BEGIN
            EXECUTE PROCEDURE ERRORINT(73, :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, :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
    if (ERROR > 0) then
        VER = 'S';
    SUSPEND;
    END /* NO ANULADO */
  END /* EXISTE LA INTERFAZ */
ELSE
    BEGIN
    EXECUTE PROCEDURE ERRORINT(73, :IDDOC, :PREF, 1);
    ERROR = ERROR + 1;
    VER = 'S';
    SUSPEND;
    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 ^ ;

CREATE OR ALTER procedure CONTABIL_RUTERO (
    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 VENCE CHAR(8);
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 CARTERA CHAR(1);
declare variable CTACARTERA 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 SUMA NUMERIC(18,2);
declare variable TCTACLIEN VARCHAR(20);
declare variable TCTABASE VARCHAR(20);
declare variable ANULADO CHAR(1);
BEGIN
/* BUSQUE LA INTERFACE */
EXISTE = 'N';
SELECT 'S', TICO_COD, PRCO_PRE, INVE_VENTAS, INVE_CARTERA, INVE_CTAVENTAS, INVE_CTACARTERA, INVE_CONFIRMAR
    FROM INTERFAZ_VENTAS
    WHERE INVE_ID = :IDINTER
    INTO :EXISTE, :TIPOCOMP, :PREFCONT, :VENTAS, :CARTERA, :CTAVENTAS, :CTACARTERA, :VER;
if (EXISTE = 'S') then
  BEGIN
  /* BORRE CUALQUEIR CONTABILIZACION PREVIA */
  DELETE FROM CONTABILIZACION WHERE CNTB_TIPOREF = 37 AND CNTB_IDREF = :IDDOC;
  /* TRAIGA EL ENCABEZADO DEL RUTERO */
  SELECT PREF_PRE, RUTE_NUMERO, RUTE_FECHA, RUTE_ANULADO
        FROM rutero R
        WHERE RUTE_ID = :IDDOC
        INTO :PREF, :NUM, :FECAUX, :ANULADO;
  if (ANULADO = 'N') then
    BEGIN
    SELECT PREF_CENTRO, PREF_PROY FROM PREFIJOS P, rutero R
        WHERE P.PREF_PRE = R.PREF_PRE AND P.TIDO_COD = 37 AND RUTE_ID = :IDDOC INTO :CENTRO, :PROY;
    NUMERO = PREF || NUM;

    EXECUTE PROCEDURE FECHA_A_CONTA(:FECAUX) returning_values (:FECHA);
    EXECUTE PROCEDURE FECHA_A_CONTA(:FECAUX) returning_values (:VENCE);
    /* REGISTRE EL ENCABEZADO CONTABLE */
    IDC = GEN_ID(ID_CONTABILIZA, 1);
    CONC = 'ENTREGA FACTURAS No. ' || :PREF || :NUM;
    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, '', 37, :IDDOC, :PREF, :NUM, 'N');
    NROI = 0;
    SUMA = 0;
    ERROR = 0;
    IF ((VENTAS = 'C') OR (VENTAS = 'K')) THEN
        BEGIN
        FOR SELECT RUTD_NIT, RUTD_PREF || RUTD_NUMERO, RUTD_VALOR, TERC_CTAVENTA, TERC_CTACLIENTE
            FROM RUTERO_DETALLE RD, TERCEROS T
            WHERE RD.rute_id = :iddoc AND RUTD_VALOR <> 0 AND RD.rutd_nit = T.terc_nit
            INTO :nit, :numero, :vrtotal, :tctabase, :tctaclien
            DO
            BEGIN
            IF (VENTAS = 'C') THEN
                ctaventas = TCTABASE;
            CUENTA = NULL;
            SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :ctaventas INTO :CUENTA, :TIPOCUEN;
            if (CUENTA IS NULL) then
                begin
                EXECUTE PROCEDURE ERRORINT(37, :IDDOC, :ctaventas, 2);
                CUENTA = ctaventas;
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'I') then
                BEGIN
                EXECUTE PROCEDURE ERRORINT(37, :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, '', :vrtotal, 0, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 37);
                NROI = NROI + 1;
                SUMA = SUMA + vrtotal;
                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);
                NROI = NROI + 1;
                SUMA = SUMA + vrtotal;
                END
            END /* MONTO <> 0 */
        END /* BASE CLIENTE O CONSTANTE */
    /* CIERRE EL COMPROBANTE CONTRA LA CUENTA DEL TERCERO O LA CONSTANTE */
    if ((cartera = 'C') or (cartera = 'K')) then
        BEGIN
        FOR SELECT RUTD_NIT, RUTD_PREF || RUTD_NUMERO, RUTD_VALOR, TERC_CTAVENTA, TERC_CTACLIENTE
            FROM RUTERO_DETALLE RD, TERCEROS T
            WHERE RD.rute_id = :iddoc AND RUTD_VALOR <> 0 AND RD.rutd_nit = T.terc_nit
            INTO :nit, :numero, :vrtotal, tctabase, tctaclien
            DO
            BEGIN
            if (cartera = 'C') then
                ctacartera = TCTACLIEN;
            CUENTA = NULL;
            SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :ctacartera INTO :CUENTA, :TIPOCUEN;
            IF (CUENTA IS NULL) then
                begin
                EXECUTE PROCEDURE ERRORINT(37, :IDDOC, :ctacartera, 2);
                CUENTA = ctacartera;
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'I') then
                BEGIN
                EXECUTE PROCEDURE ERRORINT(37, :IDDOC, :CUENTA, 3);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                END
            if (TIPOCUEN = 'C') then
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    VALUES (:IDC, :NROI, :CUENTA, :CONC, '', 0, :vrtotal, 0, 0, :NIT, :PROY, :CENTRO, :NUMERO, NULL, :VENCE, NULL, 0, 37);
            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, '', 0, :vrtotal, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            END
        END /* SUMA EN CARTERA */
    if (ERROR > 0) then
        VER = 'S';
    SUSPEND;
    END /* NO ANULADO */
  END /* EXISTE LA INTERFAZ */
ELSE
    BEGIN
    EXECUTE PROCEDURE ERRORINT(37, :IDDOC, :PREF, 1);
    ERROR = ERROR + 1;
    VER = 'S';
    SUSPEND;
    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;
        /* 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 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;
                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(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;
                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 CONTABIL_TRASCUENTA (
    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 CTADEST INTEGER;
declare variable TIPOCOMP VARCHAR(3);
declare variable PREFCONT VARCHAR(4);
declare variable BASE CHAR(1);
declare variable CTABASE VARCHAR(20);
declare variable IVA CHAR(1);
declare variable CTAIVA VARCHAR(20);
declare variable GMF CHAR(1);
declare variable CTAGMF VARCHAR(20);
declare variable BANCO CHAR(1);
declare variable CTABANCO VARCHAR(20);
declare variable EXISTE CHAR(1);
declare variable CUENTA VARCHAR(20);
declare variable MONTO NUMERIC(18,2);
declare variable VRGMF NUMERIC(18,2);
declare variable VRIVA NUMERIC(18,2);
declare variable VRNOTA 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 NROI INTEGER;
declare variable SUMA NUMERIC(18,2);
declare variable BCTABANCO VARCHAR(20);
declare variable BCTAIVA VARCHAR(20);
declare variable BCTAGMF 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 ANULADO CHAR(1);
BEGIN
/* BUSQUE LA INTERFACE */
EXISTE = 'N';
SELECT 'S', TICO_COD, PRCO_PRE, INBA_BANCO, INBA_IVA, INBA_GMF, INBA_BASE, INBA_CTABCO, INBA_CTAIVA, INBA_CTAGMF, INBA_CTABASE, INBA_CONFIRMAR
    FROM INTERFAZ_BANCOS
    WHERE INBA_ID = :IDINTER
    INTO :EXISTE, :TIPOCOMP, :PREFCONT, :BANCO, :IVA, :GMF, :BASE, :CTABANCO, CTAIVA, CTAGMF, CTABASE, :VER;
if (EXISTE = 'S') then
  BEGIN
  /* BORRE CUALQUEIR CONTABILIZACION PREVIA */
  DELETE FROM CONTABILIZACION WHERE CNTB_TIPOREF = 76 AND CNTB_IDREF = :IDDOC;
  /* TRAIGA EL ENCABEZADO  */
  SELECT PRBA_PREF, TRAS_NUMERO, TRAS_FECHA, TRAS_CONCEPTO, TRAS_CTADEST, TRAS_MONTO, TRAS_GMFMONTO, TRAS_IVAMONTO2, TRAS_NOTAMONTO, CUBA_CTACONTA, CUBA_CTAIVA, CUBA_CTAGMF, TRAS_ANULADO, BANC_NIT
        FROM TRASLADOS T, CUENTAS_BANCO C, BANCOS B
        WHERE TRAS_ID = :IDDOC AND C.CUBA_COD = T.CUBA_COD AND C.BANC_COD = B.BANC_COD
        INTO :PREF, :NUM, :FECAUX, :CONC, :CTADEST, :MONTO, :VRGMF, :VRIVA, :VRNOTA, :BCTABANCO, :BCTAIVA, :BCTAGMF, :ANULADO, :NIT;
  if (ANULADO = 'N') then
    BEGIN
    if (VRIVA IS NULL) then
        VRIVA = 0;
    if (VRGMF IS NULL) then
        VRGMF = 0;
    if (VRNOTA IS NULL) then
        VRNOTA = 0;
    SELECT PRBA_CENTRO, PRBA_PROY FROM PREFIJOS_BANCOS P, TRASLADOS T
        WHERE P.PRBA_PREF = T.PRBA_PREF AND P.CUBA_COD = T.CUBA_COD AND P.tido_cod = 76 AND T.TRAS_ID = :IDDOC
        INTO :CENTRO, :PROY;
    NUMERO = PREF || NUM;
    EXECUTE PROCEDURE FECHA_A_CONTA(:FECAUX) returning_values (:FECHA);
    /* REGISTRE EL ENCABEZADO CONTABLE */
    IDC = GEN_ID(ID_CONTABILIZA, 1);
    INSERT INTO CONTABILIZACION (CNTB_ID, CNTB_TIPOCOMP, CNTB_PREFCNT, CNTB_NUMERO, CNTB_FECHA, CNTB_CONCEPTO, CNTB_REF, CNTB_TIPOREF, CNTB_IDREF, CNTB_PREFREF, CNTB_NUMREF, CNTB_PROCESADO)
        VALUES (:IDC, :TIPOCOMP, :PREFCONT, :NUM, :FECHA, :CONC, '', 76, :IDDOC, :PREF, :NUM, 'N');
    NROI = 0;
    SUMA = 0;
    /* CUENTA BASE */
    if ((BASE = 'K') or (BASE = 'C')) then
        BEGIN
        if (BASE = 'C') then
            BEGIN
            SELECT CUBA_CTACONTA FROM CUENTAS_BANCO
                WHERE CUBA_COD = :CTADEST INTO :CTABASE;
            END
        CUENTA = NULL;
        SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
            WHERE CUEN_COD = :CTABASE INTO :CUENTA, :TIPOCUEN;
        if (CUENTA IS NULL) then
            begin
            EXECUTE PROCEDURE ERROR (76, :IDDOC, :CTABASE, 2);
            CUENTA = CTABASE;
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            EXECUTE PROCEDURE ERROR (76, :IDDOC, :CUENTA, 3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'C') then
            BEGIN
            EXECUTE PROCEDURE ERROR (76, :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, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            SUMA = MONTO;
            END
        END /* BASE = K */
    /* CUENTA GMF */
    if ((VRGMF <> 0) AND ((GMF = 'K') or (GMF = 'B'))) then
        BEGIN
        if (GMF = 'B') then
            CTAGMF = BCTAGMF;
        CUENTA = NULL;
        SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
            WHERE CUEN_COD = :CTAGMF INTO :CUENTA, :TIPOCUEN;
        if (CUENTA IS NULL) then
            begin
            EXECUTE PROCEDURE ERROR (76, :IDDOC, :CTAGMF, 2);
            CUENTA = CTAGMF;
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            EXECUTE PROCEDURE ERROR (76, :IDDOC, :CUENTA, 3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'C') then
            BEGIN
            EXECUTE PROCEDURE ERROR (76, :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, :NROI, :CUENTA, :CONC, '', :VRGMF, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            SUMA = SUMA + VRGMF;
            END
        END /* GMF */
    /* CUENTA IVA */
    if ((VRIVA <> 0) AND ((IVA = 'K') or (IVA = 'B'))) then
        BEGIN
        if (IVA = 'B') then
            CTAIVA = BCTAIVA;
        CUENTA = NULL;
        SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
            WHERE CUEN_COD = :CTAIVA INTO :CUENTA, :TIPOCUEN;
        if (CUENTA IS NULL) then
            begin
            EXECUTE PROCEDURE ERROR (76, :IDDOC, :CTAIVA, 2);
            CUENTA = CTAIVA;
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            EXECUTE PROCEDURE ERROR (76, :IDDOC, :CUENTA, 3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'C') then
            BEGIN
            EXECUTE PROCEDURE ERROR (76, :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, :NROI, :CUENTA, :CONC, '', :VRIVA, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            SUMA = SUMA + VRIVA;
            END
        END /* IVA */
    /* CUENTA BANCO */
    if ((BANCO = 'B') or (BANCO = 'K')) then
        BEGIN
        if (BANCO = 'B') then
            CTABANCO = BCTABANCO;
        if (SUMA <> 0) then
            BEGIN
            CUENTA = NULL;
            SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :CTABANCO INTO :CUENTA, :TIPOCUEN;
            if (CUENTA IS NULL) then
                begin
                EXECUTE PROCEDURE ERROR (76, :IDDOC, :CTABANCO, 2);
                CUENTA = CTABANCO;
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'I') then
                BEGIN
                EXECUTE PROCEDURE ERROR (76, :IDDOC, :CUENTA, 3);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                EXECUTE PROCEDURE ERROR (76, :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, :NROI, :CUENTA, :CONC, '', 0, :SUMA, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                END
            END /* SUMA <> 0 */
        END /* BANCO K O B */
    /* recorra las cuentas adicionales */
    FOR SELECT INBC_CUENTA, INBC_BASE, INBC_PORC, INBC_VALOR, INBC_DB
        FROM INTERFAZ_BANCOS_CTAS
        WHERE INBA_ID = :IDINTER
        INTO :CUENTAADIC, :BASEADIC, :PORCADIC, :VALORADIC, :DBADIC
        DO
        BEGIN
        if (:BASEADIC = 'MONTO') then
            VALORADIC = MONTO;
        MONTO = VALORADIC * PORCADIC;
        
        /* TRAIGA LAS CARACTERISTICAS DE LA CUENTA */
        CUENTA = NULL;
        SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
            WHERE CUEN_COD = :CUENTAADIC INTO :CUENTA, :TIPOCUEN;
        IF (CUENTA IS NULL) THEN
            begin
            EXECUTE PROCEDURE ERROR (76, :IDDOC, :CUENTAADIC, 2);
            CUENTA = CUENTAADIC;
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            EXECUTE PROCEDURE ERROR (76, :IDDOC, :CUENTA, 3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'C') then
            BEGIN
            EXECUTE PROCEDURE ERROR (76, :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, :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
    if (ERROR > 0) then
        VER = 'S';
    SUSPEND;
    END /* NO ANULADO */
  END /* EXISTE LA INTERFAZ */
ELSE
    BEGIN
    EXECUTE PROCEDURE ERROR (76, :IDDOC, :PREF, 1);
    ERROR = ERROR + 1;
    VER = 'S';
    SUSPEND;
    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 ^ ;

CREATE OR ALTER procedure CONTABIL_TRASLACAJA (
    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 VRTOTAL NUMERIC(18, 2);
declare variable TIPOCOMP VARCHAR(3);
declare variable PREFCONT VARCHAR(4);
declare variable BASE CHAR(1);
declare variable CTABASE VARCHAR(20);
declare variable 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 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 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 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 IDCAJA INTEGER;
declare variable IDDEST INTEGER;
declare variable ANULADO CHAR(1);
BEGIN
/* BUSQUE LA INTERFACE */
EXISTE = 'N';
SELECT 'S', TICO_COD, PRCO_PRE, INCJ_BASE, INCJ_DTOPP, INCJ_RTFTE, INCJ_RTIVA, INCJ_RTICA, INCJ_CAJA, INCJ_CTABASE, INCJ_CTADTO, INCJ_CTARTFTE, INCJ_CTARTIVA, INCJ_CTARTICA, INCJ_CTACAJA, INCJ_CONFIRMAR
    FROM INTERFAZ_CAJA
    WHERE INCJ_ID = :IDINTER
    INTO :EXISTE, :TIPOCOMP, :PREFCONT, :BASE, :DTO, :RTFTE, :RTIVA, :RTICA, :CAJA, :CTABASE, :CTADTO, :CTARTFTE, :CTARTIVA, :CTARTICA, :CTACAJA, :VER;
if (EXISTE = 'S') then
  BEGIN
  /* BORRE CUALQUEIR CONTABILIZACION PREVIA */
  DELETE FROM CONTABILIZACION WHERE CNTB_TIPOREF = 66 AND CNTB_IDREF = :IDDOC;
  execute procedure lee_configuracion ('CONTABILIDAD', 'GENERAL', 'NIT COMPAÑIA') returning_values (NIT);
  /* TRAIGA EL ENCABEZADO DEL TRASLADO */
  SELECT MAX(PREF_PRE), MAX(TRCJ_NUMERO), MAX(TRCJ_FECHA), MAX(TRCJ_CONC), SUM(TRCD_MONTO), MAX(CAJA_ID), MAX(TRCJ_DESTINO), max(trcj_anulado)
        FROM TRASLADOS_CAJA T, traslados_caja_det D
        WHERE T.TRCJ_ID = D.TRCJ_ID AND T.TRCJ_ID = :IDDOC
        INTO :PREF, :NUM, :FECAUX, :CONC, :VRTOTAL, :IDCAJA, :IDDEST, :ANULADO;
  if (ANULADO = 'N') then
    BEGIN
    SELECT PREF_CENTRO, PREF_PROY FROM PREFIJOS
        WHERE PREF_PRE = :PREF AND TIDO_COD = 66 INTO :CENTRO, :PROY;
    NUMERO = PREF || NUM;
    EXECUTE PROCEDURE FECHA_A_CONTA(:FECAUX) returning_values (:FECHA);

    /* REGISTRE EL ENCABEZADO CONTABLE */
    IDC = GEN_ID(ID_CONTABILIZA, 1);
    INSERT INTO CONTABILIZACION (CNTB_ID, CNTB_TIPOCOMP, CNTB_PREFCNT, CNTB_NUMERO, CNTB_FECHA, CNTB_CONCEPTO, CNTB_REF, CNTB_TIPOREF, CNTB_IDREF, CNTB_PREFREF, CNTB_NUMREF, CNTB_PROCESADO)
        VALUES (:IDC, :TIPOCOMP, :PREFCONT, :NUM, :FECHA, :CONC, '', 66, :IDDOC, :PREF, :NUM, 'N');

    NROI = 0;
    SUMA = 0;
    ERROR = 0;
    IF ((CAJA = 'K') or (CAJA = 'F') ) THEN
        BEGIN
        if (VRTOTAL <> 0) then
            BEGIN
            IF ((CAJA = 'F')) THEN
                BEGIN
                /* TRAIGA LA CUENTA DE LA CAJA DESTINO */
                SELECT CAJA_CUENTA FROM CAJAS WHERE CAJA_ID = :IDDEST INTO CTACAJA;
                END

            CUENTA = NULL;
            SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :CTACAJA INTO :CUENTA, :TIPOCUEN;
            if (CUENTA IS NULL) then
                begin
                EXECUTE PROCEDURE ERRORINT(66, :IDDOC, :CTACAJA, 2);
                CUENTA = CTACAJA;
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'I') then
                BEGIN
                EXECUTE PROCEDURE ERRORINT(66, :IDDOC, :CUENTA, 3);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                EXECUTE PROCEDURE ERRORINT(66, :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, :NROI, :CUENTA, :CONC, '', :VRTOTAL, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                SUMA = SUMA + VRTOTAL;
                END
            END /* VRTOTAL <> 0 */
        END /* CAJA CONSTANTE */
        
    /* CIERRE EL COMPROBANTE CONTRA LA CUENTA DE LA CAJA */
    if ((SUMA <> 0) and ((BASE = 'F') 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 = 'F') then
            SELECT CAJA_CUENTA FROM CAJAS WHERE CAJA_ID = :IDCAJA INTO CTABASE;

        CUENTA = NULL;
        SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
            WHERE CUEN_COD = :CTABASE INTO :CUENTA, :TIPOCUEN;
        IF (CUENTA IS NULL) then
            begin
            EXECUTE PROCEDURE ERRORINT(66, :IDDOC, :CTABASE, 2);
            CUENTA = CTABASE;
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            EXECUTE PROCEDURE ERRORINT(66, :IDDOC, :CUENTA, 3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'C') then
            BEGIN
            EXECUTE PROCEDURE ERRORINT(66, :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, :NROI, :CUENTA, :CONC, '', :DEBITO, :CREDITO, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
        NROI = NROI + 1;
        END /* SUMA EN CAJA */

    /* 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;
        MONTO = VALORADIC * PORCADIC;
        
        CUENTA = NULL;
        SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
            WHERE CUEN_COD = :CTADIC INTO :CUENTA, :TIPOCUEN;
        IF (CUENTA IS NULL) THEN
            begin
            EXECUTE PROCEDURE ERRORINT(66, :IDDOC, :CTADIC, 2);
            CUENTA = CTADIC;
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            EXECUTE PROCEDURE ERRORINT(66, :IDDOC, :CUENTA, 3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'C') then
            BEGIN
            EXECUTE PROCEDURE ERRORINT(66, :IDDOC, :CUENTA, 4);
            TIPOCUEN = 'N';
            ERROR = ERROR + 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 (ERROR > 0) then
        VER = 'S';
    SUSPEND;
    END /* NO ANULADO */
  END /* EXISTE LA INTERFAZ */
ELSE
    BEGIN
    EXECUTE PROCEDURE ERRORINT(66, :IDDOC, :PREF, 1);
    ERROR = ERROR + 1;
    VER = 'S';
    SUSPEND;
    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 ^ ;

CREATE OR ALTER procedure CONTABIL_TRASLAMERCANCIA (
    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 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 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, :PROYDES, :CENTRODES;
if (EXISTE = 'S') then
    BEGIN
    /* TRAIGA EL ENCABEZADO DE LA SALIDA */
    SELECT PREF_PRE, TRAN_NUMERO, TRAN_FECHA, TRAN_CONC, TERC_NIT, TRAN_IMPTOS, TRAN_ANULADO
        FROM TRASFERENCIAS
        WHERE TRAN_ID = :IDDOC
        INTO :PREFIJO, :NUMERO, :FECAUX, :CONCEPTO, :NIT, :IMPINC, :ANULADO;
    /* BORRE CUALQUEIR CONTABILIZACION PREVIA */
    DELETE FROM CONTABILIZACION WHERE CNTB_TIPOREF = 13 AND CNTB_IDREF = :IDDOC;

    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
        /* 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, '', 13, :IDDOC, :PREFIJO, :NUMERO, 'N');
        NUMITEMS = 0;
        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 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;
                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(13, :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 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(13, :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;
                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(13, :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(13, :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;
                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(13, :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 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(13, :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 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
                        WHERE CUEN_COD = :CTAIVA INTO :CUENTA, :TIPOCUEN;
                    if (CUENTA IS NULL) then
                        begin
                        EXECUTE PROCEDURE ERRORINT(13, :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 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(13, :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
                        WHERE CUEN_COD = :CTAIVA INTO :CUENTA, :TIPOCUEN;
                    if (CUENTA IS NULL) then
                        begin
                        EXECUTE PROCEDURE ERRORINT(13, :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(13, :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
                    WHERE CUEN_COD = :CTAIVA INTO :CUENTA, :TIPOCUEN;
                if (CUENTA IS NULL) then
                    begin
                    EXECUTE PROCEDURE ERRORINT(13, :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 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(13, :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 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
                        WHERE CUEN_COD = :CTACONSUMO INTO :CUENTA, :TIPOCUEN;
                    if (CUENTA IS NULL) then
                        begin
                        EXECUTE PROCEDURE ERRORINT(13, :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 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(13, :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
                    WHERE CUEN_COD = :CUENTA INTO :CUENTA, :TIPOCUEN;
                if (CUENTA IS NULL) then
                    begin
                    EXECUTE PROCEDURE ERRORINT(13, :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 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(13, :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
                    WHERE CUEN_COD = :CUENTAADIC INTO :CUENTA, :TIPOCUEN;
                if (CUENTA IS NULL) then
                    begin
                    EXECUTE PROCEDURE ERRORINT(13, :IDDOC, :CUENTAADIC, 2);
                    CUENTA = CUENTAADIC;
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    end
                if (TIPOCUEN = 'I') then
                    BEGIN
                    EXECUTE PROCEDURE ERRORINT(13, :IDDOC, :CUENTA, 3);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    EXECUTE PROCEDURE ERRORINT(13, :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
                    WHERE CUEN_COD = :CTACIERRE INTO :CUENTA, :TIPOCUEN;
                if (CUENTA IS NULL) then
                    begin
                    EXECUTE PROCEDURE ERRORINT(13, :IDDOC, :CTACIERRE, 2);
                    CUENTA = CTACIERRE;
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    end
                if (TIPOCUEN = 'I') then
                    BEGIN
                    EXECUTE PROCEDURE ERRORINT(13, :IDDOC, :CUENTA, 3);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    EXECUTE PROCEDURE ERRORINT(13, :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(13, :IDDOC, :PREFIJO, 1);
    ERROR = ERROR + 1;
    VER = 'S';
    SUSPEND;
    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 ^ ;

CREATE OR ALTER procedure CUENTA_INTERFAZ (
    TIPO integer,
    ID integer,
    CUENTA varchar(20),
    INV char(1))
returns (
    CTAOK varchar(20),
    TIPOCUEN char(1),
    ERROR integer)
AS
begin
ERROR = 0;
CTAOK = NULL;
SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
    WHERE CUEN_COD = :CUENTA INTO :CTAOK, :TIPOCUEN;
if (CTAOK IS NULL) then
    begin
    EXECUTE PROCEDURE ERRORINT(:TIPO, :ID, :CUENTA, 2);
    CTAOK = CUENTA;
    TIPOCUEN = 'N';
    ERROR = 1;
    end
if ((INV <> 'S') and (TIPOCUEN = 'I')) then
    begin
    EXECUTE PROCEDURE ERRORINT(:TIPO, :ID, :CUENTA, 3);
    TIPOCUEN = 'N';
    ERROR = 1;
    end
suspend;
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_CTAIVAV), 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_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(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_DEVOLCOMP(
    IDDOC INTEGER,
    IDINTER INTEGER)
RETURNS (
    ERROR INTEGER,
    VER CHAR(1),
    IDC INTEGER)
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 TIPOCOMP VARCHAR(3);
declare variable PREFCONT VARCHAR(4);
declare variable INVEN CHAR(1);
declare variable CTAINVEN VARCHAR(20);
declare variable IVA CHAR(1);
declare variable CTAIVA VARCHAR(20);
declare variable CONSUMO CHAR(1);
declare variable CTACONSUMO VARCHAR(20);
declare variable CXP CHAR(1);
declare variable CTACXP VARCHAR(20);
declare variable RTFTE CHAR(1);
declare variable CTARTFTE VARCHAR(20);
declare variable RTIVA CHAR(1);
declare variable CTARTIVA VARCHAR(20);
declare variable RTICA CHAR(1);
declare variable CTARTICA VARCHAR(20);
declare variable 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', TICO_COD, PRCO_PRE, INCO_INVEN, INCO_IVA, INCO_CONSUMO, INCO_CXP, INCO_RTFTE, INCO_RTIVA, INCO_RTICA, INCO_RTCREE,
    INCO_CTAINVEN, INCO_CTAIVA, INCO_CTACONSUMO, INCO_CTADTO, INCO_CTAADIC, INCO_CTAEXTRA, INCO_CTACXP, INCO_CTARTFTE,
    INCO_CTARTIVA, INCO_CTARTICA, INCO_CTARTCREE, INCO_CONFIRMAR, INCO_CENTRO
    FROM INTERFAZ_COMPRAS
    WHERE INCO_ID = :IDINTER
    INTO :EXISTE, :TIPOCOMP, :PREFCONT, :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
    /* BORRE CUALQUEIR CONTABILIZACION PREVIA */
    DELETE FROM CONTABILIZACION WHERE CNTB_TIPOREF = 24 AND CNTB_IDREF = :IDDOC;
   /* TRAIGA EL ENCABEZADO DE LA DEVOLUCION */
   SELECT PREF_PRE, DVCO_NUMERO, DVCO_FECHA, D.TERC_NIT, DVCO_FACTURA, DVCO_IMPTOS, DVCO_DTOMONTO, DVCO_ADICIONAL, DVCO_IVAMONTO,
        DVCO_EXTRA, DVCO_TOTAL, DVCO_RTFTEPORC, DVCO_RTFTEMONTO, DVCO_RTIVAPORC, DVCO_RTIVAMONTO, DVCO_RTICAPORC, DVCO_RTICAMONTO,
        DVCO_RTCREE, DVCO_RTCREEM, PROV_CTARTFTE, PROV_CTARTIVA, PROV_CTARTICA, PROV_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;
    /* CONVIERTA LA FECHA A CADENA */
    EXECUTE PROCEDURE FECHA_A_CONTA(:FECAUX) returning_values (:FECHA);
    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;

    /* REGISTRE EL ENCABEZADO CONTABLE */
    CONCEPTO = 'DEVOLUCION COMPRA No. ' || NUMERO || ' EN FACTURA ' || NUMFAC;
    IDC = GEN_ID(ID_CONTABILIZA, 1);
    INSERT INTO CONTABILIZACION (CNTB_ID, CNTB_TIPOCOMP, CNTB_PREFCNT, CNTB_NUMERO, CNTB_FECHA, CNTB_CONCEPTO, CNTB_REF, CNTB_TIPOREF, CNTB_IDREF, CNTB_PREFREF, CNTB_NUMREF, CNTB_PROCESADO)
        VALUES (:IDC, :TIPOCOMP, :PREFCONT, :NUM, :FECHA, :CONCEPTO, '', 24, :IDDOC, :PREFIJO, :NUM, 'N');

    NUMITEMS = 0;
    SUMA = 0;
    ERROR = 0;
    /* CUENTAS DE INVENTARIO */
    if (INVEN = 'A') then
        BEGIN
        /* SUME LAS BASES DE LOS ARTICULOS DEL DOCUMENTO */
        FOR SELECT MAX(COAR_CTACOMP), SUM(cast(DVCD_CANT as double precision) * (DVCD_PRUNIT-DVCD_DTOMONTO)), SUM(DVCD_IVAMONTO), SUM(DVCD_CONSUMO)
            FROM ARTICULO A, CONTABIL_ARTICULO C, DEVOLUCIONES_COMPRAS_DET F
            WHERE F.DVCO_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD
            GROUP BY COAR_CTAINV
            INTO :CTAINVEN, :MONTO, :IMPTOS, :VALORADIC
            DO
            BEGIN
            if (IMPINC = 'S') then
                BEGIN
                MONTO = MONTO - IMPTOS;
                if (FOMENTO <> 'SI') then
                    MONTO = MONTO - VALORADIC;
                END
            /* TRAIGA LAS CARACTERISTICAS DE LA CUENTA */
            EXECUTE PROCEDURE CUENTA_INTERFAZ(24, :IDDOC, :CTAINVEN, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            /* DEPENDE DEL TIPO DE CUENTA */
            if ((TIPOCUEN = 'I') 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 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(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_CTAIVAC), SUM(DVCD_IVAMONTO), SUM(cast(DVCD_CANT as double precision) * (DVCD_PRUNIT-DVCD_DTOMONTO)), SUM(DVCD_CONSUMO)
            FROM ARTICULO A, CONTABIL_ARTICULO C, DEVOLUCIONES_COMPRAS_DET F
            WHERE F.DVCO_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND DVCD_IVAMONTO <> 0
            GROUP BY COAR_CTAIVAC
            INTO :CTAIVA, :IMPTOS, :MONTO, :VALORADIC
        DO
          if (IMPTOS <> 0) then
            BEGIN
            IMPTOS = CAST(IMPTOS AS DOUBLE PRECISION) * VRSUBT / MERCANCIA;
            if (IMPINC = 'S') then
                BEGIN
                MONTO = MONTO - IMPTOS;
                if (FOMENTO <> 'SI') then
                    MONTO = MONTO - VALORADIC;
                END

            /* TRAIGA LAS CARCATERISTICAS DE LA CUENTA */
            EXECUTE PROCEDURE CUENTA_INTERFAZ(24, :IDDOC, :CTAIVA, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            /* DEPENDE DEL TIPO DE CUENTA */
            if (TIPOCUEN = 'I') then
                BEGIN
                /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                FOR SELECT F.ARTI_COD, DVCD_IVAMONTO, (cast(DVCD_CANT as double precision) * (DVCD_PRUNIT-DVCD_DTOMONTO)), TAIV_PORC, DVCD_CONSUMO
                    FROM ARTICULO A, CONTABIL_ARTICULO C, DEVOLUCIONES_COMPRAS_DET F, TARIFA_IVA T
                    WHERE F.DVCO_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND COAR_CTAIVAV = :CUENTA AND A.TAIV_COD = T.TAIV_COD
                    INTO :ARTICULO, :IMPTOS, :MONTO, :PORCIVA, :VALORADIC
                DO
                    BEGIN
                    if (IMPINC = 'S') then
                        BEGIN
                        MONTO = MONTO - IMPTOS;
                        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(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 C, DEVOLUCIONES_COMPRAS_DET F
            WHERE F.DVCO_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD
            GROUP BY COAR_CTACONS
            INTO :CTACONSUMO, :IMPTOS
        DO
            BEGIN
            if (IMPTOS <> 0) then
                BEGIN
                /* TRAIGA LAS CARACTERISTICAS DE LA CUENTA */
                EXECUTE PROCEDURE CUENTA_INTERFAZ(24, :IDDOC, :CTACONSUMO, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                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(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(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(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(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(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 C, DEVOLUCIONES_COMPRAS_DET F
            WHERE F.dvco_id = :IDDOC AND F.ARTI_COD = C.ARTI_COD
            GROUP BY COAR_CTARTFTE
            INTO :CTARTFTE, :PRTFTE, :baseadic, :MONTO, :VRRTFTE
            DO
            BEGIN
            MONTO = MONTO * FACTOR;
            if (MONTO >= BASEADIC) then
                BEGIN
                VRRTFTE = VRRTFTE * FACTOR / 100;
                execute procedure redondee(VRRTFTE, DIG) returning_values (VRRTFTE);
                execute procedure redondee(MONTO, DIG) returning_values (MONTO);
                if (VRRTFTE <> 0) then
                    BEGIN
                    /* TRAIGA LAS CARACTERISTICAS DE LA CUENTA */
                    EXECUTE PROCEDURE CUENTA_INTERFAZ(24, :IDDOC, :CTARTFTE, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
                    if (ERRORC <> 0) then
                        ERROR = ERROR + 1;
                    if (TIPOCUEN = 'C') then
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_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(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(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(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(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(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 ^ ;

ALTER PROCEDURE CONTABIL_FACTCOMP(
    IDDOC INTEGER,
    IDINTER INTEGER)
RETURNS (
    ERROR INTEGER,
    VER CHAR(1),
    IDC INTEGER)
AS
DECLARE VARIABLE PREFIJO VARCHAR(4);
DECLARE VARIABLE NUM VARCHAR(8);
DECLARE VARIABLE NUMERO VARCHAR(10);
DECLARE VARIABLE FECAUX DATE;
DECLARE VARIABLE FECHA CHAR(8);
DECLARE VARIABLE CONCEPTO CHAR(60);
DECLARE VARIABLE VENCEAUX DATE;
DECLARE VARIABLE VENCE CHAR(8);
DECLARE VARIABLE VRDTO NUMERIC(18,2);
DECLARE VARIABLE VRADIC NUMERIC(18,2);
DECLARE VARIABLE VRSUBT NUMERIC(18,2);
DECLARE VARIABLE VRIVA NUMERIC(18,2);
DECLARE VARIABLE PRTFTE NUMERIC(9,2);
DECLARE VARIABLE VRRTFTE NUMERIC(18,2);
DECLARE VARIABLE VRRTIVA NUMERIC(18,2);
DECLARE VARIABLE PRTICA NUMERIC(9,2);
DECLARE VARIABLE VRRTICA NUMERIC(18,2);
DECLARE VARIABLE 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 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', TICO_COD, PRCO_PRE, INCO_INVEN, INCO_IVA, INCO_CONSUMO, INCO_CXP, INCO_RTFTE, INCO_RTIVA, INCO_RTICA, INCO_RTCREE,
    INCO_CTAINVEN, INCO_CTAIVA, INCO_CTACONSUMO, INCO_CTADTO, INCO_CTAADIC, INCO_CTAEXTRA, INCO_CTACXP, INCO_CTARTFTE, INCO_CTARTIVA,
    INCO_CTARTICA, INCO_CTARTCREE, INCO_CONFIRMAR, INCO_CENTRO
    FROM INTERFAZ_COMPRAS WHERE INCO_ID = :IDINTER
    INTO :EXISTE, :TIPOCOMP, :PREFCONT, :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
    /* BORRE CONTABILIZACION PREVIA */
    DELETE FROM CONTABILIZACION WHERE CNTB_TIPOREF = 21 AND CNTB_IDREF = :IDDOC;
    /* ENCABEZADO DE LA FACTURA */
    SELECT PREF_PRE, FACO_NUMERO, FACO_FECHA, F.TERC_NIT, FACO_IMPTOS, FACO_VENCE, FACO_DTOMONTO, FACO_ADICIONAL, FACO_IVAMONTO,
        FACO_EXTRA, FACO_TOTAL, FACO_RTFTEPORC, FACO_RTFTEMONTO, FACO_RTIVAPOR, FACO_RTIVAMONTO, FACO_RTICAPOR, FACO_RTICAMONTO,
        FACO_RTCREE, FACO_RTCREEM, TERC_NOM, PROV_CTARTFTE, PROV_CTARTIVA, PROV_CTARTICA, PROV_CTARTCREE, PROV_CTAPAGAR, FACO_NUMPROV,
        FACO_ANULADO, 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, :FECAUX, :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(:FECAUX) returning_values (:FECHA);
        EXECUTE PROCEDURE FECHA_A_CONTA(:VENCEAUX) returning_values (:VENCE);
        if (NUMPROV IS NULL) then
            NUMPROV = NUMERO;
        CONCEPTO = 'FC No.' || NUMERO || '-' || SUBSTR(NOMBRE,1,26) || '-NPROV.' || NUMPROV;
        IDC = GEN_ID(ID_CONTABILIZA, 1);
        INSERT INTO CONTABILIZACION (CNTB_ID, CNTB_TIPOCOMP, CNTB_PREFCNT, CNTB_NUMERO, CNTB_FECHA, CNTB_CONCEPTO, CNTB_REF, CNTB_TIPOREF, CNTB_IDREF, CNTB_PREFREF, CNTB_NUMREF, CNTB_PROCESADO)
            VALUES (:IDC, :TIPOCOMP, :PREFCONT, :NUM, :FECHA, :CONCEPTO, '', 21, :IDDOC, :PREFIJO, :NUM, 'N');
        NUMITEMS = 0;
        SUMA = 0;
        NETO = 0;
        ERROR = 0;
        EXECUTE PROCEDURE LEE_CONFIGURACION('COMPRAS', 'FACTURAS', '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 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(21, :IDDOC, :CTAINVEN, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 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 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(21, :IDDOC, :CTAINVEN, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                  if (ERRORC <> 0) then
                    ERROR = ERROR + 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 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(21, :IDDOC, :CTAIVA, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (TIPOCUEN = 'I') then
                    BEGIN
                    FOR SELECT F.ARTI_COD, FCDE_IVAMONTO, (FCDE_CANT * (FCDE_PRUNIT-FCDE_DTOMONTO)), TAIV_PORC, FCDE_CONSUMO
                        FROM ARTICULO A, CONTABIL_ARTICULO C, FACTURAS_COMPRAS_DETALLE F, TARIFA_IVA T WHERE F.FACO_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND COAR_CTAIVAV = :CUENTA AND A.TAIV_COD = T.TAIV_COD
                        INTO :ARTICULO, :IMPTOS, :MONTO, :PORCIVA, :VALORADIC
                    DO
                        BEGIN
                        if (MERCANCIA <> 0) then
                            IMPTOS = CAST(IMPTOS AS DOUBLE PRECISION) * VRSUBT / MERCANCIA;
                        else
                            IMPTOS = 0;
                        if (IMPINC = 'S') then
                            BEGIN
                            MONTO = MONTO - IMPTOS;
                            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(21, :IDDOC, :CTAIVA, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (TIPOCUEN = 'I') then
                    BEGIN
                    FOR SELECT F.ARTI_COD, (FCDE_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 C, FACTURAS_COMPRAS_DETALLE F
                WHERE F.FACO_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD GROUP BY COAR_CTACONS INTO :CTACONSUMO, :IMPTOS
            DO
              if (IMPTOS <> 0) then
                BEGIN
                execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
                EXECUTE PROCEDURE CUENTA_INTERFAZ(21, :IDDOC, :CTACONSUMO, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (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(21, :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, '', :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(21, :IDDOC, :CTADTO, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_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(21, :IDDOC, :CTAADIC, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_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(21, :IDDOC, :CTAEXTRA, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'C') then
                BEGIN
                if (vrextra > 0) then
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_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(21, :IDDOC, :CTARTFTE, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_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 C, FACTURAS_COMPRAS_DETALLE F
            WHERE F.faco_id = :IDDOC AND F.ARTI_COD = C.ARTI_COD
            GROUP BY COAR_CTARTFTE
            INTO :CTARTFTE, :PRTFTE, :baseadic,  :MONTO, :VRRTFTE
            DO
            BEGIN
            MONTO = MONTO * FACTOR * -1;
            if (ABS(MONTO) >= :baseadic) then
                BEGIN
                VRRTFTE = VRRTFTE * FACTOR / 100;
                execute procedure redondee(VRRTFTE, DIG) returning_values (VRRTFTE);
                execute procedure redondee(MONTO, DIG) returning_values (MONTO);
                if (VRRTFTE <> 0) then
                    BEGIN
                    EXECUTE PROCEDURE CUENTA_INTERFAZ(21, :IDDOC, :CTARTFTE, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
                    if (ERRORC <> 0) then
                        ERROR = ERROR + 1;
                    if (TIPOCUEN = 'C') then
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_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(21, :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, '', 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(21, :IDDOC, :CTARTICA, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_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(21, :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, '', 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(21, :IDDOC, :CTACXP, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'C') then
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_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(21, :IDDOC, :CUENTAADIC, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (TIPOCUEN = 'C') then
                    BEGIN
                    if (DBADIC = 'S') then
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_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(21, :IDDOC, :CTAADIC, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (TIPOCUEN = 'C') then
                    BEGIN
                    if (NETO < 0) then
                        BEGIN
                        NETO = NETO * -1;
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_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 (ERROR > 0) then
        VER = 'S';
    SUSPEND;
    END
ELSE
    BEGIN
    EXECUTE PROCEDURE ERRORINT(21, :IDDOC, :PREFIJO, 1);
    ERROR = ERROR + 1;
    VER = 'S';
    SUSPEND;
    END
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE CONTABIL_FACTCOMP_IVA(
    IDDOC INTEGER,
    IDINTER INTEGER)
RETURNS (
    ERROR INTEGER,
    VER CHAR(1),
    IDC INTEGER)
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 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 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 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 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;
BEGIN
  /* INTERFACE */
  EXISTE = 'N';
  SELECT 'S', TICO_COD, PRCO_PRE, INCO_INVEN, INCO_IVA, INCO_CONSUMO, INCO_CXP, INCO_RTFTE, INCO_RTIVA, INCO_RTICA, INCO_CTAINVEN, INCO_CTAIVA, INCO_CTACONSUMO, INCO_CTADTO, INCO_CTAADIC, INCO_CTAEXTRA, INCO_CTACXP, INCO_CTARTFTE, INCO_CTARTIVA, INCO_CTARTICA, INCO_CONFIRMAR, INCO_CENTRO
    FROM INTERFAZ_COMPRAS WHERE INCO_ID = :IDINTER INTO :EXISTE, :TIPOCOMP, :PREFCONT, :INVEN, :IVA, :CONSUMO, :CXP, :RTFTE, :RTIVA, :RTICA, :CTAINVEN, :CTAIVA, :CTACONSUMO, :CTADTO, :CTAADIC, :CTAEXTRA, :CTACXP, :CTARTFTE, :CTARTIVA, :CTARTICA, :VER, :CENT;
  if (EXISTE = 'S') then
    BEGIN
    /* BORRE CONTABILIZACION PREVIA */
    DELETE FROM CONTABILIZACION WHERE CNTB_TIPOREF = 21 AND CNTB_IDREF = :IDDOC;
    /* ENCABEZADO DE LA FACTURA */
    SELECT PREF_PRE, FACO_NUMERO, FACO_FECHA, F.TERC_NIT, FACO_IMPTOS, FACO_VENCE, FACO_DTOMONTO, FACO_ADICIONAL, FACO_IVAMONTO, FACO_EXTRA, FACO_TOTAL, FACO_RTFTEPORC, FACO_RTFTEMONTO, FACO_RTIVAPOR, FACO_RTIVAMONTO, FACO_RTICAPOR, FACO_RTICAMONTO, TERC_NOM, PROV_CTARTFTE, PROV_CTARTIVA, PROV_CTARTICA, PROV_CTAPAGAR, FACO_NUMPROV, FACO_ANULADO
        FROM FACTURAS_COMPRA F, TERCEROS T, PROVEEDORES P WHERE FACO_ID = :IDDOC AND F.TERC_NIT = T.TERC_NIT AND T.TERC_NIT = P.TERC_NIT
        INTO :PREFIJO, :NUM, :FECAUX, :NIT, :IMPINC, :VENCEAUX, :VRDTO, :VRADIC, :VRIVA, :VREXTRA, :VRTOTAL, :PRTFTE, :VRRTFTE, :PORC, :VRRTIVA, :PRTICA, :VRRTICA, :NOMBRE, TCTARTFTE, TCTARTIVA, TCTARTICA, TCTAPROV, :NUMPROV, :ANULADO;
    /* 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(:FECAUX) returning_values (:FECHA);
        EXECUTE PROCEDURE FECHA_A_CONTA(:VENCEAUX) returning_values (:VENCE);
        if (NUMPROV IS NULL) then
            NUMPROV = NUMERO;
        CONCEPTO = 'FC No.' || NUMERO || '-' || SUBSTR(NOMBRE,1,26) || '-NPROV.' || NUMPROV;
        IDC = GEN_ID(ID_CONTABILIZA, 1);
        INSERT INTO CONTABILIZACION (CNTB_ID, CNTB_TIPOCOMP, CNTB_PREFCNT, CNTB_NUMERO, CNTB_FECHA, CNTB_CONCEPTO, CNTB_REF, CNTB_TIPOREF, CNTB_IDREF, CNTB_PREFREF, CNTB_NUMREF, CNTB_PROCESADO)
            VALUES (:IDC, :TIPOCOMP, :PREFCONT, :NUM, :FECHA, :CONCEPTO, '', 21, :IDDOC, :PREFIJO, :NUM, 'N');
        NUMITEMS = 0;
        SUMA = 0;
        NETO = 0;
        ERROR = 0;
        EXECUTE PROCEDURE LEE_CONFIGURACION('COMPRAS', 'FACTURAS', '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 = 'GENERAL' AND CONF_PROPIEDAD = 'REDONDEO AL MULTIPLO DE DIEZ EN TOTALES' INTO :DIG;
        if (INVEN = 'A') then
            BEGIN
            FOR SELECT MAX(TAIV_CTACOMP), SUM(CAST(FCDE_CANT AS DOUBLE PRECISION) * (FCDE_PRUNIT-FCDE_DTOMONTO)), SUM(FCDE_IVAMONTO), SUM(FCDE_CONSUMO), MAX(F.BODE_COD)
                FROM TARIFA_IVA T, FACTURAS_COMPRAS_DETALLE F WHERE F.FACO_ID = :IDDOC AND F.fcde_ivaporc = T.taiv_porc
                GROUP BY TAIV_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(21, :IDDOC, :CTAINVEN, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (TIPOCUEN = 'I') then
                    BEGIN
                    FOR SELECT F.ARTI_COD, (FCDE_CANT * (FCDE_PRUNIT-FCDE_DTOMONTO)), FCDE_IVAMONTO, FCDE_CONSUMO
                        FROM ARTICULO A, CONTABIL_ARTICULO C, FACTURAS_COMPRAS_DETALLE F WHERE F.FACO_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND COAR_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
                        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(21, :IDDOC, :CTAINVEN, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                  if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                  if (TIPOCUEN = 'I') 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') then
            BEGIN
            FOR SELECT MAX(TAIV_CTAIVACMP), SUM(FCDE_IVAMONTO), SUM(CAST(FCDE_CANT AS DOUBLE PRECISION) * (FCDE_PRUNIT-FCDE_DTOMONTO)), SUM(FCDE_CONSUMO)
                FROM TARIFA_IVA T, FACTURAS_COMPRAS_DETALLE F
                WHERE F.FACO_ID = :IDDOC AND F.fcde_ivaporc = T.taiv_porc AND FCDE_IVAMONTO <> 0
                GROUP BY TAIV_CTAIVACMP
                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
                MONTO = CAST(MONTO AS DOUBLE PRECISION) * VRSUBT / MERCANCIA;
                execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
                execute procedure redondee(MONTO, DIG) returning_values (MONTO);
                EXECUTE PROCEDURE CUENTA_INTERFAZ(21, :IDDOC, :CTAIVA, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (TIPOCUEN = 'I') then
                    BEGIN
                    FOR SELECT F.ARTI_COD, FCDE_IVAMONTO, (FCDE_CANT * (FCDE_PRUNIT-FCDE_DTOMONTO)), TAIV_PORC, FCDE_CONSUMO
                        FROM ARTICULO A, CONTABIL_ARTICULO C, FACTURAS_COMPRAS_DETALLE F, TARIFA_IVA T WHERE F.FACO_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND COAR_CTAIVAV = :CUENTA AND A.TAIV_COD = T.TAIV_COD
                        INTO :ARTICULO, :IMPTOS, :MONTO, :PORCIVA, :VALORADIC
                    DO
                        BEGIN
                        IMPTOS = CAST(IMPTOS AS DOUBLE PRECISION) * VRSUBT / MERCANCIA;
                        if (IMPINC = 'S') then
                            BEGIN
                            MONTO = MONTO - IMPTOS;
                            if (FOMENTO <> 'SI' ) then
                                MONTO = MONTO - VALORADIC;
                            END
                        MONTO = CAST(MONTO AS DOUBLE PRECISION) * VRSUBT / MERCANCIA;
                        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') 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
                IMPTOS = CAST(IMPTOS AS DOUBLE PRECISION) * VRSUBT / MERCANCIA;
                if (IMPINC = 'S') then
                    BEGIN
                    MONTO = MONTO - IMPTOS;
                    if (FOMENTO <> 'SI' ) then
                        MONTO = MONTO - VALORADIC;
                    END
                MONTO = CAST(MONTO AS DOUBLE PRECISION) * VRSUBT / MERCANCIA;
                execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
                execute procedure redondee(MONTO, DIG) returning_values (MONTO);
                EXECUTE PROCEDURE CUENTA_INTERFAZ(21, :IDDOC, :CTAIVA, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (TIPOCUEN = 'I') then
                    BEGIN
                    FOR SELECT F.ARTI_COD, (FCDE_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
                        IMPTOS = CAST(IMPTOS AS DOUBLE PRECISION) * VRSUBT / MERCANCIA;
                        if (IMPINC = 'S') then
                            BEGIN
                            MONTO = MONTO - IMPTOS;
                            if (FOMENTO <> 'SI' ) then
                                MONTO = MONTO - VALORADIC;
                            END
                        MONTO = CAST(MONTO AS DOUBLE PRECISION) * VRSUBT / MERCANCIA;
                        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 C, FACTURAS_COMPRAS_DETALLE F
                WHERE F.FACO_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD GROUP BY COAR_CTACONS INTO :CTACONSUMO, :IMPTOS
            DO
              if (IMPTOS <> 0) then
                BEGIN
                execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
                EXECUTE PROCEDURE CUENTA_INTERFAZ(21, :IDDOC, :CTACONSUMO, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (FOMENTO <> 'SI') then
                    BEGIN
                    if (TIPOCUEN = 'I') then
                        BEGIN
                        FOR SELECT F.ARTI_COD, FCDE_CONSUMO FROM ARTICULO A, FACTURAS_COMPRAS_DETALLE F WHERE F.FACO_ID = :IDDOC INTO :ARTICULO, :IMPTOS
                            DO
                            BEGIN
                            if (IMPTOS <> 0) then
                                BEGIN
                                execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
                                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_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;
                                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, :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 = 'I') then
                        BEGIN
                        FOR SELECT F.ARTI_COD, FCDE_CONSUMO FROM ARTICULO A, FACTURAS_COMPRAS_DETALLE F WHERE F.FACO_ID = :IDDOC INTO :ARTICULO, :IMPTOS
                            DO
                            BEGIN
                            if (IMPTOS <> 0) then
                                BEGIN
                                execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
                                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_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, :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, :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(21, :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 = 'I') then
                    BEGIN
                    /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                    FOR SELECT F.ARTI_COD, FCDE_CONSUMO FROM ARTICULO A, FACTURAS_COMPRAS_DETALLE F WHERE F.FACO_ID = :IDDOC INTO :ARTICULO, :IMPTOS
                        DO
                        BEGIN
                        if (IMPTOS <> 0) then
                            BEGIN
                            execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
                            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_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;
                            NETO = NETO + IMPTOS;
                            END
                        END
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    /* INSERTE EL REGISTRO DE LA BASE */
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_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 = 'I') then
                    BEGIN
                    /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                    FOR SELECT F.ARTI_COD, FCDE_CONSUMO FROM ARTICULO A, FACTURAS_COMPRAS_DETALLE F WHERE F.FACO_ID = :IDDOC INTO :ARTICULO, :IMPTOS
                        DO
                        BEGIN
                        if (IMPTOS <> 0) then
                            BEGIN
                           execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
                           INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_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, :ARTICULO, 0, 0);
                            NUMITEMS = NUMITEMS + 1;
                            NETO = NETO - IMPTOS;
                            END
                        END
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    /* INSERTE EL REGISTRO DE LA BASE */
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_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(21, :IDDOC, :CTADTO, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_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(21, :IDDOC, :CTAADIC, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_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(21, :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, :VENCE, NULL, 0, 21);
                NUMITEMS = NUMITEMS + 1;
                NETO = NETO + 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, :NUMITEMS, :CUENTA, :CONCEPTO, '', :VREXTRA, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NUMITEMS = NUMITEMS + 1;
                NETO = NETO + VREXTRA;
                END
            end
          END

        /* DESCUENTE EL IMPOCONSUMO */
        SELECT SUM(FCDE_CONSUMO) FROM FACTURAS_COMPRAS_DETALLE F WHERE F.FACO_ID = :IDDOC INTO :IMPTOS;
        if (IMPTOS IS NULL) then
            IMPTOS = 0;
        vrsubt = vrsubt - IMPTOS;
        /* RETENCION FUENTE */
        if ((RTFTE = 'P') or (RTFTE = 'K')) then
          BEGIN
          execute procedure redondee(VRRTFTE, DIG) returning_values (VRRTFTE);
          if (VRRTFTE <> 0) then
            begin
            if (RTFTE = 'P') then
                CTARTFTE = TCTARTFTE;
            EXECUTE PROCEDURE CUENTA_INTERFAZ(21, :IDDOC, :CTARTFTE, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_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 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 (MONTO >= :baseadic) then
                BEGIN
                VRRTFTE = VRRTFTE * FACTOR / 100;
                execute procedure redondee(VRRTFTE, DIG) returning_values (VRRTFTE);
                execute procedure redondee(MONTO, DIG) returning_values (MONTO);
                if (VRRTFTE <> 0) then
                    BEGIN
                    EXECUTE PROCEDURE CUENTA_INTERFAZ(21, :IDDOC, :CTARTFTE, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
                    if (ERRORC <> 0) then
                        ERROR = ERROR + 1;
                    if (TIPOCUEN = 'C') then
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                            VALUES (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :VRRTFTE, :VRSUBT, :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, :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(21, :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, '', 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(21, :IDDOC, :CTARTICA, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_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
        /* CIERRE EL COMPROBANTE CONTRA LA CUENTA DEL TERCERO O LA CONSTANTE */
        if ((CXP = 'P') or (CXP = 'K')) then
            BEGIN
            SUMA = VRTOTAL - SUMA;
            execute procedure redondee(SUMA, DIG) returning_values (SUMA);
            if (CXP = 'P') then
                CTACXP = TCTAPROV;
            EXECUTE PROCEDURE CUENTA_INTERFAZ(21, :IDDOC, :CTACXP, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'C') then
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_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(21, :IDDOC, :CUENTAADIC, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (TIPOCUEN = 'C') then
                    BEGIN
                    if (DBADIC = 'S') then
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_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(21, :IDDOC, :CTAADIC, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (TIPOCUEN = 'C') then
                    BEGIN
                    if (NETO < 0) then
                        BEGIN
                        NETO = NETO * -1;
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_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 (ERROR > 0) then
        VER = 'S';
    SUSPEND;
    END
ELSE
    BEGIN
    EXECUTE PROCEDURE ERRORINT(21, :IDDOC, :PREFIJO, 1);
    ERROR = ERROR + 1;
    VER = 'S';
    SUSPEND;
    END
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE 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 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 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 CONTABILICE_COMP_SIMPLIFICADO(
    IDI INTEGER)
RETURNS (
    ID INTEGER,
    PREF VARCHAR(4),
    NUMERO VARCHAR(8),
    ESTADO VARCHAR(20),
    IDC INTEGER)
AS
DECLARE VARIABLE VER CHAR(2);
declare variable ERROR INTEGER;
BEGIN
FOR SELECT FACO_ID, PREF_PRE, FACO_NUMERO FROM FACTURAS_COMPRA C, PROVEEDORES P WHERE
    C.TERC_NIT = P.TERC_NIT AND PROV_SIMPLIFICADO = 'S' AND FACO_ANULADO = 'N'
    ORDER BY FACO_ID INTO :ID, :PREF, :NUMERO
DO
  BEGIN
  ESTADO = 'PROCESANDO';
  SUSPEND;
  /* BORRE LA CONTABILIZACION */
/*  delete FROM comprobante_detalle WHERE ENCO_CONSEC IN (SELECT ENCO_CONSEC FROM COMPROBANTE_ENCABEZADO WHERE ENCO_TIPOREF = 21 AND ENCO_IDREF = :ID);
  DELETE FROM comprobante_encabezado  WHERE ENCO_TIPOREF = 21 AND ENCO_IDREF = :ID; */
  EXECUTE PROCEDURE CONTABIL_FACTCOMP (:ID, :IDI) RETURNING_VALUES (:ERROR, VER, :IDC);
  if (ERROR = 0) then
    BEGIN
/*    EXECUTE PROCEDURE CONTABILIZA_PENDIENTE (:IDC); */
    ESTADO = 'OK';
    END
  ELSE
    ESTADO = 'ERROR';
  suspend;
  END
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE FACTCOMP_SIN_CONTABILIDAD(
    FECINI DATE,
    FECFIN DATE)
RETURNS (
    ID INTEGER,
    PREF VARCHAR(4),
    NUMERO VARCHAR(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 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,
    FECINI DATE,
    FECFIN DATE,
    MORA NUMERIC(9,4))
RETURNS (
    PREFIJO VARCHAR(4),
    NUMERO VARCHAR(8),
    NIT VARCHAR(20),
    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.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 S.clcu_cod = '01' AND
        C.vend_cod >= :vendini AND C.vend_cod <= :vendfin AND ((c.grca_cod is null and :grpini = 0 ) or (C.grca_cod >= :grpini AND C.grca_cod <= :grpfin)) AND
        ((c.zona_cod is null and :zonini = '') or (C.zona_cod >= :zonini AND C.zona_cod <= :zonfin))
    INTO :NIT, :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_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', 'N', :TOTAL, :BOD, :OBS, NULL, NULL, 0, USER, '01', '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 CLIE_VALORMES FROM CLIENTES WHERE TERC_NIT = :NIT 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, NULL, '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 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_TRASCUENTA (
    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 CTADEST INTEGER;
declare variable TIPOCOMP VARCHAR(3);
declare variable PREFCONT VARCHAR(4);
declare variable BASE CHAR(1);
declare variable CTABASE VARCHAR(20);
declare variable IVA CHAR(1);
declare variable CTAIVA VARCHAR(20);
declare variable GMF CHAR(1);
declare variable CTAGMF VARCHAR(20);
declare variable BANCO CHAR(1);
declare variable CTABANCO VARCHAR(20);
declare variable EXISTE CHAR(1);
declare variable CUENTA VARCHAR(20);
declare variable MONTO NUMERIC(18,2);
declare variable VRGMF NUMERIC(18,2);
declare variable VRIVA NUMERIC(18,2);
declare variable VRNOTA 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 NROI INTEGER;
declare variable SUMA NUMERIC(18,2);
declare variable BCTABANCO VARCHAR(20);
declare variable BCTAIVA VARCHAR(20);
declare variable BCTAGMF 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 ANULADO CHAR(1);
BEGIN
/* BUSQUE LA INTERFACE */
EXISTE = 'N';
SELECT 'S', TICO_COD, PRCO_PRE, INBA_BANCO, INBA_IVA, INBA_GMF, INBA_BASE, INBA_CTABCO, INBA_CTAIVA, INBA_CTAGMF, INBA_CTABASE, INBA_CONFIRMAR
    FROM INTERFAZ_BANCOS
    WHERE INBA_ID = :IDINTER
    INTO :EXISTE, :TIPOCOMP, :PREFCONT, :BANCO, :IVA, :GMF, :BASE, :CTABANCO, CTAIVA, CTAGMF, CTABASE, :VER;
if (EXISTE = 'S') then
  BEGIN
  /* BORRE CUALQUEIR CONTABILIZACION PREVIA */
  DELETE FROM CONTABILIZACION WHERE CNTB_TIPOREF = 76 AND CNTB_IDREF = :IDDOC;
  /* TRAIGA EL ENCABEZADO  */
  SELECT PRBA_PREF, TRAS_NUMERO, TRAS_FECHA, TRAS_CONCEPTO, TRAS_CTADEST, TRAS_MONTO, TRAS_GMFMONTO, TRAS_IVAMONTO2, TRAS_NOTAMONTO, CUBA_CTACONTA, CUBA_CTAIVA, CUBA_CTAGMF, TRAS_ANULADO, BANC_NIT
        FROM TRASLADOS T, CUENTAS_BANCO C, BANCOS B
        WHERE TRAS_ID = :IDDOC AND C.CUBA_COD = T.CUBA_COD AND C.BANC_COD = B.BANC_COD
        INTO :PREF, :NUM, :FECAUX, :CONC, :CTADEST, :MONTO, :VRGMF, :VRIVA, :VRNOTA, :BCTABANCO, :BCTAIVA, :BCTAGMF, :ANULADO, :NIT;
  if (ANULADO = 'N') then
    BEGIN
    if (VRIVA IS NULL) then
        VRIVA = 0;
    if (VRGMF IS NULL) then
        VRGMF = 0;
    if (VRNOTA IS NULL) then
        VRNOTA = 0;
    SELECT PRBA_CENTRO, PRBA_PROY FROM PREFIJOS_BANCOS P, TRASLADOS T
        WHERE P.PRBA_PREF = T.PRBA_PREF AND P.CUBA_COD = T.CUBA_COD AND P.tido_cod = 76 AND T.TRAS_ID = :IDDOC
        INTO :CENTRO, :PROY;
    NUMERO = PREF || NUM;
    EXECUTE PROCEDURE FECHA_A_CONTA(:FECAUX) returning_values (:FECHA);
    /* REGISTRE EL ENCABEZADO CONTABLE */
    IDC = GEN_ID(ID_CONTABILIZA, 1);
    INSERT INTO CONTABILIZACION (CNTB_ID, CNTB_TIPOCOMP, CNTB_PREFCNT, CNTB_NUMERO, CNTB_FECHA, CNTB_CONCEPTO, CNTB_REF, CNTB_TIPOREF, CNTB_IDREF, CNTB_PREFREF, CNTB_NUMREF, CNTB_PROCESADO)
        VALUES (:IDC, :TIPOCOMP, :PREFCONT, :NUM, :FECHA, :CONC, '', 76, :IDDOC, :PREF, :NUM, 'N');
    NROI = 0;
    SUMA = 0;
    /* CUENTA BASE */
    if ((BASE = 'K') or (BASE = 'C')) then
        BEGIN
        if (BASE = 'C') then
            BEGIN
            SELECT CUBA_CTACONTA FROM CUENTAS_BANCO
                WHERE CUBA_COD = :CTADEST INTO :CTABASE;
            END
        CUENTA = NULL;
        SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
            WHERE CUEN_COD = :CTABASE INTO :CUENTA, :TIPOCUEN;
        if (CUENTA IS NULL) then
            begin
            EXECUTE PROCEDURE ERRORINT(76, :IDDOC, :CTABASE, 2);
            CUENTA = CTABASE;
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            EXECUTE PROCEDURE ERRORINT(76, :IDDOC, :CUENTA, 3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'C') then
            BEGIN
            EXECUTE PROCEDURE ERRORINT(76, :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, :NROI, :CUENTA, :CONC, '', :MONTO, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            SUMA = MONTO;
            END
        END /* BASE = K */
    /* CUENTA GMF */
    if ((VRGMF <> 0) AND ((GMF = 'K') or (GMF = 'B'))) then
        BEGIN
        if (GMF = 'B') then
            CTAGMF = BCTAGMF;
        CUENTA = NULL;
        SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
            WHERE CUEN_COD = :CTAGMF INTO :CUENTA, :TIPOCUEN;
        if (CUENTA IS NULL) then
            begin
            EXECUTE PROCEDURE ERRORINT(76, :IDDOC, :CTAGMF, 2);
            CUENTA = CTAGMF;
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            EXECUTE PROCEDURE ERRORINT(76, :IDDOC, :CUENTA, 3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'C') then
            BEGIN
            EXECUTE PROCEDURE ERRORINT(76, :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, :NROI, :CUENTA, :CONC, '', :VRGMF, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            SUMA = SUMA + VRGMF;
            END
        END /* GMF */
    /* CUENTA IVA */
    if ((VRIVA <> 0) AND ((IVA = 'K') or (IVA = 'B'))) then
        BEGIN
        if (IVA = 'B') then
            CTAIVA = BCTAIVA;
        CUENTA = NULL;
        SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
            WHERE CUEN_COD = :CTAIVA INTO :CUENTA, :TIPOCUEN;
        if (CUENTA IS NULL) then
            begin
            EXECUTE PROCEDURE ERRORINT(76, :IDDOC, :CTAIVA, 2);
            CUENTA = CTAIVA;
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            EXECUTE PROCEDURE ERRORINT(76, :IDDOC, :CUENTA, 3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'C') then
            BEGIN
            EXECUTE PROCEDURE ERRORINT(76, :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, :NROI, :CUENTA, :CONC, '', :VRIVA, 0, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NROI = NROI + 1;
            SUMA = SUMA + VRIVA;
            END
        END /* IVA */
    /* CUENTA BANCO */
    if ((BANCO = 'B') or (BANCO = 'K')) then
        BEGIN
        if (BANCO = 'B') then
            CTABANCO = BCTABANCO;
        if (SUMA <> 0) then
            BEGIN
            CUENTA = NULL;
            SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
                WHERE CUEN_COD = :CTABANCO INTO :CUENTA, :TIPOCUEN;
            if (CUENTA IS NULL) then
                begin
                EXECUTE PROCEDURE ERRORINT(76, :IDDOC, :CTABANCO, 2);
                CUENTA = CTABANCO;
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'I') then
                BEGIN
                EXECUTE PROCEDURE ERRORINT(76, :IDDOC, :CUENTA, 3);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                EXECUTE PROCEDURE ERRORINT(76, :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, :NROI, :CUENTA, :CONC, '', 0, :SUMA, 0, 0, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
                NROI = NROI + 1;
                END
            END /* SUMA <> 0 */
        END /* BANCO K O B */
    /* recorra las cuentas adicionales */
    FOR SELECT INBC_CUENTA, INBC_BASE, INBC_PORC, INBC_VALOR, INBC_DB
        FROM INTERFAZ_BANCOS_CTAS
        WHERE INBA_ID = :IDINTER
        INTO :CUENTAADIC, :BASEADIC, :PORCADIC, :VALORADIC, :DBADIC
        DO
        BEGIN
        if (:BASEADIC = 'MONTO') then
            VALORADIC = MONTO;
        MONTO = VALORADIC * PORCADIC;
        
        /* TRAIGA LAS CARACTERISTICAS DE LA CUENTA */
        CUENTA = NULL;
        SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
            WHERE CUEN_COD = :CUENTAADIC INTO :CUENTA, :TIPOCUEN;
        IF (CUENTA IS NULL) THEN
            begin
            EXECUTE PROCEDURE ERRORINT(76, :IDDOC, :CUENTAADIC, 2);
            CUENTA = CUENTAADIC;
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            EXECUTE PROCEDURE ERRORINT(76, :IDDOC, :CUENTA, 3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'C') then
            BEGIN
            EXECUTE PROCEDURE ERRORINT(76, :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, :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
    if (ERROR > 0) then
        VER = 'S';
    SUSPEND;
    END /* NO ANULADO */
  END /* EXISTE LA INTERFAZ */
ELSE
    BEGIN
    EXECUTE PROCEDURE ERRORINT(76, :IDDOC, :PREF, 1);
    ERROR = ERROR + 1;
    VER = 'S';
    SUSPEND;
    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 ; ^

DROP TRIGGER LIQUIDACION_BI;
DROP PROCEDURE CONTABIL_NOMINA;

DROP PROCEDURE ERROR;

/* 20140117 */
/* GRABADOS 4 Y 5 EN NULL HACEN QUE EL TOTAL CON AJUSTES QUEDE EN NULL */
SET TERM ^ ;

CREATE OR ALTER procedure IMPUESTOS_VENTAS (
    FECINI date,
    FECFIN date,
    PREFIJO varchar(4),
    PTOINI integer,
    PTOFIN integer,
    ANULADOS char(1),
    SUBEMPRESA integer)
returns (
    TIPO integer,
    NOMTIPO varchar(30),
    PREF varchar(4),
    NUMERO varchar(8),
    FECHA date,
    NIT varchar(20),
    NOMTERCERO varchar(60),
    SUBTOTAL numeric(18,2),
    DTOMONTO numeric(18,2),
    ADICIONAL numeric(18,2),
    IVAMONTO numeric(18,2),
    CONSUMO numeric(18,2),
    EXENTOS numeric(18,2),
    GRAVADOS1 numeric(18,2),
    GRAVADOS2 numeric(18,2),
    GRAVADOS3 numeric(18,2),
    GRAVADOS4 numeric(18,2),
    GRAVADOS5 numeric(18,2),
    BASEDEC2799 numeric(18,2),
    IVA1 numeric(18,2),
    IVA2 numeric(18,2),
    IVA3 numeric(18,2),
    IVA4 numeric(18,2),
    IVA5 numeric(18,2),
    IVADEC2799 numeric(18,2),
    EXTRA numeric(18,2),
    TOTAL numeric(18,2),
    RTFTEMONTO numeric(18,2),
    RTIVAMONTO numeric(18,2),
    RTICAMONTO numeric(18,2),
    RTCREEMONTO numeric(18,2),
    NETO numeric(18,2),
    ANULADO char(1))
AS
declare variable ID INTEGER;
declare variable TER_exento CHAR(1);
declare variable NOTAS CHAR(2);
declare variable ajustar CHAR(1);
declare variable FACTOR NUMERIC(18,4);
declare variable NUEVO NUMERIC(18,2);
declare variable FACTENC NUMERIC(18,2);
declare variable DEC2799 char(2);
declare variable INALC NUMERIC(18,2);
BEGIN
EXECUTE PROCEDURE lee_configuracion ('FACTURACION', 'FACTURAS', 'DESCONTAR IVA DE PRODUCTOS DECRETO 2799') returning_values (:DEC2799);
/* FACTURA */
TIPO = 31;
SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 31 INTO :NOMTIPO;
ajustar = 'N';
FOR SELECT FACT_ID, F.PREF_PRE, FACT_NUMERO, FACT_FECHA, TERC_NIT, FACT_NOMCLIENTE, FACT_ADICIONAL-FACT_DTOMONTO, FACT_IVAMONTO,
    FACT_RTFTEMONTO, FACT_RTIVAMONTO, FACT_RTICAMONTO, FACT_RTCREEM, FACT_EXTRA, FACT_TOTAL, FACT_ANULADO, fact_factor
    FROM FACTURAS F, PREFIJOS PR WHERE PTVT_ID >= :PTOINI AND PTVT_ID <= :PTOFIN AND
    FACT_FECHA >= :FECINI AND FACT_FECHA <= :FECFIN AND ((:PREFIJO = '') or (:PREFIJO IS NULL) or (F.PREF_PRE = :PREFIJO))
    AND PR.PREF_PRE = F.PREF_PRE AND PR.TIDO_COD = 31 AND ((PR.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
    ORDER BY FACT_FECHA, F.PREF_PRE, FACT_NUMERO
    INTO :ID, :PREF, :NUMERO, :FECHA, :NIT, :NOMTERCERO, :DTOMONTO, :IVAMONTO,
    :RTFTEMONTO, :RTIVAMONTO, :RTICAMONTO, :rtcreemonto, :EXTRA, :TOTAL, :ANULADO, :FACTENC
    DO
    BEGIN
    SELECT TERC_EXENTO FROM TERCEROS WHERE TERC_NIT = :NIT INTO :TER_EXENTO;
    if ((ANULADOS = 'S') or (ANULADO = 'N')) then
        BEGIN
        if (ANULADO = 'S') then
            BEGIN
            EXENTOS = 0;
            GRAVADOS1 = 0;
            GRAVADOS2 = 0;
            GRAVADOS3 = 0;
            CONSUMO = 0;
            SUBTOTAL = 0;
            TOTAL = 0;
            EXTRA = 0;
            IVAMONTO = 0;
            IVA1 = 0;
            IVA2 = 0;
            IVA3 = 0;
            IVA4 = 0;
            IVA5 = 0;
            DTOMONTO = 0;
            NETO = 0;
            RTFTEMONTO = 0;
            RTIVAMONTO = 0;
            RTICAMONTO = 0;
            RTCREEMONTO = 0;
            basedec2799 = 0;
            ivadec2799 = 0;
            END
        else
            BEGIN
            /* CALCULE LAS DIFERENTES TARIFAS */
            if (TER_EXENTO = 'S') then
                BEGIN
                SELECT SUM(FADE_TOTAL - FADE_IVAMONTO - FADE_CONSUMO - FADE_INALCM)*:FACTENC FROM FACTURAS_DETALLE D WHERE FACT_ID = :ID AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL)) AND FADE_IVAMONTO = 0 INTO :EXENTOS;
                SELECT SUM((FADE_TOTAL - FADE_IVAMONTO - FADE_CONSUMO - FADE_INALCM)*:FACTENC), SUM(FADE_IVAMONTO*:FACTENC) FROM FACTURAS_DETALLE D WHERE FACT_ID = :ID AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL)) AND FADE_TIVA = 1 AND FADE_IVAMONTO <> 0 INTO :GRAVADOS1, :IVA1;
                SELECT SUM((FADE_TOTAL - FADE_IVAMONTO - FADE_CONSUMO - FADE_INALCM)*:FACTENC), SUM(FADE_IVAMONTO*:FACTENC) FROM FACTURAS_DETALLE D WHERE FACT_ID = :ID AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL)) AND FADE_TIVA = 2 AND FADE_IVAMONTO <> 0 INTO :GRAVADOS2, :IVA2;
                SELECT SUM((FADE_TOTAL - FADE_IVAMONTO - FADE_CONSUMO - FADE_INALCM)*:FACTENC), SUM(FADE_IVAMONTO*:FACTENC) FROM FACTURAS_DETALLE D WHERE FACT_ID = :ID AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL)) AND FADE_TIVA = 3 AND FADE_IVAMONTO <> 0 INTO :GRAVADOS3, :IVA3;
                SELECT SUM((FADE_TOTAL - FADE_IVAMONTO - FADE_CONSUMO - FADE_INALCM)*:FACTENC), SUM(FADE_IVAMONTO*:FACTENC) FROM FACTURAS_DETALLE D WHERE FACT_ID = :ID AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL)) AND FADE_TIVA = 4 AND FADE_IVAMONTO <> 0 INTO :GRAVADOS4, :IVA4;
                SELECT SUM((FADE_TOTAL - FADE_IVAMONTO - FADE_CONSUMO - FADE_INALCM)*:FACTENC), SUM(FADE_IVAMONTO*:FACTENC) FROM FACTURAS_DETALLE D WHERE FACT_ID = :ID AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL)) AND FADE_TIVA = 5 AND FADE_IVAMONTO <> 0 INTO :GRAVADOS5, :IVA5;
                basedec2799 = 0;
                ivadec2799 = 0;
                end
            else
                begin
                SELECT SUM((FADE_TOTAL - FADE_IVAMONTO - FADE_CONSUMO - FADE_INALCM)*:FACTENC) FROM FACTURAS_DETALLE D WHERE FACT_ID = :ID AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL)) AND D.fade_tiva = 0 INTO :EXENTOS;
                SELECT SUM((FADE_TOTAL - FADE_IVAMONTO - FADE_CONSUMO - FADE_INALCM)*:FACTENC), SUM(FADE_IVAMONTO*:FACTENC) FROM FACTURAS_DETALLE D WHERE FACT_ID = :ID AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL)) AND FADE_TIVA = 1 INTO :GRAVADOS1, :IVA1;
                SELECT SUM((FADE_TOTAL - FADE_IVAMONTO - FADE_CONSUMO - FADE_INALCM)*:FACTENC), SUM(FADE_IVAMONTO*:FACTENC) FROM FACTURAS_DETALLE D WHERE FACT_ID = :ID AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL)) AND FADE_TIVA = 2 INTO :GRAVADOS2, :IVA2;
                SELECT SUM((FADE_TOTAL - FADE_IVAMONTO - FADE_CONSUMO - FADE_INALCM)*:FACTENC), SUM(FADE_IVAMONTO*:FACTENC) FROM FACTURAS_DETALLE D WHERE FACT_ID = :ID AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL)) AND FADE_TIVA = 3 INTO :GRAVADOS3, :IVA3;
                SELECT SUM((FADE_TOTAL - FADE_IVAMONTO - FADE_CONSUMO - FADE_INALCM)*:FACTENC), SUM(FADE_IVAMONTO*:FACTENC) FROM FACTURAS_DETALLE D WHERE FACT_ID = :ID AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL)) AND FADE_TIVA = 4 INTO :GRAVADOS4, :IVA4;
                SELECT SUM((FADE_TOTAL - FADE_IVAMONTO - FADE_CONSUMO - FADE_INALCM)*:FACTENC), SUM(FADE_IVAMONTO*:FACTENC) FROM FACTURAS_DETALLE D WHERE FACT_ID = :ID AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL)) AND FADE_TIVA = 5 INTO :GRAVADOS5, :IVA5;
                if (DEC2799 = 'SI') then
                    SELECT SUM((FADE_TOTAL - FADE_IVAMONTO - FADE_CONSUMO)*:FACTENC), SUM(FADE_IVAMONTO*:FACTENC) FROM FACTURAS_DETALLE D, ARTICULO A WHERE FACT_ID = :ID AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL)) AND D.arti_cod = A.arti_cod AND A.arti_dec2799 = 'S' INTO :basedec2799, :ivadec2799;
                end
            if (iva1 is null) then
                iva1 = 0;
            if (iva2 is null) then
                iva2 = 0;
            if (iva3 is null) then
                iva3 = 0;
            if (iva4 is null) then
                iva4 = 0;
            if (iva5 is null) then
                iva5 = 0;
            if (ivadec2799 is null) then
                ivadec2799 = 0;
            SELECT SUM(FADE_CONSUMO) FROM FACTURAS_DETALLE WHERE FACT_ID = :ID AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL)) INTO :CONSUMO;
            SELECT SUM(FADE_INALCM) FROM FACTURAS_DETALLE WHERE FACT_ID = :ID AND ((FADE_REFERENCIA <> '.t') or (FADE_REFERENCIA IS NULL)) INTO :INALC;
            if (consumo is null) then
                consumo = 0;
            if (inalc is null) then
                inalc = 0;
            CONSUMO = CONSUMO + INALC;
            SUBTOTAL = TOTAL - EXTRA - IVAMONTO + IVADEC2799;
            NETO = TOTAL - RTFTEMONTO - RTIVAMONTO - RTICAMONTO - rtcreemonto;
            END
        if (exentos is null) then
            exentos = 0;
        if (gravados1 is null) then
            gravados1 = 0;
        if (gravados2 is null) then
            gravados2 = 0;
        if (gravados3 is null) then
            gravados3 = 0;
        if (gravados4 is null) then
            gravados4 = 0;
        if (gravados5 is null) then
            gravados5 = 0;
        if (basedec2799 is null) then
            basedec2799 = 0;
        FACTOR = 1;
        SELECT AJCI_FACTOR FROM ajuste_cierre WHERE AJCI_PORC = 0 AND AJCI_FECINI <= :FECHA AND AJCI_FECFIN >= :FECHA INTO :FACTOR;
        if (FACTOR IS null) then
            FACTOR = 1;
        if (factor <> 1) then
            ajustar = 'S';
        EXENTOS = EXENTOS * FACTOR;
        FACTOR = 1;
        SELECT AJCI_FACTOR FROM ajuste_cierre, TARIFA_IVA WHERE AJCI_PORC = taiv_porc AND TAIV_COD = 1 AND AJCI_FECINI <= :FECHA AND AJCI_FECFIN >= :FECHA INTO :FACTOR;
        if (FACTOR IS null) then
            FACTOR = 1;
        if (factor <> 1) then
            ajustar = 'S';
        gravados1 = GRAVADOS1 * FACTOR;
        IVA1 = IVA1 * FACTOR;
        FACTOR = 1;
        SELECT AJCI_FACTOR FROM ajuste_cierre, TARIFA_IVA WHERE AJCI_PORC = TAIV_PORC AND TAIV_COD = 2 AND AJCI_FECINI <= :FECHA AND AJCI_FECFIN >= :FECHA INTO :FACTOR;
        if (FACTOR IS null) then
            FACTOR = 1;
        if (factor <> 1) then
            ajustar = 'S';
        gravados2 = GRAVADOS2 * FACTOR;
        IVA2 = IVA2 * FACTOR;
        FACTOR = 1;
        SELECT AJCI_FACTOR FROM ajuste_cierre, TARIFA_IVA WHERE AJCI_PORC = TAIV_PORC AND TAIV_COD = 3 AND AJCI_FECINI <= :FECHA AND AJCI_FECFIN >= :FECHA INTO :FACTOR;
        if (FACTOR IS null) then
            FACTOR = 1;
        if (factor <> 1) then
            ajustar = 'S';
        gravados3 = GRAVADOS3 * FACTOR;
        IVA3 = IVA3 * FACTOR;
        FACTOR = 1;
        SELECT AJCI_FACTOR FROM ajuste_cierre, TARIFA_IVA WHERE AJCI_PORC = TAIV_PORC AND TAIV_COD = 4 AND AJCI_FECINI <= :FECHA AND AJCI_FECFIN >= :FECHA INTO :FACTOR;
        if (FACTOR IS null) then
            FACTOR = 1;
        if (factor <> 1) then
            ajustar = 'S';
        gravados4 = GRAVADOS4 * FACTOR;
        IVA4 = IVA4 * FACTOR;
        FACTOR = 1;
        SELECT AJCI_FACTOR FROM ajuste_cierre, TARIFA_IVA WHERE AJCI_PORC = TAIV_PORC AND TAIV_COD = 5 AND AJCI_FECINI <= :FECHA AND AJCI_FECFIN >= :FECHA INTO :FACTOR;
        if (FACTOR IS null) then
            FACTOR = 1;
        if (factor <> 1) then
            ajustar = 'S';
        gravados5 = GRAVADOS5 * FACTOR;
        IVA5 = IVA5 * FACTOR;
        NUEVO = exentos + gravados1 + gravados2 + gravados3 + GRAVADOS4 + GRAVADOS5;
        if ((TOTAL <> 0) and (ajustar = 'S')) then
            BEGIN
            IVAMONTO = IVA1 + IVA2 + IVA3 + IVA4 + IVA5;
            CONSUMO = CONSUMO * (NUEVO+ivamonto+consumo) / TOTAL;
            SUBTOTAL = SUBTOTAL * (NUEVO+ivamonto+consumo) / TOTAL;
            NETO = NETO * (NUEVO+ivamonto+consumo) / TOTAL;
            rtftemonto = rtftemonto * (NUEVO+ivamonto+consumo) / TOTAL;
            rticamonto = rticamonto * (NUEVO+ivamonto+consumo) / TOTAL;
            rtivamonto = rtivamonto * (NUEVO+ivamonto+consumo) / TOTAL;
            rtcreemonto = rtcreemonto * (NUEVO+ivamonto+consumo) / TOTAL;
            dtomonto = dtomonto * (NUEVO+ivamonto+consumo) / TOTAL;
            adicional = adicional * (NUEVO+ivamonto+consumo) / TOTAL;
            total = total * (NUEVO+ivamonto+consumo) / TOTAL;
            END
        SUSPEND;
        END
    END
    
TIPO = 33;
ajustar = 'N';
SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 33 INTO :NOMTIPO;
/* DEVOLUCIONES */
FOR SELECT DEVT_ID, D.PREF_PRE, DEVT_NUMERO, DEVT_FECHA, TERC_NIT, DEVT_NOMTERC, DEVT_ADICIONAL-DEVT_DTOMONTO, DEVT_IVAMONTO,
    DEVT_RTFTEMONTO, DEVT_RTIVAMONTO, DEVT_RTICAMONTO, DEVT_RTCREEM, DEVT_EXTRA, DEVT_TOTAL, DEVT_ANULADO, DEVT_FACTOR
    FROM DEVOLUCIONES_VENTAS D, PREFIJOS PR WHERE PTVT_ID >= :PTOINI AND PTVT_ID <= :PTOFIN AND
    DEVT_FECHA >= :FECINI AND DEVT_FECHA <= :FECFIN AND ((:PREFIJO = '') or (:PREFIJO IS NULL) or (D.PREF_PRE = :PREFIJO))
    AND PR.PREF_PRE = D.PREF_PRE AND PR.TIDO_COD = 33 AND ((PR.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) AND ((DEVT_REMID = 0) or (DEVT_REMID IS NULL)) AND ((DEVT_PEDID = 0) or (DEVT_PEDID IS NULL))
    ORDER BY DEVT_FECHA, D.PREF_PRE, DEVT_NUMERO
    INTO :ID, :PREF, :NUMERO, :FECHA, :NIT, :NOMTERCERO, :DTOMONTO, :IVAMONTO,
    :RTFTEMONTO, :RTIVAMONTO, :RTICAMONTO, :RTCREEMONTO, :EXTRA, :TOTAL, :ANULADO, :FACTENC
    DO
    BEGIN
    SELECT TERC_EXENTO FROM TERCEROS WHERE TERC_NIT = :NIT INTO :TER_EXENTO;
    if ((ANULADOS = 'S') or (ANULADO = 'N')) then
        BEGIN
        if (ANULADO = 'S') then
            BEGIN
            EXENTOS = 0;
            GRAVADOS1 = 0;
            GRAVADOS2 = 0;
            GRAVADOS3 = 0;
            GRAVADOS4 = 0;
            GRAVADOS5 = 0;
            CONSUMO = 0;
            SUBTOTAL = 0;
            TOTAL = 0;
            EXTRA = 0;
            IVAMONTO = 0;
            IVA1 = 0;
            IVA2 = 0;
            IVA3 = 0;
            IVA4 = 0;
            IVA5 = 0;
            DTOMONTO = 0;
            NETO = 0;
            RTFTEMONTO = 0;
            RTIVAMONTO = 0;
            RTICAMONTO = 0;
            RTCREEMONTO = 0;
            basedec2799 = 0;
            ivadec2799 = 0;
            END
        else
            BEGIN
            DTOMONTO = DTOMONTO * -1;
            ADICIONAL = ADICIONAL * -1;
            IVAMONTO = IVAMONTO * -1;
            IVADEC2799 = IVADEC2799 * -1;
            EXTRA = EXTRA * -1;
            TOTAL = TOTAL * -1;
            RTFTEMONTO = RTFTEMONTO * -1;
            RTIVAMONTO = RTIVAMONTO * -1;
            RTICAMONTO = RTICAMONTO * -1;
            RTCREEMONTO = RTCREEMONTO * -1;
            /* CALCULE LAS DIFERENTES TARIFAS */
            if (TER_EXENTO = 'S') then
              BEGIN
              SELECT SUM((DVDE_TOTAL - DVDE_IVAMONTO - DVDE_CONSUMO - DVDE_INACM)*:FACTENC) FROM DEVOLUCIONES_VENTAS_DETALLE D WHERE DEVT_ID = :ID AND ((DVDE_REFERENCIA <> '.t') or (DVDE_REFERENCIA IS NULL)) AND DVDE_IVAMONTO = 0 INTO :EXENTOS;
              SELECT SUM((DVDE_TOTAL - DVDE_IVAMONTO - DVDE_CONSUMO - DVDE_INACM)*:FACTENC), SUM(DVDE_IVAMONTO*:FACTENC) FROM DEVOLUCIONES_VENTAS_DETALLE D WHERE DEVT_ID = :ID AND ((DVDE_REFERENCIA <> '.t') or (DVDE_REFERENCIA IS NULL)) AND DVDE_TIVA = 1 AND DVDE_IVAMONTO <> 0 INTO :GRAVADOS1, :IVA1;
              SELECT SUM((DVDE_TOTAL - DVDE_IVAMONTO - DVDE_CONSUMO - DVDE_INACM)*:FACTENC), SUM(DVDE_IVAMONTO*:FACTENC) FROM DEVOLUCIONES_VENTAS_DETALLE D WHERE DEVT_ID = :ID AND ((DVDE_REFERENCIA <> '.t') or (DVDE_REFERENCIA IS NULL)) AND DVDE_TIVA = 2 AND DVDE_IVAMONTO <> 0 INTO :GRAVADOS2, :IVA2;
              SELECT SUM((DVDE_TOTAL - DVDE_IVAMONTO - DVDE_CONSUMO - DVDE_INACM)*:FACTENC), SUM(DVDE_IVAMONTO*:FACTENC) FROM DEVOLUCIONES_VENTAS_DETALLE D WHERE DEVT_ID = :ID AND ((DVDE_REFERENCIA <> '.t') or (DVDE_REFERENCIA IS NULL)) AND DVDE_TIVA = 3 AND DVDE_IVAMONTO <> 0 INTO :GRAVADOS3, :IVA3;
              SELECT SUM((DVDE_TOTAL - DVDE_IVAMONTO - DVDE_CONSUMO - DVDE_INACM)*:FACTENC), SUM(DVDE_IVAMONTO*:FACTENC) FROM DEVOLUCIONES_VENTAS_DETALLE D WHERE DEVT_ID = :ID AND ((DVDE_REFERENCIA <> '.t') or (DVDE_REFERENCIA IS NULL)) AND DVDE_TIVA = 4 AND DVDE_IVAMONTO <> 0 INTO :GRAVADOS4, :IVA4;
              SELECT SUM((DVDE_TOTAL - DVDE_IVAMONTO - DVDE_CONSUMO - DVDE_INACM)*:FACTENC), SUM(DVDE_IVAMONTO*:FACTENC) FROM DEVOLUCIONES_VENTAS_DETALLE D WHERE DEVT_ID = :ID AND ((DVDE_REFERENCIA <> '.t') or (DVDE_REFERENCIA IS NULL)) AND DVDE_TIVA = 5 AND DVDE_IVAMONTO <> 0 INTO :GRAVADOS5, :IVA5;
              basedec2799 = 0;
              ivadec2799 = 0;
              end
            else
              begin
              SELECT SUM((DVDE_TOTAL - DVDE_IVAMONTO - DVDE_CONSUMO - DVDE_INACM)*:FACTENC) FROM DEVOLUCIONES_VENTAS_DETALLE D WHERE DEVT_ID = :ID AND ((DVDE_REFERENCIA <> '.t') or (DVDE_REFERENCIA IS NULL)) AND DVDE_TIVA = 0 INTO :EXENTOS;
              SELECT SUM((DVDE_TOTAL - DVDE_IVAMONTO - DVDE_CONSUMO - DVDE_INACM)*:FACTENC), SUM(DVDE_IVAMONTO*:FACTENC) FROM DEVOLUCIONES_VENTAS_DETALLE D WHERE DEVT_ID = :ID AND ((DVDE_REFERENCIA <> '.t') or (DVDE_REFERENCIA IS NULL)) AND DVDE_TIVA = 1 INTO :GRAVADOS1, :IVA1;
              SELECT SUM((DVDE_TOTAL - DVDE_IVAMONTO - DVDE_CONSUMO - DVDE_INACM)*:FACTENC), SUM(DVDE_IVAMONTO*:FACTENC) FROM DEVOLUCIONES_VENTAS_DETALLE D WHERE DEVT_ID = :ID AND ((DVDE_REFERENCIA <> '.t') or (DVDE_REFERENCIA IS NULL)) AND DVDE_TIVA = 2 INTO :GRAVADOS2, :IVA2;
              SELECT SUM((DVDE_TOTAL - DVDE_IVAMONTO - DVDE_CONSUMO - DVDE_INACM)*:FACTENC), SUM(DVDE_IVAMONTO*:FACTENC) FROM DEVOLUCIONES_VENTAS_DETALLE D WHERE DEVT_ID = :ID AND ((DVDE_REFERENCIA <> '.t') or (DVDE_REFERENCIA IS NULL)) AND dvde_tiva = 3 INTO :GRAVADOS3, :IVA3;
              SELECT SUM((DVDE_TOTAL - DVDE_IVAMONTO - DVDE_CONSUMO - DVDE_INACM)*:FACTENC), SUM(DVDE_IVAMONTO*:FACTENC) FROM DEVOLUCIONES_VENTAS_DETALLE D WHERE DEVT_ID = :ID AND ((DVDE_REFERENCIA <> '.t') or (DVDE_REFERENCIA IS NULL)) AND dvde_tiva = 4 INTO :GRAVADOS4, :IVA4;
              SELECT SUM((DVDE_TOTAL - DVDE_IVAMONTO - DVDE_CONSUMO - DVDE_INACM)*:FACTENC), SUM(DVDE_IVAMONTO*:FACTENC) FROM DEVOLUCIONES_VENTAS_DETALLE D WHERE DEVT_ID = :ID AND ((DVDE_REFERENCIA <> '.t') or (DVDE_REFERENCIA IS NULL)) AND dvde_tiva = 5 INTO :GRAVADOS5, :IVA5;
              if (DEC2799 = 'SI') then
                SELECT SUM((DVDE_TOTAL - DVDE_IVAMONTO - DVDE_CONSUMO - DVDE_INACM)*:FACTENC), SUM(DVDE_IVAMONTO*:FACTENC) FROM DEVOLUCIONES_VENTAS_DETALLE D, ARTICULO A WHERE DEVT_ID = :ID AND ((DVDE_REFERENCIA <> '.t') or (DVDE_REFERENCIA IS NULL)) AND D.arti_cod = A.arti_cod AND A.arti_dec2799 = 'S' INTO :basedec2799, :ivadec2799;
              end
            if (iva1 is null) then
                iva1 = 0;
            if (iva2 is null) then
                iva2 = 0;
            if (iva3 is null) then
                iva3 = 0;
            if (iva4 is null) then
                iva4 = 0;
            if (iva5 is null) then
                iva5 = 0;
            if (ivadec2799 is null) then
                ivadec2799 = 0;
            SELECT SUM(DVDE_CONSUMO) FROM DEVOLUCIONES_VENTAS_DETALLE WHERE DEVT_ID = :ID AND ((DVDE_REFERENCIA <> '.t') or (DVDE_REFERENCIA IS NULL)) INTO :CONSUMO;
            SELECT SUM(DVDE_INACM) FROM DEVOLUCIONES_VENTAS_DETALLE WHERE DEVT_ID = :ID AND ((DVDE_REFERENCIA <> '.t') or (DVDE_REFERENCIA IS NULL)) INTO :INALC;
            if (consumo is null) then
                consumo = 0;
            if (inalc is null) then
                inalc = 0;
            CONSUMO = CONSUMO + INALC;
            EXENTOS = EXENTOS * -1;
            GRAVADOS1 = GRAVADOS1 * -1;
            GRAVADOS2 = GRAVADOS2 * -1;
            GRAVADOS3 = GRAVADOS3 * -1;
            GRAVADOS4 = GRAVADOS4 * -1;
            GRAVADOS5 = GRAVADOS5 * -1;
            CONSUMO = CONSUMO * -1;
            IVA1 = IVA1 * -1;
            IVA2 = IVA2 * -1;
            IVA3 = IVA3 * -1;
            IVA4 = IVA4 * -1;
            IVA5 = IVA5 * -1;
            SUBTOTAL = TOTAL - EXTRA - IVAMONTO + IVADEC2799;
            NETO = TOTAL - RTFTEMONTO - RTIVAMONTO - RTICAMONTO;
            END
        if (exentos is null) then
            exentos = 0;
        if (gravados1 is null) then
            gravados1 = 0;
        if (gravados2 is null) then
            gravados2 = 0;
        if (gravados3 is null) then
            gravados3 = 0;
        if (gravados4 is null) then
            gravados4 = 0;
        if (gravados5 is null) then
            gravados5 = 0;
        if (basedec2799 is null) then
            basedec2799 = 0;
        FACTOR = 1;
        SELECT AJCI_FACTOR FROM ajuste_cierre WHERE AJCI_PORC = 0 AND AJCI_FECINI <= :FECHA AND AJCI_FECFIN >= :FECHA INTO :FACTOR;
        if (FACTOR IS null) then
            FACTOR = 1;
        if (factor <> 1) then
            ajustar = 'S';
        EXENTOS = EXENTOS * FACTOR;
        FACTOR = 1;
        SELECT AJCI_FACTOR FROM ajuste_cierre, TARIFA_IVA WHERE AJCI_PORC = taiv_porc AND TAIV_COD = 1 AND AJCI_FECINI <= :FECHA AND AJCI_FECFIN >= :FECHA INTO :FACTOR;
        if (FACTOR IS null) then
            FACTOR = 1;
        if (factor <> 1) then
            ajustar = 'S';
        gravados1 = GRAVADOS1 * FACTOR;
        IVA1 = IVA1 * FACTOR;
        FACTOR = 1;
        SELECT AJCI_FACTOR FROM ajuste_cierre, TARIFA_IVA WHERE AJCI_PORC = TAIV_PORC AND TAIV_COD = 2 AND AJCI_FECINI <= :FECHA AND AJCI_FECFIN >= :FECHA INTO :FACTOR;
        if (FACTOR IS null) then
            FACTOR = 1;
        if (factor <> 1) then
            ajustar = 'S';
        gravados2 = GRAVADOS2 * FACTOR;
        IVA2 = IVA2 * FACTOR;
        FACTOR = 1;
        SELECT AJCI_FACTOR FROM ajuste_cierre, TARIFA_IVA WHERE AJCI_PORC = TAIV_PORC AND TAIV_COD = 3 AND AJCI_FECINI <= :FECHA AND AJCI_FECFIN >= :FECHA INTO :FACTOR;
        if (FACTOR IS null) then
            FACTOR = 1;
        if (factor <> 1) then
            ajustar = 'S';
        gravados3 = GRAVADOS3 * FACTOR;
        IVA3 = IVA3 * FACTOR;
        FACTOR = 1;
        SELECT AJCI_FACTOR FROM ajuste_cierre, TARIFA_IVA WHERE AJCI_PORC = TAIV_PORC AND TAIV_COD = 4 AND AJCI_FECINI <= :FECHA AND AJCI_FECFIN >= :FECHA INTO :FACTOR;
        if (FACTOR IS null) then
            FACTOR = 1;
        if (factor <> 1) then
            ajustar = 'S';
        gravados4 = GRAVADOS4 * FACTOR;
        IVA4 = IVA4 * FACTOR;
        FACTOR = 1;
        SELECT AJCI_FACTOR FROM ajuste_cierre, TARIFA_IVA WHERE AJCI_PORC = TAIV_PORC AND TAIV_COD = 5 AND AJCI_FECINI <= :FECHA AND AJCI_FECFIN >= :FECHA INTO :FACTOR;
        if (FACTOR IS null) then
            FACTOR = 1;
        if (factor <> 1) then
            ajustar = 'S';
        gravados5 = GRAVADOS5 * FACTOR;
        IVA5 = IVA5 * FACTOR;
        NUEVO = exentos + gravados1 + gravados2 + gravados3 + GRAVADOS4 + GRAVADOS5;
        if ((TOTAL <> 0) and (ajustar = 'S')) then
            BEGIN
            IVAMONTO = IVA1 + IVA2 + IVA3 + IVA4 + IVA5;
            CONSUMO = CONSUMO * (NUEVO+ivamonto+consumo) / TOTAL;
            SUBTOTAL = SUBTOTAL * (NUEVO+ivamonto+consumo) / TOTAL;
            NETO = NETO * (NUEVO+ivamonto+consumo) / TOTAL;
            rtftemonto = rtftemonto * (NUEVO+ivamonto+consumo) / TOTAL;
            rticamonto = rticamonto * (NUEVO+ivamonto+consumo) / TOTAL;
            rtivamonto = rtivamonto * (NUEVO+ivamonto+consumo) / TOTAL;
            rtcreemonto = rtcreemonto * (NUEVO+ivamonto+consumo) / TOTAL;
            dtomonto = dtomonto * (NUEVO+ivamonto+consumo) / TOTAL;
            adicional = adicional * (NUEVO+ivamonto+consumo) / TOTAL;
            total = total * (NUEVO+ivamonto+consumo) / TOTAL;
            END
        SUSPEND;
        END
    END
execute procedure lee_configuracion ('FACTURACION', 'DOCUMENTOS', 'INCLUIR NOTAS DE CARTERA EN REPORTE DE IMPUESTOS EN VENTAS') returning_values (:NOTAS);
if (NOTAS = 'SI') then
    BEGIN
    TIPO = 41;
    SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 41 INTO :NOMTIPO;
    FOR SELECT NDCL_ID, N.PREF_PRE, NDCL_NUMERO, NDCL_FECHA, N.TERC_NIT, TERC_NOM, 0, NDCL_IVAMONTO, NDCL_RTFTEMONTO,
        NDCL_RTIVAMONTO, NDCL_RTICAMONTO, NDCL_RTCREEM, 0, NDCL_MONTO+NDCL_IVAMONTO, NDCL_ANULADO,
        NDCL_EXENTO, NDCL_BASE1, NDCL_BASE2, NDCL_BASE3, NDCL_IVA1, NDCL_IVA2, NDCL_IVA3
        FROM NOTAS_DEBITO_CLIENTES N, TERCEROS T, PREFIJOS PR WHERE N.TERC_NIT = T.TERC_NIT AND
        NDCL_FECHA >= :FECINI AND NDCL_FECHA <= :FECFIN AND ((:PREFIJO = '') or (:PREFIJO IS NULL) or (N.PREF_PRE = :PREFIJO))
        AND PR.PREF_PRE = N.PREF_PRE AND PR.TIDO_COD = 41 AND ((PR.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
        ORDER BY NDCL_FECHA, N.PREF_PRE, NDCL_NUMERO
        INTO :ID, :PREF, :NUMERO, :FECHA, :NIT, :NOMTERCERO, :DTOMONTO, :IVAMONTO, :RTFTEMONTO,
        :RTIVAMONTO, :RTICAMONTO, :RTCREEMONTO, :EXTRA, :TOTAL, :ANULADO,
        :exentos, :gravados1, :gravados2, :gravados3, :iva1, :iva2, :iva3
        DO
        BEGIN
        CONSUMO = 0;
        GRAVADOS4 = 0;
        GRAVADOS5 = 0;
        IVA4 = 0;
        IVA5 = 0;
        if (ANULADO = 'S') then
            BEGIN
            EXENTOS = 0;
            GRAVADOS1 = 0;
            GRAVADOS2 = 0;
            GRAVADOS3 = 0;
            SUBTOTAL = 0;
            TOTAL = 0;
            EXTRA = 0;
            IVAMONTO = 0;
            IVA1 = 0;
            IVA2 = 0;
            IVA3 = 0;
            DTOMONTO = 0;
            NETO = 0;
            RTFTEMONTO = 0;
            RTIVAMONTO = 0;
            RTICAMONTO = 0;
            RTCREEMONTO = 0;
            END
        ELSE
            BEGIN
            SUBTOTAL = TOTAL - EXTRA - IVAMONTO;
            NETO = TOTAL - RTFTEMONTO - RTIVAMONTO - RTICAMONTO - RTCREEMONTO;
            END
        SUSPEND;
        END

    TIPO = 42;
    SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 42 INTO :NOMTIPO;
    FOR SELECT NCCL_ID, N.PREF_PRE, NCCL_NUMERO, NCCL_FECHA, N.TERC_NIT, TERC_NOM, 0, NCCL_IVAMONTO,
        NCCL_RTFTEMONTO, NCCL_RTIVAMONTO, NCCL_RTICAMONTO, NCCL_RTCREEM, 0, NCCL_MONTO+NCCL_IVAMONTO, NCCL_ANULADO,
        NCCL_EXENTO, NCCL_BASE1, NCCL_BASE2, NCCL_BASE3, NCCL_IVA1, NCCL_IVA2, NCCL_IVA3
        FROM NOTAS_CREDITO_CLIENTES N, TERCEROS T, PREFIJOS PR WHERE N.TERC_NIT = T.TERC_NIT AND
        NCCL_FECHA >= :FECINI AND NCCL_FECHA <= :FECFIN AND ((:PREFIJO = '') or (:PREFIJO IS NULL) or (N.PREF_PRE = :PREFIJO))
        AND PR.PREF_PRE = N.PREF_PRE AND PR.TIDO_COD = 42 AND ((PR.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
        ORDER BY NCCL_FECHA, N.PREF_PRE, NCCL_NUMERO
        INTO :ID, :PREF, :NUMERO, :FECHA, :NIT, :NOMTERCERO, :DTOMONTO, :IVAMONTO,
        :RTFTEMONTO, :RTIVAMONTO, :RTICAMONTO, :RTCREEMONTO, :EXTRA, :TOTAL, :ANULADO,
        :exentos, :gravados1, :gravados2, :gravados3, :iva1, :iva2, :iva3
        DO
        BEGIN
        CONSUMO = 0;
        GRAVADOS4 = 0;
        GRAVADOS5 = 0;
        IVA4 = 0;
        IVA5 = 0;
        if (ANULADO = 'S') then
            BEGIN
            EXENTOS = 0;
            GRAVADOS1 = 0;
            GRAVADOS2 = 0;
            GRAVADOS3 = 0;
            GRAVADOS4 = 0;
            GRAVADOS5 = 0;
            SUBTOTAL = 0;
            TOTAL = 0;
            EXTRA = 0;
            IVAMONTO = 0;
            IVA1 = 0;
            IVA2 = 0;
            IVA3 = 0;
            IVA4 = 0;
            IVA5 = 0;
            DTOMONTO = 0;
            NETO = 0;
            RTFTEMONTO = 0;
            RTIVAMONTO = 0;
            RTICAMONTO = 0;
            RTCREEMONTO = 0;
            END
        ELSE
            BEGIN
            DTOMONTO = DTOMONTO * -1;
            ADICIONAL = ADICIONAL * -1;
            IVAMONTO = IVAMONTO * -1;
            EXTRA = EXTRA * -1;
            TOTAL = TOTAL * -1;
            RTFTEMONTO = RTFTEMONTO * -1;
            RTIVAMONTO = RTIVAMONTO * -1;
            RTICAMONTO = RTICAMONTO * -1;
            RTCREEMONTO = RTCREEMONTO * -1;
            SUBTOTAL = TOTAL - EXTRA - IVAMONTO;
            NETO = TOTAL - RTFTEMONTO - RTIVAMONTO - RTICAMONTO - RTCREEMONTO;
            END
        SUSPEND;
        END
    END
END^

SET TERM ; ^

/* 20140118 */
/* FORMAS DE PAGO SOLO DE DOCUMENTOS ABONADOS EL MISMO DIA
    AUN PUEDE QUEDAR UNA DIFERENCIA SI EN UN MISMO RECIBO SE ABONAN DOCUMENTOS DEL DIA Y DE ANTES */
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),
    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 r_iddoc integer;
declare variable f_id integer;
declare variable f_total numeric(18,2);
declare variable factor numeric(18,4);
declare variable ajuste integer;
declare variable PREFRDC VARCHAR(4);
begin
AJUSTE = 0;
if (PREFIJO <> '') then
  SELECT PREF_PRE, AUTO_NUMERO, AUTO_PREFRDC FROM AUTORIZACIONES WHERE PREF_PRE = :PREFIJO INTO :PREF, :autoriza, :prefrdc;
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 */
  SELECT SUM(RCPA_MONTO) FROM RECIBOS_CAJA_PAGO P, RECIBOS_CAJA R, PUNTO_VENTA PT, RECIBOS_CAJA_DETALLE D, MOVIMIENTO_CLIENTES M
    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 = 1 and RECA_ANULADO = 'N' AND R.reca_id = D.reca_id
    AND 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
    INTO :FORMAP1;
  SELECT SUM(RCPA_MONTO) FROM RECIBOS_CAJA_PAGO P, RECIBOS_CAJA R, PUNTO_VENTA PT, RECIBOS_CAJA_DETALLE D, MOVIMIENTO_CLIENTES M
    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 = 2 and RECA_ANULADO = 'N' AND R.reca_id = D.reca_id
    AND 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
    INTO :FORMAP2;
  SELECT SUM(RCPA_MONTO) FROM RECIBOS_CAJA_PAGO P, RECIBOS_CAJA R, PUNTO_VENTA PT, RECIBOS_CAJA_DETALLE D, MOVIMIENTO_CLIENTES M
    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 = 3 and RECA_ANULADO = 'N' AND R.reca_id = D.reca_id
    AND 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
    INTO :FORMAP3;
  SELECT SUM(RCPA_MONTO) FROM RECIBOS_CAJA_PAGO P, RECIBOS_CAJA R, PUNTO_VENTA PT, RECIBOS_CAJA_DETALLE D, MOVIMIENTO_CLIENTES M
    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 = 4 and RECA_ANULADO = 'N' AND R.reca_id = D.reca_id
    AND 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
    INTO :FORMAP4;
  SELECT SUM(RCPA_MONTO) FROM RECIBOS_CAJA_PAGO P, RECIBOS_CAJA R, PUNTO_VENTA PT, RECIBOS_CAJA_DETALLE D, MOVIMIENTO_CLIENTES M
    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 = 5 and RECA_ANULADO = 'N' AND R.reca_id = D.reca_id
    AND 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
    INTO :FORMAP5;
  SELECT SUM(RCPA_MONTO) FROM RECIBOS_CAJA_PAGO P, RECIBOS_CAJA R, PUNTO_VENTA PT, RECIBOS_CAJA_DETALLE D, MOVIMIENTO_CLIENTES M
    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 = 6 and RECA_ANULADO = 'N' AND R.reca_id = D.reca_id
    AND 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
    INTO :FORMAP6;
  SELECT SUM(RCPA_MONTO) FROM RECIBOS_CAJA_PAGO P, RECIBOS_CAJA R, PUNTO_VENTA PT, RECIBOS_CAJA_DETALLE D, MOVIMIENTO_CLIENTES M
    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 = 7 and RECA_ANULADO = 'N' AND R.reca_id = D.reca_id
    AND 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
    INTO :FORMAP7;
  SELECT SUM(RCPA_MONTO) FROM RECIBOS_CAJA_PAGO P, RECIBOS_CAJA R, PUNTO_VENTA PT, RECIBOS_CAJA_DETALLE D, MOVIMIENTO_CLIENTES M
    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 = 8 and RECA_ANULADO = 'N' AND R.reca_id = D.reca_id
    AND 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
    INTO :FORMAP8;
  SELECT SUM(RCPA_MONTO) FROM RECIBOS_CAJA_PAGO P, RECIBOS_CAJA R, PUNTO_VENTA PT, RECIBOS_CAJA_DETALLE D, MOVIMIENTO_CLIENTES M
    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 = 9 and RECA_ANULADO = 'N' AND R.reca_id = D.reca_id
    AND 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
    INTO :FORMAP9;
  SELECT SUM(RCPA_MONTO) FROM RECIBOS_CAJA_PAGO P, RECIBOS_CAJA R, PUNTO_VENTA PT, RECIBOS_CAJA_DETALLE D, MOVIMIENTO_CLIENTES M
    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 = 10 and RECA_ANULADO = 'N' AND R.reca_id = D.reca_id
    AND 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
    INTO :FORMAP10;
  SELECT SUM(RCPA_MONTO) FROM RECIBOS_CAJA_PAGO P, RECIBOS_CAJA R, PUNTO_VENTA PT, RECIBOS_CAJA_DETALLE D, MOVIMIENTO_CLIENTES M
    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 = 11 and RECA_ANULADO = 'N' AND R.reca_id = D.reca_id
    AND 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
    INTO :FORMAP11;
  SELECT SUM(RCPA_MONTO) FROM RECIBOS_CAJA_PAGO P, RECIBOS_CAJA R, PUNTO_VENTA PT, RECIBOS_CAJA_DETALLE D, MOVIMIENTO_CLIENTES M
    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 = 12 and RECA_ANULADO = 'N' AND R.reca_id = D.reca_id
    AND 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
    INTO :FORMAP12;

  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 (formap1 is null) then
    formap1 = 0;
  if (formap2 is null) then
    formap2 = 0;
  if (formap3 is null) then
    formap3 = 0;
  if (formap4 is null) then
    formap4 = 0;
  if (formap5 is null) then
    formap5 = 0;
  if (formap6 is null) then
    formap6 = 0;
  if (formap7 is null) then
    formap7 = 0;
  if (formap8 is null) then
    formap8 = 0;
  if (formap9 is null) then
    formap9 = 0;
  if (formap10 is null) then
    formap10 = 0;
  if (formap11 is null) then
    formap11 = 0;
  if (formap12 is null) then
    formap12 = 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;
        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 ; ^

/* 20140121 */
/* FACTURACION MASIVA POR SUCURSAL - GRUPO DE CARTERA POR SUCURSAL - REFERENCIA POR ITEM */
ALTER TABLE CLIENTE_SUCURSALES
ADD CLSU_VALORMES T_MONTO;

ALTER TABLE CLIENTE_SUCURSALES
ADD GRCA_COD T_ID;

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 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_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', 'N', :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 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 ; ^


update CLIENTE_SUCURSALES S set GRCA_COD = (select GRCA_COD FROM CLIENTES WHERE TERC_NIT = S.terc_nit)
    WHERE GRCA_COD IS NULL;
COMMIT WORK;

update CLIENTE_SUCURSALES S set CLSU_VALORMES = (select CLIE_VALORMES FROM CLIENTES WHERE TERC_NIT = S.terc_nit)
    WHERE CLSU_VALORMES IS NULL;
COMMIT WORK;

/* 20140121B */
/* VERIFICACION DE ABONO DEL MISMO DIA SOLO SI EXISTE ALGUN DOCUMENTO EN EL RECIBO */
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),
    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 r_iddoc integer;
declare variable f_id integer;
declare variable f_total numeric(18,2);
declare variable factor numeric(18,4);
declare variable ajuste integer;
declare variable PREFRDC VARCHAR(4);
begin
AJUSTE = 0;
if (PREFIJO <> '') then
  SELECT PREF_PRE, AUTO_NUMERO, AUTO_PREFRDC FROM AUTORIZACIONES WHERE PREF_PRE = :PREFIJO INTO :PREF, :autoriza, :prefrdc;
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 */
  SELECT 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 = 1 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 :FORMAP1;
  SELECT 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 = 2 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 :FORMAP2;
  SELECT 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 = 3 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 :FORMAP3;
  SELECT 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 = 4 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 :FORMAP4;
  SELECT 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 = 5 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 :FORMAP5;
  SELECT 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 = 6 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 :FORMAP6;
  SELECT 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 = 7 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 :FORMAP7;
  SELECT 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 = 8 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 :FORMAP8;
  SELECT 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 = 9 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 :FORMAP9;
  SELECT 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 = 10 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 :FORMAP10;
  SELECT 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 = 11 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 :FORMAP11;
  SELECT 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 = 12 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 :FORMAP12;

  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 (formap1 is null) then
    formap1 = 0;
  if (formap2 is null) then
    formap2 = 0;
  if (formap3 is null) then
    formap3 = 0;
  if (formap4 is null) then
    formap4 = 0;
  if (formap5 is null) then
    formap5 = 0;
  if (formap6 is null) then
    formap6 = 0;
  if (formap7 is null) then
    formap7 = 0;
  if (formap8 is null) then
    formap8 = 0;
  if (formap9 is null) then
    formap9 = 0;
  if (formap10 is null) then
    formap10 = 0;
  if (formap11 is null) then
    formap11 = 0;
  if (formap12 is null) then
    formap12 = 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;
        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 ; ^

/* 20140122 */
/* AGREGUE EL CAMPO FECDES AL ACTUALIZAR EL CONSOLIDADO */
SET TERM ^ ;

CREATE OR ALTER procedure RECALCULA_FALTANTES_VENTAS (
    FECINI date,
    FECFIN date)
returns (
    IDF integer,
    IDC integer,
    ARTICULO varchar(20),
    CANT numeric(18,4),
    CANTREL numeric(18,4),
    FACTOR numeric(18,4))
AS
declare variable NUMROWS INTEGER;
declare variable ITEM INTEGER;
declare variable ANULADO CHAR(1);
declare variable FEC DATE;
begin
FOR SELECT FACT_ID, FACT_CONSOLIDA, FACT_ANULADO, FACT_FECHA FROM FACTURAS WHERE FACT_FECHA >= :FECINI AND FACT_FECHA <= :fecfin
    INTO :IDF, :idc, :ANULADO, :FEC
    DO
    BEGIN
    if (ANULADO = 'S') then
        DELETE FROM CONSOLIDADO_FALTANTES WHERE COFA_ID = :IDC;
    ELSE
        UPDATE CONSOLIDADO_FALTANTES SET COFA_CANTCR = 0 where COFA_ID = :IDC;

    FOR SELECT ARTI_COD, FADE_CANT, FADE_FACTOR FROM facturas_detalle WHERE FACT_ID = :IDF and substring(arti_cod from 1 FOR 2) <> '.t' ORDER BY FADE_ITEM
        INTO :ARTICULO, :CANT, :FACTOR
        DO
        BEGIN
        SELECT COUNT(*) FROM CONSOLIDADO_FALTANTES WHERE COFA_ID = :IDC AND ARTI_COD = :articulo AND COFA_CANTCR = 0 INTO :NUMROWS;
        if (NUMROWS <> 0) then
            BEGIN
            FOR select COFA_CANT * COFA_FACTOR, COFA_ITEM FROM consolidado_faltantes WHERE COFA_ID = :IDC AND ARTI_COD = :articulo AND COFA_CANTCR = 0
                INTO :CANTREL, :ITEM
                DO
                BEGIN
                if (CANTREL <= (CANT * FACTOR)) then
                    UPDATE consolidado_faltantes SET COFA_CANTCR = COFA_CANT * COFA_FACTOR, COFA_IDDES = :idf, COFA_FECDES = :fec
                        WHERE COFA_ID = :IDC AND COFA_ITEM = :ITEM;
                else
                    UPDATE consolidado_faltantes SET COFA_CANT = :CANT, COFA_FACTOR = :FACTOR, COFA_CANTCR = COFA_CANT * COFA_FACTOR, COFA_IDDES = :idf, COFA_FECDES = :fec
                        WHERE COFA_ID = :IDC AND COFA_ITEM = :ITEM;
                suspend;
                END
            END
        END
    END
FOR SELECT FACT_ID, FACT_CONSOLIDA FROM FACTURAS WHERE FACT_FECHA >= :FECINI AND FACT_FECHA <= :fecfin
    INTO :IDF, :idc
    DO
    BEGIN
    FOR SELECT ARTI_COD, FADE_CANT, FADE_FACTOR FROM facturas_detalle WHERE FACT_ID = :IDF and substring(arti_cod from 1 FOR 2) <> '.t' ORDER BY FADE_ITEM
        INTO :ARTICULO, :CANT, :FACTOR
        DO
        BEGIN
        SELECT COUNT(*) FROM CONSOLIDADO_FALTANTES WHERE COFA_ID = :IDC AND ARTI_COD = :articulo AND COFA_CANTCR = 0 INTO :NUMROWS;
        if (NUMROWS <> 0) then
            BEGIN
            FOR select COFA_CANT * COFA_FACTOR, COFA_ITEM FROM consolidado_faltantes WHERE COFA_ID = :IDC AND ARTI_COD = :articulo AND COFA_CANTCR = 0
                INTO :CANTREL, :ITEM
                DO
                BEGIN
                if (CANTREL <= (CANT * FACTOR)) then
                    UPDATE consolidado_faltantes SET COFA_CANTCR = COFA_CANT * COFA_FACTOR, COFA_IDDES = :idf, COFA_FECDES = :fec
                        WHERE COFA_ID = :IDC AND COFA_ITEM = :ITEM;
                else
                    UPDATE consolidado_faltantes SET COFA_CANT = :CANT, COFA_FACTOR = :FACTOR, COFA_CANTCR = COFA_CANT * COFA_FACTOR, COFA_IDDES = :idf, COFA_FECDES = :fec
                        WHERE COFA_ID = :IDC AND COFA_ITEM = :ITEM;
                suspend;
                END
            END
        END
    END
end^

SET TERM ; ^

/* 20140122b */
/* AJUSTE EL VALOR DE LA FP CON ABONOS DEL MISMO DIA MEZCLADOS EN RECIBOS DE VARIOS DOCUMENTOS */
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),
    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 r_iddoc integer;
declare variable f_id integer;
declare variable f_total numeric(18,2);
declare variable factor numeric(18,4);
declare variable ajuste integer;
declare variable PREFRDC VARCHAR(4);
declare variable otrabo numeric(18,4);
begin
AJUSTE = 0;
if (PREFIJO <> '') then
  SELECT PREF_PRE, AUTO_NUMERO, AUTO_PREFRDC FROM AUTORIZACIONES WHERE PREF_PRE = :PREFIJO INTO :PREF, :autoriza, :prefrdc;
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 */
  SELECT 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 = 1 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 :FORMAP1;
  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 = 1 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;
  FORMAP1 = FORMAP1 + OTRABO;
  SELECT 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 = 2 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 :FORMAP2;
  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 = 2 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;
  FORMAP2 = FORMAP2 + OTRABO;
  SELECT 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 = 3 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 :FORMAP3;
  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 = 3 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;
  FORMAP3 = FORMAP3 + OTRABO;
  SELECT 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 = 4 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 :FORMAP4;
  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 = 4 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;
  FORMAP4 = FORMAP4 + OTRABO;
  SELECT 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 = 5 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 :FORMAP5;
  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 = 5 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;
  FORMAP5 = FORMAP5 + OTRABO;
  SELECT 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 = 6 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 :FORMAP6;
  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 = 6 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;
  FORMAP6 = FORMAP6 + OTRABO;
  SELECT 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 = 7 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 :FORMAP7;
  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 = 7 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;
  FORMAP7 = FORMAP7 + OTRABO;
  SELECT 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 = 8 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 :FORMAP8;
  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 = 8 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;
  FORMAP8 = FORMAP8 + OTRABO;
  SELECT 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 = 9 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 :FORMAP9;
  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 = 9 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;
  FORMAP9 = FORMAP9 + OTRABO;
  SELECT 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 = 10 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 :FORMAP10;
  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 = 10 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;
  FORMAP10 = FORMAP10 + OTRABO;
  SELECT 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 = 11 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 :FORMAP11;
  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 = 11 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;
  FORMAP11 = FORMAP11 + OTRABO;
  SELECT 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 = 12 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 :FORMAP12;
  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 = 12 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;
  FORMAP12 = FORMAP12 + OTRABO;

  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 (formap1 is null) then
    formap1 = 0;
  if (formap2 is null) then
    formap2 = 0;
  if (formap3 is null) then
    formap3 = 0;
  if (formap4 is null) then
    formap4 = 0;
  if (formap5 is null) then
    formap5 = 0;
  if (formap6 is null) then
    formap6 = 0;
  if (formap7 is null) then
    formap7 = 0;
  if (formap8 is null) then
    formap8 = 0;
  if (formap9 is null) then
    formap9 = 0;
  if (formap10 is null) then
    formap10 = 0;
  if (formap11 is null) then
    formap11 = 0;
  if (formap12 is null) then
    formap12 = 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;
        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 ; ^

/* 20140123 */
/* NO CONTABILICE AJUSTES SIN CONFIRMAR */
SET TERM ^ ;

CREATE OR ALTER procedure DOCUMENTOS_SIN_CONTABILIZAR (
    FECINI date,
    FECFIN date)
returns (
    TIPO varchar(10),
    PREFIJO varchar(4),
    NUMERO varchar(8),
    FECHA date,
    ID integer,
    TIDO integer,
    CTABCO integer)
AS
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);
CTABCO = 0;
TIPO = 'ENTRADA';
TIDO = 11;
FOR SELECT ENTR_ID FROM ENTRADAS
    WHERE ENTR_ANULADO = 'N' AND ENTR_FECHA >= :FECINI AND ENTR_FECHA <= :FECFIN
    INTO :ID
DO
begin
  IDREF = null;
  SELECT first 1 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
    SELECT PREF_PRE, ENTR_NUMERO, ENTR_FECHA FROM ENTRADAS WHERE ENTR_ID = :ID INTO :PREFIJO, :NUMERO, :FECHA;
    suspend;
   end
end
TIPO = 'SALIDA';
TIDO = 12;
FOR SELECT first 1 SALI_ID FROM SALIDAS
    WHERE SALI_ANULADO = 'N' AND SALI_FECHA >= :FECINI AND SALI_FECHA <= :FECFIN
    INTO :ID
DO
begin
  IDREF = null;
  SELECT first 1 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
    SELECT PREF_PRE, SALI_NUMERO, SALI_FECHA FROM SALIDAS WHERE SALI_ID = :ID INTO :PREFIJO, :NUMERO, :FECHA;
    suspend;
   end
end
TIPO = 'TRASLADO';
TIDO = 13;
FOR SELECT TRAN_ID FROM TRASFERENCIAS
    WHERE TRAN_ANULADO = 'N' AND TRAN_FECHA >= :FECINI AND TRAN_FECHA <= :FECFIN
    INTO :ID
DO
begin
  IDREF = null;
  SELECT first 1 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
    SELECT PREF_PRE, TRAN_NUMERO, TRAN_FECHA FROM TRASFERENCIAS WHERE TRAN_ID = :ID INTO :PREFIJO, :NUMERO, :FECHA;
    suspend;
   end
end
TIPO = 'AJUS INV.';
TIDO = 14;
FOR SELECT AJUS_ID FROM AJUSTES
    WHERE AJUS_ANULADO = 'N' AND AJUS_NOAJUSTAR = 'N' AND AJUS_FECHA >= :FECINI AND AJUS_FECHA <= :FECFIN
    INTO :ID
DO
begin
  IDREF = null;
  SELECT first 1 ENCO_IDREF FROM COMPROBANTE_ENCABEZADO WHERE ENCO_TIPOREF = 14 AND ENCO_FECHA >= :FECICNT AND ENCO_FECHA <= :FECFCNT AND ENCO_IDREF = :ID INTO :IDREF;
  if (IDREF IS NULL) then
   begin
    SELECT PREF_PRE, AJUS_NUMERO, AJUS_FECHA FROM AJUSTES WHERE AJUS_ID = :ID INTO :PREFIJO, :NUMERO, :FECHA;
    suspend;
   end
end
TIPO = 'ENSAMBLE';
TIDO = 15;
FOR SELECT ENSA_ID FROM ENSAMBLES
    WHERE ENSA_ANULADO = 'N' AND ENSA_FECHA >= :FECINI AND ENSA_FECHA <= :FECFIN
    INTO :ID
DO
begin
  IDREF = null;
  SELECT first 1 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
    SELECT PREF_PRE, ENSA_NUMERO, ENSA_FECHA FROM ENSAMBLES WHERE ENSA_ID = :ID INTO :PREFIJO, :NUMERO, :FECHA;
    suspend;
   end
end
TIPO = 'DESENSAMB.';
TIDO = 16;
FOR SELECT DESE_ID FROM DESENSAMBLES
    WHERE DESE_ANULADO = 'N' AND DESE_FECHA >= :FECINI AND DESE_FECHA <= :FECFIN
    INTO :ID
DO
begin
  IDREF = null;
  SELECT first 1 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
    SELECT PREF_PRE, DESE_NUMERO, DESE_FECHA FROM DESENSAMBLES WHERE DESE_ID = :ID INTO :PREFIJO, :NUMERO, :FECHA;
    suspend;
   end
end
TIPO = 'FAC.COMPRA';
TIDO = 21;
FOR SELECT FACO_ID FROM FACTURAS_COMPRA
    WHERE FACO_ANULADO = 'N' AND FACO_FECHA >= :FECINI AND FACO_FECHA <= :FECFIN
    INTO :ID
DO
begin
  IDREF = null;
  SELECT first 1 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
    SELECT PREF_PRE, FACO_NUMERO, FACO_FECHA FROM FACTURAS_COMPRA WHERE FACO_ID = :ID INTO :PREFIJO, :NUMERO, :FECHA;
    suspend;
   end
end
TIPO = 'DEV.COMPRA';
TIDO = 24;
FOR SELECT DVCO_ID FROM DEVOLUCIONES_COMPRAS
    WHERE DVCO_ANULADO = 'N' AND DVCO_FECHA >= :FECINI AND DVCO_FECHA <= :FECFIN
    INTO :ID
DO
begin
  IDREF = null;
  SELECT first 1 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
    SELECT PREF_PRE, DVCO_NUMERO, DVCO_FECHA FROM DEVOLUCIONES_COMPRAS WHERE DVCO_ID = :ID INTO :PREFIJO, :NUMERO, :FECHA;
    suspend;
   end
end
TIPO = 'FACT.VENTA';
TIDO = 31;
FOR SELECT FACT_ID FROM FACTURAS
    WHERE FACT_ANULADO = 'N' AND FACT_FECHA >= :FECINI AND FACT_FECHA <= :FECFIN AND PREF_PRE NOT IN (SELECT PREF_PRE FROM AUTORIZACIONES WHERE AUTO_CONTADO = 'S')
    INTO :ID
DO
begin
  IDREF = null;
  SELECT first 1 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
    SELECT PREF_PRE, FACT_NUMERO, FACT_FECHA FROM FACTURAS WHERE FACT_ID = :ID INTO :PREFIJO, :NUMERO, :FECHA;
    suspend;
   end
end
TIPO = 'DEV.VENTA';
TIDO = 33;
FOR SELECT DEVT_ID FROM DEVOLUCIONES_VENTAS
    WHERE DEVT_ANULADO = 'N' AND ((DEVT_REMID = 0) or (DEVT_REMID IS NULL)) AND DEVT_FECHA >= :FECINI AND DEVT_FECHA <= :FECFIN
    INTO :ID
DO
begin
  IDREF = null;
  SELECT first 1 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
    SELECT PREF_PRE, DEVT_NUMERO, DEVT_FECHA FROM DEVOLUCIONES_VENTAS WHERE DEVT_ID = :ID INTO :PREFIJO, :NUMERO, :FECHA;
    suspend;
   end
end
TIPO = 'NOTADB.CLI';
TIDO = 41;
FOR SELECT NDCL_ID FROM NOTAS_DEBITO_CLIENTES
    WHERE NDCL_ANULADO = 'N' AND NDCL_FECHA >= :FECINI AND NDCL_FECHA <= :FECFIN
    INTO :ID
DO
begin
  IDREF = null;
  SELECT first 1 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
    SELECT PREF_PRE, NDCL_NUMERO, NDCL_FECHA FROM NOTAS_DEBITO_CLIENTES WHERE NDCL_ID = :ID INTO :PREFIJO, :NUMERO, :FECHA;
    suspend;
   end
end
TIPO = 'NOTACR.CLI';
TIDO = 42;
FOR SELECT NCCL_ID FROM NOTAS_CREDITO_CLIENTES
    WHERE NCCL_ANULADO = 'N' AND NCCL_FECHA >= :FECINI AND NCCL_FECHA <= :FECFIN
    INTO :ID
DO
begin
  IDREF = null;
  SELECT first 1 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
    SELECT PREF_PRE, NCCL_NUMERO, NCCL_FECHA FROM NOTAS_CREDITO_CLIENTES WHERE NCCL_ID = :ID INTO :PREFIJO, :NUMERO, :FECHA;
    suspend;
   end
end
TIPO = 'APLICA CLI';
TIDO = 43;
FOR SELECT APCL_ID FROM aplicacion_cliente
    WHERE APCL_ANULADO = 'N' AND APCL_FECHA >= :FECINI AND APCL_FECHA <= :FECFIN
    INTO :ID
DO
begin
  IDREF = null;
  SELECT first 1 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
    SELECT PREF_PRE, APCL_NUMERO, APCL_FECHA FROM aplicacion_cliente WHERE APCL_ID = :ID INTO :PREFIJO, :NUMERO, :FECHA;
    suspend;
   end
end
TIPO = 'CAUSA.CXP';
TIDO = 51;
FOR SELECT NDPR_ID FROM NOTAS_DEBITO_PROVEEDOR
    WHERE NDPR_ANULADO = 'N' AND NDPR_FECHA >= :FECINI AND NDPR_FECHA <= :FECFIN
    INTO :ID
DO
begin
  IDREF = null;
  SELECT first 1 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
    SELECT PREF_PRE, NDPR_NUMERO, NDPR_FECHA FROM NOTAS_DEBITO_PROVEEDOR WHERE NDPR_ID = :ID INTO :PREFIJO, :NUMERO, :FECHA;
    suspend;
   end
end
TIPO = 'DESCTO.CXP';
TIDO = 52;
FOR SELECT NCPR_ID FROM NOTAS_CREDITO_PROVEEDOR
    WHERE NCPR_ANULADO = 'N' AND NCPR_FECHA >= :FECINI AND NCPR_FECHA <= :FECFIN
    INTO :ID
DO
begin
  IDREF = null;
  SELECT first 1 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
    SELECT PREF_PRE, NCPR_NUMERO, NCPR_FECHA FROM NOTAS_CREDITO_PROVEEDOR WHERE NCPR_ID = :ID INTO :PREFIJO, :NUMERO, :FECHA;
    suspend;
   end
end
TIPO = 'APLICA PRV';
TIDO = 53;
FOR SELECT APPR_ID FROM aplicacion_provedor
    WHERE APPR_ANULADO = 'N' AND APPR_FECHA >= :FECINI AND APPR_FECHA <= :FECFIN
    INTO :ID
DO
begin
  IDREF = null;
  SELECT first 1 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
    SELECT PREF_PRE, APPR_NUMERO, APPR_FECHA FROM aplicacion_provedor WHERE APPR_ID = :ID INTO :PREFIJO, :NUMERO, :FECHA;
    suspend;
   end
end
/* EXCLUYA LOS DE PREFIJO PARA IGUAL VENTAS DE CONTADO */
TIPO = 'RECI.CAJA';
TIDO = 61;
FOR SELECT RECA_ID 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 WHERE AUTO_CONTADO = 'S')
    INTO :ID
DO
begin
  IDREF = null;
  SELECT first 1 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
    SELECT PREF_PRE, RECA_NUMERO, RECA_FECHA FROM RECIBOS_CAJA WHERE RECA_ID = :ID INTO :PREFIJO, :NUMERO, :FECHA;
    suspend;
   end
end
TIPO = 'EGRESOS';
TIDO = 62;
FOR SELECT EGRE_ID FROM EGRESOS
    WHERE EGRE_ANULADO = 'N' AND EGRE_FECHA >= :FECINI AND EGRE_FECHA <= :FECFIN
    INTO :ID
DO
begin
  IDREF = null;
  SELECT first 1 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
    SELECT PREF_PRE, EGRE_NUMERO, EGRE_FECHA FROM EGRESOS WHERE EGRE_ID = :ID INTO :PREFIJO, :NUMERO, :FECHA;
    suspend;
   end
end
TIPO = 'CONS.TARJ.';
TIDO = 64;
FOR SELECT COTJ_ID FROM CONSIGNA_TARJETAS
    WHERE COTJ_ANULADO = 'N' AND COTJ_FECHA >= :FECINI AND COTJ_FECHA <= :FECFIN
    INTO :ID
DO
begin
  IDREF = null;
  SELECT first 1 ENCO_IDREF FROM COMPROBANTE_ENCABEZADO WHERE ENCO_TIPOREF = 64 AND ENCO_FECHA >= :FECICNT AND ENCO_FECHA <= :FECFCNT AND ENCO_IDREF = :ID INTO :IDREF;
  if (IDREF IS NULL) then
   begin
    SELECT PREF_PRE,COTJ_NUMERO, COTJ_FECHA FROM CONSIGNA_TARJETAS WHERE COTJ_ID = :ID INTO :PREFIJO, :NUMERO, :FECHA;
    suspend;
   end
end
TIPO = 'TR. CAJA';
TIDO = 66;
FOR SELECT TRCJ_ID FROM TRASLADOS_CAJA
    WHERE TRCJ_ANULADO = 'N' AND TRCJ_FECHA >= :FECINI AND TRCJ_FECHA <= :FECFIN
    INTO :ID
DO
begin
  IDREF = null;
  SELECT first 1 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
    SELECT PREF_PRE, TRCJ_NUMERO, TRCJ_FECHA FROM TRASLADOS_CAJA WHERE TRCJ_ID = :ID INTO :PREFIJO, :NUMERO, :FECHA;
    suspend;
   end
end
TIPO = 'CONSIGNA';
TIDO = 71;
FOR SELECT CONS_ID FROM CONSIGNA
    WHERE CONS_ANULADO = 'N' AND CONS_FECHA >= :FECINI AND CONS_FECHA <= :FECFIN
    INTO :ID
DO
begin
  IDREF = null;
  SELECT first 1 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
    SELECT PRBA_PREF, CONS_NUMERO, CONS_FECHA, CUBA_COD FROM CONSIGNA WHERE CONS_ID = :ID INTO :PREFIJO, :NUMERO, :FECHA, :CTABCO;
    suspend;
   end
end
TIPO = 'CARGO BCO';
TIDO = 74;
FOR SELECT NDBC_ID FROM NOTAS_DEBITO
    WHERE NDBC_ANULADO = 'N' AND NDBC_FECHA >= :FECINI AND NDBC_FECHA <= :FECFIN
    INTO :ID
DO
begin
  IDREF = null;
  SELECT first 1 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
    SELECT PRBA_PREF, NDBC_NUMERO, NDBC_FECHA, CUBA_COD FROM NOTAS_DEBITO WHERE NDBC_ID = :ID INTO :PREFIJO, :NUMERO, :FECHA, :CTABCO;
    suspend;
   end
end
TIPO = 'ABONO BCO';
TIDO = 75;
FOR SELECT NCBC_ID FROM NOTAS_CREDITO
    WHERE NCBC_ANULADO = 'N' AND NCBC_FECHA >= :FECINI AND NCBC_FECHA <= :FECFIN
    INTO :ID
DO
begin
  IDREF = null;
  SELECT first 1 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
    SELECT PRBA_PREF, NCBC_NUMERO, NCBC_FECHA, CUBA_COD FROM NOTAS_CREDITO WHERE NCBC_ID = :ID INTO :PREFIJO, :NUMERO, :FECHA, :CTABCO;
    suspend;
   end
end
TIPO = 'TRAS.BANCO';
TIDO = 76;
FOR SELECT TRAS_ID FROM TRASLADOS
    WHERE TRAS_ANULADO = 'N' AND TRAS_FECHA >= :FECINI AND TRAS_FECHA <= :FECFIN
    INTO :ID
DO
begin
  IDREF = null;
  SELECT first 1 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
    SELECT PRBA_PREF, TRAS_NUMERO, TRAS_FECHA, CUBA_COD FROM TRASLADOS WHERE TRAS_ID = :ID INTO :PREFIJO, :NUMERO, :FECHA, :CTABCO;
    suspend;
   end
end
TIPO = 'DEVOL.CHQ.';
TIDO = 77;
FOR SELECT DVCH_ID FROM DEVOLUCION_CHEQUES
    WHERE DVCH_ANULADO = 'N' AND DVCH_FECHA >= :FECINI AND DVCH_FECHA <= :FECFIN
    INTO :ID
DO
begin
  IDREF = null;
  SELECT first 1 ENCO_IDREF FROM COMPROBANTE_ENCABEZADO WHERE ENCO_TIPOREF = 77 AND ENCO_FECHA >= :FECICNT AND ENCO_FECHA <= :FECFCNT AND ENCO_IDREF = :ID INTO :IDREF;
  if (IDREF IS NULL) then
   begin
    SELECT PRBA_PREF, DVCH_NUMDOC, DVCH_FECHA, CUBA_COD FROM DEVOLUCION_CHEQUES WHERE DVCH_ID = :ID INTO :PREFIJO, :NUMERO, :FECHA, :CTABCO;
    suspend;
   end
end
end^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER procedure CONTABIL_AJUSTE (
    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 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 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 NOAJUSTAR CHAR(1);
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
    DELETE FROM contabilizacion WHERE CNTB_TIPOREF = 14 AND CNTB_IDREF = :IDDOC;

    /* TRAIGA EL ENCABEZADO DEL AJUSTE */
    SELECT PREF_PRE, AJUS_NUMERO, AJUS_FECHA, AJUS_CONC, AJUS_ANULADO, AJUS_NOAJUSTAR
        FROM AJUSTES
        WHERE AJUS_ID = :IDDOC
        INTO :PREFIJO, :NUMERO, :FECAUX, :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;
        /* 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, '', 14, :IDDOC, :PREFIJO, :NUMERO, 'N');
        NUMITEMS = 0;
        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 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
                    VRBASE = MONTO;
                    /* TRAIGA LAS CARACTERISTICAS DE LA CUENTA */
                    SELECT CUEN_COD, CUEN_TERCERO, CUEN_CENTRO, CUEN_TIPO
                        FROM CUENTAS
                        WHERE CUEN_COD = :CTABASE
                        INTO :CUENTA, :ES_TERCERO, :ES_CENTRO, :TIPOCUEN;
                    if (CUENTA IS NULL) then
                        begin
                        EXECUTE PROCEDURE ERRORINT (14, :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 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 (14, :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 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
                    VRBASE = MONTO;
                    /* TRAIGA LAS CARACTERISTICAS DE LA CUENTA */
                    SELECT CUEN_COD, CUEN_TERCERO, CUEN_CENTRO, CUEN_TIPO
                        FROM CUENTAS
                        WHERE CUEN_COD = :CTABASE
                        INTO :CUENTA, :ES_TERCERO, :ES_CENTRO, :TIPOCUEN;
                    if (CUENTA IS NULL) then
                        begin
                        EXECUTE PROCEDURE ERRORINT (14, :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 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 (14, :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
                    WHERE CUEN_COD = :CTABASE
                    INTO :CUENTA, :ES_TERCERO, :ES_CENTRO, :TIPOCUEN;
                if (CUENTA IS NULL) then
                    begin
                    EXECUTE PROCEDURE ERRORINT (14, :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 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 (14, :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
                    WHERE CUEN_COD = :CTABASE
                    INTO :CUENTA, :ES_TERCERO, :ES_CENTRO, :TIPOCUEN;
                if (CUENTA IS NULL) then
                    begin
                    EXECUTE PROCEDURE ERRORINT (14, :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 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 (14, :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
                    WHERE CUEN_COD = :CUENTAADIC
                    INTO :CUENTA, :ES_TERCERO, :ES_CENTRO, :TIPOCUEN;
                if (CUENTA IS NULL) then
                    begin
                    EXECUTE PROCEDURE ERRORINT (14, :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 (14, :IDDOC, :CUENTA, 3);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    EXECUTE PROCEDURE ERRORINT (14, :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
                WHERE CUEN_COD = :CTACIERRE
                INTO :CUENTA, :ES_TERCERO, :ES_CENTRO, :TIPOCUEN;
            if (CUENTA IS NULL) then
                begin
                EXECUTE PROCEDURE ERRORINT (14, :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 (14, :IDDOC, :CUENTA, 3);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                EXECUTE PROCEDURE ERRORINT (14, :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 (14, :IDDOC, :PREFIJO, 1);
    ERROR = ERROR + 1;
    VER = 'S';
    END
SUSPEND;
END^

SET TERM ; ^

/* 20140127 */
/* RTCREE EN FACTURACION MASIVA */
SET TERM ^ ;

CREATE OR ALTER procedure FACTURAR_CONCEPTOS (
    ID integer,
    NITINI varchar(20) character set NONE,
    NITFIN varchar(20) character set NONE,
    AGRINI varchar(20) character set NONE,
    AGRFIN varchar(20) character set NONE,
    AGRUPA integer,
    FECHA date,
    REFER varchar(60) character set NONE,
    FECINI date,
    FECFIN date,
    MORA numeric(9,4))
returns (
    PREFIJO varchar(4) character set NONE,
    NUMERO varchar(8) character set NONE,
    NIT varchar(20) character set NONE,
    SUCURSAL varchar(10) character set NONE,
    NOMBRE varchar(60) character set NONE,
    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
    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
    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_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', 'N', :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;
            RTICAM = BASE * RTICA / 1000;
            RTIVAM = IVAM * RTIVA / 100;
            RTCREEM = BASE * RTCREE / 100;
            END
        ELSE
            BEGIN
            RTFTEM = 0;
            RTICAM = 0;
            RTIVAM = 0;
            RTCREEM = 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);
        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  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 ; ^

/* 20140127D */
/* string truncation ctaini y ctafin 3 c */
SET TERM ^ ;

CREATE OR ALTER procedure REP_CONSECUTIVOS_BANCOS (
    TIPO integer,
    CTAINI varchar(3) character set NONE,
    CTAFIN varchar(3) character set NONE,
    PREINI varchar(4) character set NONE,
    PREFIN varchar(4) character set NONE,
    NUMINI varchar(8) character set NONE,
    NUMFIN varchar(8) character set NONE,
    DETALLE char(1) character set NONE,
    ANULADOS char(1) character set NONE)
returns (
    NOMTIPO varchar(30) character set NONE,
    CUENTA varchar(3) character set NONE,
    NROCUENTA varchar(20) character set NONE,
    PREFIJO varchar(4) character set NONE,
    NUMERO varchar(8) character set NONE,
    FECHA date,
    CONCEPTO varchar(60) character set NONE,
    BENEFICIARIO varchar(60) character set NONE,
    MONTO numeric(18,2),
    FORMAPAGO varchar(30) character set NONE,
    FPBANCO varchar(2) character set NONE,
    FPCUENTA varchar(20) character set NONE,
    FPNUMERO varchar(10) character set NONE,
    FPFECHA date,
    ANULADO char(1) character set NONE)
AS
declare variable ID INTEGER;
BEGIN
  if (TIPO = 71) then
    BEGIN
    /* CONSIGNACION */
    FOR SELECT CONS_ID, TIDO_NOMLARGO, PRBA_PREF, CONS_NUMERO, CONS_FECHA, CONS_CONCEPTO, '', CUBA_CODCTA, CUBA_NUMERO, CONS_ANULADO
        FROM CONSIGNA C, TIPO_DOCUMENTO T, CUENTAS_BANCO CU
        WHERE C.CUBA_COD = CU.CUBA_COD AND T.TIDO_COD = 71 AND PRBA_PREF >= :PREINI AND PRBA_PREF <= :PREFIN AND CONS_NUMERO >= :NUMINI AND CONS_NUMERO <= :NUMFIN AND CUBA_CODCTA >= :CTAINI AND CUBA_CODCTA <= :CTAFIN
        ORDER BY C.CUBA_COD, PRBA_PREF, CONS_NUMERO
        INTO :ID, :NOMTIPO, :PREFIJO, :NUMERO, :FECHA, :CONCEPTO, :BENEFICIARIO, :CUENTA, :NROCUENTA, :ANULADO
        DO
          if ((ANULADO = 'N') or (ANULADOS = 'S')) then
            BEGIN
            if (DETALLE = 'S') then
                FOR SELECT FOPA_NOM, CODE_BANCO, CODE_CUENTA, CODE_NUMERO, CODE_FECHA, CODE_MONTO
                    FROM CONSIGNA_DETALLE D, FORMAS_PAGO F
                    WHERE F.FOPA_ID = D.FOPA_ID AND CONS_ID = :ID
                    ORDER BY CODE_ITEM2
                    INTO :FORMAPAGO, :FPBANCO, :FPCUENTA, :FPNUMERO, :FPFECHA, :MONTO
                    DO
                        SUSPEND;
            ELSE
                BEGIN
                SELECT SUM(CODE_MONTO) FROM CONSIGNA_DETALLE
                    WHERE CONS_ID = :ID INTO :MONTO;
                SUSPEND;
                END
            END
    END
  if (TIPO = 72) then
    BEGIN
    /* CHEQUE */
    FOR SELECT CHEQ_ID, TIDO_NOMLARGO, PRBA_PREF, CHEQ_NUMERO, CHEQ_FECHA, CHEQ_CONCEPTO, CHEQ_BENEF, CUBA_CODCTA, CUBA_NUMERO, CHEQ_MONTO, CHEQ_ANULADO
        FROM CHEQUES C, TIPO_DOCUMENTO T, CUENTAS_BANCO CU
        WHERE C.CUBA_COD = CU.CUBA_COD AND T.TIDO_COD = 72 AND PRBA_PREF >= :PREINI AND PRBA_PREF <= :PREFIN AND CHEQ_NUMERO >= :NUMINI AND CHEQ_NUMERO <= :NUMFIN AND CUBA_CODCTA >= :CTAINI AND CUBA_CODCTA <= :CTAFIN
        ORDER BY C.CUBA_COD, PRBA_PREF, CHEQ_NUMERO
        INTO :ID, :NOMTIPO, :PREFIJO, :NUMERO, :FECHA, :CONCEPTO, :BENEFICIARIO, :CUENTA, :NROCUENTA, :MONTO, :ANULADO
        DO
          if ((ANULADO = 'N') or (ANULADOS = 'S')) then
            SUSPEND;
    END
  if (TIPO = 73) then
    BEGIN
    /* RETIROS */
    FOR SELECT RETI_ID, TIDO_NOMLARGO, PRBA_PREF, RETI_NUMERO, RETI_FECHA, RETI_CONCEPTO, RETI_BENEF, CUBA_CODCTA, CUBA_NUMERO, RETI_MONTO, RETI_ANULADO
        FROM RETIROS R, TIPO_DOCUMENTO T, CUENTAS_BANCO CU
        WHERE R.CUBA_COD = CU.CUBA_COD AND T.TIDO_COD = 73 AND PRBA_PREF >= :PREINI AND PRBA_PREF <= :PREFIN AND RETI_NUMERO >= :NUMINI AND RETI_NUMERO <= :NUMFIN AND CUBA_CODCTA >= :CTAINI AND CUBA_CODCTA <= :CTAFIN
        ORDER BY R.CUBA_COD, PRBA_PREF, RETI_NUMERO
        INTO :ID, :NOMTIPO, :PREFIJO, :NUMERO, :FECHA, :CONCEPTO, :BENEFICIARIO, :CUENTA, :NROCUENTA, :MONTO, :ANULADO
        DO
          if ((ANULADO = 'N') or (ANULADOS = 'S')) then
            SUSPEND;
    END
  if (TIPO = 74) then
    BEGIN
    /* NOTAS DEBITO */
    FOR SELECT NDBC_ID, TIDO_NOMLARGO, PRBA_PREF, NDBC_NUMERO, NDBC_FECHA, NDBC_CONCEPTO, '', CUBA_CODCTA, CUBA_NUMERO, NDBC_MONTO, NDBC_ANULADO
        FROM NOTAS_DEBITO N, TIPO_DOCUMENTO T, CUENTAS_BANCO CU
        WHERE N.CUBA_COD = CU.CUBA_COD AND T.TIDO_COD = 74 AND PRBA_PREF >= :PREINI AND PRBA_PREF <= :PREFIN AND NDBC_NUMERO >= :NUMINI AND NDBC_NUMERO <= :NUMFIN AND CUBA_CODCTA >= :CTAINI AND CUBA_CODCTA <= :CTAFIN
        ORDER BY N.CUBA_COD, PRBA_PREF, NDBC_NUMERO
        INTO :ID, :NOMTIPO, :PREFIJO, :NUMERO, :FECHA, :CONCEPTO, :BENEFICIARIO, :CUENTA, :NROCUENTA, :MONTO, :ANULADO
        DO
          if ((ANULADO = 'N') or (ANULADOS = 'S')) then
            SUSPEND;
    END
  if (TIPO = 75) then
    BEGIN
    /* NOTAS CREDITO */
    FOR SELECT NCBC_ID, TIDO_NOMLARGO, PRBA_PREF, NCBC_NUMERO, NCBC_FECHA, NCBC_CONCEPTO, '', CUBA_CODCTA, CUBA_NUMERO, NCBC_MONTO, NCBC_ANULADO
        FROM NOTAS_CREDITO N, TIPO_DOCUMENTO T, CUENTAS_BANCO CU
        WHERE N.CUBA_COD = CU.CUBA_COD AND T.TIDO_COD = 75 AND PRBA_PREF >= :PREINI AND PRBA_PREF <= :PREFIN AND NCBC_NUMERO >= :NUMINI AND NCBC_NUMERO <= :NUMFIN AND CUBA_CODCTA >= :CTAINI AND CUBA_CODCTA <= :CTAFIN
        ORDER BY N.CUBA_COD, PRBA_PREF, NCBC_NUMERO
        INTO :ID, :NOMTIPO, :PREFIJO, :NUMERO, :FECHA, :CONCEPTO, :BENEFICIARIO, :CUENTA, :NROCUENTA, :MONTO, :ANULADO
        DO
          if ((ANULADO = 'N') or (ANULADOS = 'S')) then
            SUSPEND;
    END
  if (TIPO = 76) then
    BEGIN
    /* TRASLADOS */
    FOR SELECT TRAS_ID, TIDO_NOMLARGO, PRBA_PREF, TRAS_NUMERO, TRAS_FECHA, TRAS_CONCEPTO, C2.CUBA_CODCTA || '-' || C2.CUBA_NUMERO, CU.CUBA_CODCTA, CU.CUBA_NUMERO, TRAS_MONTO, TRAS_ANULADO
        FROM TRASLADOS TR, TIPO_DOCUMENTO T, CUENTAS_BANCO CU, CUENTAS_BANCO C2
        WHERE TR.CUBA_COD = CU.CUBA_COD AND T.TIDO_COD = 76 AND PRBA_PREF >= :PREINI AND PRBA_PREF <= :PREFIN AND TRAS_NUMERO >= :NUMINI AND TRAS_NUMERO <= :NUMFIN AND CU.CUBA_CODCTA >= :CTAINI AND CU.CUBA_CODCTA <= :CTAFIN AND TR.TRAS_CTADEST = C2.CUBA_COD
        ORDER BY TR.CUBA_COD, PRBA_PREF, TRAS_NUMERO
        INTO :ID, :NOMTIPO, :PREFIJO, :NUMERO, :FECHA, :CONCEPTO, :BENEFICIARIO, :CUENTA, :NROCUENTA, :MONTO, :ANULADO
        DO
          if ((ANULADO = 'N') or (ANULADOS = 'S')) then
            SUSPEND;
    END
  if (TIPO = 77) then
    BEGIN
    /* DEVOLUCIONES */
    FOR SELECT DVCH_ID, TIDO_NOMLARGO, PRBA_PREF, DVCH_NUMDOC, DVCH_FECHA, DVCH_CONC, DVCH_NOMTERC, CUBA_CODCTA, CUBA_NUMERO, DVCH_MONTO, DVCH_ANULADO
        FROM DEVOLUCION_CHEQUES D, TIPO_DOCUMENTO T, CUENTAS_BANCO CU
        WHERE D.CUBA_COD = CU.CUBA_COD AND T.TIDO_COD = 77 AND PRBA_PREF >= :PREINI AND PRBA_PREF <= :PREFIN AND DVCH_NUMDOC >= :NUMINI AND DVCH_NUMDOC <= :NUMFIN AND CUBA_CODCTA >= :CTAINI AND CUBA_CODCTA <= :CTAFIN
        ORDER BY D.CUBA_COD, PRBA_PREF, DVCH_NUMDOC
        INTO :ID, :NOMTIPO, :PREFIJO, :NUMERO, :FECHA, :CONCEPTO, :BENEFICIARIO, :CUENTA, :NROCUENTA, :MONTO, :ANULADO
        DO
          if ((ANULADO = 'N') or (ANULADOS = 'S')) then
            SUSPEND;
    END
END^

SET TERM ; ^

/* 20140127e */
/* VALIDAR DIAS DE VENCMIENTO MAXIMO 999 DIAS */
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_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 ; ^

/* 20140204 */
/* amplie el campo de correo del usuario a 100 c */
CREATE DOMAIN CORREO AS
VARCHAR(100);

update RDB$RELATION_FIELDS set
RDB$FIELD_SOURCE = 'CORREO'
where (RDB$FIELD_NAME = 'USER_MAILUSER') and
(RDB$RELATION_NAME = 'USUARIO');

/* 20140204B */
/* NO ACTUALIZABA EL TOTAL QUEDABA CON EL DE LA FACTURA ANTERIOR */
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 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_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 ; ^

/* 20140211 */
/* CUADRE EL TOTAL DE FORMAS DE PAGO CON LA CARTERA */
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),
    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 r_iddoc integer;
declare variable f_id integer;
declare variable f_total numeric(18,2);
declare variable factor numeric(18,4);
declare variable ajuste integer;
declare variable PREFRDC VARCHAR(4);
declare variable otrabo numeric(18,4);
begin
AJUSTE = 0;
if (PREFIJO <> '') then
  SELECT PREF_PRE, AUTO_NUMERO, AUTO_PREFRDC FROM AUTORIZACIONES WHERE PREF_PRE = :PREFIJO INTO :PREF, :autoriza, :prefrdc;
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 */
  SELECT 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 = 1 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 :FORMAP1;
  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 = 1 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;
  FORMAP1 = FORMAP1 + OTRABO;
  SELECT 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 = 2 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 :FORMAP2;
  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 = 2 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;
  FORMAP2 = FORMAP2 + OTRABO;
  SELECT 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 = 3 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 :FORMAP3;
  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 = 3 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;
  FORMAP3 = FORMAP3 + OTRABO;
  SELECT 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 = 4 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 :FORMAP4;
  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 = 4 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;
  FORMAP4 = FORMAP4 + OTRABO;
  SELECT 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 = 5 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 :FORMAP5;
  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 = 5 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;
  FORMAP5 = FORMAP5 + OTRABO;
  SELECT 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 = 6 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 :FORMAP6;
  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 = 6 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;
  FORMAP6 = FORMAP6 + OTRABO;
  SELECT 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 = 7 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 :FORMAP7;
  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 = 7 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;
  FORMAP7 = FORMAP7 + OTRABO;
  SELECT 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 = 8 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 :FORMAP8;
  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 = 8 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;
  FORMAP8 = FORMAP8 + OTRABO;
  SELECT 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 = 9 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 :FORMAP9;
  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 = 9 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;
  FORMAP9 = FORMAP9 + OTRABO;
  SELECT 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 = 10 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 :FORMAP10;
  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 = 10 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;
  FORMAP10 = FORMAP10 + OTRABO;
  SELECT 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 = 11 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 :FORMAP11;
  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 = 11 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;
  FORMAP11 = FORMAP11 + OTRABO;
  SELECT 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 = 12 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 :FORMAP12;
  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 = 12 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;
  FORMAP12 = FORMAP12 + OTRABO;

  /* 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 (formap1 is null) then
    formap1 = 0;
  if (formap2 is null) then
    formap2 = 0;
  if (formap3 is null) then
    formap3 = 0;
  if (formap4 is null) then
    formap4 = 0;
  if (formap5 is null) then
    formap5 = 0;
  if (formap6 is null) then
    formap6 = 0;
  if (formap7 is null) then
    formap7 = 0;
  if (formap8 is null) then
    formap8 = 0;
  if (formap9 is null) then
    formap9 = 0;
  if (formap10 is null) then
    formap10 = 0;
  if (formap11 is null) then
    formap11 = 0;
  if (formap12 is null) then
    formap12 = 0;
  CARTERA = TOTALNETO - formap1 - formap2 - formap3 - formap4 - formap5 - formap6 - formap7 - formap8 - formap9 - formap10 -
     formap11 - formap12;
/*
  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
  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;
        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 ; ^

/* 20140212b */
/* NO SUME EN GRAVADOS LA TARIFA SI EL IVA ES CERO */
SET TERM ^ ;

CREATE OR ALTER procedure IMPR_FACTURA (
    ID integer)
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);
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_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
    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,
    :OBS, :VEHICULO,/* :NROCOPIA,*/ :RECIBIDO, :SUCUR, :paciente, :nompaciente, :nomcliente, :ANULADO, :anticipo, :retgarantia, :factenc, :FECINI, :FECFIN;

/* 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 */
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;
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
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, SUBSTR(FADE_DESC,1,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
            SUSPEND;
            END
          END
    END
ELSE
  if (ORDENCOD = 'UNIDAD') then
    BEGIN
    FOR SELECT FADE_ITEM, D.ARTI_COD, FADE_CODBAR, SUBSTR(FADE_DESC,1,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
            SUSPEND;
            END
          END
    END
  ELSE
    if (ORDENCOD = 'STAND') then
      BEGIN
      FOR SELECT FADE_ITEM, D.ARTI_COD, FADE_CODBAR, SUBSTR(FADE_DESC,1,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
                SUSPEND;
                END
              END
      END
    ELSE
        BEGIN
        FOR SELECT FADE_ITEM, D.ARTI_COD, FADE_CODBAR, SUBSTR(FADE_DESC,1,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
                SUSPEND;
                END
              END
        END
END^

SET TERM ; ^

/* 20140212c */
/* estado del articulo al exportar el reporte */
SET TERM ^ ;

CREATE OR ALTER procedure EXISTENCIAS_DESDE_HASTA (
    FECHA date,
    ARTINI varchar(20),
    ARTFIN varchar(20),
    GRPINI varchar(3),
    GRPFIN varchar(3),
    BODINI varchar(2),
    BODFIN varchar(2),
    ORDEN char(1),
    AGRUPA char(1),
    DETALLE char(1),
    RESERVA char(1),
    ENPESO char(1),
    MASIVA char(1),
    INACTIVOS char(1),
    SUCURSAL integer)
returns (
    CANT numeric(18,2),
    COSTO numeric(18,2),
    COSTO_LOTE numeric(18,2),
    CODIGO varchar(15),
    NOMBRE varchar(60),
    DESCORTA varchar(30),
    UNIDAD varchar(8),
    STAND varchar(20),
    CODGRUPO varchar(2),
    NOMGRUPO varchar(30),
    CODSUBG varchar(3),
    NOMSUBG varchar(30),
    CODMARC varchar(3),
    NOMMARC varchar(30),
    INVIMA varchar(20),
    CODBOD varchar(2),
    LOTE varchar(15),
    LOTEV date,
    NOMBOD varchar(30),
    COSTOTOT numeric(18,2),
    COSTOIVA numeric(18,2),
    ULTCOSTO numeric(18,2),
    FECHACOSTO date,
    CONSUMO numeric(18,2),
    RESERVADO numeric(18,4),
    ORDENADO numeric(18,4),
    IVA numeric(9,2),
    IVAMONTO numeric(18,2),
    PESOUNIT numeric(18,4),
    PESOTOTAL numeric(18,4),
    PRECIO numeric(18,2),
    CODBAR varchar(20),
    ESTADO char(1))
AS
declare variable exist char(1);
declare variable codini varchar(20);
declare variable codfin varchar(20);
declare variable desini varchar(20);
declare variable desfin varchar(20);
declare variable ordenc numeric(18,4);
declare variable pedido numeric(18,4);
declare variable ok char(1);
declare variable id integer;
declare variable item integer;
declare variable und varchar(8);
declare variable factor numeric(18,4);
declare variable cant2 numeric(18,4);
declare variable PEDAUTO CHAR(2);
DECLARE VARIABLE LISTA INTEGER;
declare variable FACCOST NUMERIC(18,4);
BEGIN
EXECUTE PROCEDURE lee_configuracion ('FACTURACION','FACTURAS', 'CODIGO DE LA LISTA DE PRECIOS A MOSTRAR EN ARTICULOS') returning_values (:LISTA);
if (ORDEN = 'C') then
    BEGIN
    CODINI = ARTINI;
    CODFIN = ARTFIN;
    DESINI = '';
    DESFIN = 'zz';
    END
ELSE
    BEGIN
    DESINI = ARTINI;
    DESFIN = ARTFIN;
    CODINI = '';
    CODFIN = 'zz';
    END
EXECUTE PROCEDURE LEE_CONFIGURACION('FACTURACION', 'FACTURAS', 'GENERAR PEDIDO AUTOMATICAMENTE CON LA FACTURA') returning_values (pedauto);
if ((DETALLE = 'B') or (DETALLE = 'L')) then
  BEGIN
  FOR SELECT ARTI_COD, ARTI_DES, ARTI_DESCORTA, ARTI_UNIDAD, ARTI_EXIST, TAIV_PORC, A.GRUP_COD, A.SUBG_COD, A.MARC_COD, BODE_COD, BODE_NOM, ARTI_CONSUMO, ARTI_PESO/1000, ARTI_INVIMA, ESAR_COD
      FROM ARTICULO A, BODEGA B, TARIFA_IVA T
      WHERE ARTI_COD >= :CODINI AND ARTI_COD <= :CODFIN AND ARTI_DES >= :DESINI AND ARTI_DES <= :DESFIN AND ((ESAR_COD <> 'I') or (:INACTIVOS = 'S')) AND BODE_COD >= :BODINI AND
      BODE_COD <= :BODFIN AND ((SUCU_ID = :SUCURSAL) or (:SUCURSAL = 0)) AND A.TAIV_COD = T.TAIV_COD
      INTO :CODIGO, :NOMBRE, :DESCORTA, :UNIDAD, :EXIST, :IVA, :CODGRUPO, :CODSUBG, :CODMARC, :CODBOD, :NOMBOD, :CONSUMO, :pesounit, :invima, :estado
      DO
        BEGIN
        STAND = '';
        OK = 'N';
        if (AGRUPA = 'G') then
            BEGIN
            if ((CODGRUPO >= GRPINI) AND (CODGRUPO <= GRPFIN)) then
                OK = 'S';
            end
        ELSE
            if (AGRUPA = 'M') then
                BEGIN
                if ((CODMARC >= GRPINI) AND (CODMARC <= GRPFIN)) then
                    OK = 'S';
                END
        if (OK = 'S') then
            BEGIN
            NOMGRUPO = '';
            NOMMARC = '';
            NOMSUBG = '';
            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;
            CODBAR = NULL;
            SELECT FIRST 1 COBA_COD FROM BARRAS_ARTICULO
                WHERE ARTI_COD = :codigo AND COBA_UNIDAD = :unidad ORDER BY STRLEN(COBA_COD) INTO :codbar;
            if (CODBAR IS NULL) then
                CODBAR = CODIGO;
            if (EXIST <> 'N') then
                BEGIN
                SELECT STAND_COD FROM STANDS WHERE ARTI_COD = :CODIGO AND STAND_BODEGA = :CODBOD INTO :STAND;
                EXECUTE PROCEDURE costo_promedio_y_ultimo_unidad(CODIGO, FECHA-1, UNIDAD) returning_values (COSTO, ULTCOSTO);
                /* EL FACTOR */
                FACCOST = 1;
                SELECT FIRST 1 FAIN_FACTOR FROM factor_inventario WHERE FAIN_FECINI <= :FECHA AND FAIN_FECFIN >= :FECHA INTO :FACCOST;
                ULTCOSTO = ULTCOSTO * FACCOST;
                COSTO = COSTO * FACCOST;

                SELECT FIRST 1 MVAR_FECHA FROM MOVIMIENTO_ARTICULO WHERE ARTI_COD = :CODIGO AND MVAR_ENTRADA = 'S' AND MVAR_FECHA <= :FECHA
                    ORDER BY ARTI_COD DESC, MVAR_FECHA DESC INTO :FECHACOSTO;
                
                if (CONSUMO <> 0) then
                    EXECUTE PROCEDURE CONSUMO_HISTORICO (:CODIGO, :fecha) returning_values (:CONSUMO);
                if (RESERVA = 'S') then
                    BEGIN
                    SELECT SUM(ORID_ENTREGAR)
                        FROM ORDENINVENTARIO_DETALLE OD, ordenes_inventario O
                        WHERE O.ORIN_ID = OD.ORIN_ID AND ARTI_COD = :CODIGO AND ORIN_FECHA <= :FECHA AND ORIN_FECLLEGA >= :FECHA AND ORID_ANULADO = 'N' AND OD.BODE_COD = :CODBOD
                        INTO :ORDENADO;
                    if (ORDENADO IS NULL) then
                        ORDENADO = 0;
                    ORDENC = 0;
                    FOR SELECT O.ORDC_ID, OCDE_ITEM, OCDE_CANT * OCDE_FACTOR
                        FROM ORDENES_COMPRA O, ORDENES_COMPRA_DETALLE OD
                        WHERE O.ORDC_ID = OD.ORDC_ID AND OD.ARTI_COD = :CODIGO AND ORDC_VENCE >= :FECHA AND ORDC_FECHA <= :FECHA AND OCDE_ANULADO = 'N' AND OD.BODE_COD = :CODBOD
                        INTO :ID, :ITEM, :CANT2
                        do
                        BEGIN
                        EXECUTE PROCEDURE FALTANTE(23, 21, ID, ITEM) returning_values (PEDIDO, UND, FACTOR);
                        if (PEDIDO * FACTOR = CANT2) then /* SI NO SE HA FACTURADO MIRE A VER SI SE REMISIONO */
                            EXECUTE PROCEDURE FALTANTE(23, 22, ID, ITEM) returning_values (PEDIDO, UND, FACTOR);
                        if (PEDIDO IS NULL) then
                            PEDIDO = 0;
                        ORDENC = ORDENC + PEDIDO * FACTOR;
                        END
                    ORDENADO = ORDENADO + ORDENC;
                    SELECT SUM(RSDE_LIBERAR)
                        FROM RESERVAS_DETALLE RD, RESERVAS R
                        WHERE R.RESE_ID = RD.RESE_ID AND ARTI_COD = :CODIGO AND RESE_FECHA <= :FECHA AND RESE_VENCE >= :FECHA AND RD.BODE_COD = :CODBOD AND RSDE_ANULADO = 'N'
                        INTO :RESERVADO;
                    if (RESERVADO IS NULL) then
                        RESERVADO = 0;
                    PEDIDO = 0;
                    FOR SELECT P.PEDI_ID, PEDE_ITEM, PEDE_CANT * PEDE_FACTOR
                        FROM PEDIDOS P, PEDIDOS_DETALLE PD
                        WHERE P.PEDI_ID = PD.PEDI_ID AND PD.ARTI_COD = :CODIGO AND PEDI_VENCE >= :FECHA AND PEDI_FECHA <= :FECHA AND PEDE_ANULADO = 'N' AND BODE_COD = :CODBOD
                        INTO :ID, :ITEM, :CANT2
                        do
                        BEGIN
                        EXECUTE PROCEDURE FALTANTE(34, 31, ID, ITEM) returning_values (ORDENC, UND, FACTOR);
                        if ((ORDENC * FACTOR = CANT2) or (PEDAUTO = 'SI')) then /* SI NO SE HA FACTURADO MIRE A VER SI SE REMISIONO */
                            EXECUTE PROCEDURE FALTANTE(34, 32, ID, ITEM) returning_values (ORDENC, UND, FACTOR);
                        if (ORDENC IS NULL) then
                            ORDENC = 0;
                        PEDIDO = PEDIDO + ORDENC * FACTOR;
                        END
                    RESERVADO = RESERVADO + PEDIDO;
                    END
                ELSE
                    BEGIN
                    RESERVADO = 0;
                    ORDENADO = 0;
                    END
                if (LISTA > 0) then
                    SELECT prar_fijo FROM precios_articulo WHERE arti_cod = :CODIGO and lipr_cod = :LISTA INTO :PRECIO;
                if ((DETALLE = 'L') AND (EXIST = 'L')) then
                    BEGIN
                    FOR SELECT L.lote_nro, L.lote_nro||' - '||L.lote_vence, l.lote_costo, LOTE_VENCE
                        FROM LOTES L WHERE ARTI_COD = :codigo AND BODE_COD = :codbod
                        INTO :LOTE, :NOMBOD, :costo_lote, :lotev
                        DO
                        BEGIN
                        if (CONSUMO <> 0) then
                            EXECUTE PROCEDURE CONSUMO_HISTORICO (:CODIGO, :fecha) returning_values (:CONSUMO);
                        execute procedure saldo_lote_fecha(:codigo, :codbod,  :lote,  :fecha-1) returning_values (:cant);
                        if (cant <> 0) then
                            begin
                            COSTOTOT = :CANT * :COSTO;
                            IVAMONTO = COSTOTOT /100 * IVA;
                            COSTOIVA = COSTOTOT;
                            if (MASIVA = 'S') then
                                BEGIN
                                COSTOIVA = COSTOTOT + IVAMONTO;
                                COSTO = COSTO * (100 + :IVA) / 100 + :CONSUMO;
                                END
                            CONSUMO = CONSUMO * CANT;
                            COSTOIVA = COSTOIVA + CONSUMO;
                            if (ENPESO = 'S') then
                                BEGIN
                                if (pesounit IS NULL) then
                                    pesounit = 0;
                                if (PESOUNIT <> 0) then
                                    BEGIN
                                    pesototal = PESOUNIT * cant;
                                    SUSPEND;
                                    END
                                END
                            ELSE
                                SUSPEND;
                            end
                        END
                    END
                else
                    BEGIN
                    EXECUTE PROCEDURE SALDO_INICIAL_INVENTARIO(CODIGO, FECHA, :CODBOD) returning_values (CANT);
                    COSTOTOT = :CANT * :COSTO;
                    IVAMONTO = COSTOTOT /100 * IVA;
                    COSTOIVA = COSTOTOT;
                    if (MASIVA = 'S') then
                        BEGIN
                        COSTOIVA = COSTOTOT + IVAMONTO;
                        COSTO = COSTO * (100 + :IVA) / 100 + :CONSUMO;
                        END
                    CONSUMO = CONSUMO * CANT;
                    COSTOIVA = COSTOIVA + CONSUMO;
                    if (ENPESO = 'S') then
                        BEGIN
                        if (pesounit IS NULL) then
                            pesounit = 0;
                        if (PESOUNIT <> 0) then
                            BEGIN
                            pesototal = PESOUNIT * cant;
                            SUSPEND;
                            END
                        END
                    ELSE
                        SUSPEND;
                    END
                END
            END
        END
  END

if (DETALLE = 'N') then
  BEGIN
  FOR SELECT ARTI_COD, ARTI_DES, ARTI_DESCORTA, ARTI_UNIDAD, ARTI_EXIST, TAIV_PORC, A.GRUP_COD, A.SUBG_COD, A.MARC_COD, ARTI_CONSUMO, ARTI_PESO/1000, ARTI_INVIMA, ESAR_COD
      FROM ARTICULO A, TARIFA_IVA T
      WHERE ARTI_COD >= :CODINI AND ARTI_COD <= :CODFIN AND ARTI_DES >= :DESINI AND ARTI_DES <= :DESFIN AND ((ESAR_COD <> 'I') or (:INACTIVOS = 'S')) AND A.TAIV_COD = T.TAIV_COD
      INTO :CODIGO, :NOMBRE, :DESCORTA, UNIDAD, :EXIST, :IVA, :CODGRUPO, :CODSUBG, :CODMARC, :CONSUMO, :pesounit, :invima, :estado
      DO
        BEGIN
        OK = 'N';
        if (AGRUPA = 'G') then
            BEGIN
            if ((GRPINI = '0') AND (GRPFIN = 'zz')) then
                OK = 'S';
            else
                if ((CODGRUPO >= GRPINI) AND (CODGRUPO <= GRPFIN)) then
                    OK = 'S';
            end
        ELSE
            if (AGRUPA = 'M') then
                BEGIN
                if ((GRPINI = '0') AND (GRPFIN = 'zzz')) then
                    OK = 'S';
                else
                    if ((CODMARC >= GRPINI) AND (CODMARC <= GRPFIN)) then
                        OK = 'S';
                END
        if (OK = 'S') then
            BEGIN
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            CODBAR = NULL;
            SELECT MAX(COBA_COD) FROM BARRAS_ARTICULO WHERE ARTI_COD = :codigo AND COBA_UNIDAD = :unidad INTO :codbar;
            if (CODBAR IS NULL) then
                CODBAR = CODIGO;

            if (EXIST <> 'N') then
                BEGIN
                EXECUTE PROCEDURE SALDO_INICIAL_TOTAL_INV(CODIGO, FECHA) returning_values (CANT);
                EXECUTE PROCEDURE costo_promedio_y_ultimo_unidad(CODIGO, FECHA-1, UNIDAD) returning_values (COSTO, ULTCOSTO);
                /* EL FACTOR */
                FACCOST = 1;
                SELECT FIRST 1 FAIN_FACTOR FROM factor_inventario WHERE FAIN_FECINI <= :FECHA AND FAIN_FECFIN >= :FECHA INTO :FACCOST;
                ULTCOSTO = ULTCOSTO * FACCOST;
                COSTO = COSTO * FACCOST;

                SELECT FIRST 1 MVAR_FECHA FROM MOVIMIENTO_ARTICULO WHERE ARTI_COD = :CODIGO AND MVAR_ENTRADA = 'S' AND MVAR_FECHA <= :FECHA
                    ORDER BY ARTI_COD DESC, MVAR_FECHA DESC INTO :FECHACOSTO;
                COSTOTOT = :CANT * :COSTO;
                IVAMONTO = COSTOTOT /100 * IVA;
                COSTOIVA = COSTOTOT;
                if (CONSUMO <> 0) then
                    EXECUTE PROCEDURE CONSUMO_HISTORICO (:CODIGO, :fecha) returning_values (:CONSUMO);
                if (MASIVA = 'S') then
                    BEGIN
                    COSTOIVA = COSTOTOT + IVAMONTO;
                    COSTO = COSTO * (100 + :IVA) / 100 + :CONSUMO;
                    END
                CONSUMO = CONSUMO * CANT;
                COSTOIVA = COSTOIVA + CONSUMO;
                if (RESERVA = 'S') then
                    BEGIN
                    SELECT SUM(ORID_ENTREGAR)
                        FROM ORDENINVENTARIO_DETALLE OD, ordenes_inventario O
                        WHERE O.ORIN_ID = OD.ORIN_ID AND ARTI_COD = :CODIGO AND ORIN_FECHA <= :FECHA AND ORIN_FECLLEGA >= :FECHA AND ORID_ANULADO = 'N'
                        INTO :ORDENADO;
                        if (ORDENADO IS NULL) then
                            ORDENADO = 0;
                    ORDENC = 0;
                    FOR SELECT O.ORDC_ID, OCDE_ITEM, OCDE_CANT * OCDE_FACTOR
                        FROM ORDENES_COMPRA O, ORDENES_COMPRA_DETALLE OD
                        WHERE O.ORDC_ID = OD.ORDC_ID AND OD.ARTI_COD = :CODIGO AND ORDC_VENCE >= :FECHA AND ORDC_FECHA <= :FECHA AND OCDE_ANULADO = 'N'
                        INTO :ID, :ITEM, :CANT2
                        do
                        BEGIN
                        EXECUTE PROCEDURE FALTANTE(23, 21, ID, ITEM) returning_values (PEDIDO, UND, FACTOR);
                        if (PEDIDO * FACTOR = CANT2) then /* SI NO SE HA FACTURADO MIRE A VER SI SE REMISIONO */
                            EXECUTE PROCEDURE FALTANTE(23, 22, ID, ITEM) returning_values (PEDIDO, UND, FACTOR);
                        if (PEDIDO IS NULL) then
                            PEDIDO = 0;
                        ORDENC = ORDENC + PEDIDO * FACTOR;
                        END
                    ORDENADO = ORDENADO + ORDENC;
                    SELECT SUM(RSDE_LIBERAR)
                        FROM RESERVAS_DETALLE RD, RESERVAS R
                        WHERE R.RESE_ID = RD.RESE_ID AND ARTI_COD = :CODIGO AND RESE_FECHA <= :FECHA AND RESE_VENCE >= :FECHA AND RSDE_ANULADO = 'N'
                        INTO :RESERVADO;
                    if (RESERVADO IS NULL) then
                        RESERVADO = 0;
                    PEDIDO = 0;
                    FOR SELECT P.PEDI_ID, PEDE_ITEM, PEDE_CANT * PEDE_FACTOR
                        FROM PEDIDOS P, PEDIDOS_DETALLE PD, PUNTO_VENTA PT
                        WHERE P.PEDI_ID = PD.PEDI_ID AND PD.ARTI_COD = :CODIGO AND PT.ptvt_id = P.PTVT_ID AND PEDI_VENCE >= :FECHA AND PEDI_FECHA <= :FECHA AND PEDE_ANULADO = 'N'
                        INTO :ID, :ITEM, :CANT2
                        do
                        BEGIN
                        EXECUTE PROCEDURE FALTANTE(34, 31, ID, ITEM) returning_values (ORDENC, UND, FACTOR);
                        if ((ORDENC * FACTOR = CANT2) or (PEDAUTO = 'SI')) then /* SI NO SE HA FACTURADO MIRE A VER SI SE REMISIONO */
                            EXECUTE PROCEDURE FALTANTE(34, 32, ID, ITEM) returning_values (ORDENC, UND, FACTOR);
                        if (ORDENC IS NULL) then
                            ORDENC = 0;
                        PEDIDO = PEDIDO + ORDENC * FACTOR;
                        END
                    if (PEDIDO IS NULL) then
                        PEDIDO = 0;
                    RESERVADO = RESERVADO + PEDIDO;
                    END
                ELSE
                    BEGIN
                    RESERVADO = 0;
                    ORDENADO = 0;
                    END
                if (LISTA > 0) then
                    SELECT prar_fijo FROM precios_articulo WHERE arti_cod = :CODIGO and lipr_cod = :LISTA INTO :PRECIO;

                if (ENPESO = 'S') then
                    BEGIN
                    if (pesounit IS NULL) then
                        pesounit = 0;
                    if (PESOUNIT <> 0) then
                        BEGIN
                        pesototal = PESOUNIT * cant;
                        SUSPEND;
                        END
                    END
                ELSE
                    SUSPEND;
                END
            END
        END
  END
END^

SET TERM ; ^

/* 20120217 */
/* SI RETEIVA REGIMEN SIMPLIFICADO CALCULE EL IVA BASE */
SET TERM ^ ;

CREATE OR ALTER procedure CONTABIL_FACTCOMP (
    IDDOC integer,
    IDINTER integer)
returns (
    ERROR integer,
    VER char(1),
    IDC integer)
AS
DECLARE VARIABLE PREFIJO VARCHAR(4);
DECLARE VARIABLE NUM VARCHAR(8);
DECLARE VARIABLE NUMERO VARCHAR(10);
DECLARE VARIABLE FECAUX DATE;
DECLARE VARIABLE FECHA CHAR(8);
DECLARE VARIABLE CONCEPTO CHAR(60);
DECLARE VARIABLE VENCEAUX DATE;
DECLARE VARIABLE VENCE CHAR(8);
DECLARE VARIABLE VRDTO NUMERIC(18,2);
DECLARE VARIABLE VRADIC NUMERIC(18,2);
DECLARE VARIABLE VRSUBT NUMERIC(18,2);
DECLARE VARIABLE VRIVA NUMERIC(18,2);
DECLARE VARIABLE PRTFTE NUMERIC(9,2);
DECLARE VARIABLE VRRTFTE NUMERIC(18,2);
DECLARE VARIABLE VRRTIVA NUMERIC(18,2);
DECLARE VARIABLE PRTICA NUMERIC(9,2);
DECLARE VARIABLE VRRTICA NUMERIC(18,2);
DECLARE VARIABLE 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 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', TICO_COD, PRCO_PRE, INCO_INVEN, INCO_IVA, INCO_CONSUMO, INCO_CXP, INCO_RTFTE, INCO_RTIVA, INCO_RTICA, INCO_RTCREE,
    INCO_CTAINVEN, INCO_CTAIVA, INCO_CTACONSUMO, INCO_CTADTO, INCO_CTAADIC, INCO_CTAEXTRA, INCO_CTACXP, INCO_CTARTFTE, INCO_CTARTIVA,
    INCO_CTARTICA, INCO_CTARTCREE, INCO_CONFIRMAR, INCO_CENTRO
    FROM INTERFAZ_COMPRAS WHERE INCO_ID = :IDINTER
    INTO :EXISTE, :TIPOCOMP, :PREFCONT, :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
    /* BORRE CONTABILIZACION PREVIA */
    DELETE FROM CONTABILIZACION WHERE CNTB_TIPOREF = 21 AND CNTB_IDREF = :IDDOC;
    /* ENCABEZADO DE LA FACTURA */
    SELECT PREF_PRE, FACO_NUMERO, FACO_FECHA, F.TERC_NIT, FACO_IMPTOS, FACO_VENCE, FACO_DTOMONTO, FACO_ADICIONAL, FACO_IVAMONTO,
        FACO_EXTRA, FACO_TOTAL, FACO_RTFTEPORC, FACO_RTFTEMONTO, FACO_RTIVAPOR, FACO_RTIVAMONTO, FACO_RTICAPOR, FACO_RTICAMONTO,
        FACO_RTCREE, FACO_RTCREEM, TERC_NOM, PROV_CTARTFTE, PROV_CTARTIVA, PROV_CTARTICA, PROV_CTARTCREE, PROV_CTAPAGAR, FACO_NUMPROV,
        FACO_ANULADO, 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, :FECAUX, :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(:FECAUX) returning_values (:FECHA);
        EXECUTE PROCEDURE FECHA_A_CONTA(:VENCEAUX) returning_values (:VENCE);
        if (NUMPROV IS NULL) then
            NUMPROV = NUMERO;
        CONCEPTO = 'FC No.' || NUMERO || '-' || SUBSTR(NOMBRE,1,26) || '-NPROV.' || NUMPROV;
        IDC = GEN_ID(ID_CONTABILIZA, 1);
        INSERT INTO CONTABILIZACION (CNTB_ID, CNTB_TIPOCOMP, CNTB_PREFCNT, CNTB_NUMERO, CNTB_FECHA, CNTB_CONCEPTO, CNTB_REF, CNTB_TIPOREF, CNTB_IDREF, CNTB_PREFREF, CNTB_NUMREF, CNTB_PROCESADO)
            VALUES (:IDC, :TIPOCOMP, :PREFCONT, :NUM, :FECHA, :CONCEPTO, '', 21, :IDDOC, :PREFIJO, :NUM, 'N');
        NUMITEMS = 0;
        SUMA = 0;
        NETO = 0;
        ERROR = 0;
        EXECUTE PROCEDURE LEE_CONFIGURACION('COMPRAS', 'FACTURAS', '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 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(21, :IDDOC, :CTAINVEN, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 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 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(21, :IDDOC, :CTAINVEN, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                  if (ERRORC <> 0) then
                    ERROR = ERROR + 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 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(21, :IDDOC, :CTAIVA, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (TIPOCUEN = 'I') then
                    BEGIN
                    FOR SELECT F.ARTI_COD, FCDE_IVAMONTO, (FCDE_CANT * (FCDE_PRUNIT-FCDE_DTOMONTO)), TAIV_PORC, FCDE_CONSUMO
                        FROM ARTICULO A, CONTABIL_ARTICULO C, FACTURAS_COMPRAS_DETALLE F, TARIFA_IVA T WHERE F.FACO_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND COAR_CTAIVAV = :CUENTA AND A.TAIV_COD = T.TAIV_COD
                        INTO :ARTICULO, :IMPTOS, :MONTO, :PORCIVA, :VALORADIC
                    DO
                        BEGIN
                        if (MERCANCIA <> 0) then
                            IMPTOS = CAST(IMPTOS AS DOUBLE PRECISION) * VRSUBT / MERCANCIA;
                        else
                            IMPTOS = 0;
                        if (IMPINC = 'S') then
                            BEGIN
                            MONTO = MONTO - IMPTOS;
                            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(21, :IDDOC, :CTAIVA, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (TIPOCUEN = 'I') then
                    BEGIN
                    FOR SELECT F.ARTI_COD, (FCDE_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 C, FACTURAS_COMPRAS_DETALLE F
                WHERE F.FACO_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD GROUP BY COAR_CTACONS INTO :CTACONSUMO, :IMPTOS
            DO
              if (IMPTOS <> 0) then
                BEGIN
                execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
                EXECUTE PROCEDURE CUENTA_INTERFAZ(21, :IDDOC, :CTACONSUMO, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (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(21, :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, '', :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(21, :IDDOC, :CTADTO, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_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(21, :IDDOC, :CTAADIC, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_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(21, :IDDOC, :CTAEXTRA, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'C') then
                BEGIN
                if (vrextra > 0) then
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_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(21, :IDDOC, :CTARTFTE, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_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 C, FACTURAS_COMPRAS_DETALLE F
            WHERE F.faco_id = :IDDOC AND F.ARTI_COD = C.ARTI_COD
            GROUP BY COAR_CTARTFTE
            INTO :CTARTFTE, :PRTFTE, :baseadic,  :MONTO, :VRRTFTE
            DO
            BEGIN
            MONTO = MONTO * FACTOR * -1;
            if (ABS(MONTO) >= :baseadic) then
                BEGIN
                VRRTFTE = VRRTFTE * FACTOR / 100;
                execute procedure redondee(VRRTFTE, DIG) returning_values (VRRTFTE);
                execute procedure redondee(MONTO, DIG) returning_values (MONTO);
                if (VRRTFTE <> 0) then
                    BEGIN
                    EXECUTE PROCEDURE CUENTA_INTERFAZ(21, :IDDOC, :CTARTFTE, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
                    if (ERRORC <> 0) then
                        ERROR = ERROR + 1;
                    if (TIPOCUEN = 'C') then
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_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(21, :IDDOC, :CTARTIVA, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            /* SI ES DOCUMENTO EQUIVALENTE */
            if (VRRTIVA = VRIVA) then
                BEGIN
                EXECUTE PROCEDURE LEE_CONFIGURACION('COMPRAS', 'FACTURAS', 'PORCENTAJE DE RETENCION DE IVA PARA REGIMEN SIMPLIFICADO') returning_values (:PORC);
                if (PORC <> 0) then
                    VRIVA = VRRTIVA * 100 / PORC;
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_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(21, :IDDOC, :CTARTICA, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_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(21, :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, '', 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(21, :IDDOC, :CTACXP, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'C') then
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_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(21, :IDDOC, :CUENTAADIC, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (TIPOCUEN = 'C') then
                    BEGIN
                    if (DBADIC = 'S') then
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_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(21, :IDDOC, :CTAADIC, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (TIPOCUEN = 'C') then
                    BEGIN
                    if (NETO < 0) then
                        BEGIN
                        NETO = NETO * -1;
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_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 (ERROR > 0) then
        VER = 'S';
    SUSPEND;
    END
ELSE
    BEGIN
    EXECUTE PROCEDURE ERRORINT(21, :IDDOC, :PREFIJO, 1);
    ERROR = ERROR + 1;
    VER = 'S';
    SUSPEND;
    END
END^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE CONTABILICE_COMP_SIMPLIFICADO(
    IDI INTEGER)
RETURNS (
    ID INTEGER,
    PREF VARCHAR(4),
    NUMERO VARCHAR(8),
    ESTADO VARCHAR(20),
    IDC INTEGER)
AS
DECLARE VARIABLE VER CHAR(2);
declare variable ERROR INTEGER;
BEGIN
FOR SELECT FACO_ID, PREF_PRE, FACO_NUMERO FROM FACTURAS_COMPRA C, PROVEEDORES P WHERE
    C.TERC_NIT = P.TERC_NIT AND PROV_SIMPLIFICADO = 'S' AND FACO_ANULADO = 'N'
    ORDER BY FACO_ID INTO :ID, :PREF, :NUMERO
DO
  BEGIN
  ESTADO = 'PROCESANDO';
  SUSPEND;
  /* BORRE LA CONTABILIZACION */
/*  delete FROM comprobante_detalle WHERE ENCO_CONSEC IN (SELECT ENCO_CONSEC FROM COMPROBANTE_ENCABEZADO WHERE ENCO_TIPOREF = 21 AND ENCO_IDREF = :ID);
  DELETE FROM comprobante_encabezado  WHERE ENCO_TIPOREF = 21 AND ENCO_IDREF = :ID; */
  EXECUTE PROCEDURE CONTABIL_FACTCOMP (:ID, :IDI) RETURNING_VALUES (:ERROR, VER, :IDC);
  if (ERROR = 0) then
    BEGIN
/*    EXECUTE PROCEDURE CONTABILIZA_PENDIENTE (:IDC); */
    ESTADO = 'OK';
    END
  ELSE
    ESTADO = 'ERROR';
  suspend;
  END
END
^

SET TERM ; ^

SET TERM ^ ;

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

/* 20140220 */
/* multiple rows en el costo */
SET TERM ^ ;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

SET TERM ; ^

/* 20140221 */
/* SUCURSAL EN CONTROL DE FACTURAS MENSUALES */
ALTER TABLE FACTURAS_MES
ADD FAME_SUCURSAL VARCHAR(10);

SET TERM ^ ;

CREATE OR ALTER TRIGGER FACTURAS_DETALLE_AI FOR FACTURAS_DETALLE
ACTIVE AFTER INSERT POSITION 0
AS
declare variable fec date;
declare variable NOMCLI VARCHAR(60);
declare variable CONC VARCHAR(60);
declare variable Pref varchar(4);
declare variable Num varchar(8);
declare variable Nit varchar(20);
declare variable TIPO INTEGER;
declare variable INVFAC CHAR(2);
declare variable PEDAUTO CHAR(2);
declare variable CONSO CHAR(2);
declare variable CONSOLIDA INTEGER;
declare variable ESPOS CHAR(1);
declare variable BONOS CHAR(2);
declare variable VRBONO NUMERIC(18,2);
declare variable I INTEGER;
declare variable ITEM INTEGER;
declare variable CANTAUX NUMERIC(18,4);
declare variable CANT NUMERIC(18,4);
declare variable CANTPEND NUMERIC(18,4);
declare variable factmes char(2);
declare variable ano integer;
declare variable mes integer;
declare variable MESES integer;
declare variable grpfm VARCHAR(3);
declare variable grp VARCHAR(3);
declare variable SUCURSAL VARCHAR(10);
BEGIN
select fact_fecha, pref_pre, fact_numero, terc_nit, fact_nomcliente, fact_consolida, fact_sucursal
    from facturas where fact_id = new.fact_id
    into :fec, :Pref, :Num, :Nit, :Nomcli, :Consolida, :sucursal;
if ((NEW.fact_id <> 0) and (new.fade_anulado = 'N')) then
    BEGIN
    EXECUTE PROCEDURE LEE_CONFIGURACION('FACTURACION','FACTURAS','GENERAR PEDIDO AUTOMATICAMENTE CON LA FACTURA') RETURNING_VALUES (PEDAUTO);
    SELECT MAX(CEFA_TIPOORI) FROM consolide_faltantes WHERE CEFA_ID = :CONSOLIDA INTO :TIPO;
    if (Tipo IS NULL) then
        Tipo = 0;
    execute procedure lee_configuracion('FACTURACION', 'FACTURAS', 'AFECTAR INVENTARIO CON LA FACTURA') returning_values (:INVFAC);
    SELECT MIN(AUTO_ESPOS) FROM AUTORIZACIONES WHERE PREF_PRE = :pref INTO :ESPOS;
    if (ESPOS = 'S') then
        BEGIN
        INVFAC = 'SI';
        PEDAUTO = 'NO';
        END
    /* si se hizo con base en una remisi¢n no afecte inventario */
    if ((Tipo <> 32) and (INVFAC = 'SI')) then
        begin
        CANTPEND = 0;
        if ((NEW.fade_idpend <> 0) AND (NEW.fade_itempend <> 0)) then
            BEGIN
            select d.pevd_cant * d.pevd_factor from pendiente_ventas_detalle D WHERE D.pend_id = NEW.fade_idpend AND D.pevd_item = NEW.fade_itempend into :cantpend;
            if ((new.fade_cant * new.fade_factor) < cantpend) then
                exception cantidad_cruce_mayor 'La cantidad facturada ' || cast(new.fade_cant * new.fade_factor as varchar(20)) || ' no puede ser menor al pendiente previamente grabado' || cast(:cantpend as varchar(20));
            /* ACTUALICE EL IDFACT EN EL PENDIENTE */
            UPDATE pendiente_ventas_detalle D SET D.pevd_idfact = NEW.fact_id WHERE D.pend_id = NEW.fade_idpend AND D.pevd_item = NEW.fade_itempend AND ((D.pevd_idfact IS NULL) or (D.pevd_idfact = 0));
            END
        if (STRLEN(NOMCLI) > 40) then
            CONC = 'FV No.' || :pref || :num || '-' || SUBSTR(NOMCLI, 1, 40);
        ELSE
            CONC = 'FV No.' || :pref || :NUM || '-' || NOMCLI;
        if ((((new.fade_factor * new.fade_cant) - cantpend) > 0) or (new.fade_cant < 0))  then
            INSERT INTO MOVIMIENTO_ARTICULO
                (ARTI_COD, BODE_COD, MVAR_FECHA, MVAR_TIPODOC, MVAR_IDREF, MVAR_CONC, MVAR_CANT, MVAR_COSTO, MVAR_ENTRADA, MVAR_LOTE, MVAR_PREF, MVAR_NUMERO, MVAR_ITEM, TERC_NIT)
                VALUES(NEW.ARTI_COD, NEW.BODE_COD, :FEC, 31, NEW.fact_id,
                :CONC, new.fade_factor * new.fade_cant, 0, 'N', new.fade_lote, :Pref, :Num, new.fade_item, :Nit);
        end
    if (PEDAUTO = 'SI') then
        BEGIN
        INSERT INTO PEDIDOS_DETALLE (PEDI_ID, PEDE_ITEM, ARTI_COD, PEDE_CANT, PEDE_UNIDAD, PEDE_DTOPORC, PEDE_DTOMONTO, PEDE_IVAPORC, PEDE_IVAMONTO, PEDE_CONSUMO, PEDE_FACTOR, PEDE_DESC, PEDE_OBS, PEDE_CODBAR, PEDE_TOTAL, PEDE_ANULADO, PEDE_TRANSMIT, LIPR_COD, PEDE_REFERENCIA, PEDE_PRUNIT, PEDE_FACTURAD, PEDE_REMISIONAD, PEDE_RESERVA, BODE_COD)
            VALUES (GEN_ID(id_pedido,0), NEW.FADE_ITEM, NEW.ARTI_COD, NEW.FADE_CANT, NEW.FADE_UNIDAD, NEW.FADE_DTOPORC, NEW.FADE_DTOMONTO, NEW.FADE_IVAPORC, NEW.FADE_IVAMONTO, NEW.FADE_CONSUMO, NEW.FADE_FACTOR, NEW.FADE_DESC, NEW.FADE_OBS, NEW.FADE_CODBAR, NEW.FADE_TOTAL, 'N', 'N', NEW.LIPR_COD, NEW.FADE_REFERENCIA, NEW.FADE_PRUNIT, NEW.FADE_CANT * NEW.FADE_FACTOR, 0, NEW.FADE_CANT * NEW.FADE_FACTOR, NEW.bode_cod);
        END
    ELSE
        BEGIN
        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.fact_id, COFA_CANTCR = COFA_CANT * COFA_FACTOR, COFA_FECDES = :fec
                    where COFA_ID = :consolida AND ARTI_COD = NEW.ARTI_COD;
            ELSE
                BEGIN
                CANTAUX = new.fade_cant * new.fade_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.fact_id, COFA_CANTCR = COFA_CANT * COFA_FACTOR, COFA_FECDES = :fec
                                where COFA_ID = :consolida and COFA_ITEM = :ITEM;
                            CANTAUX = CANTAUX - CANT;
                            end
                        else
                            begin
                            update consolidado_faltantes
                                set COFA_IDDES = new.fact_id, COFA_CANTCR = COFA_CANTCR + :CANTAUX, COFA_FECDES = :fec
                                where COFA_ID = :consolida and COFA_ITEM = :ITEM;
                            CANTAUX = 0;
                            end
                    end
                END
            END
        END
    EXECUTE procedure LEE_CONFIGURACION ('FACTURACION', 'ARTICULOS', 'PERMITIR GENERAR BONOS DE PAGO AL FACTURAR ARTICULOS SELECCIONADOS') returning_values (BONOS);
    if (BONOS = 'SI') then
        BEGIN
        SELECT ARTI_VALORBONO FROM ARTICULO WHERE ARTI_COD = NEW.arti_cod INTO :VRBONO;
        if (VRBONO <> 0) then
            BEGIN
            I = 1;
            WHILE (I <= (NEW.fade_cant * NEW.fade_factor)) DO
                BEGIN
                INSERT INTO BONOS_PAGO (BOPA_ID, BOPA_FACTURA, BOPA_PREF, BOPA_NUMERO, BOPA_FECHA, BOPA_ITEM, BOPA_MONTO, BOPA_IDRDC)
                    VALUES (GEN_ID(ID_BONOPAGO, 1), NEW.fact_id, :pref, :num, :fec, :I, :VRBONO, 0);
                I = I + 1;
                END
            END
        END
    execute procedure lee_configuracion('FACTURACION', 'FACTURAS', 'CONTROLAR FACTURACION MENSUAL POR CADA CLIENTE') returning_values (:factmes);
    if (factmes = 'SI') Then
        begin
        execute procedure lee_configuracion('FACTURACION', 'FACTURAS', 'GRUPO DE MERCANCIA PARA CONTROL MENSUAL DE FACTURACION') returning_values (:grpfm);
        SELECT GRUP_COD FROM ARTICULO WHERE ARTI_COD = NEW.arti_cod INTO :GRP;
        if (GRP = :GRPFM) then
            BEGIN
            /* actualice el control de facturacion */
            ano = extract(year from :fec);
            mes = extract(month from :fec);
            MESES = NEW.fade_cant;
            UPDATE movimiento_clientes SET MVCL_CONC = NEW.FADE_DESC || ' MES' WHERE MVCL_TIPOREF = 31 AND MVCL_IDREF = NEW.FACT_ID;
            while (meses > 0) DO
                BEGIN
                if (exists (select fame_nit from facturas_mes where fame_nit = :nit and fame_sucursal = :sucursal and fame_ano = :ano and fame_mes = :mes)) then
                    exception mes_ya_facturado 'El cliente ' || :NIT || '-' || :sucursal || ' ya tiene una factura de ' || :ano || '-' || :mes;
                else
                    INSERT INTO facturas_mes (FAME_NIT, FAME_ANO, FAME_MES, FAME_IDFACT, FAME_SUCURSAL)
                        VALUES (:nit, :ANO, :MES, NEW.fact_id, :sucursal);
                UPDATE movimiento_clientes SET MVCL_CONC = MVCL_CONC || ' ' || :MES WHERE MVCL_TIPOREF = 31 AND MVCL_IDREF = NEW.FACT_ID;
                MES = MES + 1;
                MESES = MESES - 1;
                END
            END
        end
    END
END^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER TRIGGER FACTURAS_DETALLE_AU FOR FACTURAS_DETALLE
ACTIVE AFTER UPDATE POSITION 0
as
declare variable fec date;
declare variable CONC VARCHAR(60);
declare variable NOMCLI varchar(60);
declare variable Pref varchar(4);
declare variable Num varchar(8);
declare variable Nit varchar(20);
declare variable factor numeric(18,4);
declare variable INVFAC CHAR(2);
declare variable TIPO INTEGER;
declare variable PEDAUTO CHAR(2);
declare variable CONSO CHAR(2);
declare variable CONSOLIDA INTEGER;
declare variable consec INTEGER;
declare variable ESPOS CHAR(1);
declare variable BONOS CHAR(2);
declare variable VRBONO NUMERIC(18,2);
declare variable I INTEGER;
declare variable ITEM INTEGER;
declare variable CANTAUX NUMERIC(18,4);
declare variable CANTPEND NUMERIC(18,4);
declare variable CANT NUMERIC(18,4);
declare variable factmes char(2);
declare variable ano integer;
declare variable mes integer;
declare variable MESES integer;
declare variable grpfm VARCHAR(3);
declare variable grp VARCHAR(3);
declare variable SUCURSAL VARCHAR(10);
BEGIN
EXECUTE PROCEDURE LEE_CONFIGURACION('FACTURACION','FACTURAS','GENERAR PEDIDO AUTOMATICAMENTE CON LA FACTURA') RETURNING_VALUES (PEDAUTO);
execute procedure lee_configuracion('FACTURACION', 'FACTURAS', 'CONTROLAR FACTURACION MENSUAL POR CADA CLIENTE') returning_values (:factmes);
if ((OLD.fact_id <> 0) AND (OLD.fade_anulado = 'N')) then
    BEGIN
    if ((OLD.FADE_CANT * OLD.FADE_FACTOR <> NEW.fade_cant * NEW.fade_factor) or (OLD.fade_total <> NEW.fade_total) or (OLD.arti_cod <> NEW.arti_cod) or (NEW.fade_anulado = 'S')) then
        begin
        DELETE FROM MOVIMIENTO_ARTICULO WHERE (mvar_tipodoc = 31) and (mvar_idref = OLD.fact_id) and (mvar_item = old.fade_item);
        if ((OLD.fade_idpend <> 0) AND (OLD.fade_itempend <> 0)) then
            BEGIN
            /* ACTUALICE EL IDFACT EN EL PENDIENTE */
            UPDATE pendiente_ventas_detalle D SET D.pevd_idfact = 0 WHERE D.pend_id = OLD.fade_idpend AND D.pevd_item = OLD.fade_itempend;
            END

        if (PEDAUTO = 'SI') then
            BEGIN
            SELECT pref_pre, fact_numero from facturas where fact_id = OLD.fact_id
                into :Pref, :Num;
            SELECT PEDI_ID FROM PEDIDOS WHERE PREF_PRE = :pref AND PEDI_NUMERO = :num into :consec;
            if (consec is not null) then
              DELETE FROM PEDIDOS_DETALLE WHERE PEDE_ITEM = OLD.FADE_ITEM AND PEDI_ID = :consec;
            END
        ELSE
            BEGIN
            /* DESHAGA LOS PENDIENTES */
            select fact_consolida from facturas where fact_id = old.fact_id into :Consolida;
            if (CONSOLIDA <> 0) then
                begin
                CANTAUX = old.fade_cant * old.fade_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
            END
        delete from bonos_pago where bopa_factura = old.fact_id;
        if (factmes = 'SI') Then
            DELETE FROM facturas_mes WHERE FAME_IDFACT = OLD.fact_id;
        end
    END
if ((NEW.fact_id <> 0) and (new.fade_anulado = 'N')) then
    if ((OLD.fact_id = 0) OR (OLD.FADE_CANT * OLD.FADE_FACTOR <> NEW.fade_cant * NEW.fade_factor) or (OLD.fade_total <> NEW.fade_total) or (OLD.arti_cod <> NEW.arti_cod) or (OLD.fade_anulado = 'S')) then
      BEGIN
      select fact_fecha, pref_pre, fact_numero, terc_nit, fact_nomcliente, fact_consolida, fact_sucursal
            from facturas where fact_id = new.fact_id
            into :fec, :Pref, :Num, :Nit, :Nomcli, :Consolida, :sucursal;
      SELECT MAX(CEFA_TIPOORI) FROM consolide_faltantes WHERE CEFA_ID = :CONSOLIDA INTO :TIPO;
      if (Tipo IS NULL) then
        Tipo = 0;
      execute procedure lee_configuracion('FACTURACION', 'FACTURAS', 'AFECTAR INVENTARIO CON LA FACTURA') returning_values (:INVFAC);
      SELECT MIN(AUTO_ESPOS) FROM AUTORIZACIONES WHERE PREF_PRE = :pref INTO :ESPOS;
      if (ESPOS = 'S') then
        BEGIN
        INVFAC = 'SI';
        PEDAUTO = 'NO';
        END
       /* si se hizo con base en una remisi¢n no afecte inventario */
      if ((Tipo <> 32) and (INVFAC = 'SI')) then
        begin
        CANTPEND = 0;
        if ((NEW.fade_idpend <> 0) AND (NEW.fade_itempend <> 0)) then
          BEGIN
          /* ACTUALICE EL IDFACT EN EL PENDIENTE */
          select d.pevd_cant * d.pevd_factor from pendiente_ventas_detalle D WHERE D.pend_id = NEW.fade_idpend AND D.pevd_item = NEW.fade_itempend into :cantpend;
          if ((new.fade_cant * new.fade_factor) < cantpend) then
            exception cantidad_cruce_mayor 'La cantidad facturada ' || cast(new.fade_cant * new.fade_factor as varchar(20)) || ' es menor al pendiente previamente grabado' || cast(:cant as varchar(20));
          UPDATE pendiente_ventas_detalle D SET D.pevd_idfact = NEW.fact_id WHERE D.pend_id = NEW.fade_idpend AND D.pevd_item = NEW.fade_itempend AND ((D.pevd_idfact IS NULL) or (D.pevd_idfact = 0));
          END
        if (STRLEN(NOMCLI) > 29) then
            CONC = 'FACTURA DE VENTA No.' || PREF || NUM || '-' || SUBSTR(NOMCLI,1,29);
        ELSE
            CONC = 'FACTURA DE VENTA No.' || PREF || NUM || '-' || NOMCLI;
        DELETE FROM MOVIMIENTO_ARTICULO WHERE (mvar_tipodoc = 31) and (mvar_idref = OLD.fact_id) and (mvar_item = old.fade_item);
        execute procedure factor_unidad_cant(new.arti_cod, new.fade_unidad) returning_values(factor);
        if ((((:factor * new.fade_cant) - cantpend) > 0) or (new.fade_cant < 0)) then
            BEGIN
            INSERT INTO MOVIMIENTO_ARTICULO
                (ARTI_COD, BODE_COD, MVAR_FECHA, MVAR_TIPODOC, MVAR_IDREF, MVAR_CONC, MVAR_CANT, MVAR_COSTO, MVAR_ENTRADA, MVAR_LOTE, MVAR_PREF, MVAR_NUMERO, MVAR_ITEM, TERC_NIT)
                VALUES(NEW.ARTI_COD, NEW.BODE_COD, :FEC, 31, NEW.fact_id,
                :CONC, :factor * new.fade_cant, 0, 'N', new.fade_lote, :Pref, :Num, new.fade_item, :Nit);
            END
        end
      if (PEDAUTO = 'SI') then
        BEGIN
        INSERT INTO PEDIDOS_DETALLE (PEDI_ID, PEDE_ITEM, ARTI_COD, PEDE_CANT, PEDE_UNIDAD, PEDE_DTOPORC, PEDE_DTOMONTO, PEDE_IVAPORC, PEDE_IVAMONTO, PEDE_CONSUMO, PEDE_FACTOR, PEDE_DESC, PEDE_OBS, PEDE_CODBAR, PEDE_TOTAL, PEDE_ANULADO, PEDE_TRANSMIT, LIPR_COD, PEDE_REFERENCIA, PEDE_PRUNIT, PEDE_FACTURAD, PEDE_REMISIONAD, PEDE_RESERVA, BODE_COD)
            VALUES (0, NEW.FADE_ITEM, NEW.ARTI_COD, NEW.FADE_CANT, NEW.FADE_UNIDAD, NEW.FADE_DTOPORC, NEW.FADE_DTOMONTO, NEW.FADE_IVAPORC, NEW.FADE_IVAMONTO, NEW.FADE_CONSUMO, NEW.FADE_FACTOR, NEW.FADE_DESC, NEW.FADE_OBS, NEW.FADE_CODBAR, NEW.FADE_TOTAL, 'N', 'N', NEW.LIPR_COD, NEW.FADE_REFERENCIA, NEW.FADE_PRUNIT, NEW.FADE_CANT * NEW.FADE_FACTOR, 0, NEW.FADE_CANT * NEW.FADE_FACTOR, NEW.bode_cod);
        END
      ELSE
        BEGIN
        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.fact_id, COFA_CANTCR = COFA_CANT * COFA_FACTOR, COFA_FECDES = :fec
                    where COFA_ID = :consolida AND ARTI_COD = NEW.ARTI_COD;
            ELSE
                BEGIN
                CANTAUX = new.fade_cant * new.fade_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.fact_id, COFA_CANTCR = COFA_CANT * COFA_FACTOR, COFA_FECDES = :fec
                                where COFA_ID = :consolida and COFA_ITEM = :ITEM;
                            CANTAUX = CANTAUX - CANT;
                            end
                        else
                            begin
                            update consolidado_faltantes
                                set COFA_IDDES = new.fact_id, COFA_CANTCR = COFA_CANTCR + :CANTAUX, COFA_FECDES = :fec
                                where COFA_ID = :consolida and COFA_ITEM = :ITEM;
                            CANTAUX = 0;
                            end
                    end
                END
            END
        END
      EXECUTE procedure LEE_CONFIGURACION ('FACTURACION', 'ARTICULOS', 'PERMITIR GENERAR BONOS DE PAGO AL FACTURAR ARTICULOS SELECCIONADOS') returning_values (BONOS);
      if (BONOS = 'SI') then
        BEGIN
        SELECT ARTI_VALORBONO FROM ARTICULO WHERE ARTI_COD = NEW.arti_cod INTO :VRBONO;
        if (VRBONO <> 0) then
            BEGIN
            I = 1;
            WHILE (I <= (NEW.fade_cant * NEW.fade_factor)) DO
                BEGIN
                INSERT INTO BONOS_PAGO (BOPA_ID, BOPA_FACTURA, BOPA_PREF, BOPA_NUMERO, BOPA_FECHA, BOPA_ITEM, BOPA_MONTO, BOPA_IDRDC)
                    VALUES (GEN_ID(ID_BONOPAGO, 1), NEW.fact_id, :pref, :num, :fec, :I, :VRBONO, 0);
                I = I + 1;
                END
            END
        END
      if (factmes = 'SI') Then
        begin
        execute procedure lee_configuracion('FACTURACION', 'FACTURAS', 'GRUPO DE MERCANCIA PARA CONTROL MENSUAL DE FACTURACION') returning_values (:grpfm);
        SELECT GRUP_COD FROM ARTICULO WHERE ARTI_COD = NEW.arti_cod INTO :GRP;
        if (GRP = :GRPFM) then
            BEGIN
            /* actualice el control de facturacion */
            ano = extract(year from :fec);
            mes = extract(month from :fec);
            MESES = NEW.fade_cant;
            UPDATE movimiento_clientes SET MVCL_CONC = NEW.FADE_DESC || ' MES' WHERE MVCL_TIPOREF = 31 AND MVCL_IDREF = NEW.FACT_ID;
            while (meses > 0) DO
                BEGIN
                if (exists (select fame_nit from facturas_mes where fame_nit = :nit and fame_sucursal = :sucursal and fame_ano = :ano and fame_mes = :mes)) then
                    exception mes_ya_facturado 'El cliente ' || :NIT || '-' || :sucursal || ' ya tiene una factura de ' || :ano || '-' || :mes;
                else
                    INSERT INTO facturas_mes (FAME_NIT, FAME_ANO, FAME_MES, FAME_IDFACT, FAME_SUCURSAL)
                        VALUES (:nit, :ANO, :MES, NEW.fact_id, :sucursal);
                UPDATE movimiento_clientes SET MVCL_CONC = MVCL_CONC || ' ' || :MES WHERE MVCL_TIPOREF = 31 AND MVCL_IDREF = NEW.FACT_ID;
                MES = MES + 1;
                MESES = MESES - 1;
                END
            END
        end
      END
END^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER procedure REP_FACTURAS_MES (
    DESDE varchar(20),
    HASTA varchar(20),
    GRPINI varchar(5),
    GRPFIN varchar(5),
    ANO varchar(4),
    MES integer,
    ORDEN char(1),
    AGRUPA char(1))
returns (
    NIT varchar(20),
    NOMBRE varchar(60),
    TELEFONO varchar(40),
    CIUDAD varchar(40),
    CONTACTO varchar(60),
    EMAIL varchar(100),
    FAX varchar(25),
    CEL varchar(25),
    CODCLI varchar(20),
    CODZONA varchar(2),
    NOMZONA varchar(60),
    CODCOBR integer,
    NOMCOBR varchar(60),
    DV char(1),
    CODCIUD char(5),
    NOMCIUD varchar(60),
    SUCURSAL varchar(10),
    NOMSUC varchar(60))
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);
begin
if (ORDEN = 'C') then
    BEGIN
    NITINI = DESDE;
    NITFIN = HASTA;
    NOMINI = '';
    NOMFIN = 'zz';
    END
ELSE
    BEGIN
    NOMINI = DESDE;
    NOMFIN = HASTA;
    NITINI = '';
    NITFIN = 'zz';
    END
FOR select T.TERC_NIT, TERC_NOM, TERC_DV, CLSU_TEL, CLSU_CIUDAD, S.COBR_COD, S.ZONA_COD, T.CIUD_COD, CLCU_COD, CLSU_NOMBRE, TERC_CONTACTO, TERC_EMAIL, TERC_FAX, TERC_CEL, CLIE_COD
    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
        T.TERC_NOM >= :NOMINI AND T.TERC_NOM <= :NOMFIN
    INTO :NIT, :NOMBRE, :DV, :TELEFONO, :CIUDAD, :CODCOBR, :CODZONA, :CODCIUD, :SUCURSAL, :NOMSUC, :CONTACTO, :EMAIL, :FAX, :CEL, :CODCLI
    DO  
    BEGIN
    SELECT COBR_NOM FROM COBRADORES CB WHERE COBR_COD = :CODCOBR INTO :NOMCOBR;
    SELECT ZONA_NOM FROM ZONAS Z 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
        if (NOT EXISTS (SELECT FAME_IDFACT FROM FACTURAS_MES WHERE FAME_NIT = :nit AND FAME_SUCURSAL = :sucursal AND FAME_ANO = :ANO AND FAME_MES = :MES)) then
            SUSPEND;
        END
    END
end^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER procedure REP_SIN_FACTURAS_MES (
    DESDE varchar(20),
    HASTA varchar(20),
    GRPINI varchar(5),
    GRPFIN varchar(5),
    ANO varchar(4),
    MES integer,
    ORDEN char(1),
    AGRUPA char(1))
returns (
    NIT varchar(20),
    NOMBRE varchar(60),
    TELEFONO varchar(40),
    CIUDAD varchar(40),
    CONTACTO varchar(60),
    EMAIL varchar(100),
    FAX varchar(25),
    CEL varchar(25),
    CODCLI varchar(20),
    CODZONA varchar(2),
    NOMZONA varchar(60),
    CODCOBR integer,
    NOMCOBR varchar(60),
    DV char(1),
    CODCIUD char(5),
    NOMCIUD varchar(60),
    SUCURSAL varchar(10),
    NOMSUC varchar(60))
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);
begin
if (ORDEN = 'C') then
    BEGIN
    NITINI = DESDE;
    NITFIN = HASTA;
    NOMINI = '';
    NOMFIN = 'zz';
    END
ELSE
    BEGIN
    NOMINI = DESDE;
    NOMFIN = HASTA;
    NITINI = '';
    NITFIN = 'zz';
    END
FOR select T.TERC_NIT, TERC_NOM, TERC_DV, CLSU_TEL, CLSU_CIUDAD, S.COBR_COD, S.ZONA_COD, T.CIUD_COD, CLCU_COD, CLSU_NOMBRE, TERC_CONTACTO, TERC_EMAIL, TERC_FAX, TERC_CEL, CLIE_COD
    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
        T.TERC_NOM >= :NOMINI AND T.TERC_NOM <= :NOMFIN
    INTO :NIT, :NOMBRE, :DV, :TELEFONO, :CIUDAD, :CODCOBR, :CODZONA, :CODCIUD, :SUCURSAL, :NOMSUC, :CONTACTO, :EMAIL, :FAX, :CEL, :CODCLI
    DO  
    BEGIN
    SELECT COBR_NOM FROM COBRADORES CB WHERE COBR_COD = :CODCOBR INTO :NOMCOBR;
    SELECT ZONA_NOM FROM ZONAS Z 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
        if (NOT EXISTS (SELECT FAME_IDFACT FROM FACTURAS_MES WHERE FAME_NIT = :nit AND FAME_SUCURSAL = :sucursal AND FAME_ANO = :ANO AND FAME_MES = :MES)) then
            SUSPEND;
        END
    END
end^

SET TERM ; ^

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 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 ; ^

/* 20140225 */
/* SI PORCENTAJE EN CERO CALCULAR EL PORCENTAJE CON BASE Y MONTO */
SET TERM ^ ;

CREATE OR ALTER TRIGGER COMPROBANTE_DETALLE_BI FOR COMPROBANTE_DETALLE
ACTIVE BEFORE INSERT POSITION 1
AS
DECLARE VARIABLE OK CHAR(1);
DECLARE VARIABLE TERCERO CHAR(1);
DECLARE VARIABLE RETENCION CHAR(1);
DECLARE VARIABLE CENTRO CHAR(1);
declare variable TIPO CHAR(1);
declare variable TICO VARCHAR(3);
declare variable NUMCOMP VARCHAR(12);
BEGIN
SELECT TICO_COD, PRCO_PREF || ENCO_NUMERO FROM COMPROBANTE_ENCABEZADO WHERE ENCO_CONSEC = NEW.enco_consec INTO :TICO, :numcomp;
/* VERIFIQUE QUE LA CUENTA EXISTA Y QUE SEA AFECTABLE */
EXECUTE PROCEDURE VALIDE_CUENTA (NEW.CUEN_COD) RETURNING_VALUES (:OK);
IF (OK = 'S') THEN
  BEGIN
  IF (NEW.CODE_DEBITO IS NULL) THEN
    NEW.CODE_DEBITO = 0;
  IF (NEW.CODE_CREDITO IS NULL) THEN
    NEW.CODE_CREDITO = 0;
  if (NEW.code_base IS NULL) then
    NEW.CODE_BASE = 0;
  if (NEW.code_porc IS NULL) then
    NEW.CODE_PORC = 0;
  if (NEW.code_descontable IS NULL) then
    NEW.code_descontable = 'S';
  if ((NEW.code_base <> 0) AND (NEW.CODE_PORC = 0) AND ((NEW.code_debito <> 0) or (NEW.code_credito <> 0))) then
    NEW.code_porc = (NEW.code_debito - NEW.code_credito) * 100 / NEW.code_base;
  IF ((NEW.TERC_NIT IS NULL) or (new.terc_nit = '')) THEN
    EXECUTE PROCEDURE LEE_CONFIGURACION('CONTABILIDAD', 'GENERAL', 'NIT COMPAÑIA') RETURNING_VALUES (NEW.TERC_NIT);
  IF ((NEW.PROY_COD IS NULL) or (new.proy_cod = '')) THEN
    EXECUTE PROCEDURE LEE_CONFIGURACION('CONTABILIDAD', 'GENERAL', 'PROYECTO UNICO') RETURNING_VALUES (NEW.PROY_COD);
  IF ((NEW.CENT_COD IS NULL) or (new.cent_cod = '')) THEN
    EXECUTE PROCEDURE LEE_CONFIGURACION('CONTABILIDAD', 'GENERAL', 'CENTRO DE COSTOS UNICO') RETURNING_VALUES (NEW.CENT_COD);
  SELECT CUEN_TERCERO, CUEN_RETENCION, CUEN_CENTRO, CUEN_TIPO FROM CUENTAS WHERE CUEN_COD = NEW.CUEN_COD INTO :TERCERO, :RETENCION, :CENTRO, :TIPO;
  /* VERIFIQUE QUE LA CUENTA PERMITA RETENCION Y VERIFIQUE EL TERCERO */
  IF (TERCERO = 'S' OR RETENCION = 'S') THEN
    EXECUTE PROCEDURE EXISTE_TERCERO (NEW.TERC_NIT) RETURNING_VALUES (:OK);
  ELSE
    EXECUTE PROCEDURE LEE_CONFIGURACION('CONTABILIDAD', 'GENERAL', 'NIT COMPAÑIA') RETURNING_VALUES (NEW.TERC_NIT);
  IF (OK = 'S') THEN
    BEGIN
    /* SI LA CUENTA ES DE RETENCION ASEGURECE QUE TENGA BASE Y PORCENTAJE */
    IF (RETENCION = 'S') THEN
      BEGIN
      IF (NEW.CODE_BASE = 0) THEN
        EXCEPTION FALTA_BASE :tico || '-' || :numcomp || ' FALTA INDICAR LA BASE PARA LA CUENTA ' || NEW.cuen_cod || '-' || NEW.terc_nit;
      ELSE
        BEGIN
        if (NEW.code_porc = 0) then
            NEW.code_porc = ((NEW.code_debito-NEW.code_credito)/NEW.code_base)*100;
        END
      END
    ELSE
       BEGIN
      IF (CENTRO = 'S') THEN
        EXECUTE PROCEDURE EXISTE_CENTRO (NEW.PROY_COD, NEW.CENT_COD) RETURNING_VALUES (:OK);
        ELSE
        BEGIN
        EXECUTE PROCEDURE LEE_CONFIGURACION('CONTABILIDAD', 'GENERAL', 'PROYECTO UNICO') RETURNING_VALUES (NEW.PROY_COD);
        EXECUTE PROCEDURE LEE_CONFIGURACION('CONTABILIDAD', 'GENERAL', 'CENTRO DE COSTOS UNICO') RETURNING_VALUES (NEW.CENT_COD);
          END
        END
    END
  if (:TIPO = 'I') then
    BEGIN
    if (NEW.ARTI_COD IS NULL) then
        EXCEPTION FALTA_ARTICULO :tico || '-' || :numcomp || ' FALTA INDICAR EL ARTICULO PARA LA CUENTA ' || NEW.cuen_cod;
    END
  if (:TIPO = 'A') then
    BEGIN
    if (NEW.ARTI_COD IS NULL) then
        EXCEPTION FALTA_ACTIVO :tico || '-' || :numcomp || ' FALTA INDICAR EL ACTIVO PARA LA CUENTA ' || NEW.cuen_cod;
    END
  END
END^

SET TERM ; ^

/* 20140225F */
/* VERIFICAR MONTO DE LA NOTA ASOCIADA POR SI ACASO YA QUE EL NUMERO PUEDE QUEDAR GRABADO */

SET TERM ^ ;

CREATE OR ALTER TRIGGER TRASLADOS_AU FOR TRASLADOS
ACTIVE AFTER UPDATE POSITION 0
AS
declare variable CONC VARCHAR(60);
declare variable ID INTEGER;
declare variable consec INTEGER;
BEGIN
/* borre la contabilizacion */
if (new.tras_anulado = 'S') then
    begin
    select enco_consec from comprobante_encabezado where enco_tiporef = 76 and enco_idref = old.tras_id into :consec;
    if (NOT consec is null) then
      delete from comprobante_detalle where enco_consec = :consec;
    delete from comprobante_encabezado where enco_tiporef = 76 and enco_idref = old.tras_id;
    INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD, AUDI_TICO)
        VALUES (USER,76, NEW.tras_id, 'A', NEW.prba_pref || NEW.tras_numero, NEW.cuba_cod);
    end

if ((old.tras_id <> 0) and (old.tras_anulado = 'N')) then
    begin
    UPDATE MOVIMIENTO_BANCO
        SET MOBA_CONCEPTO = 'ANULADO', MOBA_TOTAL = 0
        WHERE MOBA_TIPODOC = 76 AND MOBA_IDREF = NEW.tras_id;
    DELETE FROM MOVIMIENTO_BANCO
        WHERE MOBA_TIPODOC <> 76 AND MOBA_TIPOREF = 76 AND MOBA_IDREF = NEW.tras_id;
    if (new.tras_anulado = 'N') then
        DELETE FROM notas_debito
            WHERE PRBA_PREF = OLD.tras_notapref AND NDBC_NUMERO = OLD.tras_nota AND CUBA_COD = OLD.cuba_cod and NDBC_MONTO = OLD.tras_notamonto;
    else
        UPDATE notas_debito SET NDBC_ANULADO = 'S'
            WHERE PRBA_PREF = OLD.tras_notapref AND NDBC_NUMERO = OLD.tras_nota AND CUBA_COD = OLD.cuba_cod and NDBC_MONTO = OLD.tras_notamonto;
    END
if ((NEW.tras_id <> 0) AND (NEW.TRAS_ANULADO = 'N')) then
    BEGIN
    /* Inserte el movimiento de la cuenta origen */
    INSERT INTO MOVIMIENTO_BANCO
        (MOBA_ID, CUBA_COD, MOBA_TIPODOC, MOBA_PREF, MOBA_NUMERO, MOBA_FECHA, MOBA_CONCEPTO, MOBA_TOTAL, MOBA_DB, MOBA_IDREF, MOBA_TIPOREF)
        VALUES(GEN_ID(ID_MOVBANCO,1), NEW.cuba_cod, 76, NEW.PRBA_PREF, NEW.tras_numero, NEW.tras_fecha, NEW.tras_concepto, NEW.tras_monto, 'N', new.tras_id, 76);
    /* Inserte el movimiento de la cuenta destino */
    INSERT INTO MOVIMIENTO_BANCO
        (MOBA_ID, CUBA_COD, MOBA_TIPODOC, MOBA_PREF, MOBA_NUMERO, MOBA_FECHA, MOBA_CONCEPTO, MOBA_TOTAL, MOBA_DB, MOBA_IDREF, MOBA_TIPOREF)
        VALUES(GEN_ID(ID_MOVBANCO,1), NEW.tras_ctadest, 76, NEW.PRBA_PREF, NEW.tras_numero, NEW.tras_fecha, NEW.tras_concepto, NEW.tras_monto, 'S', new.tras_id, 76);
    if (new.tras_gmfmonto <> 0) then
        begin
        conc = 'GMF EN TRASLADO No. ' || NEW.PRBA_PREF || NEW.TRAS_NUMERO;
        INSERT INTO MOVIMIENTO_BANCO
            (MOBA_ID, CUBA_COD, MOBA_TIPODOC, MOBA_PREF, MOBA_NUMERO, MOBA_FECHA, MOBA_CONCEPTO, MOBA_TOTAL, MOBA_DB, MOBA_IDREF, MOBA_TIPOREF)
            VALUES(GEN_ID(ID_MOVBANCO,1), NEW.cuba_cod, 79, NEW.PRBA_PREF, NEW.tras_numero, NEW.tras_fecha, :conc, NEW.tras_gmfmonto, 'N', new.tras_id, 76);
        end
    if (new.tras_notamonto <> 0) then
        begin
        conc = 'COMISION EN TRASLADO No. ' || NEW.PRBA_PREF || NEW.TRAS_NUMERO;
        EXECUTE PROCEDURE CAMBIE_ID_NOTA_DB_BANCO returning_values (ID);
        INSERT INTO NOTAS_DEBITO
            (NDBC_ID, CUBA_COD, PRBA_PREF, NDBC_NUMERO, NDBC_FECHA, NDBC_CONCEPTO, NDBC_MONTO, NDBC_IVAPORC, NDBC_IVAMONTO, NDBC_GMFPORC, NDBC_GMFMONTO, NDBC_ANULADO, NDBC_TRANSMIT)
            VALUES(:ID, NEW.cuba_cod, NEW.PRBA_PREF, NEW.tras_nota, NEW.tras_fecha, :conc, NEW.tras_notamonto, NEW.tras_ivaporc2, new.tras_ivamonto2, 0, 0, 'N', 'N');
        end
    INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD, AUDI_TICO)
        VALUES (NEW.tras_usuario, 76, NEW.tras_id, 'U', NEW.prba_pref || NEW.tras_numero, NEW.cuba_cod);
    END
END^

SET TERM ; ^

/* 20140226B */
/* RETENCIONES EN ORDENES DE COMPRA */

ALTER TABLE ORDENES_COMPRA
ADD ORDC_RTFTEPORC T_PORCENTAJE;

ALTER TABLE ORDENES_COMPRA
ADD ORDC_RTFTEMONTO T_MONTO;

ALTER TABLE ORDENES_COMPRA
ADD ORDC_RTIVAPORC T_PORCENTAJE;

ALTER TABLE ORDENES_COMPRA
ADD ORDC_RTIVAMONTO T_MONTO;

ALTER TABLE ORDENES_COMPRA
ADD ORDC_RTICAPORC T_PORCENTAJE;

ALTER TABLE ORDENES_COMPRA
ADD ORDC_RTICAMONTO T_MONTO;

ALTER TABLE ORDENES_COMPRA
ADD ORDC_RTCREE T_PORCENTAJE;

ALTER TABLE ORDENES_COMPRA
ADD ORDC_RTCREEM T_MONTO;

UPDATE ORDENES_COMPRA SET ORDC_RTFTEPORC = 0,ORDC_RTFTEMONTO = 0,ORDC_RTIVAPORC = 0,ORDC_RTIVAMONTO = 0,ORDC_RTICAPORC = 0,ORDC_RTICAMONTO = 0, ORDC_RTCREE = 0,ORDC_RTCREEM = 0
    WHERE ORDC_RTFTEMONTO IS NULL;
COMMIT WORK;

/* 20140304 */
/* STRING TRUNCATION POR NUMERO DE 8 DIGITOS EN PEDIDO AUTOMATICO */
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 = OLD.fact_numero;
            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, RIGHT(NEW.FACT_NUMERO,6), 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 ; ^

/* 20140304B */
/* leve mejora en rendimiento generando certificados, sin embargo si se usa tabla de configuracion se demoran en promedio 2seg
   por tercero sin importar si hay movimiento o no */
SET TERM ^ ;

CREATE OR ALTER procedure CERTIFICADOS_RETENCION (
    NITINI varchar(20),
    NITFIN varchar(20),
    CTAINI varchar(20),
    CTAFIN varchar(20),
    FECINI varchar(8),
    FECFIN varchar(8),
    FECEXP date,
    ADMON varchar(60),
    NUMERAR char(1),
    INICIAL varchar(6))
returns (
    NIT varchar(20),
    NOMBRE varchar(60),
    DIRECCION varchar(60),
    CIUDAD varchar(40),
    CODCUENTA varchar(20),
    NOMCUENTA varchar(60),
    BASEIVA numeric(18,2),
    BASE numeric(18,2),
    PORC numeric(9,2),
    RETENCION numeric(18,2),
    FECHAEXP date,
    ADMINISTRACION varchar(60),
    NUMERO varchar(20))
AS
declare variable actual integer;
declare variable ANOINI CHAR(4);
declare variable MESINI CHAR(2);
declare variable FECHAINI CHAR(8);
declare variable SALDORET NUMERIC(18,2);
declare variable SALDOBASE NUMERIC(18,2);
declare variable CTARTIVA VARCHAR(20);
declare variable CTAIVA VARCHAR(20);
declare variable BASEDB NUMERIC(18,2);
declare variable BASECR NUMERIC(18,2);
declare variable BASERET NUMERIC(18,2);
begin
EXECUTE PROCEDURE LEE_CONFIGURACION ('CONTABILIDAD', 'GENERAL', 'AÑO DE INICIO') RETURNING_VALUES (:ANOINI);
EXECUTE PROCEDURE LEE_CONFIGURACION ('CONTABILIDAD', 'GENERAL', 'MES DE INICIO') RETURNING_VALUES (:MESINI);
execute procedure lee_configuracion('CONTABILIDAD', 'GENERAL', 'CUENTA DE RETENCION DE IVA PARA CERTIFICADOS') returning_values (:CTARTIVA);
execute procedure lee_configuracion('CONTABILIDAD', 'GENERAL', 'CUENTA DE IVA PARA CERTIFICADOS DE RETENCION DE IVA') returning_values (:CTAIVA);
execute procedure compone_fecha_conta (:ANOINI, CAST(:MESINI AS INTEGER), 1) returning_values (FECHAINI);
FECHAEXP = FECEXP;
ADMINISTRACION = ADMON;
ACTUAL = CAST(INICIAL AS INTEGER);
FOR SELECT TERC_NIT, TERC_NOM, TERC_DIR, TERC_CIU FROM TERCEROS
  WHERE TERC_NIT >= :NITINI AND TERC_NIT <= :NITFIN ORDER BY TERC_NIT
  INTO :NIT, :NOMBRE, :DIRECCION, :CIUDAD
  DO
    BEGIN
    FOR SELECT CUEN_COD, CUEN_NOM, CUEN_PORC FROM CUENTAS WHERE CUEN_RETENCION = 'S' AND
      CUEN_COD >= :CTAINI AND CUEN_COD <= :CTAFIN
      INTO :CODCUENTA, :NOMCUENTA, :PORC
      DO
        BEGIN
        SALDORET = 0;
        SALDOBASE = 0;
        if (FECHAINI > FECINI) then
            BEGIN
            /* INCLUYA LOS SALDOS INICIALES EN EL CERTIFICADO */
            SELECT SUM(SAIN_DEBITO-SAIN_CREDITO) FROM SALDOS_INICIALES
                WHERE CUEN_COD = :CODCUENTA AND TERC_NIT = :NIT
                INTO :SALDORET;
            if (SALDORET IS NULL) then
                SALDORET = 0;
            if (PORC <> 0) then
                SALDOBASE = SALDORET * 100 / PORC;
            END
        /* SUME LOS MOVIMIENTOS DEL AÑO DE LAS CUENTAS RELACIONADAS */
        SELECT SUM(CODE_DEBITO - CODE_CREDITO)
          FROM COMPROBANTE_ENCABEZADO E, COMPROBANTE_DETALLE D, configura_certrete C
          WHERE E.ENCO_CONSEC = D.ENCO_CONSEC AND SUBSTRING(CUEN_COD FROM 1 FOR STRLEN(C.cfcr_ctabase)) = C.cfcr_ctabase AND D.TERC_NIT = :NIT AND
          ENCO_FECHA >= :FECINI AND ENCO_FECHA <= :FECFIN AND C.cfcr_cuenta = :codcuenta AND C.cfcr_base = 'N'
          INTO :base;
        if (BASE is null) then
            BASE = 0;
        SELECT SUM(CODE_DEBITO)
          FROM COMPROBANTE_ENCABEZADO E, COMPROBANTE_DETALLE D, configura_certrete C
          WHERE E.ENCO_CONSEC = D.ENCO_CONSEC AND SUBSTRING(CUEN_COD FROM 1 FOR STRLEN(C.cfcr_ctabase)) = C.cfcr_ctabase AND D.TERC_NIT = :NIT AND
          ENCO_FECHA >= :FECINI AND ENCO_FECHA <= :FECFIN AND C.cfcr_cuenta = :codcuenta AND C.cfcr_base = 'D'
          INTO :basedb;
        if (BASEDB is null) then
            BASEDB = 0;
        SELECT SUM(CODE_CREDITO)
          FROM COMPROBANTE_ENCABEZADO E, COMPROBANTE_DETALLE D, configura_certrete C
          WHERE E.ENCO_CONSEC = D.ENCO_CONSEC AND SUBSTRING(CUEN_COD FROM 1 FOR STRLEN(C.cfcr_ctabase)) = C.cfcr_ctabase AND D.TERC_NIT = :NIT AND
          ENCO_FECHA >= :FECINI AND ENCO_FECHA <= :FECFIN AND C.cfcr_cuenta = :codcuenta AND C.cfcr_base = 'C'
          INTO :basecr;
        if (BASECR is null) then
            BASECR = 0;
        BASE = BASE + BASEDB + BASECR;
        SELECT SUM(CODE_BASE), SUM(CODE_DEBITO - CODE_CREDITO)
          FROM COMPROBANTE_ENCABEZADO E, COMPROBANTE_DETALLE D
          WHERE E.ENCO_CONSEC = D.ENCO_CONSEC AND CUEN_COD = :codcuenta AND D.TERC_NIT = :NIT AND
          ENCO_FECHA >= :FECINI AND ENCO_FECHA <= :FECFIN
          INTO :BASERET, :RETENCION;
        if (RETENCION is null) then
            RETENCION = 0;
        if (BASERET is null) then
            BASERET = 0;
        if ((BASE = 0) or (BASE IS NULL))  then
            BASE = BASERET;
        /* CALCULO DE LA BASE DEL IVA SI EL CERIFICADO ES DE RETEIVA */
        if (SUBSTRING(CTAINI FROM 1 FOR STRLEN(CTARTIVA)) = CTARTIVA) then
            BEGIN
            BASEIVA = 0;
            SELECT SUM(CODE_BASE) FROM COMPROBANTE_ENCABEZADO E, COMPROBANTE_DETALLE D
              WHERE E.ENCO_CONSEC = D.ENCO_CONSEC AND SUBSTRING(CUEN_COD FROM 1 FOR strlen(:ctaiva)) = :CTAIVA AND D.TERC_NIT = :NIT AND
              ENCO_FECHA >= :FECINI AND ENCO_FECHA <= :FECFIN AND EXISTS (SELECT ENCO_CONSEC FROM comprobante_detalle WHERE ENCO_CONSEC = D.enco_consec AND CUEN_COD = :CODCUENTA)
              INTO :BASEIVA;
            if (BASEIVA IS NULL) then
                BASEIVA = 0;
--            if (PORC <> 0) then
--                BASEIVA = BASE * 100 / PORC;
--            ELSE
--                BASEIVA = 0;
            END
        BASE = BASE + SALDOBASE;
        RETENCION = RETENCION + SALDORET;
        if (RETENCION <> 0) then
            begin
            if (substr(CODCUENTA, 1, 1) = '2') then
                BEGIN
                if (BASE < 0) then
                    BASE = BASE * -1;
                RETENCION = RETENCION * -1;
                END
            if (numerar = 'S') then
                BEGIN
                NUMERO = CAST(ACTUAL AS CHAR(6));
                EXECUTE PROCEDURE COMPLETA_CEROS(NUMERO) returning_values (NUMERO);
                NUMERO = 'NUMERO: ' || NUMERO;
                ACTUAL = ACTUAL + 1;
                END
            ELSE
                NUMERO = '';
            SUSPEND;
            end
        END
    END
end^

SET TERM ; ^

/* 20140306 */
/* BUSQUEDA POR CODIGOS DE BARRA CUANDO HAY VARIOS */
SET TERM ^ ;

CREATE OR ALTER procedure CONSULTA_ARTICULOS_VTAS (
    FECHA date,
    INACTIVOS char(1),
    MODULO varchar(20),
    BUSCAR varchar(100),
    CUALQUIERA char(1),
    COLUMNA integer,
    BUSCAR2 varchar(30),
    BUSCAR3 varchar(30),
    BUSCAR4 varchar(30),
    BUSCAR5 varchar(30))
returns (
    CODIGO varchar(20),
    DES varchar(60),
    REF varchar(20),
    GRUPO varchar(30),
    SUBGR varchar(3),
    MARCA varchar(30),
    UNIDAD varchar(8),
    ESTADO varchar(30),
    IVA numeric(9,2),
    EXISTEN numeric(18,2),
    PRECIO numeric(18,2),
    CLASE char(1))
AS
DECLARE VARIABLE LISTA INTEGER;
DECLARE VARIABLE EXIST CHAR(2);
DECLARE VARIABLE SINEXIST CHAR(2);
declare variable DIG INTEGER;
declare variable OK CHAR(1);
declare variable USARDC CHAR(2);
declare variable DESCORTA VARCHAR(60);
BEGIN
EXISTEN = 0;
EXECUTE PROCEDURE lee_configuracion ('FACTURACION','ARTICULOS', 'VER EXISTENCIA EN CONSULTA ARTICULOS') returning_values (:EXIST);
SELECT FIRST 1 LIPR_COD FROM LISTA_PRECIOS L, USUARIO U WHERE USER_COD = USER AND ((L.SUCU_ID = U.sucu_id) or (L.SUCU_ID = 0) or (U.SUCU_ID = 0)) AND LIPR_PREDET = 'S'
    INTO :LISTA;
if (modulo = 'FACTURACION') then
  EXECUTE PROCEDURE lee_configuracion ('FACTURACION','ARTICULOS','VER ARTICULOS SIN EXISTENCIA EN CONSULTA DE ARTICULOS') returning_values (:sinexist);
else
  sinexist = 'SI';
EXECUTE PROCEDURE LEE_CONFIGURACION ('FACTURACION', 'ARTICULOS', 'REDONDEO AL MULTIPLO DE DIEZ EN PRECIOS') returning_values (DIG);
EXECUTE PROCEDURE LEE_CONFIGURACION ('FACTURACION', 'ARTICULOS', 'USAR DESCRIPCION CORTA EN LUGAR DE LA ESTANDAR EN BUSQUEDA Y DOCUMENTOS DE VENTA') returning_values (USARDC);
if ((USARDC = 'SI') AND (COLUMNA = 1)) then
    COLUMNA = 4;
if (LISTA > 0) then
    BEGIN
    if ((BUSCAR IS NOT NULL) AND (BUSCAR <> '')) then
      BEGIN
      if (COLUMNA = 3) then
        BEGIN
        FOR select arti_cod, coba_cod from barras_articulo b where (upper(b.coba_cod) like upper(:buscar)) and
            ((:INACTIVOS = 'S') or (b.coba_activo = 'S'))
            into :codigo, :ref
            do
            begin
            select arti_des, grup_cod, subg_cod, arti_unidad, esar_cod, taiv_porc, marc_cod,arti_clase, ARTI_DESCORTA
                from articulo a, tarifa_iva t
                where a.taiv_cod = t.taiv_cod and arti_cod = :codigo
                INTO :DES, :GRUPO, :SUBGR, :UNIDAD, :ESTADO, :IVA, :MARCA, :CLASE, :DESCORTA;
            if (USARDC = 'SI') then
                DES = DESCORTA;
            PRECIO = 0;
            SELECT prar_fijo PRECIO FROM precios_articulo WHERE arti_cod = :CODIGO and lipr_cod = :LISTA INTO :PRECIO;
            EXECUTE PROCEDURE redondee(PRECIO, DIG) returning_values (PRECIO);
            if (EXIST = 'SI') then
                BEGIN
                EXECUTE PROCEDURE saldo_total_inventario (:CODIGO, :FECHA) returning_values (:EXISTEN);
                if ((SINEXIST = 'SI')  or (existen <> 0)) then
                    OK = 'S';
                END
            ELSE
                OK = 'S';
            if (ok = 'S') then
                suspend;
            end
        END
      ELSE
        BEGIN
        FOR select a.arti_cod, arti_des, grup_cod, subg_cod, arti_unidad, esar_cod, taiv_porc, marc_cod,arti_clase, ARTI_DESCORTA
            from articulo a, tarifa_iva t
            where a.taiv_cod = t.taiv_cod and substring(a.arti_cod from 1 FOR 2) <> '.t' and
            ((:INACTIVOS = 'S') or (esar_cod = 'A') or ((:INACTIVOS = 'C') AND (esar_cod = 'N'))) AND
            ((:COLUMNA <> 0) or (upper(A.ARTI_COD) like upper(:buscar))) AND
            ((:columna <> 1) or (upper(A.ARTI_DES) like upper(:buscar))) AND
            ((:columna <> 4) or (upper(A.ARTI_DESCORTA) like upper(:buscar))) AND
            ((:columna <> 2) or (upper(A.ARTI_OBS) like upper(:buscar)) or (upper(A.ARTI_DES) like upper(:buscar)))
            INTO :CODIGO, :DES, :GRUPO, :SUBGR, :UNIDAD, :ESTADO, :IVA, :MARCA, :CLASE, :DESCORTA
            do
            begin
            ref = '';
            if (USARDC = 'SI') then
                DES = DESCORTA;
            select first 1 coba_cod from barras_articulo where arti_cod = :codigo into :ref;
            if ((COLUMNA <> 3) or (upper(REF) like upper(:buscar))) then
                BEGIN
                OK = 'N';
                PRECIO = 0;
                SELECT prar_fijo PRECIO FROM precios_articulo WHERE arti_cod = :CODIGO and lipr_cod = :LISTA INTO :PRECIO;
                EXECUTE PROCEDURE redondee(PRECIO, DIG) returning_values (PRECIO);
                if (EXIST = 'SI') then
                    BEGIN
                    EXECUTE PROCEDURE saldo_total_inventario (:CODIGO, :FECHA) returning_values (:EXISTEN);
                    if ((SINEXIST = 'SI')  or (existen <> 0)) then
                        OK = 'S';
                    END
                ELSE
                    OK = 'S';
                if (ok = 'S') then
                    if (CUALQUIERA = 'S') then
                        SUSPEND;
                    ELSE
                        if (BUSCAR2 <> '') then
                            BEGIN
                            IF (NOT EXISTS (SELECT ARTI_COD FROM ARTICULO WHERE ARTI_COD = :CODIGO AND ((upper(ARTI_DES) like upper(:BUSCAR2)) or (upper(ARTI_DESCORTA) like upper(:BUSCAR2)) or (UPPER(ARTI_OBS) LIKE UPPER(:BUSCAR2))))) THEN
                                OK = 'N';
                            if ((OK = 'S') AND (BUSCAR3 <> '')) then
                                IF (NOT EXISTS (SELECT ARTI_COD FROM ARTICULO WHERE ARTI_COD = :CODIGO AND ((upper(ARTI_DES) like upper(:BUSCAR3)) or (upper(ARTI_DESCORTA) like upper(:BUSCAR3)) or (UPPER(ARTI_OBS) LIKE UPPER(:BUSCAR3))))) THEN
                                    OK = 'N';
                            if ((OK = 'S') AND (BUSCAR4 <> '')) then
                                IF (NOT EXISTS (SELECT ARTI_COD FROM ARTICULO WHERE ARTI_COD = :CODIGO AND ((upper(ARTI_DES) like upper(:BUSCAR4)) or (upper(ARTI_DESCORTA) like upper(:BUSCAR4)) or (UPPER(ARTI_OBS) LIKE UPPER(:BUSCAR4))))) THEN
                                    OK = 'N';
                            if ((OK = 'S') AND (BUSCAR5 <> '')) then
                                IF (NOT EXISTS (SELECT ARTI_COD FROM ARTICULO WHERE ARTI_COD = :CODIGO AND ((upper(ARTI_DES) like upper(:BUSCAR5)) or (upper(ARTI_DESCORTA) like upper(:BUSCAR5)) or (UPPER(ARTI_OBS) LIKE UPPER(:BUSCAR5))))) THEN
                                    OK = 'N';
                            if (OK = 'S') then
                                SUSPEND;
                            END
                        ELSE
                            SUSPEND;
                END
            end
        END
      END
    ELSE
        begin
        FOR select a.arti_cod, arti_des, grup_cod, subg_cod, arti_unidad, esar_cod, taiv_porc, marc_cod,arti_clase, ARTI_DESCORTA
            from articulo a, tarifa_iva t
            where a.taiv_cod = t.taiv_cod and substring(a.arti_cod from 1 FOR 2) <> '.t' and
            ((:INACTIVOS = 'S') or (esar_cod = 'A') or ((:INACTIVOS = 'C') AND (esar_cod = 'N')))
            INTO :CODIGO, :DES, :GRUPO, :SUBGR, :UNIDAD, :ESTADO, :IVA, :MARCA, :CLASE, :DESCORTA
            do
            begin
            ref = '';
            if (USARDC = 'SI') then
                DES = DESCORTA;
            select first 1 coba_cod from barras_articulo where arti_cod = :codigo into :ref;
            PRECIO = 0;
            SELECT prar_fijo PRECIO FROM precios_articulo WHERE arti_cod = :CODIGO and lipr_cod = :LISTA INTO :PRECIO;
            EXECUTE PROCEDURE redondee(PRECIO, DIG) returning_values (PRECIO);
            if (EXIST = 'SI') then
                BEGIN
                EXECUTE PROCEDURE saldo_total_inventario (:CODIGO, :FECHA) returning_values (:EXISTEN);
                if ((SINEXIST = 'SI')  or (existen <> 0)) then
                    SUSPEND;
                END
            ELSE
                SUSPEND;
            END
        end
    END
ELSE
    if ((BUSCAR IS NOT NULL) AND (BUSCAR <> '')) then
      begin
      if (COLUMNA = 3) then
        BEGIN
        FOR select arti_cod, coba_cod from barras_articulo b where (upper(b.coba_cod) like upper(:buscar)) and
            ((:INACTIVOS = 'S') or (b.coba_activo = 'S'))
            into :codigo, :ref
            do
            begin
            select arti_des, grup_cod, subg_cod, arti_unidad, esar_cod, taiv_porc, marc_cod,arti_clase, ARTI_DESCORTA
                from articulo a, tarifa_iva t
                where a.taiv_cod = t.taiv_cod and arti_cod = :codigo
                INTO :DES, :GRUPO, :SUBGR, :UNIDAD, :ESTADO, :IVA, :MARCA, :CLASE, :DESCORTA;
            if (USARDC = 'SI') then
                DES = DESCORTA;
            if (EXIST = 'SI') then
                EXECUTE PROCEDURE saldo_total_inventario (:CODIGO, :FECHA) returning_values (:EXISTEN);
            suspend;
            end
        END
      ELSE
        begin
        FOR select arti_cod, arti_des, grup_cod, subg_cod, arti_unidad, esar_cod, taiv_porc, arti_precio, marc_cod, arti_clase, ARTI_DESCORTA
            from articulo a, tarifa_iva t
            where a.taiv_cod = t.taiv_cod and substring(a.arti_cod from 1 FOR 2) <> '.t' and
            ((:INACTIVOS = 'S') or (esar_cod = 'A') or ((:INACTIVOS = 'C') AND (esar_cod = 'N'))) AND
            ((:COLUMNA <> 0) or (upper(A.ARTI_COD) like upper(:buscar))) AND
            ((:columna <> 1) or (upper(A.ARTI_DES) like upper(:buscar))) AND
            ((:columna <> 4) or (upper(A.ARTI_DESCORTA) like upper(:buscar))) AND
            ((:columna <> 2) or (upper(A.ARTI_OBS) like upper(:buscar)) or (upper(A.ARTI_DES) like upper(:buscar)))
            INTO :CODIGO, :DES, :GRUPO, :SUBGR, :UNIDAD, :ESTADO, :IVA, :PRECIO, :MARCA, :CLASE, :DESCORTA
            do
            begin
            ref = '';
            if (USARDC = 'SI') then
                DES = DESCORTA;
            select first 1 coba_cod from barras_articulo where arti_cod = :codigo into :ref;
            if ((COLUMNA <> 3) or (upper(REF) like upper(:buscar))) then
                BEGIN
                if (EXIST = 'SI') then
                    BEGIN
                    EXECUTE PROCEDURE saldo_total_inventario (:CODIGO, :FECHA) returning_values (:EXISTEN);
                    if ((SINEXIST = 'SI') or (existen <> 0)) then
                        OK = 'S';
                    END
                ELSE
                    OK = 'S';
                if (ok = 'S') then
                    if (CUALQUIERA = 'S') then
                        SUSPEND;
                    ELSE
                        if (BUSCAR2 <> '') then
                            BEGIN
                            IF (NOT EXISTS (SELECT ARTI_COD FROM ARTICULO WHERE ARTI_COD = :CODIGO AND ((upper(ARTI_DES) like upper(:BUSCAR2)) or (upper(ARTI_DESCORTA) like upper(:BUSCAR2)) or (UPPER(ARTI_OBS) LIKE UPPER(:BUSCAR2))))) THEN
                                OK = 'N';
                            if ((OK = 'S') AND (BUSCAR3 <> '')) then
                                IF (NOT EXISTS (SELECT ARTI_COD FROM ARTICULO WHERE ARTI_COD = :CODIGO AND ((upper(ARTI_DES) like upper(:BUSCAR3)) or (upper(ARTI_DESCORTA) like upper(:BUSCAR3)) or (UPPER(ARTI_OBS) LIKE UPPER(:BUSCAR3))))) THEN
                                    OK = 'N';
                            if ((OK = 'S') AND (BUSCAR4 <> '')) then
                                IF (NOT EXISTS (SELECT ARTI_COD FROM ARTICULO WHERE ARTI_COD = :CODIGO AND ((upper(ARTI_DES) like upper(:BUSCAR4)) or (upper(ARTI_DESCORTA) like upper(:BUSCAR4)) or (UPPER(ARTI_OBS) LIKE UPPER(:BUSCAR4))))) THEN
                                    OK = 'N';
                            if ((OK = 'S') AND (BUSCAR5 <> '')) then
                                IF (NOT EXISTS (SELECT ARTI_COD FROM ARTICULO WHERE ARTI_COD = :CODIGO AND ((upper(ARTI_DES) like upper(:BUSCAR5)) or (upper(ARTI_DESCORTA) like upper(:BUSCAR5)) or (UPPER(ARTI_OBS) LIKE UPPER(:BUSCAR5))))) THEN
                                    OK = 'N';
                            if (OK = 'S') then
                                SUSPEND;
                            END
                        ELSE
                            SUSPEND;
                END
            end
        end
      end
    ELSE
        FOR select arti_cod, arti_des, grup_cod, subg_cod, arti_unidad, esar_cod, taiv_porc, arti_precio, marc_cod, arti_clase, ARTI_DESCORTA
            from articulo a, tarifa_iva t
            where a.taiv_cod = t.taiv_cod and substring(a.arti_cod from 1 FOR 2) <> '.t' and
            ((:INACTIVOS = 'S') or (esar_cod = 'A') or ((:INACTIVOS = 'C') AND (esar_cod = 'N')))
            INTO :CODIGO, :DES, :GRUPO, :SUBGR, :UNIDAD, :ESTADO, :IVA, :PRECIO, :MARCA, :CLASE, :DESCORTA
            do
            begin
            ref = '';
            if (USARDC = 'SI') then
                DES = DESCORTA;
            select first 1 coba_cod from barras_articulo where arti_cod = :codigo into :ref;
            if (EXIST = 'SI') then
                BEGIN
                EXECUTE PROCEDURE saldo_total_inventario (:CODIGO, :FECHA) returning_values (:EXISTEN);
                if ((SINEXIST = 'SI') or (existen <> 0)) then
                    SUSPEND;
                END
            ELSE
                SUSPEND;
            end
END^

SET TERM ; ^

/* 20140307 */
/* CIERRE FACTURACION CON CANTIDAD DE FP */
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),
    CANTFP1 integer,
    CANTFP2 integer,
    CANTFP3 integer,
    CANTFP4 integer,
    CANTFP5 integer,
    CANTFP6 integer,
    CANTFP7 integer,
    CANTFP8 integer,
    CANTFP9 integer,
    CANTFP10 integer,
    CANTFP11 integer,
    CANTFP12 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 r_iddoc integer;
declare variable f_id integer;
declare variable f_total numeric(18,2);
declare variable factor numeric(18,4);
declare variable ajuste integer;
declare variable PREFRDC VARCHAR(4);
declare variable otrabo numeric(18,4);
begin
AJUSTE = 0;
if (PREFIJO <> '') then
  SELECT PREF_PRE, AUTO_NUMERO, AUTO_PREFRDC FROM AUTORIZACIONES WHERE PREF_PRE = :PREFIJO INTO :PREF, :autoriza, :prefrdc;
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 */
  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 = 1 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 :CANTFP1, :FORMAP1;
  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 = 1 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;
  FORMAP1 = FORMAP1 + OTRABO;
  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 = 2 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 :CANTFP2, :FORMAP2;
  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 = 2 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;
  FORMAP2 = FORMAP2 + OTRABO;
  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 = 3 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 :CANTFP3, :FORMAP3;
  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 = 3 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;
  FORMAP3 = FORMAP3 + OTRABO;
  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 = 4 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 :CANTFP4, :FORMAP4;
  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 = 4 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;
  FORMAP4 = FORMAP4 + OTRABO;
  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 = 5 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 :CANTFP5, :FORMAP5;
  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 = 5 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;
  FORMAP5 = FORMAP5 + OTRABO;
  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 = 6 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 :CANTFP6, :FORMAP6;
  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 = 6 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;
  FORMAP6 = FORMAP6 + OTRABO;
  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 = 7 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 :CANTFP7, :FORMAP7;
  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 = 7 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;
  FORMAP7 = FORMAP7 + OTRABO;
  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 = 8 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 :CANTFP8, :FORMAP8;
  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 = 8 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;
  FORMAP8 = FORMAP8 + OTRABO;
  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 = 9 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 :CANTFP9, :FORMAP9;
  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 = 9 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;
  FORMAP9 = FORMAP9 + OTRABO;
  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 = 10 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 :CANTFP10, :FORMAP10;
  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 = 10 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;
  FORMAP10 = FORMAP10 + OTRABO;
  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 = 11 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 :CANTFP11, :FORMAP11;
  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 = 11 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;
  FORMAP11 = FORMAP11 + OTRABO;
  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 = 12 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 :CANTFP12, :FORMAP12;
  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 = 12 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;
  FORMAP12 = FORMAP12 + OTRABO;

  /* 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 (formap1 is null) then
    formap1 = 0;
  if (formap2 is null) then
    formap2 = 0;
  if (formap3 is null) then
    formap3 = 0;
  if (formap4 is null) then
    formap4 = 0;
  if (formap5 is null) then
    formap5 = 0;
  if (formap6 is null) then
    formap6 = 0;
  if (formap7 is null) then
    formap7 = 0;
  if (formap8 is null) then
    formap8 = 0;
  if (formap9 is null) then
    formap9 = 0;
  if (formap10 is null) then
    formap10 = 0;
  if (formap11 is null) then
    formap11 = 0;
  if (formap12 is null) then
    formap12 = 0;
  CARTERA = TOTALNETO - formap1 - formap2 - formap3 - formap4 - formap5 - formap6 - formap7 - formap8 - formap9 - formap10 -
     formap11 - formap12;
/*
  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
  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;
        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 ; ^

update REVISION SET REVI_FECHA = '2014/03/07';
COMMIT WORK;

/* 20140303f : pos con arqueo, cierre X y Z y ventas por articulo */

CREATE TABLE DENOMINACIONES (
    DENO_ID      T_ID NOT NULL /* T_ID = INTEGER */,
    DENO_NOMBRE  T_CONCEPTO /* T_CONCEPTO = VARCHAR(60) */,
    DENO_MONTO   T_MONTO /* T_MONTO = NUMERIC(18,2) DEFAULT 0 */
);

ALTER TABLE DENOMINACIONES ADD CONSTRAINT PK_DENOMINACIONES PRIMARY KEY (DENO_ID);

grant select, delete, insert, update on denominaciones to public;


INSERT INTO DENOMINACIONES (DENO_ID, DENO_NOMBRE, DENO_MONTO) VALUES (1, 'BILLETES $50,000', 50000);
INSERT INTO DENOMINACIONES (DENO_ID, DENO_NOMBRE, DENO_MONTO) VALUES (2, 'BILLETES $20,000', 20000);
INSERT INTO DENOMINACIONES (DENO_ID, DENO_NOMBRE, DENO_MONTO) VALUES (3, 'BILLETES $10,000', 10000);
INSERT INTO DENOMINACIONES (DENO_ID, DENO_NOMBRE, DENO_MONTO) VALUES (4, 'BILLETES $5,000', 5000);
INSERT INTO DENOMINACIONES (DENO_ID, DENO_NOMBRE, DENO_MONTO) VALUES (5, 'BILLETES $2,000', 2000);
INSERT INTO DENOMINACIONES (DENO_ID, DENO_NOMBRE, DENO_MONTO) VALUES (6, 'BILLETES $1,000', 1000);
INSERT INTO DENOMINACIONES (DENO_ID, DENO_NOMBRE, DENO_MONTO) VALUES (7, 'MONEDAS $500', 500);
INSERT INTO DENOMINACIONES (DENO_ID, DENO_NOMBRE, DENO_MONTO) VALUES (8, 'MONEDAS $200', 200);
INSERT INTO DENOMINACIONES (DENO_ID, DENO_NOMBRE, DENO_MONTO) VALUES (9, 'MONEDAS $100', 100);
INSERT INTO DENOMINACIONES (DENO_ID, DENO_NOMBRE, DENO_MONTO) VALUES (10, 'MONEDAS $50', 50);
INSERT INTO DENOMINACIONES (DENO_ID, DENO_NOMBRE, DENO_MONTO) VALUES (11, 'OTRAS MONEDAS $1', 1);
commit work;


CREATE TABLE ARQUEO_CAJA (
    ARQC_ID        T_ID NOT NULL /* T_ID = INTEGER */,
    PREF_PRE       VARCHAR(4) NOT NULL,
    ARQC_NUMERO    T_NUMDOC NOT NULL /* T_NUMDOC = VARCHAR(6) */,
    ARQC_FECHA     DATE NOT NULL,
    ARQC_CAJA      T_ID NOT NULL /* T_ID = INTEGER */,
    ARQC_OBS       VARCHAR(255),
    ARQC_ANULADO   T_BOOLEANO /* T_BOOLEANO = CHAR(1) check (value in ('S','N')) */,
    ARQC_TRANSMIT  T_BOOLEANO /* T_BOOLEANO = CHAR(1) check (value in ('S','N')) */,
    NUM_OK         T_BOOLEANO /* T_BOOLEANO = CHAR(1) check (value in ('S','N')) */,
    ARQC_USUARIO   T_USUARIO /* T_USUARIO = VARCHAR(10) */
);

ALTER TABLE ARQUEO_CAJA ADD CONSTRAINT PK_ARQUEO_CAJA PRIMARY KEY (ARQC_ID);


CREATE TABLE ARQUEO_CAJA_DET (
    ARQC_ID        T_ID NOT NULL /* T_ID = INTEGER */,
    ARQD_ITEM      T_ID NOT NULL /* T_ID = INTEGER */,
    DENO_ID        T_ID /* T_ID = INTEGER */,
    ARQD_CANT      SMALLINT,
    ARQD_OBS       VARCHAR(255),
    ARQD_ANULADO   T_BOOLEANO /* T_BOOLEANO = CHAR(1) check (value in ('S','N')) */,
    ARQD_TRANSMIT  T_BOOLEANO /* T_BOOLEANO = CHAR(1) check (value in ('S','N')) */,
    ARQD_TOTAL     T_MONTO /* T_MONTO = NUMERIC(18,2) DEFAULT 0 */,
    ARQD_MONTO     T_MONTO /* T_MONTO = NUMERIC(18,2) DEFAULT 0 */
);

ALTER TABLE ARQUEO_CAJA_DET ADD CONSTRAINT PK_ARQUEO_CAJA_DET PRIMARY KEY (ARQC_ID, ARQD_ITEM);

SET TERM ^ ;
/* Trigger: ARQUEO_CAJA_AD */
CREATE OR ALTER TRIGGER ARQUEO_CAJA_AD FOR ARQUEO_CAJA
ACTIVE AFTER DELETE POSITION 0
as
begin
INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
    VALUES (USER, 67, old.arqc_id, 'D', old.pref_pre || old.arqc_numero);
end
^

/* Trigger: ARQUEO_CAJA_AI */
CREATE OR ALTER TRIGGER ARQUEO_CAJA_AI FOR ARQUEO_CAJA
ACTIVE AFTER INSERT POSITION 0
as
begin
IF (NEW.arqc_id <> 0) THEN
  INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
    VALUES (USER, 67, NEW.arqc_id, 'I', NEW.pref_pre || NEW.arqc_numero);
end
^


/* Trigger: ARQUEO_CAJA_AU */
CREATE OR ALTER TRIGGER ARQUEO_CAJA_AU FOR ARQUEO_CAJA
ACTIVE AFTER UPDATE POSITION 0
as
begin
/* SI CAMBIO UN DATO CRITICO REPROCESE EL DETALLE */
if ((OLD.pref_pre <> NEW.pref_pre) or
    (OLD.arqc_numero <> NEW.arqc_numero) or
    (OLD.arqc_fecha <> NEW.arqc_fecha) ) then
    BEGIN
    UPDATE arqueo_caja_det SET ARQD_TRANSMIT = 'N' WHERE ARQC_ID = OLD.arqc_id;
    END
if (OLD.arqc_anulado <> NEW.arqc_anulado) then
    BEGIN
    UPDATE arqueo_caja_det SET ARQD_ANULADO = NEW.arqc_anulado WHERE ARQC_ID = OLD.arqc_id;
    END
if (OLD.arqc_transmit <> NEW.arqc_transmit) then
    BEGIN
    UPDATE arqueo_caja_det SET ARQD_TRANSMIT = NEW.arqc_transmit WHERE ARQC_ID = OLD.arqc_id;
    END
if (NEW.arqc_anulado = 'S') then
  INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
    VALUES (USER, 67, NEW.arqc_id, 'A', NEW.pref_pre || NEW.arqc_numero);
ELSE
  INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
    VALUES (USER, 67, NEW.arqc_id, 'U', NEW.pref_pre || NEW.arqc_numero);
end
^

/* Trigger: ARQUEO_CAJA_BI */
CREATE OR ALTER TRIGGER ARQUEO_CAJA_BI FOR ARQUEO_CAJA
ACTIVE BEFORE INSERT POSITION 0
as
declare variable NUMERO VARCHAR(6);
declare variable AUTOM CHAR(1);
declare variable EXISTE CHAR(1);
BEGIN
if (NEW.num_ok = 'N') then
  BEGIN
  /* Actualice el contador del prefijo */
  SELECT PREF_ACTUAL, PREF_AUTO FROM PREFIJOS WHERE TIDO_COD = 67 AND PREF_PRE = NEW.PREF_PRE INTO :NUMERO, :AUTOM;
  /* ACTUALICE EL NUMERO EN COMPROBANTE_ENCABEZADO  */
  if (AUTOM = 'S') then
    BEGIN
    NEW.arqc_numero = NUMERO;
    NUMERO = CAST((CAST(NUMERO AS INTEGER) + 1) AS CHAR(6));
    UPDATE PREFIJOS
      SET PREF_ACTUAL = :NUMERO
    WHERE TIDO_COD = 67 AND PREF_PRE = NEW.PREF_PRE;
    END
  ELSE
    BEGIN
    if (CAST(NUMERO AS INTEGER) = CAST(NEW.arqc_numero AS INTEGER)) then
        UPDATE PREFIJOS
          SET PREF_ACTUAL = CAST((CAST(PREF_ACTUAL AS INTEGER) + 1) AS CHAR(6))
        WHERE TIDO_COD = 67 AND PREF_PRE = NEW.PREF_PRE;
    END
  execute procedure COMPLETA_CEROS(NEW.arqc_numero) returning_values (NEW.arqc_numero);
  NEW.num_ok = 'S';
  END
/* Verifique que el numero no existe previamente */
EXISTE = 'N';
SELECT 'S' FROM arqueo_caja WHERE PREF_PRE = NEW.PREF_PRE AND ARQC_NUMERO = NEW.arqc_numero INTO :EXISTE;
if (EXISTE = 'S') then
    EXCEPTION DOCUMENTO_REGISTRADO 'Ya existe un arqueo de caja con el número ' || new.pref_pre || new.arqc_numero;
end
^

/* Trigger: TI_ARQUEO_CAJA */
CREATE OR ALTER TRIGGER TI_ARQUEO_CAJA FOR ARQUEO_CAJA
ACTIVE BEFORE INSERT POSITION 0
as
DECLARE VARIABLE NUMROWS INTEGER;
BEGIN
    /*  PARENT 'CAJAS' MUST EXIST WHEN INSERTING A CHILD IN 'CAMBIO_DOCUMENTOS'  */
    IF (NEW.arqc_caja IS NOT NULL) THEN
    BEGIN
       SELECT COUNT(*)
       FROM   CAJAS
       WHERE  CAJAS.CAJA_ID = NEW.arqc_caja
       INTO   :NUMROWS;
       IF (NUMROWS = 0) THEN
       BEGIN
          EXCEPTION CAJA_NO_EXISTE;
       END
    END
    /*  PARENT 'PREFIJOS' MUST EXIST WHEN INSERTING A CHILD IN 'CAMBIO_DOCUMENTOS'  */
    IF (NEW.PREF_PRE IS NOT NULL) THEN
    BEGIN
       SELECT COUNT(*)
       FROM   PREFIJOS
       WHERE  PREFIJOS.TIDO_COD = 67
        AND   PREFIJOS.PREF_PRE = NEW.PREF_PRE
       INTO   :NUMROWS;
       IF (NUMROWS = 0) THEN
       BEGIN
          EXCEPTION PREFIJO_NO_EXISTE;
       END
    END
end
^

SET TERM ; ^

grant select, delete, insert, update on arqueo_caja TO PUBLIC;

SET TERM ^ ;

/* Trigger: ARQUEO_CAJA_DET_BI */
CREATE OR ALTER TRIGGER ARQUEO_CAJA_DET_BI FOR ARQUEO_CAJA_DET
ACTIVE BEFORE INSERT POSITION 0
as
begin
if (NEW.ARQD_CANT is null) then
    new.arqd_cant = 0;
select deno_monto from denominaciones where deno_id = new.deno_id into new.arqd_monto;
new.arqd_total = NEW.arqd_cant * NEW.arqd_monto;

end
^

/* Trigger: TI_ARQUEO_CAJA_DET */
CREATE OR ALTER TRIGGER TI_ARQUEO_CAJA_DET FOR ARQUEO_CAJA_DET
ACTIVE BEFORE INSERT POSITION 0
as
DECLARE VARIABLE NUMROWS INTEGER;
BEGIN
    /*  PARENT 'CAMBIO_DOCUMENTOS' MUST EXIST WHEN INSERTING A CHILD IN 'CAMBIODOC_ENTRADAS'  */
    IF (NEW.arqc_id IS NOT NULL) THEN
    BEGIN
       SELECT COUNT(*)
       FROM arqueo_caja WHERE ARQC_ID = NEW.arqc_id
       INTO :NUMROWS;
       IF (NUMROWS = 0) THEN
       BEGIN
          EXCEPTION CAMBIODOC_NO_EXISTE 'NO EXISTE EL ARQURO DE CAJA';
       END
    END
    /*  PARENT 'FORMAS_PAGO' MUST EXIST WHEN INSERTING A CHILD IN 'CAMBIODOC_ENTRADAS'  */
    IF (NEW.deno_id IS NOT NULL) THEN
    BEGIN
       SELECT COUNT(*)
       FROM   denominaciones
       WHERE  DENO_ID = NEW.deno_id
       INTO   :NUMROWS;
       IF (NUMROWS = 0) THEN
       BEGIN
          EXCEPTION FORMAPAGO_NO_EXISTE 'NO EXISTE LA DENOMINACION ' || NEW.deno_id;
       END
    END
end
^

SET TERM ; ^

GRANT SELECT, INSERT, UPDATE, DELETE ON ARQUEO_CAJA_DET TO PUBLIC;

SET TERM ^ ;

create or alter procedure RESUMEN_VENTAS_ARTICULO (
    FECHA date,
    PUNTO integer)
returns (
    ARTICULO varchar(20),
    DESCRIPCION varchar(60),
    CANT numeric(18,2),
    IVA numeric(18,2),
    CONSUMO numeric(18,2),
    TOTAL numeric(18,2))
AS
begin
FOR SELECT MAX(ARTI_COD), max(d.fade_desc), SUM(FADE_CANT * FADE_FACTOR), SUM(FADE_IVAMONTO), SUM(FADE_CONSUMO+FADE_INALCM), SUM(FADE_TOTAL)
    FROM FACTURAS_DETALLE D, FACTURAS F WHERE F.FACT_ID = D.FACT_ID AND FACT_FECHA = :FECHA AND PTVT_ID = :PUNTO AND FACT_ANULADO = 'N' and substring(arti_cod from 1 FOR 2) <> '.t'
    GROUP BY ARTI_COD
    INTO :ARTICULO, :DESCRIPCION, :CANT, :IVA, :CONSUMO, :TOTAL
    DO
    SUSPEND;
end^

SET TERM ; ^

/* Following GRANT statetements are generated automatically */

GRANT SELECT ON FACTURAS_DETALLE TO PROCEDURE RESUMEN_VENTAS_ARTICULO;
GRANT SELECT ON FACTURAS TO PROCEDURE RESUMEN_VENTAS_ARTICULO;

/* Existing privileges on this procedure */

GRANT EXECUTE ON PROCEDURE RESUMEN_VENTAS_ARTICULO TO "PUBLIC";


INSERT INTO CONFIGURACION (CONF_MODULO, CONF_CATEGORIA, CONF_PROPIEDAD, CONF_VALOR, CONF_POSIBLES, CONF_AYUDA) VALUES ('FACTURACION', 'POS', 'ACCION A TOMAR SI HAY CARTERA DEL PUNTO AL HACER CIERRE ZETA', 'AVISAR', 'PROHIBIR, AVISAR, IGNORAR', 'PROHIBIR:No permite hacer el cierre zeta hasta que no se cancelen las facturas en cartera. AVISAR: AVisa que hay facturas sin cancelar y hace el cierre. IGNORAR: No verifica facturas sin cancelar en el punto de venta');
commit work;

SET TERM ^ ;

CREATE OR ALTER procedure CARTERA_PUNTO_DIA (
    FECHA date,
    PTOVTA integer)
returns (
    ID integer,
    PREFIJO varchar(4),
    NUMERO varchar(8),
    CLIENTE varchar(60),
    TOTAL numeric(18,2),
    SALDO numeric(18,2))
AS
BEGIN
/* BUSQUE EN SALDOS_DOC_CARTERA LOS QUE TENGAN SALDO > 0 */
FOR SELECT FACT_ID, PREF_PRE, FACT_NUMERO, fact_nomcliente, FACT_TOTAL
    FROM FACTURAS WHERE FACT_FECHA = :FECHA AND PTVT_ID = :ptovta AND FACT_ANULADO = 'N' AND FACT_TOTAL <> 0
      INTO :ID, :prefijo, :numero, :cliente, :total
    DO
    BEGIN
    EXECUTE PROCEDURE saldo_doc_cartera(31, ID, FECHA, 0) returning_values (SALDO);
    if (SALDO <> 0) then
        BEGIN
        SUSPEND;
        END
    END
END^

SET TERM ; ^

/* Following GRANT statetements are generated automatically */

GRANT SELECT ON FACTURAS TO PROCEDURE CARTERA_PUNTO_DIA;
GRANT EXECUTE ON PROCEDURE SALDO_DOC_CARTERA TO PROCEDURE CARTERA_PUNTO_DIA;

/* Existing privileges on this procedure */

GRANT EXECUTE ON PROCEDURE CARTERA_PUNTO_DIA TO "PUBLIC";

INSERT INTO CONFIGURACION (CONF_MODULO, CONF_CATEGORIA, CONF_PROPIEDAD, CONF_VALOR, CONF_POSIBLES, CONF_AYUDA) VALUES ('FACTURACION', 'POS', 'HACER TRASLADO DE CAJA POR EL TOTAL EN CAJA AL HACER CIERRE ZETA', 'NO', 'SI,NO', 'SI: Hace traslado del total en caja del punto del venta a la caja general del punto indicada en el punto de venta al hacer el cierre zeta');
commit work;

ALTER TABLE PUNTO_VENTA
ADD PTVT_CAJACIERRE T_ID;

INSERT INTO CONFIGURACION (CONF_MODULO, CONF_CATEGORIA, CONF_PROPIEDAD, CONF_VALOR, CONF_POSIBLES, CONF_AYUDA) VALUES ('FACTURACION', 'POS', 'HACER CONTABILIZACION RESUMIDA DE LAS VENTAS DEL DIA AL HACER EL CIERRE ZETA', 'NO', 'SI,NO', 'SI: Hace la contabilización resumida de las ventas del día en un solo comprobante contable al hacer el cierre zeta');
INSERT INTO CONFIGURACION (CONF_MODULO, CONF_CATEGORIA, CONF_PROPIEDAD, CONF_VALOR, CONF_POSIBLES, CONF_AYUDA) VALUES ('FACTURACION', 'POS', 'PERMITIR VARIAS FACTURAS ABIERTAS SIMULTANEAMENTE', 'SI', 'SI,NO', 'SI:Permite varias ocurrencias de la ventana de facturación abiertas simultáneamente para por ejemplo evacuar una pequeña factura sin interrumpir el registro de mercado mercado grande');
commit WORK;

INSERT INTO TIPO_DOCUMENTO (TIDO_COD, TIDO_NOMCORTO, TIDO_NOMLARGO, TIDO_MODULO, TIDO_INVE, TIDO_CART, TIDO_CXP, TIDO_CAJA, TIDO_BCOS, TIDO_NOM, TIDO_IMP) VALUES (67, 'ARQUEO', 'ARQUEO DE CAJA', 'CAJA', 'N', 'N', 'N', 'S', 'N', 'N', 'N');
INSERT INTO PREFIJOS (TIDO_COD, PREF_PRE, PREF_ACTUAL, PREF_AUTO, PREF_IVAINC, PREF_PROY, PREF_CENTRO, PREF_ACTIVO, PREF_USUARIO, TICO_COD, SUCU_ID) VALUES (67, '0000', '000001', 'S', 'N', NULL, NULL, 'S', NULL, NULL, NULL);
COMMIT WORK;

CREATE SEQUENCE ID_ARQUEO;
ALTER SEQUENCE ID_ARQUEO RESTART WITH 0;

SET TERM ^ ;

create or alter procedure CAMBIE_ID_ARQUEO
returns (
    ID integer)
AS
declare variable NUMROWS INTEGER;
BEGIN
/* TRAE EL ID NUEVO Y LO ACTUALIZA */
NUMROWS = 1;
while (NUMROWS > 0) DO
    BEGIN
    ID = GEN_ID(id_arqueo, 1);
    /* VERIFIQUE SI YA EXISTE */
    SELECT COUNT(*) FROM arqueo_caja WHERE ARQC_ID = :ID INTO :NUMROWS;
    END
SUSPEND;
END^

SET TERM ; ^

GRANT SELECT ON ARQUEO_CAJA TO PROCEDURE CAMBIE_ID_ARQUEO;

GRANT EXECUTE ON PROCEDURE CAMBIE_ID_ARQUEO TO "PUBLIC";

SET TERM ^ ;

create or alter procedure IMPR_ARQUEO (
    ID integer)
returns (
    PREF varchar(4),
    NUMERO varchar(6),
    FECHA date,
    CONCEPTO varchar(60),
    ITEM integer,
    DENOMINACION varchar(60),
    CANTIDAD numeric(18,2),
    MONTO numeric(18,2),
    TOTALIT numeric(18,2),
    TOTAL numeric(18,2))
AS
BEGIN
SELECT PREF_PRE, ARQC_NUMERO, ARQC_FECHA, ARQC_OBS
    FROM arqueo_caja WHERE ARQC_ID = :ID
    into  :PREF, :NUMERO, :FECHA, :CONCEPTO;
TOTAL = 0;
FOR SELECT ARQD_ITEM, DENO_NOMBRE, ARQD_CANT, DENO_MONTO, ARQD_TOTAL
    FROM arqueo_caja_det D, denominaciones F
    WHERE D.deno_id = F.deno_id AND D.arqc_id = :ID
    ORDER BY ARQD_ITEM
    INTO :ITEM, :denominacion, :cantidad, :monto, :totalit
    DO
    BEGIN
    TOTAL = TOTAL + TOTALIT;
    SUSPEND;
    END
END^

SET TERM ; ^

/* Following GRANT statetements are generated automatically */

GRANT SELECT ON ARQUEO_CAJA TO PROCEDURE IMPR_ARQUEO;
GRANT SELECT ON ARQUEO_CAJA_DET TO PROCEDURE IMPR_ARQUEO;
GRANT SELECT ON DENOMINACIONES TO PROCEDURE IMPR_ARQUEO;

/* Existing privileges on this procedure */

GRANT EXECUTE ON PROCEDURE IMPR_ARQUEO TO "PUBLIC";


INSERT INTO FORMATOS (TIDO_COD, PREF_PRE, FORM_IMPRE, FORM_NROITEMS, FORM_PAGINAS, FORM_ENTRELINEA, FORM_FONT, FORM_FSIZE, FORM_PAPELAN, FORM_PAPELAL) VALUES (67, '0000', '', 600, 'N', 30, 'Arial', 8, 8.5, 11);


INSERT INTO FORMATO_DATOS (TIDO_COD, PREF_PRE, DAFO_DATO, DAFO_IMPRIME, DAFO_POSX, DAFO_POSY, DAFO_FORMATO, DAFO_LONG, DAFO_REPITE, DAFO_FONT, DAFO_FSIZE, DAFO_LIQUIDA, DAFO_POSYVAR, DAFO_ITEM, DAFO_INI, DAFO_CORTARPALABRAS, DAFO_JUSTIFICA) VALUES (67, '0000', 'PREFIJO', 'S', 250, 110, NULL, 4, 'N', 'Arial', 8, 'N', 'N', 1, 1, 'S', 'I');
INSERT INTO FORMATO_DATOS (TIDO_COD, PREF_PRE, DAFO_DATO, DAFO_IMPRIME, DAFO_POSX, DAFO_POSY, DAFO_FORMATO, DAFO_LONG, DAFO_REPITE, DAFO_FONT, DAFO_FSIZE, DAFO_LIQUIDA, DAFO_POSYVAR, DAFO_ITEM, DAFO_INI, DAFO_CORTARPALABRAS, DAFO_JUSTIFICA) VALUES (67, '0000', 'NUMERO', 'S', 450, 110, NULL, 6, 'N', 'Arial', 8, 'N', 'N', 2, 1, 'S', 'I');
INSERT INTO FORMATO_DATOS (TIDO_COD, PREF_PRE, DAFO_DATO, DAFO_IMPRIME, DAFO_POSX, DAFO_POSY, DAFO_FORMATO, DAFO_LONG, DAFO_REPITE, DAFO_FONT, DAFO_FSIZE, DAFO_LIQUIDA, DAFO_POSYVAR, DAFO_ITEM, DAFO_INI, DAFO_CORTARPALABRAS, DAFO_JUSTIFICA) VALUES (67, '0000', 'FECHA', 'N', NULL, NULL, NULL, NULL, 'N', 'Arial', 8, 'N', 'N', 3, 1, 'S', 'I');
INSERT INTO FORMATO_DATOS (TIDO_COD, PREF_PRE, DAFO_DATO, DAFO_IMPRIME, DAFO_POSX, DAFO_POSY, DAFO_FORMATO, DAFO_LONG, DAFO_REPITE, DAFO_FONT, DAFO_FSIZE, DAFO_LIQUIDA, DAFO_POSYVAR, DAFO_ITEM, DAFO_INI, DAFO_CORTARPALABRAS, DAFO_JUSTIFICA) VALUES (67, '0000', 'FECHA LETRAS', 'N', 100, 42, NULL, 30, 'N', 'Arial', 8, 'N', 'N', 4, 1, 'S', 'I');
INSERT INTO FORMATO_DATOS (TIDO_COD, PREF_PRE, DAFO_DATO, DAFO_IMPRIME, DAFO_POSX, DAFO_POSY, DAFO_FORMATO, DAFO_LONG, DAFO_REPITE, DAFO_FONT, DAFO_FSIZE, DAFO_LIQUIDA, DAFO_POSYVAR, DAFO_ITEM, DAFO_INI, DAFO_CORTARPALABRAS, DAFO_JUSTIFICA) VALUES (67, '0000', 'CONCEPTO', 'S', 300, 150, NULL, 30, 'N', 'Arial', 8, 'N', 'N', 5, 1, 'S', 'I');
INSERT INTO FORMATO_DATOS (TIDO_COD, PREF_PRE, DAFO_DATO, DAFO_IMPRIME, DAFO_POSX, DAFO_POSY, DAFO_FORMATO, DAFO_LONG, DAFO_REPITE, DAFO_FONT, DAFO_FSIZE, DAFO_LIQUIDA, DAFO_POSYVAR, DAFO_ITEM, DAFO_INI, DAFO_CORTARPALABRAS, DAFO_JUSTIFICA) VALUES (67, '0000', 'TOTAL', 'S', 1300, 230, NULL, 10, 'N', 'Arial', 8, 'S', 'S', 6, 1, 'S', 'I');
INSERT INTO FORMATO_DATOS (TIDO_COD, PREF_PRE, DAFO_DATO, DAFO_IMPRIME, DAFO_POSX, DAFO_POSY, DAFO_FORMATO, DAFO_LONG, DAFO_REPITE, DAFO_FONT, DAFO_FSIZE, DAFO_LIQUIDA, DAFO_POSYVAR, DAFO_ITEM, DAFO_INI, DAFO_CORTARPALABRAS, DAFO_JUSTIFICA) VALUES (67, '0000', 'NOMBRE USUARIO', 'S', 300, 70, NULL, 30, 'N', 'Arial', 8, 'N', 'N', 7, 1, 'S', 'I');
INSERT INTO FORMATO_DATOS (TIDO_COD, PREF_PRE, DAFO_DATO, DAFO_IMPRIME, DAFO_POSX, DAFO_POSY, DAFO_FORMATO, DAFO_LONG, DAFO_REPITE, DAFO_FONT, DAFO_FSIZE, DAFO_LIQUIDA, DAFO_POSYVAR, DAFO_ITEM, DAFO_INI, DAFO_CORTARPALABRAS, DAFO_JUSTIFICA) VALUES (67, '0000', 'CODIGO USUARIO', 'N', NULL, NULL, NULL, NULL, 'N', 'Arial', 8, 'N', 'N', 8, 1, 'S', 'I');
INSERT INTO FORMATO_DATOS (TIDO_COD, PREF_PRE, DAFO_DATO, DAFO_IMPRIME, DAFO_POSX, DAFO_POSY, DAFO_FORMATO, DAFO_LONG, DAFO_REPITE, DAFO_FONT, DAFO_FSIZE, DAFO_LIQUIDA, DAFO_POSYVAR, DAFO_ITEM, DAFO_INI, DAFO_CORTARPALABRAS, DAFO_JUSTIFICA) VALUES (67, '0000', 'NUMERO PAGINA', 'N', 100, 50, NULL, 3, 'N', 'Arial', 8, 'N', 'N', 9, 1, 'S', 'I');
INSERT INTO FORMATO_DATOS (TIDO_COD, PREF_PRE, DAFO_DATO, DAFO_IMPRIME, DAFO_POSX, DAFO_POSY, DAFO_FORMATO, DAFO_LONG, DAFO_REPITE, DAFO_FONT, DAFO_FSIZE, DAFO_LIQUIDA, DAFO_POSYVAR, DAFO_ITEM, DAFO_INI, DAFO_CORTARPALABRAS, DAFO_JUSTIFICA) VALUES (67, '0000', 'NUMERO DE ITEMS', 'N', 1100, 76, NULL, 10, 'S', 'Arial', 8, 'N', 'N', 11, 1, 'S', 'I');
INSERT INTO FORMATO_DATOS (TIDO_COD, PREF_PRE, DAFO_DATO, DAFO_IMPRIME, DAFO_POSX, DAFO_POSY, DAFO_FORMATO, DAFO_LONG, DAFO_REPITE, DAFO_FONT, DAFO_FSIZE, DAFO_LIQUIDA, DAFO_POSYVAR, DAFO_ITEM, DAFO_INI, DAFO_CORTARPALABRAS, DAFO_JUSTIFICA) VALUES (67, '0000', 'FECHA REGISTRO', 'S', 250, 130, NULL, 20, 'N', 'Arial', 8, 'N', 'N', 12, 1, 'S', 'I');
INSERT INTO FORMATO_DATOS (TIDO_COD, PREF_PRE, DAFO_DATO, DAFO_IMPRIME, DAFO_POSX, DAFO_POSY, DAFO_FORMATO, DAFO_LONG, DAFO_REPITE, DAFO_FONT, DAFO_FSIZE, DAFO_LIQUIDA, DAFO_POSYVAR, DAFO_ITEM, DAFO_INI, DAFO_CORTARPALABRAS, DAFO_JUSTIFICA) VALUES (67, '0000', 'HORA REGISTRO', 'S', 950, 130, NULL, 10, 'N', 'Arial', 8, 'N', 'N', 13, 1, 'S', 'I');
INSERT INTO FORMATO_DATOS (TIDO_COD, PREF_PRE, DAFO_DATO, DAFO_IMPRIME, DAFO_POSX, DAFO_POSY, DAFO_FORMATO, DAFO_LONG, DAFO_REPITE, DAFO_FONT, DAFO_FSIZE, DAFO_LIQUIDA, DAFO_POSYVAR, DAFO_ITEM, DAFO_INI, DAFO_CORTARPALABRAS, DAFO_JUSTIFICA) VALUES (67, '0000', 'USUARIO REGISTRO', 'S', 100, 80, NULL, NULL, 'N', 'Arial', 8, 'N', 'N', 14, 1, 'S', 'I');
INSERT INTO FORMATO_DATOS (TIDO_COD, PREF_PRE, DAFO_DATO, DAFO_IMPRIME, DAFO_POSX, DAFO_POSY, DAFO_FORMATO, DAFO_LONG, DAFO_REPITE, DAFO_FONT, DAFO_FSIZE, DAFO_LIQUIDA, DAFO_POSYVAR, DAFO_ITEM, DAFO_INI, DAFO_CORTARPALABRAS, DAFO_JUSTIFICA) VALUES (67, '0000', 'NOMBRE COMPANIA', 'S', 100, 30, NULL, 40, 'N', 'Arial', 8, 'N', 'N', 15, 1, 'S', 'I');
INSERT INTO FORMATO_DATOS (TIDO_COD, PREF_PRE, DAFO_DATO, DAFO_IMPRIME, DAFO_POSX, DAFO_POSY, DAFO_FORMATO, DAFO_LONG, DAFO_REPITE, DAFO_FONT, DAFO_FSIZE, DAFO_LIQUIDA, DAFO_POSYVAR, DAFO_ITEM, DAFO_INI, DAFO_CORTARPALABRAS, DAFO_JUSTIFICA) VALUES (67, '0000', 'DIR COMPANIA', 'N', 100, 70, NULL, 40, 'N', 'Arial', 8, 'N', 'N', 16, 1, 'S', 'I');
INSERT INTO FORMATO_DATOS (TIDO_COD, PREF_PRE, DAFO_DATO, DAFO_IMPRIME, DAFO_POSX, DAFO_POSY, DAFO_FORMATO, DAFO_LONG, DAFO_REPITE, DAFO_FONT, DAFO_FSIZE, DAFO_LIQUIDA, DAFO_POSYVAR, DAFO_ITEM, DAFO_INI, DAFO_CORTARPALABRAS, DAFO_JUSTIFICA) VALUES (67, '0000', 'TELS COMPANIA', 'N', 100, 90, NULL, 20, 'N', 'Arial', 8, 'N', 'N', 17, 1, 'S', 'I');
INSERT INTO FORMATO_DATOS (TIDO_COD, PREF_PRE, DAFO_DATO, DAFO_IMPRIME, DAFO_POSX, DAFO_POSY, DAFO_FORMATO, DAFO_LONG, DAFO_REPITE, DAFO_FONT, DAFO_FSIZE, DAFO_LIQUIDA, DAFO_POSYVAR, DAFO_ITEM, DAFO_INI, DAFO_CORTARPALABRAS, DAFO_JUSTIFICA) VALUES (67, '0000', 'CANTIDAD', 'S', 900, 190, NULL, 6, 'S', 'Arial', 8, 'N', 'N', 18, 1, 'S', 'I');
INSERT INTO FORMATO_DATOS (TIDO_COD, PREF_PRE, DAFO_DATO, DAFO_IMPRIME, DAFO_POSX, DAFO_POSY, DAFO_FORMATO, DAFO_LONG, DAFO_REPITE, DAFO_FONT, DAFO_FSIZE, DAFO_LIQUIDA, DAFO_POSYVAR, DAFO_ITEM, DAFO_INI, DAFO_CORTARPALABRAS, DAFO_JUSTIFICA) VALUES (67, '0000', 'DENOMINACION', 'S', 100, 190, NULL, 10, 'S', 'Arial', 8, 'N', 'N', 19, 1, 'S', 'I');
INSERT INTO FORMATO_DATOS (TIDO_COD, PREF_PRE, DAFO_DATO, DAFO_IMPRIME, DAFO_POSX, DAFO_POSY, DAFO_FORMATO, DAFO_LONG, DAFO_REPITE, DAFO_FONT, DAFO_FSIZE, DAFO_LIQUIDA, DAFO_POSYVAR, DAFO_ITEM, DAFO_INI, DAFO_CORTARPALABRAS, DAFO_JUSTIFICA) VALUES (67, '0000', 'MONTO', 'N', 1300, 190, '0', 10, 'S', 'Arial', 8, 'N', 'N', 20, 1, 'S', 'I');
INSERT INTO FORMATO_DATOS (TIDO_COD, PREF_PRE, DAFO_DATO, DAFO_IMPRIME, DAFO_POSX, DAFO_POSY, DAFO_FORMATO, DAFO_LONG, DAFO_REPITE, DAFO_FONT, DAFO_FSIZE, DAFO_LIQUIDA, DAFO_POSYVAR, DAFO_ITEM, DAFO_INI, DAFO_CORTARPALABRAS, DAFO_JUSTIFICA) VALUES (67, '0000', 'NUMERO ITEM', 'N', 700, 76, NULL, 10, 'S', 'Arial', 8, 'N', 'N', 21, 1, 'S', 'I');
INSERT INTO FORMATO_DATOS (TIDO_COD, PREF_PRE, DAFO_DATO, DAFO_IMPRIME, DAFO_POSX, DAFO_POSY, DAFO_FORMATO, DAFO_LONG, DAFO_REPITE, DAFO_FONT, DAFO_FSIZE, DAFO_LIQUIDA, DAFO_POSYVAR, DAFO_ITEM, DAFO_INI, DAFO_CORTARPALABRAS, DAFO_JUSTIFICA) VALUES (67, '0000', 'TOTAL ITEM', 'S', 1300, 190, NULL, NULL, 'S', 'Arial', 8, 'N', 'N', 22, 1, 'S', 'I');
INSERT INTO FORMATO_DATOS (TIDO_COD, PREF_PRE, DAFO_DATO, DAFO_IMPRIME, DAFO_POSX, DAFO_POSY, DAFO_FORMATO, DAFO_LONG, DAFO_REPITE, DAFO_FONT, DAFO_FSIZE, DAFO_LIQUIDA, DAFO_POSYVAR, DAFO_ITEM, DAFO_INI, DAFO_CORTARPALABRAS, DAFO_JUSTIFICA) VALUES (67, '0000', 'NIT COMPAÑIA', 'S', 400, 50, NULL, 20, 'N', 'Arial', 8, 'N', 'N', 23, 1, 'S', 'I');
COMMIT WORK;

INSERT INTO FORMATO_LINEAS (TIDO_COD, PREF_PRE, FOLI_ITEM, FOLI_TIPO, FOLI_X, FOLI_Y, FOLI_POSX, FOLI_POSY, FOLI_CADENA, FOLI_FONT, FOLI_FSIZE, FOLI_LIQUIDA, FOLI_IMAGEN) VALUES (67, '0000', 1, 'T', NULL, NULL, 100, 110, 'Número:', 'Arial', 8, 'N', NULL);
INSERT INTO FORMATO_LINEAS (TIDO_COD, PREF_PRE, FOLI_ITEM, FOLI_TIPO, FOLI_X, FOLI_Y, FOLI_POSX, FOLI_POSY, FOLI_CADENA, FOLI_FONT, FOLI_FSIZE, FOLI_LIQUIDA, FOLI_IMAGEN) VALUES (67, '0000', 2, 'T', NULL, NULL, 100, 130, 'Fecha:', 'Arial', 8, 'N', NULL);
INSERT INTO FORMATO_LINEAS (TIDO_COD, PREF_PRE, FOLI_ITEM, FOLI_TIPO, FOLI_X, FOLI_Y, FOLI_POSX, FOLI_POSY, FOLI_CADENA, FOLI_FONT, FOLI_FSIZE, FOLI_LIQUIDA, FOLI_IMAGEN) VALUES (67, '0000', 3, 'T', NULL, NULL, 800, 130, 'Hora:', 'Arial', 8, 'N', NULL);
INSERT INTO FORMATO_LINEAS (TIDO_COD, PREF_PRE, FOLI_ITEM, FOLI_TIPO, FOLI_X, FOLI_Y, FOLI_POSX, FOLI_POSY, FOLI_CADENA, FOLI_FONT, FOLI_FSIZE, FOLI_LIQUIDA, FOLI_IMAGEN) VALUES (67, '0000', 4, 'T', NULL, NULL, 100, 150, 'Concepto:', 'Arial', 8, 'N', NULL);
INSERT INTO FORMATO_LINEAS (TIDO_COD, PREF_PRE, FOLI_ITEM, FOLI_TIPO, FOLI_X, FOLI_Y, FOLI_POSX, FOLI_POSY, FOLI_CADENA, FOLI_FONT, FOLI_FSIZE, FOLI_LIQUIDA, FOLI_IMAGEN) VALUES (67, '0000', 5, 'T', NULL, NULL, 100, 170, 'Denominación', 'Arial', 8, 'N', NULL);
INSERT INTO FORMATO_LINEAS (TIDO_COD, PREF_PRE, FOLI_ITEM, FOLI_TIPO, FOLI_X, FOLI_Y, FOLI_POSX, FOLI_POSY, FOLI_CADENA, FOLI_FONT, FOLI_FSIZE, FOLI_LIQUIDA, FOLI_IMAGEN) VALUES (67, '0000', 6, 'T', NULL, NULL, 800, 170, 'Cant', 'Arial', 8, 'N', NULL);
INSERT INTO FORMATO_LINEAS (TIDO_COD, PREF_PRE, FOLI_ITEM, FOLI_TIPO, FOLI_X, FOLI_Y, FOLI_POSX, FOLI_POSY, FOLI_CADENA, FOLI_FONT, FOLI_FSIZE, FOLI_LIQUIDA, FOLI_IMAGEN) VALUES (67, '0000', 7, 'T', NULL, NULL, 1100, 170, 'Total', 'Arial', 8, 'N', NULL);
INSERT INTO FORMATO_LINEAS (TIDO_COD, PREF_PRE, FOLI_ITEM, FOLI_TIPO, FOLI_X, FOLI_Y, FOLI_POSX, FOLI_POSY, FOLI_CADENA, FOLI_FONT, FOLI_FSIZE, FOLI_LIQUIDA, FOLI_IMAGEN) VALUES (67, '0000', 8, 'T', NULL, NULL, 100, 230, 'Total Entregado:', 'Arial', 8, 'S', NULL);
INSERT INTO FORMATO_LINEAS (TIDO_COD, PREF_PRE, FOLI_ITEM, FOLI_TIPO, FOLI_X, FOLI_Y, FOLI_POSX, FOLI_POSY, FOLI_CADENA, FOLI_FONT, FOLI_FSIZE, FOLI_LIQUIDA, FOLI_IMAGEN) VALUES (67, '0000', 9, 'T', NULL, NULL, 100, 70, 'Usuario:', 'Arial', 8, 'N', NULL);
INSERT INTO FORMATO_LINEAS (TIDO_COD, PREF_PRE, FOLI_ITEM, FOLI_TIPO, FOLI_X, FOLI_Y, FOLI_POSX, FOLI_POSY, FOLI_CADENA, FOLI_FONT, FOLI_FSIZE, FOLI_LIQUIDA, FOLI_IMAGEN) VALUES (67, '0000', 10, 'T', NULL, NULL, 100, 300, 'Entregado por: ______________________________', 'Arial', 8, 'S', NULL);
INSERT INTO FORMATO_LINEAS (TIDO_COD, PREF_PRE, FOLI_ITEM, FOLI_TIPO, FOLI_X, FOLI_Y, FOLI_POSX, FOLI_POSY, FOLI_CADENA, FOLI_FONT, FOLI_FSIZE, FOLI_LIQUIDA, FOLI_IMAGEN) VALUES (67, '0000', 11, 'T', NULL, NULL, 800, 300, 'Recibido por: _____________________________', 'Arial', 8, 'S', NULL);
commit work;


INSERT INTO TIPO_DOCUMENTO (TIDO_COD, TIDO_NOMCORTO, TIDO_NOMLARGO, TIDO_MODULO, TIDO_INVE, TIDO_CART, TIDO_CXP, TIDO_CAJA, TIDO_BCOS, TIDO_NOM, TIDO_IMP) VALUES (150, 'VTASARTI', 'VENTAS POR ARTICULO', 'VENTAS', 'N', 'N', 'N', 'N', 'N', 'N', 'N');
INSERT INTO FORMATOS (TIDO_COD, PREF_PRE, FORM_IMPRE, FORM_NROITEMS, FORM_PAGINAS, FORM_ENTRELINEA, FORM_FONT, FORM_FSIZE, FORM_PAPELAN, FORM_PAPELAL) VALUES (150, '0000', '1', 100, 'S', 25, 'Draft 17cpi', 9, 8.5, 11);


INSERT INTO FORMATO_DATOS (TIDO_COD, PREF_PRE, DAFO_DATO, DAFO_IMPRIME, DAFO_POSX, DAFO_POSY, DAFO_FORMATO, DAFO_LONG, DAFO_REPITE, DAFO_FONT, DAFO_FSIZE, DAFO_LIQUIDA, DAFO_POSYVAR, DAFO_ITEM, DAFO_INI, DAFO_CORTARPALABRAS, DAFO_JUSTIFICA) VALUES (150, '0000', 'NOMBRE PUNTO', 'S', 100, 200, NULL, 60, 'N', 'Draft 17cpi', 8, 'N', 'N', 1, 1, 'S', 'I');
INSERT INTO FORMATO_DATOS (TIDO_COD, PREF_PRE, DAFO_DATO, DAFO_IMPRIME, DAFO_POSX, DAFO_POSY, DAFO_FORMATO, DAFO_LONG, DAFO_REPITE, DAFO_FONT, DAFO_FSIZE, DAFO_LIQUIDA, DAFO_POSYVAR, DAFO_ITEM, DAFO_INI, DAFO_CORTARPALABRAS, DAFO_JUSTIFICA) VALUES (150, '0000', 'FECHA', 'S', 100, 250, NULL, 10, 'N', 'Draft 17cpi', 8, 'N', 'N', 2, 1, 'S', 'I');
INSERT INTO FORMATO_DATOS (TIDO_COD, PREF_PRE, DAFO_DATO, DAFO_IMPRIME, DAFO_POSX, DAFO_POSY, DAFO_FORMATO, DAFO_LONG, DAFO_REPITE, DAFO_FONT, DAFO_FSIZE, DAFO_LIQUIDA, DAFO_POSYVAR, DAFO_ITEM, DAFO_INI, DAFO_CORTARPALABRAS, DAFO_JUSTIFICA) VALUES (150, '0000', 'HORA', 'S', 500, 250, NULL, 10, 'N', 'Draft 17cpi', 8, 'N', 'N', 3, 1, 'S', 'I');
INSERT INTO FORMATO_DATOS (TIDO_COD, PREF_PRE, DAFO_DATO, DAFO_IMPRIME, DAFO_POSX, DAFO_POSY, DAFO_FORMATO, DAFO_LONG, DAFO_REPITE, DAFO_FONT, DAFO_FSIZE, DAFO_LIQUIDA, DAFO_POSYVAR, DAFO_ITEM, DAFO_INI, DAFO_CORTARPALABRAS, DAFO_JUSTIFICA) VALUES (150, '0000', 'NOMBRE COMPANIA', 'S', 100, 100, NULL, 60, 'N', 'Draft 17cpi', 8, 'N', 'N', 4, 1, 'S', 'I');
INSERT INTO FORMATO_DATOS (TIDO_COD, PREF_PRE, DAFO_DATO, DAFO_IMPRIME, DAFO_POSX, DAFO_POSY, DAFO_FORMATO, DAFO_LONG, DAFO_REPITE, DAFO_FONT, DAFO_FSIZE, DAFO_LIQUIDA, DAFO_POSYVAR, DAFO_ITEM, DAFO_INI, DAFO_CORTARPALABRAS, DAFO_JUSTIFICA) VALUES (150, '0000', 'NIT COMPANIA', 'S', 100, 150, NULL, 10, 'N', 'Draft 17cpi', 8, 'N', 'N', 5, 1, 'S', 'I');
INSERT INTO FORMATO_DATOS (TIDO_COD, PREF_PRE, DAFO_DATO, DAFO_IMPRIME, DAFO_POSX, DAFO_POSY, DAFO_FORMATO, DAFO_LONG, DAFO_REPITE, DAFO_FONT, DAFO_FSIZE, DAFO_LIQUIDA, DAFO_POSYVAR, DAFO_ITEM, DAFO_INI, DAFO_CORTARPALABRAS, DAFO_JUSTIFICA) VALUES (150, '0000', 'ARTICULO DESCRIPCION', 'S', 100, 400, NULL, 60, 'S', 'Draft 17cpi', 8, 'N', 'N', 6, 1, 'S', 'I');
INSERT INTO FORMATO_DATOS (TIDO_COD, PREF_PRE, DAFO_DATO, DAFO_IMPRIME, DAFO_POSX, DAFO_POSY, DAFO_FORMATO, DAFO_LONG, DAFO_REPITE, DAFO_FONT, DAFO_FSIZE, DAFO_LIQUIDA, DAFO_POSYVAR, DAFO_ITEM, DAFO_INI, DAFO_CORTARPALABRAS, DAFO_JUSTIFICA) VALUES (150, '0000', 'CANTIDAD', 'S', 800, 400, NULL, 60, 'S', 'Draft 17cpi', 8, 'N', 'N', 7, 1, 'S', 'I');
INSERT INTO FORMATO_DATOS (TIDO_COD, PREF_PRE, DAFO_DATO, DAFO_IMPRIME, DAFO_POSX, DAFO_POSY, DAFO_FORMATO, DAFO_LONG, DAFO_REPITE, DAFO_FONT, DAFO_FSIZE, DAFO_LIQUIDA, DAFO_POSYVAR, DAFO_ITEM, DAFO_INI, DAFO_CORTARPALABRAS, DAFO_JUSTIFICA) VALUES (150, '0000', 'TOTAL ITEM', 'S', 1300, 400, NULL, 60, 'S', 'Draft 17cpi', 8, 'N', 'N', 8, 1, 'S', 'I');
INSERT INTO FORMATO_DATOS (TIDO_COD, PREF_PRE, DAFO_DATO, DAFO_IMPRIME, DAFO_POSX, DAFO_POSY, DAFO_FORMATO, DAFO_LONG, DAFO_REPITE, DAFO_FONT, DAFO_FSIZE, DAFO_LIQUIDA, DAFO_POSYVAR, DAFO_ITEM, DAFO_INI, DAFO_CORTARPALABRAS, DAFO_JUSTIFICA) VALUES (150, '0000', 'IVA ITEM MONTO', 'N', 100, 200, NULL, 60, 'S', 'Draft 17cpi', 8, 'N', 'N', 9, 1, 'S', 'I');
INSERT INTO FORMATO_DATOS (TIDO_COD, PREF_PRE, DAFO_DATO, DAFO_IMPRIME, DAFO_POSX, DAFO_POSY, DAFO_FORMATO, DAFO_LONG, DAFO_REPITE, DAFO_FONT, DAFO_FSIZE, DAFO_LIQUIDA, DAFO_POSYVAR, DAFO_ITEM, DAFO_INI, DAFO_CORTARPALABRAS, DAFO_JUSTIFICA) VALUES (150, '0000', 'CONSUMO MONTO', 'N', 100, 200, NULL, 60, 'S', 'Draft 17cpi', 8, 'N', 'N', 10, 1, 'S', 'I');
INSERT INTO FORMATO_DATOS (TIDO_COD, PREF_PRE, DAFO_DATO, DAFO_IMPRIME, DAFO_POSX, DAFO_POSY, DAFO_FORMATO, DAFO_LONG, DAFO_REPITE, DAFO_FONT, DAFO_FSIZE, DAFO_LIQUIDA, DAFO_POSYVAR, DAFO_ITEM, DAFO_INI, DAFO_CORTARPALABRAS, DAFO_JUSTIFICA) VALUES (150, '0000', 'TOTAL ITEMS', 'S', 800, 450, NULL, 10, 'N', 'Draft 17cpi', 8, 'S', 'S', 11, 1, 'S', 'I');
INSERT INTO FORMATO_DATOS (TIDO_COD, PREF_PRE, DAFO_DATO, DAFO_IMPRIME, DAFO_POSX, DAFO_POSY, DAFO_FORMATO, DAFO_LONG, DAFO_REPITE, DAFO_FONT, DAFO_FSIZE, DAFO_LIQUIDA, DAFO_POSYVAR, DAFO_ITEM, DAFO_INI, DAFO_CORTARPALABRAS, DAFO_JUSTIFICA) VALUES (150, '0000', 'SUMA TOTAL', 'S', 1300, 450, NULL, 10, 'N', 'Draft 17cpi', 8, 'S', 'S', 12, 1, 'S', 'I');
INSERT INTO FORMATO_DATOS (TIDO_COD, PREF_PRE, DAFO_DATO, DAFO_IMPRIME, DAFO_POSX, DAFO_POSY, DAFO_FORMATO, DAFO_LONG, DAFO_REPITE, DAFO_FONT, DAFO_FSIZE, DAFO_LIQUIDA, DAFO_POSYVAR, DAFO_ITEM, DAFO_INI, DAFO_CORTARPALABRAS, DAFO_JUSTIFICA) VALUES (150, '0000', 'SUMA IVA', 'N', 900, 450, NULL, 10, 'N', 'Draft 17cpi', 8, 'S', 'S', 13, 1, 'S', 'I');


INSERT INTO FORMATO_LINEAS (TIDO_COD, PREF_PRE, FOLI_ITEM, FOLI_TIPO, FOLI_X, FOLI_Y, FOLI_POSX, FOLI_POSY, FOLI_CADENA, FOLI_FONT, FOLI_FSIZE, FOLI_LIQUIDA, FOLI_IMAGEN) VALUES (150, '0000', 1, 'T', 0, 0, 100, 350, 'ARTICULO', 'Draft 17cpi', 8, 'N', NULL);
INSERT INTO FORMATO_LINEAS (TIDO_COD, PREF_PRE, FOLI_ITEM, FOLI_TIPO, FOLI_X, FOLI_Y, FOLI_POSX, FOLI_POSY, FOLI_CADENA, FOLI_FONT, FOLI_FSIZE, FOLI_LIQUIDA, FOLI_IMAGEN) VALUES (150, '0000', 2, 'T', 0, 0, 650, 350, 'CANTIDAD', 'Draft 17cpi', 8, 'N', NULL);
INSERT INTO FORMATO_LINEAS (TIDO_COD, PREF_PRE, FOLI_ITEM, FOLI_TIPO, FOLI_X, FOLI_Y, FOLI_POSX, FOLI_POSY, FOLI_CADENA, FOLI_FONT, FOLI_FSIZE, FOLI_LIQUIDA, FOLI_IMAGEN) VALUES (150, '0000', 3, 'T', 0, 0, 1000, 350, 'TOTAL', 'Draft 17cpi', 8, 'N', NULL);
INSERT INTO FORMATO_LINEAS (TIDO_COD, PREF_PRE, FOLI_ITEM, FOLI_TIPO, FOLI_X, FOLI_Y, FOLI_POSX, FOLI_POSY, FOLI_CADENA, FOLI_FONT, FOLI_FSIZE, FOLI_LIQUIDA, FOLI_IMAGEN) VALUES (150, '0000', 4, 'T', 0, 0, 100, 450, 'TOTALES', 'Draft 17cpi', 8, 'S', NULL);
COMMIT WORK;

/* FECHA DE CIERRE POR PUNTO DE VENTA */
ALTER TABLE PUNTO_VENTA
ADD PTVT_FECCIE FECHA;

/* 20140311B */
/* AUN USABA EL CAMPO COFA_OK PARA VALIDAR CRUCES */
SET TERM ^ ;

CREATE OR ALTER procedure CRUCES_DOCUMENTO_DETALLE (
    TIPOORI integer,
    IDORI integer)
returns (
    TIPODES integer,
    ID integer,
    NOMTIPO varchar(8),
    PREFIJO varchar(4),
    NUMERO varchar(6),
    FECHA date,
    ARTIC varchar(20),
    DESCRIPCION varchar(60),
    CANT numeric(18,2),
    UNIDAD varchar(8),
    CODBOD varchar(2),
    LOTE varchar(20),
    OBS varchar(255))
AS
declare variable IDC INTEGER;
declare variable PEDAUTO CHAR(2);
begin
EXECUTE PROCEDURE LEE_CONFIGURACION('FACTURACION','FACTURAS','GENERAR PEDIDO AUTOMATICAMENTE CON LA FACTURA') RETURNING_VALUES (PEDAUTO);
FOR SELECT ARTI_COD, COFA_DESCITE, COFA_CANT, COFA_UNIDAD, COFA_BODEGA, COFA_LOTE, SUBSTRING(CODE_OBSIT FROM 1 FOR 255), COFA_TIPODES, COFA_ID
    FROM CONSOLIDADO_FALTANTES WHERE COFA_TIPOORI = :TIPOORI AND COFA_IDORI = :IDORI AND COFA_CANTCR <> 0
    INTO :ARTIC, :DESCRIPCION, :CANT, :UNIDAD, :CODBOD, :LOTE, :OBS, :TIPODES, :IDC
    DO
    BEGIN
    SELECT TIDO_NOMCORTO FROM tipo_documento WHERE TIDO_COD = :tipodes INTO :nomtipo;
    if (TIPODES = 21) then
        SELECT FACO_ID, PREF_PRE, FACO_NUMERO, FACO_FECHA FROM FACTURAS_COMPRA WHERE FACO_CONSOLIDA = :IDC AND FACO_ANULADO = 'N' INTO :ID, :PREFIJO, :NUMERO, :FECHA;
    if (TIPODES = 22) then
        SELECT REPR_ID, PREF_PRE, REPR_NUMERO, REPR_FECHA FROM remision_proveedor WHERE REPR_CONSOLIDA = :IDC AND REPR_ANULADO = 'N' INTO :ID, :PREFIJO, :NUMERO, :FECHA;
    if (TIPODES = 23) then
        SELECT ORDC_ID, PREF_PRE, ORDC_NUMERO, ORDC_FECHA FROM ORDENES_COMPRA WHERE ORDC_CONSOLIDA = :IDC AND ORDC_ANULADO = 'N' INTO :ID, :PREFIJO, :NUMERO, :FECHA;
    if (TIPODES = 31) then
        SELECT FACT_ID, PREF_PRE, FACT_NUMERO, FACT_FECHA FROM FACTURAS WHERE FACT_CONSOLIDA = :IDC AND FACT_ANULADO = 'N' INTO :ID, :PREFIJO, :NUMERO, :FECHA;
    if (TIPODES = 32) then
        SELECT REVT_ID, PREF_PRE, REVT_NUMERO, REVT_FECHA FROM remisiones_venta WHERE REVT_CONSOLIDA = :IDC AND REVT_ANULADO = 'N' INTO :ID, :PREFIJO, :NUMERO, :FECHA;
    if (TIPODES = 34) then
        SELECT PEDI_ID, PREF_PRE, PEDI_NUMERO, PEDI_FECHA FROM PEDIDOS WHERE PEDI_CONSOLIDA = :IDC AND PEDI_ANULADO = 'N' INTO :ID, :PREFIJO, :NUMERO, :FECHA;
    suspend;
    END

if (tipoori = 31) then
    BEGIN
    tipodes = 33;
    SELECT TIDO_NOMCORTO FROM tipo_documento WHERE TIDO_COD = :tipodes INTO :nomtipo;
    for select devt_id, pref_pre, devt_numero, devt_fecha from devoluciones_ventas where devt_factid = :idori and devt_anulado = 'N'
        into :ID, :PREFIJO, :NUMERO, :FECHA
        do
        suspend;

    tipodes = 34;
    if (PEDAUTO = 'SI') then
        BEGIN
        SELECT PEDI_ID FROM PEDIDOS P, FACTURAS F WHERE P.PREF_PRE = F.pref_pre AND PEDI_NUMERO = FACT_NUMERO AND fact_id = :idori into :idori;
        FOR SELECT DISTINCT COFA_TIPODES, COFA_ID FROM CONSOLIDADO_FALTANTES
            WHERE COFA_TIPOORI = 34 AND COFA_IDORI = :IDORI AND COFA_OK = 'S'
            INTO :TIPODES, :IDC
            DO
            BEGIN
            if (TIPODES = 32) then
                BEGIN
                SELECT TIDO_NOMCORTO FROM tipo_documento WHERE TIDO_COD = :tipodes INTO :nomtipo;
                SELECT REVT_ID, PREF_PRE, REVT_NUMERO, REVT_FECHA FROM remisiones_venta
                    WHERE REVT_CONSOLIDA = :IDC AND REVT_ANULADO = 'N'
                    INTO :ID, :PREFIJO, :NUMERO, :FECHA;
                SUSPEND;
                END
            END
        END

    tipodes = 37;
    SELECT TIDO_NOMCORTO FROM tipo_documento WHERE TIDO_COD = :tipodes INTO :nomtipo;
    for select r.rute_id, r.pref_pre, r.rute_numero, r.rute_fecha from rutero_detalle d, rutero r
        where r.rute_id = d.rute_id and d.rutd_factid = :idori and r.rute_anulado = 'N'
        into :ID, :PREFIJO, :NUMERO, :FECHA
        do
        suspend;
    END
if (tipoori = 32) then
    BEGIN
    tipodes = 33;
    SELECT TIDO_NOMCORTO FROM tipo_documento WHERE TIDO_COD = :tipodes INTO :nomtipo;
    for select devt_id, pref_pre, devt_numero, devt_fecha from devoluciones_ventas where devt_remid = :idori and devt_anulado = 'N'
        into :ID, :PREFIJO, :NUMERO, :FECHA
        do
        suspend;
    END
if (tipoori = 34) then
    BEGIN
    tipodes = 33;
    SELECT TIDO_NOMCORTO FROM tipo_documento WHERE TIDO_COD = :tipodes INTO :nomtipo;
    for select devt_id, pref_pre, devt_numero, devt_fecha from devoluciones_ventas where devt_pedid = :idori and devt_anulado = 'N'
        into :ID, :PREFIJO, :NUMERO, :FECHA
        do
        suspend;
    END
end^

SET TERM ; ^

/* 20140312 */
/* VALIDE LA EXISTENCIA RESERVADA SI LA CONFIGURACION ESTA EN PROHIBIR */
SET TERM ^ ;

CREATE OR ALTER procedure EXISTENCIA_BODEGA (
    ARTICULO varchar(15),
    FECHA date,
    BODEGA varchar(2))
returns (
    EXISTENCIA numeric(18,2),
    RESERVADO numeric(18,2))
AS
declare variable ORDENC NUMERIC(18,4);
declare variable PEDIDO NUMERIC(18,4);
declare variable ITEM INTEGER;
declare variable ID INTEGER;
declare variable UND VARCHAR(8);
declare variable CANT NUMERIC(18,4);
declare variable factor2 NUMERIC(18,4);
declare variable PEDAUTO CHAR(2);
BEGIN
execute procedure saldo_inventario (:articulo, :bodega, :fecha) returning_values (:Existencia);
/* LO RESERVADO */
SELECT SUM(RSDE_LIBERAR)
  FROM RESERVAS_DETALLE RD, RESERVAS R
  WHERE R.RESE_ID = RD.RESE_ID AND ARTI_COD = :ARTICULO AND RESE_FECHA <= :FECHA AND RESE_VENCE >= :FECHA AND RD.BODE_COD = :BODEGA AND RSDE_ANULADO = 'N'
  INTO :RESERVADO;
if (RESERVADO IS NULL) then
    RESERVADO = 0;
PEDIDO = 0;
FOR SELECT P.PEDI_ID, PEDE_ITEM, PEDE_CANT * PEDE_FACTOR
    FROM PEDIDOS P, PEDIDOS_DETALLE PD
    WHERE P.PEDI_ID = PD.PEDI_ID AND PD.ARTI_COD = :ARTICULO AND (PEDI_FECHA+PEDI_VALIDEZ) >= :FECHA AND PEDI_FECHA <= :FECHA AND PEDE_ANULADO = 'N' AND BODE_COD = :BODEGA
    INTO :ID, :ITEM, :CANT
    do
    BEGIN
    EXECUTE PROCEDURE FALTANTE(34, 31, ID, ITEM) returning_values (ORDENC, UND, FACTOR2);
    EXECUTE PROCEDURE LEE_CONFIGURACION('FACTURACION', 'FACTURAS', 'GENERAR PEDIDO AUTOMATICAMENTE CON LA FACTURA') returning_values (pedauto);
    if ((ORDENC * FACTOR2 = CANT) or (PEDAUTO = 'SI')) then /* SI NO SE HA FACTURADO MIRE A VER SI SE REMISIONO */
        EXECUTE PROCEDURE FALTANTE(34, 32, ID, ITEM) returning_values (ORDENC, UND, FACTOR2);
    if (ORDENC IS NULL) then
        ORDENC = 0;
    PEDIDO = PEDIDO + ORDENC * FACTOR2;
    END
RESERVADO = RESERVADO + PEDIDO;
SUSPEND;
END^

SET TERM ; ^

GRANT EXECUTE ON PROCEDURE existencia_bodega TO PUBLIC;

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;
    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
    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 ; ^

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;
    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
    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 ; ^

/* 20140313 */
/* retenciones al imprimir orden de compra */
SET TERM ^ ;

CREATE OR ALTER procedure IMPR_ORDENCMP (
    ID integer,
    BODINI varchar(2),
    BODFIN varchar(2))
returns (
    PREF varchar(4),
    NUMERO varchar(8),
    FECHA date,
    DIASVENCE integer,
    NIT varchar(20),
    NOMTERCERO varchar(60),
    CODBODEGA varchar(2),
    NOMBODEGA varchar(30),
    COTIZACION varchar(30),
    SUBTOTAL numeric(18,2),
    DTOPORC numeric(9,2),
    DTOMONTO numeric(18,2),
    ADICIONAL numeric(18,2),
    IVAMONTO 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),
    RTECREE numeric(9,2),
    RTECREEM numeric(18,2),
    EXTRA numeric(18,2),
    DTOFPORC numeric(9,2),
    DTOFMONTO numeric(18,2),
    FECHADTO date,
    CONDENTREGA varchar(255),
    TOTALFAC numeric(18,2),
    OBS blob sub_type 1 segment size 80,
    BOD1 varchar(2),
    BOD2 varchar(2),
    BOD3 varchar(2),
    BOD4 varchar(2),
    BOD5 varchar(2),
    BOD6 varchar(2),
    BOD7 varchar(2),
    BOD8 varchar(2),
    BOD9 varchar(2),
    BOD0 varchar(2),
    ITEM integer,
    ARTICULO varchar(15),
    CODBAR varchar(15),
    ARTIDES varchar(60),
    ARTIPROV varchar(15),
    CANT numeric(18,4),
    UNIDAD varchar(8),
    BODITEM varchar(2),
    PRUNIT numeric(18,2),
    DTOITPORC numeric(9,2),
    DTOITMONTO numeric(18,2),
    PRNETO numeric(18,2),
    IVAPORC numeric(9,2),
    IVAITMONTO numeric(18,2),
    CONSUMO numeric(18,2),
    TOTAL numeric(18,2),
    TOTALPAGAR numeric(18,2),
    OBSITEM blob sub_type 1 segment size 80,
    CODIGOPR varchar(20),
    ZONACOD varchar(2),
    ZONANOM varchar(30),
    DV char(1),
    DIRECCION varchar(60),
    CIUDAD varchar(40),
    TELEFONO varchar(40),
    CONTACTO varchar(60),
    DIASPAGO integer,
    FAX varchar(25),
    GRUPO varchar(2),
    SUBGRUPO varchar(3),
    MARCA varchar(3),
    PESO numeric(9,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),
    IVA1 numeric(18,2),
    IVA2 numeric(18,2),
    IVA3 numeric(18,2),
    SUMAEX numeric(18,2),
    SUMAGR numeric(18,2),
    CANTB1 numeric(18,4),
    CANTB2 numeric(18,4),
    CANTB3 numeric(18,4),
    CANTB4 numeric(18,4),
    CANTB5 numeric(18,4),
    CANTB6 numeric(18,4),
    CANTB7 numeric(18,4),
    CANTB8 numeric(18,4),
    CANTB9 numeric(18,4),
    CANTB0 numeric(18,4))
AS
declare variable imptos char(1);
declare variable tarifa integer;
declare variable orden char(2);
declare variable i integer;
declare variable totalitem numeric(18,2);
declare variable ivaitem numeric(18,2);
declare variable cantitem numeric(18,2);
BEGIN
  SELECT PREF_PRE, ORDC_NUMERO, ORDC_FECHA, ORDC_VALIDEZ, O.BODE_COD, BODE_NOM, O.TERC_NIT, TERC_NOM, ORDC_COTIZACION, ORDC_IMPTOS,
    ORDC_DTOPORC, ORDC_DTOMONTO, ORDC_ADICIONAL, ORDC_IVAMONTO, 
    ORDC_EXTRA, ORDC_DTOFPORC, ORDC_DTOFMONTO, ORDC_DTOFECHA, ORDC_TOTAL, TERC_DIR, TERC_CIU, TERC_TEL, TERC_CONTACTO, TERC_FAX, TERC_DV,
    ORDC_OBS,ORDC_DIASPAGO, ORDC_CONDENTREGA, ORDC_RTFTEPORC, ORDC_RTFTEMONTO, ORDC_RTIVAPORC, ORDC_RTIVAMONTO,
    ORDC_RTICAPORC, ORDC_RTICAMONTO, ORDC_RTCREE, ORDC_RTCREEM
    FROM ORDENES_COMPRA O, BODEGA B, TERCEROS T
    WHERE O.BODE_COD = B.BODE_COD AND O.TERC_NIT = T.TERC_NIT AND O.ORDC_ID = :ID
    into :PREF, :NUMERO, :FECHA, :DIASVENCE, :CODBODEGA, :NOMBODEGA, :NIT, :NOMTERCERO, :COTIZACION, :IMPTOS,
    :DTOPORC, :DTOMONTO, :ADICIONAL, :IVAMONTO, :EXTRA, :DTOFPORC, :DTOFMONTO, :FECHADTO, :TOTALFAC,
    :DIRECCION, :CIUDAD, :TELEFONO, :CONTACTO, :FAX, :DV, :OBS, :DIASPAGO, :condentrega, :RTEFTEPORC, :RTEFTEMONTO, :RTEIVAPORC, :RTEIVAMONTO,
    :RTEICAPORC, :RTEICAMONTO, :RTECREE, :RTECREEM;
    
  SELECT PROV_COD, P.GRPR_COD, GRPR_NOM
    FROM PROVEEDORES P, GRUPOS_PROVEEDORES G
    WHERE TERC_NIT = :NIT AND G.GRPR_COD = P.GRPR_COD
    INTO :CODIGOPR, :ZONACOD, :ZONANOM;
    
  SUBTOTAL = TOTALFAC - EXTRA - IVAMONTO - ADICIONAL + DTOMONTO;
  TOTALPAGAR = TOTALFAC - RTEFTEMONTO - RTEIVAMONTO - RTEICAMONTO - RTECREEM;
  SUMAEX = 0;
  SUMA1 = 0;
  SUMA2 = 0;
  SUMA3 = 0;
  IVA1 = 0;
  IVA2 = 0;
  IVA3 = 0;

execute procedure lee_configuracion('COMPRAS', 'DOCUMENTOS', 'ORDENAR ITEMS POR BODEGA AL IMPRIMIR DOCUMENTOS') returning_values (:Orden);
if (orden = 'NO') then
  BEGIN
  FOR SELECT OCDE_ITEM, D.ARTI_COD, OCDE_CODBAR, OCDE_DESC, OCDE_CANT, OCDE_UNIDAD, BODE_COD, OCDE_PRUNIT,
    OCDE_DTOPORC, OCDE_DTOMONTO, OCDE_IVAPORC, OCDE_IVAMONTO, OCDE_CONSUMO, OCDE_TOTAL, OCDE_OBS,
    GRUP_COD, SUBG_COD, MARC_COD, ARTI_PESO, ARTI_ANCHO, ARTI_ALTO, ARTI_LARGO, TAIV_COD, OCDE_CODPROV
    FROM ORDENES_COMPRA_DETALLE D, ARTICULO A
    WHERE D.ARTI_COD = A.ARTI_COD AND D.ORDC_ID = :ID
    ORDER BY OCDE_ITEM
    INTO :ITEM, :ARTICULO, :CODBAR, :ARTIDES, :CANT, :UNIDAD, :BODITEM, :PRUNIT,
    :DTOITPORC, :DTOITMONTO, :IVAPORC, :IVAITMONTO, :CONSUMO, :TOTAL, :OBSITEM,
    :GRUPO, :SUBGRUPO, :MARCA, :PESO, :ANCHO, :ALTO, :LARGO, :TARIFA, :ARTIPROV
    DO
      BEGIN
      PRNETO = PRUNIT - DTOITMONTO;
      if (IVAPORC = 0) then
        SUMAEX = SUMAEX + TOTAL;
      if (TARIFA = 1) then
        BEGIN
        SUMA1 = SUMA1 + TOTAL - IVAITMONTO;
        IVA1 = IVA1 + IVAITMONTO;
        END
      if (TARIFA = 2) then
        BEGIN
        SUMA2 = SUMA2 + TOTAL - IVAITMONTO;
        IVA2 = IVA2 + IVAITMONTO;
        END
      if (TARIFA = 3) then
        BEGIN
        SUMA3 = SUMA3 + TOTAL - IVAITMONTO;
        IVA3 = IVA3 + IVAITMONTO;
        END
      SUMAGR = SUMA1 + SUMA2 + SUMA3;
      if (IMPTOS = 'N') then
        TOTAL = TOTAL - IVAITMONTO;
      SUSPEND;
      END
  END
ELSE
  BEGIN
  /* RECALCULE TOTALES PARA EL RANGO IMPRESO */
  SELECT SUM(OCDE_IVAMONTO), SUM(OCDE_TOTAL) FROM ORDENES_COMPRA_DETALLE
    WHERE ORDC_ID = :ID AND BODE_COD >= :BODINI AND bode_cod <= :bodfin 
    into :IVAMONTO, :TOTALFAC;
  DTOMONTO = DTOPORC * (TOTALFAC - IVAMONTO);
  SUBTOTAL = TOTALFAC - IVAMONTO + DTOMONTO;
  /* INICIALICE LAS COLUMNAS */
  i = 0;
  for select bode_cod from bodega ORDER by BODE_COD into :bod0
    do
    begin
    i = i + 1;
    if (I = 1) then bod1 = :bod0;
    if (I = 2) then bod2 = :bod0;
    if (I = 3) then bod3 = :bod0;
    if (I = 4) then bod4 = :bod0;
    if (I = 5) then bod5 = :bod0;
    if (I = 6) then bod6 = :bod0;
    if (I = 7) then bod7 = :bod0;
    if (I = 8) then bod8 = :bod0;
    if (I = 9) then bod9 = :bod0;
    end
  /* AGRUPE POR ARTICULO PARA PODER MANEJAR LAS COLUMNAS */
  for select distinct arti_cod from ordenes_compra_detalle
    where ordc_id = :id  AND BODE_COD >= :BODINI AND bode_cod <= :bodfin into :articulo
    do
    begin
    TOTAL = 0;
    ivaitmonto = 0;
    CANT = 0;
    cantb1 = 0;
    cantb2 = 0;
    cantb3 = 0;
    cantb4 = 0;
    cantb5 = 0;
    cantb6 = 0;
    cantb7 = 0;
    cantb8 = 0;
    cantb9 = 0;
    cantb0 = 0;
    FOR SELECT OCDE_CODBAR, OCDE_DESC, OCDE_CANT, OCDE_UNIDAD, BODE_COD, OCDE_PRUNIT,
        OCDE_DTOPORC, OCDE_DTOMONTO, OCDE_IVAPORC, OCDE_IVAMONTO, OCDE_CONSUMO, OCDE_TOTAL, OCDE_OBS,
        GRUP_COD, SUBG_COD, MARC_COD, ARTI_PESO, ARTI_ANCHO, ARTI_ALTO, ARTI_LARGO, TAIV_COD, OCDE_CODPROV
        FROM ORDENES_COMPRA_DETALLE D, ARTICULO A
        WHERE D.ARTI_COD = A.ARTI_COD AND D.ORDC_ID = :ID AND D.ARTI_COD = :ARTICULO AND
        D.BODE_COD >= :BODINI AND D.bode_cod <= :bodfin
        ORDER BY D.bode_cod, OCDE_ITEM
        INTO :CODBAR, :ARTIDES, :cantitem, :UNIDAD, :BODITEM, :PRUNIT,
        :DTOITPORC, :DTOITMONTO, :IVAPORC, :ivaitem, :CONSUMO, :totalitem, :OBSITEM,
        :GRUPO, :SUBGRUPO, :MARCA, :PESO, :ANCHO, :ALTO, :LARGO, :TARIFA, :ARTIPROV
        DO
        BEGIN
        if (boditem = bod1) then
            cantb1 = cantb1 + CANTITEM;
        if (boditem = bod2) then
            cantb2 = cantb2 + CANTITEM;
        if (boditem = bod3) then
            cantb3 = cantb3 + CANTITEM;
        if (boditem = bod4) then
            cantb4 = cantb4 + CANTITEM;
        if (boditem = bod5) then
            cantb5 = cantb5 + CANTITEM;
        if (boditem = bod6) then
            cantb6 = cantb6 + CANTITEM;
        if (boditem = bod7) then
            cantb7 = cantb7 + CANTITEM;
        if (boditem = bod8) then
            cantb8 = cantb8 + CANTITEM;
        if (boditem = bod9) then
            cantb9 = cantb9 + CANTITEM;
        if (boditem = bod0) then
            cantb0 = cantb0 + CANTITEM;
        PRNETO = PRUNIT - DTOITMONTO;
        if (IVAPORC = 0) then
            SUMAEX = SUMAEX + totalitem;
        if (TARIFA = 1) then
            BEGIN
            SUMA1 = SUMA1 + totalitem - ivaitem;
            IVA1 = IVA1 + ivaitem;
            END
        if (TARIFA = 2) then
            BEGIN
            SUMA2 = SUMA2 + totalitem - ivaitem;
            IVA2 = IVA2 + ivaitem;
            END
        if (TARIFA = 3) then
            BEGIN
            SUMA3 = SUMA3 + totalitem - ivaitem;
            IVA3 = IVA3 + ivaitem;
            END
        SUMAGR = SUMA1 + SUMA2 + SUMA3;
        if (IMPTOS = 'N') then
            totalitem = totalitem - ivaitem;
        TOTAL = TOTAL + TOTALITEM;
        ivaitmonto = ivaitmonto + ivaitem;
        CANT = CANT + cantitem;
        end
    if (CANT <> 0) then
        SUSPEND;
    END
  END
END^

SET TERM ; ^

/* 20140318 */
/* CIUDAD Y ZONA VACIA EN REPORTE DETALLADO */
SET TERM ^ ;

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

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

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

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

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

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

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

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

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

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

                COSTO = COSTO + costounit * cantdet;
                END
            NOMGRUPO = '';
            NOMSUBG = '';
            NOMMARC = '';
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            EXECUTE PROCEDURE costo_promedio (:ARTICULO, :FECFIN) RETURNING_VALUES (:COSTOUNIT);
            IF (CANTIDAD IS NULL) THEN
                CANTIDAD = 0;
            IF (BASE IS NULL) THEN
                BASE = 0;
            IF (IVA IS NULL) THEN
                IVA = 0;
            UTILIDAD = BASE - COSTO;
            IF (UOM = 'UTILIDAD') THEN
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') RETURNING_VALUES (PORC);
            ELSE
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') RETURNING_VALUES (PORC);
            IF (CEROS = 'S') THEN
                INSERT INTO REPORTES_AUX (REPA_ID, REPA_USER, REPA_ARTICULO) VALUES (3, USER, :ARTICULO);
            SUSPEND;
            END /* FOR */
        IF (CEROS = 'S') THEN
            BEGIN
            COSTO = 0;
            UTILIDAD = 0;
            PORC = 0;
            /* agregue los articulos sin factura */
            FOR SELECT ARTI_COD, 0, 0, 0, ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                FROM ARTICULO A WHERE A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN
                INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
                DO
                BEGIN
                SELECT COUNT(REPA_ARTICULO) FROM REPORTES_AUX WHERE REPA_ID = 3 AND REPA_USER = USER AND REPA_ARTICULO = :articulo INTO :numrows;
                IF (numrows = 0) THEN
                    BEGIN
                    NOMGRUPO = '';
                    NOMSUBG = '';
                    NOMMARC = '';
                    SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                    SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                    SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                    SUSPEND;
                    END
                END
            END
        END
    END
ELSE
    BEGIN
    IF (BIN_AND(TIPO, 1) <> 0) THEN
            BEGIN
            SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 31 INTO :NOMTIPO;
            FOR SELECT F.PREF_PRE, FACT_NUMERO, FACT_FECHA, ARTI_COD, FADE_CANT * FADE_FACTOR, (FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO)*FACT_FACTOR,
                FADE_IVAMONTO*FACT_FACTOR, FADE_DTOPORC, FADE_TOTAL*FACT_FACTOR, F.terc_nit, F.fact_nomcliente, f.fact_sucursal
                FROM FACTURAS F, FACTURAS_DETALLE D, PREFIJOS P
                WHERE F.FACT_ID = D.FACT_ID AND FACT_FECHA >= :FECINI AND FACT_FECHA <= :FECFIN AND F.TERC_NIT >= :TERINI AND F.TERC_NIT <= :TERFIN AND FACT_ANULADO = 'N'
                 AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 31 AND ((SUCU_ID = :SUBEMPRESA) OR (:SUBEMPRESA = 0)) AND SUBSTRING(D.arti_cod FROM 1 FOR 2) <> '.t'
                 AND D.ARTI_COD >= :CODINI AND D.ARTI_COD <= :CODFIN AND D.fade_desc >= :DESINI AND D.fade_desc <= :DESFIN
                ORDER BY f.terc_nit, f.fact_sucursal, ARTI_COD, FACT_FECHA, F.FACT_ID, FADE_ITEM
                INTO :PREFIJO, :NUMERO, :FECHA, :ARTICULO, :CANTIDAD, :BASE, :IVA, :DTO, :TOTAL, :NIT, :nombre, :sucursal
                DO
                BEGIN
                SELECT ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                    FROM ARTICULO WHERE ARTI_COD = :ARTICULO
                    INTO :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC;
                NOMGRUPO = '';
                NOMSUBG = '';
                NOMMARC = '';
                nomzona = '';
                SELECT TERC_TEL, TERC_CIU, C.ZONA_COD, ZONA_NOM
                    FROM terceros T, CLIENTES C, ZONAS Z WHERE T.TERC_NIT = :NIT AND T.terc_nit = C.terc_nit AND C.zona_cod = Z.zona_cod
                    INTO :telefono, :ciudad, :codzona, :nomzona;
                SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                IF (EXISTS (SELECT COST_SALP / COST_SALC FROM COSTOS C, MOVIMIENTO_ARTICULO M
                    WHERE COST_IDMOV = MVAR_CONS AND MVAR_TIPODOC = 31 AND MVAR_IDREF = :ID AND COST_SALC <> 0 AND MVAR_ITEM = :ITEM)) THEN
                    SELECT COST_SALP / COST_SALC, COST_ULTIMO FROM COSTOS C, MOVIMIENTO_ARTICULO M
                        WHERE COST_IDMOV = MVAR_CONS AND MVAR_TIPODOC = 31 AND MVAR_IDREF = :ID AND COST_SALC <> 0 AND MVAR_ITEM = :ITEM
                        INTO :costounit, :ultcos;
                ELSE
                    EXECUTE PROCEDURE costo_promedio_y_ultimo(:ARTICULO, :FECHA) RETURNING_VALUES (:costounit, :ultcos);
                IF (ULTIMO = 'S') THEN
                    COSTOUNIT = ultcos;
                /* EL FACTOR */
                FACCOST = 1;
                SELECT FIRST 1 FACO_FACTOR FROM factor_costo WHERE FACO_FECINI <= :FECHA AND FACO_FECFIN >= :FECHA INTO :FACCOST;
                COSTOUNIT = COSTOUNIT * FACCOST;

                COSTO = COSTOUNIT * CANTIDAD;
                UTILIDAD = BASE - COSTO;
                IF (UOM = 'UTILIDAD') THEN
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') RETURNING_VALUES (PORC);
                ELSE
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') RETURNING_VALUES (PORC);
                SUSPEND;
                END
            END
    IF (BIN_AND(TIPO, 2) <> 0) THEN
            BEGIN
            SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 32 INTO :NOMTIPO;
            FOR SELECT R.PREF_PRE, REVT_NUMERO, REVT_FECHA, ARTI_COD, RVDE_CANT * RVDE_FACTOR,
                (RVDE_TOTAL - RVDE_IVAMONTO), RVDE_IVAMONTO, RVDE_DTOPORC, RVDE_TOTAL, R.terc_nit, R.revt_nomterc, r.revt_sucursal
                FROM REMISIONES_VENTA R, REMISIONES_VENTA_DETALLE D, PREFIJOS P
                WHERE R.REVT_ID = D.REVT_ID AND REVT_FECHA >= :FECINI AND REVT_FECHA <= :FECFIN AND R.TERC_NIT >= :TERINI AND R.TERC_NIT <= :TERFIN AND REVT_ANULADO = 'N'
                 AND P.PREF_PRE = R.PREF_PRE AND P.TIDO_COD = 32 AND ((SUCU_ID = :SUBEMPRESA) OR (:SUBEMPRESA = 0))
                 AND D.ARTI_COD >= :CODINI AND D.ARTI_COD <= :CODFIN AND D.rvde_desc >= :DESINI AND D.rvde_desc <= :DESFIN
                ORDER BY r.terc_nit, r.revt_sucursal, ARTI_COD, REVT_FECHA, R.REVT_ID, RVDE_ITEM
                INTO :PREFIJO, :NUMERO, :FECHA, :ARTICULO, :CANTIDAD, :BASE, :IVA, :DTO, :TOTAL, :NIT, :nombre, :sucursal
                DO
                BEGIN
                SELECT ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                    FROM ARTICULO WHERE ARTI_COD = :ARTICULO
                    INTO :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC;
                NOMGRUPO = '';
                NOMSUBG = '';
                NOMMARC = '';
                nomzona = '';
                SELECT TERC_TEL, TERC_CIU, C.ZONA_COD, ZONA_NOM
                    FROM terceros T, CLIENTES C, ZONAS Z WHERE T.TERC_NIT = :NIT AND T.terc_nit = C.terc_nit AND C.zona_cod = Z.zona_cod
                    INTO :telefono, :ciudad, :codzona, :nomzona;
                SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                IF (EXISTS (SELECT COST_SALP / COST_SALC FROM COSTOS C, MOVIMIENTO_ARTICULO M
                    WHERE COST_IDMOV = MVAR_CONS AND MVAR_TIPODOC = 32 AND MVAR_IDREF = :ID AND COST_SALC <> 0 AND MVAR_ITEM = :ITEM)) THEN
                    SELECT COST_SALP / COST_SALC, COST_ULTIMO FROM COSTOS C, MOVIMIENTO_ARTICULO M
                        WHERE COST_IDMOV = MVAR_CONS AND MVAR_TIPODOC = 32 AND MVAR_IDREF = :ID AND COST_SALC <> 0 AND MVAR_ITEM = :ITEM
                        INTO :costounit, :ultcos;
                ELSE
                    EXECUTE PROCEDURE costo_promedio_y_ultimo(:ARTICULO, :FECHA) RETURNING_VALUES (:costounit, :ultcos);
                IF (ULTIMO = 'S') THEN
                    COSTOUNIT = ultcos;
                /* EL FACTOR */
                FACCOST = 1;
                SELECT FIRST 1 FACO_FACTOR FROM factor_costo WHERE FACO_FECINI <= :FECHA AND FACO_FECFIN >= :FECHA INTO :FACCOST;
                COSTOUNIT = COSTOUNIT * FACCOST;

                COSTO = COSTOUNIT * CANTIDAD;
                UTILIDAD = BASE - COSTO;
                IF (UOM = 'UTILIDAD') THEN
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') RETURNING_VALUES (PORC);
                ELSE
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') RETURNING_VALUES (PORC);
                SUSPEND;
                END
            END
    IF (BIN_AND(TIPO, 4) <> 0) THEN
            BEGIN
            SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 33 INTO :NOMTIPO;
            FOR SELECT V.PREF_PRE, DEVT_NUMERO, DEVT_FECHA, ARTI_COD, DVDE_CANT * DVDE_FACTOR, (DVDE_TOTAL-DVDE_IVAMONTO-DVDE_CONSUMO)*DEVT_FACTOR,
                DVDE_IVAMONTO*DEVT_FACTOR, DVDE_DTOPORC, DVDE_TOTAL*DEVT_FACTOR, V.terc_nit, V.devt_nomterc, v.devt_sucursal
                FROM DEVOLUCIONES_VENTAS V, DEVOLUCIONES_VENTAS_DETALLE D, PREFIJOS P
                WHERE V.DEVT_ID = D.DEVT_ID AND DEVT_FECHA >= :FECINI AND DEVT_FECHA <= :FECFIN AND V.TERC_NIT >= :TERINI AND V.TERC_NIT <= :TERFIN AND DEVT_ANULADO = 'N'
                 AND P.PREF_PRE = V.PREF_PRE AND P.TIDO_COD = 33 AND ((SUCU_ID = :SUBEMPRESA) OR (:SUBEMPRESA = 0))  AND SUBSTRING(D.arti_cod FROM 1 FOR 2) <> '.t'
                 AND D.ARTI_COD >= :CODINI AND D.ARTI_COD <= :CODFIN AND D.dvde_desc >= :DESINI AND D.dvde_desc <= :DESFIN
                ORDER BY v.terc_nit, v.devt_sucursal, ARTI_COD, DEVT_FECHA, D.DEVT_ID, DVDE_ITEM
                INTO :PREFIJO, :NUMERO, :FECHA, :ARTICULO, :CANTIDAD, :BASE, :IVA, :DTO, :TOTAL, :NIT, :nombre, :sucursal
                DO
                BEGIN
                SELECT ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                    FROM ARTICULO WHERE ARTI_COD = :ARTICULO
                    INTO :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC;
                NOMGRUPO = '';
                NOMSUBG = '';
                NOMMARC = '';
                nomzona = '';
                SELECT TERC_TEL, TERC_CIU, C.ZONA_COD, ZONA_NOM
                    FROM terceros T, CLIENTES C, ZONAS Z WHERE T.TERC_NIT = :NIT AND T.terc_nit = C.terc_nit AND C.zona_cod = Z.zona_cod
                    INTO :telefono, :ciudad, :codzona, :nomzona;
                SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                IF (EXISTS (SELECT COST_ENTP / COST_ENTC FROM COSTOS C, MOVIMIENTO_ARTICULO M
                    WHERE COST_IDMOV = MVAR_CONS AND MVAR_TIPODOC = 33 AND MVAR_IDREF = :ID AND COST_ENTC <> 0 AND MVAR_ITEM = :ITEM)) THEN
                    SELECT COST_ENTP / COST_ENTC, COST_ULTIMO FROM COSTOS C, MOVIMIENTO_ARTICULO M
                        WHERE COST_IDMOV = MVAR_CONS AND MVAR_TIPODOC = 33 AND MVAR_IDREF = :ID AND COST_ENTC <> 0 AND MVAR_ITEM = :ITEM
                        INTO :costounit, :ultcos;
                ELSE
                    EXECUTE PROCEDURE costo_promedio_y_ultimo(:ARTICULO, :FECHA) RETURNING_VALUES (:costounit, :ultcos);
                IF (ULTIMO = 'S') THEN
                    COSTOUNIT = ultcos;
                /* EL FACTOR */
                FACCOST = 1;
                SELECT FIRST 1 FACO_FACTOR FROM factor_costo WHERE FACO_FECINI <= :FECHA AND FACO_FECFIN >= :FECHA INTO :FACCOST;
                COSTOUNIT = COSTOUNIT * FACCOST;

                COSTO = COSTOUNIT * CANTIDAD;
                UTILIDAD = BASE - COSTO;
                IF (UOM = 'UTILIDAD') THEN
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') RETURNING_VALUES (PORC);
                ELSE
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') RETURNING_VALUES (PORC);
                TOTAL = TOTAL * -1;
                IVA = IVA * -1;
                BASE = BASE * -1;
                CANTIDAD = CANTIDAD * -1;
                COSTO = COSTO * -1;
                UTILIDAD = UTILIDAD * -1;
                SUSPEND;
                END
            END
    IF (BIN_AND(TIPO, 8) <> 0) THEN
            BEGIN
            SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 34 INTO :NOMTIPO;
            FOR SELECT P.PREF_PRE, PEDI_NUMERO, PEDI_FECHA, ARTI_COD, PEDE_CANT * PEDE_FACTOR, (PEDE_TOTAL-PEDE_IVAMONTO-PEDE_CONSUMO)*PEDI_FACTOR,
                PEDE_IVAMONTO*PEDI_FACTOR, PEDE_DTOPORC, PEDE_TOTAL*PEDI_FACTOR, P.terc_nit, P.pedi_nomterc, p.pedi_sucursal
                FROM PEDIDOS P, PEDIDOS_DETALLE D, PREFIJOS PR
                WHERE P.PEDI_ID = D.PEDI_ID AND PEDI_FECHA >= :FECINI AND PEDI_FECHA <= :FECFIN AND P.TERC_NIT >= :TERINI AND P.TERC_NIT <= :TERFIN AND PEDI_ANULADO = 'N'
                 AND P.PREF_PRE = PR.PREF_PRE AND P.TIDO_COD = 34 AND ((SUCU_ID = :SUBEMPRESA) OR (:SUBEMPRESA = 0))
                 AND D.ARTI_COD >= :CODINI AND D.ARTI_COD <= :CODFIN AND D.pede_desc >= :DESINI AND D.pede_desc <= :DESFIN
                ORDER BY p.terc_nit, p.pedi_sucursal, ARTI_COD, PEDI_FECHA, P.PEDI_ID, PEDE_ITEM
                INTO :PREFIJO, :NUMERO, :FECHA, :ARTICULO, :CANTIDAD, :BASE, :IVA, :DTO, :TOTAL, :NIT, :nombre, :sucursal
                DO
                BEGIN
                SELECT ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                    FROM ARTICULO WHERE ARTI_COD = :ARTICULO
                    INTO :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC;
                NOMGRUPO = '';
                NOMSUBG = '';
                NOMMARC = '';
                nomzona = '';
                SELECT TERC_TEL, TERC_CIU, C.ZONA_COD, ZONA_NOM
                    FROM terceros T, CLIENTES C, ZONAS Z WHERE T.TERC_NIT = :NIT AND T.terc_nit = C.terc_nit AND C.zona_cod = Z.zona_cod
                    INTO :telefono, :ciudad, :codzona, :nomzona;
                SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                EXECUTE PROCEDURE costo_promedio_y_ultimo(:ARTICULO, :FECHA) RETURNING_VALUES (:costounit, :ultcos);
                IF (ULTIMO = 'S') THEN
                    COSTOUNIT = ultcos;
                /* EL FACTOR */
                FACCOST = 1;
                SELECT FIRST 1 FACO_FACTOR FROM factor_costo WHERE FACO_FECINI <= :FECHA AND FACO_FECFIN >= :FECHA INTO :FACCOST;
                COSTOUNIT = COSTOUNIT * FACCOST;

                COSTO = COSTOUNIT * CANTIDAD;
                UTILIDAD = BASE - COSTO;
                IF (UOM = 'UTILIDAD') THEN
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') RETURNING_VALUES (PORC);
                ELSE
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') RETURNING_VALUES (PORC);
                SUSPEND;
                END
            END
    IF (BIN_AND(TIPO, 16) <> 0) THEN
            BEGIN
            SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 35 INTO :NOMTIPO;
            FOR SELECT C.PREF_PRE, COTI_NUMERO, COTI_FECHA, ARTI_COD, CTDE_CANT * CTDE_FACTOR, (CTDE_TOTAL-CTDE_IVAMONTO-CTDE_CONSUMO)*COTI_FACTOR,
                CTDE_IVAMONTO*COTI_FACTOR, CTDE_DTOPORC, CTDE_TOTAL*COTI_FACTOR, C.terc_nit, C.coti_nomterc, c.coti_sucursal
                FROM COTIZACIONES C, COTIZACIONES_DETALLE D, PREFIJOS P
                WHERE C.COTI_ID = D.COTI_ID AND ARTI_COD = :ARTICULO AND COTI_FECHA >= :FECINI AND COTI_FECHA <= :FECFIN AND C.TERC_NIT >= :TERINI AND C.TERC_NIT <= :TERFIN AND COTI_ANULADO = 'N'
                 AND P.PREF_PRE = C.PREF_PRE AND P.TIDO_COD = 35 AND ((SUCU_ID = :SUBEMPRESA) OR (:SUBEMPRESA = 0))
                 AND D.ARTI_COD >= :CODINI AND D.ARTI_COD <= :CODFIN AND D.ctde_desc >= :DESINI AND D.ctde_desc <= :DESFIN
                ORDER BY c.terc_nit, c.coti_sucursal, COTI_FECHA, C.COTI_ID, CTDE_ITEM
                INTO :PREFIJO, :NUMERO, :FECHA, :ARTICULO, :CANTIDAD, :BASE, :IVA, :DTO, :TOTAL, :NIT, :nombre, :sucursal
                DO
                BEGIN
                SELECT ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                    FROM ARTICULO WHERE ARTI_COD = :ARTICULO
                    INTO :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC;
                NOMGRUPO = '';
                NOMSUBG = '';
                NOMMARC = '';
                nomzona = '';
                SELECT TERC_TEL, TERC_CIU, C.ZONA_COD, ZONA_NOM
                    FROM terceros T, CLIENTES C, ZONAS Z WHERE T.TERC_NIT = :NIT AND T.terc_nit = C.terc_nit AND C.zona_cod = Z.zona_cod
                    INTO :telefono, :ciudad, :codzona, :nomzona;
                SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                EXECUTE PROCEDURE costo_promedio_y_ultimo(:ARTICULO, :FECHA) RETURNING_VALUES (:costounit, :ultcos);
                IF (ULTIMO = 'S') THEN
                    COSTOUNIT = ultcos;
                /* EL FACTOR */
                FACCOST = 1;
                SELECT FIRST 1 FACO_FACTOR FROM factor_costo WHERE FACO_FECINI <= :FECHA AND FACO_FECFIN >= :FECHA INTO :FACCOST;
                COSTOUNIT = COSTOUNIT * FACCOST;

                COSTO = COSTOUNIT * CANTIDAD;
                UTILIDAD = BASE - COSTO;
                IF (UOM = 'UTILIDAD') THEN
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') RETURNING_VALUES (PORC);
                ELSE
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') RETURNING_VALUES (PORC);
                SUSPEND;
                END
            END
    END
END
^

SET TERM ; ^

/* 20140318B */
/* MAL REPORTE POR COBRADOR, MAL VERIFICACION RANGO DE FECHAS EN SELECT DISTINC COBRADOR */
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);
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);
  /* 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 (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 ; ^

/* 20140319 */
/* generar certificados de retencion masivamente */
INSERT INTO CONFIGURACION (CONF_MODULO, CONF_CATEGORIA, CONF_PROPIEDAD, CONF_VALOR, CONF_POSIBLES, CONF_AYUDA) VALUES ('CONTABILIDAD', 'GENERAL', 'CARPETA PARA UBICAR ARCHIVOS DE CERTIFICADOS GENERADOS COMO PDF', 'C:\SYSPLUS', '', 'Indique la carpeta donde se ubicarán los archivos PDF con los certificados de retención generados masivamente');
commit work;


CREATE TABLE CUENTAS_NIIF (
    CUEN_COD           VARCHAR(20) NOT NULL,
    CUEN_NOM           VARCHAR(140) NOT NULL,
    CUEN_TERCERO       CHAR(1) NOT NULL,
    CUEN_CENTRO        CHAR(1) NOT NULL,
    CUEN_RETENCION     CHAR(1) NOT NULL,
    CUEN_BASEMIN       T_MONTO /* T_MONTO = NUMERIC(18,2) DEFAULT 0 */,
    CUEN_PORC          T_PORCENTAJE /* T_PORCENTAJE = NUMERIC(9,4) DEFAULT 0 */,
    CUEN_TIPO          CHAR(1) NOT NULL,
    CUEN_ACTIVA        T_BOOLEANO /* T_BOOLEANO = CHAR(1) check (value in ('S','N')) */,
    CUEN_AFECTABLE     T_BOOLEANO /* T_BOOLEANO = CHAR(1) check (value in ('S','N')) */
);

ALTER TABLE CUENTAS_NIIF ADD CONSTRAINT CKC_CUENN_TERCERO_CUENTAS check (CUEN_TERCERO in ('S','N'));
ALTER TABLE CUENTAS_NIIF ADD CONSTRAINT CKC_CUENN_CENTRO_CUENTAS check (CUEN_CENTRO in ('S','N'));
ALTER TABLE CUENTAS_NIIF ADD CONSTRAINT CKC_CUENN_RETENCION_CUENTAS check (CUEN_RETENCION in ('S','N'));

ALTER TABLE CUENTAS_NIIF ADD CONSTRAINT PK_CUENTAS_NIIF PRIMARY KEY (CUEN_COD);

GRANT ALL ON CUENTAS_NIIF TO PUBLIC;


CREATE TABLE SALDOS_INICIALES_NIIF (
    SAIN_ITEM     T_ID NOT NULL /* T_ID = INTEGER */,
    CUEN_COD      T_CTA_CONTABLE NOT NULL /* T_CTA_CONTABLE = VARCHAR(20) */,
    TERC_NIT      T_NIT /* T_NIT = VARCHAR(20) */,
    PROY_COD      T_PROYECTO /* T_PROYECTO = VARCHAR(4) */,
    CENT_COD      T_CENTRO /* T_CENTRO = VARCHAR(4) */,
    ARTI_COD      T_COD_ARTICULO /* T_COD_ARTICULO = VARCHAR(15) */,
    DOCO_NUMERO   VARCHAR(8),
    DOCO_VENCE    CHAR(8),
    SAIN_DEBITO   T_MONTO /* T_MONTO = NUMERIC(18,2) DEFAULT 0 */,
    SAIN_CREDITO  T_MONTO /* T_MONTO = NUMERIC(18,2) DEFAULT 0 */,
    SAIN_TIPODOC  INTEGER
);

ALTER TABLE SALDOS_INICIALES_NIIF ADD CONSTRAINT PK_SALDOS_INICIALES_NIIF PRIMARY KEY (SAIN_ITEM);

GRANT ALL ON SALDOS_INICIALES_NIIF TO PUBLIC;

CREATE TABLE SALDOS_ARTICULO_NIIF (
    ARTI_COD       T_COD_ARTICULO NOT NULL /* T_COD_ARTICULO = VARCHAR(15) */,
    CUEN_COD       T_CTA_CONTABLE NOT NULL /* T_CTA_CONTABLE = VARCHAR(20) */,
    SAAR_FECHA     CHAR(8) NOT NULL,
    SAAR_SALDO     T_MONTO /* T_MONTO = NUMERIC(18,2) DEFAULT 0 */,
    SAAR_DEBITOS   T_MONTO /* T_MONTO = NUMERIC(18,2) DEFAULT 0 */,
    SAAR_CREDITOS  T_MONTO /* T_MONTO = NUMERIC(18,2) DEFAULT 0 */
);

ALTER TABLE SALDOS_ARTICULO_NIIF ADD CONSTRAINT PK_SALDOS_ARTICULO_NIIF PRIMARY KEY (CUEN_COD, ARTI_COD, SAAR_FECHA)
USING DESCENDING INDEX PK_SALDOS_ARTICULO_NIIF;

ALTER TABLE SALDOS_ARTICULO_NIIF ADD CONSTRAINT FK_SALDARTI_ARTICULO_NIIF FOREIGN KEY (ARTI_COD) REFERENCES ARTICULO (ARTI_COD);

GRANT ALL ON SALDOS_ARTICULO_NIIF TO PUBLIC;

CREATE TABLE SALDOS_CENTROS_NIIF (
    PROY_COD      T_PROYECTO NOT NULL /* T_PROYECTO = VARCHAR(4) */,
    CENT_COD      T_CENTRO NOT NULL /* T_CENTRO = VARCHAR(4) */,
    CUEN_COD      VARCHAR(20) NOT NULL,
    SACU_FECHA    CHAR(8) NOT NULL,
    SACE_SALDO    NUMERIC(18,2),
    SACE_DEBITO   NUMERIC(18,2),
    SACE_CREDITO  NUMERIC(18,2)
);

ALTER TABLE SALDOS_CENTROS_NIIF ADD CONSTRAINT PK_SALDOS_CENTROS_NIIF PRIMARY KEY (CUEN_COD, PROY_COD, CENT_COD, SACU_FECHA)
USING DESCENDING INDEX PK_SALDOS_CENTROS_NIIF;

ALTER TABLE SALDOS_CENTROS_NIIF ADD CONSTRAINT FK_SALDOCENT_CENTROS_NIIF FOREIGN KEY (PROY_COD, CENT_COD) REFERENCES CENTROS (PROY_COD, CENT_COD);

GRANT ALL ON SALDOS_CENTROS_NIIF TO PUBLIC;

CREATE TABLE SALDOS_CENTROS_TERCERO_NIIF (
    CUEN_COD      T_CTA_CONTABLE NOT NULL /* T_CTA_CONTABLE = VARCHAR(20) */,
    SACU_FECHA    CHAR(8) NOT NULL,
    PROY_COD      T_PROYECTO NOT NULL /* T_PROYECTO = VARCHAR(4) */,
    CENT_COD      T_CENTRO NOT NULL /* T_CENTRO = VARCHAR(4) */,
    TERC_NIT      T_NIT NOT NULL /* T_NIT = VARCHAR(20) */,
    SACT_SALDO    T_MONTO /* T_MONTO = NUMERIC(18,2) DEFAULT 0 */,
    SACT_DEBITO   T_MONTO /* T_MONTO = NUMERIC(18,2) DEFAULT 0 */,
    SACT_CREDITO  T_MONTO /* T_MONTO = NUMERIC(18,2) DEFAULT 0 */
);

ALTER TABLE SALDOS_CENTROS_TERCERO_NIIF ADD CONSTRAINT PK_SALDOS_CENTROS_TERCERO_NIIF PRIMARY KEY (CUEN_COD, PROY_COD, CENT_COD, TERC_NIT, SACU_FECHA)
USING DESCENDING INDEX PK_SALDOS_CENTROS_TERCERO_NIIF;

GRANT ALL ON SALDOS_CENTROS_TERCERO_NIIF TO PUBLIC;

CREATE TABLE SALDOS_CUENTAS_NIIF (
    CUEN_COD      VARCHAR(20) NOT NULL,
    SACU_FECHA    CHAR(8) NOT NULL,
    SACU_SALDO    NUMERIC(18,2),
    SACU_DEBITO   NUMERIC(18,2),
    SACU_CREDITO  NUMERIC(18,2)
);

ALTER TABLE SALDOS_CUENTAS_NIIF ADD CONSTRAINT PK_SALDOS_CUENTAS_NIIF PRIMARY KEY (CUEN_COD, SACU_FECHA)
USING DESCENDING INDEX PK_SALDOS_CUENTAS_NIIF;

ALTER TABLE SALDOS_CUENTAS_NIIF ADD CONSTRAINT FK_SALDOCUENTA_CUENTAS_NIIF FOREIGN KEY (CUEN_COD) REFERENCES CUENTAS (CUEN_COD);

CREATE INDEX SALDOS_CUENTAS_NIIF_IDX1 ON SALDOS_CUENTAS_NIIF (SACU_FECHA);

CREATE TABLE SALDOS_TERCEROS_NIIF (
    TERC_NIT      T_NIT NOT NULL /* T_NIT = VARCHAR(20) */,
    CUEN_COD      VARCHAR(20) NOT NULL,
    SACU_FECHA    CHAR(8) NOT NULL,
    SATE_SALDO    NUMERIC(18,2),
    SATE_DEBITO   NUMERIC(18,2),
    SATE_CREDITO  NUMERIC(18,2)
);

ALTER TABLE SALDOS_TERCEROS_NIIF ADD CONSTRAINT PK_SALDOS_TERCEROS_NIIF PRIMARY KEY (CUEN_COD, TERC_NIT, SACU_FECHA)
USING DESCENDING INDEX PK_SALDOS_TERCEROS_NIIF;

CREATE INDEX SALDOS_TERCEROS_NIIF_IDX1 ON SALDOS_TERCEROS_NIIF (TERC_NIT);


CREATE TABLE COMPROBANTE_DETALLE_NIIF (
    ENCO_CONSEC       INTEGER NOT NULL,
    CODE_ITEM         INTEGER NOT NULL,
    CUEN_COD          VARCHAR(20) NOT NULL,
    CODE_CONCEPTO     T_CONCEPTO /* T_CONCEPTO = VARCHAR(60) */,
    CODE_REFER        VARCHAR(8),
    CODE_DEBITO       NUMERIC(18,2),
    CODE_CREDITO      NUMERIC(18,2),
    CODE_BASE         NUMERIC(18,2),
    CODE_PORC         PORC_CONTA /* PORC_CONTA = NUMERIC(9,4) */,
    TERC_NIT          T_NIT /* T_NIT = VARCHAR(20) */,
    PROY_COD          VARCHAR(4),
    CENT_COD          VARCHAR(4),
    DOCO_VENCE        CHAR(8),
    ARTI_COD          T_COD_ARTICULO /* T_COD_ARTICULO = VARCHAR(15) */,
    CODE_TIPOAPL      INTEGER,
    CODE_TIPONUE      INTEGER,
    CONC_COD          VARCHAR(4),
    CNDE_DOCNUMERO    VARCHAR(10),
    CNDE_DOCAPLICA    VARCHAR(10),
    CODE_DESCONTABLE  T_BOOLEANO /* T_BOOLEANO = CHAR(1) check (value in ('S','N')) */
);

ALTER TABLE COMPROBANTE_DETALLE_NIIF ADD CONSTRAINT PK_COMPROBANTE_DETALLE_NIIF PRIMARY KEY (ENCO_CONSEC, CODE_ITEM);

ALTER TABLE COMPROBANTE_DETALLE_NIIF ADD CONSTRAINT FK_COMPROBAD_COMPROBA_NIIF FOREIGN KEY (ENCO_CONSEC) REFERENCES COMPROBANTE_ENCABEZADO (ENCO_CONSEC) ON DELETE CASCADE ON UPDATE CASCADE;
ALTER TABLE COMPROBANTE_DETALLE_NIIF ADD CONSTRAINT FK_COMPROBAD_CUENTAS_NIIF FOREIGN KEY (CUEN_COD) REFERENCES CUENTAS_NIIF (CUEN_COD);

CREATE INDEX COMPROBANTE_DETALLE_NIIF_IDX1 ON COMPROBANTE_DETALLE_NIIF (CUEN_COD, TERC_NIT);
CREATE INDEX COMPROBANTE_DETALLE_NIIF_IDX2 ON COMPROBANTE_DETALLE_NIIF (TERC_NIT);

SET TERM ^ ;

/* Trigger: CUENTAS_AD */
CREATE OR ALTER TRIGGER CUENTAS_NIIF_AD FOR CUENTAS_NIIF
ACTIVE AFTER DELETE POSITION 0
AS
declare variable ITEM INTEGER;
declare variable NIT VARCHAR(20);
declare variable LON INTEGER;
declare variable PROY VARCHAR(4);
declare variable CENTRO VARCHAR(4);
declare variable NIVEL SMALLINT;
declare variable MINNIVEL SMALLINT;
declare variable PADRE VARCHAR(20);
declare variable DEBITO NUMERIC(18,2);
declare variable CREDITO NUMERIC(18,2);
BEGIN
  execute procedure padre(old.cuen_cod) returning_values (:Padre);
  if (PADRE <> '') then
    BEGIN
    LON = STRLEN(:PADRE);
    if (NOT EXISTS (SELECT CUEN_COD FROM CUENTAS_NIIF WHERE SUBSTR(CUEN_COD, 1, :LON) = :PADRE AND CUEN_COD <> :PADRE)) then
      UPDATE CUENTAS_NIIF SET CUEN_AFECTABLE = 'S' WHERE CUEN_COD = :PADRE;
    END
  /* Borre el saldo inicial, si habia paselo al padre */
  select sain_debito, sain_credito from saldos_iniciales_niif where cuen_cod = old.cuen_cod into :debito, :credito;
  if (debito is null) then
    debito = 0;
  if (credito is null) then
    credito = 0;
  if ((DEBITO <> 0) or (CREDITO <> 0)) then
    BEGIN
    if (PADRE <> '') then
        BEGIN
        EXECUTE PROCEDURE VALIDE_ESTRUCTURA(:PADRE) RETURNING_VALUES (:NIVEL);
        EXECUTE PROCEDURE LEE_CONFIGURACION ('CONTABILIDAD', 'ESTRUCTURA', 'MINIMO NIVEL AFECTABLE')     RETURNING_VALUES (:MINNIVEL);
        if (NIVEL >= MINNIVEL) then
            begin
            /* SOLO CUANDO ES LA ULTIMA CUENTA HIJA */
            LON = STRLEN(:PADRE);
            SELECT COUNT(*) FROM CUENTAS_NIIF WHERE SUBSTR(CUEN_COD, 1, :LON) = :PADRE INTO :ITEM;
            IF (:ITEM = 2) THEN
                begin
                if (OLD.CUEN_TIPO = 'N') then
                    BEGIN
                    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 MAX(SAIN_ITEM)+1 FROM SALDOS_INICIALES_NIIF INTO :ITEM;
                    INSERT INTO SALDOS_INICIALES_NIIF(SAIN_ITEM, CUEN_COD, TERC_NIT, PROY_COD, CENT_COD, SAIN_DEBITO, SAIN_CREDITO)
                        VALUES (:ITEM, :PADRE, :NIT, :PROY, :CENTRO, :DEBITO, :CREDITO);
                    END
                end
            END
        END
    END
  DELETE FROM SALDOS_INICIALES_NIIF WHERE CUEN_COD = OLD.CUEN_COD;
  
  /* Borre los saldos por cuenta-tercero y centro */
  DELETE FROM saldos_centros_TERCERO_NIIF where cuen_cod = old.cuen_cod;
  DELETE FROM saldos_centros_NIIF where cuen_cod = old.cuen_cod;
  DELETE FROM saldos_terceros_NIIF where cuen_cod = old.cuen_cod;
  DELETE FROM SALDOS_ARTICULO_NIIF where cuen_cod = old.cuen_cod;
  DELETE FROM saldos_cuentas_NIIF where cuen_cod = old.cuen_cod;
  INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
    VALUES (USER, 1100, 1, 'D', OLD.cuen_cod);
END
^

/* Trigger: CUENTAS_AI */
CREATE OR ALTER TRIGGER CUENTAS_NIIF_AI FOR CUENTAS_NIIF
ACTIVE AFTER INSERT POSITION 0
AS
declare variable NIVEL SMALLINT;
declare variable MINNIVEL SMALLINT;
declare variable PADRE VARCHAR(20);
BEGIN
  /* Verifique que el padre no tenga saldo, cuendo lo tenga borrelo */
  EXECUTE PROCEDURE VALIDE_ESTRUCTURA(NEW.CUEN_COD) RETURNING_VALUES (:NIVEL);
  EXECUTE PROCEDURE LEE_CONFIGURACION ('CONTABILIDAD', 'ESTRUCTURA', 'MINIMO NIVEL AFECTABLE')     RETURNING_VALUES (:MINNIVEL);
  EXECUTE PROCEDURE PADRE(NEW.CUEN_COD) RETURNING_VALUES (:PADRE);
  if (PADRE <> '') then
    BEGIN
    UPDATE CUENTAS_NIIF SET CUEN_AFECTABLE = 'N' WHERE CUEN_COD = :PADRE;
    if (NIVEL > MINNIVEL) then
        BEGIN
        if (NEW.CUEN_TIPO = 'N') then
            BEGIN
            DELETE FROM SALDOS_INICIALES_NIIF WHERE CUEN_COD = :PADRE;
            END
        END
    END
  INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
    VALUES (USER, 1100, 1, 'I', NEW.cuen_cod);
END
^


/* Trigger: CUENTAS_BD */
CREATE OR ALTER TRIGGER CUENTAS_NIIF_BD FOR CUENTAS_NIIF
ACTIVE BEFORE DELETE POSITION 0
AS
DECLARE VARIABLE REGISTROS INT;
DECLARE VARIABLE OK CHAR(1);
DECLARE VARIABLE LON INT;
BEGIN 
  /* VERIFIQUE QUE LA CUENTA EXISTA Y QUE SEA AFECTABLE */
  LON = STRLEN(OLD.CUEN_COD);
  SELECT COUNT(*) FROM CUENTAS_NIIF WHERE SUBSTR(CUEN_COD, 1, :LON) = OLD.CUEN_COD INTO :REGISTROS;
  IF (REGISTROS <> 1) THEN
    BEGIN
    OK = 'N';
    EXCEPTION CUENTA_CON_HIJAS 'La cuenta ' || old.cuen_cod || ' no puede borrarse porque ya tiene subcuentas registradas.';
    END
  IF (OK = 'S') THEN
    BEGIN
    /* Verifique que no existan movimientos de esa cuenta */
    SELECT COUNT(CODE_ITEM) FROM COMPROBANTE_DETALLE_NIIF WHERE CUEN_COD = OLD.CUEN_COD INTO :REGISTROS;
    IF (REGISTROS > 0) THEN
      EXCEPTION CUENTA_CON_MOVIMIENTOS 'La cuenta ' || old.cuen_cod || ' no puede borrarse porque tiene movimientos.';
    SELECT COUNT(SAIN_ITEM) FROM SALDOS_INICIALES_NIIF WHERE CUEN_COD = OLD.CUEN_COD INTO :REGISTROS;
    IF (REGISTROS > 0) THEN
      EXCEPTION CUENTA_CON_SALDO 'La cuenta ' || old.cuen_cod || ' no puede borrarse porque tiene un saldo inicial.';
    END
END
^


/* Trigger: CUENTAS_BI */
CREATE OR ALTER TRIGGER CUENTAS_NIIF_BI FOR CUENTAS_NIIF
ACTIVE BEFORE INSERT POSITION 0
AS
DECLARE VARIABLE OK CHAR(1);
BEGIN
  IF ((NEW.CUEN_COD IS NULL) OR (NEW.CUEN_NOM IS NULL)) THEN
      EXCEPTION CUENTA_SIN_DATOS;
  /* Llena los detalles de cuenta */ 
  IF (NEW.cuen_activa IS NULL) THEN
    NEW.cuen_activa = 'S';
  IF (NEW.cuen_afectable IS NULL) THEN
    NEW.cuen_afectable = 'S';
  IF (NEW.CUEN_TERCERO IS NULL) THEN
    NEW.CUEN_TERCERO = 'N';
  IF (NEW.CUEN_CENTRO IS NULL) THEN
    NEW.CUEN_CENTRO = 'N';
  IF (NEW.CUEN_RETENCION IS NULL) THEN
    NEW.CUEN_RETENCION = 'N';
  NEW.cuen_afectable = 'S';
  /* verifica que exista el padre y que no tenga movimiento */
  EXECUTE PROCEDURE VALIDE_PADRE (NEW.CUEN_COD) RETURNING_VALUES (:OK);

END
^


/* Trigger: CUENTAS_BU */
CREATE OR ALTER TRIGGER CUENTAS_NIIF_BU FOR CUENTAS_NIIF
ACTIVE BEFORE UPDATE POSITION 0
AS
DECLARE VARIABLE REGISTROS SMALLINT;
BEGIN
  /* Verifique que no cambien los detalles de cuenta si ya hay movimientos y que no cambie el cod */
  IF (OLD.CUEN_COD <> NEW.CUEN_COD) THEN
    EXCEPTION CAMBIO_CODIGO_CUENTA;
  ELSE
    BEGIN
    IF ((OLD.CUEN_TERCERO <> NEW.CUEN_TERCERO) OR (OLD.CUEN_CENTRO <> NEW.CUEN_CENTRO) OR (OLD.CUEN_RETENCION <> NEW.CUEN_RETENCION)) THEN
      BEGIN
        SELECT COUNT(CODE_ITEM) FROM COMPROBANTE_DETALLE_NIIF WHERE CUEN_COD = OLD.CUEN_COD INTO :REGISTROS;
        IF (REGISTROS > 0) THEN
          EXCEPTION CUENTA_CON_MOVIMIENTOS 'La cuenta ' || old.cuen_cod || ' no puede modificarse porque tiene movimientos.';
      END
    END
  INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
    VALUES (USER, 1100, 1, 'U', NEW.cuen_cod);
END
^

/* Trigger: SALDOS_INICIALES_AD */
CREATE OR ALTER TRIGGER SALDOS_INICIALES_NIIF_AD FOR SALDOS_INICIALES_NIIF
ACTIVE AFTER DELETE POSITION 0
AS
declare variable CUENTA VARCHAR(20);
DECLARE VARIABLE ANO VARCHAR(4);
DECLARE VARIABLE MES VARCHAR(2);
DECLARE VARIABLE INICIAL VARCHAR(10);
declare variable CUENNIT VARCHAR(40);
BEGIN
/* COMPONGA LA FECHA DE INICIO DE LA COMPAÑIA */
EXECUTE PROCEDURE LEE_CONFIGURACION('CONTABILIDAD', 'GENERAL', 'AÑO DE INICIO') RETURNING_VALUES (ANO);
EXECUTE PROCEDURE LEE_CONFIGURACION('CONTABILIDAD', 'GENERAL', 'MES DE INICIO') RETURNING_VALUES (MES);
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';

/* Actualice los saldos de fechas igual y posteriores */
UPDATE SALDOS_CUENTAS_NIIF
    SET SACU_SALDO = SACU_SALDO - OLD.SAIN_DEBITO + OLD.SAIN_CREDITO
    WHERE (CUEN_COD = OLD.CUEN_COD) AND (SACU_FECHA >= :INICIAL);
UPDATE SALDOS_TERCEROS_NIIF
  SET SATE_SALDO = SATE_SALDO - OLD.SAIN_DEBITO + OLD.SAIN_CREDITO
  WHERE (CUEN_COD = OLD.CUEN_COD) AND (TERC_NIT = OLD.TERC_NIT) AND (SACU_FECHA >= :INICIAL);
UPDATE SALDOS_CENTROS_NIIF
  SET SACE_SALDO = SACE_SALDO - OLD.SAIN_DEBITO + OLD.SAIN_CREDITO
  WHERE (CUEN_COD = OLD.CUEN_COD) AND (PROY_COD = OLD.PROY_COD) AND (CENT_COD = OLD.CENT_COD) AND (SACU_FECHA >= :INICIAL);
UPDATE saldos_centros_tercero_NIIF
  SET SACT_SALDO = SACT_SALDO - OLD.SAIN_DEBITO + OLD.SAIN_CREDITO
  WHERE (CUEN_COD = OLD.CUEN_COD) AND (PROY_COD = OLD.PROY_COD) AND (CENT_COD = OLD.CENT_COD) AND (TERC_NIT = OLD.TERC_NIT) AND (SACU_FECHA >= :INICIAL);
CUENNIT = OLD.cuen_cod || '-' || OLD.terc_nit;
INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD, AUDI_TICO)
    VALUES (USER, 1007, OLD.sain_item, 'U', SUBSTRING(:CUENNIT FROM 1 FOR 20), NULL);
END
^

/* Trigger: SALDOS_INICIALES_AI */
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 DE INICIO') RETURNING_VALUES (ANO);
EXECUTE PROCEDURE LEE_CONFIGURACION('CONTABILIDAD', 'GENERAL', 'MES DE INICIO') RETURNING_VALUES (MES);
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
^

/* Trigger: SALDOS_INICIALES_AU */
CREATE OR ALTER TRIGGER SALDOS_INICIALES_NIIF_AU FOR SALDOS_INICIALES_NIIF
ACTIVE AFTER UPDATE POSITION 0
as
declare variable ANO varchar(4);
declare variable MES varchar(2);
declare variable INICIAL varchar(10);
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 DE INICIO') returning_values (ANO);
execute procedure LEE_CONFIGURACION('CONTABILIDAD', 'GENERAL', 'MES DE INICIO') returning_values (MES);
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';
/* Actualice los saldos de fechas igual o posteriores */
update SALDOS_CUENTAS_NIIF
  set SACU_SALDO = SACU_SALDO - old.SAIN_DEBITO + old.SAIN_CREDITO
where (CUEN_COD = old.CUEN_COD) and (SACU_FECHA >= :INICIAL);
update SALDOS_TERCEROS_NIIF
  set SATE_SALDO = SATE_SALDO - old.SAIN_DEBITO + old.SAIN_CREDITO
  where (CUEN_COD = old.CUEN_COD) and (TERC_NIT = old.TERC_NIT) and (SACU_FECHA >= :INICIAL);
update SALDOS_CENTROS_NIIF
  set SACE_SALDO = SACE_SALDO - old.SAIN_DEBITO + old.SAIN_CREDITO
  where (CUEN_COD = old.CUEN_COD) and (PROY_COD = old.PROY_COD) and (CENT_COD = old.CENT_COD) and (SACU_FECHA >= :INICIAL);
update SALDOS_CENTROS_TERCERO_NIIF
  set SACT_SALDO = SACT_SALDO - old.SAIN_DEBITO + old.SAIN_CREDITO
  where (CUEN_COD = old.CUEN_COD) and (PROY_COD = old.PROY_COD) and (CENT_COD = old.CENT_COD)
  and (TERC_NIT = old.TERC_NIT) and (SACU_FECHA >= :INICIAL);
/* REGISTRE LO NUEVO */
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, PROY_COD, CENT_COD, TERC_NIT, SACU_FECHA, SACT_SALDO, SACT_DEBITO, SACT_CREDITO)
      values (new.CUEN_COD, new.PROY_COD, new.CENT_COD, NEW.terc_nit, :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
/* 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);
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, 'U', SUBSTRING(:CUENNIT FROM 1 FOR 20), NULL);
end
^

/* Trigger: SALDOS_INICIALES_BI */
CREATE OR ALTER TRIGGER SALDOS_INICIALES_NIIF_BI FOR SALDOS_INICIALES_NIIF
ACTIVE BEFORE INSERT POSITION 0
AS
DECLARE VARIABLE OK CHAR(1);
DECLARE VARIABLE TERCERO CHAR(1);
DECLARE VARIABLE RETENCION CHAR(1);
DECLARE VARIABLE CENTRO CHAR(1);
BEGIN
/* VERIFIQUE QUE LA CUENTA EXISTA Y QUE SEA AFECTABLE */
EXECUTE PROCEDURE VALIDE_CUENTA (NEW.CUEN_COD) RETURNING_VALUES (:OK);
IF (OK <> '0') THEN
  BEGIN
  IF (NEW.sain_debito IS NULL) THEN
    NEW.sain_debito = 0;
  IF (NEW.sain_credito IS NULL) THEN
    NEW.sain_credito = 0;
  IF (NEW.TERC_NIT IS NULL) THEN
    EXECUTE PROCEDURE LEE_CONFIGURACION('CONTABILIDAD', 'GENERAL', 'NIT COMPAÑIA') RETURNING_VALUES (NEW.TERC_NIT);
  IF (NEW.PROY_COD IS NULL) THEN
    EXECUTE PROCEDURE LEE_CONFIGURACION('CONTABILIDAD', 'GENERAL', 'PROYECTO UNICO') RETURNING_VALUES (NEW.PROY_COD);
  IF (NEW.CENT_COD IS NULL) THEN
    EXECUTE PROCEDURE LEE_CONFIGURACION('CONTABILIDAD', 'GENERAL', 'CENTRO DE COSTOS UNICO') RETURNING_VALUES (NEW.CENT_COD);
  SELECT CUEN_TERCERO, CUEN_RETENCION, CUEN_CENTRO FROM CUENTAS WHERE CUEN_COD = NEW.CUEN_COD INTO :TERCERO, :RETENCION, :CENTRO;
  /* VERIFIQUE EL TERCERO */
  IF (TERCERO = 'S' OR RETENCION = 'S') THEN
    EXECUTE PROCEDURE EXISTE_TERCERO (NEW.TERC_NIT) RETURNING_VALUES (:OK);
  ELSE
    EXECUTE PROCEDURE LEE_CONFIGURACION('CONTABILIDAD', 'GENERAL', 'NIT COMPAÑIA') RETURNING_VALUES (NEW.TERC_NIT);
  IF (CENTRO = 'S') THEN
    EXECUTE PROCEDURE EXISTE_CENTRO (NEW.PROY_COD, NEW.CENT_COD) RETURNING_VALUES (:OK);
  ELSE
    BEGIN
    EXECUTE PROCEDURE LEE_CONFIGURACION('CONTABILIDAD', 'GENERAL', 'PROYECTO UNICO') RETURNING_VALUES (NEW.PROY_COD);
    EXECUTE PROCEDURE LEE_CONFIGURACION('CONTABILIDAD', 'GENERAL', 'CENTRO DE COSTOS UNICO') RETURNING_VALUES (NEW.CENT_COD);
    END
  IF (OK = 'S') THEN
    BEGIN
    IF (NEW.SAIN_DEBITO IS NULL) THEN
      NEW.SAIN_DEBITO = 0;
    IF (NEW.SAIN_CREDITO IS NULL) THEN
      NEW.SAIN_CREDITO = 0;
    END
  END
END
^

SET TERM ; ^

SET TERM ^ ;

/* Trigger: TI_SALDOS_ARTICULO */
CREATE OR ALTER TRIGGER TI_SALDOS_ARTICULO_NIIF FOR SALDOS_ARTICULO_NIIF
ACTIVE BEFORE INSERT POSITION 0
as
declare variable numrows integer;
begin
    /*  Parent 'ARTICULO' must exist when inserting a child in 'SALDOS_TERCEROS'  */
    if (new.ARTI_COD is not null) then
    begin
       select count(*)
       from   ARTICULO
       where  ARTICULO.ARTI_COD = new.ARTI_COD
       into   :numrows;
       if (numrows = 0) then
       begin
          exception falta_articulo;
       end
    end
    /*  Parent 'SALDOS_CUENTAS' must exist when inserting a child in 'SALDOS_ARTICULO'  */
    if (new.CUEN_COD is not null and
        new.SAAR_FECHA is not null) then
    begin
       select count(*)
       from   SALDOS_CUENTAS_NIIF
       where  SALDOS_CUENTAS_NIIF.CUEN_COD = new.CUEN_COD
        and   SALDOS_CUENTAS_NIIF.SACU_FECHA = new.SAAR_FECHA
       into   :numrows;
       if (numrows = 0) then
       begin
          exception SALDOCTA_NO_EXISTE 'No se encontró el saldo NIIF para la cuenta ' || new.cuen_cod || ' en la fecha ' || NEW.saar_fecha;
       end
    end
END
^

SET TERM ; ^

SET TERM ^ ;

/* Trigger: TI_SALDOS_CENTROS */
CREATE OR ALTER TRIGGER TI_SALDOS_CENTROS_NIIF FOR SALDOS_CENTROS_NIIF
ACTIVE BEFORE INSERT POSITION 0
AS
DECLARE VARIABLE NUMROWS INTEGER;
BEGIN
    /*  PARENT 'SALDOS_CUENTAS' MUST EXIST WHEN INSERTING A CHILD IN 'SALDOS_CENTROS'  */
    IF (NEW.CUEN_COD IS NOT NULL AND
        NEW.SACU_FECHA IS NOT NULL) THEN
    BEGIN
       SELECT COUNT(*)
       FROM   SALDOS_CUENTAS_NIIF
       WHERE  SALDOS_CUENTAS_NIIF.CUEN_COD = NEW.CUEN_COD
        AND   SALDOS_CUENTAS_NIIF.SACU_FECHA = NEW.SACU_FECHA
       INTO   :NUMROWS;
       IF (NUMROWS = 0) THEN
       BEGIN
          exception SALDOCTA_NO_EXISTE 'No se encontró el saldo NIIF para la cuenta ' || new.cuen_cod || ' en la fecha ' || NEW.sacu_fecha;
       END
    END
    /*  PARENT 'CENTROS' MUST EXIST WHEN INSERTING A CHILD IN 'SALDOS_CENTROS'  */
    IF (NEW.PROY_COD IS NOT NULL AND
        NEW.CENT_COD IS NOT NULL) THEN
    BEGIN
       SELECT COUNT(*)
       FROM   CENTROS
       WHERE  CENTROS.PROY_COD = NEW.PROY_COD
        AND   CENTROS.CENT_COD = NEW.CENT_COD
       INTO   :NUMROWS;
       IF (NUMROWS = 0) THEN
       BEGIN
          EXCEPTION CENTRO_NO_EXISTE 'No existe el centro ' || new.proy_cod || '-' || new.cent_cod;
       END
    END
END
^

SET TERM ; ^

SET TERM ^ ;

/* Trigger: TI_SALDOS_CENTROS_TERCERO */
CREATE OR ALTER TRIGGER TI_SALDOS_CENTROS_TERCERO_NIIF FOR SALDOS_CENTROS_TERCERO_NIIF
ACTIVE BEFORE INSERT POSITION 0
AS
DECLARE VARIABLE NUMROWS INTEGER;
BEGIN
    /*  PARENT 'SALDOS_CENTROS' MUST EXIST WHEN INSERTING A CHILD IN 'SALDOS_CENTROS TERCEROS'  */
    IF (NEW.CUEN_COD IS NOT NULL AND
        NEW.SACU_FECHA IS NOT NULL AND
        NEW.PROY_COD IS NOT NULL AND
        NEW.CENT_COD IS NOT NULL) THEN
    BEGIN
       SELECT COUNT(*)
       FROM   SALDOS_CENTROS_NIIF
       WHERE  SALDOS_CENTROS_NIIF.CUEN_COD = NEW.CUEN_COD
        AND   SALDOS_CENTROS_NIIF.SACU_FECHA = NEW.SACU_FECHA
        AND   SALDOS_CENTROS_NIIF.PROY_COD = NEW.PROY_COD
        AND   SALDOS_CENTROS_NIIF.CENT_COD = NEW.CENT_COD
       INTO   :NUMROWS;
       IF (NUMROWS = 0) THEN
       BEGIN
          exception SALDOCTA_NO_EXISTE 'No se encontró el saldo NIIF para la cuenta ' || new.cuen_cod || ' en la fecha ' || NEW.sacu_fecha;
       END
    END
    /*  PARENT 'TERCEROS' MUST EXIST WHEN INSERTING A CHILD IN 'SALDOS_CENTROS TERCERO'  */
    IF (NEW.TERC_NIT IS NOT NULL) THEN
    BEGIN
       SELECT COUNT(*)
       FROM   TERCEROS
       WHERE  TERCEROS.TERC_NIT = NEW.TERC_NIT
       INTO   :NUMROWS;
       IF (NUMROWS = 0) THEN
       BEGIN
          EXCEPTION TERCERO_NO_EXISTE 'El NIT ' || new.terc_nit || ' no existe.';
       END
    END
END
^

SET TERM ; ^


SET TERM ^ ;

/* Trigger: SALDOS_CUENTAS_BD */
CREATE OR ALTER TRIGGER SALDOS_CUENTAS_NIIF_BD FOR SALDOS_CUENTAS_NIIF
ACTIVE BEFORE DELETE POSITION 0
as
declare variable FECBLO CHAR(10);
begin
EXECUTE PROCEDURE LEE_CONFIGURACION ('CONTABILIDAD', 'GENERAL', 'FECHA DE BLOQUEO') RETURNING_VALUES (:FECBLO); 
IF (OLD.sacu_fecha < FECBLO) THEN
    EXCEPTION CONTABILIDAD_BLOQUEADA 'La contabilidad esta bloqueada a ' || :fecblo;
end
^


/* Trigger: SALDOS_CUENTAS_BI */
CREATE OR ALTER TRIGGER SALDOS_CUENTAS_NIIF_BI FOR SALDOS_CUENTAS_NIIF
ACTIVE BEFORE INSERT POSITION 0
as
declare variable FECBLO CHAR(10);
begin
EXECUTE PROCEDURE LEE_CONFIGURACION ('CONTABILIDAD', 'GENERAL', 'FECHA DE BLOQUEO') RETURNING_VALUES (:FECBLO); 
IF (NEW.sacu_fecha < FECBLO) THEN
    EXCEPTION CONTABILIDAD_BLOQUEADA 'La contabilidad esta bloqueada a ' || :fecblo;
end
^


/* Trigger: SALDOS_CUENTAS_BU */
CREATE OR ALTER TRIGGER SALDOS_CUENTAS_NIIF_BU FOR SALDOS_CUENTAS_NIIF
ACTIVE BEFORE UPDATE POSITION 0
as
declare variable FECBLO CHAR(10);
begin
EXECUTE PROCEDURE LEE_CONFIGURACION ('CONTABILIDAD', 'GENERAL', 'FECHA DE BLOQUEO') RETURNING_VALUES (:FECBLO); 
IF (NEW.sacu_fecha < FECBLO) THEN
    EXCEPTION CONTABILIDAD_BLOQUEADA 'La contabilidad esta bloqueada a ' || :fecblo;
end
^


/* Trigger: TI_SALDOS_CUENTAS */
CREATE OR ALTER TRIGGER TI_SALDOS_CUENTAS_NIIF FOR SALDOS_CUENTAS_NIIF
ACTIVE BEFORE INSERT POSITION 0
AS
DECLARE VARIABLE NUMROWS INTEGER;
BEGIN
    /*  PARENT 'CUENTAS' MUST EXIST WHEN INSERTING A CHILD IN 'SALDOS_CUENTAS'  */
    IF (NEW.CUEN_COD IS NOT NULL) THEN
    BEGIN
       SELECT COUNT(*)
       FROM   CUENTAS_NIIF
       WHERE  CUENTAS_NIIF.CUEN_COD = NEW.CUEN_COD
       INTO   :NUMROWS;
       IF (NUMROWS = 0) THEN
       BEGIN
          EXCEPTION CUENTA_NO_EXISTE 'La cuenta ' || new.cuen_cod || ' no existe.';
       END
    END
END
^

SET TERM ; ^

SET TERM ^ ;

/* Trigger: TI_SALDOS_TERCEROS */
CREATE OR ALTER TRIGGER TI_SALDOS_TERCEROS_NIIF FOR SALDOS_TERCEROS_NIIF
ACTIVE BEFORE INSERT POSITION 0
as
declare variable numrows integer;
begin
    /*  Parent 'TERCEROS' must exist when inserting a child in 'SALDOS_TERCEROS'  */
    if (new.TERC_NIT is not null) then
    begin
       select count(*)
       from   TERCEROS
       where  TERCEROS.TERC_NIT = new.TERC_NIT
       into   :numrows;
       if (numrows = 0) then
       begin
          exception TERCERO_NO_EXISTE 'El NIT ' || new.terc_nit || ' no existe.';
       end
    end
    /*  Parent 'SALDOS_CUENTAS' must exist when inserting a child in 'SALDOS_TERCEROS'  */
    if (new.CUEN_COD is not null and
        new.SACU_FECHA is not null) then
    begin
       select count(*)
       from   SALDOS_CUENTAS_NIIF
       where  SALDOS_CUENTAS_NIIF.CUEN_COD = new.CUEN_COD
        and   SALDOS_CUENTAS_NIIF.SACU_FECHA = new.SACU_FECHA
       into   :numrows;
       if (numrows = 0) then
       begin
          exception SALDOCTA_NO_EXISTE 'No se encontró el saldo NIIF para la cuenta ' || new.cuen_cod || ' en la fecha ' || NEW.sacu_fecha;
       end
    end
end
^

SET TERM ; ^

CREATE TABLE SALDOS_ACTIVO_NIIF (
    ACFJ_COD       T_COD_ARTICULO NOT NULL /* T_COD_ARTICULO = VARCHAR(15) */,
    CUEN_COD       T_CTA_CONTABLE NOT NULL /* T_CTA_CONTABLE = VARCHAR(20) */,
    SAAC_SALDO     T_MONTO /* T_MONTO = NUMERIC(18,2) DEFAULT 0 */,
    SAAC_DEBITOS   T_MONTO /* T_MONTO = NUMERIC(18,2) DEFAULT 0 */,
    SAAC_CREDITOS  T_MONTO /* T_MONTO = NUMERIC(18,2) DEFAULT 0 */,
    SAAC_FECHA     CHAR(8) NOT NULL
);

ALTER TABLE SALDOS_ACTIVO_NIIF ADD CONSTRAINT PK_SALDOS_ACTIVO_NIIF PRIMARY KEY (CUEN_COD, ACFJ_COD, SAAC_FECHA)
USING DESCENDING INDEX PK_SALDOS_ACTIVO_NIIF;

SET TERM ^ ;

create or alter procedure SALDO_ACTIVO_NIIF (
    CUENTA varchar(20),
    ACTIVO varchar(15),
    FECHA char(8))
returns (
    SALDO numeric(18,2))
AS
BEGIN
SELECT first 1 SAAC_SALDO+SAAC_DEBITOS-SAAC_CREDITOS FROM saldos_activo_NIIF
    WHERE (CUEN_COD = :CUENTA) AND (ACFJ_COD = :activo) AND (SAAC_FECHA <= :FECHA)
    ORDER BY CUEN_COD DESC, ACFJ_COD DESC, SAAC_FECHA DESC
    INTO :SALDO;
IF (SALDO IS NULL) THEN
  SALDO = 0;
SUSPEND;
END^

SET TERM ; ^

GRANT EXECUTE ON PROCEDURE SALDO_ACTIVO_NIIF TO PUBLIC;

SET TERM ^ ;

create or alter procedure SALDO_ARTICULO_NIIF (
    CUENTA varchar(20),
    ARTICULO varchar(15),
    FECHA char(8))
returns (
    SALDO numeric(18,2))
AS
BEGIN
SELECT FIRST 1 (SAAR_SALDO+SAAR_DEBITOS-SAAR_CREDITOS) FROM SALDOS_ARTICULO_NIIF
    WHERE (CUEN_COD = :CUENTA) AND (ARTI_COD = :ARTICULO) AND (SAAR_FECHA <= :FECHA)
    ORDER BY CUEN_COD DESC, ARTI_COD DESC, SAAR_FECHA DESC
    INTO :SALDO;
IF (SALDO IS NULL) THEN
  SALDO = 0;
SUSPEND;
END^

SET TERM ; ^

GRANT EXECUTE ON PROCEDURE SALDO_ACTIVO_NIIF TO PUBLIC;

SET TERM ^ ;

create or alter procedure SALDO_CENTRO_NIIF (
    CUENTA varchar(20),
    PROY varchar(4),
    CENTRO varchar(4),
    FECHA char(8))
returns (
    SALDO numeric(18,2))
AS
BEGIN
SELECT FIRST 1 (SACE_SALDO + SACE_DEBITO - SACE_CREDITO) FROM SALDOS_CENTROS_NIIF
    WHERE (CUEN_COD = :CUENTA) AND (PROY_COD = :PROY) AND (CENT_COD = :CENTRO) AND (SACU_FECHA <= :FECHA)
    ORDER BY CUEN_COD desc,  PROY_COD DESC, CENT_COD desc,  SACU_FECHA DESC
    INTO :SALDO;
IF (SALDO IS NULL) THEN
  SALDO = 0;
SUSPEND;
END^

SET TERM ; ^

GRANT EXECUTE ON PROCEDURE SALDO_CENTRO_NIIF TO PUBLIC;

SET TERM ^ ;

create or alter procedure SALDO_CENTRO_TERCERO_NIIF (
    CUENTA varchar(20),
    PROY varchar(4),
    CENTRO varchar(4),
    NIT varchar(20),
    FECHA char(8))
returns (
    SALDO numeric(18,2))
AS
BEGIN
SELECT FIRST 1 (SACT_SALDO + SACT_DEBITO - SACT_CREDITO) FROM SALDOS_CENTROS_TERCERO_NIIF
    WHERE (CUEN_COD = :CUENTA) AND (PROY_COD = :PROY) AND (CENT_COD = :CENTRO) AND (TERC_NIT = :NIT) AND (SACU_FECHA <= :FECHA)
    ORDER BY CUEN_COD DESC, PROY_COD DESC, CENT_COD DESC, TERC_NIT DESC, SACU_FECHA DESC
    INTO :SALDO;
IF (SALDO IS NULL) THEN
  SALDO = 0;
SUSPEND;
END^

SET TERM ; ^

GRANT EXECUTE ON PROCEDURE SALDO_CENTRO_TERCERO_NIIF TO PUBLIC;

SET TERM ^ ;

create or alter procedure SALDO_CUENTA_NIIF (
    CUENTA varchar(20),
    FECHA char(8))
returns (
    SALDO numeric(18,2))
AS
DECLARE VARIABLE AUX VARCHAR(20);
DECLARE VARIABLE SALDOAUX numeric(18,2);
DECLARE VARIABLE mov numeric(18,2);
declare variable FEC CHAR(8);
declare variable CTAFIN VARCHAR(20);
BEGIN
SALDO = 0;
CTAFIN = CUENTA || '999999';
FOR SELECT cuen_cod FROM CUENTAS_NIIF WHERE cuen_cod >= :CUENTA AND CUEN_COD <= :CTAFIN and CUEN_AFECTABLE = 'S'
    INTO :AUX
    DO
    BEGIN
    SALDOAUX = 0;
    MOV = 0;
    FEC = NULL;
    SELECT first 1 SACU_FECHA, sacu_saldo, SACU_DEBITO - SACU_CREDITO FROM SALDOS_CUENTAS_NIIF
        WHERE (CUEN_COD = :aux) AND (SACU_FECHA <= :FECHA) order by cuen_cod desc, sacu_fecha desc
    INTO :FEC, :saldoaux, :mov;
    IF (FEC IS NULL) THEN
        SALDOAUX = 0;
    ELSE
      if (FEC <> FECHA) then
          saldoaux = saldoaux + mov;
    if (saldoaux IS NULL) then
        SALDOAUX = 0;
    SALDO = SALDO + saldoaux;
    END
SUSPEND;
END^

SET TERM ; ^

GRANT EXECUTE ON PROCEDURE SALDO_CUENTA_NIIF TO PUBLIC;

SET TERM ^ ;

create or alter procedure SALDO_TERCERO_NIIF (
    CUENTA varchar(20),
    NIT varchar(20),
    FECHA char(8))
returns (
    SALDO numeric(18,2))
AS
BEGIN
SELECT FIRST 1 (SATE_SALDO+SATE_DEBITO-SATE_CREDITO) FROM SALDOS_TERCEROS_NIIF
    WHERE (CUEN_COD = :CUENTA) AND (TERC_NIT = :NIT) AND (SACU_FECHA <= :FECHA)
    ORDER BY CUEN_COD DESC, TERC_NIT DESC, SACU_FECHA DESC
    INTO :SALDO;
IF (SALDO IS NULL) THEN
  SALDO = 0;
SUSPEND;
END^

SET TERM ; ^

GRANT EXECUTE ON PROCEDURE SALDO_TERCERO_NIIF TO PUBLIC;

SET TERM ^ ;

create or alter procedure ACTUALICE_SALDO_ACTIVO_NIIF (
    CUENTA varchar(20),
    ACTIVO varchar(15),
    FECHA char(8),
    DEBITO numeric(18,2),
    CREDITO numeric(18,2))
AS
DECLARE VARIABLE EXISTE CHAR(1);
DECLARE VARIABLE SALDOA NUMERIC(18,2);
BEGIN
  EXISTE = 'N';
  IF (:ACTIVO <> '') THEN
    BEGIN
    /* Busque en saldos_Articulo la cuenta-Articulo y la fecha, si la encuentra actualice db y cr, si no inserte un registro */
    SELECT 'S' FROM saldos_activo_NIIF
        WHERE (CUEN_COD = :CUENTA) AND (ACFJ_COD = :ACTIVO) AND (SAAC_FECHA = :FECHA) INTO :EXISTE;
    IF (EXISTE = 'N') THEN
      BEGIN
      /*  traiga el saldo anterior y registre uno nuevo */
      EXECUTE PROCEDURE saldo_activo_NIIF(:CUENTA, :activo, :FECHA) RETURNING_VALUES :SALDOA;
      INSERT INTO saldos_activo_NIIF(CUEN_COD, ACFJ_COD, SAAC_FECHA, SAAC_SALDO, SAAC_DEBITOS, SAAC_CREDITOS)
        VALUES (:CUENTA, :activo, :FECHA, :SALDOA, :DEBITO, :CREDITO);
      END
    ELSE
        BEGIN
        UPDATE saldos_activo_NIIF
          SET SAAC_DEBITOS = SAAC_DEBITOS + :DEBITO,
             SAAC_CREDITOS = SAAC_CREDITOS + :CREDITO
          WHERE (CUEN_COD = :CUENTA) AND (ACFJ_COD = :activo) AND (SAAC_FECHA = :FECHA);
        END
    /* Actualice los saldos de fechas posteriores */
      UPDATE saldos_activo_NIIF
        SET SAAC_SALDO = SAAC_SALDO + :DEBITO - :CREDITO
        WHERE (CUEN_COD = :CUENTA) AND (ACFJ_COD = :activo) AND (SAAC_FECHA > :FECHA);
    END
END^

SET TERM ; ^

GRANT EXECUTE ON PROCEDURE actualice_saldo_activo_niif TO PUBLIC;

SET TERM ^ ;

create or alter procedure ACTUALICE_SALDO_ARTICULO_NIIF (
    CUENTA varchar(20),
    ARTICULO varchar(15),
    FECHA char(8),
    DEBITO numeric(18,2),
    CREDITO numeric(18,2))
AS
DECLARE VARIABLE EXISTE CHAR(1);
DECLARE VARIABLE SALDOA NUMERIC(18,2);
BEGIN
  EXISTE = 'N';
  IF (:ARTICULO <> '') THEN
    BEGIN
    /* Busque en saldos_Articulo la cuenta-Articulo y la fecha, si la encuentra actualice db y cr, si no inserte un registro */
    SELECT 'S' FROM SALDOS_ARTICULO_NIIF
        WHERE (CUEN_COD = :CUENTA) AND (ARTI_COD = :ARTICULO) AND (SAAR_FECHA = :FECHA) INTO :EXISTE;
    IF (EXISTE = 'N') THEN
      BEGIN
        /*  traiga el saldo anterior y registre uno nuevo */
        EXECUTE PROCEDURE SALDO_ARTICULO_NIIF(:CUENTA, :ARTICULO, :FECHA) RETURNING_VALUES :SALDOA;
      INSERT INTO SALDOS_ARTICULO_NIIF(CUEN_COD, ARTI_COD, SAAR_FECHA, SAAR_SALDO, SAAR_DEBITOS, SAAR_CREDITOS)
        VALUES (:CUENTA, :ARTICULO, :FECHA, :SALDOA, :DEBITO, :CREDITO);
      END
    ELSE
        BEGIN
        UPDATE SALDOS_ARTICULO_NIIF
          SET SAAR_DEBITOS = SAAR_DEBITOS + :DEBITO,
             SAAR_CREDITOS = SAAR_CREDITOS + :CREDITO
          WHERE (CUEN_COD = :CUENTA) AND (ARTI_COD = :ARTICULO) AND (SAAR_FECHA = :FECHA);
        END
    /* Actualice los saldos de fechas posteriores */
      UPDATE SALDOS_ARTICULO_NIIF
        SET SAAR_SALDO = SAAR_SALDO + :DEBITO - :CREDITO
        WHERE (CUEN_COD = :CUENTA) AND (ARTI_COD = :ARTICULO) AND (SAAR_FECHA > :FECHA);
    END
END^

SET TERM ; ^

GRANT EXECUTE ON PROCEDURE actualice_saldo_articulo_niif TO PUBLIC;

SET TERM ^ ;

create or alter procedure ACTUALICE_SALDO_CENTRO_NIIF (
    CUENTA varchar(20),
    PROY varchar(4),
    CENTRO varchar(4),
    FECHA char(8),
    DEBITO numeric(18,2),
    CREDITO numeric(18,2))
AS
DECLARE VARIABLE EXISTE CHAR(1);
DECLARE VARIABLE SALDOA NUMERIC(18,2);
BEGIN
  EXISTE = 'N';
  IF (:CENTRO <> '') THEN
    BEGIN
    /* Busque en saldos_centros la cuenta-centro y la fecha, si la encuentra actualice db y cr, si no inserte un registro */
    SELECT 'S' FROM SALDOS_CENTROS_NIIF
        WHERE (CUEN_COD = :CUENTA) AND (PROY_COD = :PROY) AND (CENT_COD = :CENTRO) AND (SACU_FECHA = :FECHA) INTO :EXISTE;
    IF (EXISTE = 'N') THEN
      BEGIN
        /*  traiga el saldo anterior y registre uno nuevo */
        EXECUTE PROCEDURE SALDO_CENTRO_NIIF(:CUENTA, :PROY, :CENTRO, :FECHA) RETURNING_VALUES :SALDOA;
      INSERT INTO SALDOS_CENTROS_NIIF(CUEN_COD, PROY_COD, CENT_COD, SACU_FECHA, SACE_SALDO, SACE_DEBITO, SACE_CREDITO)
        VALUES (:CUENTA, :PROY, :CENTRO, :FECHA, :SALDOA, :DEBITO, :CREDITO);
      END
    ELSE
      BEGIN
        UPDATE SALDOS_CENTROS_NIIF
          SET SACE_DEBITO = SACE_DEBITO + :DEBITO,
            SACE_CREDITO = SACE_CREDITO + :CREDITO
          WHERE (CUEN_COD = :CUENTA) AND (PROY_COD = :PROY) AND (CENT_COD = :CENTRO) AND (SACU_FECHA = :FECHA);
      END
    /* Actualice los saldos de fechas posteriores */
      UPDATE SALDOS_CENTROS_NIIF
        SET SACE_SALDO = SACE_SALDO + :DEBITO - :CREDITO
        WHERE (CUEN_COD = :CUENTA) AND (PROY_COD = :PROY) AND (CENT_COD = :CENTRO) AND (SACU_FECHA > :FECHA);
    END
END^

SET TERM ; ^

GRANT EXECUTE ON PROCEDURE actualice_saldo_centro_niif TO PUBLIC;

SET TERM ^ ;

create or alter procedure ACTUALICE_SALDO_CENT_TERC_NIIF (
    CUENTA varchar(20),
    PROY varchar(4),
    CENTRO varchar(4),
    NIT varchar(20),
    FECHA char(8),
    DEBITO numeric(18,2),
    CREDITO numeric(18,2))
AS
DECLARE VARIABLE EXISTE CHAR(1);
DECLARE VARIABLE SALDOA NUMERIC(18,2);
BEGIN
  EXISTE = 'N';
  IF (:CENTRO <> '') THEN
    BEGIN
    /* Busque en saldos_centros la cuenta-centro-TERCERO y la fecha, si la encuentra actualice db y cr, si no inserte un registro */
    SELECT 'S' FROM SALDOS_CENTROS_TERCERO_NIIF
        WHERE (CUEN_COD = :CUENTA) AND (PROY_COD = :PROY) AND (CENT_COD = :CENTRO) AND (TERC_NIT = :NIT) AND (SACU_FECHA = :FECHA) INTO :EXISTE;
    IF (EXISTE = 'N') THEN
      BEGIN
        /*  traiga el saldo anterior y registre uno nuevo */
        EXECUTE PROCEDURE SALDO_CENTRO_TERCERO_NIIF(:CUENTA, :PROY, :CENTRO, :NIT, :FECHA) RETURNING_VALUES :SALDOA;
      INSERT INTO SALDOS_CENTROS_TERCERO_NIIF(CUEN_COD, PROY_COD, CENT_COD, TERC_NIT, SACU_FECHA, SACT_SALDO, SACT_DEBITO, SACT_CREDITO)
        VALUES (:CUENTA, :PROY, :CENTRO, :NIT, :FECHA, :SALDOA, :DEBITO, :CREDITO);
      END
    ELSE
      BEGIN
        UPDATE SALDOS_CENTROS_TERCERO_NIIF
          SET SACT_DEBITO = SACT_DEBITO + :DEBITO,
            SACT_CREDITO = SACT_CREDITO + :CREDITO
          WHERE (CUEN_COD = :CUENTA) AND (PROY_COD = :PROY) AND (CENT_COD = :CENTRO) AND (TERC_NIT = :NIT) AND (SACU_FECHA = :FECHA);
      END
    /* Actualice los saldos de fechas posteriores */
      UPDATE SALDOS_CENTROS_TERCERO_NIIF
        SET SACT_SALDO = SACT_SALDO + :DEBITO - :CREDITO
        WHERE (CUEN_COD = :CUENTA) AND (PROY_COD = :PROY) AND (CENT_COD = :CENTRO) AND (TERC_NIT = :NIT) AND (SACU_FECHA > :FECHA);
    END
END^

SET TERM ; ^

GRANT EXECUTE ON PROCEDURE actualice_saldo_cent_terc_niif TO PUBLIC;

SET TERM ^ ;

create or alter procedure ACTUALICE_SALDO_CUENTA_NIIF (
    CUENTA varchar(20),
    FECHA char(8),
    DEBITO numeric(18,2),
    CREDITO numeric(18,2))
AS
     declare variable SALDOA NUMERIC(18,2);
begin
if (DEBITO is null) then
    DEBITO = 0;
IF (CREDITO IS NULL) THEN
    CREDITO = 0;
   
/* Busque en saldos_cuentas la cuenta y la fecha, si la encuentra actualice db y cr, si no inserte un registro */
IF (EXISTS (SELECT * FROM SALDOS_CUENTAS_NIIF WHERE (CUEN_COD = :CUENTA) AND (SACU_FECHA = :FECHA))) THEN
    BEGIN
    UPDATE SALDOS_CUENTAS_NIIF
        SET SACU_DEBITO = SACU_DEBITO + :DEBITO,
            SACU_CREDITO = SACU_CREDITO + :CREDITO
    WHERE (CUEN_COD = :CUENTA) AND (SACU_FECHA = :FECHA);
    END
ELSE
    BEGIN
    /*  traiga el saldo anterior y registre uno nuevo */
    EXECUTE PROCEDURE SALDO_CUENTA_NIIF(:CUENTA, :FECHA) RETURNING_VALUES :SALDOA;
    INSERT INTO SALDOS_CUENTAS_NIIF(CUEN_COD, SACU_FECHA, SACU_SALDO, SACU_DEBITO, SACU_CREDITO)
        VALUES (:CUENTA, :FECHA, :SALDOA, :DEBITO, :CREDITO);
    END

/* Actualice los saldos de fechas posteriores */
UPDATE SALDOS_CUENTAS_NIIF
    SET SACU_SALDO = SACU_SALDO + :DEBITO - :CREDITO
    WHERE (CUEN_COD = :CUENTA) AND (SACU_FECHA > :FECHA);
end^

SET TERM ; ^

GRANT EXECUTE ON PROCEDURE actualice_saldo_cuenta_niif TO PUBLIC;

SET TERM ^ ;

create or alter procedure ACTUALICE_SALDO_TERCERO_NIIF (
    CUENTA varchar(20),
    NIT varchar(20),
    FECHA char(8),
    DEBITO numeric(18,2),
    CREDITO numeric(18,2))
AS
DECLARE VARIABLE EXISTE CHAR(1);
DECLARE VARIABLE SALDOA NUMERIC(18,2);
BEGIN
  EXISTE = 'N';
  IF (:NIT <> '') THEN
    BEGIN
    /* Busque en saldos_terceros la cuenta-NIT y la fecha, si la encuentra actualice db y cr, si no inserte un registro */
    SELECT 'S' FROM SALDOS_TERCEROS_NIIF
        WHERE (CUEN_COD = :CUENTA) AND (TERC_NIT = :NIT) AND (SACU_FECHA = :FECHA) INTO :EXISTE;
    IF (EXISTE = 'N') THEN
      BEGIN
      /*  traiga el saldo anterior y registre uno nuevo */
      EXECUTE PROCEDURE SALDO_TERCERO_NIIF(:CUENTA, :NIT, :FECHA) RETURNING_VALUES :SALDOA;
      INSERT INTO SALDOS_TERCEROS_NIIF(CUEN_COD, TERC_NIT, SACU_FECHA, SATE_SALDO, SATE_DEBITO, SATE_CREDITO)
        VALUES (:CUENTA, :NIT, :FECHA, :SALDOA, :DEBITO, :CREDITO);
      END
    ELSE
        BEGIN
        UPDATE SALDOS_TERCEROS_NIIF
          SET SATE_DEBITO = SATE_DEBITO + :DEBITO,
             SATE_CREDITO = SATE_CREDITO + :CREDITO
          WHERE (CUEN_COD = :CUENTA) AND (TERC_NIT = :NIT) AND (SACU_FECHA = :FECHA);
        END
    /* Actualice los saldos de fechas posteriores */
      UPDATE SALDOS_TERCEROS_NIIF
        SET SATE_SALDO = SATE_SALDO + :DEBITO - :CREDITO
        WHERE (CUEN_COD = :CUENTA) AND (TERC_NIT = :NIT) AND (SACU_FECHA > :FECHA);
    END
END^

SET TERM ; ^

GRANT EXECUTE ON PROCEDURE actualice_saldo_tercero_niif TO PUBLIC;

SET TERM ^ ;

create or alter procedure EXISTE_CUENTA_NIIF (
    CUENTA varchar(20))
returns (
    OK char(1))
AS
BEGIN
  OK = 'N';
  SELECT 'S' FROM CUENTAS_NIIF WHERE CUEN_COD = :CUENTA INTO :OK;
  SUSPEND;
END^

SET TERM ; ^

GRANT EXECUTE ON PROCEDURE existe_cuenta_niif TO PUBLIC;

SET TERM ^ ;

create or alter procedure CUENTA_AFECTABLE_NIIF (
    CUENTA varchar(20))
returns (
    OK char(1))
AS
DECLARE VARIABLE LON SMALLINT;
declare variable NIVEL SMALLINT;
BEGIN
  /* Verifica que una cuenta no tenga hijas */
  EXECUTE PROCEDURE VALIDE_NIVEL (CUENTA) RETURNING_VALUES (:NIVEL);
  IF (NIVEL > 0) THEN
    BEGIN
    OK = 'S';
    LON = STRLEN(CUENTA);
    if (exists(SELECT cuen_cod FROM CUENTAS_NIIF WHERE substring(cuen_cod from 1 for :LON) = :CUENTA AND CUEN_COD <> :CUENTA)) then
       BEGIN
       OK = 'N';
       EXCEPTION CUENTA_CON_HIJAS 'La cuenta NIIF ' || :cuenta || ' no puede afectarse porque ya tiene subcuentas registradas.';
       END
    END
  SUSPEND;
END^

SET TERM ; ^

GRANT EXECUTE ON PROCEDURE cuenta_afectable_niif TO PUBLIC;

SET TERM ^ ;

create or alter procedure VALIDE_CUENTA_NIIF (
    CUENTA varchar(20))
returns (
    OK char(1))
AS
BEGIN
  /* Verifica que la cuenta exista y sea afectable */
  EXECUTE PROCEDURE EXISTE_CUENTA_NIIF(CUENTA) RETURNING_VALUES (:OK);
  IF (OK = 'N') THEN
      EXCEPTION CUENTA_NO_EXISTE 'La cuenta NIIF ' || :cuenta || ' no existe.';
  ELSE
    BEGIN
    EXECUTE PROCEDURE cuenta_afectable_niif (CUENTA) RETURNING_VALUES (:OK);
    if (OK = 'S') then
        BEGIN
        SELECT CUEN_ACTIVA FROM CUENTAS_NIIF WHERE CUEN_COD = :CUENTA INTO :OK;
        if (OK = 'N') then
          EXCEPTION CUENTA_NO_EXISTE 'La cuenta NIIF ' || :cuenta || ' está inactiva.';
        END
    END
  SUSPEND;
END^

SET TERM ; ^

GRANT EXECUTE ON PROCEDURE valide_cuenta_niif TO PUBLIC;


SET TERM ^ ;

/* Trigger: COMPROBANTE_DETALLE_AD */
CREATE OR ALTER TRIGGER COMPROBANTE_DETALLE_NIIF_AD FOR COMPROBANTE_DETALLE_NIIF
ACTIVE AFTER DELETE POSITION 0
AS
DECLARE VARIABLE FECHA CHAR(8);
DECLARE VARIABLE DIF_DB NUMERIC(15,2);
DECLARE VARIABLE DIF_CR NUMERIC(15,2);
declare variable TIPO CHAR(1);
BEGIN
/* DESHAGA LO VIEJO */
SELECT ENCO_FECHA FROM COMPROBANTE_ENCABEZADO WHERE ENCO_CONSEC = OLD.ENCO_CONSEC INTO :FECHA;
DIF_DB = - OLD.CODE_DEBITO;
DIF_CR = - OLD.CODE_CREDITO;
EXECUTE PROCEDURE actualice_saldo_cent_terc_niif(OLD.CUEN_COD, OLD.PROY_COD, OLD.CENT_COD, OLD.TERC_NIT, FECHA, DIF_DB, DIF_CR);
EXECUTE PROCEDURE ACTUALICE_SALDO_CENTRO_NIIF(OLD.CUEN_COD, OLD.PROY_COD, OLD.CENT_COD, FECHA, DIF_DB, DIF_CR);
EXECUTE PROCEDURE ACTUALICE_SALDO_TERCERO_NIIF(OLD.CUEN_COD, OLD.TERC_NIT, FECHA, DIF_DB, DIF_CR);
EXECUTE PROCEDURE ACTUALICE_SALDO_CUENTA_NIIF(OLD.CUEN_COD, FECHA, DIF_DB, DIF_CR);
if (OLD.ARTI_COD IS NOT NULL) then
  BEGIN
  SELECT CUEN_TIPO FROM CUENTAS_NIIF WHERE CUEN_COD = OLD.CUEN_COD INTO :TIPO;
  if (TIPO = 'I') then
    EXECUTE PROCEDURE ACTUALICE_SALDO_ARTICULO_NIIF(OLD.CUEN_COD, OLD.ARTI_COD, FECHA, DIF_DB, DIF_CR);
  ELSE
    EXECUTE PROCEDURE actualice_saldo_activo_NIIF(OLD.CUEN_COD, OLD.ARTI_COD, FECHA, DIF_DB, DIF_CR);
  END
END
^


/* Trigger: COMPROBANTE_DETALLE_AI */
CREATE OR ALTER TRIGGER COMPROBANTE_DETALLE_NIIF_AI FOR COMPROBANTE_DETALLE_NIIF
ACTIVE AFTER INSERT POSITION 0
AS
DECLARE VARIABLE FECHA CHAR(8);
declare variable TIPO CHAR(1);
BEGIN
SELECT ENCO_FECHA FROM COMPROBANTE_ENCABEZADO WHERE ENCO_CONSEC = NEW.ENCO_CONSEC INTO :FECHA;
/* ACTUALICE LOS SALDOS */
EXECUTE PROCEDURE ACTUALICE_SALDO_CUENTA_NIIF(NEW.CUEN_COD, FECHA, NEW.CODE_DEBITO, NEW.CODE_CREDITO);
EXECUTE PROCEDURE ACTUALICE_SALDO_TERCERO_NIIF(NEW.CUEN_COD, NEW.TERC_NIT, FECHA, NEW.CODE_DEBITO, NEW.CODE_CREDITO);
if (NEW.ARTI_COD IS NOT NULL) then
  BEGIN
  SELECT CUEN_TIPO FROM CUENTAS_NIIF WHERE CUEN_COD = NEW.CUEN_COD INTO :TIPO;
  if (TIPO = 'I') then
    EXECUTE PROCEDURE ACTUALICE_SALDO_ARTICULO_NIIF(NEW.CUEN_COD, NEW.ARTI_COD, FECHA, NEW.CODE_DEBITO, NEW.CODE_CREDITO);
  else
    if (TIPO = 'A') then
      EXECUTE PROCEDURE actualice_saldo_activo_NIIF(NEW.CUEN_COD, NEW.ARTI_COD, FECHA, NEW.CODE_DEBITO, NEW.CODE_CREDITO);
  END
EXECUTE PROCEDURE ACTUALICE_SALDO_CENTRO_NIIF(NEW.CUEN_COD, NEW.PROY_COD, NEW.CENT_COD, FECHA, NEW.CODE_DEBITO, NEW.CODE_CREDITO);
EXECUTE PROCEDURE actualice_saldo_cent_terc_niif(NEW.CUEN_COD, NEW.PROY_COD, NEW.CENT_COD, NEW.TERC_NIT, FECHA, NEW.CODE_DEBITO, NEW.CODE_CREDITO);
END
^

/* Trigger: COMPROBANTE_DETALLE_AU */
CREATE OR ALTER TRIGGER COMPROBANTE_DETALLE_NIIF_AU FOR COMPROBANTE_DETALLE_NIIF
ACTIVE AFTER UPDATE POSITION 0
AS
DECLARE VARIABLE FECHA CHAR(8);
DECLARE VARIABLE DIF_DB NUMERIC(15,2);
DECLARE VARIABLE DIF_CR NUMERIC(15,2);
declare variable TIPO CHAR(1);
declare variable NUMERO VARCHAR(12);
declare variable TICO VARCHAR(3);
begin
if ((NEW.cuen_cod <> OLD.cuen_cod) or (NEW.code_debito <> OLD.code_debito) or (NEW.code_credito <> OLD.code_credito) or
    (NEW.terc_nit <> OLD.terc_nit) or (NEW.proy_cod <> OLD.proy_cod) or (NEW.cent_cod <> OLD.cent_cod) or (NEW.code_concepto <> OLD.code_concepto)) then
    BEGIN
    SELECT PRCO_PREF || ENCO_NUMERO, TICO_COD FROM comprobante_encabezado WHERE ENCO_CONSEC = NEW.enco_consec INTO :NUMERO, :TICO;
    INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD, AUDI_TICO)
        VALUES (USER, 1, NEW.enco_consec, 'U', :numero, :tico);
    END
/* DESHAGA LO VIEJO */
SELECT ENCO_FECHA FROM COMPROBANTE_ENCABEZADO WHERE ENCO_CONSEC = NEW.ENCO_CONSEC INTO :FECHA;
DIF_DB = - OLD.CODE_DEBITO;
DIF_CR = - OLD.CODE_CREDITO;
EXECUTE PROCEDURE actualice_saldo_cent_terc_niif(OLD.CUEN_COD, OLD.PROY_COD, OLD.CENT_COD, OLD.TERC_NIT, FECHA, DIF_DB, DIF_CR);
EXECUTE PROCEDURE ACTUALICE_SALDO_CENTRO_NIIF(OLD.CUEN_COD, OLD.PROY_COD, OLD.CENT_COD, FECHA, DIF_DB, DIF_CR);
EXECUTE PROCEDURE ACTUALICE_SALDO_TERCERO_NIIF(OLD.CUEN_COD, OLD.TERC_NIT, FECHA, DIF_DB, DIF_CR);
EXECUTE PROCEDURE ACTUALICE_SALDO_CUENTA_NIIF(OLD.CUEN_COD, FECHA, DIF_DB, DIF_CR);
if (OLD.ARTI_COD IS NOT NULL) then
  BEGIN
  SELECT CUEN_TIPO FROM CUENTAS_NIIF WHERE CUEN_COD = NEW.CUEN_COD INTO :TIPO;
  if (TIPO = 'I') then
    EXECUTE PROCEDURE ACTUALICE_SALDO_ARTICULO_NIIF(OLD.CUEN_COD, OLD.ARTI_COD, FECHA, DIF_DB, DIF_CR);
  ELSE
    EXECUTE PROCEDURE actualice_saldo_activo_NIIF(OLD.CUEN_COD, OLD.ARTI_COD, FECHA, DIF_DB, DIF_CR);
  END
/* GRABE LOS NUEVOS */
EXECUTE PROCEDURE ACTUALICE_SALDO_CUENTA_NIIF(NEW.CUEN_COD, FECHA, NEW.CODE_DEBITO, NEW.CODE_CREDITO);
EXECUTE PROCEDURE ACTUALICE_SALDO_TERCERO_NIIF(NEW.CUEN_COD, NEW.TERC_NIT, FECHA, NEW.CODE_DEBITO, NEW.CODE_CREDITO);
EXECUTE PROCEDURE ACTUALICE_SALDO_CENTRO_NIIF(NEW.CUEN_COD, NEW.PROY_COD, NEW.CENT_COD, FECHA, NEW.CODE_DEBITO, NEW.CODE_CREDITO);
EXECUTE PROCEDURE actualice_saldo_cent_terc_niif(NEW.CUEN_COD, NEW.PROY_COD, NEW.CENT_COD, NEW.TERC_NIT, FECHA, NEW.CODE_DEBITO, NEW.CODE_CREDITO);
if (NEW.ARTI_COD IS NOT NULL) then
  BEGIN
  SELECT CUEN_TIPO FROM CUENTAS_NIIF WHERE CUEN_COD = NEW.CUEN_COD INTO :TIPO;
  if (TIPO = 'I') then
    EXECUTE PROCEDURE ACTUALICE_SALDO_ARTICULO_NIIF(NEW.CUEN_COD, NEW.ARTI_COD, FECHA, NEW.code_debito, NEW.code_credito);
  ELSE
    EXECUTE PROCEDURE actualice_saldo_activo_NIIF(NEW.CUEN_COD, NEW.ARTI_COD, FECHA, NEW.code_debito, NEW.code_credito);
  END
END
^


/* Trigger: COMPROBANTE_DETALLE_BI */
CREATE OR ALTER TRIGGER COMPROBANTE_DETALLE_NIIF_BI FOR COMPROBANTE_DETALLE_NIIF
ACTIVE BEFORE INSERT POSITION 1
AS
DECLARE VARIABLE OK CHAR(1);
DECLARE VARIABLE TERCERO CHAR(1);
DECLARE VARIABLE RETENCION CHAR(1);
DECLARE VARIABLE CENTRO CHAR(1);
declare variable TIPO CHAR(1);
declare variable TICO VARCHAR(3);
declare variable NUMCOMP VARCHAR(12);
BEGIN
SELECT TICO_COD, PRCO_PREF || ENCO_NUMERO FROM COMPROBANTE_ENCABEZADO WHERE ENCO_CONSEC = NEW.enco_consec INTO :TICO, :numcomp;
/* VERIFIQUE QUE LA CUENTA EXISTA Y QUE SEA AFECTABLE */
EXECUTE PROCEDURE VALIDE_CUENTA_NIIF (NEW.CUEN_COD) RETURNING_VALUES (:OK);
IF (OK = 'S') THEN
  BEGIN
  IF (NEW.CODE_DEBITO IS NULL) THEN
    NEW.CODE_DEBITO = 0;
  IF (NEW.CODE_CREDITO IS NULL) THEN
    NEW.CODE_CREDITO = 0;
  if (NEW.code_base IS NULL) then
    NEW.CODE_BASE = 0;
  if (NEW.code_porc IS NULL) then
    NEW.CODE_PORC = 0;
  if (NEW.code_descontable IS NULL) then
    NEW.code_descontable = 'S';
  if ((NEW.code_base <> 0) AND (NEW.CODE_PORC = 0) AND ((NEW.code_debito <> 0) or (NEW.code_credito <> 0))) then
    NEW.code_porc = (NEW.code_debito - NEW.code_credito) * 100 / NEW.code_base;
  IF ((NEW.TERC_NIT IS NULL) or (new.terc_nit = '')) THEN
    EXECUTE PROCEDURE LEE_CONFIGURACION('CONTABILIDAD', 'GENERAL', 'NIT COMPAÑIA') RETURNING_VALUES (NEW.TERC_NIT);
  IF ((NEW.PROY_COD IS NULL) or (new.proy_cod = '')) THEN
    EXECUTE PROCEDURE LEE_CONFIGURACION('CONTABILIDAD', 'GENERAL', 'PROYECTO UNICO') RETURNING_VALUES (NEW.PROY_COD);
  IF ((NEW.CENT_COD IS NULL) or (new.cent_cod = '')) THEN
    EXECUTE PROCEDURE LEE_CONFIGURACION('CONTABILIDAD', 'GENERAL', 'CENTRO DE COSTOS UNICO') RETURNING_VALUES (NEW.CENT_COD);
  SELECT CUEN_TERCERO, CUEN_RETENCION, CUEN_CENTRO, CUEN_TIPO FROM CUENTAS WHERE CUEN_COD = NEW.CUEN_COD INTO :TERCERO, :RETENCION, :CENTRO, :TIPO;
  /* VERIFIQUE QUE LA CUENTA PERMITA RETENCION Y VERIFIQUE EL TERCERO */
  IF (TERCERO = 'S' OR RETENCION = 'S') THEN
    EXECUTE PROCEDURE EXISTE_TERCERO (NEW.TERC_NIT) RETURNING_VALUES (:OK);
  ELSE
    EXECUTE PROCEDURE LEE_CONFIGURACION('CONTABILIDAD', 'GENERAL', 'NIT COMPAÑIA') RETURNING_VALUES (NEW.TERC_NIT);
  IF (OK = 'S') THEN
    BEGIN
    /* SI LA CUENTA ES DE RETENCION ASEGURECE QUE TENGA BASE Y PORCENTAJE */
    IF (RETENCION = 'S') THEN
      BEGIN
      IF ((NEW.CODE_BASE = 0) OR (NEW.CODE_PORC = 0)) THEN
        EXCEPTION FALTA_BASE :tico || '-' || :numcomp || ' FALTA INDICAR LA BASE PARA LA CUENTA ' || NEW.cuen_cod;
      END
    ELSE
       BEGIN
      IF (CENTRO = 'S') THEN
        EXECUTE PROCEDURE EXISTE_CENTRO (NEW.PROY_COD, NEW.CENT_COD) RETURNING_VALUES (:OK);
        ELSE
        BEGIN
        EXECUTE PROCEDURE LEE_CONFIGURACION('CONTABILIDAD', 'GENERAL', 'PROYECTO UNICO') RETURNING_VALUES (NEW.PROY_COD);
        EXECUTE PROCEDURE LEE_CONFIGURACION('CONTABILIDAD', 'GENERAL', 'CENTRO DE COSTOS UNICO') RETURNING_VALUES (NEW.CENT_COD);
          END
        END
    END
  if (:TIPO = 'I') then
    BEGIN
    if (NEW.ARTI_COD IS NULL) then
        EXCEPTION FALTA_ARTICULO :tico || '-' || :numcomp || ' FALTA INDICAR EL ARTICULO PARA LA CUENTA ' || NEW.cuen_cod;
    END
  if (:TIPO = 'A') then
    BEGIN
    if (NEW.ARTI_COD IS NULL) then
        EXCEPTION FALTA_ACTIVO :tico || '-' || :numcomp || ' FALTA INDICAR EL ACTIVO PARA LA CUENTA ' || NEW.cuen_cod;
    END
  END
END
^


/* Trigger: TI_COMPROBANTE_DETALLE */
CREATE OR ALTER TRIGGER TI_COMPROBANTE_DETALLE_NIIF FOR COMPROBANTE_DETALLE_NIIF
ACTIVE BEFORE INSERT POSITION 0
AS
DECLARE VARIABLE NUMROWS INTEGER;
BEGIN
    /*  PARENT 'CUENTAS' MUST EXIST WHEN INSERTING A CHILD IN 'COMPROBANTE_DETALLE'  */
    IF (NEW.CUEN_COD IS NOT NULL) THEN
    BEGIN
       SELECT COUNT(*)
       FROM   CUENTAS_NIIF
       WHERE  CUENTAS_NIIF.CUEN_COD = NEW.CUEN_COD
       INTO   :NUMROWS;
       IF (NUMROWS = 0) THEN
        BEGIN
        EXCEPTION CUENTA_NO_EXISTE 'La cuenta NIIF ' || new.cuen_cod || ' no existe.';
        END
    END
    /*  PARENT 'COMPROBANTE_ENCABEZADO' MUST EXIST WHEN INSERTING A CHILD IN 'COMPROBANTE_DETALLE'  */
    IF (NEW.ENCO_CONSEC IS NOT NULL) THEN
    BEGIN
       SELECT COUNT(*)
       FROM   COMPROBANTE_ENCABEZADO
       WHERE  COMPROBANTE_ENCABEZADO.ENCO_CONSEC = NEW.ENCO_CONSEC
       INTO   :NUMROWS;
       IF (NUMROWS = 0) THEN
       BEGIN
          EXCEPTION COMPROBAENCABEZA_NO_EXISTE;
       END
    END
    IF (NEW.TERC_NIT IS NOT NULL) THEN
    BEGIN
       SELECT COUNT(*)
       FROM   TERCEROS
       WHERE  TERCEROS.TERC_NIT = NEW.TERC_NIT
       INTO   :NUMROWS;
       IF (NUMROWS = 0) THEN
       BEGIN
          EXCEPTION tercero_no_existe 'El NIT ' || new.terc_nit || ' no existe.';
       END
    END
    IF (NEW.PROY_COD IS NOT NULL) THEN
    BEGIN
       SELECT COUNT(*)
       FROM   PROYECTOS
       WHERE  PROYECTOS.PROY_COD = NEW.PROY_COD
       INTO   :NUMROWS;
       IF (NUMROWS = 0) THEN
       BEGIN
          EXCEPTION proyecto_no_existe 'El proyecto ' || new.proy_cod || ' no existe.';
       END
    END
    IF (NEW.CENT_COD IS NOT NULL) THEN
    BEGIN
       SELECT COUNT(*)
       FROM   CENTROS
       WHERE  CENTROS.CENT_COD = NEW.CENT_COD AND CENTROS.PROY_COD = NEW.PROY_COD
       INTO   :NUMROWS;
       IF (NUMROWS = 0) THEN
       BEGIN
          EXCEPTION centro_no_existe 'El centro ' || new.proy_cod || '-' || new.cent_cod || ' no existe.';
       END
    END
END
^

SET TERM ; ^

/* 201402 */
SET TERM ^ ;

create or alter procedure SALDO_TERCERO_MES_NIIF (
    CUENTA varchar(20),
    NIT varchar(20),
    ANO char(4),
    MES integer,
    INICIAL char(1))
returns (
    SALDO numeric(18,2))
AS
DECLARE VARIABLE FECAUX CHAR(8);
DECLARE VARIABLE FECINI CHAR(8);
DECLARE VARIABLE ANOINI CHAR(4);
DECLARE VARIABLE MESINI CHAR(2);
BEGIN
IF (INICIAL = 'N') THEN
  MES = MES + 1;
EXECUTE PROCEDURE COMPONE_FECHA_CONTA(ANO, MES, 1) returning_values(FECAUX);
EXECUTE PROCEDURE FECHA_Y_NUMERO_CONTA(FECAUX, -1) RETURNING_VALUES (FECAUX);
EXECUTE PROCEDURE LEE_CONFIGURACION ('CONTABILIDAD', 'GENERAL', 'AÑO DE INICIO') RETURNING_VALUES (:ANOINI);
EXECUTE PROCEDURE LEE_CONFIGURACION ('CONTABILIDAD', 'GENERAL', 'MES DE INICIO') RETURNING_VALUES (:MESINI);
execute procedure compone_fecha_conta (:ANOINI, CAST(:MESINI AS INTEGER), 1) returning_values (:FECINI);
if (FECAUX >= FECINI) then
    SELECT FIRST 1 (SATE_SALDO+SATE_DEBITO-SATE_CREDITO) FROM saldos_terceros_niif
        WHERE CUEN_COD = :CUENTA AND TERC_NIT = :NIT AND SACU_FECHA <= :FECAUX
        ORDER BY CUEN_COD DESC, TERC_NIT DESC, SACU_FECHA DESC
        INTO SALDO;
ELSE
    SELECT SATE_SALDO FROM saldos_terceros_niif
        WHERE CUEN_COD = :CUENTA AND TERC_NIT = :NIT AND SACU_FECHA = :FECINI
        ORDER BY CUEN_COD DESC, TERC_NIT DESC, SACU_FECHA DESC
        INTO SALDO;
IF (SALDO IS NULL) THEN
    SALDO = 0;
SUSPEND;
END^

SET TERM ; ^

GRANT EXECUTE ON PROCEDURE SALDO_TERCERO_MES_NIIF TO PUBLIC;

SET TERM ^ ;

create or alter procedure MOVIMIENTOS_TERCERO_MES_NIIF (
    CUENTA varchar(20),
    NIT varchar(20),
    ANO char(4),
    MES integer)
returns (
    DEBITOS numeric(18,2),
    CREDITOS numeric(18,2))
AS
BEGIN
SELECT SUM(SATE_DEBITO), SUM(SATE_CREDITO) FROM saldos_terceros_niif WHERE CUEN_COD = :CUENTA AND TERC_NIT = :NIT AND :MES = SUBSTR(SACU_FECHA, 5, 6) AND :ANO = SUBSTR(SACU_FECHA, 1, 4) INTO :debitos,  :CREDITOS;
IF (DEBITOS IS NULL) THEN
  DEBITOS = 0;
IF (CREDITOS IS NULL) THEN
  CREDITOS = 0;
SUSPEND;
END^

SET TERM ; ^

GRANT EXECUTE ON PROCEDURE movimientos_tercero_mes_niif TO PUBLIC;

SET TERM ^ ;

create or alter procedure BALANCE_TERCERO_MES_NIIF (
    CUENTA varchar(20),
    ANO char(4),
    MES integer)
returns (
    CODIGO varchar(20),
    NOMBRE varchar(60),
    INICIAL numeric(18,2),
    DEBITOS numeric(18,2),
    CREDITOS numeric(18,2),
    FINAL numeric(18,2))
AS
BEGIN
FOR SELECT TERC_NIT, TERC_NOM FROM TERCEROS INTO CODIGO, NOMBRE
DO
  BEGIN
  EXECUTE PROCEDURE saldo_tercero_mes_niif(CUENTA, CODIGO, ANO, MES, 'S') RETURNING_VALUES (INICIAL);
  EXECUTE PROCEDURE movimientos_tercero_mes_niif(CUENTA, CODIGO, ANO, MES) RETURNING_VALUES(DEBITOS, CREDITOS);
  FINAL = INICIAL + DEBITOS - CREDITOS;
  SUSPEND;
  END
END^

SET TERM ; ^

GRANT EXECUTE ON PROCEDURE balance_tercero_mes_niif TO PUBLIC;

SET TERM ^ ;

create or alter procedure AUXILIAR_CUENTA_MES_NIIF (
    CUENTA varchar(20),
    ANO char(4),
    PERIODO integer)
returns (
    ID integer,
    TIPOCOMP varchar(3),
    PREFIJO varchar(4),
    NUMERO varchar(8),
    FECHA char(8),
    CONCEPTO varchar(60),
    NIT varchar(20),
    REF varchar(20),
    BASE numeric(18,2),
    PORC numeric(9,4),
    DEBITO numeric(18,2),
    CREDITO numeric(18,2),
    PROYECTO varchar(4),
    CENTRO varchar(4),
    TIPOREF integer,
    IDREF integer)
AS
BEGIN
  /* TRAE LOS MOV. DEL MES DE LA CUENTA DADA */
  FOR SELECT E.ENCO_CONSEC, TICO_COD, PRCO_PREF, ENCO_NUMERO, ENCO_FECHA, CODE_CONCEPTO, D.TERC_NIT, CODE_REFER, CODE_BASE, CODE_PORC, CODE_DEBITO, CODE_CREDITO, PROY_COD, CENT_COD, ENCO_TIPOREF, ENCO_IDREF
    FROM COMPROBANTE_ENCABEZADO E, comprobante_detalle_niif D
    WHERE E.ENCO_CONSEC = D.ENCO_CONSEC AND CUEN_COD = :CUENTA AND SUBSTRING(ENCO_FECHA FROM 1 FOR 4) = :ANO AND SUBSTRING(ENCO_FECHA FROM 5 FOR 2) = :PERIODO
    ORDER BY ENCO_FECHA, PRCO_PREF, ENCO_NUMERO
    INTO :ID, :TIPOCOMP, :PREFIJO, :NUMERO, :FECHA, :CONCEPTO, :NIT, :REF, :BASE, :PORC, :DEBITO, :CREDITO, :PROYECTO, :centro, :TIPOREF, :IDREF
    DO
    SUSPEND;
END^

SET TERM ; ^

GRANT EXECUTE ON PROCEDURE auxiliar_cuenta_mes_niif TO PUBLIC;

/* 201403 */
SET TERM ^ ;

create or alter procedure SALDO_CUENTA_MES_NIIF (
    CUENTA varchar(20),
    ANO char(4),
    MES integer,
    INICIAL char(1))
returns (
    SALDO numeric(18,2))
AS
DECLARE VARIABLE FECAUX CHAR(8);
BEGIN
IF (INICIAL = 'N') THEN
  MES = MES + 1;
execute procedure COMPONE_FECHA_CONTA(ANO, MES, 1) returning_values(FECAUX);
EXECUTE PROCEDURE saldo_cuenta_niif(CUENTA, FECAUX) RETURNING_VALUES (SALDO);
SUSPEND;
END^

SET TERM ; ^

GRANT EXECUTE ON PROCEDURE SALDO_CUENTA_MES_NIIF TO PUBLIC;

ALTER TABLE CUENTAS
ADD CUEN_EQNIIF T_CTA_CONTABLE;

ALTER TABLE COMPROBANTE_ENCABEZADO
ADD ENCO_REPNIIF T_BOOLEANO;


SET TERM ^ ;

CREATE OR ALTER TRIGGER COMPROBANTE_DETALLE_AI FOR COMPROBANTE_DETALLE
ACTIVE AFTER INSERT POSITION 0
AS
DECLARE VARIABLE FECHA CHAR(8);
declare variable TIPO CHAR(1);
declare variable CTANIIF VARCHAR(20);
declare variable REPNIIF CHAR(1);
BEGIN
SELECT ENCO_FECHA, ENCO_REPNIIF FROM COMPROBANTE_ENCABEZADO WHERE ENCO_CONSEC = NEW.ENCO_CONSEC INTO :FECHA, :REPNIIF;
/* ACTUALICE LOS SALDOS */
EXECUTE PROCEDURE ACTUALICE_SALDO_CUENTA(NEW.CUEN_COD, FECHA, NEW.CODE_DEBITO, NEW.CODE_CREDITO);
EXECUTE PROCEDURE ACTUALICE_SALDO_TERCERO(NEW.CUEN_COD, NEW.TERC_NIT, FECHA, NEW.CODE_DEBITO, NEW.CODE_CREDITO);
if (NEW.ARTI_COD IS NOT NULL) then
  BEGIN
  SELECT CUEN_TIPO FROM CUENTAS WHERE CUEN_COD = NEW.CUEN_COD INTO :TIPO;
  if (TIPO = 'I') then
    EXECUTE PROCEDURE ACTUALICE_SALDO_ARTICULO(NEW.CUEN_COD, NEW.ARTI_COD, FECHA, NEW.CODE_DEBITO, NEW.CODE_CREDITO);
  else
    if (TIPO = 'A') then
      EXECUTE PROCEDURE actualice_saldo_activo(NEW.CUEN_COD, NEW.ARTI_COD, FECHA, NEW.CODE_DEBITO, NEW.CODE_CREDITO);
  END
EXECUTE PROCEDURE ACTUALICE_SALDO_CENTRO(NEW.CUEN_COD, NEW.PROY_COD, NEW.CENT_COD, FECHA, NEW.CODE_DEBITO, NEW.CODE_CREDITO);
EXECUTE PROCEDURE ACTUALICE_SALDO_CENTRO_TERCERO(NEW.CUEN_COD, NEW.PROY_COD, NEW.CENT_COD, NEW.TERC_NIT, FECHA, NEW.CODE_DEBITO, NEW.CODE_CREDITO);
/* GRABE EL EQUIVALENTE NIIF */
if (REPNIIF = 'S') then
    BEGIN
    SELECT CUEN_EQNIIF FROM CUENTAS WHERE CUEN_COD = NEW.cuen_cod INTO :CTANIIF;
    if ((CTANIIF IS NOT NULL) AND (CTANIIF <> '')) then
        INSERT INTO comprobante_detalle_niif (ENCO_CONSEC, CODE_ITEM, CUEN_COD, CODE_CONCEPTO, CODE_REFER, CODE_DEBITO, CODE_CREDITO,
            CODE_BASE, CODE_PORC, TERC_NIT, PROY_COD, CENT_COD, DOCO_VENCE, ARTI_COD, CODE_TIPOAPL, CODE_TIPONUE, CONC_COD, CNDE_DOCNUMERO, CNDE_DOCAPLICA, CODE_DESCONTABLE)
            VALUES (NEW.ENCO_CONSEC, NEW.CODE_ITEM, :ctaniif, NEW.CODE_CONCEPTO, NEW.CODE_REFER, NEW.CODE_DEBITO, NEW.CODE_CREDITO,
            NEW.CODE_BASE, NEW.CODE_PORC, NEW.TERC_NIT, NEW.PROY_COD, NEW.CENT_COD, NEW.DOCO_VENCE, NEW.ARTI_COD, NEW.CODE_TIPOAPL, NEW.CODE_TIPONUE, NEW.CONC_COD, NEW.CNDE_DOCNUMERO, NEW.CNDE_DOCAPLICA, NEW.CODE_DESCONTABLE);
    END
END^

SET TERM ; ^

SET TERM ^ ;

create or alter procedure VALIDE_PADRE_NIIF (
    CUENTA varchar(20))
returns (
    OK char(1))
AS
DECLARE VARIABLE NIVEL SMALLINT;
DECLARE VARIABLE DIGITOS SMALLINT;
DECLARE VARIABLE PADRE VARCHAR(20);
DECLARE VARIABLE EXISTE CHAR(1);
DECLARE VARIABLE REGISTROS SMALLINT;
BEGIN
  /* Verifica que exista el padre de la cuenta */
  OK = 'N';
  EXECUTE PROCEDURE VALIDE_ESTRUCTURA (CUENTA) RETURNING_VALUES (:NIVEL);
  IF (NIVEL > 1) THEN
    BEGIN
    NIVEL = NIVEL - 1;
    EXECUTE PROCEDURE DIGITOS_NIVEL (NIVEL) RETURNING_VALUES (:DIGITOS);
    PADRE = SUBSTR (CUENTA, 1, DIGITOS);
    EXECUTE PROCEDURE existe_cuenta_niif (PADRE) RETURNING_VALUES (:EXISTE);
    IF (EXISTE = 'N') THEN
      EXCEPTION CUENTA_PADRE_NO_EXISTE;
    ELSE
    BEGIN
 /* Verifique que la cuenta padre no tenga movimiento */
        SELECT COUNT(CODE_ITEM) FROM COMPROBANTE_DETALLE_NIIF WHERE CUEN_COD = :PADRE INTO :REGISTROS;
        IF (REGISTROS > 0) THEN
          EXCEPTION MOVIMIENTO_CUENTA_PADRE;
        ELSE
          OK = 'S';
     END
    END
    suspend;
END^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER TRIGGER CUENTAS_NIIF_BI FOR CUENTAS_NIIF
ACTIVE BEFORE INSERT POSITION 0
AS
DECLARE VARIABLE OK CHAR(1);
BEGIN
  IF ((NEW.CUEN_COD IS NULL) OR (NEW.CUEN_NOM IS NULL)) THEN
      EXCEPTION CUENTA_SIN_DATOS;
  /* Llena los detalles de cuenta */ 
  IF (NEW.cuen_activa IS NULL) THEN
    NEW.cuen_activa = 'S';
  IF (NEW.cuen_afectable IS NULL) THEN
    NEW.cuen_afectable = 'S';
  IF (NEW.CUEN_TERCERO IS NULL) THEN
    NEW.CUEN_TERCERO = 'N';
  IF (NEW.CUEN_CENTRO IS NULL) THEN
    NEW.CUEN_CENTRO = 'N';
  IF (NEW.CUEN_RETENCION IS NULL) THEN
    NEW.CUEN_RETENCION = 'N';
  NEW.cuen_afectable = 'S';
  /* verifica que exista el padre y que no tenga movimiento */
  EXECUTE PROCEDURE valide_padre_niif (NEW.CUEN_COD) RETURNING_VALUES (:OK);

END^

SET TERM ; ^

/* 201404 */
CREATE TABLE APERTURA_NIIF (
    CUEN_COD T_CTA_CONTABLE NOT NULL,
    APNI_SALDOANT T_MONTO,
    APNI_AJUSTEDB T_MONTO,
    APNI_AJUSTECR T_MONTO,
    APNI_SALDONIIF T_MONTO,
    APNI_NOTA VARCHAR(2048));

ALTER TABLE APERTURA_NIIF
ADD CONSTRAINT PK_APERTURA_NIIF
PRIMARY KEY (CUEN_COD);

INSERT INTO CONFIGURACION (CONF_MODULO, CONF_CATEGORIA, CONF_PROPIEDAD, CONF_VALOR, CONF_POSIBLES, CONF_AYUDA) VALUES ('CONTABILIDAD', 'GENERAL', 'AÑO BALANCE DE APERTURA NIIF', '2015', '2014,2015, 2016', NULL);
COMMIT WORK;

SET TERM ^ ;

CREATE OR ALTER procedure BALANCE_FINAL (
    ANO char(4),
    MES integer,
    SIN_MOV char(1))
returns (
    CODIGO varchar(20),
    NOMBRE varchar(60),
    SALDO numeric(18,2),
    SCLASE numeric(18,2),
    SGRUPO numeric(18,2),
    SSUBGRUPO numeric(18,2),
    SCUENTA numeric(18,2),
    NIVEL integer,
    AFECTA CHAR(1),
    CUENTANIIF VARCHAR(20))
AS
DECLARE VARIABLE ACTIVA CHAR(1);
declare variable DIG INTEGER;
BEGIN
FOR SELECT CUEN_COD, CUEN_NOM, CUEN_ACTIVA, CUEN_EQNIIF, CUEN_AFECTABLE FROM CUENTAS order by CUEN_COD INTO CODIGO, NOMBRE, ACTIVA, CUENTANIIF, AFECTA
DO
  BEGIN
  EXECUTE PROCEDURE SALDO_CUENTA_MES(CODIGO, ANO, MES, 'S') RETURNING_VALUES (SALDO);
  EXECUTE PROCEDURE VALIDE_ESTRUCTURA (CODIGO) RETURNING_VALUES (:NIVEL);
  EXECUTE PROCEDURE DIGITOS_NIVEL (:NIVEL) RETURNING_VALUES (:DIG);
  SCLASE = 0;
  SGRUPO = 0;
  SSUBGRUPO = 0;
  SCUENTA = 0;
  if (NIVEL = 1) then
    BEGIN
    SCLASE = SALDO;
    END
  if (NIVEL = 2) then
    BEGIN
    SGRUPO = SALDO;
    END
  if (NIVEL = 3) then
    BEGIN
    SSUBGRUPO = SALDO;
    END
  if (NIVEL > 3) then
    BEGIN
    SCUENTA = SALDO;
    END
  if (((SIN_MOV = 'S') AND (ACTIVA = 'S')) or (SALDO <> 0))then
      begin
      SUSPEND;
      end
  END
END^

SET TERM ; ^

/* 201405 */
ALTER TABLE APERTURA_NIIF
ADD APNI_CUENNIIF T_CTA_CONTABLE;

CREATE TABLE APERTURA_NIIF_DET (
    CUEN_COD T_CTA_CONTABLE NOT NULL,
    APND_ITEM T_ID NOT NULL,
    APND_CUENTA T_CTA_CONTABLE,
    APND_TIPOCTA CHAR(1),
    APND_CONCEPTO T_CONCEPTO,
    APND_SALDOINI T_MONTO,
    APND_DEBITO T_MONTO,
    APND_CREDITO T_MONTO,
    APND_SALDOFIN T_MONTO,
    APND_ARCHIVO BLOB SUB_TYPE 0 SEGMENT SIZE 80);

ALTER TABLE APERTURA_NIIF_DET
ADD CONSTRAINT PK_APERTURA_NIIF_DET
PRIMARY KEY (CUEN_COD,APND_ITEM);

grant select, delete, insert, update on  apertura_niif_det to public;

ALTER TABLE APERTURA_NIIF_DET
ADD APND_CTANIIF T_CTA_CONTABLE;

SET TERM ^ ;

create or alter procedure VALIDE_CUENTA_NIIF_C (
    CUENTA varchar(20))
returns (
    ERROR integer)
AS
DECLARE VARIABLE TOT_DIGITOS SMALLINT;
DECLARE VARIABLE DIGITOS SMALLINT;
DECLARE VARIABLE LON SMALLINT;
DECLARE VARIABLE OK CHAR(1);
DECLARE VARIABLE N SMALLINT;
DECLARE VARIABLE MINNIVEL SMALLINT;
declare variable NIVEL SMALLINT;
BEGIN
ERROR = 0;
EXECUTE PROCEDURE existe_cuenta_niif(CUENTA) RETURNING_VALUES (:OK);
IF (OK = 'N') THEN
    ERROR = 1;
ELSE
    BEGIN
    /* Verifica que los dígitos de la cuenta esten completos y retorna el nivel */
    NIVEL = 0;
    TOT_DIGITOS = 0;
    LON = STRLEN(CUENTA);
    FOR SELECT ESTR_NIVEL, ESTR_DIGITOS FROM ESTRUCTURA ORDER BY ESTR_NIVEL INTO :N, :DIGITOS
        DO
        BEGIN
        TOT_DIGITOS = TOT_DIGITOS + DIGITOS;
        IF (LON = TOT_DIGITOS) THEN
            NIVEL = N;
        END
    IF (NIVEL = 0) THEN
        ERROR = 2;
    ELSE
        BEGIN
        EXECUTE PROCEDURE LEE_CONFIGURACION ('CONTABILIDAD', 'ESTRUCTURA', 'MINIMO NIVEL AFECTABLE') RETURNING_VALUES (:MINNIVEL);
        if (MINNIVEL > NIVEL) THEN
            ERROR = 3;
        ELSE
            BEGIN
            LON = STRLEN(CUENTA);
            SELECT COUNT(*) FROM cuentas_niif WHERE SUBSTR(CUEN_COD, 1, :LON) = :CUENTA INTO :N;
            IF (N <> 1) THEN
                BEGIN
                OK = 'N';
                ERROR = 4;
                END
            END
        END
    END
SUSPEND;
END^

SET TERM ; ^

GRANT EXECUTE ON PROCEDURE VALIDE_CUENTA_NIIF_C TO PUBLIC;

ALTER TABLE APERTURA_NIIF
ADD APNI_ARCHIVO BLOB SUB_TYPE 0 SEGMENT SIZE 8192;

SET TERM ^ ;

create trigger APERTURA_NIIF_DET_AI for APERTURA_NIIF_DET
active AFTER INSERT position 0
as
begin
  /* Actualice el saldo consolidado */
update apertura_niif a set a.apni_ajustedb = a.apni_ajustedb + new.apnd_debito,
    a.apni_ajustecr = a.apni_ajustecr + new.apnd_credito
    where a.cuen_cod = new.cuen_cod;
end^

SET TERM ; ^

SET TERM ^ ;

create trigger APERTURA_NIIF_DET_AU for APERTURA_NIIF_DET
active AFTER UPDATE position 0
as
begin
  /* Actualice el saldo consolidado */
  update apertura_niif a set a.apni_ajustedb = a.apni_ajustedb - old.apnd_debito,
    a.apni_ajustecr = a.apni_ajustecr - old.apnd_credito
    where a.cuen_cod = old.cuen_cod;
  update apertura_niif a set a.apni_ajustedb = a.apni_ajustedb + new.apnd_debito,
    a.apni_ajustecr = a.apni_ajustecr + new.apnd_credito
    where a.cuen_cod = new.cuen_cod;
end^

SET TERM ; ^

SET TERM ^ ;

create trigger APERTURA_NIIF_DET_AD for APERTURA_NIIF_DET
active AFTER DELETE position 0
as
begin
  /* Actualice el saldo consolidado */
  update apertura_niif a set a.apni_ajustedb = a.apni_ajustedb - old.apnd_debito,
    a.apni_ajustecr = a.apni_ajustecr - old.apnd_credito
    where a.cuen_cod = old.cuen_cod;
end^

SET TERM ; ^

/* 201406 */
SET TERM ^ ;

CREATE OR ALTER procedure AJUSTES_APERTURA_NIIF
returns (
    CODIGO varchar(20),
    NOMBRE varchar(60),
    SALDO numeric(18,2),
    AJUSTEDB numeric(18,2),
    AJUSTECR numeric(18,2),
    FINAL numeric(18,2),
    CUENTANIIF varchar(20),
    NOMBRENIIF varchar(60),
    AJUSTEDBN numeric(18,2),
    AJUSTECRN numeric(18,2),
    NUEVO numeric(18,2))
AS
declare variable ANO CHAR(4);
BEGIN
EXECUTE PROCEDURE lee_configuracion('CONTABILIDAD', 'GENERAL', 'AÑO BALANCE DE DE APERTURA NIIF') returning_values (ANO);
FOR SELECT CUEN_COD, CUEN_NOM, CUEN_EQNIIF FROM CUENTAS WHERE CUEN_AFECTABLE = 'S' AND CUEN_ACTIVA = 'S'
    order by CUEN_COD INTO CODIGO, NOMBRE, CUENTANIIF
DO
  BEGIN
  EXECUTE PROCEDURE SALDO_CUENTA_MES(CODIGO, ANO, 1, 'S') RETURNING_VALUES (SALDO);
  if (cuentaniif <> '') then
      SELECT CUEN_NOM FROM CUENTAS_NIIF WHERE CUEN_COD = :cuentaniif INTO :nombreniif;
  ELSE
      NOMBRENIIF = '';
  /* SUME LOS AJUSTES NIIF */
  SELECT SUM(APND_DEBITO), SUM(APND_CREDITO) FROM apertura_niif_det WHERE APND_CUENTA = :codigo INTO :ajustedb, :ajustecr;
  if (ajustedb IS NULL) then
    ajustedb = 0;
  if (ajustecr IS NULL) then
    ajustecr = 0;
  FINAL = SALDO + ajustedb - ajustecr;
  /* LOS AJUSTES DE LA CUENTA NIIF */
  SELECT SUM(APND_DEBITO), SUM(APND_CREDITO) FROM apertura_niif_det WHERE APND_CTANIIF = :cuentaniif INTO :ajustedbn, :ajustecrn;
  if (ajustedbn IS NULL) then
    ajustedbn = 0;
  if (ajustecrn IS NULL) then
    ajustecrn = 0;
  NUEVO = ajustedbn - ajustecrn;
  SUSPEND;
  END
END^

SET TERM ; ^

grant execute on procedure ajustes_apertura_niif to public;

SET TERM ^ ;

create or alter procedure MOVIMIENTOS_CUENTA_MES_NIIF (
    CUENTA varchar(20),
    ANO char(4),
    MES integer)
returns (
    DEBITOS numeric(18,2),
    CREDITOS numeric(18,2))
AS
declare variable FECINI CHAR(8);
declare variable FECFIN CHAR(8);
declare variable CTAFIN VARCHAR(20);
BEGIN
CTAFIN = CUENTA || '999999';
execute procedure COMPONE_FECHA_CONTA(ANO, MES, 1) returning_values(FECINI);
MES = MES + 1;
execute procedure COMPONE_FECHA_CONTA(ANO, MES, 1) returning_values(FECFIN);
EXECUTE PROCEDURE FECHA_Y_NUMERO_CONTA(FECFIN, -1) RETURNING_VALUES (FECFIN);

SELECT SUM(SACU_DEBITO), SUM(SACU_CREDITO) FROM saldos_cuentas_niif WHERE CUEN_COD >= :CUENTA AND CUEN_COD <= :CTAFIN AND
    SACU_FECHA >= :FECINI AND SACU_FECHA <= :FECFIN INTO :debitos, :creditos;
IF (debitos IS NULL) THEN
  debitos = 0;
IF (creditos IS NULL) THEN
  creditos = 0;
SUSPEND;
END^

SET TERM ; ^

grant execute on procedure MOVIMIENTOS_CUENTA_MES_NIIF to public;

SET TERM ^ ;

create or alter procedure CONSULTA_BALANCE_MES_NIIF (
    ANO char(4),
    MES integer,
    SIN_MOV char(1),
    NIVSAL integer)
returns (
    CODIGO varchar(20),
    NOMBRE varchar(60),
    INICIAL numeric(18,2),
    DEBITOS numeric(18,2),
    CREDITOS numeric(18,2),
    FINAL numeric(18,2),
    NIVEL integer,
    SUMINI numeric(18,2),
    SUMDB numeric(18,2),
    SUMCR numeric(18,2),
    SUMFIN numeric(18,2))
AS
DECLARE VARIABLE ACTIVA CHAR(1);
BEGIN
SUMINI = 0;
SUMDB = 0;
SUMCR = 0;
SUMFIN = 0;
FOR SELECT CUEN_COD, CUEN_NOM, CUEN_ACTIVA  FROM cuentas_niif order by CUEN_COD INTO CODIGO, NOMBRE, ACTIVA
DO
  BEGIN
  EXECUTE PROCEDURE VALIDE_ESTRUCTURA (CODIGO) RETURNING_VALUES (:NIVEL);
  if (NIVEL <= NIVSAL) then
    BEGIN
    EXECUTE PROCEDURE saldo_cuenta_mes_niif(CODIGO, ANO, MES, 'S') RETURNING_VALUES (INICIAL);
    EXECUTE PROCEDURE movimientos_cuenta_mes_niif(CODIGO, ANO, MES) RETURNING_VALUES(DEBITOS, CREDITOS);

    FINAL = INICIAL + DEBITOS - CREDITOS;
    if (NIVEL = 1) then
      BEGIN
      SUMINI = SUMINI + INICIAL;
      SUMDB = SUMDB + DEBITOS;
      SUMCR = SUMCR + CREDITOS;
      SUMFIN = SUMFIN + FINAL;
      END
    
    if (((SIN_MOV = 'S') AND (ACTIVA = 'S')) or (FINAL <> 0) or (DEBITOS <> 0) or (CREDITOS <> 0))then
      SUSPEND;
    END
  END
END^

SET TERM ; ^

grant execute on procedure CONSULTA_BALANCE_MES_NIIF to public;

SET TERM ^ ;

CREATE OR ALTER TRIGGER APERTURA_NIIF_DET_AI FOR APERTURA_NIIF_DET
ACTIVE AFTER INSERT POSITION 0
as
begin
  /* Actualice el saldo consolidado */
update apertura_niif a set a.apni_ajustedb = a.apni_ajustedb + new.apnd_debito,
    a.apni_ajustecr = a.apni_ajustecr + new.apnd_credito
    where a.cuen_cod = new.cuen_cod;
/* REGISTRE EL SALDO INICIAL */
if (EXISTS (SELECT SAIN_ITEM FROM saldos_iniciales_niif WHERE CUEN_COD = NEW.apnd_ctaniif)) Then
    begin
    update saldos_iniciales_niif s set s.sain_debito = s.sain_debito + new.apnd_debito,
        s.sain_credito = s.sain_credito + new.apnd_credito
        where s.cuen_cod = new.apnd_ctaniif;
    end
end^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER TRIGGER APERTURA_NIIF_DET_AU FOR APERTURA_NIIF_DET
ACTIVE AFTER UPDATE POSITION 0
as
begin
  /* Actualice el saldo consolidado */
  update apertura_niif a set a.apni_ajustedb = a.apni_ajustedb - old.apnd_debito,
    a.apni_ajustecr = a.apni_ajustecr - old.apnd_credito
    where a.cuen_cod = old.cuen_cod;
  update apertura_niif a set a.apni_ajustedb = a.apni_ajustedb + new.apnd_debito,
    a.apni_ajustecr = a.apni_ajustecr + new.apnd_credito
    where a.cuen_cod = new.cuen_cod;
/* REGISTRE EL SALDO INICIAL */
if (EXISTS (SELECT SAIN_ITEM FROM saldos_iniciales_niif WHERE CUEN_COD = OLD.apnd_ctaniif)) Then
    begin
    update saldos_iniciales_niif s set s.sain_debito = s.sain_debito - OLD.apnd_debito,
        s.sain_credito = s.sain_credito - OLD.apnd_credito
        where s.cuen_cod = OLD.apnd_ctaniif;
    end
if (EXISTS (SELECT SAIN_ITEM FROM saldos_iniciales_niif WHERE CUEN_COD = NEW.apnd_ctaniif)) Then
    begin
    update saldos_iniciales_niif s set s.sain_debito = s.sain_debito + new.apnd_debito,
        s.sain_credito = s.sain_credito + new.apnd_credito
        where s.cuen_cod = new.apnd_ctaniif;
    end
end^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER TRIGGER APERTURA_NIIF_DET_AD FOR APERTURA_NIIF_DET
ACTIVE AFTER DELETE POSITION 0
as
begin
  /* Actualice el saldo consolidado */
  update apertura_niif a set a.apni_ajustedb = a.apni_ajustedb - old.apnd_debito,
    a.apni_ajustecr = a.apni_ajustecr - old.apnd_credito
    where a.cuen_cod = old.cuen_cod;
/* REGISTRE EL SALDO INICIAL */
if (EXISTS (SELECT SAIN_ITEM FROM saldos_iniciales_niif WHERE CUEN_COD = OLD.apnd_ctaniif)) Then
    begin
    update saldos_iniciales_niif s set s.sain_debito = s.sain_debito - OLD.apnd_debito,
        s.sain_credito = s.sain_credito - OLD.apnd_credito
        where s.cuen_cod = OLD.apnd_ctaniif;
    end
end^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER TRIGGER SALDOS_INICIALES_NIIF_BI FOR SALDOS_INICIALES_NIIF
ACTIVE BEFORE INSERT POSITION 0
AS
DECLARE VARIABLE OK CHAR(1);
DECLARE VARIABLE TERCERO CHAR(1);
DECLARE VARIABLE RETENCION CHAR(1);
DECLARE VARIABLE CENTRO CHAR(1);
BEGIN
/* VERIFIQUE QUE LA CUENTA EXISTA Y QUE SEA AFECTABLE */
EXECUTE PROCEDURE valide_cuenta_niif (NEW.CUEN_COD) RETURNING_VALUES (:OK);
IF (OK <> '0') THEN
  BEGIN
  IF (NEW.sain_debito IS NULL) THEN
    NEW.sain_debito = 0;
  IF (NEW.sain_credito IS NULL) THEN
    NEW.sain_credito = 0;
  IF (NEW.TERC_NIT IS NULL) THEN
    EXECUTE PROCEDURE LEE_CONFIGURACION('CONTABILIDAD', 'GENERAL', 'NIT COMPAÑIA') RETURNING_VALUES (NEW.TERC_NIT);
  IF (NEW.PROY_COD IS NULL) THEN
    EXECUTE PROCEDURE LEE_CONFIGURACION('CONTABILIDAD', 'GENERAL', 'PROYECTO UNICO') RETURNING_VALUES (NEW.PROY_COD);
  IF (NEW.CENT_COD IS NULL) THEN
    EXECUTE PROCEDURE LEE_CONFIGURACION('CONTABILIDAD', 'GENERAL', 'CENTRO DE COSTOS UNICO') RETURNING_VALUES (NEW.CENT_COD);
  SELECT CUEN_TERCERO, CUEN_RETENCION, CUEN_CENTRO FROM cuentas_niif WHERE CUEN_COD = NEW.CUEN_COD INTO :TERCERO, :RETENCION, :CENTRO;
  /* VERIFIQUE EL TERCERO */
  IF (TERCERO = 'S' OR RETENCION = 'S') THEN
    EXECUTE PROCEDURE EXISTE_TERCERO (NEW.TERC_NIT) RETURNING_VALUES (:OK);
  ELSE
    EXECUTE PROCEDURE LEE_CONFIGURACION('CONTABILIDAD', 'GENERAL', 'NIT COMPAÑIA') RETURNING_VALUES (NEW.TERC_NIT);
  IF (CENTRO = 'S') THEN
    EXECUTE PROCEDURE EXISTE_CENTRO (NEW.PROY_COD, NEW.CENT_COD) RETURNING_VALUES (:OK);
  ELSE
    BEGIN
    EXECUTE PROCEDURE LEE_CONFIGURACION('CONTABILIDAD', 'GENERAL', 'PROYECTO UNICO') RETURNING_VALUES (NEW.PROY_COD);
    EXECUTE PROCEDURE LEE_CONFIGURACION('CONTABILIDAD', 'GENERAL', 'CENTRO DE COSTOS UNICO') RETURNING_VALUES (NEW.CENT_COD);
    END
  IF (OK = 'S') THEN
    BEGIN
    IF (NEW.SAIN_DEBITO IS NULL) THEN
      NEW.SAIN_DEBITO = 0;
    IF (NEW.SAIN_CREDITO IS NULL) THEN
      NEW.SAIN_CREDITO = 0;
    END
  END
END^

SET TERM ; ^

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 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 ; ^

SET TERM ^ ;

CREATE OR ALTER TRIGGER SALDOS_INICIALES_NIIF_AU FOR SALDOS_INICIALES_NIIF
ACTIVE AFTER UPDATE POSITION 0
as
declare variable ANO varchar(4);
declare variable MES varchar(2);
declare variable INICIAL varchar(10);
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 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';
/* Actualice los saldos de fechas igual o posteriores */
update SALDOS_CUENTAS_NIIF
  set SACU_SALDO = SACU_SALDO - old.SAIN_DEBITO + old.SAIN_CREDITO
where (CUEN_COD = old.CUEN_COD) and (SACU_FECHA >= :INICIAL);
update SALDOS_TERCEROS_NIIF
  set SATE_SALDO = SATE_SALDO - old.SAIN_DEBITO + old.SAIN_CREDITO
  where (CUEN_COD = old.CUEN_COD) and (TERC_NIT = old.TERC_NIT) and (SACU_FECHA >= :INICIAL);
update SALDOS_CENTROS_NIIF
  set SACE_SALDO = SACE_SALDO - old.SAIN_DEBITO + old.SAIN_CREDITO
  where (CUEN_COD = old.CUEN_COD) and (PROY_COD = old.PROY_COD) and (CENT_COD = old.CENT_COD) and (SACU_FECHA >= :INICIAL);
update SALDOS_CENTROS_TERCERO_NIIF
  set SACT_SALDO = SACT_SALDO - old.SAIN_DEBITO + old.SAIN_CREDITO
  where (CUEN_COD = old.CUEN_COD) and (PROY_COD = old.PROY_COD) and (CENT_COD = old.CENT_COD)
  and (TERC_NIT = old.TERC_NIT) and (SACU_FECHA >= :INICIAL);
/* REGISTRE LO NUEVO */
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, PROY_COD, CENT_COD, TERC_NIT, SACU_FECHA, SACT_SALDO, SACT_DEBITO, SACT_CREDITO)
      values (new.CUEN_COD, new.PROY_COD, new.CENT_COD, NEW.terc_nit, :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
/* 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);
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, 'U', SUBSTRING(:CUENNIT FROM 1 FOR 20), NULL);
end^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER TRIGGER SALDOS_INICIALES_NIIF_AD FOR SALDOS_INICIALES_NIIF
ACTIVE AFTER DELETE POSITION 0
AS
declare variable CUENTA VARCHAR(20);
DECLARE VARIABLE ANO VARCHAR(4);
DECLARE VARIABLE MES VARCHAR(2);
DECLARE VARIABLE INICIAL VARCHAR(10);
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 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';

/* Actualice los saldos de fechas igual y posteriores */
UPDATE SALDOS_CUENTAS_NIIF
    SET SACU_SALDO = SACU_SALDO - OLD.SAIN_DEBITO + OLD.SAIN_CREDITO
    WHERE (CUEN_COD = OLD.CUEN_COD) AND (SACU_FECHA >= :INICIAL);
UPDATE SALDOS_TERCEROS_NIIF
  SET SATE_SALDO = SATE_SALDO - OLD.SAIN_DEBITO + OLD.SAIN_CREDITO
  WHERE (CUEN_COD = OLD.CUEN_COD) AND (TERC_NIT = OLD.TERC_NIT) AND (SACU_FECHA >= :INICIAL);
UPDATE SALDOS_CENTROS_NIIF
  SET SACE_SALDO = SACE_SALDO - OLD.SAIN_DEBITO + OLD.SAIN_CREDITO
  WHERE (CUEN_COD = OLD.CUEN_COD) AND (PROY_COD = OLD.PROY_COD) AND (CENT_COD = OLD.CENT_COD) AND (SACU_FECHA >= :INICIAL);
UPDATE saldos_centros_tercero_NIIF
  SET SACT_SALDO = SACT_SALDO - OLD.SAIN_DEBITO + OLD.SAIN_CREDITO
  WHERE (CUEN_COD = OLD.CUEN_COD) AND (PROY_COD = OLD.PROY_COD) AND (CENT_COD = OLD.CENT_COD) AND (TERC_NIT = OLD.TERC_NIT) AND (SACU_FECHA >= :INICIAL);
CUENNIT = OLD.cuen_cod || '-' || OLD.terc_nit;
INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD, AUDI_TICO)
    VALUES (USER, 1007, OLD.sain_item, 'U', SUBSTRING(:CUENNIT FROM 1 FOR 20), NULL);
END^

SET TERM ; ^

ALTER TABLE SALDOS_CUENTAS_NIIF DROP CONSTRAINT FK_SALDOCUENTA_CUENTAS_NIIF;

ALTER TABLE SALDOS_CUENTAS_NIIF ADD CONSTRAINT FK_SALDOCUENTA_CUENTAS_NIIF
    FOREIGN KEY (CUEN_COD) REFERENCES CUENTAS_NIIF(CUEN_COD) USING INDEX FK_SALDOCUENTA_CUENTAS_NIIF;


/* 201407 */
CREATE TABLE TAXONOMIA_ENCABEZADO (
    TAXE_ID T_ID NOT NULL,
    TAXE_NOMBRE T_CONCEPTO);

ALTER TABLE TAXONOMIA_ENCABEZADO
ADD CONSTRAINT PK_TAXONOMIA_ENCABEZADO
PRIMARY KEY (TAXE_ID);

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

ALTER TABLE CUENTAS_NIIF
ADD CUEN_NORMA VARCHAR(255);

CREATE TABLE NORMAS_NIIF (
    NNIF_ID T_ID NOT NULL,
    NNIF_NOMBRE T_CONCEPTO);

ALTER TABLE NORMAS_NIIF ADD CONSTRAINT PK_NORMAS_NIIF PRIMARY KEY (NNIF_ID);

CREATE TABLE NORMAS_NIIF_DETALLE (
    NNIF_ID T_ID NOT NULL,
    NNID_ITEM T_ID NOT NULL,
    NNIF_NOMBRE T_CONCEPTO,
    NNID_TEXTO BLOB SUB_TYPE 1 SEGMENT SIZE 80);

ALTER TABLE NORMAS_NIIF_DETALLE ADD CONSTRAINT PK_NORMAS_NIIF_DETALLE PRIMARY KEY (NNIF_ID,NNID_ITEM);

CREATE TABLE CUENTAS_NIIF_NORMA (
    CUEN_COD   T_CTA_CONTABLE NOT NULL /* T_CTA_CONTABLE = VARCHAR(20) */,
    NNIF_ID    T_ID NOT NULL /* T_ID = INTEGER */,
    NNID_ITEM  T_ID NOT NULL /* T_ID = INTEGER */
);

ALTER TABLE CUENTAS_NIIF_NORMA ADD CONSTRAINT PK_CUENTAS_NIIF_NORMA PRIMARY KEY (CUEN_COD, NNIF_ID, NNID_ITEM);

grant select, delete, insert, update on normas_niif to public;
grant select, delete, insert, update on normas_niif_detalle to public;
grant select, delete, insert, update on cuentas_niif_norma to public;

SET TERM ^ ;

create procedure CONCILIACION_PATRIMONIAL (
    ANO CHAR(4),
    MES INTEGER)
returns (
    CUENTA VARCHAR(20),
    nombre VARCHAR(60),
    CUENTANIIF VARCHAR(20),
    NOMBRENIIF VARCHAR(60),
    SALDO NUMERIC(18,2),
    SALDONIIF NUMERIC(18,2),
    DIFERENCIA NUMERIC(18,2),
    PORCENTAJE NUMERIC(9,2))
as
begin
FOR SELECT CUEN_COD, CUEN_NOM, CUEN_EQNIIF FROM CUENTAS WHERE CUEN_ACTIVA = 'S'
    INTO :CUENTA, :NOMBRE, :CUENTANIIF
    DO
    BEGIN
    if (CUENTANIIF IS NULL) then
        cuentaniif = CUENTA;
    SELECT CUEN_NOM FROM cuentas_niif WHERE CUEN_COD = :cuentaniif INTO :nombreniif;
    EXECUTE PROCEDURE saldo_cuenta_mes(CUENTA, :ANO, :mes,  'S') returning_values (:SALDO);
    EXECUTE PROCEDURE saldo_cuenta_mes_niif(cuentaniif, :ANO, :mes,  'S') returning_values (:SALDONIIF);
    DIFERENCIA = SALDONIIF - SALDO;
    if (SALDO <> 0) then
        PORCENTAJE = (DIFERENCIA / SALDO) * 100;
    else
        PORCENTAJE = 0;
    suspend;
    END
end^

SET TERM ; ^

/* Following GRANT statetements are generated automatically */

GRANT SELECT ON CUENTAS TO PROCEDURE CONCILIACION_PATRIMONIAL;
GRANT SELECT ON CUENTAS_NIIF TO PROCEDURE CONCILIACION_PATRIMONIAL;
GRANT EXECUTE ON PROCEDURE SALDO_CUENTA_MES TO PROCEDURE CONCILIACION_PATRIMONIAL;
GRANT EXECUTE ON PROCEDURE SALDO_CUENTA_MES_NIIF TO PROCEDURE CONCILIACION_PATRIMONIAL;

/* Existing privileges on this procedure */

GRANT EXECUTE ON PROCEDURE CONCILIACION_PATRIMONIAL TO PUBLIC;

/* 201408 */
/* medios magneticos 2013 */

ALTER TABLE MEDIOS_MAGNETICOS_DATOS
ADD MEMG_RETCREE T_MONTO;
ALTER TABLE MEDIOS_MAGNETICOS_DATOS
ADD MEMG_RASUMC T_MONTO;

ALTER TABLE MEDIOSMAG_ARCHIVOS
ADD MEDM_VALOR10 VARCHAR(30);
ALTER TABLE MEDIOSMAG_ARCHIVOS
ADD MEDM_VALOR11 VARCHAR(30);

INSERT INTO MEDIOSMAG_ARCHIVOS (MEDM_FORMATO, MEDM_NOMBRE, MEDM_VERSION, MEDM_VALOR1, MEDM_VALOR2, MEDM_VALOR3, MEDM_VALOR4, MEDM_VALOR5, MEDM_VALOR6, MEDM_VALOR7, MEDM_VALOR8, MEDM_VALOR9, MEDM_VALOR10, MEDM_VALOR11, MEDM_PROCEDIMIENTO, MEDM_ORDEN)
    VALUES (10019, '1001-V9 PAGOS O ABONOS EN CUENTA Y RETENCIONES PRACTICADAS', '09', 'PAGO DEDUCIBLE', 'PAGO NO DED', 'IVA DEDUCIBLE', 'IVA NO DED', 'RTEFTE', 'RTEFTE ASUMIDA', 'RTIVA R.COMUN', 'RTIVA ASUMIDA R.SIMP.', 'RTIVA NO DOM', 'RTCREE', 'RTCREE ASUMIDA', 'MM_1001_9', 1);
commit work;

ALTER TABLE MEDIOSMAG_CUENTAS
ADD MMCU_CTARCREE T_CTA_CONTABLE;
ALTER TABLE MEDIOSMAG_CUENTAS
ADD MMCU_CTARTCREEAS T_CTA_CONTABLE;

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
        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 ; ^

INSERT INTO CONFIGURA_MEDIOSMAG (COME_ITEM, COME_DESCRIPCION, COME_RESPUESTA, COME_CUENTA, COME_FORMATO, COME_MINIMO, COME_NATUR) VALUES (1001901, 'CONCEPTO PAGOS POR SALARIOS', '5001', NULL, 10019, 500000, 'N');
INSERT INTO CONFIGURA_MEDIOSMAG (COME_ITEM, COME_DESCRIPCION, COME_RESPUESTA, COME_CUENTA, COME_FORMATO, COME_MINIMO, COME_NATUR) VALUES (1001902, 'CONCEPTO PARA VIATICOS', '5055', NULL, 10019, 500000, 'N');
INSERT INTO CONFIGURA_MEDIOSMAG (COME_ITEM, COME_DESCRIPCION, COME_RESPUESTA, COME_CUENTA, COME_FORMATO, COME_MINIMO, COME_NATUR) VALUES (1001903, 'CONCEPTO PARA GASTOS DE REPRESENTACION', '5056', NULL, 10019, 500000, 'N');
INSERT INTO CONFIGURA_MEDIOSMAG (COME_ITEM, COME_DESCRIPCION, COME_RESPUESTA, COME_CUENTA, COME_FORMATO, COME_MINIMO, COME_NATUR) VALUES (1001904, 'CONCEPTO PAGOS PENSIONES', '5022', NULL, 10019, 500000, 'N');
INSERT INTO CONFIGURA_MEDIOSMAG (COME_ITEM, COME_DESCRIPCION, COME_RESPUESTA, COME_CUENTA, COME_FORMATO, COME_MINIMO, COME_NATUR) VALUES (1001905, 'CONCEPTO PAGOS HONORARIOS', '5002', NULL, 10019, 500000, 'N');
INSERT INTO CONFIGURA_MEDIOSMAG (COME_ITEM, COME_DESCRIPCION, COME_RESPUESTA, COME_CUENTA, COME_FORMATO, COME_MINIMO, COME_NATUR) VALUES (1001906, 'CONCEPTO PAGOS COMISIONES', '5003', NULL, 10019, 500000, 'N');
INSERT INTO CONFIGURA_MEDIOSMAG (COME_ITEM, COME_DESCRIPCION, COME_RESPUESTA, COME_CUENTA, COME_FORMATO, COME_MINIMO, COME_NATUR) VALUES (1001907, 'CONCEPTO PAGOS SERVICIOS', '5004', NULL, 10019, 500000, 'N');
INSERT INTO CONFIGURA_MEDIOSMAG (COME_ITEM, COME_DESCRIPCION, COME_RESPUESTA, COME_CUENTA, COME_FORMATO, COME_MINIMO, COME_NATUR) VALUES (1001908, 'CONCEPTO PAGOS ARRENDAMIENTOS', '5005', NULL, 10019, 500000, 'N');
INSERT INTO CONFIGURA_MEDIOSMAG (COME_ITEM, COME_DESCRIPCION, COME_RESPUESTA, COME_CUENTA, COME_FORMATO, COME_MINIMO, COME_NATUR) VALUES (1001909, 'CONCEPTO PAGOS INTERESES Y RENDIMIENTOS', '5006', NULL, 10019, 500000, 'N');
INSERT INTO CONFIGURA_MEDIOSMAG (COME_ITEM, COME_DESCRIPCION, COME_RESPUESTA, COME_CUENTA, COME_FORMATO, COME_MINIMO, COME_NATUR) VALUES (1001910, 'CONCEPTO PAGOS COMPRA ACTIVOS MOVILES', '5007', NULL, 10019, 500000, 'N');
INSERT INTO CONFIGURA_MEDIOSMAG (COME_ITEM, COME_DESCRIPCION, COME_RESPUESTA, COME_CUENTA, COME_FORMATO, COME_MINIMO, COME_NATUR) VALUES (1001911, 'CONCEPTO PAGOS COMPRA ACTIVOS FIJOS', '5008', NULL, 10019, 500000, 'N');
INSERT INTO CONFIGURA_MEDIOSMAG (COME_ITEM, COME_DESCRIPCION, COME_RESPUESTA, COME_CUENTA, COME_FORMATO, COME_MINIMO, COME_NATUR) VALUES (1001912, 'CONCEPTO PAGOS APORTES SENA,ICBF,CAJA COMPENSACION', '5010', NULL, 10019, 500000, 'N');
INSERT INTO CONFIGURA_MEDIOSMAG (COME_ITEM, COME_DESCRIPCION, COME_RESPUESTA, COME_CUENTA, COME_FORMATO, COME_MINIMO, COME_NATUR) VALUES (1001913, 'CONCEPTO PAGOS APORTES EPS-ISS-ARP', '5011', NULL, 10019, 500000, 'N');
INSERT INTO CONFIGURA_MEDIOSMAG (COME_ITEM, COME_DESCRIPCION, COME_RESPUESTA, COME_CUENTA, COME_FORMATO, COME_MINIMO, COME_NATUR) VALUES (1001914, 'CONCEPTO PAGOS APORTES FONDOS PENSIONES', '5012', NULL, 10019, 500000, 'N');
INSERT INTO CONFIGURA_MEDIOSMAG (COME_ITEM, COME_DESCRIPCION, COME_RESPUESTA, COME_CUENTA, COME_FORMATO, COME_MINIMO, COME_NATUR) VALUES (1001915, 'CONCEPTO PAGOS DONACIONES EN DINERO', '5013', '53952505', 10019, 500000, 'N');
INSERT INTO CONFIGURA_MEDIOSMAG (COME_ITEM, COME_DESCRIPCION, COME_RESPUESTA, COME_CUENTA, COME_FORMATO, COME_MINIMO, COME_NATUR) VALUES (1001916, 'CONCEPTO PAGOS DONACIONES EN OTROS ACTIVOS', '5014', '53952510', 10019, 500000, 'N');
INSERT INTO CONFIGURA_MEDIOSMAG (COME_ITEM, COME_DESCRIPCION, COME_RESPUESTA, COME_CUENTA, COME_FORMATO, COME_MINIMO, COME_NATUR) VALUES (1001917, 'CONCEPTO PAGOS IMPUESTOS', '5015', '1000000', 10019, 500000, 'N');
INSERT INTO CONFIGURA_MEDIOSMAG (COME_ITEM, COME_DESCRIPCION, COME_RESPUESTA, COME_CUENTA, COME_FORMATO, COME_MINIMO, COME_NATUR) VALUES (1001918, 'APORTES, TASAS Y CONTRIBUCIONES EFECTIVAMENTE PAGADAS', '5058', NULL, 10019, 500000, 'D');
INSERT INTO CONFIGURA_MEDIOSMAG (COME_ITEM, COME_DESCRIPCION, COME_RESPUESTA, COME_CUENTA, COME_FORMATO, COME_MINIMO, COME_NATUR) VALUES (1001919, 'REDENCION DE INVERSIONES (CAPITAL POR TITULOS DE CAPITALIZA)', '5060', NULL, 10019, 500000, 'N');
INSERT INTO CONFIGURA_MEDIOSMAG (COME_ITEM, COME_DESCRIPCION, COME_RESPUESTA, COME_CUENTA, COME_FORMATO, COME_MINIMO, COME_NATUR) VALUES (1001920, 'CONCEPTO OTROS COSTOS Y DEDUCCIONES', '5016', '1000000', 10019, 500000, 'N');
INSERT INTO CONFIGURA_MEDIOSMAG (COME_ITEM, COME_DESCRIPCION, COME_RESPUESTA, COME_CUENTA, COME_FORMATO, COME_MINIMO, COME_NATUR) VALUES (1001921, 'CONCEPTO DEDUCCION COMPRA DE ACTIVOS ART. 158-3', '5020', NULL, 10019, 500000, 'N');
INSERT INTO CONFIGURA_MEDIOSMAG (COME_ITEM, COME_DESCRIPCION, COME_RESPUESTA, COME_CUENTA, COME_FORMATO, COME_MINIMO, COME_NATUR) VALUES (1001922, 'CONCEPTO PAGOS SERVICIOS TECNICOS AL EXTERIOR', '5027', NULL, 10019, 500000, 'N');
INSERT INTO CONFIGURA_MEDIOSMAG (COME_ITEM, COME_DESCRIPCION, COME_RESPUESTA, COME_CUENTA, COME_FORMATO, COME_MINIMO, COME_NATUR) VALUES (1001923, 'CONCEPTO PAGOS ASISTENCIA TECNICA AL EXTERIOR', '5023', NULL, 10019, 500000, 'N');
INSERT INTO CONFIGURA_MEDIOSMAG (COME_ITEM, COME_DESCRIPCION, COME_RESPUESTA, COME_CUENTA, COME_FORMATO, COME_MINIMO, COME_NATUR) VALUES (1001924, 'CONCEPTO PAGOS POR MARCAS AL EXTERIOR', '5024', NULL, 10019, 500000, 'N');
INSERT INTO CONFIGURA_MEDIOSMAG (COME_ITEM, COME_DESCRIPCION, COME_RESPUESTA, COME_CUENTA, COME_FORMATO, COME_MINIMO, COME_NATUR) VALUES (1001925, 'CONCEPTO PAGOS POR PATENTES AL EXTERIOR', '5025', NULL, 10019, 500000, 'N');
INSERT INTO CONFIGURA_MEDIOSMAG (COME_ITEM, COME_DESCRIPCION, COME_RESPUESTA, COME_CUENTA, COME_FORMATO, COME_MINIMO, COME_NATUR) VALUES (1001926, 'CONCEPTO PAGOS POR REGALIAS AL EXTERIOR', '5026', NULL, 10019, 500000, 'N');
INSERT INTO CONFIGURA_MEDIOSMAG (COME_ITEM, COME_DESCRIPCION, COME_RESPUESTA, COME_CUENTA, COME_FORMATO, COME_MINIMO, COME_NATUR) VALUES (1001927, 'DEVOLUCIONES DE PAGOS Y RETENCIONES DE AÑOS ANTERIORES', '5028', NULL, 10019, 500000, 'N');
INSERT INTO CONFIGURA_MEDIOSMAG (COME_ITEM, COME_DESCRIPCION, COME_RESPUESTA, COME_CUENTA, COME_FORMATO, COME_MINIMO, COME_NATUR) VALUES (1001928, 'PAGOS DIFERIDOS Y GASTOS POR ANTICIPADO COMPRAS', '5029', NULL, 10019, 500000, 'D');
INSERT INTO CONFIGURA_MEDIOSMAG (COME_ITEM, COME_DESCRIPCION, COME_RESPUESTA, COME_CUENTA, COME_FORMATO, COME_MINIMO, COME_NATUR) VALUES (1001929, 'PAGOS DIFERIDOS Y GASTOS POR ANTICIPADO HONORARIOS', '5030', NULL, 10019, 500000, 'D');
INSERT INTO CONFIGURA_MEDIOSMAG (COME_ITEM, COME_DESCRIPCION, COME_RESPUESTA, COME_CUENTA, COME_FORMATO, COME_MINIMO, COME_NATUR) VALUES (1001930, 'PAGOS DIFERIDOS Y GASTOS POR ANTICIPADO COMISIONES', '5031', NULL, 10019, 500000, 'D');
INSERT INTO CONFIGURA_MEDIOSMAG (COME_ITEM, COME_DESCRIPCION, COME_RESPUESTA, COME_CUENTA, COME_FORMATO, COME_MINIMO, COME_NATUR) VALUES (1001931, 'PAGOS DIFERIDOS Y GASTOS POR ANTICIPADO SERVICIOS', '5032', NULL, 10019, 500000, 'D');
INSERT INTO CONFIGURA_MEDIOSMAG (COME_ITEM, COME_DESCRIPCION, COME_RESPUESTA, COME_CUENTA, COME_FORMATO, COME_MINIMO, COME_NATUR) VALUES (1001932, 'PAGOS DIFERIDOS Y GASTOS POR ANTICIPADO ARRIENDOS', '5033', NULL, 10019, 500000, 'D');
INSERT INTO CONFIGURA_MEDIOSMAG (COME_ITEM, COME_DESCRIPCION, COME_RESPUESTA, COME_CUENTA, COME_FORMATO, COME_MINIMO, COME_NATUR) VALUES (1001933, 'PAGOS DIFERIDOS Y GASTOS POR ANTICIPADO RENDIMIENTOS', '5034', NULL, 10019, 500000, 'D');
INSERT INTO CONFIGURA_MEDIOSMAG (COME_ITEM, COME_DESCRIPCION, COME_RESPUESTA, COME_CUENTA, COME_FORMATO, COME_MINIMO, COME_NATUR) VALUES (1001934, 'PAGOS DIFERIDOS Y GASTOS POR ANTICIPADO OTROS CONCEPTOS', '5035', NULL, 10019, 500000, 'D');
INSERT INTO CONFIGURA_MEDIOSMAG (COME_ITEM, COME_DESCRIPCION, COME_RESPUESTA, COME_CUENTA, COME_FORMATO, COME_MINIMO, COME_NATUR) VALUES (1001935, 'CONCEPTO AMORTIZACION PAGOS DIFERIDOS', '5019', NULL, 10019, 500000, 'C');
INSERT INTO CONFIGURA_MEDIOSMAG (COME_ITEM, COME_DESCRIPCION, COME_RESPUESTA, COME_CUENTA, COME_FORMATO, COME_MINIMO, COME_NATUR) VALUES (1001936, 'AMORTIZACION PAGOS DIFERIDOS RELATIVOS IMP. PATRIMONIO', '5057', NULL, 10019, 500000, 'C');
INSERT INTO CONFIGURA_MEDIOSMAG (COME_ITEM, COME_DESCRIPCION, COME_RESPUESTA, COME_CUENTA, COME_FORMATO, COME_MINIMO, COME_NATUR) VALUES (1001937, 'INVERSIONES CONTROL MEJORAMIENTO MEDIO AMBIENTE COMPRAS', '5036', NULL, 10019, 500000, 'D');
INSERT INTO CONFIGURA_MEDIOSMAG (COME_ITEM, COME_DESCRIPCION, COME_RESPUESTA, COME_CUENTA, COME_FORMATO, COME_MINIMO, COME_NATUR) VALUES (1001938, 'INVERSIONES CONTROL MEJORAMIENTO MEDIO AMBIENTE HONORARIOS', '5037', NULL, 10019, 500000, 'D');
INSERT INTO CONFIGURA_MEDIOSMAG (COME_ITEM, COME_DESCRIPCION, COME_RESPUESTA, COME_CUENTA, COME_FORMATO, COME_MINIMO, COME_NATUR) VALUES (1001939, 'INVERSIONES CONTROL MEJORAMIENTO MEDIO AMBIENTE COMISIONES', '5038', NULL, 10019, 500000, 'D');
INSERT INTO CONFIGURA_MEDIOSMAG (COME_ITEM, COME_DESCRIPCION, COME_RESPUESTA, COME_CUENTA, COME_FORMATO, COME_MINIMO, COME_NATUR) VALUES (1001940, 'INVERSIONES CONTROL MEJORAMIENTO MEDIO AMBIENTE SERVICIOS', '5039', NULL, 10019, 500000, 'D');
INSERT INTO CONFIGURA_MEDIOSMAG (COME_ITEM, COME_DESCRIPCION, COME_RESPUESTA, COME_CUENTA, COME_FORMATO, COME_MINIMO, COME_NATUR) VALUES (1001941, 'INVERSIONES CONTROL MEJORAMIENTO MEDIO AMBIENTE ARRIENDOS', '5040', NULL, 10019, 500000, 'D');
INSERT INTO CONFIGURA_MEDIOSMAG (COME_ITEM, COME_DESCRIPCION, COME_RESPUESTA, COME_CUENTA, COME_FORMATO, COME_MINIMO, COME_NATUR) VALUES (1001942, 'INVERSIONES CONTROL MEJORAMIENTO MEDIO AMBIENTE RENDIMIENTOS', '5041', NULL, 10019, 500000, 'D');
INSERT INTO CONFIGURA_MEDIOSMAG (COME_ITEM, COME_DESCRIPCION, COME_RESPUESTA, COME_CUENTA, COME_FORMATO, COME_MINIMO, COME_NATUR) VALUES (1001943, 'INVERSIONES CONTROL MEJORAMIENTO MEDIO AMBIENTE OTROS CONC', '5042', NULL, 10019, 500000, 'D');
INSERT INTO CONFIGURA_MEDIOSMAG (COME_ITEM, COME_DESCRIPCION, COME_RESPUESTA, COME_CUENTA, COME_FORMATO, COME_MINIMO, COME_NATUR) VALUES (1001944, 'DIVIDENDOS O PARTICIPACIONES EXIGIBLES EN EL ANO FISCAL', '5043', NULL, 10019, 500000, 'D');
INSERT INTO CONFIGURA_MEDIOSMAG (COME_ITEM, COME_DESCRIPCION, COME_RESPUESTA, COME_CUENTA, COME_FORMATO, COME_MINIMO, COME_NATUR) VALUES (1001945, 'LOTERIAS, RIFAS O APUESTAS', '5044', NULL, 10019, 500000, 'D');
INSERT INTO CONFIGURA_MEDIOSMAG (COME_ITEM, COME_DESCRIPCION, COME_RESPUESTA, COME_CUENTA, COME_FORMATO, COME_MINIMO, COME_NATUR) VALUES (1001946, 'RETENCION SOBRE INGRESOS DE TARJETAS DEBITO CREDITO', '5045', NULL, 10019, 500000, 'D');
INSERT INTO CONFIGURA_MEDIOSMAG (COME_ITEM, COME_DESCRIPCION, COME_RESPUESTA, COME_CUENTA, COME_FORMATO, COME_MINIMO, COME_NATUR) VALUES (1001947, 'ENAJENACION DE ACTIVOS FIJOS A PERS. NATURALES', '5046', NULL, 10019, 500000, 'D');
INSERT INTO CONFIGURA_MEDIOSMAG (COME_ITEM, COME_DESCRIPCION, COME_RESPUESTA, COME_CUENTA, COME_FORMATO, COME_MINIMO, COME_NATUR) VALUES (1001948, 'PAGO COOPERADOS FONDO PROTECCION DE APORTES', '5059', NULL, 10019, 500000, 'D');
INSERT INTO CONFIGURA_MEDIOSMAG (COME_ITEM, COME_DESCRIPCION, COME_RESPUESTA, COME_CUENTA, COME_FORMATO, COME_MINIMO, COME_NATUR) VALUES (1001949, 'AUTORRETENCIONES POR VENTAS', '5049', NULL, 10019, 500000, 'D');
INSERT INTO CONFIGURA_MEDIOSMAG (COME_ITEM, COME_DESCRIPCION, COME_RESPUESTA, COME_CUENTA, COME_FORMATO, COME_MINIMO, COME_NATUR) VALUES (1001950, 'AUTORRETENCIONES POR SERVICIOS', '5050', NULL, 10019, 500000, 'D');
INSERT INTO CONFIGURA_MEDIOSMAG (COME_ITEM, COME_DESCRIPCION, COME_RESPUESTA, COME_CUENTA, COME_FORMATO, COME_MINIMO, COME_NATUR) VALUES (1001951, 'AUTORRETENCIONES POR RENDIMIENTOS', '5051', NULL, 10019, 500000, 'D');
INSERT INTO CONFIGURA_MEDIOSMAG (COME_ITEM, COME_DESCRIPCION, COME_RESPUESTA, COME_CUENTA, COME_FORMATO, COME_MINIMO, COME_NATUR) VALUES (1001952, 'AUTORRETENCIONES POR OTROS CONCEPTOS', '5052', NULL, 10019, 500000, 'D');
INSERT INTO CONFIGURA_MEDIOSMAG (COME_ITEM, COME_DESCRIPCION, COME_RESPUESTA, COME_CUENTA, COME_FORMATO, COME_MINIMO, COME_NATUR) VALUES (1001953, 'RETENCIONES EFECTUADAS A TITULO DE TIMBRE', '5053', NULL, 10019, 500000, 'D');
INSERT INTO CONFIGURA_MEDIOSMAG (COME_ITEM, COME_DESCRIPCION, COME_RESPUESTA, COME_CUENTA, COME_FORMATO, COME_MINIMO, COME_NATUR) VALUES (1001954, 'DEVOLUCION RETENCIONES A TITULO DE TIMBRE', '5054', NULL, 10019, 500000, 'D');
INSERT INTO CONFIGURA_MEDIOSMAG (COME_ITEM, COME_DESCRIPCION, COME_RESPUESTA, COME_CUENTA, COME_FORMATO, COME_MINIMO, COME_NATUR) VALUES (1001962, 'AUTORETENCIONES CREE', '5062', NULL, 10019, 500000, 'D');
COMMIT WORK;


UPDATE CONFIGURA_MEDIOSMAG
SET COME_DESCRIPCION = 'RETENCIONES QUE LE PRACTICARON POR SALARIOS',
    COME_RESPUESTA = '1301'
WHERE (COME_ITEM = 41);


UPDATE CONFIGURA_MEDIOSMAG
SET COME_DESCRIPCION = 'RETENCIONES QUE LE PRACTICARON POR VENTAS',
    COME_RESPUESTA = '1302'
WHERE (COME_ITEM = 42);


UPDATE CONFIGURA_MEDIOSMAG
SET COME_DESCRIPCION = 'RETENCIONES QUE LE PRACTICARON POR SERVICIOS',
    COME_RESPUESTA = '1303'
WHERE (COME_ITEM = 43);


UPDATE CONFIGURA_MEDIOSMAG
SET COME_DESCRIPCION = 'RETENCIONES QUE LE PRACTICARON POR HONORARIOS',
    COME_RESPUESTA = '1304'
WHERE (COME_ITEM = 44);


UPDATE CONFIGURA_MEDIOSMAG
SET COME_DESCRIPCION = 'RETENCIONES QUE LE PRACTICARON POR COMISIONES',
    COME_RESPUESTA = '1305'
WHERE (COME_ITEM = 45);


UPDATE CONFIGURA_MEDIOSMAG
SET COME_DESCRIPCION = 'RETENCIONES QUE LE PRACTICARON POR RENDIMIENTOS',
    COME_RESPUESTA = '1306'
WHERE (COME_ITEM = 46);


UPDATE CONFIGURA_MEDIOSMAG
SET COME_DESCRIPCION = 'RETENCIONES QUE LE PRACTICARON POR ARRENDAMIENTOS',
    COME_RESPUESTA = '1307'
WHERE (COME_ITEM = 47);


UPDATE CONFIGURA_MEDIOSMAG
SET COME_DESCRIPCION = 'RETENCIONES QUE LE PRACTICARON POR OTRAS RETENCIONE',
    COME_RESPUESTA = '1308'
WHERE (COME_ITEM = 48);


UPDATE CONFIGURA_MEDIOSMAG
SET COME_DESCRIPCION = 'RETENCIONES DE IVA QUE LE PRACTICARON',
    COME_RESPUESTA = '1309'
WHERE (COME_ITEM = 49);


INSERT INTO CONFIGURA_MEDIOSMAG (COME_ITEM, COME_DESCRIPCION, COME_RESPUESTA, COME_CUENTA, COME_FORMATO, COME_MINIMO, COME_NATUR) VALUES (1003710, 'RETENCIONES POR DIVIDENDOS Y PARTICIPACIONES', '1310', NULL, 10037, 0, NULL);
INSERT INTO CONFIGURA_MEDIOSMAG (COME_ITEM, COME_DESCRIPCION, COME_RESPUESTA, COME_CUENTA, COME_FORMATO, COME_MINIMO, COME_NATUR) VALUES (1003711, 'RETENCION POR ENAJENACION DE ACTIVOS ANTE OFICINAS TRANSITO', '1311', NULL, 10037, 0, NULL);
INSERT INTO CONFIGURA_MEDIOSMAG (COME_ITEM, COME_DESCRIPCION, COME_RESPUESTA, COME_CUENTA, COME_FORMATO, COME_MINIMO, COME_NATUR) VALUES (1003712, 'RETENCION POR INGRESOS DE TARJETAS DEBITO/CREDITO', '1312', NULL, 10037, 0, NULL);
INSERT INTO CONFIGURA_MEDIOSMAG (COME_ITEM, COME_DESCRIPCION, COME_RESPUESTA, COME_CUENTA, COME_FORMATO, COME_MINIMO, COME_NATUR) VALUES (1003713, 'RETENCION POR LOTERIAS Y RIFAS', '1313', NULL, 10037, 0, NULL);
INSERT INTO CONFIGURA_MEDIOSMAG (COME_ITEM, COME_DESCRIPCION, COME_RESPUESTA, COME_CUENTA, COME_FORMATO, COME_MINIMO, COME_NATUR) VALUES (1003714, 'RETENCION POR IMPUESTO DE TIMBRE', '1314', NULL, 10037, 0, NULL);
INSERT INTO CONFIGURA_MEDIOSMAG (COME_ITEM, COME_DESCRIPCION, COME_RESPUESTA, COME_CUENTA, COME_FORMATO, COME_MINIMO, COME_NATUR) VALUES (1003715, 'RETENCION POR IMPUESTO PARA LA EQUIDAD CREE', '1300', NULL, 10037, 0, NULL);
COMMIT WORK;


UPDATE CONFIGURA_MEDIOSMAG
SET COME_DESCRIPCION = 'INGRESOS OPERACIONALES',
    COME_RESPUESTA = '4001'
WHERE (COME_ITEM = 100781);


UPDATE CONFIGURA_MEDIOSMAG
SET COME_DESCRIPCION = 'INGRESOS NO OPERACIONALES',
    COME_RESPUESTA = '4002'
WHERE (COME_ITEM = 100782);


UPDATE CONFIGURA_MEDIOSMAG
SET COME_DESCRIPCION = 'INGRESOS POR INTERESES Y RENDIMIENTOS FINANCIEROS',
    COME_RESPUESTA = '4003'
WHERE (COME_ITEM = 100783);

INSERT INTO CONFIGURA_MEDIOSMAG (COME_ITEM, COME_DESCRIPCION, COME_RESPUESTA, COME_CUENTA, COME_FORMATO, COME_MINIMO, COME_NATUR) VALUES (100784, 'INGRESOS POR INTERESES DE CREDITOS HIPOTECARIOS', '4004', NULL, 10078, 1000000, NULL);
COMMIT WORK;


INSERT INTO MEDIOSMAG_ARCHIVOS (MEDM_FORMATO, MEDM_NOMBRE, MEDM_VERSION, MEDM_VALOR1, MEDM_VALOR2, MEDM_VALOR3, MEDM_VALOR4, MEDM_VALOR5, MEDM_VALOR6, MEDM_VALOR7, MEDM_VALOR8, MEDM_VALOR9, MEDM_PROCEDIMIENTO, MEDM_ORDEN, MEDM_VALOR10, MEDM_VALOR11) VALUES (10068, '1006-V8 IMPUESTO A LAS VENTAS GENERADO', '08', 'IVA GENERADO', 'IVA RECUPERADO', 'IMP NAL CONSUMO', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
COMMIT WORK;

INSERT INTO CONFIGURA_MEDIOSMAG (COME_ITEM, COME_DESCRIPCION, COME_RESPUESTA, COME_CUENTA, COME_FORMATO, COME_MINIMO, COME_NATUR) VALUES (100681, '1006v8 - IMPUESTO A LAS VENTAS GENERADO', '', NULL, 10068, 137900, NULL);
COMMIT WORK;

SET TERM ^ ;

create or alter procedure MM_10068 (
    INICIO char(8),
    FINAL char(8))
AS
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 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 ; ^

/* 201409 */
/* NIVEL EN CONCILIACION PATRIMONIAL */
SET TERM ^ ;

CREATE OR ALTER procedure CONCILIACION_PATRIMONIAL (
    ANO char(4),
    MES integer,
    NIVSAL INTEGER)
returns (
    CUENTA varchar(20),
    NOMBRE varchar(60),
    CUENTANIIF varchar(20),
    NOMBRENIIF varchar(60),
    SALDO numeric(18,2),
    SALDONIIF numeric(18,2),
    DIFERENCIA numeric(18,2),
    PORCENTAJE numeric(9,2),
    NIVEL integer)
AS
begin
FOR SELECT CUEN_COD, CUEN_NOM, CUEN_EQNIIF FROM CUENTAS WHERE CUEN_ACTIVA = 'S'
    INTO :CUENTA, :NOMBRE, :CUENTANIIF
    DO
    BEGIN
    EXECUTE PROCEDURE VALIDE_ESTRUCTURA (CUENTA) RETURNING_VALUES (:NIVEL);
    if (NIVEL <= NIVSAL) then
        BEGIN
        if (CUENTANIIF IS NULL) then
            cuentaniif = CUENTA;
        SELECT CUEN_NOM FROM cuentas_niif WHERE CUEN_COD = :cuentaniif INTO :nombreniif;
        EXECUTE PROCEDURE saldo_cuenta_mes(CUENTA, :ANO, :mes,  'S') returning_values (:SALDO);
        EXECUTE PROCEDURE saldo_cuenta_mes_niif(cuentaniif, :ANO, :mes,  'S') returning_values (:SALDONIIF);
        DIFERENCIA = SALDONIIF - SALDO;
        if (SALDO <> 0) then
            PORCENTAJE = (DIFERENCIA / SALDO) * 100;
        else
            PORCENTAJE = 0;
        suspend;
        END
    END
end^

SET TERM ; ^

/* 201410 */
CREATE TABLE TAXONOMIA (
    TAXO_ID T_ID NOT NULL,
    TAXO_NOMBRE VARCHAR(100));

ALTER TABLE TAXONOMIA
ADD CONSTRAINT PK_TAXONOMIA
PRIMARY KEY (TAXO_ID);

CREATE TABLE TAXONOMIA_ENCABEZA (
    TAXO_ID T_ID NOT NULL,
    TAXE_ID T_ID NOT NULL,
    TAXE_NOMBRE VARCHAR(100));

ALTER TABLE TAXONOMIA_ENCABEZA
ADD CONSTRAINT PK_TAXONOMIA_ENCABEZA
PRIMARY KEY (TAXO_ID,TAXE_ID);

CREATE TABLE TAXONOMIA_DETALLE (
    TAXO_ID T_ID NOT NULL,
    TAXE_ID T_ID NOT NULL,
    TAXD_ITEM T_ID NOT NULL,
    TAXD_NOMBRE VARCHAR(255),
    TAXD_TIPO SMALLINT,
    TAXD_NIVEL SMALLINT,
    TAXD_NORMA VARCHAR(255));

ALTER TABLE TAXONOMIA_DETALLE
ADD CONSTRAINT PK_TAXONOMIA_DETALLE
PRIMARY KEY (TAXO_ID,TAXE_ID,TAXD_ITEM);

ALTER TABLE TAXONOMIA_ENCABEZA
ADD CONSTRAINT FK_TAXONOMIA_ENCABEZA_1
FOREIGN KEY (TAXO_ID)
REFERENCES TAXONOMIA(TAXO_ID)
ON DELETE CASCADE
ON UPDATE CASCADE;

ALTER TABLE TAXONOMIA_DETALLE
ADD CONSTRAINT FK_TAXONOMIA_DETALLE_1
FOREIGN KEY (TAXO_ID,TAXE_ID)
REFERENCES TAXONOMIA_ENCABEZA(TAXO_ID,TAXE_ID)
ON DELETE CASCADE
ON UPDATE CASCADE;

INSERT INTO TAXONOMIA (TAXO_ID, TAXO_NOMBRE) VALUES (1, 'TAXONOMIA IFRS PARA PYMES 2013');

INSERT INTO TAXONOMIA_ENCABEZA (TAXO_ID, TAXE_ID, TAXE_NOMBRE) VALUES (1, 110000, 'Información general sobre estados financieros');
INSERT INTO TAXONOMIA_ENCABEZA (TAXO_ID, TAXE_ID, TAXE_NOMBRE) VALUES (1, 210000, 'Estado de situación financiera, corriente/no corriente');
INSERT INTO TAXONOMIA_ENCABEZA (TAXO_ID, TAXE_ID, TAXE_NOMBRE) VALUES (1, 220000, 'Estado de situación financiera, orden de liquidabilidad');
INSERT INTO TAXONOMIA_ENCABEZA (TAXO_ID, TAXE_ID, TAXE_NOMBRE) VALUES (1, 310000, 'Estado de resultados, por función de gasto');
INSERT INTO TAXONOMIA_ENCABEZA (TAXO_ID, TAXE_ID, TAXE_NOMBRE) VALUES (1, 320000, 'Estado de resultados, por naturaleza de gasto');
INSERT INTO TAXONOMIA_ENCABEZA (TAXO_ID, TAXE_ID, TAXE_NOMBRE) VALUES (1, 410000, 'Estado del resultado integral, componentes ORI presentados netos de impuestos');
INSERT INTO TAXONOMIA_ENCABEZA (TAXO_ID, TAXE_ID, TAXE_NOMBRE) VALUES (1, 420000, 'Estado del resultado integral, componentes ORI presentados antes de impuestos');
INSERT INTO TAXONOMIA_ENCABEZA (TAXO_ID, TAXE_ID, TAXE_NOMBRE) VALUES (1, 510000, 'Estado de flujos de efectivo, método directo');
INSERT INTO TAXONOMIA_ENCABEZA (TAXO_ID, TAXE_ID, TAXE_NOMBRE) VALUES (1, 520000, 'Estado de flujos de efectivo, método indirecto');
INSERT INTO TAXONOMIA_ENCABEZA (TAXO_ID, TAXE_ID, TAXE_NOMBRE) VALUES (1, 610000, 'Estado de cambios en el patrimonio');
INSERT INTO TAXONOMIA_ENCABEZA (TAXO_ID, TAXE_ID, TAXE_NOMBRE) VALUES (1, 650000, 'Estado de resultados y ganancias acumuladas, información a revelar');
INSERT INTO TAXONOMIA_ENCABEZA (TAXO_ID, TAXE_ID, TAXE_NOMBRE) VALUES (1, 800100, 'Notas - Subclasificaciones de activos, pasivos y patrimonios');
INSERT INTO TAXONOMIA_ENCABEZA (TAXO_ID, TAXE_ID, TAXE_NOMBRE) VALUES (1, 800200, 'Notas - Análisis de ingresos y gastos');
INSERT INTO TAXONOMIA_ENCABEZA (TAXO_ID, TAXE_ID, TAXE_NOMBRE) VALUES (1, 810000, 'Notas - Información de la entidad y declaración de cumplimiento con las NIIF');
INSERT INTO TAXONOMIA_ENCABEZA (TAXO_ID, TAXE_ID, TAXE_NOMBRE) VALUES (1, 811000, 'Notas - Políticas contables, cambios en las estimaciones contables y errores');
INSERT INTO TAXONOMIA_ENCABEZA (TAXO_ID, TAXE_ID, TAXE_NOMBRE) VALUES (1, 815000, 'Notas - Hechos ocurridos después del periodo sobre el que se informa');
INSERT INTO TAXONOMIA_ENCABEZA (TAXO_ID, TAXE_ID, TAXE_NOMBRE) VALUES (1, 816000, 'Notas - Información hiperinflacionaria');
INSERT INTO TAXONOMIA_ENCABEZA (TAXO_ID, TAXE_ID, TAXE_NOMBRE) VALUES (1, 817000, 'Notas - Combinaciones de negocios');
INSERT INTO TAXONOMIA_ENCABEZA (TAXO_ID, TAXE_ID, TAXE_NOMBRE) VALUES (1, 818000, 'Notas - Partes relacionadas');
INSERT INTO TAXONOMIA_ENCABEZA (TAXO_ID, TAXE_ID, TAXE_NOMBRE) VALUES (1, 819100, 'Notas - Adopción de las NIIF por primera vez');
INSERT INTO TAXONOMIA_ENCABEZA (TAXO_ID, TAXE_ID, TAXE_NOMBRE) VALUES (1, 822100, 'Notas - Propiedades, planta y equipo');
INSERT INTO TAXONOMIA_ENCABEZA (TAXO_ID, TAXE_ID, TAXE_NOMBRE) VALUES (1, 822390, 'Notas - Instrumentos financieros');
INSERT INTO TAXONOMIA_ENCABEZA (TAXO_ID, TAXE_ID, TAXE_NOMBRE) VALUES (1, 823180, 'Notas - Activos intangibles');
INSERT INTO TAXONOMIA_ENCABEZA (TAXO_ID, TAXE_ID, TAXE_NOMBRE) VALUES (1, 824180, 'Notas - Agricultura');
INSERT INTO TAXONOMIA_ENCABEZA (TAXO_ID, TAXE_ID, TAXE_NOMBRE) VALUES (1, 825100, 'Notas - Propiedades de inversión');
INSERT INTO TAXONOMIA_ENCABEZA (TAXO_ID, TAXE_ID, TAXE_NOMBRE) VALUES (1, 825480, 'Notas - Estados financieros consolidados, combinados y separados');
INSERT INTO TAXONOMIA_ENCABEZA (TAXO_ID, TAXE_ID, TAXE_NOMBRE) VALUES (1, 825900, 'Notas - Activos no corrientes o grupo de activos mantenidos para la venta');
INSERT INTO TAXONOMIA_ENCABEZA (TAXO_ID, TAXE_ID, TAXE_NOMBRE) VALUES (1, 826380, 'Notas - Inventarios');
INSERT INTO TAXONOMIA_ENCABEZA (TAXO_ID, TAXE_ID, TAXE_NOMBRE) VALUES (1, 827570, 'Notas - Otras provisiones, pasivos contingentes y activos contingentes');
INSERT INTO TAXONOMIA_ENCABEZA (TAXO_ID, TAXE_ID, TAXE_NOMBRE) VALUES (1, 831110, 'Notas - Ingresos de actividades ordinarias');
INSERT INTO TAXONOMIA_ENCABEZA (TAXO_ID, TAXE_ID, TAXE_NOMBRE) VALUES (1, 831400, 'Notas - Subvenciones del gobierno');
INSERT INTO TAXONOMIA_ENCABEZA (TAXO_ID, TAXE_ID, TAXE_NOMBRE) VALUES (1, 831710, 'Notas - Contratos de construcción');
INSERT INTO TAXONOMIA_ENCABEZA (TAXO_ID, TAXE_ID, TAXE_NOMBRE) VALUES (1, 832410, 'Notas - Deterioro del valor de activos');
INSERT INTO TAXONOMIA_ENCABEZA (TAXO_ID, TAXE_ID, TAXE_NOMBRE) VALUES (1, 832600, 'Notas - Arrendamientos');
INSERT INTO TAXONOMIA_ENCABEZA (TAXO_ID, TAXE_ID, TAXE_NOMBRE) VALUES (1, 834120, 'Notas - Acuerdos con pagos basados en acciones');
INSERT INTO TAXONOMIA_ENCABEZA (TAXO_ID, TAXE_ID, TAXE_NOMBRE) VALUES (1, 834480, 'Notas - Beneficios a los empleados');
INSERT INTO TAXONOMIA_ENCABEZA (TAXO_ID, TAXE_ID, TAXE_NOMBRE) VALUES (1, 835110, 'Notas - Impuestos a las ganancias');
INSERT INTO TAXONOMIA_ENCABEZA (TAXO_ID, TAXE_ID, TAXE_NOMBRE) VALUES (1, 842000, 'Notas - Efectos de las variaciones en las tasas de cambio de la moneda extranjera');
INSERT INTO TAXONOMIA_ENCABEZA (TAXO_ID, TAXE_ID, TAXE_NOMBRE) VALUES (1, 851100, 'Notas - Estado de flujos de efectivo');
INSERT INTO TAXONOMIA_ENCABEZA (TAXO_ID, TAXE_ID, TAXE_NOMBRE) VALUES (1, 861200, 'Notas - Capital en acciones, reservas y otras participaciones en el patrimonio');
INSERT INTO TAXONOMIA_ENCABEZA (TAXO_ID, TAXE_ID, TAXE_NOMBRE) VALUES (1, 901000, 'Eje - Aplicación retroactiva y reexpresión retroactiva');
INSERT INTO TAXONOMIA_ENCABEZA (TAXO_ID, TAXE_ID, TAXE_NOMBRE) VALUES (1, 901500, 'Eje - Fecha de creación');
INSERT INTO TAXONOMIA_ENCABEZA (TAXO_ID, TAXE_ID, TAXE_NOMBRE) VALUES (1, 913000, 'Eje - Estados financieros consolidados, combinados y separados');

INSERT INTO TAXONOMIA_DETALLE (TAXO_ID, TAXE_ID, TAXD_ITEM, TAXD_NOMBRE, TAXD_TIPO, TAXD_NIVEL, TAXD_NORMA) VALUES (1, 110000, 1, 'nformación a revelar sobre información general sobre los estados financieros', 4, 1, 'IFRS for SME 3: Identificación de los estados financieros');
INSERT INTO TAXONOMIA_DETALLE (TAXO_ID, TAXE_ID, TAXD_ITEM, TAXD_NOMBRE, TAXD_TIPO, TAXD_NIVEL, TAXD_NORMA) VALUES (1, 110000, 2, 'Nombre de la entidad que informa u otras formas de identificación', 1, 2, 'IFRS for SME 3.23a');
INSERT INTO TAXONOMIA_DETALLE (TAXO_ID, TAXE_ID, TAXD_ITEM, TAXD_NOMBRE, TAXD_TIPO, TAXD_NIVEL, TAXD_NORMA) VALUES (1, 110000, 3, 'Explicación del cambio en el nombre de la entidad que informa u otras formas de identificación desde el final del periodo sobre el que se informa precedente', 1, 2, 'IFRS for SME 3.23a');
INSERT INTO TAXONOMIA_DETALLE (TAXO_ID, TAXE_ID, TAXD_ITEM, TAXD_NOMBRE, TAXD_TIPO, TAXD_NIVEL, TAXD_NORMA) VALUES (1, 110000, 4, 'Descripción de la naturaleza de los estados financieros', 1, 2, 'IFRS for SME 3.23b,IFRS for SME 9.23a, IFRS for SME 9.27a, IFRS for SME 9.30a');
INSERT INTO TAXONOMIA_DETALLE (TAXO_ID, TAXE_ID, TAXD_ITEM, TAXD_NOMBRE, TAXD_TIPO, TAXD_NIVEL, TAXD_NORMA) VALUES (1, 110000, 5, 'Fecha de cierre del periodo sobre el que se informa', 2, 2, 'IFRS for SME 3.23c');
INSERT INTO TAXONOMIA_DETALLE (TAXO_ID, TAXE_ID, TAXD_ITEM, TAXD_NOMBRE, TAXD_TIPO, TAXD_NIVEL, TAXD_NORMA) VALUES (1, 110000, 6, 'Periodo cubierto por los estados financieros', 1, 2, 'IFRS for SME 3.23c');
INSERT INTO TAXONOMIA_DETALLE (TAXO_ID, TAXE_ID, TAXD_ITEM, TAXD_NOMBRE, TAXD_TIPO, TAXD_NIVEL, TAXD_NORMA) VALUES (1, 110000, 7, 'Descripción de la moneda de presentación', 1, 2, 'IFRS for SME 3.23d, IFRS for SME 30.26');
INSERT INTO TAXONOMIA_DETALLE (TAXO_ID, TAXE_ID, TAXD_ITEM, TAXD_NOMBRE, TAXD_TIPO, TAXD_NIVEL, TAXD_NORMA) VALUES (1, 110000, 8, 'Grado de redondeo utilizado en los estados financieros', 1, 2, 'IFRS for SME 3.23e');
INSERT INTO TAXONOMIA_DETALLE (TAXO_ID, TAXE_ID, TAXD_ITEM, TAXD_NOMBRE, TAXD_TIPO, TAXD_NIVEL, TAXD_NORMA) VALUES (1, 210000, 1, 'Estado de situación financiera', 3, 1, NULL);
INSERT INTO TAXONOMIA_DETALLE (TAXO_ID, TAXE_ID, TAXD_ITEM, TAXD_NOMBRE, TAXD_TIPO, TAXD_NIVEL, TAXD_NORMA) VALUES (1, 210000, 2, 'Activos', 3, 2, NULL);
INSERT INTO TAXONOMIA_DETALLE (TAXO_ID, TAXE_ID, TAXD_ITEM, TAXD_NOMBRE, TAXD_TIPO, TAXD_NIVEL, TAXD_NORMA) VALUES (1, 210000, 3, 'Activos no corrientes', 3, 3, NULL);
INSERT INTO TAXONOMIA_DETALLE (TAXO_ID, TAXE_ID, TAXD_ITEM, TAXD_NOMBRE, TAXD_TIPO, TAXD_NIVEL, TAXD_NORMA) VALUES (1, 210000, 4, 'Propiedades, planta y equipo', 3, 4, 'IFRS for SME 17.31e, IFRS for SME 4.11a, IFRS for SME 4.2e');
INSERT INTO TAXONOMIA_DETALLE (TAXO_ID, TAXE_ID, TAXD_ITEM, TAXD_NOMBRE, TAXD_TIPO, TAXD_NIVEL, TAXD_NORMA) VALUES (1, 210000, 5, 'Propiedad de inversión', 3, 4, 'IFRS for SME 16.10e, IFRS for SME 4.2f');
INSERT INTO TAXONOMIA_DETALLE (TAXO_ID, TAXE_ID, TAXD_ITEM, TAXD_NOMBRE, TAXD_TIPO, TAXD_NIVEL, TAXD_NORMA) VALUES (1, 210000, 6, 'Plusvalía', 3, 4, 'IFRS for SME 4.3');
INSERT INTO TAXONOMIA_DETALLE (TAXO_ID, TAXE_ID, TAXD_ITEM, TAXD_NOMBRE, TAXD_TIPO, TAXD_NIVEL, TAXD_NORMA) VALUES (1, 210000, 7, 'Activos intangibles distintos de la plusvalía', 3, 4, 'IFRS for SME 18.27e, IFRS for SME 4.2g');
INSERT INTO TAXONOMIA_DETALLE (TAXO_ID, TAXE_ID, TAXD_ITEM, TAXD_NOMBRE, TAXD_TIPO, TAXD_NIVEL, TAXD_NORMA) VALUES (1, 210000, 8, 'Inversiones en asociadas', 3, 4, '');
INSERT INTO TAXONOMIA_DETALLE (TAXO_ID, TAXE_ID, TAXD_ITEM, TAXD_NOMBRE, TAXD_TIPO, TAXD_NIVEL, TAXD_NORMA) VALUES (1, 210000, 9, 'Inversiones en negocios conjuntos', 3, 4, '');
INSERT INTO TAXONOMIA_DETALLE (TAXO_ID, TAXE_ID, TAXD_ITEM, TAXD_NOMBRE, TAXD_TIPO, TAXD_NIVEL, TAXD_NORMA) VALUES (1, 210000, 10, 'Activos biológicos no corrientes, al costo menos depreciación acumulada y deterioro del valor', 3, 4, '');
INSERT INTO TAXONOMIA_DETALLE (TAXO_ID, TAXE_ID, TAXD_ITEM, TAXD_NOMBRE, TAXD_TIPO, TAXD_NIVEL, TAXD_NORMA) VALUES (1, 210000, 11, 'Activos biológicos no corrientes, al valor razonable', 3, 4, '');
INSERT INTO TAXONOMIA_DETALLE (TAXO_ID, TAXE_ID, TAXD_ITEM, TAXD_NOMBRE, TAXD_TIPO, TAXD_NIVEL, TAXD_NORMA) VALUES (1, 210000, 12, 'Cuentas comerciales por cobrar y otras cuentas por cobrar no corrientes', 3, 4, '');
INSERT INTO TAXONOMIA_DETALLE (TAXO_ID, TAXE_ID, TAXD_ITEM, TAXD_NOMBRE, TAXD_TIPO, TAXD_NIVEL, TAXD_NORMA) VALUES (1, 210000, 13, 'Inventarios no corrientes', 3, 4, '');
INSERT INTO TAXONOMIA_DETALLE (TAXO_ID, TAXE_ID, TAXD_ITEM, TAXD_NOMBRE, TAXD_TIPO, TAXD_NIVEL, TAXD_NORMA) VALUES (1, 210000, 14, 'Activos por impuestos diferidos', 3, 4, '');
INSERT INTO TAXONOMIA_DETALLE (TAXO_ID, TAXE_ID, TAXD_ITEM, TAXD_NOMBRE, TAXD_TIPO, TAXD_NIVEL, TAXD_NORMA) VALUES (1, 210000, 15, 'Activos por impuestos corrientes, no corriente', 3, 4, '');
INSERT INTO TAXONOMIA_DETALLE (TAXO_ID, TAXE_ID, TAXD_ITEM, TAXD_NOMBRE, TAXD_TIPO, TAXD_NIVEL, TAXD_NORMA) VALUES (1, 210000, 16, 'Otros activos financieros no corrientes', 3, 4, '');
INSERT INTO TAXONOMIA_DETALLE (TAXO_ID, TAXE_ID, TAXD_ITEM, TAXD_NOMBRE, TAXD_TIPO, TAXD_NIVEL, TAXD_NORMA) VALUES (1, 210000, 17, 'Otros activos no financieros no corrientes', 3, 4, '');
INSERT INTO TAXONOMIA_DETALLE (TAXO_ID, TAXE_ID, TAXD_ITEM, TAXD_NOMBRE, TAXD_TIPO, TAXD_NIVEL, TAXD_NORMA) VALUES (1, 210000, 20, 'Activos corrientes', 3, 3, NULL);
INSERT INTO TAXONOMIA_DETALLE (TAXO_ID, TAXE_ID, TAXD_ITEM, TAXD_NOMBRE, TAXD_TIPO, TAXD_NIVEL, TAXD_NORMA) VALUES (1, 210000, 21, 'Inventarios corrientes', 3, 4, '');
commit work;

CREATE TABLE TAXONOMIA_CUENTAS (
    TAXO_ID T_ID NOT NULL,
    TAXE_ID T_ID NOT NULL,
    TAXD_ID T_ID NOT NULL,
    TAXC_ITEM T_ID NOT NULL,
    CUEN_COD T_CTA_CONTABLE,
    TAXC_TIPO SMALLINT);

ALTER TABLE TAXONOMIA_CUENTAS
ADD CONSTRAINT PK_TAXONOMIA_CUENTAS
PRIMARY KEY (TAXO_ID,TAXE_ID,TAXD_ID,TAXC_ITEM);

grant select, delete, insert, update on TAXONOMIA to PUBLIC;
grant select, delete, insert, update on taxonomia_encabeza to PUBLIC;
grant select, delete, insert, update on taxonomia_detalle to PUBLIC;
grant select, delete, insert, update on TAXONOMIA_CUENTAS to PUBLIC;

CREATE TABLE TAXONOMIA_INSTANCIA (
    TAIN_ID T_ID NOT NULL,
    TAXO_ID T_ID NOT NULL,
    TAXE_ID T_ID NOT NULL,
    TAXD_ID T_ID NOT NULL,
    MONTO T_MONTO);

ALTER TABLE TAXONOMIA_INSTANCIA
ADD CONSTRAINT PK_TAXONOMIA_INSTANCIA
PRIMARY KEY (TAIN_ID,TAXO_ID,TAXE_ID,TAXD_ID);

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

CREATE SEQUENCE ID_TAXINST;

ALTER TABLE TAXONOMIA_DETALLE
ADD TAXD_PADRE T_ID;

SET TERM ^ ;

CREATE OR ALTER procedure IMPR_TAXONOMIA (
    IDTAX integer,
    IDENC integer,
    FECHA char(8))
returns (
    TITULO varchar(100),
    ITEM integer,
    NIVEL integer,
    NOMBRE2 varchar(255),
    NOMBRE3 varchar(255),
    NOMBRE varchar(255),
    SALDO2 numeric(18,2),
    SALDO3 numeric(18,2),
    VALOR numeric(18,2))
AS
declare variable tipo integer;
declare variable saldo numeric(18,2);
declare variable INST INTEGER;
declare variable ITE3 INTEGER;
declare variable ITE2 INTEGER;
declare variable CUENTA VARCHAR(20);
begin
INST = gen_id(id_taxinst, 1);
SELECT TE.taxe_nombre FROM taxonomia_encabeza TE WHERE TAXO_ID = :idtax AND TAXE_ID = :idenc INTO :titulo;
/* LLENE EL NIVEL 4 */
for select d.taxd_item, d.taxd_nombre from taxonomia_detalle d
    where d.taxo_id = :idtax and d.taxe_id = :idenc and d.taxd_nivel = 4 into :item, :nombre
    do
    begin
    VALOR = 0;
    for select cuen_cod, taxc_tipo from taxonomia_cuentas where taxo_id = :idtax and taxe_id = :idenc and taxd_id = :item
        into :cuenta, :tipo
        do
        begin
        if (tipo = 1) then
            execute procedure saldo_cuenta_niif(:cuenta, :fecha) returning_values (:saldo);
        VALOR = VALOR + SALDO;
        end
    INSERT INTO taxonomia_instancia (TAIN_ID, TAXO_ID, TAXE_ID, TAXD_ID, MONTO)
        VALUES (:inst, :idtax, :idenc, :item, :VALOR);
    END
FOR SELECT d.taxd_nombre, d.taxd_item from taxonomia_detalle d
    where d.taxo_id = :idtax and d.taxe_id = :idenc and d.taxd_nivel = 2
    ORDER BY D.taxd_item INTO :nombre2, :ite2
    DO
    BEGIN
    SALDO2 = 0;
    FOR SELECT d.taxd_nombre, d.taxd_item from taxonomia_detalle d
        where d.taxo_id = :idtax and d.taxe_id = :idenc and d.taxd_nivel = 3 AND D.taxd_padre = :ite2
        ORDER BY D.taxd_item INTO :nombre3, :ite3
        DO
        BEGIN
        SALDO3 = 0;
        FOR SELECT D.taxd_item, d.taxd_nombre from taxonomia_detalle d
            where d.taxo_id = :idtax and d.taxe_id = :idenc and d.taxd_nivel = 4 AND D.taxd_padre = :ite3
            ORDER BY D.taxd_item INTO :item, :nombre
            DO
            BEGIN
            SELECT MONTO FROM taxonomia_instancia WHERE TAIN_ID = :inst AND taxo_id = :idtax and taxe_id = :idenc AND TAXD_ID = :ITEM INTO :valor;
            SALDO3 = SALDO3 + VALOR;
            NIVEL = 4;
            SUSPEND;
            END
        NOMBRE = NOMBRE3;
        VALOR = SALDO3;
        SALDO2 = SALDO2 + VALOR;
        ITEM = ITE3;
        NIVEL = 3;
        SUSPEND;
        END
    NOMBRE = NOMBRE2;
    VALOR = SALDO2;
    ITEM = ITE2;
    NIVEL = 2;
    SUSPEND;
    END
end^

SET TERM ; ^

GRANT EXECUTE ON PROCEDURE impr_taxonomia TO PUBLIC;

/* 201411 */
/* AUDITORIA EN CLIENTE_SUCURSALES */
INSERT INTO TIPO_DOCUMENTO (TIDO_COD, TIDO_NOMCORTO, TIDO_NOMLARGO, TIDO_MODULO, TIDO_INVE, TIDO_CART, TIDO_CXP, TIDO_CAJA, TIDO_BCOS, TIDO_NOM, TIDO_IMP) VALUES (152, 'SUCURCLI', 'REGISTRO SUCURSAL CLIENTE', '', 'N', 'N', 'N', 'N', 'N', 'N', 'N');
COMMIT WORK;

SET TERM ^ ;

create trigger CLIENTE_SUCURSALES_AI for CLIENTE_SUCURSALES
active AFTER INSERT position 0
as
begin
INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD, AUDI_RAZON)
    VALUES (USER, 152, 1, 'I', NEW.terc_nit, NEW.clcu_cod);
end^

SET TERM ; ^

SET TERM ^ ;

create trigger CLIENTE_SUCURSALES_AU for CLIENTE_SUCURSALES
active AFTER UPDATE position 0
as
begin
INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD, AUDI_RAZON)
    VALUES (USER, 152, 1, 'U', NEW.terc_nit, NEW.clcu_cod);
end^

SET TERM ; ^

SET TERM ^ ;

create trigger CLIENTE_SUCURSALES_AD for CLIENTE_SUCURSALES
active AFTER DELETE position 0
as
begin
INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD, AUDI_RAZON)
    VALUES (USER, 152, 1, 'D', OLD.terc_nit, OLD.clcu_cod);
end^

SET TERM ; ^

/* auditoria en formatos de impresion */
SET TERM ^ ;

create trigger FORMATOS_AI for FORMATOS
active AFTER INSERT position 0
as
begin
INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
    VALUES (USER, 1000+new.tido_cod, 1, 'I', new.pref_pre);
end^

SET TERM ; ^

SET TERM ^ ;

create trigger FORMATOS_AU for FORMATOS
active AFTER UPDATE position 0
as
begin
INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
    VALUES (USER, 1000+new.tido_cod, 1, 'U', new.pref_pre);
end^

SET TERM ; ^

SET TERM ^ ;

create trigger FORMATOS_AD for FORMATOS
active AFTER DELETE position 0
as
begin
INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
    VALUES (USER, 1000+old.tido_cod, 1, 'D', old.pref_pre);
end^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER TRIGGER FORMATO_DATOS_AI FOR FORMATO_DATOS
ACTIVE AFTER INSERT POSITION 0
as
begin
if (not exists (select audi_id from auditoria where tido_cod = (1000+new.tido_cod) and audi_cod = new.pref_pre
    and audi_fecha = cast('now' as date) and (cast('now' as time)-audi_hora) < 60)) then
    INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
        VALUES (USER, 1000+new.tido_cod, 1, 'U', new.pref_pre);
end^

SET TERM ; ^

SET TERM ^ ;

create trigger FORMATO_DATOS_AU for FORMATO_DATOS
active AFTER UPDATE position 0
as
begin
if (not exists (select audi_id from auditoria where tido_cod = (1000+new.tido_cod) and audi_cod = new.pref_pre
    and audi_fecha = cast('now' as date) and (cast('now' as time)-audi_hora) < 60)) then
    INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
        VALUES (USER, 1000+new.tido_cod, 1, 'U', new.pref_pre);
end^

SET TERM ; ^

SET TERM ^ ;

create trigger FORMATO_DATOS_AD for FORMATO_DATOS
active AFTER DELETE position 0
as
begin
if (not exists (select audi_id from auditoria where tido_cod = (1000+old.tido_cod) and audi_cod = old.pref_pre
    and audi_fecha = cast('now' as date) and (cast('now' as time)-audi_hora) < 60)) then
    INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
        VALUES (USER, 1000+old.tido_cod, 1, 'U', old.pref_pre);
end^

SET TERM ; ^

SET TERM ^ ;

create trigger FORMATO_LINEAS_AI for FORMATO_LINEAS
active AFTER INSERT position 0
as
begin
if (not exists (select audi_id from auditoria where tido_cod = (1000+new.tido_cod) and audi_cod = new.pref_pre
    and audi_fecha = cast('now' as date) and (cast('now' as time)-audi_hora) < 60)) then
    INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
        VALUES (USER, 1000+new.tido_cod, 1, 'U', new.pref_pre);
end^

SET TERM ; ^

SET TERM ^ ;

create trigger FORMATO_LINEAS_AU for FORMATO_LINEAS
active AFTER UPDATE position 0
as
begin
if (not exists (select audi_id from auditoria where tido_cod = (1000+new.tido_cod) and audi_cod = new.pref_pre
    and audi_fecha = cast('now' as date) and (cast('now' as time)-audi_hora) < 60)) then
    INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
        VALUES (USER, 1000+new.tido_cod, 1, 'U', new.pref_pre);
end^

SET TERM ; ^

SET TERM ^ ;

create trigger FORMATO_LINEAS_AD for FORMATO_LINEAS
active AFTER DELETE position 0
as
begin
if (not exists (select audi_id from auditoria where tido_cod = (1000+old.tido_cod) and audi_cod = old.pref_pre
    and audi_fecha = cast('now' as date) and (cast('now' as time)-audi_hora) < 60)) then
    INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
        VALUES (USER, 1000+old.tido_cod, 1, 'U', old.pref_pre);
end^

SET TERM ; ^


/* 201412 */
/* MEDIOS MAGNETICOS 2014 */
CREATE TABLE MEDIOSMAG_ARCHIVOS2014 (
    MM14_ID T_ID NOT NULL,
    MM14_NOMBRE VARCHAR(100),
    MM14_PROCEDIMIENTO VARCHAR(60));

ALTER TABLE MEDIOSMAG_ARCHIVOS2014
ADD CONSTRAINT PK_MEDIOSMAG_ARCHIVOS2014
PRIMARY KEY (MM14_ID);

update RDB$RELATION_FIELDS set RDB$NULL_FLAG = 1
    where (RDB$FIELD_NAME = 'TIID_COD') and (RDB$RELATION_NAME = 'TIPO_ID');

ALTER TABLE TIPO_ID
ADD TIID_NATUR CHAR(1);

UPDATE TIPO_ID
SET TIID_NOM = 'CEDULA CIUDADANIA',
    TIID_CODIGO = 13,
    TIID_CODSHD = 'CC',
    TIID_NATUR = 'N'
WHERE (TIID_COD = 'C');


UPDATE TIPO_ID
SET TIID_NOM = 'DOCUMENTO EXTRANJERO',
    TIID_CODIGO = 42,
    TIID_CODSHD = '',
    TIID_NATUR = 'N'
WHERE (TIID_COD = 'D');


UPDATE TIPO_ID
SET TIID_NOM = 'CEDULA EXTRANJERIA',
    TIID_CODIGO = 22,
    TIID_CODSHD = 'CE',
    TIID_NATUR = 'N'
WHERE (TIID_COD = 'E');


UPDATE TIPO_ID
SET TIID_NOM = 'NIT PERSONA JURIDICA',
    TIID_CODIGO = 31,
    TIID_CODSHD = 'NIT',
    TIID_NATUR = 'J'
WHERE (TIID_COD = 'J');


UPDATE TIPO_ID
SET TIID_NOM = 'NIT PERSONA NATURAL',
    TIID_CODIGO = 31,
    TIID_CODSHD = 'NIT',
    TIID_NATUR = 'N'
WHERE (TIID_COD = 'N');


UPDATE TIPO_ID
SET TIID_NOM = 'PASAPORTE',
    TIID_CODIGO = 41,
    TIID_CODSHD = 'PA',
    TIID_NATUR = 'N'
WHERE (TIID_COD = 'P');


UPDATE TIPO_ID
SET TIID_NOM = 'REGISTRO CIVIL',
    TIID_CODIGO = 11,
    TIID_CODSHD = 'RC',
    TIID_NATUR = 'N'
WHERE (TIID_COD = 'R');


UPDATE TIPO_ID
SET TIID_NOM = 'EXTRANJERO SIN DOCUMENTO',
    TIID_CODIGO = 43,
    TIID_CODSHD = '',
    TIID_NATUR = 'N'
WHERE (TIID_COD = 'S');


UPDATE TIPO_ID
SET TIID_NOM = 'TARJETA IDENTIDAD',
    TIID_CODIGO = 12,
    TIID_CODSHD = 'TI',
    TIID_NATUR = 'N'
WHERE (TIID_COD = 'T');


UPDATE TIPO_ID
SET TIID_NOM = 'NIUP',
    TIID_CODIGO = 40,
    TIID_CODSHD = '',
    TIID_NATUR = 'N'
WHERE (TIID_COD = 'U');


UPDATE TIPO_ID
SET TIID_NOM = 'TARJETA EXTRANJERIA',
    TIID_CODIGO = 21,
    TIID_CODSHD = '',
    TIID_NATUR = 'N'
WHERE (TIID_COD = 'X');

ALTER TABLE TERCEROS
ADD TERC_ACTIVIDAD CHAR(4);

delete from tipo_ID;
COMMIT WORK;

ALTER TABLE TIPO_ID
ADD CONSTRAINT PK_TIPO_ID
PRIMARY KEY (TIID_COD);

UPDATE or INSERT INTO TIPO_ID (TIID_COD, TIID_NOM, TIID_CODIGO, TIID_CODSHD, TIID_NATUR) VALUES ('C', 'CEDULA CIUDADANIA', 13, 'CC', 'N');
UPDATE or INSERT INTO TIPO_ID (TIID_COD, TIID_NOM, TIID_CODIGO, TIID_CODSHD, TIID_NATUR) VALUES ('D', 'DOCUMENTO EXTRANJERO', 42, '', 'N');
UPDATE or INSERT INTO TIPO_ID (TIID_COD, TIID_NOM, TIID_CODIGO, TIID_CODSHD, TIID_NATUR) VALUES ('E', 'CEDULA EXTRANJERIA', 22, 'CE', 'N');
UPDATE or INSERT INTO TIPO_ID (TIID_COD, TIID_NOM, TIID_CODIGO, TIID_CODSHD, TIID_NATUR) VALUES ('F', 'EXTRANJERO DIFERENTE NIT DIAN', 33, '', 'N');
UPDATE or INSERT INTO TIPO_ID (TIID_COD, TIID_NOM, TIID_CODIGO, TIID_CODSHD, TIID_NATUR) VALUES ('I', 'CARNE DIPLOMATICO', 46, '', 'N');
UPDATE or INSERT INTO TIPO_ID (TIID_COD, TIID_NOM, TIID_CODIGO, TIID_CODSHD, TIID_NATUR) VALUES ('J', 'NIT PERSONA JURIDICA', 31, 'NIT', 'J');
UPDATE or INSERT INTO TIPO_ID (TIID_COD, TIID_NOM, TIID_CODIGO, TIID_CODSHD, TIID_NATUR) VALUES ('L', 'SUCESION ILIQUIDA SIN DOCUMENT', 14, '', 'N');
UPDATE or INSERT INTO TIPO_ID (TIID_COD, TIID_NOM, TIID_CODIGO, TIID_CODSHD, TIID_NATUR) VALUES ('N', 'NIT PERSONA NATURAL', 31, 'NIT', 'N');
UPDATE or INSERT INTO TIPO_ID (TIID_COD, TIID_NOM, TIID_CODIGO, TIID_CODSHD, TIID_NATUR) VALUES ('O', 'EXTRANJERO PERSONA JURICA', 44, '', 'J');
UPDATE or INSERT INTO TIPO_ID (TIID_COD, TIID_NOM, TIID_CODIGO, TIID_CODSHD, TIID_NATUR) VALUES ('P', 'PASAPORTE', 41, 'PA', 'N');
UPDATE or INSERT INTO TIPO_ID (TIID_COD, TIID_NOM, TIID_CODIGO, TIID_CODSHD, TIID_NATUR) VALUES ('Q', 'SUCESION ILIQUIDA NOTARIA/JUZG', 15, '', 'N');
UPDATE or INSERT INTO TIPO_ID (TIID_COD, TIID_NOM, TIID_CODIGO, TIID_CODSHD, TIID_NATUR) VALUES ('R', 'REGISTRO CIVIL', 11, 'RC', 'N');
UPDATE or INSERT INTO TIPO_ID (TIID_COD, TIID_NOM, TIID_CODIGO, TIID_CODSHD, TIID_NATUR) VALUES ('S', 'EXTRANJERO SIN DOCUMENTO', 43, '', 'N');
UPDATE or INSERT INTO TIPO_ID (TIID_COD, TIID_NOM, TIID_CODIGO, TIID_CODSHD, TIID_NATUR) VALUES ('T', 'TARJETA IDENTIDAD', 12, 'TI', 'N');
UPDATE or INSERT INTO TIPO_ID (TIID_COD, TIID_NOM, TIID_CODIGO, TIID_CODSHD, TIID_NATUR) VALUES ('U', 'NIUP', 11, '', 'N');
UPDATE or INSERT INTO TIPO_ID (TIID_COD, TIID_NOM, TIID_CODIGO, TIID_CODSHD, TIID_NATUR) VALUES ('X', 'TARJETA EXTRANJERIA', 21, '', 'N');
COMMIT WORK;

/* RAZON SOCIAL 255 C */
update RDB$RELATION_FIELDS set RDB$FIELD_SOURCE = 'EXPLICA'
    where (RDB$FIELD_NAME = 'TERC_CONTACTO') and (RDB$RELATION_NAME = 'TERCEROS');
COMMIT WORK;

SET TERM ^ ;

create procedure MM14_TERCEROS (
    FECINI DATE,
    FECFIN DATE)
returns (
    TIPOID INTEGER,
    NIT VARCHAR(20),
    DV CHAR(1),
    NATUR CHAR(1),
    APE1 VARCHAR(60),
    APE2 VARCHAR(60),
    NOM1 VARCHAR(60),
    NOM2 VARCHAR(60),
    RAZON VARCHAR(60),
    DIREC VARCHAR(100),
    ACTIV CHAR(4),
    PAIS CHAR(3),
    DPTO CHAR(2),
    MPIO CHAR(3),
    CORREO VARCHAR(100),
    TELEF VARCHAR(40),
    CELUL VARCHAR(40))
as
begin
FOR SELECT TERC_NIT, TERC_NOM, TERC_NOMBRE1, TERC_NOMBRE2, TERC_APELLIDO1, TERC_APELLIDO2, TERC_DV, TERC_ACTIVIDAD,
    TERC_DIR, SUBSTR(CIUD_COD,1,2), SUBSTR(CIUD_COD,3,5), PAIS_ID, I.tiid_codigo, I.tiid_natur, T.terc_email, T.terc_tel, T.terc_cel
    FROM TERCEROS T, tipo_id I WHERE T.TERC_TIPOID = I.tiid_codigo AND
    EXISTS (SELECT D.ENCO_CONSEC FROM comprobante_detalle D, COMPROBANTE_ENCABEZADO E WHERE E.enco_consec = D.enco_consec
    AND D.TERC_NIT = T.TERC_NIT AND E.enco_fecha >= :FECINI  AND E.enco_fecha <= :FECFIN AND ((CODE_DEBITO <> 0) OR (CODE_CREDITO <> 0)))
    INTO :NIT, :RAZON, :NOM1, :NOM2, :APE1, :APE2, :DV, :ACTIV,
    :DIREC, :DPTO, :MPIO, :PAIS, :TIPOID, :NATUR, :CORREO, :TELEF, :CELUL
    DO
    BEGIN
    suspend;
    END
end^

SET TERM ; ^

ALTER TABLE TIPO_COTIZANTE
ADD TCOT_TIPODIAN SMALLINT;

ALTER TABLE TIPO_COTIZANTE
ADD TCOT_CONDIC SMALLINT;

UPDATE OR INSERT INTO TIPO_COTIZANTE (TCOT_COD, TCOT_NOMBRE, TCOT_TIPODIAN) VALUES (1, 'DEPENDIENTE', 1);
UPDATE OR INSERT INTO TIPO_COTIZANTE (TCOT_COD, TCOT_NOMBRE, TCOT_TIPODIAN) VALUES (7, 'DEPENDIENTE SIN CONTRATO LABORAL', 2);
UPDATE OR INSERT INTO TIPO_COTIZANTE (TCOT_COD, TCOT_NOMBRE, TCOT_TIPODIAN) VALUES (2, 'SERVICIO DOMESTICO', 3);
UPDATE OR INSERT INTO TIPO_COTIZANTE (TCOT_COD, TCOT_NOMBRE, TCOT_TIPODIAN) VALUES (18, 'FUNCIONARIOS PUBLICOS SIN TOPE MAXIMO EN EL IBC', 4);
UPDATE OR INSERT INTO TIPO_COTIZANTE (TCOT_COD, TCOT_NOMBRE, TCOT_TIPODIAN) VALUES (3, 'INDEPENDIENTE', 5);
UPDATE OR INSERT INTO TIPO_COTIZANTE (TCOT_COD, TCOT_NOMBRE, TCOT_TIPODIAN) VALUES (4, 'MADRE COMUNITARIA', NULL);
UPDATE OR INSERT INTO TIPO_COTIZANTE (TCOT_COD, TCOT_NOMBRE, TCOT_TIPODIAN) VALUES (6, 'TRABAJADOR OFICIAL', 6);
UPDATE OR INSERT INTO TIPO_COTIZANTE (TCOT_COD, TCOT_NOMBRE, TCOT_TIPODIAN) VALUES (12, 'APRENDICES DEL SENA EN ETAPA LECTIVA', 7);
UPDATE OR INSERT INTO TIPO_COTIZANTE (TCOT_COD, TCOT_NOMBRE, TCOT_TIPODIAN) VALUES (19, 'APRENDICES DEL SENA EN ETAPA PRODUCTIVA', 8);
UPDATE OR INSERT INTO TIPO_COTIZANTE (TCOT_COD, TCOT_NOMBRE, TCOT_TIPODIAN) VALUES (20, 'ESTUDIANTES (REGIMEN ESPECIAL- LEY 789/2002)', 9);
UPDATE OR INSERT INTO TIPO_COTIZANTE (TCOT_COD, TCOT_NOMBRE, TCOT_TIPODIAN) VALUES (22, 'PROFESOR DE ESTABLECIMIENTO PARTICULAR', 10);
UPDATE OR INSERT INTO TIPO_COTIZANTE (TCOT_COD, TCOT_NOMBRE, TCOT_TIPODIAN) VALUES (30, 'DEPENDIENTE ENTIDADES PUBLICAS REGIMEN ESPECIAL DE SALUD', 11);
UPDATE OR INSERT INTO TIPO_COTIZANTE (TCOT_COD, TCOT_NOMBRE, TCOT_TIPODIAN) VALUES (16, 'INDEPENDIENTE AGREMIADO O ASOCIADO', 12);
UPDATE OR INSERT INTO TIPO_COTIZANTE (TCOT_COD, TCOT_NOMBRE, TCOT_TIPODIAN) VALUES (31, 'COOPERADOS O PRECOPERATIVAS DE TRABAJO ASOCIADO', 13);
UPDATE OR INSERT INTO TIPO_COTIZANTE (TCOT_COD, TCOT_NOMBRE, TCOT_TIPODIAN, TCOT_CONDIC) VALUES (32, 'COTIZANTE MIEMBRO DE CARRERA DIPLMATICA', NULL, 32);
UPDATE OR INSERT INTO TIPO_COTIZANTE (TCOT_COD, TCOT_NOMBRE, TCOT_TIPODIAN) VALUES (33, 'BENEFICIARIO DEL FONDO DE SOLIDARIDAD PENSIONAL',null);
UPDATE OR INSERT INTO TIPO_COTIZANTE (TCOT_COD, TCOT_NOMBRE, TCOT_TIPODIAN, TCOT_CONDIC) VALUES (34, 'CONCEJAL AMPARADO POR POLIZA DE SALUD', NULL, NULL);
COMMIT WORK;

ALTER TABLE SUBTIPO_COTIZANTE
ADD STCO_CODDIAN SMALLINT;

UPDATE OR INSERT INTO SUBTIPO_COTIZANTE (TCOT_COD, STCO_COD, STCO_NOMBRE, STCO_CODDIAN) VALUES (1, 1, 'DEPENDIENTE PENSIONADO POR VEJEZ ACTIVO', 80);
UPDATE OR INSERT INTO SUBTIPO_COTIZANTE (TCOT_COD, STCO_COD, STCO_NOMBRE, STCO_CODDIAN) VALUES (1, 3, 'COTIZANTE NO OBLIGADO A COTIZACION A PENSIONES POR EDAD', 82);
UPDATE OR INSERT INTO SUBTIPO_COTIZANTE (TCOT_COD, STCO_COD, STCO_NOMBRE, STCO_CODDIAN) VALUES (1, 4, 'COTIZANTE CON REQUISITOS CUMPLIDOS PARA PENSION', 83);
UPDATE OR INSERT INTO SUBTIPO_COTIZANTE (TCOT_COD, STCO_COD, STCO_NOMBRE, STCO_CODDIAN) VALUES (1, 5, 'COTIZANTE CON INDEMNIZACION SUSTITUTIVA O DEV SALDOS', 84);
UPDATE OR INSERT INTO SUBTIPO_COTIZANTE (TCOT_COD, STCO_COD, STCO_NOMBRE, STCO_CODDIAN) VALUES (1, 6, 'COTIZANTE PERTENECIENTE A UN REGIMEN EXCEPTUADO DE PENSIONES', 85);
UPDATE OR INSERT INTO SUBTIPO_COTIZANTE (TCOT_COD, STCO_COD, STCO_NOMBRE, STCO_CODDIAN) VALUES (2, 1, 'DEPENDIENTE PENSIONADO POR VEJEZ ACTIVO', 80);
UPDATE OR INSERT INTO SUBTIPO_COTIZANTE (TCOT_COD, STCO_COD, STCO_NOMBRE, STCO_CODDIAN) VALUES (2, 3, 'COTIZANTE NO OBLIGADO A COTIZACION A PENSIONES POR EDAD', 82);
UPDATE OR INSERT INTO SUBTIPO_COTIZANTE (TCOT_COD, STCO_COD, STCO_NOMBRE, STCO_CODDIAN) VALUES (2, 4, 'COTIZANTE CON REQUISITOS CUMPLIDOS PARA PENSION', 83);
UPDATE OR INSERT INTO SUBTIPO_COTIZANTE (TCOT_COD, STCO_COD, STCO_NOMBRE, STCO_CODDIAN) VALUES (2, 5, 'COTIZANTE CON INDEMNIZACION SUSTITUTIVA O DEV SALDOS', 84);
UPDATE OR INSERT INTO SUBTIPO_COTIZANTE (TCOT_COD, STCO_COD, STCO_NOMBRE, STCO_CODDIAN) VALUES (2, 6, 'COTIZANTE PERTENECIENTE A UN REGIMEN EXCEPTUADO DE PENSIONES', 85);
UPDATE OR INSERT INTO SUBTIPO_COTIZANTE (TCOT_COD, STCO_COD, STCO_NOMBRE, STCO_CODDIAN) VALUES (3, 2, 'INDEPENDIENTE PENSIONADO POR VEJEZ ACTIVO', 81);
UPDATE OR INSERT INTO SUBTIPO_COTIZANTE (TCOT_COD, STCO_COD, STCO_NOMBRE, STCO_CODDIAN) VALUES (3, 3, 'COTIZANTE NO OBLIGADO A COTIZACION A PENSIONES POR EDAD', 82);
UPDATE OR INSERT INTO SUBTIPO_COTIZANTE (TCOT_COD, STCO_COD, STCO_NOMBRE, STCO_CODDIAN) VALUES (3, 4, 'COTIZANTE CON REQUISITOS CUMPLIDOS PARA PENSION', 83);
UPDATE OR INSERT INTO SUBTIPO_COTIZANTE (TCOT_COD, STCO_COD, STCO_NOMBRE, STCO_CODDIAN) VALUES (3, 5, 'COTIZANTE CON INDEMNIZACION SUSTITUTIVA O DEV SALDOS', 84);
UPDATE OR INSERT INTO SUBTIPO_COTIZANTE (TCOT_COD, STCO_COD, STCO_NOMBRE, STCO_CODDIAN) VALUES (3, 6, 'COTIZANTE PERTENECIENTE A UN REGIMEN EXCEPTUADO DE PENSIONES', 85);
UPDATE OR INSERT INTO SUBTIPO_COTIZANTE (TCOT_COD, STCO_COD, STCO_NOMBRE, STCO_CODDIAN) VALUES (4, 3, 'COTIZANTE NO OBLIGADO A COTIZACION A PENSIONES POR EDAD', 82);
UPDATE OR INSERT INTO SUBTIPO_COTIZANTE (TCOT_COD, STCO_COD, STCO_NOMBRE, STCO_CODDIAN) VALUES (4, 4, 'COTIZANTE CON REQUISITOS CUMPLIDOS PARA PENSION', 83);
UPDATE OR INSERT INTO SUBTIPO_COTIZANTE (TCOT_COD, STCO_COD, STCO_NOMBRE, STCO_CODDIAN) VALUES (4, 5, 'COTIZANTE CON INDEMNIZACION SUSTITUTIVA O DEV SALDOS', 84);
UPDATE OR INSERT INTO SUBTIPO_COTIZANTE (TCOT_COD, STCO_COD, STCO_NOMBRE, STCO_CODDIAN) VALUES (4, 6, 'COTIZANTE PERTENECIENTE A UN REGIMEN EXCEPTUADO DE PENSIONES', 85);
UPDATE OR INSERT INTO SUBTIPO_COTIZANTE (TCOT_COD, STCO_COD, STCO_NOMBRE, STCO_CODDIAN) VALUES (12, 3, 'COTIZANTE NO OBLIGADO A COTIZACION A PENSIONES POR EDAD', 82);
UPDATE OR INSERT INTO SUBTIPO_COTIZANTE (TCOT_COD, STCO_COD, STCO_NOMBRE, STCO_CODDIAN) VALUES (12, 4, 'COTIZANTE CON REQUISITOS CUMPLIDOS PARA PENSION', 83);
UPDATE OR INSERT INTO SUBTIPO_COTIZANTE (TCOT_COD, STCO_COD, STCO_NOMBRE, STCO_CODDIAN) VALUES (12, 5, 'COTIZANTE CON INDEMNIZACION SUSTITUTIVA O DEV SALDOS', 84);
UPDATE OR INSERT INTO SUBTIPO_COTIZANTE (TCOT_COD, STCO_COD, STCO_NOMBRE, STCO_CODDIAN) VALUES (12, 6, 'COTIZANTE PERTENECIENTE A UN REGIMEN EXCEPTUADO DE PENSIONES', 85);
UPDATE OR INSERT INTO SUBTIPO_COTIZANTE (TCOT_COD, STCO_COD, STCO_NOMBRE, STCO_CODDIAN) VALUES (15, 3, 'COTIZANTE NO OBLIGADO A COTIZACION A PENSIONES POR EDAD', 82);
UPDATE OR INSERT INTO SUBTIPO_COTIZANTE (TCOT_COD, STCO_COD, STCO_NOMBRE, STCO_CODDIAN) VALUES (15, 4, 'COTIZANTE CON REQUISITOS CUMPLIDOS PARA PENSION', 83);
UPDATE OR INSERT INTO SUBTIPO_COTIZANTE (TCOT_COD, STCO_COD, STCO_NOMBRE, STCO_CODDIAN) VALUES (15, 5, 'COTIZANTE CON INDEMNIZACION SUSTITUTIVA O DEV SALDOS', 84);
UPDATE OR INSERT INTO SUBTIPO_COTIZANTE (TCOT_COD, STCO_COD, STCO_NOMBRE, STCO_CODDIAN) VALUES (15, 6, 'COTIZANTE PERTENECIENTE A UN REGIMEN EXCEPTUADO DE PENSIONES', 85);
UPDATE OR INSERT INTO SUBTIPO_COTIZANTE (TCOT_COD, STCO_COD, STCO_NOMBRE, STCO_CODDIAN) VALUES (16, 2, 'INDEPENDIENTE PENSIONADO POR VEJEZ ACTIVO', 81);
UPDATE OR INSERT INTO SUBTIPO_COTIZANTE (TCOT_COD, STCO_COD, STCO_NOMBRE, STCO_CODDIAN) VALUES (16, 3, 'COTIZANTE NO OBLIGADO A COTIZACION A PENSIONES POR EDAD', 82);
UPDATE OR INSERT INTO SUBTIPO_COTIZANTE (TCOT_COD, STCO_COD, STCO_NOMBRE, STCO_CODDIAN) VALUES (16, 4, 'COTIZANTE CON REQUISITOS CUMPLIDOS PARA PENSION', 83);
UPDATE OR INSERT INTO SUBTIPO_COTIZANTE (TCOT_COD, STCO_COD, STCO_NOMBRE, STCO_CODDIAN) VALUES (16, 5, 'COTIZANTE CON INDEMNIZACION SUSTITUTIVA O DEV SALDOS', 84);
UPDATE OR INSERT INTO SUBTIPO_COTIZANTE (TCOT_COD, STCO_COD, STCO_NOMBRE, STCO_CODDIAN) VALUES (16, 6, 'COTIZANTE PERTENECIENTE A UN REGIMEN EXCEPTUADO DE PENSIONES', 85);
UPDATE OR INSERT INTO SUBTIPO_COTIZANTE (TCOT_COD, STCO_COD, STCO_NOMBRE, STCO_CODDIAN) VALUES (18, 1, 'DEPENDIENTE PENSIONADO POR VEJEZ ACTIVO', 80);
UPDATE OR INSERT INTO SUBTIPO_COTIZANTE (TCOT_COD, STCO_COD, STCO_NOMBRE, STCO_CODDIAN) VALUES (18, 3, 'COTIZANTE NO OBLIGADO A COTIZACION A PENSIONES POR EDAD', 82);
UPDATE OR INSERT INTO SUBTIPO_COTIZANTE (TCOT_COD, STCO_COD, STCO_NOMBRE, STCO_CODDIAN) VALUES (18, 4, 'COTIZANTE CON REQUISITOS CUMPLIDOS PARA PENSION', 83);
UPDATE OR INSERT INTO SUBTIPO_COTIZANTE (TCOT_COD, STCO_COD, STCO_NOMBRE, STCO_CODDIAN) VALUES (18, 5, 'COTIZANTE CON INDEMNIZACION SUSTITUTIVA O DEV SALDOS', 84);
UPDATE OR INSERT INTO SUBTIPO_COTIZANTE (TCOT_COD, STCO_COD, STCO_NOMBRE, STCO_CODDIAN) VALUES (18, 6, 'COTIZANTE PERTENECIENTE A UN REGIMEN EXCEPTUADO DE PENSIONES', 85);
UPDATE OR INSERT INTO SUBTIPO_COTIZANTE (TCOT_COD, STCO_COD, STCO_NOMBRE, STCO_CODDIAN) VALUES (19, 5, 'COTIZANTE CON INDEMNIZACION SUSTITUTIVA O DEV SALDOS', 84);
UPDATE OR INSERT INTO SUBTIPO_COTIZANTE (TCOT_COD, STCO_COD, STCO_NOMBRE, STCO_CODDIAN) VALUES (19, 6, 'COTIZANTE PERTENECIENTE A UN REGIMEN EXCEPTUADO DE PENSIONES', 85);
UPDATE OR INSERT INTO SUBTIPO_COTIZANTE (TCOT_COD, STCO_COD, STCO_NOMBRE, STCO_CODDIAN) VALUES (20, 3, 'COTIZANTE NO OBLIGADO A COTIZACION A PENSIONES POR EDAD', 82);
UPDATE OR INSERT INTO SUBTIPO_COTIZANTE (TCOT_COD, STCO_COD, STCO_NOMBRE, STCO_CODDIAN) VALUES (20, 4, 'COTIZANTE CON REQUISITOS CUMPLIDOS PARA PENSION', 83);
UPDATE OR INSERT INTO SUBTIPO_COTIZANTE (TCOT_COD, STCO_COD, STCO_NOMBRE, STCO_CODDIAN) VALUES (20, 5, 'COTIZANTE CON INDEMNIZACION SUSTITUTIVA O DEV SALDOS', 84);
UPDATE OR INSERT INTO SUBTIPO_COTIZANTE (TCOT_COD, STCO_COD, STCO_NOMBRE, STCO_CODDIAN) VALUES (20, 6, 'COTIZANTE PERTENECIENTE A UN REGIMEN EXCEPTUADO DE PENSIONES', 85);
UPDATE OR INSERT INTO SUBTIPO_COTIZANTE (TCOT_COD, STCO_COD, STCO_NOMBRE, STCO_CODDIAN) VALUES (21, 3, 'COTIZANTE NO OBLIGADO A COTIZACION A PENSIONES POR EDAD', 82);
UPDATE OR INSERT INTO SUBTIPO_COTIZANTE (TCOT_COD, STCO_COD, STCO_NOMBRE, STCO_CODDIAN) VALUES (21, 4, 'COTIZANTE CON REQUISITOS CUMPLIDOS PARA PENSION', 83);
UPDATE OR INSERT INTO SUBTIPO_COTIZANTE (TCOT_COD, STCO_COD, STCO_NOMBRE, STCO_CODDIAN) VALUES (21, 5, 'COTIZANTE CON INDEMNIZACION SUSTITUTIVA O DEV SALDOS', 84);
UPDATE OR INSERT INTO SUBTIPO_COTIZANTE (TCOT_COD, STCO_COD, STCO_NOMBRE, STCO_CODDIAN) VALUES (21, 6, 'COTIZANTE PERTENECIENTE A UN REGIMEN EXCEPTUADO DE PENSIONES', 85);
UPDATE OR INSERT INTO SUBTIPO_COTIZANTE (TCOT_COD, STCO_COD, STCO_NOMBRE, STCO_CODDIAN) VALUES (22, 1, 'DEPENDIENTE PENSIONADO POR VEJEZ ACTIVO', 80);
UPDATE OR INSERT INTO SUBTIPO_COTIZANTE (TCOT_COD, STCO_COD, STCO_NOMBRE, STCO_CODDIAN) VALUES (30, 1, 'DEPENDIENTE PENSIONADO POR VEJEZ ACTIVO', 80);
UPDATE OR INSERT INTO SUBTIPO_COTIZANTE (TCOT_COD, STCO_COD, STCO_NOMBRE, STCO_CODDIAN) VALUES (30, 3, 'COTIZANTE NO OBLIGADO A COTIZACION A PENSIONES POR EDAD', 82);
UPDATE OR INSERT INTO SUBTIPO_COTIZANTE (TCOT_COD, STCO_COD, STCO_NOMBRE, STCO_CODDIAN) VALUES (30, 4, 'COTIZANTE CON REQUISITOS CUMPLIDOS PARA PENSION', 83);
UPDATE OR INSERT INTO SUBTIPO_COTIZANTE (TCOT_COD, STCO_COD, STCO_NOMBRE, STCO_CODDIAN) VALUES (30, 5, 'COTIZANTE CON INDEMNIZACION SUSTITUTIVA O DEV SALDOS', 84);
UPDATE OR INSERT INTO SUBTIPO_COTIZANTE (TCOT_COD, STCO_COD, STCO_NOMBRE, STCO_CODDIAN) VALUES (30, 6, 'COTIZANTE PERTENECIENTE A UN REGIMEN EXCEPTUADO DE PENSIONES', 85);
UPDATE OR INSERT INTO SUBTIPO_COTIZANTE (TCOT_COD, STCO_COD, STCO_NOMBRE, STCO_CODDIAN) VALUES (31, 1, 'DEPENDIENTE PENSIONADO POR VEJEZ ACTIVO', 80);
UPDATE OR INSERT INTO SUBTIPO_COTIZANTE (TCOT_COD, STCO_COD, STCO_NOMBRE, STCO_CODDIAN) VALUES (31, 3, 'COTIZANTE NO OBLIGADO A COTIZACION A PENSIONES POR EDAD', 82);
UPDATE OR INSERT INTO SUBTIPO_COTIZANTE (TCOT_COD, STCO_COD, STCO_NOMBRE, STCO_CODDIAN) VALUES (31, 4, 'COTIZANTE CON REQUISITOS CUMPLIDOS PARA PENSION', 83);
UPDATE OR INSERT INTO SUBTIPO_COTIZANTE (TCOT_COD, STCO_COD, STCO_NOMBRE, STCO_CODDIAN) VALUES (31, 5, 'COTIZANTE CON INDEMNIZACION SUSTITUTIVA O DEV SALDOS', 84);
UPDATE OR INSERT INTO SUBTIPO_COTIZANTE (TCOT_COD, STCO_COD, STCO_NOMBRE, STCO_CODDIAN) VALUES (31, 6, 'COTIZANTE PERTENECIENTE A UN REGIMEN EXCEPTUADO DE PENSIONES', 85);
UPDATE OR INSERT INTO SUBTIPO_COTIZANTE (TCOT_COD, STCO_COD, STCO_NOMBRE, STCO_CODDIAN) VALUES (32, 3, 'COTIZANTE NO OBLIGADO A COTIZACION A PENSIONES POR EDAD', 82);
UPDATE OR INSERT INTO SUBTIPO_COTIZANTE (TCOT_COD, STCO_COD, STCO_NOMBRE, STCO_CODDIAN) VALUES (32, 4, 'COTIZANTE CON REQUISITOS CUMPLIDOS PARA PENSION', 83);
UPDATE OR INSERT INTO SUBTIPO_COTIZANTE (TCOT_COD, STCO_COD, STCO_NOMBRE, STCO_CODDIAN) VALUES (32, 5, 'COTIZANTE CON INDEMNIZACION SUSTITUTIVA O DEV SALDOS', 84);
UPDATE OR INSERT INTO SUBTIPO_COTIZANTE (TCOT_COD, STCO_COD, STCO_NOMBRE, STCO_CODDIAN) VALUES (32, 6, 'COTIZANTE PERTENECIENTE A UN REGIMEN EXCEPTUADO DE PENSIONES', 85);
UPDATE OR INSERT INTO SUBTIPO_COTIZANTE (TCOT_COD, STCO_COD, STCO_NOMBRE, STCO_CODDIAN) VALUES (33, 3, 'COTIZANTE NO OBLIGADO A COTIZACION A PENSIONES POR EDAD', 82);
UPDATE OR INSERT INTO SUBTIPO_COTIZANTE (TCOT_COD, STCO_COD, STCO_NOMBRE, STCO_CODDIAN) VALUES (33, 4, 'COTIZANTE CON REQUISITOS CUMPLIDOS PARA PENSION', 83);
UPDATE OR INSERT INTO SUBTIPO_COTIZANTE (TCOT_COD, STCO_COD, STCO_NOMBRE, STCO_CODDIAN) VALUES (33, 5, 'COTIZANTE CON INDEMNIZACION SUSTITUTIVA O DEV SALDOS', 84);
UPDATE OR INSERT INTO SUBTIPO_COTIZANTE (TCOT_COD, STCO_COD, STCO_NOMBRE, STCO_CODDIAN) VALUES (33, 6, 'COTIZANTE PERTENECIENTE A UN REGIMEN EXCEPTUADO DE PENSIONES', 85);
UPDATE OR INSERT INTO SUBTIPO_COTIZANTE (TCOT_COD, STCO_COD, STCO_NOMBRE, STCO_CODDIAN) VALUES (34, 1, 'DEPENDIENTE PENSIONADO POR VEJEZ ACTIVO', 80);
UPDATE OR INSERT INTO SUBTIPO_COTIZANTE (TCOT_COD, STCO_COD, STCO_NOMBRE, STCO_CODDIAN) VALUES (34, 3, 'COTIZANTE NO OBLIGADO A COTIZACION A PENSIONES POR EDAD', 82);
UPDATE OR INSERT INTO SUBTIPO_COTIZANTE (TCOT_COD, STCO_COD, STCO_NOMBRE, STCO_CODDIAN) VALUES (34, 4, 'COTIZANTE CON REQUISITOS CUMPLIDOS PARA PENSION', 83);
UPDATE OR INSERT INTO SUBTIPO_COTIZANTE (TCOT_COD, STCO_COD, STCO_NOMBRE, STCO_CODDIAN) VALUES (34, 5, 'COTIZANTE CON INDEMNIZACION SUSTITUTIVA O DEV SALDOS', 84);
UPDATE OR INSERT INTO SUBTIPO_COTIZANTE (TCOT_COD, STCO_COD, STCO_NOMBRE, STCO_CODDIAN) VALUES (34, 6, 'COTIZANTE PERTENECIENTE A UN REGIMEN EXCEPTUADO DE PENSIONES', 85);
COMMIT WORK;

SET TERM ^ ;

create procedure MM14_EMPLEADOS (
    FECINI DATE,
    FECFIN DATE)
returns (
    TIPOID INTEGER,
    NIT VARCHAR(20),
    VINCU INTEGER,
    CONDI INTEGER
    )
as
declare variable TIPO INTEGER;
declare variable STIPO INTEGER;
begin
FOR SELECT E.TERC_NIT, I.tiid_codigo, E.tcot_cod, E.stco_cod FROM EMPLEADOS E, tipo_id I, TERCEROS T WHERE T.terc_nit = E.terc_nit AND T.terc_tipoid = I.tiid_cod
    AND E.empl_fecing <= :fecini AND ((E.empl_fecret IS NULL) OR (E.empl_fecret >= :FECFIN))
    INTO :NIT, :tipoid, :tipo, :stipo
    DO
    BEGIN
    SELECT TC.tcot_tipodian FROM tipo_cotizante TC WHERE TC.tcot_cod = :tipo INTO :vincu;
    if (STIPO IS NULL) then
        CONDI = TIPO;
    else
        SELECT ST.stco_coddian FROM subtipo_cotizante ST WHERE ST.tcot_cod = :vincu AND ST.stco_cod = :stipo INTO :condi;
    suspend;
    END
end^

SET TERM ; ^


INSERT INTO MEDIOSMAG_ARCHIVOS2014 (MM14_ID, MM14_NOMBRE, MM14_PROCEDIMIENTO) VALUES (1, 'Terceros informados', 'MM14_TERCEROS');
INSERT INTO MEDIOSMAG_ARCHIVOS2014 (MM14_ID, MM14_NOMBRE, MM14_PROCEDIMIENTO) VALUES (2, 'Información de nómina - Datos de los trabajadores', 'MM14_EMPLEADOS');
INSERT INTO MEDIOSMAG_ARCHIVOS2014 (MM14_ID, MM14_NOMBRE, MM14_PROCEDIMIENTO) VALUES (3, 'Información de nómina - Nómina de salarios', 'MM14_NOMINA');
INSERT INTO MEDIOSMAG_ARCHIVOS2014 (MM14_ID, MM14_NOMBRE, MM14_PROCEDIMIENTO) VALUES (4, 'Transacciones con terceros', 'MM14_MOVTERCEROS');
INSERT INTO MEDIOSMAG_ARCHIVOS2014 (MM14_ID, MM14_NOMBRE, MM14_PROCEDIMIENTO) VALUES (5, 'Información del sistema de facturación talonario', 'MM14_FACTURACIONPAPEL');
INSERT INTO MEDIOSMAG_ARCHIVOS2014 (MM14_ID, MM14_NOMBRE, MM14_PROCEDIMIENTO) VALUES (6, 'Información del sistema de facturación POS-Computador', 'MM14_FACTURACIONPOS');
COMMIT WORK;

SET TERM ^ ;

CREATE OR ALTER procedure MM14_MOVTERCEROS (
    FECINI char(8),
    FECFIN char(8))
returns (
    CUENTA VARCHAR(20),
    NOMCUENTA VARCHAR(100),
    TIPOID INTEGER,
    NIT VARCHAR(20),
    SALDOINI NUMERIC(18,2),
    DEBITOS NUMERIC(18,2),
    CREDITOS NUMERIC(18,2),
    SALDOFIN NUMERIC(18,2))
AS
declare variable cta varchar(20);
declare variable VALOR NUMERIC(18,2);
declare variable fecaux char(8);
begin
execute procedure fecha_y_numero_conta (:fecini, -1) returning_values (:fecaux);
for select cuen_cod, cuen_nom from cuentas where strlen(cuen_cod) = 6 order by cuen_cod into :cuenta, :nomcuenta
    do
    begin
    for select terc_nit from terceros t where exists (select enco_consec from comprobante_detalle d where terc_nit = t.terc_nit
        and substring(cuen_cod from 1 for 6) = :cuenta) or exists (select sain_item from saldos_iniciales where terc_nit = t.terc_nit
        and substring(cuen_cod from 1 for 6) = :cuenta) into :nit
        do
        begin
        /* ojo nit de bancos, inventario si con la empresa etc. */
        select sum(code_debito), sum(code_credito)
            from comprobante_detalle d, comprobante_encabezado e
            where e.enco_consec = d.enco_consec and e.enco_fecha >= :fecini and e.enco_fecha <= :fecfin
            and substring(d.cuen_cod from 1 for 6) = :cuenta and d.terc_nit = :nit
            into :debitos, :creditos;
        select ti.tiid_codigo from terceros te, tipo_id ti where te.terc_tipoid = ti.tiid_cod into :tipoid;
        SALDOINI = 0;
        for select cuen_cod from cuentas where substring(cuen_cod from 1 for 6) = :cuenta into :cta
            DO
            begin
            execute procedure saldo_tercero(:cta, :nit, :fecaux) returning_values (:valor);
            saldoini = SALDOINI + VALOR;
            end
        SALDOFIN = SALDOINI + DEBITOS - CREDITOS;
        if ((SALDOINI <> 0) OR (debitos <> 0) OR (creditos <> 0) OR (SALDOFIN <> 0)) then
            SUSPEND;
        end
    end
end
^

SET TERM ; ^

SET TERM ^ ;

create or alter procedure MM14_FACTURACIONPAPEL (
    FECINI DATE,
    FECFIN DATE)
returns (PREF VARCHAR(10),
    NUMINI VARCHAR(8),
    NUMFIN VARCHAR(8),
    INGRESOS NUMERIC(18,2),
    DESCTOSCOND NUMERIC(18,2),
    DESCTOSNOCOND NUMERIC(18,2),
    ANULADAS NUMERIC(18,2),
    IVAANUL NUMERIC(18,2))
AS
declare variable CONSUMO NUMERIC(18,2);
BEGIN
FOR SELECT PREF_PRE FROM PREFIJOS WHERE PREF_ACTIVO = 'S' AND TIDO_COD = 31 INTO :PREF
    DO
    BEGIN
    SELECT MIN(FACT_NUMERO), MAX(FACT_NUMERO), SUM(FACT_TOTAL - FACT_IVAMONTO)
        FROM FACTURAS WHERE FACT_FECHA >= :FECINI AND FACT_FECFIN <= :FECFIN AND PREF_PRE = :PREF and FACT_ANULADO = 'N'
        INTO :NUMINI, :NUMFIN, :INGRESOS;
    SELECT SUM(FACT_TOTAL - FACT_IVAMONTO), SUM(FACT_IVAMONTO)
        FROM FACTURAS WHERE FACT_FECHA >= :FECINI AND FACT_FECFIN <= :FECFIN AND PREF_PRE = :PREF and FACT_ANULADO = 'S'
        INTO :anuladas, :ivaanul;
    select sum(fade_consumo+fade_inalcm) from facturas_detalle d, facturas f
        where f.fact_id = d.fact_id and f.fact_fecha >= :fecini and f.fact_fecha <= :fecfin and f.fact_anulado = 'N'
        into :consumo;
    if (CONSUMO IS NULL) then
        CONSUMO = 0;
    INGRESOS = INGRESOS - CONSUMO;
    select sum(rd.rcde_dtof) from recibos_caja_detalle rd, facturas f where f.fact_id = rd.rcde_iddoc and rd.rcde_tipodoc = 31
        and f.fact_dtofmonto <> 0 and f.fact_fecha >= :fecini and f.fact_fecha <= :fecfin and rd.rcde_anulado = 'N'
        into :desctoscond;
    select sum(rd.rcde_dtof) from recibos_caja_detalle rd, facturas f where f.fact_id = rd.rcde_iddoc and rd.rcde_tipodoc = 31
        and f.fact_dtofmonto = 0 and f.fact_fecha >= :fecini and f.fact_fecha <= :fecfin and rd.rcde_anulado = 'N'
        into :desctosnocond;
    END
END^

SET TERM ; ^

ALTER TABLE PUNTO_VENTA
ADD PTVT_IDDIAN VARCHAR(20);

SET TERM ^ ;

CREATE OR ALTER procedure MM14_FACTURACIONPOS (
    FECINI DATE,
    FECFIN DATE)
returns (PUNTOPOS VARCHAR(20),
    PREF VARCHAR(10),
    NUMINI VARCHAR(8),
    NUMFIN VARCHAR(8),
    EXENTOS NUMERIC(18,2),
    BASE16 NUMERIC(18,2),
    BASE5 NUMERIC(18,2),
    CONSUMO16 NUMERIC(18,2),
    CONSUMO8 NUMERIC(18,2),
    CONSUMO4 NUMERIC(18,2),
    DESCTOS NUMERIC(18,2),
    FORMAP INTEGER,
    FACTURAS INTEGER,
    TOTAL NUMERIC(18,2))
AS
BEGIN
FOR SELECT PREF_PRE FROM PREFIJOS WHERE PREF_ACTIVO = 'S' AND TIDO_COD = 31 INTO :PREF
    DO
    BEGIN
    select first 1 ptvt_iddian from punto_venta where pref_pre = :pref order by ptvt_iddian into :puntopos;
    
    SELECT MIN(FACT_NUMERO), MAX(FACT_NUMERO), SUM(FACT_TOTAL), COUNT(FACT_ID)
        FROM FACTURAS WHERE FACT_FECHA >= :FECINI AND FACT_FECFIN <= :FECFIN AND PREF_PRE = :PREF and FACT_ANULADO = 'N'
        INTO :NUMINI, :NUMFIN, :TOTAL, :FACTURAS;

    SELECT SUM(FADE_TOTAL) FROM facturas_detalle D, FACTURAS F
        WHERE D.FACT_ID = F.FACT_ID AND FACT_FECHA >= :FECINI AND FACT_FECHA <= :FECFIN AND PREF_PRE = :PREF AND FADE_IVAMONTO = 0
        and FADE_INALCM = 0 and FACT_ANULADO = 'N'
        INTO :exentos;
    if (exentos is null) then
        exentos = 0;
    SELECT SUM(FADE_TOTAL-FADE_IVAMONTO-FADE_INALCM) FROM facturas_detalle D, FACTURAS F
        WHERE D.FACT_ID = F.FACT_ID AND FACT_FECHA >= :FECINI AND FACT_FECHA <= :FECFIN AND PREF_PRE = :PREF AND FADE_IVAPORC = 16 and FACT_ANULADO = 'N'
        INTO :base16;
    if (base16 is null) then
        base16 = 0;
    SELECT SUM(FADE_TOTAL-FADE_IVAMONTO-FADE_INALCM) FROM facturas_detalle D, FACTURAS F
        WHERE D.FACT_ID = F.FACT_ID AND FACT_FECHA >= :FECINI AND FACT_FECHA <= :FECFIN AND PREF_PRE = :PREF AND FADE_IVAPORC = 5 and FACT_ANULADO = 'N'
        INTO :base5;
    if (base5 is null) then
        base5 = 0;
    SELECT SUM(FADE_TOTAL-FADE_IVAMONTO-FADE_INALCM) FROM facturas_detalle D, FACTURAS F
        WHERE D.FACT_ID = F.FACT_ID AND FACT_FECHA >= :FECINI AND FACT_FECHA <= :FECFIN AND PREF_PRE = :PREF AND FADE_INALCP = 16 and FACT_ANULADO = 'N'
        INTO :CONSUMO16;
    if (CONSUMO16 is null) then
        CONSUMO16 = 0;
    SELECT SUM(FADE_TOTAL-FADE_IVAMONTO-FADE_INALCM) FROM facturas_detalle D, FACTURAS F
        WHERE D.FACT_ID = F.FACT_ID AND FACT_FECHA >= :FECINI AND FACT_FECHA <= :FECFIN AND PREF_PRE = :PREF AND FADE_INALCP = 8 and FACT_ANULADO = 'N'
        INTO :CONSUMO8;
    if (CONSUMO8 is null) then
        CONSUMO8 = 0;
    SELECT SUM(FADE_TOTAL-FADE_IVAMONTO-FADE_INALCM) FROM facturas_detalle D, FACTURAS F
        WHERE D.FACT_ID = F.FACT_ID AND FACT_FECHA >= :FECINI AND FACT_FECHA <= :FECFIN AND PREF_PRE = :PREF AND FADE_INALCP = 4 and FACT_ANULADO = 'N'
        INTO :CONSUMO4;
    if (CONSUMO4 is null) then
        CONSUMO4 = 0;
    FORMAP = 1;
    select sum(rd.rcde_dtof) from recibos_caja_detalle rd, facturas f where f.fact_id = rd.rcde_iddoc and rd.rcde_tipodoc = 31
        and f.fact_fecha >= :fecini and f.fact_fecha <= :fecfin and rd.rcde_anulado = 'N'
        into :desctos;
    END
END^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER procedure MM14_TERCEROS (
    FECINI char(8),
    FECFIN char(8))
returns (
    TIPOID integer,
    NIT varchar(20),
    DV char(1),
    NATUR char(1),
    APE1 varchar(60),
    APE2 varchar(60),
    NOM1 varchar(60),
    NOM2 varchar(60),
    RAZON varchar(60),
    DIREC varchar(100),
    ACTIV char(4),
    PAIS char(3),
    DPTO char(2),
    MPIO char(3),
    CORREO varchar(100),
    TELEF varchar(40),
    CELUL varchar(40))
AS
begin
FOR SELECT TERC_NIT, TERC_NOM, TERC_NOMBRE1, TERC_NOMBRE2, TERC_APELLIDO1, TERC_APELLIDO2, TERC_DV, TERC_ACTIVIDAD,
    TERC_DIR, SUBSTR(CIUD_COD,1,2), SUBSTR(CIUD_COD,3,5), PAIS_ID, I.tiid_codigo, I.tiid_natur, T.terc_email, T.terc_tel, T.terc_cel
    FROM TERCEROS T, tipo_id I WHERE T.TERC_TIPOID = I.tiid_cod AND
    EXISTS (SELECT D.ENCO_CONSEC FROM comprobante_detalle D, COMPROBANTE_ENCABEZADO E WHERE E.enco_consec = D.enco_consec
    AND D.TERC_NIT = T.TERC_NIT AND E.enco_fecha >= :FECINI  AND E.enco_fecha <= :FECFIN AND ((CODE_DEBITO <> 0) OR (CODE_CREDITO <> 0)))
    INTO :NIT, :RAZON, :NOM1, :NOM2, :APE1, :APE2, :DV, :ACTIV,
    :DIREC, :DPTO, :MPIO, :PAIS, :TIPOID, :NATUR, :CORREO, :TELEF, :CELUL
    DO
    BEGIN
    suspend;
    END
end^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER procedure MM14_MOVTERCEROS (
    FECINI char(8),
    FECFIN char(8))
returns (
    CUENTA varchar(20),
    NOMCUENTA varchar(100),
    TIPOID integer,
    NIT varchar(20),
    SALDOINI numeric(18,2),
    DEBITOS numeric(18,2),
    CREDITOS numeric(18,2),
    SALDOFIN numeric(18,2))
AS
declare variable cta varchar(20);
declare variable VALOR NUMERIC(18,2);
declare variable fecaux char(8);
begin
execute procedure fecha_y_numero_conta (:fecini, -1) returning_values (:fecaux);
for select cuen_cod, cuen_nom from cuentas where strlen(cuen_cod) = 6 order by cuen_cod into :cuenta, :nomcuenta
    do
    begin
    for select terc_nit from terceros t where exists (select enco_consec from comprobante_detalle d where terc_nit = t.terc_nit
        and substring(cuen_cod from 1 for 6) = :cuenta) or exists (select sain_item from saldos_iniciales where terc_nit = t.terc_nit
        and substring(cuen_cod from 1 for 6) = :cuenta) into :nit
        do
        begin
        /* ojo nit de bancos, inventario si con la empresa etc. */
        select sum(code_debito), sum(code_credito)
            from comprobante_detalle d, comprobante_encabezado e
            where e.enco_consec = d.enco_consec and e.enco_fecha >= :fecini and e.enco_fecha <= :fecfin
            and substring(d.cuen_cod from 1 for 6) = :cuenta and d.terc_nit = :nit
            into :debitos, :creditos;
        select ti.tiid_codigo from terceros te, tipo_id ti where te.terc_tipoid = ti.tiid_cod AND TE.terc_nit = :NIT into :tipoid;
        SALDOINI = 0;
        for select cuen_cod from cuentas where substring(cuen_cod from 1 for 6) = :cuenta into :cta
            DO
            begin
            execute procedure saldo_tercero(:cta, :nit, :fecaux) returning_values (:valor);
            saldoini = SALDOINI + VALOR;
            end
        SALDOFIN = SALDOINI + DEBITOS - CREDITOS;
        if ((SALDOINI <> 0) OR (debitos <> 0) OR (creditos <> 0) OR (SALDOFIN <> 0)) then
            SUSPEND;
        end
    end
end^

SET TERM ; ^


/* 201413 */
/* ESTADO DEL ARTICULO AL EXPORTAR REPORTE */
SET TERM ^ ;

CREATE OR ALTER procedure EXISTENCIAS_DESDE_HASTA (
    FECHA date,
    ARTINI varchar(20),
    ARTFIN varchar(20),
    GRPINI varchar(3),
    GRPFIN varchar(3),
    BODINI varchar(2),
    BODFIN varchar(2),
    ORDEN char(1),
    AGRUPA char(1),
    DETALLE char(1),
    RESERVA char(1),
    ENPESO char(1),
    MASIVA char(1),
    INACTIVOS char(1),
    SUCURSAL integer)
returns (
    CANT numeric(18,2),
    COSTO numeric(18,2),
    COSTO_LOTE numeric(18,2),
    CODIGO varchar(15),
    NOMBRE varchar(60),
    DESCORTA varchar(30),
    UNIDAD varchar(8),
    STAND varchar(20),
    CODGRUPO varchar(2),
    NOMGRUPO varchar(30),
    CODSUBG varchar(3),
    NOMSUBG varchar(30),
    CODMARC varchar(3),
    NOMMARC varchar(30),
    INVIMA varchar(20),
    CODBOD varchar(2),
    LOTE varchar(15),
    LOTEV date,
    NOMBOD varchar(30),
    COSTOTOT numeric(18,2),
    COSTOIVA numeric(18,2),
    ULTCOSTO numeric(18,2),
    FECHACOSTO date,
    CONSUMO numeric(18,2),
    RESERVADO numeric(18,4),
    ORDENADO numeric(18,4),
    IVA numeric(9,2),
    IVAMONTO numeric(18,2),
    PESOUNIT numeric(18,4),
    PESOTOTAL numeric(18,4),
    PRECIO numeric(18,2),
    CODBAR varchar(20),
    ESTADO CHAR(1))
AS
declare variable exist char(1);
declare variable codini varchar(20);
declare variable codfin varchar(20);
declare variable desini varchar(20);
declare variable desfin varchar(20);
declare variable ordenc numeric(18,4);
declare variable pedido numeric(18,4);
declare variable ok char(1);
declare variable id integer;
declare variable item integer;
declare variable und varchar(8);
declare variable factor numeric(18,4);
declare variable cant2 numeric(18,4);
declare variable PEDAUTO CHAR(2);
DECLARE VARIABLE LISTA INTEGER;
declare variable FACCOST NUMERIC(18,4);
BEGIN
EXECUTE PROCEDURE lee_configuracion ('FACTURACION','FACTURAS', 'CODIGO DE LA LISTA DE PRECIOS A MOSTRAR EN ARTICULOS') returning_values (:LISTA);
if (ORDEN = 'C') then
    BEGIN
    CODINI = ARTINI;
    CODFIN = ARTFIN;
    DESINI = '';
    DESFIN = 'zz';
    END
ELSE
    BEGIN
    DESINI = ARTINI;
    DESFIN = ARTFIN;
    CODINI = '';
    CODFIN = 'zz';
    END
EXECUTE PROCEDURE LEE_CONFIGURACION('FACTURACION', 'FACTURAS', 'GENERAR PEDIDO AUTOMATICAMENTE CON LA FACTURA') returning_values (pedauto);
if ((DETALLE = 'B') or (DETALLE = 'L')) then
  BEGIN
  FOR SELECT ARTI_COD, ARTI_DES, ARTI_DESCORTA, ARTI_UNIDAD, ARTI_EXIST, TAIV_PORC, A.GRUP_COD, A.SUBG_COD, A.MARC_COD, BODE_COD, BODE_NOM, ARTI_CONSUMO, ARTI_PESO/1000, ARTI_INVIMA, ESAR_COD
      FROM ARTICULO A, BODEGA B, TARIFA_IVA T
      WHERE ARTI_COD >= :CODINI AND ARTI_COD <= :CODFIN AND ARTI_DES >= :DESINI AND ARTI_DES <= :DESFIN AND ((ESAR_COD <> 'I') or (:INACTIVOS = 'S')) AND BODE_COD >= :BODINI AND
      BODE_COD <= :BODFIN AND ((SUCU_ID = :SUCURSAL) or (:SUCURSAL = 0)) AND A.TAIV_COD = T.TAIV_COD
      INTO :CODIGO, :NOMBRE, :DESCORTA, :UNIDAD, :EXIST, :IVA, :CODGRUPO, :CODSUBG, :CODMARC, :CODBOD, :NOMBOD, :CONSUMO, :pesounit, :invima, :estado
      DO
        BEGIN
        STAND = '';
        OK = 'N';
        if (AGRUPA = 'G') then
            BEGIN
            if ((CODGRUPO >= GRPINI) AND (CODGRUPO <= GRPFIN)) then
                OK = 'S';
            end
        ELSE
            if (AGRUPA = 'M') then
                BEGIN
                if ((CODMARC >= GRPINI) AND (CODMARC <= GRPFIN)) then
                    OK = 'S';
                END
        if (OK = 'S') then
            BEGIN
            NOMGRUPO = '';
            NOMMARC = '';
            NOMSUBG = '';
            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;
            CODBAR = NULL;
            SELECT FIRST 1 COBA_COD FROM BARRAS_ARTICULO
                WHERE ARTI_COD = :codigo AND COBA_UNIDAD = :unidad ORDER BY STRLEN(COBA_COD) INTO :codbar;
            if (CODBAR IS NULL) then
                CODBAR = CODIGO;
            if (EXIST <> 'N') then
                BEGIN
                SELECT STAND_COD FROM STANDS WHERE ARTI_COD = :CODIGO AND STAND_BODEGA = :CODBOD INTO :STAND;
                EXECUTE PROCEDURE costo_promedio_y_ultimo_unidad(CODIGO, FECHA-1, UNIDAD) returning_values (COSTO, ULTCOSTO);
                /* EL FACTOR */
                FACCOST = 1;
                SELECT FIRST 1 FAIN_FACTOR FROM factor_inventario WHERE FAIN_FECINI <= :FECHA AND FAIN_FECFIN >= :FECHA INTO :FACCOST;
                ULTCOSTO = ULTCOSTO * FACCOST;
                COSTO = COSTO * FACCOST;

                SELECT FIRST 1 MVAR_FECHA FROM MOVIMIENTO_ARTICULO WHERE ARTI_COD = :CODIGO AND MVAR_ENTRADA = 'S' AND MVAR_FECHA <= :FECHA
                    ORDER BY ARTI_COD DESC, MVAR_FECHA DESC INTO :FECHACOSTO;
                
                if (CONSUMO <> 0) then
                    EXECUTE PROCEDURE CONSUMO_HISTORICO (:CODIGO, :fecha) returning_values (:CONSUMO);
                if (RESERVA = 'S') then
                    BEGIN
                    SELECT SUM(ORID_ENTREGAR)
                        FROM ORDENINVENTARIO_DETALLE OD, ordenes_inventario O
                        WHERE O.ORIN_ID = OD.ORIN_ID AND ARTI_COD = :CODIGO AND ORIN_FECHA <= :FECHA AND ORIN_FECLLEGA >= :FECHA AND ORID_ANULADO = 'N' AND OD.BODE_COD = :CODBOD
                        INTO :ORDENADO;
                    if (ORDENADO IS NULL) then
                        ORDENADO = 0;
                    ORDENC = 0;
                    FOR SELECT O.ORDC_ID, OCDE_ITEM, OCDE_CANT * OCDE_FACTOR
                        FROM ORDENES_COMPRA O, ORDENES_COMPRA_DETALLE OD
                        WHERE O.ORDC_ID = OD.ORDC_ID AND OD.ARTI_COD = :CODIGO AND ORDC_VENCE >= :FECHA AND ORDC_FECHA <= :FECHA AND OCDE_ANULADO = 'N' AND OD.BODE_COD = :CODBOD
                        INTO :ID, :ITEM, :CANT2
                        do
                        BEGIN
                        EXECUTE PROCEDURE FALTANTE(23, 21, ID, ITEM) returning_values (PEDIDO, UND, FACTOR);
                        if (PEDIDO * FACTOR = CANT2) then /* SI NO SE HA FACTURADO MIRE A VER SI SE REMISIONO */
                            EXECUTE PROCEDURE FALTANTE(23, 22, ID, ITEM) returning_values (PEDIDO, UND, FACTOR);
                        if (PEDIDO IS NULL) then
                            PEDIDO = 0;
                        ORDENC = ORDENC + PEDIDO * FACTOR;
                        END
                    ORDENADO = ORDENADO + ORDENC;
                    SELECT SUM(RSDE_LIBERAR)
                        FROM RESERVAS_DETALLE RD, RESERVAS R
                        WHERE R.RESE_ID = RD.RESE_ID AND ARTI_COD = :CODIGO AND RESE_FECHA <= :FECHA AND RESE_VENCE >= :FECHA AND RD.BODE_COD = :CODBOD AND RSDE_ANULADO = 'N'
                        INTO :RESERVADO;
                    if (RESERVADO IS NULL) then
                        RESERVADO = 0;
                    PEDIDO = 0;
                    FOR SELECT P.PEDI_ID, PEDE_ITEM, PEDE_CANT * PEDE_FACTOR
                        FROM PEDIDOS P, PEDIDOS_DETALLE PD
                        WHERE P.PEDI_ID = PD.PEDI_ID AND PD.ARTI_COD = :CODIGO AND PEDI_VENCE >= :FECHA AND PEDI_FECHA <= :FECHA AND PEDE_ANULADO = 'N' AND BODE_COD = :CODBOD
                        INTO :ID, :ITEM, :CANT2
                        do
                        BEGIN
                        EXECUTE PROCEDURE FALTANTE(34, 31, ID, ITEM) returning_values (ORDENC, UND, FACTOR);
                        if ((ORDENC * FACTOR = CANT2) or (PEDAUTO = 'SI')) then /* SI NO SE HA FACTURADO MIRE A VER SI SE REMISIONO */
                            EXECUTE PROCEDURE FALTANTE(34, 32, ID, ITEM) returning_values (ORDENC, UND, FACTOR);
                        if (ORDENC IS NULL) then
                            ORDENC = 0;
                        PEDIDO = PEDIDO + ORDENC * FACTOR;
                        END
                    RESERVADO = RESERVADO + PEDIDO;
                    END
                ELSE
                    BEGIN
                    RESERVADO = 0;
                    ORDENADO = 0;
                    END
                if (LISTA > 0) then
                    SELECT prar_fijo FROM precios_articulo WHERE arti_cod = :CODIGO and lipr_cod = :LISTA INTO :PRECIO;
                if ((DETALLE = 'L') AND (EXIST = 'L')) then
                    BEGIN
                    FOR SELECT L.lote_nro, L.lote_nro||' - '||L.lote_vence, l.lote_costo, LOTE_VENCE
                        FROM LOTES L WHERE ARTI_COD = :codigo AND BODE_COD = :codbod
                        INTO :LOTE, :NOMBOD, :costo_lote, :lotev
                        DO
                        BEGIN
                        if (CONSUMO <> 0) then
                            EXECUTE PROCEDURE CONSUMO_HISTORICO (:CODIGO, :fecha) returning_values (:CONSUMO);
                        execute procedure saldo_lote_fecha(:codigo, :codbod,  :lote,  :fecha-1) returning_values (:cant);
                        if (cant <> 0) then
                            begin
                            COSTOTOT = :CANT * :COSTO;
                            IVAMONTO = COSTOTOT /100 * IVA;
                            COSTOIVA = COSTOTOT;
                            if (MASIVA = 'S') then
                                BEGIN
                                COSTOIVA = COSTOTOT + IVAMONTO;
                                COSTO = COSTO * (100 + :IVA) / 100 + :CONSUMO;
                                END
                            CONSUMO = CONSUMO * CANT;
                            COSTOIVA = COSTOIVA + CONSUMO;
                            if (ENPESO = 'S') then
                                BEGIN
                                if (pesounit IS NULL) then
                                    pesounit = 0;
                                if (PESOUNIT <> 0) then
                                    BEGIN
                                    pesototal = PESOUNIT * cant;
                                    SUSPEND;
                                    END
                                END
                            ELSE
                                SUSPEND;
                            end
                        END
                    END
                else
                    BEGIN
                    EXECUTE PROCEDURE SALDO_INICIAL_INVENTARIO(CODIGO, FECHA, :CODBOD) returning_values (CANT);
                    COSTOTOT = :CANT * :COSTO;
                    IVAMONTO = COSTOTOT /100 * IVA;
                    COSTOIVA = COSTOTOT;
                    if (MASIVA = 'S') then
                        BEGIN
                        COSTOIVA = COSTOTOT + IVAMONTO;
                        COSTO = COSTO * (100 + :IVA) / 100 + :CONSUMO;
                        END
                    CONSUMO = CONSUMO * CANT;
                    COSTOIVA = COSTOIVA + CONSUMO;
                    if (ENPESO = 'S') then
                        BEGIN
                        if (pesounit IS NULL) then
                            pesounit = 0;
                        if (PESOUNIT <> 0) then
                            BEGIN
                            pesototal = PESOUNIT * cant;
                            SUSPEND;
                            END
                        END
                    ELSE
                        SUSPEND;
                    END
                END
            END
        END
  END

if (DETALLE = 'N') then
  BEGIN
  FOR SELECT ARTI_COD, ARTI_DES, ARTI_DESCORTA, ARTI_UNIDAD, ARTI_EXIST, TAIV_PORC, A.GRUP_COD, A.SUBG_COD, A.MARC_COD, ARTI_CONSUMO, ARTI_PESO/1000, ARTI_INVIMA, ESAR_COD
      FROM ARTICULO A, TARIFA_IVA T
      WHERE ARTI_COD >= :CODINI AND ARTI_COD <= :CODFIN AND ARTI_DES >= :DESINI AND ARTI_DES <= :DESFIN AND ((ESAR_COD <> 'I') or (:INACTIVOS = 'S')) AND A.TAIV_COD = T.TAIV_COD
      INTO :CODIGO, :NOMBRE, :DESCORTA, UNIDAD, :EXIST, :IVA, :CODGRUPO, :CODSUBG, :CODMARC, :CONSUMO, :pesounit, :invima, :estado
      DO
        BEGIN
        OK = 'N';
        if (AGRUPA = 'G') then
            BEGIN
            if ((GRPINI = '0') AND (GRPFIN = 'zz')) then
                OK = 'S';
            else
                if ((CODGRUPO >= GRPINI) AND (CODGRUPO <= GRPFIN)) then
                    OK = 'S';
            end
        ELSE
            if (AGRUPA = 'M') then
                BEGIN
                if ((GRPINI = '0') AND (GRPFIN = 'zzz')) then
                    OK = 'S';
                else
                    if ((CODMARC >= GRPINI) AND (CODMARC <= GRPFIN)) then
                        OK = 'S';
                END
        if (OK = 'S') then
            BEGIN
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            CODBAR = NULL;
            SELECT MAX(COBA_COD) FROM BARRAS_ARTICULO WHERE ARTI_COD = :codigo AND COBA_UNIDAD = :unidad INTO :codbar;
            if (CODBAR IS NULL) then
                CODBAR = CODIGO;

            if (EXIST <> 'N') then
                BEGIN
                EXECUTE PROCEDURE SALDO_INICIAL_TOTAL_INV(CODIGO, FECHA) returning_values (CANT);
                EXECUTE PROCEDURE costo_promedio_y_ultimo_unidad(CODIGO, FECHA-1, UNIDAD) returning_values (COSTO, ULTCOSTO);
                /* EL FACTOR */
                FACCOST = 1;
                SELECT FIRST 1 FAIN_FACTOR FROM factor_inventario WHERE FAIN_FECINI <= :FECHA AND FAIN_FECFIN >= :FECHA INTO :FACCOST;
                ULTCOSTO = ULTCOSTO * FACCOST;
                COSTO = COSTO * FACCOST;

                SELECT FIRST 1 MVAR_FECHA FROM MOVIMIENTO_ARTICULO WHERE ARTI_COD = :CODIGO AND MVAR_ENTRADA = 'S' AND MVAR_FECHA <= :FECHA
                    ORDER BY ARTI_COD DESC, MVAR_FECHA DESC INTO :FECHACOSTO;
                COSTOTOT = :CANT * :COSTO;
                IVAMONTO = COSTOTOT /100 * IVA;
                COSTOIVA = COSTOTOT;
                if (CONSUMO <> 0) then
                    EXECUTE PROCEDURE CONSUMO_HISTORICO (:CODIGO, :fecha) returning_values (:CONSUMO);
                if (MASIVA = 'S') then
                    BEGIN
                    COSTOIVA = COSTOTOT + IVAMONTO;
                    COSTO = COSTO * (100 + :IVA) / 100 + :CONSUMO;
                    END
                CONSUMO = CONSUMO * CANT;
                COSTOIVA = COSTOIVA + CONSUMO;
                if (RESERVA = 'S') then
                    BEGIN
                    SELECT SUM(ORID_ENTREGAR)
                        FROM ORDENINVENTARIO_DETALLE OD, ordenes_inventario O
                        WHERE O.ORIN_ID = OD.ORIN_ID AND ARTI_COD = :CODIGO AND ORIN_FECHA <= :FECHA AND ORIN_FECLLEGA >= :FECHA AND ORID_ANULADO = 'N'
                        INTO :ORDENADO;
                        if (ORDENADO IS NULL) then
                            ORDENADO = 0;
                    ORDENC = 0;
                    FOR SELECT O.ORDC_ID, OCDE_ITEM, OCDE_CANT * OCDE_FACTOR
                        FROM ORDENES_COMPRA O, ORDENES_COMPRA_DETALLE OD
                        WHERE O.ORDC_ID = OD.ORDC_ID AND OD.ARTI_COD = :CODIGO AND ORDC_VENCE >= :FECHA AND ORDC_FECHA <= :FECHA AND OCDE_ANULADO = 'N'
                        INTO :ID, :ITEM, :CANT2
                        do
                        BEGIN
                        EXECUTE PROCEDURE FALTANTE(23, 21, ID, ITEM) returning_values (PEDIDO, UND, FACTOR);
                        if (PEDIDO * FACTOR = CANT2) then /* SI NO SE HA FACTURADO MIRE A VER SI SE REMISIONO */
                            EXECUTE PROCEDURE FALTANTE(23, 22, ID, ITEM) returning_values (PEDIDO, UND, FACTOR);
                        if (PEDIDO IS NULL) then
                            PEDIDO = 0;
                        ORDENC = ORDENC + PEDIDO * FACTOR;
                        END
                    ORDENADO = ORDENADO + ORDENC;
                    SELECT SUM(RSDE_LIBERAR)
                        FROM RESERVAS_DETALLE RD, RESERVAS R
                        WHERE R.RESE_ID = RD.RESE_ID AND ARTI_COD = :CODIGO AND RESE_FECHA <= :FECHA AND RESE_VENCE >= :FECHA AND RSDE_ANULADO = 'N'
                        INTO :RESERVADO;
                    if (RESERVADO IS NULL) then
                        RESERVADO = 0;
                    PEDIDO = 0;
                    FOR SELECT P.PEDI_ID, PEDE_ITEM, PEDE_CANT * PEDE_FACTOR
                        FROM PEDIDOS P, PEDIDOS_DETALLE PD, PUNTO_VENTA PT
                        WHERE P.PEDI_ID = PD.PEDI_ID AND PD.ARTI_COD = :CODIGO AND PT.ptvt_id = P.PTVT_ID AND PEDI_VENCE >= :FECHA AND PEDI_FECHA <= :FECHA AND PEDE_ANULADO = 'N'
                        INTO :ID, :ITEM, :CANT2
                        do
                        BEGIN
                        EXECUTE PROCEDURE FALTANTE(34, 31, ID, ITEM) returning_values (ORDENC, UND, FACTOR);
                        if ((ORDENC * FACTOR = CANT2) or (PEDAUTO = 'SI')) then /* SI NO SE HA FACTURADO MIRE A VER SI SE REMISIONO */
                            EXECUTE PROCEDURE FALTANTE(34, 32, ID, ITEM) returning_values (ORDENC, UND, FACTOR);
                        if (ORDENC IS NULL) then
                            ORDENC = 0;
                        PEDIDO = PEDIDO + ORDENC * FACTOR;
                        END
                    if (PEDIDO IS NULL) then
                        PEDIDO = 0;
                    RESERVADO = RESERVADO + PEDIDO;
                    END
                ELSE
                    BEGIN
                    RESERVADO = 0;
                    ORDENADO = 0;
                    END
                if (LISTA > 0) then
                    SELECT prar_fijo FROM precios_articulo WHERE arti_cod = :CODIGO and lipr_cod = :LISTA INTO :PRECIO;

                if (ENPESO = 'S') then
                    BEGIN
                    if (pesounit IS NULL) then
                        pesounit = 0;
                    if (PESOUNIT <> 0) then
                        BEGIN
                        pesototal = PESOUNIT * cant;
                        SUSPEND;
                        END
                    END
                ELSE
                    SUSPEND;
                END
            END
        END
  END
END^

SET TERM ; ^

/* 201414 */
ALTER TABLE PROCEDIMIENTOS_USUARIO
ADD PRUS_MODULO T_CONCEPTO;


UPDATE or INSERT INTO PROCEDIMIENTOS_USUARIO (PRUS_COD, PRUS_NOMBRE, PRUS_SP, PRUS_PARAM1, PRUS_PARAM2, PRUS_PARAM3, PRUS_PARAM4, PRUS_PARAM5, PRUS_MODULO) VALUES (1, 'Conciliación Facturación-contable ventas por tarifas de IVA', 'CONCILIA_VENTAS', 'Sólo diferencias (S/N)', 'Nulo', 'Nulo', NULL, NULL, 'FACTURACION');
UPDATE or INSERT INTO PROCEDIMIENTOS_USUARIO (PRUS_COD, PRUS_NOMBRE, PRUS_SP, PRUS_PARAM1, PRUS_PARAM2, PRUS_PARAM3, PRUS_PARAM4, PRUS_PARAM5, PRUS_MODULO) VALUES (2, 'Conciliación Devoluciones ventas-contable por tarifa de IVA', 'CONCILIA_DEVVENTAS', 'Cuenta exentos', 'Cuenta Gravados 16%', 'Cuenta Otras tarifas', NULL, NULL, 'FACTURACION');
UPDATE or INSERT INTO PROCEDIMIENTOS_USUARIO (PRUS_COD, PRUS_NOMBRE, PRUS_SP, PRUS_PARAM1, PRUS_PARAM2, PRUS_PARAM3, PRUS_PARAM4, PRUS_PARAM5, PRUS_MODULO) VALUES (3, 'Conciliación Compras-contable compras por tarifa de IVA', 'CONCILIA_COMPRAS', 'Sólo diferencias (S/N)', 'Nulo', 'Nulo', NULL, NULL, 'COMPRAS');
UPDATE or INSERT INTO PROCEDIMIENTOS_USUARIO (PRUS_COD, PRUS_NOMBRE, PRUS_SP, PRUS_PARAM1, PRUS_PARAM2, PRUS_PARAM3, PRUS_PARAM4, PRUS_PARAM5, PRUS_MODULO) VALUES (4, 'Conciliación Devoluciones Compras-contable por tarifa de IVA', 'CONCILIA_DEVCOMPRAS', 'Cuenta exentos', 'Cuenta Gravados 16%', 'Cuenta Otras tarifas', NULL, NULL, 'COMPRAS');
UPDATE or INSERT INTO PROCEDIMIENTOS_USUARIO (PRUS_COD, PRUS_NOMBRE, PRUS_SP, PRUS_PARAM1, PRUS_PARAM2, PRUS_PARAM3, PRUS_PARAM4, PRUS_PARAM5, PRUS_MODULO) VALUES (5, 'Conciliación cartera-contable saldos por tercero', 'CONCILIA_CARTERA', 'Cuenta cartera', 'Agencia', 'Sólo descuadre mes', NULL, NULL, 'CARTERA');
UPDATE or INSERT INTO PROCEDIMIENTOS_USUARIO (PRUS_COD, PRUS_NOMBRE, PRUS_SP, PRUS_PARAM1, PRUS_PARAM2, PRUS_PARAM3, PRUS_PARAM4, PRUS_PARAM5, PRUS_MODULO) VALUES (6, 'Conciliación cxpagar-contable saldos por tercero', 'CONCILIA_CXPAGAR', 'Cuenta proveedores', 'Agencia', 'Sólo descuadre mes', NULL, NULL, 'C X PAGAR');
UPDATE or INSERT INTO PROCEDIMIENTOS_USUARIO (PRUS_COD, PRUS_NOMBRE, PRUS_SP, PRUS_PARAM1, PRUS_PARAM2, PRUS_PARAM3, PRUS_PARAM4, PRUS_PARAM5, PRUS_MODULO) VALUES (7, 'Movimientos del banco no conciliados', 'MOVBANCO_NO_CONCILIADOS', 'Cuenta banco', 'Nulo', 'Nulo', NULL, NULL, 'TESORERIA');
UPDATE or INSERT INTO PROCEDIMIENTOS_USUARIO (PRUS_COD, PRUS_NOMBRE, PRUS_SP, PRUS_PARAM1, PRUS_PARAM2, PRUS_PARAM3, PRUS_PARAM4, PRUS_PARAM5, PRUS_MODULO) VALUES (8, 'Movimientos banco diferentes en conciliacion', 'DIF_MOVBANCO_CONCILIACION', 'Cuenta banco', 'Nulo', 'Nulo', NULL, NULL, 'TESORERIA');
UPDATE or INSERT INTO PROCEDIMIENTOS_USUARIO (PRUS_COD, PRUS_NOMBRE, PRUS_SP, PRUS_PARAM1, PRUS_PARAM2, PRUS_PARAM3, PRUS_PARAM4, PRUS_PARAM5, PRUS_MODULO) VALUES (9, 'Movimiento caja vs contabilidad', 'CONCILIA_CAJA', 'Caja', 'Cuenta contable', 'Nulo', NULL, NULL, 'TESORERIA');
UPDATE or INSERT INTO PROCEDIMIENTOS_USUARIO (PRUS_COD, PRUS_NOMBRE, PRUS_SP, PRUS_PARAM1, PRUS_PARAM2, PRUS_PARAM3, PRUS_PARAM4, PRUS_PARAM5, PRUS_MODULO) VALUES (10, 'Movimiento banco vs contabilidad', 'CONCILIA_BANCO_CONTA', 'Banco', 'Cuenta contable', 'Nulo', NULL, NULL, 'TESORERIA');
UPDATE or INSERT INTO PROCEDIMIENTOS_USUARIO (PRUS_COD, PRUS_NOMBRE, PRUS_SP, PRUS_PARAM1, PRUS_PARAM2, PRUS_PARAM3, PRUS_PARAM4, PRUS_PARAM5, PRUS_MODULO) VALUES (11, 'Comprobantes contables negativos', 'COMPROBANTES_NEGATIVOS', '', '', '', NULL, NULL, 'CONTABILIDAD');
UPDATE or INSERT INTO PROCEDIMIENTOS_USUARIO (PRUS_COD, PRUS_NOMBRE, PRUS_SP, PRUS_PARAM1, PRUS_PARAM2, PRUS_PARAM3, PRUS_PARAM4, PRUS_PARAM5, PRUS_MODULO) VALUES (12, 'Conciliación inventario por tipo de documento', 'CONCILIA_INVENTARIO', 'Sólo diferencias (S/N)', 'Nulo', 'Nulo', NULL, NULL, 'INVENTARIO');
UPDATE or INSERT INTO PROCEDIMIENTOS_USUARIO (PRUS_COD, PRUS_NOMBRE, PRUS_SP, PRUS_PARAM1, PRUS_PARAM2, PRUS_PARAM3, PRUS_PARAM4, PRUS_PARAM5, PRUS_MODULO) VALUES (14, 'Facturas que no afectaron el inventario', 'FACTURAS_SIN_INVENTARIO', 'Agencia', 'Nulo', 'Nulo', NULL, NULL, 'FACTURACION');
UPDATE or INSERT INTO PROCEDIMIENTOS_USUARIO (PRUS_COD, PRUS_NOMBRE, PRUS_SP, PRUS_PARAM1, PRUS_PARAM2, PRUS_PARAM3, PRUS_PARAM4, PRUS_PARAM5, PRUS_MODULO) VALUES (15, 'Devoluciones que no afectaron el inventario', 'DEVOLUCIONES_SIN_INVENTARIO', 'Agencia', 'Nulo', 'Nulo', NULL, NULL, 'FACTURACION');
UPDATE or INSERT INTO PROCEDIMIENTOS_USUARIO (PRUS_COD, PRUS_NOMBRE, PRUS_SP, PRUS_PARAM1, PRUS_PARAM2, PRUS_PARAM3, PRUS_PARAM4, PRUS_PARAM5, PRUS_MODULO) VALUES (16, 'Facturas Compra que no afectaron el inventario', 'FACTCOMP_SIN_INVENTARIO', 'Agencia', 'Nulo', 'Nulo', NULL, NULL, 'COMPRAS');
UPDATE or INSERT INTO PROCEDIMIENTOS_USUARIO (PRUS_COD, PRUS_NOMBRE, PRUS_SP, PRUS_PARAM1, PRUS_PARAM2, PRUS_PARAM3, PRUS_PARAM4, PRUS_PARAM5, PRUS_MODULO) VALUES (17, 'Devoluciones compras que no afectaron el inventario', 'DEVOLCOMP_SIN_INVENTARIO', 'Agencia', 'Nulo', 'Nulo', NULL, NULL, 'COMPRAS');
UPDATE or INSERT INTO PROCEDIMIENTOS_USUARIO (PRUS_COD, PRUS_NOMBRE, PRUS_SP, PRUS_PARAM1, PRUS_PARAM2, PRUS_PARAM3, PRUS_PARAM4, PRUS_PARAM5, PRUS_MODULO) VALUES (18, 'Movimientos inventario no encontrdos', 'MOVIMIENTO_ARTICULO_ANULADO', 'Agencia', 'Nulo', 'Nulo', NULL, NULL, 'INVENTARIO');
UPDATE or INSERT INTO PROCEDIMIENTOS_USUARIO (PRUS_COD, PRUS_NOMBRE, PRUS_SP, PRUS_PARAM1, PRUS_PARAM2, PRUS_PARAM3, PRUS_PARAM4, PRUS_PARAM5, PRUS_MODULO) VALUES (19, 'Terceros creados en un lapso de tiempo', 'TERCEROS_CREADOS', 'Desde', 'Hasta', 'Nulo', NULL, NULL, 'CONTABILIDAD');
UPDATE or INSERT INTO PROCEDIMIENTOS_USUARIO (PRUS_COD, PRUS_NOMBRE, PRUS_SP, PRUS_PARAM1, PRUS_PARAM2, PRUS_PARAM3, PRUS_PARAM4, PRUS_PARAM5, PRUS_MODULO) VALUES (20, 'Facturas con total diferente a la suma de los items', 'FACTURAS_MAL_TOTAL', 'Prefijo', 'Nulo', 'Nulo', NULL, NULL, 'FACTURACION');
UPDATE or INSERT INTO PROCEDIMIENTOS_USUARIO (PRUS_COD, PRUS_NOMBRE, PRUS_SP, PRUS_PARAM1, PRUS_PARAM2, PRUS_PARAM3, PRUS_PARAM4, PRUS_PARAM5, PRUS_MODULO) VALUES (21, 'Lista de precios con escala', 'LISTA_PRECIOS_CON_ESCALA', 'Agencia', 'Lista', 'Grupo', NULL, NULL, 'FACTURACION');
COMMIT WORK;

SET TERM ^ ;

CREATE OR ALTER procedure COMPROBANTES_NEGATIVOS (
    FECINI date,
    FECFIN date,
    NULO1 char(1),
    NULO2 char(1),
    NULO3 char(1))
returns (
    TIPODOC varchar(8),
    PREFDOC varchar(4),
    NUMDOC varchar(6),
    FECHA char(10),
    CONCEPTO varchar(60),
    DEBITO numeric(18,2),
    CREDITO numeric(18,2))
AS
declare variable FECINIC char(10);
declare variable FECFINC char(10);
begin
EXECUTE PROCEDURE fecha_a_conta (:FECINI) returning_values (:FECINIC);
EXECUTE PROCEDURE fecha_a_conta (:FECFIN) returning_values (:FECFINC);
FOR SELECT e.tico_cod, e.prco_pref, e.enco_numero, e.enco_fecha, e.enco_concepto, d.code_debito, d.code_credito
    FROM comprobante_encabezado e, comprobante_detalle d
    where e.enco_consec = d.enco_consec and ((d.code_debito < 0) or (d.code_credito < 0))
    and e.enco_fecha <= :fecfinc and e.enco_fecha >= :fecinic
    into :tipodoc, :prefdoc, :numdoc, :fecha, :concepto, :debito, :credito
    do
    begin
    suspend;
    end
end^

SET TERM ; ^

grant execute on procedure comprobantes_negativos to public;

/* 201415 */
CREATE TABLE ARTICULO_DOCUMENTOS (
    ARTI_COD T_COD_ARTICULO NOT NULL,
    ARDO_ITEM T_ID NOT NULL,
    ARDO_ARCHIVO BLOB SUB_TYPE 0 SEGMENT SIZE 80,
    ARDO_NOMBRE EXPLICA);

ALTER TABLE ARTICULO_DOCUMENTOS
ADD CONSTRAINT PK_ARTICULO_DOCUMENTOS
PRIMARY KEY (ARTI_COD,ARDO_ITEM);

CREATE TABLE TERCERO_DOCUMENTOS (
    TERC_NIT T_NIT NOT NULL,
    TEDO_ITEM T_ID NOT NULL,
    TEDO_ARCHIVO BLOB SUB_TYPE 0 SEGMENT SIZE 80,
    TEDO_NOMBRE EXPLICA);

ALTER TABLE TERCERO_DOCUMENTOS
ADD CONSTRAINT PK_TERCERO_DOCUMENTOS
PRIMARY KEY (TERC_NIT,TEDO_ITEM);

SET TERM ^ ;

CREATE OR ALTER TRIGGER ARTICULO_DOCUMENTOS_BI FOR ARTICULO_DOCUMENTOS
ACTIVE BEFORE INSERT POSITION 0
as
begin
select max(ardo_item)+1 from articulo_documentos where arti_cod = new.arti_cod into new.ardo_item;
if (new.ardo_item is null) then
    new.ardo_item = 1;
end^

SET TERM ; ^

SET TERM ^ ;

create trigger TERCERO_DOCUMENTOS_BI for TERCERO_DOCUMENTOS
active BEFORE INSERT position 0
as
begin
select max(tedo_item)+1 from tercero_documentos where terc_nit = new.terc_nit into new.tedo_item;
if (new.tedo_item is null) then
    new.tedo_item = 1;
end^

SET TERM ; ^


ALTER TABLE USUARIO
ADD PTVT_ID T_ID;

/* 201416 */
/* PRECIO MINIMO <> COSTO */
SET TERM ^ ;

CREATE OR ALTER procedure ACTUALICE_PRMINIMO (
    FECHA date)
returns (
    ARTICULO varchar(20),
    PRMIN numeric(18,2))
AS
DECLARE VARIABLE COSTOP NUMERIC(18,2);
DECLARE VARIABLE UCOSTO NUMERIC(18,2);
declare variable BASE VARCHAR(8);
begin
EXECUTE PROCEDURE lee_configuracion('FACTURACION','ARTICULOS','COSTO BASE PARA CALCULO DE PRECIOS DE VENTA AUTOMATICOS') returning_values (:BASE);
FOR SELECT ARTI_COD FROM ARTICULO INTO ARTICULO
    DO
    BEGIN
    EXECUTE PROCEDURE costo_promedio_y_ultimo(:articulo, :fecha) RETURNING_VALUES (:costop, :ucosto);
    if (base = 'ULTIMO') then
        PRMIN = ucosto;
    ELSE
        BEGIN
        PRMIN = COSTOP;
        if (base = 'MAYOR') then
            if (COSTOP < UCOSTO) then
                PRMIN = UCOSTO;
        END
    UPDATE ARTICULO SET ARTI_PRECIO = :PRMIN WHERE ARTI_COD = :ARTICULO;
    suspend;
    END
end^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER procedure ACTUALICE_COSTO (
    ARTICULO varchar(15),
    FECHA date,
    COSTO numeric(18,2),
    CANTIDAD numeric(18,4),
    ENTRADA char(1),
    ANULAR char(1),
    IDMOV integer,
    TIPO integer)
AS
DECLARE VARIABLE exart CHAR(1);
DECLARE VARIABLE COSTOP NUMERIC(18,2);
DECLARE VARIABLE UCOSTO NUMERIC(18,2);
declare variable SALDOC NUMERIC(15,4);
declare variable BASE VARCHAR(10);
declare variable PRMIN NUMERIC(18, 2);
BEGIN
/* Verfique si el artículo tiene control de existencias */
SELECT arti_exist FROM articulo WHERE arti_COD = :articulo INTO :exart;
IF (exart <> 'N') THEN
    BEGIN
    if (ANULAR = 'S') then
        BEGIN
        DELETE FROM COSTOS WHERE (arti_cod = :articulo) AND (cost_fecha = :fecha) AND (cost_idmov = :IDMOV) AND (COST_TIPO = :TIPO);
        END
    ELSE
        BEGIN
        SELECT FIRST 1 (cost_saldoc + cost_entc - cost_salc) from costos WHERE (arti_cod = :articulo) AND
            (cost_fecha <= :fecha) ORDER BY ARTI_COD DESC, COST_FECHA DESC, COST_ITEM DESC into :saldoc;
        if (saldoc is null) THEN
            SALDOC = 0;
        EXECUTE PROCEDURE costo_promedio_y_ultimo(:articulo, :fecha) RETURNING_VALUES (:costop, :ucosto);
        if (ENTRADA = 'S') then
            if ((TIPO = 33) or (TIPO = 14))  then
                BEGIN
                INSERT INTO COSTOS (arti_cod, cost_fecha,
                    cost_entc, cost_entp, cost_salc, cost_salp,
                    cost_saldoc, cost_saldop, cost_ultimo, cost_idmov, cost_tipo)
                    VALUES (:articulo, :fecha, :cantidad, :cantidad*:costop, 0, 0, :saldoc, :saldoc*:costop, :ucosto, :IDMOV, :TIPO);
                END
            ELSE
                BEGIN
                UCOSTO = :COSTO;
                INSERT INTO COSTOS (arti_cod, cost_fecha,
                    cost_entc, cost_entp, cost_salc, cost_salp,
                    cost_saldoc, cost_saldop, cost_ultimo, cost_idmov, cost_tipo)
                    VALUES (:articulo, :fecha, :cantidad, :cantidad*:costo, 0, 0, :saldoc, :saldoc*:costop, :costo, :IDMOV, :TIPO);
                EXECUTE PROCEDURE lee_configuracion('FACTURACION','ARTICULOS','COSTO BASE PARA CALCULO DE PRECIOS DE VENTA AUTOMATICOS') returning_values (:BASE);
                if (base = 'ULTIMO') then
                    PRMIN = ucosto;
                ELSE
                    BEGIN
                    PRMIN = COSTOP;
                    if (base = 'MAYOR') then
                        if (COSTOP < UCOSTO) then
                            PRMIN = UCOSTO;
                    END
                UPDATE ARTICULO SET ARTI_PRECIO = :PRMIN WHERE ARTI_COD = :ARTICULO;
                END
        ELSE
            BEGIN
            INSERT INTO COSTOS (arti_cod, cost_fecha,
                cost_entc, cost_entp, cost_salc, cost_salp,
                cost_saldoc, cost_saldop, cost_ultimo, cost_idmov, cost_tipo)
                VALUES (:articulo, :fecha, 0, 0, :cantidad, :cantidad*:costop, :saldoc, :saldoc*:costop, :UCOSTO, :IDMOV, :TIPO);
            END
        END
    END
END^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE CHEQUEO_COSTOS(
    ARTICULO VARCHAR(20),
    FECHA DATE)
AS
DECLARE VARIABLE ID INTEGER;
DECLARE VARIABLE FECMV DATE;
DECLARE VARIABLE CANT NUMERIC(15,4);
DECLARE VARIABLE COSTO NUMERIC(18,2);
DECLARE VARIABLE ENTRADA CHAR(1);
DECLARE VARIABLE TIPO INTEGER;
begin
delete from costos where arti_cod = :ARTICULO AND COST_FECHA > :FECHA;
for select mvar_cons, mvar_fecha, mvar_cant, mvar_costo, mvar_entrada, mvar_tipodoc
    from movimiento_articulo WHERE ARTI_COD = :ARTICULO AND MVAR_FECHA > :FECHA
    order by mvar_fecha, mvar_cons /* SE HACE ESTRICTAMENTE EN ORDEN DE FECHA Y REGISTRO, SI LO EDITAN CAMBIA EL ORDEN */
    into :id, :fecmv, :cant, :costo, :entrada, :tipo
    do
    if ((TIPO <> 13)) then
        EXECUTE PROCEDURE actualice_costo(:ARTICULO, :fecmv, :costo, :cant, :entrada, 'N', :id, :tipo);
end
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE CHEQUEO_INVENTARIO(
    ARTINI VARCHAR(20),
    ARTFIN VARCHAR(20))
AS
DECLARE VARIABLE FECHA DATE;
DECLARE VARIABLE CANT NUMERIC(15,4);
DECLARE VARIABLE COSTO NUMERIC(18,2);
DECLARE VARIABLE ENTRADA CHAR(1);
DECLARE VARIABLE BODEGA CHAR(2);
DECLARE VARIABLE ID INTEGER;
DECLARE VARIABLE TIPO INTEGER;
declare variable TIPOEX CHAR(1);
DECLARE VARIABLE LOTE VARCHAR(20);
declare variable ARTICULO VARCHAR(20);
declare variable IDL INTEGER;
declare variable IDDOC INTEGER;
declare variable CANTTOT varchar(2);
declare variable comp varchar(20);
declare variable cantcomp numeric(18,2);
declare variable coscomp numeric(18,2);
BEGIN
execute procedure LEE_CONFIGURACION ('INVENTARIO', 'ENSAMBLES', 'FORMACIONES CON CANTIDADES TOTALES') returning_values (CANTTOT);
for select arti_cod, ARTI_EXIST from articulo where arti_cod >= :artini and arti_cod <= :artfin into :ARTICULO, :TIPOEX
  DO
  BEGIN
  DELETE FROM existencia_lote where arti_cod = :articulo;
  DELETE FROM lotes where arti_cod = :articulo;
  delete from costos where arti_cod = :ARTICULO;
  delete from existencia WHERE ARTI_COD = :ARTICULO;
  for select mvar_cons, mvar_fecha, mvar_cant, mvar_costo, mvar_entrada, bode_cod, mvar_tipodoc, mvar_lote, MVAR_IDREF
    from movimiento_articulo WHERE ARTI_COD = :ARTICULO
    order by arti_cod, mvar_fecha, mvar_cons
    into :id, :fecha, :cant, :costo, :entrada, :bodega, :tipo, :lote, :iddoc
  do
    begin
    if ((TIPO <> 13)) then
        BEGIN
        if (TIPO = 33) then
            BEGIN
            execute procedure costo_promedio(:articulo, :FECHA) returning_values (:COSTO);
            UPDATE MOVIMIENTO_ARTICULO SET MVAR_COSTO = :costo WHERE arti_cod = :articulo and MVAR_cons = :id;
            END
        if ((TIPO = 15) AND (ENTRADA = 'S')) Then
            begin
            costo = 0;
            for select arti_cod, esde_cant * esde_factor from ensambles_detalle where ensa_id = :iddoc
                into :comp, :cantcomp
                do
                begin
                execute procedure costo_promedio(:comp, :FECHA) returning_values (:coscomp);
                costo = costo + (coscomp * cantcomp);
                end
            if ((canttot = 'SI') AND (CANT <> 0)) then
                COSTO = COSTO / CANT;
            UPDATE MOVIMIENTO_ARTICULO SET MVAR_COSTO = :costo WHERE arti_cod = :articulo and MVAR_cons = :id;
            end
        EXECUTE PROCEDURE actualice_costo(:ARTICULO, :fecha, :costo, :cant, :entrada, 'N', :id, :tipo);
        END
    /* actualice existencias */
    if (:entrada = 'S') then
        begin
        execute procedure sume_existencia(:articulo, :bodega, :fecha, :cant, 'N');
        if (TIPOEX = 'L') then
            begin
            if (EXISTS (SELECT LOTE_NRO FROM LOTES WHERE ARTI_COD = :ARTICULO AND BODE_COD = :BODEGA AND LOTE_NRO = :lote)) then
                UPDATE LOTES
                    set lote_saldo = lote_saldo + :cant
                    where (arti_cod = :ARTICULO) and (BODE_COD = :BODEGA) AND (lote_nro = :lote);
            ELSE
                INSERT INTO LOTES (ARTI_COD, BODE_COD, LOTE_NRO, LOTE_FECHA, LOTE_CANT, LOTE_COSTO, LOTE_SALDO)
                    VALUES (:ARTICULO, :bodega, :lote, :fecha, :cant, :costo, :cant);
            if (EXISTS (SELECT LOTE_NRO FROM EXISTENCIA_LOTE WHERE LOTE_NRO = :LOTE AND EXLO_FECHA = :FECHA AND ARTI_COD = :articulo AND BODE_COD = :bodega)) then
                BEGIN
                UPDATE EXISTENCIA_LOTE
                    SET EXLO_ENT = EXLO_ENT + :cant
                    WHERE LOTE_NRO = :LOTE AND EXLO_FECHA = :FECHA AND ARTI_COD = :articulo AND BODE_COD = :bodega;
                END
            ELSE
                BEGIN
                INSERT INTO EXISTENCIA_LOTE (ARTI_COD, BODE_COD, LOTE_NRO, EXLO_FECHA, EXLO_SAL, EXLO_ENT)
                    VALUES (:articulo, :bodega, :LOTE, :FECHA, 0, :CANT);
                END
            end
        end
    else
        begin
        execute procedure reste_existencia(:articulo, :bodega, :fecha, :cant, 'N');
        if (TIPOEX = 'L') then
            begin
            if (EXISTS (SELECT LOTE_NRO FROM LOTES WHERE ARTI_COD = :ARTICULO AND BODE_COD = :BODEGA AND LOTE_NRO = :lote)) then
                UPDATE LOTES
                    set lote_saldo = lote_saldo - :cant
                    where (arti_cod = :ARTICULO) AND (BODE_COD = :BODEGA) and (lote_nro = :lote);
            ELSE
                BEGIN
                /* ARREGLE EL LOTE YA QUE NO EXISTE */
                SELECT MIN(LOTE_ID) FROM LOTES WHERE ARTI_COD = :articulo AND BODE_COD = :BODEGA AND LOTE_SALDO >= :cant INTO :IDL;
                SELECT LOTE_NRO FROM LOTES WHERE LOTE_ID = :IDL INTO :LOTE;
                UPDATE MOVIMIENTO_ARTICULO SET MVAR_LOTE = :LOTE WHERE ARTI_COD = :ARTICULO AND MVAR_CONS = :ID;
                UPDATE LOTES
                    set lote_saldo = lote_saldo - :cant
                    where (arti_cod = :ARTICULO) and (BODE_COD = :BODEGA) AND (lote_nro = :lote);
                END
            if (EXISTS (SELECT EXLO_FECHA FROM EXISTENCIA_LOTE WHERE LOTE_NRO = :LOTE AND EXLO_FECHA = :FECHA
                AND ARTI_COD = :ARTICULO AND BODE_COD = :bodega)) then
                UPDATE EXISTENCIA_LOTE
                       SET EXLO_SAL = EXLO_SAL + :cant
                    WHERE LOTE_NRO = :LOTE AND EXLO_FECHA = :FECHA AND ARTI_COD = :ARTICULO AND BODE_COD = :bodega;
            else
                INSERT INTO EXISTENCIA_LOTE (ARTI_COD, BODE_COD, LOTE_NRO, EXLO_FECHA, EXLO_SAL, EXLO_ENT)
                    VALUES (:ARTICULO, :BODEGA, :LOTE, :FECHA, :CANT, 0);
            end
        end
    END
  END
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE CHEQUEO_INVENTARIO_FECHA(
    ARTINI VARCHAR(20),
    ARTFIN VARCHAR(20),
    FECINI DATE)
AS
DECLARE VARIABLE FECHA DATE;
DECLARE VARIABLE CANT NUMERIC(15,4);
DECLARE VARIABLE COSTO NUMERIC(18,2);
DECLARE VARIABLE ENTRADA CHAR(1);
DECLARE VARIABLE BODEGA CHAR(2);
DECLARE VARIABLE ID INTEGER;
DECLARE VARIABLE TIPO INTEGER;
declare variable TIPOEX CHAR(1);
DECLARE VARIABLE LOTE VARCHAR(20);
declare variable ARTICULO VARCHAR(20);
declare variable IDL INTEGER;
declare variable IDDOC INTEGER;
declare variable CANTTOT varchar(2);
declare variable comp varchar(20);
declare variable cantcomp numeric(18,2);
declare variable coscomp numeric(18,2);
BEGIN
execute procedure LEE_CONFIGURACION ('INVENTARIO', 'ENSAMBLES', 'FORMACIONES CON CANTIDADES TOTALES') returning_values (CANTTOT);
for select arti_cod, ARTI_EXIST from articulo where arti_cod >= :artini and arti_cod <= :artfin into :ARTICULO, :TIPOEX
  DO
  BEGIN
  DELETE FROM existencia_lote where arti_cod = :articulo AND EXLO_FECHA >= :FECINI;
  DELETE FROM lotes where arti_cod = :articulo AND LOTE_FECHA >= :FECINI;
  delete from costos where arti_cod = :ARTICULO AND COST_FECHA >= :FECINI;
  delete from existencia WHERE ARTI_COD = :ARTICULO AND EXIS_FECHA >= :FECINI;
  for select mvar_cons, mvar_fecha, mvar_cant, mvar_costo, mvar_entrada, bode_cod, mvar_tipodoc, mvar_lote, MVAR_IDREF
    from movimiento_articulo WHERE ARTI_COD = :ARTICULO AND MVAR_FECHA >= :FECINI
    order by arti_cod, mvar_fecha, mvar_cons
    into :id, :fecha, :cant, :costo, :entrada, :bodega, :tipo, :lote, :iddoc
  do
    begin
    if ((TIPO <> 13)) then
        BEGIN
        if (TIPO = 33) then
            BEGIN
            execute procedure costo_promedio(:articulo, :FECHA) returning_values (:COSTO);
            UPDATE MOVIMIENTO_ARTICULO SET MVAR_COSTO = :costo WHERE arti_cod = :articulo and MVAR_cons = :id;
            END
        if ((TIPO = 15) AND (ENTRADA = 'S')) Then
            begin
            costo = 0;
            for select arti_cod, esde_cant * esde_factor from ensambles_detalle where ensa_id = :iddoc
                into :comp, :cantcomp
                do
                begin
                execute procedure costo_promedio(:comp, :FECHA) returning_values (:coscomp);
                costo = costo + (coscomp * cantcomp);
                end
            if ((canttot = 'SI') AND (CANT <> 0)) then
                COSTO = COSTO / CANT;
            UPDATE MOVIMIENTO_ARTICULO SET MVAR_COSTO = :costo WHERE arti_cod = :articulo and MVAR_cons = :id;
            end
        EXECUTE PROCEDURE actualice_costo(:ARTICULO, :fecha, :costo, :cant, :entrada, 'N', :id, :tipo);
        END
    /* actualice existencias */
    if (:entrada = 'S') then
        begin
        execute procedure sume_existencia(:articulo, :bodega, :fecha, :cant, 'N');
        if (TIPOEX = 'L') then
            begin
            if (EXISTS (SELECT LOTE_NRO FROM LOTES WHERE ARTI_COD = :ARTICULO AND BODE_COD = :BODEGA AND LOTE_NRO = :lote)) then
                UPDATE LOTES
                    set lote_saldo = lote_saldo + :cant
                    where (arti_cod = :ARTICULO) and (BODE_COD = :BODEGA) AND (lote_nro = :lote);
            ELSE
                INSERT INTO LOTES (ARTI_COD, BODE_COD, LOTE_NRO, LOTE_FECHA, LOTE_CANT, LOTE_COSTO, LOTE_SALDO)
                    VALUES (:ARTICULO, :bodega, :lote, :fecha, :cant, :costo, :cant);
            if (EXISTS (SELECT LOTE_NRO FROM EXISTENCIA_LOTE WHERE LOTE_NRO = :LOTE AND EXLO_FECHA = :FECHA AND ARTI_COD = :articulo AND BODE_COD = :bodega)) then
                BEGIN
                UPDATE EXISTENCIA_LOTE
                    SET EXLO_ENT = EXLO_ENT + :cant
                    WHERE LOTE_NRO = :LOTE AND EXLO_FECHA = :FECHA AND ARTI_COD = :articulo AND BODE_COD = :bodega;
                END
            ELSE
                BEGIN
                INSERT INTO EXISTENCIA_LOTE (ARTI_COD, BODE_COD, LOTE_NRO, EXLO_FECHA, EXLO_SAL, EXLO_ENT)
                    VALUES (:articulo, :bodega, :LOTE, :FECHA, 0, :CANT);
                END
            end
        end
    else
        begin
        execute procedure reste_existencia(:articulo, :bodega, :fecha, :cant, 'N');
        if (TIPOEX = 'L') then
            begin
            if (EXISTS (SELECT LOTE_NRO FROM LOTES WHERE ARTI_COD = :ARTICULO AND BODE_COD = :BODEGA AND LOTE_NRO = :lote)) then
                UPDATE LOTES
                    set lote_saldo = lote_saldo - :cant
                    where (arti_cod = :ARTICULO) AND (BODE_COD = :BODEGA) and (lote_nro = :lote);
            ELSE
                BEGIN
                /* ARREGLE EL LOTE YA QUE NO EXISTE
                SELECT MIN(LOTE_ID) FROM LOTES WHERE ARTI_COD = :articulo AND BODE_COD = :BODEGA AND LOTE_SALDO >= :cant INTO :IDL;
                SELECT LOTE_NRO FROM LOTES WHERE LOTE_ID = :IDL INTO :LOTE;
                UPDATE MOVIMIENTO_ARTICULO SET MVAR_LOTE = :LOTE WHERE ARTI_COD = :ARTICULO AND MVAR_CONS = :ID;
                UPDATE LOTES
                    set lote_saldo = lote_saldo - :cant
                    where (arti_cod = :ARTICULO) and (BODE_COD = :BODEGA) AND (lote_nro = :lote);*/
                exception lote_no_existe 'No se encontro el lote ' || :lote || ' para el articulo ' || :articulo || ' en la bodega ' || :bodega;
                END
            if (EXISTS (SELECT EXLO_FECHA FROM EXISTENCIA_LOTE WHERE LOTE_NRO = :LOTE AND EXLO_FECHA = :FECHA
                AND ARTI_COD = :ARTICULO AND BODE_COD = :bodega)) then
                UPDATE EXISTENCIA_LOTE
                       SET EXLO_SAL = EXLO_SAL + :cant
                    WHERE LOTE_NRO = :LOTE AND EXLO_FECHA = :FECHA AND ARTI_COD = :ARTICULO AND BODE_COD = :bodega;
            else
                INSERT INTO EXISTENCIA_LOTE (ARTI_COD, BODE_COD, LOTE_NRO, EXLO_FECHA, EXLO_SAL, EXLO_ENT)
                    VALUES (:ARTICULO, :BODEGA, :LOTE, :FECHA, :CANT, 0);
            end
        end
    END
  INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
    VALUES (USER, 141, 1, 'I', :ARTICULO);
  END
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE CHEQUEO_LOTES(
    ARTINI VARCHAR(20),
    ARTFIN VARCHAR(20))
AS
DECLARE VARIABLE FECHA DATE;
DECLARE VARIABLE CANT NUMERIC(15,4);
DECLARE VARIABLE COSTO NUMERIC(18,2);
DECLARE VARIABLE ENTRADA CHAR(1);
DECLARE VARIABLE BODEGA CHAR(2);
DECLARE VARIABLE ID INTEGER;
DECLARE VARIABLE TIPO INTEGER;
declare variable TIPOEX CHAR(1);
DECLARE VARIABLE LOTE VARCHAR(20);
declare variable ARTICULO VARCHAR(20);
declare variable IDL INTEGER;
declare variable IDDOC INTEGER;
declare variable CANTTOT varchar(2);
declare variable comp varchar(20);
declare variable cantcomp numeric(18,2);
declare variable coscomp numeric(18,2);
declare variable LOTESAL varchar(20);
declare variable SALDOLOTE numeric(18,4);
declare variable CONC VARCHAR(60);
declare variable PREF VARCHAR(4);
declare variable NUMERO VARCHAR(8);
declare variable ITEM INTEGER;
declare variable NIT VARCHAR(20);
BEGIN
execute procedure LEE_CONFIGURACION ('INVENTARIO', 'ENSAMBLES', 'FORMACIONES CON CANTIDADES TOTALES') returning_values (CANTTOT);
for select arti_cod, ARTI_EXIST from articulo where arti_cod >= :artini and arti_cod <= :artfin order by arti_cod into :ARTICULO, :TIPOEX
  DO
  BEGIN
  DELETE FROM existencia_lote where arti_cod = :articulo;
  DELETE FROM lotes where arti_cod = :articulo;
  delete from costos where arti_cod = :ARTICULO;
  delete from existencia WHERE ARTI_COD = :ARTICULO;
  delete from errores_lotes where articulo = :ARTICULO;
  ITEM = 1000;
  for select mvar_cons, mvar_fecha, mvar_cant, mvar_costo, mvar_entrada, bode_cod, mvar_tipodoc, mvar_lote, mvar_idref,
    MVAR_CONC, MVAR_PREF, MVAR_NUMERO, TERC_NIT
    from movimiento_articulo WHERE ARTI_COD = :ARTICULO
    order by arti_cod, mvar_fecha, mvar_entrada desc, mvar_cons
    into :id, :fecha, :cant, :costo, :entrada, :bodega, :tipo, :lote, :iddoc, :CONC, :PREF, :NUMERO, :NIT
  do
    begin
    if ((TIPO <> 13)) then
        BEGIN
        if (TIPO = 33) then
            BEGIN
            execute procedure costo_promedio(:articulo, :FECHA) returning_values (:COSTO);
            UPDATE MOVIMIENTO_ARTICULO SET MVAR_COSTO = :costo WHERE MVAR_cons = :id;
            END
        if ((TIPO = 15) AND (ENTRADA = 'S')) Then
            begin
            costo = 0;
            for select arti_cod, esde_cant * esde_factor from ensambles_detalle where ensa_id = :iddoc
                into :comp, :cantcomp
                do
                begin
                execute procedure costo_promedio(:comp, :FECHA) returning_values (:coscomp);
                costo = costo + (coscomp * cantcomp);
                end
            if ((canttot = 'SI') AND (CANT <> 0)) then
                COSTO = COSTO / CANT;
            UPDATE MOVIMIENTO_ARTICULO SET MVAR_COSTO = :costo WHERE MVAR_cons = :id;
            end
        EXECUTE PROCEDURE actualice_costo(:ARTICULO, :fecha, :costo, :cant, :entrada, 'N', :id, :tipo);
        END
    /* actualice existencias */
    if (:entrada = 'S') then
        begin
        execute procedure sume_existencia(:articulo, :bodega, :fecha, :cant, 'N');
        if (TIPOEX = 'L') then
            begin
            if (cant < 0) then
                begin
                SELECT LOTE_SALDO FROM LOTES WHERE ARTI_COD = :ARTICULO AND BODE_COD = :BODEGA AND LOTE_NRO = :lote INTO :SALDOLOTE;
                if (SALDOLOTE >= abs(CANT)) then
                    begin
                    UPDATE LOTES
                        set lote_saldo = lote_saldo + :cant
                        where (arti_cod = :ARTICULO) and (BODE_COD = :BODEGA) AND (lote_nro = :lote);
                    end
                else
                    begin
/*                    exception lote_negativo 'EL SALDO DEL ARTICULO ' || :ARTICULO || ' CON LOTE ' || :LOTE || ' EN LA BODEGA ' || :BODEGA || ' EN ' || :fecha || ' ES INSUFICIENTE: ' || :SALDOLOTE || ' PARA LA CANTIDAD ' || :CANT;*/
                    UPDATE MOVIMIENTO_ARTICULO SET MVAR_CANT = :SALDOLOTE WHERE MVAR_cons = :id;
                    UPDATE LOTES
                        set lote_saldo = 0
                        where (arti_cod = :ARTICULO) and (BODE_COD = :BODEGA) AND (lote_nro = :lote);
                    INSERT INTO errores_lotes (TIPO, ARTICULO, BODEGA, LOTE, IDMOV, FECHA, TIPOMOV, CANT, SALDOBOD)
                        VALUES ('ENTRADA NEGATIVA, SE AJUSTA LA CANTIDAD', :ARTICULO, :BODEGA, :LOTE, :id,  :FECHA, :tipo, :CANT, :SALDOLOTE);
                    end
                end
            else
                begin
                if (EXISTS (SELECT LOTE_NRO FROM LOTES WHERE ARTI_COD = :ARTICULO AND BODE_COD = :BODEGA AND LOTE_NRO = :lote)) then
                    UPDATE LOTES
                        set lote_saldo = lote_saldo + :cant
                        where (arti_cod = :ARTICULO) and (BODE_COD = :BODEGA) AND (lote_nro = :lote);
                ELSE
                    INSERT INTO LOTES (ARTI_COD, BODE_COD, LOTE_NRO, LOTE_FECHA, LOTE_CANT, LOTE_COSTO, LOTE_SALDO)
                        VALUES (:ARTICULO, :bodega, :lote, :fecha, :cant, :costo, :cant);
                if (EXISTS (SELECT EXLO_FECHA FROM EXISTENCIA_LOTE WHERE LOTE_NRO = :LOTE AND EXLO_FECHA = :FECHA
                    AND ARTI_COD = :ARTICULO AND BODE_COD = :bodega)) then
                    UPDATE EXISTENCIA_LOTE
                        SET EXLO_ENT = EXLO_ENT + :cant
                        WHERE LOTE_NRO = :LOTE AND EXLO_FECHA = :FECHA AND ARTI_COD = :ARTICULO AND BODE_COD = :bodega;
                else
                    INSERT INTO EXISTENCIA_LOTE (ARTI_COD, BODE_COD, LOTE_NRO, EXLO_FECHA, EXLO_SAL, EXLO_ENT)
                        VALUES (:ARTICULO, :BODEGA, :LOTE, :FECHA, 0, :CANT);
                end
            end
        end
    else
        begin
        execute procedure reste_existencia(:articulo, :bodega, :fecha, :cant, 'N');
        if (TIPOEX = 'L') then
            begin
            /* VERIFIQUE SI EXISTE EL LOTE */
            if (exists (SELECT LOTE_NRO FROM LOTES WHERE ARTI_COD = :ARTICULO AND BODE_COD = :BODEGA AND LOTE_NRO = :lote)) then
                BEGIN
                SALDOLOTE = 0;
                SELECT LOTE_SALDO FROM LOTES WHERE ARTI_COD = :ARTICULO AND BODE_COD = :BODEGA AND LOTE_NRO = :lote INTO :SALDOLOTE;
                if (SALDOLOTE >= CANT) then
                    BEGIN
                    UPDATE LOTES
                        set lote_saldo = lote_saldo - :cant
                        where (arti_cod = :ARTICULO) AND (BODE_COD = :BODEGA) and (lote_nro = :lote);
                    if (EXISTS (SELECT EXLO_FECHA FROM EXISTENCIA_LOTE WHERE LOTE_NRO = :LOTE AND EXLO_FECHA = :FECHA
                        AND ARTI_COD = :ARTICULO AND BODE_COD = :bodega)) then
                        UPDATE EXISTENCIA_LOTE
                           SET EXLO_SAL = EXLO_SAL + :cant
                            WHERE LOTE_NRO = :LOTE AND EXLO_FECHA = :FECHA AND ARTI_COD = :ARTICULO AND BODE_COD = :bodega;
                    else
                        INSERT INTO EXISTENCIA_LOTE (ARTI_COD, BODE_COD, LOTE_NRO, EXLO_FECHA, EXLO_SAL, EXLO_ENT)
                            VALUES (:ARTICULO, :BODEGA, :LOTE, :FECHA, :CANT, 0);
                    END
                ELSE
                    BEGIN
/*                    exception lote_negativo 'EL SALDO DEL ARTICULO ' || :ARTICULO || ' CON LOTE ' || :LOTE || ' EN LA BODEGA ' || :BODEGA || ' EN ' || :fecha || ' ES INSUFICIENTE: ' || :SALDOLOTE || ' PARA LA CANTIDAD ' || :CANT;*/
                    IDL = 0;
                    SELECT FIRST 1 LOTE_ID FROM LOTES WHERE ARTI_COD = :articulo AND BODE_COD = :BODEGA AND LOTE_SALDO >= :cant
                        ORDER BY LOTE_FECHA INTO :IDL;
                    if (IDL <> 0) then
                        BEGIN
                        SELECT LOTE_NRO FROM LOTES WHERE LOTE_ID = :IDL INTO :LOTESAL;
                        UPDATE MOVIMIENTO_ARTICULO SET MVAR_LOTE = :LOTESAL WHERE MVAR_CONS = :ID;
                        UPDATE LOTES
                            set lote_saldo = lote_saldo - :cant
                            where (arti_cod = :ARTICULO) and (BODE_COD = :BODEGA) AND (lote_nro = :lotesal);
                        INSERT INTO errores_lotes (TIPO, ARTICULO, BODEGA, LOTE, IDMOV, FECHA, TIPOMOV, CANT, LOTESAL, SALDOBOD)
                            VALUES ('LOTE INSUFICIENTE EN SALIDA, SE CAMBIA LOTE', :ARTICULO, :BODEGA, :LOTE, :id,  :FECHA, :tipo, :CANT, :LOTESAL, :CANT);

                        if (EXISTS (SELECT EXLO_FECHA FROM EXISTENCIA_LOTE WHERE LOTE_NRO = :LOTESAL AND EXLO_FECHA = :FECHA
                            AND ARTI_COD = :ARTICULO AND BODE_COD = :bodega)) then
                            UPDATE EXISTENCIA_LOTE
                               SET EXLO_SAL = EXLO_SAL + :cant
                               WHERE LOTE_NRO = :LOTESAL AND EXLO_FECHA = :FECHA AND ARTI_COD = :ARTICULO AND BODE_COD = :bodega;
                        else
                            INSERT INTO EXISTENCIA_LOTE (ARTI_COD, BODE_COD, LOTE_NRO, EXLO_FECHA, EXLO_SAL, EXLO_ENT)
                                VALUES (:ARTICULO, :BODEGA, :LOTESAL, :FECHA, :CANT, 0);
                        END
                    ELSE
                        BEGIN
/*                     exception lote_negativo 'EL SALDO DEL ARTICULO ' || :ARTICULO || ' CON LOTE ' || :LOTE || ' EN LA BODEGA ' || :BODEGA || ' EN ' || :fecha || ' ES INSUFICIENTE: ' || :SALDOLOTE || ' PARA LA CANTIDAD ' || :CANT;*/
                        /* no hay un lote con cant. suficiente, use la cant. disponible y agregue un item */
                        UPDATE MOVIMIENTO_ARTICULO SET MVAR_CANT = :SALDOLOTE WHERE MVAR_cons = :id;
                        UPDATE LOTES
                            set lote_saldo = 0
                            where (arti_cod = :ARTICULO) and (BODE_COD = :BODEGA) AND (lote_nro = :lote);
                        if (EXISTS (SELECT EXLO_FECHA FROM EXISTENCIA_LOTE WHERE LOTE_NRO = :LOTE AND EXLO_FECHA = :FECHA
                            AND ARTI_COD = :ARTICULO AND BODE_COD = :bodega)) then
                            UPDATE EXISTENCIA_LOTE
                                SET EXLO_SAL = EXLO_SAL + :SALDOLOTE
                                WHERE LOTE_NRO = :LOTE AND EXLO_FECHA = :FECHA AND ARTI_COD = :ARTICULO AND BODE_COD = :bodega;
                        else
                            INSERT INTO EXISTENCIA_LOTE (ARTI_COD, BODE_COD, LOTE_NRO, EXLO_FECHA, EXLO_SAL, EXLO_ENT)
                                VALUES (:ARTICULO, :BODEGA, :LOTE, :FECHA, :SALDOLOTE, 0);

                        cant = cant - saldolote;
                        /* verifique si hay un lote con la cant restante suficiente */
                        IDL = 0;
                        SELECT FIRST 1 LOTE_ID FROM LOTES WHERE ARTI_COD = :articulo AND BODE_COD = :BODEGA AND LOTE_SALDO >= :cant
                            ORDER BY LOTE_FECHA, LOTE_ID INTO :IDL;
                        if (IDL <> 0) then
                            BEGIN
                            SELECT LOTE_NRO FROM LOTES WHERE LOTE_ID = :IDL INTO :LOTESAL;
                            ID = GEN_ID(id_movarti, 1);
                            ITEM = ITEM + 1;
                            INSERT INTO MOVIMIENTO_ARTICULO (ARTI_COD, MVAR_CONS, BODE_COD, MVAR_FECHA, MVAR_IDREF, MVAR_CONC, MVAR_CANT,
                                MVAR_COSTO, MVAR_ENTRADA, MVAR_LOTE, MVAR_PREF, MVAR_NUMERO, MVAR_TIPODOC, MVAR_ITEM, TERC_NIT)
                                VALUES (:ARTICULO, :ID, :bodega, :FECHA, :IDDOC, :CONC, :CANT, :COSTO, 'N', :LOTESAL, :PREF, :NUMERO, :TIPO, :ITEM, :NIT);
                            UPDATE LOTES
                                set lote_saldo = lote_saldo - :cant
                                where (arti_cod = :ARTICULO) and (BODE_COD = :BODEGA) AND (lote_nro = :lotesal);

                            if (EXISTS (SELECT EXLO_FECHA FROM EXISTENCIA_LOTE WHERE LOTE_NRO = :LOTESAL AND EXLO_FECHA = :FECHA
                                AND ARTI_COD = :ARTICULO AND BODE_COD = :bodega)) then
                                UPDATE EXISTENCIA_LOTE
                                    SET EXLO_SAL = EXLO_SAL + :cant
                                    WHERE LOTE_NRO = :LOTESAL AND EXLO_FECHA = :FECHA AND ARTI_COD = :ARTICULO AND BODE_COD = :bodega;
                            else
                                INSERT INTO EXISTENCIA_LOTE (ARTI_COD, BODE_COD, LOTE_NRO, EXLO_FECHA, EXLO_SAL, EXLO_ENT)
                                    VALUES (:ARTICULO, :BODEGA, :LOTESAL, :FECHA, :CANT, 0);
                            INSERT INTO errores_lotes (TIPO, ARTICULO, BODEGA, LOTE, IDMOV, FECHA, TIPOMOV, CANT, LOTESAL, SALDOBOD)
                                VALUES ('LOTE INSUFICIENTE EN SALIDA, SE AGREGO ITEM', :ARTICULO, :BODEGA, :LOTE, :id,  :FECHA, :tipo, :CANT, :LOTESAL, :CANT);
                            END
                        ELSE
                            BEGIN
                            for SELECT LOTE_ID, LOTE_SALDO FROM LOTES WHERE ARTI_COD = :articulo AND BODE_COD = :BODEGA AND LOTE_SALDO > 0
                                ORDER BY LOTE_FECHA, LOTE_ID INTO :IDL, :SALDOLOTE
                                DO
                                BEGIN
                                if (CANT > 0) then
                                    BEGIN
                                    if (CANT < SALDOLOTE) then
                                        BEGIN
                                        CANT = 0;
                                        SALDOLOTE = CANT;
                                        END
                                    ELSE
                                        CANT = CANT - SALDOLOTE;
                                    SELECT LOTE_NRO FROM LOTES WHERE LOTE_ID = :IDL INTO :LOTESAL;
                                    ID = GEN_ID(id_movarti, 1);
                                    ITEM = ITEM + 1;
                                    INSERT INTO MOVIMIENTO_ARTICULO (ARTI_COD, MVAR_CONS, BODE_COD, MVAR_FECHA, MVAR_IDREF, MVAR_CONC, MVAR_CANT,
                                        MVAR_COSTO, MVAR_ENTRADA, MVAR_LOTE, MVAR_PREF, MVAR_NUMERO, MVAR_TIPODOC, MVAR_ITEM, TERC_NIT)
                                        VALUES (:ARTICULO, :ID, :bodega, :FECHA, :IDDOC, :CONC, :SALDOLOTE, :COSTO, 'N', :LOTESAL, :PREF, :NUMERO, :TIPO, :ITEM, :NIT);
                                    UPDATE LOTES
                                        set lote_saldo = LOTE_SALDO - :SALDOLOTE
                                        where (arti_cod = :ARTICULO) and (BODE_COD = :BODEGA) AND (lote_nro = :lotesal);
                                    if (EXISTS (SELECT EXLO_FECHA FROM EXISTENCIA_LOTE WHERE LOTE_NRO = :LOTESAL AND EXLO_FECHA = :FECHA
                                        AND ARTI_COD = :ARTICULO AND BODE_COD = :bodega)) then
                                        UPDATE EXISTENCIA_LOTE
                                            SET EXLO_SAL = EXLO_SAL + :SALDOLOTE
                                            WHERE LOTE_NRO = :LOTESAL AND EXLO_FECHA = :FECHA AND ARTI_COD = :ARTICULO AND BODE_COD = :bodega;
                                    else
                                        INSERT INTO EXISTENCIA_LOTE (ARTI_COD, BODE_COD, LOTE_NRO, EXLO_FECHA, EXLO_SAL, EXLO_ENT)
                                            VALUES (:ARTICULO, :BODEGA, :LOTESAL, :FECHA, :SALDOLOTE, 0);

                                    INSERT INTO errores_lotes (TIPO, ARTICULO, BODEGA, LOTE, IDMOV, FECHA, TIPOMOV, CANT, LOTESAL, SALDOBOD)
                                        VALUES ('LOTE INSUFICIENTE EN SALIDA, SE AGREGARON ITEMS', :ARTICULO, :BODEGA, :LOTE, :id,  :FECHA, :tipo, :CANT, :LOTESAL, :SALDOLOTE);
                                    END
                                END
                            if (CANT > 0) then
                                BEGIN
                                INSERT INTO errores_lotes (TIPO, ARTICULO, BODEGA, LOTE, IDMOV, FECHA, TIPOMOV, CANT, LOTESAL, SALDOBOD)
                                    VALUES ('LOTE INSUFICIENTE EN SALIDA, SE AGREGO ITEMS QUEDO SALDO', :ARTICULO, :BODEGA, :LOTE, :id,  :FECHA, :tipo, :CANT, :LOTESAL, :CANT);
                                END
                            END
                        END
                    END
                END
            else
                BEGIN
                /* ARREGLE EL LOTE YA QUE NO EXISTE */
                IDL = 0;
                SELECT FIRST 1 LOTE_ID FROM LOTES WHERE ARTI_COD = :articulo AND BODE_COD = :BODEGA AND LOTE_SALDO >= :cant
                    ORDER BY LOTE_FECHA INTO :IDL;
                if (IDL <> 0) then
                    BEGIN
                    SELECT LOTE_NRO FROM LOTES WHERE LOTE_ID = :IDL INTO :LOTESAL;
                    UPDATE MOVIMIENTO_ARTICULO SET MVAR_LOTE = :LOTESAL WHERE MVAR_CONS = :ID;
                    UPDATE LOTES
                        set lote_saldo = lote_saldo - :cant
                        where (arti_cod = :ARTICULO) and (BODE_COD = :BODEGA) AND (lote_nro = :lotesal);
                    INSERT INTO errores_lotes (TIPO, ARTICULO, BODEGA, LOTE, IDMOV, FECHA, TIPOMOV, CANT, LOTESAL, SALDOBOD)
                        VALUES ('LOTE NO EXISTE EN SALIDA, SE CAMBIA LOTE', :ARTICULO, :BODEGA, :LOTE, :id,  :FECHA, :tipo, :CANT, :LOTESAL, :CANT);

                    if (EXISTS (SELECT EXLO_FECHA FROM EXISTENCIA_LOTE WHERE LOTE_NRO = :LOTESAL AND EXLO_FECHA = :FECHA
                        AND ARTI_COD = :ARTICULO AND BODE_COD = :bodega)) then
                        UPDATE EXISTENCIA_LOTE
                            SET EXLO_SAL = EXLO_SAL + :cant
                            WHERE LOTE_NRO = :LOTESAL AND EXLO_FECHA = :FECHA AND ARTI_COD = :ARTICULO AND BODE_COD = :bodega;
                    else
                        INSERT INTO EXISTENCIA_LOTE (ARTI_COD, BODE_COD, LOTE_NRO, EXLO_FECHA, EXLO_SAL, EXLO_ENT)
                            VALUES (:ARTICULO, :BODEGA, :LOTESAL, :FECHA, :CANT, 0);
                    END
                ELSE
                    BEGIN
                    /* no hay un lote con cant. suficiente, BORRE EL ACTUAL y agregue items nuevos con los saldos disponibles */
                    delete FROM movimiento_articulo WHERE MVAR_CONS = :ID;
                    for SELECT LOTE_ID, LOTE_SALDO FROM LOTES WHERE ARTI_COD = :articulo AND BODE_COD = :BODEGA AND LOTE_SALDO > 0
                        ORDER BY LOTE_FECHA, LOTE_ID INTO :IDL, :SALDOLOTE
                        DO
                        BEGIN
                        if (CANT > 0) then
                            BEGIN
                            if (CANT < SALDOLOTE) then
                                BEGIN
                                CANT = 0;
                                SALDOLOTE = CANT;
                                END
                            ELSE
                                CANT = CANT - SALDOLOTE;
                            SELECT LOTE_NRO FROM LOTES WHERE LOTE_ID = :IDL INTO :LOTESAL;
                            ID = GEN_ID(id_movarti, 1);
                            ITEM = ITEM + 1;
                            INSERT INTO MOVIMIENTO_ARTICULO (ARTI_COD, MVAR_CONS, BODE_COD, MVAR_FECHA, MVAR_IDREF, MVAR_CONC, MVAR_CANT,
                                MVAR_COSTO, MVAR_ENTRADA, MVAR_LOTE, MVAR_PREF, MVAR_NUMERO, MVAR_TIPODOC, MVAR_ITEM, TERC_NIT)
                                VALUES (:ARTICULO, :ID, :bodega, :FECHA, :IDDOC, :CONC, :SALDOLOTE, :COSTO, 'N', :LOTESAL, :PREF, :NUMERO, :TIPO, :ITEM, :NIT);
                            UPDATE LOTES
                                set lote_saldo = LOTE_SALDO - :SALDOLOTE
                                where (arti_cod = :ARTICULO) and (BODE_COD = :BODEGA) AND (lote_nro = :lotesal);
                            if (EXISTS (SELECT EXLO_FECHA FROM EXISTENCIA_LOTE WHERE LOTE_NRO = :LOTESAL AND EXLO_FECHA = :FECHA
                                AND ARTI_COD = :ARTICULO AND BODE_COD = :bodega)) then
                                UPDATE EXISTENCIA_LOTE
                                    SET EXLO_SAL = EXLO_SAL + :SALDOLOTE
                                    WHERE LOTE_NRO = :LOTESAL AND EXLO_FECHA = :FECHA AND ARTI_COD = :ARTICULO AND BODE_COD = :bodega;
                            else
                                INSERT INTO EXISTENCIA_LOTE (ARTI_COD, BODE_COD, LOTE_NRO, EXLO_FECHA, EXLO_SAL, EXLO_ENT)
                                    VALUES (:ARTICULO, :BODEGA, :LOTESAL, :FECHA, :SALDOLOTE, 0);

                            INSERT INTO errores_lotes (TIPO, ARTICULO, BODEGA, LOTE, IDMOV, FECHA, TIPOMOV, CANT, LOTESAL, SALDOBOD)
                                VALUES ('LOTE NO EXISTE EN SALIDA, SE AGREGARON ITEMS', :ARTICULO, :BODEGA, :LOTE, :id,  :FECHA, :tipo, :CANT, :LOTESAL, :SALDOLOTE);
                            END
                        END
                    if (CANT > 0) then
                        BEGIN
                        INSERT INTO errores_lotes (TIPO, ARTICULO, BODEGA, LOTE, IDMOV, FECHA, TIPOMOV, CANT, LOTESAL, SALDOBOD)
                            VALUES ('ERROR LOTE NO EXISTE EN SALIDA, SE AGREGO ITEMS QUEDO SALDO', :ARTICULO, :BODEGA, :LOTE, :id,  :FECHA, :tipo, :CANT, :LOTESAL, :CANT);
                        END
                    END
                END
            end
        end
    END
  END
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER TRIGGER ENTRADAS_DETALLE_AU
as
declare variable fec date;
declare variable CONC VARCHAR(60);
declare variable Pref varchar(4);
declare variable Num varchar(8);
declare variable Nit varchar(20);
declare variable factor numeric(18,4);
declare variable IVAINC CHAR(2);
declare variable ICOINC CHAR(2);
declare variable COSTO NUMERIC(18,2);
declare variable IDMOV integer;
BEGIN
if ((old.ende_anulado = new.ende_anulado) and (old.arti_cod = new.arti_cod) and (old.bode_cod = new.bode_cod) and
    (old.ende_cant = new.ende_cant) and (old.ende_unidad = new.ende_unidad) and (old.ende_lote = new.ende_lote) and
    (old.entr_id = new.entr_id) and (old.ende_item = new.ende_item) and (old.ende_costo <> new.ende_costo)) then
    begin
    /* si solo cambio el costo */
    select mvar_cons, mvar_fecha from MOVIMIENTO_ARTICULO WHERE MVAR_TIPODOC = 11 AND MVAR_IDREF = NEW.entr_id
        AND MVAR_ITEM = NEW.ende_item into :idmov, :fec;
    execute procedure factor_unidad_cant(new.arti_cod, new.ende_unidad) returning_values(factor);
    COSTO = ((new.ende_costo - NEW.ende_dtomonto) / :factor);
    if (IVAINC = 'S') then
        BEGIN
        EXECUTE PROCEDURE lee_configuracion ('FACTURACION', 'ARTICULOS', 'IMPOCONSUMO INCLUIDO EN EL PRECIO BASE DE VENTA ANTES DE IVA') returning_values(:icoinc);
        if (icoinc = 'SI') then
            COSTO = COSTO - NEW.ende_consumo;
        COSTO = COSTO / (1 + NEW.ende_ivaporc/100);
        END
    UPDATE MOVIMIENTO_ARTICULO SET MVAR_COSTO = :costo WHERE MVAR_CONS = :IDMOV;
    EXECUTE PROCEDURE actualice_costo(old.arti_cod, :fec, :costo, old.ende_cant*:factor, 'S', 'S', :IDMOV, 11);

    EXECUTE PROCEDURE actualice_costo(new.arti_cod, :fec, :costo, new.ende_cant*:factor, 'S', 'N', :IDMOV, 11);
    if (exists (SELECT cost_fecha from costos WHERE (arti_cod = new.arti_cod) AND (cost_fecha > :fec))) then
        EXECUTE PROCEDURE chequeo_costos(NEW.arti_cod, :fec + 1);
    end

if ((OLD.entr_id <> 0) AND (OLD.ende_anulado = 'N')) then
    DELETE FROM MOVIMIENTO_ARTICULO WHERE (mvar_tipodoc = 11) and (mvar_idref = new.entr_id) and (mvar_item = old.ende_item);
if ((NEW.entr_id <> 0) AND (NEW.ende_anulado = 'N')) then
    begin
    select entr_fecha, entr_conc, pref_pre, entr_numero, terc_nit, entr_imptos
        from entradas where entr_id = new.entr_id
        into :fec, :conc, :Pref, :Num, :Nit, :ivainc;
    execute procedure factor_unidad_cant(new.arti_cod, new.ende_unidad) returning_values(factor);
    COSTO = ((new.ende_costo - NEW.ende_dtomonto) / :factor);
    if (IVAINC = 'S') then
        BEGIN
        EXECUTE PROCEDURE lee_configuracion ('FACTURACION', 'ARTICULOS', 'IMPOCONSUMO INCLUIDO EN EL PRECIO BASE DE VENTA ANTES DE IVA') returning_values(:icoinc);
        if (icoinc = 'SI') then
            COSTO = COSTO - NEW.ende_consumo;
        COSTO = COSTO / (1 + NEW.ende_ivaporc/100);
        END
    INSERT INTO MOVIMIENTO_ARTICULO
        (ARTI_COD, BODE_COD, MVAR_FECHA, MVAR_TIPODOC, MVAR_IDREF, MVAR_CONC, MVAR_CANT, MVAR_COSTO, MVAR_ENTRADA, MVAR_LOTE, MVAR_PREF, MVAR_NUMERO, MVAR_ITEM, TERC_NIT)
        VALUES(NEW.ARTI_COD, NEW.BODE_COD, :FEC, 11, NEW.entr_id,
        :CONC, :factor * new.ende_cant, :COSTO, 'S', new.ende_lote, :Pref, :Num, new.ende_item, :Nit);
    /* RECORRA LAS LISTAS DE PRECIOS Y CAMBIE EL PRECIO */
    EXECUTE PROCEDURE CALCULA_PRECIOS(NEW.ARTI_COD, :FEC);
    /* ACTUALICE EL STAND */
    if (new.ende_stand is not null) then
      if (exists(select stand_cod from stands where arti_cod = new.arti_cod and stand_bodega = new.bode_cod)) then
        UPDATE stands set stand_cod = new.ende_stand where arti_cod = new.arti_cod and stand_bodega = new.bode_cod;
      else
        INSERT INTO stands (ARTI_COD, STAND_BODEGA, STAND_COD) VALUES (NEW.arti_cod, NEW.bode_cod, NEW.ende_stand);
    END
END^

SET TERM ; ^

SET TERM ^ ;

ALTER TRIGGER MOVIMIENTO_ARTICULO_AD
AS
declare variable LOTE CHAR(1);
declare variable ensamble char(1);
BEGIN
  /* INSERTE EL NUEVO LOTE */
  SELECT ARTI_EXIST
    FROM   ARTICULO
    WHERE  ARTICULO.ARTI_COD = OLD.ARTI_COD
    INTO :LOTE;
  /* BORRE LOS VIEJOS */
  if (old.mvar_tipodoc <> 13) then
      BEGIN
      EXECUTE PROCEDURE actualice_costo(old.arti_cod, old.mvar_fecha, old.mvar_costo, old.mvar_cant, old.mvar_entrada, 'S', OLD.mvar_cons, OLD.mvar_tipodoc);
      EXECUTE PROCEDURE chequeo_costos(old.arti_cod, old.mvar_fecha-1); /* PARA OBLIGAR A RECALCULAR LOS MOV. DEL MISMO DIA */
      END
  /* actualice existencias */
  if (old.mvar_entrada = 'S') then
    BEGIN
    execute procedure sume_existencia(old.arti_cod, old.bode_cod, old.mvar_fecha, old.mvar_cant, 'S');
    if (LOTE = 'L') then
        BEGIN
        UPDATE LOTES
            set lote_saldo = lote_saldo - old.mvar_cant
            where (arti_cod = old.ARTI_COD) and (bode_cod = old.bode_cod) and (lote_nro = old.mvar_lote);
        UPDATE EXISTENCIA_LOTE
            SET EXLO_ENT = EXLO_ENT - OLD.mvar_cant
            WHERE LOTE_NRO = OLD.MVAR_LOTE AND EXLO_FECHA = OLD.MVAR_FECHA AND ARTI_COD = OLD.ARTI_COD AND BODE_COD = OLD.bode_cod;
        END
    END
  else
    BEGIN
    SELECT ARTI_ENSAMBLE FROM ARTICULO WHERE ARTI_COD = old.arti_cod INTO :ensamble;
    if ((ENSAMBLE = 'S') AND (OLD.mvar_entrada = 'N')) then
        delete from ensambles where ensa_tiporef = old.mvar_tipodoc and ensa_idref = old.mvar_idref AND ENSA_ITEMREF = OLD.mvar_item;

    execute procedure reste_existencia(old.arti_cod, old.bode_cod, old.mvar_fecha, old.mvar_cant, 'S');
    if (LOTE = 'L') then
        BEGIN
        UPDATE LOTES
            set lote_saldo = lote_saldo + old.mvar_cant
            where (arti_cod = old.ARTI_COD) and (bode_cod = old.bode_cod) and (lote_nro = old.mvar_lote);
        UPDATE EXISTENCIA_LOTE
            SET EXLO_SAL = EXLO_SAL - OLD.mvar_cant
            WHERE LOTE_NRO = OLD.MVAR_LOTE AND EXLO_FECHA = OLD.MVAR_FECHA AND ARTI_COD = OLD.ARTI_COD AND BODE_COD = OLD.bode_cod;
        END
    END
END^

SET TERM ; ^

SET TERM ^ ;

ALTER TRIGGER MOVIMIENTO_ARTICULO_AI
AS
declare variable LOTE CHAR(1);
declare variable ENSAMBLE CHAR(1);
declare variable IDENS INTEGER;
declare variable PREFENS VARCHAR(4);
declare variable unidad varchar(8);
declare variable DESCR varchar(60);
declare variable CODPR varchar(15);
declare variable DESPR varchar(60);
declare variable UNIPR varchar(8);
declare variable CANTPR numeric(18,4);
declare variable FACTOR numeric(18,4);
declare variable COSTO numeric(18,2);
declare variable ITEM INTEGER;
declare variable IVA NUMERIC(9,4);
declare variable IVAM NUMERIC(18,2);
declare variable CONSUMO NUMERIC(18,2);
declare variable NROLOTE VARCHAR(15);
BEGIN
  /* INSERTE EL NUEVO LOTE */
  SELECT ARTI_EXIST FROM ARTICULO WHERE ARTICULO.ARTI_COD = NEW.ARTI_COD INTO :LOTE;
  /* ACTUALICE COSTOS cuando no es transferencia */
  if (new.mvar_tipodoc <> 13) then
      BEGIN
      EXECUTE PROCEDURE actualice_costo(new.arti_cod, new.mvar_fecha, new.mvar_costo, new.mvar_cant, new.mvar_entrada, 'N', new.mvar_cons, new.mvar_tipodoc);
      EXECUTE PROCEDURE chequeo_costos(NEW.arti_cod, NEW.mvar_fecha);
      END
  /* actualice existencias */
  if (new.mvar_entrada = 'S') then
    BEGIN
    execute procedure sume_existencia(new.arti_cod, new.bode_cod, new.mvar_fecha, new.mvar_cant, 'N');
    if (LOTE = 'L') then
        BEGIN
        if (NEW.MVAR_LOTE IS NULL) then
            EXCEPTION LOTE_OBLIGATORIO 'Debe especificar un número de lote para el articulo ' || new.arti_cod;
        ELSE
          BEGIN
          if (EXISTS (SELECT LOTE_NRO FROM LOTES WHERE ARTI_COD = NEW.ARTI_COD AND BODE_COD = NEW.bode_cod AND LOTE_NRO = new.mvar_lote)) THEN
            UPDATE LOTES
              set lote_saldo = lote_saldo + new.mvar_cant
              where (arti_cod = NEW.ARTI_COD) and (BODE_COD = NEW.bode_cod) and (lote_nro = new.mvar_lote);
          ELSE
            INSERT INTO LOTES (ARTI_COD, BODE_COD, LOTE_NRO, LOTE_FECHA, LOTE_CANT, LOTE_COSTO, LOTE_SALDO)
              VALUES (NEW.ARTI_COD, NEW.bode_cod, NEW.mvar_lote, NEW.mvar_fecha, NEW.mvar_cant, NEW.mvar_costo, NEW.mvar_cant);

          if (EXISTS (SELECT LOTE_NRO FROM EXISTENCIA_LOTE WHERE LOTE_NRO = NEW.MVAR_LOTE AND EXLO_FECHA = NEW.MVAR_FECHA AND ARTI_COD = NEW.arti_cod AND BODE_COD = NEW.bode_cod)) then
            BEGIN
            UPDATE EXISTENCIA_LOTE
                SET EXLO_ENT = EXLO_ENT + NEW.mvar_cant
                WHERE LOTE_NRO = NEW.MVAR_LOTE AND EXLO_FECHA = NEW.MVAR_FECHA AND ARTI_COD = NEW.ARTI_COD AND BODE_COD = NEW.bode_cod;
            END
          ELSE
            BEGIN
            INSERT INTO EXISTENCIA_LOTE (ARTI_COD, BODE_COD, LOTE_NRO, EXLO_FECHA, EXLO_SAL, EXLO_ENT)
                VALUES (NEW.ARTI_COD, NEW.bode_cod, NEW.MVAR_LOTE, NEW.MVAR_FECHA, 0, NEW.MVAR_CANT);
            END
          END
        END
    if (NEW.mvar_tipodoc = 33) then
        BEGIN
        SELECT ARTI_ENSAMBLE, ARTI_UNIDAD, ARTI_DES FROM ARTICULO WHERE ARTI_COD = NEW.arti_cod
            INTO :ensamble, :unidad, :descr;
        if (ENSAMBLE = 'S') then
            BEGIN
            /* DESENSAMBLE EL PRODUCTO DEVUELTO */
            IDENS = gen_id(id_desensamble, 1);
            EXECUTE PROCEDURE lee_configuracion('INVENTARIO', 'ENSAMBLES', 'PREFIJO PARA ENSAMBLES AUTOMATICOS AL SACAR PRODUCTOS') returning_values (:prefens);
            INSERT INTO DESENSAMBLES(DESE_ID, TIDO_COD, PREF_PRE, BODE_COD, DESE_NUMERO, DESE_FECHA, DESE_CONC, DESE_REFER, DESE_CANT, DESE_UNIDAD, DESE_FACTOR, DESE_ANULADO, DESE_TRANSMIT,
                ARTI_COD, DESE_DESC, DESE_CODBAR, DESE_LOTE, DESE_OBS, TERC_NIT, DESE_USUARIO, NUMOK, DESE_TIPOREF, DESE_IDREF, DESE_ITEMREF)
                VALUES (:IDENS, 16, :prefens, NEW.bode_cod, '000001', new.mvar_fecha, new.mvar_conc, '', new.mvar_cant, :unidad, 1, 'N', 'N',
                NEW.arti_cod, :descr, NEW.arti_cod, NEW.mvar_lote, NULL, NULL, USER, 'N', NEW.mvar_tipodoc, NEW.mvar_idref, NEW.mvar_item);
            ITEM = 0;
            FOR SELECT ARPR_CANT, ARPR_UNIDAD, ARPR_COMP, ARTI_DES, TAIV_PORC, ARTI_CONSUMO
                FROM articulos_producto P, ARTICULO A, TARIFA_IVA T
                WHERE P.ARTI_COD = NEW.arti_cod AND A.arti_cod = P.arpr_comp AND A.taiv_cod = T.taiv_cod
                INTO :CANTPR, :UNIPR, :CODPR, :DESPR, :IVA, :CONSUMO
                DO
                BEGIN
                ITEM = ITEM + 1;
                EXECUTE PROCEDURE factor_unidad_cant(:codpr,  :unipr) returning_values (:FACTOR);
                EXECUTE PROCEDURE costo_promedio_unidad (:codpr, NEW.mvar_fecha, :UNIPR) returning_values (:COSTO);
                IVAM = costo * cantpr * iva / 100;
                SELECT ARTI_EXIST FROM ARTICULO WHERE ARTI_COD = :codpr INTO :LOTE;
                if (LOTE = 'L') then
                    begin
                    if ((new.mvar_lote is not null) and (new.mvar_lote <> '')) then
                        SELECT MIN(ESDE_LOTE) FROM ENSAMBLES_DETALLE D, ENSAMBLES E WHERE E.ensa_id = D.ensa_id AND
                            E.arti_cod = NEW.arti_cod AND E.ensa_lote = NEW.mvar_lote AND D.arti_cod = :codpr INTO :nrolote;
                    else
                        SELECT first 1 ESDE_LOTE FROM ENSAMBLES_DETALLE D, ENSAMBLES E WHERE E.ensa_id = D.ensa_id AND
                            E.arti_cod = NEW.arti_cod AND E.ensa_fecha <= NEW.mvar_fecha AND D.arti_cod = :codpr
                            order by ensa_fecha desc INTO :nrolote;
                    end
                else
                    nrolote = '';
                INSERT INTO desensambles_detalle(DESE_ID, DESE_ITEM, ARTI_COD, BODE_COD, DEDE_CANT, DEDE_UNIDAD, DEDE_COSTO, DEDE_LOTE, DEDE_FACTOR, DEDE_IVAPORC, DEDE_IVAMONTO, DEDE_CONSUMO, DEDE_CODBAR, DEDE_ANULADO, DEDE_TRANSMIT, DEDE_DESC, DEDE_TOTAL, DEDE_OBS)
                    VALUES (:idens, :ITEM, :codpr,  NEW.bode_cod, :cantpr * NEW.mvar_cant, :unipr, :costo, :nrolote, :FACTOR, :IVA, :ivam, :consumo, :codpr, 'N', 'N', :despr, :COSTO * :cantpr, NULL);
                END
            END
        END
    END
  else
    BEGIN
    execute procedure reste_existencia(new.arti_cod, new.bode_cod, new.mvar_fecha, new.mvar_cant, 'N');
    /* ACTUALICE LA EXISTENCIA DEL LOTE */
    if (LOTE = 'L') then
      if (NEW.mvar_lote IS NULL) then
        EXCEPTION LOTE_NEGATIVO 'Debe indicar un número de lote para el artículo ' || new.arti_cod;
      ELSE
        BEGIN
        /* Actualice el saldo historico del lote */
        if (EXISTS (SELECT LOTE_NRO FROM EXISTENCIA_LOTE WHERE LOTE_NRO = NEW.MVAR_LOTE AND EXLO_FECHA = NEW.MVAR_FECHA AND ARTI_COD = NEW.arti_cod AND BODE_COD = NEW.bode_cod)) then
            BEGIN
            UPDATE EXISTENCIA_LOTE
                SET EXLO_SAL = EXLO_SAL + NEW.mvar_cant
                WHERE LOTE_NRO = NEW.MVAR_LOTE AND EXLO_FECHA = NEW.MVAR_FECHA AND ARTI_COD = NEW.ARTI_COD AND BODE_COD = NEW.bode_cod;
            END
        ELSE
            BEGIN
            INSERT INTO EXISTENCIA_LOTE (ARTI_COD, BODE_COD, LOTE_NRO, EXLO_FECHA, EXLO_SAL, EXLO_ENT)
                VALUES (NEW.ARTI_COD, NEW.bode_cod, NEW.MVAR_LOTE, NEW.MVAR_FECHA, NEW.MVAR_CANT, 0);
            END
        if (EXISTS (SELECT LOTE_NRO FROM LOTES WHERE ARTI_COD = NEW.ARTI_COD AND BODE_COD = NEW.bode_cod AND LOTE_NRO = new.mvar_lote)) THEN
          UPDATE LOTES
            set lote_saldo = lote_saldo - new.mvar_cant
            where (arti_cod = NEW.ARTI_COD) and (BODE_COD = NEW.bode_cod) and (lote_nro = new.mvar_lote);
        else
          EXCEPTION LOTE_NEGATIVO 'No se encontró el lote ' || new.mvar_lote || ' para el articulo ' || new.arti_cod;
        END
    if (NEW.mvar_cant < 0) then
        BEGIN
        SELECT ARTI_ENSAMBLE, ARTI_UNIDAD, ARTI_DES FROM ARTICULO WHERE ARTI_COD = NEW.arti_cod
            INTO :ensamble, :unidad, :descr;
        if (ENSAMBLE = 'S') then
            BEGIN
            /* DESENSAMBLE EL PRODUCTO DEVUELTO */
            IDENS = gen_id(id_desensamble, 1);
            EXECUTE PROCEDURE lee_configuracion('INVENTARIO', 'ENSAMBLES', 'PREFIJO PARA ENSAMBLES AUTOMATICOS AL SACAR PRODUCTOS') returning_values (:prefens);
            INSERT INTO DESENSAMBLES(DESE_ID, TIDO_COD, PREF_PRE, BODE_COD, DESE_NUMERO, DESE_FECHA, DESE_CONC, DESE_REFER, DESE_CANT, DESE_UNIDAD, DESE_FACTOR, DESE_ANULADO, DESE_TRANSMIT,
                ARTI_COD, DESE_DESC, DESE_CODBAR, DESE_LOTE, DESE_OBS, TERC_NIT, DESE_USUARIO, NUMOK, DESE_TIPOREF, DESE_IDREF, DESE_ITEMREF)
                VALUES (:IDENS, 16, :prefens, NEW.bode_cod, '000001', new.mvar_fecha, new.mvar_conc, '', (new.mvar_cant*-1), :unidad, 1, 'N', 'N',
                NEW.arti_cod, :descr, NEW.arti_cod, NEW.mvar_lote, NULL, NULL, USER, 'N', NEW.mvar_tipodoc, NEW.mvar_idref, NEW.mvar_item);
            ITEM = 0;
            FOR SELECT ARPR_CANT, ARPR_UNIDAD, ARPR_COMP, ARTI_DES, TAIV_PORC, ARTI_CONSUMO FROM articulos_producto P, ARTICULO A, TARIFA_IVA T
                WHERE P.ARTI_COD = NEW.arti_cod AND A.arti_cod = P.arpr_comp AND A.taiv_cod = T.taiv_cod
                INTO :CANTPR, :UNIPR, :CODPR, :DESPR, :IVA, :CONSUMO
                DO
                BEGIN
                ITEM = ITEM + 1;
                EXECUTE PROCEDURE factor_unidad_cant(:codpr,  :unipr) returning_values (:FACTOR);
                EXECUTE PROCEDURE costo_promedio_unidad (:codpr, NEW.mvar_fecha, :UNIPR) returning_values (:COSTO);
                IVAM = costo * cantpr * iva / 100;
                SELECT ARTI_EXIST FROM ARTICULO WHERE ARTI_COD = :codpr INTO :LOTE;
                if (LOTE = 'L') then
                    begin
                    if ((new.mvar_lote is not null) and (new.mvar_lote <> '')) then
                        SELECT MIN(ESDE_LOTE) FROM ENSAMBLES_DETALLE D, ENSAMBLES E WHERE E.ensa_id = D.ensa_id AND
                            E.arti_cod = NEW.arti_cod AND E.ensa_lote = NEW.mvar_lote AND D.arti_cod = :codpr INTO :nrolote;
                    else
                        SELECT first 1 ESDE_LOTE FROM ENSAMBLES_DETALLE D, ENSAMBLES E WHERE E.ensa_id = D.ensa_id AND
                            E.arti_cod = NEW.arti_cod AND E.ensa_fecha <= NEW.mvar_fecha AND D.arti_cod = :codpr
                            order by ensa_fecha desc INTO :nrolote;
                    end
                else
                    nrolote = '';
                INSERT INTO desensambles_detalle(DESE_ID, DESE_ITEM, ARTI_COD, BODE_COD, DEDE_CANT, DEDE_UNIDAD, DEDE_COSTO, DEDE_LOTE, DEDE_FACTOR, DEDE_IVAPORC, DEDE_IVAMONTO, DEDE_CONSUMO, DEDE_CODBAR, DEDE_ANULADO, DEDE_TRANSMIT, DEDE_DESC, DEDE_TOTAL, DEDE_OBS)
                    VALUES (:idens, :ITEM, :codpr,  NEW.bode_cod, :cantpr * NEW.mvar_cant, :unipr, :costo, :nrolote, :FACTOR, :IVA, :ivam, :consumo, :codpr, 'N', 'N', :despr, :COSTO * :cantpr, NULL);
                END
            END
        end
    END
END^

SET TERM ; ^

SET TERM ^ ;

ALTER TRIGGER PRODUCCION_ORDEN_AU
as
declare variable CONSEC INTEGER;
declare variable ID INTEGER;
declare variable ARTIC VARCHAR(20);
declare variable TOTAL NUMERIC(18,2);
declare variable COSTO NUMERIC(18,2);
declare variable COSTOS NUMERIC(18,2);
declare variable COSTOD NUMERIC(18,2);
declare variable FEC DATE;
declare variable CANT NUMERIC(18,4);
declare variable CANTE NUMERIC(18,4);
declare variable IDMOV INTEGER;
begin
if (NEW.pror_anulado = 'S') then
    BEGIN
    select enco_consec from comprobante_encabezado where enco_tiporef = 19 and enco_idref = old.pror_id into :consec;
    if (NOT consec is null) then
     delete from comprobante_detalle where enco_consec = :consec;
    delete from comprobante_encabezado where enco_tiporef = 19 and enco_idref = old.pror_id;
    INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
        VALUES (USER, 19, NEW.pror_id, 'A', NEW.pref_pre || NEW.pror_numero);
    END
else
    begin
    if (NEW.pror_estado <> 'A' AND OLD.pror_estado = 'A') then
        BEGIN
        /* ESTAN CERRANDO LA ORDEN */
        FOR SELECT ED.prde_id, ED.ARTI_COD, EE.prde_fecha, ED.pren_cantok
            FROM produccion_entrada_det ED, produccion_entrada_enc EE
            WHERE EE.prde_id = ED.prde_id AND EE.pror_id = NEW.pror_id
            ORDER BY EE.prde_id
            INTO :ID, :artic, :fec, :CANT
            DO
            BEGIN
            TOTAL = 0;
            /* busque el id de la orden */
            SELECT SUM(D.pode_cant * D.pode_costo) FROM produccion_orden_detalle D, produccion_orden E
                WHERE D.pror_id = E.pror_id AND E.pror_id = NEW.pror_id AND D.pode_anulado = 'N' INTO :COSTO;
            if (COSTO IS NULL) then
                COSTO = 0;
            SELECT SUM(prsa_CANT * PRSA_COSTO) FROM produccion_salida_det D, produccion_salida_enc E
                WHERE D.prsa_id = E.prsa_id AND E.pror_id = NEW.pror_id AND D.prsa_anulado = 'N' INTO :COSTOS;
            if (COSTOS IS NULL) then
                COSTOS = 0;
            SELECT SUM(D.prdd_cant * D.prdd_costo) FROM produccion_devolucion_det D, produccion_devolucion E
                WHERE D.prdd_id = E.prdd_id AND E.pror_id = NEW.pror_id AND D.prdd_anulado = 'N' INTO :COSTOD;
            if (COSTOD IS NULL) then
                COSTOD = 0;
            COSTOS = COSTO + COSTOS - COSTOD;
            SELECT SUM(D.pren_cantok + D.pren_cantmal) FROM produccion_entrada_det D, produccion_entrada_enc E
                WHERE D.prde_id = E.prde_id AND E.pror_id = NEW.pror_id AND D.pren_anulado = 'N' INTO :cante;
            if (cante IS NULL) then
                cante = 0;
            if (cante <> 0) then
                TOTAL = COSTOS / CANTE;
            ELSE
                TOTAL = 0;
            FOR SELECT MVAR_CONS FROM MOVIMIENTO_ARTICULO WHERE MVAR_TIPODOC = 20 AND MVAR_IDREF = :ID AND MVAR_ENTRADA = 'S' AND ARTI_COD = :artic
                INTO :IDMOV
                DO
                BEGIN
                EXECUTE PROCEDURE actualice_costo(:artic, :fec, :total, :cant, 'S', 'S', :IDMOV, 20);
                UPDATE MOVIMIENTO_ARTICULO SET MVAR_COSTO = :TOTAL WHERE MVAR_CONS = :IDMOV;
                EXECUTE PROCEDURE actualice_costo(:artic, :fec, :total, :cant, 'S', 'N', :IDMOV, 20);
                EXECUTE PROCEDURE chequeo_costos(:artic, :fec-1);
                END
            END
        END
    INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
        VALUES (USER, 19, NEW.pror_id, 'U', NEW.pref_pre || NEW.pror_numero);
    end
if ((OLD.pref_pre <> NEW.pref_pre) or
    (OLD.pror_numero <> NEW.pror_numero) or
    (OLD.pror_fecha <> NEW.pror_fecha) ) then
    UPDATE produccion_orden_detalle SET PODE_TRANSMIT = 'N' WHERE PROR_ID = OLD.pror_id;

if (OLD.pror_anulado <> NEW.pror_anulado) then
    UPDATE produccion_orden_detalle SET PODE_ANULADO = NEW.pror_anulado WHERE PROR_ID = OLD.pror_id;

if (OLD.pror_transmit <> NEW.pror_transmit) then
    UPDATE produccion_orden_detalle SET PODE_TRANSMIT = NEW.pror_transmit WHERE PROR_ID = OLD.pror_id;
end^

SET TERM ; ^

EXECUTE PROCEDURE actualice_prminimo(CAST('NOW' AS DATE));
COMMIT WORK;

/* DESCUENTO MAXIMO POR ARTICULO */

ALTER TABLE ARTICULO
ADD ARTI_DTOMAX T_PORCENTAJE;

UPDATE ARTICULO SET ARTI_DTOMAX = 0 WHERE ARTI_DTOMAX IS NULL;
COMMIT WORK;

/* TURNO EN ENSAMBLES */

ALTER TABLE ENSAMBLES
ADD ENSA_TURNO T_ID;

CREATE TABLE ENSAMBLE_TURNO (
    ENSA_TURNO T_ID NOT NULL,
    ENSA_NOMBRE T_CONCEPTO);

ALTER TABLE ENSAMBLE_TURNO
ADD CONSTRAINT PK_ENSAMBLE_TURNO
PRIMARY KEY (ENSA_TURNO);

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

SET TERM ^ ;

CREATE OR ALTER procedure IMPR_ENSAMBLE (
    ID integer)
returns (
    PREF varchar(4),
    NUMERO varchar(8),
    FECHA date,
    CONCEPTO varchar(60),
    REFER varchar(60),
    CODBODEGA varchar(2),
    NOMBODEGA varchar(30),
    PRODARTI varchar(15),
    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),
    CODRETAL varchar(20),
    DESCRETAL varchar(60),
    CANTRETAL numeric(18,4),
    PESOTOTAL numeric(18,4),
    OBS blob sub_type 1 segment size 80,
    TOTENSAMBLE numeric(18,2),
    ITEM integer,
    ARTICULO varchar(15),
    CODBAR varchar(15),
    ARTIDES varchar(60),
    CANT numeric(18,4),
    UNIDAD varchar(8),
    BODITEM varchar(2),
    COSTO numeric(18,2),
    IVAPORC numeric(9,2),
    IVAMONTO numeric(18,2),
    CONSUMO numeric(18,2),
    PESO numeric(18,4),
    TOTAL numeric(18,2),
    LOTE varchar(15))
AS
BEGIN
  /*  */
  SELECT PREF_PRE, ENSA_NUMERO, ENSA_FECHA, ENSA_CONC, ENSA_REFER, E.BODE_COD, BODE_NOM, ENSA_CODBAR, ARTI_COD,
    ENSA_DESC, ENSA_CANT, ENSA_UNIDAD, ENSA_LOTE, ENSA_OBS, ENSA_PESO, ENSA_CODRETAL, ENSA_CANTRETAL, ENSA_TURNO, ENSA_OPER, ENSA_MAQUINA
    FROM ENSAMBLES E, BODEGA B WHERE E.BODE_COD = B.BODE_COD AND E.ENSA_ID = :ID into
    :PREF, :NUMERO, :FECHA, :CONCEPTO, :REFER, :CODBODEGA, :NOMBODEGA, :PRODCODBAR, :PRODARTI,
    PRODDES, PRODCANT, PRODUNIDAD, PRODLOTE, :OBS, :PESOTOTAL, :CODRETAL, :CANTRETAL, :turno, :operario,  :MAQUINA;
  SELECT SUM(ESDE_TOTAL) FROM ensambles_detalle WHERE ENSA_ID = :ID INTO :TOTENSAMBLE;
  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;
  SELECT ARTI_DES FROM ARTICULO WHERE ARTI_COD = :codretal INTO :descretal;
  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_TOTAL, ESDE_LOTE, ESDE_PESO
    FROM ensambles_detalle D, ARTICULO A
    WHERE D.ARTI_COD = A.ARTI_COD AND D.ENSA_ID = :ID
    ORDER BY ESDE_ITEM
    INTO :ITEM, :ARTICULO, :CODBAR, :ARTIDES, :CANT, :UNIDAD, :BODITEM, :COSTO, :IVAPORC, :IVAMONTO, :CONSUMO, :TOTAL, :LOTE, :PESO
    DO
      BEGIN
      /*TOTAL = TOTAL - IVAMONTO - CONSUMO;*/
      SUSPEND;
      END
END^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER procedure REP_ENSAMBLES (
    FECINI date,
    FECFIN date,
    PREFINI varchar(4),
    PREFFIN varchar(4),
    OPER integer,
    MAQUI integer,
    BODINI varchar(2),
    BODFIN varchar(2),
    DETALLE char(1),
    SUBEMPRESA integer)
returns (
    FECHA date,
    PREF varchar(4),
    NUMERO varchar(8),
    TURNO varchar(60),
    OPERARIO varchar(60),
    MAQUINA varchar(60),
    BODEGA varchar(2),
    NOMBODEGA varchar(60),
    PRODUCTO varchar(20),
    DESPROD varchar(60),
    CANT numeric(18,4),
    PESO numeric(18,4),
    RETAL varchar(60),
    PESORETAL numeric(18,4),
    CONC varchar(60),
    OBS varchar(255),
    CODCOMP varchar(20),
    DESCOMP varchar(60),
    CANTCOMP numeric(18,4),
    BODCOMP varchar(2),
    PESOCOMP numeric(18,4))
AS
declare variable cantretal NUMERIC(18,4);
declare variable ID INTEGER;
begin
FOR SELECT ENSA_ID, E.PREF_PRE, ENSA_NUMERO, ENSA_FECHA, ENSA_CONC, E.BODE_COD, BODE_NOM, ENSA_CODBAR, ENSA_DESC,
    ENSA_CANT, ENSA_PESO, ENSA_OBS, ENSA_CODRETAL, ENSA_CANTRETAL, ENSA_TURNO, ENSA_OPER, ENSA_MAQUINA
    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 E.PREF_PRE >= :prefini AND E.PREF_PRE <= :preffin
     AND P.PREF_PRE = E.PREF_PRE AND P.TIDO_COD = 15 AND ((P.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) AND ENSA_ANULADO = 'N'
     AND ((:OPER = 0) OR (ENSA_OPER = :OPER)) AND ((:MAQUI = 0) or (ENSA_MAQUINA = :MAQUI)) AND E.bode_cod >= :bodini AND E.bode_cod <= :bodfin
    ORDER BY ENSA_FECHA, ENSA_ID
    into :ID, :PREF, :NUMERO, :FECHA, :conc, :bodega, :nombodega, :turno, :producto, :desprod,
    :cant, :peso, :OBS, :retal, :cantretal, :operario, :maquina
    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;
    SELECT ARTI_PESO FROM ARTICULO WHERE ARTI_COD = :retal INTO :pesoretal;
    if (pesoretal IS NULL) then
        pesoretal = 0;
    pesoretal = pesoretal * cantretal / 1000;
    if (DETALLE = 'S') then
        FOR SELECT ESDE_CODBAR, ESDE_DESC, ESDE_CANT, BODE_COD, ESDE_PESO
            FROM ensambles_detalle D, ARTICULO A WHERE D.ARTI_COD = A.ARTI_COD AND D.ENSA_ID = :ID INTO
            :codcomp, :descomp, :cantcomp, :bodcomp, :pesocomp
            DO
            BEGIN
            SUSPEND;
            END
    else
        SUSPEND;
    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 ST NUMERIC(18,2);
declare variable IVA NUMERIC(18,2);
declare variable TOT NUMERIC(18,2);
begin
  /* 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
    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
    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 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
                    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
                    do
                begin
                SUBTOTAL = TOTAL - IVAMONTO - CONSUMO;
                suspend;
                end
              else
                begin
                select sum(SADE_IVAMONTO), sum(SADE_CONSUMO), sum(SADE_TOTAL)
                    from SALIDAS_DETALLE D where D.SALI_ID = :ID into
                    :IVAMONTO, :CONSUMO, :TOTAL;
                SUBTOTAL = TOTAL - IVAMONTO - CONSUMO;
                suspend;
                end
             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
    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
    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 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 into
                    :ITEM, :ARTICULO, :CODBAR, :ARTIDES, :CANT, :UNIDAD, :COSTO, :IVAPORC, :IVAMONTO, :CONSUMO, :TOTAL, :LOTE, :OBSITEM
                    do
                    begin
                    SUBTOTAL = TOTAL - IVAMONTO - CONSUMO;
                    suspend;
                    end
              else
                begin
                select sum(TRAS_IVAMONTO), sum(TRAS_CONSUMO), sum(TRAS_TOTAL) from trasferencias_detalle D
                    where D.TRAN_ID = :ID into :IVAMONTO, :CONSUMO, :TOTAL;
                SUBTOTAL = TOTAL - IVAMONTO - CONSUMO;
                suspend;
                end
             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
    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
    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
              if (DETALLE = 'S') then
                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_TOTAL, 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, :TOTAL, :LOTE, :OBSITEM
                    do
                    begin
                    SUBTOTAL = TOTAL - IVAMONTO - CONSUMO;
                    suspend;
                    end
              else
                begin
                select sum(ESDE_IVAMONTO), sum(ESDE_CONSUMO), sum(ESDE_TOTAL) from ENSAMBLES_detalle D where D.ENSA_ID = :ID into
                    :IVAMONTO, :CONSUMO, :TOTAL;
                SUBTOTAL = TOTAL - IVAMONTO - CONSUMO;
                suspend;
                end
             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 ; ^

SET TERM ^ ;

CREATE OR ALTER procedure REP_CONSECUTIVOS_INV (
    TIPO integer,
    DETALLE char(1),
    PREINI varchar(4),
    PREFIN varchar(4),
    NUMINI varchar(8),
    NUMFIN varchar(8),
    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),
    OBS blob sub_type 0 segment size 80,
    TURNO varchar(60),
    OPERARIO varchar(60),
    MAQUINA varchar(60),
    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 ST NUMERIC(18,2);
declare variable IVA NUMERIC(18,2);
declare variable TOT NUMERIC(18,2);
BEGIN
  /* 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 PR
    WHERE E.BODE_COD = B.BODE_COD AND E.PREF_PRE >= :PREINI AND E.PREF_PRE <= :PREFIN AND ENTR_NUMERO >= :NUMINI AND ENTR_NUMERO <= :NUMFIN
     AND PR.PREF_PRE = E.PREF_PRE AND PR.TIDO_COD = 11 AND ((PR.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
    ORDER BY E.PREF_PRE, ENTR_NUMERO
    INTO :ID, :PREF, :NUMERO, :FECHA, :CONCEPTO, :REFER, :CODBODORI, :NOMBODORI, :NOMTERCERO, :OBS, :ANULADO
    DO
        BEGIN
        if ((: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
                    ORDER BY ENDE_ITEM
                    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
    FROM SALIDAS S, BODEGA B, PREFIJOS PR
    WHERE S.BODE_COD = B.BODE_COD AND S.PREF_PRE >= :PREINI AND S.PREF_PRE <= :PREFIN AND SALI_NUMERO >= :NUMINI AND SALI_NUMERO <= :NUMFIN
     AND PR.PREF_PRE = S.PREF_PRE AND PR.TIDO_COD = 12 AND ((PR.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
    ORDER BY S.PREF_PRE, SALI_NUMERO
    into :ID, :PREF, :NUMERO, :FECHA, :CONCEPTO, :REFER, :CODBODORI, :NOMBODORI, :NOMTERCERO, :OBS, :ANULADO
    DO
        BEGIN
        if ((: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 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
                FROM SALIDAS_DETALLE D, ARTICULO A
                WHERE D.ARTI_COD = A.ARTI_COD AND D.SALI_ID = :ID
                ORDER BY SADE_ITEM
                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(SADE_IVAMONTO), SUM(SADE_CONSUMO), SUM(SADE_TOTAL) FROM SALIDAS_DETALLE D WHERE D.SALI_ID = :ID INTO
                    :IVAMONTO, :CONSUMO, :TOTAL;
                SUBTOTAL = TOTAL - IVAMONTO - CONSUMO;
                SUSPEND;
                END
             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
    FROM TRASFERENCIAS T, BODEGA BO, BODEGA BD, PREFIJOS PR
    WHERE T.BODE_COD = BO.BODE_COD AND T.TRAN_BODDES = BD.BODE_COD AND T.PREF_PRE >= :PREINI AND T.PREF_PRE <= :PREFIN AND TRAN_NUMERO >= :NUMINI AND TRAN_NUMERO <= :NUMFIN
     AND PR.PREF_PRE = T.PREF_PRE AND PR.TIDO_COD = 13 AND ((PR.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
    ORDER BY T.PREF_PRE, TRAN_NUMERO
    into :ID, :PREF, :NUMERO, :FECHA, :CONCEPTO, :REFER, :CODBODORI, :NOMBODORI, :CODBODDES, :NOMBODDES, :OBS, :ANULADO
    DO
        BEGIN
        if ((: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 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
                    SUBTOTAL = TOTAL - IVAMONTO - CONSUMO;
                    SUSPEND;
                    END
              ELSE
                BEGIN
                SELECT SUM(TRAS_IVAMONTO), SUM(TRAS_CONSUMO), SUM(TRAS_TOTAL) FROM trasferencias_detalle D WHERE D.TRAN_ID = :ID INTO
                    :IVAMONTO, :CONSUMO, :TOTAL;
                SUBTOTAL = TOTAL - IVAMONTO - CONSUMO;
                SUSPEND;
                END
             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 PR
    WHERE A.BODE_COD = B.BODE_COD AND A.PREF_PRE >= :PREINI AND A.PREF_PRE <= :PREFIN AND AJUS_NUMERO >= :NUMINI AND AJUS_NUMERO <= :NUMFIN
     AND PR.PREF_PRE = A.PREF_PRE AND PR.TIDO_COD = 14 AND ((PR.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
    ORDER BY A.PREF_PRE, AJUS_NUMERO
    into :ID, :PREF, :NUMERO, :FECHA, :CONCEPTO, :CODBODORI, :NOMBODORI, :OBS, :ANULADO
    DO
        BEGIN
        if ((: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
                ORDER BY AJUS_ITEM
                INTO :ITEM, :ARTICULO, :CODBAR, :ARTIDES, :EXANT, :UNIDAD, :BODITEM, :CANT, :LOTE, :OBSITEM
                    DO
                      BEGIN
                      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
    FROM ENSAMBLES E, BODEGA B, PREFIJOS PR
    WHERE E.BODE_COD = B.BODE_COD AND E.PREF_PRE >= :PREINI AND E.PREF_PRE <= :PREFIN AND ENSA_NUMERO >= :NUMINI AND ENSA_NUMERO <= :NUMFIN
     AND PR.PREF_PRE = E.PREF_PRE AND PR.TIDO_COD = 15 AND ((PR.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
    ORDER BY E.PREF_PRE, ENSA_NUMERO
    into :ID, :PREF, :NUMERO, :FECHA, :CONCEPTO, :REFER, :CODBODORI, :NOMBODORI, :PRODCODBAR, :PRODDES, :PRODCANT, :PRODUNIDAD, :PRODLOTE, :OBS, :ANULADO, :MAQUINA, :TURNO, :OPERARIO
    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 ((: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 ESDE_ITEM, A.ARTI_COD, ESDE_CODBAR, ESDE_DESC, ESDE_CANT, ESDE_UNIDAD, BODE_COD, ESDE_COSTO, ESDE_IVAPORC, ESDE_IVAMONTO, ESDE_CONSUMO, ESDE_TOTAL, ESDE_LOTE, ESDE_OBS
                FROM ensambles_detalle D, ARTICULO A
                WHERE D.ARTI_COD = A.ARTI_COD AND D.ENSA_ID = :ID
                ORDER BY ESDE_ITEM
                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(ESDE_IVAMONTO), SUM(ESDE_CONSUMO), SUM(ESDE_TOTAL) FROM ENSAMBLES_detalle D WHERE D.ENSA_ID = :ID INTO
                    :IVAMONTO, :CONSUMO, :TOTAL;
                SUBTOTAL = TOTAL - IVAMONTO - CONSUMO;
                SUSPEND;
                END
             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 PR
    WHERE E.BODE_COD = B.BODE_COD AND E.PREF_PRE >= :PREINI AND E.PREF_PRE <= :PREFIN AND DESE_NUMERO >= :NUMINI AND DESE_NUMERO <= :NUMFIN
     AND PR.PREF_PRE = E.PREF_PRE AND PR.TIDO_COD = 16 AND ((PR.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
    ORDER BY E.PREF_PRE, DESE_NUMERO
    into :ID, :PREF, :NUMERO, :FECHA, :CONCEPTO, :REFER, :CODBODORI, :NOMBODORI, :PRODCODBAR, :PRODDES, :PRODCANT, :PRODUNIDAD, :PRODLOTE, :OBS, :ANULADO
    DO
        BEGIN
        if ((: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 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
                ORDER BY DESE_ITEM
                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 PR
    WHERE R.BODE_COD = B.BODE_COD AND R.PREF_PRE >= :PREINI AND R.PREF_PRE <= :PREFIN AND RESE_NUMERO >= :NUMINI AND RESE_NUMERO <= :NUMFIN
     AND PR.PREF_PRE = R.PREF_PRE AND PR.TIDO_COD = 17 AND ((PR.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
    ORDER BY R.PREF_PRE, RESE_NUMERO
    into :ID, :PREF, :NUMERO, :FECHA, :CONCEPTO, :REFER, :CODBODORI, :NOMBODORI, :NOMTERCERO, :OBS, :ANULADO
    DO
        BEGIN
        if ((: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
                ORDER BY RSDE_ITEM
                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 PR
    WHERE O.PREF_PRE >= :PREINI AND O.PREF_PRE <= :PREFIN AND ORIN_NUMERO >= :NUMINI AND ORIN_NUMERO <= :NUMFIN
     AND PR.PREF_PRE = O.PREF_PRE AND PR.TIDO_COD = 18 AND ((PR.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
    ORDER BY O.PREF_PRE, ORIN_NUMERO
    into :ID, :PREF, :NUMERO, :FECHA, :VENCE, :CONCEPTO, :REFER, :NOMTERCERO, :OBS, :ANULADO
    DO
        BEGIN
        if ((: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
                ORDER BY ORID_ITEM
                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_pref >= :PREINI AND P.plpr_pref <= :PREFIN AND P.plpr_numero >= :NUMINI AND P.plpr_numero <= :NUMFIN AND
      P.plpr_bodori = B.BODE_COD AND PR.PREF_PRE = P.plpr_pref AND PR.TIDO_COD = 27 AND ((PR.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
    ORDER BY P.plpr_pref, P.plpr_numero
    into :ID, :PREF, :NUMERO, :FECHA, :CONCEPTO, :REFER, :CODBODORI, :NOMBODORI, :NOMTERCERO, :OBS, :ANULADO
    DO
        BEGIN
        SUBTOTAL = 0;
        IVAMONTO = 0;
        TOTAL = 0;
        if ((: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
              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 ; ^

/* CUENTAS DE IVA EN DEVOLUCIONES INDEPENDIENTES */
ALTER TABLE TARIFA_IVA
ADD TAIV_CTAIVADV T_CTA_CONTABLE;

ALTER TABLE TARIFA_IVA
ADD TAIV_CTAIVADC T_CTA_CONTABLE;

UPDATE TARIFA_IVA SET TAIV_CTAIVADV = TAIV_CTAIVAVNT, TAIV_CTAIVADC = TAIV_CTAIVACMP
    WHERE TAIV_CTAIVADV IS NULL;
COMMIT WORK;

ALTER TABLE GRUPO
ADD GRUP_CTAIVADV T_CTA_CONTABLE;

ALTER TABLE GRUPO
ADD GRUP_CTAIVADC T_CTA_CONTABLE;

UPDATE GRUPO SET GRUP_CTAIVADV = GRUP_CTAIVAVNT, GRUP_CTAIVADC = GRUP_CTAIVACMP
    WHERE GRUP_CTAIVADV IS NULL;
COMMIT WORK;

ALTER TABLE CONTABIL_ARTICULO
ADD COAR_CTAIVADV T_CTA_CONTABLE;

ALTER TABLE CONTABIL_ARTICULO
ADD COAR_CTAIVADC T_CTA_CONTABLE;

UPDATE CONTABIL_ARTICULO SET COAR_CTAIVADV = COAR_CTAIVAV, COAR_CTAIVADC = COAR_CTAIVAC
    WHERE COAR_CTAIVADV IS NULL;
COMMIT WORK;

SET TERM ^ ;

CREATE OR 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 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 ^ ;

CREATE OR ALTER procedure CONTABIL_DEVOLCOMP (
    IDDOC integer,
    IDINTER integer)
returns (
    ERROR integer,
    VER char(1),
    IDC integer)
AS
declare variable PREFIJO VARCHAR(4);
declare variable NUM VARCHAR(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 TIPOCOMP VARCHAR(3);
declare variable PREFCONT VARCHAR(4);
declare variable INVEN CHAR(1);
declare variable CTAINVEN VARCHAR(20);
declare variable IVA CHAR(1);
declare variable CTAIVA VARCHAR(20);
declare variable CONSUMO CHAR(1);
declare variable CTACONSUMO VARCHAR(20);
declare variable CXP CHAR(1);
declare variable CTACXP VARCHAR(20);
declare variable RTFTE CHAR(1);
declare variable CTARTFTE VARCHAR(20);
declare variable RTIVA CHAR(1);
declare variable CTARTIVA VARCHAR(20);
declare variable RTICA CHAR(1);
declare variable CTARTICA VARCHAR(20);
declare variable 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', TICO_COD, PRCO_PRE, INCO_INVEN, INCO_IVA, INCO_CONSUMO, INCO_CXP, INCO_RTFTE, INCO_RTIVA, INCO_RTICA, INCO_RTCREE,
    INCO_CTAINVEN, INCO_CTAIVA, INCO_CTACONSUMO, INCO_CTADTO, INCO_CTAADIC, INCO_CTAEXTRA, INCO_CTACXP, INCO_CTARTFTE,
    INCO_CTARTIVA, INCO_CTARTICA, INCO_CTARTCREE, INCO_CONFIRMAR, INCO_CENTRO
    FROM INTERFAZ_COMPRAS
    WHERE INCO_ID = :IDINTER
    INTO :EXISTE, :TIPOCOMP, :PREFCONT, :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
    /* BORRE CUALQUEIR CONTABILIZACION PREVIA */
    DELETE FROM CONTABILIZACION WHERE CNTB_TIPOREF = 24 AND CNTB_IDREF = :IDDOC;
   /* TRAIGA EL ENCABEZADO DE LA DEVOLUCION */
   SELECT PREF_PRE, DVCO_NUMERO, DVCO_FECHA, D.TERC_NIT, DVCO_FACTURA, DVCO_IMPTOS, DVCO_DTOMONTO, DVCO_ADICIONAL, DVCO_IVAMONTO,
        DVCO_EXTRA, DVCO_TOTAL, DVCO_RTFTEPORC, DVCO_RTFTEMONTO, DVCO_RTIVAPORC, DVCO_RTIVAMONTO, DVCO_RTICAPORC, DVCO_RTICAMONTO,
        DVCO_RTCREE, DVCO_RTCREEM, PROV_CTARTFTE, PROV_CTARTIVA, PROV_CTARTICA, PROV_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;
    /* CONVIERTA LA FECHA A CADENA */
    EXECUTE PROCEDURE FECHA_A_CONTA(:FECAUX) returning_values (:FECHA);
    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;

    /* REGISTRE EL ENCABEZADO CONTABLE */
    CONCEPTO = 'DEVOLUCION COMPRA No. ' || NUMERO || ' EN FACTURA ' || NUMFAC;
    IDC = GEN_ID(ID_CONTABILIZA, 1);
    INSERT INTO CONTABILIZACION (CNTB_ID, CNTB_TIPOCOMP, CNTB_PREFCNT, CNTB_NUMERO, CNTB_FECHA, CNTB_CONCEPTO, CNTB_REF, CNTB_TIPOREF, CNTB_IDREF, CNTB_PREFREF, CNTB_NUMREF, CNTB_PROCESADO)
        VALUES (:IDC, :TIPOCOMP, :PREFCONT, :NUM, :FECHA, :CONCEPTO, '', 24, :IDDOC, :PREFIJO, :NUM, 'N');

    NUMITEMS = 0;
    SUMA = 0;
    ERROR = 0;
    /* CUENTAS DE INVENTARIO */
    if (INVEN = 'A') then
        BEGIN
        /* SUME LAS BASES DE LOS ARTICULOS DEL DOCUMENTO */
        FOR SELECT MAX(COAR_CTACOMP), SUM(cast(DVCD_CANT as double precision) * (DVCD_PRUNIT-DVCD_DTOMONTO)), SUM(DVCD_IVAMONTO), SUM(DVCD_CONSUMO)
            FROM ARTICULO A, CONTABIL_ARTICULO C, DEVOLUCIONES_COMPRAS_DET F
            WHERE F.DVCO_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD
            GROUP BY COAR_CTAINV
            INTO :CTAINVEN, :MONTO, :IMPTOS, :VALORADIC
            DO
            BEGIN
            if (IMPINC = 'S') then
                BEGIN
                MONTO = MONTO - IMPTOS;
                if (FOMENTO <> 'SI') then
                    MONTO = MONTO - VALORADIC;
                END
            /* TRAIGA LAS CARACTERISTICAS DE LA CUENTA */
            EXECUTE PROCEDURE CUENTA_INTERFAZ(24, :IDDOC, :CTAINVEN, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            /* DEPENDE DEL TIPO DE CUENTA */
            if ((TIPOCUEN = 'I') 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 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(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 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(24, :IDDOC, :CTAIVA, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            /* DEPENDE DEL TIPO DE CUENTA */
            if (TIPOCUEN = 'I') then
                BEGIN
                /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                FOR SELECT F.ARTI_COD, DVCD_IVAMONTO, (cast(DVCD_CANT as double precision) * (DVCD_PRUNIT-DVCD_DTOMONTO)), TAIV_PORC, DVCD_CONSUMO
                    FROM ARTICULO A, CONTABIL_ARTICULO C, DEVOLUCIONES_COMPRAS_DET F, TARIFA_IVA T
                    WHERE F.DVCO_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND COAR_CTAIVAV = :CUENTA AND A.TAIV_COD = T.TAIV_COD
                    INTO :ARTICULO, :IMPTOS, :MONTO, :PORCIVA, :VALORADIC
                DO
                    BEGIN
                    if (IMPINC = 'S') then
                        BEGIN
                        MONTO = MONTO - IMPTOS;
                        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(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 C, DEVOLUCIONES_COMPRAS_DET F
            WHERE F.DVCO_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD
            GROUP BY COAR_CTACONS
            INTO :CTACONSUMO, :IMPTOS
        DO
            BEGIN
            if (IMPTOS <> 0) then
                BEGIN
                /* TRAIGA LAS CARACTERISTICAS DE LA CUENTA */
                EXECUTE PROCEDURE CUENTA_INTERFAZ(24, :IDDOC, :CTACONSUMO, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                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(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(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(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(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(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 C, DEVOLUCIONES_COMPRAS_DET F
            WHERE F.dvco_id = :IDDOC AND F.ARTI_COD = C.ARTI_COD
            GROUP BY COAR_CTARTFTE
            INTO :CTARTFTE, :PRTFTE, :baseadic, :MONTO, :VRRTFTE
            DO
            BEGIN
            MONTO = MONTO * FACTOR;
            if (MONTO >= BASEADIC) then
                BEGIN
                VRRTFTE = VRRTFTE * FACTOR / 100;
                execute procedure redondee(VRRTFTE, DIG) returning_values (VRRTFTE);
                execute procedure redondee(MONTO, DIG) returning_values (MONTO);
                if (VRRTFTE <> 0) then
                    BEGIN
                    /* TRAIGA LAS CARACTERISTICAS DE LA CUENTA */
                    EXECUTE PROCEDURE CUENTA_INTERFAZ(24, :IDDOC, :CTARTFTE, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
                    if (ERRORC <> 0) then
                        ERROR = ERROR + 1;
                    if (TIPOCUEN = 'C') then
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_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(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(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(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(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(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 ^ ;

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 ^ ;

CREATE OR ALTER procedure CUENTAS_ARTICULOS
AS
declare variable GRUP_TIVA CHAR(10);
BEGIN
DELETE FROM CONTABIL_ARTICULO;

EXECUTE PROCEDURE LEE_CONFIGURACION('INVENTARIO', 'ARTICULOS', 'OPCION PARA CAMBIAR AUTOMATICAMENTE LAS CTAS CONTABLES DEL ARTICULO') RETURNING_VALUES (:GRUP_TIVA);
if (GRUP_TIVA = 'GRUPOS') then
    INSERT INTO CONTABIL_ARTICULO (ARTI_COD, COAR_CTAINV, COAR_CTAIVAC, COAR_CTAIVAV, COAR_CTAVNT, COAR_CTACOS, COAR_CTADEV, COAR_CTACOMP, COAR_CTARTFTE, COAR_CTARTFTEV, COAR_RTBASE, COAR_RTFTE, COAR_CTARTCREE, COAR_RTCREE, COAR_CTARTICAV, COAR_RTICA, COAR_CTAIVADV, COAR_CTAIVADC)
        SELECT ARTI_COD, GRUP_CTAINVENT, GRUP_CTAIVACMP, GRUP_CTAIVAVNT, GRUP_CTAVENTAS, GRUP_CTACOSTOS, GRUP_CTADEV, GRUP_CTACOMP, GRUP_CTARTFTEC, GRUP_CTARTFTEV, GRUP_RTFTEB, GRUP_RTFTEP, GRUP_CTARTCREE, GRUP_RTCREE, GRUP_CTARTICA, GRUP_RTICA, GRUP_CTAIVADV, GRUP_CTAIVADC
            FROM ARTICULO A, GRUPO G
            WHERE A.GRUP_COD = G.GRUP_COD;
ELSE
    INSERT INTO CONTABIL_ARTICULO (ARTI_COD, COAR_CTAINV, COAR_CTAIVAC, COAR_CTAIVAV, COAR_CTAVNT, COAR_CTACOS, COAR_CTADEV, COAR_CTACOMP, COAR_CTAIVADV, COAR_CTAIVADC)
        SELECT ARTI_COD, TAIV_CTAINV, TAIV_CTAIVACMP, TAIV_CTAIVAVNT, TAIV_CTAVTA, TAIV_CTACOSTO, TAIV_CTADEV, TAIV_CTACOMP, TAIV_CTAIVADV, TAIV_CTAIVADC
            FROM ARTICULO A, TARIFA_IVA T
            WHERE A.taiv_cod = T.taiv_cod;
END^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER TRIGGER ARTICULO_AI FOR ARTICULO
ACTIVE AFTER INSERT POSITION 0
AS
declare variable OK CHAR(2);
declare variable LISTA INTEGER;
declare variable UTIL NUMERIC(9,2);
declare variable MARGEN NUMERIC(9,2);
declare variable GRUP_TIVA CHAR(10);
declare variable AUTOM CHAR(1);
BEGIN
INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
    VALUES (USER, 101, 1, 'I', NEW.arti_cod);
EXECUTE PROCEDURE LEE_CONFIGURACION('FACTURACION', 'ARTICULOS', 'CREAR PRECIOS AL CREAR ARTICULOS') RETURNING_VALUES (:OK);
IF (OK = 'SI') THEN
  BEGIN
  /* INSERTE PRECIOS */
  FOR SELECT LIPR_COD, LIPR_UTIL, LIPR_MARGEN, LIPR_AUTO FROM LISTA_PRECIOS
    INTO :LISTA, :UTIL, :MARGEN, :AUTOM
    do
    BEGIN
    INSERT INTO PRECIOS_ARTICULO (ARTI_COD, LIPR_COD, PRAR_AUTO, PRAR_UTIL, PRAR_MARGEN, PRAR_FIJO, PRAR_CANTMIN)
        VALUES (NEW.ARTI_COD, :LISTA, :AUTOM, :UTIL, :MARGEN, 0, 0.1);
    END
  END
/* INSERTE LA CONTABILIZACION DEL GRUPO O TARIFA DE IVA SEGUN PARAMETRO*/
EXECUTE PROCEDURE LEE_CONFIGURACION('INVENTARIO', 'ARTICULOS', 'OPCION PARA CAMBIAR AUTOMATICAMENTE LAS CTAS CONTABLES DEL ARTICULO') RETURNING_VALUES (:GRUP_TIVA);
if (GRUP_TIVA = 'GRUPOS') then
  INSERT INTO CONTABIL_ARTICULO (ARTI_COD, COAR_CTAINV, COAR_CTAIVAC, COAR_CTAIVAV, COAR_CTAVNT, COAR_CTACOS, COAR_CTADEV, COAR_CTACOMP, COAR_CTARTFTE, COAR_CTARTFTEV, COAR_RTBASE, COAR_RTFTE, COAR_CTARTCREE, COAR_RTCREE, COAR_CTARTICA, COAR_RTICA, COAR_CTAIVADV, COAR_CTAIVADC)
    SELECT NEW.ARTI_COD, GRUP_CTAINVENT, GRUP_CTAIVACMP, GRUP_CTAIVAVNT, GRUP_CTAVENTAS, GRUP_CTACOSTOS, GRUP_CTADEV, GRUP_CTACOMP, GRUP_CTARTFTEC, GRUP_CTARTFTEV, GRUP_RTFTEB, GRUP_RTFTEP, GRUP_CTARTCREE, GRUP_RTCREE, GRUP_CTARTICA, GRUP_RTICA, GRUP_CTAIVADV, GRUP_CTAIVADC
    FROM GRUPO G
    WHERE GRUP_COD = NEW.GRUP_COD;
if (GRUP_TIVA = 'TARIFA IVA') then
  INSERT INTO CONTABIL_ARTICULO (ARTI_COD, COAR_CTAINV, COAR_CTAIVAC, COAR_CTAIVAV, COAR_CTAVNT, COAR_CTACOS, COAR_CTADEV, COAR_CTACOMP, COAR_CTAIVADV, COAR_CTAIVADC)
    SELECT NEW.ARTI_COD, TAIV_CTAINV, TAIV_CTAIVACMP, TAIV_CTAIVAVNT, TAIV_CTAVTA, TAIV_CTACOSTO, TAIV_CTADEV, TAIV_CTACOMP, TAIV_CTAIVADV, TAIV_CTAIVADC
    FROM TARIFA_IVA T
    WHERE TAIV_COD = NEW.taiv_cod;
END^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER TRIGGER ARTICULO_AU FOR ARTICULO
ACTIVE AFTER UPDATE POSITION 0
as
declare variable GRUP_TIVA CHAR(10);
declare variable VTA CHAR(20);
declare variable IVAC CHAR(20);
declare variable IVAV CHAR(20);
declare variable INV CHAR(20);
declare variable COSTO CHAR(20);
declare variable DEV CHAR(20);
declare variable COMP CHAR(20);
declare variable RETC CHAR(20);
declare variable RETV CHAR(20);
declare variable RETB NUMERIC(18,2);
declare variable RETP NUMERIC(9,4);
declare variable IVADV CHAR(20);
declare variable IVADC CHAR(20);
declare variable NUMROWS INTEGER;
begin
INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
    VALUES (USER, 101, 1, 'U', NEW.arti_cod);
EXECUTE PROCEDURE LEE_CONFIGURACION('INVENTARIO', 'ARTICULOS', 'OPCION PARA CAMBIAR AUTOMATICAMENTE LAS CTAS CONTABLES DEL ARTICULO') RETURNING_VALUES (:GRUP_TIVA);
if (new.arti_des <> old.arti_des) then
  begin
  select count(*) from barras_articulo where arti_cod = new.arti_cod into :numrows;
  if (numrows = 1) then
    update barras_articulo set coba_des = new.arti_des where arti_cod = new.arti_cod;
  end
if (new.grup_cod <> old.grup_cod) then
 begin
  if (GRUP_TIVA = 'GRUPOS') then
   BEGIN
    SELECT GRUP_CTAINVENT, GRUP_CTAIVACMP, GRUP_CTAIVAVNT, GRUP_CTAVENTAS, GRUP_CTACOSTOS, GRUP_CTADEV, GRUP_CTACOMP, GRUP_CTARTFTEC, GRUP_CTARTFTEV, GRUP_RTFTEB, GRUP_RTFTEP, GRUP_CTAIVADV, GRUP_CTAIVADC
      FROM GRUPO G
      WHERE GRUP_COD = NEW.GRUP_COD
      into :INV, :IVAC, :IVAV, :VTA, :COSTO, :DEV, :COMP, :retc, :retv, :retb, :retp, :ivadv, :ivadc;
      update CONTABIL_ARTICULO
       SET COAR_CTAINV = :INV,
           COAR_CTAIVAC = :IVAC,
           COAR_CTAIVAV = :IVAV,
           COAR_CTAVNT = :VTA,
           COAR_CTACOS = :COSTO,
           COAR_CTADEV = :DEV,
           COAR_CTACOMP = :COMP,
           COAR_CTARTFTE = :retc,
           COAR_CTARTFTEV = :retv,
           COAR_RTFTE = :retp,
           COAR_CTAIVADV = :IVADV,
           COAR_CTAIVADC = :IVADC,
           COAR_RTBASE = :retb
        WHERE ARTI_COD = NEW.ARTI_COD;
   END
 end
if (new.taiv_cod <> old.taiv_cod) then
 begin
  if (GRUP_TIVA = 'TARIFA IVA') then
   BEGIN
    SELECT TAIV_CTAINV, TAIV_CTAIVACMP, TAIV_CTAIVAVNT, TAIV_CTAVTA, TAIV_CTACOSTO, TAIV_CTACOMP, TAIV_CTADEV, TAIV_CTAIVADV, TAIV_CTAIVADC
      FROM TARIFA_IVA T
      WHERE TAIV_COD = NEW.taiv_cod
      into :INV, :IVAC, :IVAV, :VTA, :COSTO, :COMP, :DEV, :ivadv, :IVADC;
      update CONTABIL_ARTICULO
       SET COAR_CTAINV = :INV,
           COAR_CTAIVAC = :IVAC,
           COAR_CTAIVAV = :IVAV,
           COAR_CTAVNT = :VTA,
           COAR_CTACOS = :COSTO,
           COAR_CTADEV = :DEV,
           COAR_CTACOMP = :COMP,
           COAR_CTAIVADV = :IVADV,
           COAR_CTAIVADC = :IVADC
        WHERE ARTI_COD = NEW.ARTI_COD;
   END
 end
end^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER procedure REP_ARTICULOS_CONTABIL (
    ARTINI varchar(15),
    ARTFIN varchar(15),
    INACTIVOS char(1),
    ORDEN char(1),
    AGRUPA char(1),
    GRPINI varchar(3),
    GRPFIN varchar(3),
    MARINI varchar(3),
    MARFIN varchar(3),
    SUBINI varchar(3),
    SUBFIN varchar(3))
returns (
    ARTI_COD varchar(15),
    ARTI_DES varchar(60),
    ARTI_DESCORTA varchar(30),
    GRUP_COD varchar(2),
    GRUP_NOM varchar(30),
    SUBG_COD varchar(3),
    SUBG_NOM varchar(30),
    MARC_COD varchar(3),
    MARC_NOM varchar(30),
    ARTI_IVA numeric(9,4),
    ARTI_UNIDAD varchar(8),
    ESAR_NOM varchar(20),
    ARTI_EXIST char(1),
    ARTI_FOTO blob sub_type 0 segment size 80,
    ARTI_OBS varchar(2048),
    ARTI_PESO numeric(18,2),
    ARTI_ALTO numeric(18,2),
    ARTI_ANCHO numeric(18,2),
    ARTI_LARGO numeric(18,2),
    ARTI_CONSUMO numeric(18,2),
    ARTI_FECHA date,
    UNAR_UNIDAD varchar(8),
    UNAR_FACCAN numeric(18,2),
    COBA_COD varchar(20),
    ARTI_TERCERO char(1),
    COAR_CTAINV varchar(20),
    COAR_CTACOMP varchar(20),
    COAR_CTAIVAC varchar(20),
    COAR_CTAIVADC varchar(20),
    COAR_CTAIVAV varchar(20),
    COAR_CTAIVADV varchar(20),
    COAR_CTAVNT varchar(20),
    COAR_CTADEV varchar(20),
    COAR_CTACONS varchar(20),
    COAR_CTACOS varchar(20))
AS
DECLARE VARIABLE DESINI VARCHAR(20);
DECLARE VARIABLE DESFIN VARCHAR(20);
begin
if (ORDEN = 'C') then
    BEGIN
    DESINI = '';
    DESFIN = 'zz';
    END
ELSE
    BEGIN
    DESINI = ARTINI;
    DESFIN = ARTFIN;
    ARTINI = '';
    ARTFIN = 'zz';
    END
FOR select a.arti_cod, arti_des, a.grup_cod, subg_cod, a.marc_cod, t.taiv_porc arti_iva, arti_unidad, esar_nom, arti_exist,
    arti_foto, substring(arti_obs from 1 for 2048), arti_peso, arti_ancho, arti_alto, arti_largo, arti_consumo, arti_fecha, arti_descorta,
    coar_ctainv, coar_ctacomp, coar_ctaivac, coar_ctaivav, coar_ctavnt, coar_ctadev, coar_ctacons, coar_ctacos, arti_tercero, COAR_CTAIVADV, COAR_CTAIVADC
    from articulo a, contabil_articulo c, tarifa_iva t, estado_articulo E
    where a.arti_cod >= :ARTINI and a.arti_cod <= :ARTFIN and a.ARTI_DES >= :DESINI AND a.ARTI_DES <= :DESFIN and a.arti_cod = c.arti_cod and
    A.esar_cod = E.esar_cod AND a.taiv_cod = t.taiv_cod and ((a.marc_cod is null) or (a.marc_cod >= :MARINI and a.marc_cod <= :MARFIN))
    and ((a.grup_cod is null) or (a.grup_cod >= :GRPINI and a.grup_cod <= :GRPFIN))
    and ((a.subg_cod is null) or (a.subg_cod >= :SUBINI and a.subg_cod <= :SUBFIN)) and a.esar_cod <> :INACTIVOS
    into  :ARTI_COD, :ARTI_DES, :GRUP_COD, :SUBG_COD, :MARC_COD, :ARTI_IVA, :ARTI_UNIDAD, esar_nom, arti_exist,
    arti_foto, arti_obs, arti_peso, arti_ancho, arti_alto, arti_largo, arti_consumo, arti_fecha, arti_descorta,
    :COAR_CTAINV, :COAR_CTACOMP, :COAR_CTAIVAC, :COAR_CTAIVAV, :COAR_CTAVNT, :COAR_CTADEV, :COAR_CTACONS, :COAR_CTACOS, :arti_tercero, :coar_ctaivadv, :coar_ctaivadc
    DO
    BEGIN
    GRUP_NOM = NULL;
    MARC_NOM = NULL;
    SUBG_NOM = NULL;
    COBA_COD = NULL;
    unar_unidad = NULL;
    unar_faccan = NULL;
    SELECT GRUP_NOM FROM GRUPO WHERE GRUP_COD = :GRUP_COD INTO :GRUP_NOM;
    SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :SUBG_COD AND GRUP_COD = :GRUP_COD INTO :SUBG_NOM;
    SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :MARC_COD INTO :MARC_NOM;
    SELECT FIRST 1 coba_cod FROM BARRAS_ARTICULO WHERE arti_cod = :arti_cod AND COBA_UNIDAD = :arti_unidad INTO :coba_cod;
    select FIRST 1 unar_unidad, unar_faccan FROM unidad_articulo WHERE ARTI_COD = :arti_cod INTO unar_unidad, unar_faccan;
    if (:AGRUPA = 'G') then
      begin
      if (((:GRPFIN <> 'ZZ') and (:grup_cod is not null)) or (:GRPFIN = 'ZZ'))  then
           suspend;
      end
    else
      if (:AGRUPA = 'B') then
         begin
         if (((:SUBFIN <> 'ZZZ') and (:subg_cod is not null)) or (:SUBFIN = 'ZZZ'))  then
           suspend;
         end
      else
        if (:AGRUPA = 'M') then
          begin
          if (((:MARFIN <> 'ZZZ') and (:marc_cod is not null)) or (:MARFIN = 'ZZZ'))  then
            suspend;
          end
        else
          suspend;
    END
end^

SET TERM ; ^


/* 201417 */
/* MODIFICAR COSTO DE ARTICULO */
INSERT INTO TIPO_DOCUMENTO (TIDO_COD, TIDO_NOMCORTO, TIDO_NOMLARGO, TIDO_MODULO, TIDO_INVE, TIDO_CART, TIDO_CXP, TIDO_CAJA, TIDO_BCOS, TIDO_NOM, TIDO_IMP) VALUES (10, 'MODCOSTO', 'MODIFICAR COSTO', 'INVENTARIO', 'S', 'N', 'N', 'N', 'N', 'N', 'N');
INSERT INTO PREFIJOS (TIDO_COD, PREF_PRE, PREF_ACTUAL, PREF_AUTO, PREF_IVAINC, PREF_PROY, PREF_CENTRO, PREF_ACTIVO, PREF_USUARIO, TICO_COD, SUCU_ID) VALUES (10, '0000', '000001', 'S', 'N', NULL, NULL, 'S', NULL, NULL, NULL);
COMMIT WORK;

CREATE TABLE CAMBIO_COSTO (
    CACO_ID T_ID NOT NULL,
    PREF_PRE PREFIJO,
    CACO_NUMERO T_NUMDOC,
    CACO_FECHA FECHA,
    CACO_CONCEPTO T_CONCEPTO,
    ARTI_COD T_COD_ARTICULO,
    CACO_CTACONTA T_CTA_CONTABLE,
    NUMOK T_BOOLEANO,
    CACO_ANULADO T_BOOLEANO,
    CACO_TRANSMIT T_BOOLEANO);

ALTER TABLE CAMBIO_COSTO
ADD CONSTRAINT PK_CAMBIO_COSTO
PRIMARY KEY (CACO_ID);

ALTER TABLE CAMBIO_COSTO
ADD CACO_NVOCOSTO T_MONTO;

ALTER TABLE CAMBIO_COSTO
ADD CACO_ANTCOSTO T_MONTO;

ALTER TABLE CAMBIO_COSTO
ADD CACO_IMPTOS T_BOOLEANO;

ALTER TABLE CAMBIO_COSTO
ADD CACO_USUARIO T_USUARIO;

ALTER TABLE CAMBIO_COSTO
ADD CACO_OBS BLOB SUB_TYPE 1 SEGMENT SIZE 80;


SET TERM ^ ;

create or alter procedure IMPR_CAMBCOSTO (
    ID integer)
returns (
    PREF varchar(4),
    NUMERO varchar(8),
    FECHA date,
    CONCEPTO varchar(60),
    OBS blob sub_type 1 segment size 80,
    ARTICULO varchar(15),
    ARTIDES varchar(60),
    UNIDAD VARCHAR(8),
    COSANT numeric(18,4),
    COSNUE numeric(18,4),
    CANT NUMERIC(18,4),
    TOTAL numeric(18,2))
AS
BEGIN
  /*  */
  SELECT PREF_PRE, CACO_NUMERO, CACO_FECHA, CACO_CONCEPTO, CACO_OBS, C.ARTI_COD, ARTI_DES, ARTI_UNIDAD, CACO_NVOCOSTO, CACO_ANTCOSTO
    FROM cambio_costo C, ARTICULO A WHERE A.arti_cod = C.arti_cod AND C.CACO_ID = :ID into
    :PREF, :NUMERO, :FECHA, :CONCEPTO, :OBS, :articulo, :artides, :unidad, :cosnue, :cosant;
  EXECUTE PROCEDURE saldo_total_inventario (:ARTICULO, :FECHA) returning_values (CANT);
  TOTAL = CANT * (COSNUE - COSANT);
  SUSPEND;
END^

SET TERM ; ^

GRANT EXECUTE ON PROCEDURE impr_cambcosto TO PUBLIC;

SET TERM ^ ;

create or alter procedure CONTABIL_CAMBCOSTO (
    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 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 CANT NUMERIC(18,2);
declare variable NVOCOSTO NUMERIC(18,2);
declare variable ANTCOSTO 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, 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 CAMBIO DE COSTO */
    SELECT PREF_PRE, CACO_NUMERO, CACO_FECHA, CACO_CONCEPTO, CACO_ANULADO, ARTI_COD, CACO_NVOCOSTO, CACO_ANTCOSTO
        FROM cambio_costo
        WHERE CACO_ID = :IDDOC
        INTO :PREFIJO, :NUMERO, :FECAUX, :CONCEPTO, :ANULADO, :ARTICULO, :NVOCOSTO, :ANTCOSTO;
    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 = 10 AND CNTB_IDREF = :IDDOC;

    if (ANULADO = 'N') then
        BEGIN
        SELECT PREF_CENTRO, PREF_PROY FROM PREFIJOS P, ENTRADAS E
            WHERE P.PREF_PRE = E.PREF_PRE AND P.TIDO_COD = 10 AND E.ENTR_ID = :IDDOC 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, '', 10, :IDDOC, :PREFIJO, :NUMERO, 'N');
        NUMITEMS = 0;
        SUMA = 0;
        ERROR = 0;
        /* PRIMERO LA BASE */
        EXECUTE PROCEDURE saldo_total_inventario(:ARTICULO, :FECHA) returning_values (:CANT);
        MONTO = CANT * (nvocosto - antcosto);
        if ((BASE = 'A') or (BASE = 'K'))  then
            BEGIN
            /* SUME LAS BASES DE LOS ARTICULOS DEL DOCUMENTO */
            if (BASE = 'A') then
                SELECT COAR_CTAINV FROM CONTABIL_ARTICULO WHERE ARTI_COD = :articulo INTO :CTABASE;
            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(10, :IDDOC, :CTABASE, 2);
                    CUENTA = CTABASE;
                    ERROR = ERROR + 1;
                    end
                /* DEPENDE DEL TIPO DE CUENTA */
                if (TIPOCUEN = 'C') then
                    BEGIN
                    EXECUTE PROCEDURE ERRORINT(10, :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 */
        /* 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 = 'TOTAL') then
                MONTO = MONTO * PORCADIC / 100;
                END
            if (MONTO <> 0) then
                BEGIN
                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(10, :IDDOC, :CUENTAADIC, 2);
                    CUENTA = CUENTAADIC;
                    ERROR = ERROR + 1;
                    end
                /* DEPENDE DEL TIPO DE CUENTA */
                if (TIPOCUEN = 'I') then
                    BEGIN
                    EXECUTE PROCEDURE ERRORINT(10, :IDDOC, :CUENTA, 3);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    EXECUTE PROCEDURE ERRORINT(10, :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
            /* 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(24, :IDDOC, :CTACIERRE, 2);
                CUENTA = CTACIERRE;
                ERROR = ERROR + 1;
                end
            /* DEPENDE DEL TIPO DE CUENTA */
            if (TIPOCUEN = 'I') then
                BEGIN
                EXECUTE PROCEDURE ERRORINT(10, :IDDOC, :CUENTA, 3);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                EXECUTE PROCEDURE ERRORINT(10, :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(10, :IDDOC, :PREFIJO, 1);
    ERROR = ERROR + 1;
    VER = 'S';
    END
SUSPEND;
END^

SET TERM ; ^

GRANT EXECUTE ON PROCEDURE contabil_cambcosto TO PUBLIC;

/* 201418 */
/* DOBLE CONTABILIZACION COLGAP/NIIF */

CREATE TABLE CONTABIL_ARTICULO_NIIF (
    ARTI_COD        T_COD_ARTICULO NOT NULL /* T_COD_ARTICULO = VARCHAR(15) */,
    COAR_CTAINV     T_CTA_CONTABLE /* T_CTA_CONTABLE = VARCHAR(20) */,
    COAR_CTAIVAC    T_CTA_CONTABLE /* T_CTA_CONTABLE = VARCHAR(20) */,
    COAR_CTAIVAV    T_CTA_CONTABLE /* T_CTA_CONTABLE = VARCHAR(20) */,
    COAR_CTACONS    T_CTA_CONTABLE /* T_CTA_CONTABLE = VARCHAR(20) */,
    COAR_CTAVNT     T_CTA_CONTABLE /* T_CTA_CONTABLE = VARCHAR(20) */,
    COAR_CTACOS     T_CTA_CONTABLE /* T_CTA_CONTABLE = VARCHAR(20) */,
    COAR_CTACOMP    T_CTA_CONTABLE /* T_CTA_CONTABLE = VARCHAR(20) */,
    COAR_CTADEV     T_CTA_CONTABLE /* T_CTA_CONTABLE = VARCHAR(20) */,
    COAR_CTARTFTE   T_CTA_CONTABLE /* T_CTA_CONTABLE = VARCHAR(20) */,
    COAR_CTARTICA   T_CTA_CONTABLE /* T_CTA_CONTABLE = VARCHAR(20) */,
    COAR_CTARTFTEV  T_CTA_CONTABLE /* T_CTA_CONTABLE = VARCHAR(20) */,
    COAR_CTARTICAV  T_CTA_CONTABLE /* T_CTA_CONTABLE = VARCHAR(20) */,
    COAR_RTFTE      T_PORCENTAJE /* T_PORCENTAJE = NUMERIC(9,4) DEFAULT 0 */,
    COAR_RTBASE     T_MONTO /* T_MONTO = NUMERIC(18,2) DEFAULT 0 */,
    COAR_CTAIVADEC  T_CTA_CONTABLE /* T_CTA_CONTABLE = VARCHAR(20) */,
    COAR_CTARTCREE  T_CTA_CONTABLE /* T_CTA_CONTABLE = VARCHAR(20) */,
    COAR_RTCREE     T_PORCENTAJE /* T_PORCENTAJE = NUMERIC(9,4) DEFAULT 0 */,
    COAR_RTICA      T_PORCENTAJE /* T_PORCENTAJE = NUMERIC(9,4) DEFAULT 0 */,
    COAR_CTAIVADV   T_CTA_CONTABLE /* T_CTA_CONTABLE = VARCHAR(20) */,
    COAR_CTAIVADC   T_CTA_CONTABLE /* T_CTA_CONTABLE = VARCHAR(20) */
);

ALTER TABLE CONTABIL_ARTICULO_NIIF ADD CONSTRAINT PK_CONTABIL_ARTICULO_N PRIMARY KEY (ARTI_COD);

ALTER TABLE CONTABIL_ARTICULO_NIIF ADD CONSTRAINT FK_CONTAART_ARTICULO_N FOREIGN KEY (ARTI_COD) REFERENCES ARTICULO (ARTI_COD) ON DELETE CASCADE ON UPDATE CASCADE;

SET TERM ^ ;

CREATE OR ALTER TRIGGER CONTABIL_ARTICULO_N_AD FOR CONTABIL_ARTICULO_NIIF
ACTIVE AFTER DELETE POSITION 0
as
begin
  INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
    VALUES (user, 1127, 1, 'D', OLD.arti_cod);
end
^

CREATE OR ALTER TRIGGER CONTABIL_ARTICULO_N_AI FOR CONTABIL_ARTICULO_NIIF
ACTIVE AFTER INSERT POSITION 0
as
begin
  INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
    VALUES (user, 1127, 1, 'I', NEW.arti_cod);
end
^

CREATE OR ALTER TRIGGER CONTABIL_ARTICULO_N_AU FOR CONTABIL_ARTICULO_NIIF
ACTIVE AFTER UPDATE POSITION 0
as
begin
  INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
    VALUES (user, 1127, 1, 'U', OLD.arti_cod);
end
^

CREATE OR ALTER TRIGGER TI_CONTABIL_ARTICULO_N FOR CONTABIL_ARTICULO_NIIF
ACTIVE BEFORE INSERT POSITION 0
AS
DECLARE VARIABLE NUMROWS INTEGER;
BEGIN
    /*  PARENT 'ARTICULO' MUST EXIST WHEN INSERTING A CHILD IN 'CONTABIL_ARTICULO'  */
    IF (NEW.ARTI_COD IS NOT NULL) THEN
    BEGIN
       SELECT COUNT(*)
       FROM   ARTICULO
       WHERE  ARTICULO.ARTI_COD = NEW.ARTI_COD
       INTO   :NUMROWS;
       IF (NUMROWS = 0) THEN
       BEGIN
          EXCEPTION ARTICULO_NO_EXISTE;
       END
    END
END
^


SET TERM ; ^

GRANT ALL ON CONTABIL_ARTICULO_NIIF TO PUBLIC;

/* Privileges of triggers */
GRANT INSERT ON AUDITORIA TO TRIGGER CONTABIL_ARTICULO_N_AD;
GRANT UPDATE, REFERENCES ON CONTABIL_ARTICULO_NIIF TO TRIGGER CONTABIL_ARTICULO_N_AD;
GRANT INSERT ON AUDITORIA TO TRIGGER CONTABIL_ARTICULO_N_AI;
GRANT UPDATE, REFERENCES ON CONTABIL_ARTICULO_NIIF TO TRIGGER CONTABIL_ARTICULO_N_AI;
GRANT INSERT ON AUDITORIA TO TRIGGER CONTABIL_ARTICULO_N_AU;
GRANT UPDATE, REFERENCES ON CONTABIL_ARTICULO_NIIF TO TRIGGER CONTABIL_ARTICULO_N_AU;
GRANT SELECT, REFERENCES ON ARTICULO TO TRIGGER TI_CONTABIL_ARTICULO_N;
GRANT UPDATE, REFERENCES ON CONTABIL_ARTICULO_NIIF TO TRIGGER TI_CONTABIL_ARTICULO_N;


INSERT INTO CONTABIL_ARTICULO_NIIF (ARTI_COD, COAR_CTAINV, COAR_CTAIVAC, COAR_CTAIVAV, COAR_CTACONS, COAR_CTAVNT, COAR_CTACOS, COAR_CTACOMP, COAR_CTADEV,
    COAR_CTARTFTE, COAR_CTARTICA, COAR_CTARTFTEV, COAR_CTARTICAV, COAR_RTFTE, COAR_RTBASE, COAR_CTAIVADEC, COAR_CTARTCREE, COAR_RTCREE, COAR_RTICA)
    SELECT ARTI_COD, COAR_CTAINV, COAR_CTAIVAC, COAR_CTAIVAV, COAR_CTACONS, COAR_CTAVNT, COAR_CTACOS, COAR_CTACOMP, COAR_CTADEV,
    COAR_CTARTFTE, COAR_CTARTICA, COAR_CTARTFTEV, COAR_CTARTICAV, COAR_RTFTE, COAR_RTBASE, COAR_CTAIVADEC, COAR_CTARTCREE, COAR_RTCREE, COAR_RTICA
    FROM CONTABIL_ARTICULO;
COMMIT WORK;




CREATE TABLE INTERFAZ_INVENTARIO_NIIF (
    ININ_ID          T_ID NOT NULL /* T_ID = INTEGER */,
    ININ_CTACIERRE   T_CTA_CONTABLE /* T_CTA_CONTABLE = VARCHAR(20) */,
    ININ_BASE        CHAR(1),
    ININ_CONSUMO     CHAR(1),
    ININ_TOTAL       CHAR(1),
    ININ_IVAV        CHAR(1),
    ININ_CTABASE     T_CTA_CONTABLE /* T_CTA_CONTABLE = VARCHAR(20) */,
    ININ_CTAIVA      T_CTA_CONTABLE /* T_CTA_CONTABLE = VARCHAR(20) */,
    ININ_CTACONSUMO  T_CTA_CONTABLE /* T_CTA_CONTABLE = VARCHAR(20) */
);

ALTER TABLE INTERFAZ_INVENTARIO_NIIF ADD CONSTRAINT PK_INTERINVEN_N PRIMARY KEY (ININ_ID);


SET TERM ^ ;

CREATE OR ALTER TRIGGER INTERFAZ_INVENTARIO_N_AD FOR INTERFAZ_INVENTARIO_NIIF
ACTIVE AFTER DELETE POSITION 0
as
declare variable PREF CHAR(4);
begin
SELECT PREF_PRE FROM INTERFAZ_INVENTARIO WHERE ININ_ID = OLD.ININ_ID INTO :PREF;
  INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
    VALUES (USER, 1116, OLD.inin_id, 'D', :pref);
end
^

CREATE OR ALTER TRIGGER INTERFAZ_INVENTARIO_N_AI FOR INTERFAZ_INVENTARIO_NIIF
ACTIVE AFTER INSERT POSITION 0
as
declare variable PREF CHAR(4);
begin
SELECT PREF_PRE FROM INTERFAZ_INVENTARIO WHERE ININ_ID = NEW.ININ_ID INTO :PREF;
IF (NEW.ININ_ID <> 0) THEN
  INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
    VALUES (USER, 1116, NEW.inin_id, 'I', :pref);
end
^

CREATE OR ALTER TRIGGER INTERFAZ_INVENTARIO_N_AU FOR INTERFAZ_INVENTARIO_NIIF
ACTIVE AFTER UPDATE POSITION 0
as
declare variable PREF CHAR(4);
begin
SELECT PREF_PRE FROM INTERFAZ_INVENTARIO WHERE ININ_ID = NEW.ININ_ID INTO :PREF;
  INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
    VALUES (USER, 1116, NEW.inin_id, 'U', :pref);
end
^

SET TERM ; ^

/* Privileges of users */
GRANT ALL ON INTERFAZ_INVENTARIO_NIIF TO PUBLIC;

/* Privileges of triggers */
GRANT INSERT ON AUDITORIA TO TRIGGER INTERFAZ_INVENTARIO_N_AD;
GRANT UPDATE, REFERENCES ON INTERFAZ_INVENTARIO_NIIF TO TRIGGER INTERFAZ_INVENTARIO_N_AD;
GRANT INSERT ON AUDITORIA TO TRIGGER INTERFAZ_INVENTARIO_N_AI;
GRANT UPDATE, REFERENCES ON INTERFAZ_INVENTARIO_NIIF TO TRIGGER INTERFAZ_INVENTARIO_N_AI;
GRANT INSERT ON AUDITORIA TO TRIGGER INTERFAZ_INVENTARIO_N_AU;
GRANT UPDATE, REFERENCES ON INTERFAZ_INVENTARIO_NIIF TO TRIGGER INTERFAZ_INVENTARIO_N_AU;

SET TERM ^ ;

create or alter procedure CUENTA_INTERFAZ_NIIF (
    TIPO integer,
    ID integer,
    CUENTA varchar(20),
    INV char(1))
returns (
    CTAOK varchar(20),
    TIPOCUEN char(1),
    ERROR integer)
AS
begin
ERROR = 0;
CTAOK = NULL;
SELECT CUEN_COD, CUEN_TIPO FROM cuentas_niif
    WHERE CUEN_COD = :CUENTA INTO :CTAOK, :TIPOCUEN;
if (CTAOK IS NULL) then
    begin
    EXECUTE PROCEDURE ERRORINT(:TIPO, :ID, :CUENTA, 2);
    CTAOK = CUENTA;
    TIPOCUEN = 'N';
    ERROR = 1;
    end
if ((INV <> 'S') and (TIPOCUEN = 'I')) then
    begin
    EXECUTE PROCEDURE ERRORINT(:TIPO, :ID, :CUENTA, 3);
    TIPOCUEN = 'N';
    ERROR = 1;
    end
suspend;
end^

SET TERM ; ^

GRANT EXECUTE ON PROCEDURE cuenta_interfaz_niif TO PUBLIC;

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 = 1000;
        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 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 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 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 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 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 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 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 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 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 ; ^

GRANT EXECUTE ON PROCEDURE contabil_entrada_NIIF TO PUBLIC;

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 < 1000;

  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 >= 1000;

  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;
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 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
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;
   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 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
    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
    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_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', 'N', :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;
            RTICAM = BASE * RTICA / 1000;
            RTIVAM = IVAM * RTIVA / 100;
            RTCREEM = BASE * RTCREE / 100;
            END
        ELSE
            BEGIN
            RTFTEM = 0;
            RTICAM = 0;
            RTIVAM = 0;
            RTCREEM = 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);
        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  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 ; ^

CREATE TABLE INTERFAZ_VENTAS_NIIF (
    INVE_ID          T_ID NOT NULL /* T_ID = INTEGER */,
    INVE_VENTAS      CHAR(1),
    INVE_IVA         CHAR(1),
    INVE_CONSUMO     CHAR(1),
    INVE_CARTERA     CHAR(1),
    INVE_COSTO       CHAR(1),
    INVE_INVEN       CHAR(1),
    INVE_CTAVENTAS   T_CTA_CONTABLE /* T_CTA_CONTABLE = VARCHAR(20) */,
    INVE_CTAIVA      T_CTA_CONTABLE /* T_CTA_CONTABLE = VARCHAR(20) */,
    INVE_CTACARTERA  T_CTA_CONTABLE /* T_CTA_CONTABLE = VARCHAR(20) */,
    INVE_CTACONSUMO  T_CTA_CONTABLE /* T_CTA_CONTABLE = VARCHAR(20) */,
    INVE_CTAINVEN    T_CTA_CONTABLE /* T_CTA_CONTABLE = VARCHAR(20) */,
    INVE_CTACOSTOS   T_CTA_CONTABLE /* T_CTA_CONTABLE = VARCHAR(20) */,
    INVE_CTAEXTRA    T_CTA_CONTABLE /* T_CTA_CONTABLE = VARCHAR(20) */,
    INVE_RTFTE       CHAR(1),
    INVE_RTIVA       CHAR(1),
    INVE_RTICA       CHAR(1),
    INVE_CTARTFTE    T_CTA_CONTABLE /* T_CTA_CONTABLE = VARCHAR(20) */,
    INVE_CTARTIVA    T_CTA_CONTABLE /* T_CTA_CONTABLE = VARCHAR(20) */,
    INVE_CTARTICA    T_CTA_CONTABLE /* T_CTA_CONTABLE = VARCHAR(20) */,
    INVE_CTADTO      T_CTA_CONTABLE /* T_CTA_CONTABLE = VARCHAR(20) */,
    INVE_CTAADIC     T_CTA_CONTABLE /* T_CTA_CONTABLE = VARCHAR(20) */,
    INVE_CTADTOIVA   T_CTA_CONTABLE /* T_CTA_CONTABLE = VARCHAR(20) */,
    INVE_RTCREE      CHAR(1),
    INVE_CTARTCREE   T_CTA_CONTABLE /* T_CTA_CONTABLE = VARCHAR(20) */
);

ALTER TABLE INTERFAZ_VENTAS_NIIF ADD CONSTRAINT PK_INTERFAZ_VENTAS_N PRIMARY KEY (INVE_ID);

/* Privileges of users */
GRANT ALL ON INTERFAZ_VENTAS_NIIF TO PUBLIC;


CREATE TABLE COSTO_VENTAS_NIIF (
    ARTI_COD   T_COD_ARTICULO /* T_COD_ARTICULO = VARCHAR(15) */,
    CANT       T_CANTIDAD /* T_CANTIDAD = NUMERIC(18,4) */,
    COSTO      T_MONTO /* T_MONTO = NUMERIC(18,2) DEFAULT 0 */,
    CTACOS     T_CTA_CONTABLE /* T_CTA_CONTABLE = VARCHAR(20) */,
    CTAINV     T_CTA_CONTABLE /* T_CTA_CONTABLE = VARCHAR(20) */,
    COVE_ID    T_ID NOT NULL /* T_ID = INTEGER */,
    TIDO_COD   INTEGER NOT NULL,
    COVE_ITEM  T_ID NOT NULL /* T_ID = INTEGER */
);

ALTER TABLE COSTO_VENTAS_NIIF ADD CONSTRAINT PK_COSTO_VENTAS_N PRIMARY KEY (TIDO_COD, COVE_ID, COVE_ITEM);
CREATE INDEX COSTO_VENTAS_N_IDX1 ON COSTO_VENTAS_NIIF (CTACOS);
CREATE INDEX COSTO_VENTAS_N_IDX2 ON COSTO_VENTAS_NIIF (CTAINV);

GRANT ALL ON COSTO_VENTAS_NIIF TO PUBLIC;

SET TERM ^ ;

create or alter procedure COSTO_EN_VENTAS_NIIF (
    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_NIIF WHERE TIDO_COD = :TIPO AND COVE_ID = :ID;
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_niif 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_niif (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_niif (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_niif (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 ; ^

GRANT EXECUTE ON PROCEDURE COSTO_EN_VENTAS_NIIF TO PUBLIC;

SET TERM ^ ;

create or alter procedure CUENTA_INTERFAZ_NIIF (
    TIPO integer,
    ID integer,
    CUENTA varchar(20),
    INV char(1))
returns (
    CTAOK varchar(20),
    TIPOCUEN char(1),
    ERROR integer)
AS
begin
ERROR = 0;
CTAOK = NULL;
SELECT CUEN_COD, CUEN_TIPO FROM cuentas_niif
    WHERE CUEN_COD = :CUENTA INTO :CTAOK, :TIPOCUEN;
if (CTAOK IS NULL) then
    begin
    EXECUTE PROCEDURE ERRORINT(:TIPO, :ID, :CUENTA, 2);
    CTAOK = CUENTA;
    TIPOCUEN = 'N';
    ERROR = 1;
    end
if ((INV <> 'S') and (TIPOCUEN = 'I')) then
    begin
    EXECUTE PROCEDURE ERRORINT(:TIPO, :ID, :CUENTA, 3);
    TIPOCUEN = 'N';
    ERROR = 1;
    end
suspend;
end^

SET TERM ; ^

/* Following GRANT statetements are generated automatically */

GRANT SELECT ON CUENTAS_NIIF TO PROCEDURE CUENTA_INTERFAZ_NIIF;
GRANT EXECUTE ON PROCEDURE ERRORINT TO PROCEDURE CUENTA_INTERFAZ_NIIF;

/* Existing privileges on this procedure */

GRANT EXECUTE ON PROCEDURE CUENTA_INTERFAZ_NIIF TO PUBLIC;

SET TERM ^ ;

create or alter procedure CONTABIL_FACTURA_NIIF (
    IDDOC integer,
    IDINTER integer,
    IDC integer)
returns (
    ERROR integer,
    VER char(1))
AS
declare variable pref varchar(4);
declare variable num varchar(8);
declare variable numero varchar(12);
declare variable fecaux date;
declare variable 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, 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, :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
  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);
    if (STRLEN(NOMBRE)> 41 ) then
      CONC = 'FV No.' || NUMERO || '-' || SUBSTR(NOMBRE,1,41);
    ELSE
      CONC = 'FV No.' || NUMERO || '-' || NOMBRE;
    NROI = 1000;
    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 ; ^

GRANT EXECUTE ON PROCEDURE CONTABIL_FACTURA_NIIF TO PUBLIC;

/* 201419 */
/* AUDITORIA CON CODIGO */
SET TERM ^ ;

CREATE OR ALTER procedure REP_AUDITORIA (
    CODUSUARIO varchar(10),
    FECINI date,
    FECFIN date,
    TIPODOC integer,
    CODIGO VARCHAR(20))
returns (
    USUARIO varchar(10),
    FECHA date,
    HORA time,
    DOCUMENTO varchar(60),
    OPERACION varchar(30),
    NUMERODOC varchar(20),
    EQUIPO varchar(60),
    RAZONANULA varchar(255))
AS
declare variable CODOPER CHAR(1);
begin
FOR SELECT AUDI_USUARIO, AUDI_FECHA, AUDI_HORA, T.TIDO_NOMLARGO, AUDI_OPER, AUDI_COD, AUDI_RAZON, AUDI_IPCLIENTE
    FROM AUDITORIA A, TIPO_DOCUMENTO T WHERE A.TIDO_COD = T.TIDO_COD AND 
    AUDI_FECHA >= :FECINI AND AUDI_FECHA <= :FECFIN AND ((:TIPODOC = 0) or (A.TIDO_COD = :TIPODOC)) AND
    ((:codusuario = '') OR (AUDI_USUARIO = :codusuario)) AND ((:codigo = '') OR (AUDI_COD = :codigo))
    INTO :USUARIO, :FECHA, :HORA, :documento, :CODOPER, :NUMERODOC, :RAZONANULA, :equipo
    DO
    BEGIN
    /* TRAIA EL NOMBRE DE LA TERMINAL */
    if (exists (SELECT TERM_NOMBRE FROM terminales_nombres WHERE TERM_IP = :EQUIPO)) then
        SELECT TERM_NOMBRE FROM terminales_nombres WHERE TERM_IP = :EQUIPO INTO :equipo;
    if (CODOPER = 'I') then
        OPERACION = 'REGISTRO NUEVO';
    if (CODOPER = 'U') then
        OPERACION = 'ACTUALIZACION';
    if (CODOPER = 'A') then
        OPERACION = 'ANULACION';
    if (CODOPER = 'D') then
        OPERACION = 'ELIMINACION';
    suspend;
    END
end^

SET TERM ; ^


/* 201420 */
/* FECHA DE ENTREGA EN CARTERA */

UPDATE CONFIGURACION
SET CONF_PROPIEDAD = 'ANALISIS DE CARTERA CON FECHA FACTURA, VENCIMIENTO O ENTREGA',
    CONF_POSIBLES = 'FECHA,VENCIMIENTO,ENTREGA',
    CONF_AYUDA = 'FECHA:Los dias de cartera se cuentan desde la expedición del documento, VENCIMIENTO: Se cuentan a partir de la fecha de vencimiento, ENTREGA: Los dias se cuentan desde la confirmacion de entrega'
WHERE (CONF_MODULO = 'CARTERA') AND (CONF_CATEGORIA = 'SALDOS') AND (CONF_PROPIEDAD = 'ANALISIS DE CARTERA CON FECHA FACTURA O VENCIMIENTO');


SET TERM ^ ;

create trigger ENTREGA_DOCUMENTOS_AU for ENTREGA_DOCUMENTOS
active AFTER UPDATE position 0
as
begin
  /* SI ES FACTURA ACTUALICE LA FECHA DE ENTREGA */
if (NEW.tido_cod = 31) then
    if (NEW.endo_fechal IS NOT NULL) then
        UPDATE FACTURAS SET FACT_ENTREGA = NEW.endo_fechal WHERE FACT_ID = NEW.endo_iddoc;
end^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER procedure REP_CARTERA_CLIENTES (
    DESDE varchar(20),
    HASTA varchar(20),
    GRPINI varchar(5),
    GRPFIN varchar(5),
    FECHA date,
    ORDEN char(1),
    AGRUPA char(1),
    SUBEMPRESA integer,
    GRUPCART integer,
    MONEDA integer)
returns (
    NIT varchar(20),
    NOMBRE varchar(60),
    DIR varchar(60),
    TELEFONO varchar(40),
    CIUDAD varchar(40),
    CONTACTO varchar(60),
    EMAIL varchar(100),
    MAILCART varchar(100),
    FAX varchar(25),
    CEL varchar(25),
    CODCLI varchar(20),
    CODZONA varchar(2),
    NOMZONA varchar(60),
    CODCOBR integer,
    NOMCOBR varchar(60),
    SUCURSAL varchar(10),
    NOMSUC varchar(60),
    DV char(1),
    DIASCR integer,
    CODCIUD char(5),
    NOMCIUD varchar(60),
    RESALTAR char(1),
    INSTCART varchar(255),
    TIPO integer,
    ID integer,
    PREFIJO varchar(4),
    NUMERO varchar(8),
    CONCEPTO varchar(60),
    MONTO numeric(18,2),
    SALDO numeric(18,2),
    PROVISIONAL numeric(18,2),
    RTFTE numeric(18,2),
    RTIVA numeric(18,2),
    RTICA numeric(18,2),
    RCREE numeric(18,2),
    DTOF numeric(18,2),
    TIPONOM varchar(8),
    FECDOC date,
    VENCE date,
    DIAS integer,
    CUPO numeric(18,2),
    DISPONIBLE numeric(18,2),
    TOTCLI numeric(18,2),
    NOTA varchar(256),
    OBS blob sub_type 0 segment size 80,
    CALIFICA integer,
    GRUPCOD integer,
    GRUPNOM varchar(30))
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 FOV CHAR(11);
DECLARE VARIABLE DTOAPL NUMERIC(18,2);
DECLARE VARIABLE FECDTO DATE;
DECLARE VARIABLE FECNOTA VARCHAR(10);
DECLARE VARIABLE AUXNOTA VARCHAR(256);
DECLARE VARIABLE IDNOTA INTEGER;
declare variable descnt_prov char(2);
declare variable AUTORET VARCHAR(10);
declare variable FAUTORET DATE;
declare variable AUTORCREE VARCHAR(10);
declare variable FAUTORCREE DATE;
declare variable INCLANTI CHAR(2);
DECLARE VARIABLE TRM NUMERIC(18,2);
declare variable DB CHAR(1);
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 RECIBOS PROVISIONALES EN INFORMES DE CARTERA') RETURNING_VALUES (:descnt_prov);
EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'INCLUIR ANTICIPOS DE CLIENTES EN REPORTES Y CONSULTAS DE CARTERA') returning_values (INCLANTI);
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', 'ANALISIS DE CARTERA CON FECHA FACTURA O VENCIMIENTO') RETURNING_VALUES (FOV);
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';
/* Ubique el NIT */
FOR select C.TERC_NIT, TERC_NOM, TERC_DV, CLSU_DIR, CLSU_TEL, CLSU_CIUDAD, S.COBR_COD, S.ZONA_COD, T.CIUD_COD, CLIE_CUPO,
    CLCU_COD, CLSU_NOMBRE, t.terc_obs, C.GRCA_COD, TERC_CONTACTO, TERC_EMAIL, TERC_FAX, TERC_CEL, CLIE_COD, CLIE_RESALTAR,
    CLIE_INSTCARTERA, CLIE_MAILCART, CLIE_CALIFICA, CLIE_DIAS
    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 C.TERC_NIT >= :NITINI AND C.TERC_NIT <= :NITFIN AND
        TERC_NOM >= :NOMINI AND TERC_NOM <= :NOMFIN AND ((:GRUPCART = 0) or (C.GRCA_COD = :GRUPCART))
    INTO :NIT, :NOMBRE, :DV, :DIR, :TELEFONO, :CIUDAD, :CODCOBR, :CODZONA, :CODCIUD, :CUPO,
    :SUCURSAL, :NOMSUC, :obs, :GRUPCOD, :CONTACTO, :EMAIL, :FAX, :CEL, :CODCLI, :resaltar,
    INSTCART, :mailcart, :CALIFICA, :DIASCR
    DO  
    BEGIN
    TOTCLI = 0;
    if (CODCOBR IS NOT NULL) then
        SELECT COBR_NOM FROM COBRADORES  WHERE COBR_COD = :CODCOBR INTO :NOMCOBR;
    if (CODZONA IS NOT NULL) then
        SELECT ZONA_NOM FROM ZONAS WHERE ZONA_COD = :CODZONA INTO :NOMZONA;
    if (CODCIUD IS NOT NULL) then
        SELECT CIUD_NOM FROM CIUDADES  WHERE CIUD_COD = :CODCIUD INTO :NOMCIUD;
    SELECT GRCA_NOMBRE FROM GRUPO_CARTERA WHERE GRCA_COD = :GRUPCOD INTO :GRUPNOM;
    DISPONIBLE = CUPO;
    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
        /* BUSQUE EN SALDOS_DOC_CARTERA LOS QUE TENGAN SALDO > 0 */
        FOR SELECT MVCL_TIPOREF, MVCL_IDREF, MVCL_PREFREF, MVCL_NUMREF, MVCL_FECHA, MVCL_VENCE, MVCL_CONC, MVCL_MONTO, MVCL_DEBITO
            FROM MOVIMIENTO_CLIENTES WHERE TERC_NIT = :NIT AND MVCL_SUCURSAL = :SUCURSAL AND MVCL_FECHA <= :FECHA AND
            MVCL_ABONO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) AND ((:MONEDA = 0) or (MVCL_TRM <> 1))
            INTO :TIPO, :ID, :PREFIJO, :NUMERO, :FECDOC, :VENCE, :CONCEPTO, :MONTO, :DB
            DO
            BEGIN
            if (DB = 'N') then
                MONTO = MONTO * -1;
            if ((inclanti = 'SI') or (TIPO <> 45)) then
                BEGIN
                EXECUTE PROCEDURE saldo_doc_cartera(TIPO, ID, FECHA, MONEDA) returning_values (SALDO);
                if (SALDO <> 0) then
                    BEGIN
                    PROVISIONAL = 0;
                    if (FOV = 'FECHA') then
                        DIAS = FECHA - FECDOC;
                    ELSE
                        BEGIN
                        DIAS = FECHA - VENCE;
                        if ((TIPO = 31) AND (FOV = 'ENTREGA')) THEN
                            BEGIN
                            SELECT FACT_ENTREGA FROM FACTURAS WHERE FACT_ID = :ID INTO :VENCE;
                            DIAS = FECHA - VENCE;
                            END
                        END
                    DISPONIBLE = DISPONIBLE - SALDO;
                    SELECT TIDO_NOMCORTO FROM TIPO_DOCUMENTO WHERE TIDO_COD = :TIPO INTO :TIPONOM;
                    if (TIPO = 41) then
                        SELECT NDCL_DTOFMONTO, NDCL_FECHADTO, NDCL_TRM FROM NOTAS_DEBITO_CLIENTES
                            WHERE NDCL_ID = :ID INTO :DTOF, :FECDTO, :TRM;
                    if (TIPO = 42) then
                        SELECT 0, :FECDOC, 1 FROM NOTAS_CREDITO_CLIENTES
                            WHERE NCCL_ID = :ID INTO :DTOF, :FECDTO, :TRM;
                    if (TIPO = 45) then
                        SELECT ANCL_DTOFMONTO, ANCL_DTOFECHA, ANCL_TRM FROM ANTICIPOS_CLIENTE
                            WHERE ANCL_ID = :ID INTO :DTOF, :FECDTO, :TRM;
                    if (TIPO = 31) then
                        SELECT FACT_DTOFMONTO, FACT_DTOFFECHA, FACT_TRM FROM FACTURAS
                            WHERE FACT_ID = :ID INTO :DTOF, :FECDTO, :TRM;
                    if (TIPO = 33) then
                        SELECT 0, :FECDOC, 1 FROM devoluciones_ventas
                            WHERE DEVT_ID = :ID INTO :DTOF, :FECDTO, :TRM;
                    if ((MONEDA <> 0) AND (TRM <> 0)) then
                        DTOF = DTOF / TRM;
                    if (DTOF IS NULL) then
                        DTOF = 0;
                    if (DTOF <> 0) then
                        BEGIN
                        SELECT SUM(RCDE_DTOF), MAX(RECA_TRM) FROM RECIBOS_CAJA_DETALLE D, RECIBOS_CAJA R
                            WHERE R.reca_id = D.reca_id AND RCDE_IDDOC = :ID AND RCDE_TIPODOC = :TIPO
                            INTO :DTOAPL, :TRM;
                        if (DTOAPL IS NULL) then
                            DTOAPL = 0;
                        if ((MONEDA <> 0) AND (TRM <> 1)) then
                            DTOAPL = DTOAPL / TRM;
                        DTOF = DTOF - DTOAPL;
                        /* SI YA SE VENCIO DEJELO EN CERO */
                        if (FECDTO < FECHA) then
                            DTOF = 0;
                        END
                    if (MONEDA = 0) then
                        SELECT SUM(SDCA_RTFTE - SDCA_ABRTFTE), SUM(SDCA_RTIVA - SDCA_ABRTIVA), SUM(SDCA_RTICA - SDCA_ABRTICA), SUM(SDCA_RCREE - SDCA_ABRCREE)
                            FROM SALDOS_DOC_CARTERA WHERE SDCA_TIPOREF = :TIPO AND SDCA_IDREF = :ID
                            INTO :RTFTE, :RTIVA, :RTICA, :RCREE;
                    ELSE
                        SELECT SUM((SDCA_RTFTE - SDCA_ABRTFTE)/SDCA_TRM), SUM((SDCA_RTIVA - SDCA_ABRTIVA)/SDCA_TRM), SUM((SDCA_RTICA - SDCA_ABRTICA)/SDCA_TRM), SUM((SDCA_RCREE - SDCA_ABRCREE)/SDCA_TRM)
                            FROM SALDOS_DOC_CARTERA WHERE SDCA_TIPOREF = :TIPO AND SDCA_IDREF = :ID
                            INTO :RTFTE, :RTIVA, :RTICA, :RCREE;
                    if (RTFTE IS NULL) then
                        RTFTE = 0;
                    if ((TIPO = 42) or (TIPO = 45) or (TIPO = 33)) THEN
                        BEGIN
                        if (RTFTE > 0) then
                            RTFTE = 0;
                        END
                    ELSE
                        BEGIN
                        if (RTFTE < 0) then
                            RTFTE = 0;
                        END
                    if (FAUTORET <= FECDOC) then
                        RTFTE = 0;
                    if (RTIVA IS NULL) then
                        RTIVA = 0;
                    if ((TIPO = 42) or (TIPO = 45) or (TIPO = 33)) THEN
                        BEGIN
                        if (RTIVA > 0) then
                            RTIVA = 0;
                        END
                    ELSE
                        BEGIN
                        if (RTIVA < 0) then
                            RTIVA = 0;
                        END
                    if (RTICA IS NULL) then
                        RTICA = 0;
                    if ((TIPO = 42) or (TIPO = 45) or (TIPO = 33)) THEN
                        BEGIN
                        if (RTICA > 0) then
                            RTICA = 0;
                        END
                    ELSE
                        BEGIN
                        if (RTICA < 0) then
                            RTICA = 0;
                        END
                    if (RCREE IS NULL) then
                        RCREE = 0;
                    if ((TIPO = 42) or (TIPO = 45) or (TIPO = 33)) THEN
                        BEGIN
                        if (RCREE > 0) then
                            RCREE = 0;
                        END
                    ELSE
                        BEGIN
                        if (RCREE < 0) then
                            RCREE = 0;
                        END
                    if (fautorcree <= FECDOC) then
                        RCREE = 0;
                    /* SI TIENE NOTA AGREGUELA */
                    SELECT MAX(NOCL_ID) FROM NOTAS_CLIENTES WHERE TERC_NIT = :NIT AND CLSU_COD = :SUCURSAL AND NOCL_TIPODOC = :TIPO AND NOCL_IDDOC = :ID INTO :IDNOTA;
                    if (IDNOTA IS NOT NULL) then
                        BEGIN
                        SELECT cast(NOCL_FECHA as char(10)), NOCL_TEXTO FROM NOTAS_CLIENTES
                            WHERE NOCL_ID = :IDNOTA INTO :FECNOTA, :AUXNOTA;
                        if (STRLEN(AUXNOTA) < 244) then
                            NOTA = FECNOTA || ':' || AUXNOTA;
                        ELSE
                            NOTA = AUXNOTA;
                        END
                    else
                        NOTA = '';
                    TOTCLI = TOTCLI + SALDO;
                    SUSPEND;
                    END  /* SALDO <> 0 */
                END  /* NO ANTICIPO */
            END  /* FOR */
        /* AGREGUE LOS RECIBOS PROVISIONALES CON SIGNO NEGATIVO */
        FOR SELECT 65, MAX(P.RCPR_ID), MAX(PREF_PRE), MAX(RCPR_NUMERO), MAX(RCPR_FECHA), MAX(RCPR_CONC), SUM(RPDE_ABONO * -1), SUM(RPDE_RTFTE*-1), SUM(RPDE_RTIVA*-1), SUM(RPDE_RTICA*-1), SUM(RPDE_RCREE*-1), MAX(RCPR_TRM)
            FROM RECIBO_PROVISIONAL P, recibo_provisional_detalle D
            WHERE P.rcpr_id = D.rcpr_id AND P.TERC_NIT = :NIT AND RCPR_FECHA <= :FECHA AND RCPR_ANULADO = 'N' AND
            ((RCPR_FECCRUCE IS NULL) or (RCPR_FECCRUCE > :FECHA)) AND RPDE_SUCURSAL = :SUCURSAL AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            GROUP BY P.rcpr_id
            INTO :TIPO, :ID, :PREFIJO, :NUMERO, :FECDOC, :CONCEPTO, :PROVISIONAL, :rtfte,  :RTIVA, :RTICA, :RCREE, :TRM
            DO
            BEGIN
            if ((MONEDA <> 0) AND (TRM <> 0)) then
                PROVISIONAL = PROVISIONAL / TRM;
            if (:descnt_prov = 'NO') then
              SALDO = 0;
            else
              SALDO = :PROVISIONAL;
            SELECT TIDO_NOMCORTO FROM TIPO_DOCUMENTO WHERE TIDO_COD = :TIPO INTO :TIPONOM;
            /* CALCULE EL VENCIMIENTO DEL ULTIMO DOCUMENTO POSFECHADO */
            SELECT MAX(RPPA_FECHA) FROM recibo_provisional_pago WHERE RCPR_ID = :ID INTO :VENCE;
            DIAS = VENCE - FECHA;
            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 <= :FECHA AND
            MVCL_ABONO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            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;
                /* BUSQUE EN SALDOS_DOC_CARTERA LOS QUE TENGAN SALDO > 0 */
                FOR SELECT MVCL_TIPOREF, MVCL_IDREF, MVCL_PREFREF, MVCL_NUMREF, MVCL_FECHA, MVCL_VENCE, MVCL_CONC, MVCL_MONTO, MVCL_DEBITO
                    FROM MOVIMIENTO_CLIENTES WHERE TERC_NIT = :NIT AND MVCL_SUCURSAL = :SUCURSAL AND MVCL_FECHA <= :FECHA AND
                    MVCL_ABONO = 'N' AND COBR_COD = :codcobr AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) AND
                    ((:MONEDA = 0) or (MVCL_TRM <> 1))
                    INTO :TIPO, :ID, :PREFIJO, :NUMERO, :FECDOC, :VENCE, :CONCEPTO, :MONTO, :DB
                    DO
                    BEGIN
                    if (DB = 'N') then
                        MONTO = MONTO * -1;
                    if ((inclanti = 'SI') or (TIPO <> 45)) then
                        BEGIN
                        EXECUTE PROCEDURE saldo_doc_cartera(TIPO, ID, FECHA, MONEDA) returning_values (SALDO);
                        if (SALDO <> 0) then
                            BEGIN
                            PROVISIONAL = 0;
                            if (FOV = 'FECHA') then
                               DIAS = FECHA - FECDOC;
                            ELSE
                                BEGIN
                                DIAS = FECHA - VENCE;
                                if ((TIPO = 31) AND (FOV = 'ENTREGA')) THEN
                                    BEGIN
                                    SELECT FACT_ENTREGA FROM FACTURAS WHERE FACT_ID = :ID INTO :VENCE;
                                    DIAS = FECHA - VENCE;
                                    END
                                END
                            DISPONIBLE = DISPONIBLE - SALDO;
                            SELECT TIDO_NOMCORTO FROM TIPO_DOCUMENTO WHERE TIDO_COD = :TIPO INTO :TIPONOM;
                            if (TIPO = 41) then
                                SELECT NDCL_DTOFMONTO, NDCL_FECHADTO, NDCL_TRM FROM NOTAS_DEBITO_CLIENTES
                                    WHERE NDCL_ID = :ID INTO :DTOF, :FECDTO, :TRM;
                            if (TIPO = 42) then
                                SELECT 0, :FECDOC, 1 FROM NOTAS_CREDITO_CLIENTES
                                    WHERE NCCL_ID = :ID INTO :DTOF, :FECDTO, :TRM;
                            if (TIPO = 45) then
                                SELECT ANCL_DTOFMONTO, ANCL_DTOFECHA, ANCL_TRM FROM ANTICIPOS_CLIENTE
                                    WHERE ANCL_ID = :ID INTO :DTOF, :FECDTO, :TRM;
                            if (TIPO = 31) then
                                SELECT FACT_DTOFMONTO, FACT_DTOFFECHA, FACT_TRM FROM FACTURAS
                                    WHERE FACT_ID = :ID INTO :DTOF, :FECDTO, :TRM;
                            if (TIPO = 33) then
                                SELECT 0, :FECDOC, 1 FROM devoluciones_ventas
                                    WHERE DEVT_ID = :ID INTO :DTOF, :FECDTO, :TRM;
                            if (DTOF IS NULL) then
                                DTOF = 0;
                            if ((MONEDA <> 0) AND (TRM <> 0)) then
                                DTOF = DTOF / TRM;
                            if (DTOF <> 0) then
                                BEGIN
                                SELECT SUM(RCDE_DTOF) FROM RECIBOS_CAJA_DETALLE WHERE RCDE_IDDOC = :ID AND RCDE_TIPODOC = :TIPO INTO :DTOAPL;
                                if (DTOAPL IS NULL) then
                                    DTOAPL = 0;
                                DTOF = DTOF - DTOAPL;
                                /* SI YA SE VENCIO DEJELO EN CERO */
                                if (FECDTO < FECHA) then
                                    DTOF = 0;
                                END
                            SELECT SUM(SDCA_RTFTE - SDCA_ABRTFTE), SUM(SDCA_RTIVA - SDCA_ABRTIVA), SUM(SDCA_RTICA - SDCA_ABRTICA), SUM(SDCA_RCREE - SDCA_ABRCREE)
                                FROM SALDOS_DOC_CARTERA WHERE SDCA_TIPOREF = :TIPO AND SDCA_IDREF = :ID INTO :RTFTE, :RTIVA, :RTICA, :RCREE;
                            if (RTFTE IS NULL) then
                                RTFTE = 0;
                            if ((TIPO = 42) or (TIPO = 45) or (TIPO = 33)) THEN
                                BEGIN
                                if (RTFTE > 0) then
                                    RTFTE = 0;
                                END
                            ELSE
                                BEGIN
                                if (RTFTE < 0) then
                                    RTFTE = 0;
                                END
                            if (FAUTORET <= FECDOC) then
                                RTFTE = 0;
                            if (RTIVA IS NULL) then
                                RTIVA = 0;
                            if ((TIPO = 42) or (TIPO = 45) or (TIPO = 33)) THEN
                                BEGIN
                                if (RTIVA > 0) then
                                    RTIVA = 0;
                                END
                            ELSE
                                BEGIN
                                if (RTIVA < 0) then
                                    RTIVA = 0;
                                END
                            if (RTICA IS NULL) then
                                RTICA = 0;
                            if ((TIPO = 42) or (TIPO = 45) or (TIPO = 33)) THEN
                                BEGIN
                                if (RTICA > 0) then
                                    RTICA = 0;
                                END
                            ELSE
                                BEGIN
                                if (RTICA < 0) then
                                    RTICA = 0;
                                END
                            if (RCREE IS NULL) then
                                RCREE = 0;
                            if ((TIPO = 42) or (TIPO = 45) or (TIPO = 33)) THEN
                                BEGIN
                                if (RCREE > 0) then
                                    RCREE = 0;
                                END
                            ELSE
                                BEGIN
                                if (RCREE < 0) then
                                    RCREE = 0;
                                END
                            if (fautorcree <= FECDOC) then
                                RCREE = 0;
                            /* SI TIENE NOTA AGREGUELA */
                            SELECT MAX(NOCL_ID) FROM NOTAS_CLIENTES WHERE TERC_NIT = :NIT AND CLSU_COD = :SUCURSAL AND NOCL_TIPODOC = :TIPO AND NOCL_IDDOC = :ID INTO :IDNOTA;
                            if (IDNOTA IS NOT NULL) then
                                BEGIN
                                SELECT cast(NOCL_FECHA as char(10)), NOCL_TEXTO FROM NOTAS_CLIENTES
                                    WHERE NOCL_ID = :IDNOTA INTO :FECNOTA, :AUXNOTA;
                                if (STRLEN(AUXNOTA) < 244) then
                                    NOTA = FECNOTA || ':' || AUXNOTA;
                                ELSE
                                    NOTA = AUXNOTA;
                                END
                            else
                                NOTA = '';
                            TOTCLI = TOTCLI + SALDO;
                            SUSPEND;
                            END  /* SALDO <> 0 */
                        END  /* NO ANTICIPO */
                    END  /* FOR */
                /* AGREGUE LOS RECIBOS PROVISIONALES CON SIGNO NEGATIVO */
                FOR SELECT 65, MAX(P.RCPR_ID), MAX(PREF_PRE), MAX(RCPR_NUMERO), MAX(RCPR_FECHA), MAX(RCPR_CONC), SUM(RPDE_ABONO * -1), SUM(RPDE_RTFTE*-1), SUM(RPDE_RTIVA*-1), SUM(RPDE_RTICA*-1), SUM(RPDE_RCREE*-1), MAX(RCPR_TRM)
                    FROM RECIBO_PROVISIONAL P, recibo_provisional_detalle D
                    WHERE P.rcpr_id = D.rcpr_id AND P.TERC_NIT = :NIT AND P.VEND_COD = :codcobr AND RCPR_FECHA <= :FECHA AND RCPR_ANULADO = 'N' AND
                    ((RCPR_FECCRUCE IS NULL) or (RCPR_FECCRUCE > :FECHA)) AND RPDE_SUCURSAL = :SUCURSAL AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
                    GROUP BY P.rcpr_id
                    INTO :TIPO, :ID, :PREFIJO, :NUMERO, :FECDOC, :CONCEPTO, :PROVISIONAL, :rtfte,  :RTIVA, :RTICA, :RCREE, :TRM
                    DO
                    BEGIN
                    if ((MONEDA <> 0) AND (TRM <> 0)) then
                        PROVISIONAL = PROVISIONAL / TRM;
                    MONTO = PROVISIONAL;
                    if (:descnt_prov = 'NO') then
                      SALDO = 0;
                    else
                      SALDO = :PROVISIONAL;
                    SELECT TIDO_NOMCORTO FROM TIPO_DOCUMENTO WHERE TIDO_COD = :TIPO INTO :TIPONOM;
                    /* CALCULE EL VENCIMIENTO DEL ULTIMO DOCUMENTO POSFECHADO */
                    SELECT MAX(RPPA_FECHA) FROM recibo_provisional_pago WHERE RCPR_ID = :ID INTO :VENCE;
                    DIAS = VENCE - FECHA;
                    SUSPEND;
                    END
                END /* ok */
            END  /* FOR COBR */
        END  /* AGRUPA = C */
    END  /* FOR NIT */
END^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER procedure REP_ANALISIS_CARTERA (
    DESDE varchar(20),
    HASTA varchar(20),
    GRPINI varchar(5),
    GRPFIN varchar(5),
    FECHA date,
    DETALLE char(1),
    ORDEN char(1),
    AGRUPA char(1),
    DIASR integer,
    SUBEMPRESA integer,
    GRUPCART integer,
    EXTENDIDA char(1),
    MONEDA integer)
returns (
    NIT varchar(20),
    NOMBRE varchar(60),
    TELEFONO varchar(40),
    DIRECCION varchar(60),
    CIUDAD varchar(40),
    CONTACTO varchar(60),
    EMAIL varchar(100),
    MAILCART varchar(100),
    FAX varchar(25),
    CEL varchar(25),
    CODCLI varchar(20),
    CODZONA varchar(2),
    NOMZONA varchar(60),
    CODCOBR integer,
    NOMCOBR varchar(60),
    DV char(1),
    DIASCR integer,
    CODCIUD char(5),
    NOMCIUD varchar(60),
    SUCURSAL varchar(10),
    NOMSUC varchar(60),
    RESALTAR char(1),
    INSTCART varchar(255),
    TIPO integer,
    ID integer,
    PREFIJO varchar(4),
    NUMERO varchar(8),
    DIAS integer,
    SALDO numeric(18,2),
    CORRIENTE numeric(18,2),
    CERO numeric(18,2),
    TREINTA numeric(18,2),
    SESENTA numeric(18,2),
    NOVENTA numeric(18,2),
    CIENTOCHENTA numeric(18,2),
    DOSSETENTA numeric(18,2),
    TRESSESENTA numeric(18,2),
    PROVISIONAL numeric(18,2),
    TIPONOM varchar(8),
    FECDOC date,
    VENCE date,
    CUPO numeric(18,2),
    DISPONIBLE numeric(18,2),
    OBS blob sub_type 0 segment size 80,
    GRUPCOD integer,
    DIA_CAR integer,
    CALIFICA integer,
    GRUPNOM varchar(30))
AS
DECLARE VARIABLE NITINI VARCHAR(20);
DECLARE VARIABLE NITFIN VARCHAR(20);
DECLARE VARIABLE NOMINI VARCHAR(20);
DECLARE VARIABLE NOMFIN VARCHAR(20);
DECLARE VARIABLE RTFTE NUMERIC(18,2);
DECLARE VARIABLE RTIVA NUMERIC(18,2);
DECLARE VARIABLE RTICA NUMERIC(18,2);
DECLARE VARIABLE VENCIMIENTO VARCHAR(12);
DECLARE VARIABLE OK CHAR(1);
declare variable AUTORET VARCHAR(10);
declare variable FAUTORET DATE;
declare variable INCLANTI CHAR(2);
declare variable descnt_prov char(2);
declare variable MAXDIAS INTEGER;
DECLARE VARIABLE TRM NUMERIC(18,2);
BEGIN
if (ORDEN = 'C') then
    BEGIN
    NITINI = DESDE;
    NITFIN = HASTA;
    NOMINI = '';
    NOMFIN = 'zz';
    END
ELSE
    BEGIN
    NOMINI = DESDE;
    NOMFIN = HASTA;
    NITINI = '';
    NITFIN = 'zz';
    END
/* Ubique el NIT */
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', 'ANALISIS DE CARTERA CON FECHA FACTURA O VENCIMIENTO') returning_values (VENCIMIENTO);
EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'INCLUIR ANTICIPOS DE CLIENTES EN REPORTES Y CONSULTAS DE CARTERA') returning_values (INCLANTI);
EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'DESCONTAR RECIBOS PROVISIONALES EN INFORMES DE CARTERA') RETURNING_VALUES (:descnt_prov);

FOR select T.TERC_NIT, TERC_NOM, TERC_DV, CLSU_TEL, clsu_dir, CLSU_CIUDAD, S.COBR_COD, S.ZONA_COD, T.CIUD_COD, CLIE_CUPO, CLIE_DIAS, CLCU_COD,
    CLSU_NOMBRE, t.terc_obs, C.GRCA_COD, TERC_CONTACTO, TERC_EMAIL, TERC_FAX, TERC_CEL, CLIE_COD, CLIE_RESALTAR, CLIE_INSTCARTERA, CLIE_MAILCART, CLIE_CALIFICA, CLIE_DIAS
    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
        T.TERC_NOM >= :NOMINI AND T.TERC_NOM <= :NOMFIN AND ((:GRUPCART = 0) or (C.GRCA_COD = :GRUPCART))
    INTO :NIT, :NOMBRE, :DV, :TELEFONO, :DIRECCION, :CIUDAD, :CODCOBR, :CODZONA, :CODCIUD, :CUPO, :DIA_CAR,  :SUCURSAL,
    :NOMSUC, :obs, :GRUPCOD, :CONTACTO, :EMAIL, :FAX, :CEL, :CODCLI, :RESALTAR, INSTCART, :MAILCART, :CALIFICA, :DIASCR
    DO  
    BEGIN
    SELECT COBR_NOM FROM COBRADORES CB WHERE COBR_COD = :CODCOBR INTO :NOMCOBR;
    SELECT ZONA_NOM FROM ZONAS Z WHERE ZONA_COD = :CODZONA INTO :NOMZONA;
    SELECT CIUD_NOM FROM CIUDADES WHERE CIUD_COD = :CODCIUD INTO :NOMCIUD;
    SELECT GRCA_NOMBRE FROM GRUPO_CARTERA WHERE GRCA_COD = :GRUPCOD INTO :GRUPNOM;
    provisional = 0;
    MAXDIAS = 0;
    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
        DISPONIBLE = CUPO;
        CORRIENTE = 0;
        CERO = 0;
        TREINTA = 0;
        SESENTA = 0;
        NOVENTA = 0;
        CIENTOCHENTA = 0;
        DOSSETENTA = 0;
        TRESSESENTA = 0;
        /* BUSQUE EN SALDOS_DOC_CARTERA LOS QUE TENGAN SALDO > 0 */
        FOR SELECT MVCL_TIPOREF, MVCL_IDREF, MVCL_PREFREF, MVCL_NUMREF, MVCL_FECHA, MVCL_VENCE
            FROM MOVIMIENTO_CLIENTES
            WHERE TERC_NIT = :NIT AND MVCL_SUCURSAL = :SUCURSAL AND MVCL_FECHA <= :FECHA
                AND MVCL_ABONO = 'N' AND ((:SUBEMPRESA = 0) or (SUCU_ID = :SUBEMPRESA)) AND
                ((:MONEDA = 0) or (MVCL_TRM <> 1))
            INTO :TIPO, :ID, :PREFIJO, :NUMERO, :FECDOC, :VENCE
            DO
            BEGIN
            if ((inclanti = 'SI') or (TIPO <> 45)) then
                BEGIN
                EXECUTE PROCEDURE saldo_doc_cartera(TIPO, ID, FECHA, MONEDA) returning_values (SALDO);
                if (SALDO <> 0) then
                    BEGIN
                    DISPONIBLE = DISPONIBLE - SALDO;
                    SELECT TIDO_NOMCORTO FROM TIPO_DOCUMENTO WHERE TIDO_COD = :TIPO INTO :TIPONOM;

                    if (MONEDA = 0) then
                        SELECT SUM(SDCA_RTFTE - SDCA_ABRTFTE), SUM(SDCA_RTIVA - SDCA_ABRTIVA), SUM(SDCA_RTICA - SDCA_ABRTICA)
                            FROM SALDOS_DOC_CARTERA WHERE SDCA_TIPOREF = :TIPO AND SDCA_IDREF = :ID
                            INTO :RTFTE, :RTIVA, :RTICA;
                    ELSE
                        SELECT SUM((SDCA_RTFTE - SDCA_ABRTFTE)/SDCA_TRM), SUM((SDCA_RTIVA - SDCA_ABRTIVA)/SDCA_TRM), SUM((SDCA_RTICA - SDCA_ABRTICA)/SDCA_TRM)
                            FROM SALDOS_DOC_CARTERA WHERE SDCA_TIPOREF = :TIPO AND SDCA_IDREF = :ID
                            INTO :RTFTE, :RTIVA, :RTICA;
                    if (RTFTE IS NULL) then
                        RTFTE = 0;
                    if ((TIPO = 42) or (TIPO = 45) or (TIPO = 33)) THEN
                        BEGIN
                        if (RTFTE > 0) then
                            RTFTE = 0;
                        END
                    ELSE
                        BEGIN
                        if (RTFTE < 0) then
                            RTFTE = 0;
                        END
                    if (FAUTORET <= FECDOC) then
                        RTFTE = 0;
                    if (RTIVA IS NULL) then
                        RTIVA = 0;
                    if ((TIPO = 42) or (TIPO = 45) or (TIPO = 33)) THEN
                        BEGIN
                        if (RTIVA > 0) then
                            RTIVA = 0;
                        END
                    ELSE
                        BEGIN
                        if (RTIVA < 0) then
                            RTIVA = 0;
                        END
                    if (RTICA IS NULL) then
                        RTICA = 0;
                    if ((TIPO = 42) or (TIPO = 45) or (TIPO = 33)) THEN
                        BEGIN
                        if (RTICA > 0) then
                            RTICA = 0;
                        END
                    ELSE
                        BEGIN
                        if (RTICA < 0) then
                            RTICA = 0;
                        END
                    /* AHORA CLASIFIQUE LOS DIAS */
                    if (VENCIMIENTO = 'FECHA') then
                        DIAS = FECHA - FECDOC;
                    ELSE
                        BEGIN
                        DIAS = FECHA - VENCE;
                        if ((TIPO = 31) AND (VENCIMIENTO = 'ENTREGA')) THEN
                            BEGIN
                            SELECT FACT_ENTREGA FROM FACTURAS WHERE FACT_ID = :ID INTO :VENCE;
                            DIAS = FECHA - VENCE;
                            END
                        END
                    if (MAXDIAS < DIAS) then
                        MAXDIAS = DIAS;
                    if (DETALLE = 'S') then
                        BEGIN
                        CORRIENTE = 0;
                        CERO = 0;
                        TREINTA = 0;
                        SESENTA = 0;
                        NOVENTA = 0;
                        CIENTOCHENTA = 0;
                        DOSSETENTA = 0;
                        tressesenta = 0;
                        END
                    if (DIAS < 0) then
                        CORRIENTE = CORRIENTE + SALDO;
                    ELSE
                        if (DIAS <= DIASR) then
                            CERO = CERO + SALDO;
                        ELSE
                            if (DIAS <= (DIASR * 2)) then
                                TREINTA = TREINTA + SALDO;
                            ELSE
                                if (DIAS <= (DIASR * 3)) then
                                    SESENTA = SESENTA + SALDO;
                                ELSE
                                    BEGIN
                                    if (EXTENDIDA = 'N') then
                                        NOVENTA = NOVENTA + SALDO;
                                    else    
                                        BEGIN
                                        if (DIAS <= (DIASR * 3) * 2) then
                                            NOVENTA = NOVENTA + SALDO;
                                        ELSE
                                            if (DIAS <= (DIASR * 3) * 3) then
                                                CIENTOCHENTA = CIENTOCHENTA + SALDO;
                                            ELSE
                                                if (DIAS <= (DIASR * 3) * 4) then
                                                    dossetenta = dossetenta + SALDO;
                                                ELSE
                                                    tressesenta = tressesenta + SALDO;
                                        END
                                    END
                    if (DETALLE = 'S') then
                        SUSPEND;
                    END  /* SALDO */
                END  /* NO ANTICIPO */
            END  /* FOR MOV_CLI */
        /* AGREGUE LOS RECIBOS PROVISIONALES CON SIGNO NEGATIVO */
        FOR SELECT 65, MAX(P.RCPR_ID), MAX(PREF_PRE), MAX(RCPR_NUMERO), MAX(RCPR_FECHA), SUM(RPDE_ABONO* -1), SUM(RPDE_RTFTE*-1), SUM(RPDE_RTIVA*-1), SUM(RPDE_RTICA*-1), MAX(RCPR_TRM)
            FROM RECIBO_PROVISIONAL P, recibo_provisional_detalle D
            WHERE P.rcpr_id = D.rcpr_id AND P.TERC_NIT = :NIT AND D.RPDE_SUCURSAL = :SUCURSAL AND P.RCPR_FECHA <= :FECHA AND P.RCPR_ANULADO = 'N' AND
            ((RCPR_FECCRUCE IS NULL) or (RCPR_FECCRUCE > :FECHA)) AND ((:SUBEMPRESA = 0) or (SUCU_ID = :SUBEMPRESA)) AND ((:MONEDA = 0) or (RCPR_TRM <> 1))
            GROUP BY P.rcpr_id
            INTO :TIPO, :ID, :PREFIJO, :NUMERO, :FECDOC, :PROVISIONAL, :rtfte,  :RTIVA, :RTICA, :TRM
            DO
            BEGIN
            if ((MONEDA <> 0) AND (TRM <> 0)) then
                BEGIN
                PROVISIONAL = PROVISIONAL / TRM;
                RTFTE = RTFTE / TRM;
                RTIVA = RTIVA / TRM;
                RTICA = RTICA / TRM;
                END
            if (:descnt_prov = 'NO') then
              SALDO = 0;
            else
              SALDO = :PROVISIONAL;
            SELECT TIDO_NOMCORTO FROM TIPO_DOCUMENTO WHERE TIDO_COD = :TIPO INTO :TIPONOM;
            /* CALCULE EL VENCIMIENTO DEL ULTIMO DOCUMENTO POSFECHADO */
            SELECT MAX(RPPA_FECHA) FROM recibo_provisional_pago WHERE RCPR_ID = :ID INTO :VENCE;
            DIAS = VENCE - FECHA;
            if (DETALLE = 'S') then
                BEGIN
                CORRIENTE = 0;
                CERO = 0;
                TREINTA = 0;
                SESENTA = 0;
                NOVENTA = 0;
                CIENTOCHENTA = 0;
                DOSSETENTA = 0;
                tressesenta = 0;
                END
            if (DIAS < 0) then
                CORRIENTE = CORRIENTE + SALDO;
            ELSE
                if (DIAS <= DIASR) then
                    CERO = CERO + SALDO;
                ELSE
                    if (DIAS <= (DIASR * 2)) then
                        TREINTA = TREINTA + SALDO;
                    ELSE
                        if (DIAS <= (DIASR * 3)) then
                            SESENTA = SESENTA + SALDO;
                        ELSE
                            BEGIN
                            if (EXTENDIDA = 'N') then
                                NOVENTA = NOVENTA + SALDO;
                            else
                                BEGIN
                                if (DIAS <= (DIASR * 3) * 2) then
                                    NOVENTA = NOVENTA + SALDO;
                                ELSE
                                    if (DIAS <= (DIASR * 3) * 3) then
                                        CIENTOCHENTA = CIENTOCHENTA + SALDO;
                                    ELSE
                                        if (DIAS <= (DIASR * 3) * 4) then
                                            dossetenta = dossetenta + SALDO;
                                        ELSE
                                            tressesenta = tressesenta + SALDO;
                                END
                            END
            if (DETALLE = 'S') then
                SUSPEND;
            END
        if (DETALLE = 'N') then
            begin
            SALDO = CORRIENTE + CERO + TREINTA + SESENTA + NOVENTA + cientochenta + dossetenta + tressesenta;
            DIAS = MAXDIAS;
            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 <= :FECHA
                AND MVCL_ABONO = 'N' AND ((:SUBEMPRESA = 0) or (SUCU_ID = :SUBEMPRESA)) AND
                ((:MONEDA = 0) or (MVCL_TRM <> 1))
            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
                DISPONIBLE = CUPO;
                CORRIENTE = 0;
                CERO = 0;
                TREINTA = 0;
                SESENTA = 0;
                NOVENTA = 0;
                CIENTOCHENTA = 0;
                DOSSETENTA = 0;
                tressesenta = 0;
                SELECT COBR_NOM FROM COBRADORES WHERE COBR_COD = :codcobr INTO :nomcobr;
                /* BUSQUE EN SALDOS_DOC_CARTERA LOS QUE TENGAN SALDO > 0 */
                FOR SELECT MVCL_TIPOREF, MVCL_IDREF, MVCL_PREFREF, MVCL_NUMREF, MVCL_FECHA, MVCL_VENCE
                    FROM MOVIMIENTO_CLIENTES
                    WHERE TERC_NIT = :NIT AND COBR_COD = :CODCOBR AND MVCL_SUCURSAL = :SUCURSAL AND MVCL_FECHA <= :FECHA
                        AND MVCL_ABONO = 'N' AND ((:SUBEMPRESA = 0) or (SUCU_ID = :SUBEMPRESA))
                    INTO :TIPO, :ID, :PREFIJO, :NUMERO, :FECDOC, :VENCE
                    DO
                    BEGIN
                    if ((inclanti = 'SI') or (TIPO <> 45)) then
                        BEGIN
                        EXECUTE PROCEDURE saldo_doc_cartera(TIPO, ID, FECHA, MONEDA) returning_values (SALDO);
                        if (SALDO <> 0) then
                            BEGIN
                            DISPONIBLE = DISPONIBLE - SALDO;
                            SELECT TIDO_NOMCORTO FROM TIPO_DOCUMENTO WHERE TIDO_COD = :TIPO INTO :TIPONOM;
                            if (MONEDA = 0) then
                                SELECT SUM(SDCA_RTFTE - SDCA_ABRTFTE), SUM(SDCA_RTIVA - SDCA_ABRTIVA), SUM(SDCA_RTICA - SDCA_ABRTICA)
                                    FROM SALDOS_DOC_CARTERA WHERE SDCA_TIPOREF = :TIPO AND SDCA_IDREF = :ID
                                    INTO :RTFTE, :RTIVA, :RTICA;
                            ELSE
                                SELECT SUM((SDCA_RTFTE - SDCA_ABRTFTE)/SDCA_TRM), SUM((SDCA_RTIVA - SDCA_ABRTIVA)/SDCA_TRM), SUM((SDCA_RTICA - SDCA_ABRTICA)/SDCA_TRM)
                                    FROM SALDOS_DOC_CARTERA WHERE SDCA_TIPOREF = :TIPO AND SDCA_IDREF = :ID
                                    INTO :RTFTE, :RTIVA, :RTICA;
                            if (RTFTE IS NULL) then
                                RTFTE = 0;
                            if ((TIPO = 42) or (TIPO = 45) or (TIPO = 33)) THEN
                                BEGIN
                                if (RTFTE > 0) then
                                    RTFTE = 0;
                                END
                            ELSE
                                BEGIN
                                if (RTFTE < 0) then
                                    RTFTE = 0;
                                END
                            if (FAUTORET <= FECDOC) then
                                RTFTE = 0;
                            if (RTIVA IS NULL) then
                                RTIVA = 0;
                            if ((TIPO = 42) or (TIPO = 45) or (TIPO = 33)) THEN
                                BEGIN
                                if (RTIVA > 0) then
                                    RTIVA = 0;
                                END
                            ELSE
                                BEGIN
                                if (RTIVA < 0) then
                                    RTIVA = 0;
                                END
                            if (RTICA IS NULL) then
                                RTICA = 0;
                            if ((TIPO = 42) or (TIPO = 45) or (TIPO = 33)) THEN
                                BEGIN
                                if (RTICA > 0) then
                                    RTICA = 0;
                                END
                            ELSE
                                BEGIN
                                if (RTICA < 0) then
                                    RTICA = 0;
                                END
                            /* AHORA CLASIFIQUE LOS DIAS */
                            if (VENCIMIENTO = 'FECHA') then
                                DIAS = FECHA - FECDOC;
                            ELSE
                                BEGIN
                                DIAS = FECHA - VENCE;
                                if ((TIPO = 31) AND (VENCIMIENTO = 'ENTREGA')) THEN
                                    BEGIN
                                    SELECT FACT_ENTREGA FROM FACTURAS WHERE FACT_ID = :ID INTO :VENCE;
                                    DIAS = FECHA - VENCE;
                                    END
                                END
                            if (MAXDIAS < DIAS) then
                                MAXDIAS = DIAS;
                            if (DETALLE = 'S') then
                                BEGIN
                                CORRIENTE = 0;
                                CERO = 0;
                                TREINTA = 0;
                                SESENTA = 0;
                                NOVENTA = 0;
                                CIENTOCHENTA = 0;
                                DOSSETENTA = 0;
                                tressesenta = 0;
                                END
                            if (DIAS < 0) then
                                CORRIENTE = CORRIENTE + SALDO;
                            ELSE
                                if (DIAS <= DIASR) then
                                    CERO = CERO + SALDO;
                                ELSE
                                    if (DIAS <= (DIASR * 2)) then
                                        TREINTA = TREINTA + SALDO;
                                    ELSE
                                        if (DIAS <= (DIASR * 3)) then
                                            SESENTA = SESENTA + SALDO;
                                        ELSE
                                            BEGIN
                                            if (EXTENDIDA = 'N') then
                                                NOVENTA = NOVENTA + SALDO;
                                            else    
                                                BEGIN
                                                if (DIAS <= (DIASR * 3) * 2) then
                                                    NOVENTA = NOVENTA + SALDO;
                                                ELSE
                                                    if (DIAS <= (DIASR * 3) * 3) then
                                                        CIENTOCHENTA = CIENTOCHENTA + SALDO;
                                                    ELSE
                                                        if (DIAS <= (DIASR * 3) * 4) then
                                                            dossetenta = dossetenta + SALDO;
                                                        ELSE
                                                            tressesenta = tressesenta + SALDO;
                                                END
                                            END
                            if (DETALLE = 'S') then
                                SUSPEND;
                            END  /* SALDO <>  0 */
                        END  /* NO ANTICIPO */
                    END  /* FOR MOV_CLI */
                /* AGREGUE LOS RECIBOS PROVISIONALES CON SIGNO NEGATIVO */
                FOR SELECT 65, MAX(P.RCPR_ID), MAX(PREF_PRE), MAX(RCPR_NUMERO), MAX(RCPR_FECHA), SUM(RPDE_ABONO * -1), SUM(RPDE_RTFTE*-1), SUM(RPDE_RTIVA*-1), SUM(RPDE_RTICA*-1), MAX(RCPR_TRM)
                    FROM RECIBO_PROVISIONAL P, recibo_provisional_detalle D
                    WHERE P.rcpr_id = D.rcpr_id AND P.TERC_NIT = :NIT AND RPDE_SUCURSAL = :SUCURSAL AND P.VEND_COD = :CODCOBR AND P.RCPR_FECHA <= :FECHA AND P.RCPR_ANULADO = 'N' AND
                    ((RCPR_FECCRUCE IS NULL) or (RCPR_FECCRUCE > :FECHA)) AND ((SUCU_ID = :SUBEMPRESA) OR (:SUBEMPRESA = 0)) AND ((:MONEDA = 0) or (RCPR_TRM <> 1))
                    GROUP BY P.rcpr_id
                    INTO :TIPO, :ID, :PREFIJO, :NUMERO, :FECDOC, :PROVISIONAL, :rtfte,  :RTIVA, :RTICA, :TRM
                    DO
                    BEGIN
                    if ((MONEDA <> 0) AND (TRM <> 0)) then
                        BEGIN
                        PROVISIONAL = PROVISIONAL / TRM;
                        RTFTE = RTFTE / TRM;
                        RTIVA = RTIVA / TRM;
                        RTICA = RTICA / TRM;
                        END
                    if (:descnt_prov = 'NO') then
                      SALDO = 0;
                    else
                      SALDO = :PROVISIONAL;
                    SELECT TIDO_NOMCORTO FROM TIPO_DOCUMENTO WHERE TIDO_COD = :TIPO INTO :TIPONOM;
                    /* CALCULE EL VENCIMIENTO DEL ULTIMO DOCUMENTO POSFECHADO */
                    SELECT MAX(RPPA_FECHA) FROM recibo_provisional_pago WHERE RCPR_ID = :ID INTO :VENCE;
                    DIAS = VENCE - FECHA;
                    if (DETALLE = 'S') then
                        BEGIN
                        CORRIENTE = 0;
                        CERO = 0;
                        TREINTA = 0;
                        SESENTA = 0;
                        NOVENTA = 0;
                        CIENTOCHENTA = 0;
                        DOSSETENTA = 0;
                        tressesenta = 0;
                        END
                    if (DIAS < 0) then
                        CORRIENTE = CORRIENTE + SALDO;
                    ELSE
                        if (DIAS <= DIASR) then
                            CERO = CERO + SALDO;
                        ELSE
                            if (DIAS <= (DIASR * 2)) then
                                TREINTA = TREINTA + SALDO;
                            ELSE
                                if (DIAS <= (DIASR * 3)) then
                                    SESENTA = SESENTA + SALDO;
                                ELSE
                                    BEGIN
                                    if (EXTENDIDA = 'N') then
                                        NOVENTA = NOVENTA + SALDO;
                                    else    
                                        BEGIN
                                        if (DIAS <= (DIASR * 3) * 2) then
                                            NOVENTA = NOVENTA + SALDO;
                                        ELSE
                                            if (DIAS <= (DIASR * 3) * 3) then
                                                CIENTOCHENTA = CIENTOCHENTA + SALDO;
                                            ELSE
                                                if (DIAS <= (DIASR * 3) * 4) then
                                                    dossetenta = dossetenta + SALDO;
                                                ELSE
                                                    tressesenta = tressesenta + SALDO;
                                        END
                                    END
                    if (DETALLE = 'S') then
                        SUSPEND;
                    END
                if (DETALLE = 'N') then
                    begin
                    SALDO = CORRIENTE + CERO + TREINTA + SESENTA + NOVENTA + cientochenta + dossetenta + tressesenta;
                    DIAS = MAXDIAS;
                    SUSPEND;
                    end
                END
            END  /* FOR COBRADOR */
        END
    END  /* FOR NIT */
END^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER procedure CARTERA_CLIENTE (
    NIT varchar(20),
    FECHA date,
    SUCURSAL varchar(10),
    MONEDA integer,
    SOLOPESOS char(1),
    AGENCIA integer)
returns (
    CODSUC varchar(10),
    TIPO integer,
    ID integer,
    PREFIJO varchar(4),
    NUMERO varchar(8),
    CONCEPTO varchar(60),
    COBR integer,
    SALDO numeric(18,2),
    RTFTE numeric(18,2),
    RTIVA numeric(18,2),
    RTICA numeric(18,2),
    RCREE numeric(18,2),
    DTOF numeric(18,2),
    TIPONOM varchar(8),
    VENCE date,
    FECDOC date,
    DIAS integer,
    RECPROV_ID integer,
    RECIPROV char(1),
    NOTA varchar(256),
    TRMDOC numeric(18,2))
AS
declare variable FEC date;
declare variable DESC_RTES char(2);
declare variable DTOAPL numeric(18,2);
declare variable TRMREC numeric(18,2);
declare variable IDNOTA integer;
declare variable AUTORET varchar(10);
declare variable FAUTORET date;
declare variable AUTORCREE varchar(10);
declare variable FAUTORCREE date;
declare variable DIASCONT integer;
declare variable CARTXAGE char(2);
declare variable vencimiento varchar(12);
begin
execute procedure LEE_CONFIGURACION('CARTERA', 'SALDOS', 'ANALISIS DE CARTERA CON FECHA FACTURA O VENCIMIENTO') returning_values (VENCIMIENTO);
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';
execute procedure LEE_CONFIGURACION('CARTERA', 'SALDOS', 'NUMERO DE DIAS PARA CONSULTA DE CARTERA DE CLIENTES DE CONTADO') returning_values (:diascont);

execute procedure LEE_CONFIGURACION('CARTERA', 'GENERAL', 'SEPARAR CARTERA POR AGENCIA') returning_values (:cartxage);
if (CARTXAGE = 'NO') then
    AGENCIA = 0;
if ((DIASCONT <> 0) and (not exists (select ptvt_id from punto_venta where terc_nit = :nit))) then
    DIASCONT = 0;
execute procedure LEE_CONFIGURACION('CARTERA', 'SALDOS', 'DESCONTAR RETENCIONES POR CAUSACION') returning_values (DESC_RTES);
  /* BUSQUE EN SALDOS_DOC_CARTERA LOS QUE TENGAN SALDO > 0 */
 for select MVCL_TIPOREF, MVCL_IDREF, MVCL_FECHA, MVCL_VENCE, MVCL_PREFREF, MVCL_NUMREF, MVCL_CONC, MVCL_TRM, COBR_COD, MVCL_SUCURSAL
  from MOVIMIENTO_CLIENTES
  where TERC_NIT = :NIT and ((mvcl_sucursal = :sucursal) or (:SUCURSAL = '0'))  and MVCL_FECHA <= :FECHA and MVCL_ABONO = 'N' and
    ((:MONEDA = 0) or (MVCL_TRM <> 1)) and ((MVCL_FECHA >= (:FECHA - :DIASCONT)) or (:DIASCONT = 0)) and
    ((:AGENCIA = 0) or (SUCU_ID = :AGENCIA) or (SUCU_ID = 0))
  order by MVCL_FECHA, MVCL_ID
  into :TIPO, :ID, :FECDOC, :VENCE, :PREFIJO, :NUMERO, :CONCEPTO, :TRMDOC, :COBR, :CODSUC
    do
    begin
    if (VENCIMIENTO = 'FECHA') then
        DIAS = FECHA - FECDOC;
    ELSE
        BEGIN
        DIAS = FECHA - VENCE;
        if ((TIPO = 31) AND (VENCIMIENTO = 'ENTREGA')) THEN
            BEGIN
            SELECT FACT_ENTREGA FROM FACTURAS WHERE FACT_ID = :ID INTO :VENCE;
            DIAS = FECHA - VENCE;
            END
        END
    execute procedure saldo_doc_cartera(TIPO, ID, FECHA, MONEDA) returning_values (SALDO);
    if (SALDO <> 0) then
        begin
        select TIDO_NOMCORTO from TIPO_DOCUMENTO where TIDO_COD = :TIPO into :TIPONOM;
        if (TIPO = 41) then
            select NDCL_DTOFMONTO, NDCL_FECHADTO from NOTAS_DEBITO_CLIENTES where NDCL_ID = :ID into :DTOF, :FEC;
        if (TIPO = 42) then
            select 0, NCCL_FECHA from NOTAS_CREDITO_CLIENTES where NCCL_ID = :ID into :DTOF, :FEC;
        if (TIPO = 45) then
            select ANCL_DTOFMONTO, ANCL_DTOFECHA from ANTICIPOS_CLIENTE where ANCL_ID = :ID into :DTOF, :FEC;
        if (TIPO = 31) then
            select FACT_DTOFMONTO, FACT_DTOFFECHA from FACTURAS where FACT_ID = :ID into :DTOF, :FEC;
        if (TIPO = 33) then
            select 0, :FECHA from devoluciones_ventas where DEVT_ID = :ID into :DTOF, :FEC;
        if ((MONEDA <> 0) and (TRMDOC <> 0)) then
            DTOF = DTOF / TRMDOC;

        /* POR WILLIAM IDENTIFICAR SI EL DOCUMENTO TIENE RECIBO PROVISIONAL*/
        recprov_id = 0;
        select max(d.RCPR_ID) from recibo_provisional_detalle d, recibo_provisional r
            where r.rcpr_id = d.rcpr_id and RPDE_IDDOC = :id  and RPDE_TIPODOC = :TIPO and RPDE_TIPODOC = :TIPO and
            RPDE_ANULADO = 'N' and r.rcpr_idcruce = 0 into :recprov_id;
        if (recprov_id is null) then
           begin
           reciprov = 'N';
           end 
        else
          begin 
           reciprov = 'S';
          end
        /*FIN WILLIAM*/
        if (FECHA > FEC) then
            DTOF = 0;
        if (DTOF is null) then
            DTOF = 0;
        if (DTOF <> 0) then
            begin
            select sum(RCDE_DTOF), max(RECA_TRM) from RECIBOS_CAJA_DETALLE D, RECIBOS_CAJA R
                where R.reca_id = D.reca_id and RCDE_IDDOC = :ID and RCDE_TIPODOC = :TIPO and RECA_ANULADO = 'N'
                into :DTOAPL, :TRMREC;
            if (DTOAPL is null) then
                DTOAPL = 0;
            if ((MONEDA <> 0) and (TRMREC <> 0)) then
                DTOAPL = DTOAPL / TRMREC;
            DTOF = DTOF - DTOAPL;
            end
        if (MONEDA = 0) then
            select sum(SDCA_RTFTE - SDCA_ABRTFTE), sum(SDCA_RTIVA - SDCA_ABRTIVA), sum(SDCA_RTICA - SDCA_ABRTICA), sum(SDCA_RCREE - SDCA_ABRCREE)
                from SALDOS_DOC_CARTERA where SDCA_TIPOREF = :TIPO and SDCA_IDREF = :ID
                into :RTFTE, :RTIVA, :RTICA, :RCREE;
        else
            select sum((SDCA_RTFTE - SDCA_ABRTFTE)/SDCA_TRM), sum((SDCA_RTIVA - SDCA_ABRTIVA)/SDCA_TRM), sum((SDCA_RTICA - SDCA_ABRTICA)/SDCA_TRM), sum((SDCA_RCREE - SDCA_ABRCREE)/SDCA_TRM)
                from SALDOS_DOC_CARTERA where SDCA_TIPOREF = :TIPO and SDCA_IDREF = :ID
                into :RTFTE, :RTIVA, :RTICA, :RCREE;
        if (RTFTE is null) then
            RTFTE = 0;
        if ((TIPO = 42) or (TIPO = 45) or (TIPO = 33)) then
            begin
            if (RTFTE > 0) then
                RTFTE = 0;
            end
        else
            begin
            if (RTFTE < 0) then
                RTFTE = 0;
            end

        if (RTIVA is null) then
            RTIVA = 0;
        if ((TIPO = 42) or (TIPO = 45) or (TIPO = 33)) then
            begin
            if (RTIVA > 0) then
                RTIVA = 0;
            end
        else
            begin
            if (RTIVA < 0) then
                RTIVA = 0;
            end

        if (RTICA is null) then
            RTICA = 0;
        if ((TIPO = 42) or (TIPO = 45) or (TIPO = 33)) then
            begin
            if (RTICA > 0) then
                RTICA = 0;
            end
        else
            begin
            if (RTICA < 0) then
                RTICA = 0;
            end

        if (RCREE is null) then
            RCREE = 0;
        if ((TIPO = 42) or (TIPO = 45) or (TIPO = 33)) then
            begin
            if (RCREE > 0) then
                RCREE = 0;
            end
        else
            begin
            if (RCREE < 0) then
                RCREE = 0;
            end

        if (FAUTORET <= FECDOC) then
            begin
            RTFTE = 0;
            RTIVA = 0;
            RTICA = 0;
            end
        if (FAUTORCREE <= FECDOC) then
            RCREE = 0;
        /* RESTE LAS RETENCIONES YA QUE SE SUGERIRAN */
        if (DESC_RTES = 'NO') then
            SALDO = SALDO - RTFTE - RTIVA - RTICA - RCREE;
        /* SI TIENE NOTA AGREGUELA */
        select max(NOCL_ID) from NOTAS_CLIENTES where TERC_NIT = :NIT and ((CLSU_COD = :SUCURSAL) or (:SUCURSAL = '0')) and NOCL_TIPODOC = :TIPO and NOCL_IDDOC = :ID into :IDNOTA;
        if (IDNOTA is not null) then
            select NOCL_TEXTO from NOTAS_CLIENTES where NOCL_ID = :IDNOTA into :NOTA;
        else
            NOTA = '';
        if ((SOLOPESOS = 'N') or (TRMDOC = 1)) then
            suspend;
        end
    end
end^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE IMPR_FACTURA(
    ID INTEGER)
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);
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_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
    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,
    :OBS, :VEHICULO,/* :NROCOPIA,*/ :RECIBIDO, :SUCUR, :paciente, :nompaciente, :nomcliente, :ANULADO, :anticipo, :retgarantia, :factenc, :FECINI, :FECFIN;

/* 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 */
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;
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
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, SUBSTR(FADE_DESC,1,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 = SUMA1 + SUMA2 + SUMA3 + SUMA4 + 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
            SUSPEND;
            END
          END
    END
ELSE
  if (ORDENCOD = 'UNIDAD') then
    BEGIN
    FOR SELECT FADE_ITEM, D.ARTI_COD, FADE_CODBAR, SUBSTR(FADE_DESC,1,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 = SUMA1 + SUMA2 + SUMA3 + SUMA4 + 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
            SUSPEND;
            END
          END
    END
  ELSE
    if (ORDENCOD = 'STAND') then
      BEGIN
      FOR SELECT FADE_ITEM, D.ARTI_COD, FADE_CODBAR, SUBSTR(FADE_DESC,1,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 = SUMA1 + SUMA2 + SUMA3 + SUMA4 + 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
                SUSPEND;
                END
              END
      END
    ELSE
        BEGIN
        FOR SELECT FADE_ITEM, D.ARTI_COD, FADE_CODBAR, SUBSTR(FADE_DESC,1,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 = SUMA1 + SUMA2 + SUMA3 + SUMA4 + 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
                SUSPEND;
                END
              END
        END
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER procedure COMISIONES_COBRO (
    DESDE integer,
    HASTA integer,
    FECINI date,
    FECFIN date,
    DETALLE char(1))
returns (
    CODVEND integer,
    NOMVEND varchar(60),
    NIT varchar(20),
    CLIENTE varchar(60),
    NOMTIPO varchar(8),
    PREFIJO varchar(4),
    NUMERO varchar(8),
    FECDOC date,
    PUNTOVTA integer,
    PREFREC varchar(4),
    NUMREC varchar(8),
    FECREC date,
    DIAS integer,
    ABONO numeric(18,2),
    BASE numeric(18,2),
    COMIMONTO numeric(18,2),
    COMIPORC numeric(9,2),
    ARTICULO varchar(20),
    ARTIDES varchar(60),
    CODGRP varchar(2),
    CODMAR varchar(3),
    CANT numeric(18,4),
    DTOFIN numeric(18,2),
    VENCE date,
    RTFTE numeric(18,2),
    RTIVA numeric(18,2),
    RTICA numeric(18,2))
AS
DECLARE VARIABLE TIPO INTEGER;
DECLARE VARIABLE ID INTEGER;
DECLARE VARIABLE IVAMONTO NUMERIC(18,2);
DECLARE VARIABLE TOTAL NUMERIC(18,2);
DECLARE VARIABLE SITOT CHAR(2);
DECLARE VARIABLE VENTA CHAR(2);
DECLARE VARIABLE COMIV NUMERIC(18,2);
DECLARE VARIABLE PORCV double precision;
DECLARE VARIABLE CONSUMO NUMERIC(18,2);
declare variable ALFINAL CHAR(2);
declare variable SALDO NUMERIC(18,2);
declare variable COMISION VARCHAR(10);
declare variable porcaux NUMERIC(9,2);
declare variable BASEAUX DOUBLE PRECISION;
declare variable SUCURSAL VARCHAR(20);
declare variable COMIART VARCHAR(6);
declare variable LISTA INTEGER;
declare variable LISTAP INTEGER;
declare variable INCDTO CHAR(2);
declare variable INCANTI CHAR(2);
declare variable INCCHE CHAR(2);
declare variable OK CHAR(1);
declare variable IDF INTEGER;
declare variable COMIXVND CHAR(2);
declare variable COMIDIAS NUMERIC(9,2);
declare variable ICOINC CHAR(2);
declare variable UNIVEND CHAR(2);
declare variable FOV varchar(11);
BEGIN
EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA','COMISIONES','UNIFICAR CODIGOS DE VENDEDORES Y COBRADORES') returning_values (:UNIVEND);
EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA','COMISIONES','COMISION POR COBRO PAGADERA SOLO EN EL COBRO TOTAL') returning_values (:ALFINAL);
execute procedure lee_configuracion('CARTERA','COMISIONES','COMISION POR COBRO COMO PORCENTAJE DE LA COMISION VENTA') returning_values (:venta);
EXECUTE PROCEDURE lee_configuracion('CARTERA', 'COMISIONES', 'LIQUIDAR COMISION COBRO CON COBRADOR DEL DOCUMENTO O DEL RECIBO') returning_values (:COMISION);
EXECUTE PROCEDURE lee_configuracion ('FACTURACION','FACTURAS', 'CODIGO DE LA LISTA DE PRECIOS A MOSTRAR EN ARTICULOS') returning_values (:LISTAP);
EXECUTE PROCEDURE lee_configuracion('CARTERA', 'COMISIONES', 'COMISION POR COBRO POR ARTICULO') returning_values (:comiart);
EXECUTE PROCEDURE lee_configuracion('CARTERA', 'COMISIONES', 'INCLUIR DESCUENTO FINANCIERO EN BASE DE COMISIONES POR COBRO') returning_values (:incdto);
EXECUTE PROCEDURE lee_configuracion('CARTERA', 'COMISIONES', 'INCLUIR ANTICIPOS EN COMISIONES POR COBRO') returning_values (:incanti);
EXECUTE PROCEDURE lee_configuracion('CARTERA', 'COMISIONES', 'INCLUIR RECAUDO DE CHEQUES DEVUELTOS EN COMISIONES') returning_values (:incche);
EXECUTE PROCEDURE lee_configuracion('CARTERA', 'COMISIONES', 'COMISION POR ARTICULO Y PROPORCION POR DIAS DE RECAUDO') returning_values (:comixvnd);
EXECUTE PROCEDURE lee_configuracion('CARTERA', 'COMISIONES', 'COMISION POR COBRO INCLUYENDO EL IMPOCONSUMO') returning_values (:icoinc);
EXECUTE PROCEDURE lee_configuracion('CARTERA', 'COMISIONES', 'COMISION POR COBRO SOBRE EL TOTAL') returning_values (:SITOT);
EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'ANALISIS DE CARTERA CON FECHA FACTURA O VENCIMIENTO') RETURNING_VALUES (FOV);
FOR SELECT RCDE_TIPODOC, RCDE_IDDOC, RCDE_PREFIJO, RCDE_NUMERO, R.TERC_NIT, TERC_NOM, RECA_FECHA, (RCDE_ABONO+RCDE_RTFTE+RCDE_RTIVA+RCDE_RTICA), PREF_PRE, RECA_NUMERO, RCDE_COBR, RCDE_DTOF, RCDE_RTFTE, RCDE_RTIVA, RCDE_RTICA
    FROM RECIBOS_CAJA R, RECIBOS_CAJA_DETALLE RD, TERCEROS T
    WHERE R.RECA_ID = RD.RECA_ID AND RECA_FECHA >= :FECINI AND RECA_FECHA <= :FECFIN AND R.TERC_NIT = T.TERC_NIT AND RECA_ANULADO = 'N'
    AND ((RD.rcde_tipodoc <> 45) or (:INCANTI = 'SI'))
    ORDER BY TERC_NIT, RECA_FECHA
    INTO :TIPO, :ID, :PREFIJO, :NUMERO, :NIT, :CLIENTE, :FECREC, :ABONO, :PREFREC, :NUMREC, :codvend, :DTOFIN, :rtfte, :RTIVA, :RTICA
    DO
    BEGIN
    SELECT TIDO_NOMCORTO FROM TIPO_DOCUMENTO WHERE TIDO_COD = :TIPO INTO :NOMTIPO;
    if (incdto = 'SI') then
        ABONO = ABONO + DTOFIN;
    if (COMISION = 'DOCUMENTO') then
        SELECT first 1 MVCL_FECHA, COBR_COD, MVCL_VENCE FROM MOVIMIENTO_CLIENTES WHERE MVCL_TIPOREF = :TIPO AND MVCL_IDREF = :ID
            INTO :FECDOC, :codvend, :VENCE;
    else
        SELECT first 1 MVCL_FECHA, MVCL_VENCE FROM MOVIMIENTO_CLIENTES WHERE MVCL_TIPOREF = :TIPO AND MVCL_IDREF = :ID
            INTO :FECDOC, :VENCE;
    if ((TIPO = 31) AND (FOV = 'ENTREGA')) THEN
        SELECT FACT_ENTREGA FROM FACTURAS WHERE FACT_ID = :ID INTO :FECDOC;
    if (FECDOC IS NOT NULL) then
        DIAS = FECREC - FECDOC;
    ELSE
        DIAS = 999;
    if (TIPO = 31) then
        SELECT PTVT_ID FROM FACTURAS WHERE FACT_ID = :ID INTO :puntovta;
    else if (TIPO = 33) then
        SELECT PTVT_ID FROM devoluciones_ventas WHERE DEVT_ID = :ID INTO :puntovta;
    else    
        PUNTOVTA = 0;
    if ((codvend >= :DESDE) AND (codvend <= :hasta)) then
        BEGIN
        select COBR_NOM from COBRADORES where COBR_COD = :codvend INTO :nomvend;
        /* TRAIGA EL PORCENTAJE DE ACUERDO A LOS DIAS */
        COMIPORC = 0;
        SELECT CMCB_PORC FROM COMISION_COBRO WHERE CMCB_DIASINI <= :dias AND CMCB_DIASFIN >= :DIAS AND COBR_COD = :CODVEND
            INTO :COMIPORC;
        if (COMIPORC IS NULL) THEN
            COMIPORC = 0;
        COMIDIAS = COMIPORC;
        if (VENTA = 'NO') then
            BEGIN
            if (ALFINAL = 'SI') then
                BEGIN
                EXECUTE PROCEDURE saldo_doc_cartera(:tipo, :ID, :FECREC, 0) returning_values (:SALDO);
                if (SALDO = 0) then
                    OK = 'S';
                else
                    OK = 'N';
                end
            else
                OK = 'S';
            if (TIPO = 31) then
                BEGIN
                if (DETALLE = 'N') then
                    SELECT MAX(FACT_TOTAL), MAX(FACT_IVAMONTO-FACT_DEC2799), SUM(FADE_CONSUMO) FROM FACTURAS F, FACTURAS_DETALLE D
                        WHERE F.FACT_ID = D.FACT_ID AND F.FACT_ID = :ID INTO :TOTAL, :IVAMONTO, :CONSUMO;
                ELSE
                    FOR SELECT D.ARTI_COD, FADE_CANT, FADE_TOTAL, FADE_IVAMONTO, FADE_CONSUMO, GRUP_COD, LIPR_COD, MARC_COD, ARTI_DES
                        FROM FACTURAS F, FACTURAS_DETALLE D, ARTICULO A
                        WHERE F.FACT_ID = D.FACT_ID AND D.arti_cod = A.arti_cod AND F.FACT_ID = :ID and substring(a.arti_cod from 1 FOR 2) <> '.t'
                        INTO :ARTICULO, :CANT, :TOTAL, :IVAMONTO, :CONSUMO, :CODGRP, :lista, :codmar, :artides
                        DO
                        BEGIN
                        if (comiart = 'GRUPO') then
                            SELECT GRUP_COMIPOR FROM GRUPO WHERE GRUP_COD = :codgrp INTO :comiporc;
                        if (comiart = 'MARCA') then
                            SELECT MARC_COMIPOR FROM MARCAS WHERE MARC_COD = :codmar INTO :comiporc;
                        if (comiart = 'PRECIO') then
                            SELECT PRAR_COMIC FROM precios_articulo WHERE ARTI_COD = :articulo AND LIPR_COD = :LISTA INTO :comiporc;

                        if (SITOT = 'SI') then
                            BASEAUX = TOTAL;
                        ELSE
                            begin
                            BASEAUX = TOTAL - IVAMONTO;
                            if (ICOINC <> 'SI') then
                                BASEAUX = BASEAUX - CONSUMO;
                            end
                        if (OK = 'S') then
                            begin
                            if (alfinal = 'SI') then
                                BASE = BASEAUX;
                            else
                                begin
                                /* calcula la proporcion del abono */
                                SELECT FACT_TOTAL FROM FACTURAS WHERE FACT_ID = :ID INTO :TOTAL;
                                if (TOTAL <> 0) then
                                    BASE = BASEAUX * (ABONO / TOTAL);
                                else
                                    BASE = 0;
                                end
                            end
                        else
                            BASE = 0;
                        if (comixvnd = 'SI') then
                            BEGIN                          
                            comiporc = comiporc * comidias / 100;
                            END
                        COMIMONTO = BASE / 100 * COMIPORC;
                        SUSPEND;
                        END
                END
            if (TIPO = 33) then
                if (DETALLE = 'N') then
                    SELECT MAX(DEVT_TOTAL*-1), MAX((DEVT_IVAMONTO-DEVT_DEC2799)*-1), SUM(DVDE_CONSUMO) FROM DEVOLUCIONES_VENTAS V, DEVOLUCIONES_VENTAS_DETALLE D
                        WHERE V.DEVT_ID = D.DEVT_ID AND V.DEVT_ID = :ID INTO :TOTAL, :IVAMONTO, :CONSUMO;
                ELSE
                    FOR SELECT D.ARTI_COD, DVDE_CANT, DVDE_TOTAL*-1, DVDE_IVAMONTO*-1, DVDE_CONSUMO*-1, GRUP_COD, DEVT_FACTID, MARC_COD, ARTI_DES
                        FROM DEVOLUCIONES_VENTAS V, DEVOLUCIONES_VENTAS_DETALLE D, ARTICULO A
                        WHERE V.DEVT_ID = D.DEVT_ID AND D.arti_cod = A.arti_cod AND V.DEVT_ID = :ID and substring(a.arti_cod from 1 FOR 2) <> '.t'
                        INTO :ARTICULO, :CANT, :TOTAL, :IVAMONTO, :CONSUMO, :codgrp, :IDF, :codmar, :artides
                        DO
                        BEGIN
                        if (comiart = 'GRUPO') then
                            SELECT GRUP_COMIPOR FROM GRUPO WHERE GRUP_COD = :codgrp INTO :comiporc;
                        if (comiart = 'MARCA') then
                            SELECT MARC_COMIPOR FROM MARCAS WHERE MARC_COD = :codmar INTO :comiporc;
                        if (comiart = 'PRECIO') then
                            BEGIN
                            LISTA = 0;
                            SELECT MAX(LIPR_COD) FROM facturas_detalle d WHERE ARTI_COD = :ARTICULO AND FACT_ID = :IDF INTO :LISTA;
                            if (LISTA = 0) then
                                LISTA = LISTAP;
                            SELECT PRAR_COMIC FROM precios_articulo WHERE ARTI_COD = :articulo AND LIPR_COD = :LISTA INTO :comiporc;
                            END
                        if (SITOT = 'SI') then
                            BASEAUX = TOTAL;
                        ELSE
                            begin
                            BASEAUX = TOTAL - IVAMONTO;
                            if (ICOINC <> 'SI') then
                                BASEAUX = BASEAUX - CONSUMO;
                            end
                        if (OK = 'S') then
                            begin
                            if (alfinal = 'SI') then
                                BASE = BASEAUX;
                            else
                                begin
                                /* calcula la proporcion del abono */
                                SELECT DEVT_TOTAL FROM DEVOLUCIONES_VENTAS WHERE DEVT_ID = :ID INTO :TOTAL;
                                if (TOTAL <> 0) then
                                    BASE = BASEAUX * (ABONO / TOTAL);
                                else
                                    BASE = 0;
                                end
                            end
                        else
                            BASE = 0;
                        if (comixvnd = 'SI') then
                            BEGIN                          
                            comiporc = comiporc * comidias / 100;
                            END
                        COMIMONTO = BASE / 100 * COMIPORC;
                        SUSPEND;
                        END
            if (TIPO = 41) then
                SELECT NDCL_MONTO, NDCL_IVAMONTO, 0 FROM NOTAS_DEBITO_CLIENTES WHERE NDCL_ID = :ID INTO :TOTAL, :IVAMONTO, :CONSUMO;
            if (TIPO = 42) then
                SELECT NCCL_MONTO*-1, NCCL_IVAMONTO*-1, 0 FROM NOTAS_CREDITO_CLIENTES WHERE NCCL_ID = :ID INTO :TOTAL, :IVAMONTO, :CONSUMO;
            if (TIPO = 45) then
                SELECT ANCL_BASE, ANCL_IVAMONTO, 0 FROM anticipos_cliente WHERE ANCL_ID = :ID INTO :TOTAL, :IVAMONTO, :CONSUMO;
            if (TIPO = 77) then
                if (INCCHE = 'SI') then
                    SELECT DVCH_MONTO, 0, 0 FROM DEVOLUCION_CHEQUES WHERE DVCH_ID = :ID INTO :TOTAL, :IVAMONTO, :CONSUMO;
                ELSE
                    BEGIN
                    TOTAL = 0;
                    IVAMONTO = 0;
                    CONSUMO = 0;
                    END
            if (SITOT = 'SI') then
                BASEAUX = ABONO;
            ELSE
                if (TOTAL <> 0) then
                    if (ICOINC <> 'SI') then
                        BASEAUX = (ABONO / TOTAL) * (TOTAL - IVAMONTO - CONSUMO);
                    else
                        BASEAUX = (ABONO / TOTAL) * (TOTAL - IVAMONTO);
                ELSE
                    BASEAUX = 0;
            BASE = BASEAUX;
            if ((univend = 'SI') AND (COMIART <> 'NO') AND (TIPO > 33))then
                SELECT FIRST 1 COMI_PORC FROM COMISIONES WHERE VEND_COD = :codvend ORDER BY COMI_ID INTO :comiporc;
            if (comixvnd = 'SI') then
                BEGIN
                comiporc = comiporc * comidias / 100;
                END

            COMIMONTO = BASE / 100 * COMIPORC;
            END
        ELSE
            BEGIN
            if (TIPO = 31) then
                if (DETALLE = 'N') then
                    SELECT MAX(FACT_TOTAL), MAX(FACT_IVAMONTO-FACT_DEC2799), MAX(FACT_COMIPORC), SUM(FADE_CONSUMO)
                        FROM FACTURAS F, FACTURAS_DETALLE D WHERE F.FACT_ID = D.FACT_ID AND F.FACT_ID = :ID
                        INTO :TOTAL, :IVAMONTO, :PORCV, :CONSUMO;
                ELSE
                    FOR SELECT D.ARTI_COD, FADE_CANT, FADE_TOTAL, FADE_IVAMONTO, FADE_CONSUMO, FACT_COMIPORC, GRUP_COD, MARC_COD, ARTI_DES
                        FROM FACTURAS F, FACTURAS_DETALLE D, ARTICULO A
                        WHERE F.FACT_ID = D.FACT_ID AND D.arti_cod = A.arti_cod AND F.FACT_ID = :ID and substring(a.arti_cod from 1 FOR 2) <> '.t'
                        INTO :ARTICULO, :CANT, :TOTAL, :IVAMONTO, :CONSUMO, :porcv, :codgrp, :codmar, :artides
                        DO
                        BEGIN
                        if (SITOT = 'SI') then
                            BASEAUX = TOTAL;
                        ELSE
                            begin
                            BASEAUX = TOTAL - IVAMONTO;
                            if (ICOINC <> 'SI') then
                                BASEAUX = BASEAUX - CONSUMO;
                            end
                        /* calcula la proporcion del abono */
                        SELECT FACT_TOTAL FROM FACTURAS WHERE FACT_ID = :ID INTO :TOTAL;
                        if (TOTAL <> 0) then
                            BASE = BASEAUX * (ABONO / TOTAL);
                        else
                            BASE = 0;
                        COMIV = BASE / 100 * PORCV;
                        COMIMONTO = COMIV / 100 * COMIPORC;
                        porcaux = comiporc;
                        comiporc = PORCV * COMIPORC / 100;
                        SUSPEND;
                        END
            if (TIPO = 33) then
                if (DETALLE = 'N') then
                    SELECT MAX(DEVT_TOTAL*-1), MAX((DEVT_IVAMONTO-DEVT_DEC2799)*-1), MAX(DEVT_COMIPORC*-1), SUM(DVDE_CONSUMO*-1)
                        FROM DEVOLUCIONES_VENTAS V, DEVOLUCIONES_VENTAS_DETALLE D WHERE V.DEVT_ID = D.DEVT_ID AND D.DEVT_ID = :ID
                        INTO :TOTAL, :IVAMONTO, :PORCV, :CONSUMO;
                ELSE
                    FOR SELECT D.ARTI_COD, DVDE_CANT, DVDE_TOTAL*-1, DVDE_IVAMONTO*-1, DVDE_CONSUMO*-1, DEVT_COMIPORC, GRUP_COD, MARC_COD, ARTI_DES
                        FROM DEVOLUCIONES_VENTAS V, DEVOLUCIONES_VENTAS_DETALLE D, ARTICULO A
                        WHERE V.DEVT_ID = D.DEVT_ID AND D.arti_cod = A.arti_cod AND V.DEVT_ID = :ID and substring(a.arti_cod from 1 FOR 2) <> '.t'
                        INTO :ARTICULO, :CANT, :TOTAL, :IVAMONTO, :CONSUMO, :porcv, :codgrp, :codmar, :artides
                        DO
                        BEGIN
                        if (SITOT = 'SI') then
                            BASEAUX = TOTAL;
                        ELSE
                            begin
                            BASEAUX = TOTAL - IVAMONTO;
                            if (ICOINC <> 'SI') then
                                BASEAUX = BASEAUX - CONSUMO;
                            end
                        /* calcula la proporcion del abono */
                        SELECT DEVT_TOTAL FROM DEVOLUCIONES_VENTAS WHERE DEVT_ID = :ID INTO :TOTAL;
                        if (TOTAL <> 0) then
                            BASE = BASEAUX * (ABONO / TOTAL);
                        else
                            BASE = 0;
                        COMIV = BASE / 100 * PORCV;
                        COMIMONTO = COMIV / 100 * COMIPORC;
                        porcaux = comiporc;
                        comiporc = PORCV * COMIPORC / 100;
                        SUSPEND;
                        END
            if (TIPO = 41) then
                SELECT NDCL_MONTO, NDCL_IVAMONTO, NDCL_COMIPORC, 0 FROM NOTAS_DEBITO_CLIENTES
                    WHERE NDCL_ID = :ID INTO :TOTAL, :IVAMONTO, :PORCV, :CONSUMO;
            if (TIPO = 42) then
                SELECT NCCL_MONTO, NCCL_IVAMONTO, NCCL_COMIPORC, 0  FROM NOTAS_CREDITO_CLIENTES
                    WHERE NCCL_ID = :ID INTO :TOTAL, :IVAMONTO, :PORCV, :CONSUMO;
            if (TIPO = 45) then
                SELECT ANCL_BASE, ANCL_IVAMONTO, 0 FROM anticipos_cliente WHERE ANCL_ID = :ID INTO :TOTAL, :IVAMONTO, :CONSUMO;
            if (TIPO = 77) then
                if (INCCHE = 'SI') then
                    SELECT DVCH_MONTO, 0, 0, 0 FROM DEVOLUCION_CHEQUES WHERE DVCH_ID = :ID INTO :TOTAL, :IVAMONTO, :PORCV, :CONSUMO;
                ELSE
                    BEGIN
                    TOTAL = 0;
                    IVAMONTO = 0;
                    CONSUMO = 0;
                    PORCV = 0;
                    END
            if (SITOT = 'SI') then
                BASEAUX = ABONO;
            ELSE
                if ((total <> 0) AND (ABONO <> 0)) then
                    if (ICOINC <> 'SI') then
                        BASEAUX = (TOTAL - IVAMONTO - CONSUMO) / TOTAL * ABONO;
                    else
                        BASEAUX = (TOTAL - IVAMONTO) / TOTAL * ABONO;
                ELSE
                    BASEAUX = 0;
            COMIV = BASEAUX / 100 * PORCV;
            COMIMONTO = COMIV / 100 * COMIPORC;
            porcaux = comiporc;
            comiporc = PORCV * COMIPORC / 100;
            BASE = BASEAUX;
            END
        if (DETALLE = 'N') then
            if (ALFINAL = 'SI') then
                BEGIN
                /* VERIFIQUE EL SALDO DEL DOCUMENTO, SI ES CERO LIQUIDE COMISION SOBRE EL TOTAL */
                EXECUTE PROCEDURE saldo_doc_cartera(:tipo, :ID, :FECREC, 0) returning_values (:SALDO);
                if (SALDO = 0) then
                    BEGIN
                    if (VENTA = 'NO') then
                        begin
                        if (SITOT = 'SI') then
                            BASEAUX = TOTAL;
                        ELSE
                            if (ICOINC <> 'SI') then
                                BASEAUX = TOTAL - IVAMONTO - CONSUMO;
                            else
                                BASEAUX = TOTAL - IVAMONTO;
                        COMIMONTO = BASEAUX * COMIPORC / 100;
                        end
                    ELSE
                        BEGIN
                        if (SITOT = 'SI') then
                            BASEAUX = TOTAL;
                        ELSE
                            begin
                            BASEAUX = TOTAL - IVAMONTO;
                            if (ICOINC <> 'SI') then
                                BASEAUX = BASEAUX - CONSUMO;
                            end
                        COMIV = PORCV * BASEAUX / 100;
                        COMIMONTO = COMIV / 100 * porcaux;
                        comiporc = PORCV * porcaux / 100;
                        END
                    BASE = BASEAUX;
                    SUSPEND;
                    END
                END
            ELSE
                SUSPEND;
        ELSE
            if ((TIPO <> 31) AND (TIPO <> 33)) then
                SUSPEND;
        END
    END
FOR SELECT EGCC_TIPODOC, EGCC_IDDOC, EGCC_PREFIJO, EGCC_NUMERO, E.TERC_NIT, TERC_NOM, EGRE_FECHA, (EGCC_ABONO+EGCC_RTFTE+EGCC_RTIVA+EGCC_RTICA), PREF_PRE, EGRE_NUMERO, EGCC_SUCURSAL, EGCC_DTOF
    FROM EGRESOS E, EGRESOS_CRUCEC C, TERCEROS T
    WHERE E.EGRE_ID = C.EGRE_ID AND EGRE_FECHA >= :FECINI AND EGRE_FECHA <= :FECFIN AND E.TERC_NIT = T.TERC_NIT AND EGRE_ANULADO = 'N'
    ORDER BY TERC_NIT, EGRE_FECHA
    INTO :TIPO, :ID, :PREFIJO, :NUMERO, :NIT, :CLIENTE, :FECREC, :ABONO, :PREFREC, :NUMREC, :SUCURSAL, :dtofin
    DO
    BEGIN
    SELECT COBR_COD FROM cliente_sucursales WHERE TERC_NIT = :NIT AND CLCU_COD = :sucursal INTO :codvend;
    SELECT TIDO_NOMCORTO FROM TIPO_DOCUMENTO WHERE TIDO_COD = :TIPO INTO :NOMTIPO;
    if (incdto = 'SI') then
        ABONO = ABONO + DTOFIN;
    if (COMISION = 'DOCUMENTO') then
        SELECT MVCL_FECHA, COBR_COD FROM MOVIMIENTO_CLIENTES WHERE MVCL_TIPOREF = :TIPO AND MVCL_IDREF = :ID
            INTO :FECDOC, :codvend;
    else
        SELECT MVCL_FECHA FROM MOVIMIENTO_CLIENTES WHERE MVCL_TIPOREF = :TIPO AND MVCL_IDREF = :ID
            INTO :FECDOC;
    if ((TIPO = 31) AND (FOV = 'ENTREGA')) THEN
        SELECT FACT_ENTREGA FROM FACTURAS WHERE FACT_ID = :ID INTO :FECDOC;
    if (FECDOC IS NOT NULL) then
        DIAS = FECREC - FECDOC;
    ELSE
        DIAS = 999;
    if (TIPO = 31) then
        SELECT PTVT_ID FROM FACTURAS WHERE FACT_ID = :ID INTO :puntovta;
    else if (TIPO = 33) then
        SELECT PTVT_ID FROM devoluciones_ventas WHERE DEVT_ID = :ID INTO :puntovta;
    else    
        PUNTOVTA = 0;
    if ((codvend >= :DESDE) AND (codvend <= :hasta)) then
        BEGIN
        select COBR_NOM from COBRADORES where COBR_COD = :codvend INTO :nomvend;
        /* TRAIGA EL PORCENTAJE DE ACUERDO A LOS DIAS */
        COMIPORC = 0;
        SELECT CMCB_PORC FROM COMISION_COBRO WHERE CMCB_DIASINI <= :dias AND CMCB_DIASFIN >= :DIAS AND COBR_COD = :CODVEND INTO :COMIPORC;
        if (COMIPORC IS NULL) THEN
            COMIPORC = 0;
        COMIDIAS = COMIPORC;
        if (VENTA = 'NO') then
            BEGIN
            if (ALFINAL = 'SI') then
                BEGIN
                EXECUTE PROCEDURE saldo_doc_cartera(:tipo, :ID, :FECREC, 0) returning_values (:SALDO);
                if (SALDO = 0) then
                    OK = 'S';
                else
                    OK = 'N';
                end
            else
                OK = 'S';
            if (TIPO = 31) then
                BEGIN
                if (DETALLE = 'N') then
                    SELECT MAX(FACT_TOTAL), MAX(FACT_IVAMONTO-FACT_DEC2799), SUM(FADE_CONSUMO) FROM FACTURAS F, FACTURAS_DETALLE D
                        WHERE F.FACT_ID = D.FACT_ID AND F.FACT_ID = :ID INTO :TOTAL, :IVAMONTO, :CONSUMO;
                ELSE
                    FOR SELECT D.ARTI_COD, FADE_CANT, FADE_TOTAL, FADE_IVAMONTO, FADE_CONSUMO, GRUP_COD, LIPR_COD, MARC_COD, ARTI_DES
                        FROM FACTURAS F, FACTURAS_DETALLE D, ARTICULO A
                        WHERE F.FACT_ID = D.FACT_ID AND D.arti_cod = A.arti_cod AND F.FACT_ID = :ID and substring(a.arti_cod from 1 FOR 2) <> '.t'
                        INTO :ARTICULO, :CANT, :TOTAL, :IVAMONTO, :CONSUMO, :CODGRP, :LISTA, :codmar, :artides
                        DO
                        BEGIN
                        if (comiart = 'GRUPO') then
                            SELECT GRUP_COMIPOR FROM GRUPO WHERE GRUP_COD = :codgrp INTO :comiporc;
                        if (comiart = 'MARCA') then
                            SELECT MARC_COMIPOR FROM MARCAS WHERE MARC_COD = :codmar INTO :comiporc;
                        if (comiart = 'PRECIO') then
                            SELECT PRAR_COMIC FROM precios_articulo WHERE ARTI_COD = :articulo AND LIPR_COD = :LISTA INTO :comiporc;

                        if (SITOT = 'SI') then
                            BASEAUX = TOTAL;
                        ELSE
                            begin
                            BASEAUX = TOTAL - IVAMONTO;
                            if (ICOINC <> 'SI') then
                                BASEAUX = BASEAUX - CONSUMO;
                            end
                        if (OK = 'S') then
                            begin
                            if (alfinal = 'SI') then
                                BASE = BASEAUX;
                            else
                                begin
                                /* calcula la proporcion del abono */
                                SELECT FACT_TOTAL FROM FACTURAS WHERE FACT_ID = :ID INTO :TOTAL;
                                if (TOTAL <> 0) then
                                    BASE = BASEAUX * (ABONO / TOTAL);
                                else
                                    BASE = 0;
                                end
                            end
                        else
                            BASE = 0;
                        if (comixvnd = 'SI') then
                            BEGIN                          
                            comiporc = comiporc * comidias / 100;
                            END
                        COMIMONTO = BASE / 100 * COMIPORC;
                        SUSPEND;
                        END
                END
            if (TIPO = 33) then
                if (DETALLE = 'N') then
                    SELECT MAX(DEVT_TOTAL*-1), MAX((DEVT_IVAMONTO-DEVT_DEC2799)*-1), SUM(DVDE_CONSUMO) FROM DEVOLUCIONES_VENTAS V, DEVOLUCIONES_VENTAS_DETALLE D
                        WHERE V.DEVT_ID = D.DEVT_ID AND V.DEVT_ID = :ID INTO :TOTAL, :IVAMONTO, :CONSUMO;
                ELSE
                    FOR SELECT D.ARTI_COD, DVDE_CANT, DVDE_TOTAL*-1, DVDE_IVAMONTO*-1, DVDE_CONSUMO*-1, GRUP_COD, DEVT_FACTID, MARC_COD, ARTI_DES
                        FROM DEVOLUCIONES_VENTAS V, DEVOLUCIONES_VENTAS_DETALLE D, ARTICULO A
                        WHERE V.DEVT_ID = D.DEVT_ID AND D.arti_cod = A.arti_cod AND V.DEVT_ID = :ID and substring(a.arti_cod from 1 FOR 2) <> '.t'
                        INTO :ARTICULO, :CANT, :TOTAL, :IVAMONTO, :CONSUMO, :codgrp, :IDF, :codmar, :artides
                        DO
                        BEGIN
                        if (comiart = 'GRUPO') then
                            SELECT GRUP_COMIPOR FROM GRUPO WHERE GRUP_COD = :codgrp INTO :comiporc;
                        if (comiart = 'MARCA') then
                            SELECT MARC_COMIPOR FROM MARCAS WHERE MARC_COD = :codmar INTO :comiporc;
                        if (comiart = 'PRECIO') then
                            BEGIN
                            LISTA = 0;
                            SELECT MAX(LIPR_COD) FROM facturas_detalle d WHERE ARTI_COD = :ARTICULO AND FACT_ID = :IDF INTO :LISTA;
                            if (LISTA = 0) then
                                LISTA = LISTAP;
                            SELECT PRAR_COMIC FROM precios_articulo WHERE ARTI_COD = :articulo AND LIPR_COD = :LISTA INTO :comiporc;
                            END
                        if (SITOT = 'SI') then
                            BASEAUX = TOTAL;
                        ELSE
                            begin
                            BASEAUX = TOTAL - IVAMONTO;
                            if (ICOINC <> 'SI') then
                                BASEAUX = BASEAUX - CONSUMO;
                            end
                        if (OK = 'S') then
                            begin
                            if (alfinal = 'SI') then
                                BASE = BASEAUX;
                            else
                                begin
                                /* calcula la proporcion del abono */
                                SELECT DEVT_TOTAL FROM DEVOLUCIONES_VENTAS WHERE DEVT_ID = :ID INTO :TOTAL;
                                if (TOTAL <> 0) then
                                    BASE = BASEAUX * (ABONO / TOTAL);
                                else
                                    BASE = 0;
                                end
                            end
                        else
                            BASE = 0;
                        if (comixvnd = 'SI') then
                            BEGIN                          
                            comiporc = comiporc * comidias / 100;
                            END
                        COMIMONTO = BASE / 100 * COMIPORC;
                        SUSPEND;
                        END
            if (TIPO = 41) then
                SELECT NDCL_MONTO, NDCL_IVAMONTO, 0 FROM NOTAS_DEBITO_CLIENTES WHERE NDCL_ID = :ID INTO :TOTAL, :IVAMONTO, :CONSUMO;
            if (TIPO = 42) then
                SELECT NCCL_MONTO*-1, NCCL_IVAMONTO*-1, 0 FROM NOTAS_CREDITO_CLIENTES WHERE NCCL_ID = :ID INTO :TOTAL, :IVAMONTO, :CONSUMO;
            if (TIPO = 45) then
                SELECT ANCL_BASE, ANCL_IVAMONTO, 0 FROM anticipos_cliente WHERE ANCL_ID = :ID INTO :TOTAL, :IVAMONTO, :CONSUMO;
            if (TIPO = 77) then
                if (INCCHE = 'SI') then
                    SELECT DVCH_MONTO, 0, 0 FROM DEVOLUCION_CHEQUES WHERE DVCH_ID = :ID INTO :TOTAL, :IVAMONTO, :CONSUMO;
                ELSE
                    BEGIN
                    TOTAL = 0;
                    IVAMONTO = 0;
                    CONSUMO = 0;
                    END
            if (SITOT = 'SI') then
                BASEAUX = ABONO;
            ELSE
                if (TOTAL <> 0) then
                    if (ICOINC <> 'SI') then
                        BASEAUX = (ABONO / TOTAL) * (TOTAL - IVAMONTO - CONSUMO);
                    else
                        BASEAUX = (ABONO / TOTAL) * (TOTAL - IVAMONTO);
                ELSE
                    BASEAUX = 0;
            BASE = BASEAUX;
            if ((univend = 'SI') AND (TIPO > 33))then
                SELECT FIRST 1 COMI_PORC FROM COMISIONES WHERE VEND_COD = :codvend ORDER BY COMI_ID INTO :comiporc;
            if (comixvnd = 'SI') then
                BEGIN
                comiporc = comiporc * comidias / 100;
                END
            COMIMONTO = BASE / 100 * COMIPORC;
            END
        ELSE
            BEGIN
            if (TIPO = 31) then
                if (DETALLE = 'N') then
                    SELECT MAX(FACT_TOTAL), MAX(FACT_IVAMONTO-FACT_DEC2799), MAX(FACT_COMIPORC), SUM(FADE_CONSUMO)
                        FROM FACTURAS F, FACTURAS_DETALLE D WHERE F.FACT_ID = D.FACT_ID AND F.FACT_ID = :ID
                        INTO :TOTAL, :IVAMONTO, :PORCV, :CONSUMO;
                ELSE
                    FOR SELECT D.ARTI_COD, FADE_CANT, FADE_TOTAL, FADE_IVAMONTO, FADE_CONSUMO, FACT_COMIPORC, GRUP_COD, MARC_COD, ARTI_DES
                        FROM FACTURAS F, FACTURAS_DETALLE D, ARTICULO A
                        WHERE F.FACT_ID = D.FACT_ID AND D.arti_cod = A.arti_cod AND F.FACT_ID = :ID and substring(a.arti_cod from 1 FOR 2) <> '.t'
                        INTO :ARTICULO, :CANT, :TOTAL, :IVAMONTO, :CONSUMO, :porcv, :codgrp, :codmar, :artides
                        DO
                        BEGIN
                        if (SITOT = 'SI') then
                            BASEAUX = TOTAL;
                        ELSE
                            begin
                            BASEAUX = TOTAL - IVAMONTO;
                            if (ICOINC <> 'SI') then
                                BASEAUX = BASEAUX - CONSUMO;
                            end
                        /* calcula la proporcion del abono */
                        SELECT FACT_TOTAL FROM FACTURAS WHERE FACT_ID = :ID INTO :TOTAL;
                        if (TOTAL <> 0) then
                            BASE = BASEAUX * (ABONO / TOTAL);
                        else
                            BASE = 0;
                        COMIV = BASE / 100 * PORCV;
                        COMIMONTO = COMIV / 100 * COMIPORC;
                        porcaux = comiporc;
                        comiporc = PORCV * COMIPORC / 100;
                        SUSPEND;
                        END
            if (TIPO = 33) then
                if (DETALLE = 'N') then
                    SELECT MAX(DEVT_TOTAL*-1), MAX((DEVT_IVAMONTO-DEVT_DEC2799)*-1), MAX(DEVT_COMIPORC*-1), SUM(DVDE_CONSUMO*-1)
                        FROM DEVOLUCIONES_VENTAS V, DEVOLUCIONES_VENTAS_DETALLE D WHERE V.DEVT_ID = D.DEVT_ID AND D.DEVT_ID = :ID
                        INTO :TOTAL, :IVAMONTO, :PORCV, :CONSUMO;
                ELSE
                    FOR SELECT D.ARTI_COD, DVDE_CANT, DVDE_TOTAL*-1, DVDE_IVAMONTO*-1, DVDE_CONSUMO*-1, DEVT_COMIPORC, GRUP_COD, MARC_COD, ARTI_DES
                        FROM DEVOLUCIONES_VENTAS V, DEVOLUCIONES_VENTAS_DETALLE D, ARTICULO A
                        WHERE V.DEVT_ID = D.DEVT_ID AND D.arti_cod = A.arti_cod AND V.DEVT_ID = :ID and substring(a.arti_cod from 1 FOR 2) <> '.t'
                        INTO :ARTICULO, :CANT, :TOTAL, :IVAMONTO, :CONSUMO, :porcv, :codgrp, :codmar, :artides
                        DO
                        BEGIN
                        if (SITOT = 'SI') then
                            BASEAUX = TOTAL;
                        ELSE
                            begin
                            BASEAUX = TOTAL - IVAMONTO;
                            if (ICOINC <> 'SI') then
                                BASEAUX = BASEAUX - CONSUMO;
                            end
                        /* calcula la proporcion del abono */
                        SELECT DEVT_TOTAL FROM DEVOLUCIONES_VENTAS WHERE DEVT_ID = :ID INTO :TOTAL;
                        if (TOTAL <> 0) then
                            BASE = BASEAUX * (ABONO / TOTAL);
                        else
                            BASE = 0;
                        COMIV = BASE / 100 * PORCV;
                        COMIMONTO = COMIV / 100 * COMIPORC;
                        porcaux = comiporc;
                        comiporc = PORCV * COMIPORC / 100;
                        SUSPEND;
                        END
            if (TIPO = 41) then
                SELECT NDCL_MONTO, NDCL_IVAMONTO, NDCL_COMIPORC, 0 FROM NOTAS_DEBITO_CLIENTES
                    WHERE NDCL_ID = :ID INTO :TOTAL, :IVAMONTO, :PORCV, :CONSUMO;
            if (TIPO = 42) then
                SELECT NCCL_MONTO, NCCL_IVAMONTO, NCCL_COMIPORC, 0  FROM NOTAS_CREDITO_CLIENTES
                    WHERE NCCL_ID = :ID INTO :TOTAL, :IVAMONTO, :PORCV, :CONSUMO;
            if (TIPO = 45) then
                SELECT ANCL_BASE, ANCL_IVAMONTO, 0 FROM anticipos_cliente WHERE ANCL_ID = :ID INTO :TOTAL, :IVAMONTO, :CONSUMO;
            if (TIPO = 77) then
                if (incche = 'SI') then
                    SELECT DVCH_MONTO, 0, 0, 0 FROM DEVOLUCION_CHEQUES WHERE DVCH_ID = :ID INTO :TOTAL, :IVAMONTO, :PORCV, :CONSUMO;
                ELSE
                    BEGIN
                    TOTAL = 0;
                    IVAMONTO = 0;
                    CONSUMO = 0;
                    PORCV = 0;
                    END
            if (SITOT = 'SI') then
                BASEAUX = ABONO;
            ELSE
                if ((total <> 0) AND (ABONO <> 0)) then
                    if (ICOINC <> 'SI') then
                        BASEAUX = (TOTAL - IVAMONTO - CONSUMO) / TOTAL * ABONO;
                    else
                        BASEAUX = (TOTAL - IVAMONTO) / TOTAL * ABONO;
                ELSE
                    BASEAUX = 0;
            COMIV = BASEAUX / 100 * PORCV;
            COMIMONTO = COMIV / 100 * COMIPORC;
            porcaux = comiporc;
            comiporc = PORCV * COMIPORC / 100;
            BASE = BASEAUX;
            END
        if (DETALLE = 'N') then
            if (ALFINAL = 'SI') then
                BEGIN
                /* VERIFIQUE EL SALDO DEL DOCUMENTO, SI ES CERO LIQUIDE COMISION SOBRE EL TOTAL */
                EXECUTE PROCEDURE saldo_doc_cartera(:tipo, :ID, :FECREC, 0) returning_values (:SALDO);
                if (SALDO = 0) then
                    BEGIN
                    if (VENTA = 'NO') then
                        begin
                        if (SITOT = 'SI') then
                            BASEAUX = TOTAL;
                        ELSE
                            begin
                            BASEAUX = TOTAL - IVAMONTO;
                            if (ICOINC <> 'SI') then
                                BASEAUX = BASEAUX - CONSUMO;
                            end
                        COMIMONTO = BASEAUX * COMIPORC / 100;
                        end
                    ELSE
                        BEGIN
                        if (SITOT = 'SI') then
                            BASEAUX = TOTAL;
                        ELSE
                            begin
                            BASEAUX = TOTAL - IVAMONTO;
                            if (ICOINC <> 'SI') then
                                BASEAUX = BASEAUX - CONSUMO;
                            end
                        COMIV = PORCV * BASEAUX / 100;
                        COMIMONTO = COMIV / 100 * porcaux;
                        comiporc = PORCV * porcaux / 100;
                        END
                    BASE = BASEAUX;
                    SUSPEND;
                    END
                END
            ELSE
                SUSPEND;
        ELSE
            if ((TIPO <> 31) AND (TIPO <> 33)) then
                SUSPEND;
        END
    END
FOR SELECT 'DEVOCHEQ', DVCH_MONTO*-1, DVCH_FECHA, PRBA_PREF, DVCH_NUMDOC, DVCH_FECHA, D.TERC_NIT, DVCH_NOMTERC, '', '', D.COBR_COD
    FROM DEVOLUCION_CHEQUES D, CLIENTES C
    WHERE DVCH_FECHA >= :FECINI AND DVCH_FECHA <= :FECFIN AND D.TERC_NIT = C.TERC_NIT AND D.COBR_COD = :CODVEND
    INTO :NOMTIPO, :BASE, :FECDOC, :PREFIJO, :NUMERO, :FECREC, :NIT, :CLIENTE, :PREFREC, :NUMREC, :codvend
    DO
    BEGIN
    COMIPORC = 0;
    COMIMONTO = 0;
    VENCE = fecdoc;
    RTFTE = 0;
    RTIVA = 0;
    RTICA = 0;
    DTOFIN = 0;
    puntovta = 0;
    if ((codvend >= :DESDE) AND (codvend <= :hasta)) then
        BEGIN
        select COBR_NOM from COBRADORES where COBR_COD = :codvend INTO :nomvend;
        /* SELECT CMCB_PORC FROM COMISION_COBRO WHERE CMCB_DIASINI <= 1 AND CMCB_DIASFIN >= 1 AND COBR_COD = :CODVEND INTO :COMIPORC;
        if (COMIPORC IS NULL) THEN
            COMIPORC = 0;
        COMIMONTO = BASE * COMIPORC / 100; */
        SUSPEND;
        END
    END
END^

SET TERM ; ^

/* FACTURA DE VENTA EN DOLARES */
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);
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
    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;

/* 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 */
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;
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, SUBSTR(FADE_DESC,1,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 = SUMA1 + SUMA2 + SUMA3 + SUMA4 + 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, SUBSTR(FADE_DESC,1,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 = SUMA1 + SUMA2 + SUMA3 + SUMA4 + 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, SUBSTR(FADE_DESC,1,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 = SUMA1 + SUMA2 + SUMA3 + SUMA4 + 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, SUBSTR(FADE_DESC,1,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 = SUMA1 + SUMA2 + SUMA3 + SUMA4 + 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 ; ^


/* CONTACTO EN REPORTES DE VENTAS POR CLIENTE */
SET TERM ^ ;

CREATE OR ALTER procedure REP_VENTAS_CLIENTE (
    TIPO integer,
    NITDESDE varchar(20),
    NITHASTA varchar(20),
    FECINI date,
    FECFIN date,
    DETALLE char(1),
    ORDEN char(1),
    CEROS char(1),
    SUBEMPRESA integer)
returns (
    NIT varchar(20),
    NOMBRE varchar(60),
    DV char(1),
    contacto varchar(255),
    TELEFONO varchar(40),
    CIUDAD varchar(40),
    CODZONA varchar(2),
    NOMZONA varchar(60),
    NOMTIPO varchar(50),
    PREFIJO varchar(4),
    NUMERO varchar(8),
    SUCURSAL varchar(10),
    DESPACHO varchar(255),
    OBS varchar(255),
    ID integer,
    ABONOS numeric(18,2),
    SALDO numeric(18,2),
    FECDOC date,
    CANTIDAD integer,
    SUBTOTAL numeric(18,2),
    DTO numeric(18,2),
    ADICIONAL numeric(18,2),
    IVA numeric(18,2),
    EXTRA numeric(18,2),
    TOTAL numeric(18,2),
    RTFTE numeric(18,2),
    RTIVA numeric(18,2),
    RTICA numeric(18,2),
    NETO numeric(18,2),
    ULTVENTA date,
    APELLIDO1 varchar(60),
    APELLIDO2 varchar(60),
    NOMBRE1 varchar(60),
    NOMBRE2 varchar(60),
    CODCIU varchar(5),
    TRANSPORTA varchar(60))
AS
DECLARE VARIABLE NITINI VARCHAR(15);
DECLARE VARIABLE NITFIN VARCHAR(15);
DECLARE VARIABLE NOMINI VARCHAR(15);
DECLARE VARIABLE NOMFIN VARCHAR(15);
BEGIN
if (ORDEN = 'C') then
    BEGIN
    NITINI = NITDESDE;
    NITFIN = NITHASTA;
    NOMINI = '';
    NOMFIN = 'zz';
    END
ELSE
    BEGIN
    NITINI = NITDESDE;
    NITFIN = NITHASTA;
    NOMINI = '';
    NOMFIN = 'zz';
    END

SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = :TIPO INTO :NOMTIPO;
if (DETALLE = 'N') then
    BEGIN
    if (BIN_AND(TIPO, 1) <> 0) then
        BEGIN
        SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 31 INTO :NOMTIPO;
        FOR SELECT MAX(T.TERC_NIT), MAX(TERC_NOM), MAX(TERC_TEL), MAX(TERC_CIU), MAX(ZONA_COD), MAX(TERC_DV), MAX(TERC_CONTACTO),
            MAX(TERC_APELLIDO1), MAX(TERC_APELLIDO2), MAX(TERC_NOMBRE1), MAX(TERC_NOMBRE2), MAX(T.CIUD_COD), max(FACT_FECHA),
            COUNT(*), SUM(FACT_DTOMONTO), SUM(FACT_ADICIONAL), SUM(FACT_IVAMONTO), SUM(FACT_EXTRA), SUM(FACT_RTFTEMONTO), SUM(FACT_RTIVAMONTO), SUM(FACT_RTICAMONTO), SUM(FACT_TOTAL)
            FROM FACTURAS F, PREFIJOS P, terceros T, CLIENTES C
            where C.TERC_NIT = T.TERC_NIT AND T.TERC_CLIE = 'S' AND T.TERC_NIT >= :NITINI AND T.TERC_NIT <= :NITFIN AND TERC_NOM >= :NOMINI AND TERC_NOM <= :NOMFIN
             AND F.TERC_NIT = T.terc_nit AND FACT_FECHA >= :FECINI AND FACT_FECHA <= :FECFIN AND FACT_ANULADO = 'N'
             AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 31 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            GROUP BY F.terc_nit
            INTO :NIT, :NOMBRE, :TELEFONO, :CIUDAD, :CODZONA, :DV, :CONTACTO,
            :APELLIDO1, :APELLIDO2, :NOMBRE1, :NOMBRE2, :CODCIU, :ultventa,
            :CANTIDAD, :DTO, :ADICIONAL, :IVA, :EXTRA, :RTFTE, :RTIVA, :RTICA, :TOTAL
            DO
            BEGIN
            SELECT ZONA_NOM FROM ZONAS WHERE ZONA_COD = :codzona INTO :NOMZONA;
            if (CANTIDAD IS NULL) then
                CANTIDAD = 0;
            if (DTO IS NULL) then
                DTO = 0;
            if (ADICIONAL IS NULL) then
                ADICIONAL = 0;
            if (IVA IS NULL) then
                IVA = 0;
            if (EXTRA IS NULL) then
                EXTRA = 0;
            if (RTFTE IS NULL) then
                RTFTE = 0;
            if (RTIVA IS NULL) then
                RTIVA = 0;
            if (RTICA IS NULL) then
                RTICA = 0;
            SUBTOTAL = TOTAL - EXTRA - IVA - ADICIONAL + DTO;
            NETO = TOTAL - RTFTE - RTIVA - RTICA;
            if (CEROS = 'S') then
              SUSPEND;
            ELSE
              if (CANTIDAD > 0) then
                SUSPEND;
            END
        END
    if (BIN_AND(TIPO, 2) <> 0) then
        BEGIN
        SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 32 INTO :NOMTIPO;
        FOR SELECT MAX(T.TERC_NIT), MAX(TERC_NOM), MAX(TERC_TEL), MAX(TERC_CIU), MAX(ZONA_COD), MAX(TERC_DV), MAX(TERC_CONTACTO),
            MAX(TERC_APELLIDO1), MAX(TERC_APELLIDO2), MAX(TERC_NOMBRE1), MAX(TERC_NOMBRE2), MAX(T.CIUD_COD), MAX(REVT_FECHA),
            COUNT(*), 0, 0, SUM(REVT_IVAMONTO), 0, 0, 0, 0, SUM(REVT_TOTAL)
            FROM REMISIONES_VENTA R, PREFIJOS P, terceros T, CLIENTES C
            where C.TERC_NIT = T.TERC_NIT AND T.TERC_CLIE = 'S' AND T.TERC_NIT >= :NITINI AND T.TERC_NIT <= :NITFIN AND TERC_NOM >= :NOMINI AND TERC_NOM <= :NOMFIN
             AND R.TERC_NIT = T.terc_nit AND REVT_FECHA >= :FECINI AND REVT_FECHA <= :FECFIN AND REVT_ANULADO = 'N'
             AND P.PREF_PRE = R.PREF_PRE AND P.TIDO_COD = 32 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            GROUP BY R.terc_nit
            INTO :NIT, :NOMBRE, :TELEFONO, :CIUDAD, :CODZONA, :DV, :CONTACTO,
            :APELLIDO1, :APELLIDO2, :NOMBRE1, :NOMBRE2, :CODCIU, :ultventa,
            :CANTIDAD, :DTO, :ADICIONAL, :IVA, :EXTRA, :RTFTE, :RTIVA, :RTICA, :TOTAL
            DO
            BEGIN
            SELECT ZONA_NOM FROM ZONAS WHERE ZONA_COD = :codzona INTO :NOMZONA;
            if (CANTIDAD IS NULL) then
                CANTIDAD = 0;
            if (DTO IS NULL) then
                DTO = 0;
            if (ADICIONAL IS NULL) then
                ADICIONAL = 0;
            if (IVA IS NULL) then
                IVA = 0;
            if (EXTRA IS NULL) then
                EXTRA = 0;
            if (RTFTE IS NULL) then
                RTFTE = 0;
            if (RTIVA IS NULL) then
                RTIVA = 0;
            if (RTICA IS NULL) then
                RTICA = 0;
            SUBTOTAL = TOTAL - EXTRA - IVA - ADICIONAL + DTO;
            NETO = TOTAL - RTFTE - RTIVA - RTICA;
            if (CEROS = 'S') then
              SUSPEND;
            ELSE
              if (CANTIDAD > 0) then
                SUSPEND;
            END
        END
    if (BIN_AND(TIPO, 4) <> 0) then
        BEGIN
        SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 33 INTO :NOMTIPO;
        FOR SELECT MAX(T.TERC_NIT), MAX(TERC_NOM), MAX(TERC_TEL), MAX(TERC_CIU), MAX(ZONA_COD), MAX(TERC_DV), MAX(TERC_CONTACTO),
            MAX(TERC_APELLIDO1), MAX(TERC_APELLIDO2), MAX(TERC_NOMBRE1), MAX(TERC_NOMBRE2), MAX(T.CIUD_COD), MAX(DEVT_FECHA),
            COUNT(*), SUM(DEVT_DTOMONTO), SUM(DEVT_ADICIONAL), SUM(DEVT_IVAMONTO), SUM(DEVT_EXTRA), SUM(DEVT_RTFTEMONTO), SUM(DEVT_RTIVAMONTO), SUM(DEVT_RTICAMONTO), SUM(DEVT_TOTAL)
            FROM DEVOLUCIONES_VENTAS V, PREFIJOS P, terceros T, CLIENTES C
            where C.TERC_NIT = T.TERC_NIT AND T.TERC_CLIE = 'S' AND T.TERC_NIT >= :NITINI AND T.TERC_NIT <= :NITFIN AND TERC_NOM >= :NOMINI AND TERC_NOM <= :NOMFIN
             AND V.TERC_NIT = T.terc_nit AND DEVT_FECHA >= :FECINI AND DEVT_FECHA <= :FECFIN AND DEVT_ANULADO = 'N'
             AND P.PREF_PRE = V.PREF_PRE AND P.TIDO_COD = 33 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) AND ((DEVT_REMID = 0) or (DEVT_REMID IS NULL)) AND ((DEVT_PEDID = 0) or (DEVT_PEDID IS NULL))
            GROUP BY V.terc_nit
            INTO :NIT, :NOMBRE, :TELEFONO, :CIUDAD, :CODZONA, :DV, :CONTACTO,
            :APELLIDO1, :APELLIDO2, :NOMBRE1, :NOMBRE2, :CODCIU, :ultventa,
             :CANTIDAD, :DTO, :ADICIONAL, :IVA, :EXTRA, :RTFTE, :RTIVA, :RTICA, :TOTAL
            DO
            BEGIN
            SELECT ZONA_NOM FROM ZONAS WHERE ZONA_COD = :codzona INTO :NOMZONA;
            if (CANTIDAD IS NULL) then
                CANTIDAD = 0;
            if (DTO IS NULL) then
                DTO = 0;
            if (ADICIONAL IS NULL) then
                ADICIONAL = 0;
            if (IVA IS NULL) then
                IVA = 0;
            if (EXTRA IS NULL) then
                EXTRA = 0;
            if (RTFTE IS NULL) then
                RTFTE = 0;
            if (RTIVA IS NULL) then
                RTIVA = 0;
            if (RTICA IS NULL) then
                RTICA = 0;
            SUBTOTAL = TOTAL - EXTRA - IVA - ADICIONAL + DTO;
            NETO = TOTAL - RTFTE - RTIVA - RTICA;
            CANTIDAD = CANTIDAD * -1;
            SUBTOTAL = SUBTOTAL * -1;
            TOTAL = TOTAL * -1;
            IVA = IVA * -1;
            EXTRA = EXTRA * -1;
            DTO = DTO * -1;
            ADICIONAL = ADICIONAL * -1;
            RTFTE = RTFTE * -1;
            RTIVA = RTIVA * -1;
            RTICA = RTICA * -1;
            if (CEROS = 'S') then
              SUSPEND;
            ELSE
              if (CANTIDAD <> 0) then
                SUSPEND;
            END
        END
    if (BIN_AND(TIPO, 8) <> 0) then
        BEGIN
        SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 34 INTO :NOMTIPO;
        FOR SELECT MAX(T.TERC_NIT), MAX(TERC_NOM), MAX(TERC_TEL), MAX(TERC_CIU), MAX(ZONA_COD), MAX(TERC_DV), MAX(TERC_CONTACTO),
            MAX(TERC_APELLIDO1), MAX(TERC_APELLIDO2), MAX(TERC_NOMBRE1), MAX(TERC_NOMBRE2), MAX(T.CIUD_COD), MAX(PEDI_FECHA),
            COUNT(*), SUM(PEDI_DTOMONTO), SUM(PEDI_ADICIONAL), SUM(PEDI_IVAMONTO), SUM(PEDI_EXTRA), 0, 0, 0, SUM(PEDI_TOTAL)
            FROM PEDIDOS P, PREFIJOS PR, terceros T, CLIENTES C
            where C.TERC_NIT = T.TERC_NIT AND T.TERC_CLIE = 'S' AND T.TERC_NIT >= :NITINI AND T.TERC_NIT <= :NITFIN AND TERC_NOM >= :NOMINI AND TERC_NOM <= :NOMFIN
             AND P.TERC_NIT = T.terc_nit AND PEDI_FECHA >= :FECINI AND PEDI_FECHA <= :FECFIN AND PEDI_ANULADO = 'N'
             AND PR.PREF_PRE = P.PREF_PRE AND P.TIDO_COD = 34 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            GROUP BY P.terc_nit
            INTO :NIT, :NOMBRE, :TELEFONO, :CIUDAD, :CODZONA, :DV, :CONTACTO,
            :APELLIDO1, :APELLIDO2, :NOMBRE1, :NOMBRE2, :CODCIU, :ultventa,
            :CANTIDAD, :DTO, :ADICIONAL, :IVA, :EXTRA, :RTFTE, :RTIVA, :RTICA, :TOTAL
            DO
            BEGIN
            SELECT ZONA_NOM FROM ZONAS WHERE ZONA_COD = :codzona INTO :NOMZONA;
            if (CANTIDAD IS NULL) then
                CANTIDAD = 0;
            if (DTO IS NULL) then
                DTO = 0;
            if (ADICIONAL IS NULL) then
                ADICIONAL = 0;
            if (IVA IS NULL) then
                IVA = 0;
            if (EXTRA IS NULL) then
                EXTRA = 0;
            if (RTFTE IS NULL) then
                RTFTE = 0;
            if (RTIVA IS NULL) then
                RTIVA = 0;
            if (RTICA IS NULL) then
                RTICA = 0;
            SUBTOTAL = TOTAL - EXTRA - IVA - ADICIONAL + DTO;
            NETO = TOTAL - RTFTE - RTIVA - RTICA;
            if (CEROS = 'S') then
              SUSPEND;
            ELSE
              if (CANTIDAD > 0) then
                SUSPEND;
            END
        END
    if (BIN_AND(TIPO, 16) <> 0) then
        BEGIN
        SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 35 INTO :NOMTIPO;
        FOR SELECT MAX(T.TERC_NIT), MAX(TERC_NOM), MAX(TERC_TEL), MAX(TERC_CIU), MAX(ZONA_COD), MAX(TERC_DV), MAX(TERC_CONTACTO),
            MAX(TERC_APELLIDO1), MAX(TERC_APELLIDO2), MAX(TERC_NOMBRE1), MAX(TERC_NOMBRE2), MAX(T.CIUD_COD), MAX(COTI_FECHA),
            COUNT(*), SUM(COTI_DTOMONTO), SUM(COTI_ADICIONAL), SUM(COTI_IVAMONTO), SUM(COTI_EXTRA), 0, 0, 0, SUM(COTI_TOTAL)
            FROM COTIZACIONES CT, PREFIJOS P, terceros T, CLIENTES C
            where C.TERC_NIT = T.TERC_NIT AND T.TERC_CLIE = 'S' AND T.TERC_NIT >= :NITINI AND T.TERC_NIT <= :NITFIN AND TERC_NOM >= :NOMINI AND TERC_NOM <= :NOMFIN
             AND CT.TERC_NIT = T.terc_nit AND COTI_FECHA >= :FECINI AND COTI_FECHA <= :FECFIN AND COTI_ANULADO = 'N'
             AND P.PREF_PRE = CT.PREF_PRE AND P.TIDO_COD = 35 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            GROUP BY C.terc_nit
            INTO :NIT, :NOMBRE, :TELEFONO, :CIUDAD, :CODZONA, :DV, :CONTACTO,
            :APELLIDO1, :APELLIDO2, :NOMBRE1, :NOMBRE2, :CODCIU, :ultventa,
            :CANTIDAD, :DTO, :ADICIONAL, :IVA, :EXTRA, :RTFTE, :RTIVA, :RTICA, :TOTAL
            DO
            BEGIN
            SELECT ZONA_NOM FROM ZONAS WHERE ZONA_COD = :codzona INTO :NOMZONA;
            if (CANTIDAD IS NULL) then
                CANTIDAD = 0;
            if (DTO IS NULL) then
                DTO = 0;
            if (ADICIONAL IS NULL) then
                ADICIONAL = 0;
            if (IVA IS NULL) then
                IVA = 0;
            if (EXTRA IS NULL) then
                EXTRA = 0;
            if (RTFTE IS NULL) then
                RTFTE = 0;
            if (RTIVA IS NULL) then
                RTIVA = 0;
            if (RTICA IS NULL) then
                RTICA = 0;
            SUBTOTAL = TOTAL - EXTRA - IVA - ADICIONAL + DTO;
            NETO = TOTAL - RTFTE - RTIVA - RTICA;
            if (CEROS = 'S') then
              SUSPEND;
            ELSE
              if (CANTIDAD > 0) then
                SUSPEND;
            END
        END
    END
ELSE
    BEGIN
    if (BIN_AND(TIPO, 1) <> 0) then
        BEGIN
        SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 31 INTO :NOMTIPO;
        FOR SELECT FACT_ID, F.PREF_PRE, FACT_NUMERO, FACT_FECHA, FACT_DTOMONTO, FACT_ADICIONAL, FACT_IVAMONTO, FACT_EXTRA, FACT_TOTAL,
            FACT_RTFTEMONTO, FACT_RTIVAMONTO, FACT_RTICAMONTO, SUBSTRING(FACT_OBS FROM 1 FOR 255), FACT_DESPACHO, TERC_CONTACTO,
            T.TERC_NIT, TERC_NOM, ZONA_COD, TERC_TEL, TERC_CIU, TERC_DV, TERC_APELLIDO1, TERC_APELLIDO2, TERC_NOMBRE1, TERC_NOMBRE2, T.CIUD_COD, F.fact_sucursal, F.fact_transp
            FROM FACTURAS F, PREFIJOS P, terceros T, CLIENTES C
            where C.TERC_NIT = T.TERC_NIT AND T.TERC_CLIE = 'S' AND T.TERC_NIT >= :NITINI AND T.TERC_NIT <= :NITFIN AND TERC_NOM >= :NOMINI AND TERC_NOM <= :NOMFIN
             AND F.TERC_NIT = T.terc_nit AND FACT_FECHA >= :FECINI AND FACT_FECHA <= :FECFIN AND FACT_ANULADO = 'N'
             AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 31 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            ORDER BY FACT_FECHA, FACT_ID
            INTO :ID, :PREFIJO, :NUMERO, :FECDOC, :DTO, :ADICIONAL, :IVA, :EXTRA, :TOTAL, :RTFTE, :RTIVA, :RTICA, :obs, :despacho, :contacto,
            :nit, :nombre, :codzona, :telefono, :ciudad, :dv, :APELLIDO1, :APELLIDO2, :NOMBRE1, :NOMBRE2, :CODCIU, :sucursal, :transporta
            DO
            BEGIN
            EXECUTE PROCEDURE saldo_doc_cartera(31, :id, :fecfin, 0) returning_values (:saldo);
            abonos = TOTAL - SALDO;
            SELECT ZONA_NOM FROM ZONAS WHERE ZONA_COD = :codzona INTO :NOMZONA;
            SUBTOTAL = TOTAL - EXTRA - IVA - ADICIONAL + DTO;
            NETO = TOTAL - RTFTE - RTIVA - RTICA;
            SUSPEND;
            END
        END
    if (BIN_AND(TIPO, 2) <> 0) then
        BEGIN
        SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 32 INTO :NOMTIPO;
        FOR SELECT REVT_ID, R.PREF_PRE, REVT_NUMERO, REVT_FECHA, 0, 0, REVT_IVAMONTO, 0, REVT_TOTAL, 0, 0, 0, SUBSTRING(REVT_OBS FROM 1 FOR 255),
        T.TERC_NIT, TERC_NOM, ZONA_COD, TERC_TEL, TERC_CIU, TERC_DV, TERC_APELLIDO1, TERC_APELLIDO2, TERC_NOMBRE1, TERC_NOMBRE2, T.CIUD_COD, R.revt_sucursal, R.revt_transp, TERC_CONTACTO
            FROM REMISIONES_VENTA R, PREFIJOS P, terceros T, CLIENTES C
            where C.TERC_NIT = T.TERC_NIT AND T.TERC_CLIE = 'S' AND T.TERC_NIT >= :NITINI AND T.TERC_NIT <= :NITFIN AND TERC_NOM >= :NOMINI AND TERC_NOM <= :NOMFIN
             AND R.TERC_NIT = T.terc_nit AND REVT_FECHA >= :FECINI AND REVT_FECHA <= :FECFIN AND REVT_ANULADO = 'N'
             AND P.PREF_PRE = R.PREF_PRE AND P.TIDO_COD = 32 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            ORDER BY REVT_FECHA, REVT_ID
            INTO :ID, :PREFIJO, :NUMERO, :FECDOC, :DTO, :ADICIONAL, :IVA, :EXTRA, :TOTAL, :RTFTE, :RTIVA, :RTICA, :obs,
                :nit, :nombre, :codzona, :telefono, :ciudad, :DV, :APELLIDO1, :APELLIDO2, :NOMBRE1, :NOMBRE2, :CODCIU, :sucursal, :transporta, :contacto
            DO
            BEGIN
            SELECT ZONA_NOM FROM ZONAS WHERE ZONA_COD = :codzona INTO :NOMZONA;
            SUBTOTAL = TOTAL - EXTRA - IVA - ADICIONAL + DTO;
            NETO = TOTAL - RTFTE - RTIVA - RTICA;
            SUSPEND;
            END
        END
    if (BIN_AND(TIPO, 4) <> 0) then
        BEGIN
        transporta = '';
        SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 33 INTO :NOMTIPO;
        FOR SELECT DEVT_ID, V.PREF_PRE, DEVT_NUMERO, DEVT_FECHA, DEVT_DTOMONTO, DEVT_ADICIONAL, DEVT_IVAMONTO, DEVT_EXTRA, DEVT_TOTAL,
            DEVT_RTFTEMONTO, DEVT_RTIVAMONTO, DEVT_RTICAMONTO, SUBSTRING(DEVT_OBS FROM 1 FOR 255), TERC_CONTACTO,
            T.TERC_NIT, TERC_NOM, ZONA_COD, TERC_TEL, TERC_CIU, TERC_DV, TERC_APELLIDO1, TERC_APELLIDO2, TERC_NOMBRE1, TERC_NOMBRE2, T.CIUD_COD, V.devt_sucursal
            FROM DEVOLUCIONES_VENTAS V, PREFIJOS P, terceros T, CLIENTES C
            where C.TERC_NIT = T.TERC_NIT AND T.TERC_CLIE = 'S' AND T.TERC_NIT >= :NITINI AND T.TERC_NIT <= :NITFIN AND TERC_NOM >= :NOMINI AND TERC_NOM <= :NOMFIN
             AND V.TERC_NIT = T.terc_nit AND DEVT_FECHA >= :FECINI AND DEVT_FECHA <= :FECFIN AND DEVT_ANULADO = 'N'
             AND P.PREF_PRE = V.PREF_PRE AND P.TIDO_COD = 33 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) AND ((DEVT_REMID = 0) or (DEVT_REMID IS NULL)) AND ((DEVT_PEDID = 0) or (DEVT_PEDID IS NULL))
            ORDER BY DEVT_FECHA, DEVT_ID
            INTO :ID, :PREFIJO, :NUMERO, :FECDOC, :DTO, :ADICIONAL, :IVA, :EXTRA, :TOTAL, :RTFTE, :RTIVA, :RTICA, :obs, :contacto,
            :nit, :nombre, :codzona, :telefono, :ciudad, :DV, :APELLIDO1, :APELLIDO2, :NOMBRE1, :NOMBRE2, :CODCIU, :sucursal
            DO
            BEGIN
            EXECUTE PROCEDURE saldo_doc_cartera(33, :id, :fecfin, 0) returning_values (:saldo);
            abonos = TOTAL - SALDO;
            SELECT ZONA_NOM FROM ZONAS WHERE ZONA_COD = :codzona INTO :NOMZONA;
            SUBTOTAL = TOTAL - EXTRA - IVA - ADICIONAL + DTO;
            NETO = TOTAL - RTFTE - RTIVA - RTICA;
            CANTIDAD = CANTIDAD * -1;
            SUBTOTAL = SUBTOTAL * -1;
            TOTAL = TOTAL * -1;
            IVA = IVA * -1;
            EXTRA = EXTRA * -1;
            DTO = DTO * -1;
            ADICIONAL = ADICIONAL * -1;
            RTFTE = RTFTE * -1;
            RTIVA = RTIVA * -1;
            RTICA = RTICA * -1;
            SUSPEND;
            END
        END
    if (BIN_AND(TIPO, 8) <> 0) then
        BEGIN
        transporta = '';
        SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 34 INTO :NOMTIPO;
        FOR SELECT PEDI_ID, P.PREF_PRE, PEDI_NUMERO, PEDI_FECHA, PEDI_DTOMONTO, PEDI_ADICIONAL, PEDI_IVAMONTO, PEDI_EXTRA, PEDI_TOTAL,
            0, 0, 0, SUBSTRING(PEDI_OBS FROM 1 FOR 255), TERC_CONTACTO,
            T.TERC_NIT, TERC_NOM, ZONA_COD, TERC_TEL, TERC_CIU, TERC_DV, TERC_APELLIDO1, TERC_APELLIDO2, TERC_NOMBRE1, TERC_NOMBRE2, T.CIUD_COD, P.pedi_sucursal
            FROM PEDIDOS P, PREFIJOS PR, terceros T, CLIENTES C
            where C.TERC_NIT = T.TERC_NIT AND T.TERC_CLIE = 'S' AND T.TERC_NIT >= :NITINI AND T.TERC_NIT <= :NITFIN AND TERC_NOM >= :NOMINI AND TERC_NOM <= :NOMFIN
             AND P.TERC_NIT = T.terc_nit AND PEDI_FECHA >= :FECINI AND PEDI_FECHA <= :FECFIN AND PEDI_ANULADO = 'N'
             AND P.PREF_PRE = PR.PREF_PRE AND P.TIDO_COD = 34 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            ORDER BY PEDI_FECHA, PEDI_ID
            INTO :ID, :PREFIJO, :NUMERO, :FECDOC, :DTO, :ADICIONAL, :IVA, :EXTRA, :TOTAL, :RTFTE, :RTIVA, :RTICA, :obs, :contacto,
            :nit, :nombre, :codzona, :telefono, :ciudad, :DV, :APELLIDO1, :APELLIDO2, :NOMBRE1, :NOMBRE2, :CODCIU, :sucursal
            DO
            BEGIN
            SELECT ZONA_NOM FROM ZONAS WHERE ZONA_COD = :codzona INTO :NOMZONA;
            SUBTOTAL = TOTAL - EXTRA - IVA - ADICIONAL + DTO;
            NETO = TOTAL - RTFTE - RTIVA - RTICA;
            SUSPEND;
            END
        END
    if (BIN_AND(TIPO, 16) <> 0) then
        BEGIN
        transporta = '';
        SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 35 INTO :NOMTIPO;
        FOR SELECT COTI_ID, CT.PREF_PRE, COTI_NUMERO, COTI_FECHA, COTI_DTOMONTO, COTI_ADICIONAL, COTI_IVAMONTO, COTI_EXTRA, COTI_TOTAL,
            0, 0, 0, SUBSTRING(COTI_OBS FROM 1 FOR 255), TERC_CONTACTO,
            T.TERC_NIT, TERC_NOM, ZONA_COD, TERC_TEL, TERC_CIU, TERC_DV, TERC_APELLIDO1, TERC_APELLIDO2, TERC_NOMBRE1, TERC_NOMBRE2, T.CIUD_COD, CT.coti_sucursal
            FROM COTIZACIONES CT, PREFIJOS P, terceros T, CLIENTES C
            where C.TERC_NIT = T.TERC_NIT AND T.TERC_CLIE = 'S' AND T.TERC_NIT >= :NITINI AND T.TERC_NIT <= :NITFIN AND TERC_NOM >= :NOMINI AND TERC_NOM <= :NOMFIN
             AND CT.TERC_NIT = T.terc_nit AND COTI_FECHA >= :FECINI AND COTI_FECHA <= :FECFIN AND COTI_ANULADO = 'N'
             AND P.PREF_PRE = CT.PREF_PRE AND P.TIDO_COD = 35 AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            ORDER BY COTI_FECHA, COTI_ID
            INTO :ID, :PREFIJO, :NUMERO, :FECDOC, :DTO, :ADICIONAL, :IVA, :EXTRA, :TOTAL, :RTFTE, :RTIVA, :RTICA, :obs, :contacto,
            :nit, :nombre, :codzona, :telefono, :ciudad, :DV, :APELLIDO1, :APELLIDO2, :NOMBRE1, :NOMBRE2, :CODCIU, :sucursal
            DO
            BEGIN
            SELECT ZONA_NOM FROM ZONAS WHERE ZONA_COD = :codzona INTO :NOMZONA;
            SUBTOTAL = TOTAL - EXTRA - IVA - ADICIONAL + DTO;
            NETO = TOTAL - RTFTE - RTIVA - RTICA;
            SUSPEND;
            END
        END
    END
END^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER procedure REP_ARTICULOS_CLIENTE (
    TIPO integer,
    DETALLE char(1),
    TERINI varchar(20),
    TERFIN varchar(20),
    FECINI date,
    FECFIN date,
    ARTINI varchar(15),
    ARTFIN varchar(15),
    ORDEN char(1),
    CEROS char(1),
    SUBEMPRESA integer)
returns (
    NIT varchar(20),
    NOMBRE varchar(60),
    SUCURSAL varchar(10),
    DV char(1),
    CONTACTO varchar(255),
    CODCLI varchar(20),
    TELEFONO varchar(40),
    CIUDAD varchar(40),
    CODZONA varchar(2),
    NOMZONA varchar(30),
    NOMTIPO varchar(50),
    ARTICULO varchar(15),
    DESCRIPCION varchar(60),
    DESCORTA varchar(30),
    CODGRUPO varchar(2),
    NOMGRUPO varchar(30),
    CODSUBG varchar(3),
    NOMSUBG varchar(30),
    CODMARC varchar(3),
    NOMMARC varchar(30),
    UNIDAD varchar(8),
    CANTIDAD numeric(18,4),
    BASE numeric(18,2),
    IVA numeric(18,2),
    CONSUMO numeric(18,2),
    TOTAL numeric(18,2),
    PREFIJO varchar(4),
    NUMERO varchar(8),
    FECHA date,
    DTO numeric(9,2),
    TIPODOC integer)
AS
declare variable CODINI VARCHAR(15);
declare variable CODFIN VARCHAR(15);
declare variable DESINI VARCHAR(15);
declare variable DESFIN VARCHAR(15);
BEGIN
if (ORDEN = 'C') then
    BEGIN
    CODINI = ARTINI;
    CODFIN = ARTFIN;
    DESINI = '';
    DESFIN = 'zz';
    END
ELSE
    BEGIN
    DESINI = ARTINI;
    DESFIN = ARTFIN;
    CODINI = '';
    CODFIN = 'zz';
    END

SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = :TIPO INTO :NOMTIPO;
if (DETALLE = 'N') then
    BEGIN
    if (BIN_AND(TIPO, 1) <> 0) then
        BEGIN
        TIPODOC = 31;
        FOR SELECT SUM(FADE_CANT * FADE_FACTOR), SUM((FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO)*FACT_FACTOR), SUM(FADE_IVAMONTO*FACT_FACTOR), SUM(FADE_CONSUMO), SUM(FADE_TOTAL*FACT_FACTOR),
            max(D.ARTI_COD), MAX(ARTI_DES), MAX(ARTI_DESCORTA), MAX(ARTI_UNIDAD), MAX(GRUP_COD), MAX(SUBG_COD), MAX(MARC_COD), MAX(TERC_NIT), max(f.fact_sucursal)
            FROM FACTURAS_DETALLE D, FACTURAS F, PREFIJOS P, ARTICULO A
            WHERE F.FACT_ID = D.FACT_ID AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 31 AND D.ARTI_COD = A.ARTI_COD AND
            A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
            TERC_NIT >= :TERINI AND TERC_NIT <= :TERFIN AND FACT_ANULADO = 'N' AND
            FACT_FECHA >= :FECINI AND FACT_FECHA <= :FECFIN AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) and substring(a.arti_cod from 1 FOR 2) <> '.t'
            GROUP BY TERC_NIT, f.fact_sucursal, D.ARTI_COD
            INTO :CANTIDAD, :BASE, :IVA, :CONSUMO, :TOTAL, :ARTICULO, :DESCRIPCION, :DESCORTA, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC, :NIT, :sucursal
            DO
            BEGIN
            select S.clsu_nombre, TERC_TEL, TERC_CIU, C.ZONA_COD, TERC_DV, C.clie_cod, TERC_CONTACTO
                from terceros T, CLIENTES C, cliente_sucursales S
                where C.TERC_NIT = T.TERC_NIT AND T.TERC_NIT = :NIT AND C.terc_nit = S.terc_nit AND S.clcu_cod = :sucursal
                INTO :NOMBRE, :TELEFONO, :CIUDAD, :CODZONA, :DV, :CODCLI, :contacto;
            SELECT ZONA_NOM FROM ZONAS WHERE ZONA_COD = :CODZONA INTO :NOMZONA;
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            if (CANTIDAD IS NULL) then
                CANTIDAD = 0;
            if (BASE IS NULL) then
                BASE = 0;
            if (IVA IS NULL) then
                IVA = 0;
            if (CONSUMO IS NULL) then
                CONSUMO = 0;
            if (CEROS = 'S') then
                SUSPEND;
            ELSE
                if ((BASE <> 0) AND (CANTIDAD <> 0)) then
                    SUSPEND;
            END
        END
    if (BIN_AND(TIPO, 2) <> 0) then
        BEGIN
        TIPODOC = 32;
        FOR SELECT SUM(RVDE_CANT * RVDE_FACTOR), SUM(RVDE_TOTAL-RVDE_IVAMONTO-RVDE_CONSUMO), SUM(RVDE_IVAMONTO), SUM(RVDE_CONSUMO), SUM(RVDE_TOTAL),
            max(D.ARTI_COD), MAX(ARTI_DES), MAX(ARTI_DESCORTA), MAX(ARTI_UNIDAD), MAX(GRUP_COD), MAX(SUBG_COD), MAX(MARC_COD), MAX(TERC_NIT), max(r.revt_sucursal)
            FROM REMISIONES_VENTA_DETALLE D, REMISIONES_VENTA R, PREFIJOS P, ARTICULO A
            WHERE R.REVT_ID = D.REVT_ID AND P.PREF_PRE = R.PREF_PRE AND P.TIDO_COD = 32 AND D.ARTI_COD = A.ARTI_COD AND
            A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
            TERC_NIT >= :TERINI AND TERC_NIT <= :TERFIN AND REVT_FECHA >= :FECINI AND
            REVT_FECHA <= :FECFIN AND REVT_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            GROUP BY TERC_NIT, r.revt_sucursal, D.ARTI_COD
            INTO :CANTIDAD, :BASE, :IVA, :CONSUMO, :TOTAL, :ARTICULO, :DESCRIPCION, :DESCORTA, UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC, :NIT, :sucursal
            DO
            BEGIN
            select S.clsu_nombre, TERC_TEL, TERC_CIU, C.ZONA_COD, TERC_DV, C.clie_cod, TERC_CONTACTO
                from terceros T, CLIENTES C, cliente_sucursales S
                where C.TERC_NIT = T.TERC_NIT AND T.TERC_NIT = :NIT AND C.terc_nit = S.terc_nit AND S.clcu_cod = :sucursal
                INTO :NOMBRE, :TELEFONO, :CIUDAD, :CODZONA, :DV, :CODCLI, :contacto;
            SELECT ZONA_NOM FROM ZONAS WHERE ZONA_COD = :CODZONA INTO :NOMZONA;
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            if (CANTIDAD IS NULL) then
                CANTIDAD = 0;
            if (BASE IS NULL) then
                BASE = 0;
            if (IVA IS NULL) then
                IVA = 0;
            if (CONSUMO IS NULL) then
                CONSUMO = 0;
            if (CEROS = 'S') then
                SUSPEND;
            ELSE
                if ((BASE <> 0) AND (CANTIDAD <> 0)) then
                    SUSPEND;
            END
        END
    if (BIN_AND(TIPO, 4) <> 0) then
        BEGIN
        TIPODOC = 33;
        FOR SELECT SUM(DVDE_CANT * DVDE_FACTOR), SUM((DVDE_TOTAL-DVDE_IVAMONTO-DVDE_CONSUMO)*DEVT_FACTOR), SUM(DVDE_IVAMONTO*DEVT_FACTOR), SUM(DVDE_CONSUMO), SUM(DVDE_TOTAL*DEVT_FACTOR),
            max(D.ARTI_COD), MAX(ARTI_DES), MAX(ARTI_DESCORTA), MAX(ARTI_UNIDAD), MAX(GRUP_COD), MAX(SUBG_COD), MAX(MARC_COD), MAX(TERC_NIT), max(v.devt_sucursal)
            FROM devoluciones_ventas_detalle D, DEVOLUCIONES_VENTAS V, PREFIJOS P, ARTICULO A
            WHERE V.DEVT_ID = D.DEVT_ID AND P.PREF_PRE = V.PREF_PRE AND P.TIDO_COD = 33 AND D.ARTI_COD = A.ARTI_COD AND
            A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
            TERC_NIT >= :TERINI AND TERC_NIT <= :TERFIN AND DEVT_FECHA >= :FECINI and ((devt_remid is null) or (DEVT_REMID = 0)) AND
            DEVT_FECHA <= :FECFIN AND DEVT_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            GROUP BY TERC_NIT, v.devt_sucursal, D.ARTI_COD
            INTO :CANTIDAD, :BASE, :IVA, :CONSUMO, :TOTAL, :ARTICULO, :DESCRIPCION, :DESCORTA, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC, :NIT, :sucursal
            DO
            BEGIN
            select S.clsu_nombre, TERC_TEL, TERC_CIU, C.ZONA_COD, TERC_DV, C.clie_cod, TERC_CONTACTO
                from terceros T, CLIENTES C, cliente_sucursales S
                where C.TERC_NIT = T.TERC_NIT AND T.TERC_NIT = :NIT AND C.terc_nit = S.terc_nit AND S.clcu_cod = :sucursal
                INTO :NOMBRE, :TELEFONO, :CIUDAD, :CODZONA, :DV, :CODCLI, :contacto;
            SELECT ZONA_NOM FROM ZONAS WHERE ZONA_COD = :CODZONA INTO :NOMZONA;
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            if (CANTIDAD IS NULL) then
                CANTIDAD = 0;
            if (BASE IS NULL) then
                BASE = 0;
            if (IVA IS NULL) then
                IVA = 0;
            if (CONSUMO IS NULL) then
                CONSUMO = 0;
            CANTIDAD = CANTIDAD * -1;
            BASE = BASE * -1;
            TOTAL = TOTAL * -1;
            IVA = IVA * -1;
            CONSUMO = CONSUMO * -1;
            if (CEROS = 'S') then
                SUSPEND;
            ELSE
                if ((BASE <> 0) AND (CANTIDAD <> 0)) then
                    SUSPEND;
            END
        END
    if (BIN_AND(TIPO, 8) <> 0) then
        BEGIN
        TIPODOC = 34;
        FOR SELECT SUM(PEDE_CANT * PEDE_FACTOR), SUM((PEDE_TOTAL-PEDE_IVAMONTO-PEDE_CONSUMO)*PEDI_FACTOR), SUM(PEDE_IVAMONTO*PEDI_FACTOR), SUM(PEDE_CONSUMO), SUM(PEDE_TOTAL*PEDI_FACTOR),
            max(D.ARTI_COD), MAX(ARTI_DES), MAX(ARTI_DESCORTA), MAX(ARTI_UNIDAD), MAX(GRUP_COD), MAX(SUBG_COD), MAX(MARC_COD), MAX(TERC_NIT), max(p.pedi_sucursal)
            FROM PEDIDOS_DETALLE D, PEDIDOS P, PREFIJOS R, ARTICULO A
            WHERE P.PEDI_ID = D.PEDI_ID AND R.PREF_PRE = P.PREF_PRE AND R.TIDO_COD = 34 AND D.ARTI_COD = A.ARTI_COD AND
            A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
            TERC_NIT >= :TERINI AND TERC_NIT <= :TERFIN AND PEDI_FECHA >= :FECINI AND
            PEDI_FECHA <= :FECFIN AND PEDI_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            GROUP BY TERC_NIT, p.pedi_sucursal, D.ARTI_COD
            INTO :CANTIDAD, :BASE, :IVA, :CONSUMO, :TOTAL, :ARTICULO, :DESCRIPCION, :DESCORTA, UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC, :NIT, :sucursal
            DO
            BEGIN
            select S.clsu_nombre, TERC_TEL, TERC_CIU, C.ZONA_COD, TERC_DV, C.clie_cod, TERC_CONTACTO
                from terceros T, CLIENTES C, cliente_sucursales S
                where C.TERC_NIT = T.TERC_NIT AND T.TERC_NIT = :NIT AND C.terc_nit = S.terc_nit AND S.clcu_cod = :sucursal
                INTO :NOMBRE, :TELEFONO, :CIUDAD, :CODZONA, :DV, :codcli, :contacto;
            SELECT ZONA_NOM FROM ZONAS WHERE ZONA_COD = :CODZONA INTO :NOMZONA;
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            if (CANTIDAD IS NULL) then
                CANTIDAD = 0;
            if (BASE IS NULL) then
                BASE = 0;
            if (IVA IS NULL) then
                IVA = 0;
            if (CONSUMO IS NULL) then
                CONSUMO = 0;
            if (CEROS = 'S') then
                SUSPEND;
            ELSE
                if ((BASE <> 0) AND (CANTIDAD <> 0)) then
                    SUSPEND;
            END
        END
    if (BIN_AND(TIPO, 16) <> 0) then
        BEGIN
        TIPODOC = 35;
        FOR SELECT SUM(CTDE_CANT * CTDE_FACTOR), SUM((CTDE_TOTAL-CTDE_IVAMONTO-CTDE_CONSUMO)*COTI_FACTOR), SUM(CTDE_IVAMONTO*COTI_FACTOR), SUM(CTDE_CONSUMO), SUM(CTDE_TOTAL*COTI_FACTOR),
            max(D.ARTI_COD), MAX(ARTI_DES), MAX(ARTI_DESCORTA), MAX(ARTI_UNIDAD), MAX(GRUP_COD), MAX(SUBG_COD), MAX(MARC_COD), MAX(TERC_NIT), max(c.coti_sucursal)
            FROM COTIZACIONES_DETALLE D, COTIZACIONES C, PREFIJOS P, ARTICULO A
            WHERE C.COTI_ID = D.COTI_ID AND P.PREF_PRE = C.PREF_PRE AND P.TIDO_COD = 35 AND D.ARTI_COD = A.ARTI_COD AND
            A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
            TERC_NIT >= :TERINI AND TERC_NIT <= :TERFIN AND COTI_FECHA >= :FECINI AND
            COTI_FECHA <= :FECFIN AND COTI_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            GROUP BY TERC_NIT, c.coti_sucursal, D.ARTI_COD
            INTO :CANTIDAD, :BASE, :IVA, :CONSUMO, :TOTAL, :ARTICULO, :DESCRIPCION, :DESCORTA, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC, :NIT, :sucursal
            DO
            BEGIN
            select S.clsu_nombre, TERC_TEL, TERC_CIU, C.ZONA_COD, TERC_DV, C.clie_cod, TERC_CONTACTO
                from terceros T, CLIENTES C, cliente_sucursales S
                where C.TERC_NIT = T.TERC_NIT AND T.TERC_NIT = :NIT AND C.terc_nit = S.terc_nit AND S.clcu_cod = :sucursal
                INTO :NOMBRE, :TELEFONO, :CIUDAD, :CODZONA, :DV, :codcli, :contacto;
            SELECT ZONA_NOM FROM ZONAS WHERE ZONA_COD = :CODZONA INTO :NOMZONA;
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            if (CANTIDAD IS NULL) then
                CANTIDAD = 0;
            if (BASE IS NULL) then
                BASE = 0;
            if (IVA IS NULL) then
                IVA = 0;
            if (CONSUMO IS NULL) then
                CONSUMO = 0;
            if (CEROS = 'S') then
                SUSPEND;
            ELSE
                if ((BASE <> 0) AND (CANTIDAD <> 0)) then
                    SUSPEND;
            END
        END
    END
ELSE
    BEGIN
    if (BIN_AND(TIPO, 1) <> 0) then
        BEGIN
        TIPODOC = 31;
        FOR SELECT F.PREF_PRE, FACT_NUMERO, FACT_FECHA, FADE_CANT * FADE_FACTOR, FADE_PRUNIT/FADE_FACTOR*FACT_FACTOR, FADE_IVAMONTO*FACT_FACTOR, FADE_CONSUMO, FADE_DTOPORC, FADE_TOTAL*FACT_FACTOR,
            D.ARTI_COD, ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD, TERC_NIT, f.fact_sucursal, A.arti_descorta
            FROM FACTURAS F, FACTURAS_DETALLE D, PREFIJOS P, ARTICULO A
            WHERE F.FACT_ID = D.FACT_ID AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 31 AND D.ARTI_COD = A.ARTI_COD AND
            A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
            TERC_NIT >= :TERINI AND TERC_NIT <= :TERFIN AND FACT_FECHA >= :FECINI AND
            FACT_FECHA <= :FECFIN AND FACT_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) and substring(a.arti_cod from 1 FOR 2) <> '.t'
            ORDER BY TERC_NIT, f.fact_sucursal, ARTI_COD, FACT_FECHA
            INTO :PREFIJO, :NUMERO, :FECHA, CANTIDAD, :BASE, :IVA, :CONSUMO, :dto, :TOTAL,
            :ARTICULO, :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC, :NIT, :sucursal, :descorta
            DO
            BEGIN
            select S.clsu_nombre, TERC_TEL, TERC_CIU, C.ZONA_COD, TERC_DV, C.clie_cod, TERC_CONTACTO
                from terceros T, CLIENTES C, cliente_sucursales S
                where C.TERC_NIT = T.TERC_NIT AND T.TERC_NIT = :NIT AND C.terc_nit = S.terc_nit AND S.clcu_cod = :sucursal
                INTO :NOMBRE, :TELEFONO, :CIUDAD, :CODZONA, :DV, :codcli, :contacto;
            SELECT ZONA_NOM FROM ZONAS WHERE ZONA_COD = :CODZONA INTO :NOMZONA;
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            SUSPEND;
            END
        END
    if (BIN_AND(TIPO, 2) <> 0) then
        BEGIN
        TIPODOC = 32;
        FOR SELECT R.PREF_PRE, REVT_NUMERO, REVT_FECHA, RVDE_CANT * RVDE_FACTOR, RVDE_PRUNIT / RVDE_FACTOR, RVDE_IVAMONTO, RVDE_CONSUMO, RVDE_DTOPORC, RVDE_TOTAL,
            D.ARTI_COD, ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD, TERC_NIT, r.revt_sucursal, A.arti_descorta
            FROM REMISIONES_VENTA R, REMISIONES_VENTA_DETALLE D, PREFIJOS P, ARTICULO A
            WHERE R.REVT_ID = D.REVT_ID AND P.PREF_PRE = R.PREF_PRE AND P.TIDO_COD = 32 AND D.ARTI_COD = A.ARTI_COD AND
            A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
            TERC_NIT >= :TERINI AND TERC_NIT <= :TERFIN AND REVT_FECHA >= :FECINI AND
            REVT_FECHA <= :FECFIN AND REVT_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            ORDER BY TERC_NIT, r.revt_sucursal, ARTI_COD, REVT_FECHA
            INTO :PREFIJO, :NUMERO, :FECHA, CANTIDAD, :BASE, :IVA, :CONSUMO, :dto, :TOTAL,
            :ARTICULO, :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC, :NIT, :sucursal, :descorta
            DO
            BEGIN
            select S.clsu_nombre, TERC_TEL, TERC_CIU, C.ZONA_COD, TERC_DV, C.clie_cod, TERC_CONTACTO
                from terceros T, CLIENTES C, cliente_sucursales S
                where C.TERC_NIT = T.TERC_NIT AND T.TERC_NIT = :NIT AND C.terc_nit = S.terc_nit AND S.clcu_cod = :sucursal
                INTO :NOMBRE, :TELEFONO, :CIUDAD, :CODZONA, :DV, :codcli, :contacto;
            SELECT ZONA_NOM FROM ZONAS WHERE ZONA_COD = :CODZONA INTO :NOMZONA;
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            SUSPEND;
            END
        END
    if (BIN_AND(TIPO, 4) <> 0) then
        BEGIN
        TIPODOC = 33;
        FOR SELECT V.PREF_PRE, DEVT_NUMERO, DEVT_FECHA, DVDE_CANT * DVDE_FACTOR, DVDE_PRUNIT/DVDE_FACTOR*DEVT_FACTOR, DVDE_IVAMONTO*DEVT_FACTOR, DVDE_CONSUMO, DVDE_DTOPORC, DVDE_TOTAL*DEVT_FACTOR,
            D.ARTI_COD, ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD, TERC_NIT, v.devt_sucursal, A.arti_descorta
            FROM DEVOLUCIONES_VENTAS V, DEVOLUCIONES_VENTAS_DETALLE D, PREFIJOS P, ARTICULO A
            WHERE V.DEVT_ID = D.DEVT_ID AND P.PREF_PRE = V.PREF_PRE AND P.TIDO_COD = 33 AND D.ARTI_COD = A.ARTI_COD AND
            A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
            TERC_NIT >= :TERINI AND TERC_NIT <= :TERFIN AND DEVT_FECHA >= :FECINI and ((devt_remid is null) or (DEVT_REMID = 0)) AND
            DEVT_FECHA <= :FECFIN AND DEVT_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            ORDER BY TERC_NIT, v.devt_sucursal, ARTI_COD, DEVT_FECHA
            INTO :PREFIJO, :NUMERO, :FECHA, CANTIDAD, :BASE, :IVA, :CONSUMO, :dto, :TOTAL,
            :ARTICULO, :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC, :NIT, :sucursal, :descorta
            DO
            BEGIN
            select S.clsu_nombre, TERC_TEL, TERC_CIU, C.ZONA_COD, TERC_DV, C.clie_cod, TERC_CONTACTO
                from terceros T, CLIENTES C, cliente_sucursales S
                where C.TERC_NIT = T.TERC_NIT AND T.TERC_NIT = :NIT AND C.terc_nit = S.terc_nit AND S.clcu_cod = :sucursal
                INTO :NOMBRE, :TELEFONO, :CIUDAD, :CODZONA, :DV, :codcli, :contacto;
            SELECT ZONA_NOM FROM ZONAS WHERE ZONA_COD = :CODZONA INTO :NOMZONA;
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            CANTIDAD = CANTIDAD * -1;
            BASE = BASE * -1;
            TOTAL = TOTAL * -1;
            IVA = IVA * -1;
            CONSUMO = CONSUMO * -1;
            SUSPEND;
            END
        END
    if (BIN_AND(TIPO, 8) <> 0) then
        BEGIN
        TIPODOC = 34;
        FOR SELECT P.PREF_PRE, PEDI_NUMERO, PEDI_FECHA, PEDE_CANT * PEDE_FACTOR, PEDE_PRUNIT/PEDE_FACTOR*PEDI_FACTOR, PEDE_IVAMONTO*PEDI_FACTOR, PEDE_CONSUMO, PEDE_DTOPORC, PEDE_TOTAL*PEDI_FACTOR,
            D.ARTI_COD, ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD, TERC_NIT, p.pedi_sucursal, A.arti_descorta
            FROM PEDIDOS P, PEDIDOS_DETALLE D, PREFIJOS R, ARTICULO A
            WHERE P.PEDI_ID = D.PEDI_ID AND R.PREF_PRE = P.PREF_PRE AND R.TIDO_COD = 34 AND D.ARTI_COD = A.ARTI_COD AND
            A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
            TERC_NIT >= :TERINI AND TERC_NIT <= :TERFIN AND PEDI_FECHA >= :FECINI AND
            PEDI_FECHA <= :FECFIN AND PEDI_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            ORDER BY TERC_NIT, p.pedi_sucursal, ARTI_COD, PEDI_FECHA
            INTO :PREFIJO, :NUMERO, :FECHA, CANTIDAD, :BASE, :IVA, :CONSUMO, :dto, :TOTAL,
            :ARTICULO, :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC, :NIT, :sucursal, :descorta
            DO
            BEGIN
            select S.clsu_nombre, TERC_TEL, TERC_CIU, C.ZONA_COD, TERC_DV, C.clie_cod, TERC_CONTACTO
                from terceros T, CLIENTES C, cliente_sucursales S
                where C.TERC_NIT = T.TERC_NIT AND T.TERC_NIT = :NIT AND C.terc_nit = S.terc_nit AND S.clcu_cod = :sucursal
                INTO :NOMBRE, :TELEFONO, :CIUDAD, :CODZONA, :DV, :codcli, :contacto;
            SELECT ZONA_NOM FROM ZONAS WHERE ZONA_COD = :CODZONA INTO :NOMZONA;
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            SUSPEND;
            END
        END
    if (BIN_AND(TIPO, 16) <> 0) then
        BEGIN
        TIPODOC = 35;
        FOR SELECT C.PREF_PRE, COTI_NUMERO, COTI_FECHA, CTDE_CANT * CTDE_FACTOR, CTDE_PRUNIT/CTDE_FACTOR*COTI_FACTOR, CTDE_IVAMONTO*COTI_FACTOR, CTDE_CONSUMO, CTDE_DTOPORC, CTDE_TOTAL*COTI_FACTOR,
            D.ARTI_COD, ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD, TERC_NIT, c.coti_sucursal, A.arti_descorta
            FROM COTIZACIONES C, COTIZACIONES_DETALLE D, PREFIJOS P, ARTICULO A
            WHERE C.COTI_ID = D.COTI_ID AND P.PREF_PRE = C.PREF_PRE AND P.TIDO_COD = 34 AND D.ARTI_COD = A.ARTI_COD AND
            A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
            TERC_NIT >= :TERINI AND TERC_NIT <= :TERFIN AND COTI_FECHA >= :FECINI AND
            COTI_FECHA <= :FECFIN AND COTI_ANULADO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            ORDER BY TERC_NIT, c.coti_sucursal, ARTI_COD, COTI_FECHA
            INTO :PREFIJO, :NUMERO, :FECHA, CANTIDAD, :BASE, :IVA, :CONSUMO, :dto, :TOTAL,
            :ARTICULO, :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC, :NIT, :sucursal, :descorta
            DO
            BEGIN
            select S.clsu_nombre, TERC_TEL, TERC_CIU, C.ZONA_COD, TERC_DV, C.clie_cod, TERC_CONTACTO
                from terceros T, CLIENTES C, cliente_sucursales S
                where C.TERC_NIT = T.TERC_NIT AND T.TERC_NIT = :NIT AND C.terc_nit = S.terc_nit AND S.clcu_cod = :sucursal
                INTO :NOMBRE, :TELEFONO, :CIUDAD, :CODZONA, :DV, :codcli, :contacto;
            SELECT ZONA_NOM FROM ZONAS WHERE ZONA_COD = :CODZONA INTO :NOMZONA;
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            SUSPEND;
            END
        END
    END
END^

SET TERM ; ^

SET TERM ^ ;

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

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

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

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

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

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

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

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

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

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

                COSTO = COSTO + costounit * cantdet;
                END
            NOMGRUPO = '';
            NOMSUBG = '';
            NOMMARC = '';
            SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
            SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
            SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
            EXECUTE PROCEDURE costo_promedio (:ARTICULO, :FECFIN) RETURNING_VALUES (:COSTOUNIT);
            IF (CANTIDAD IS NULL) THEN
                CANTIDAD = 0;
            IF (BASE IS NULL) THEN
                BASE = 0;
            IF (IVA IS NULL) THEN
                IVA = 0;
            UTILIDAD = BASE - COSTO;
            IF (UOM = 'UTILIDAD') THEN
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') RETURNING_VALUES (PORC);
            ELSE
                EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') RETURNING_VALUES (PORC);
            IF (CEROS = 'S') THEN
                INSERT INTO REPORTES_AUX (REPA_ID, REPA_USER, REPA_ARTICULO) VALUES (3, USER, :ARTICULO);
            SUSPEND;
            END /* FOR */
        IF (CEROS = 'S') THEN
            BEGIN
            COSTO = 0;
            UTILIDAD = 0;
            PORC = 0;
            /* agregue los articulos sin factura */
            FOR SELECT ARTI_COD, 0, 0, 0, ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                FROM ARTICULO A WHERE A.ARTI_COD >= :CODINI AND A.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN
                INTO :ARTICULO, :CANTIDAD, :BASE, :IVA, :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC
                DO
                BEGIN
                SELECT COUNT(REPA_ARTICULO) FROM REPORTES_AUX WHERE REPA_ID = 3 AND REPA_USER = USER AND REPA_ARTICULO = :articulo INTO :numrows;
                IF (numrows = 0) THEN
                    BEGIN
                    NOMGRUPO = '';
                    NOMSUBG = '';
                    NOMMARC = '';
                    SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                    SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                    SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                    SUSPEND;
                    END
                END
            END
        END
    END
ELSE
    BEGIN
    IF (BIN_AND(TIPO, 1) <> 0) THEN
            BEGIN
            SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 31 INTO :NOMTIPO;
            FOR SELECT F.PREF_PRE, FACT_NUMERO, FACT_FECHA, ARTI_COD, FADE_CANT * FADE_FACTOR, (FADE_TOTAL-FADE_IVAMONTO-FADE_CONSUMO)*FACT_FACTOR,
                FADE_IVAMONTO*FACT_FACTOR, FADE_DTOPORC, FADE_TOTAL*FACT_FACTOR, F.terc_nit, F.fact_nomcliente, f.fact_sucursal
                FROM FACTURAS F, FACTURAS_DETALLE D, PREFIJOS P
                WHERE F.FACT_ID = D.FACT_ID AND FACT_FECHA >= :FECINI AND FACT_FECHA <= :FECFIN AND F.TERC_NIT >= :TERINI AND F.TERC_NIT <= :TERFIN AND FACT_ANULADO = 'N'
                 AND P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 31 AND ((SUCU_ID = :SUBEMPRESA) OR (:SUBEMPRESA = 0)) AND SUBSTRING(D.arti_cod FROM 1 FOR 2) <> '.t'
                 AND D.ARTI_COD >= :CODINI AND D.ARTI_COD <= :CODFIN AND D.fade_desc >= :DESINI AND D.fade_desc <= :DESFIN
                ORDER BY f.terc_nit, f.fact_sucursal, ARTI_COD, FACT_FECHA, F.FACT_ID, FADE_ITEM
                INTO :PREFIJO, :NUMERO, :FECHA, :ARTICULO, :CANTIDAD, :BASE, :IVA, :DTO, :TOTAL, :NIT, :nombre, :sucursal
                DO
                BEGIN
                SELECT ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                    FROM ARTICULO WHERE ARTI_COD = :ARTICULO
                    INTO :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC;
                NOMGRUPO = '';
                NOMSUBG = '';
                NOMMARC = '';
                SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                SELECT TERC_CONTACTO, TERC_TEL, TERC_CIU, C.ZONA_COD, ZONA_NOM
                    FROM terceros T, CLIENTES C, ZONAS Z WHERE T.TERC_NIT = :NIT AND T.terc_nit = C.terc_nit AND C.zona_cod = Z.zona_cod
                    INTO :contacto, :telefono, :ciudad, :codzona, :nomzona;
                IF (EXISTS (SELECT COST_SALP / COST_SALC FROM COSTOS C, MOVIMIENTO_ARTICULO M
                    WHERE COST_IDMOV = MVAR_CONS AND MVAR_TIPODOC = 31 AND MVAR_IDREF = :ID AND COST_SALC <> 0 AND MVAR_ITEM = :ITEM)) THEN
                    SELECT COST_SALP / COST_SALC, COST_ULTIMO FROM COSTOS C, MOVIMIENTO_ARTICULO M
                        WHERE COST_IDMOV = MVAR_CONS AND MVAR_TIPODOC = 31 AND MVAR_IDREF = :ID AND COST_SALC <> 0 AND MVAR_ITEM = :ITEM
                        INTO :costounit, :ultcos;
                ELSE
                    EXECUTE PROCEDURE costo_promedio_y_ultimo(:ARTICULO, :FECHA) RETURNING_VALUES (:costounit, :ultcos);
                IF (ULTIMO = 'S') THEN
                    COSTOUNIT = ultcos;
                /* EL FACTOR */
                FACCOST = 1;
                SELECT FIRST 1 FACO_FACTOR FROM factor_costo WHERE FACO_FECINI <= :FECHA AND FACO_FECFIN >= :FECHA INTO :FACCOST;
                COSTOUNIT = COSTOUNIT * FACCOST;

                COSTO = COSTOUNIT * CANTIDAD;
                UTILIDAD = BASE - COSTO;
                IF (UOM = 'UTILIDAD') THEN
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') RETURNING_VALUES (PORC);
                ELSE
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') RETURNING_VALUES (PORC);
                SUSPEND;
                END
            END
    IF (BIN_AND(TIPO, 2) <> 0) THEN
            BEGIN
            SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 32 INTO :NOMTIPO;
            FOR SELECT R.PREF_PRE, REVT_NUMERO, REVT_FECHA, ARTI_COD, RVDE_CANT * RVDE_FACTOR,
                (RVDE_TOTAL - RVDE_IVAMONTO), RVDE_IVAMONTO, RVDE_DTOPORC, RVDE_TOTAL, R.terc_nit, R.revt_nomterc, r.revt_sucursal
                FROM REMISIONES_VENTA R, REMISIONES_VENTA_DETALLE D, PREFIJOS P
                WHERE R.REVT_ID = D.REVT_ID AND REVT_FECHA >= :FECINI AND REVT_FECHA <= :FECFIN AND R.TERC_NIT >= :TERINI AND R.TERC_NIT <= :TERFIN AND REVT_ANULADO = 'N'
                 AND P.PREF_PRE = R.PREF_PRE AND P.TIDO_COD = 32 AND ((SUCU_ID = :SUBEMPRESA) OR (:SUBEMPRESA = 0))
                 AND D.ARTI_COD >= :CODINI AND D.ARTI_COD <= :CODFIN AND D.rvde_desc >= :DESINI AND D.rvde_desc <= :DESFIN
                ORDER BY r.terc_nit, r.revt_sucursal, ARTI_COD, REVT_FECHA, R.REVT_ID, RVDE_ITEM
                INTO :PREFIJO, :NUMERO, :FECHA, :ARTICULO, :CANTIDAD, :BASE, :IVA, :DTO, :TOTAL, :NIT, :nombre, :sucursal
                DO
                BEGIN
                SELECT ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                    FROM ARTICULO WHERE ARTI_COD = :ARTICULO
                    INTO :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC;
                NOMGRUPO = '';
                NOMSUBG = '';
                NOMMARC = '';
                SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                SELECT TERC_CONTACTO, TERC_TEL, TERC_CIU, C.ZONA_COD, ZONA_NOM
                    FROM terceros T, CLIENTES C, ZONAS Z WHERE T.TERC_NIT = :NIT AND T.terc_nit = C.terc_nit AND C.zona_cod = Z.zona_cod
                    INTO :contacto, :telefono, :ciudad, :codzona, :nomzona;
                IF (EXISTS (SELECT COST_SALP / COST_SALC FROM COSTOS C, MOVIMIENTO_ARTICULO M
                    WHERE COST_IDMOV = MVAR_CONS AND MVAR_TIPODOC = 32 AND MVAR_IDREF = :ID AND COST_SALC <> 0 AND MVAR_ITEM = :ITEM)) THEN
                    SELECT COST_SALP / COST_SALC, COST_ULTIMO FROM COSTOS C, MOVIMIENTO_ARTICULO M
                        WHERE COST_IDMOV = MVAR_CONS AND MVAR_TIPODOC = 32 AND MVAR_IDREF = :ID AND COST_SALC <> 0 AND MVAR_ITEM = :ITEM
                        INTO :costounit, :ultcos;
                ELSE
                    EXECUTE PROCEDURE costo_promedio_y_ultimo(:ARTICULO, :FECHA) RETURNING_VALUES (:costounit, :ultcos);
                IF (ULTIMO = 'S') THEN
                    COSTOUNIT = ultcos;
                /* EL FACTOR */
                FACCOST = 1;
                SELECT FIRST 1 FACO_FACTOR FROM factor_costo WHERE FACO_FECINI <= :FECHA AND FACO_FECFIN >= :FECHA INTO :FACCOST;
                COSTOUNIT = COSTOUNIT * FACCOST;

                COSTO = COSTOUNIT * CANTIDAD;
                UTILIDAD = BASE - COSTO;
                IF (UOM = 'UTILIDAD') THEN
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') RETURNING_VALUES (PORC);
                ELSE
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') RETURNING_VALUES (PORC);
                SUSPEND;
                END
            END
    IF (BIN_AND(TIPO, 4) <> 0) THEN
            BEGIN
            SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 33 INTO :NOMTIPO;
            FOR SELECT V.PREF_PRE, DEVT_NUMERO, DEVT_FECHA, ARTI_COD, DVDE_CANT * DVDE_FACTOR, (DVDE_TOTAL-DVDE_IVAMONTO-DVDE_CONSUMO)*DEVT_FACTOR,
                DVDE_IVAMONTO*DEVT_FACTOR, DVDE_DTOPORC, DVDE_TOTAL*DEVT_FACTOR, V.terc_nit, V.devt_nomterc, v.devt_sucursal
                FROM DEVOLUCIONES_VENTAS V, DEVOLUCIONES_VENTAS_DETALLE D, PREFIJOS P
                WHERE V.DEVT_ID = D.DEVT_ID AND DEVT_FECHA >= :FECINI AND DEVT_FECHA <= :FECFIN AND V.TERC_NIT >= :TERINI AND V.TERC_NIT <= :TERFIN AND DEVT_ANULADO = 'N'
                 AND P.PREF_PRE = V.PREF_PRE AND P.TIDO_COD = 33 AND ((SUCU_ID = :SUBEMPRESA) OR (:SUBEMPRESA = 0))  AND SUBSTRING(D.arti_cod FROM 1 FOR 2) <> '.t'
                 AND D.ARTI_COD >= :CODINI AND D.ARTI_COD <= :CODFIN AND D.dvde_desc >= :DESINI AND D.dvde_desc <= :DESFIN
                ORDER BY v.terc_nit, v.devt_sucursal, ARTI_COD, DEVT_FECHA, D.DEVT_ID, DVDE_ITEM
                INTO :PREFIJO, :NUMERO, :FECHA, :ARTICULO, :CANTIDAD, :BASE, :IVA, :DTO, :TOTAL, :NIT, :nombre, :sucursal
                DO
                BEGIN
                SELECT ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                    FROM ARTICULO WHERE ARTI_COD = :ARTICULO
                    INTO :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC;
                NOMGRUPO = '';
                NOMSUBG = '';
                NOMMARC = '';
                SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                SELECT TERC_CONTACTO, TERC_TEL, TERC_CIU, C.ZONA_COD, ZONA_NOM
                    FROM terceros T, CLIENTES C, ZONAS Z WHERE T.TERC_NIT = :NIT AND T.terc_nit = C.terc_nit AND C.zona_cod = Z.zona_cod
                    INTO :contacto, :telefono, :ciudad, :codzona, :nomzona;
                IF (EXISTS (SELECT COST_ENTP / COST_ENTC FROM COSTOS C, MOVIMIENTO_ARTICULO M
                    WHERE COST_IDMOV = MVAR_CONS AND MVAR_TIPODOC = 33 AND MVAR_IDREF = :ID AND COST_ENTC <> 0 AND MVAR_ITEM = :ITEM)) THEN
                    SELECT COST_ENTP / COST_ENTC, COST_ULTIMO FROM COSTOS C, MOVIMIENTO_ARTICULO M
                        WHERE COST_IDMOV = MVAR_CONS AND MVAR_TIPODOC = 33 AND MVAR_IDREF = :ID AND COST_ENTC <> 0 AND MVAR_ITEM = :ITEM
                        INTO :costounit, :ultcos;
                ELSE
                    EXECUTE PROCEDURE costo_promedio_y_ultimo(:ARTICULO, :FECHA) RETURNING_VALUES (:costounit, :ultcos);
                IF (ULTIMO = 'S') THEN
                    COSTOUNIT = ultcos;
                /* EL FACTOR */
                FACCOST = 1;
                SELECT FIRST 1 FACO_FACTOR FROM factor_costo WHERE FACO_FECINI <= :FECHA AND FACO_FECFIN >= :FECHA INTO :FACCOST;
                COSTOUNIT = COSTOUNIT * FACCOST;

                COSTO = COSTOUNIT * CANTIDAD;
                UTILIDAD = BASE - COSTO;
                IF (UOM = 'UTILIDAD') THEN
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') RETURNING_VALUES (PORC);
                ELSE
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') RETURNING_VALUES (PORC);
                TOTAL = TOTAL * -1;
                IVA = IVA * -1;
                BASE = BASE * -1;
                CANTIDAD = CANTIDAD * -1;
                COSTO = COSTO * -1;
                UTILIDAD = UTILIDAD * -1;
                SUSPEND;
                END
            END
    IF (BIN_AND(TIPO, 8) <> 0) THEN
            BEGIN
            SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 34 INTO :NOMTIPO;
            FOR SELECT P.PREF_PRE, PEDI_NUMERO, PEDI_FECHA, ARTI_COD, PEDE_CANT * PEDE_FACTOR, (PEDE_TOTAL-PEDE_IVAMONTO-PEDE_CONSUMO)*PEDI_FACTOR,
                PEDE_IVAMONTO*PEDI_FACTOR, PEDE_DTOPORC, PEDE_TOTAL*PEDI_FACTOR, P.terc_nit, P.pedi_nomterc, p.pedi_sucursal
                FROM PEDIDOS P, PEDIDOS_DETALLE D, PREFIJOS PR
                WHERE P.PEDI_ID = D.PEDI_ID AND PEDI_FECHA >= :FECINI AND PEDI_FECHA <= :FECFIN AND P.TERC_NIT >= :TERINI AND P.TERC_NIT <= :TERFIN AND PEDI_ANULADO = 'N'
                 AND P.PREF_PRE = PR.PREF_PRE AND P.TIDO_COD = 34 AND ((SUCU_ID = :SUBEMPRESA) OR (:SUBEMPRESA = 0))
                 AND D.ARTI_COD >= :CODINI AND D.ARTI_COD <= :CODFIN AND D.pede_desc >= :DESINI AND D.pede_desc <= :DESFIN
                ORDER BY p.terc_nit, p.pedi_sucursal, ARTI_COD, PEDI_FECHA, P.PEDI_ID, PEDE_ITEM
                INTO :PREFIJO, :NUMERO, :FECHA, :ARTICULO, :CANTIDAD, :BASE, :IVA, :DTO, :TOTAL, :NIT, :nombre, :sucursal
                DO
                BEGIN
                SELECT ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                    FROM ARTICULO WHERE ARTI_COD = :ARTICULO
                    INTO :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC;
                NOMGRUPO = '';
                NOMSUBG = '';
                NOMMARC = '';
                SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                SELECT TERC_CONTACTO, TERC_TEL, TERC_CIU, C.ZONA_COD, ZONA_NOM
                    FROM terceros T, CLIENTES C, ZONAS Z WHERE T.TERC_NIT = :NIT AND T.terc_nit = C.terc_nit AND C.zona_cod = Z.zona_cod
                    INTO :contacto, :telefono, :ciudad, :codzona, :nomzona;
                EXECUTE PROCEDURE costo_promedio_y_ultimo(:ARTICULO, :FECHA) RETURNING_VALUES (:costounit, :ultcos);
                IF (ULTIMO = 'S') THEN
                    COSTOUNIT = ultcos;
                /* EL FACTOR */
                FACCOST = 1;
                SELECT FIRST 1 FACO_FACTOR FROM factor_costo WHERE FACO_FECINI <= :FECHA AND FACO_FECFIN >= :FECHA INTO :FACCOST;
                COSTOUNIT = COSTOUNIT * FACCOST;

                COSTO = COSTOUNIT * CANTIDAD;
                UTILIDAD = BASE - COSTO;
                IF (UOM = 'UTILIDAD') THEN
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') RETURNING_VALUES (PORC);
                ELSE
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') RETURNING_VALUES (PORC);
                SUSPEND;
                END
            END
    IF (BIN_AND(TIPO, 16) <> 0) THEN
            BEGIN
            SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 35 INTO :NOMTIPO;
            FOR SELECT C.PREF_PRE, COTI_NUMERO, COTI_FECHA, ARTI_COD, CTDE_CANT * CTDE_FACTOR, (CTDE_TOTAL-CTDE_IVAMONTO-CTDE_CONSUMO)*COTI_FACTOR,
                CTDE_IVAMONTO*COTI_FACTOR, CTDE_DTOPORC, CTDE_TOTAL*COTI_FACTOR, C.terc_nit, C.coti_nomterc, c.coti_sucursal
                FROM COTIZACIONES C, COTIZACIONES_DETALLE D, PREFIJOS P
                WHERE C.COTI_ID = D.COTI_ID AND ARTI_COD = :ARTICULO AND COTI_FECHA >= :FECINI AND COTI_FECHA <= :FECFIN AND C.TERC_NIT >= :TERINI AND C.TERC_NIT <= :TERFIN AND COTI_ANULADO = 'N'
                 AND P.PREF_PRE = C.PREF_PRE AND P.TIDO_COD = 35 AND ((SUCU_ID = :SUBEMPRESA) OR (:SUBEMPRESA = 0))
                 AND D.ARTI_COD >= :CODINI AND D.ARTI_COD <= :CODFIN AND D.ctde_desc >= :DESINI AND D.ctde_desc <= :DESFIN
                ORDER BY c.terc_nit, c.coti_sucursal, COTI_FECHA, C.COTI_ID, CTDE_ITEM
                INTO :PREFIJO, :NUMERO, :FECHA, :ARTICULO, :CANTIDAD, :BASE, :IVA, :DTO, :TOTAL, :NIT, :nombre, :sucursal
                DO
                BEGIN
                SELECT ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                    FROM ARTICULO WHERE ARTI_COD = :ARTICULO
                    INTO :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC;
                NOMGRUPO = '';
                NOMSUBG = '';
                NOMMARC = '';
                SELECT GRUP_NOM FROM GRUPO G WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                SELECT TERC_CONTACTO, TERC_TEL, TERC_CIU, C.ZONA_COD, ZONA_NOM
                    FROM terceros T, CLIENTES C, ZONAS Z WHERE T.TERC_NIT = :NIT AND T.terc_nit = C.terc_nit AND C.zona_cod = Z.zona_cod
                    INTO :contacto, :telefono, :ciudad, :codzona, :nomzona;
                EXECUTE PROCEDURE costo_promedio_y_ultimo(:ARTICULO, :FECHA) RETURNING_VALUES (:costounit, :ultcos);
                IF (ULTIMO = 'S') THEN
                    COSTOUNIT = ultcos;
                /* EL FACTOR */
                FACCOST = 1;
                SELECT FIRST 1 FACO_FACTOR FROM factor_costo WHERE FACO_FECINI <= :FECHA AND FACO_FECFIN >= :FECHA INTO :FACCOST;
                COSTOUNIT = COSTOUNIT * FACCOST;

                COSTO = COSTOUNIT * CANTIDAD;
                UTILIDAD = BASE - COSTO;
                IF (UOM = 'UTILIDAD') THEN
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  COSTO, 'N') RETURNING_VALUES (PORC);
                ELSE
                    EXECUTE PROCEDURE PORCENTAJE (utilidad,  BASE, 'S') RETURNING_VALUES (PORC);
                SUSPEND;
                END
            END
    END
END^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER procedure REP_FALTANTES_CLIENTES (
    TERINI varchar(20),
    TERFIN varchar(20),
    FECINI date,
    FECFIN date,
    DETALLE char(1),
    TIPO integer,
    DESTINO integer,
    ARTINI varchar(15),
    ARTFIN varchar(15),
    ORDEN char(1),
    CEROS char(1),
    CORTE date,
    SUBEMPRESA integer)
returns (
    NIT varchar(20),
    SUCURSAL varchar(10),
    NOMBRE varchar(60),
    TELEFONO varchar(40),
    CONTACTO varchar(255),
    CIUDAD varchar(40),
    CODZONA varchar(2),
    NOMZONA varchar(60),
    NOMTIPO varchar(50),
    ARTICULO varchar(15),
    DESCRIPCION varchar(60),
    CODGRUPO varchar(2),
    NOMGRUPO varchar(30),
    CODSUBG varchar(3),
    NOMSUBG varchar(30),
    CODMARC varchar(3),
    NOMMARC varchar(30),
    CANTIDAD numeric(18,4),
    UNIDAD varchar(8),
    FALTANTE numeric(18,4),
    BASE numeric(18,2),
    IVA numeric(18,2),
    PREFIJO varchar(4),
    NUMERO varchar(8),
    FECHA date,
    PTVTA integer,
    OBS varchar(255))
AS
declare variable ID INTEGER;
declare variable ITEM INTEGER;
declare variable CODINI VARCHAR(15);
declare variable CODFIN VARCHAR(15);
declare variable DESINI VARCHAR(15);
declare variable DESFIN VARCHAR(15);
declare variable FACTOR NUMERIC(18,4);
declare variable CANT NUMERIC(18,4);
declare variable MONTO NUMERIC(18,2);
declare variable artiaux VARCHAR(20);
BEGIN
if (ORDEN = 'C') then
    BEGIN
    CODINI = ARTINI;
    CODFIN = ARTFIN;
    DESINI = '';
    DESFIN = 'zz';
    END
ELSE
    BEGIN
    DESINI = ARTINI;
    DESFIN = ARTFIN;
    CODINI = '';
    CODFIN = 'zz';
    END
SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = :TIPO INTO :NOMTIPO;
/*FOR select T.TERC_NIT, TERC_NOM,  TERC_TEL, TERC_CIU, ZONA_COD
    from terceros T, CLIENTES C*/
FOR select c.terc_nit,s.clsu_nombre,s.clsu_tel,s.clsu_ciudad,s.zona_cod,s.clcu_cod
    from clientes c, cliente_sucursales s
    where C.TERC_NIT = s.TERC_NIT and C.TERC_NIT >= :TERINI AND C.TERC_NIT <= :TERFIN
    INTO :NIT, :NOMBRE, :TELEFONO, :CIUDAD, :CODZONA, :sucursal
    DO  
    BEGIN
    SELECT TERC_CONTACTO FROM TERCEROS WHERE TERC_NIT = :NIT INTO :CONTACTO;
    CANTIDAD = 0;
    FALTANTE = 0;
    BASE = 0;
    SELECT ZONA_NOM FROM ZONAS WHERE ZONA_COD = :CODZONA INTO :NOMZONA;
    if (DETALLE = 'N') then
        BEGIN
        ARTICULO = '';
        if (TIPO = 31) then
            FOR SELECT F.FACT_ID, FADE_ITEM, D.ARTI_COD, FADE_CANT * FADE_FACTOR, (FADE_PRUNIT-FADE_DTOMONTO), F.ptvt_id
                FROM FACTURAS_DETALLE D, FACTURAS F, ARTICULO A, PREFIJOS P
                WHERE F.FACT_ID = D.FACT_ID AND FACT_FECHA >= :FECINI AND FACT_FECHA <= :FECFIN AND TERC_NIT = :NIT AND FACT_ANULADO = 'N' AND
                      D.ARTI_COD = A.ARTI_COD AND D.ARTI_COD >= :CODINI AND D.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
                      P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 31 AND ((P.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) and f.fact_sucursal = :sucursal and substring(a.arti_cod from 1 FOR 2) <> '.t'
                ORDER BY ARTI_COD, F.FACT_ID, FADE_ITEM INTO :ID, :ITEM, :ARTIAUX, :CANT,  :MONTO, :PTVTA
                DO
                BEGIN
                if (artiaux <> articulo) then
                    begin
                    if (ARTICULO <> '') then
                        SUSPEND;
                    SELECT ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                        FROM articulo WHERE ARTI_COD = :ARTIAUX
                        INTO :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC;
                    SELECT GRUP_NOM FROM GRUPO 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;
                    ARTICULO = ARTIAUX;
                    CANTIDAD = 0;
                    FALTANTE = 0;
                    BASE = 0;
                    end
                CANTIDAD = CANTIDAD + CANT;
                EXECUTE PROCEDURE FALTANTE_CORTE(:TIPO, :DESTINO, :ID, :ITEM, :CORTE) returning_values (:CANT, :UNIDAD, :FACTOR);
                FALTANTE = FALTANTE + CANT;
                BASE = BASE + (MONTO * CANT);
                END
        if (TIPO = 32) then
            FOR SELECT R.revt_id, rvde_item, D.ARTI_COD, RVDE_CANT * RVDE_FACTOR, (RVDE_PRUNIT-RVDE_DTOMONTO), R.ptvt_id
                FROM REMISIONES_VENTA_DETALLE D, REMISIONES_VENTA R, ARTICULO A, PREFIJOS P
                WHERE R.REVT_ID = D.REVT_ID AND REVT_FECHA >= :FECINI AND REVT_FECHA <= :FECFIN AND TERC_NIT = :NIT AND REVT_ANULADO = 'N' AND
                      D.ARTI_COD = A.ARTI_COD AND D.ARTI_COD >= :CODINI AND D.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
                      P.PREF_PRE = R.PREF_PRE AND P.TIDO_COD = 32 AND ((P.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) and r.revt_sucursal = :sucursal
                ORDER BY ARTI_COD, R.REVT_ID, RVDE_ITEM INTO :ID, :ITEM, :ARTIAUX, :CANT, :MONTO, :PTVTA
                DO
                BEGIN
                if (artiaux <> articulo) then
                    begin
                    if (ARTICULO <> '') then
                        SUSPEND;
                    SELECT ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                        FROM articulo WHERE ARTI_COD = :ARTIAUX
                        INTO :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC;
                    SELECT GRUP_NOM FROM GRUPO 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;
                    ARTICULO = ARTIAUX;
                    CANTIDAD = 0;
                    FALTANTE = 0;
                    BASE = 0;
                    end
                CANTIDAD = CANTIDAD + CANT;
                EXECUTE PROCEDURE FALTANTE_CORTE(:TIPO, :DESTINO, :ID, :ITEM, :CORTE) returning_values (:CANT, :UNIDAD, :FACTOR);
                FALTANTE = FALTANTE + CANT;
                BASE = BASE + (MONTO * CANT);
                END
        if (TIPO = 34) then
            FOR SELECT P.PEDI_ID, PEDE_ITEM, D.ARTI_COD, PEDE_CANT * PEDE_FACTOR, (PEDE_PRUNIT-PEDE_DTOMONTO), P.ptvt_id
                FROM PEDIDOS_DETALLE D, PEDIDOS P, ARTICULO A, PREFIJOS PR
                WHERE P.PEDI_ID = D.PEDI_ID AND PEDI_FECHA >= :FECINI AND PEDI_FECHA <= :FECFIN AND TERC_NIT = :NIT AND PEDI_ANULADO = 'N' AND PEDI_VALIDEZ >= 0 AND
                      D.ARTI_COD = A.ARTI_COD AND D.ARTI_COD >= :CODINI AND D.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
                      PR.PREF_PRE = P.PREF_PRE AND PR.TIDO_COD = 34 AND ((PR.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) and p.pedi_sucursal = :sucursal
                ORDER BY ARTI_COD, P.PEDI_ID, PEDE_ITEM INTO :ID, :ITEM, :ARTIAUX, :CANT, :MONTO, :PTVTA
                DO
                BEGIN
                if (artiaux <> articulo) then
                    begin
                    if (ARTICULO <> '') then
                        SUSPEND;
                    SELECT ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                        FROM articulo WHERE ARTI_COD = :ARTIAUX
                        INTO :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC;
                    SELECT GRUP_NOM FROM GRUPO 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;
                    ARTICULO = ARTIAUX;
                    CANTIDAD = 0;
                    FALTANTE = 0;
                    BASE = 0;
                    end
                CANTIDAD = CANTIDAD + CANT;
                EXECUTE PROCEDURE FALTANTE_CORTE(:TIPO, :DESTINO, :ID, :ITEM, :CORTE) returning_values (:CANT, :UNIDAD, :FACTOR);
                FALTANTE = FALTANTE + CANT;
                BASE = BASE + (MONTO * CANT);
                END
        if (TIPO = 35) then
            FOR SELECT C.COTI_ID, CTDE_ITEM, D.ARTI_COD, CTDE_CANT * CTDE_FACTOR, (CTDE_PRUNIT-CTDE_DTOMONTO), C.ptvt_id
                FROM COTIZACIONES_DETALLE D, COTIZACIONES C, ARTICULO A, PREFIJOS P
                WHERE C.COTI_ID = D.COTI_ID AND COTI_FECHA >= :FECINI AND COTI_FECHA <= :FECFIN AND TERC_NIT = :NIT AND COTI_ANULADO = 'N' AND
                      D.ARTI_COD = A.ARTI_COD AND D.ARTI_COD >= :CODINI AND D.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
                      P.PREF_PRE = C.PREF_PRE AND P.TIDO_COD = 35 AND ((P.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) and c.coti_sucursal = :sucursal
                ORDER BY ARTI_COD, C.COTI_ID, CTDE_ITEM INTO :ID, :ITEM, :ARTIAUX, :CANT, :MONTO, :PTVTA
                DO
                BEGIN
                if (artiaux <> articulo) then
                    begin
                    if (ARTICULO <> '') then
                        SUSPEND;
                    SELECT ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                        FROM articulo WHERE ARTI_COD = :ARTIAUX
                        INTO :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC;
                    SELECT GRUP_NOM FROM GRUPO 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;
                    ARTICULO = ARTIAUX;
                    CANTIDAD = 0;
                    FALTANTE = 0;
                    BASE = 0;
                    end
                CANTIDAD = CANTIDAD + CANT;
                EXECUTE PROCEDURE FALTANTE_CORTE(:TIPO, :DESTINO, :ID, :ITEM, :CORTE) returning_values (:CANT, :UNIDAD, :FACTOR);
                FALTANTE = FALTANTE + CANT;
                BASE = BASE + (MONTO * CANT);
                END
        if (TIPO = 40) then
            FOR SELECT P.pend_id, D.pevd_item, D.ARTI_COD, D.pevd_cant * D.pevd_factor, (D.pevd_prunit-D.pevd_dtomonto)
                FROM pendiente_ventas_detalle D, pendiente_ventas P, ARTICULO A, PREFIJOS PR
                WHERE P.pend_id = D.pend_id AND PEND_FECHA >= :FECINI AND PEND_FECHA <= :FECFIN AND TERC_NIT = :NIT AND PEND_ANULADO = 'N' AND
                      D.ARTI_COD = A.ARTI_COD AND D.ARTI_COD >= :CODINI AND D.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
                      PR.PREF_PRE = P.PREF_PRE AND PR.TIDO_COD = 40 AND ((PR.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) and p.pend_sucursal = :sucursal
                ORDER BY ARTI_COD, P.pend_id, D.pevd_item INTO :ID, :ITEM, :ARTIAUX, :CANT, :MONTO
                DO
                BEGIN
                if (artiaux <> articulo) then
                    begin
                    if (ARTICULO <> '') then
                        SUSPEND;
                    SELECT ARTI_DES, ARTI_UNIDAD, GRUP_COD, SUBG_COD, MARC_COD
                        FROM articulo WHERE ARTI_COD = :ARTIAUX
                        INTO :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC;
                    SELECT GRUP_NOM FROM GRUPO 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;
                    ARTICULO = ARTIAUX;
                    CANTIDAD = 0;
                    FALTANTE = 0;
                    BASE = 0;
                    end
                CANTIDAD = CANTIDAD + CANT;
                EXECUTE PROCEDURE FALTANTE(:TIPO, :DESTINO, :ID, :ITEM) returning_values (:CANT, :UNIDAD, :FACTOR);
                FALTANTE = FALTANTE + CANT;
                BASE = BASE + (MONTO * CANT);
                END
        if (FALTANTE IS NULL) then
            FALTANTE = 0;
        if (BASE IS NULL) then
            BASE = 0;
        if (IVA IS NULL) then
            IVA = 0;
        if ((CEROS = 'S') or (FALTANTE <> 0)) then
            SUSPEND;
        END
    ELSE
        BEGIN
        if (TIPO = 31) then
            FOR SELECT F.FACT_ID, FADE_ITEM, F.PREF_PRE, FACT_NUMERO, FACT_FECHA, FADE_CANT * FADE_FACTOR, (FADE_PRUNIT-FADE_DTOMONTO), FADE_IVAMONTO, D.ARTI_COD, ARTI_DES, ARTI_UNIDAD, A.GRUP_COD, A.SUBG_COD, A.MARC_COD, SUBSTRING(FACT_OBS FROM 1 FOR 255), F.ptvt_id
                FROM FACTURAS F, FACTURAS_DETALLE D, ARTICULO A, PREFIJOS P
                WHERE F.FACT_ID = D.FACT_ID AND FACT_FECHA >= :FECINI AND FACT_FECHA <= :FECFIN  AND TERC_NIT = :NIT AND FACT_ANULADO = 'N' AND
                      D.ARTI_COD = A.ARTI_COD AND D.ARTI_COD >= :CODINI AND D.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
                      P.PREF_PRE = F.PREF_PRE AND P.TIDO_COD = 31 AND ((P.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) and f.fact_sucursal = :sucursal and substring(a.arti_cod from 1 FOR 2) <> '.t'
                ORDER BY D.ARTI_COD, F.FACT_ID, FADE_ITEM
                INTO :ID, :ITEM, :PREFIJO, :NUMERO, :FECHA, :CANTIDAD, :BASE, :IVA, :ARTICULO, :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC, :OBS, :PTVTA
                DO
                    BEGIN
                    SELECT GRUP_NOM FROM GRUPO WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                    SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                    SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                    EXECUTE PROCEDURE FALTANTE_CORTE(:TIPO, :DESTINO, :ID, :ITEM, :CORTE) returning_values (:FALTANTE, :UNIDAD, :FACTOR);
                    if ((CEROS = 'S') or (FALTANTE <> 0)) then
                        SUSPEND;
                    END
        if (TIPO = 32) then
            FOR SELECT R.REVT_ID, RVDE_ITEM, R.PREF_PRE, REVT_NUMERO, REVT_FECHA, RVDE_CANT * RVDE_FACTOR, (RVDE_PRUNIT-RVDE_DTOMONTO), RVDE_IVAMONTO, D.ARTI_COD, ARTI_DES, ARTI_UNIDAD, A.GRUP_COD, A.SUBG_COD, A.MARC_COD, SUBSTRING(REVT_OBS FROM 1 FOR 255), R.ptvt_id
                FROM REMISIONES_VENTA R, REMISIONES_VENTA_DETALLE D, ARTICULO A, PREFIJOS P
                WHERE R.REVT_ID = D.REVT_ID AND REVT_FECHA >= :FECINI AND REVT_FECHA <= :FECFIN AND TERC_NIT = :NIT AND REVT_ANULADO = 'N' AND
                      D.ARTI_COD = A.ARTI_COD AND D.ARTI_COD >= :CODINI AND D.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
                      P.PREF_PRE = R.PREF_PRE AND P.TIDO_COD = 32 AND ((P.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) and r.revt_sucursal = :sucursal
                ORDER BY D.ARTI_COD, R.REVT_ID, RVDE_ITEM
                INTO :ID, :ITEM, :PREFIJO, :NUMERO, :FECHA, :CANTIDAD, :BASE, :IVA, :ARTICULO, :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC, :OBS, :PTVTA
                DO
                    BEGIN
                    SELECT GRUP_NOM FROM GRUPO WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                    SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                    SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                    EXECUTE PROCEDURE FALTANTE_CORTE(:TIPO, :DESTINO, :ID, :ITEM, :CORTE) returning_values (:FALTANTE, :UNIDAD, :FACTOR);
                    if ((CEROS = 'S') or (FALTANTE <> 0)) then
                        SUSPEND;
                    END
        if (TIPO = 34) then
            FOR SELECT P.PEDI_ID, PEDE_ITEM, P.PREF_PRE, PEDI_NUMERO, PEDI_FECHA, PEDE_CANT * PEDE_FACTOR, (PEDE_PRUNIT-PEDE_DTOMONTO), PEDE_IVAMONTO, D.ARTI_COD, ARTI_DES, ARTI_UNIDAD, A.GRUP_COD, A.SUBG_COD, A.MARC_COD, SUBSTRING(PEDI_OBS FROM 1 FOR 255), P.ptvt_id
                FROM PEDIDOS P, PEDIDOS_DETALLE D, ARTICULO A, PREFIJOS PR
                WHERE P.PEDI_ID = D.PEDI_ID AND PEDI_FECHA >= :FECINI AND PEDI_FECHA <= :FECFIN AND TERC_NIT = :NIT AND PEDI_ANULADO = 'N' AND PEDI_VALIDEZ >= 0 AND
                      D.ARTI_COD = A.ARTI_COD AND D.ARTI_COD >= :CODINI AND D.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
                      P.PREF_PRE = PR.PREF_PRE AND PR.TIDO_COD = 34 AND ((PR.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) and p.pedi_sucursal = :sucursal
                ORDER BY D.ARTI_COD, P.PEDI_ID, PEDE_ITEM
                INTO :ID, :ITEM, PREFIJO, :NUMERO, :FECHA, :CANTIDAD, :BASE, :IVA, :ARTICULO, :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC, :OBS, :PTVTA
                DO
                    BEGIN
                    SELECT GRUP_NOM FROM GRUPO WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                    SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                    SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                    EXECUTE PROCEDURE FALTANTE_CORTE(:TIPO, :DESTINO, :ID, :ITEM, :CORTE) returning_values (:FALTANTE, :UNIDAD, :FACTOR);
                    if ((CEROS = 'S') or (FALTANTE <> 0)) then
                        SUSPEND;
                    END
        if (TIPO = 35) then
            FOR SELECT C.COTI_ID, CTDE_ITEM, C.PREF_PRE, COTI_NUMERO, COTI_FECHA, CTDE_CANT * CTDE_FACTOR, (CTDE_PRUNIT-CTDE_DTOMONTO), CTDE_IVAMONTO, D.ARTI_COD, ARTI_DES, ARTI_UNIDAD, A.GRUP_COD, A.SUBG_COD, A.MARC_COD, SUBSTRING(COTI_OBS FROM 1 FOR 255), C.ptvt_id
                FROM COTIZACIONES C, COTIZACIONES_DETALLE D, ARTICULO A, PREFIJOS P
                WHERE C.COTI_ID = D.COTI_ID AND COTI_FECHA >= :FECINI AND COTI_FECHA <= :FECFIN AND TERC_NIT = :NIT AND COTI_ANULADO = 'N' AND
                      D.ARTI_COD = A.ARTI_COD AND D.ARTI_COD >= :CODINI AND D.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
                      P.PREF_PRE = C.PREF_PRE AND P.TIDO_COD = 35 AND ((P.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) and c.coti_sucursal = :sucursal
                ORDER BY D.ARTI_COD, C.COTI_ID, CTDE_ITEM
                INTO :ID, :ITEM, PREFIJO, :NUMERO, :FECHA, :CANTIDAD, :BASE, :IVA, :ARTICULO, :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC, :OBS, :PTVTA
                DO
                    BEGIN
                    SELECT GRUP_NOM FROM GRUPO WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                    SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                    SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                    EXECUTE PROCEDURE FALTANTE_CORTE(:TIPO, :DESTINO, :ID, :ITEM, :CORTE) returning_values (:FALTANTE, :UNIDAD, :FACTOR);
                    if ((CEROS = 'S') or (FALTANTE <> 0)) then
                        SUSPEND;
                    END
        if (TIPO = 40) then
            FOR SELECT P.pend_id, D.pevd_item, P.PREF_PRE, P.pend_numero, P.pend_fecha, D.pevd_cant * D.pevd_factor, (D.pevd_prunit-D.pevd_dtomonto), D.pevd_ivamonto, D.ARTI_COD, ARTI_DES, ARTI_UNIDAD, A.GRUP_COD, A.SUBG_COD, A.MARC_COD, SUBSTRING(P.pend_obs FROM 1 FOR 255)
                FROM pendiente_ventas P, pendiente_ventas_detalle D, ARTICULO A, PREFIJOS PR
                WHERE P.pend_id = D.pend_id AND PEND_FECHA >= :FECINI AND PEND_FECHA <= :FECFIN AND TERC_NIT = :NIT AND PEND_ANULADO = 'N' AND
                      D.ARTI_COD = A.ARTI_COD AND D.ARTI_COD >= :CODINI AND D.ARTI_COD <= :CODFIN AND A.ARTI_DES >= :DESINI AND A.ARTI_DES <= :DESFIN AND
                      P.PREF_PRE = PR.PREF_PRE AND PR.TIDO_COD = 40 AND ((PR.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) and p.pend_sucursal = :sucursal
                ORDER BY D.ARTI_COD, P.pend_id, D.pevd_item
                INTO :ID, :ITEM, PREFIJO, :NUMERO, :FECHA, :CANTIDAD, :BASE, :IVA, :ARTICULO, :DESCRIPCION, :UNIDAD, :CODGRUPO, :CODSUBG, :CODMARC, :OBS
                DO
                    BEGIN
                    SELECT GRUP_NOM FROM GRUPO WHERE GRUP_COD = :CODGRUPO INTO NOMGRUPO;
                    SELECT MARC_NOM FROM MARCAS WHERE MARC_COD = :CODMARC INTO NOMMARC;
                    SELECT SUBG_NOM FROM SUBGRUPO WHERE SUBG_COD = :CODSUBG AND GRUP_COD = :CODGRUPO INTO :NOMSUBG;
                    EXECUTE PROCEDURE FALTANTE(:TIPO, :DESTINO, :ID, :ITEM) returning_values (:FALTANTE, :UNIDAD, :FACTOR);
                    if ((CEROS = 'S') or (FALTANTE <> 0)) then
                        SUSPEND;
                    END
        END
    END
END^

SET TERM ; ^

/* LISTAS DE PRECIOS POR USUARIO */
CREATE TABLE LISTAPRE_USUARIOS (
    LIPR_COD T_ID NOT NULL,
    USER_COD T_USUARIO NOT NULL);

ALTER TABLE LISTAPRE_USUARIOS
ADD CONSTRAINT PK_LISTAPRE_USUARIOS
PRIMARY KEY (LIPR_COD,USER_COD);

INSERT INTO CONFIGURACION (CONF_MODULO, CONF_CATEGORIA, CONF_PROPIEDAD, CONF_VALOR, CONF_POSIBLES, CONF_AYUDA) VALUES ('FACTURACION', 'DOCUMENTOS', 'FILTRAR LISTAS DE PRECIOS POR USUARIO', 'NO', 'SI,NO', 'SI:Muestra unicamente las listas de precios asignadas al usuario.NO:Muestra todas las listas de precios de la agencia');
commit work;

SET TERM ^ ;

CREATE OR ALTER procedure LISTAS_ARTICULO (
    ARTICULO varchar(15),
    FECHA date,
    DIAS integer,
    TODAS char(1),
    HORA time,
    AGENCIA integer)
returns (
    NOMLISTA varchar(30),
    CODLISTA integer,
    IVAINC char(1))
AS
declare variable FECINI DATE;
declare variable FECFIN DATE;
declare variable DIA smallint;
declare variable DIASEM smallint;
declare variable HORAINI time;
declare variable HORAFIN time;
declare variable SUCID INTEGER;
declare variable PORAGENCIA CHAR(2);
declare variable PORUSUARIO CHAR(2);
BEGIN
execute procedure lee_configuracion ('FACTURACION', 'DOCUMENTOS', 'FILTRAR LISTAS DE PRECIOS POR AGENCIA') returning_values (:poragencia);
execute procedure lee_configuracion ('FACTURACION', 'DOCUMENTOS', 'FILTRAR LISTAS DE PRECIOS POR USUARIO') returning_values (:porusuario);
if (TODAS = 'N') then
    begin
    DIA = EXTRACT(weekday FROM FECHA) + 1;
    /* Busque las listas validas hoy */
    FOR SELECT L.LIPR_COD, LIPR_NOM, LIPR_FECINI, LIPR_FECFIN, LIPR_MODIF, LIPR_DIASEM, LIPR_HORAINI, LIPR_HORAFIN, SUCU_ID
        FROM LISTA_PRECIOS L, PRECIOS_ARTICULO P
        WHERE L.LIPR_COD = P.LIPR_COD AND ARTI_COD = :ARTICULO AND
            ((LIPR_DIASMAX IS NULL) or (LIPR_DIASMAX >= :DIAS))
        INTO :CODLISTA, :NOMLISTA, :FECINI, :FECFIN, :IVAINC, :DIASEM, :HORAINI, :HORAFIN, :SUCID
        DO
        BEGIN
        if (FECINI is null) then
            begin
            if ((PORAGENCIA = 'NO') OR ((:AGENCIA = 0) or (:SUCID = :AGENCIA) or (:sucid = 0))) THEN
              SUSPEND;
            end
        else
            begin
            if ((FECINI <= :FECHA) AND (FECFIN >= :FECHA) AND (HORAINI <= HORA) AND (HORAFIN >= HORA) AND ((DIASEM = 0) or (DIA = DIASEM)))  Then
                if ((PORAGENCIA = 'NO') OR ((:AGENCIA = 0) or (:SUCID = :AGENCIA) or (:SUCID = 0))) THEN
                    SUSPEND;
            end
        END
    end
ELSE
    BEGIN
    if (PORUSUARIO = 'NO') then
        FOR SELECT L.LIPR_COD, LIPR_NOM, LIPR_MODIF, SUCU_ID
            FROM LISTA_PRECIOS L, PRECIOS_ARTICULO P
            WHERE L.LIPR_COD = P.LIPR_COD AND ARTI_COD = :ARTICULO
            INTO :CODLISTA, :NOMLISTA, :IVAINC, :SUCID
            DO
            if ((PORAGENCIA = 'NO') OR ((:AGENCIA = 0) or (:SUCID = :AGENCIA) or (:SUCID = 0))) THEN
              SUSPEND;
    else
        FOR SELECT L.LIPR_COD, LIPR_NOM, LIPR_MODIF, SUCU_ID
            FROM LISTA_PRECIOS L, PRECIOS_ARTICULO P, listapre_usuarios LU
            WHERE L.LIPR_COD = P.LIPR_COD AND L.lipr_cod = LU.lipr_cod AND ARTI_COD = :ARTICULO AND LU.user_cod = USER
            INTO :CODLISTA, :NOMLISTA, :IVAINC, :SUCID
            DO
            SUSPEND;

    END
END^

SET TERM ; ^

/* ANALISIS DE CARTERA EXTENDIDA CON RANGOS TRIPLES/NORMALES */

INSERT INTO CONFIGURACION (CONF_MODULO, CONF_CATEGORIA, CONF_PROPIEDAD, CONF_VALOR, CONF_POSIBLES, CONF_AYUDA) VALUES ('CARTERA', 'SALDOS', 'ANALISIS EXTENDIDO CON RANGOS IGUALES AL NORMAL O TRIPLES', 'TRIPLES', 'NORMALES,TRIPLES', 'NORMALES:Usa el mismo rango de dias del reporte de análisis. TRIPLES: Usa rangos tres veces mayores que los rangos iniciales del análisis');
COMMIT WORK;

SET TERM ^ ;

CREATE OR ALTER procedure REP_ANALISIS_CARTERA (
    DESDE varchar(20),
    HASTA varchar(20),
    GRPINI varchar(5),
    GRPFIN varchar(5),
    FECHA date,
    DETALLE char(1),
    ORDEN char(1),
    AGRUPA char(1),
    DIASR integer,
    SUBEMPRESA integer,
    GRUPCART integer,
    EXTENDIDA char(1),
    MONEDA integer)
returns (
    NIT varchar(20),
    NOMBRE varchar(60),
    TELEFONO varchar(40),
    DIRECCION varchar(60),
    CIUDAD varchar(40),
    CONTACTO varchar(60),
    EMAIL varchar(100),
    MAILCART varchar(100),
    FAX varchar(25),
    CEL varchar(25),
    CODCLI varchar(20),
    CODZONA varchar(2),
    NOMZONA varchar(60),
    CODCOBR integer,
    NOMCOBR varchar(60),
    DV char(1),
    DIASCR integer,
    CODCIUD char(5),
    NOMCIUD varchar(60),
    SUCURSAL varchar(10),
    NOMSUC varchar(60),
    RESALTAR char(1),
    INSTCART varchar(255),
    TIPO integer,
    ID integer,
    PREFIJO varchar(4),
    NUMERO varchar(8),
    DIAS integer,
    SALDO numeric(18,2),
    CORRIENTE numeric(18,2),
    CERO numeric(18,2),
    TREINTA numeric(18,2),
    SESENTA numeric(18,2),
    NOVENTA numeric(18,2),
    CIENTOCHENTA numeric(18,2),
    DOSSETENTA numeric(18,2),
    TRESSESENTA numeric(18,2),
    PROVISIONAL numeric(18,2),
    TIPONOM varchar(8),
    FECDOC date,
    VENCE date,
    CUPO numeric(18,2),
    DISPONIBLE numeric(18,2),
    OBS blob sub_type 0 segment size 80,
    GRUPCOD integer,
    DIA_CAR integer,
    CALIFICA integer,
    GRUPNOM varchar(30))
AS
DECLARE VARIABLE NITINI VARCHAR(20);
DECLARE VARIABLE NITFIN VARCHAR(20);
DECLARE VARIABLE NOMINI VARCHAR(20);
DECLARE VARIABLE NOMFIN VARCHAR(20);
DECLARE VARIABLE RTFTE NUMERIC(18,2);
DECLARE VARIABLE RTIVA NUMERIC(18,2);
DECLARE VARIABLE RTICA NUMERIC(18,2);
DECLARE VARIABLE VENCIMIENTO VARCHAR(12);
DECLARE VARIABLE OK CHAR(1);
declare variable AUTORET VARCHAR(10);
declare variable FAUTORET DATE;
declare variable INCLANTI CHAR(2);
declare variable descnt_prov char(2);
declare variable MAXDIAS INTEGER;
DECLARE VARIABLE TRM NUMERIC(18,2);
declare variable ext3 varchar(8);
declare variable factorext integer;
BEGIN
if (ORDEN = 'C') then
    BEGIN
    NITINI = DESDE;
    NITFIN = HASTA;
    NOMINI = '';
    NOMFIN = 'zz';
    END
ELSE
    BEGIN
    NOMINI = DESDE;
    NOMFIN = HASTA;
    NITINI = '';
    NITFIN = 'zz';
    END
/* Ubique el NIT */
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', 'ANALISIS DE CARTERA CON FECHA FACTURA O VENCIMIENTO') returning_values (VENCIMIENTO);
EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'INCLUIR ANTICIPOS DE CLIENTES EN REPORTES Y CONSULTAS DE CARTERA') returning_values (INCLANTI);
EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'DESCONTAR RECIBOS PROVISIONALES EN INFORMES DE CARTERA') RETURNING_VALUES (:descnt_prov);
EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'ANALISIS EXTENDIDO CON RANGOS IGUALES AL NORMAL O TRIPLES') RETURNING_VALUES (:ext3);
if (ext3 = 'TRIPLES') then
    factorext = 3;
else
    factorext = 1;
FOR select T.TERC_NIT, TERC_NOM, TERC_DV, CLSU_TEL, clsu_dir, CLSU_CIUDAD, S.COBR_COD, S.ZONA_COD, T.CIUD_COD, CLIE_CUPO, CLIE_DIAS, CLCU_COD,
    CLSU_NOMBRE, t.terc_obs, C.GRCA_COD, TERC_CONTACTO, TERC_EMAIL, TERC_FAX, TERC_CEL, CLIE_COD, CLIE_RESALTAR, CLIE_INSTCARTERA, CLIE_MAILCART, CLIE_CALIFICA, CLIE_DIAS
    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
        T.TERC_NOM >= :NOMINI AND T.TERC_NOM <= :NOMFIN AND ((:GRUPCART = 0) or (C.GRCA_COD = :GRUPCART))
    INTO :NIT, :NOMBRE, :DV, :TELEFONO, :DIRECCION, :CIUDAD, :CODCOBR, :CODZONA, :CODCIUD, :CUPO, :DIA_CAR,  :SUCURSAL,
    :NOMSUC, :obs, :GRUPCOD, :CONTACTO, :EMAIL, :FAX, :CEL, :CODCLI, :RESALTAR, INSTCART, :MAILCART, :CALIFICA, :DIASCR
    DO  
    BEGIN
    SELECT COBR_NOM FROM COBRADORES CB WHERE COBR_COD = :CODCOBR INTO :NOMCOBR;
    SELECT ZONA_NOM FROM ZONAS Z WHERE ZONA_COD = :CODZONA INTO :NOMZONA;
    SELECT CIUD_NOM FROM CIUDADES WHERE CIUD_COD = :CODCIUD INTO :NOMCIUD;
    SELECT GRCA_NOMBRE FROM GRUPO_CARTERA WHERE GRCA_COD = :GRUPCOD INTO :GRUPNOM;
    provisional = 0;
    MAXDIAS = 0;
    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
        DISPONIBLE = CUPO;
        CORRIENTE = 0;
        CERO = 0;
        TREINTA = 0;
        SESENTA = 0;
        NOVENTA = 0;
        CIENTOCHENTA = 0;
        DOSSETENTA = 0;
        TRESSESENTA = 0;
        /* BUSQUE EN SALDOS_DOC_CARTERA LOS QUE TENGAN SALDO > 0 */
        FOR SELECT MVCL_TIPOREF, MVCL_IDREF, MVCL_PREFREF, MVCL_NUMREF, MVCL_FECHA, MVCL_VENCE
            FROM MOVIMIENTO_CLIENTES
            WHERE TERC_NIT = :NIT AND MVCL_SUCURSAL = :SUCURSAL AND MVCL_FECHA <= :FECHA
                AND MVCL_ABONO = 'N' AND ((:SUBEMPRESA = 0) or (SUCU_ID = :SUBEMPRESA)) AND
                ((:MONEDA = 0) or (MVCL_TRM <> 1))
            INTO :TIPO, :ID, :PREFIJO, :NUMERO, :FECDOC, :VENCE
            DO
            BEGIN
            if ((inclanti = 'SI') or (TIPO <> 45)) then
                BEGIN
                EXECUTE PROCEDURE saldo_doc_cartera(TIPO, ID, FECHA, MONEDA) returning_values (SALDO);
                if (SALDO <> 0) then
                    BEGIN
                    DISPONIBLE = DISPONIBLE - SALDO;
                    SELECT TIDO_NOMCORTO FROM TIPO_DOCUMENTO WHERE TIDO_COD = :TIPO INTO :TIPONOM;

                    if (MONEDA = 0) then
                        SELECT SUM(SDCA_RTFTE - SDCA_ABRTFTE), SUM(SDCA_RTIVA - SDCA_ABRTIVA), SUM(SDCA_RTICA - SDCA_ABRTICA)
                            FROM SALDOS_DOC_CARTERA WHERE SDCA_TIPOREF = :TIPO AND SDCA_IDREF = :ID
                            INTO :RTFTE, :RTIVA, :RTICA;
                    ELSE
                        SELECT SUM((SDCA_RTFTE - SDCA_ABRTFTE)/SDCA_TRM), SUM((SDCA_RTIVA - SDCA_ABRTIVA)/SDCA_TRM), SUM((SDCA_RTICA - SDCA_ABRTICA)/SDCA_TRM)
                            FROM SALDOS_DOC_CARTERA WHERE SDCA_TIPOREF = :TIPO AND SDCA_IDREF = :ID
                            INTO :RTFTE, :RTIVA, :RTICA;
                    if (RTFTE IS NULL) then
                        RTFTE = 0;
                    if ((TIPO = 42) or (TIPO = 45) or (TIPO = 33)) THEN
                        BEGIN
                        if (RTFTE > 0) then
                            RTFTE = 0;
                        END
                    ELSE
                        BEGIN
                        if (RTFTE < 0) then
                            RTFTE = 0;
                        END
                    if (FAUTORET <= FECDOC) then
                        RTFTE = 0;
                    if (RTIVA IS NULL) then
                        RTIVA = 0;
                    if ((TIPO = 42) or (TIPO = 45) or (TIPO = 33)) THEN
                        BEGIN
                        if (RTIVA > 0) then
                            RTIVA = 0;
                        END
                    ELSE
                        BEGIN
                        if (RTIVA < 0) then
                            RTIVA = 0;
                        END
                    if (RTICA IS NULL) then
                        RTICA = 0;
                    if ((TIPO = 42) or (TIPO = 45) or (TIPO = 33)) THEN
                        BEGIN
                        if (RTICA > 0) then
                            RTICA = 0;
                        END
                    ELSE
                        BEGIN
                        if (RTICA < 0) then
                            RTICA = 0;
                        END
                    /* AHORA CLASIFIQUE LOS DIAS */
                    if (VENCIMIENTO = 'FECHA') then
                        DIAS = FECHA - FECDOC;
                    ELSE
                        BEGIN
                        DIAS = FECHA - VENCE;
                        if ((TIPO = 31) AND (VENCIMIENTO = 'ENTREGA')) THEN
                            BEGIN
                            SELECT FACT_ENTREGA FROM FACTURAS WHERE FACT_ID = :ID INTO :VENCE;
                            DIAS = FECHA - VENCE;
                            END
                        END
                    if (MAXDIAS < DIAS) then
                        MAXDIAS = DIAS;
                    if (DETALLE = 'S') then
                        BEGIN
                        CORRIENTE = 0;
                        CERO = 0;
                        TREINTA = 0;
                        SESENTA = 0;
                        NOVENTA = 0;
                        CIENTOCHENTA = 0;
                        DOSSETENTA = 0;
                        tressesenta = 0;
                        END
                    if (DIAS < 0) then
                        CORRIENTE = CORRIENTE + SALDO;
                    ELSE
                        if (DIAS <= DIASR) then
                            CERO = CERO + SALDO;
                        ELSE
                            if (DIAS <= (DIASR * 2)) then
                                TREINTA = TREINTA + SALDO;
                            ELSE
                                if (DIAS <= (DIASR * 3)) then
                                    SESENTA = SESENTA + SALDO;
                                ELSE
                                    BEGIN
                                    if (EXTENDIDA = 'N') then
                                        NOVENTA = NOVENTA + SALDO;
                                    else    
                                        if (EXT3 = 'TRIPLES') then
                                            BEGIN
                                            if (DIAS <= (DIASR * 3) * 2) then
                                                NOVENTA = NOVENTA + SALDO;
                                            ELSE
                                                if (DIAS <= (DIASR * 3) * 3) then
                                                    CIENTOCHENTA = CIENTOCHENTA + SALDO;
                                                ELSE
                                                    if (DIAS <= (DIASR * 3) * 4) then
                                                        dossetenta = dossetenta + SALDO;
                                                    ELSE
                                                        tressesenta = tressesenta + SALDO;
                                            END
                                        else
                                            BEGIN
                                            if (DIAS <= (DIASR * 4)) then
                                                NOVENTA = NOVENTA + SALDO;
                                            ELSE
                                                if (DIAS <= (DIASR * 5)) then
                                                    CIENTOCHENTA = CIENTOCHENTA + SALDO;
                                                ELSE
                                                    if (DIAS <= (DIASR * 6)) then
                                                        dossetenta = dossetenta + SALDO;
                                                    ELSE
                                                        tressesenta = tressesenta + SALDO;
                                            END
                                    END
                    if (DETALLE = 'S') then
                        SUSPEND;
                    END  /* SALDO */
                END  /* NO ANTICIPO */
            END  /* FOR MOV_CLI */
        /* AGREGUE LOS RECIBOS PROVISIONALES CON SIGNO NEGATIVO */
        FOR SELECT 65, MAX(P.RCPR_ID), MAX(PREF_PRE), MAX(RCPR_NUMERO), MAX(RCPR_FECHA), SUM(RPDE_ABONO* -1), SUM(RPDE_RTFTE*-1), SUM(RPDE_RTIVA*-1), SUM(RPDE_RTICA*-1), MAX(RCPR_TRM)
            FROM RECIBO_PROVISIONAL P, recibo_provisional_detalle D
            WHERE P.rcpr_id = D.rcpr_id AND P.TERC_NIT = :NIT AND D.RPDE_SUCURSAL = :SUCURSAL AND P.RCPR_FECHA <= :FECHA AND P.RCPR_ANULADO = 'N' AND
            ((RCPR_FECCRUCE IS NULL) or (RCPR_FECCRUCE > :FECHA)) AND ((:SUBEMPRESA = 0) or (SUCU_ID = :SUBEMPRESA)) AND ((:MONEDA = 0) or (RCPR_TRM <> 1))
            GROUP BY P.rcpr_id
            INTO :TIPO, :ID, :PREFIJO, :NUMERO, :FECDOC, :PROVISIONAL, :rtfte,  :RTIVA, :RTICA, :TRM
            DO
            BEGIN
            if ((MONEDA <> 0) AND (TRM <> 0)) then
                BEGIN
                PROVISIONAL = PROVISIONAL / TRM;
                RTFTE = RTFTE / TRM;
                RTIVA = RTIVA / TRM;
                RTICA = RTICA / TRM;
                END
            if (:descnt_prov = 'NO') then
              SALDO = 0;
            else
              SALDO = :PROVISIONAL;
            SELECT TIDO_NOMCORTO FROM TIPO_DOCUMENTO WHERE TIDO_COD = :TIPO INTO :TIPONOM;
            /* CALCULE EL VENCIMIENTO DEL ULTIMO DOCUMENTO POSFECHADO */
            SELECT MAX(RPPA_FECHA) FROM recibo_provisional_pago WHERE RCPR_ID = :ID INTO :VENCE;
            DIAS = VENCE - FECHA;
            if (DETALLE = 'S') then
                BEGIN
                CORRIENTE = 0;
                CERO = 0;
                TREINTA = 0;
                SESENTA = 0;
                NOVENTA = 0;
                CIENTOCHENTA = 0;
                DOSSETENTA = 0;
                tressesenta = 0;
                END
            if (DIAS < 0) then
                CORRIENTE = CORRIENTE + SALDO;
            ELSE
                if (DIAS <= DIASR) then
                    CERO = CERO + SALDO;
                ELSE
                    if (DIAS <= (DIASR * 2)) then
                        TREINTA = TREINTA + SALDO;
                    ELSE
                        if (DIAS <= (DIASR * 3)) then
                            SESENTA = SESENTA + SALDO;
                        ELSE
                            BEGIN
                            if (EXTENDIDA = 'N') then
                                NOVENTA = NOVENTA + SALDO;
                            else
                                if (EXT3 = 'TRIPLES') then
                                    BEGIN
                                    if (DIAS <= (DIASR * 3) * 2) then
                                        NOVENTA = NOVENTA + SALDO;
                                    ELSE
                                        if (DIAS <= (DIASR * 3) * 3) then
                                            CIENTOCHENTA = CIENTOCHENTA + SALDO;
                                        ELSE
                                            if (DIAS <= (DIASR * 3) * 4) then
                                                dossetenta = dossetenta + SALDO;
                                            ELSE
                                                tressesenta = tressesenta + SALDO;
                                    END
                                else
                                    BEGIN
                                    if (DIAS <= (DIASR * 4)) then
                                        NOVENTA = NOVENTA + SALDO;
                                    ELSE
                                        if (DIAS <= (DIASR * 5)) then
                                            CIENTOCHENTA = CIENTOCHENTA + SALDO;
                                        ELSE
                                            if (DIAS <= (DIASR * 6)) then
                                                dossetenta = dossetenta + SALDO;
                                            ELSE
                                                tressesenta = tressesenta + SALDO;
                                    END
                            END
            if (DETALLE = 'S') then
                SUSPEND;
            END
        if (DETALLE = 'N') then
            begin
            SALDO = CORRIENTE + CERO + TREINTA + SESENTA + NOVENTA + cientochenta + dossetenta + tressesenta;
            DIAS = MAXDIAS;
            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 <= :FECHA
                AND MVCL_ABONO = 'N' AND ((:SUBEMPRESA = 0) or (SUCU_ID = :SUBEMPRESA)) AND
                ((:MONEDA = 0) or (MVCL_TRM <> 1))
            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
                DISPONIBLE = CUPO;
                CORRIENTE = 0;
                CERO = 0;
                TREINTA = 0;
                SESENTA = 0;
                NOVENTA = 0;
                CIENTOCHENTA = 0;
                DOSSETENTA = 0;
                tressesenta = 0;
                SELECT COBR_NOM FROM COBRADORES WHERE COBR_COD = :codcobr INTO :nomcobr;
                /* BUSQUE EN SALDOS_DOC_CARTERA LOS QUE TENGAN SALDO > 0 */
                FOR SELECT MVCL_TIPOREF, MVCL_IDREF, MVCL_PREFREF, MVCL_NUMREF, MVCL_FECHA, MVCL_VENCE
                    FROM MOVIMIENTO_CLIENTES
                    WHERE TERC_NIT = :NIT AND COBR_COD = :CODCOBR AND MVCL_SUCURSAL = :SUCURSAL AND MVCL_FECHA <= :FECHA
                        AND MVCL_ABONO = 'N' AND ((:SUBEMPRESA = 0) or (SUCU_ID = :SUBEMPRESA))
                    INTO :TIPO, :ID, :PREFIJO, :NUMERO, :FECDOC, :VENCE
                    DO
                    BEGIN
                    if ((inclanti = 'SI') or (TIPO <> 45)) then
                        BEGIN
                        EXECUTE PROCEDURE saldo_doc_cartera(TIPO, ID, FECHA, MONEDA) returning_values (SALDO);
                        if (SALDO <> 0) then
                            BEGIN
                            DISPONIBLE = DISPONIBLE - SALDO;
                            SELECT TIDO_NOMCORTO FROM TIPO_DOCUMENTO WHERE TIDO_COD = :TIPO INTO :TIPONOM;
                            if (MONEDA = 0) then
                                SELECT SUM(SDCA_RTFTE - SDCA_ABRTFTE), SUM(SDCA_RTIVA - SDCA_ABRTIVA), SUM(SDCA_RTICA - SDCA_ABRTICA)
                                    FROM SALDOS_DOC_CARTERA WHERE SDCA_TIPOREF = :TIPO AND SDCA_IDREF = :ID
                                    INTO :RTFTE, :RTIVA, :RTICA;
                            ELSE
                                SELECT SUM((SDCA_RTFTE - SDCA_ABRTFTE)/SDCA_TRM), SUM((SDCA_RTIVA - SDCA_ABRTIVA)/SDCA_TRM), SUM((SDCA_RTICA - SDCA_ABRTICA)/SDCA_TRM)
                                    FROM SALDOS_DOC_CARTERA WHERE SDCA_TIPOREF = :TIPO AND SDCA_IDREF = :ID
                                    INTO :RTFTE, :RTIVA, :RTICA;
                            if (RTFTE IS NULL) then
                                RTFTE = 0;
                            if ((TIPO = 42) or (TIPO = 45) or (TIPO = 33)) THEN
                                BEGIN
                                if (RTFTE > 0) then
                                    RTFTE = 0;
                                END
                            ELSE
                                BEGIN
                                if (RTFTE < 0) then
                                    RTFTE = 0;
                                END
                            if (FAUTORET <= FECDOC) then
                                RTFTE = 0;
                            if (RTIVA IS NULL) then
                                RTIVA = 0;
                            if ((TIPO = 42) or (TIPO = 45) or (TIPO = 33)) THEN
                                BEGIN
                                if (RTIVA > 0) then
                                    RTIVA = 0;
                                END
                            ELSE
                                BEGIN
                                if (RTIVA < 0) then
                                    RTIVA = 0;
                                END
                            if (RTICA IS NULL) then
                                RTICA = 0;
                            if ((TIPO = 42) or (TIPO = 45) or (TIPO = 33)) THEN
                                BEGIN
                                if (RTICA > 0) then
                                    RTICA = 0;
                                END
                            ELSE
                                BEGIN
                                if (RTICA < 0) then
                                    RTICA = 0;
                                END
                            /* AHORA CLASIFIQUE LOS DIAS */
                            if (VENCIMIENTO = 'FECHA') then
                                DIAS = FECHA - FECDOC;
                            ELSE
                                BEGIN
                                DIAS = FECHA - VENCE;
                                if ((TIPO = 31) AND (VENCIMIENTO = 'ENTREGA')) THEN
                                    BEGIN
                                    SELECT FACT_ENTREGA FROM FACTURAS WHERE FACT_ID = :ID INTO :VENCE;
                                    DIAS = FECHA - VENCE;
                                    END
                                END
                            if (MAXDIAS < DIAS) then
                                MAXDIAS = DIAS;
                            if (DETALLE = 'S') then
                                BEGIN
                                CORRIENTE = 0;
                                CERO = 0;
                                TREINTA = 0;
                                SESENTA = 0;
                                NOVENTA = 0;
                                CIENTOCHENTA = 0;
                                DOSSETENTA = 0;
                                tressesenta = 0;
                                END
                            if (DIAS < 0) then
                                CORRIENTE = CORRIENTE + SALDO;
                            ELSE
                                if (DIAS <= DIASR) then
                                    CERO = CERO + SALDO;
                                ELSE
                                    if (DIAS <= (DIASR * 2)) then
                                        TREINTA = TREINTA + SALDO;
                                    ELSE
                                        if (DIAS <= (DIASR * 3)) then
                                            SESENTA = SESENTA + SALDO;
                                        ELSE
                                            BEGIN
                                            if (EXTENDIDA = 'N') then
                                                NOVENTA = NOVENTA + SALDO;
                                            else    
                                                if (EXT3 = 'TRIPLES') then
                                                    BEGIN
                                                    if (DIAS <= (DIASR * 3) * 2) then
                                                        NOVENTA = NOVENTA + SALDO;
                                                    ELSE
                                                        if (DIAS <= (DIASR * 3) * 3) then
                                                            CIENTOCHENTA = CIENTOCHENTA + SALDO;
                                                        ELSE
                                                            if (DIAS <= (DIASR * 3) * 4) then
                                                                dossetenta = dossetenta + SALDO;
                                                            ELSE
                                                                tressesenta = tressesenta + SALDO;
                                                    END
                                                else
                                                    BEGIN
                                                    if (DIAS <= (DIASR * 4)) then
                                                        NOVENTA = NOVENTA + SALDO;
                                                    ELSE
                                                        if (DIAS <= (DIASR * 5)) then
                                                            CIENTOCHENTA = CIENTOCHENTA + SALDO;
                                                        ELSE
                                                            if (DIAS <= (DIASR * 6)) then
                                                                dossetenta = dossetenta + SALDO;
                                                            ELSE
                                                                tressesenta = tressesenta + SALDO;
                                                    END
                                            END
                            if (DETALLE = 'S') then
                                SUSPEND;
                            END  /* SALDO <>  0 */
                        END  /* NO ANTICIPO */
                    END  /* FOR MOV_CLI */
                /* AGREGUE LOS RECIBOS PROVISIONALES CON SIGNO NEGATIVO */
                FOR SELECT 65, MAX(P.RCPR_ID), MAX(PREF_PRE), MAX(RCPR_NUMERO), MAX(RCPR_FECHA), SUM(RPDE_ABONO * -1), SUM(RPDE_RTFTE*-1), SUM(RPDE_RTIVA*-1), SUM(RPDE_RTICA*-1), MAX(RCPR_TRM)
                    FROM RECIBO_PROVISIONAL P, recibo_provisional_detalle D
                    WHERE P.rcpr_id = D.rcpr_id AND P.TERC_NIT = :NIT AND RPDE_SUCURSAL = :SUCURSAL AND P.VEND_COD = :CODCOBR AND P.RCPR_FECHA <= :FECHA AND P.RCPR_ANULADO = 'N' AND
                    ((RCPR_FECCRUCE IS NULL) or (RCPR_FECCRUCE > :FECHA)) AND ((SUCU_ID = :SUBEMPRESA) OR (:SUBEMPRESA = 0)) AND ((:MONEDA = 0) or (RCPR_TRM <> 1))
                    GROUP BY P.rcpr_id
                    INTO :TIPO, :ID, :PREFIJO, :NUMERO, :FECDOC, :PROVISIONAL, :rtfte,  :RTIVA, :RTICA, :TRM
                    DO
                    BEGIN
                    if ((MONEDA <> 0) AND (TRM <> 0)) then
                        BEGIN
                        PROVISIONAL = PROVISIONAL / TRM;
                        RTFTE = RTFTE / TRM;
                        RTIVA = RTIVA / TRM;
                        RTICA = RTICA / TRM;
                        END
                    if (:descnt_prov = 'NO') then
                      SALDO = 0;
                    else
                      SALDO = :PROVISIONAL;
                    SELECT TIDO_NOMCORTO FROM TIPO_DOCUMENTO WHERE TIDO_COD = :TIPO INTO :TIPONOM;
                    /* CALCULE EL VENCIMIENTO DEL ULTIMO DOCUMENTO POSFECHADO */
                    SELECT MAX(RPPA_FECHA) FROM recibo_provisional_pago WHERE RCPR_ID = :ID INTO :VENCE;
                    DIAS = VENCE - FECHA;
                    if (DETALLE = 'S') then
                        BEGIN
                        CORRIENTE = 0;
                        CERO = 0;
                        TREINTA = 0;
                        SESENTA = 0;
                        NOVENTA = 0;
                        CIENTOCHENTA = 0;
                        DOSSETENTA = 0;
                        tressesenta = 0;
                        END
                    if (DIAS < 0) then
                        CORRIENTE = CORRIENTE + SALDO;
                    ELSE
                        if (DIAS <= DIASR) then
                            CERO = CERO + SALDO;
                        ELSE
                            if (DIAS <= (DIASR * 2)) then
                                TREINTA = TREINTA + SALDO;
                            ELSE
                                if (DIAS <= (DIASR * 3)) then
                                    SESENTA = SESENTA + SALDO;
                                ELSE
                                    BEGIN
                                    if (EXTENDIDA = 'N') then
                                        NOVENTA = NOVENTA + SALDO;
                                    else    
                                        if (EXT3 = 'TRIPLES') then
                                            BEGIN
                                            if (DIAS <= (DIASR * 3) * 2) then
                                                NOVENTA = NOVENTA + SALDO;
                                            ELSE
                                                if (DIAS <= (DIASR * 3) * 3) then
                                                    CIENTOCHENTA = CIENTOCHENTA + SALDO;
                                                ELSE
                                                    if (DIAS <= (DIASR * 3) * 4) then
                                                        dossetenta = dossetenta + SALDO;
                                                    ELSE
                                                        tressesenta = tressesenta + SALDO;
                                            END
                                        else
                                            BEGIN
                                            if (DIAS <= (DIASR * 4)) then
                                                NOVENTA = NOVENTA + SALDO;
                                            ELSE
                                                if (DIAS <= (DIASR * 5)) then
                                                    CIENTOCHENTA = CIENTOCHENTA + SALDO;
                                                ELSE
                                                    if (DIAS <= (DIASR * 6)) then
                                                        dossetenta = dossetenta + SALDO;
                                                    ELSE
                                                        tressesenta = tressesenta + SALDO;
                                            END
                                    END
                    if (DETALLE = 'S') then
                        SUSPEND;
                    END
                if (DETALLE = 'N') then
                    begin
                    SALDO = CORRIENTE + CERO + TREINTA + SESENTA + NOVENTA + cientochenta + dossetenta + tressesenta;
                    DIAS = MAXDIAS;
                    SUSPEND;
                    end
                END
            END  /* FOR COBRADOR */
        END
    END  /* FOR NIT */
END^

SET TERM ; ^

/* DOCUMENTOS SIN CONTABILIZAR INCLUYENDO CONTADO */
SET TERM ^ ;

CREATE OR ALTER procedure DOCUMENTOS_SIN_CONTABILIZAR (
    FECINI date,
    FECFIN date,
    CONTADO char(1))
returns (
    TIPO varchar(10),
    PREFIJO varchar(4),
    NUMERO varchar(8),
    FECHA date,
    ID integer,
    TIDO integer,
    CTABCO integer)
AS
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);
CTABCO = 0;
TIPO = 'ENTRADA';
TIDO = 11;
FOR SELECT ENTR_ID FROM ENTRADAS
    WHERE ENTR_ANULADO = 'N' AND ENTR_FECHA >= :FECINI AND ENTR_FECHA <= :FECFIN
    INTO :ID
DO
begin
  IDREF = null;
  SELECT first 1 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
    SELECT PREF_PRE, ENTR_NUMERO, ENTR_FECHA FROM ENTRADAS WHERE ENTR_ID = :ID INTO :PREFIJO, :NUMERO, :FECHA;
    suspend;
   end
end
TIPO = 'SALIDA';
TIDO = 12;
FOR SELECT first 1 SALI_ID FROM SALIDAS
    WHERE SALI_ANULADO = 'N' AND SALI_FECHA >= :FECINI AND SALI_FECHA <= :FECFIN
    INTO :ID
DO
begin
  IDREF = null;
  SELECT first 1 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
    SELECT PREF_PRE, SALI_NUMERO, SALI_FECHA FROM SALIDAS WHERE SALI_ID = :ID INTO :PREFIJO, :NUMERO, :FECHA;
    suspend;
   end
end
TIPO = 'TRASLADO';
TIDO = 13;
FOR SELECT TRAN_ID FROM TRASFERENCIAS
    WHERE TRAN_ANULADO = 'N' AND TRAN_FECHA >= :FECINI AND TRAN_FECHA <= :FECFIN
    INTO :ID
DO
begin
  IDREF = null;
  SELECT first 1 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
    SELECT PREF_PRE, TRAN_NUMERO, TRAN_FECHA FROM TRASFERENCIAS WHERE TRAN_ID = :ID INTO :PREFIJO, :NUMERO, :FECHA;
    suspend;
   end
end
TIPO = 'AJUS INV.';
TIDO = 14;
FOR SELECT AJUS_ID FROM AJUSTES
    WHERE AJUS_ANULADO = 'N' AND AJUS_NOAJUSTAR = 'N' AND AJUS_FECHA >= :FECINI AND AJUS_FECHA <= :FECFIN
    INTO :ID
DO
begin
  IDREF = null;
  SELECT first 1 ENCO_IDREF FROM COMPROBANTE_ENCABEZADO WHERE ENCO_TIPOREF = 14 AND ENCO_FECHA >= :FECICNT AND ENCO_FECHA <= :FECFCNT AND ENCO_IDREF = :ID INTO :IDREF;
  if (IDREF IS NULL) then
   begin
    SELECT PREF_PRE, AJUS_NUMERO, AJUS_FECHA FROM AJUSTES WHERE AJUS_ID = :ID INTO :PREFIJO, :NUMERO, :FECHA;
    suspend;
   end
end
TIPO = 'ENSAMBLE';
TIDO = 15;
FOR SELECT ENSA_ID FROM ENSAMBLES
    WHERE ENSA_ANULADO = 'N' AND ENSA_FECHA >= :FECINI AND ENSA_FECHA <= :FECFIN
    INTO :ID
DO
begin
  IDREF = null;
  SELECT first 1 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
    SELECT PREF_PRE, ENSA_NUMERO, ENSA_FECHA FROM ENSAMBLES WHERE ENSA_ID = :ID INTO :PREFIJO, :NUMERO, :FECHA;
    suspend;
   end
end
TIPO = 'DESENSAMB.';
TIDO = 16;
FOR SELECT DESE_ID FROM DESENSAMBLES
    WHERE DESE_ANULADO = 'N' AND DESE_FECHA >= :FECINI AND DESE_FECHA <= :FECFIN
    INTO :ID
DO
begin
  IDREF = null;
  SELECT first 1 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
    SELECT PREF_PRE, DESE_NUMERO, DESE_FECHA FROM DESENSAMBLES WHERE DESE_ID = :ID INTO :PREFIJO, :NUMERO, :FECHA;
    suspend;
   end
end
TIPO = 'FAC.COMPRA';
TIDO = 21;
FOR SELECT FACO_ID FROM FACTURAS_COMPRA
    WHERE FACO_ANULADO = 'N' AND FACO_FECHA >= :FECINI AND FACO_FECHA <= :FECFIN
    INTO :ID
DO
begin
  IDREF = null;
  SELECT first 1 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
    SELECT PREF_PRE, FACO_NUMERO, FACO_FECHA FROM FACTURAS_COMPRA WHERE FACO_ID = :ID INTO :PREFIJO, :NUMERO, :FECHA;
    suspend;
   end
end
TIPO = 'DEV.COMPRA';
TIDO = 24;
FOR SELECT DVCO_ID FROM DEVOLUCIONES_COMPRAS
    WHERE DVCO_ANULADO = 'N' AND DVCO_FECHA >= :FECINI AND DVCO_FECHA <= :FECFIN
    INTO :ID
DO
begin
  IDREF = null;
  SELECT first 1 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
    SELECT PREF_PRE, DVCO_NUMERO, DVCO_FECHA FROM DEVOLUCIONES_COMPRAS WHERE DVCO_ID = :ID INTO :PREFIJO, :NUMERO, :FECHA;
    suspend;
   end
end
TIPO = 'FACT.VENTA';
TIDO = 31;
FOR SELECT FACT_ID FROM FACTURAS F
    WHERE FACT_ANULADO = 'N' AND FACT_FECHA >= :FECINI AND FACT_FECHA <= :FECFIN AND
    ((:CONTADO = 'S') or (NOT EXISTS (SELECT PREF_PRE FROM AUTORIZACIONES WHERE PREF_PRE = F.pref_pre AND AUTO_CONTADO = 'S')))
    INTO :ID
DO
begin
  IDREF = null;
  SELECT first 1 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
    SELECT PREF_PRE, FACT_NUMERO, FACT_FECHA FROM FACTURAS WHERE FACT_ID = :ID INTO :PREFIJO, :NUMERO, :FECHA;
    suspend;
   end
end
TIPO = 'DEV.VENTA';
TIDO = 33;
FOR SELECT DEVT_ID FROM DEVOLUCIONES_VENTAS
    WHERE DEVT_ANULADO = 'N' AND ((DEVT_REMID = 0) or (DEVT_REMID IS NULL)) AND DEVT_FECHA >= :FECINI AND DEVT_FECHA <= :FECFIN
    INTO :ID
DO
begin
  IDREF = null;
  SELECT first 1 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
    SELECT PREF_PRE, DEVT_NUMERO, DEVT_FECHA FROM DEVOLUCIONES_VENTAS WHERE DEVT_ID = :ID INTO :PREFIJO, :NUMERO, :FECHA;
    suspend;
   end
end
TIPO = 'NOTADB.CLI';
TIDO = 41;
FOR SELECT NDCL_ID FROM NOTAS_DEBITO_CLIENTES
    WHERE NDCL_ANULADO = 'N' AND NDCL_FECHA >= :FECINI AND NDCL_FECHA <= :FECFIN
    INTO :ID
DO
begin
  IDREF = null;
  SELECT first 1 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
    SELECT PREF_PRE, NDCL_NUMERO, NDCL_FECHA FROM NOTAS_DEBITO_CLIENTES WHERE NDCL_ID = :ID INTO :PREFIJO, :NUMERO, :FECHA;
    suspend;
   end
end
TIPO = 'NOTACR.CLI';
TIDO = 42;
FOR SELECT NCCL_ID FROM NOTAS_CREDITO_CLIENTES
    WHERE NCCL_ANULADO = 'N' AND NCCL_FECHA >= :FECINI AND NCCL_FECHA <= :FECFIN
    INTO :ID
DO
begin
  IDREF = null;
  SELECT first 1 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
    SELECT PREF_PRE, NCCL_NUMERO, NCCL_FECHA FROM NOTAS_CREDITO_CLIENTES WHERE NCCL_ID = :ID INTO :PREFIJO, :NUMERO, :FECHA;
    suspend;
   end
end
TIPO = 'APLICA CLI';
TIDO = 43;
FOR SELECT APCL_ID FROM aplicacion_cliente
    WHERE APCL_ANULADO = 'N' AND APCL_FECHA >= :FECINI AND APCL_FECHA <= :FECFIN
    INTO :ID
DO
begin
  IDREF = null;
  SELECT first 1 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
    SELECT PREF_PRE, APCL_NUMERO, APCL_FECHA FROM aplicacion_cliente WHERE APCL_ID = :ID INTO :PREFIJO, :NUMERO, :FECHA;
    suspend;
   end
end
TIPO = 'CAUSA.CXP';
TIDO = 51;
FOR SELECT NDPR_ID FROM NOTAS_DEBITO_PROVEEDOR
    WHERE NDPR_ANULADO = 'N' AND NDPR_FECHA >= :FECINI AND NDPR_FECHA <= :FECFIN
    INTO :ID
DO
begin
  IDREF = null;
  SELECT first 1 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
    SELECT PREF_PRE, NDPR_NUMERO, NDPR_FECHA FROM NOTAS_DEBITO_PROVEEDOR WHERE NDPR_ID = :ID INTO :PREFIJO, :NUMERO, :FECHA;
    suspend;
   end
end
TIPO = 'DESCTO.CXP';
TIDO = 52;
FOR SELECT NCPR_ID FROM NOTAS_CREDITO_PROVEEDOR
    WHERE NCPR_ANULADO = 'N' AND NCPR_FECHA >= :FECINI AND NCPR_FECHA <= :FECFIN
    INTO :ID
DO
begin
  IDREF = null;
  SELECT first 1 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
    SELECT PREF_PRE, NCPR_NUMERO, NCPR_FECHA FROM NOTAS_CREDITO_PROVEEDOR WHERE NCPR_ID = :ID INTO :PREFIJO, :NUMERO, :FECHA;
    suspend;
   end
end
TIPO = 'APLICA PRV';
TIDO = 53;
FOR SELECT APPR_ID FROM aplicacion_provedor
    WHERE APPR_ANULADO = 'N' AND APPR_FECHA >= :FECINI AND APPR_FECHA <= :FECFIN
    INTO :ID
DO
begin
  IDREF = null;
  SELECT first 1 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
    SELECT PREF_PRE, APPR_NUMERO, APPR_FECHA FROM aplicacion_provedor WHERE APPR_ID = :ID INTO :PREFIJO, :NUMERO, :FECHA;
    suspend;
   end
end
/* EXCLUYA LOS DE PREFIJO PARA IGUAL VENTAS DE CONTADO */
TIPO = 'RECI.CAJA';
TIDO = 61;
FOR SELECT RECA_ID FROM RECIBOS_CAJA R
    WHERE RECA_ANULADO = 'N' AND RECA_FECHA >= :FECINI AND RECA_FECHA <= :FECFIN AND
    ((:CONTADO = 'S') or (NOT EXISTS (SELECT PREF_PRE FROM AUTORIZACIONES WHERE AUTO_PREFRDC = R.pref_pre AND AUTO_CONTADO = 'S')))
    INTO :ID
DO
begin
  IDREF = null;
  SELECT first 1 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
    SELECT PREF_PRE, RECA_NUMERO, RECA_FECHA FROM RECIBOS_CAJA WHERE RECA_ID = :ID INTO :PREFIJO, :NUMERO, :FECHA;
    suspend;
   end
end
TIPO = 'EGRESOS';
TIDO = 62;
FOR SELECT EGRE_ID FROM EGRESOS
    WHERE EGRE_ANULADO = 'N' AND EGRE_FECHA >= :FECINI AND EGRE_FECHA <= :FECFIN
    INTO :ID
DO
begin
  IDREF = null;
  SELECT first 1 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
    SELECT PREF_PRE, EGRE_NUMERO, EGRE_FECHA FROM EGRESOS WHERE EGRE_ID = :ID INTO :PREFIJO, :NUMERO, :FECHA;
    suspend;
   end
end
TIPO = 'CONS.TARJ.';
TIDO = 64;
FOR SELECT COTJ_ID FROM CONSIGNA_TARJETAS
    WHERE COTJ_ANULADO = 'N' AND COTJ_FECHA >= :FECINI AND COTJ_FECHA <= :FECFIN
    INTO :ID
DO
begin
  IDREF = null;
  SELECT first 1 ENCO_IDREF FROM COMPROBANTE_ENCABEZADO WHERE ENCO_TIPOREF = 64 AND ENCO_FECHA >= :FECICNT AND ENCO_FECHA <= :FECFCNT AND ENCO_IDREF = :ID INTO :IDREF;
  if (IDREF IS NULL) then
   begin
    SELECT PREF_PRE,COTJ_NUMERO, COTJ_FECHA FROM CONSIGNA_TARJETAS WHERE COTJ_ID = :ID INTO :PREFIJO, :NUMERO, :FECHA;
    suspend;
   end
end
TIPO = 'TR. CAJA';
TIDO = 66;
FOR SELECT TRCJ_ID FROM TRASLADOS_CAJA
    WHERE TRCJ_ANULADO = 'N' AND TRCJ_FECHA >= :FECINI AND TRCJ_FECHA <= :FECFIN
    INTO :ID
DO
begin
  IDREF = null;
  SELECT first 1 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
    SELECT PREF_PRE, TRCJ_NUMERO, TRCJ_FECHA FROM TRASLADOS_CAJA WHERE TRCJ_ID = :ID INTO :PREFIJO, :NUMERO, :FECHA;
    suspend;
   end
end
TIPO = 'CONSIGNA';
TIDO = 71;
FOR SELECT CONS_ID FROM CONSIGNA
    WHERE CONS_ANULADO = 'N' AND CONS_FECHA >= :FECINI AND CONS_FECHA <= :FECFIN
    INTO :ID
DO
begin
  IDREF = null;
  SELECT first 1 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
    SELECT PRBA_PREF, CONS_NUMERO, CONS_FECHA, CUBA_COD FROM CONSIGNA WHERE CONS_ID = :ID INTO :PREFIJO, :NUMERO, :FECHA, :CTABCO;
    suspend;
   end
end
TIPO = 'CARGO BCO';
TIDO = 74;
FOR SELECT NDBC_ID FROM NOTAS_DEBITO
    WHERE NDBC_ANULADO = 'N' AND NDBC_FECHA >= :FECINI AND NDBC_FECHA <= :FECFIN
    INTO :ID
DO
begin
  IDREF = null;
  SELECT first 1 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
    SELECT PRBA_PREF, NDBC_NUMERO, NDBC_FECHA, CUBA_COD FROM NOTAS_DEBITO WHERE NDBC_ID = :ID INTO :PREFIJO, :NUMERO, :FECHA, :CTABCO;
    suspend;
   end
end
TIPO = 'ABONO BCO';
TIDO = 75;
FOR SELECT NCBC_ID FROM NOTAS_CREDITO
    WHERE NCBC_ANULADO = 'N' AND NCBC_FECHA >= :FECINI AND NCBC_FECHA <= :FECFIN
    INTO :ID
DO
begin
  IDREF = null;
  SELECT first 1 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
    SELECT PRBA_PREF, NCBC_NUMERO, NCBC_FECHA, CUBA_COD FROM NOTAS_CREDITO WHERE NCBC_ID = :ID INTO :PREFIJO, :NUMERO, :FECHA, :CTABCO;
    suspend;
   end
end
TIPO = 'TRAS.BANCO';
TIDO = 76;
FOR SELECT TRAS_ID FROM TRASLADOS
    WHERE TRAS_ANULADO = 'N' AND TRAS_FECHA >= :FECINI AND TRAS_FECHA <= :FECFIN
    INTO :ID
DO
begin
  IDREF = null;
  SELECT first 1 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
    SELECT PRBA_PREF, TRAS_NUMERO, TRAS_FECHA, CUBA_COD FROM TRASLADOS WHERE TRAS_ID = :ID INTO :PREFIJO, :NUMERO, :FECHA, :CTABCO;
    suspend;
   end
end
TIPO = 'DEVOL.CHQ.';
TIDO = 77;
FOR SELECT DVCH_ID FROM DEVOLUCION_CHEQUES
    WHERE DVCH_ANULADO = 'N' AND DVCH_FECHA >= :FECINI AND DVCH_FECHA <= :FECFIN
    INTO :ID
DO
begin
  IDREF = null;
  SELECT first 1 ENCO_IDREF FROM COMPROBANTE_ENCABEZADO WHERE ENCO_TIPOREF = 77 AND ENCO_FECHA >= :FECICNT AND ENCO_FECHA <= :FECFCNT AND ENCO_IDREF = :ID INTO :IDREF;
  if (IDREF IS NULL) then
   begin
    SELECT PRBA_PREF, DVCH_NUMDOC, DVCH_FECHA, CUBA_COD FROM DEVOLUCION_CHEQUES WHERE DVCH_ID = :ID INTO :PREFIJO, :NUMERO, :FECHA, :CTABCO;
    suspend;
   end
end
end^

SET TERM ; ^

/* DETERIORO DE CARTERA */
SET TERM ^ ;

CREATE OR ALTER procedure DETERIORO_CARTERA (
    FECHA date,
    DIAS integer,
    TASA double precision,
    TIPOCOMP varchar(3),
    PREFCNT varchar(4),
    CTAGASTO varchar(20),
    CTACART varchar(20))
returns (
    NIT varchar(20),
    DETERIORO numeric(18,2),
    IDCNT integer)
as
declare variable NUMERO varchar(8);
declare variable TIPO integer;
declare variable ID integer;
declare variable SALDO numeric(18,2);
declare variable PROY varchar(4);
declare variable CENT varchar(4);
declare variable NUMAGE integer;
declare variable SUBEMPRESA integer;
declare variable INCLANTI char(2);
declare variable FECCONTA char(8);
declare variable ITEM integer;
declare variable SUMA numeric(18,2);
declare variable NOMINAL double precision;
declare variable VPRESENTE double precision;
declare variable DIASDOC integer;
declare variable VENCE date;
declare variable AUX1 double precision;
declare variable AUX2 double precision;
begin
  execute procedure FECHA_A_CONTA(FECHA)
      returning_values (:FECCONTA);
  execute procedure CAMBIE_ID_COMPROBA
      returning_values (:IDCNT);
  select PREF_NUMERO
  from PREFIJOS_CONTA
  where TICO_COD = :TIPOCOMP and
        PRCO_PREF = :PREFCNT
  into :NUMERO;

  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 (:TIPOCOMP, :PREFCNT, :IDCNT, :NUMERO, :FECCONTA, 'DETERIORO DE CARTERA ' || :FECHA, null, 0, 0, 'S');
  execute procedure LEE_CONFIGURACION('CONTABILIDAD', 'GENERAL', 'PROYECTO UNICO')
      returning_values (PROY);
  execute procedure LEE_CONFIGURACION('CONTABILIDAD', 'GENERAL', 'CENTRO DE COSTOS UNICO')
      returning_values (CENT);
  execute procedure LEE_CONFIGURACION('CONTABILIDAD', 'GENERAL', 'NIT COMPAÑIA')
      returning_values (NIT);
  execute procedure LEE_CONFIGURACION('CARTERA', 'SALDOS',
      'INCLUIR ANTICIPOS DE CLIENTES EN REPORTES Y CONSULTAS DE CARTERA')
      returning_values (INCLANTI);
  SUMA = 0;
  ITEM = 1;
  /* tasa diaria */
  AUX1 = (1 + TASA / 100);
  AUX2 = 1.0000 / 365.0000;
  NOMINAL = power(AUX1, AUX2) - 1;
  select count(SUCU_ID)
  from SUCURSALES
  into :NUMAGE;
  if (NUMAGE > 1) then
  begin
    for select SUCU_ID, SUCU_PROY, SUCU_CENT
        from SUCURSALES
        order by SUCU_ID
        into :SUBEMPRESA, :PROY, :CENT
    do
    begin
      for select TERC_NIT
          from CLIENTES C
          where exists(select M.MVCL_ID
                       from MOVIMIENTO_CLIENTES M
                       where TERC_NIT = C.TERC_NIT and
                             MVCL_FECHA <= :FECHA)
          into :NIT
      do
      begin
        DETERIORO = 0;
        for select MVCL_TIPOREF, MVCL_IDREF, MVCL_VENCE
            from MOVIMIENTO_CLIENTES
            where MVCL_FECHA <= :FECHA and
                  MVCL_ABONO = 'N' and
                  (SUCU_ID = :SUBEMPRESA) and
                  TERC_NIT = :NIT and
                  (:FECHA - MVCL_VENCE) >= :DIAS
            into :TIPO, :ID, :VENCE
        do
        begin
          if ((INCLANTI = 'SI') or (TIPO <> 45)) then
          begin
            execute procedure SALDO_DOC_CARTERA(TIPO, ID, FECHA, 0)
                returning_values (SALDO);
            if (SALDO <> 0) then
            begin
              DIASDOC = (:FECHA - :VENCE) - :DIAS;
              /* calcule el valor presente  */
              VPRESENTE = SALDO / (power((1 + NOMINAL), DIASDOC));
              DETERIORO = DETERIORO + (SALDO - VPRESENTE);
            end
          end
        end
        if (DETERIORO > 0) then
        begin
          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 (:IDCNT, :ITEM, :CTAGASTO, :NIT, :PROY, :CENT, 'DETERIORO DE CARTERA A ' || :FECHA, null, 0, 0,
                  :DETERIORO, 0, 'S');
          SUMA = SUMA + DETERIORO;
          ITEM = ITEM + 1;
        end
        suspend;
      end
    end /* AGENCIAS */
  end
  else
    for select TERC_NIT
        from CLIENTES C
        where exists(select M.MVCL_ID
                     from MOVIMIENTO_CLIENTES M
                     where TERC_NIT = C.TERC_NIT and
                           MVCL_FECHA <= :FECHA)
        into :NIT
    do
    begin
      DETERIORO = 0;
      for select MVCL_TIPOREF, MVCL_IDREF, MVCL_VENCE
          from MOVIMIENTO_CLIENTES
          where MVCL_FECHA <= :FECHA and
                MVCL_ABONO = 'N' and
                TERC_NIT = :NIT and
                (:FECHA - MVCL_VENCE) >= :DIAS
          into :TIPO, :ID, :VENCE
      do
      begin
        if ((INCLANTI = 'SI') or (TIPO <> 45)) then
        begin
          execute procedure SALDO_DOC_CARTERA(TIPO, ID, FECHA, 0)
              returning_values (SALDO);
          if (SALDO <> 0) then
          begin
            DIASDOC = (:FECHA - :VENCE) - :DIAS;
            /* calcule el valor presente  */
            VPRESENTE = SALDO / (power((1 + NOMINAL), DIASDOC));
            DETERIORO = DETERIORO + (SALDO - VPRESENTE);
          end
        end
      end
      if (DETERIORO > 0) then
      begin
        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 (:IDCNT, :ITEM, :CTAGASTO, :NIT, :PROY, :CENT, 'DETERIORO DE CARTERA A ' || :FECHA, null, 0, 0,
                :DETERIORO, 0, 'S');
        SUMA = SUMA + DETERIORO;
        ITEM = ITEM + 1;
      end
      suspend;
    end
  if (SUMA <> 0) then
  begin
    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 (:IDCNT, :ITEM, :CTACART, :NIT, :PROY, :CENT, 'DETERIORO DE CARTERA A ' || :FECHA, null, 0, 0, 0, :SUMA, 'S');
  end
end^

SET TERM ; ^

/* IMP NAL AL CONSUMO EN CARGOS CXP */
ALTER TABLE NOTAS_DEBITO_PROVEEDOR
ADD NDPR_INALCM T_MONTO;

ALTER TABLE NOTAS_CREDITO_PROVEEDOR
ADD NCPR_INALCM T_MONTO;

ALTER TABLE NOTAS_DEBITO_PROVEEDOR
ADD NDPR_FACID T_ID;

ALTER TABLE NOTAS_CREDITO_PROVEEDOR
ADD NCPR_FACID T_ID;

/* CAJA PREDETERMINADA */
ALTER TABLE CAJAS
ADD CAJA_PREDET T_BOOLEANO;

/* INTERFAZ EN EGRESOS */
ALTER TABLE EGRESOS
ADD EGRE_IDINTER T_ID;

SET TERM ^ ;

CREATE OR 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 ^ ;

CREATE OR ALTER procedure CONSULTA_BALANCE_MES_NIIF (
    ANO char(4),
    MES integer,
    SIN_MOV char(1),
    NIVSAL integer)
returns (
    CODIGO varchar(20),
    NOMBRE varchar(140),
    INICIAL numeric(18,2),
    DEBITOS numeric(18,2),
    CREDITOS numeric(18,2),
    FINAL numeric(18,2),
    NIVEL integer,
    SUMINI numeric(18,2),
    SUMDB numeric(18,2),
    SUMCR numeric(18,2),
    SUMFIN numeric(18,2))
AS
DECLARE VARIABLE ACTIVA CHAR(1);
BEGIN
SUMINI = 0;
SUMDB = 0;
SUMCR = 0;
SUMFIN = 0;
FOR SELECT CUEN_COD, CUEN_NOM, CUEN_ACTIVA  FROM cuentas_niif order by CUEN_COD INTO CODIGO, NOMBRE, ACTIVA
DO
  BEGIN
  EXECUTE PROCEDURE VALIDE_ESTRUCTURA (CODIGO) RETURNING_VALUES (:NIVEL);
  if (NIVEL <= NIVSAL) then
    BEGIN
    EXECUTE PROCEDURE saldo_cuenta_mes_niif(CODIGO, ANO, MES, 'S') RETURNING_VALUES (INICIAL);
    EXECUTE PROCEDURE movimientos_cuenta_mes_niif(CODIGO, ANO, MES) RETURNING_VALUES(DEBITOS, CREDITOS);

    FINAL = INICIAL + DEBITOS - CREDITOS;
    if (NIVEL = 1) then
      BEGIN
      SUMINI = SUMINI + INICIAL;
      SUMDB = SUMDB + DEBITOS;
      SUMCR = SUMCR + CREDITOS;
      SUMFIN = SUMFIN + FINAL;
      END
    
    if (((SIN_MOV = 'S') AND (ACTIVA = 'S')) or (FINAL <> 0) or (DEBITOS <> 0) or (CREDITOS <> 0))then
      SUSPEND;
    END
  END
END^

SET TERM ; ^

/* TEXTOS EN TAXONOMIAS */
ALTER TABLE TAXONOMIA_INSTANCIA
ADD TAIN_ANO CHAR(4);

ALTER TABLE TAXONOMIA_INSTANCIA
ADD TAIN_PERIODO SMALLINT;

ALTER TABLE TAXONOMIA_INSTANCIA
ADD TAIN_TEXTO BLOB SUB_TYPE 1 SEGMENT SIZE 80;

SET TERM ^ ;

create trigger TAXONOMIA_INSTANCIA_BI for TAXONOMIA_INSTANCIA
active BEFORE INSERT position 0
as
begin
NEW.tain_id = gen_id(id_taxinst, 1);
end^

SET TERM ; ^


/* 201418-ii */
CREATE TABLE INTERFAZ_COMPRAS_NIIF (
    INCO_ID          T_ID NOT NULL /* T_ID = INTEGER */,
    INCO_INVEN       CHAR(1),
    INCO_IVA         CHAR(1),
    INCO_CXP         CHAR(1),
    INCO_CONSUMO     CHAR(1),
    INCO_RTFTE       CHAR(1),
    INCO_RTIVA       CHAR(1),
    INCO_RTICA       CHAR(1),
    INCO_RTCREE      CHAR(1),
    INCO_CTAINVEN    T_CTA_CONTABLE /* T_CTA_CONTABLE = VARCHAR(20) */,
    INCO_CTAIVA      T_CTA_CONTABLE /* T_CTA_CONTABLE = VARCHAR(20) */,
    INCO_CTACXP      T_CTA_CONTABLE /* T_CTA_CONTABLE = VARCHAR(20) */,
    INCO_CTACONSUMO  T_CTA_CONTABLE /* T_CTA_CONTABLE = VARCHAR(20) */,
    INCO_CTAEXTRA    T_CTA_CONTABLE /* T_CTA_CONTABLE = VARCHAR(20) */,
    INCO_CTARTFTE    T_CTA_CONTABLE /* T_CTA_CONTABLE = VARCHAR(20) */,
    INCO_CTARTIVA    T_CTA_CONTABLE /* T_CTA_CONTABLE = VARCHAR(20) */,
    INCO_CTARTICA    T_CTA_CONTABLE /* T_CTA_CONTABLE = VARCHAR(20) */,
    INCO_CTADTO      T_CTA_CONTABLE /* T_CTA_CONTABLE = VARCHAR(20) */,
    INCO_CTAADIC     T_CTA_CONTABLE /* T_CTA_CONTABLE = VARCHAR(20) */,
    INCO_CTARTCREE   T_CTA_CONTABLE /* T_CTA_CONTABLE = VARCHAR(20) */
);

ALTER TABLE INTERFAZ_COMPRAS_NIIF ADD CONSTRAINT PK_INTERFAZ_COMPRAS_N PRIMARY KEY (INCO_ID);

GRANT ALL ON INTERFAZ_COMPRAS_NIIF TO PUBLIC;

/* 20140212 */
/* ERROR POR USAR SUBSTR EN LUGAR DE SUBSTRING PARA TRUNCAR DESCRIPCION */
SET TERM ^ ;

CREATE OR ALTER procedure IMPR_COTIZACION (
    ID integer)
returns (
    PREF varchar(4),
    NUMERO varchar(8),
    FECHA date,
    VALIDEZ integer,
    NIT varchar(20),
    NOMTERCERO varchar(60),
    VENDEDOR integer,
    NOMVENDEDOR varchar(60),
    PUNTOVTA integer,
    NOMPUNTOVTA varchar(60),
    SUBTOTAL numeric(18,2),
    DTOPORC numeric(9,2),
    DTOMONTO numeric(18,2),
    ADICIONAL numeric(18,2),
    IVAMONTO numeric(18,2),
    EXTRA numeric(18,2),
    TOTALFAC numeric(18,2),
    PESOTOT numeric(18,2),
    OBS blob sub_type 1 segment size 80,
    ITEM integer,
    ARTICULO varchar(15),
    CODBAR varchar(15),
    ARTIDES varchar(60),
    CANT numeric(18,4),
    UNIDAD varchar(8),
    FACTOR numeric(18,4),
    LISTAPR integer,
    REFITEM varchar(60),
    PRUNIT numeric(18,2),
    DTOITPORC numeric(9,2),
    DTOITMONTO numeric(18,2),
    PRNETO numeric(18,2),
    PRNETOSINIVA numeric(18,2),
    IVAPORC numeric(9,2),
    IVAITMONTO numeric(18,2),
    CONSUMO numeric(18,2),
    SUBTOTIT numeric(18,2),
    TOTAL 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(9,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),
    IVA1 numeric(18,2),
    IVA2 numeric(18,2),
    IVA3 numeric(18,2),
    SUMAEX numeric(18,2),
    SUMAGR numeric(18,2),
    OBSITEM blob sub_type 1 segment size 80,
    ALTERNATIVAS numeric(18,4),
    PRINCIPALES numeric(18,4))
AS
DECLARE VARIABLE IMPTOS CHAR(1);
DECLARE VARIABLE TARIFA INTEGER;
declare variable ORDENCOD CHAR(8);
declare variable SUCUR VARCHAR(10);
declare variable ICOINC CHAR(2);
declare variable FACTCANT NUMERIC(18,4);
BEGIN
execute procedure lee_configuracion('FACTURACION', 'ARTICULOS', 'IMPOCONSUMO INCLUIDO EN EL PRECIO BASE DE VENTA ANTES DE IVA') returning_values (icoinc);
SELECT F.PREF_PRE, COTI_NUMERO, COTI_FECHA, COTI_VALIDEZ, F.TERC_NIT, COTI_NOMTERC, F.VEND_COD, VEND_NOMBRE, F.PTVT_ID, PTVT_NOM,
    COTI_IMPTOS, COTI_DTOPORC, COTI_DTOMONTO, COTI_ADICIONAL, COTI_IVAMONTO, COTI_EXTRA, COTI_TOTAL,
    TERC_CONTACTO, TERC_FAX, TERC_CEL, TERC_DV, COTI_OBS, COTI_SUCURSAL
    FROM COTIZACIONES F, VENDEDORES V, PUNTO_VENTA P, TERCEROS T
    WHERE F.VEND_COD = V.VEND_COD AND F.PTVT_ID = P.PTVT_ID AND F.TERC_NIT = T.TERC_NIT AND F.COTI_ID = :ID
    into :PREF, :NUMERO, :FECHA, :VALIDEZ, :NIT, :NOMTERCERO, :VENDEDOR, :NOMVENDEDOR, :PUNTOVTA, :NOMPUNTOVTA,
    :IMPTOS, :DTOPORC, :DTOMONTO, :ADICIONAL, :IVAMONTO, :EXTRA, :TOTALFAC,
    :CONTACTO, :FAX, :CEL, :DV, :OBS, :SUCUR;
SUBTOTAL = TOTALFAC - EXTRA - IVAMONTO - ADICIONAL + DTOMONTO;

SELECT CLIE_COD, C.ZONA_COD, ZONA_NOM
    FROM CLIENTES C, ZONAS Z
    WHERE TERC_NIT = :NIT AND C.ZONA_COD = Z.ZONA_COD
    INTO :CODIGOCL, :ZONACOD, :ZONANOM;
SELECT CLSU_DIR, CLSU_CIUDAD, CLSU_TEL FROM CLIENTE_SUCURSALES WHERE TERC_NIT = :NIT AND CLCU_COD = :SUCUR
    INTO :DIRECCION, :CIUDAD, :TELEFONO;
    
SUMAEX = 0;
SUMA1 = 0;
SUMA2 = 0;
SUMA3 = 0;
IVA1 = 0;
IVA2 = 0;
IVA3 = 0;
ITEM = 0;
PESOTOT = 0;
EXECUTE PROCEDURE lee_configuracion ('FACTURACION','DOCUMENTOS','ORDENAR ITEMS POR CODIGO DE ARTICULO') returning_values (:ORDENCOD);
if (ORDENCOD = 'SI') then
    BEGIN
    FOR SELECT D.ARTI_COD, CTDE_CODBAR, SUBSTRING(CTDE_DESC FROM 1 FOR 60), CTDE_CANT, CTDE_UNIDAD, LIPR_COD, CTDE_PRUNIT, CTDE_DTOPORC, CTDE_DTOMONTO, CTDE_IVAPORC, CTDE_IVAMONTO, CTDE_CONSUMO, CTDE_TOTAL, CTDE_REFERENCIA,
        GRUP_COD, SUBG_COD, MARC_COD, ARTI_PESO, ARTI_ANCHO, ARTI_ALTO, ARTI_LARGO, TAIV_COD, CTDE_OBS, CTDE_FACTOR
        FROM COTIZACIONES_DETALLE D, ARTICULO A
        WHERE D.ARTI_COD = A.ARTI_COD AND D.COTI_ID = :ID
        ORDER BY CTDE_CODBAR
        INTO :ARTICULO, :CODBAR, :ARTIDES, :CANT, :UNIDAD, :LISTAPR, :PRUNIT, :DTOITPORC, :DTOITMONTO, :IVAPORC, :IVAITMONTO, :CONSUMO, :TOTAL, :refitem,
        :GRUPO, :SUBGRUPO, :MARCA, :PESO, :ANCHO, :ALTO, :LARGO, :TARIFA, :obsitem, :FACTOR
        DO
        BEGIN
        if (ICOINC = 'SI') then
            SUBTOTIT = TOTAL - IVAITMONTO;
        else
            SUBTOTIT = TOTAL - IVAITMONTO - CONSUMO;
        if (ARTICULO = CODBAR) then
            SELECT FIRST 1 COBA_COD FROM barras_articulo WHERE ARTI_COD = :articulo INTO :CODBAR;
        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;
        ITEM = ITEM + 1;
        PRNETO = PRUNIT - DTOITMONTO;
        if (PESO IS NULL) then
            PESO = 0;
        PESO = PESO / 1000 * CANT * FACTOR;
        PESOTOT = PESOTOT + PESO;
        if (IMPTOS = 'S') then
            if (cant <> 0) then
                prnetosiniva = PRUNIT - DTOITMONTO - ((IVAITMONTO+CONSUMO) / CANT);
            else
                prnetosiniva = PRUNIT - DTOITMONTO;
        ELSE
            prnetosiniva = PRUNIT - DTOITMONTO;
        if (ivaporc = 0) then
            SUMAEX = SUMAEX + TOTAL;
        if (TARIFA = 1) then
            BEGIN
            SUMA1 = SUMA1 + TOTAL - IVAITMONTO;
            IVA1 = IVA1 + IVAITMONTO;
            END
        if (TARIFA = 2) then
            BEGIN
            SUMA2 = SUMA2 + TOTAL - IVAITMONTO;
            IVA2 = IVA2 + IVAITMONTO;
            END
        if (TARIFA = 3) then
            BEGIN
            SUMA3 = SUMA3 + TOTAL - IVAITMONTO;
            IVA3 = IVA3 + IVAITMONTO;
            END
        SUMAGR = SUMA1 + SUMA2 + SUMA3;
        if (IMPTOS = 'N') then
            TOTAL = TOTAL - IVAITMONTO;
        factcant = NULL;
        SELECT FIRST 1 UNAR_FACCAN FROM unidad_articulo WHERE ARTI_COD = :articulo INTO :factcant;
        if (factcant IS NULL) then
            factcant = 1;
        if ((factcant = 1) or (factcant = 0)) then
            BEGIN
            ALTERNATIVAS = 0;
            PRINCIPALES = (CANT * FACTOR);
            END
        ELSE
            BEGIN
            ALTERNATIVAS = FLOOR(CANT * factor / factcant);
            PRINCIPALES = (CANT * FACTOR) - (alternativas * factcant);
            END
        SUSPEND;
        END
    END
ELSE
  if (ORDENCOD = 'UNIDAD') then
    BEGIN
    FOR SELECT D.ARTI_COD, CTDE_CODBAR, SUBSTRING(CTDE_DESC FROM 1 FOR 60), CTDE_CANT, CTDE_UNIDAD, LIPR_COD, CTDE_PRUNIT, CTDE_DTOPORC, CTDE_DTOMONTO, CTDE_IVAPORC, CTDE_IVAMONTO, CTDE_CONSUMO, CTDE_TOTAL, CTDE_REFERENCIA,
        GRUP_COD, SUBG_COD, MARC_COD, ARTI_PESO, ARTI_ANCHO, ARTI_ALTO, ARTI_LARGO, TAIV_COD, CTDE_OBS, CTDE_FACTOR
        FROM COTIZACIONES_DETALLE D, ARTICULO A
        WHERE D.ARTI_COD = A.ARTI_COD AND D.COTI_ID = :ID
        ORDER BY D.ctde_unidad, D.ctde_desc
        INTO :ARTICULO, :CODBAR, :ARTIDES, :CANT, :UNIDAD, :LISTAPR, :PRUNIT, :DTOITPORC, :DTOITMONTO, :IVAPORC, :IVAITMONTO, :CONSUMO, :TOTAL, :refitem,
        :GRUPO, :SUBGRUPO, :MARCA, :PESO, :ANCHO, :ALTO, :LARGO, :TARIFA, :obsitem, :FACTOR
        DO
        BEGIN
        if (ICOINC = 'SI') then
            SUBTOTIT = TOTAL - IVAITMONTO;
        else
            SUBTOTIT = TOTAL - IVAITMONTO - CONSUMO;
        if (ARTICULO = CODBAR) then
            SELECT FIRST 1 COBA_COD FROM barras_articulo WHERE ARTI_COD = :articulo INTO :CODBAR;
        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;
        ITEM = ITEM + 1;
        PRNETO = PRUNIT - DTOITMONTO;
        if (PESO IS NULL) then
            PESO = 0;
        PESO = PESO / 1000 * CANT * FACTOR;
        PESOTOT = PESOTOT + PESO;
        if (IMPTOS = 'S') then
            if (cant <> 0) then
                prnetosiniva = PRUNIT - DTOITMONTO - ((IVAITMONTO+CONSUMO) / CANT);
            else
                prnetosiniva = PRUNIT - DTOITMONTO;
        ELSE
            prnetosiniva = PRUNIT - DTOITMONTO;
        if (ivaporc = 0) then
            SUMAEX = SUMAEX + TOTAL;
        if (TARIFA = 1) then
            BEGIN
            SUMA1 = SUMA1 + TOTAL - IVAITMONTO;
            IVA1 = IVA1 + IVAITMONTO;
            END
        if (TARIFA = 2) then
            BEGIN
            SUMA2 = SUMA2 + TOTAL - IVAITMONTO;
            IVA2 = IVA2 + IVAITMONTO;
            END
        if (TARIFA = 3) then
            BEGIN
            SUMA3 = SUMA3 + TOTAL - IVAITMONTO;
            IVA3 = IVA3 + IVAITMONTO;
            END
        SUMAGR = SUMA1 + SUMA2 + SUMA3;
        if (IMPTOS = 'N') then
            TOTAL = TOTAL - IVAITMONTO;
        factcant = NULL;
        SELECT FIRST 1 UNAR_FACCAN FROM unidad_articulo WHERE ARTI_COD = :articulo INTO :factcant;
        if (factcant IS NULL) then
            factcant = 1;
        if ((factcant = 1) or (factcant = 0)) then
            BEGIN
            ALTERNATIVAS = 0;
            PRINCIPALES = (CANT * FACTOR);
            END
        ELSE
            BEGIN
            ALTERNATIVAS = FLOOR(CANT * factor / factcant);
            PRINCIPALES = (CANT * FACTOR) - (alternativas * factcant);
            END
        SUSPEND;
        END
    END
  ELSE
    BEGIN
    FOR SELECT D.ARTI_COD, CTDE_CODBAR, SUBSTRING(CTDE_DESC FROM 1 FOR 60), CTDE_CANT, CTDE_UNIDAD, LIPR_COD, CTDE_PRUNIT, CTDE_DTOPORC, CTDE_DTOMONTO, CTDE_IVAPORC, CTDE_IVAMONTO, CTDE_CONSUMO, CTDE_TOTAL, CTDE_REFERENCIA,
        GRUP_COD, SUBG_COD, MARC_COD, ARTI_PESO, ARTI_ANCHO, ARTI_ALTO, ARTI_LARGO, TAIV_COD, CTDE_OBS, CTDE_FACTOR
        FROM COTIZACIONES_DETALLE D, ARTICULO A
        WHERE D.ARTI_COD = A.ARTI_COD AND D.COTI_ID = :ID
        ORDER BY CTDE_ITEM
        INTO :ARTICULO, :CODBAR, :ARTIDES, :CANT, :UNIDAD, :LISTAPR, :PRUNIT, :DTOITPORC, :DTOITMONTO, :IVAPORC, :IVAITMONTO, :CONSUMO, :TOTAL, :refitem,
        :GRUPO, :SUBGRUPO, :MARCA, :PESO, :ANCHO, :ALTO, :LARGO, :TARIFA, :obsitem, :FACTOR
        DO
        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;
        ITEM = ITEM + 1;
        if (ICOINC = 'SI') then
            SUBTOTIT = TOTAL - IVAITMONTO;
        else
            SUBTOTIT = TOTAL - IVAITMONTO - CONSUMO;
        PRNETO = PRUNIT - DTOITMONTO;
        if (PESO IS NULL) then
            PESO = 0;
        PESO = PESO / 1000 * CANT * FACTOR;
        PESOTOT = PESOTOT + PESO;
        if (IMPTOS = 'S') then
            if (cant <> 0) then
                prnetosiniva = PRUNIT - DTOITMONTO - ((IVAITMONTO+CONSUMO) / CANT);
            else
                prnetosiniva = PRUNIT - DTOITMONTO;
        ELSE
            prnetosiniva = PRUNIT - DTOITMONTO;
        if (ivaporc = 0) then
            SUMAEX = SUMAEX + TOTAL;
        if (TARIFA = 1) then
            BEGIN
            SUMA1 = SUMA1 + TOTAL - IVAITMONTO;
            IVA1 = IVA1 + IVAITMONTO;
            END
        if (TARIFA = 2) then
            BEGIN
            SUMA2 = SUMA2 + TOTAL - IVAITMONTO;
            IVA2 = IVA2 + IVAITMONTO;
            END
        if (TARIFA = 3) then
            BEGIN
            SUMA3 = SUMA3 + TOTAL - IVAITMONTO;
            IVA3 = IVA3 + IVAITMONTO;
            END
        SUMAGR = SUMA1 + SUMA2 + SUMA3;
        if (IMPTOS = 'N') then
            TOTAL = TOTAL - IVAITMONTO;
        factcant = NULL;
        SELECT FIRST 1 UNAR_FACCAN FROM unidad_articulo WHERE ARTI_COD = :articulo INTO :factcant;
        if (factcant IS NULL) then
            factcant = 1;
        if ((factcant = 1) or (factcant = 0)) then
            BEGIN
            ALTERNATIVAS = 0;
            PRINCIPALES = (CANT * FACTOR);
            END
        ELSE
            BEGIN
            ALTERNATIVAS = FLOOR(CANT * factor / factcant);
            PRINCIPALES = (CANT * FACTOR) - (alternativas * factcant);
            END
        SUSPEND;
        END
    END
END^

SET TERM ; ^


SET TERM ^ ;

CREATE OR ALTER procedure IMPR_DEVOLPROV (
    ID integer)
returns (
    PREF varchar(4),
    NUMERO varchar(8),
    FECHA date,
    NIT varchar(20),
    NOMTERCERO varchar(60),
    CODBODEGA varchar(2),
    NOMBODEGA varchar(30),
    FACTURA varchar(30),
    NUMPROV varchar(30),
    SUBTOTAL numeric(18,2),
    DTOPORC numeric(9,2),
    DTOMONTO numeric(18,2),
    ADICIONAL numeric(18,2),
    IVAMONTO 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),
    RTECREE numeric(9,2),
    RTECREEM numeric(18,2),
    EXTRA numeric(18,2),
    TOTALFAC numeric(18,2),
    TOTALPAGAR numeric(18,2),
    OBS blob sub_type 1 segment size 80,
    ITEM integer,
    ARTICULO varchar(15),
    CODBAR varchar(15),
    ARTIDES varchar(60),
    CANT numeric(18,4),
    UNIDAD varchar(8),
    BODITEM varchar(2),
    PRUNIT numeric(18,2),
    DTOITPORC numeric(9,2),
    DTOITMONTO numeric(18,2),
    PRNETO numeric(18,2),
    IVAPORC numeric(9,2),
    IVAITMONTO numeric(18,2),
    CONSUMO numeric(18,2),
    TOTAL numeric(18,2),
    OBSITEM blob sub_type 1 segment size 80,
    CODIGOPR varchar(20),
    ZONACOD varchar(2),
    ZONANOM varchar(30),
    DV char(1),
    DIRECCION varchar(60),
    CIUDAD varchar(40),
    TELEFONO varchar(40),
    CONTACTO varchar(60),
    FAX varchar(25),
    GRUPO varchar(2),
    SUBGRUPO varchar(3),
    MARCA varchar(3),
    PESO numeric(9,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),
    IVA1 numeric(18,2),
    IVA2 numeric(18,2),
    IVA3 numeric(18,2),
    TOTCONSUMO numeric(18,2),
    SUMAEX numeric(18,2),
    SUMAGR numeric(18,2))
AS
declare variable IMPTOS CHAR(1);
declare variable TARIFA INTEGER;
declare variable orden char(2);
declare variable IDFACT INTEGER;
BEGIN
  SELECT PREF_PRE, DVCO_NUMERO, DVCO_FECHA, D.BODE_COD, BODE_NOM, D.TERC_NIT, TERC_NOM, DVCO_FACTURA, DVCO_IMPTOS,
    DVCO_DTOPORC, DVCO_DTOMONTO, DVCO_ADICIONAL, DVCO_IVAMONTO,
    DVCO_EXTRA, DVCO_RTFTEPORC, DVCO_RTFTEMONTO, DVCO_RTIVAPORC, DVCO_RTIVAMONTO, DVCO_RTICAPORC, DVCO_RTICAMONTO, DVCO_RTCREE, DVCO_RTCREEM,
    DVCO_TOTAL, TERC_DIR, TERC_CIU, TERC_TEL, TERC_CONTACTO, TERC_FAX, TERC_DV, DVCO_OBS, DVCO_FACTID
    FROM DEVOLUCIONES_COMPRAS D, BODEGA B, TERCEROS T
    WHERE D.BODE_COD = B.BODE_COD AND D.TERC_NIT = T.TERC_NIT AND D.DVCO_ID = :ID
    into :PREF, :NUMERO, :FECHA, :CODBODEGA, :NOMBODEGA, :NIT, :NOMTERCERO, :FACTURA, :IMPTOS,
    :DTOPORC, :DTOMONTO, :ADICIONAL, :IVAMONTO,
    :EXTRA, :RTEFTEPORC, :RTEFTEMONTO, :RTEIVAPORC, :RTEIVAMONTO, :RTEICAPORC, :RTEICAMONTO, :RTECREE, :RTECREEM,
    :TOTALFAC, :DIRECCION, :CIUDAD, :TELEFONO, :CONTACTO, :FAX, :DV, :OBS, :IDFACT;
    
  SELECT PROV_COD, P.GRPR_COD, GRPR_NOM
    FROM PROVEEDORES P, GRUPOS_PROVEEDORES G
    WHERE TERC_NIT = :NIT AND G.GRPR_COD = P.GRPR_COD
    INTO :CODIGOPR, :ZONACOD, :ZONANOM;
  SELECT FACO_NUMPROV FROM FACTURAS_COMPRA WHERE FACO_ID = :idfact INTO :numprov;
  SUBTOTAL = TOTALFAC - EXTRA - IVAMONTO - ADICIONAL + DTOMONTO;
  TOTALPAGAR = TOTALFAC - RTEFTEMONTO - RTEIVAMONTO - RTEICAMONTO - RTECREEM;
  SUMAEX = 0;
  SUMA1 = 0;
  SUMA2 = 0;
  SUMA3 = 0;
  IVA1 = 0;
  IVA2 = 0;
  IVA3 = 0;
  TOTCONSUMO = 0;
  ITEM = 0;

execute procedure lee_configuracion('COMPRAS', 'DOCUMENTOS', 'ORDENAR ITEMS POR BODEGA AL IMPRIMIR DOCUMENTOS') returning_values (:Orden);
if (orden = 'NO') then
  BEGIN
  FOR SELECT D.ARTI_COD, DVCD_CODBAR, SUBSTRING(DVCD_DESC FROM 1 FOR 60), DVCD_CANT, DVCD_UNIDAD, BODE_COD, DVCD_PRUNIT,
    DVCD_DTOPORC, DVCD_DTOMONTO, DVCD_IVAPORC, DVCD_IVAMONTO, DVCD_CONSUMO, DVCD_TOTAL, DVCD_OBS,
    GRUP_COD, SUBG_COD, MARC_COD, ARTI_PESO, ARTI_ANCHO, ARTI_ALTO, ARTI_LARGO, TAIV_COD
    FROM DEVOLUCIONES_COMPRAS_DET D, ARTICULO A
    WHERE D.ARTI_COD = A.ARTI_COD AND D.DVCO_ID = :ID
    ORDER BY DVCD_ITEM
    INTO :ARTICULO, :CODBAR, :ARTIDES, :CANT, :UNIDAD, :BODITEM, :PRUNIT,
    :DTOITPORC, :DTOITMONTO, :IVAPORC, :IVAITMONTO, :CONSUMO, :TOTAL, :OBSITEM,
    :GRUPO, :SUBGRUPO, :MARCA, :PESO, :ANCHO, :ALTO, :LARGO, :TARIFA
    DO
      BEGIN
      ITEM = ITEM + 1;
      PRNETO = PRUNIT - DTOITMONTO - ((IVAITMONTO+CONSUMO) / CANT);
      TOTCONSUMO = TOTCONSUMO + CONSUMO;
      if (IVAPORC = 0) then
        SUMAEX = SUMAEX + TOTAL;
      if (TARIFA = 1) then
        BEGIN
        SUMA1 = SUMA1 + TOTAL - IVAITMONTO;
        IVA1 = IVA1 + IVAITMONTO;
        END
      if (TARIFA = 2) then
        BEGIN
        SUMA2 = SUMA2 + TOTAL - IVAITMONTO;
        IVA2 = IVA2 + IVAITMONTO;
        END
      if (TARIFA = 3) then
        BEGIN
        SUMA3 = SUMA3 + TOTAL - IVAITMONTO;
        IVA3 = IVA3 + IVAITMONTO;
        END
      SUMAGR = SUMA1 + SUMA2 + SUMA3;
      if (IMPTOS = 'N') then
        TOTAL = TOTAL - IVAITMONTO - CONSUMO;
      SUSPEND;
      END
  END
ELSE
  BEGIN
  FOR SELECT D.ARTI_COD, DVCD_CODBAR, SUBSTRING(DVCD_DESC FROM 1 FOR 60), DVCD_CANT, DVCD_UNIDAD, BODE_COD, DVCD_PRUNIT,
    DVCD_DTOPORC, DVCD_DTOMONTO, DVCD_IVAPORC, DVCD_IVAMONTO, DVCD_CONSUMO, DVCD_TOTAL, DVCD_OBS,
    GRUP_COD, SUBG_COD, MARC_COD, ARTI_PESO, ARTI_ANCHO, ARTI_ALTO, ARTI_LARGO, TAIV_COD
    FROM DEVOLUCIONES_COMPRAS_DET D, ARTICULO A
    WHERE D.ARTI_COD = A.ARTI_COD AND D.DVCO_ID = :ID
    ORDER BY D.bode_cod, DVCD_ITEM
    INTO :ARTICULO, :CODBAR, :ARTIDES, :CANT, :UNIDAD, :BODITEM, :PRUNIT,
    :DTOITPORC, :DTOITMONTO, :IVAPORC, :IVAITMONTO, :CONSUMO, :TOTAL, :OBSITEM,
    :GRUPO, :SUBGRUPO, :MARCA, :PESO, :ANCHO, :ALTO, :LARGO, :TARIFA
    DO
      BEGIN
      ITEM = ITEM + 1;
      PRNETO = PRUNIT - DTOITMONTO - ((IVAITMONTO+CONSUMO) / CANT);
      TOTCONSUMO = TOTCONSUMO + CONSUMO;
      if (IVAPORC = 0) then
        SUMAEX = SUMAEX + TOTAL;
      if (TARIFA = 1) then
        BEGIN
        SUMA1 = SUMA1 + TOTAL - IVAITMONTO;
        IVA1 = IVA1 + IVAITMONTO;
        END
      if (TARIFA = 2) then
        BEGIN
        SUMA2 = SUMA2 + TOTAL - IVAITMONTO;
        IVA2 = IVA2 + IVAITMONTO;
        END
      if (TARIFA = 3) then
        BEGIN
        SUMA3 = SUMA3 + TOTAL - IVAITMONTO;
        IVA3 = IVA3 + IVAITMONTO;
        END
      SUMAGR = SUMA1 + SUMA2 + SUMA3;
      if (IMPTOS = 'N') then
        TOTAL = TOTAL - IVAITMONTO - CONSUMO;
      SUSPEND;
      END
  END
END^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER procedure IMPR_DEVOLUCION (
    ID integer)
returns (
    PREF varchar(4),
    NUMERO varchar(8),
    FECHA date,
    NIT varchar(20),
    NOMTERCERO varchar(60),
    VENDEDOR integer,
    NOMVENDEDOR varchar(60),
    PUNTOVTA integer,
    NOMPUNTOVTA varchar(60),
    CODBODEGA varchar(2),
    NOMBODEGA varchar(30),
    FACTURA varchar(30),
    REMISION varchar(12),
    COMIPORC numeric(9,2),
    COMIMONTO numeric(18,2),
    SUBTOTAL 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),
    TOTALFAC numeric(18,2),
    TOTALPAGAR numeric(18,2),
    PESOTOT numeric(18,2),
    OBS blob sub_type 1 segment size 80,
    ITEM integer,
    ARTICULO varchar(15),
    CODBAR varchar(15),
    ARTIDES varchar(60),
    CANT numeric(18,4),
    LOTE varchar(15),
    UNIDAD varchar(8),
    FACTOR numeric(18,4),
    REFITEM varchar(60),
    BODITEM varchar(2),
    PRUNIT numeric(18,2),
    DTOITPORC numeric(9,2),
    DTOITMONTO numeric(18,2),
    PRNETO numeric(18,2),
    PRNETOSINIVA numeric(18,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),
    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(9,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),
    TOTCONSUMO numeric(18,2),
    TOTINALC numeric(18,2),
    SUMAEX numeric(18,2),
    SUMAGR numeric(18,2),
    OBSITEM blob sub_type 1 segment size 80,
    ALTERNATIVAS numeric(18,4),
    PRINCIPALES numeric(18,4))
AS
DECLARE VARIABLE IMPTOS CHAR(1);
DECLARE VARIABLE TARIFA INTEGER;
declare variable ORDENCOD CHAR(8);
declare variable SUCUR VARCHAR(10);
declare variable PUNTOS NUMERIC(18,4);
declare variable ICOINC CHAR(2);
declare variable FACTCANT NUMERIC(18,4);
declare variable ANULADO CHAR(1);
declare variable AUTORCREE VARCHAR(10);
declare variable FAUTORCREE DATE;
BEGIN
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';
execute procedure lee_configuracion('FACTURACION', 'ARTICULOS', 'IMPOCONSUMO INCLUIDO EN EL PRECIO BASE DE VENTA ANTES DE IVA') returning_values (icoinc);
SELECT F.PREF_PRE, DEVT_NUMERO, DEVT_FECHA, F.BODE_COD, BODE_NOM, F.TERC_NIT, DEVT_NOMTERC, F.VEND_COD, VEND_NOMBRE, F.PTVT_ID, PTVT_NOM,
    DEVT_FACTURA, DEVT_COMIPORC, DEVT_COMIMONTO, DEVT_IVAINC, DEVT_DTOPOR, DEVT_DTOMONTO, DEVT_ADICIONAL, DEVT_IVAMONTO, DEVT_DEC2799,
    DEVT_RTFTEPORC, DEVT_RTFTEMONTO, DEVT_RTIVAPORC, DEVT_RTIVAMONTO, DEVT_RTICAPORC, DEVT_RTICAMONTO, DEVT_RTCREE, DEVT_RTCREEM, DEVT_EXTRA, DEVT_TOTAL,
    TERC_CONTACTO, TERC_FAX, TERC_DV, TERC_CEL, DEVT_OBS, DEVT_SUCURSAL, DEVT_REMISION, DEVT_ANULADO
    FROM DEVOLUCIONES_VENTAS 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.DEVT_ID = :ID
    into :PREF, :NUMERO, :FECHA, :CODBODEGA, :NOMBODEGA, :NIT, :NOMTERCERO, :VENDEDOR, :NOMVENDEDOR, :PUNTOVTA, :NOMPUNTOVTA,
    :FACTURA, :COMIPORC, :COMIMONTO, :IMPTOS, :DTOPORC, :DTOMONTO, :ADICIONAL, :IVAMONTO, :dec2799,
    :RTEFTEPORC, :RTEFTEMONTO, :RTEIVAPORC, :RTEIVAMONTO, :RTEICAPORC, :RTEICAMONTO, :rtecreep, :rtecreem, :EXTRA, :TOTALFAC,
    :CONTACTO, :FAX, :DV, :CEL, :OBS, :SUCUR, :REMISION, :ANULADO;
SUBTOTAL = TOTALFAC - EXTRA - IVAMONTO - ADICIONAL + DTOMONTO + dec2799;
if (fautorcree < FECHA) then
    TOTALPAGAR = TOTALFAC - RTEFTEMONTO - RTEIVAMONTO - RTEICAMONTO;
else
    TOTALPAGAR = TOTALFAC - RTEFTEMONTO - RTEIVAMONTO - RTEICAMONTO - rtecreem;
if (ANULADO = 'N') then
    EXECUTE PROCEDURE acumula_puntos_cliente (33, :id, :nit, :fecha) returning_values (:PUNTOS);
SELECT CLIE_COD, C.ZONA_COD, ZONA_NOM
    FROM CLIENTES C, ZONAS Z
    WHERE TERC_NIT = :NIT AND C.ZONA_COD = Z.ZONA_COD
    INTO :CODIGOCL, :ZONACOD, :ZONANOM;
SELECT CLSU_DIR, CLSU_CIUDAD, CLSU_TEL FROM CLIENTE_SUCURSALES WHERE TERC_NIT = :NIT AND CLCU_COD = :SUCUR
    INTO :DIRECCION, :CIUDAD, :TELEFONO;
    
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;
ITEM = 0;
EXECUTE PROCEDURE lee_configuracion ('FACTURACION','DOCUMENTOS','ORDENAR ITEMS POR CODIGO DE ARTICULO') returning_values (:ORDENCOD);
if (ORDENCOD = 'SI') then
    BEGIN
    FOR SELECT D.ARTI_COD, DVDE_CODBAR, SUBSTRING(DVDE_DESC FROM 1 FOR 60), DVDE_CANT, DVDE_UNIDAD, BODE_COD, DVDE_LOTE, DVDE_PRUNIT, DVDE_DTOPORC, DVDE_DTOMONTO, DVDE_IVAPORC, DVDE_IVAMONTO, DVDE_CONSUMO, DVDE_TOTAL, DVDE_REFERENCIA,
        GRUP_COD, SUBG_COD, MARC_COD, ARTI_PESO, ARTI_ANCHO, ARTI_ALTO, ARTI_LARGO, TAIV_COD, DVDE_OBS, DVDE_FACTOR, DVDE_INACM
        FROM DEVOLUCIONES_VENTAS_DETALLE D, ARTICULO A
        WHERE D.ARTI_COD = A.ARTI_COD AND D.DEVT_ID = :ID
        ORDER BY DVDE_CODBAR
        INTO :ARTICULO, :CODBAR, :ARTIDES, :CANT, :UNIDAD, :BODITEM, :LOTE, :PRUNIT, :DTOITPORC, :DTOITMONTO, :IVAPORC, :IVAITMONTO, :CONSUMO, :TOTAL, :REFITEM,
        :GRUPO, :SUBGRUPO, :MARCA, :PESO, :ANCHO, :ALTO, :LARGO, :TARIFA, :obsitem, :FACTOR, :INALC
        DO
        BEGIN
        if (ARTICULO = CODBAR) then
            SELECT FIRST 1 COBA_COD FROM barras_articulo WHERE ARTI_COD = :articulo INTO :CODBAR;
        ITEM = ITEM + 1;
        if (ICOINC = 'SI') then
            SUBTOTIT = TOTAL - IVAITMONTO;
        else
            SUBTOTIT = TOTAL - IVAITMONTO - CONSUMO - INALC;
        PRNETO = PRUNIT - DTOITMONTO;
        if (PESO IS NULL) then
            PESO = 0;
        PESO = PESO / 1000 * CANT * FACTOR;
        PESOTOT = PESOTOT + PESO;
        if (IMPTOS = 'S') then
            if (cant <> 0) then
                prnetosiniva = PRUNIT - DTOITMONTO - ((IVAITMONTO+CONSUMO+INALC) / CANT);
            else
                prnetosiniva = PRUNIT - DTOITMONTO;
        ELSE
            prnetosiniva = PRUNIT - DTOITMONTO;
        TOTCONSUMO = TOTCONSUMO + CONSUMO;
        TOTINALC = TOTINALC + INALC;
        if ((REFITEM <> '.t') or (REFITEM IS NULL)) then
            BEGIN
            /* NO SUME LOS ENSAMBLES */
            if (IVAPORC = 0) then
                SUMAEX = SUMAEX + TOTAL;
            if (TARIFA = 1) then
                BEGIN
                SUMA1 = SUMA1 + (TOTAL - IVAITMONTO - CONSUMO - INALC);
                IVA1 = IVA1 + IVAITMONTO;
                END
            if (TARIFA = 2) then
                BEGIN
                SUMA2 = SUMA2 + (TOTAL - IVAITMONTO - CONSUMO - INALC);
                IVA2 = IVA2 + IVAITMONTO;
                END
            if (TARIFA = 3) then
                BEGIN
                SUMA3 = SUMA3 + (TOTAL - IVAITMONTO - CONSUMO - INALC);
                IVA3 = IVA3 + IVAITMONTO;
                END
            if (TARIFA = 4) then
                BEGIN
                SUMA4 = SUMA4 + (TOTAL - IVAITMONTO - CONSUMO - INALC);
                IVA4 = IVA4 + IVAITMONTO;
                END
            if (TARIFA = 5) then
                BEGIN
                SUMA5 = SUMA5 + (TOTAL - IVAITMONTO - CONSUMO - INALC);
                IVA5 = IVA5 + IVAITMONTO;
                END
            SUMAGR = SUMA1 + SUMA2 + SUMA3 + suma4 + suma5;
            END
        if (substr(ARTICULO,1,2) = '.t') then
            BEGIN
            REFITEM = '';
            TOTAL = 0;
            END
        factcant = NULL;
        SELECT FIRST 1 UNAR_FACCAN FROM unidad_articulo WHERE ARTI_COD = :articulo INTO :factcant;
        if (factcant IS NULL) then
            factcant = 1;
        if ((factcant = 1) or (factcant = 0)) then
            BEGIN
            ALTERNATIVAS = 0;
            PRINCIPALES = (CANT * FACTOR);
            END
        ELSE
            BEGIN
            ALTERNATIVAS = FLOOR(CANT * factor / factcant);
            PRINCIPALES = (CANT * FACTOR) - (alternativas * factcant);
            END
        SUSPEND;
        END
    END
ELSE
  if (ORDENCOD = 'UNIDAD') then
    BEGIN
    FOR SELECT D.ARTI_COD, DVDE_CODBAR, SUBSTRING(DVDE_DESC FROM 1 FOR 60), DVDE_CANT, DVDE_UNIDAD, BODE_COD, DVDE_LOTE, DVDE_PRUNIT, DVDE_DTOPORC, DVDE_DTOMONTO, DVDE_IVAPORC, DVDE_IVAMONTO, DVDE_CONSUMO, DVDE_TOTAL, DVDE_REFERENCIA,
        GRUP_COD, SUBG_COD, MARC_COD, ARTI_PESO, ARTI_ANCHO, ARTI_ALTO, ARTI_LARGO, TAIV_COD, DVDE_OBS, DVDE_FACTOR, DVDE_INACM
        FROM DEVOLUCIONES_VENTAS_DETALLE D, ARTICULO A
        WHERE D.ARTI_COD = A.ARTI_COD AND D.DEVT_ID = :ID
        ORDER BY D.dvde_unidad, D.dvde_desc
        INTO :ARTICULO, :CODBAR, :ARTIDES, :CANT, :UNIDAD, :BODITEM, :LOTE, :PRUNIT, :DTOITPORC, :DTOITMONTO, :IVAPORC, :IVAITMONTO, :CONSUMO, :TOTAL, :REFITEM,
        :GRUPO, :SUBGRUPO, :MARCA, :PESO, :ANCHO, :ALTO, :LARGO, :TARIFA, :obsitem, :FACTOR, :INALC
        DO
        BEGIN
        if (ARTICULO = CODBAR) then
            SELECT FIRST 1 COBA_COD FROM barras_articulo WHERE ARTI_COD = :articulo INTO :CODBAR;
        ITEM = ITEM + 1;
        if (ICOINC = 'SI') then
            SUBTOTIT = TOTAL - IVAITMONTO;
        else
            SUBTOTIT = TOTAL - IVAITMONTO - CONSUMO - INALC;
        PRNETO = PRUNIT - DTOITMONTO;
        if (PESO IS NULL) then
            PESO = 0;
        PESO = PESO / 1000 * CANT * FACTOR;
        PESOTOT = PESOTOT + PESO;
        if (IMPTOS = 'S') then
            if (cant <> 0) then
                prnetosiniva = PRUNIT - DTOITMONTO - ((IVAITMONTO+CONSUMO+INALC) / CANT);
            else
                prnetosiniva = PRUNIT - DTOITMONTO;
        ELSE
            prnetosiniva = PRUNIT - DTOITMONTO;
        TOTCONSUMO = TOTCONSUMO + CONSUMO;
        TOTINALC = TOTINALC + INALC;
        if ((REFITEM <> '.t') or (REFITEM IS NULL)) then
            BEGIN
            /* NO SUME LOS ENSAMBLES */
            if (IVAPORC = 0) then
                SUMAEX = SUMAEX + TOTAL;
            if (TARIFA = 1) then
                BEGIN
                SUMA1 = SUMA1 + (TOTAL - IVAITMONTO - CONSUMO - INALC);
                IVA1 = IVA1 + IVAITMONTO;
                END
            if (TARIFA = 2) then
                BEGIN
                SUMA2 = SUMA2 + (TOTAL - IVAITMONTO - CONSUMO - INALC);
                IVA2 = IVA2 + IVAITMONTO;
                END
            if (TARIFA = 3) then
                BEGIN
                SUMA3 = SUMA3 + (TOTAL - IVAITMONTO - CONSUMO - INALC);
                IVA3 = IVA3 + IVAITMONTO;
                END
            if (TARIFA = 4) then
                BEGIN
                SUMA4 = SUMA4 + (TOTAL - IVAITMONTO - CONSUMO - INALC);
                IVA4 = IVA4 + IVAITMONTO;
                END
            if (TARIFA = 5) then
                BEGIN
                SUMA5 = SUMA5 + (TOTAL - IVAITMONTO - CONSUMO - INALC);
                IVA5 = IVA5 + IVAITMONTO;
                END
            SUMAGR = SUMA1 + SUMA2 + SUMA3 + suma4 + suma5;
            END
        if (substr(ARTICULO,1,2) = '.t') then
            BEGIN
            REFITEM = '';
            TOTAL = 0;
            END
        factcant = NULL;
        SELECT FIRST 1 UNAR_FACCAN FROM unidad_articulo WHERE ARTI_COD = :articulo INTO :factcant;
        if (factcant IS NULL) then
            factcant = 1;
        if ((factcant = 1) or (factcant = 0)) then
            BEGIN
            ALTERNATIVAS = 0;
            PRINCIPALES = (CANT * FACTOR);
            END
        ELSE
            BEGIN
            ALTERNATIVAS = FLOOR(CANT * factor / factcant);
            PRINCIPALES = (CANT * FACTOR) - (alternativas * factcant);
            END
        SUSPEND;
        END
    END
  ELSE
    BEGIN
    FOR SELECT D.ARTI_COD, DVDE_CODBAR, SUBSTRING(DVDE_DESC FROM 1 FOR 60), DVDE_CANT, DVDE_UNIDAD, BODE_COD, DVDE_LOTE, DVDE_PRUNIT, DVDE_DTOPORC, DVDE_DTOMONTO, DVDE_IVAPORC, DVDE_IVAMONTO, DVDE_CONSUMO, DVDE_TOTAL, DVDE_REFERENCIA,
        GRUP_COD, SUBG_COD, MARC_COD, ARTI_PESO, ARTI_ANCHO, ARTI_ALTO, ARTI_LARGO, TAIV_COD, DVDE_OBS, DVDE_FACTOR, DVDE_INACM
        FROM DEVOLUCIONES_VENTAS_DETALLE D, ARTICULO A
        WHERE D.ARTI_COD = A.ARTI_COD AND D.DEVT_ID = :ID
        ORDER BY DVDE_ITEM
        INTO :ARTICULO, :CODBAR, :ARTIDES, :CANT, :UNIDAD, :BODITEM, :LOTE, :PRUNIT, :DTOITPORC, :DTOITMONTO, :IVAPORC, :IVAITMONTO, :CONSUMO, :TOTAL, :REFITEM,
        :GRUPO, :SUBGRUPO, :MARCA, :PESO, :ANCHO, :ALTO, :LARGO, :TARIFA, :obsitem, :FACTOR, :INALC
        DO
        BEGIN
        if (ARTICULO = CODBAR) then
            SELECT FIRST 1 COBA_COD FROM barras_articulo WHERE ARTI_COD = :articulo INTO :CODBAR;
        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;
        ITEM = ITEM + 1;
        if (ICOINC = 'SI') then
            SUBTOTIT = TOTAL - IVAITMONTO;
        else
            SUBTOTIT = TOTAL - IVAITMONTO - CONSUMO - INALC;
        PRNETO = PRUNIT - DTOITMONTO;
        if (PESO IS NULL) then
            PESO = 0;
        PESO = PESO / 1000 * CANT * FACTOR;
        PESOTOT = PESOTOT + PESO;
        if (IMPTOS = 'S') then
            if (cant <> 0) then
                prnetosiniva = PRUNIT - DTOITMONTO - ((IVAITMONTO+CONSUMO+INALC) / CANT);
            else
                prnetosiniva = PRUNIT - DTOITMONTO;
        ELSE
            prnetosiniva = PRUNIT - DTOITMONTO;
        TOTCONSUMO = TOTCONSUMO + CONSUMO;
        TOTINALC = TOTINALC + INALC;
        if ((REFITEM <> '.t') or (REFITEM IS NULL)) then
            BEGIN
            /* NO SUME LOS ENSAMBLES */
            if (IVAPORC = 0) then
                SUMAEX = SUMAEX + TOTAL;
            if (TARIFA = 1) then
                BEGIN
                SUMA1 = SUMA1 + (TOTAL - IVAITMONTO - CONSUMO - INALC);
                IVA1 = IVA1 + IVAITMONTO;
                END
            if (TARIFA = 2) then
                BEGIN
                SUMA2 = SUMA2 + (TOTAL - IVAITMONTO - CONSUMO - INALC);
                IVA2 = IVA2 + IVAITMONTO;
                END
            if (TARIFA = 3) then
                BEGIN
                SUMA3 = SUMA3 + (TOTAL - IVAITMONTO - CONSUMO - INALC);
                IVA3 = IVA3 + IVAITMONTO;
                END
            if (TARIFA = 4) then
                BEGIN
                SUMA4 = SUMA4 + (TOTAL - IVAITMONTO - CONSUMO - INALC);
                IVA4 = IVA4 + IVAITMONTO;
                END
            if (TARIFA = 5) then
                BEGIN
                SUMA5 = SUMA5 + (TOTAL - IVAITMONTO - CONSUMO - INALC);
                IVA5 = IVA5 + IVAITMONTO;
                END
            SUMAGR = SUMA1 + SUMA2 + SUMA3 + suma4 + suma5;
            END
        if (substr(ARTICULO,1,2) = '.t') then
            BEGIN
            REFITEM = '';
            TOTAL = 0;
            END
        factcant = NULL;
        SELECT FIRST 1 UNAR_FACCAN FROM unidad_articulo WHERE ARTI_COD = :articulo INTO :factcant;
        if (factcant IS NULL) then
            factcant = 1;
        if ((factcant = 1) or (factcant = 0)) then
            BEGIN
            ALTERNATIVAS = 0;
            PRINCIPALES = (CANT * FACTOR);
            END
        ELSE
            BEGIN
            ALTERNATIVAS = FLOOR(CANT * factor / factcant);
            PRINCIPALES = (CANT * FACTOR) - (alternativas * factcant);
            END
        SUSPEND;
        END
    END
END^

SET TERM ; ^

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);
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
    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;

/* 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 */
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;
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 = SUMA1 + SUMA2 + SUMA3 + SUMA4 + 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 = SUMA1 + SUMA2 + SUMA3 + SUMA4 + 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 = SUMA1 + SUMA2 + SUMA3 + SUMA4 + 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 = SUMA1 + SUMA2 + SUMA3 + SUMA4 + 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 ; ^

SET TERM ^ ;

CREATE OR ALTER procedure IMPR_PEDIDO (
    ID integer)
returns (
    PREF varchar(4),
    NUMERO varchar(8),
    FECHA date,
    VALIDEZ integer,
    NIT varchar(20),
    NOMTERCERO varchar(60),
    SUCUR varchar(10),
    VENDEDOR integer,
    NOMVENDEDOR varchar(60),
    PUNTOVTA integer,
    NOMPUNTOVTA varchar(30),
    COTIZACION varchar(30),
    SUBTOTAL numeric(18,2),
    DTOPORC numeric(9,2),
    DTOMONTO numeric(18,2),
    ADICIONAL numeric(18,2),
    IVAMONTO numeric(18,2),
    EXTRA numeric(18,2),
    TOTALFAC numeric(18,2),
    ENTREGA date,
    OBS blob sub_type 1 segment size 80,
    ITEM integer,
    ARTICULO varchar(15),
    CODBAR varchar(15),
    ARTIDES varchar(60),
    BODEGA varchar(2),
    CANT numeric(18,4),
    UNIDAD varchar(8),
    FACTOR numeric(18,4),
    LISTAPR integer,
    REFITEM varchar(60),
    STAND varchar(20),
    PRUNIT numeric(18,2),
    DTOITPORC numeric(9,2),
    DTOITMONTO numeric(18,2),
    PRNETO numeric(18,2),
    PRNETOSINIVA numeric(18,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),
    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),
    INSTRUCCIONES varchar(255),
    DESPACHO varchar(255),
    CIUDAD varchar(40),
    TELEFONO varchar(40),
    CONTACTO varchar(60),
    FAX varchar(25),
    CEL varchar(25),
    ORDENCLI varchar(20),
    NUMORI varchar(60),
    GRUPO varchar(2),
    NOMGRUPO varchar(30),
    SUBGRUPO varchar(3),
    NOMSUBG varchar(30),
    MARCA varchar(3),
    NOMMARCA varchar(30),
    PESO numeric(9,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),
    IVA1 numeric(18,2),
    IVA2 numeric(18,2),
    IVA3 numeric(18,2),
    SUMAEX numeric(18,2),
    SUMAGR numeric(18,2),
    DTOIT1M numeric(18,2),
    DTOIT2M numeric(18,2),
    DTOIT3M numeric(18,2),
    OBSITEM blob sub_type 1 segment size 80,
    ALTERNATIVAS numeric(18,4),
    PRINCIPALES numeric(18,4))
AS
DECLARE VARIABLE IMPTOS CHAR(1);
DECLARE VARIABLE TARIFA INTEGER;
declare variable ORDENCOD CHAR(8);
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 FACTCANT NUMERIC(18,4);
BEGIN
execute procedure lee_configuracion('FACTURACION', 'ARTICULOS', 'IMPOCONSUMO INCLUIDO EN EL PRECIO BASE DE VENTA ANTES DE IVA') returning_values (icoinc);
SELECT F.PREF_PRE, PEDI_NUMERO, PEDI_FECHA, PEDI_VALIDEZ, F.TERC_NIT, PEDI_NOMTERC, F.VEND_COD, VEND_NOMBRE, F.PTVT_ID, PTVT_NOM, PEDI_COTIZACI,
    PEDI_IVAINC, PEDI_DTOPOR, PEDI_DTOMONTO, PEDI_ADICIONAL, PEDI_IVAMONTO, PEDI_EXTRA, PEDI_TOTAL, PEDI_ENTREGA,
    TERC_CONTACTO, TERC_FAX, TERC_DV, TERC_CEL, PEDI_OBS, PEDI_SUCURSAL, PEDI_DTOIT1, PEDI_DTOIT2, PEDI_DTOIT3, PEDI_DESPACHO, PEDI_ORDENC, PEDI_NROORI
    FROM PEDIDOS F, VENDEDORES V, PUNTO_VENTA P, TERCEROS T
    WHERE F.VEND_COD = V.VEND_COD AND F.PTVT_ID = P.PTVT_ID AND F.TERC_NIT = T.TERC_NIT AND F.PEDI_ID = :ID
    into :PREF, :NUMERO, :FECHA, :VALIDEZ, :NIT, :NOMTERCERO, :VENDEDOR, :NOMVENDEDOR, :PUNTOVTA, :NOMPUNTOVTA, :COTIZACION,
    :IMPTOS, :DTOPORC, :DTOMONTO, :ADICIONAL, :IVAMONTO, :EXTRA, :TOTALFAC, :ENTREGA,
    :CONTACTO, :FAX, :DV, :CEL, :OBS, :SUCUR, :dtoit1m, :dtoit2m, :dtoit3m, :despacho, :ordencli, :NUMORI;
SUBTOTAL = TOTALFAC - EXTRA - IVAMONTO - ADICIONAL + DTOMONTO;

SELECT CLIE_COD, C.ZONA_COD, ZONA_NOM, CLIE_PEDIDOS
    FROM CLIENTES C, ZONAS Z
    WHERE TERC_NIT = :NIT AND C.ZONA_COD = Z.ZONA_COD
    INTO :CODIGOCL, :ZONACOD, :ZONANOM, :instrucciones;
SELECT CLSU_DIR, CLSU_CIUDAD, CLSU_TEL FROM CLIENTE_SUCURSALES WHERE TERC_NIT = :NIT AND CLCU_COD = :SUCUR
    INTO :DIRECCION, :CIUDAD, :TELEFONO;
    
SUMAEX = 0;
SUMA1 = 0;
SUMA2 = 0;
SUMA3 = 0;
IVA1 = 0;
IVA2 = 0;
IVA3 = 0;
ITEM = 0;
PESOTOT = 0;
EXECUTE PROCEDURE lee_configuracion ('FACTURACION','DOCUMENTOS','ORDENAR ITEMS POR CODIGO DE ARTICULO') returning_values (:ORDENCOD);
if (ORDENCOD = 'SI') then
    BEGIN
    FOR SELECT D.ARTI_COD, PEDE_CODBAR, SUBSTRING(PEDE_DESC FROM 1 FOR 60), PEDE_CANT, PEDE_UNIDAD, LIPR_COD, PEDE_PRUNIT, PEDE_DTOPORC, PEDE_DTOMONTO, PEDE_IVAPORC, PEDE_IVAMONTO, PEDE_CONSUMO, PEDE_TOTAL, PEDE_REFERENCIA,
        GRUP_COD, SUBG_COD, MARC_COD, ARTI_PESO, ARTI_ANCHO, ARTI_ALTO, ARTI_LARGO, TAIV_COD, BODE_COD, PEDE_OBS, PEDE_DTO1, PEDE_DTO2, PEDE_DTO3, PEDE_DTOM1, PEDE_DTOM2, PEDE_DTOM3, PEDE_FACTOR
        FROM PEDIDOS_DETALLE D, ARTICULO A
        WHERE D.ARTI_COD = A.ARTI_COD AND D.PEDI_ID = :ID
        ORDER BY PEDE_CODBAR
        INTO :ARTICULO, :CODBAR, :ARTIDES, :CANT, :UNIDAD, :LISTAPR, :PRUNIT, :DTOITPORC, :DTOITMONTO, :IVAPORC, :IVAITMONTO, :CONSUMO, :TOTAL, :REFITEM,
        :GRUPO, :SUBGRUPO, :MARCA, :PESO, :ANCHO, :ALTO, :LARGO, :TARIFA, :BODEGA, :OBSITEM,  :dtoit1, :dtoit2, :dtoit3, :dtoitm1, :dtoitm2, :dtoitm3, :FACTOR
        DO
        BEGIN
        if (ARTICULO = CODBAR) then
            SELECT FIRST 1 COBA_COD FROM barras_articulo WHERE ARTI_COD = :articulo INTO :CODBAR;
        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;
        SELECT STAND_COD FROM STANDS WHERE ARTI_COD = :ARTICULO AND STAND_BODEGA = :bodega INTO :stand;
        if (ICOINC = 'SI') then
            SUBTOTIT = TOTAL - IVAITMONTO;
        else
            SUBTOTIT = TOTAL - IVAITMONTO - CONSUMO;
        ITEM = ITEM + 1;
        prneto = PRUNIT - DTOITMONTO - dtoitm1 - dtoitm2 - dtoitm3;
        if (PESO IS NULL) then
            PESO = 0;
        PESO = PESO / 1000 * CANT * FACTOR;
        PESOTOT = PESOTOT + PESO;
        if (IMPTOS = 'S') then
            if (cant <> 0) then
                prnetosiniva = PRUNIT - DTOITMONTO - ((IVAITMONTO+CONSUMO) / CANT) - dtoitm1 - dtoitm2 - dtoitm3;
            else
                prnetosiniva = PRUNIT - DTOITMONTO - dtoitm1 - dtoitm2 - dtoitm3;
        ELSE
            prnetosiniva = PRUNIT - DTOITMONTO - dtoit1m - dtoit2m - dtoit3m;
        if (TARIFA = 0) then
            SUMAEX = SUMAEX + TOTAL;
        if (TARIFA = 1) then
            BEGIN
            SUMA1 = SUMA1 + TOTAL - IVAITMONTO;
            IVA1 = IVA1 + IVAITMONTO;
            END
        if (TARIFA = 2) then
            BEGIN
            SUMA2 = SUMA2 + TOTAL - IVAITMONTO;
            IVA2 = IVA2 + IVAITMONTO;
            END
        if (TARIFA = 3) then
            BEGIN
            SUMA3 = SUMA3 + TOTAL - IVAITMONTO;
            IVA3 = IVA3 + IVAITMONTO;
            END
        SUMAGR = SUMA1 + SUMA2 + SUMA3;
        factcant = NULL;
        SELECT FIRST 1 UNAR_FACCAN FROM unidad_articulo WHERE ARTI_COD = :articulo INTO :factcant;
        if (factcant IS NULL) then
            factcant = 1;
        if ((factcant = 1) or (factcant = 0))  then
            BEGIN
            ALTERNATIVAS = 0;
            PRINCIPALES = (CANT * FACTOR);
            END
        ELSE
            BEGIN
            ALTERNATIVAS = FLOOR(CANT * factor / factcant);
            PRINCIPALES = (CANT * FACTOR) - (alternativas * factcant);
            END
        SUSPEND;
        END
    END
ELSE
  if (ORDENCOD = 'UNIDAD') then
    BEGIN
    FOR SELECT D.ARTI_COD, PEDE_CODBAR, SUBSTRING(PEDE_DESC FROM 1 FOR 60), PEDE_CANT, PEDE_UNIDAD, LIPR_COD, PEDE_PRUNIT, PEDE_DTOPORC, PEDE_DTOMONTO, PEDE_IVAPORC, PEDE_IVAMONTO, PEDE_CONSUMO, PEDE_TOTAL, PEDE_REFERENCIA,
        GRUP_COD, SUBG_COD, MARC_COD, ARTI_PESO, ARTI_ANCHO, ARTI_ALTO, ARTI_LARGO, TAIV_COD, BODE_COD, PEDE_OBS, PEDE_DTO1, PEDE_DTO2, PEDE_DTO3, PEDE_DTOM1, PEDE_DTOM2, PEDE_DTOM3, PEDE_FACTOR
        FROM PEDIDOS_DETALLE D, ARTICULO A
        WHERE D.ARTI_COD = A.ARTI_COD AND D.PEDI_ID = :ID
        ORDER BY D.pede_unidad, D.pede_desc
        INTO :ARTICULO, :CODBAR, :ARTIDES, :CANT, :UNIDAD, :LISTAPR, :PRUNIT, :DTOITPORC, :DTOITMONTO, :IVAPORC, :IVAITMONTO, :CONSUMO, :TOTAL, :REFITEM,
        :GRUPO, :SUBGRUPO, :MARCA, :PESO, :ANCHO, :ALTO, :LARGO, :TARIFA, :BODEGA, :OBSITEM,  :dtoit1, :dtoit2, :dtoit3, :dtoitm1, :dtoitm2, :dtoitm3, :FACTOR
        DO
        BEGIN
        if (ARTICULO = CODBAR) then
            SELECT FIRST 1 COBA_COD FROM barras_articulo WHERE ARTI_COD = :articulo INTO :CODBAR;
        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;
        SELECT STAND_COD FROM STANDS WHERE ARTI_COD = :ARTICULO AND STAND_BODEGA = :bodega INTO :stand;
        if (ICOINC = 'SI') then
            SUBTOTIT = TOTAL - IVAITMONTO;
        else
            SUBTOTIT = TOTAL - IVAITMONTO - CONSUMO;
        ITEM = ITEM + 1;
        prneto = PRUNIT - DTOITMONTO - dtoitm1 - dtoitm2 - dtoitm3;
        if (PESO IS NULL) then
            PESO = 0;
        PESO = PESO / 1000 * CANT * FACTOR;
        PESOTOT = PESOTOT + PESO;
        if (IMPTOS = 'S') then
            if (cant <> 0) then
                prnetosiniva = PRUNIT - DTOITMONTO - ((IVAITMONTO+CONSUMO) / CANT) - dtoitm1 - dtoitm2 - dtoitm3;
            else
                prnetosiniva = PRUNIT - DTOITMONTO - dtoitm1 - dtoitm2 - dtoitm3;
        ELSE
            prnetosiniva = PRUNIT - DTOITMONTO - dtoit1m - dtoit2m - dtoit3m;
        if (TARIFA = 0) then
            SUMAEX = SUMAEX + TOTAL;
        if (TARIFA = 1) then
            BEGIN
            SUMA1 = SUMA1 + TOTAL - IVAITMONTO;
            IVA1 = IVA1 + IVAITMONTO;
            END
        if (TARIFA = 2) then
            BEGIN
            SUMA2 = SUMA2 + TOTAL - IVAITMONTO;
            IVA2 = IVA2 + IVAITMONTO;
            END
        if (TARIFA = 3) then
            BEGIN
            SUMA3 = SUMA3 + TOTAL - IVAITMONTO;
            IVA3 = IVA3 + IVAITMONTO;
            END
        SUMAGR = SUMA1 + SUMA2 + SUMA3;
        factcant = NULL;
        SELECT FIRST 1 UNAR_FACCAN FROM unidad_articulo WHERE ARTI_COD = :articulo INTO :factcant;
        if (factcant IS NULL) then
            factcant = 1;
        if ((factcant = 1) or (factcant = 0))  then
            BEGIN
            ALTERNATIVAS = 0;
            PRINCIPALES = (CANT * FACTOR);
            END
        ELSE
            BEGIN
            ALTERNATIVAS = FLOOR(CANT * factor / factcant);
            PRINCIPALES = (CANT * FACTOR) - (alternativas * factcant);
            END
        SUSPEND;
        END
    END
  ELSE
    BEGIN
    FOR SELECT PEDE_ITEM, D.ARTI_COD, PEDE_CODBAR, SUBSTRING(PEDE_DESC FROM 1 FOR 60), PEDE_CANT, PEDE_UNIDAD, LIPR_COD, PEDE_PRUNIT, PEDE_DTOPORC, PEDE_DTOMONTO, PEDE_IVAPORC, PEDE_IVAMONTO, PEDE_CONSUMO, PEDE_TOTAL, PEDE_REFERENCIA,
        GRUP_COD, SUBG_COD, MARC_COD, ARTI_PESO, ARTI_ANCHO, ARTI_ALTO, ARTI_LARGO, TAIV_COD, BODE_COD, PEDE_OBS, PEDE_DTO1, PEDE_DTO2, PEDE_DTO3, PEDE_DTOM1, PEDE_DTOM2, PEDE_DTOM3, PEDE_FACTOR
        FROM PEDIDOS_DETALLE D, ARTICULO A
        WHERE D.ARTI_COD = A.ARTI_COD AND D.PEDI_ID = :ID
        ORDER BY PEDE_ITEM
        INTO :ITEM, :ARTICULO, :CODBAR, :ARTIDES, :CANT, :UNIDAD, :LISTAPR, :PRUNIT, :DTOITPORC, :DTOITMONTO, :IVAPORC, :IVAITMONTO, :CONSUMO, :TOTAL, :REFITEM,
        :GRUPO, :SUBGRUPO, :MARCA, :PESO, :ANCHO, :ALTO, :LARGO, :TARIFA, :BODEGA, :obsitem,  :dtoit1, :dtoit2, :dtoit3, :dtoitm1, :dtoitm2, :dtoitm3, :FACTOR
        DO
        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;
        SELECT STAND_COD FROM STANDS WHERE ARTI_COD = :ARTICULO AND STAND_BODEGA = :bodega INTO :stand;
        if (ICOINC = 'SI') then
            SUBTOTIT = TOTAL - IVAITMONTO;
        else
            SUBTOTIT = TOTAL - IVAITMONTO - CONSUMO;
        ITEM = ITEM + 1;
        prneto = PRUNIT - DTOITMONTO - dtoitm1 - dtoitm2 - dtoitm3;
        if (PESO IS NULL) then
            PESO = 0;
        PESO = PESO / 1000 * CANT * FACTOR;
        PESOTOT = PESOTOT + PESO;
        if (IMPTOS = 'S') then
            if (cant <> 0) then
                prnetosiniva = PRUNIT - DTOITMONTO - ((IVAITMONTO+CONSUMO) / CANT) - dtoitm1 - dtoitm2 - dtoitm3;
            else
                prnetosiniva = PRUNIT - DTOITMONTO - dtoitm1 - dtoitm2 - dtoitm3;
        ELSE
            prnetosiniva = PRUNIT - DTOITMONTO - dtoit1m - dtoit2m - dtoit3m;
        if (IVAPORC = 0) then
            SUMAEX = SUMAEX + TOTAL;
        if (TARIFA = 1) then
            BEGIN
            SUMA1 = SUMA1 + TOTAL - IVAITMONTO;
            IVA1 = IVA1 + IVAITMONTO;
            END
        if (TARIFA = 2) then
            BEGIN
            SUMA2 = SUMA2 + TOTAL - IVAITMONTO;
            IVA2 = IVA2 + IVAITMONTO;
            END
        if (TARIFA = 3) then
            BEGIN
            SUMA3 = SUMA3 + TOTAL - IVAITMONTO;
            IVA3 = IVA3 + IVAITMONTO;
            END
        SUMAGR = SUMA1 + SUMA2 + SUMA3;
        factcant = NULL;
        SELECT FIRST 1 UNAR_FACCAN FROM unidad_articulo WHERE ARTI_COD = :articulo INTO :factcant;
        if (factcant IS NULL) then
            factcant = 1;
        if ((factcant = 1) or (factcant = 0))  then
            BEGIN
            ALTERNATIVAS = 0;
            PRINCIPALES = (CANT * FACTOR);
            END
        ELSE
            BEGIN
            ALTERNATIVAS = FLOOR(CANT * factor / factcant);
            PRINCIPALES = (CANT * FACTOR) - (alternativas * factcant);
            END
        SUSPEND;
        END
    END
END^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER procedure IMPR_REMISION (
    ID integer)
returns (
    PREF varchar(4),
    NUMERO varchar(8),
    FECHA date,
    NIT varchar(20),
    NOMTERCERO varchar(60),
    VENDEDOR integer,
    NOMVENDEDOR varchar(60),
    PUNTOVTA integer,
    NOMPUNTOVTA varchar(30),
    CODBODEGA varchar(2),
    NOMBODEGA varchar(30),
    COTIZACION varchar(30),
    PEDIDO varchar(30),
    FACTURA varchar(30),
    SUBTOTAL numeric(18,2),
    IVAMONTO numeric(18,2),
    TOTALFAC numeric(18,2),
    DESPACHO varchar(255),
    TRANSPORTADOR varchar(60),
    OBS blob sub_type 1 segment size 80,
    ITEM integer,
    ARTICULO varchar(15),
    CODBAR varchar(15),
    ARTIDES varchar(60),
    CANT numeric(18,4),
    LOTE varchar(15),
    VLOTE date,
    UNIDAD varchar(8),
    FACTOR numeric(18,4),
    CAJAS numeric(18,4),
    DEVUELTO numeric(18,4),
    CONSUMIDO 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),
    PRNETOSINIVA numeric(18,2),
    PRNETO numeric(18,2),
    IVAPORC numeric(9,2),
    IVAITMONTO numeric(18,2),
    CONSUMO numeric(18,2),
    SUBTOTIT numeric(18,2),
    TOTAL numeric(18,2),
    PESOTOT numeric(18,4),
    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(9,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),
    IVA1 numeric(18,2),
    IVA2 numeric(18,2),
    IVA3 numeric(18,2),
    SUMAEX numeric(18,2),
    SUMAGR numeric(18,2),
    TOTCAJAS numeric(18,2),
    OBSITEM blob sub_type 1 segment size 80,
    ALTERNATIVAS numeric(18,4),
    PRINCIPALES numeric(18,4))
AS
DECLARE VARIABLE IMPTOS CHAR(1);
DECLARE VARIABLE TARIFA INTEGER;
declare variable ORDENCOD CHAR(8);
declare variable SUCUR VARCHAR(10);
declare variable ICOINC CHAR(2);
declare variable FACTCANT NUMERIC(18,4);
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','ORDENAR ITEMS POR CODIGO DE ARTICULO') returning_values (:ORDENCOD);
SELECT F.PREF_PRE, REVT_NUMERO, REVT_FECHA, F.BODE_COD, BODE_NOM, F.TERC_NIT, REVT_NOMTERC, F.VEND_COD, VEND_NOMBRE, F.PTVT_ID, PTVT_NOM,
    REVT_COTIZACI, REVT_PEDIDO, REVT_FACTURA, REVT_IVAINC,
    REVT_IVAMONTO, REVT_TOTAL, REVT_DESPACHO, REVT_TRANSP,
    TERC_CONTACTO, TERC_FAX, TERC_DV, TERC_CEL, REVT_OBS, REVT_SUCURSAL
    FROM REMISIONES_VENTA 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.REVT_ID = :ID
    into :PREF, :NUMERO, :FECHA, :CODBODEGA, :NOMBODEGA, :NIT, :NOMTERCERO, :VENDEDOR, :NOMVENDEDOR, :PUNTOVTA, :NOMPUNTOVTA,
    :COTIZACION, :PEDIDO, :FACTURA, :IMPTOS,
    :IVAMONTO, :TOTALFAC, :DESPACHO, :transportador, 
    :CONTACTO, :FAX, :DV, :CEL, :OBS, :SUCUR;
SUBTOTAL = TOTALFAC - IVAMONTO;

SELECT CLIE_COD, C.ZONA_COD, ZONA_NOM
    FROM CLIENTES C, ZONAS Z
    WHERE TERC_NIT = :NIT AND C.ZONA_COD = Z.ZONA_COD
    INTO :CODIGOCL, :ZONACOD, :ZONANOM;
SELECT CLSU_DIR, CLSU_CIUDAD, CLSU_TEL FROM CLIENTE_SUCURSALES WHERE TERC_NIT = :NIT AND CLCU_COD = :SUCUR
    INTO :DIRECCION, :CIUDAD, :TELEFONO;
    
SUMAEX = 0;
SUMA1 = 0;
SUMA2 = 0;
SUMA3 = 0;
IVA1 = 0;
IVA2 = 0;
IVA3 = 0;
ITEM = 0;
totcajas = 0;
PESOTOT = 0;
if (ORDENCOD = 'SI') then
    BEGIN
    FOR SELECT D.ARTI_COD, RVDE_CODBAR, SUBSTRING(RVDE_DESC FROM 1 FOR 60), RVDE_CANT, RVDE_UNIDAD, BODE_COD, RVDE_LOTE, LIPR_COD, RVDE_PRUNIT, RVDE_DTOPORC, RVDE_DTOMONTO, RVDE_IVAPORC, RVDE_IVAMONTO, RVDE_CONSUMO, RVDE_TOTAL, RVDE_REFERENCIA,
        GRUP_COD, SUBG_COD, MARC_COD, ARTI_PESO, ARTI_ANCHO, ARTI_ALTO, ARTI_LARGO, TAIV_COD, RVDE_DEVUELTO, RVDE_OBS, RVDE_CAJAS, RVDE_FACTOR
        FROM REMISIONES_VENTA_DETALLE D, ARTICULO A
        WHERE D.ARTI_COD = A.ARTI_COD AND D.REVT_ID = :ID
        ORDER BY RVDE_CODBAR
        INTO :ARTICULO, :CODBAR, :ARTIDES, :CANT, :UNIDAD, :BODITEM, :LOTE, :LISTAPR, :PRUNIT, :DTOITPORC, :DTOITMONTO, :IVAPORC, :IVAITMONTO, :CONSUMO, :TOTAL, :refitem,
            :GRUPO, :SUBGRUPO, :MARCA, :PESO, :ANCHO, :ALTO, :LARGO, :TARIFA, :DEVUELTO, :obsitem, :CAJAS, :FACTOR
        DO
        BEGIN
        if (ARTICULO = CODBAR) then
            SELECT FIRST 1 COBA_COD FROM barras_articulo WHERE ARTI_COD = :articulo INTO :CODBAR;
        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;
        SELECT LOTE_VENCE FROM LOTES WHERE LOTE_NRO = :lote AND ARTI_COD = :ARTICULO AND BODE_COD = :boditem INTO :vlote;
        if (ICOINC = 'SI') then
            SUBTOTIT = TOTAL - IVAITMONTO;
        else
            SUBTOTIT = TOTAL - IVAITMONTO - CONSUMO;
        CONSUMIDO = cant * factor - devuelto;
        ITEM = ITEM + 1;
        PRNETO = PRUNIT - DTOITMONTO;
        if (PESO IS NULL) then
            PESO = 0;
        PESO = PESO / 1000 * CANT * FACTOR;
        PESOTOT = PESOTOT + PESO;
        if (IMPTOS = 'S') then
            if (cant <> 0) then
                prnetosiniva = PRUNIT - DTOITMONTO - ((IVAITMONTO+CONSUMO) / CANT);
            else
                prnetosiniva = PRUNIT - DTOITMONTO;
        ELSE
            prnetosiniva = PRUNIT - DTOITMONTO;
        if (IVAPORC = 0) then
            SUMAEX = SUMAEX + TOTAL;
        if (TARIFA = 1) then
            BEGIN
            SUMA1 = SUMA1 + TOTAL - IVAITMONTO;
            IVA1 = IVA1 + IVAITMONTO;
            END
        if (TARIFA = 2) then
            BEGIN
            SUMA2 = SUMA2 + TOTAL - IVAITMONTO;
            IVA2 = IVA2 + IVAITMONTO;
            END
        if (TARIFA = 3) then
            BEGIN
            SUMA3 = SUMA3 + TOTAL - IVAITMONTO;
            IVA3 = IVA3 + IVAITMONTO;
            END
        SUMAGR = SUMA1 + SUMA2 + SUMA3;

        totcajas = totcajas + cajas;
        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
            factcant = 1;
        if ((factcant = 1) or (factcant = 0)) then
            BEGIN
            ALTERNATIVAS = 0;
            PRINCIPALES = (CANT * FACTOR);
            END
        ELSE
            BEGIN
            ALTERNATIVAS = FLOOR(CANT * factor / factcant);
            PRINCIPALES = (CANT * FACTOR) - (alternativas * factcant);
            END
        SUSPEND;
        END
    END
ELSE
  if (ORDENCOD = 'UNIDAD') then
    BEGIN
    FOR SELECT D.ARTI_COD, RVDE_CODBAR, SUBSTRING(RVDE_DESC FROM 1 FOR 60), RVDE_CANT, RVDE_UNIDAD, BODE_COD, RVDE_LOTE, LIPR_COD, RVDE_PRUNIT, RVDE_DTOPORC, RVDE_DTOMONTO, RVDE_IVAPORC, RVDE_IVAMONTO, RVDE_CONSUMO, RVDE_TOTAL, RVDE_REFERENCIA,
        GRUP_COD, SUBG_COD, MARC_COD, ARTI_PESO, ARTI_ANCHO, ARTI_ALTO, ARTI_LARGO, TAIV_COD, RVDE_DEVUELTO, RVDE_OBS, RVDE_CAJAS, RVDE_FACTOR
        FROM REMISIONES_VENTA_DETALLE D, ARTICULO A
        WHERE D.ARTI_COD = A.ARTI_COD AND D.REVT_ID = :ID
        ORDER BY RVDE_CODBAR
        INTO :ARTICULO, :CODBAR, :ARTIDES, :CANT, :UNIDAD, :BODITEM, :LOTE, :LISTAPR, :PRUNIT, :DTOITPORC, :DTOITMONTO, :IVAPORC, :IVAITMONTO, :CONSUMO, :TOTAL, :refitem,
            :GRUPO, :SUBGRUPO, :MARCA, :PESO, :ANCHO, :ALTO, :LARGO, :TARIFA, :DEVUELTO, :obsitem, :CAJAS, :FACTOR
        DO
        BEGIN
        if (ARTICULO = CODBAR) then
            SELECT FIRST 1 COBA_COD FROM barras_articulo WHERE ARTI_COD = :articulo INTO :CODBAR;
        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;
        SELECT LOTE_VENCE FROM LOTES WHERE LOTE_NRO = :lote AND ARTI_COD = :ARTICULO AND BODE_COD = :boditem INTO :vlote;
        if (ICOINC = 'SI') then
            SUBTOTIT = TOTAL - IVAITMONTO;
        else
            SUBTOTIT = TOTAL - IVAITMONTO - CONSUMO;
        CONSUMIDO = cant * factor - devuelto;
        ITEM = ITEM + 1;
        PRNETO = PRUNIT - DTOITMONTO;
        if (PESO IS NULL) then
            PESO = 0;
        PESO = PESO / 1000 * CANT * FACTOR;
        PESOTOT = PESOTOT + PESO;
        if (IMPTOS = 'S') then
            if (cant <> 0) then
                prnetosiniva = PRUNIT - DTOITMONTO - ((IVAITMONTO+CONSUMO) / CANT);
            else
                prnetosiniva = PRUNIT - DTOITMONTO;
        ELSE
            prnetosiniva = PRUNIT - DTOITMONTO;
        if (IVAPORC = 0) then
            SUMAEX = SUMAEX + TOTAL;
        if (TARIFA = 1) then
            BEGIN
            SUMA1 = SUMA1 + TOTAL - IVAITMONTO;
            IVA1 = IVA1 + IVAITMONTO;
            END
        if (TARIFA = 2) then
            BEGIN
            SUMA2 = SUMA2 + TOTAL - IVAITMONTO;
            IVA2 = IVA2 + IVAITMONTO;
            END
        if (TARIFA = 3) then
            BEGIN
            SUMA3 = SUMA3 + TOTAL - IVAITMONTO;
            IVA3 = IVA3 + IVAITMONTO;
            END
        SUMAGR = SUMA1 + SUMA2 + SUMA3;

        totcajas = totcajas + cajas;
        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
            factcant = 1;
        if ((factcant = 1) or (factcant = 0)) then
            BEGIN
            ALTERNATIVAS = 0;
            PRINCIPALES = (CANT * FACTOR);
            END
        ELSE
            BEGIN
            ALTERNATIVAS = FLOOR(CANT * factor / factcant);
            PRINCIPALES = (CANT * FACTOR) - (alternativas * factcant);
            END
        SUSPEND;
        END
    END
  ELSE
    BEGIN
    FOR SELECT RVDE_ITEM, D.ARTI_COD, RVDE_CODBAR, SUBSTRING(RVDE_DESC FROM 1 FOR 60), RVDE_CANT, RVDE_UNIDAD, BODE_COD, RVDE_LOTE, LIPR_COD, RVDE_PRUNIT, RVDE_DTOPORC, RVDE_DTOMONTO, RVDE_IVAPORC, RVDE_IVAMONTO, RVDE_CONSUMO, RVDE_TOTAL, RVDE_REFERENCIA,
        GRUP_COD, SUBG_COD, MARC_COD, ARTI_PESO, ARTI_ANCHO, ARTI_ALTO, ARTI_LARGO, TAIV_COD, RVDE_DEVUELTO, RVDE_OBS, RVDE_CAJAS, RVDE_FACTOR
        FROM REMISIONES_VENTA_DETALLE D, ARTICULO A
        WHERE D.ARTI_COD = A.ARTI_COD AND D.REVT_ID = :ID
        ORDER BY RVDE_ITEM
        INTO :ITEM, :ARTICULO, :CODBAR, :ARTIDES, :CANT, :UNIDAD, :BODITEM, :LOTE, :LISTAPR, :PRUNIT, :DTOITPORC, :DTOITMONTO, :IVAPORC, :IVAITMONTO, :CONSUMO, :TOTAL, :refitem,
            :GRUPO, :SUBGRUPO, :MARCA, :PESO, :ANCHO, :ALTO, :LARGO, :TARIFA, :DEVUELTO, :obsitem, :CAJAS, :FACTOR
        DO
        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;
        SELECT LOTE_VENCE FROM LOTES WHERE LOTE_NRO = :lote AND ARTI_COD = :ARTICULO AND BODE_COD = :boditem INTO :vlote;
        if (ICOINC = 'SI') then
            SUBTOTIT = TOTAL - IVAITMONTO;
        else
            SUBTOTIT = TOTAL - IVAITMONTO - CONSUMO;
        CONSUMIDO = cant * factor - devuelto;
        ITEM = ITEM + 1;
        PRNETO = PRUNIT - DTOITMONTO;
        if (PESO IS NULL) then
            PESO = 0;
        PESO = PESO / 1000 * CANT * FACTOR;
        PESOTOT = PESOTOT + PESO;
        if (IMPTOS = 'S') then
            if (cant <> 0) then
                prnetosiniva = PRUNIT - DTOITMONTO - ((IVAITMONTO+CONSUMO) / CANT);
            else
                prnetosiniva = PRUNIT - DTOITMONTO;
        ELSE
            prnetosiniva = PRUNIT - DTOITMONTO;
        if (IVAPORC = 0) then
            SUMAEX = SUMAEX + TOTAL;
        if (TARIFA = 1) then
            BEGIN
            SUMA1 = SUMA1 + TOTAL - IVAITMONTO;
            IVA1 = IVA1 + IVAITMONTO;
            END
        if (TARIFA = 2) then
            BEGIN
            SUMA2 = SUMA2 + TOTAL - IVAITMONTO;
            IVA2 = IVA2 + IVAITMONTO;
            END
        if (TARIFA = 3) then
            BEGIN
            SUMA3 = SUMA3 + TOTAL - IVAITMONTO;
            IVA3 = IVA3 + IVAITMONTO;
            END
        SUMAGR = SUMA1 + SUMA2 + SUMA3;
        totcajas = totcajas + cajas;
        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
            factcant = 1;
        if ((factcant = 1) or (factcant = 0)) then
            BEGIN
            ALTERNATIVAS = 0;
            PRINCIPALES = (CANT * FACTOR);
            END
        ELSE
            BEGIN
            ALTERNATIVAS = FLOOR(CANT * factor / factcant);
            PRINCIPALES = (CANT * FACTOR) - (alternativas * factcant);
            END
        SUSPEND;
        END
    END
END^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER procedure IMPR_REMIPROV (
    ID integer)
returns (
    PREF varchar(4),
    NUMERO varchar(8),
    FECHA date,
    NIT varchar(20),
    NOMTERCERO varchar(60),
    CODBODEGA varchar(2),
    NOMBODEGA varchar(30),
    NUMPROV varchar(10),
    COTIZACION varchar(30),
    PEDIDO varchar(30),
    SUBTOTAL numeric(18,2),
    DTOPORC numeric(9,2),
    DTOMONTO numeric(18,2),
    ADICIONAL numeric(18,2),
    IVAMONTO numeric(18,2),
    EXTRA numeric(18,2),
    TOTALFAC numeric(18,2),
    OBS blob sub_type 1 segment size 80,
    ITEM integer,
    ARTICULO varchar(15),
    CODBAR varchar(15),
    ARTIDES varchar(60),
    ARTIPROV varchar(15),
    CANT numeric(18,4),
    LOTE varchar(15),
    UNIDAD varchar(8),
    BODITEM varchar(2),
    STAND varchar(20),
    PRUNIT numeric(18,2),
    DTOITPORC numeric(9,2),
    DTOITMONTO numeric(18,2),
    PRNETO numeric(18,2),
    IVAPORC numeric(9,2),
    IVAITMONTO numeric(18,2),
    CONSUMO numeric(18,2),
    TOTAL numeric(18,2),
    OBSITEM blob sub_type 1 segment size 80,
    CODIGOPR varchar(20),
    ZONACOD varchar(2),
    ZONANOM varchar(30),
    DV char(1),
    DIRECCION varchar(60),
    CIUDAD varchar(40),
    TELEFONO varchar(40),
    CONTACTO varchar(60),
    FAX varchar(25),
    GRUPO varchar(2),
    SUBGRUPO varchar(3),
    MARCA varchar(3),
    PESO numeric(9,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),
    IVA1 numeric(18,2),
    IVA2 numeric(18,2),
    IVA3 numeric(18,2),
    SUMAEX numeric(18,2),
    SUMAGR numeric(18,2))
AS
declare variable IMPTOS CHAR(1);
declare variable TARIFA INTEGER;
declare variable orden char(2);
BEGIN
  SELECT PREF_PRE, REPR_NUMERO, REPR_FECHA, F.BODE_COD, BODE_NOM, REPR_NUMPROV, REPR_COTIZACI, REPR_ORDEN, REPR_IMPTOS, 
    REPR_DTOPORC, REPR_DTOMONTO, REPR_ADICIONAL, REPR_IVAMONTO, REPR_EXTRA, REPR_TOTAL,
    F.TERC_NIT, TERC_NOM, TERC_DIR, TERC_CIU, TERC_TEL, TERC_CONTACTO, TERC_FAX, TERC_DV,
    REPR_OBS
    FROM REMISION_PROVEEDOR F, BODEGA B, TERCEROS T
    WHERE F.BODE_COD = B.BODE_COD AND F.TERC_NIT = T.TERC_NIT AND F.REPR_ID = :ID
    into :PREF, :NUMERO, :FECHA, :CODBODEGA, :NOMBODEGA, :NUMPROV, :COTIZACION, :PEDIDO, :IMPTOS, 
    :DTOPORC, :DTOMONTO, :ADICIONAL, :IVAMONTO, :EXTRA, :TOTALFAC,
    :NIT, :NOMTERCERO, :DIRECCION, :CIUDAD, :TELEFONO, :CONTACTO, :FAX, :DV,
    :OBS;
    
  SELECT PROV_COD, P.GRPR_COD, GRPR_NOM
    FROM PROVEEDORES P, GRUPOS_PROVEEDORES G
    WHERE TERC_NIT = :NIT AND G.GRPR_COD = P.GRPR_COD
    INTO :CODIGOPR, :ZONACOD, :ZONANOM;
    
  SUBTOTAL = TOTALFAC - EXTRA - IVAMONTO - ADICIONAL + DTOMONTO;
  SUMAEX = 0;
  SUMA1 = 0;
  SUMA2 = 0;
  SUMA3 = 0;
  IVA1 = 0;
  IVA2 = 0;
  IVA3 = 0;

execute procedure lee_configuracion('COMPRAS', 'DOCUMENTOS', 'ORDENAR ITEMS POR BODEGA AL IMPRIMIR DOCUMENTOS') returning_values (:Orden);
if (orden = 'NO') then
  BEGIN
  FOR SELECT RPVD_ITEM, D.ARTI_COD, RPVD_CODBAR, SUBSTRING(RPVD_DESC FROM 1 FOR 60), RPVD_CANT, RPVD_UNIDAD, BODE_COD, RPVD_LOTE, RPVD_PRUNIT,
    RPVD_DTOPORC, RPVD_DTOMONTO, RPVD_IVAPORC, RPVD_IVAMONTO, RPVD_CONSUMO, RPVD_TOTAL, RPVD_OBS,
    GRUP_COD, SUBG_COD, MARC_COD, ARTI_PESO, ARTI_ANCHO, ARTI_ALTO, ARTI_LARGO, TAIV_COD, RPVD_CODPROV
    FROM REMISION_PROVEEDOR_DET D, ARTICULO A
    WHERE D.ARTI_COD = A.ARTI_COD AND D.REPR_ID = :ID
    ORDER BY RPVD_ITEM
    INTO :ITEM, :ARTICULO, :CODBAR, :ARTIDES, :CANT, :UNIDAD, :BODITEM, :LOTE, :PRUNIT,
    :DTOITPORC, :DTOITMONTO, :IVAPORC, :IVAITMONTO, :CONSUMO, :TOTAL, :OBSITEM,
    :GRUPO, :SUBGRUPO, :MARCA, :PESO, :ANCHO, :ALTO, :LARGO, :TARIFA, :ARTIPROV
    DO
      BEGIN
      PRNETO = PRUNIT - DTOITMONTO;
      if (IVAPORC = 0) then
        SUMAEX = SUMAEX + TOTAL;
      if (TARIFA = 1) then
        BEGIN
        SUMA1 = SUMA1 + TOTAL - IVAITMONTO;
        IVA1 = IVA1 + IVAITMONTO;
        END
      if (TARIFA = 2) then
        BEGIN
        SUMA2 = SUMA2 + TOTAL - IVAITMONTO;
        IVA2 = IVA2 + IVAITMONTO;
        END
      if (TARIFA = 3) then
        BEGIN
        SUMA3 = SUMA3 + TOTAL - IVAITMONTO;
        IVA3 = IVA3 + IVAITMONTO;
        END
      SUMAGR = SUMA1 + SUMA2 + SUMA3;
      if (IMPTOS = 'N') then
        TOTAL = TOTAL - IVAITMONTO;
      SELECT STAND_COD FROM STANDS WHERE ARTI_COD = :ARTICULO AND STAND_BODEGA = :boditem INTO :stand;
      SUSPEND;
      END
  END
ELSE
  BEGIN
  FOR SELECT RPVD_ITEM, D.ARTI_COD, RPVD_CODBAR, SUBSTRING(RPVD_DESC FROM 1 FOR 60), RPVD_CANT, RPVD_UNIDAD, BODE_COD, RPVD_LOTE, RPVD_PRUNIT,
    RPVD_DTOPORC, RPVD_DTOMONTO, RPVD_IVAPORC, RPVD_IVAMONTO, RPVD_CONSUMO, RPVD_TOTAL, RPVD_OBS,
    GRUP_COD, SUBG_COD, MARC_COD, ARTI_PESO, ARTI_ANCHO, ARTI_ALTO, ARTI_LARGO, TAIV_COD, RPVD_CODPROV
    FROM REMISION_PROVEEDOR_DET D, ARTICULO A
    WHERE D.ARTI_COD = A.ARTI_COD AND D.REPR_ID = :ID
    ORDER BY D.bode_cod, RPVD_ITEM
    INTO :ITEM, :ARTICULO, :CODBAR, :ARTIDES, :CANT, :UNIDAD, :BODITEM, :LOTE, :PRUNIT,
    :DTOITPORC, :DTOITMONTO, :IVAPORC, :IVAITMONTO, :CONSUMO, :TOTAL, :OBSITEM,
    :GRUPO, :SUBGRUPO, :MARCA, :PESO, :ANCHO, :ALTO, :LARGO, :TARIFA, :ARTIPROV
    DO
      BEGIN
      PRNETO = PRUNIT - DTOITMONTO;
      if (IVAPORC = 0) then
        SUMAEX = SUMAEX + TOTAL;
      if (TARIFA = 1) then
        BEGIN
        SUMA1 = SUMA1 + TOTAL - IVAITMONTO;
        IVA1 = IVA1 + IVAITMONTO;
        END
      if (TARIFA = 2) then
        BEGIN
        SUMA2 = SUMA2 + TOTAL - IVAITMONTO;
        IVA2 = IVA2 + IVAITMONTO;
        END
      if (TARIFA = 3) then
        BEGIN
        SUMA3 = SUMA3 + TOTAL - IVAITMONTO;
        IVA3 = IVA3 + IVAITMONTO;
        END
      SUMAGR = SUMA1 + SUMA2 + SUMA3;
      if (IMPTOS = 'N') then
        TOTAL = TOTAL - IVAITMONTO;
      SELECT STAND_COD FROM STANDS WHERE ARTI_COD = :ARTICULO AND STAND_BODEGA = :boditem INTO :stand;
      SUSPEND;
      END
  END
END^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER procedure IMPR_FACTCOMP (
    ID integer)
returns (
    PREF varchar(4),
    NUMERO varchar(8),
    FECHA date,
    VENCE date,
    DIASVENCE integer,
    NIT varchar(20),
    NOMTERCERO varchar(60),
    SIMPLIFICADO varchar(15),
    CODBODEGA varchar(2),
    NOMBODEGA varchar(30),
    NUMPROV varchar(10),
    COTIZACION varchar(30),
    PEDIDO varchar(30),
    REMISION varchar(30),
    SUBTOTAL numeric(18,2),
    DTOPORC numeric(9,2),
    DTOMONTO numeric(18,2),
    ADICIONAL numeric(18,2),
    IVAMONTO 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),
    RTECREE numeric(9,2),
    RTECREEM numeric(18,2),
    EXTRA numeric(18,2),
    DTOFPORC numeric(9,2),
    DTOFMONTO numeric(18,2),
    FECHADTO date,
    TOTALFAC numeric(18,2),
    TOTALPAGAR numeric(18,2),
    OBS blob sub_type 1 segment size 80,
    ITEM integer,
    ARTICULO varchar(15),
    CODBAR varchar(15),
    ARTIDES varchar(60),
    ARTIPROV varchar(15),
    CANT numeric(18,4),
    LOTE varchar(15),
    UNIDAD varchar(8),
    REFITEM varchar(60),
    BODITEM varchar(2),
    OBSITEM blob sub_type 1 segment size 80,
    STAND varchar(20),
    PRUNIT numeric(18,2),
    DTOITPORC numeric(9,2),
    DTOITMONTO numeric(18,2),
    PRNETO numeric(18,2),
    IVAPORC numeric(9,2),
    IVAITMONTO numeric(18,2),
    CONSUMO numeric(18,2),
    SUBTOTIT numeric(18,2),
    SUBTOTITCON numeric(18,2),
    TOTAL numeric(18,2),
    CODIGOPR 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),
    GRUPO varchar(2),
    SUBGRUPO varchar(3),
    MARCA varchar(3),
    PESO numeric(9,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),
    IVA1 numeric(18,2),
    IVA2 numeric(18,2),
    IVA3 numeric(18,2),
    TOTCONSUMO numeric(18,2),
    SUMAEX numeric(18,2),
    SUMAGR numeric(18,2))
AS
declare variable IMPTOS CHAR(1);
declare variable TARIFA INTEGER;
declare variable SIMPLIFICA CHAR(1);
declare variable orden char(2);
BEGIN
  SELECT PREF_PRE, FACO_NUMERO, FACO_FECHA, FACO_VENCE, F.BODE_COD, BODE_NOM, F.TERC_NIT, TERC_NOM, FACO_NUMPROV, FACO_COTIZACI, FACO_ORDEN, FACO_REMISION, FACO_IMPTOS,
    FACO_DTOPORC, FACO_DTOMONTO, FACO_ADICIONAL, FACO_IVAMONTO, FACO_RTFTEPORC, FACO_RTFTEMONTO, FACO_RTIVAPOR, FACO_RTIVAMONTO,
    FACO_RTICAPOR, FACO_RTICAMONTO, FACO_RTCREE, FACO_RTCREEM, FACO_EXTRA, FACO_DTOFPOR, FACO_DTOFMONTO, FACO_DTOFFECHA,
    FACO_TOTAL, TERC_DIR, TERC_CIU, TERC_TEL, TERC_CONTACTO, TERC_FAX, TERC_DV, FACO_OBS, FACO_SIMPLIFICADO
    FROM FACTURAS_COMPRA F, BODEGA B, TERCEROS T
    WHERE F.BODE_COD = B.BODE_COD AND F.TERC_NIT = T.TERC_NIT AND F.FACO_ID = :ID
    into :PREF, :NUMERO, :FECHA, :VENCE, :CODBODEGA, :NOMBODEGA, :NIT, :NOMTERCERO, :NUMPROV, :COTIZACION, :PEDIDO, :REMISION, :IMPTOS,
    :DTOPORC, :DTOMONTO, :ADICIONAL, :IVAMONTO, :RTEFTEPORC, :RTEFTEMONTO, :RTEIVAPORC, :RTEIVAMONTO,
    :RTEICAPORC, :RTEICAMONTO, :RTECREE, :RTECREEM, :EXTRA, :DTOFPORC, :DTOFMONTO, :FECHADTO, :TOTALFAC,
    :DIRECCION, :CIUDAD, :TELEFONO, :CONTACTO, :FAX, :DV, :OBS, :SIMPLIFICA;
    
    if (SIMPLIFICA = 'N') then
         SIMPLIFICADO = 'COMUN';
    ELSE
        SIMPLIFICADO = 'SIMPLIFICADO';

  SELECT PROV_COD, P.GRPR_COD, GRPR_NOM
    FROM PROVEEDORES P, GRUPOS_PROVEEDORES G
    WHERE TERC_NIT = :NIT AND G.GRPR_COD = P.GRPR_COD
    INTO :CODIGOPR, :ZONACOD, :ZONANOM;

  DIASVENCE = VENCE - FECHA;
  SUBTOTAL = TOTALFAC - EXTRA - IVAMONTO - ADICIONAL + DTOMONTO;
  TOTALPAGAR = TOTALFAC - RTEFTEMONTO - RTEIVAMONTO - RTEICAMONTO - RTECREEM;
  SUMAEX = 0;
  SUMA1 = 0;
  SUMA2 = 0;
  SUMA3 = 0;
  IVA1 = 0;
  IVA2 = 0;
  IVA3 = 0;
  TOTCONSUMO = 0;

execute procedure lee_configuracion('COMPRAS', 'DOCUMENTOS', 'ORDENAR ITEMS POR BODEGA AL IMPRIMIR DOCUMENTOS') returning_values (:Orden);
if (orden = 'NO') then
  BEGIN
  FOR SELECT FCDE_ITEM, D.ARTI_COD, FCDE_CODBAR, SUBSTRING(FCDE_DESC FROM 1 FOR 60), FCDE_CANT, FCDE_UNIDAD, BODE_COD, FCDE_LOTE, FCDE_PRUNIT,
    FCDE_DTOPORC, FCDE_DTOMONTO, FCDE_IVAPORC, FCDE_IVAMONTO, FCDE_CONSUMO, FCDE_TOTAL, FCDE_OBS,
    GRUP_COD, SUBG_COD, MARC_COD, ARTI_PESO, ARTI_ANCHO, ARTI_ALTO, ARTI_LARGO, TAIV_COD, FCDE_CODPROV, FCDE_REFERENCIA
    FROM FACTURAS_COMPRAS_DETALLE D, ARTICULO A
    WHERE D.ARTI_COD = A.ARTI_COD AND D.FACO_ID = :ID
    ORDER BY FCDE_ITEM
    INTO :ITEM, :ARTICULO, :CODBAR, :ARTIDES, :CANT, :UNIDAD, :BODITEM, :LOTE, :PRUNIT,
    :DTOITPORC, :DTOITMONTO, :IVAPORC, :IVAITMONTO, :CONSUMO, :TOTAL, :OBSITEM,
    :GRUPO, :SUBGRUPO, :MARCA, :PESO, :ANCHO, :ALTO, :LARGO, :TARIFA, :ARTIPROV, :REFITEM
    DO
      BEGIN
      PRNETO = PRUNIT - DTOITMONTO - ((IVAITMONTO+CONSUMO) / CANT);
      SUBTOTIT = TOTAL - IVAITMONTO - CONSUMO;
      SUBTOTITCON = TOTAL;
      TOTCONSUMO = TOTCONSUMO + CONSUMO;
      if (IVAPORC = 0) then
        SUMAEX = SUMAEX + TOTAL;
      if (TARIFA = 1) then
        BEGIN
        SUMA1 = SUMA1 + TOTAL - IVAITMONTO;
        IVA1 = IVA1 + IVAITMONTO;
        END
      if (TARIFA = 2) then
        BEGIN
        SUMA2 = SUMA2 + TOTAL - IVAITMONTO;
        IVA2 = IVA2 + IVAITMONTO;
        END
      if (TARIFA = 3) then
        BEGIN
        SUMA3 = SUMA3 + TOTAL - IVAITMONTO;
        IVA3 = IVA3 + IVAITMONTO;
        END
      SUMAGR = SUMA1 + SUMA2 + SUMA3;
      if (IMPTOS = 'N') then
        TOTAL = TOTAL - IVAITMONTO - CONSUMO;
      SELECT STAND_COD FROM STANDS WHERE ARTI_COD = :ARTICULO AND STAND_BODEGA = :boditem INTO :stand;
      SUSPEND;
      END
  END
ELSE
  BEGIN
  FOR SELECT FCDE_ITEM, D.ARTI_COD, FCDE_CODBAR, SUBSTRING(FCDE_DESC FROM 1 FOR 60), FCDE_CANT, FCDE_UNIDAD, BODE_COD, FCDE_LOTE, FCDE_PRUNIT,
    FCDE_DTOPORC, FCDE_DTOMONTO, FCDE_IVAPORC, FCDE_IVAMONTO, FCDE_CONSUMO, FCDE_TOTAL, FCDE_OBS,
    GRUP_COD, SUBG_COD, MARC_COD, ARTI_PESO, ARTI_ANCHO, ARTI_ALTO, ARTI_LARGO, TAIV_COD, FCDE_CODPROV, FCDE_REFERENCIA
    FROM FACTURAS_COMPRAS_DETALLE D, ARTICULO A
    WHERE D.ARTI_COD = A.ARTI_COD AND D.FACO_ID = :ID
    ORDER BY D.bode_cod, FCDE_ITEM
    INTO :ITEM, :ARTICULO, :CODBAR, :ARTIDES, :CANT, :UNIDAD, :BODITEM, :LOTE, :PRUNIT,
    :DTOITPORC, :DTOITMONTO, :IVAPORC, :IVAITMONTO, :CONSUMO, :TOTAL, :OBSITEM,
    :GRUPO, :SUBGRUPO, :MARCA, :PESO, :ANCHO, :ALTO, :LARGO, :TARIFA, :ARTIPROV, :REFITEM
    DO
      BEGIN
      PRNETO = PRUNIT - DTOITMONTO - ((IVAITMONTO+CONSUMO) / CANT);
      SUBTOTIT = TOTAL - IVAITMONTO - CONSUMO;
      SUBTOTITCON = TOTAL;
      TOTCONSUMO = TOTCONSUMO + CONSUMO;
      if (IVAPORC = 0) then
        SUMAEX = SUMAEX + TOTAL;
      if (TARIFA = 1) then
        BEGIN
        SUMA1 = SUMA1 + TOTAL - IVAITMONTO;
        IVA1 = IVA1 + IVAITMONTO;
        END
      if (TARIFA = 2) then
        BEGIN
        SUMA2 = SUMA2 + TOTAL - IVAITMONTO;
        IVA2 = IVA2 + IVAITMONTO;
        END
      if (TARIFA = 3) then
        BEGIN
        SUMA3 = SUMA3 + TOTAL - IVAITMONTO;
        IVA3 = IVA3 + IVAITMONTO;
        END
      SUMAGR = SUMA1 + SUMA2 + SUMA3;
      if (IMPTOS = 'N') then
        TOTAL = TOTAL - IVAITMONTO - CONSUMO;
      SELECT STAND_COD FROM STANDS WHERE ARTI_COD = :ARTICULO AND STAND_BODEGA = :boditem INTO :stand;
      SUSPEND;
      END
  END
END^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER procedure IMPR_PENDIENTE (
    ID integer)
returns (
    PREF varchar(4),
    NUMERO varchar(6),
    FECHA date,
    NIT varchar(20),
    NOMTERCERO varchar(60),
    VENDEDOR integer,
    NOMVENDEDOR varchar(60),
    CODBODEGA varchar(2),
    NOMBODEGA varchar(30),
    FACTURA varchar(30),
    SUBTOTAL numeric(18,2),
    IVAMONTO numeric(18,2),
    TOTALFAC numeric(18,2),
    OBS blob sub_type 1 segment size 80,
    ITEM integer,
    ARTICULO varchar(15),
    CODBAR varchar(15),
    ARTIDES varchar(60),
    CANT numeric(18,4),
    LOTE varchar(15),
    VLOTE date,
    UNIDAD varchar(8),
    FACTOR numeric(18,4),
    REFITEM varchar(60),
    BODITEM varchar(2),
    STAND varchar(20),
    PRUNIT numeric(18,2),
    DTOITPORC numeric(9,2),
    DTOITMONTO numeric(18,2),
    PRNETOSINIVA numeric(18,2),
    PRNETO numeric(18,2),
    IVAPORC numeric(9,2),
    IVAITMONTO numeric(18,2),
    CONSUMO numeric(18,2),
    SUBTOTIT numeric(18,2),
    TOTAL numeric(18,2),
    PESOTOT numeric(18,4),
    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(9,4),
    ANCHO numeric(18,4),
    ALTO numeric(18,4),
    LARGO numeric(18,4),
    OBSITEM blob sub_type 1 segment size 80)
AS
DECLARE VARIABLE IMPTOS CHAR(1);
declare variable ORDENCOD CHAR(8);
declare variable SUCUR VARCHAR(10);
declare variable ICOINC CHAR(2);
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','ORDENAR ITEMS POR CODIGO DE ARTICULO') returning_values (:ORDENCOD);
SELECT F.PREF_PRE, F.pend_numero, F.pend_fecha, F.bode_cod, BODE_NOM, F.terc_nit, F.pend_nomcli, F.VEND_COD, VEND_NOMBRE,
    F.pend_factura, F.pend_ivainc, F.pend_ivamonto, F.pend_total, TERC_CONTACTO, TERC_FAX, TERC_DV, TERC_CEL, F.pend_obs, F.pend_sucursal
    FROM pendiente_ventas F, BODEGA B, VENDEDORES V, TERCEROS T
    WHERE F.BODE_COD = B.BODE_COD AND F.VEND_COD = V.VEND_COD AND F.TERC_NIT = T.TERC_NIT AND F.pend_id = :ID
    into :PREF, :NUMERO, :FECHA, :CODBODEGA, :NOMBODEGA, :NIT, :NOMTERCERO, :VENDEDOR, :NOMVENDEDOR,
    :FACTURA, :IMPTOS, :IVAMONTO, :TOTALFAC, :CONTACTO, :FAX, :DV, :CEL, :OBS, :SUCUR;
SUBTOTAL = TOTALFAC - IVAMONTO;

SELECT CLIE_COD, C.ZONA_COD, ZONA_NOM
    FROM CLIENTES C, ZONAS Z
    WHERE TERC_NIT = :NIT AND C.ZONA_COD = Z.ZONA_COD
    INTO :CODIGOCL, :ZONACOD, :ZONANOM;
SELECT CLSU_DIR, CLSU_CIUDAD, CLSU_TEL FROM CLIENTE_SUCURSALES WHERE TERC_NIT = :NIT AND CLCU_COD = :SUCUR
    INTO :DIRECCION, :CIUDAD, :TELEFONO;

PESOTOT = 0;
if (ORDENCOD = 'SI') then
    BEGIN
    FOR SELECT D.pevd_item, D.ARTI_COD, D.pevd_corbar, SUBSTRING(D.pevd_desc FROM 1 FOR 60), D.pevd_cant, D.pevd_unidad, BODE_COD, D.pevd_lote,
        D.pevd_prunit, D.pevd_dtoporc, D.pevd_dtomonto, D.pevd_ivaporc, D.pevd_ivamonto, D.pevd_consumo, D.pevd_total, D.pevd_referencia,
        GRUP_COD, SUBG_COD, MARC_COD, ARTI_PESO, ARTI_ANCHO, ARTI_ALTO, ARTI_LARGO, D.pevd_obs, D.pevd_factor
        FROM pendiente_ventas_detalle D, ARTICULO A
        WHERE D.ARTI_COD = A.ARTI_COD AND D.pend_id = :ID
        ORDER BY D.pevd_corbar
        INTO :ITEM, :ARTICULO, :CODBAR, :ARTIDES, :CANT, :UNIDAD, :BODITEM, :LOTE,
        :PRUNIT, :DTOITPORC, :DTOITMONTO, :IVAPORC, :IVAITMONTO, :CONSUMO, :TOTAL, :refitem,
        :GRUPO, :SUBGRUPO, :MARCA, :PESO, :ANCHO, :ALTO, :LARGO, :obsitem, :FACTOR
        DO
        BEGIN
        if (ARTICULO = CODBAR) then
            SELECT FIRST 1 COBA_COD FROM barras_articulo WHERE ARTI_COD = :articulo INTO :CODBAR;
        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;
        SELECT LOTE_VENCE FROM LOTES WHERE LOTE_NRO = :lote AND ARTI_COD = :ARTICULO AND BODE_COD = :boditem INTO :vlote;
        if (ICOINC = 'SI') then
            SUBTOTIT = TOTAL - IVAITMONTO;
        else
            SUBTOTIT = TOTAL - IVAITMONTO - CONSUMO;
        ITEM = ITEM + 1;
        PRNETO = PRUNIT - DTOITMONTO;
        if (PESO IS NULL) then
            PESO = 0;
        PESO = PESO / 1000 * CANT * FACTOR;
        PESOTOT = PESOTOT + PESO;
        if (IMPTOS = 'S') then
            if (cant <> 0) then
                prnetosiniva = PRUNIT - DTOITMONTO - ((IVAITMONTO+CONSUMO) / CANT);
            else
                prnetosiniva = PRUNIT - DTOITMONTO;
        ELSE
            prnetosiniva = PRUNIT - DTOITMONTO;
        SELECT STAND_COD FROM STANDS WHERE ARTI_COD = :ARTICULO AND STAND_BODEGA = :boditem INTO :stand;
        SUSPEND;
        END
    END
ELSE
  if (ORDENCOD = 'UNIDAD') then
    BEGIN
    FOR SELECT D.pevd_item, D.ARTI_COD, D.pevd_corbar, SUBSTRING(D.pevd_desc FROM 1 FOR 60), D.pevd_cant, D.pevd_unidad, BODE_COD, D.pevd_lote,
        D.pevd_prunit, D.pevd_dtoporc, D.pevd_dtomonto, D.pevd_ivaporc, D.pevd_ivamonto, D.pevd_consumo, D.pevd_total, D.pevd_referencia,
        GRUP_COD, SUBG_COD, MARC_COD, ARTI_PESO, ARTI_ANCHO, ARTI_ALTO, ARTI_LARGO, D.pevd_obs, D.pevd_factor
        FROM pendiente_ventas_detalle D, ARTICULO A
        WHERE D.ARTI_COD = A.ARTI_COD AND D.pend_id = :ID
        ORDER BY D.pevd_unidad, D.pevd_corbar
        INTO :ITEM, :ARTICULO, :CODBAR, :ARTIDES, :CANT, :UNIDAD, :BODITEM, :LOTE,
        :PRUNIT, :DTOITPORC, :DTOITMONTO, :IVAPORC, :IVAITMONTO, :CONSUMO, :TOTAL, :refitem,
        :GRUPO, :SUBGRUPO, :MARCA, :PESO, :ANCHO, :ALTO, :LARGO, :obsitem, :FACTOR
        DO
        BEGIN
        if (ARTICULO = CODBAR) then
            SELECT FIRST 1 COBA_COD FROM barras_articulo WHERE ARTI_COD = :articulo INTO :CODBAR;
        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;
        SELECT LOTE_VENCE FROM LOTES WHERE LOTE_NRO = :lote AND ARTI_COD = :ARTICULO AND BODE_COD = :boditem INTO :vlote;
        if (ICOINC = 'SI') then
            SUBTOTIT = TOTAL - IVAITMONTO;
        else
            SUBTOTIT = TOTAL - IVAITMONTO - CONSUMO;
        ITEM = ITEM + 1;
        PRNETO = PRUNIT - DTOITMONTO;
        if (PESO IS NULL) then
            PESO = 0;
        PESO = PESO / 1000 * CANT * FACTOR;
        PESOTOT = PESOTOT + PESO;
        if (IMPTOS = 'S') then
            if (cant <> 0) then
                prnetosiniva = PRUNIT - DTOITMONTO - ((IVAITMONTO+CONSUMO) / CANT);
            else
                prnetosiniva = PRUNIT - DTOITMONTO;
        ELSE
            prnetosiniva = PRUNIT - DTOITMONTO;
        SELECT STAND_COD FROM STANDS WHERE ARTI_COD = :ARTICULO AND STAND_BODEGA = :boditem INTO :stand;
        SUSPEND;
        END
    END
  ELSE
    BEGIN
    FOR SELECT D.pevd_item, D.ARTI_COD, D.pevd_corbar, SUBSTRING(D.pevd_desc FROM 1 FOR 60), D.pevd_cant, D.pevd_unidad, BODE_COD, D.pevd_lote,
        D.pevd_prunit, D.pevd_dtoporc, D.pevd_dtomonto, D.pevd_ivaporc, D.pevd_ivamonto, D.pevd_consumo, D.pevd_total, D.pevd_referencia,
        GRUP_COD, SUBG_COD, MARC_COD, ARTI_PESO, ARTI_ANCHO, ARTI_ALTO, ARTI_LARGO, D.pevd_obs, D.pevd_factor
        FROM pendiente_ventas_detalle D, ARTICULO A
        WHERE D.ARTI_COD = A.ARTI_COD AND D.pend_id = :ID
        ORDER BY D.pevd_item
        INTO :ITEM, :ARTICULO, :CODBAR, :ARTIDES, :CANT, :UNIDAD, :BODITEM, :LOTE,
        :PRUNIT, :DTOITPORC, :DTOITMONTO, :IVAPORC, :IVAITMONTO, :CONSUMO, :TOTAL, :refitem,
        :GRUPO, :SUBGRUPO, :MARCA, :PESO, :ANCHO, :ALTO, :LARGO, :obsitem, :FACTOR
        DO
        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;
        SELECT LOTE_VENCE FROM LOTES WHERE LOTE_NRO = :lote AND ARTI_COD = :ARTICULO AND BODE_COD = :boditem INTO :vlote;
        if (ICOINC = 'SI') then
            SUBTOTIT = TOTAL - IVAITMONTO;
        else
            SUBTOTIT = TOTAL - IVAITMONTO - CONSUMO;
        ITEM = ITEM + 1;
        PRNETO = PRUNIT - DTOITMONTO;
        if (PESO IS NULL) then
            PESO = 0;
        PESO = PESO / 1000 * CANT * FACTOR;
        PESOTOT = PESOTOT + PESO;
        if (IMPTOS = 'S') then
            if (cant <> 0) then
                prnetosiniva = PRUNIT - DTOITMONTO - ((IVAITMONTO+CONSUMO) / CANT);
            else
                prnetosiniva = PRUNIT - DTOITMONTO;
        ELSE
            prnetosiniva = PRUNIT - DTOITMONTO;
        SELECT STAND_COD FROM STANDS WHERE ARTI_COD = :ARTICULO AND STAND_BODEGA = :boditem INTO :stand;
        SUSPEND;
        END
    END
END^

SET TERM ; ^

/* 20140212b */
/* NO SUME EN GRAVADOS LA TARIFA SI EL IVA ES CERO */
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);
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
    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;

/* 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 */
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;
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 ; ^


/* 20140212C */
/* PRESUPUESTO ACUMULADO */
SET TERM ^ ;

create or alter procedure MOVIMIENTO_ACUM_CUENTA_MES (
    CUENTA varchar(20),
    ANO char(4),
    MES integer,
    DEBITO char(1))
returns (
    MOVIMIENTO numeric(18,2))
AS
declare variable FECINI CHAR(8);
declare variable FECFIN CHAR(8);
declare variable CTAFIN VARCHAR(20);
BEGIN
CTAFIN = CUENTA || '999999';
execute procedure COMPONE_FECHA_CONTA(ANO, 1, 1) returning_values(FECINI);
MES = MES + 1;
execute procedure COMPONE_FECHA_CONTA(ANO, MES, 1) returning_values(FECFIN);
EXECUTE PROCEDURE FECHA_Y_NUMERO_CONTA(FECFIN, -1) RETURNING_VALUES (FECFIN);

IF (DEBITO = 'S') THEN
  begin
  SELECT SUM(SACU_DEBITO) FROM SALDOS_CUENTAS WHERE CUEN_COD >= :CUENTA AND CUEN_COD <= :CTAFIN AND
    SACU_FECHA >= :FECINI AND SACU_FECHA <= :FECFIN INTO :MOVIMIENTO;
  end
ELSE
  begin
  SELECT SUM(SACU_CREDITO) FROM SALDOS_CUENTAS WHERE CUEN_COD >= :CUENTA AND CUEN_COD <= :CTAFIN AND
    SACU_FECHA >= :FECINI AND SACU_FECHA <= :FECFIN INTO :MOVIMIENTO;
  end
IF (MOVIMIENTO IS NULL) THEN
  MOVIMIENTO = 0;
SUSPEND;
END^

SET TERM ; ^

GRANT EXECUTE ON PROCEDURE movimiento_acum_cuenta_mes TO PUBLIC;

SET TERM ^ ;

CREATE OR ALTER procedure PRESUPUESTO_MES (
    PERIODO integer,
    ANO char(4),
    CUENINI varchar(20),
    CUENFIN varchar(20))
returns (
    CUENTA varchar(20),
    NOMCUENTA varchar(60),
    PRDEBITO numeric(18,2),
    PRCREDITO numeric(18,2),
    APDEBITO numeric(18,2),
    APCREDITO numeric(18,2),
    MVDEBITO numeric(18,2),
    MVCREDITO numeric(18,2),
    AMDEBITO numeric(18,2),
    AMCREDITO numeric(18,2),
    DIFERENCIAM numeric(18,2),
    DIFERENCIAA numeric(18,2),
    PORCENTAJEM numeric(9,2),
    PORCENTAJEA numeric(9,2))
AS
BEGIN
  /* POR CADA CUENTA AFECTABLE CALCULE PRESUP Y MOV. */
  FOR SELECT CUEN_COD, CUEN_NOM FROM CUENTAS WHERE CUEN_COD >= :CUENINI AND CUEN_COD <= :CUENFIN
      order by cuen_cod INTO :CUENTA, :NOMCUENTA
    DO
    BEGIN
    /* CALCULE EL PRESUPUESTO */
    PRDEBITO = 0;
    PRCREDITO = 0;
    SELECT PRES_DEBITO, PRES_CREDITO FROM PRESUPUESTO
        WHERE CUEN_COD = :CUENTA AND PRES_PERIODO = :PERIODO AND PRES_ANO = :ANO
        INTO :PRDEBITO, :PRCREDITO;
    SELECT SUM(PRES_DEBITO), SUM(PRES_CREDITO) FROM PRESUPUESTO
        WHERE CUEN_COD = :CUENTA AND PRES_PERIODO <= :PERIODO AND PRES_ANO = :ANO
        INTO :APDEBITO, :APCREDITO;
    if (PRDEBITO IS NULL) then
        PRDEBITO = 0;
    if (PRCREDITO IS NULL) then
        PRCREDITO = 0;
    if (APDEBITO IS NULL) then
        APDEBITO = 0;
    if (APCREDITO IS NULL) then
        APCREDITO = 0;
    /* CALCULE EL MOVIMIENTO */
    EXECUTE PROCEDURE MOVIMIENTO_CUENTA_MES(:CUENTA, :ANO, :PERIODO, 'S') returning_values (:MVDEBITO);
    EXECUTE PROCEDURE movimiento_acum_cuenta_mes(:CUENTA, :ANO, :PERIODO, 'S') returning_values (:AMDEBITO);
    EXECUTE PROCEDURE MOVIMIENTO_CUENTA_MES(:CUENTA, :ANO, :PERIODO, 'N') returning_values (:MVCREDITO);
    EXECUTE PROCEDURE movimiento_acum_cuenta_mes(:CUENTA, :ANO, :PERIODO, 'N') returning_values (:AMCREDITO);

    DIFERENCIAM = (PRDEBITO - MVDEBITO) - (PRCREDITO - MVCREDITO);
    if ((PRDEBITO - PRCREDITO) <> 0) then
        PORCENTAJEM = 100 - (DIFERENCIAM * 100 / (PRDEBITO - PRCREDITO));
    ELSE
        PORCENTAJEM = 0;
    DIFERENCIAA = (APDEBITO - AMDEBITO) - (APCREDITO - AMCREDITO);
    if ((APDEBITO - APCREDITO) <> 0) then
        PORCENTAJEA = 100 - (DIFERENCIAA * 100 / (APDEBITO - APCREDITO));
    ELSE
        PORCENTAJEA = 0;
    if ((PRDEBITO <> 0) or (PRCREDITO <> 0) or (MVDEBITO <> 0) or (MVCREDITO <> 0) OR
        (APDEBITO <> 0) or (APCREDITO <> 0) or (AMDEBITO <> 0) or (AMCREDITO <> 0))  then
        SUSPEND;
    END
END^

SET TERM ; ^

/* 20140213 */
SET TERM ^ ;

CREATE OR ALTER procedure CONTABIL_EGRESO (
    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 FECAUX DATE;
declare variable FECHA CHAR(8);
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 TIPOCOMP VARCHAR(3);
declare variable PREFCONT VARCHAR(4);
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', TICO_COD, PRCO_PRE, INCJ_BASE, INCJ_DTOPP, INCJ_RTFTE, INCJ_RTIVA, INCJ_RTICA, INCJ_CAJA, INCJ_CTABASE,
    INCJ_CTADTO, INCJ_CTARTFTE, INCJ_CTARTIVA, INCJ_CTARTICA, INCJ_CTARTCREE, INCJ_CTACAJA, INCJ_CONFIRMAR
    FROM INTERFAZ_CAJA
    WHERE INCJ_ID = :IDINTER
    INTO :EXISTE, :TIPOCOMP, :PREFCONT, :BASE, :DTO, :RTFTE, :RTIVA, :RTICA, :CAJA, :CTABASE,
    :CTADTO, :CTARTFTE, :CTARTIVA, :CTARTICA, :CTARTCREE, :CTACAJA, :VER;
if (EXISTE = 'S') then
    BEGIN
    OK = 0;
    FOR SELECT CNTB_ID FROM CONTABILIZACION WHERE CNTB_TIPOREF = 62 AND CNTB_IDREF = :IDDOC INTO :OK DO
        BEGIN
        DELETE FROM CONTABILIZACION_DET WHERE CNTB_ID = :OK;
        DELETE FROM CONTABILIZACION WHERE CNTB_ID = :OK;
        END

    /* TRAIGA EL ENCABEZADO DEL EGRESO */
    SELECT PREF_PRE, EGRE_NUMERO, EGRE_FECHA, 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, :NUM, :FECAUX, :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;
    EXECUTE PROCEDURE FECHA_A_CONTA(:FECAUX) returning_values (:FECHA);
    /* REGISTRE EL ENCABEZADO CONTABLE */
    IDC = GEN_ID(ID_CONTABILIZA, 1);
    INSERT INTO CONTABILIZACION (CNTB_ID, CNTB_TIPOCOMP, CNTB_PREFCNT, CNTB_NUMERO, CNTB_FECHA, CNTB_CONCEPTO, CNTB_REF, CNTB_TIPOREF, CNTB_IDREF, CNTB_PREFREF, CNTB_NUMREF, CNTB_PROCESADO)
        VALUES (:IDC, :TIPOCOMP, :PREFCONT, :NUM, :FECHA, :CONC, '', 62, :IDDOC, :PREF, :NUM, 'N');
    /* 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 = 0;
    SUMA = 0;
    ERROR = 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
                    WHERE CUEN_COD = :CTACAJA INTO :CUENTA, :TIPOCUEN;
            ELSE
                begin
                EXECUTE PROCEDURE ERRORINT(62, :IDDOC, :CTACAJA, 2);
                CUENTA = CTACAJA;
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'I') then
                BEGIN
                EXECUTE PROCEDURE ERRORINT(62, :IDDOC, :CUENTA, 3);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                EXECUTE PROCEDURE ERRORINT(62, :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, :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
                        WHERE CUEN_COD = :CTACAJA INTO :CUENTA, :TIPOCUEN;
                ELSE
                    begin
                    EXECUTE PROCEDURE ERRORINT(62, :IDDOC, :CTACAJA, 2);
                    CUENTA = CTACAJA;
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    end
                if (TIPOCUEN = 'I') then
                    BEGIN
                    EXECUTE PROCEDURE ERRORINT(62, :IDDOC, :CUENTA, 3);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    EXECUTE PROCEDURE ERRORINT(62, :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, :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
                        WHERE CUEN_COD = :CTACAJA INTO :CUENTA, :TIPOCUEN;
                ELSE
                    begin
                    EXECUTE PROCEDURE ERRORINT(62, :IDDOC, :CTACAJA, 2);
                    CUENTA = CTACAJA;
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    end
                if (TIPOCUEN = 'I') then
                    BEGIN
                    EXECUTE PROCEDURE ERRORINT(62, :IDDOC, :CUENTA, 3);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    EXECUTE PROCEDURE ERRORINT(62, :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, :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
                            WHERE CUEN_COD = :CTACAJA INTO :CUENTA, :TIPOCUEN;
                    ELSE
                        begin
                        EXECUTE PROCEDURE ERRORINT(62, :IDDOC, :CTACAJA, 2);
                        CUENTA = CTACAJA;
                        TIPOCUEN = 'N';
                        ERROR = ERROR + 1;
                        end
                    if (TIPOCUEN = 'I') then
                        BEGIN
                        EXECUTE PROCEDURE ERRORINT(62, :IDDOC, :CUENTA, 3);
                        TIPOCUEN = 'N';
                        ERROR = ERROR + 1;
                        END
                    if (TIPOCUEN = 'C') then
                        BEGIN
                        EXECUTE PROCEDURE ERRORINT(62, :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, :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
                WHERE CUEN_COD = :tctacart INTO :CUENTA, :TIPOCUEN;
        ELSE
            begin
            EXECUTE PROCEDURE ERRORINT(62, :IDDOC, :tctacart, 2);
            CUENTA = tctacart;
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            EXECUTE PROCEDURE ERRORINT(62, :IDDOC, :CUENTA, 3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'C') then
            BEGIN
            EXECUTE PROCEDURE ERRORINT(62, :IDDOC, :CUENTA, 3);
            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, :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
                WHERE CUEN_COD = :tctacart INTO :CUENTA, :TIPOCUEN;
        ELSE
            begin
            EXECUTE PROCEDURE ERRORINT(62, :IDDOC, :tctacart, 2);
            CUENTA = tctacart;
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            EXECUTE PROCEDURE ERRORINT(62, :IDDOC, :CUENTA, 3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 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
                    WHERE CUEN_COD = :ctadif INTO :CUENTA, :TIPOCUEN;
            ELSE
                begin
                EXECUTE PROCEDURE ERRORINT(62, :IDDOC, :ctadif, 2);
                CUENTA = ctadif;
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'I') then
                BEGIN
                EXECUTE PROCEDURE ERRORINT(62, :IDDOC, :CUENTA, 3);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                EXECUTE PROCEDURE ERRORINT(62, :IDDOC, :CUENTA, 4);
                TIPOCUEN = 'N';
                ERROR = ERROR + 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
                        WHERE CUEN_COD = :ctartfter INTO :CUENTA, :TIPOCUEN;
                ELSE
                    begin
                    EXECUTE PROCEDURE ERRORINT(62, :IDDOC, :ctartfter, 2);
                    CUENTA = ctartfter;
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    end
                if (TIPOCUEN = 'I') then
                    BEGIN
                    EXECUTE PROCEDURE ERRORINT(62, :IDDOC, :CUENTA, 3);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    EXECUTE PROCEDURE ERRORINT(62, :IDDOC, :CUENTA, 4);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 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
                        WHERE CUEN_COD = :ctartivar INTO :CUENTA, :TIPOCUEN;
                ELSE
                    begin
                    EXECUTE PROCEDURE ERRORINT(62, :IDDOC, :ctartivar, 2);
                    CUENTA = ctartivar;
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    end
                if (TIPOCUEN = 'I') then
                    BEGIN
                    EXECUTE PROCEDURE ERRORINT(62, :IDDOC, :CUENTA, 3);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    EXECUTE PROCEDURE ERRORINT(62, :IDDOC, :CUENTA, 4);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 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
                        WHERE CUEN_COD = :ctarticar INTO :CUENTA, :TIPOCUEN;
                ELSE
                    begin
                    EXECUTE PROCEDURE ERRORINT(62, :IDDOC, :ctarticar, 2);
                    CUENTA = ctarticar;
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    end
                if (TIPOCUEN = 'I') then
                    BEGIN
                    EXECUTE PROCEDURE ERRORINT(62, :IDDOC, :CUENTA, 3);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    EXECUTE PROCEDURE ERRORINT(62, :IDDOC, :CUENTA, 4);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 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
                        WHERE CUEN_COD = :ctartcreer INTO :CUENTA, :TIPOCUEN;
                ELSE
                    begin
                    EXECUTE PROCEDURE ERRORINT(62, :IDDOC, :ctartcreer, 2);
                    CUENTA = ctartcreer;
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    end
                if (TIPOCUEN = 'I') then
                    BEGIN
                    EXECUTE PROCEDURE ERRORINT(62, :IDDOC, :CUENTA, 3);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    EXECUTE PROCEDURE ERRORINT(62, :IDDOC, :CUENTA, 4);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 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
                    WHERE CUEN_COD = :CTADTO INTO :CUENTA, :TIPOCUEN;
            ELSE
                begin
                EXECUTE PROCEDURE ERRORINT(62, :IDDOC, :CTADTO, 2);
                CUENTA = CTADTO;
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'I') then
                BEGIN
                EXECUTE PROCEDURE ERRORINT(62, :IDDOC, :CUENTA, 3);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                EXECUTE PROCEDURE ERRORINT(62, :IDDOC, :CUENTA, 4);
                TIPOCUEN = 'N';
                ERROR = ERROR + 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
                WHERE CUEN_COD = :ctadif INTO :CUENTA, :TIPOCUEN;
        ELSE
            begin
            EXECUTE PROCEDURE ERRORINT(62, :IDDOC, :ctadif, 2);
            CUENTA = ctadif;
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            EXECUTE PROCEDURE ERRORINT(62, :IDDOC, :CUENTA, 3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'C') then
            BEGIN
            EXECUTE PROCEDURE ERRORINT(62, :IDDOC, :CUENTA, 4);
            TIPOCUEN = 'N';
            ERROR = ERROR + 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
                WHERE CUEN_COD = :CTARTFTE INTO :CUENTA, :ES_RETENCION, :TIPOCUEN;
        ELSE
            begin
            EXECUTE PROCEDURE ERRORINT(62, :IDDOC, :CTARTFTE, 2);
            CUENTA = CTARTFTE;
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            EXECUTE PROCEDURE ERRORINT(62, :IDDOC, :CUENTA, 3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'C') then
            BEGIN
            EXECUTE PROCEDURE ERRORINT(62, :IDDOC, :CUENTA, 4);
            TIPOCUEN = 'N';
            ERROR = ERROR + 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
                WHERE CUEN_COD = :CTARTIVA INTO :CUENTA, :ES_RETENCION, :TIPOCUEN;
        ELSE
            begin
            EXECUTE PROCEDURE ERRORINT(62, :IDDOC, :CTARTIVA, 2);
            CUENTA = CTARTIVA;
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            EXECUTE PROCEDURE ERRORINT(62, :IDDOC, :CUENTA, 3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'C') then
            BEGIN
            EXECUTE PROCEDURE ERRORINT(62, :IDDOC, :CUENTA, 4);
            TIPOCUEN = 'N';
            ERROR = ERROR + 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
                WHERE CUEN_COD = :CTARTICA INTO :CUENTA, :ES_RETENCION, :TIPOCUEN;
        ELSE
            begin
            EXECUTE PROCEDURE ERRORINT(62, :IDDOC, :CTARTICA, 2);
            CUENTA = CTARTICA;
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            EXECUTE PROCEDURE ERRORINT(62, :IDDOC, :CUENTA, 3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'C') then
            BEGIN
            EXECUTE PROCEDURE ERRORINT(62, :IDDOC, :CUENTA, 4);
            TIPOCUEN = 'N';
            ERROR = ERROR + 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
                WHERE CUEN_COD = :ctartcree INTO :CUENTA, :ES_RETENCION, :TIPOCUEN;
        ELSE
            begin
            EXECUTE PROCEDURE ERRORINT(62, :IDDOC, :ctartcree, 2);
            CUENTA = ctartcree;
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            EXECUTE PROCEDURE ERRORINT(62, :IDDOC, :CUENTA, 3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'C') then
            BEGIN
            EXECUTE PROCEDURE ERRORINT(62, :IDDOC, :CUENTA, 4);
            TIPOCUEN = 'N';
            ERROR = ERROR + 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
                WHERE CUEN_COD = :CTABASE INTO :CUENTA, :TIPOCUEN;
        ELSE
            begin
            EXECUTE PROCEDURE ERRORINT(62, :IDDOC, :CTABASE, 2);
            CUENTA = CTABASE;
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            EXECUTE PROCEDURE ERRORINT(62, :IDDOC, :CUENTA, 3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'C') then
            BEGIN
            EXECUTE PROCEDURE ERRORINT(62, :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, :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
                    WHERE CUEN_COD = :CTABASE INTO :CUENTA, :TIPOCUEN;
            ELSE
                begin
                EXECUTE PROCEDURE ERRORINT(62, :IDDOC, :CTABASE, 2);
                CUENTA = CTABASE;
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'I') then
                BEGIN
                EXECUTE PROCEDURE ERRORINT(62, :IDDOC, :CUENTA, 3);
                TIPOCUEN = 'N';
                ERROR = ERROR + 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
                        WHERE CUEN_COD = :CTABASE INTO :CUENTA, :TIPOCUEN;
                ELSE
                    begin
                    EXECUTE PROCEDURE ERRORINT(62, :IDDOC, :CTABASE, 2);
                    CUENTA = CTABASE;
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 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';
                    ERROR = ERROR + 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
                WHERE CUEN_COD = :CTADIC INTO :CUENTA, :TIPOCUEN;
        ELSE
            begin
            EXECUTE PROCEDURE ERRORINT(62, :IDDOC, :CTADIC, 2);
            CUENTA = CTADIC;
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            EXECUTE PROCEDURE ERRORINT(62, :IDDOC, :CUENTA, 3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'C') then
            BEGIN
            EXECUTE PROCEDURE ERRORINT(62, :IDDOC, :CUENTA, 4);
            TIPOCUEN = 'N';
            ERROR = ERROR + 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 (ERROR > 0) then
        VER = 'S';
    SUSPEND;
    END /* EXISTE LA INTERFAZ */
  ELSE
    BEGIN
    EXECUTE PROCEDURE ERRORINT(62, :IDDOC, :PREF, 1);
    ERROR = ERROR + 1;
    VER = 'S';
    SUSPEND;
    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 ; ^

/* 20140213b */
/* MAL CONFIGURACION ANO DE DE APERTURA  */
SET TERM ^ ;

CREATE OR ALTER procedure AJUSTES_APERTURA_NIIF
returns (
    CODIGO varchar(20),
    NOMBRE varchar(60),
    SALDO numeric(18,2),
    AJUSTEDB numeric(18,2),
    AJUSTECR numeric(18,2),
    FINAL numeric(18,2),
    CUENTANIIF varchar(20),
    NOMBRENIIF varchar(60),
    AJUSTEDBN numeric(18,2),
    AJUSTECRN numeric(18,2),
    NUEVO numeric(18,2))
AS
declare variable ANO CHAR(4);
BEGIN
EXECUTE PROCEDURE lee_configuracion('CONTABILIDAD', 'GENERAL', 'AÑO BALANCE DE APERTURA NIIF') returning_values (ANO);
FOR SELECT CUEN_COD, CUEN_NOM, CUEN_EQNIIF FROM CUENTAS WHERE CUEN_AFECTABLE = 'S' AND CUEN_ACTIVA = 'S'
    order by CUEN_COD INTO CODIGO, NOMBRE, CUENTANIIF
DO
  BEGIN
  EXECUTE PROCEDURE SALDO_CUENTA_MES(CODIGO, ANO, 1, 'S') RETURNING_VALUES (SALDO);
  if (cuentaniif <> '') then
      SELECT CUEN_NOM FROM CUENTAS_NIIF WHERE CUEN_COD = :cuentaniif INTO :nombreniif;
  ELSE
      NOMBRENIIF = '';
  /* SUME LOS AJUSTES NIIF */
  SELECT SUM(APND_DEBITO), SUM(APND_CREDITO) FROM apertura_niif_det WHERE APND_CUENTA = :codigo INTO :ajustedb, :ajustecr;
  if (ajustedb IS NULL) then
    ajustedb = 0;
  if (ajustecr IS NULL) then
    ajustecr = 0;
  FINAL = SALDO + ajustedb - ajustecr;
  /* LOS AJUSTES DE LA CUENTA NIIF */
  SELECT SUM(APND_DEBITO), SUM(APND_CREDITO) FROM apertura_niif_det WHERE APND_CTANIIF = :cuentaniif INTO :ajustedbn, :ajustecrn;
  if (ajustedbn IS NULL) then
    ajustedbn = 0;
  if (ajustecrn IS NULL) then
    ajustecrn = 0;
  NUEVO = ajustedbn - ajustecrn;
  SUSPEND;
  END
END^

SET TERM ; ^

/* 20140213c */
/* si no existe el saldo inicial agreguelo */

SET TERM ^ ;

CREATE OR ALTER TRIGGER APERTURA_NIIF_DET_AI FOR APERTURA_NIIF_DET
ACTIVE AFTER INSERT POSITION 0
as
begin
  /* Actualice el saldo consolidado */
update apertura_niif a set a.apni_ajustedb = a.apni_ajustedb + new.apnd_debito,
    a.apni_ajustecr = a.apni_ajustecr + new.apnd_credito
    where a.cuen_cod = new.cuen_cod;
/* REGISTRE EL SALDO INICIAL */
if ((NEW.apnd_ctaniif IS NOT NULL) AND (NEW.apnd_ctaniif <> '')) then
  if (EXISTS (SELECT SAIN_ITEM FROM saldos_iniciales_niif WHERE CUEN_COD = NEW.apnd_ctaniif)) Then
    begin
    update saldos_iniciales_niif s set s.sain_debito = s.sain_debito + new.apnd_debito,
        s.sain_credito = s.sain_credito + new.apnd_credito
        where s.cuen_cod = new.apnd_ctaniif;
    end
  else
    INSERT INTO SALDOS_INICIALES_NIIF (CUEN_COD, TERC_NIT, PROY_COD, CENT_COD, ARTI_COD, DOCO_NUMERO, DOCO_VENCE, SAIN_DEBITO, SAIN_CREDITO, SAIN_TIPODOC)
        VALUES (new.apnd_ctaniif, null, null, null, NULL, NULL, NULL, new.apnd_debito, new.apnd_credito, NULL);
end^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER TRIGGER SALDOS_INICIALES_NIIF_BI FOR SALDOS_INICIALES_NIIF
ACTIVE BEFORE INSERT POSITION 0
AS
DECLARE VARIABLE OK CHAR(1);
DECLARE VARIABLE TERCERO CHAR(1);
DECLARE VARIABLE RETENCION CHAR(1);
DECLARE VARIABLE CENTRO CHAR(1);
BEGIN
if (NEW.sain_item IS NULL) then
    SELECT MAX(SAIN_ITEM)+1 FROM saldos_iniciales_niif INTO NEW.sain_item;
if (NEW.sain_item IS NULL) then
    NEW.sain_item = 1;
/* VERIFIQUE QUE LA CUENTA EXISTA Y QUE SEA AFECTABLE */
EXECUTE PROCEDURE valide_cuenta_niif (NEW.CUEN_COD) RETURNING_VALUES (:OK);
IF (OK <> '0') THEN
  BEGIN
  IF (NEW.sain_debito IS NULL) THEN
    NEW.sain_debito = 0;
  IF (NEW.sain_credito IS NULL) THEN
    NEW.sain_credito = 0;
  IF (NEW.TERC_NIT IS NULL) THEN
    EXECUTE PROCEDURE LEE_CONFIGURACION('CONTABILIDAD', 'GENERAL', 'NIT COMPAÑIA') RETURNING_VALUES (NEW.TERC_NIT);
  IF (NEW.PROY_COD IS NULL) THEN
    EXECUTE PROCEDURE LEE_CONFIGURACION('CONTABILIDAD', 'GENERAL', 'PROYECTO UNICO') RETURNING_VALUES (NEW.PROY_COD);
  IF (NEW.CENT_COD IS NULL) THEN
    EXECUTE PROCEDURE LEE_CONFIGURACION('CONTABILIDAD', 'GENERAL', 'CENTRO DE COSTOS UNICO') RETURNING_VALUES (NEW.CENT_COD);
  SELECT CUEN_TERCERO, CUEN_RETENCION, CUEN_CENTRO FROM cuentas_niif WHERE CUEN_COD = NEW.CUEN_COD INTO :TERCERO, :RETENCION, :CENTRO;
  /* VERIFIQUE EL TERCERO */
  IF (TERCERO = 'S' OR RETENCION = 'S') THEN
    EXECUTE PROCEDURE EXISTE_TERCERO (NEW.TERC_NIT) RETURNING_VALUES (:OK);
  ELSE
    EXECUTE PROCEDURE LEE_CONFIGURACION('CONTABILIDAD', 'GENERAL', 'NIT COMPAÑIA') RETURNING_VALUES (NEW.TERC_NIT);
  IF (CENTRO = 'S') THEN
    EXECUTE PROCEDURE EXISTE_CENTRO (NEW.PROY_COD, NEW.CENT_COD) RETURNING_VALUES (:OK);
  ELSE
    BEGIN
    EXECUTE PROCEDURE LEE_CONFIGURACION('CONTABILIDAD', 'GENERAL', 'PROYECTO UNICO') RETURNING_VALUES (NEW.PROY_COD);
    EXECUTE PROCEDURE LEE_CONFIGURACION('CONTABILIDAD', 'GENERAL', 'CENTRO DE COSTOS UNICO') RETURNING_VALUES (NEW.CENT_COD);
    END
  IF (OK = 'S') THEN
    BEGIN
    IF (NEW.SAIN_DEBITO IS NULL) THEN
      NEW.SAIN_DEBITO = 0;
    IF (NEW.SAIN_CREDITO IS NULL) THEN
      NEW.SAIN_CREDITO = 0;
    END
  END
END^

SET TERM ; ^

/* 20140215 */
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 = 1000;
        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_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 = 1000;
        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 ; ^

GRANT EXECUTE ON PROCEDURE contabil_salida_niif TO PUBLIC;

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 = 1000;
        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 ; ^

GRANT EXECUTE ON PROCEDURE contabil_trasmerc_niif TO PUBLIC;

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 = 1000;
        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 ; ^

GRANT EXECUTE ON PROCEDURE contabil_ajuste_niif TO PUBLIC;

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 = 1000;
        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 ; ^

GRANT EXECUTE ON PROCEDURE contabil_ensamble_niif TO PUBLIC;

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 = 1000;
        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 ; ^

GRANT EXECUTE ON PROCEDURE contabil_desensamble_niif TO PUBLIC;

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 = 1000;
        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 ; ^

grant EXECUTE on PROCEDURE CONTABIL_PRODUCCION_NIIF  to PUBLIC;

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 = 1000;
        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 ; ^

GRANT EXECUTE ON PROCEDURE contabil_proddev_niif TO PUBLIC;

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 = 1000;
        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 ; ^

GRANT EXECUTE ON PROCEDURE contabil_prodent_niif TO PUBLIC;

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 = 1000;
        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 ; ^

grant EXECUTE ON PROCEDURE contabil_prodsal_niif TO PUBLIC;

SET TERM ^ ;

CREATE OR ALTER procedure CONTABIL_FACTURA_NIIF (
    IDDOC integer,
    IDINTER integer,
    IDC integer)
returns (
    ERROR integer,
    VER char(1))
AS
declare variable pref varchar(4);
declare variable num varchar(8);
declare variable numero varchar(12);
declare variable fecaux date;
declare variable conc varchar(60);
declare variable venceaux date;
declare variable vence char(8);
declare variable vrdto numeric(18,2);
declare variable vradic numeric(18,2);
declare variable vrsubt numeric(18,2);
declare variable vriva numeric(18,2);
declare variable prtfte numeric(9,2);
declare variable vrrtfte numeric(18,2);
declare variable vrrtiva numeric(18,2);
declare variable prtica numeric(9,2);
declare variable vrrtica numeric(18,2);
declare variable 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 = 1000;
    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 ; ^

GRANT EXECUTE ON PROCEDURE contabil_factura_niif TO PUBLIC;

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 = 1000;
    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 ; ^

GRANT EXECUTE ON PROCEDURE contabil_devolcli_niif TO PUBLIC;

ALTER TABLE REMISIONES_VENTA_DETALLE
ADD RVDE_INALCP T_PORCENTAJE;

ALTER TABLE REMISIONES_VENTA_DETALLE
ADD RVDE_INALCM T_MONTO;

SET TERM ^ ;

create or 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)> 41 ) then
      CONC = 'REMCLI No.' || NUMERO || '-' || SUBSTRING(NOMBRE FROM 1 FOR 41);
    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 ; ^

GRANT EXECUTE ON PROCEDURE contabil_remiclie TO PUBLIC;

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 = 1000;
    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 ; ^

GRANT EXECUTE ON procedure contabil_remiclie_niif TO PUBLIC;

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 = 1000;
        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 ; ^

GRANT EXECUTE ON PROCEDURE contabil_factcomp_niif TO PUBLIC;

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 = 1000;
    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 ; ^

GRANT EXECUTE ON PROCEDURE contabil_devolcomp_niif TO PUBLIC;

SET TERM ^ ;

create or alter procedure CONTABIL_REMIPROV (
    IDDOC integer,
    IDINTER integer)
returns (
    ERRORI integer,
    VER char(1),
    IDC integer)
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 TIPOCOMP VARCHAR(3);
DECLARE VARIABLE PREFCONT VARCHAR(4);
DECLARE VARIABLE INVEN CHAR(1);
DECLARE VARIABLE CTAINVEN VARCHAR(20);
DECLARE VARIABLE IVA CHAR(1);
DECLARE VARIABLE CTAIVA VARCHAR(20);
DECLARE VARIABLE CONSUMO CHAR(1);
DECLARE VARIABLE CTACONSUMO VARCHAR(20);
DECLARE VARIABLE CXP CHAR(1);
DECLARE VARIABLE CTACXP VARCHAR(20);
DECLARE VARIABLE 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', TICO_COD, PRCO_PRE, INCO_INVEN, INCO_IVA, INCO_CONSUMO, INCO_CXP,
    INCO_CTAINVEN, INCO_CTAIVA, INCO_CTACONSUMO, INCO_CTADTO, INCO_CTAADIC, INCO_CTAEXTRA, INCO_CTACXP,
    INCO_CONFIRMAR, INCO_CENTRO
    FROM INTERFAZ_COMPRAS WHERE INCO_ID = :IDINTER
    INTO :EXISTE, :TIPOCOMP, :PREFCONT, :INVEN, :IVA, :CONSUMO, :CXP,
    :CTAINVEN, :CTAIVA, :CTACONSUMO, :CTADTO, :CTAADIC, :CTAEXTRA, :CTACXP,
    :VER, :CENT;
  if (EXISTE = 'S') then
    BEGIN
    /* BORRE CONTABILIZACION PREVIA */
    DELETE FROM CONTABILIZACION WHERE CNTB_TIPOREF = 22 AND CNTB_IDREF = :IDDOC;
    /* 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;
        IDC = GEN_ID(ID_CONTABILIZA, 1);
        INSERT INTO CONTABILIZACION (CNTB_ID, CNTB_TIPOCOMP, CNTB_PREFCNT, CNTB_NUMERO, CNTB_FECHA, CNTB_CONCEPTO, CNTB_REF, CNTB_TIPOREF, CNTB_IDREF, CNTB_PREFREF, CNTB_NUMREF, CNTB_PROCESADO)
            VALUES (:IDC, :TIPOCOMP, :PREFCONT, :NUM, :FECHA, :CONCEPTO, '', 22, :IDDOC, :PREFIJO, :NUM, 'N');
        NUMITEMS = 0;
        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 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(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 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(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 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(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 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(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 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(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(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(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(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(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(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(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(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 ; ^

GRANT EXECUTE ON PROCEDURE contabil_remiprov TO PUBLIC;

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 = 1000;
        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 ; ^

GRANT EXECUTE ON PROCEDURE contabil_remiprov_niif TO PUBLIC;

CREATE TABLE INTERFAZ_CARTERA_NIIF (
    INCA_ID         T_ID NOT NULL /* T_ID = INTEGER */,
    INCA_BASE       CHAR(1),
    INCA_IVA        CHAR(1),
    INCA_RTFTE      CHAR(1),
    INCA_RTIVA      CHAR(1),
    INCA_RTICA      CHAR(1),
    INCA_CLIE       CHAR(1),
    INCA_CTABASE    T_CTA_CONTABLE /* T_CTA_CONTABLE = VARCHAR(20) */,
    INCA_CTAIVA     T_CTA_CONTABLE /* T_CTA_CONTABLE = VARCHAR(20) */,
    INCA_CTARTFTE   T_CTA_CONTABLE /* T_CTA_CONTABLE = VARCHAR(20) */,
    INCA_CTARTIVA   T_CTA_CONTABLE /* T_CTA_CONTABLE = VARCHAR(20) */,
    INCA_CTARTICA   T_CTA_CONTABLE /* T_CTA_CONTABLE = VARCHAR(20) */,
    INCA_CTACLIE    T_CTA_CONTABLE /* T_CTA_CONTABLE = VARCHAR(20) */,
    INCA_RTCREE     CHAR(1),
    INCA_CTARTCREE  T_CTA_CONTABLE /* T_CTA_CONTABLE = VARCHAR(20) */
);

ALTER TABLE INTERFAZ_CARTERA_NIIF ADD CONSTRAINT PK_INTERFAZ_CARTERA_N PRIMARY KEY (INCA_ID);

GRANT ALL ON INTERFAZ_CARTERA TO PUBLIC;

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 = 1000;
      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 ; ^

GRANT EXECUTE ON PROCEDURE contabil_notacrcl_niif TO PUBLIC;

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 = 1000;
    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 ; ^

GRANT EXECUTE ON PROCEDURE contabil_notadbcl_niif TO PUBLIC;

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 = 1000;
        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 ; ^

GRANT EXECUTE ON PROCEDURE contabil_aplicacl_niif TO PUBLIC;

CREATE TABLE INTERFAZ_CXPAGAR_NIIF (
    INCP_ID         T_ID NOT NULL /* T_ID = INTEGER */,
    INCP_BASE       CHAR(1),
    INCP_IVA        CHAR(1),
    INCP_RTFTE      CHAR(1),
    INCP_RTIVA      CHAR(1),
    INCP_RTICA      CHAR(1),
    INCP_PROV       CHAR(1),
    INCP_CTABASE    T_CTA_CONTABLE /* T_CTA_CONTABLE = VARCHAR(20) */,
    INCP_CTAIVA     T_CTA_CONTABLE /* T_CTA_CONTABLE = VARCHAR(20) */,
    INCP_CTARTFTE   T_CTA_CONTABLE /* T_CTA_CONTABLE = VARCHAR(20) */,
    INCP_CTARTIVA   T_CTA_CONTABLE /* T_CTA_CONTABLE = VARCHAR(20) */,
    INCP_CTARTICA   T_CTA_CONTABLE /* T_CTA_CONTABLE = VARCHAR(20) */,
    INCP_CTAPROV    T_CTA_CONTABLE /* T_CTA_CONTABLE = VARCHAR(20) */,
    INCP_RTCREE     CHAR(1),
    INCP_CTARTCREE  T_CTA_CONTABLE /* T_CTA_CONTABLE = VARCHAR(20) */
);

ALTER TABLE INTERFAZ_CXPAGAR_NIIF ADD CONSTRAINT PK_INTERFAZ_CXPAGAR_N PRIMARY KEY (INCP_ID);

GRANT ALL ON INTERFAZ_CXPAGAR_NIIF TO PUBLIC;

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 = 1000;
    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 ; ^

GRANT EXECUTE ON PROCEDURE contabil_notacrpr_niif TO PUBLIC;

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 = 1000;
    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 ; ^

GRANT EXECUTE ON PROCEDURE contabil_notadbpr_niif TO PUBLIC;

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 = 1000;

    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 ; ^

GRANT EXECUTE ON PROCEDURE contabil_aplicapr_niif TO PUBLIC;

CREATE TABLE INTERFAZ_CAJA_NIIF (
    INCJ_ID         T_ID NOT NULL /* T_ID = INTEGER */,
    INCJ_CAJA       CHAR(1),
    INCJ_BANCO      CHAR(1),
    INCJ_BASE       CHAR(1),
    INCJ_RTFTE      CHAR(1),
    INCJ_RTIVA      CHAR(1),
    INCJ_RTICA      CHAR(1),
    INCJ_DTOPP      CHAR(1),
    INCJ_CTACAJA    T_CTA_CONTABLE /* T_CTA_CONTABLE = VARCHAR(20) */,
    INCJ_CTABANCO   T_CTA_CONTABLE /* T_CTA_CONTABLE = VARCHAR(20) */,
    INCJ_CTARTFTE   T_CTA_CONTABLE /* T_CTA_CONTABLE = VARCHAR(20) */,
    INCJ_CTARTIVA   T_CTA_CONTABLE /* T_CTA_CONTABLE = VARCHAR(20) */,
    INCJ_CTARTICA   T_CTA_CONTABLE /* T_CTA_CONTABLE = VARCHAR(20) */,
    INCJ_CTADTO     T_CTA_CONTABLE /* T_CTA_CONTABLE = VARCHAR(20) */,
    INCJ_CTABASE    T_CTA_CONTABLE /* T_CTA_CONTABLE = VARCHAR(20) */,
    INCJ_RTCREE     CHAR(1),
    INCJ_CTARTCREE  T_CTA_CONTABLE /* T_CTA_CONTABLE = VARCHAR(20) */
);

ALTER TABLE INTERFAZ_CAJA_NIIF ADD CONSTRAINT PK_INTERFAZ_CAJA_N PRIMARY KEY (INCJ_ID);

GRANT ALL ON INTERFAZ_CAJA_NIIF TO PUBLIC;

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 = 1000;
    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_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 = 0;
    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 ; ^

GRANT EXECUTE ON PROCEDURE contabil_egreso_niif TO PUBLIC;

SET TERM ^ ;

CREATE OR ALTER procedure CONTABIL_EGRESO (
    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 FECAUX DATE;
declare variable FECHA CHAR(8);
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 TIPOCOMP VARCHAR(3);
declare variable PREFCONT VARCHAR(4);
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', TICO_COD, PRCO_PRE, INCJ_BASE, INCJ_DTOPP, INCJ_RTFTE, INCJ_RTIVA, INCJ_RTICA, INCJ_CAJA, INCJ_RTCREE, INCJ_CTABASE,
    INCJ_CTADTO, INCJ_CTARTFTE, INCJ_CTARTIVA, INCJ_CTARTICA, INCJ_CTARTCREE, INCJ_CTACAJA, INCJ_CONFIRMAR
    FROM INTERFAZ_CAJA
    WHERE INCJ_ID = :IDINTER
    INTO :EXISTE, :TIPOCOMP, :PREFCONT, :BASE, :DTO, :RTFTE, :RTIVA, :RTICA, :CAJA, :RTCREE, :CTABASE,
    :CTADTO, :CTARTFTE, :CTARTIVA, :CTARTICA, :CTARTCREE, :CTACAJA, :VER;
if (EXISTE = 'S') then
    BEGIN
    OK = 0;
    FOR SELECT CNTB_ID FROM CONTABILIZACION WHERE CNTB_TIPOREF = 62 AND CNTB_IDREF = :IDDOC INTO :OK DO
        BEGIN
        DELETE FROM CONTABILIZACION_DET WHERE CNTB_ID = :OK;
        DELETE FROM CONTABILIZACION WHERE CNTB_ID = :OK;
        END

    /* TRAIGA EL ENCABEZADO DEL EGRESO */
    SELECT PREF_PRE, EGRE_NUMERO, EGRE_FECHA, 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, :NUM, :FECAUX, :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;
    EXECUTE PROCEDURE FECHA_A_CONTA(:FECAUX) returning_values (:FECHA);
    /* REGISTRE EL ENCABEZADO CONTABLE */
    IDC = GEN_ID(ID_CONTABILIZA, 1);
    INSERT INTO CONTABILIZACION (CNTB_ID, CNTB_TIPOCOMP, CNTB_PREFCNT, CNTB_NUMERO, CNTB_FECHA, CNTB_CONCEPTO, CNTB_REF, CNTB_TIPOREF, CNTB_IDREF, CNTB_PREFREF, CNTB_NUMREF, CNTB_PROCESADO)
        VALUES (:IDC, :TIPOCOMP, :PREFCONT, :NUM, :FECHA, :CONC, '', 62, :IDDOC, :PREF, :NUM, 'N');
    /* 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 = 0;
    SUMA = 0;
    ERROR = 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
                    WHERE CUEN_COD = :CTACAJA INTO :CUENTA, :TIPOCUEN;
            ELSE
                begin
                EXECUTE PROCEDURE ERRORINT(62, :IDDOC, :CTACAJA, 2);
                CUENTA = CTACAJA;
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'I') then
                BEGIN
                EXECUTE PROCEDURE ERRORINT(62, :IDDOC, :CUENTA, 3);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                EXECUTE PROCEDURE ERRORINT(62, :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, :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
                        WHERE CUEN_COD = :CTACAJA INTO :CUENTA, :TIPOCUEN;
                ELSE
                    begin
                    EXECUTE PROCEDURE ERRORINT(62, :IDDOC, :CTACAJA, 2);
                    CUENTA = CTACAJA;
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    end
                if (TIPOCUEN = 'I') then
                    BEGIN
                    EXECUTE PROCEDURE ERRORINT(62, :IDDOC, :CUENTA, 3);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    EXECUTE PROCEDURE ERRORINT(62, :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, :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
                        WHERE CUEN_COD = :CTACAJA INTO :CUENTA, :TIPOCUEN;
                ELSE
                    begin
                    EXECUTE PROCEDURE ERRORINT(62, :IDDOC, :CTACAJA, 2);
                    CUENTA = CTACAJA;
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    end
                if (TIPOCUEN = 'I') then
                    BEGIN
                    EXECUTE PROCEDURE ERRORINT(62, :IDDOC, :CUENTA, 3);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    EXECUTE PROCEDURE ERRORINT(62, :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, :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
                            WHERE CUEN_COD = :CTACAJA INTO :CUENTA, :TIPOCUEN;
                    ELSE
                        begin
                        EXECUTE PROCEDURE ERRORINT(62, :IDDOC, :CTACAJA, 2);
                        CUENTA = CTACAJA;
                        TIPOCUEN = 'N';
                        ERROR = ERROR + 1;
                        end
                    if (TIPOCUEN = 'I') then
                        BEGIN
                        EXECUTE PROCEDURE ERRORINT(62, :IDDOC, :CUENTA, 3);
                        TIPOCUEN = 'N';
                        ERROR = ERROR + 1;
                        END
                    if (TIPOCUEN = 'C') then
                        BEGIN
                        EXECUTE PROCEDURE ERRORINT(62, :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, :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
                WHERE CUEN_COD = :tctacart INTO :CUENTA, :TIPOCUEN;
        ELSE
            begin
            EXECUTE PROCEDURE ERRORINT(62, :IDDOC, :tctacart, 2);
            CUENTA = tctacart;
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            EXECUTE PROCEDURE ERRORINT(62, :IDDOC, :CUENTA, 3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'C') then
            BEGIN
            EXECUTE PROCEDURE ERRORINT(62, :IDDOC, :CUENTA, 3);
            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, :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
                WHERE CUEN_COD = :tctacart INTO :CUENTA, :TIPOCUEN;
        ELSE
            begin
            EXECUTE PROCEDURE ERRORINT(62, :IDDOC, :tctacart, 2);
            CUENTA = tctacart;
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            EXECUTE PROCEDURE ERRORINT(62, :IDDOC, :CUENTA, 3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 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
                    WHERE CUEN_COD = :ctadif INTO :CUENTA, :TIPOCUEN;
            ELSE
                begin
                EXECUTE PROCEDURE ERRORINT(62, :IDDOC, :ctadif, 2);
                CUENTA = ctadif;
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'I') then
                BEGIN
                EXECUTE PROCEDURE ERRORINT(62, :IDDOC, :CUENTA, 3);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                EXECUTE PROCEDURE ERRORINT(62, :IDDOC, :CUENTA, 4);
                TIPOCUEN = 'N';
                ERROR = ERROR + 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
                        WHERE CUEN_COD = :ctartfter INTO :CUENTA, :TIPOCUEN;
                ELSE
                    begin
                    EXECUTE PROCEDURE ERRORINT(62, :IDDOC, :ctartfter, 2);
                    CUENTA = ctartfter;
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    end
                if (TIPOCUEN = 'I') then
                    BEGIN
                    EXECUTE PROCEDURE ERRORINT(62, :IDDOC, :CUENTA, 3);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    EXECUTE PROCEDURE ERRORINT(62, :IDDOC, :CUENTA, 4);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 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
                        WHERE CUEN_COD = :ctartivar INTO :CUENTA, :TIPOCUEN;
                ELSE
                    begin
                    EXECUTE PROCEDURE ERRORINT(62, :IDDOC, :ctartivar, 2);
                    CUENTA = ctartivar;
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    end
                if (TIPOCUEN = 'I') then
                    BEGIN
                    EXECUTE PROCEDURE ERRORINT(62, :IDDOC, :CUENTA, 3);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    EXECUTE PROCEDURE ERRORINT(62, :IDDOC, :CUENTA, 4);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 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
                        WHERE CUEN_COD = :ctarticar INTO :CUENTA, :TIPOCUEN;
                ELSE
                    begin
                    EXECUTE PROCEDURE ERRORINT(62, :IDDOC, :ctarticar, 2);
                    CUENTA = ctarticar;
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    end
                if (TIPOCUEN = 'I') then
                    BEGIN
                    EXECUTE PROCEDURE ERRORINT(62, :IDDOC, :CUENTA, 3);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    EXECUTE PROCEDURE ERRORINT(62, :IDDOC, :CUENTA, 4);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 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
                        WHERE CUEN_COD = :ctartcreer INTO :CUENTA, :TIPOCUEN;
                ELSE
                    begin
                    EXECUTE PROCEDURE ERRORINT(62, :IDDOC, :ctartcreer, 2);
                    CUENTA = ctartcreer;
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    end
                if (TIPOCUEN = 'I') then
                    BEGIN
                    EXECUTE PROCEDURE ERRORINT(62, :IDDOC, :CUENTA, 3);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 1;
                    END
                if (TIPOCUEN = 'C') then
                    BEGIN
                    EXECUTE PROCEDURE ERRORINT(62, :IDDOC, :CUENTA, 4);
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 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
                    WHERE CUEN_COD = :CTADTO INTO :CUENTA, :TIPOCUEN;
            ELSE
                begin
                EXECUTE PROCEDURE ERRORINT(62, :IDDOC, :CTADTO, 2);
                CUENTA = CTADTO;
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'I') then
                BEGIN
                EXECUTE PROCEDURE ERRORINT(62, :IDDOC, :CUENTA, 3);
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                EXECUTE PROCEDURE ERRORINT(62, :IDDOC, :CUENTA, 4);
                TIPOCUEN = 'N';
                ERROR = ERROR + 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
                WHERE CUEN_COD = :ctadif INTO :CUENTA, :TIPOCUEN;
        ELSE
            begin
            EXECUTE PROCEDURE ERRORINT(62, :IDDOC, :ctadif, 2);
            CUENTA = ctadif;
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            EXECUTE PROCEDURE ERRORINT(62, :IDDOC, :CUENTA, 3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'C') then
            BEGIN
            EXECUTE PROCEDURE ERRORINT(62, :IDDOC, :CUENTA, 4);
            TIPOCUEN = 'N';
            ERROR = ERROR + 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
                WHERE CUEN_COD = :CTARTFTE INTO :CUENTA, :ES_RETENCION, :TIPOCUEN;
        ELSE
            begin
            EXECUTE PROCEDURE ERRORINT(62, :IDDOC, :CTARTFTE, 2);
            CUENTA = CTARTFTE;
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            EXECUTE PROCEDURE ERRORINT(62, :IDDOC, :CUENTA, 3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'C') then
            BEGIN
            EXECUTE PROCEDURE ERRORINT(62, :IDDOC, :CUENTA, 4);
            TIPOCUEN = 'N';
            ERROR = ERROR + 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
                WHERE CUEN_COD = :CTARTIVA INTO :CUENTA, :ES_RETENCION, :TIPOCUEN;
        ELSE
            begin
            EXECUTE PROCEDURE ERRORINT(62, :IDDOC, :CTARTIVA, 2);
            CUENTA = CTARTIVA;
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            EXECUTE PROCEDURE ERRORINT(62, :IDDOC, :CUENTA, 3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'C') then
            BEGIN
            EXECUTE PROCEDURE ERRORINT(62, :IDDOC, :CUENTA, 4);
            TIPOCUEN = 'N';
            ERROR = ERROR + 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
                WHERE CUEN_COD = :CTARTICA INTO :CUENTA, :ES_RETENCION, :TIPOCUEN;
        ELSE
            begin
            EXECUTE PROCEDURE ERRORINT(62, :IDDOC, :CTARTICA, 2);
            CUENTA = CTARTICA;
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            EXECUTE PROCEDURE ERRORINT(62, :IDDOC, :CUENTA, 3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'C') then
            BEGIN
            EXECUTE PROCEDURE ERRORINT(62, :IDDOC, :CUENTA, 4);
            TIPOCUEN = 'N';
            ERROR = ERROR + 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
                WHERE CUEN_COD = :ctartcree INTO :CUENTA, :ES_RETENCION, :TIPOCUEN;
        ELSE
            begin
            EXECUTE PROCEDURE ERRORINT(62, :IDDOC, :ctartcree, 2);
            CUENTA = ctartcree;
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            EXECUTE PROCEDURE ERRORINT(62, :IDDOC, :CUENTA, 3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'C') then
            BEGIN
            EXECUTE PROCEDURE ERRORINT(62, :IDDOC, :CUENTA, 4);
            TIPOCUEN = 'N';
            ERROR = ERROR + 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
                WHERE CUEN_COD = :CTABASE INTO :CUENTA, :TIPOCUEN;
        ELSE
            begin
            EXECUTE PROCEDURE ERRORINT(62, :IDDOC, :CTABASE, 2);
            CUENTA = CTABASE;
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            EXECUTE PROCEDURE ERRORINT(62, :IDDOC, :CUENTA, 3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'C') then
            BEGIN
            EXECUTE PROCEDURE ERRORINT(62, :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, :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
                    WHERE CUEN_COD = :CTABASE INTO :CUENTA, :TIPOCUEN;
            ELSE
                begin
                EXECUTE PROCEDURE ERRORINT(62, :IDDOC, :CTABASE, 2);
                CUENTA = CTABASE;
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'I') then
                BEGIN
                EXECUTE PROCEDURE ERRORINT(62, :IDDOC, :CUENTA, 3);
                TIPOCUEN = 'N';
                ERROR = ERROR + 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
                        WHERE CUEN_COD = :CTABASE INTO :CUENTA, :TIPOCUEN;
                ELSE
                    begin
                    EXECUTE PROCEDURE ERRORINT(62, :IDDOC, :CTABASE, 2);
                    CUENTA = CTABASE;
                    TIPOCUEN = 'N';
                    ERROR = ERROR + 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';
                    ERROR = ERROR + 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
                WHERE CUEN_COD = :CTADIC INTO :CUENTA, :TIPOCUEN;
        ELSE
            begin
            EXECUTE PROCEDURE ERRORINT(62, :IDDOC, :CTADIC, 2);
            CUENTA = CTADIC;
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            EXECUTE PROCEDURE ERRORINT(62, :IDDOC, :CUENTA, 3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'C') then
            BEGIN
            EXECUTE PROCEDURE ERRORINT(62, :IDDOC, :CUENTA, 4);
            TIPOCUEN = 'N';
            ERROR = ERROR + 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 (ERROR > 0) then
        VER = 'S';
    SUSPEND;
    END /* EXISTE LA INTERFAZ */
  ELSE
    BEGIN
    EXECUTE PROCEDURE ERRORINT(62, :IDDOC, :PREF, 1);
    ERROR = ERROR + 1;
    VER = 'S';
    SUSPEND;
    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 ; ^

/* 20140217 */
/* si compra regimen simplificado calcule la base de la retención de IVA */
SET TERM ^ ;

CREATE OR ALTER procedure CONTABIL_FACTCOMP (
    IDDOC integer,
    IDINTER integer)
returns (
    ERROR integer,
    VER char(1),
    IDC integer)
AS
DECLARE VARIABLE PREFIJO VARCHAR(4);
DECLARE VARIABLE NUM VARCHAR(8);
DECLARE VARIABLE NUMERO VARCHAR(10);
DECLARE VARIABLE FECAUX DATE;
DECLARE VARIABLE FECHA CHAR(8);
DECLARE VARIABLE CONCEPTO CHAR(60);
DECLARE VARIABLE VENCEAUX DATE;
DECLARE VARIABLE VENCE CHAR(8);
DECLARE VARIABLE VRDTO NUMERIC(18,2);
DECLARE VARIABLE VRADIC NUMERIC(18,2);
DECLARE VARIABLE VRSUBT NUMERIC(18,2);
DECLARE VARIABLE VRIVA NUMERIC(18,2);
DECLARE VARIABLE PRTFTE NUMERIC(9,2);
DECLARE VARIABLE VRRTFTE NUMERIC(18,2);
DECLARE VARIABLE VRRTIVA NUMERIC(18,2);
DECLARE VARIABLE PRTICA NUMERIC(9,2);
DECLARE VARIABLE VRRTICA NUMERIC(18,2);
DECLARE VARIABLE 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 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', TICO_COD, PRCO_PRE, INCO_INVEN, INCO_IVA, INCO_CONSUMO, INCO_CXP, INCO_RTFTE, INCO_RTIVA, INCO_RTICA, INCO_RTCREE,
    INCO_CTAINVEN, INCO_CTAIVA, INCO_CTACONSUMO, INCO_CTADTO, INCO_CTAADIC, INCO_CTAEXTRA, INCO_CTACXP, INCO_CTARTFTE, INCO_CTARTIVA,
    INCO_CTARTICA, INCO_CTARTCREE, INCO_CONFIRMAR, INCO_CENTRO
    FROM INTERFAZ_COMPRAS WHERE INCO_ID = :IDINTER
    INTO :EXISTE, :TIPOCOMP, :PREFCONT, :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
    /* BORRE CONTABILIZACION PREVIA */
    DELETE FROM CONTABILIZACION WHERE CNTB_TIPOREF = 21 AND CNTB_IDREF = :IDDOC;
    /* ENCABEZADO DE LA FACTURA */
    SELECT PREF_PRE, FACO_NUMERO, FACO_FECHA, F.TERC_NIT, FACO_IMPTOS, FACO_VENCE, FACO_DTOMONTO, FACO_ADICIONAL, FACO_IVAMONTO,
        FACO_EXTRA, FACO_TOTAL, FACO_RTFTEPORC, FACO_RTFTEMONTO, FACO_RTIVAPOR, FACO_RTIVAMONTO, FACO_RTICAPOR, FACO_RTICAMONTO,
        FACO_RTCREE, FACO_RTCREEM, TERC_NOM, PROV_CTARTFTE, PROV_CTARTIVA, PROV_CTARTICA, PROV_CTARTCREE, PROV_CTAPAGAR, FACO_NUMPROV,
        FACO_ANULADO, 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, :FECAUX, :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(:FECAUX) returning_values (:FECHA);
        EXECUTE PROCEDURE FECHA_A_CONTA(:VENCEAUX) returning_values (:VENCE);
        if (NUMPROV IS NULL) then
            NUMPROV = NUMERO;
        CONCEPTO = 'FC No.' || NUMERO || '-' || SUBSTR(NOMBRE,1,26) || '-NPROV.' || NUMPROV;
        IDC = GEN_ID(ID_CONTABILIZA, 1);
        INSERT INTO CONTABILIZACION (CNTB_ID, CNTB_TIPOCOMP, CNTB_PREFCNT, CNTB_NUMERO, CNTB_FECHA, CNTB_CONCEPTO, CNTB_REF, CNTB_TIPOREF, CNTB_IDREF, CNTB_PREFREF, CNTB_NUMREF, CNTB_PROCESADO)
            VALUES (:IDC, :TIPOCOMP, :PREFCONT, :NUM, :FECHA, :CONCEPTO, '', 21, :IDDOC, :PREFIJO, :NUM, 'N');
        NUMITEMS = 0;
        SUMA = 0;
        NETO = 0;
        ERROR = 0;
        EXECUTE PROCEDURE LEE_CONFIGURACION('COMPRAS', 'FACTURAS', '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 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(21, :IDDOC, :CTAINVEN, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 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 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(21, :IDDOC, :CTAINVEN, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                  if (ERRORC <> 0) then
                    ERROR = ERROR + 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 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(21, :IDDOC, :CTAIVA, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (TIPOCUEN = 'I') then
                    BEGIN
                    FOR SELECT F.ARTI_COD, FCDE_IVAMONTO, (FCDE_CANT * (FCDE_PRUNIT-FCDE_DTOMONTO)), TAIV_PORC, FCDE_CONSUMO
                        FROM ARTICULO A, CONTABIL_ARTICULO C, FACTURAS_COMPRAS_DETALLE F, TARIFA_IVA T WHERE F.FACO_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND COAR_CTAIVAV = :CUENTA AND A.TAIV_COD = T.TAIV_COD
                        INTO :ARTICULO, :IMPTOS, :MONTO, :PORCIVA, :VALORADIC
                    DO
                        BEGIN
                        if (MERCANCIA <> 0) then
                            IMPTOS = CAST(IMPTOS AS DOUBLE PRECISION) * VRSUBT / MERCANCIA;
                        else
                            IMPTOS = 0;
                        if (IMPINC = 'S') then
                            BEGIN
                            MONTO = MONTO - IMPTOS;
                            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(21, :IDDOC, :CTAIVA, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (TIPOCUEN = 'I') then
                    BEGIN
                    FOR SELECT F.ARTI_COD, (FCDE_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 C, FACTURAS_COMPRAS_DETALLE F
                WHERE F.FACO_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD GROUP BY COAR_CTACONS INTO :CTACONSUMO, :IMPTOS
            DO
              if (IMPTOS <> 0) then
                BEGIN
                execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
                EXECUTE PROCEDURE CUENTA_INTERFAZ(21, :IDDOC, :CTACONSUMO, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (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(21, :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, '', :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(21, :IDDOC, :CTADTO, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_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(21, :IDDOC, :CTAADIC, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_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(21, :IDDOC, :CTAEXTRA, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'C') then
                BEGIN
                if (vrextra > 0) then
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_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(21, :IDDOC, :CTARTFTE, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_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 C, FACTURAS_COMPRAS_DETALLE F
            WHERE F.faco_id = :IDDOC AND F.ARTI_COD = C.ARTI_COD
            GROUP BY COAR_CTARTFTE
            INTO :CTARTFTE, :PRTFTE, :baseadic,  :MONTO, :VRRTFTE
            DO
            BEGIN
            MONTO = MONTO * FACTOR * -1;
            if (ABS(MONTO) >= :baseadic) then
                BEGIN
                VRRTFTE = VRRTFTE * FACTOR / 100;
                execute procedure redondee(VRRTFTE, DIG) returning_values (VRRTFTE);
                execute procedure redondee(MONTO, DIG) returning_values (MONTO);
                if (VRRTFTE <> 0) then
                    BEGIN
                    EXECUTE PROCEDURE CUENTA_INTERFAZ(21, :IDDOC, :CTARTFTE, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
                    if (ERRORC <> 0) then
                        ERROR = ERROR + 1;
                    if (TIPOCUEN = 'C') then
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_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(21, :IDDOC, :CTARTIVA, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            /* SI ES DOCUMENTO EQUIVALENTE */
            if (VRRTIVA = VRIVA) then
                BEGIN
                EXECUTE PROCEDURE LEE_CONFIGURACION('COMPRAS', 'FACTURAS', 'PORCENTAJE DE RETENCION DE IVA PARA REGIMEN SIMPLIFICADO') returning_values (:PORC);
                if (PORC <> 0) then
                    VRIVA = VRRTIVA * 100 / PORC;
                END
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_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(21, :IDDOC, :CTARTICA, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'C') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_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(21, :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, '', 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(21, :IDDOC, :CTACXP, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'C') then
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_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(21, :IDDOC, :CUENTAADIC, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (TIPOCUEN = 'C') then
                    BEGIN
                    if (DBADIC = 'S') then
                        BEGIN
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_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(21, :IDDOC, :CTAADIC, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (TIPOCUEN = 'C') then
                    BEGIN
                    if (NETO < 0) then
                        BEGIN
                        NETO = NETO * -1;
                        INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_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 (ERROR > 0) then
        VER = 'S';
    SUSPEND;
    END
ELSE
    BEGIN
    EXECUTE PROCEDURE ERRORINT(21, :IDDOC, :PREFIJO, 1);
    ERROR = ERROR + 1;
    VER = 'S';
    SUSPEND;
    END
END^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE CONTABILICE_COMP_SIMPLIFICADO(
    IDI INTEGER)
RETURNS (
    ID INTEGER,
    PREF VARCHAR(4),
    NUMERO VARCHAR(8),
    ESTADO VARCHAR(20),
    IDC INTEGER)
AS
DECLARE VARIABLE VER CHAR(2);
declare variable ERROR INTEGER;
BEGIN
FOR SELECT FACO_ID, PREF_PRE, FACO_NUMERO FROM FACTURAS_COMPRA C, PROVEEDORES P WHERE
    C.TERC_NIT = P.TERC_NIT AND PROV_SIMPLIFICADO = 'S' AND FACO_ANULADO = 'N'
    ORDER BY FACO_ID INTO :ID, :PREF, :NUMERO
DO
  BEGIN
  ESTADO = 'PROCESANDO';
  SUSPEND;
  /* BORRE LA CONTABILIZACION */
/*  delete FROM comprobante_detalle WHERE ENCO_CONSEC IN (SELECT ENCO_CONSEC FROM COMPROBANTE_ENCABEZADO WHERE ENCO_TIPOREF = 21 AND ENCO_IDREF = :ID);
  DELETE FROM comprobante_encabezado  WHERE ENCO_TIPOREF = 21 AND ENCO_IDREF = :ID; */
  EXECUTE PROCEDURE CONTABIL_FACTCOMP (:ID, :IDI) RETURNING_VALUES (:ERROR, VER, :IDC);
  if (ERROR = 0) then
    BEGIN
/*    EXECUTE PROCEDURE CONTABILIZA_PENDIENTE (:IDC); */
    ESTADO = 'OK';
    END
  ELSE
    ESTADO = 'ERROR';
  suspend;
  END
END
^

SET TERM ; ^

SET TERM ^ ;

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

/* 20140217b */
/* CAMBIO EN PARAMETRO CONFIGURACION ANALISIS DE CARTERA CON FECHA FACTURA, VENCIMIENTO O ENTREGA */
SET TERM ^ ;

CREATE OR ALTER procedure REP_ANALISIS_CARTERA (
    DESDE varchar(20),
    HASTA varchar(20),
    GRPINI varchar(5),
    GRPFIN varchar(5),
    FECHA date,
    DETALLE char(1),
    ORDEN char(1),
    AGRUPA char(1),
    DIASR integer,
    SUBEMPRESA integer,
    GRUPCART integer,
    EXTENDIDA char(1),
    MONEDA integer)
returns (
    NIT varchar(20),
    NOMBRE varchar(60),
    TELEFONO varchar(40),
    DIRECCION varchar(60),
    CIUDAD varchar(40),
    CONTACTO varchar(60),
    EMAIL varchar(100),
    MAILCART varchar(100),
    FAX varchar(25),
    CEL varchar(25),
    CODCLI varchar(20),
    CODZONA varchar(2),
    NOMZONA varchar(60),
    CODCOBR integer,
    NOMCOBR varchar(60),
    DV char(1),
    DIASCR integer,
    CODCIUD char(5),
    NOMCIUD varchar(60),
    SUCURSAL varchar(10),
    NOMSUC varchar(60),
    RESALTAR char(1),
    INSTCART varchar(255),
    TIPO integer,
    ID integer,
    PREFIJO varchar(4),
    NUMERO varchar(8),
    DIAS integer,
    SALDO numeric(18,2),
    CORRIENTE numeric(18,2),
    CERO numeric(18,2),
    TREINTA numeric(18,2),
    SESENTA numeric(18,2),
    NOVENTA numeric(18,2),
    CIENTOCHENTA numeric(18,2),
    DOSSETENTA numeric(18,2),
    TRESSESENTA numeric(18,2),
    PROVISIONAL numeric(18,2),
    TIPONOM varchar(8),
    FECDOC date,
    VENCE date,
    CUPO numeric(18,2),
    DISPONIBLE numeric(18,2),
    OBS blob sub_type 0 segment size 80,
    GRUPCOD integer,
    DIA_CAR integer,
    CALIFICA integer,
    GRUPNOM varchar(30))
AS
DECLARE VARIABLE NITINI VARCHAR(20);
DECLARE VARIABLE NITFIN VARCHAR(20);
DECLARE VARIABLE NOMINI VARCHAR(20);
DECLARE VARIABLE NOMFIN VARCHAR(20);
DECLARE VARIABLE RTFTE NUMERIC(18,2);
DECLARE VARIABLE RTIVA NUMERIC(18,2);
DECLARE VARIABLE RTICA NUMERIC(18,2);
DECLARE VARIABLE VENCIMIENTO VARCHAR(12);
DECLARE VARIABLE OK CHAR(1);
declare variable AUTORET VARCHAR(10);
declare variable FAUTORET DATE;
declare variable INCLANTI CHAR(2);
declare variable descnt_prov char(2);
declare variable MAXDIAS INTEGER;
DECLARE VARIABLE TRM NUMERIC(18,2);
declare variable ext3 varchar(8);
declare variable factorext integer;
BEGIN
if (ORDEN = 'C') then
    BEGIN
    NITINI = DESDE;
    NITFIN = HASTA;
    NOMINI = '';
    NOMFIN = 'zz';
    END
ELSE
    BEGIN
    NOMINI = DESDE;
    NOMFIN = HASTA;
    NITINI = '';
    NITFIN = 'zz';
    END
/* Ubique el NIT */
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', 'ANALISIS DE CARTERA CON FECHA FACTURA, VENCIMIENTO O ENTREGA') returning_values (VENCIMIENTO);
EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'INCLUIR ANTICIPOS DE CLIENTES EN REPORTES Y CONSULTAS DE CARTERA') returning_values (INCLANTI);
EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'DESCONTAR RECIBOS PROVISIONALES EN INFORMES DE CARTERA') RETURNING_VALUES (:descnt_prov);
EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'ANALISIS EXTENDIDO CON RANGOS IGUALES AL NORMAL O TRIPLES') RETURNING_VALUES (:ext3);
if (ext3 = 'TRIPLES') then
    factorext = 3;
else
    factorext = 1;
FOR select T.TERC_NIT, TERC_NOM, TERC_DV, CLSU_TEL, clsu_dir, CLSU_CIUDAD, S.COBR_COD, S.ZONA_COD, T.CIUD_COD, CLIE_CUPO, CLIE_DIAS, CLCU_COD,
    CLSU_NOMBRE, t.terc_obs, C.GRCA_COD, TERC_CONTACTO, TERC_EMAIL, TERC_FAX, TERC_CEL, CLIE_COD, CLIE_RESALTAR, CLIE_INSTCARTERA, CLIE_MAILCART, CLIE_CALIFICA, CLIE_DIAS
    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
        T.TERC_NOM >= :NOMINI AND T.TERC_NOM <= :NOMFIN AND ((:GRUPCART = 0) or (C.GRCA_COD = :GRUPCART))
    INTO :NIT, :NOMBRE, :DV, :TELEFONO, :DIRECCION, :CIUDAD, :CODCOBR, :CODZONA, :CODCIUD, :CUPO, :DIA_CAR,  :SUCURSAL,
    :NOMSUC, :obs, :GRUPCOD, :CONTACTO, :EMAIL, :FAX, :CEL, :CODCLI, :RESALTAR, INSTCART, :MAILCART, :CALIFICA, :DIASCR
    DO  
    BEGIN
    SELECT COBR_NOM FROM COBRADORES CB WHERE COBR_COD = :CODCOBR INTO :NOMCOBR;
    SELECT ZONA_NOM FROM ZONAS Z WHERE ZONA_COD = :CODZONA INTO :NOMZONA;
    SELECT CIUD_NOM FROM CIUDADES WHERE CIUD_COD = :CODCIUD INTO :NOMCIUD;
    SELECT GRCA_NOMBRE FROM GRUPO_CARTERA WHERE GRCA_COD = :GRUPCOD INTO :GRUPNOM;
    provisional = 0;
    MAXDIAS = 0;
    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
        DISPONIBLE = CUPO;
        CORRIENTE = 0;
        CERO = 0;
        TREINTA = 0;
        SESENTA = 0;
        NOVENTA = 0;
        CIENTOCHENTA = 0;
        DOSSETENTA = 0;
        TRESSESENTA = 0;
        /* BUSQUE EN SALDOS_DOC_CARTERA LOS QUE TENGAN SALDO > 0 */
        FOR SELECT MVCL_TIPOREF, MVCL_IDREF, MVCL_PREFREF, MVCL_NUMREF, MVCL_FECHA, MVCL_VENCE
            FROM MOVIMIENTO_CLIENTES
            WHERE TERC_NIT = :NIT AND MVCL_SUCURSAL = :SUCURSAL AND MVCL_FECHA <= :FECHA
                AND MVCL_ABONO = 'N' AND ((:SUBEMPRESA = 0) or (SUCU_ID = :SUBEMPRESA)) AND
                ((:MONEDA = 0) or (MVCL_TRM <> 1))
            INTO :TIPO, :ID, :PREFIJO, :NUMERO, :FECDOC, :VENCE
            DO
            BEGIN
            if ((inclanti = 'SI') or (TIPO <> 45)) then
                BEGIN
                EXECUTE PROCEDURE saldo_doc_cartera(TIPO, ID, FECHA, MONEDA) returning_values (SALDO);
                if (SALDO <> 0) then
                    BEGIN
                    DISPONIBLE = DISPONIBLE - SALDO;
                    SELECT TIDO_NOMCORTO FROM TIPO_DOCUMENTO WHERE TIDO_COD = :TIPO INTO :TIPONOM;

                    if (MONEDA = 0) then
                        SELECT SUM(SDCA_RTFTE - SDCA_ABRTFTE), SUM(SDCA_RTIVA - SDCA_ABRTIVA), SUM(SDCA_RTICA - SDCA_ABRTICA)
                            FROM SALDOS_DOC_CARTERA WHERE SDCA_TIPOREF = :TIPO AND SDCA_IDREF = :ID
                            INTO :RTFTE, :RTIVA, :RTICA;
                    ELSE
                        SELECT SUM((SDCA_RTFTE - SDCA_ABRTFTE)/SDCA_TRM), SUM((SDCA_RTIVA - SDCA_ABRTIVA)/SDCA_TRM), SUM((SDCA_RTICA - SDCA_ABRTICA)/SDCA_TRM)
                            FROM SALDOS_DOC_CARTERA WHERE SDCA_TIPOREF = :TIPO AND SDCA_IDREF = :ID
                            INTO :RTFTE, :RTIVA, :RTICA;
                    if (RTFTE IS NULL) then
                        RTFTE = 0;
                    if ((TIPO = 42) or (TIPO = 45) or (TIPO = 33)) THEN
                        BEGIN
                        if (RTFTE > 0) then
                            RTFTE = 0;
                        END
                    ELSE
                        BEGIN
                        if (RTFTE < 0) then
                            RTFTE = 0;
                        END
                    if (FAUTORET <= FECDOC) then
                        RTFTE = 0;
                    if (RTIVA IS NULL) then
                        RTIVA = 0;
                    if ((TIPO = 42) or (TIPO = 45) or (TIPO = 33)) THEN
                        BEGIN
                        if (RTIVA > 0) then
                            RTIVA = 0;
                        END
                    ELSE
                        BEGIN
                        if (RTIVA < 0) then
                            RTIVA = 0;
                        END
                    if (RTICA IS NULL) then
                        RTICA = 0;
                    if ((TIPO = 42) or (TIPO = 45) or (TIPO = 33)) THEN
                        BEGIN
                        if (RTICA > 0) then
                            RTICA = 0;
                        END
                    ELSE
                        BEGIN
                        if (RTICA < 0) then
                            RTICA = 0;
                        END
                    /* AHORA CLASIFIQUE LOS DIAS */
                    if (VENCIMIENTO = 'FECHA') then
                        DIAS = FECHA - FECDOC;
                    ELSE
                        BEGIN
                        DIAS = FECHA - VENCE;
                        if ((TIPO = 31) AND (VENCIMIENTO = 'ENTREGA')) THEN
                            BEGIN
                            SELECT FACT_ENTREGA FROM FACTURAS WHERE FACT_ID = :ID INTO :VENCE;
                            DIAS = FECHA - VENCE;
                            END
                        END
                    if (MAXDIAS < DIAS) then
                        MAXDIAS = DIAS;
                    if (DETALLE = 'S') then
                        BEGIN
                        CORRIENTE = 0;
                        CERO = 0;
                        TREINTA = 0;
                        SESENTA = 0;
                        NOVENTA = 0;
                        CIENTOCHENTA = 0;
                        DOSSETENTA = 0;
                        tressesenta = 0;
                        END
                    if (DIAS < 0) then
                        CORRIENTE = CORRIENTE + SALDO;
                    ELSE
                        if (DIAS <= DIASR) then
                            CERO = CERO + SALDO;
                        ELSE
                            if (DIAS <= (DIASR * 2)) then
                                TREINTA = TREINTA + SALDO;
                            ELSE
                                if (DIAS <= (DIASR * 3)) then
                                    SESENTA = SESENTA + SALDO;
                                ELSE
                                    BEGIN
                                    if (EXTENDIDA = 'N') then
                                        NOVENTA = NOVENTA + SALDO;
                                    else    
                                        if (EXT3 = 'TRIPLES') then
                                            BEGIN
                                            if (DIAS <= (DIASR * 3) * 2) then
                                                NOVENTA = NOVENTA + SALDO;
                                            ELSE
                                                if (DIAS <= (DIASR * 3) * 3) then
                                                    CIENTOCHENTA = CIENTOCHENTA + SALDO;
                                                ELSE
                                                    if (DIAS <= (DIASR * 3) * 4) then
                                                        dossetenta = dossetenta + SALDO;
                                                    ELSE
                                                        tressesenta = tressesenta + SALDO;
                                            END
                                        else
                                            BEGIN
                                            if (DIAS <= (DIASR * 4)) then
                                                NOVENTA = NOVENTA + SALDO;
                                            ELSE
                                                if (DIAS <= (DIASR * 5)) then
                                                    CIENTOCHENTA = CIENTOCHENTA + SALDO;
                                                ELSE
                                                    if (DIAS <= (DIASR * 6)) then
                                                        dossetenta = dossetenta + SALDO;
                                                    ELSE
                                                        tressesenta = tressesenta + SALDO;
                                            END
                                    END
                    if (DETALLE = 'S') then
                        SUSPEND;
                    END  /* SALDO */
                END  /* NO ANTICIPO */
            END  /* FOR MOV_CLI */
        /* AGREGUE LOS RECIBOS PROVISIONALES CON SIGNO NEGATIVO */
        FOR SELECT 65, MAX(P.RCPR_ID), MAX(PREF_PRE), MAX(RCPR_NUMERO), MAX(RCPR_FECHA), SUM(RPDE_ABONO* -1), SUM(RPDE_RTFTE*-1), SUM(RPDE_RTIVA*-1), SUM(RPDE_RTICA*-1), MAX(RCPR_TRM)
            FROM RECIBO_PROVISIONAL P, recibo_provisional_detalle D
            WHERE P.rcpr_id = D.rcpr_id AND P.TERC_NIT = :NIT AND D.RPDE_SUCURSAL = :SUCURSAL AND P.RCPR_FECHA <= :FECHA AND P.RCPR_ANULADO = 'N' AND
            ((RCPR_FECCRUCE IS NULL) or (RCPR_FECCRUCE > :FECHA)) AND ((:SUBEMPRESA = 0) or (SUCU_ID = :SUBEMPRESA)) AND ((:MONEDA = 0) or (RCPR_TRM <> 1))
            GROUP BY P.rcpr_id
            INTO :TIPO, :ID, :PREFIJO, :NUMERO, :FECDOC, :PROVISIONAL, :rtfte,  :RTIVA, :RTICA, :TRM
            DO
            BEGIN
            if ((MONEDA <> 0) AND (TRM <> 0)) then
                BEGIN
                PROVISIONAL = PROVISIONAL / TRM;
                RTFTE = RTFTE / TRM;
                RTIVA = RTIVA / TRM;
                RTICA = RTICA / TRM;
                END
            if (:descnt_prov = 'NO') then
              SALDO = 0;
            else
              SALDO = :PROVISIONAL;
            SELECT TIDO_NOMCORTO FROM TIPO_DOCUMENTO WHERE TIDO_COD = :TIPO INTO :TIPONOM;
            /* CALCULE EL VENCIMIENTO DEL ULTIMO DOCUMENTO POSFECHADO */
            SELECT MAX(RPPA_FECHA) FROM recibo_provisional_pago WHERE RCPR_ID = :ID INTO :VENCE;
            DIAS = VENCE - FECHA;
            if (DETALLE = 'S') then
                BEGIN
                CORRIENTE = 0;
                CERO = 0;
                TREINTA = 0;
                SESENTA = 0;
                NOVENTA = 0;
                CIENTOCHENTA = 0;
                DOSSETENTA = 0;
                tressesenta = 0;
                END
            if (DIAS < 0) then
                CORRIENTE = CORRIENTE + SALDO;
            ELSE
                if (DIAS <= DIASR) then
                    CERO = CERO + SALDO;
                ELSE
                    if (DIAS <= (DIASR * 2)) then
                        TREINTA = TREINTA + SALDO;
                    ELSE
                        if (DIAS <= (DIASR * 3)) then
                            SESENTA = SESENTA + SALDO;
                        ELSE
                            BEGIN
                            if (EXTENDIDA = 'N') then
                                NOVENTA = NOVENTA + SALDO;
                            else
                                if (EXT3 = 'TRIPLES') then
                                    BEGIN
                                    if (DIAS <= (DIASR * 3) * 2) then
                                        NOVENTA = NOVENTA + SALDO;
                                    ELSE
                                        if (DIAS <= (DIASR * 3) * 3) then
                                            CIENTOCHENTA = CIENTOCHENTA + SALDO;
                                        ELSE
                                            if (DIAS <= (DIASR * 3) * 4) then
                                                dossetenta = dossetenta + SALDO;
                                            ELSE
                                                tressesenta = tressesenta + SALDO;
                                    END
                                else
                                    BEGIN
                                    if (DIAS <= (DIASR * 4)) then
                                        NOVENTA = NOVENTA + SALDO;
                                    ELSE
                                        if (DIAS <= (DIASR * 5)) then
                                            CIENTOCHENTA = CIENTOCHENTA + SALDO;
                                        ELSE
                                            if (DIAS <= (DIASR * 6)) then
                                                dossetenta = dossetenta + SALDO;
                                            ELSE
                                                tressesenta = tressesenta + SALDO;
                                    END
                            END
            if (DETALLE = 'S') then
                SUSPEND;
            END
        if (DETALLE = 'N') then
            begin
            SALDO = CORRIENTE + CERO + TREINTA + SESENTA + NOVENTA + cientochenta + dossetenta + tressesenta;
            DIAS = MAXDIAS;
            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 <= :FECHA
                AND MVCL_ABONO = 'N' AND ((:SUBEMPRESA = 0) or (SUCU_ID = :SUBEMPRESA)) AND
                ((:MONEDA = 0) or (MVCL_TRM <> 1))
            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
                DISPONIBLE = CUPO;
                CORRIENTE = 0;
                CERO = 0;
                TREINTA = 0;
                SESENTA = 0;
                NOVENTA = 0;
                CIENTOCHENTA = 0;
                DOSSETENTA = 0;
                tressesenta = 0;
                SELECT COBR_NOM FROM COBRADORES WHERE COBR_COD = :codcobr INTO :nomcobr;
                /* BUSQUE EN SALDOS_DOC_CARTERA LOS QUE TENGAN SALDO > 0 */
                FOR SELECT MVCL_TIPOREF, MVCL_IDREF, MVCL_PREFREF, MVCL_NUMREF, MVCL_FECHA, MVCL_VENCE
                    FROM MOVIMIENTO_CLIENTES
                    WHERE TERC_NIT = :NIT AND COBR_COD = :CODCOBR AND MVCL_SUCURSAL = :SUCURSAL AND MVCL_FECHA <= :FECHA
                        AND MVCL_ABONO = 'N' AND ((:SUBEMPRESA = 0) or (SUCU_ID = :SUBEMPRESA))
                    INTO :TIPO, :ID, :PREFIJO, :NUMERO, :FECDOC, :VENCE
                    DO
                    BEGIN
                    if ((inclanti = 'SI') or (TIPO <> 45)) then
                        BEGIN
                        EXECUTE PROCEDURE saldo_doc_cartera(TIPO, ID, FECHA, MONEDA) returning_values (SALDO);
                        if (SALDO <> 0) then
                            BEGIN
                            DISPONIBLE = DISPONIBLE - SALDO;
                            SELECT TIDO_NOMCORTO FROM TIPO_DOCUMENTO WHERE TIDO_COD = :TIPO INTO :TIPONOM;
                            if (MONEDA = 0) then
                                SELECT SUM(SDCA_RTFTE - SDCA_ABRTFTE), SUM(SDCA_RTIVA - SDCA_ABRTIVA), SUM(SDCA_RTICA - SDCA_ABRTICA)
                                    FROM SALDOS_DOC_CARTERA WHERE SDCA_TIPOREF = :TIPO AND SDCA_IDREF = :ID
                                    INTO :RTFTE, :RTIVA, :RTICA;
                            ELSE
                                SELECT SUM((SDCA_RTFTE - SDCA_ABRTFTE)/SDCA_TRM), SUM((SDCA_RTIVA - SDCA_ABRTIVA)/SDCA_TRM), SUM((SDCA_RTICA - SDCA_ABRTICA)/SDCA_TRM)
                                    FROM SALDOS_DOC_CARTERA WHERE SDCA_TIPOREF = :TIPO AND SDCA_IDREF = :ID
                                    INTO :RTFTE, :RTIVA, :RTICA;
                            if (RTFTE IS NULL) then
                                RTFTE = 0;
                            if ((TIPO = 42) or (TIPO = 45) or (TIPO = 33)) THEN
                                BEGIN
                                if (RTFTE > 0) then
                                    RTFTE = 0;
                                END
                            ELSE
                                BEGIN
                                if (RTFTE < 0) then
                                    RTFTE = 0;
                                END
                            if (FAUTORET <= FECDOC) then
                                RTFTE = 0;
                            if (RTIVA IS NULL) then
                                RTIVA = 0;
                            if ((TIPO = 42) or (TIPO = 45) or (TIPO = 33)) THEN
                                BEGIN
                                if (RTIVA > 0) then
                                    RTIVA = 0;
                                END
                            ELSE
                                BEGIN
                                if (RTIVA < 0) then
                                    RTIVA = 0;
                                END
                            if (RTICA IS NULL) then
                                RTICA = 0;
                            if ((TIPO = 42) or (TIPO = 45) or (TIPO = 33)) THEN
                                BEGIN
                                if (RTICA > 0) then
                                    RTICA = 0;
                                END
                            ELSE
                                BEGIN
                                if (RTICA < 0) then
                                    RTICA = 0;
                                END
                            /* AHORA CLASIFIQUE LOS DIAS */
                            if (VENCIMIENTO = 'FECHA') then
                                DIAS = FECHA - FECDOC;
                            ELSE
                                BEGIN
                                DIAS = FECHA - VENCE;
                                if ((TIPO = 31) AND (VENCIMIENTO = 'ENTREGA')) THEN
                                    BEGIN
                                    SELECT FACT_ENTREGA FROM FACTURAS WHERE FACT_ID = :ID INTO :VENCE;
                                    DIAS = FECHA - VENCE;
                                    END
                                END
                            if (MAXDIAS < DIAS) then
                                MAXDIAS = DIAS;
                            if (DETALLE = 'S') then
                                BEGIN
                                CORRIENTE = 0;
                                CERO = 0;
                                TREINTA = 0;
                                SESENTA = 0;
                                NOVENTA = 0;
                                CIENTOCHENTA = 0;
                                DOSSETENTA = 0;
                                tressesenta = 0;
                                END
                            if (DIAS < 0) then
                                CORRIENTE = CORRIENTE + SALDO;
                            ELSE
                                if (DIAS <= DIASR) then
                                    CERO = CERO + SALDO;
                                ELSE
                                    if (DIAS <= (DIASR * 2)) then
                                        TREINTA = TREINTA + SALDO;
                                    ELSE
                                        if (DIAS <= (DIASR * 3)) then
                                            SESENTA = SESENTA + SALDO;
                                        ELSE
                                            BEGIN
                                            if (EXTENDIDA = 'N') then
                                                NOVENTA = NOVENTA + SALDO;
                                            else    
                                                if (EXT3 = 'TRIPLES') then
                                                    BEGIN
                                                    if (DIAS <= (DIASR * 3) * 2) then
                                                        NOVENTA = NOVENTA + SALDO;
                                                    ELSE
                                                        if (DIAS <= (DIASR * 3) * 3) then
                                                            CIENTOCHENTA = CIENTOCHENTA + SALDO;
                                                        ELSE
                                                            if (DIAS <= (DIASR * 3) * 4) then
                                                                dossetenta = dossetenta + SALDO;
                                                            ELSE
                                                                tressesenta = tressesenta + SALDO;
                                                    END
                                                else
                                                    BEGIN
                                                    if (DIAS <= (DIASR * 4)) then
                                                        NOVENTA = NOVENTA + SALDO;
                                                    ELSE
                                                        if (DIAS <= (DIASR * 5)) then
                                                            CIENTOCHENTA = CIENTOCHENTA + SALDO;
                                                        ELSE
                                                            if (DIAS <= (DIASR * 6)) then
                                                                dossetenta = dossetenta + SALDO;
                                                            ELSE
                                                                tressesenta = tressesenta + SALDO;
                                                    END
                                            END
                            if (DETALLE = 'S') then
                                SUSPEND;
                            END  /* SALDO <>  0 */
                        END  /* NO ANTICIPO */
                    END  /* FOR MOV_CLI */
                /* AGREGUE LOS RECIBOS PROVISIONALES CON SIGNO NEGATIVO */
                FOR SELECT 65, MAX(P.RCPR_ID), MAX(PREF_PRE), MAX(RCPR_NUMERO), MAX(RCPR_FECHA), SUM(RPDE_ABONO * -1), SUM(RPDE_RTFTE*-1), SUM(RPDE_RTIVA*-1), SUM(RPDE_RTICA*-1), MAX(RCPR_TRM)
                    FROM RECIBO_PROVISIONAL P, recibo_provisional_detalle D
                    WHERE P.rcpr_id = D.rcpr_id AND P.TERC_NIT = :NIT AND RPDE_SUCURSAL = :SUCURSAL AND P.VEND_COD = :CODCOBR AND P.RCPR_FECHA <= :FECHA AND P.RCPR_ANULADO = 'N' AND
                    ((RCPR_FECCRUCE IS NULL) or (RCPR_FECCRUCE > :FECHA)) AND ((SUCU_ID = :SUBEMPRESA) OR (:SUBEMPRESA = 0)) AND ((:MONEDA = 0) or (RCPR_TRM <> 1))
                    GROUP BY P.rcpr_id
                    INTO :TIPO, :ID, :PREFIJO, :NUMERO, :FECDOC, :PROVISIONAL, :rtfte,  :RTIVA, :RTICA, :TRM
                    DO
                    BEGIN
                    if ((MONEDA <> 0) AND (TRM <> 0)) then
                        BEGIN
                        PROVISIONAL = PROVISIONAL / TRM;
                        RTFTE = RTFTE / TRM;
                        RTIVA = RTIVA / TRM;
                        RTICA = RTICA / TRM;
                        END
                    if (:descnt_prov = 'NO') then
                      SALDO = 0;
                    else
                      SALDO = :PROVISIONAL;
                    SELECT TIDO_NOMCORTO FROM TIPO_DOCUMENTO WHERE TIDO_COD = :TIPO INTO :TIPONOM;
                    /* CALCULE EL VENCIMIENTO DEL ULTIMO DOCUMENTO POSFECHADO */
                    SELECT MAX(RPPA_FECHA) FROM recibo_provisional_pago WHERE RCPR_ID = :ID INTO :VENCE;
                    DIAS = VENCE - FECHA;
                    if (DETALLE = 'S') then
                        BEGIN
                        CORRIENTE = 0;
                        CERO = 0;
                        TREINTA = 0;
                        SESENTA = 0;
                        NOVENTA = 0;
                        CIENTOCHENTA = 0;
                        DOSSETENTA = 0;
                        tressesenta = 0;
                        END
                    if (DIAS < 0) then
                        CORRIENTE = CORRIENTE + SALDO;
                    ELSE
                        if (DIAS <= DIASR) then
                            CERO = CERO + SALDO;
                        ELSE
                            if (DIAS <= (DIASR * 2)) then
                                TREINTA = TREINTA + SALDO;
                            ELSE
                                if (DIAS <= (DIASR * 3)) then
                                    SESENTA = SESENTA + SALDO;
                                ELSE
                                    BEGIN
                                    if (EXTENDIDA = 'N') then
                                        NOVENTA = NOVENTA + SALDO;
                                    else    
                                        if (EXT3 = 'TRIPLES') then
                                            BEGIN
                                            if (DIAS <= (DIASR * 3) * 2) then
                                                NOVENTA = NOVENTA + SALDO;
                                            ELSE
                                                if (DIAS <= (DIASR * 3) * 3) then
                                                    CIENTOCHENTA = CIENTOCHENTA + SALDO;
                                                ELSE
                                                    if (DIAS <= (DIASR * 3) * 4) then
                                                        dossetenta = dossetenta + SALDO;
                                                    ELSE
                                                        tressesenta = tressesenta + SALDO;
                                            END
                                        else
                                            BEGIN
                                            if (DIAS <= (DIASR * 4)) then
                                                NOVENTA = NOVENTA + SALDO;
                                            ELSE
                                                if (DIAS <= (DIASR * 5)) then
                                                    CIENTOCHENTA = CIENTOCHENTA + SALDO;
                                                ELSE
                                                    if (DIAS <= (DIASR * 6)) then
                                                        dossetenta = dossetenta + SALDO;
                                                    ELSE
                                                        tressesenta = tressesenta + SALDO;
                                            END
                                    END
                    if (DETALLE = 'S') then
                        SUSPEND;
                    END
                if (DETALLE = 'N') then
                    begin
                    SALDO = CORRIENTE + CERO + TREINTA + SESENTA + NOVENTA + cientochenta + dossetenta + tressesenta;
                    DIAS = MAXDIAS;
                    SUSPEND;
                    end
                END
            END  /* FOR COBRADOR */
        END
    END  /* FOR NIT */
END^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER procedure REP_CARTERA_CLIENTES (
    DESDE varchar(20),
    HASTA varchar(20),
    GRPINI varchar(5),
    GRPFIN varchar(5),
    FECHA date,
    ORDEN char(1),
    AGRUPA char(1),
    SUBEMPRESA integer,
    GRUPCART integer,
    MONEDA integer)
returns (
    NIT varchar(20),
    NOMBRE varchar(60),
    DIR varchar(60),
    TELEFONO varchar(40),
    CIUDAD varchar(40),
    CONTACTO varchar(60),
    EMAIL varchar(100),
    MAILCART varchar(100),
    FAX varchar(25),
    CEL varchar(25),
    CODCLI varchar(20),
    CODZONA varchar(2),
    NOMZONA varchar(60),
    CODCOBR integer,
    NOMCOBR varchar(60),
    SUCURSAL varchar(10),
    NOMSUC varchar(60),
    DV char(1),
    DIASCR integer,
    CODCIUD char(5),
    NOMCIUD varchar(60),
    RESALTAR char(1),
    INSTCART varchar(255),
    TIPO integer,
    ID integer,
    PREFIJO varchar(4),
    NUMERO varchar(8),
    CONCEPTO varchar(60),
    MONTO numeric(18,2),
    SALDO numeric(18,2),
    PROVISIONAL numeric(18,2),
    RTFTE numeric(18,2),
    RTIVA numeric(18,2),
    RTICA numeric(18,2),
    RCREE numeric(18,2),
    DTOF numeric(18,2),
    TIPONOM varchar(8),
    FECDOC date,
    VENCE date,
    DIAS integer,
    CUPO numeric(18,2),
    DISPONIBLE numeric(18,2),
    TOTCLI numeric(18,2),
    NOTA varchar(256),
    OBS blob sub_type 0 segment size 80,
    CALIFICA integer,
    GRUPCOD integer,
    GRUPNOM varchar(30))
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 FOV CHAR(11);
DECLARE VARIABLE DTOAPL NUMERIC(18,2);
DECLARE VARIABLE FECDTO DATE;
DECLARE VARIABLE FECNOTA VARCHAR(10);
DECLARE VARIABLE AUXNOTA VARCHAR(256);
DECLARE VARIABLE IDNOTA INTEGER;
declare variable descnt_prov char(2);
declare variable AUTORET VARCHAR(10);
declare variable FAUTORET DATE;
declare variable AUTORCREE VARCHAR(10);
declare variable FAUTORCREE DATE;
declare variable INCLANTI CHAR(2);
DECLARE VARIABLE TRM NUMERIC(18,2);
declare variable DB CHAR(1);
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 RECIBOS PROVISIONALES EN INFORMES DE CARTERA') RETURNING_VALUES (:descnt_prov);
EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'INCLUIR ANTICIPOS DE CLIENTES EN REPORTES Y CONSULTAS DE CARTERA') returning_values (INCLANTI);
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', 'ANALISIS DE CARTERA CON FECHA FACTURA, VENCIMIENTO O ENTREGA') RETURNING_VALUES (FOV);
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';
/* Ubique el NIT */
FOR select C.TERC_NIT, TERC_NOM, TERC_DV, CLSU_DIR, CLSU_TEL, CLSU_CIUDAD, S.COBR_COD, S.ZONA_COD, T.CIUD_COD, CLIE_CUPO,
    CLCU_COD, CLSU_NOMBRE, t.terc_obs, C.GRCA_COD, TERC_CONTACTO, TERC_EMAIL, TERC_FAX, TERC_CEL, CLIE_COD, CLIE_RESALTAR,
    CLIE_INSTCARTERA, CLIE_MAILCART, CLIE_CALIFICA, CLIE_DIAS
    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 C.TERC_NIT >= :NITINI AND C.TERC_NIT <= :NITFIN AND
        TERC_NOM >= :NOMINI AND TERC_NOM <= :NOMFIN AND ((:GRUPCART = 0) or (C.GRCA_COD = :GRUPCART))
    INTO :NIT, :NOMBRE, :DV, :DIR, :TELEFONO, :CIUDAD, :CODCOBR, :CODZONA, :CODCIUD, :CUPO,
    :SUCURSAL, :NOMSUC, :obs, :GRUPCOD, :CONTACTO, :EMAIL, :FAX, :CEL, :CODCLI, :resaltar,
    INSTCART, :mailcart, :CALIFICA, :DIASCR
    DO  
    BEGIN
    TOTCLI = 0;
    if (CODCOBR IS NOT NULL) then
        SELECT COBR_NOM FROM COBRADORES  WHERE COBR_COD = :CODCOBR INTO :NOMCOBR;
    if (CODZONA IS NOT NULL) then
        SELECT ZONA_NOM FROM ZONAS WHERE ZONA_COD = :CODZONA INTO :NOMZONA;
    if (CODCIUD IS NOT NULL) then
        SELECT CIUD_NOM FROM CIUDADES  WHERE CIUD_COD = :CODCIUD INTO :NOMCIUD;
    SELECT GRCA_NOMBRE FROM GRUPO_CARTERA WHERE GRCA_COD = :GRUPCOD INTO :GRUPNOM;
    DISPONIBLE = CUPO;
    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
        /* BUSQUE EN SALDOS_DOC_CARTERA LOS QUE TENGAN SALDO > 0 */
        FOR SELECT MVCL_TIPOREF, MVCL_IDREF, MVCL_PREFREF, MVCL_NUMREF, MVCL_FECHA, MVCL_VENCE, MVCL_CONC, MVCL_MONTO, MVCL_DEBITO
            FROM MOVIMIENTO_CLIENTES WHERE TERC_NIT = :NIT AND MVCL_SUCURSAL = :SUCURSAL AND MVCL_FECHA <= :FECHA AND
            MVCL_ABONO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) AND ((:MONEDA = 0) or (MVCL_TRM <> 1))
            INTO :TIPO, :ID, :PREFIJO, :NUMERO, :FECDOC, :VENCE, :CONCEPTO, :MONTO, :DB
            DO
            BEGIN
            if (DB = 'N') then
                MONTO = MONTO * -1;
            if ((inclanti = 'SI') or (TIPO <> 45)) then
                BEGIN
                EXECUTE PROCEDURE saldo_doc_cartera(TIPO, ID, FECHA, MONEDA) returning_values (SALDO);
                if (SALDO <> 0) then
                    BEGIN
                    PROVISIONAL = 0;
                    if (FOV = 'FECHA') then
                        DIAS = FECHA - FECDOC;
                    ELSE
                        BEGIN
                        DIAS = FECHA - VENCE;
                        if ((TIPO = 31) AND (FOV = 'ENTREGA')) THEN
                            BEGIN
                            SELECT FACT_ENTREGA FROM FACTURAS WHERE FACT_ID = :ID INTO :VENCE;
                            DIAS = FECHA - VENCE;
                            END
                        END
                    DISPONIBLE = DISPONIBLE - SALDO;
                    SELECT TIDO_NOMCORTO FROM TIPO_DOCUMENTO WHERE TIDO_COD = :TIPO INTO :TIPONOM;
                    if (TIPO = 41) then
                        SELECT NDCL_DTOFMONTO, NDCL_FECHADTO, NDCL_TRM FROM NOTAS_DEBITO_CLIENTES
                            WHERE NDCL_ID = :ID INTO :DTOF, :FECDTO, :TRM;
                    if (TIPO = 42) then
                        SELECT 0, :FECDOC, 1 FROM NOTAS_CREDITO_CLIENTES
                            WHERE NCCL_ID = :ID INTO :DTOF, :FECDTO, :TRM;
                    if (TIPO = 45) then
                        SELECT ANCL_DTOFMONTO, ANCL_DTOFECHA, ANCL_TRM FROM ANTICIPOS_CLIENTE
                            WHERE ANCL_ID = :ID INTO :DTOF, :FECDTO, :TRM;
                    if (TIPO = 31) then
                        SELECT FACT_DTOFMONTO, FACT_DTOFFECHA, FACT_TRM FROM FACTURAS
                            WHERE FACT_ID = :ID INTO :DTOF, :FECDTO, :TRM;
                    if (TIPO = 33) then
                        SELECT 0, :FECDOC, 1 FROM devoluciones_ventas
                            WHERE DEVT_ID = :ID INTO :DTOF, :FECDTO, :TRM;
                    if ((MONEDA <> 0) AND (TRM <> 0)) then
                        DTOF = DTOF / TRM;
                    if (DTOF IS NULL) then
                        DTOF = 0;
                    if (DTOF <> 0) then
                        BEGIN
                        SELECT SUM(RCDE_DTOF), MAX(RECA_TRM) FROM RECIBOS_CAJA_DETALLE D, RECIBOS_CAJA R
                            WHERE R.reca_id = D.reca_id AND RCDE_IDDOC = :ID AND RCDE_TIPODOC = :TIPO
                            INTO :DTOAPL, :TRM;
                        if (DTOAPL IS NULL) then
                            DTOAPL = 0;
                        if ((MONEDA <> 0) AND (TRM <> 1)) then
                            DTOAPL = DTOAPL / TRM;
                        DTOF = DTOF - DTOAPL;
                        /* SI YA SE VENCIO DEJELO EN CERO */
                        if (FECDTO < FECHA) then
                            DTOF = 0;
                        END
                    if (MONEDA = 0) then
                        SELECT SUM(SDCA_RTFTE - SDCA_ABRTFTE), SUM(SDCA_RTIVA - SDCA_ABRTIVA), SUM(SDCA_RTICA - SDCA_ABRTICA), SUM(SDCA_RCREE - SDCA_ABRCREE)
                            FROM SALDOS_DOC_CARTERA WHERE SDCA_TIPOREF = :TIPO AND SDCA_IDREF = :ID
                            INTO :RTFTE, :RTIVA, :RTICA, :RCREE;
                    ELSE
                        SELECT SUM((SDCA_RTFTE - SDCA_ABRTFTE)/SDCA_TRM), SUM((SDCA_RTIVA - SDCA_ABRTIVA)/SDCA_TRM), SUM((SDCA_RTICA - SDCA_ABRTICA)/SDCA_TRM), SUM((SDCA_RCREE - SDCA_ABRCREE)/SDCA_TRM)
                            FROM SALDOS_DOC_CARTERA WHERE SDCA_TIPOREF = :TIPO AND SDCA_IDREF = :ID
                            INTO :RTFTE, :RTIVA, :RTICA, :RCREE;
                    if (RTFTE IS NULL) then
                        RTFTE = 0;
                    if ((TIPO = 42) or (TIPO = 45) or (TIPO = 33)) THEN
                        BEGIN
                        if (RTFTE > 0) then
                            RTFTE = 0;
                        END
                    ELSE
                        BEGIN
                        if (RTFTE < 0) then
                            RTFTE = 0;
                        END
                    if (FAUTORET <= FECDOC) then
                        RTFTE = 0;
                    if (RTIVA IS NULL) then
                        RTIVA = 0;
                    if ((TIPO = 42) or (TIPO = 45) or (TIPO = 33)) THEN
                        BEGIN
                        if (RTIVA > 0) then
                            RTIVA = 0;
                        END
                    ELSE
                        BEGIN
                        if (RTIVA < 0) then
                            RTIVA = 0;
                        END
                    if (RTICA IS NULL) then
                        RTICA = 0;
                    if ((TIPO = 42) or (TIPO = 45) or (TIPO = 33)) THEN
                        BEGIN
                        if (RTICA > 0) then
                            RTICA = 0;
                        END
                    ELSE
                        BEGIN
                        if (RTICA < 0) then
                            RTICA = 0;
                        END
                    if (RCREE IS NULL) then
                        RCREE = 0;
                    if ((TIPO = 42) or (TIPO = 45) or (TIPO = 33)) THEN
                        BEGIN
                        if (RCREE > 0) then
                            RCREE = 0;
                        END
                    ELSE
                        BEGIN
                        if (RCREE < 0) then
                            RCREE = 0;
                        END
                    if (fautorcree <= FECDOC) then
                        RCREE = 0;
                    /* SI TIENE NOTA AGREGUELA */
                    SELECT MAX(NOCL_ID) FROM NOTAS_CLIENTES WHERE TERC_NIT = :NIT AND CLSU_COD = :SUCURSAL AND NOCL_TIPODOC = :TIPO AND NOCL_IDDOC = :ID INTO :IDNOTA;
                    if (IDNOTA IS NOT NULL) then
                        BEGIN
                        SELECT cast(NOCL_FECHA as char(10)), NOCL_TEXTO FROM NOTAS_CLIENTES
                            WHERE NOCL_ID = :IDNOTA INTO :FECNOTA, :AUXNOTA;
                        if (STRLEN(AUXNOTA) < 244) then
                            NOTA = FECNOTA || ':' || AUXNOTA;
                        ELSE
                            NOTA = AUXNOTA;
                        END
                    else
                        NOTA = '';
                    TOTCLI = TOTCLI + SALDO;
                    SUSPEND;
                    END  /* SALDO <> 0 */
                END  /* NO ANTICIPO */
            END  /* FOR */
        /* AGREGUE LOS RECIBOS PROVISIONALES CON SIGNO NEGATIVO */
        FOR SELECT 65, MAX(P.RCPR_ID), MAX(PREF_PRE), MAX(RCPR_NUMERO), MAX(RCPR_FECHA), MAX(RCPR_CONC), SUM(RPDE_ABONO * -1), SUM(RPDE_RTFTE*-1), SUM(RPDE_RTIVA*-1), SUM(RPDE_RTICA*-1), SUM(RPDE_RCREE*-1), MAX(RCPR_TRM)
            FROM RECIBO_PROVISIONAL P, recibo_provisional_detalle D
            WHERE P.rcpr_id = D.rcpr_id AND P.TERC_NIT = :NIT AND RCPR_FECHA <= :FECHA AND RCPR_ANULADO = 'N' AND
            ((RCPR_FECCRUCE IS NULL) or (RCPR_FECCRUCE > :FECHA)) AND RPDE_SUCURSAL = :SUCURSAL AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            GROUP BY P.rcpr_id
            INTO :TIPO, :ID, :PREFIJO, :NUMERO, :FECDOC, :CONCEPTO, :PROVISIONAL, :rtfte,  :RTIVA, :RTICA, :RCREE, :TRM
            DO
            BEGIN
            if ((MONEDA <> 0) AND (TRM <> 0)) then
                PROVISIONAL = PROVISIONAL / TRM;
            if (:descnt_prov = 'NO') then
              SALDO = 0;
            else
              SALDO = :PROVISIONAL;
            SELECT TIDO_NOMCORTO FROM TIPO_DOCUMENTO WHERE TIDO_COD = :TIPO INTO :TIPONOM;
            /* CALCULE EL VENCIMIENTO DEL ULTIMO DOCUMENTO POSFECHADO */
            SELECT MAX(RPPA_FECHA) FROM recibo_provisional_pago WHERE RCPR_ID = :ID INTO :VENCE;
            DIAS = VENCE - FECHA;
            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 <= :FECHA AND
            MVCL_ABONO = 'N' AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
            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;
                /* BUSQUE EN SALDOS_DOC_CARTERA LOS QUE TENGAN SALDO > 0 */
                FOR SELECT MVCL_TIPOREF, MVCL_IDREF, MVCL_PREFREF, MVCL_NUMREF, MVCL_FECHA, MVCL_VENCE, MVCL_CONC, MVCL_MONTO, MVCL_DEBITO
                    FROM MOVIMIENTO_CLIENTES WHERE TERC_NIT = :NIT AND MVCL_SUCURSAL = :SUCURSAL AND MVCL_FECHA <= :FECHA AND
                    MVCL_ABONO = 'N' AND COBR_COD = :codcobr AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) AND
                    ((:MONEDA = 0) or (MVCL_TRM <> 1))
                    INTO :TIPO, :ID, :PREFIJO, :NUMERO, :FECDOC, :VENCE, :CONCEPTO, :MONTO, :DB
                    DO
                    BEGIN
                    if (DB = 'N') then
                        MONTO = MONTO * -1;
                    if ((inclanti = 'SI') or (TIPO <> 45)) then
                        BEGIN
                        EXECUTE PROCEDURE saldo_doc_cartera(TIPO, ID, FECHA, MONEDA) returning_values (SALDO);
                        if (SALDO <> 0) then
                            BEGIN
                            PROVISIONAL = 0;
                            if (FOV = 'FECHA') then
                               DIAS = FECHA - FECDOC;
                            ELSE
                                BEGIN
                                DIAS = FECHA - VENCE;
                                if ((TIPO = 31) AND (FOV = 'ENTREGA')) THEN
                                    BEGIN
                                    SELECT FACT_ENTREGA FROM FACTURAS WHERE FACT_ID = :ID INTO :VENCE;
                                    DIAS = FECHA - VENCE;
                                    END
                                END
                            DISPONIBLE = DISPONIBLE - SALDO;
                            SELECT TIDO_NOMCORTO FROM TIPO_DOCUMENTO WHERE TIDO_COD = :TIPO INTO :TIPONOM;
                            if (TIPO = 41) then
                                SELECT NDCL_DTOFMONTO, NDCL_FECHADTO, NDCL_TRM FROM NOTAS_DEBITO_CLIENTES
                                    WHERE NDCL_ID = :ID INTO :DTOF, :FECDTO, :TRM;
                            if (TIPO = 42) then
                                SELECT 0, :FECDOC, 1 FROM NOTAS_CREDITO_CLIENTES
                                    WHERE NCCL_ID = :ID INTO :DTOF, :FECDTO, :TRM;
                            if (TIPO = 45) then
                                SELECT ANCL_DTOFMONTO, ANCL_DTOFECHA, ANCL_TRM FROM ANTICIPOS_CLIENTE
                                    WHERE ANCL_ID = :ID INTO :DTOF, :FECDTO, :TRM;
                            if (TIPO = 31) then
                                SELECT FACT_DTOFMONTO, FACT_DTOFFECHA, FACT_TRM FROM FACTURAS
                                    WHERE FACT_ID = :ID INTO :DTOF, :FECDTO, :TRM;
                            if (TIPO = 33) then
                                SELECT 0, :FECDOC, 1 FROM devoluciones_ventas
                                    WHERE DEVT_ID = :ID INTO :DTOF, :FECDTO, :TRM;
                            if (DTOF IS NULL) then
                                DTOF = 0;
                            if ((MONEDA <> 0) AND (TRM <> 0)) then
                                DTOF = DTOF / TRM;
                            if (DTOF <> 0) then
                                BEGIN
                                SELECT SUM(RCDE_DTOF) FROM RECIBOS_CAJA_DETALLE WHERE RCDE_IDDOC = :ID AND RCDE_TIPODOC = :TIPO INTO :DTOAPL;
                                if (DTOAPL IS NULL) then
                                    DTOAPL = 0;
                                DTOF = DTOF - DTOAPL;
                                /* SI YA SE VENCIO DEJELO EN CERO */
                                if (FECDTO < FECHA) then
                                    DTOF = 0;
                                END
                            SELECT SUM(SDCA_RTFTE - SDCA_ABRTFTE), SUM(SDCA_RTIVA - SDCA_ABRTIVA), SUM(SDCA_RTICA - SDCA_ABRTICA), SUM(SDCA_RCREE - SDCA_ABRCREE)
                                FROM SALDOS_DOC_CARTERA WHERE SDCA_TIPOREF = :TIPO AND SDCA_IDREF = :ID INTO :RTFTE, :RTIVA, :RTICA, :RCREE;
                            if (RTFTE IS NULL) then
                                RTFTE = 0;
                            if ((TIPO = 42) or (TIPO = 45) or (TIPO = 33)) THEN
                                BEGIN
                                if (RTFTE > 0) then
                                    RTFTE = 0;
                                END
                            ELSE
                                BEGIN
                                if (RTFTE < 0) then
                                    RTFTE = 0;
                                END
                            if (FAUTORET <= FECDOC) then
                                RTFTE = 0;
                            if (RTIVA IS NULL) then
                                RTIVA = 0;
                            if ((TIPO = 42) or (TIPO = 45) or (TIPO = 33)) THEN
                                BEGIN
                                if (RTIVA > 0) then
                                    RTIVA = 0;
                                END
                            ELSE
                                BEGIN
                                if (RTIVA < 0) then
                                    RTIVA = 0;
                                END
                            if (RTICA IS NULL) then
                                RTICA = 0;
                            if ((TIPO = 42) or (TIPO = 45) or (TIPO = 33)) THEN
                                BEGIN
                                if (RTICA > 0) then
                                    RTICA = 0;
                                END
                            ELSE
                                BEGIN
                                if (RTICA < 0) then
                                    RTICA = 0;
                                END
                            if (RCREE IS NULL) then
                                RCREE = 0;
                            if ((TIPO = 42) or (TIPO = 45) or (TIPO = 33)) THEN
                                BEGIN
                                if (RCREE > 0) then
                                    RCREE = 0;
                                END
                            ELSE
                                BEGIN
                                if (RCREE < 0) then
                                    RCREE = 0;
                                END
                            if (fautorcree <= FECDOC) then
                                RCREE = 0;
                            /* SI TIENE NOTA AGREGUELA */
                            SELECT MAX(NOCL_ID) FROM NOTAS_CLIENTES WHERE TERC_NIT = :NIT AND CLSU_COD = :SUCURSAL AND NOCL_TIPODOC = :TIPO AND NOCL_IDDOC = :ID INTO :IDNOTA;
                            if (IDNOTA IS NOT NULL) then
                                BEGIN
                                SELECT cast(NOCL_FECHA as char(10)), NOCL_TEXTO FROM NOTAS_CLIENTES
                                    WHERE NOCL_ID = :IDNOTA INTO :FECNOTA, :AUXNOTA;
                                if (STRLEN(AUXNOTA) < 244) then
                                    NOTA = FECNOTA || ':' || AUXNOTA;
                                ELSE
                                    NOTA = AUXNOTA;
                                END
                            else
                                NOTA = '';
                            TOTCLI = TOTCLI + SALDO;
                            SUSPEND;
                            END  /* SALDO <> 0 */
                        END  /* NO ANTICIPO */
                    END  /* FOR */
                /* AGREGUE LOS RECIBOS PROVISIONALES CON SIGNO NEGATIVO */
                FOR SELECT 65, MAX(P.RCPR_ID), MAX(PREF_PRE), MAX(RCPR_NUMERO), MAX(RCPR_FECHA), MAX(RCPR_CONC), SUM(RPDE_ABONO * -1), SUM(RPDE_RTFTE*-1), SUM(RPDE_RTIVA*-1), SUM(RPDE_RTICA*-1), SUM(RPDE_RCREE*-1), MAX(RCPR_TRM)
                    FROM RECIBO_PROVISIONAL P, recibo_provisional_detalle D
                    WHERE P.rcpr_id = D.rcpr_id AND P.TERC_NIT = :NIT AND P.VEND_COD = :codcobr AND RCPR_FECHA <= :FECHA AND RCPR_ANULADO = 'N' AND
                    ((RCPR_FECCRUCE IS NULL) or (RCPR_FECCRUCE > :FECHA)) AND RPDE_SUCURSAL = :SUCURSAL AND ((SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0))
                    GROUP BY P.rcpr_id
                    INTO :TIPO, :ID, :PREFIJO, :NUMERO, :FECDOC, :CONCEPTO, :PROVISIONAL, :rtfte,  :RTIVA, :RTICA, :RCREE, :TRM
                    DO
                    BEGIN
                    if ((MONEDA <> 0) AND (TRM <> 0)) then
                        PROVISIONAL = PROVISIONAL / TRM;
                    MONTO = PROVISIONAL;
                    if (:descnt_prov = 'NO') then
                      SALDO = 0;
                    else
                      SALDO = :PROVISIONAL;
                    SELECT TIDO_NOMCORTO FROM TIPO_DOCUMENTO WHERE TIDO_COD = :TIPO INTO :TIPONOM;
                    /* CALCULE EL VENCIMIENTO DEL ULTIMO DOCUMENTO POSFECHADO */
                    SELECT MAX(RPPA_FECHA) FROM recibo_provisional_pago WHERE RCPR_ID = :ID INTO :VENCE;
                    DIAS = VENCE - FECHA;
                    SUSPEND;
                    END
                END /* ok */
            END  /* FOR COBR */
        END  /* AGRUPA = C */
    END  /* FOR NIT */
END^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER procedure MOVIMIENTO_CARTERA_MES (
    FECINI date,
    FECFIN date,
    SUBEMPRESA integer,
    CONTADO char(1),
    MONEDA integer)
returns (
    NIT varchar(20),
    NOMBRE varchar(60),
    ZONA varchar(2),
    VENDEDOR integer,
    COBRADOR integer,
    CONTACTO varchar(60),
    DIASMAX integer,
    TELEFONO varchar(40),
    INICIAL numeric(18,2),
    DEBITOS numeric(18,2),
    CREDITOS numeric(18,2),
    ABONOS numeric(18,2),
    FINAL numeric(18,2))
AS
declare variable RETES CHAR(2);
declare variable TIPODOC INTEGER;
declare variable IDDOC INTEGER;
declare variable SALDO NUMERIC(18,2);
declare variable NUMROWS INTEGER;
declare variable DIASF INTEGER;
declare variable DIAS INTEGER;
DECLARE VARIABLE FOV CHAR(11);
declare variable AUTORET VARCHAR(10);
declare variable FAUTORET DATE;
declare variable AUTORCREE VARCHAR(10);
declare variable FAUTORCREE DATE;
declare variable CARTXAGE CHAR(2);
BEGIN
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', 'ANALISIS DE CARTERA CON FECHA FACTURA, VENCIMIENTO O ENTREGA') RETURNING_VALUES (FOV);
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';
EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'GENERAL', 'SEPARAR CARTERA POR AGENCIA') returning_values (:cartxage);
if (CARTXAGE = 'NO') then
    subempresa = 0;
for select T.TERC_NIT, TERC_NOM, TERC_CONTACTO, TERC_TEL, ZONA_COD, VEND_COD, COBR_COD
    from TERCEROS T, CLIENTES C WHERE T.terc_nit = C.terc_nit AND TERC_CLIE = 'S'
    into :NIT, :NOMBRE, :CONTACTO, :TELEFONO, :zona, :vendedor, :cobrador
  DO
    BEGIN
    diasmax = 0;
    SELECT COUNT(*) FROM AUTORIZACIONES WHERE AUTO_NITCONTADO = :NIT INTO :numrows;
    if (numrows = 0) then
        SELECT COUNT(*) FROM punto_venta WHERE TERC_NIT = :NIT INTO :numrows;
    IF ((CONTADO = 'S') or (numrows = 0)) THEN
        BEGIN
        FECINI = FECINI - 1;
        INICIAL = 0;
        FOR SELECT MVCL_TIPOREF, MVCL_IDREF, (:FECFIN-MVCL_FECHA), (:FECFIN-MVCL_VENCE) FROM MOVIMIENTO_CLIENTES
            WHERE TERC_NIT = :NIT 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, :DIASF, DIAS
            DO
            BEGIN
            EXECUTE PROCEDURE saldo_doc_cartera(TIPODOC, IDDOC, FECINI, MONEDA) returning_values (SALDO);
            if (SALDO <> 0) then
                BEGIN
                INICIAL = INICIAL + SALDO;
                if (FOV = 'FECHA') then
                    BEGIN
                    if ((SALDO > 0) AND (DIASMAX < DIASF)) then
                        DIASMAX = DIASF;
                    END
                ELSE
                    BEGIN
                    if ((SALDO > 0) AND (DIASMAX < DIAS)) then
                        DIASMAX = DIAS;
                    END
                END
            END
        EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'DESCONTAR RETENCIONES POR CAUSACION') returning_values(:RETES);
        FECINI = FECINI + 1;
        if (RETES = 'SI') then
            BEGIN
            if (MONEDA = 0) then
                BEGIN
                if (FAUTORET <= FECINI) then
                    if (fautorcree <= FECINI) then
                        begin
                        SELECT SUM(MVCL_MONTO-MVCL_RTEIVA-MVCL_RTEICA), MAX(:FECFIN-MVCL_FECHA), MAX(:FECFIN-MVCL_VENCE) FROM movimiento_clientes
                            WHERE TERC_NIT = :NIT AND MVCL_FECHA >= :FECINI AND MVCL_FECHA <= :FECFIN
                            AND MVCL_DEBITO = 'S' AND ((:SUBEMPRESA = 0) or (SUCU_ID = :SUBEMPRESA))
                            INTO :DEBITOS, :diasf, :dias;
                        SELECT SUM(MVCL_MONTO-MVCL_RTEIVA-MVCL_RTEICA) 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 ((:SUBEMPRESA = 0) or (SUCU_ID = :SUBEMPRESA))
                            INTO :CREDITOS;
                        end
                    else
                        begin
                        SELECT SUM(MVCL_MONTO-MVCL_RTEIVA-MVCL_RTEICA-MVCL_RCREE), MAX(:FECFIN-MVCL_FECHA), MAX(:FECFIN-MVCL_VENCE) FROM movimiento_clientes
                            WHERE TERC_NIT = :NIT AND MVCL_FECHA >= :FECINI AND MVCL_FECHA <= :FECFIN
                            AND MVCL_DEBITO = 'S' AND ((:SUBEMPRESA = 0) or (SUCU_ID = :SUBEMPRESA))
                            INTO :DEBITOS, :diasf, :dias;
                        SELECT SUM(MVCL_MONTO-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 ((:SUBEMPRESA = 0) or (SUCU_ID = :SUBEMPRESA))
                            INTO :CREDITOS;
                        end
                else
                    if (fautorcree <= FECINI) then
                        begin
                        SELECT SUM(MVCL_MONTO-MVCL_RTEFTE-MVCL_RTEIVA-MVCL_RTEICA), MAX(:FECFIN-MVCL_FECHA), MAX(:FECFIN-MVCL_VENCE) FROM movimiento_clientes
                            WHERE TERC_NIT = :NIT AND MVCL_FECHA >= :FECINI AND MVCL_FECHA <= :FECFIN
                            AND MVCL_DEBITO = 'S' AND ((:SUBEMPRESA = 0) or (SUCU_ID = :SUBEMPRESA))
                            INTO :DEBITOS, :diasf, :dias;
                        SELECT SUM(MVCL_MONTO-MVCL_RTEFTE-MVCL_RTEIVA-MVCL_RTEICA) 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 ((:SUBEMPRESA = 0) or (SUCU_ID = :SUBEMPRESA))
                            INTO :CREDITOS;
                        end
                    else
                        begin
                        SELECT SUM(MVCL_MONTO-MVCL_RTEFTE-MVCL_RTEIVA-MVCL_RTEICA-MVCL_RCREE), MAX(:FECFIN-MVCL_FECHA), MAX(:FECFIN-MVCL_VENCE) FROM movimiento_clientes
                            WHERE TERC_NIT = :NIT AND MVCL_FECHA >= :FECINI AND MVCL_FECHA <= :FECFIN
                            AND MVCL_DEBITO = 'S' AND ((:SUBEMPRESA = 0) or (SUCU_ID = :SUBEMPRESA))
                            INTO :DEBITOS, :diasf, :dias;
                        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 ((:SUBEMPRESA = 0) or (SUCU_ID = :SUBEMPRESA))
                            INTO :CREDITOS;
                        end
                SELECT SUM(MVCL_MONTO) FROM movimiento_clientes
                    WHERE TERC_NIT = :NIT AND MVCL_FECHA >= :FECINI AND MVCL_FECHA <= :FECFIN
                    AND MVCL_ABONO = 'S' AND ((:SUBEMPRESA = 0) or (SUCU_ID = :SUBEMPRESA))
                    INTO :ABONOS;
                END
            ELSE
                BEGIN
                if (FAUTORET <= FECINI) then
                    if (fautorcree <= FECINI) then
                        begin
                        SELECT SUM((MVCL_MONTO-MVCL_RTEIVA-MVCL_RTEICA)/MVCL_TRM), MAX(:FECFIN-MVCL_FECHA), MAX(:FECFIN-MVCL_VENCE) FROM movimiento_clientes
                            WHERE TERC_NIT = :NIT AND MVCL_FECHA >= :FECINI AND MVCL_FECHA <= :FECFIN
                            AND MVCL_DEBITO = 'S' AND ((:SUBEMPRESA = 0) or (SUCU_ID = :SUBEMPRESA))
                            INTO :DEBITOS, :diasf, :dias;
                        SELECT SUM((MVCL_MONTO-MVCL_RTEIVA-MVCL_RTEICA)/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 ((:SUBEMPRESA = 0) or (SUCU_ID = :SUBEMPRESA))
                            INTO :CREDITOS;
                        end
                    else
                        begin
                        SELECT SUM((MVCL_MONTO-MVCL_RTEIVA-MVCL_RTEICA-MVCL_RCREE)/MVCL_TRM), MAX(:FECFIN-MVCL_FECHA), MAX(:FECFIN-MVCL_VENCE) FROM movimiento_clientes
                            WHERE TERC_NIT = :NIT AND MVCL_FECHA >= :FECINI AND MVCL_FECHA <= :FECFIN
                            AND MVCL_DEBITO = 'S' AND ((:SUBEMPRESA = 0) or (SUCU_ID = :SUBEMPRESA))
                            INTO :DEBITOS, :diasf, :dias;
                        SELECT SUM((MVCL_MONTO-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 ((:SUBEMPRESA = 0) or (SUCU_ID = :SUBEMPRESA))
                            INTO :CREDITOS;
                        end
                else
                    if (fautorcree <= FECINI) then
                        begin
                        SELECT SUM((MVCL_MONTO-MVCL_RTEFTE-MVCL_RTEIVA-MVCL_RTEICA)/MVCL_TRM), MAX(:FECFIN-MVCL_FECHA), MAX(:FECFIN-MVCL_VENCE) FROM movimiento_clientes
                            WHERE TERC_NIT = :NIT AND MVCL_FECHA >= :FECINI AND MVCL_FECHA <= :FECFIN
                            AND MVCL_DEBITO = 'S' AND ((:SUBEMPRESA = 0) or (SUCU_ID = :SUBEMPRESA))
                            INTO :DEBITOS, :diasf, :dias;
                        SELECT SUM((MVCL_MONTO-MVCL_RTEFTE-MVCL_RTEIVA-MVCL_RTEICA)/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 ((:SUBEMPRESA = 0) or (SUCU_ID = :SUBEMPRESA))
                            INTO :CREDITOS;
                        end
                    else
                        begin
                        SELECT SUM((MVCL_MONTO-MVCL_RTEFTE-MVCL_RTEIVA-MVCL_RTEICA-MVCL_RCREE)/MVCL_TRM), MAX(:FECFIN-MVCL_FECHA), MAX(:FECFIN-MVCL_VENCE) FROM movimiento_clientes
                            WHERE TERC_NIT = :NIT AND MVCL_FECHA >= :FECINI AND MVCL_FECHA <= :FECFIN
                            AND MVCL_DEBITO = 'S' AND ((:SUBEMPRESA = 0) or (SUCU_ID = :SUBEMPRESA))
                            INTO :DEBITOS, :diasf, :dias;
                        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 ((:SUBEMPRESA = 0) or (SUCU_ID = :SUBEMPRESA))
                            INTO :CREDITOS;
                        end
                SELECT SUM(MVCL_MONTO/MVCL_TRM) FROM movimiento_clientes
                    WHERE TERC_NIT = :NIT AND MVCL_FECHA >= :FECINI AND MVCL_FECHA <= :FECFIN
                    AND MVCL_ABONO = 'S' AND ((:SUBEMPRESA = 0) or (SUCU_ID = :SUBEMPRESA))
                    INTO :ABONOS;
                END
            END
        ELSE
            BEGIN
            if (MONEDA = 0) then
                BEGIN
                SELECT SUM(MVCL_MONTO), MAX(:FECFIN-MVCL_FECHA), MAX(:FECFIN-MVCL_VENCE) FROM movimiento_clientes
                    WHERE TERC_NIT = :NIT AND MVCL_FECHA >= :FECINI AND MVCL_FECHA <= :FECFIN
                    AND MVCL_DEBITO = 'S' AND ((:SUBEMPRESA = 0) or (SUCU_ID = :SUBEMPRESA))
                    INTO :DEBITOS, :diasf, :dias;
                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 ((:SUBEMPRESA = 0) or (SUCU_ID = :SUBEMPRESA))
                    INTO :CREDITOS;
/*                if (fautorcree <= FECINI) then DEBE TOMAR LA RTCREE POR SI HAY DOCUMENTOS ANTERIORES A LA AUTORET
                    SELECT SUM(MVCL_MONTO+MVCL_RTEFTE+MVCL_RTEIVA+MVCL_RTEICA) FROM movimiento_clientes
                        WHERE TERC_NIT = :NIT AND MVCL_FECHA >= :FECINI AND MVCL_FECHA <= :FECFIN
                        AND MVCL_ABONO = 'S' AND ((:SUBEMPRESA = 0) or (SUCU_ID = :SUBEMPRESA))
                        INTO :ABONOS;
                else */
                    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_ABONO = 'S' AND ((:SUBEMPRESA = 0) or (SUCU_ID = :SUBEMPRESA))
                        INTO :ABONOS;
                END
            ELSE
                BEGIN
                SELECT SUM(MVCL_MONTO/MVCL_TRM), MAX(:FECFIN-MVCL_FECHA), MAX(:FECFIN-MVCL_VENCE) FROM movimiento_clientes
                    WHERE TERC_NIT = :NIT AND MVCL_FECHA >= :FECINI AND MVCL_FECHA <= :FECFIN
                    AND MVCL_DEBITO = 'S' AND ((:SUBEMPRESA = 0) or (SUCU_ID = :SUBEMPRESA))
                    INTO :DEBITOS, :diasf, :dias;
                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 ((:SUBEMPRESA = 0) or (SUCU_ID = :SUBEMPRESA))
                    INTO :CREDITOS;
/*                if (fautorcree <= FECINI) then
                    SELECT SUM((MVCL_MONTO+MVCL_RTEFTE+MVCL_RTEIVA+MVCL_RTEICA)/MVCL_TRM) FROM movimiento_clientes
                        WHERE TERC_NIT = :NIT AND MVCL_FECHA >= :FECINI AND MVCL_FECHA <= :FECFIN
                        AND MVCL_ABONO = 'S' AND ((:SUBEMPRESA = 0) or (SUCU_ID = :SUBEMPRESA))
                        INTO :ABONOS;
                else */
                    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_ABONO = 'S' AND ((:SUBEMPRESA = 0) or (SUCU_ID = :SUBEMPRESA))
                        INTO :ABONOS;
                END
            END
        if (FOV = 'FECHA') then
            BEGIN
            if ((DIASMAX < DIASF) AND (DIASF IS NOT NULL)) then
                DIASMAX = DIASF;
            END
        ELSE
            BEGIN
            if ((DIASMAX < DIAS) AND (DIAS IS NOT NULL)) then
                DIASMAX = DIAS;
            END
        if (DEBITOS IS NULL) then
            DEBITOS = 0;
        if (CREDITOS IS NULL) then
            CREDITOS = 0;
        if (ABONOS IS NULL) then
            ABONOS = 0;
        FINAL = INICIAL + DEBITOS - CREDITOS - ABONOS;
        SUSPEND;
        END
    END
END^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER procedure COMISIONES_COBRO (
    DESDE integer,
    HASTA integer,
    FECINI date,
    FECFIN date,
    DETALLE char(1))
returns (
    CODVEND integer,
    NOMVEND varchar(60),
    NIT varchar(20),
    CLIENTE varchar(60),
    NOMTIPO varchar(8),
    PREFIJO varchar(4),
    NUMERO varchar(8),
    FECDOC date,
    PUNTOVTA integer,
    PREFREC varchar(4),
    NUMREC varchar(8),
    FECREC date,
    DIAS integer,
    ABONO numeric(18,2),
    BASE numeric(18,2),
    COMIMONTO numeric(18,2),
    COMIPORC numeric(9,2),
    ARTICULO varchar(20),
    ARTIDES varchar(60),
    CODGRP varchar(2),
    CODMAR varchar(3),
    CANT numeric(18,4),
    DTOFIN numeric(18,2),
    VENCE date,
    RTFTE numeric(18,2),
    RTIVA numeric(18,2),
    RTICA numeric(18,2))
AS
DECLARE VARIABLE TIPO INTEGER;
DECLARE VARIABLE ID INTEGER;
DECLARE VARIABLE IVAMONTO NUMERIC(18,2);
DECLARE VARIABLE TOTAL NUMERIC(18,2);
DECLARE VARIABLE SITOT CHAR(2);
DECLARE VARIABLE VENTA CHAR(2);
DECLARE VARIABLE COMIV NUMERIC(18,2);
DECLARE VARIABLE PORCV double precision;
DECLARE VARIABLE CONSUMO NUMERIC(18,2);
declare variable ALFINAL CHAR(2);
declare variable SALDO NUMERIC(18,2);
declare variable COMISION VARCHAR(10);
declare variable porcaux NUMERIC(9,2);
declare variable BASEAUX DOUBLE PRECISION;
declare variable SUCURSAL VARCHAR(20);
declare variable COMIART VARCHAR(6);
declare variable LISTA INTEGER;
declare variable LISTAP INTEGER;
declare variable INCDTO CHAR(2);
declare variable INCANTI CHAR(2);
declare variable INCCHE CHAR(2);
declare variable OK CHAR(1);
declare variable IDF INTEGER;
declare variable COMIXVND CHAR(2);
declare variable COMIDIAS NUMERIC(9,2);
declare variable ICOINC CHAR(2);
declare variable UNIVEND CHAR(2);
declare variable FOV varchar(11);
BEGIN
EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA','COMISIONES','UNIFICAR CODIGOS DE VENDEDORES Y COBRADORES') returning_values (:UNIVEND);
EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA','COMISIONES','COMISION POR COBRO PAGADERA SOLO EN EL COBRO TOTAL') returning_values (:ALFINAL);
execute procedure lee_configuracion('CARTERA','COMISIONES','COMISION POR COBRO COMO PORCENTAJE DE LA COMISION VENTA') returning_values (:venta);
EXECUTE PROCEDURE lee_configuracion('CARTERA', 'COMISIONES', 'LIQUIDAR COMISION COBRO CON COBRADOR DEL DOCUMENTO O DEL RECIBO') returning_values (:COMISION);
EXECUTE PROCEDURE lee_configuracion ('FACTURACION','FACTURAS', 'CODIGO DE LA LISTA DE PRECIOS A MOSTRAR EN ARTICULOS') returning_values (:LISTAP);
EXECUTE PROCEDURE lee_configuracion('CARTERA', 'COMISIONES', 'COMISION POR COBRO POR ARTICULO') returning_values (:comiart);
EXECUTE PROCEDURE lee_configuracion('CARTERA', 'COMISIONES', 'INCLUIR DESCUENTO FINANCIERO EN BASE DE COMISIONES POR COBRO') returning_values (:incdto);
EXECUTE PROCEDURE lee_configuracion('CARTERA', 'COMISIONES', 'INCLUIR ANTICIPOS EN COMISIONES POR COBRO') returning_values (:incanti);
EXECUTE PROCEDURE lee_configuracion('CARTERA', 'COMISIONES', 'INCLUIR RECAUDO DE CHEQUES DEVUELTOS EN COMISIONES') returning_values (:incche);
EXECUTE PROCEDURE lee_configuracion('CARTERA', 'COMISIONES', 'COMISION POR ARTICULO Y PROPORCION POR DIAS DE RECAUDO') returning_values (:comixvnd);
EXECUTE PROCEDURE lee_configuracion('CARTERA', 'COMISIONES', 'COMISION POR COBRO INCLUYENDO EL IMPOCONSUMO') returning_values (:icoinc);
EXECUTE PROCEDURE lee_configuracion('CARTERA', 'COMISIONES', 'COMISION POR COBRO SOBRE EL TOTAL') returning_values (:SITOT);
EXECUTE PROCEDURE LEE_CONFIGURACION('CARTERA', 'SALDOS', 'ANALISIS DE CARTERA CON FECHA FACTURA, VENCIMIENTO O ENTREGA') RETURNING_VALUES (FOV);
FOR SELECT RCDE_TIPODOC, RCDE_IDDOC, RCDE_PREFIJO, RCDE_NUMERO, R.TERC_NIT, TERC_NOM, RECA_FECHA, (RCDE_ABONO+RCDE_RTFTE+RCDE_RTIVA+RCDE_RTICA), PREF_PRE, RECA_NUMERO, RCDE_COBR, RCDE_DTOF, RCDE_RTFTE, RCDE_RTIVA, RCDE_RTICA
    FROM RECIBOS_CAJA R, RECIBOS_CAJA_DETALLE RD, TERCEROS T
    WHERE R.RECA_ID = RD.RECA_ID AND RECA_FECHA >= :FECINI AND RECA_FECHA <= :FECFIN AND R.TERC_NIT = T.TERC_NIT AND RECA_ANULADO = 'N'
    AND ((RD.rcde_tipodoc <> 45) or (:INCANTI = 'SI'))
    ORDER BY TERC_NIT, RECA_FECHA
    INTO :TIPO, :ID, :PREFIJO, :NUMERO, :NIT, :CLIENTE, :FECREC, :ABONO, :PREFREC, :NUMREC, :codvend, :DTOFIN, :rtfte, :RTIVA, :RTICA
    DO
    BEGIN
    SELECT TIDO_NOMCORTO FROM TIPO_DOCUMENTO WHERE TIDO_COD = :TIPO INTO :NOMTIPO;
    if (incdto = 'SI') then
        ABONO = ABONO + DTOFIN;
    if (COMISION = 'DOCUMENTO') then
        SELECT first 1 MVCL_FECHA, COBR_COD, MVCL_VENCE FROM MOVIMIENTO_CLIENTES WHERE MVCL_TIPOREF = :TIPO AND MVCL_IDREF = :ID
            INTO :FECDOC, :codvend, :VENCE;
    else
        SELECT first 1 MVCL_FECHA, MVCL_VENCE FROM MOVIMIENTO_CLIENTES WHERE MVCL_TIPOREF = :TIPO AND MVCL_IDREF = :ID
            INTO :FECDOC, :VENCE;
    if ((TIPO = 31) AND (FOV = 'ENTREGA')) THEN
        SELECT FACT_ENTREGA FROM FACTURAS WHERE FACT_ID = :ID INTO :FECDOC;
    if (FECDOC IS NOT NULL) then
        DIAS = FECREC - FECDOC;
    ELSE
        DIAS = 999;
    if (TIPO = 31) then
        SELECT PTVT_ID FROM FACTURAS WHERE FACT_ID = :ID INTO :puntovta;
    else if (TIPO = 33) then
        SELECT PTVT_ID FROM devoluciones_ventas WHERE DEVT_ID = :ID INTO :puntovta;
    else    
        PUNTOVTA = 0;
    if ((codvend >= :DESDE) AND (codvend <= :hasta)) then
        BEGIN
        select COBR_NOM from COBRADORES where COBR_COD = :codvend INTO :nomvend;
        /* TRAIGA EL PORCENTAJE DE ACUERDO A LOS DIAS */
        COMIPORC = 0;
        SELECT CMCB_PORC FROM COMISION_COBRO WHERE CMCB_DIASINI <= :dias AND CMCB_DIASFIN >= :DIAS AND COBR_COD = :CODVEND
            INTO :COMIPORC;
        if (COMIPORC IS NULL) THEN
            COMIPORC = 0;
        COMIDIAS = COMIPORC;
        if (VENTA = 'NO') then
            BEGIN
            if (ALFINAL = 'SI') then
                BEGIN
                EXECUTE PROCEDURE saldo_doc_cartera(:tipo, :ID, :FECREC, 0) returning_values (:SALDO);
                if (SALDO = 0) then
                    OK = 'S';
                else
                    OK = 'N';
                end
            else
                OK = 'S';
            if (TIPO = 31) then
                BEGIN
                if (DETALLE = 'N') then
                    SELECT MAX(FACT_TOTAL), MAX(FACT_IVAMONTO-FACT_DEC2799), SUM(FADE_CONSUMO) FROM FACTURAS F, FACTURAS_DETALLE D
                        WHERE F.FACT_ID = D.FACT_ID AND F.FACT_ID = :ID INTO :TOTAL, :IVAMONTO, :CONSUMO;
                ELSE
                    FOR SELECT D.ARTI_COD, FADE_CANT, FADE_TOTAL, FADE_IVAMONTO, FADE_CONSUMO, GRUP_COD, LIPR_COD, MARC_COD, ARTI_DES
                        FROM FACTURAS F, FACTURAS_DETALLE D, ARTICULO A
                        WHERE F.FACT_ID = D.FACT_ID AND D.arti_cod = A.arti_cod AND F.FACT_ID = :ID and substring(a.arti_cod from 1 FOR 2) <> '.t'
                        INTO :ARTICULO, :CANT, :TOTAL, :IVAMONTO, :CONSUMO, :CODGRP, :lista, :codmar, :artides
                        DO
                        BEGIN
                        if (comiart = 'GRUPO') then
                            SELECT GRUP_COMIPOR FROM GRUPO WHERE GRUP_COD = :codgrp INTO :comiporc;
                        if (comiart = 'MARCA') then
                            SELECT MARC_COMIPOR FROM MARCAS WHERE MARC_COD = :codmar INTO :comiporc;
                        if (comiart = 'PRECIO') then
                            SELECT PRAR_COMIC FROM precios_articulo WHERE ARTI_COD = :articulo AND LIPR_COD = :LISTA INTO :comiporc;

                        if (SITOT = 'SI') then
                            BASEAUX = TOTAL;
                        ELSE
                            begin
                            BASEAUX = TOTAL - IVAMONTO;
                            if (ICOINC <> 'SI') then
                                BASEAUX = BASEAUX - CONSUMO;
                            end
                        if (OK = 'S') then
                            begin
                            if (alfinal = 'SI') then
                                BASE = BASEAUX;
                            else
                                begin
                                /* calcula la proporcion del abono */
                                SELECT FACT_TOTAL FROM FACTURAS WHERE FACT_ID = :ID INTO :TOTAL;
                                if (TOTAL <> 0) then
                                    BASE = BASEAUX * (ABONO / TOTAL);
                                else
                                    BASE = 0;
                                end
                            end
                        else
                            BASE = 0;
                        if (comixvnd = 'SI') then
                            BEGIN                          
                            comiporc = comiporc * comidias / 100;
                            END
                        COMIMONTO = BASE / 100 * COMIPORC;
                        SUSPEND;
                        END
                END
            if (TIPO = 33) then
                if (DETALLE = 'N') then
                    SELECT MAX(DEVT_TOTAL*-1), MAX((DEVT_IVAMONTO-DEVT_DEC2799)*-1), SUM(DVDE_CONSUMO) FROM DEVOLUCIONES_VENTAS V, DEVOLUCIONES_VENTAS_DETALLE D
                        WHERE V.DEVT_ID = D.DEVT_ID AND V.DEVT_ID = :ID INTO :TOTAL, :IVAMONTO, :CONSUMO;
                ELSE
                    FOR SELECT D.ARTI_COD, DVDE_CANT, DVDE_TOTAL*-1, DVDE_IVAMONTO*-1, DVDE_CONSUMO*-1, GRUP_COD, DEVT_FACTID, MARC_COD, ARTI_DES
                        FROM DEVOLUCIONES_VENTAS V, DEVOLUCIONES_VENTAS_DETALLE D, ARTICULO A
                        WHERE V.DEVT_ID = D.DEVT_ID AND D.arti_cod = A.arti_cod AND V.DEVT_ID = :ID and substring(a.arti_cod from 1 FOR 2) <> '.t'
                        INTO :ARTICULO, :CANT, :TOTAL, :IVAMONTO, :CONSUMO, :codgrp, :IDF, :codmar, :artides
                        DO
                        BEGIN
                        if (comiart = 'GRUPO') then
                            SELECT GRUP_COMIPOR FROM GRUPO WHERE GRUP_COD = :codgrp INTO :comiporc;
                        if (comiart = 'MARCA') then
                            SELECT MARC_COMIPOR FROM MARCAS WHERE MARC_COD = :codmar INTO :comiporc;
                        if (comiart = 'PRECIO') then
                            BEGIN
                            LISTA = 0;
                            SELECT MAX(LIPR_COD) FROM facturas_detalle d WHERE ARTI_COD = :ARTICULO AND FACT_ID = :IDF INTO :LISTA;
                            if (LISTA = 0) then
                                LISTA = LISTAP;
                            SELECT PRAR_COMIC FROM precios_articulo WHERE ARTI_COD = :articulo AND LIPR_COD = :LISTA INTO :comiporc;
                            END
                        if (SITOT = 'SI') then
                            BASEAUX = TOTAL;
                        ELSE
                            begin
                            BASEAUX = TOTAL - IVAMONTO;
                            if (ICOINC <> 'SI') then
                                BASEAUX = BASEAUX - CONSUMO;
                            end
                        if (OK = 'S') then
                            begin
                            if (alfinal = 'SI') then
                                BASE = BASEAUX;
                            else
                                begin
                                /* calcula la proporcion del abono */
                                SELECT DEVT_TOTAL FROM DEVOLUCIONES_VENTAS WHERE DEVT_ID = :ID INTO :TOTAL;
                                if (TOTAL <> 0) then
                                    BASE = BASEAUX * (ABONO / TOTAL);
                                else
                                    BASE = 0;
                                end
                            end
                        else
                            BASE = 0;
                        if (comixvnd = 'SI') then
                            BEGIN                          
                            comiporc = comiporc * comidias / 100;
                            END
                        COMIMONTO = BASE / 100 * COMIPORC;
                        SUSPEND;
                        END
            if (TIPO = 41) then
                SELECT NDCL_MONTO, NDCL_IVAMONTO, 0 FROM NOTAS_DEBITO_CLIENTES WHERE NDCL_ID = :ID INTO :TOTAL, :IVAMONTO, :CONSUMO;
            if (TIPO = 42) then
                SELECT NCCL_MONTO*-1, NCCL_IVAMONTO*-1, 0 FROM NOTAS_CREDITO_CLIENTES WHERE NCCL_ID = :ID INTO :TOTAL, :IVAMONTO, :CONSUMO;
            if (TIPO = 45) then
                SELECT ANCL_BASE, ANCL_IVAMONTO, 0 FROM anticipos_cliente WHERE ANCL_ID = :ID INTO :TOTAL, :IVAMONTO, :CONSUMO;
            if (TIPO = 77) then
                if (INCCHE = 'SI') then
                    SELECT DVCH_MONTO, 0, 0 FROM DEVOLUCION_CHEQUES WHERE DVCH_ID = :ID INTO :TOTAL, :IVAMONTO, :CONSUMO;
                ELSE
                    BEGIN
                    TOTAL = 0;
                    IVAMONTO = 0;
                    CONSUMO = 0;
                    END
            if (SITOT = 'SI') then
                BASEAUX = ABONO;
            ELSE
                if (TOTAL <> 0) then
                    if (ICOINC <> 'SI') then
                        BASEAUX = (ABONO / TOTAL) * (TOTAL - IVAMONTO - CONSUMO);
                    else
                        BASEAUX = (ABONO / TOTAL) * (TOTAL - IVAMONTO);
                ELSE
                    BASEAUX = 0;
            BASE = BASEAUX;
            if ((univend = 'SI') AND (COMIART <> 'NO') AND (TIPO > 33))then
                SELECT FIRST 1 COMI_PORC FROM COMISIONES WHERE VEND_COD = :codvend ORDER BY COMI_ID INTO :comiporc;
            if (comixvnd = 'SI') then
                BEGIN
                comiporc = comiporc * comidias / 100;
                END

            COMIMONTO = BASE / 100 * COMIPORC;
            END
        ELSE
            BEGIN
            if (TIPO = 31) then
                if (DETALLE = 'N') then
                    SELECT MAX(FACT_TOTAL), MAX(FACT_IVAMONTO-FACT_DEC2799), MAX(FACT_COMIPORC), SUM(FADE_CONSUMO)
                        FROM FACTURAS F, FACTURAS_DETALLE D WHERE F.FACT_ID = D.FACT_ID AND F.FACT_ID = :ID
                        INTO :TOTAL, :IVAMONTO, :PORCV, :CONSUMO;
                ELSE
                    FOR SELECT D.ARTI_COD, FADE_CANT, FADE_TOTAL, FADE_IVAMONTO, FADE_CONSUMO, FACT_COMIPORC, GRUP_COD, MARC_COD, ARTI_DES
                        FROM FACTURAS F, FACTURAS_DETALLE D, ARTICULO A
                        WHERE F.FACT_ID = D.FACT_ID AND D.arti_cod = A.arti_cod AND F.FACT_ID = :ID and substring(a.arti_cod from 1 FOR 2) <> '.t'
                        INTO :ARTICULO, :CANT, :TOTAL, :IVAMONTO, :CONSUMO, :porcv, :codgrp, :codmar, :artides
                        DO
                        BEGIN
                        if (SITOT = 'SI') then
                            BASEAUX = TOTAL;
                        ELSE
                            begin
                            BASEAUX = TOTAL - IVAMONTO;
                            if (ICOINC <> 'SI') then
                                BASEAUX = BASEAUX - CONSUMO;
                            end
                        /* calcula la proporcion del abono */
                        SELECT FACT_TOTAL FROM FACTURAS WHERE FACT_ID = :ID INTO :TOTAL;
                        if (TOTAL <> 0) then
                            BASE = BASEAUX * (ABONO / TOTAL);
                        else
                            BASE = 0;
                        COMIV = BASE / 100 * PORCV;
                        COMIMONTO = COMIV / 100 * COMIPORC;
                        porcaux = comiporc;
                        comiporc = PORCV * COMIPORC / 100;
                        SUSPEND;
                        END
            if (TIPO = 33) then
                if (DETALLE = 'N') then
                    SELECT MAX(DEVT_TOTAL*-1), MAX((DEVT_IVAMONTO-DEVT_DEC2799)*-1), MAX(DEVT_COMIPORC*-1), SUM(DVDE_CONSUMO*-1)
                        FROM DEVOLUCIONES_VENTAS V, DEVOLUCIONES_VENTAS_DETALLE D WHERE V.DEVT_ID = D.DEVT_ID AND D.DEVT_ID = :ID
                        INTO :TOTAL, :IVAMONTO, :PORCV, :CONSUMO;
                ELSE
                    FOR SELECT D.ARTI_COD, DVDE_CANT, DVDE_TOTAL*-1, DVDE_IVAMONTO*-1, DVDE_CONSUMO*-1, DEVT_COMIPORC, GRUP_COD, MARC_COD, ARTI_DES
                        FROM DEVOLUCIONES_VENTAS V, DEVOLUCIONES_VENTAS_DETALLE D, ARTICULO A
                        WHERE V.DEVT_ID = D.DEVT_ID AND D.arti_cod = A.arti_cod AND V.DEVT_ID = :ID and substring(a.arti_cod from 1 FOR 2) <> '.t'
                        INTO :ARTICULO, :CANT, :TOTAL, :IVAMONTO, :CONSUMO, :porcv, :codgrp, :codmar, :artides
                        DO
                        BEGIN
                        if (SITOT = 'SI') then
                            BASEAUX = TOTAL;
                        ELSE
                            begin
                            BASEAUX = TOTAL - IVAMONTO;
                            if (ICOINC <> 'SI') then
                                BASEAUX = BASEAUX - CONSUMO;
                            end
                        /* calcula la proporcion del abono */
                        SELECT DEVT_TOTAL FROM DEVOLUCIONES_VENTAS WHERE DEVT_ID = :ID INTO :TOTAL;
                        if (TOTAL <> 0) then
                            BASE = BASEAUX * (ABONO / TOTAL);
                        else
                            BASE = 0;
                        COMIV = BASE / 100 * PORCV;
                        COMIMONTO = COMIV / 100 * COMIPORC;
                        porcaux = comiporc;
                        comiporc = PORCV * COMIPORC / 100;
                        SUSPEND;
                        END
            if (TIPO = 41) then
                SELECT NDCL_MONTO, NDCL_IVAMONTO, NDCL_COMIPORC, 0 FROM NOTAS_DEBITO_CLIENTES
                    WHERE NDCL_ID = :ID INTO :TOTAL, :IVAMONTO, :PORCV, :CONSUMO;
            if (TIPO = 42) then
                SELECT NCCL_MONTO, NCCL_IVAMONTO, NCCL_COMIPORC, 0  FROM NOTAS_CREDITO_CLIENTES
                    WHERE NCCL_ID = :ID INTO :TOTAL, :IVAMONTO, :PORCV, :CONSUMO;
            if (TIPO = 45) then
                SELECT ANCL_BASE, ANCL_IVAMONTO, 0 FROM anticipos_cliente WHERE ANCL_ID = :ID INTO :TOTAL, :IVAMONTO, :CONSUMO;
            if (TIPO = 77) then
                if (INCCHE = 'SI') then
                    SELECT DVCH_MONTO, 0, 0, 0 FROM DEVOLUCION_CHEQUES WHERE DVCH_ID = :ID INTO :TOTAL, :IVAMONTO, :PORCV, :CONSUMO;
                ELSE
                    BEGIN
                    TOTAL = 0;
                    IVAMONTO = 0;
                    CONSUMO = 0;
                    PORCV = 0;
                    END
            if (SITOT = 'SI') then
                BASEAUX = ABONO;
            ELSE
                if ((total <> 0) AND (ABONO <> 0)) then
                    if (ICOINC <> 'SI') then
                        BASEAUX = (TOTAL - IVAMONTO - CONSUMO) / TOTAL * ABONO;
                    else
                        BASEAUX = (TOTAL - IVAMONTO) / TOTAL * ABONO;
                ELSE
                    BASEAUX = 0;
            COMIV = BASEAUX / 100 * PORCV;
            COMIMONTO = COMIV / 100 * COMIPORC;
            porcaux = comiporc;
            comiporc = PORCV * COMIPORC / 100;
            BASE = BASEAUX;
            END
        if (DETALLE = 'N') then
            if (ALFINAL = 'SI') then
                BEGIN
                /* VERIFIQUE EL SALDO DEL DOCUMENTO, SI ES CERO LIQUIDE COMISION SOBRE EL TOTAL */
                EXECUTE PROCEDURE saldo_doc_cartera(:tipo, :ID, :FECREC, 0) returning_values (:SALDO);
                if (SALDO = 0) then
                    BEGIN
                    if (VENTA = 'NO') then
                        begin
                        if (SITOT = 'SI') then
                            BASEAUX = TOTAL;
                        ELSE
                            if (ICOINC <> 'SI') then
                                BASEAUX = TOTAL - IVAMONTO - CONSUMO;
                            else
                                BASEAUX = TOTAL - IVAMONTO;
                        COMIMONTO = BASEAUX * COMIPORC / 100;
                        end
                    ELSE
                        BEGIN
                        if (SITOT = 'SI') then
                            BASEAUX = TOTAL;
                        ELSE
                            begin
                            BASEAUX = TOTAL - IVAMONTO;
                            if (ICOINC <> 'SI') then
                                BASEAUX = BASEAUX - CONSUMO;
                            end
                        COMIV = PORCV * BASEAUX / 100;
                        COMIMONTO = COMIV / 100 * porcaux;
                        comiporc = PORCV * porcaux / 100;
                        END
                    BASE = BASEAUX;
                    SUSPEND;
                    END
                END
            ELSE
                SUSPEND;
        ELSE
            if ((TIPO <> 31) AND (TIPO <> 33)) then
                SUSPEND;
        END
    END
FOR SELECT EGCC_TIPODOC, EGCC_IDDOC, EGCC_PREFIJO, EGCC_NUMERO, E.TERC_NIT, TERC_NOM, EGRE_FECHA, (EGCC_ABONO+EGCC_RTFTE+EGCC_RTIVA+EGCC_RTICA), PREF_PRE, EGRE_NUMERO, EGCC_SUCURSAL, EGCC_DTOF
    FROM EGRESOS E, EGRESOS_CRUCEC C, TERCEROS T
    WHERE E.EGRE_ID = C.EGRE_ID AND EGRE_FECHA >= :FECINI AND EGRE_FECHA <= :FECFIN AND E.TERC_NIT = T.TERC_NIT AND EGRE_ANULADO = 'N'
    ORDER BY TERC_NIT, EGRE_FECHA
    INTO :TIPO, :ID, :PREFIJO, :NUMERO, :NIT, :CLIENTE, :FECREC, :ABONO, :PREFREC, :NUMREC, :SUCURSAL, :dtofin
    DO
    BEGIN
    SELECT COBR_COD FROM cliente_sucursales WHERE TERC_NIT = :NIT AND CLCU_COD = :sucursal INTO :codvend;
    SELECT TIDO_NOMCORTO FROM TIPO_DOCUMENTO WHERE TIDO_COD = :TIPO INTO :NOMTIPO;
    if (incdto = 'SI') then
        ABONO = ABONO + DTOFIN;
    if (COMISION = 'DOCUMENTO') then
        SELECT MVCL_FECHA, COBR_COD FROM MOVIMIENTO_CLIENTES WHERE MVCL_TIPOREF = :TIPO AND MVCL_IDREF = :ID
            INTO :FECDOC, :codvend;
    else
        SELECT MVCL_FECHA FROM MOVIMIENTO_CLIENTES WHERE MVCL_TIPOREF = :TIPO AND MVCL_IDREF = :ID
            INTO :FECDOC;
    if ((TIPO = 31) AND (FOV = 'ENTREGA')) THEN
        SELECT FACT_ENTREGA FROM FACTURAS WHERE FACT_ID = :ID INTO :FECDOC;
    if (FECDOC IS NOT NULL) then
        DIAS = FECREC - FECDOC;
    ELSE
        DIAS = 999;
    if (TIPO = 31) then
        SELECT PTVT_ID FROM FACTURAS WHERE FACT_ID = :ID INTO :puntovta;
    else if (TIPO = 33) then
        SELECT PTVT_ID FROM devoluciones_ventas WHERE DEVT_ID = :ID INTO :puntovta;
    else    
        PUNTOVTA = 0;
    if ((codvend >= :DESDE) AND (codvend <= :hasta)) then
        BEGIN
        select COBR_NOM from COBRADORES where COBR_COD = :codvend INTO :nomvend;
        /* TRAIGA EL PORCENTAJE DE ACUERDO A LOS DIAS */
        COMIPORC = 0;
        SELECT CMCB_PORC FROM COMISION_COBRO WHERE CMCB_DIASINI <= :dias AND CMCB_DIASFIN >= :DIAS AND COBR_COD = :CODVEND INTO :COMIPORC;
        if (COMIPORC IS NULL) THEN
            COMIPORC = 0;
        COMIDIAS = COMIPORC;
        if (VENTA = 'NO') then
            BEGIN
            if (ALFINAL = 'SI') then
                BEGIN
                EXECUTE PROCEDURE saldo_doc_cartera(:tipo, :ID, :FECREC, 0) returning_values (:SALDO);
                if (SALDO = 0) then
                    OK = 'S';
                else
                    OK = 'N';
                end
            else
                OK = 'S';
            if (TIPO = 31) then
                BEGIN
                if (DETALLE = 'N') then
                    SELECT MAX(FACT_TOTAL), MAX(FACT_IVAMONTO-FACT_DEC2799), SUM(FADE_CONSUMO) FROM FACTURAS F, FACTURAS_DETALLE D
                        WHERE F.FACT_ID = D.FACT_ID AND F.FACT_ID = :ID INTO :TOTAL, :IVAMONTO, :CONSUMO;
                ELSE
                    FOR SELECT D.ARTI_COD, FADE_CANT, FADE_TOTAL, FADE_IVAMONTO, FADE_CONSUMO, GRUP_COD, LIPR_COD, MARC_COD, ARTI_DES
                        FROM FACTURAS F, FACTURAS_DETALLE D, ARTICULO A
                        WHERE F.FACT_ID = D.FACT_ID AND D.arti_cod = A.arti_cod AND F.FACT_ID = :ID and substring(a.arti_cod from 1 FOR 2) <> '.t'
                        INTO :ARTICULO, :CANT, :TOTAL, :IVAMONTO, :CONSUMO, :CODGRP, :LISTA, :codmar, :artides
                        DO
                        BEGIN
                        if (comiart = 'GRUPO') then
                            SELECT GRUP_COMIPOR FROM GRUPO WHERE GRUP_COD = :codgrp INTO :comiporc;
                        if (comiart = 'MARCA') then
                            SELECT MARC_COMIPOR FROM MARCAS WHERE MARC_COD = :codmar INTO :comiporc;
                        if (comiart = 'PRECIO') then
                            SELECT PRAR_COMIC FROM precios_articulo WHERE ARTI_COD = :articulo AND LIPR_COD = :LISTA INTO :comiporc;

                        if (SITOT = 'SI') then
                            BASEAUX = TOTAL;
                        ELSE
                            begin
                            BASEAUX = TOTAL - IVAMONTO;
                            if (ICOINC <> 'SI') then
                                BASEAUX = BASEAUX - CONSUMO;
                            end
                        if (OK = 'S') then
                            begin
                            if (alfinal = 'SI') then
                                BASE = BASEAUX;
                            else
                                begin
                                /* calcula la proporcion del abono */
                                SELECT FACT_TOTAL FROM FACTURAS WHERE FACT_ID = :ID INTO :TOTAL;
                                if (TOTAL <> 0) then
                                    BASE = BASEAUX * (ABONO / TOTAL);
                                else
                                    BASE = 0;
                                end
                            end
                        else
                            BASE = 0;
                        if (comixvnd = 'SI') then
                            BEGIN                          
                            comiporc = comiporc * comidias / 100;
                            END
                        COMIMONTO = BASE / 100 * COMIPORC;
                        SUSPEND;
                        END
                END
            if (TIPO = 33) then
                if (DETALLE = 'N') then
                    SELECT MAX(DEVT_TOTAL*-1), MAX((DEVT_IVAMONTO-DEVT_DEC2799)*-1), SUM(DVDE_CONSUMO) FROM DEVOLUCIONES_VENTAS V, DEVOLUCIONES_VENTAS_DETALLE D
                        WHERE V.DEVT_ID = D.DEVT_ID AND V.DEVT_ID = :ID INTO :TOTAL, :IVAMONTO, :CONSUMO;
                ELSE
                    FOR SELECT D.ARTI_COD, DVDE_CANT, DVDE_TOTAL*-1, DVDE_IVAMONTO*-1, DVDE_CONSUMO*-1, GRUP_COD, DEVT_FACTID, MARC_COD, ARTI_DES
                        FROM DEVOLUCIONES_VENTAS V, DEVOLUCIONES_VENTAS_DETALLE D, ARTICULO A
                        WHERE V.DEVT_ID = D.DEVT_ID AND D.arti_cod = A.arti_cod AND V.DEVT_ID = :ID and substring(a.arti_cod from 1 FOR 2) <> '.t'
                        INTO :ARTICULO, :CANT, :TOTAL, :IVAMONTO, :CONSUMO, :codgrp, :IDF, :codmar, :artides
                        DO
                        BEGIN
                        if (comiart = 'GRUPO') then
                            SELECT GRUP_COMIPOR FROM GRUPO WHERE GRUP_COD = :codgrp INTO :comiporc;
                        if (comiart = 'MARCA') then
                            SELECT MARC_COMIPOR FROM MARCAS WHERE MARC_COD = :codmar INTO :comiporc;
                        if (comiart = 'PRECIO') then
                            BEGIN
                            LISTA = 0;
                            SELECT MAX(LIPR_COD) FROM facturas_detalle d WHERE ARTI_COD = :ARTICULO AND FACT_ID = :IDF INTO :LISTA;
                            if (LISTA = 0) then
                                LISTA = LISTAP;
                            SELECT PRAR_COMIC FROM precios_articulo WHERE ARTI_COD = :articulo AND LIPR_COD = :LISTA INTO :comiporc;
                            END
                        if (SITOT = 'SI') then
                            BASEAUX = TOTAL;
                        ELSE
                            begin
                            BASEAUX = TOTAL - IVAMONTO;
                            if (ICOINC <> 'SI') then
                                BASEAUX = BASEAUX - CONSUMO;
                            end
                        if (OK = 'S') then
                            begin
                            if (alfinal = 'SI') then
                                BASE = BASEAUX;
                            else
                                begin
                                /* calcula la proporcion del abono */
                                SELECT DEVT_TOTAL FROM DEVOLUCIONES_VENTAS WHERE DEVT_ID = :ID INTO :TOTAL;
                                if (TOTAL <> 0) then
                                    BASE = BASEAUX * (ABONO / TOTAL);
                                else
                                    BASE = 0;
                                end
                            end
                        else
                            BASE = 0;
                        if (comixvnd = 'SI') then
                            BEGIN                          
                            comiporc = comiporc * comidias / 100;
                            END
                        COMIMONTO = BASE / 100 * COMIPORC;
                        SUSPEND;
                        END
            if (TIPO = 41) then
                SELECT NDCL_MONTO, NDCL_IVAMONTO, 0 FROM NOTAS_DEBITO_CLIENTES WHERE NDCL_ID = :ID INTO :TOTAL, :IVAMONTO, :CONSUMO;
            if (TIPO = 42) then
                SELECT NCCL_MONTO*-1, NCCL_IVAMONTO*-1, 0 FROM NOTAS_CREDITO_CLIENTES WHERE NCCL_ID = :ID INTO :TOTAL, :IVAMONTO, :CONSUMO;
            if (TIPO = 45) then
                SELECT ANCL_BASE, ANCL_IVAMONTO, 0 FROM anticipos_cliente WHERE ANCL_ID = :ID INTO :TOTAL, :IVAMONTO, :CONSUMO;
            if (TIPO = 77) then
                if (INCCHE = 'SI') then
                    SELECT DVCH_MONTO, 0, 0 FROM DEVOLUCION_CHEQUES WHERE DVCH_ID = :ID INTO :TOTAL, :IVAMONTO, :CONSUMO;
                ELSE
                    BEGIN
                    TOTAL = 0;
                    IVAMONTO = 0;
                    CONSUMO = 0;
                    END
            if (SITOT = 'SI') then
                BASEAUX = ABONO;
            ELSE
                if (TOTAL <> 0) then
                    if (ICOINC <> 'SI') then
                        BASEAUX = (ABONO / TOTAL) * (TOTAL - IVAMONTO - CONSUMO);
                    else
                        BASEAUX = (ABONO / TOTAL) * (TOTAL - IVAMONTO);
                ELSE
                    BASEAUX = 0;
            BASE = BASEAUX;
            if ((univend = 'SI') AND (TIPO > 33))then
                SELECT FIRST 1 COMI_PORC FROM COMISIONES WHERE VEND_COD = :codvend ORDER BY COMI_ID INTO :comiporc;
            if (comixvnd = 'SI') then
                BEGIN
                comiporc = comiporc * comidias / 100;
                END
            COMIMONTO = BASE / 100 * COMIPORC;
            END
        ELSE
            BEGIN
            if (TIPO = 31) then
                if (DETALLE = 'N') then
                    SELECT MAX(FACT_TOTAL), MAX(FACT_IVAMONTO-FACT_DEC2799), MAX(FACT_COMIPORC), SUM(FADE_CONSUMO)
                        FROM FACTURAS F, FACTURAS_DETALLE D WHERE F.FACT_ID = D.FACT_ID AND F.FACT_ID = :ID
                        INTO :TOTAL, :IVAMONTO, :PORCV, :CONSUMO;
                ELSE
                    FOR SELECT D.ARTI_COD, FADE_CANT, FADE_TOTAL, FADE_IVAMONTO, FADE_CONSUMO, FACT_COMIPORC, GRUP_COD, MARC_COD, ARTI_DES
                        FROM FACTURAS F, FACTURAS_DETALLE D, ARTICULO A
                        WHERE F.FACT_ID = D.FACT_ID AND D.arti_cod = A.arti_cod AND F.FACT_ID = :ID and substring(a.arti_cod from 1 FOR 2) <> '.t'
                        INTO :ARTICULO, :CANT, :TOTAL, :IVAMONTO, :CONSUMO, :porcv, :codgrp, :codmar, :artides
                        DO
                        BEGIN
                        if (SITOT = 'SI') then
                            BASEAUX = TOTAL;
                        ELSE
                            begin
                            BASEAUX = TOTAL - IVAMONTO;
                            if (ICOINC <> 'SI') then
                                BASEAUX = BASEAUX - CONSUMO;
                            end
                        /* calcula la proporcion del abono */
                        SELECT FACT_TOTAL FROM FACTURAS WHERE FACT_ID = :ID INTO :TOTAL;
                        if (TOTAL <> 0) then
                            BASE = BASEAUX * (ABONO / TOTAL);
                        else
                            BASE = 0;
                        COMIV = BASE / 100 * PORCV;
                        COMIMONTO = COMIV / 100 * COMIPORC;
                        porcaux = comiporc;
                        comiporc = PORCV * COMIPORC / 100;
                        SUSPEND;
                        END
            if (TIPO = 33) then
                if (DETALLE = 'N') then
                    SELECT MAX(DEVT_TOTAL*-1), MAX((DEVT_IVAMONTO-DEVT_DEC2799)*-1), MAX(DEVT_COMIPORC*-1), SUM(DVDE_CONSUMO*-1)
                        FROM DEVOLUCIONES_VENTAS V, DEVOLUCIONES_VENTAS_DETALLE D WHERE V.DEVT_ID = D.DEVT_ID AND D.DEVT_ID = :ID
                        INTO :TOTAL, :IVAMONTO, :PORCV, :CONSUMO;
                ELSE
                    FOR SELECT D.ARTI_COD, DVDE_CANT, DVDE_TOTAL*-1, DVDE_IVAMONTO*-1, DVDE_CONSUMO*-1, DEVT_COMIPORC, GRUP_COD, MARC_COD, ARTI_DES
                        FROM DEVOLUCIONES_VENTAS V, DEVOLUCIONES_VENTAS_DETALLE D, ARTICULO A
                        WHERE V.DEVT_ID = D.DEVT_ID AND D.arti_cod = A.arti_cod AND V.DEVT_ID = :ID and substring(a.arti_cod from 1 FOR 2) <> '.t'
                        INTO :ARTICULO, :CANT, :TOTAL, :IVAMONTO, :CONSUMO, :porcv, :codgrp, :codmar, :artides
                        DO
                        BEGIN
                        if (SITOT = 'SI') then
                            BASEAUX = TOTAL;
                        ELSE
                            begin
                            BASEAUX = TOTAL - IVAMONTO;
                            if (ICOINC <> 'SI') then
                                BASEAUX = BASEAUX - CONSUMO;
                            end
                        /* calcula la proporcion del abono */
                        SELECT DEVT_TOTAL FROM DEVOLUCIONES_VENTAS WHERE DEVT_ID = :ID INTO :TOTAL;
                        if (TOTAL <> 0) then
                            BASE = BASEAUX * (ABONO / TOTAL);
                        else
                            BASE = 0;
                        COMIV = BASE / 100 * PORCV;
                        COMIMONTO = COMIV / 100 * COMIPORC;
                        porcaux = comiporc;
                        comiporc = PORCV * COMIPORC / 100;
                        SUSPEND;
                        END
            if (TIPO = 41) then
                SELECT NDCL_MONTO, NDCL_IVAMONTO, NDCL_COMIPORC, 0 FROM NOTAS_DEBITO_CLIENTES
                    WHERE NDCL_ID = :ID INTO :TOTAL, :IVAMONTO, :PORCV, :CONSUMO;
            if (TIPO = 42) then
                SELECT NCCL_MONTO, NCCL_IVAMONTO, NCCL_COMIPORC, 0  FROM NOTAS_CREDITO_CLIENTES
                    WHERE NCCL_ID = :ID INTO :TOTAL, :IVAMONTO, :PORCV, :CONSUMO;
            if (TIPO = 45) then
                SELECT ANCL_BASE, ANCL_IVAMONTO, 0 FROM anticipos_cliente WHERE ANCL_ID = :ID INTO :TOTAL, :IVAMONTO, :CONSUMO;
            if (TIPO = 77) then
                if (incche = 'SI') then
                    SELECT DVCH_MONTO, 0, 0, 0 FROM DEVOLUCION_CHEQUES WHERE DVCH_ID = :ID INTO :TOTAL, :IVAMONTO, :PORCV, :CONSUMO;
                ELSE
                    BEGIN
                    TOTAL = 0;
                    IVAMONTO = 0;
                    CONSUMO = 0;
                    PORCV = 0;
                    END
            if (SITOT = 'SI') then
                BASEAUX = ABONO;
            ELSE
                if ((total <> 0) AND (ABONO <> 0)) then
                    if (ICOINC <> 'SI') then
                        BASEAUX = (TOTAL - IVAMONTO - CONSUMO) / TOTAL * ABONO;
                    else
                        BASEAUX = (TOTAL - IVAMONTO) / TOTAL * ABONO;
                ELSE
                    BASEAUX = 0;
            COMIV = BASEAUX / 100 * PORCV;
            COMIMONTO = COMIV / 100 * COMIPORC;
            porcaux = comiporc;
            comiporc = PORCV * COMIPORC / 100;
            BASE = BASEAUX;
            END
        if (DETALLE = 'N') then
            if (ALFINAL = 'SI') then
                BEGIN
                /* VERIFIQUE EL SALDO DEL DOCUMENTO, SI ES CERO LIQUIDE COMISION SOBRE EL TOTAL */
                EXECUTE PROCEDURE saldo_doc_cartera(:tipo, :ID, :FECREC, 0) returning_values (:SALDO);
                if (SALDO = 0) then
                    BEGIN
                    if (VENTA = 'NO') then
                        begin
                        if (SITOT = 'SI') then
                            BASEAUX = TOTAL;
                        ELSE
                            begin
                            BASEAUX = TOTAL - IVAMONTO;
                            if (ICOINC <> 'SI') then
                                BASEAUX = BASEAUX - CONSUMO;
                            end
                        COMIMONTO = BASEAUX * COMIPORC / 100;
                        end
                    ELSE
                        BEGIN
                        if (SITOT = 'SI') then
                            BASEAUX = TOTAL;
                        ELSE
                            begin
                            BASEAUX = TOTAL - IVAMONTO;
                            if (ICOINC <> 'SI') then
                                BASEAUX = BASEAUX - CONSUMO;
                            end
                        COMIV = PORCV * BASEAUX / 100;
                        COMIMONTO = COMIV / 100 * porcaux;
                        comiporc = PORCV * porcaux / 100;
                        END
                    BASE = BASEAUX;
                    SUSPEND;
                    END
                END
            ELSE
                SUSPEND;
        ELSE
            if ((TIPO <> 31) AND (TIPO <> 33)) then
                SUSPEND;
        END
    END
FOR SELECT 'DEVOCHEQ', DVCH_MONTO*-1, DVCH_FECHA, PRBA_PREF, DVCH_NUMDOC, DVCH_FECHA, D.TERC_NIT, DVCH_NOMTERC, '', '', D.COBR_COD
    FROM DEVOLUCION_CHEQUES D, CLIENTES C
    WHERE DVCH_FECHA >= :FECINI AND DVCH_FECHA <= :FECFIN AND D.TERC_NIT = C.TERC_NIT AND D.COBR_COD = :CODVEND
    INTO :NOMTIPO, :BASE, :FECDOC, :PREFIJO, :NUMERO, :FECREC, :NIT, :CLIENTE, :PREFREC, :NUMREC, :codvend
    DO
    BEGIN
    COMIPORC = 0;
    COMIMONTO = 0;
    VENCE = fecdoc;
    RTFTE = 0;
    RTIVA = 0;
    RTICA = 0;
    DTOFIN = 0;
    puntovta = 0;
    if ((codvend >= :DESDE) AND (codvend <= :hasta)) then
        BEGIN
        select COBR_NOM from COBRADORES where COBR_COD = :codvend INTO :nomvend;
        /* SELECT CMCB_PORC FROM COMISION_COBRO WHERE CMCB_DIASINI <= 1 AND CMCB_DIASFIN >= 1 AND COBR_COD = :CODVEND INTO :COMIPORC;
        if (COMIPORC IS NULL) THEN
            COMIPORC = 0;
        COMIMONTO = BASE * COMIPORC / 100; */
        SUSPEND;
        END
    END
END^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER procedure CARTERA_CLIENTE (
    NIT varchar(20),
    FECHA date,
    SUCURSAL varchar(10),
    MONEDA integer,
    SOLOPESOS char(1),
    AGENCIA integer)
returns (
    CODSUC varchar(10),
    TIPO integer,
    ID integer,
    PREFIJO varchar(4),
    NUMERO varchar(8),
    CONCEPTO varchar(60),
    COBR integer,
    SALDO numeric(18,2),
    RTFTE numeric(18,2),
    RTIVA numeric(18,2),
    RTICA numeric(18,2),
    RCREE numeric(18,2),
    DTOF numeric(18,2),
    TIPONOM varchar(8),
    VENCE date,
    FECDOC date,
    DIAS integer,
    RECPROV_ID integer,
    RECIPROV char(1),
    NOTA varchar(256),
    TRMDOC numeric(18,2))
AS
declare variable FEC date;
declare variable DESC_RTES char(2);
declare variable DTOAPL numeric(18,2);
declare variable TRMREC numeric(18,2);
declare variable IDNOTA integer;
declare variable AUTORET varchar(10);
declare variable FAUTORET date;
declare variable AUTORCREE varchar(10);
declare variable FAUTORCREE date;
declare variable DIASCONT integer;
declare variable CARTXAGE char(2);
declare variable vencimiento varchar(12);
begin
execute procedure LEE_CONFIGURACION('CARTERA', 'SALDOS', 'ANALISIS DE CARTERA CON FECHA FACTURA, VENCIMIENTO O ENTREGA') returning_values (VENCIMIENTO);
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';
execute procedure LEE_CONFIGURACION('CARTERA', 'SALDOS', 'NUMERO DE DIAS PARA CONSULTA DE CARTERA DE CLIENTES DE CONTADO') returning_values (:diascont);

execute procedure LEE_CONFIGURACION('CARTERA', 'GENERAL', 'SEPARAR CARTERA POR AGENCIA') returning_values (:cartxage);
if (CARTXAGE = 'NO') then
    AGENCIA = 0;
if ((DIASCONT <> 0) and (not exists (select ptvt_id from punto_venta where terc_nit = :nit))) then
    DIASCONT = 0;
execute procedure LEE_CONFIGURACION('CARTERA', 'SALDOS', 'DESCONTAR RETENCIONES POR CAUSACION') returning_values (DESC_RTES);
  /* BUSQUE EN SALDOS_DOC_CARTERA LOS QUE TENGAN SALDO > 0 */
 for select MVCL_TIPOREF, MVCL_IDREF, MVCL_FECHA, MVCL_VENCE, MVCL_PREFREF, MVCL_NUMREF, MVCL_CONC, MVCL_TRM, COBR_COD, MVCL_SUCURSAL
  from MOVIMIENTO_CLIENTES
  where TERC_NIT = :NIT and ((mvcl_sucursal = :sucursal) or (:SUCURSAL = '0'))  and MVCL_FECHA <= :FECHA and MVCL_ABONO = 'N' and
    ((:MONEDA = 0) or (MVCL_TRM <> 1)) and ((MVCL_FECHA >= (:FECHA - :DIASCONT)) or (:DIASCONT = 0)) and
    ((:AGENCIA = 0) or (SUCU_ID = :AGENCIA) or (SUCU_ID = 0))
  order by MVCL_FECHA, MVCL_ID
  into :TIPO, :ID, :FECDOC, :VENCE, :PREFIJO, :NUMERO, :CONCEPTO, :TRMDOC, :COBR, :CODSUC
    do
    begin
    if (VENCIMIENTO = 'FECHA') then
        DIAS = FECHA - FECDOC;
    ELSE
        BEGIN
        DIAS = FECHA - VENCE;
        if ((TIPO = 31) AND (VENCIMIENTO = 'ENTREGA')) THEN
            BEGIN
            SELECT FACT_ENTREGA FROM FACTURAS WHERE FACT_ID = :ID INTO :VENCE;
            DIAS = FECHA - VENCE;
            END
        END
    execute procedure saldo_doc_cartera(TIPO, ID, FECHA, MONEDA) returning_values (SALDO);
    if (SALDO <> 0) then
        begin
        select TIDO_NOMCORTO from TIPO_DOCUMENTO where TIDO_COD = :TIPO into :TIPONOM;
        if (TIPO = 41) then
            select NDCL_DTOFMONTO, NDCL_FECHADTO from NOTAS_DEBITO_CLIENTES where NDCL_ID = :ID into :DTOF, :FEC;
        if (TIPO = 42) then
            select 0, NCCL_FECHA from NOTAS_CREDITO_CLIENTES where NCCL_ID = :ID into :DTOF, :FEC;
        if (TIPO = 45) then
            select ANCL_DTOFMONTO, ANCL_DTOFECHA from ANTICIPOS_CLIENTE where ANCL_ID = :ID into :DTOF, :FEC;
        if (TIPO = 31) then
            select FACT_DTOFMONTO, FACT_DTOFFECHA from FACTURAS where FACT_ID = :ID into :DTOF, :FEC;
        if (TIPO = 33) then
            select 0, :FECHA from devoluciones_ventas where DEVT_ID = :ID into :DTOF, :FEC;
        if ((MONEDA <> 0) and (TRMDOC <> 0)) then
            DTOF = DTOF / TRMDOC;

        /* POR WILLIAM IDENTIFICAR SI EL DOCUMENTO TIENE RECIBO PROVISIONAL*/
        recprov_id = 0;
        select max(d.RCPR_ID) from recibo_provisional_detalle d, recibo_provisional r
            where r.rcpr_id = d.rcpr_id and RPDE_IDDOC = :id  and RPDE_TIPODOC = :TIPO and RPDE_TIPODOC = :TIPO and
            RPDE_ANULADO = 'N' and r.rcpr_idcruce = 0 into :recprov_id;
        if (recprov_id is null) then
           begin
           reciprov = 'N';
           end 
        else
          begin 
           reciprov = 'S';
          end
        /*FIN WILLIAM*/
        if (FECHA > FEC) then
            DTOF = 0;
        if (DTOF is null) then
            DTOF = 0;
        if (DTOF <> 0) then
            begin
            select sum(RCDE_DTOF), max(RECA_TRM) from RECIBOS_CAJA_DETALLE D, RECIBOS_CAJA R
                where R.reca_id = D.reca_id and RCDE_IDDOC = :ID and RCDE_TIPODOC = :TIPO and RECA_ANULADO = 'N'
                into :DTOAPL, :TRMREC;
            if (DTOAPL is null) then
                DTOAPL = 0;
            if ((MONEDA <> 0) and (TRMREC <> 0)) then
                DTOAPL = DTOAPL / TRMREC;
            DTOF = DTOF - DTOAPL;
            end
        if (MONEDA = 0) then
            select sum(SDCA_RTFTE - SDCA_ABRTFTE), sum(SDCA_RTIVA - SDCA_ABRTIVA), sum(SDCA_RTICA - SDCA_ABRTICA), sum(SDCA_RCREE - SDCA_ABRCREE)
                from SALDOS_DOC_CARTERA where SDCA_TIPOREF = :TIPO and SDCA_IDREF = :ID
                into :RTFTE, :RTIVA, :RTICA, :RCREE;
        else
            select sum((SDCA_RTFTE - SDCA_ABRTFTE)/SDCA_TRM), sum((SDCA_RTIVA - SDCA_ABRTIVA)/SDCA_TRM), sum((SDCA_RTICA - SDCA_ABRTICA)/SDCA_TRM), sum((SDCA_RCREE - SDCA_ABRCREE)/SDCA_TRM)
                from SALDOS_DOC_CARTERA where SDCA_TIPOREF = :TIPO and SDCA_IDREF = :ID
                into :RTFTE, :RTIVA, :RTICA, :RCREE;
        if (RTFTE is null) then
            RTFTE = 0;
        if ((TIPO = 42) or (TIPO = 45) or (TIPO = 33)) then
            begin
            if (RTFTE > 0) then
                RTFTE = 0;
            end
        else
            begin
            if (RTFTE < 0) then
                RTFTE = 0;
            end

        if (RTIVA is null) then
            RTIVA = 0;
        if ((TIPO = 42) or (TIPO = 45) or (TIPO = 33)) then
            begin
            if (RTIVA > 0) then
                RTIVA = 0;
            end
        else
            begin
            if (RTIVA < 0) then
                RTIVA = 0;
            end

        if (RTICA is null) then
            RTICA = 0;
        if ((TIPO = 42) or (TIPO = 45) or (TIPO = 33)) then
            begin
            if (RTICA > 0) then
                RTICA = 0;
            end
        else
            begin
            if (RTICA < 0) then
                RTICA = 0;
            end

        if (RCREE is null) then
            RCREE = 0;
        if ((TIPO = 42) or (TIPO = 45) or (TIPO = 33)) then
            begin
            if (RCREE > 0) then
                RCREE = 0;
            end
        else
            begin
            if (RCREE < 0) then
                RCREE = 0;
            end

        if (FAUTORET <= FECDOC) then
            begin
            RTFTE = 0;
            RTIVA = 0;
            RTICA = 0;
            end
        if (FAUTORCREE <= FECDOC) then
            RCREE = 0;
        /* RESTE LAS RETENCIONES YA QUE SE SUGERIRAN */
        if (DESC_RTES = 'NO') then
            SALDO = SALDO - RTFTE - RTIVA - RTICA - RCREE;
        /* SI TIENE NOTA AGREGUELA */
        select max(NOCL_ID) from NOTAS_CLIENTES where TERC_NIT = :NIT and ((CLSU_COD = :SUCURSAL) or (:SUCURSAL = '0')) and NOCL_TIPODOC = :TIPO and NOCL_IDDOC = :ID into :IDNOTA;
        if (IDNOTA is not null) then
            select NOCL_TEXTO from NOTAS_CLIENTES where NOCL_ID = :IDNOTA into :NOTA;
        else
            NOTA = '';
        if ((SOLOPESOS = 'N') or (TRMDOC = 1)) then
            suspend;
        end
    end
end^

SET TERM ; ^

SET TERM ^ ;

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);
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
    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;

/* 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 */
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;
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 ; ^

/* 20140218 */
/* grants faltates */

grant select, delete, insert, update on cambio_costo to public;
grant select, delete, insert, update on saldos_cuentas_niif to public;
grant select, delete, insert, update on comprobante_detalle_niif to public;
grant select, delete, insert, update on saldos_articulo_niif to public;
grant select, delete, insert, update on saldos_activo_niif to public;
grant select, delete, insert, update on saldos_terceros_niif to public;
grant select, delete, insert, update on interfaz_cartera_niif to public;
grant select, delete, insert, update on listapre_usuarios to public;
GRANT EXECUTE ON PROCEDURE CONTABIL_RECICAJA_NIIF TO public;

/* 20140218B */
/* SEPARE RECLASIFICACIONES DE AJUSTES */
ALTER TABLE APERTURA_NIIF_DET
ADD APND_RECLDB T_MONTO;

ALTER TABLE APERTURA_NIIF_DET
ADD APND_RECLCR T_MONTO;

ALTER TABLE APERTURA_NIIF_DET
ADD TERC_NIT T_NIT;

ALTER TABLE APERTURA_NIIF_DET
ADD PROY_COD t_proyecto;

ALTER TABLE APERTURA_NIIF_DET
ADD CENT_COD t_centro;

SET TERM ^ ;

CREATE OR ALTER procedure AJUSTES_APERTURA_NIIF
returns (
    CODIGO varchar(20),
    NOMBRE varchar(60),
    SALDO numeric(18,2),
    RECLASDB numeric(18,2),
    RECLASCR numeric(18,2),
    AJUSTEDB numeric(18,2),
    AJUSTECR numeric(18,2),
    FINAL numeric(18,2),
    CUENTANIIF varchar(20),
    NOMBRENIIF varchar(60),
    RECLASDBN numeric(18,2),
    RECLASCRN numeric(18,2),
    AJUSTEDBN numeric(18,2),
    AJUSTECRN numeric(18,2),
    NUEVO numeric(18,2))
AS
declare variable ANO CHAR(4);
BEGIN
EXECUTE PROCEDURE lee_configuracion('CONTABILIDAD', 'GENERAL', 'AÑO BALANCE DE APERTURA NIIF') returning_values (ANO);
FOR SELECT CUEN_COD, CUEN_NOM, CUEN_EQNIIF FROM CUENTAS WHERE CUEN_AFECTABLE = 'S' AND CUEN_ACTIVA = 'S'
    order by CUEN_COD INTO CODIGO, NOMBRE, CUENTANIIF
DO
  BEGIN
  EXECUTE PROCEDURE SALDO_CUENTA_MES(CODIGO, ANO, 1, 'S') RETURNING_VALUES (SALDO);
  if (cuentaniif <> '') then
      SELECT CUEN_NOM FROM CUENTAS_NIIF WHERE CUEN_COD = :cuentaniif INTO :nombreniif;
  ELSE
      NOMBRENIIF = '';
  /* SUME LOS RECLASIFICACIONES Y AJUSTES NIIF */
  SELECT SUM(APND_RECLDB), SUM(APND_RECLCR) FROM apertura_niif_det WHERE APND_CUENTA = :codigo INTO :reclasdb, :reclascr;
  if (reclasdb IS NULL) then
    reclasdb = 0;
  if (reclascr IS NULL) then
    reclascr = 0;
  SELECT SUM(APND_DEBITO), SUM(APND_CREDITO) FROM apertura_niif_det WHERE APND_CUENTA = :codigo INTO :ajustedb, :ajustecr;
  if (ajustedb IS NULL) then
    ajustedb = 0;
  if (ajustecr IS NULL) then
    ajustecr = 0;
  FINAL = SALDO + (ajustedb+reclasdb) - (ajustecr+reclascr);
  /* LOS AJUSTES DE LA CUENTA NIIF */
  SELECT SUM(APND_RECLDB), SUM(APND_RECLCR) FROM apertura_niif_det WHERE APND_CTANIIF = :cuentaniif INTO :reclasdbn, :reclascrn;
  if (reclasdbn IS NULL) then
    reclasdbn = 0;
  if (reclascrn IS NULL) then
    reclascrn = 0;
  SELECT SUM(APND_DEBITO), SUM(APND_CREDITO) FROM apertura_niif_det WHERE APND_CTANIIF = :cuentaniif INTO :ajustedbn, :ajustecrn;
  if (ajustedbn IS NULL) then
    ajustedbn = 0;
  if (ajustecrn IS NULL) then
    ajustecrn = 0;
  NUEVO = ajustedbn + reclasdbn - (ajustecrn+reclascrn);
  SUSPEND;
  END
END^

SET TERM ; ^

SET TERM ^ ;

create or alter procedure COPIA_CUENTAS_NIIF
as
begin
INSERT INTO CUENTAS_NIIF (CUEN_COD, CUEN_NOM, CUEN_TERCERO, CUEN_CENTRO, CUEN_RETENCION, CUEN_BASEMIN, CUEN_PORC, CUEN_TIPO, CUEN_ACTIVA, CUEN_AFECTABLE)
    SELECT CUEN_COD, CUEN_NOM, CUEN_TERCERO, CUEN_CENTRO, CUEN_RETENCION, CUEN_BASEMIN, CUEN_PORC, CUEN_TIPO, CUEN_ACTIVA, CUEN_AFECTABLE FROM CUENTAS C
    WHERE C.CUEN_ACTIVA = 'S' order by cuen_cod;
UPDATE CUENTAS SET CUEN_EQNIIF = CUEN_COD WHERE CUEN_EQNIIF IS NULL;
end^

SET TERM ; ^

GRANT EXECUTE ON PROCEDURE copia_cuentas_niif TO PUBLIC;

SET TERM ^ ;

create or alter procedure BALANCE_FINAL_DET (
    ANO char(4),
    MES integer,
    SIN_MOV char(1))
returns (
    CODIGO varchar(20),
    NIT varchar(20),
    PROY varchar(4),
    CENTRO varchar(4),
    SALDO numeric(18,2),
    CUENTANIIF varchar(20))
AS
BEGIN
FOR SELECT CUEN_COD, CUEN_EQNIIF FROM CUENTAS WHERE CUEN_ACTIVA = 'S' AND CUEN_AFECTABLE = 'S' order by CUEN_COD
    INTO CODIGO, CUENTANIIF
DO
  BEGIN
  FOR SELECT PROY_COD, CENT_COD FROM centros INTO :proy, :centro
    DO
    BEGIN
    FOR SELECT CODIGO, FINAL FROM balance_centro_tercero_mes(:CODIGO, :proy,  :centro, :ano, :mes)
        INTO :NIT, :SALDO
        DO
        BEGIN
        if ((SIN_MOV = 'S') or (SALDO <> 0))  then
            SUSPEND;
        END
    END
  END
END^

SET TERM ; ^

GRANT EXECUTE ON PROCEDURE balance_final_det TO PUBLIC;

SET TERM ^ ;

CREATE OR ALTER TRIGGER SALDOS_INICIALES_NIIF_AD FOR SALDOS_INICIALES_NIIF
ACTIVE AFTER DELETE POSITION 0
AS
declare variable CUENTA VARCHAR(20);
DECLARE VARIABLE ANO VARCHAR(4);
DECLARE VARIABLE MES VARCHAR(2);
DECLARE VARIABLE INICIAL VARCHAR(10);
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';

/* Actualice los saldos de fechas igual y posteriores */
UPDATE SALDOS_CUENTAS_NIIF
    SET SACU_SALDO = SACU_SALDO - OLD.SAIN_DEBITO + OLD.SAIN_CREDITO
    WHERE (CUEN_COD = OLD.CUEN_COD) AND (SACU_FECHA >= :INICIAL);
UPDATE SALDOS_TERCEROS_NIIF
  SET SATE_SALDO = SATE_SALDO - OLD.SAIN_DEBITO + OLD.SAIN_CREDITO
  WHERE (CUEN_COD = OLD.CUEN_COD) AND (TERC_NIT = OLD.TERC_NIT) AND (SACU_FECHA >= :INICIAL);
UPDATE SALDOS_CENTROS_NIIF
  SET SACE_SALDO = SACE_SALDO - OLD.SAIN_DEBITO + OLD.SAIN_CREDITO
  WHERE (CUEN_COD = OLD.CUEN_COD) AND (PROY_COD = OLD.PROY_COD) AND (CENT_COD = OLD.CENT_COD) AND (SACU_FECHA >= :INICIAL);
UPDATE saldos_centros_tercero_NIIF
  SET SACT_SALDO = SACT_SALDO - OLD.SAIN_DEBITO + OLD.SAIN_CREDITO
  WHERE (CUEN_COD = OLD.CUEN_COD) AND (PROY_COD = OLD.PROY_COD) AND (CENT_COD = OLD.CENT_COD) AND (TERC_NIT = OLD.TERC_NIT) AND (SACU_FECHA >= :INICIAL);
CUENNIT = OLD.cuen_cod || '-' || OLD.terc_nit;
INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD, AUDI_TICO)
    VALUES (USER, 1007, OLD.sain_item, 'U', SUBSTRING(:CUENNIT FROM 1 FOR 20), NULL);
END^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER TRIGGER SALDOS_INICIALES_NIIF_AU FOR SALDOS_INICIALES_NIIF
ACTIVE AFTER UPDATE POSITION 0
as
declare variable ANO varchar(4);
declare variable MES varchar(2);
declare variable INICIAL varchar(10);
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';
/* Actualice los saldos de fechas igual o posteriores */
update SALDOS_CUENTAS_NIIF
  set SACU_SALDO = SACU_SALDO - old.SAIN_DEBITO + old.SAIN_CREDITO
where (CUEN_COD = old.CUEN_COD) and (SACU_FECHA >= :INICIAL);
update SALDOS_TERCEROS_NIIF
  set SATE_SALDO = SATE_SALDO - old.SAIN_DEBITO + old.SAIN_CREDITO
  where (CUEN_COD = old.CUEN_COD) and (TERC_NIT = old.TERC_NIT) and (SACU_FECHA >= :INICIAL);
update SALDOS_CENTROS_NIIF
  set SACE_SALDO = SACE_SALDO - old.SAIN_DEBITO + old.SAIN_CREDITO
  where (CUEN_COD = old.CUEN_COD) and (PROY_COD = old.PROY_COD) and (CENT_COD = old.CENT_COD) and (SACU_FECHA >= :INICIAL);
update SALDOS_CENTROS_TERCERO_NIIF
  set SACT_SALDO = SACT_SALDO - old.SAIN_DEBITO + old.SAIN_CREDITO
  where (CUEN_COD = old.CUEN_COD) and (PROY_COD = old.PROY_COD) and (CENT_COD = old.CENT_COD)
  and (TERC_NIT = old.TERC_NIT) and (SACU_FECHA >= :INICIAL);
/* REGISTRE LO NUEVO */
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, PROY_COD, CENT_COD, TERC_NIT, SACU_FECHA, SACT_SALDO, SACT_DEBITO, SACT_CREDITO)
      values (new.CUEN_COD, new.PROY_COD, new.CENT_COD, NEW.terc_nit, :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
/* 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);
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, 'U', SUBSTRING(:CUENNIT FROM 1 FOR 20), NULL);
end^

SET TERM ; ^

/* 20140219 */
/* FALTABA EL PROCEDIMIENTO */
SET TERM ^ ;

create or alter procedure SALDO_CENTRO_MES_NIIF (
    CUENTA varchar(20),
    PROY varchar(4),
    CENTRO varchar(4),
    ANO char(4),
    MES integer,
    INICIAL char(1))
returns (
    SALDO numeric(18,2))
AS
DECLARE VARIABLE FECAUX CHAR(8);
declare variable LG INTEGER;
declare variable CUENTAUX VARCHAR(20);
declare variable SALDOAUX NUMERIC(18,2);
BEGIN
LG = STRLEN(CUENTA);
IF (INICIAL = 'N') THEN
  MES = MES + 1;
EXECUTE PROCEDURE COMPONE_FECHA_CONTA(ANO, MES, 1) returning_values(FECAUX);
EXECUTE PROCEDURE FECHA_Y_NUMERO_CONTA(FECAUX, -1) RETURNING_VALUES (FECAUX);
SALDO = 0;
FOR SELECT DISTINCT CUEN_COD FROM saldos_centros_niif WHERE SUBSTR(CUEN_COD,1,:LG) = :CUENTA AND PROY_COD = :PROY AND CENT_COD = :CENTRO INTO :CUENTAUX
    DO
    BEGIN
    SELECT FIRST 1 (SACE_SALDO+SACE_DEBITO-SACE_CREDITO) FROM saldos_centros_niif
        WHERE CUEN_COD = :CUENTAUX AND PROY_COD = :PROY AND CENT_COD = :CENTRO AND SACU_FECHA <= :FECAUX
        ORDER BY CUEN_COD DESC, PROY_COD DESC, CENT_COD DESC, SACU_FECHA DESC
        INTO SALDOAUX;
    IF (SALDOAUX IS NULL) THEN
        SALDOAUX = 0;
    SALDO = SALDO + SALDOAUX;
    END
SUSPEND;
END^

SET TERM ; ^

GRANT EXECUTE ON PROCEDURE saldo_centro_mes_niif TO PUBLIC;

/* 20140221 */
/* triggers cambio_costo */

SET TERM ^ ;

create trigger CAMBIO_COSTO_BI for CAMBIO_COSTO
active BEFORE INSERT position 0
as
declare variable NUMERO VARCHAR(8);
declare variable AUTOM CHAR(1);
declare variable EXISTE CHAR(1);
BEGIN
if (NEW.numok = 'N') then
  BEGIN
  /* Actualice el contador del prefijo */
  SELECT PREF_ACTUAL, PREF_AUTO FROM PREFIJOS WHERE TIDO_COD = 10 AND PREF_PRE = NEW.PREF_PRE INTO :NUMERO, :AUTOM;
  /* ACTUALICE EL NUMERO EN COMPROBANTE_ENCABEZADO  */
  if (AUTOM = 'S') then
    BEGIN
    NEW.caco_numero = NUMERO;
    NUMERO = CAST((CAST(NUMERO AS INTEGER) + 1) AS CHAR(6));
    UPDATE PREFIJOS
      SET PREF_ACTUAL = :NUMERO
    WHERE TIDO_COD = 10 AND PREF_PRE = NEW.PREF_PRE;
    END
  ELSE
    BEGIN
    if (CAST(NUMERO AS INTEGER) = CAST(NEW.caco_numero AS INTEGER)) then
        UPDATE PREFIJOS
          SET PREF_ACTUAL = CAST((CAST(PREF_ACTUAL AS INTEGER) + 1) AS CHAR(6))
        WHERE TIDO_COD = 10 AND PREF_PRE = NEW.PREF_PRE;
    END
  EXECUTE PROCEDURE COMPLETA_CEROS (NEW.caco_numero) returning_values (NEW.caco_numero);
  NEW.numok = 'S';
  END
/* Verifique que el numero no existe previamente */
EXISTE = 'N';
SELECT 'S' FROM cambio_costo WHERE PREF_PRE = NEW.PREF_PRE AND CACO_NUMERO = NEW.caco_numero INTO :EXISTE;
if (EXISTE = 'S') then
    EXCEPTION DOCUMENTO_REGISTRADO 'Ya existe un cambio de costo con el número ' || new.pref_pre || new.caco_numero;
end^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER TRIGGER CAMBIO_COSTO_AI FOR CAMBIO_COSTO
ACTIVE AFTER INSERT POSITION 0
as
declare variable CODBOD VARCHAR(2);
declare variable SALDO NUMERIC(18,2);
declare variable ESLOTE CHAR(1);
declare variable LOTE VARCHAR(20);
begin
IF ((NEW.caco_id <> 0) AND (NEW.caco_anulado = 'N')) THEN
  BEGIN
  FOR SELECT BODE_COD FROM BODEGA INTO :CODBOD
    do
    BEGIN
    EXECUTE PROCEDURE saldo_inventario(NEW.ARTI_COD, :CODBOD, NEW.CACO_FECHA) returning_values (:SALDO);
    if (SALDO <> 0) then
      BEGIN
      SELECT ARTI_EXIST FROM ARTICULO WHERE ARTI_COD = NEW.ARTI_COD INTO :ESLOTE;
      if (ESLOTE = 'L') then
        begin
        for select LOTE, SALDO from saldo_lotes_fecha(new.arti_cod, :codbod, new.caco_fecha)
            into :lote, :saldo
            do
            INSERT INTO MOVIMIENTO_ARTICULO
                (ARTI_COD, BODE_COD, MVAR_FECHA, MVAR_TIPODOC, MVAR_IDREF, MVAR_CONC, MVAR_CANT, MVAR_COSTO, MVAR_ENTRADA, MVAR_LOTE, MVAR_PREF, MVAR_NUMERO, MVAR_ITEM)
                VALUES(NEW.ARTI_COD, :CODBOD, NEW.CACO_FECHA, 10, NEW.caco_id, new.caco_concepto, :SALDO, NEW.CACO_NVOCOSTO, 'N', :lote, new.pref_pre, new.caco_numero, 1);
        end
      else
          INSERT INTO MOVIMIENTO_ARTICULO
            (ARTI_COD, BODE_COD, MVAR_FECHA, MVAR_TIPODOC, MVAR_IDREF, MVAR_CONC, MVAR_CANT, MVAR_COSTO, MVAR_ENTRADA, MVAR_LOTE, MVAR_PREF, MVAR_NUMERO, MVAR_ITEM)
            VALUES(NEW.ARTI_COD, :CODBOD, NEW.CACO_FECHA, 10, NEW.caco_id, new.caco_concepto, :SALDO, NEW.CACO_NVOCOSTO, 'N', null, new.pref_pre, new.caco_numero, 1);
      END
    END
  INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
    VALUES (USER, 10, NEW.caco_id, 'I', NEW.pref_pre || NEW.caco_numero);
  END
end^

SET TERM ; ^

SET TERM ^ ;

create or alter trigger CAMBIO_COSTO_AD for CAMBIO_COSTO
active AFTER DELETE position 0
as
declare variable consec INTEGER;
begin
DELETE FROM MOVIMIENTO_ARTICULO WHERE (mvar_tipodoc = 10) and (mvar_idref = old.caco_id) and (mvar_item = 1);
select enco_consec from comprobante_encabezado where enco_tiporef = 10 and enco_idref = old.caco_id into :consec;
if (NOT consec is null) then
 delete from comprobante_detalle where enco_consec = :consec;
delete from comprobante_encabezado where enco_tiporef = 10 and enco_idref = old.caco_id;
INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
    VALUES (USER, 10, OLD.caco_id, 'D', OLD.pref_pre || OLD.caco_numero);
end^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER TRIGGER CAMBIO_COSTO_AU FOR CAMBIO_COSTO
ACTIVE AFTER UPDATE POSITION 0
as
declare variable consec INTEGER;
declare variable CODBOD VARCHAR(2);
declare variable SALDO NUMERIC(18,2);
declare variable ESLOTE CHAR(1);
declare variable LOTE VARCHAR(20);
BEGIN
/* BORRE LA CONTABILIZACION */
if (NEW.caco_anulado = 'S') then
    BEGIN
    select enco_consec from comprobante_encabezado where enco_tiporef = 10 and enco_idref = old.caco_id into :consec;
    if (NOT consec is null) then
      delete from comprobante_detalle where enco_consec = :consec;
    delete from comprobante_encabezado where enco_tiporef = 10 and enco_idref = old.caco_id;
    DELETE FROM MOVIMIENTO_ARTICULO WHERE (mvar_tipodoc = 10) and (mvar_idref = new.caco_id) and (mvar_item = 1);
    INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
        VALUES (USER, 10, NEW.caco_id, 'A', NEW.pref_pre || NEW.caco_numero);
    END
ELSE
    BEGIN
    if ((OLD.caco_id <> 0) AND (OLD.caco_anulado = 'N')) then
        DELETE FROM MOVIMIENTO_ARTICULO WHERE (mvar_tipodoc = 10) and (mvar_idref = new.caco_id) and (mvar_item = 1);
    if ((NEW.caco_id <> 0) AND (NEW.caco_anulado = 'N')) then
      begin
      FOR SELECT BODE_COD FROM BODEGA INTO :CODBOD
        do
        BEGIN
        EXECUTE PROCEDURE saldo_inventario(NEW.ARTI_COD, :CODBOD, NEW.CACO_FECHA) returning_values (:SALDO);
        if (SALDO <> 0) then
          BEGIN
          SELECT ARTI_EXIST FROM ARTICULO WHERE ARTI_COD = NEW.ARTI_COD INTO :ESLOTE;
          if (ESLOTE = 'L') then
            begin
            for select LOTE, SALDO from saldo_lotes_fecha(new.arti_cod, :codbod, new.caco_fecha)
                into :lote, :saldo
                do
                INSERT INTO MOVIMIENTO_ARTICULO
                    (ARTI_COD, BODE_COD, MVAR_FECHA, MVAR_TIPODOC, MVAR_IDREF, MVAR_CONC, MVAR_CANT, MVAR_COSTO, MVAR_ENTRADA, MVAR_LOTE, MVAR_PREF, MVAR_NUMERO, MVAR_ITEM)
                    VALUES(NEW.ARTI_COD, :CODBOD, NEW.CACO_FECHA, 10, NEW.caco_id, new.caco_concepto, :SALDO, NEW.CACO_NVOCOSTO, 'N', :lote, new.pref_pre, new.caco_numero, 1);
            end
          else
              INSERT INTO MOVIMIENTO_ARTICULO
                (ARTI_COD, BODE_COD, MVAR_FECHA, MVAR_TIPODOC, MVAR_IDREF, MVAR_CONC, MVAR_CANT, MVAR_COSTO, MVAR_ENTRADA, MVAR_LOTE, MVAR_PREF, MVAR_NUMERO, MVAR_ITEM)
                VALUES(NEW.ARTI_COD, :CODBOD, NEW.CACO_FECHA, 10, NEW.caco_id, new.caco_concepto, :SALDO, NEW.CACO_NVOCOSTO, 'N', null, new.pref_pre, new.caco_numero, 1);
          END
        END
      end
    INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
        VALUES (USER, 10, NEW.caco_id, 'U', NEW.pref_pre || NEW.caco_numero);
    END
end^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER TRIGGER MOVIMIENTO_ARTICULO_BI FOR MOVIMIENTO_ARTICULO
ACTIVE BEFORE INSERT POSITION 0
AS
declare variable LOTE CHAR(1);
declare variable ENSAMBLE CHAR(1);
declare variable IDENS INTEGER;
declare variable PREFENS VARCHAR(4);
declare variable unidad varchar(8);
declare variable DESCR varchar(60);
declare variable CODPR varchar(15);
declare variable DESPR varchar(60);
declare variable UNIPR varchar(8);
declare variable CANTPR double precision;
declare variable FACTOR numeric(18,4);
declare variable COSTO numeric(18,2);
declare variable COSTOTOT numeric(18,2);
declare variable PORCPR numeric(9,4);
declare variable MERMAPR numeric(9,4);
declare variable PESO numeric(18,4);
declare variable PESOPR numeric(18,4);
declare variable ITEM INTEGER;
declare variable IVA NUMERIC(9,4);
declare variable IVAM NUMERIC(18,2);
declare variable CONSUMO NUMERIC(18,2);
declare variable TOTAL float;
declare variable SALDO NUMERIC(18,4);
declare variable ESTADO CHAR(1);
declare variable DISCRENS CHAR(2);
BEGIN
/* INSERTE EL NUEVO LOTE */
if (NEW.mvar_cant IS NULL) then
    NEW.mvar_cant = 0;
SELECT ARTI_EXIST, ESAR_COD
    FROM   ARTICULO
    WHERE  ARTICULO.ARTI_COD = NEW.ARTI_COD
    INTO :LOTE, :ESTADO;
if (ESTADO = 'I') then
    exception ARTICULO_INACTIVO 'El artículo ' || new.arti_cod || ' esta inactivo.';

if (LOTE = 'L') then
    BEGIN
      if ((NEW.mvar_lote IS NULL) or (NEW.mvar_lote = '')) then
        if (new.mvar_entrada = 'S') then
            new.mvar_lote = cast(new.mvar_cons as varchar(15));
        else
            begin
            /* NO HAY LOTE, ENTONCES CALCULELO SEGUN CONFIGURACION */
            EXCEPTION LOTE_NEGATIVO 'No se indicó un lote para el artículo ' || new.arti_cod;
            end
    END
if (new.mvar_tipodoc <> 10) then
    begin
    /* ENSAMBLE EL PRODUCTO */
    SELECT ARTI_ENSAMBLE, ARTI_UNIDAD, ARTI_DES, ARTI_PESO
    FROM ARTICULO WHERE ARTI_COD = NEW.arti_cod INTO :ensamble, :unidad, :descr, :peso;
    execute procedure lee_configuracion('FACTURACION', 'DOCUMENTOS', 'DISCRIMINAR COMPONENTES EN ENSAMBLES AUTOMATICOS FACTURADOS') returning_values (:discrens);
    if ((:discrens <> 'SI') or ((NEW.mvar_tipodoc <> 31) AND (NEW.mvar_tipodoc <> 32))) then
    if ((NEW.mvar_entrada = 'N') AND (ENSAMBLE = 'S')) then
        BEGIN
        /* verifique si la existecia es insufieciente */
        execute procedure saldo_inventario(new.arti_cod, new.bode_cod, new.mvar_fecha) returning_values (:saldo);
        if (NEW.mvar_cant > :SALDO) then
            BEGIN
            if (SALDO > 0) then
                SALDO = NEW.mvar_cant - :SALDO;
            else
                SALDO = NEW.mvar_cant;
            IDENS = gen_id(id_ensamble, 1);
            EXECUTE PROCEDURE lee_configuracion('INVENTARIO', 'ENSAMBLES', 'PREFIJO PARA ENSAMBLES AUTOMATICOS AL SACAR PRODUCTOS') returning_values (:prefens);
            /* CALCULE EL COSTO TOTAL DEL ENSAMBLE */
            select sum(arpr_porc) from articulos_producto where arti_cod = NEW.arti_cod into :total;
            COSTOTOT = 0;
            FOR SELECT ARPR_CANT, ARPR_UNIDAD, ARPR_COMP, ARPR_PORC, ARPR_MERMA, ARTI_PESO
                FROM articulos_producto P, ARTICULO A
                WHERE P.ARTI_COD = NEW.arti_cod AND A.arti_cod = P.arpr_comp
                INTO :CANTPR, :UNIPR, :CODPR, :PORCPR, :MERMAPR, :PESOPR
                DO
                BEGIN
                EXECUTE PROCEDURE factor_unidad_cant(:codpr, :unipr) returning_values (:factor);
                EXECUTE PROCEDURE costo_promedio_unidad (:codpr, NEW.mvar_fecha, :UNIPR) returning_values (:COSTO);
                IVAM = costo * cantpr * iva / 100;
                if (((cantpr is null) or (cantpr = 0)) AND (porcpr IS NOT NULL) AND (porcpr <> 0)) then
                    BEGIN
                    /* ES PORCENTUAL AL PESO LA MEZCLA SOBRE EL 1ER ARTICULO */
                    CANTPR = :SALDO * PESO;
                    CANTPR = CANTPR / TOTAL * porcpr; /* APLICA LA PROPORCION */
                    if ((mermapr IS NOT NULL) AND (mermapr <> 0)) then
                        CANTPR = CANTPR * (100 + mermapr) / 100;
                    END
                ELSE
                    BEGIN
                    CANTPR = CANTPR * :SALDO;
                    END
                COSTOTOT = COSTOTOT + COSTO * CANTPR;
                END
            if (NEW.mvar_cant <> 0) then
                COSTO = costotot / NEW.mvar_cant;
            else
                COSTO = 0;
            INSERT INTO ENSAMBLES(ENSA_ID, TIDO_COD, PREF_PRE, BODE_COD, ENSA_NUMERO, ENSA_FECHA, ENSA_CONC, ENSA_REFER, ENSA_CANT, ENSA_UNIDAD, ENSA_FACTOR, ENSA_ANULADO, ENSA_TRANSMIT,
                ARTI_COD, ENSA_DESC, ENSA_CODBAR, ENSA_LOTE, ENSA_OBS, TERC_NIT, ENSA_USUARIO, NUMOK, ENSA_COSTO, LOTE_VENCE, ENSA_CODRETAL, ENSA_CANTRETAL, ENSA_OPER, ENSA_MAQUINA, ENSA_PESO, ENSA_BODRETAL, ENSA_TIPOREF, ENSA_IDREF,ENSA_ITEMREF)
                VALUES (:IDENS, 15, :prefens, NEW.bode_cod, '000001', new.mvar_fecha, new.mvar_conc, '', :SALDO, :unidad, 1, 'N', 'N',
                NEW.arti_cod, :descr, NEW.arti_cod, NEW.mvar_lote, NULL, NULL, USER, 'N', :costo, NULL, NULL, 0, null,  NULL, 0, NEW.bode_cod, NEW.mvar_tipodoc, NEW.mvar_idref, NEW.mvar_item);
            /* LOS DETALLES DEL ENSAMBLE */
            ITEM = 0;
            FOR SELECT ARPR_CANT, ARPR_UNIDAD, ARPR_COMP, ARTI_DES, TAIV_PORC, ARTI_CONSUMO, ARPR_PORC, ARPR_MERMA, ARTI_PESO
                FROM articulos_producto P, ARTICULO A, TARIFA_IVA T
                WHERE P.ARTI_COD = NEW.arti_cod AND A.arti_cod = P.arpr_comp AND A.taiv_cod = T.taiv_cod
                INTO :CANTPR, :UNIPR, :CODPR, :DESPR, :IVA, :CONSUMO, :PORCPR, :MERMAPR, :PESOPR
                DO
                BEGIN
                ITEM = ITEM + 1;
                EXECUTE PROCEDURE factor_unidad_cant(:codpr, :unipr) returning_values (:factor);
                EXECUTE PROCEDURE costo_promedio_unidad (:codpr, NEW.mvar_fecha, :UNIPR) returning_values (:COSTO);
                IVAM = costo * cantpr * iva / 100;
                if (((cantpr is null) or (cantpr = 0)) AND (porcpr IS NOT NULL) AND (porcpr <> 0)) then
                    BEGIN
                    /* ES PORCENTUAL AL PESO LA MEZCLA SOBRE EL 1ER ARTICULO */
                    CANTPR = :SALDO * PESO;
                    CANTPR = CANTPR / TOTAL * porcpr; /* APLICA LA PROPORCION */
                    if ((mermapr IS NOT NULL) AND (mermapr <> 0)) then
                        CANTPR = CANTPR * (100 + mermapr) / 100;
        /*                CANTPR = CANTPR / pesopr; /* LO LLEVA A LA UNIDAD PRINCIPAL */
                    UNIPR = 'GRAMO';
                    END
                ELSE
                    BEGIN
                    CANTPR = CANTPR * :SALDO; /* * pesopr * FACTOR; */
                    END
                INSERT INTO ENSAMBLES_DETALLE(ENSA_ID, ESDE_ITEM, ARTI_COD, BODE_COD, ESDE_CANT, ESDE_UNIDAD, ESDE_COSTO, ESDE_LOTE, ESDE_FACTOR, ESDE_IVAPORC, ESDE_IVAMONTO, ESDE_CONSUMO, ESDE_CODBAR, ESDE_ANULADO, ESDE_TRANSMIT, ESDE_DESC, ESDE_TOTAL, ESDE_PESO)
                    VALUES (:idens, :ITEM, :codpr,  NEW.bode_cod, :cantpr, :unipr, :costo, NULL, :FACTOR, :IVA, :ivam, :consumo, :codpr, 'N', 'N', :despr, :COSTO * :cantpr, 0);
                END
            END
        END
    end
if (new.mvar_cons is null) then
    NEW.mvar_cons = GEN_ID(ID_MOVARTI,1);
END^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER TRIGGER MOVIMIENTO_ARTICULO_AI FOR MOVIMIENTO_ARTICULO
ACTIVE AFTER INSERT POSITION 0
AS
declare variable LOTE CHAR(1);
declare variable ENSAMBLE CHAR(1);
declare variable IDENS INTEGER;
declare variable PREFENS VARCHAR(4);
declare variable unidad varchar(8);
declare variable DESCR varchar(60);
declare variable CODPR varchar(15);
declare variable DESPR varchar(60);
declare variable UNIPR varchar(8);
declare variable CANTPR numeric(18,4);
declare variable FACTOR numeric(18,4);
declare variable COSTO numeric(18,2);
declare variable ITEM INTEGER;
declare variable IVA NUMERIC(9,4);
declare variable IVAM NUMERIC(18,2);
declare variable CONSUMO NUMERIC(18,2);
declare variable NROLOTE VARCHAR(15);
BEGIN
  /* INSERTE EL NUEVO LOTE */
  SELECT ARTI_EXIST FROM ARTICULO WHERE ARTICULO.ARTI_COD = NEW.ARTI_COD INTO :LOTE;
  /* ACTUALICE COSTOS cuando no es transferencia */
  if (new.mvar_tipodoc <> 13) then
      BEGIN
      EXECUTE PROCEDURE actualice_costo(new.arti_cod, new.mvar_fecha, new.mvar_costo, new.mvar_cant, new.mvar_entrada, 'N', new.mvar_cons, new.mvar_tipodoc);
      EXECUTE PROCEDURE chequeo_costos(NEW.arti_cod, NEW.mvar_fecha);
      END
  if (new.mvar_tipodoc <> 10) then
    begin
    /* actualice existencias */
    if (new.mvar_entrada = 'S') then
      BEGIN
      execute procedure sume_existencia(new.arti_cod, new.bode_cod, new.mvar_fecha, new.mvar_cant, 'N');
      if (LOTE = 'L') then
        BEGIN
        if (NEW.MVAR_LOTE IS NULL) then
            EXCEPTION LOTE_OBLIGATORIO 'Debe especificar un número de lote para el articulo ' || new.arti_cod;
        ELSE
          BEGIN
          if (EXISTS (SELECT LOTE_NRO FROM LOTES WHERE ARTI_COD = NEW.ARTI_COD AND BODE_COD = NEW.bode_cod AND LOTE_NRO = new.mvar_lote)) THEN
            UPDATE LOTES
              set lote_saldo = lote_saldo + new.mvar_cant
              where (arti_cod = NEW.ARTI_COD) and (BODE_COD = NEW.bode_cod) and (lote_nro = new.mvar_lote);
          ELSE
            INSERT INTO LOTES (ARTI_COD, BODE_COD, LOTE_NRO, LOTE_FECHA, LOTE_CANT, LOTE_COSTO, LOTE_SALDO)
              VALUES (NEW.ARTI_COD, NEW.bode_cod, NEW.mvar_lote, NEW.mvar_fecha, NEW.mvar_cant, NEW.mvar_costo, NEW.mvar_cant);

          if (EXISTS (SELECT LOTE_NRO FROM EXISTENCIA_LOTE WHERE LOTE_NRO = NEW.MVAR_LOTE AND EXLO_FECHA = NEW.MVAR_FECHA AND ARTI_COD = NEW.arti_cod AND BODE_COD = NEW.bode_cod)) then
            BEGIN
            UPDATE EXISTENCIA_LOTE
                SET EXLO_ENT = EXLO_ENT + NEW.mvar_cant
                WHERE LOTE_NRO = NEW.MVAR_LOTE AND EXLO_FECHA = NEW.MVAR_FECHA AND ARTI_COD = NEW.ARTI_COD AND BODE_COD = NEW.bode_cod;
            END
          ELSE
            BEGIN
            INSERT INTO EXISTENCIA_LOTE (ARTI_COD, BODE_COD, LOTE_NRO, EXLO_FECHA, EXLO_SAL, EXLO_ENT)
                VALUES (NEW.ARTI_COD, NEW.bode_cod, NEW.MVAR_LOTE, NEW.MVAR_FECHA, 0, NEW.MVAR_CANT);
            END
          END
        END
      if (NEW.mvar_tipodoc = 33) then
        BEGIN
        SELECT ARTI_ENSAMBLE, ARTI_UNIDAD, ARTI_DES FROM ARTICULO WHERE ARTI_COD = NEW.arti_cod
            INTO :ensamble, :unidad, :descr;
        if (ENSAMBLE = 'S') then
            BEGIN
            /* DESENSAMBLE EL PRODUCTO DEVUELTO */
            IDENS = gen_id(id_desensamble, 1);
            EXECUTE PROCEDURE lee_configuracion('INVENTARIO', 'ENSAMBLES', 'PREFIJO PARA ENSAMBLES AUTOMATICOS AL SACAR PRODUCTOS') returning_values (:prefens);
            INSERT INTO DESENSAMBLES(DESE_ID, TIDO_COD, PREF_PRE, BODE_COD, DESE_NUMERO, DESE_FECHA, DESE_CONC, DESE_REFER, DESE_CANT, DESE_UNIDAD, DESE_FACTOR, DESE_ANULADO, DESE_TRANSMIT,
                ARTI_COD, DESE_DESC, DESE_CODBAR, DESE_LOTE, DESE_OBS, TERC_NIT, DESE_USUARIO, NUMOK, DESE_TIPOREF, DESE_IDREF, DESE_ITEMREF)
                VALUES (:IDENS, 16, :prefens, NEW.bode_cod, '000001', new.mvar_fecha, new.mvar_conc, '', new.mvar_cant, :unidad, 1, 'N', 'N',
                NEW.arti_cod, :descr, NEW.arti_cod, NEW.mvar_lote, NULL, NULL, USER, 'N', NEW.mvar_tipodoc, NEW.mvar_idref, NEW.mvar_item);
            ITEM = 0;
            FOR SELECT ARPR_CANT, ARPR_UNIDAD, ARPR_COMP, ARTI_DES, TAIV_PORC, ARTI_CONSUMO
                FROM articulos_producto P, ARTICULO A, TARIFA_IVA T
                WHERE P.ARTI_COD = NEW.arti_cod AND A.arti_cod = P.arpr_comp AND A.taiv_cod = T.taiv_cod
                INTO :CANTPR, :UNIPR, :CODPR, :DESPR, :IVA, :CONSUMO
                DO
                BEGIN
                ITEM = ITEM + 1;
                EXECUTE PROCEDURE factor_unidad_cant(:codpr,  :unipr) returning_values (:FACTOR);
                EXECUTE PROCEDURE costo_promedio_unidad (:codpr, NEW.mvar_fecha, :UNIPR) returning_values (:COSTO);
                IVAM = costo * cantpr * iva / 100;
                SELECT ARTI_EXIST FROM ARTICULO WHERE ARTI_COD = :codpr INTO :LOTE;
                if (LOTE = 'L') then
                    begin
                    if ((new.mvar_lote is not null) and (new.mvar_lote <> '')) then
                        SELECT MIN(ESDE_LOTE) FROM ENSAMBLES_DETALLE D, ENSAMBLES E WHERE E.ensa_id = D.ensa_id AND
                            E.arti_cod = NEW.arti_cod AND E.ensa_lote = NEW.mvar_lote AND D.arti_cod = :codpr INTO :nrolote;
                    else
                        SELECT first 1 ESDE_LOTE FROM ENSAMBLES_DETALLE D, ENSAMBLES E WHERE E.ensa_id = D.ensa_id AND
                            E.arti_cod = NEW.arti_cod AND E.ensa_fecha <= NEW.mvar_fecha AND D.arti_cod = :codpr
                            order by ensa_fecha desc INTO :nrolote;
                    end
                else
                    nrolote = '';
                INSERT INTO desensambles_detalle(DESE_ID, DESE_ITEM, ARTI_COD, BODE_COD, DEDE_CANT, DEDE_UNIDAD, DEDE_COSTO, DEDE_LOTE, DEDE_FACTOR, DEDE_IVAPORC, DEDE_IVAMONTO, DEDE_CONSUMO, DEDE_CODBAR, DEDE_ANULADO, DEDE_TRANSMIT, DEDE_DESC, DEDE_TOTAL, DEDE_OBS)
                    VALUES (:idens, :ITEM, :codpr,  NEW.bode_cod, :cantpr * NEW.mvar_cant, :unipr, :costo, :nrolote, :FACTOR, :IVA, :ivam, :consumo, :codpr, 'N', 'N', :despr, :COSTO * :cantpr, NULL);
                END
            END
        END
      END
    else
      BEGIN
      execute procedure reste_existencia(new.arti_cod, new.bode_cod, new.mvar_fecha, new.mvar_cant, 'N');
      /* ACTUALICE LA EXISTENCIA DEL LOTE */
      if (LOTE = 'L') then
        if (NEW.mvar_lote IS NULL) then
          EXCEPTION LOTE_NEGATIVO 'Debe indicar un número de lote para el artículo ' || new.arti_cod;
        ELSE
          BEGIN
          /* Actualice el saldo historico del lote */
          if (EXISTS (SELECT LOTE_NRO FROM EXISTENCIA_LOTE WHERE LOTE_NRO = NEW.MVAR_LOTE AND EXLO_FECHA = NEW.MVAR_FECHA AND ARTI_COD = NEW.arti_cod AND BODE_COD = NEW.bode_cod)) then
            BEGIN
            UPDATE EXISTENCIA_LOTE
                SET EXLO_SAL = EXLO_SAL + NEW.mvar_cant
                WHERE LOTE_NRO = NEW.MVAR_LOTE AND EXLO_FECHA = NEW.MVAR_FECHA AND ARTI_COD = NEW.ARTI_COD AND BODE_COD = NEW.bode_cod;
            END
          ELSE
            BEGIN
            INSERT INTO EXISTENCIA_LOTE (ARTI_COD, BODE_COD, LOTE_NRO, EXLO_FECHA, EXLO_SAL, EXLO_ENT)
                VALUES (NEW.ARTI_COD, NEW.bode_cod, NEW.MVAR_LOTE, NEW.MVAR_FECHA, NEW.MVAR_CANT, 0);
            END
          if (EXISTS (SELECT LOTE_NRO FROM LOTES WHERE ARTI_COD = NEW.ARTI_COD AND BODE_COD = NEW.bode_cod AND LOTE_NRO = new.mvar_lote)) THEN
            UPDATE LOTES
              set lote_saldo = lote_saldo - new.mvar_cant
              where (arti_cod = NEW.ARTI_COD) and (BODE_COD = NEW.bode_cod) and (lote_nro = new.mvar_lote);
          else
            EXCEPTION LOTE_NEGATIVO 'No se encontró el lote ' || new.mvar_lote || ' para el articulo ' || new.arti_cod;
          END
      if (NEW.mvar_cant < 0) then
        BEGIN
        SELECT ARTI_ENSAMBLE, ARTI_UNIDAD, ARTI_DES FROM ARTICULO WHERE ARTI_COD = NEW.arti_cod
            INTO :ensamble, :unidad, :descr;
        if (ENSAMBLE = 'S') then
            BEGIN
            /* DESENSAMBLE EL PRODUCTO DEVUELTO */
            IDENS = gen_id(id_desensamble, 1);
            EXECUTE PROCEDURE lee_configuracion('INVENTARIO', 'ENSAMBLES', 'PREFIJO PARA ENSAMBLES AUTOMATICOS AL SACAR PRODUCTOS') returning_values (:prefens);
            INSERT INTO DESENSAMBLES(DESE_ID, TIDO_COD, PREF_PRE, BODE_COD, DESE_NUMERO, DESE_FECHA, DESE_CONC, DESE_REFER, DESE_CANT, DESE_UNIDAD, DESE_FACTOR, DESE_ANULADO, DESE_TRANSMIT,
                ARTI_COD, DESE_DESC, DESE_CODBAR, DESE_LOTE, DESE_OBS, TERC_NIT, DESE_USUARIO, NUMOK, DESE_TIPOREF, DESE_IDREF, DESE_ITEMREF)
                VALUES (:IDENS, 16, :prefens, NEW.bode_cod, '000001', new.mvar_fecha, new.mvar_conc, '', (new.mvar_cant*-1), :unidad, 1, 'N', 'N',
                NEW.arti_cod, :descr, NEW.arti_cod, NEW.mvar_lote, NULL, NULL, USER, 'N', NEW.mvar_tipodoc, NEW.mvar_idref, NEW.mvar_item);
            ITEM = 0;
            FOR SELECT ARPR_CANT, ARPR_UNIDAD, ARPR_COMP, ARTI_DES, TAIV_PORC, ARTI_CONSUMO FROM articulos_producto P, ARTICULO A, TARIFA_IVA T
                WHERE P.ARTI_COD = NEW.arti_cod AND A.arti_cod = P.arpr_comp AND A.taiv_cod = T.taiv_cod
                INTO :CANTPR, :UNIPR, :CODPR, :DESPR, :IVA, :CONSUMO
                DO
                BEGIN
                ITEM = ITEM + 1;
                EXECUTE PROCEDURE factor_unidad_cant(:codpr,  :unipr) returning_values (:FACTOR);
                EXECUTE PROCEDURE costo_promedio_unidad (:codpr, NEW.mvar_fecha, :UNIPR) returning_values (:COSTO);
                IVAM = costo * cantpr * iva / 100;
                SELECT ARTI_EXIST FROM ARTICULO WHERE ARTI_COD = :codpr INTO :LOTE;
                if (LOTE = 'L') then
                    begin
                    if ((new.mvar_lote is not null) and (new.mvar_lote <> '')) then
                        SELECT MIN(ESDE_LOTE) FROM ENSAMBLES_DETALLE D, ENSAMBLES E WHERE E.ensa_id = D.ensa_id AND
                            E.arti_cod = NEW.arti_cod AND E.ensa_lote = NEW.mvar_lote AND D.arti_cod = :codpr INTO :nrolote;
                    else
                        SELECT first 1 ESDE_LOTE FROM ENSAMBLES_DETALLE D, ENSAMBLES E WHERE E.ensa_id = D.ensa_id AND
                            E.arti_cod = NEW.arti_cod AND E.ensa_fecha <= NEW.mvar_fecha AND D.arti_cod = :codpr
                            order by ensa_fecha desc INTO :nrolote;
                    end
                else
                    nrolote = '';
                INSERT INTO desensambles_detalle(DESE_ID, DESE_ITEM, ARTI_COD, BODE_COD, DEDE_CANT, DEDE_UNIDAD, DEDE_COSTO, DEDE_LOTE, DEDE_FACTOR, DEDE_IVAPORC, DEDE_IVAMONTO, DEDE_CONSUMO, DEDE_CODBAR, DEDE_ANULADO, DEDE_TRANSMIT, DEDE_DESC, DEDE_TOTAL, DEDE_OBS)
                    VALUES (:idens, :ITEM, :codpr,  NEW.bode_cod, :cantpr * NEW.mvar_cant, :unipr, :costo, :nrolote, :FACTOR, :IVA, :ivam, :consumo, :codpr, 'N', 'N', :despr, :COSTO * :cantpr, NULL);
                END
            END
        end
      end
    END
END^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER procedure ACTUALICE_COSTO (
    ARTICULO varchar(15),
    FECHA date,
    COSTO numeric(18,2),
    CANTIDAD numeric(18,4),
    ENTRADA char(1),
    ANULAR char(1),
    IDMOV integer,
    TIPO integer)
AS
DECLARE VARIABLE exart CHAR(1);
DECLARE VARIABLE COSTOP NUMERIC(18,2);
DECLARE VARIABLE UCOSTO NUMERIC(18,2);
declare variable SALDOC NUMERIC(15,4);
declare variable BASE VARCHAR(10);
declare variable PRMIN NUMERIC(18, 2);
BEGIN
/* Verfique si el artículo tiene control de existencias */
SELECT arti_exist FROM articulo WHERE arti_COD = :articulo INTO :exart;
IF (exart <> 'N') THEN
    BEGIN
    if (ANULAR = 'S') then
        BEGIN
        DELETE FROM COSTOS WHERE (arti_cod = :articulo) AND (cost_fecha = :fecha) AND (cost_idmov = :IDMOV) AND (COST_TIPO = :TIPO);
        END
    ELSE
        BEGIN
        SELECT FIRST 1 (cost_saldoc + cost_entc - cost_salc) from costos WHERE (arti_cod = :articulo) AND
            (cost_fecha <= :fecha) ORDER BY ARTI_COD DESC, COST_FECHA DESC, COST_ITEM DESC into :saldoc;
        if (saldoc is null) THEN
            SALDOC = 0;
        if (TIPO = 10) then
          BEGIN
          INSERT INTO COSTOS (arti_cod, cost_fecha, cost_entc, cost_entp, cost_salc, cost_salp,
              cost_saldoc, cost_saldop, cost_ultimo, cost_idmov, cost_tipo)
              VALUES (:articulo, :fecha, 0, 0, 0, 0, :saldoc, :saldoc*:costo, :costo, :IDMOV, :TIPO);
          END
        ELSE
          BEGIN
          EXECUTE PROCEDURE costo_promedio_y_ultimo(:articulo, :fecha) RETURNING_VALUES (:costop, :ucosto);
          if (ENTRADA = 'S') then
            if ((TIPO = 33) or (TIPO = 14))  then
                BEGIN
                INSERT INTO COSTOS (arti_cod, cost_fecha,
                    cost_entc, cost_entp, cost_salc, cost_salp,
                    cost_saldoc, cost_saldop, cost_ultimo, cost_idmov, cost_tipo)
                    VALUES (:articulo, :fecha, :cantidad, :cantidad*:costop, 0, 0, :saldoc, :saldoc*:costop, :ucosto, :IDMOV, :TIPO);
                END
            ELSE
                BEGIN
                UCOSTO = :COSTO;
                INSERT INTO COSTOS (arti_cod, cost_fecha,
                    cost_entc, cost_entp, cost_salc, cost_salp,
                    cost_saldoc, cost_saldop, cost_ultimo, cost_idmov, cost_tipo)
                    VALUES (:articulo, :fecha, :cantidad, :cantidad*:costo, 0, 0, :saldoc, :saldoc*:costop, :costo, :IDMOV, :TIPO);
                EXECUTE PROCEDURE lee_configuracion('FACTURACION','ARTICULOS','COSTO BASE PARA CALCULO DE PRECIOS DE VENTA AUTOMATICOS') returning_values (:BASE);
                if (base = 'ULTIMO') then
                    PRMIN = ucosto;
                ELSE
                    BEGIN
                    PRMIN = COSTOP;
                    if (base = 'MAYOR') then
                        if (COSTOP < UCOSTO) then
                            PRMIN = UCOSTO;
                    END
                UPDATE ARTICULO SET ARTI_PRECIO = :PRMIN WHERE ARTI_COD = :ARTICULO;
                END
          ELSE
            BEGIN
            INSERT INTO COSTOS (arti_cod, cost_fecha,
                cost_entc, cost_entp, cost_salc, cost_salp,
                cost_saldoc, cost_saldop, cost_ultimo, cost_idmov, cost_tipo)
                VALUES (:articulo, :fecha, 0, 0, :cantidad, :cantidad*:costop, :saldoc, :saldoc*:costop, :UCOSTO, :IDMOV, :TIPO);
            END
          END
        END
    END
END^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE CHEQUEO_COSTOS(
    ARTICULO VARCHAR(20),
    FECHA DATE)
AS
DECLARE VARIABLE ID INTEGER;
DECLARE VARIABLE FECMV DATE;
DECLARE VARIABLE CANT NUMERIC(15,4);
DECLARE VARIABLE COSTO NUMERIC(18,2);
DECLARE VARIABLE ENTRADA CHAR(1);
DECLARE VARIABLE TIPO INTEGER;
begin
delete from costos where arti_cod = :ARTICULO AND COST_FECHA > :FECHA;
for select mvar_cons, mvar_fecha, mvar_cant, mvar_costo, mvar_entrada, mvar_tipodoc
    from movimiento_articulo WHERE ARTI_COD = :ARTICULO AND MVAR_FECHA > :FECHA
    order by mvar_fecha, mvar_cons /* SE HACE ESTRICTAMENTE EN ORDEN DE FECHA Y REGISTRO, SI LO EDITAN CAMBIA EL ORDEN */
    into :id, :fecmv, :cant, :costo, :entrada, :tipo
    do
    if ((TIPO <> 13)) then
        EXECUTE PROCEDURE actualice_costo(:ARTICULO, :fecmv, :costo, :cant, :entrada, 'N', :id, :tipo);
end
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE CHEQUEO_INVENTARIO(
    ARTINI VARCHAR(20),
    ARTFIN VARCHAR(20))
AS
DECLARE VARIABLE FECHA DATE;
DECLARE VARIABLE CANT NUMERIC(15,4);
DECLARE VARIABLE COSTO NUMERIC(18,2);
DECLARE VARIABLE ENTRADA CHAR(1);
DECLARE VARIABLE BODEGA CHAR(2);
DECLARE VARIABLE ID INTEGER;
DECLARE VARIABLE TIPO INTEGER;
declare variable TIPOEX CHAR(1);
DECLARE VARIABLE LOTE VARCHAR(20);
declare variable ARTICULO VARCHAR(20);
declare variable IDL INTEGER;
declare variable IDDOC INTEGER;
declare variable CANTTOT varchar(2);
declare variable comp varchar(20);
declare variable cantcomp numeric(18,2);
declare variable coscomp numeric(18,2);
BEGIN
execute procedure LEE_CONFIGURACION ('INVENTARIO', 'ENSAMBLES', 'FORMACIONES CON CANTIDADES TOTALES') returning_values (CANTTOT);
for select arti_cod, ARTI_EXIST from articulo where arti_cod >= :artini and arti_cod <= :artfin into :ARTICULO, :TIPOEX
  DO
  BEGIN
  DELETE FROM existencia_lote where arti_cod = :articulo;
  DELETE FROM lotes where arti_cod = :articulo;
  delete from costos where arti_cod = :ARTICULO;
  delete from existencia WHERE ARTI_COD = :ARTICULO;
  for select mvar_cons, mvar_fecha, mvar_cant, mvar_costo, mvar_entrada, bode_cod, mvar_tipodoc, mvar_lote, MVAR_IDREF
    from movimiento_articulo WHERE ARTI_COD = :ARTICULO
    order by arti_cod, mvar_fecha, mvar_cons
    into :id, :fecha, :cant, :costo, :entrada, :bodega, :tipo, :lote, :iddoc
  do
    begin
    if ((TIPO <> 13)) then
        BEGIN
        if (TIPO = 33) then
            BEGIN
            execute procedure costo_promedio(:articulo, :FECHA) returning_values (:COSTO);
            UPDATE MOVIMIENTO_ARTICULO SET MVAR_COSTO = :costo WHERE arti_cod = :articulo and MVAR_cons = :id;
            END
        if ((TIPO = 15) AND (ENTRADA = 'S')) Then
            begin
            costo = 0;
            for select arti_cod, esde_cant * esde_factor from ensambles_detalle where ensa_id = :iddoc
                into :comp, :cantcomp
                do
                begin
                execute procedure costo_promedio(:comp, :FECHA) returning_values (:coscomp);
                costo = costo + (coscomp * cantcomp);
                end
            if ((canttot = 'SI') AND (CANT <> 0)) then
                COSTO = COSTO / CANT;
            UPDATE MOVIMIENTO_ARTICULO SET MVAR_COSTO = :costo WHERE arti_cod = :articulo and MVAR_cons = :id;
            end
        EXECUTE PROCEDURE actualice_costo(:ARTICULO, :fecha, :costo, :cant, :entrada, 'N', :id, :tipo);
        END
    /* actualice existencias */
    if (:entrada = 'S') then
        begin
        execute procedure sume_existencia(:articulo, :bodega, :fecha, :cant, 'N');
        if (TIPOEX = 'L') then
            begin
            if (EXISTS (SELECT LOTE_NRO FROM LOTES WHERE ARTI_COD = :ARTICULO AND BODE_COD = :BODEGA AND LOTE_NRO = :lote)) then
                UPDATE LOTES
                    set lote_saldo = lote_saldo + :cant
                    where (arti_cod = :ARTICULO) and (BODE_COD = :BODEGA) AND (lote_nro = :lote);
            ELSE
                INSERT INTO LOTES (ARTI_COD, BODE_COD, LOTE_NRO, LOTE_FECHA, LOTE_CANT, LOTE_COSTO, LOTE_SALDO)
                    VALUES (:ARTICULO, :bodega, :lote, :fecha, :cant, :costo, :cant);
            if (EXISTS (SELECT LOTE_NRO FROM EXISTENCIA_LOTE WHERE LOTE_NRO = :LOTE AND EXLO_FECHA = :FECHA AND ARTI_COD = :articulo AND BODE_COD = :bodega)) then
                BEGIN
                UPDATE EXISTENCIA_LOTE
                    SET EXLO_ENT = EXLO_ENT + :cant
                    WHERE LOTE_NRO = :LOTE AND EXLO_FECHA = :FECHA AND ARTI_COD = :articulo AND BODE_COD = :bodega;
                END
            ELSE
                BEGIN
                INSERT INTO EXISTENCIA_LOTE (ARTI_COD, BODE_COD, LOTE_NRO, EXLO_FECHA, EXLO_SAL, EXLO_ENT)
                    VALUES (:articulo, :bodega, :LOTE, :FECHA, 0, :CANT);
                END
            end
        end
    else
        begin
        execute procedure reste_existencia(:articulo, :bodega, :fecha, :cant, 'N');
        if (TIPOEX = 'L') then
            begin
            if (EXISTS (SELECT LOTE_NRO FROM LOTES WHERE ARTI_COD = :ARTICULO AND BODE_COD = :BODEGA AND LOTE_NRO = :lote)) then
                UPDATE LOTES
                    set lote_saldo = lote_saldo - :cant
                    where (arti_cod = :ARTICULO) AND (BODE_COD = :BODEGA) and (lote_nro = :lote);
            ELSE
                BEGIN
                /* ARREGLE EL LOTE YA QUE NO EXISTE */
                SELECT MIN(LOTE_ID) FROM LOTES WHERE ARTI_COD = :articulo AND BODE_COD = :BODEGA AND LOTE_SALDO >= :cant INTO :IDL;
                SELECT LOTE_NRO FROM LOTES WHERE LOTE_ID = :IDL INTO :LOTE;
                UPDATE MOVIMIENTO_ARTICULO SET MVAR_LOTE = :LOTE WHERE ARTI_COD = :ARTICULO AND MVAR_CONS = :ID;
                UPDATE LOTES
                    set lote_saldo = lote_saldo - :cant
                    where (arti_cod = :ARTICULO) and (BODE_COD = :BODEGA) AND (lote_nro = :lote);
                END
            if (EXISTS (SELECT EXLO_FECHA FROM EXISTENCIA_LOTE WHERE LOTE_NRO = :LOTE AND EXLO_FECHA = :FECHA
                AND ARTI_COD = :ARTICULO AND BODE_COD = :bodega)) then
                UPDATE EXISTENCIA_LOTE
                       SET EXLO_SAL = EXLO_SAL + :cant
                    WHERE LOTE_NRO = :LOTE AND EXLO_FECHA = :FECHA AND ARTI_COD = :ARTICULO AND BODE_COD = :bodega;
            else
                INSERT INTO EXISTENCIA_LOTE (ARTI_COD, BODE_COD, LOTE_NRO, EXLO_FECHA, EXLO_SAL, EXLO_ENT)
                    VALUES (:ARTICULO, :BODEGA, :LOTE, :FECHA, :CANT, 0);
            end
        end
    END
  END
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE CHEQUEO_INVENTARIO_FECHA(
    ARTINI VARCHAR(20),
    ARTFIN VARCHAR(20),
    FECINI DATE)
AS
DECLARE VARIABLE FECHA DATE;
DECLARE VARIABLE CANT NUMERIC(15,4);
DECLARE VARIABLE COSTO NUMERIC(18,2);
DECLARE VARIABLE ENTRADA CHAR(1);
DECLARE VARIABLE BODEGA CHAR(2);
DECLARE VARIABLE ID INTEGER;
DECLARE VARIABLE TIPO INTEGER;
declare variable TIPOEX CHAR(1);
DECLARE VARIABLE LOTE VARCHAR(20);
declare variable ARTICULO VARCHAR(20);
declare variable IDL INTEGER;
declare variable IDDOC INTEGER;
declare variable CANTTOT varchar(2);
declare variable comp varchar(20);
declare variable cantcomp numeric(18,2);
declare variable coscomp numeric(18,2);
BEGIN
execute procedure LEE_CONFIGURACION ('INVENTARIO', 'ENSAMBLES', 'FORMACIONES CON CANTIDADES TOTALES') returning_values (CANTTOT);
for select arti_cod, ARTI_EXIST from articulo where arti_cod >= :artini and arti_cod <= :artfin into :ARTICULO, :TIPOEX
  DO
  BEGIN
  DELETE FROM existencia_lote where arti_cod = :articulo AND EXLO_FECHA >= :FECINI;
  DELETE FROM lotes where arti_cod = :articulo AND LOTE_FECHA >= :FECINI;
  delete from costos where arti_cod = :ARTICULO AND COST_FECHA >= :FECINI;
  delete from existencia WHERE ARTI_COD = :ARTICULO AND EXIS_FECHA >= :FECINI;
  for select mvar_cons, mvar_fecha, mvar_cant, mvar_costo, mvar_entrada, bode_cod, mvar_tipodoc, mvar_lote, MVAR_IDREF
    from movimiento_articulo WHERE ARTI_COD = :ARTICULO AND MVAR_FECHA >= :FECINI
    order by arti_cod, mvar_fecha, mvar_cons
    into :id, :fecha, :cant, :costo, :entrada, :bodega, :tipo, :lote, :iddoc
  do
    begin
    if ((TIPO <> 13)) then
        BEGIN
        if (TIPO = 33) then
            BEGIN
            execute procedure costo_promedio(:articulo, :FECHA) returning_values (:COSTO);
            UPDATE MOVIMIENTO_ARTICULO SET MVAR_COSTO = :costo WHERE arti_cod = :articulo and MVAR_cons = :id;
            END
        if ((TIPO = 15) AND (ENTRADA = 'S')) Then
            begin
            costo = 0;
            for select arti_cod, esde_cant * esde_factor from ensambles_detalle where ensa_id = :iddoc
                into :comp, :cantcomp
                do
                begin
                execute procedure costo_promedio(:comp, :FECHA) returning_values (:coscomp);
                costo = costo + (coscomp * cantcomp);
                end
            if ((canttot = 'SI') AND (CANT <> 0)) then
                COSTO = COSTO / CANT;
            UPDATE MOVIMIENTO_ARTICULO SET MVAR_COSTO = :costo WHERE arti_cod = :articulo and MVAR_cons = :id;
            end
        EXECUTE PROCEDURE actualice_costo(:ARTICULO, :fecha, :costo, :cant, :entrada, 'N', :id, :tipo);
        END
    /* actualice existencias */
    if (:entrada = 'S') then
        begin
        execute procedure sume_existencia(:articulo, :bodega, :fecha, :cant, 'N');
        if (TIPOEX = 'L') then
            begin
            if (EXISTS (SELECT LOTE_NRO FROM LOTES WHERE ARTI_COD = :ARTICULO AND BODE_COD = :BODEGA AND LOTE_NRO = :lote)) then
                UPDATE LOTES
                    set lote_saldo = lote_saldo + :cant
                    where (arti_cod = :ARTICULO) and (BODE_COD = :BODEGA) AND (lote_nro = :lote);
            ELSE
                INSERT INTO LOTES (ARTI_COD, BODE_COD, LOTE_NRO, LOTE_FECHA, LOTE_CANT, LOTE_COSTO, LOTE_SALDO)
                    VALUES (:ARTICULO, :bodega, :lote, :fecha, :cant, :costo, :cant);
            if (EXISTS (SELECT LOTE_NRO FROM EXISTENCIA_LOTE WHERE LOTE_NRO = :LOTE AND EXLO_FECHA = :FECHA AND ARTI_COD = :articulo AND BODE_COD = :bodega)) then
                BEGIN
                UPDATE EXISTENCIA_LOTE
                    SET EXLO_ENT = EXLO_ENT + :cant
                    WHERE LOTE_NRO = :LOTE AND EXLO_FECHA = :FECHA AND ARTI_COD = :articulo AND BODE_COD = :bodega;
                END
            ELSE
                BEGIN
                INSERT INTO EXISTENCIA_LOTE (ARTI_COD, BODE_COD, LOTE_NRO, EXLO_FECHA, EXLO_SAL, EXLO_ENT)
                    VALUES (:articulo, :bodega, :LOTE, :FECHA, 0, :CANT);
                END
            end
        end
    else
        begin
        execute procedure reste_existencia(:articulo, :bodega, :fecha, :cant, 'N');
        if (TIPOEX = 'L') then
            begin
            if (EXISTS (SELECT LOTE_NRO FROM LOTES WHERE ARTI_COD = :ARTICULO AND BODE_COD = :BODEGA AND LOTE_NRO = :lote)) then
                UPDATE LOTES
                    set lote_saldo = lote_saldo - :cant
                    where (arti_cod = :ARTICULO) AND (BODE_COD = :BODEGA) and (lote_nro = :lote);
            ELSE
                BEGIN
                /* ARREGLE EL LOTE YA QUE NO EXISTE
                SELECT MIN(LOTE_ID) FROM LOTES WHERE ARTI_COD = :articulo AND BODE_COD = :BODEGA AND LOTE_SALDO >= :cant INTO :IDL;
                SELECT LOTE_NRO FROM LOTES WHERE LOTE_ID = :IDL INTO :LOTE;
                UPDATE MOVIMIENTO_ARTICULO SET MVAR_LOTE = :LOTE WHERE ARTI_COD = :ARTICULO AND MVAR_CONS = :ID;
                UPDATE LOTES
                    set lote_saldo = lote_saldo - :cant
                    where (arti_cod = :ARTICULO) and (BODE_COD = :BODEGA) AND (lote_nro = :lote);*/
                exception lote_no_existe 'No se encontro el lote ' || :lote || ' para el articulo ' || :articulo || ' en la bodega ' || :bodega;
                END
            if (EXISTS (SELECT EXLO_FECHA FROM EXISTENCIA_LOTE WHERE LOTE_NRO = :LOTE AND EXLO_FECHA = :FECHA
                AND ARTI_COD = :ARTICULO AND BODE_COD = :bodega)) then
                UPDATE EXISTENCIA_LOTE
                       SET EXLO_SAL = EXLO_SAL + :cant
                    WHERE LOTE_NRO = :LOTE AND EXLO_FECHA = :FECHA AND ARTI_COD = :ARTICULO AND BODE_COD = :bodega;
            else
                INSERT INTO EXISTENCIA_LOTE (ARTI_COD, BODE_COD, LOTE_NRO, EXLO_FECHA, EXLO_SAL, EXLO_ENT)
                    VALUES (:ARTICULO, :BODEGA, :LOTE, :FECHA, :CANT, 0);
            end
        end
    END
  INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
    VALUES (USER, 141, 1, 'I', :ARTICULO);
  END
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE CHEQUEO_LOTES(
    ARTINI VARCHAR(20),
    ARTFIN VARCHAR(20))
AS
DECLARE VARIABLE FECHA DATE;
DECLARE VARIABLE CANT NUMERIC(15,4);
DECLARE VARIABLE COSTO NUMERIC(18,2);
DECLARE VARIABLE ENTRADA CHAR(1);
DECLARE VARIABLE BODEGA CHAR(2);
DECLARE VARIABLE ID INTEGER;
DECLARE VARIABLE TIPO INTEGER;
declare variable TIPOEX CHAR(1);
DECLARE VARIABLE LOTE VARCHAR(20);
declare variable ARTICULO VARCHAR(20);
declare variable IDL INTEGER;
declare variable IDDOC INTEGER;
declare variable CANTTOT varchar(2);
declare variable comp varchar(20);
declare variable cantcomp numeric(18,2);
declare variable coscomp numeric(18,2);
declare variable LOTESAL varchar(20);
declare variable SALDOLOTE numeric(18,4);
declare variable CONC VARCHAR(60);
declare variable PREF VARCHAR(4);
declare variable NUMERO VARCHAR(8);
declare variable ITEM INTEGER;
declare variable NIT VARCHAR(20);
BEGIN
execute procedure LEE_CONFIGURACION ('INVENTARIO', 'ENSAMBLES', 'FORMACIONES CON CANTIDADES TOTALES') returning_values (CANTTOT);
for select arti_cod, ARTI_EXIST from articulo where arti_cod >= :artini and arti_cod <= :artfin order by arti_cod into :ARTICULO, :TIPOEX
  DO
  BEGIN
  DELETE FROM existencia_lote where arti_cod = :articulo;
  DELETE FROM lotes where arti_cod = :articulo;
  delete from costos where arti_cod = :ARTICULO;
  delete from existencia WHERE ARTI_COD = :ARTICULO;
  delete from errores_lotes where articulo = :ARTICULO;
  ITEM = 1000;
  for select mvar_cons, mvar_fecha, mvar_cant, mvar_costo, mvar_entrada, bode_cod, mvar_tipodoc, mvar_lote, mvar_idref,
    MVAR_CONC, MVAR_PREF, MVAR_NUMERO, TERC_NIT
    from movimiento_articulo WHERE ARTI_COD = :ARTICULO
    order by arti_cod, mvar_fecha, mvar_entrada desc, mvar_cons
    into :id, :fecha, :cant, :costo, :entrada, :bodega, :tipo, :lote, :iddoc, :CONC, :PREF, :NUMERO, :NIT
  do
    begin
    if ((TIPO <> 13)) then
        BEGIN
        if (TIPO = 33) then
            BEGIN
            execute procedure costo_promedio(:articulo, :FECHA) returning_values (:COSTO);
            UPDATE MOVIMIENTO_ARTICULO SET MVAR_COSTO = :costo WHERE MVAR_cons = :id;
            END
        if ((TIPO = 15) AND (ENTRADA = 'S')) Then
            begin
            costo = 0;
            for select arti_cod, esde_cant * esde_factor from ensambles_detalle where ensa_id = :iddoc
                into :comp, :cantcomp
                do
                begin
                execute procedure costo_promedio(:comp, :FECHA) returning_values (:coscomp);
                costo = costo + (coscomp * cantcomp);
                end
            if ((canttot = 'SI') AND (CANT <> 0)) then
                COSTO = COSTO / CANT;
            UPDATE MOVIMIENTO_ARTICULO SET MVAR_COSTO = :costo WHERE MVAR_cons = :id;
            end
        EXECUTE PROCEDURE actualice_costo(:ARTICULO, :fecha, :costo, :cant, :entrada, 'N', :id, :tipo);
        END
    /* actualice existencias */
    if (:entrada = 'S') then
        begin
        execute procedure sume_existencia(:articulo, :bodega, :fecha, :cant, 'N');
        if (TIPOEX = 'L') then
            begin
            if (cant < 0) then
                begin
                SELECT LOTE_SALDO FROM LOTES WHERE ARTI_COD = :ARTICULO AND BODE_COD = :BODEGA AND LOTE_NRO = :lote INTO :SALDOLOTE;
                if (SALDOLOTE >= abs(CANT)) then
                    begin
                    UPDATE LOTES
                        set lote_saldo = lote_saldo + :cant
                        where (arti_cod = :ARTICULO) and (BODE_COD = :BODEGA) AND (lote_nro = :lote);
                    end
                else
                    begin
/*                    exception lote_negativo 'EL SALDO DEL ARTICULO ' || :ARTICULO || ' CON LOTE ' || :LOTE || ' EN LA BODEGA ' || :BODEGA || ' EN ' || :fecha || ' ES INSUFICIENTE: ' || :SALDOLOTE || ' PARA LA CANTIDAD ' || :CANT;*/
                    UPDATE MOVIMIENTO_ARTICULO SET MVAR_CANT = :SALDOLOTE WHERE MVAR_cons = :id;
                    UPDATE LOTES
                        set lote_saldo = 0
                        where (arti_cod = :ARTICULO) and (BODE_COD = :BODEGA) AND (lote_nro = :lote);
                    INSERT INTO errores_lotes (TIPO, ARTICULO, BODEGA, LOTE, IDMOV, FECHA, TIPOMOV, CANT, SALDOBOD)
                        VALUES ('ENTRADA NEGATIVA, SE AJUSTA LA CANTIDAD', :ARTICULO, :BODEGA, :LOTE, :id,  :FECHA, :tipo, :CANT, :SALDOLOTE);
                    end
                end
            else
                begin
                if (EXISTS (SELECT LOTE_NRO FROM LOTES WHERE ARTI_COD = :ARTICULO AND BODE_COD = :BODEGA AND LOTE_NRO = :lote)) then
                    UPDATE LOTES
                        set lote_saldo = lote_saldo + :cant
                        where (arti_cod = :ARTICULO) and (BODE_COD = :BODEGA) AND (lote_nro = :lote);
                ELSE
                    INSERT INTO LOTES (ARTI_COD, BODE_COD, LOTE_NRO, LOTE_FECHA, LOTE_CANT, LOTE_COSTO, LOTE_SALDO)
                        VALUES (:ARTICULO, :bodega, :lote, :fecha, :cant, :costo, :cant);
                if (EXISTS (SELECT EXLO_FECHA FROM EXISTENCIA_LOTE WHERE LOTE_NRO = :LOTE AND EXLO_FECHA = :FECHA
                    AND ARTI_COD = :ARTICULO AND BODE_COD = :bodega)) then
                    UPDATE EXISTENCIA_LOTE
                        SET EXLO_ENT = EXLO_ENT + :cant
                        WHERE LOTE_NRO = :LOTE AND EXLO_FECHA = :FECHA AND ARTI_COD = :ARTICULO AND BODE_COD = :bodega;
                else
                    INSERT INTO EXISTENCIA_LOTE (ARTI_COD, BODE_COD, LOTE_NRO, EXLO_FECHA, EXLO_SAL, EXLO_ENT)
                        VALUES (:ARTICULO, :BODEGA, :LOTE, :FECHA, 0, :CANT);
                end
            end
        end
    else
        begin
        execute procedure reste_existencia(:articulo, :bodega, :fecha, :cant, 'N');
        if (TIPOEX = 'L') then
            begin
            /* VERIFIQUE SI EXISTE EL LOTE */
            if (exists (SELECT LOTE_NRO FROM LOTES WHERE ARTI_COD = :ARTICULO AND BODE_COD = :BODEGA AND LOTE_NRO = :lote)) then
                BEGIN
                SALDOLOTE = 0;
                SELECT LOTE_SALDO FROM LOTES WHERE ARTI_COD = :ARTICULO AND BODE_COD = :BODEGA AND LOTE_NRO = :lote INTO :SALDOLOTE;
                if (SALDOLOTE >= CANT) then
                    BEGIN
                    UPDATE LOTES
                        set lote_saldo = lote_saldo - :cant
                        where (arti_cod = :ARTICULO) AND (BODE_COD = :BODEGA) and (lote_nro = :lote);
                    if (EXISTS (SELECT EXLO_FECHA FROM EXISTENCIA_LOTE WHERE LOTE_NRO = :LOTE AND EXLO_FECHA = :FECHA
                        AND ARTI_COD = :ARTICULO AND BODE_COD = :bodega)) then
                        UPDATE EXISTENCIA_LOTE
                           SET EXLO_SAL = EXLO_SAL + :cant
                            WHERE LOTE_NRO = :LOTE AND EXLO_FECHA = :FECHA AND ARTI_COD = :ARTICULO AND BODE_COD = :bodega;
                    else
                        INSERT INTO EXISTENCIA_LOTE (ARTI_COD, BODE_COD, LOTE_NRO, EXLO_FECHA, EXLO_SAL, EXLO_ENT)
                            VALUES (:ARTICULO, :BODEGA, :LOTE, :FECHA, :CANT, 0);
                    END
                ELSE
                    BEGIN
/*                    exception lote_negativo 'EL SALDO DEL ARTICULO ' || :ARTICULO || ' CON LOTE ' || :LOTE || ' EN LA BODEGA ' || :BODEGA || ' EN ' || :fecha || ' ES INSUFICIENTE: ' || :SALDOLOTE || ' PARA LA CANTIDAD ' || :CANT;*/
                    IDL = 0;
                    SELECT FIRST 1 LOTE_ID FROM LOTES WHERE ARTI_COD = :articulo AND BODE_COD = :BODEGA AND LOTE_SALDO >= :cant
                        ORDER BY LOTE_FECHA INTO :IDL;
                    if (IDL <> 0) then
                        BEGIN
                        SELECT LOTE_NRO FROM LOTES WHERE LOTE_ID = :IDL INTO :LOTESAL;
                        UPDATE MOVIMIENTO_ARTICULO SET MVAR_LOTE = :LOTESAL WHERE MVAR_CONS = :ID;
                        UPDATE LOTES
                            set lote_saldo = lote_saldo - :cant
                            where (arti_cod = :ARTICULO) and (BODE_COD = :BODEGA) AND (lote_nro = :lotesal);
                        INSERT INTO errores_lotes (TIPO, ARTICULO, BODEGA, LOTE, IDMOV, FECHA, TIPOMOV, CANT, LOTESAL, SALDOBOD)
                            VALUES ('LOTE INSUFICIENTE EN SALIDA, SE CAMBIA LOTE', :ARTICULO, :BODEGA, :LOTE, :id,  :FECHA, :tipo, :CANT, :LOTESAL, :CANT);

                        if (EXISTS (SELECT EXLO_FECHA FROM EXISTENCIA_LOTE WHERE LOTE_NRO = :LOTESAL AND EXLO_FECHA = :FECHA
                            AND ARTI_COD = :ARTICULO AND BODE_COD = :bodega)) then
                            UPDATE EXISTENCIA_LOTE
                               SET EXLO_SAL = EXLO_SAL + :cant
                               WHERE LOTE_NRO = :LOTESAL AND EXLO_FECHA = :FECHA AND ARTI_COD = :ARTICULO AND BODE_COD = :bodega;
                        else
                            INSERT INTO EXISTENCIA_LOTE (ARTI_COD, BODE_COD, LOTE_NRO, EXLO_FECHA, EXLO_SAL, EXLO_ENT)
                                VALUES (:ARTICULO, :BODEGA, :LOTESAL, :FECHA, :CANT, 0);
                        END
                    ELSE
                        BEGIN
/*                     exception lote_negativo 'EL SALDO DEL ARTICULO ' || :ARTICULO || ' CON LOTE ' || :LOTE || ' EN LA BODEGA ' || :BODEGA || ' EN ' || :fecha || ' ES INSUFICIENTE: ' || :SALDOLOTE || ' PARA LA CANTIDAD ' || :CANT;*/
                        /* no hay un lote con cant. suficiente, use la cant. disponible y agregue un item */
                        UPDATE MOVIMIENTO_ARTICULO SET MVAR_CANT = :SALDOLOTE WHERE MVAR_cons = :id;
                        UPDATE LOTES
                            set lote_saldo = 0
                            where (arti_cod = :ARTICULO) and (BODE_COD = :BODEGA) AND (lote_nro = :lote);
                        if (EXISTS (SELECT EXLO_FECHA FROM EXISTENCIA_LOTE WHERE LOTE_NRO = :LOTE AND EXLO_FECHA = :FECHA
                            AND ARTI_COD = :ARTICULO AND BODE_COD = :bodega)) then
                            UPDATE EXISTENCIA_LOTE
                                SET EXLO_SAL = EXLO_SAL + :SALDOLOTE
                                WHERE LOTE_NRO = :LOTE AND EXLO_FECHA = :FECHA AND ARTI_COD = :ARTICULO AND BODE_COD = :bodega;
                        else
                            INSERT INTO EXISTENCIA_LOTE (ARTI_COD, BODE_COD, LOTE_NRO, EXLO_FECHA, EXLO_SAL, EXLO_ENT)
                                VALUES (:ARTICULO, :BODEGA, :LOTE, :FECHA, :SALDOLOTE, 0);

                        cant = cant - saldolote;
                        /* verifique si hay un lote con la cant restante suficiente */
                        IDL = 0;
                        SELECT FIRST 1 LOTE_ID FROM LOTES WHERE ARTI_COD = :articulo AND BODE_COD = :BODEGA AND LOTE_SALDO >= :cant
                            ORDER BY LOTE_FECHA, LOTE_ID INTO :IDL;
                        if (IDL <> 0) then
                            BEGIN
                            SELECT LOTE_NRO FROM LOTES WHERE LOTE_ID = :IDL INTO :LOTESAL;
                            ID = GEN_ID(id_movarti, 1);
                            ITEM = ITEM + 1;
                            INSERT INTO MOVIMIENTO_ARTICULO (ARTI_COD, MVAR_CONS, BODE_COD, MVAR_FECHA, MVAR_IDREF, MVAR_CONC, MVAR_CANT,
                                MVAR_COSTO, MVAR_ENTRADA, MVAR_LOTE, MVAR_PREF, MVAR_NUMERO, MVAR_TIPODOC, MVAR_ITEM, TERC_NIT)
                                VALUES (:ARTICULO, :ID, :bodega, :FECHA, :IDDOC, :CONC, :CANT, :COSTO, 'N', :LOTESAL, :PREF, :NUMERO, :TIPO, :ITEM, :NIT);
                            UPDATE LOTES
                                set lote_saldo = lote_saldo - :cant
                                where (arti_cod = :ARTICULO) and (BODE_COD = :BODEGA) AND (lote_nro = :lotesal);

                            if (EXISTS (SELECT EXLO_FECHA FROM EXISTENCIA_LOTE WHERE LOTE_NRO = :LOTESAL AND EXLO_FECHA = :FECHA
                                AND ARTI_COD = :ARTICULO AND BODE_COD = :bodega)) then
                                UPDATE EXISTENCIA_LOTE
                                    SET EXLO_SAL = EXLO_SAL + :cant
                                    WHERE LOTE_NRO = :LOTESAL AND EXLO_FECHA = :FECHA AND ARTI_COD = :ARTICULO AND BODE_COD = :bodega;
                            else
                                INSERT INTO EXISTENCIA_LOTE (ARTI_COD, BODE_COD, LOTE_NRO, EXLO_FECHA, EXLO_SAL, EXLO_ENT)
                                    VALUES (:ARTICULO, :BODEGA, :LOTESAL, :FECHA, :CANT, 0);
                            INSERT INTO errores_lotes (TIPO, ARTICULO, BODEGA, LOTE, IDMOV, FECHA, TIPOMOV, CANT, LOTESAL, SALDOBOD)
                                VALUES ('LOTE INSUFICIENTE EN SALIDA, SE AGREGO ITEM', :ARTICULO, :BODEGA, :LOTE, :id,  :FECHA, :tipo, :CANT, :LOTESAL, :CANT);
                            END
                        ELSE
                            BEGIN
                            for SELECT LOTE_ID, LOTE_SALDO FROM LOTES WHERE ARTI_COD = :articulo AND BODE_COD = :BODEGA AND LOTE_SALDO > 0
                                ORDER BY LOTE_FECHA, LOTE_ID INTO :IDL, :SALDOLOTE
                                DO
                                BEGIN
                                if (CANT > 0) then
                                    BEGIN
                                    if (CANT < SALDOLOTE) then
                                        BEGIN
                                        CANT = 0;
                                        SALDOLOTE = CANT;
                                        END
                                    ELSE
                                        CANT = CANT - SALDOLOTE;
                                    SELECT LOTE_NRO FROM LOTES WHERE LOTE_ID = :IDL INTO :LOTESAL;
                                    ID = GEN_ID(id_movarti, 1);
                                    ITEM = ITEM + 1;
                                    INSERT INTO MOVIMIENTO_ARTICULO (ARTI_COD, MVAR_CONS, BODE_COD, MVAR_FECHA, MVAR_IDREF, MVAR_CONC, MVAR_CANT,
                                        MVAR_COSTO, MVAR_ENTRADA, MVAR_LOTE, MVAR_PREF, MVAR_NUMERO, MVAR_TIPODOC, MVAR_ITEM, TERC_NIT)
                                        VALUES (:ARTICULO, :ID, :bodega, :FECHA, :IDDOC, :CONC, :SALDOLOTE, :COSTO, 'N', :LOTESAL, :PREF, :NUMERO, :TIPO, :ITEM, :NIT);
                                    UPDATE LOTES
                                        set lote_saldo = LOTE_SALDO - :SALDOLOTE
                                        where (arti_cod = :ARTICULO) and (BODE_COD = :BODEGA) AND (lote_nro = :lotesal);
                                    if (EXISTS (SELECT EXLO_FECHA FROM EXISTENCIA_LOTE WHERE LOTE_NRO = :LOTESAL AND EXLO_FECHA = :FECHA
                                        AND ARTI_COD = :ARTICULO AND BODE_COD = :bodega)) then
                                        UPDATE EXISTENCIA_LOTE
                                            SET EXLO_SAL = EXLO_SAL + :SALDOLOTE
                                            WHERE LOTE_NRO = :LOTESAL AND EXLO_FECHA = :FECHA AND ARTI_COD = :ARTICULO AND BODE_COD = :bodega;
                                    else
                                        INSERT INTO EXISTENCIA_LOTE (ARTI_COD, BODE_COD, LOTE_NRO, EXLO_FECHA, EXLO_SAL, EXLO_ENT)
                                            VALUES (:ARTICULO, :BODEGA, :LOTESAL, :FECHA, :SALDOLOTE, 0);

                                    INSERT INTO errores_lotes (TIPO, ARTICULO, BODEGA, LOTE, IDMOV, FECHA, TIPOMOV, CANT, LOTESAL, SALDOBOD)
                                        VALUES ('LOTE INSUFICIENTE EN SALIDA, SE AGREGARON ITEMS', :ARTICULO, :BODEGA, :LOTE, :id,  :FECHA, :tipo, :CANT, :LOTESAL, :SALDOLOTE);
                                    END
                                END
                            if (CANT > 0) then
                                BEGIN
                                INSERT INTO errores_lotes (TIPO, ARTICULO, BODEGA, LOTE, IDMOV, FECHA, TIPOMOV, CANT, LOTESAL, SALDOBOD)
                                    VALUES ('LOTE INSUFICIENTE EN SALIDA, SE AGREGO ITEMS QUEDO SALDO', :ARTICULO, :BODEGA, :LOTE, :id,  :FECHA, :tipo, :CANT, :LOTESAL, :CANT);
                                END
                            END
                        END
                    END
                END
            else
                BEGIN
                /* ARREGLE EL LOTE YA QUE NO EXISTE */
                IDL = 0;
                SELECT FIRST 1 LOTE_ID FROM LOTES WHERE ARTI_COD = :articulo AND BODE_COD = :BODEGA AND LOTE_SALDO >= :cant
                    ORDER BY LOTE_FECHA INTO :IDL;
                if (IDL <> 0) then
                    BEGIN
                    SELECT LOTE_NRO FROM LOTES WHERE LOTE_ID = :IDL INTO :LOTESAL;
                    UPDATE MOVIMIENTO_ARTICULO SET MVAR_LOTE = :LOTESAL WHERE MVAR_CONS = :ID;
                    UPDATE LOTES
                        set lote_saldo = lote_saldo - :cant
                        where (arti_cod = :ARTICULO) and (BODE_COD = :BODEGA) AND (lote_nro = :lotesal);
                    INSERT INTO errores_lotes (TIPO, ARTICULO, BODEGA, LOTE, IDMOV, FECHA, TIPOMOV, CANT, LOTESAL, SALDOBOD)
                        VALUES ('LOTE NO EXISTE EN SALIDA, SE CAMBIA LOTE', :ARTICULO, :BODEGA, :LOTE, :id,  :FECHA, :tipo, :CANT, :LOTESAL, :CANT);

                    if (EXISTS (SELECT EXLO_FECHA FROM EXISTENCIA_LOTE WHERE LOTE_NRO = :LOTESAL AND EXLO_FECHA = :FECHA
                        AND ARTI_COD = :ARTICULO AND BODE_COD = :bodega)) then
                        UPDATE EXISTENCIA_LOTE
                            SET EXLO_SAL = EXLO_SAL + :cant
                            WHERE LOTE_NRO = :LOTESAL AND EXLO_FECHA = :FECHA AND ARTI_COD = :ARTICULO AND BODE_COD = :bodega;
                    else
                        INSERT INTO EXISTENCIA_LOTE (ARTI_COD, BODE_COD, LOTE_NRO, EXLO_FECHA, EXLO_SAL, EXLO_ENT)
                            VALUES (:ARTICULO, :BODEGA, :LOTESAL, :FECHA, :CANT, 0);
                    END
                ELSE
                    BEGIN
                    /* no hay un lote con cant. suficiente, BORRE EL ACTUAL y agregue items nuevos con los saldos disponibles */
                    delete FROM movimiento_articulo WHERE MVAR_CONS = :ID;
                    for SELECT LOTE_ID, LOTE_SALDO FROM LOTES WHERE ARTI_COD = :articulo AND BODE_COD = :BODEGA AND LOTE_SALDO > 0
                        ORDER BY LOTE_FECHA, LOTE_ID INTO :IDL, :SALDOLOTE
                        DO
                        BEGIN
                        if (CANT > 0) then
                            BEGIN
                            if (CANT < SALDOLOTE) then
                                BEGIN
                                CANT = 0;
                                SALDOLOTE = CANT;
                                END
                            ELSE
                                CANT = CANT - SALDOLOTE;
                            SELECT LOTE_NRO FROM LOTES WHERE LOTE_ID = :IDL INTO :LOTESAL;
                            ID = GEN_ID(id_movarti, 1);
                            ITEM = ITEM + 1;
                            INSERT INTO MOVIMIENTO_ARTICULO (ARTI_COD, MVAR_CONS, BODE_COD, MVAR_FECHA, MVAR_IDREF, MVAR_CONC, MVAR_CANT,
                                MVAR_COSTO, MVAR_ENTRADA, MVAR_LOTE, MVAR_PREF, MVAR_NUMERO, MVAR_TIPODOC, MVAR_ITEM, TERC_NIT)
                                VALUES (:ARTICULO, :ID, :bodega, :FECHA, :IDDOC, :CONC, :SALDOLOTE, :COSTO, 'N', :LOTESAL, :PREF, :NUMERO, :TIPO, :ITEM, :NIT);
                            UPDATE LOTES
                                set lote_saldo = LOTE_SALDO - :SALDOLOTE
                                where (arti_cod = :ARTICULO) and (BODE_COD = :BODEGA) AND (lote_nro = :lotesal);
                            if (EXISTS (SELECT EXLO_FECHA FROM EXISTENCIA_LOTE WHERE LOTE_NRO = :LOTESAL AND EXLO_FECHA = :FECHA
                                AND ARTI_COD = :ARTICULO AND BODE_COD = :bodega)) then
                                UPDATE EXISTENCIA_LOTE
                                    SET EXLO_SAL = EXLO_SAL + :SALDOLOTE
                                    WHERE LOTE_NRO = :LOTESAL AND EXLO_FECHA = :FECHA AND ARTI_COD = :ARTICULO AND BODE_COD = :bodega;
                            else
                                INSERT INTO EXISTENCIA_LOTE (ARTI_COD, BODE_COD, LOTE_NRO, EXLO_FECHA, EXLO_SAL, EXLO_ENT)
                                    VALUES (:ARTICULO, :BODEGA, :LOTESAL, :FECHA, :SALDOLOTE, 0);

                            INSERT INTO errores_lotes (TIPO, ARTICULO, BODEGA, LOTE, IDMOV, FECHA, TIPOMOV, CANT, LOTESAL, SALDOBOD)
                                VALUES ('LOTE NO EXISTE EN SALIDA, SE AGREGARON ITEMS', :ARTICULO, :BODEGA, :LOTE, :id,  :FECHA, :tipo, :CANT, :LOTESAL, :SALDOLOTE);
                            END
                        END
                    if (CANT > 0) then
                        BEGIN
                        INSERT INTO errores_lotes (TIPO, ARTICULO, BODEGA, LOTE, IDMOV, FECHA, TIPOMOV, CANT, LOTESAL, SALDOBOD)
                            VALUES ('ERROR LOTE NO EXISTE EN SALIDA, SE AGREGO ITEMS QUEDO SALDO', :ARTICULO, :BODEGA, :LOTE, :id,  :FECHA, :tipo, :CANT, :LOTESAL, :CANT);
                        END
                    END
                END
            end
        end
    END
  END
END
^

SET TERM ; ^

SET TERM ^ ;

ALTER TRIGGER ENTRADAS_DETALLE_AU
as
declare variable fec date;
declare variable CONC VARCHAR(60);
declare variable Pref varchar(4);
declare variable Num varchar(8);
declare variable Nit varchar(20);
declare variable factor numeric(18,4);
declare variable IVAINC CHAR(2);
declare variable ICOINC CHAR(2);
declare variable COSTO NUMERIC(18,2);
declare variable IDMOV integer;
BEGIN
if ((old.ende_anulado = new.ende_anulado) and (old.arti_cod = new.arti_cod) and (old.bode_cod = new.bode_cod) and
    (old.ende_cant = new.ende_cant) and (old.ende_unidad = new.ende_unidad) and (old.ende_lote = new.ende_lote) and
    (old.entr_id = new.entr_id) and (old.ende_item = new.ende_item) and (old.ende_costo <> new.ende_costo)) then
    begin
    /* si solo cambio el costo */
    select mvar_cons, mvar_fecha from MOVIMIENTO_ARTICULO WHERE MVAR_TIPODOC = 11 AND MVAR_IDREF = NEW.entr_id
        AND MVAR_ITEM = NEW.ende_item into :idmov, :fec;
    execute procedure factor_unidad_cant(new.arti_cod, new.ende_unidad) returning_values(factor);
    COSTO = ((new.ende_costo - NEW.ende_dtomonto) / :factor);
    if (IVAINC = 'S') then
        BEGIN
        EXECUTE PROCEDURE lee_configuracion ('FACTURACION', 'ARTICULOS', 'IMPOCONSUMO INCLUIDO EN EL PRECIO BASE DE VENTA ANTES DE IVA') returning_values(:icoinc);
        if (icoinc = 'SI') then
            COSTO = COSTO - NEW.ende_consumo;
        COSTO = COSTO / (1 + NEW.ende_ivaporc/100);
        END
    UPDATE MOVIMIENTO_ARTICULO SET MVAR_COSTO = :costo WHERE MVAR_CONS = :IDMOV;
    EXECUTE PROCEDURE actualice_costo(old.arti_cod, :fec, :costo, old.ende_cant*:factor, 'S', 'S', :IDMOV, 11);

    EXECUTE PROCEDURE actualice_costo(new.arti_cod, :fec, :costo, new.ende_cant*:factor, 'S', 'N', :IDMOV, 11);
    if (exists (SELECT cost_fecha from costos WHERE (arti_cod = new.arti_cod) AND (cost_fecha > :fec))) then
        EXECUTE PROCEDURE chequeo_costos(NEW.arti_cod, :fec + 1);
    end

if ((OLD.entr_id <> 0) AND (OLD.ende_anulado = 'N')) then
    DELETE FROM MOVIMIENTO_ARTICULO WHERE (mvar_tipodoc = 11) and (mvar_idref = new.entr_id) and (mvar_item = old.ende_item);
if ((NEW.entr_id <> 0) AND (NEW.ende_anulado = 'N')) then
    begin
    select entr_fecha, entr_conc, pref_pre, entr_numero, terc_nit, entr_imptos
        from entradas where entr_id = new.entr_id
        into :fec, :conc, :Pref, :Num, :Nit, :ivainc;
    execute procedure factor_unidad_cant(new.arti_cod, new.ende_unidad) returning_values(factor);
    COSTO = ((new.ende_costo - NEW.ende_dtomonto) / :factor);
    if (IVAINC = 'S') then
        BEGIN
        EXECUTE PROCEDURE lee_configuracion ('FACTURACION', 'ARTICULOS', 'IMPOCONSUMO INCLUIDO EN EL PRECIO BASE DE VENTA ANTES DE IVA') returning_values(:icoinc);
        if (icoinc = 'SI') then
            COSTO = COSTO - NEW.ende_consumo;
        COSTO = COSTO / (1 + NEW.ende_ivaporc/100);
        END
    INSERT INTO MOVIMIENTO_ARTICULO
        (ARTI_COD, BODE_COD, MVAR_FECHA, MVAR_TIPODOC, MVAR_IDREF, MVAR_CONC, MVAR_CANT, MVAR_COSTO, MVAR_ENTRADA, MVAR_LOTE, MVAR_PREF, MVAR_NUMERO, MVAR_ITEM, TERC_NIT)
        VALUES(NEW.ARTI_COD, NEW.BODE_COD, :FEC, 11, NEW.entr_id,
        :CONC, :factor * new.ende_cant, :COSTO, 'S', new.ende_lote, :Pref, :Num, new.ende_item, :Nit);
    /* RECORRA LAS LISTAS DE PRECIOS Y CAMBIE EL PRECIO */
    EXECUTE PROCEDURE CALCULA_PRECIOS(NEW.ARTI_COD, :FEC);
    /* ACTUALICE EL STAND */
    if (new.ende_stand is not null) then
      if (exists(select stand_cod from stands where arti_cod = new.arti_cod and stand_bodega = new.bode_cod)) then
        UPDATE stands set stand_cod = new.ende_stand where arti_cod = new.arti_cod and stand_bodega = new.bode_cod;
      else
        INSERT INTO stands (ARTI_COD, STAND_BODEGA, STAND_COD) VALUES (NEW.arti_cod, NEW.bode_cod, NEW.ende_stand);
    END
END^

SET TERM ; ^

SET TERM ^ ;

ALTER TRIGGER MOVIMIENTO_ARTICULO_AD
AS
declare variable LOTE CHAR(1);
declare variable ensamble char(1);
BEGIN
  /* INSERTE EL NUEVO LOTE */
  SELECT ARTI_EXIST
    FROM   ARTICULO
    WHERE  ARTICULO.ARTI_COD = OLD.ARTI_COD
    INTO :LOTE;
  /* BORRE LOS VIEJOS */
  if (old.mvar_tipodoc <> 13) then
      BEGIN
      EXECUTE PROCEDURE actualice_costo(old.arti_cod, old.mvar_fecha, old.mvar_costo, old.mvar_cant, old.mvar_entrada, 'S', OLD.mvar_cons, OLD.mvar_tipodoc);
      EXECUTE PROCEDURE chequeo_costos(old.arti_cod, old.mvar_fecha-1); /* PARA OBLIGAR A RECALCULAR LOS MOV. DEL MISMO DIA */
      END
  /* actualice existencias */
  if (old.mvar_entrada = 'S') then
    BEGIN
    execute procedure sume_existencia(old.arti_cod, old.bode_cod, old.mvar_fecha, old.mvar_cant, 'S');
    if (LOTE = 'L') then
        BEGIN
        UPDATE LOTES
            set lote_saldo = lote_saldo - old.mvar_cant
            where (arti_cod = old.ARTI_COD) and (bode_cod = old.bode_cod) and (lote_nro = old.mvar_lote);
        UPDATE EXISTENCIA_LOTE
            SET EXLO_ENT = EXLO_ENT - OLD.mvar_cant
            WHERE LOTE_NRO = OLD.MVAR_LOTE AND EXLO_FECHA = OLD.MVAR_FECHA AND ARTI_COD = OLD.ARTI_COD AND BODE_COD = OLD.bode_cod;
        END
    END
  else
    BEGIN
    SELECT ARTI_ENSAMBLE FROM ARTICULO WHERE ARTI_COD = old.arti_cod INTO :ensamble;
    if ((ENSAMBLE = 'S') AND (OLD.mvar_entrada = 'N')) then
        delete from ensambles where ensa_tiporef = old.mvar_tipodoc and ensa_idref = old.mvar_idref AND ENSA_ITEMREF = OLD.mvar_item;

    execute procedure reste_existencia(old.arti_cod, old.bode_cod, old.mvar_fecha, old.mvar_cant, 'S');
    if (LOTE = 'L') then
        BEGIN
        UPDATE LOTES
            set lote_saldo = lote_saldo + old.mvar_cant
            where (arti_cod = old.ARTI_COD) and (bode_cod = old.bode_cod) and (lote_nro = old.mvar_lote);
        UPDATE EXISTENCIA_LOTE
            SET EXLO_SAL = EXLO_SAL - OLD.mvar_cant
            WHERE LOTE_NRO = OLD.MVAR_LOTE AND EXLO_FECHA = OLD.MVAR_FECHA AND ARTI_COD = OLD.ARTI_COD AND BODE_COD = OLD.bode_cod;
        END
    END
END^

SET TERM ; ^

SET TERM ^ ;

ALTER TRIGGER MOVIMIENTO_ARTICULO_AI
AS
declare variable LOTE CHAR(1);
declare variable ENSAMBLE CHAR(1);
declare variable IDENS INTEGER;
declare variable PREFENS VARCHAR(4);
declare variable unidad varchar(8);
declare variable DESCR varchar(60);
declare variable CODPR varchar(15);
declare variable DESPR varchar(60);
declare variable UNIPR varchar(8);
declare variable CANTPR numeric(18,4);
declare variable FACTOR numeric(18,4);
declare variable COSTO numeric(18,2);
declare variable ITEM INTEGER;
declare variable IVA NUMERIC(9,4);
declare variable IVAM NUMERIC(18,2);
declare variable CONSUMO NUMERIC(18,2);
declare variable NROLOTE VARCHAR(15);
BEGIN
  /* INSERTE EL NUEVO LOTE */
  SELECT ARTI_EXIST FROM ARTICULO WHERE ARTICULO.ARTI_COD = NEW.ARTI_COD INTO :LOTE;
  /* ACTUALICE COSTOS cuando no es transferencia */
  if (new.mvar_tipodoc <> 13) then
      BEGIN
      EXECUTE PROCEDURE actualice_costo(new.arti_cod, new.mvar_fecha, new.mvar_costo, new.mvar_cant, new.mvar_entrada, 'N', new.mvar_cons, new.mvar_tipodoc);
      EXECUTE PROCEDURE chequeo_costos(NEW.arti_cod, NEW.mvar_fecha);
      END
  if (new.mvar_tipodoc <> 10) then
    begin
    /* actualice existencias */
    if (new.mvar_entrada = 'S') then
      BEGIN
      execute procedure sume_existencia(new.arti_cod, new.bode_cod, new.mvar_fecha, new.mvar_cant, 'N');
      if (LOTE = 'L') then
        BEGIN
        if (NEW.MVAR_LOTE IS NULL) then
            EXCEPTION LOTE_OBLIGATORIO 'Debe especificar un número de lote para el articulo ' || new.arti_cod;
        ELSE
          BEGIN
          if (EXISTS (SELECT LOTE_NRO FROM LOTES WHERE ARTI_COD = NEW.ARTI_COD AND BODE_COD = NEW.bode_cod AND LOTE_NRO = new.mvar_lote)) THEN
            UPDATE LOTES
              set lote_saldo = lote_saldo + new.mvar_cant
              where (arti_cod = NEW.ARTI_COD) and (BODE_COD = NEW.bode_cod) and (lote_nro = new.mvar_lote);
          ELSE
            INSERT INTO LOTES (ARTI_COD, BODE_COD, LOTE_NRO, LOTE_FECHA, LOTE_CANT, LOTE_COSTO, LOTE_SALDO)
              VALUES (NEW.ARTI_COD, NEW.bode_cod, NEW.mvar_lote, NEW.mvar_fecha, NEW.mvar_cant, NEW.mvar_costo, NEW.mvar_cant);

          if (EXISTS (SELECT LOTE_NRO FROM EXISTENCIA_LOTE WHERE LOTE_NRO = NEW.MVAR_LOTE AND EXLO_FECHA = NEW.MVAR_FECHA AND ARTI_COD = NEW.arti_cod AND BODE_COD = NEW.bode_cod)) then
            BEGIN
            UPDATE EXISTENCIA_LOTE
                SET EXLO_ENT = EXLO_ENT + NEW.mvar_cant
                WHERE LOTE_NRO = NEW.MVAR_LOTE AND EXLO_FECHA = NEW.MVAR_FECHA AND ARTI_COD = NEW.ARTI_COD AND BODE_COD = NEW.bode_cod;
            END
          ELSE
            BEGIN
            INSERT INTO EXISTENCIA_LOTE (ARTI_COD, BODE_COD, LOTE_NRO, EXLO_FECHA, EXLO_SAL, EXLO_ENT)
                VALUES (NEW.ARTI_COD, NEW.bode_cod, NEW.MVAR_LOTE, NEW.MVAR_FECHA, 0, NEW.MVAR_CANT);
            END
          END
        END
      if (NEW.mvar_tipodoc = 33) then
        BEGIN
        SELECT ARTI_ENSAMBLE, ARTI_UNIDAD, ARTI_DES FROM ARTICULO WHERE ARTI_COD = NEW.arti_cod
            INTO :ensamble, :unidad, :descr;
        if (ENSAMBLE = 'S') then
            BEGIN
            /* DESENSAMBLE EL PRODUCTO DEVUELTO */
            IDENS = gen_id(id_desensamble, 1);
            EXECUTE PROCEDURE lee_configuracion('INVENTARIO', 'ENSAMBLES', 'PREFIJO PARA ENSAMBLES AUTOMATICOS AL SACAR PRODUCTOS') returning_values (:prefens);
            INSERT INTO DESENSAMBLES(DESE_ID, TIDO_COD, PREF_PRE, BODE_COD, DESE_NUMERO, DESE_FECHA, DESE_CONC, DESE_REFER, DESE_CANT, DESE_UNIDAD, DESE_FACTOR, DESE_ANULADO, DESE_TRANSMIT,
                ARTI_COD, DESE_DESC, DESE_CODBAR, DESE_LOTE, DESE_OBS, TERC_NIT, DESE_USUARIO, NUMOK, DESE_TIPOREF, DESE_IDREF, DESE_ITEMREF)
                VALUES (:IDENS, 16, :prefens, NEW.bode_cod, '000001', new.mvar_fecha, new.mvar_conc, '', new.mvar_cant, :unidad, 1, 'N', 'N',
                NEW.arti_cod, :descr, NEW.arti_cod, NEW.mvar_lote, NULL, NULL, USER, 'N', NEW.mvar_tipodoc, NEW.mvar_idref, NEW.mvar_item);
            ITEM = 0;
            FOR SELECT ARPR_CANT, ARPR_UNIDAD, ARPR_COMP, ARTI_DES, TAIV_PORC, ARTI_CONSUMO
                FROM articulos_producto P, ARTICULO A, TARIFA_IVA T
                WHERE P.ARTI_COD = NEW.arti_cod AND A.arti_cod = P.arpr_comp AND A.taiv_cod = T.taiv_cod
                INTO :CANTPR, :UNIPR, :CODPR, :DESPR, :IVA, :CONSUMO
                DO
                BEGIN
                ITEM = ITEM + 1;
                EXECUTE PROCEDURE factor_unidad_cant(:codpr,  :unipr) returning_values (:FACTOR);
                EXECUTE PROCEDURE costo_promedio_unidad (:codpr, NEW.mvar_fecha, :UNIPR) returning_values (:COSTO);
                IVAM = costo * cantpr * iva / 100;
                SELECT ARTI_EXIST FROM ARTICULO WHERE ARTI_COD = :codpr INTO :LOTE;
                if (LOTE = 'L') then
                    begin
                    if ((new.mvar_lote is not null) and (new.mvar_lote <> '')) then
                        SELECT MIN(ESDE_LOTE) FROM ENSAMBLES_DETALLE D, ENSAMBLES E WHERE E.ensa_id = D.ensa_id AND
                            E.arti_cod = NEW.arti_cod AND E.ensa_lote = NEW.mvar_lote AND D.arti_cod = :codpr INTO :nrolote;
                    else
                        SELECT first 1 ESDE_LOTE FROM ENSAMBLES_DETALLE D, ENSAMBLES E WHERE E.ensa_id = D.ensa_id AND
                            E.arti_cod = NEW.arti_cod AND E.ensa_fecha <= NEW.mvar_fecha AND D.arti_cod = :codpr
                            order by ensa_fecha desc INTO :nrolote;
                    end
                else
                    nrolote = '';
                INSERT INTO desensambles_detalle(DESE_ID, DESE_ITEM, ARTI_COD, BODE_COD, DEDE_CANT, DEDE_UNIDAD, DEDE_COSTO, DEDE_LOTE, DEDE_FACTOR, DEDE_IVAPORC, DEDE_IVAMONTO, DEDE_CONSUMO, DEDE_CODBAR, DEDE_ANULADO, DEDE_TRANSMIT, DEDE_DESC, DEDE_TOTAL, DEDE_OBS)
                    VALUES (:idens, :ITEM, :codpr,  NEW.bode_cod, :cantpr * NEW.mvar_cant, :unipr, :costo, :nrolote, :FACTOR, :IVA, :ivam, :consumo, :codpr, 'N', 'N', :despr, :COSTO * :cantpr, NULL);
                END
            END
        END
      END
    else
      BEGIN
      execute procedure reste_existencia(new.arti_cod, new.bode_cod, new.mvar_fecha, new.mvar_cant, 'N');
      /* ACTUALICE LA EXISTENCIA DEL LOTE */
      if (LOTE = 'L') then
        if (NEW.mvar_lote IS NULL) then
          EXCEPTION LOTE_NEGATIVO 'Debe indicar un número de lote para el artículo ' || new.arti_cod;
        ELSE
          BEGIN
          /* Actualice el saldo historico del lote */
          if (EXISTS (SELECT LOTE_NRO FROM EXISTENCIA_LOTE WHERE LOTE_NRO = NEW.MVAR_LOTE AND EXLO_FECHA = NEW.MVAR_FECHA AND ARTI_COD = NEW.arti_cod AND BODE_COD = NEW.bode_cod)) then
            BEGIN
            UPDATE EXISTENCIA_LOTE
                SET EXLO_SAL = EXLO_SAL + NEW.mvar_cant
                WHERE LOTE_NRO = NEW.MVAR_LOTE AND EXLO_FECHA = NEW.MVAR_FECHA AND ARTI_COD = NEW.ARTI_COD AND BODE_COD = NEW.bode_cod;
            END
          ELSE
            BEGIN
            INSERT INTO EXISTENCIA_LOTE (ARTI_COD, BODE_COD, LOTE_NRO, EXLO_FECHA, EXLO_SAL, EXLO_ENT)
                VALUES (NEW.ARTI_COD, NEW.bode_cod, NEW.MVAR_LOTE, NEW.MVAR_FECHA, NEW.MVAR_CANT, 0);
            END
          if (EXISTS (SELECT LOTE_NRO FROM LOTES WHERE ARTI_COD = NEW.ARTI_COD AND BODE_COD = NEW.bode_cod AND LOTE_NRO = new.mvar_lote)) THEN
            UPDATE LOTES
              set lote_saldo = lote_saldo - new.mvar_cant
              where (arti_cod = NEW.ARTI_COD) and (BODE_COD = NEW.bode_cod) and (lote_nro = new.mvar_lote);
          else
            EXCEPTION LOTE_NEGATIVO 'No se encontró el lote ' || new.mvar_lote || ' para el articulo ' || new.arti_cod;
          END
      if (NEW.mvar_cant < 0) then
        BEGIN
        SELECT ARTI_ENSAMBLE, ARTI_UNIDAD, ARTI_DES FROM ARTICULO WHERE ARTI_COD = NEW.arti_cod
            INTO :ensamble, :unidad, :descr;
        if (ENSAMBLE = 'S') then
            BEGIN
            /* DESENSAMBLE EL PRODUCTO DEVUELTO */
            IDENS = gen_id(id_desensamble, 1);
            EXECUTE PROCEDURE lee_configuracion('INVENTARIO', 'ENSAMBLES', 'PREFIJO PARA ENSAMBLES AUTOMATICOS AL SACAR PRODUCTOS') returning_values (:prefens);
            INSERT INTO DESENSAMBLES(DESE_ID, TIDO_COD, PREF_PRE, BODE_COD, DESE_NUMERO, DESE_FECHA, DESE_CONC, DESE_REFER, DESE_CANT, DESE_UNIDAD, DESE_FACTOR, DESE_ANULADO, DESE_TRANSMIT,
                ARTI_COD, DESE_DESC, DESE_CODBAR, DESE_LOTE, DESE_OBS, TERC_NIT, DESE_USUARIO, NUMOK, DESE_TIPOREF, DESE_IDREF, DESE_ITEMREF)
                VALUES (:IDENS, 16, :prefens, NEW.bode_cod, '000001', new.mvar_fecha, new.mvar_conc, '', (new.mvar_cant*-1), :unidad, 1, 'N', 'N',
                NEW.arti_cod, :descr, NEW.arti_cod, NEW.mvar_lote, NULL, NULL, USER, 'N', NEW.mvar_tipodoc, NEW.mvar_idref, NEW.mvar_item);
            ITEM = 0;
            FOR SELECT ARPR_CANT, ARPR_UNIDAD, ARPR_COMP, ARTI_DES, TAIV_PORC, ARTI_CONSUMO FROM articulos_producto P, ARTICULO A, TARIFA_IVA T
                WHERE P.ARTI_COD = NEW.arti_cod AND A.arti_cod = P.arpr_comp AND A.taiv_cod = T.taiv_cod
                INTO :CANTPR, :UNIPR, :CODPR, :DESPR, :IVA, :CONSUMO
                DO
                BEGIN
                ITEM = ITEM + 1;
                EXECUTE PROCEDURE factor_unidad_cant(:codpr,  :unipr) returning_values (:FACTOR);
                EXECUTE PROCEDURE costo_promedio_unidad (:codpr, NEW.mvar_fecha, :UNIPR) returning_values (:COSTO);
                IVAM = costo * cantpr * iva / 100;
                SELECT ARTI_EXIST FROM ARTICULO WHERE ARTI_COD = :codpr INTO :LOTE;
                if (LOTE = 'L') then
                    begin
                    if ((new.mvar_lote is not null) and (new.mvar_lote <> '')) then
                        SELECT MIN(ESDE_LOTE) FROM ENSAMBLES_DETALLE D, ENSAMBLES E WHERE E.ensa_id = D.ensa_id AND
                            E.arti_cod = NEW.arti_cod AND E.ensa_lote = NEW.mvar_lote AND D.arti_cod = :codpr INTO :nrolote;
                    else
                        SELECT first 1 ESDE_LOTE FROM ENSAMBLES_DETALLE D, ENSAMBLES E WHERE E.ensa_id = D.ensa_id AND
                            E.arti_cod = NEW.arti_cod AND E.ensa_fecha <= NEW.mvar_fecha AND D.arti_cod = :codpr
                            order by ensa_fecha desc INTO :nrolote;
                    end
                else
                    nrolote = '';
                INSERT INTO desensambles_detalle(DESE_ID, DESE_ITEM, ARTI_COD, BODE_COD, DEDE_CANT, DEDE_UNIDAD, DEDE_COSTO, DEDE_LOTE, DEDE_FACTOR, DEDE_IVAPORC, DEDE_IVAMONTO, DEDE_CONSUMO, DEDE_CODBAR, DEDE_ANULADO, DEDE_TRANSMIT, DEDE_DESC, DEDE_TOTAL, DEDE_OBS)
                    VALUES (:idens, :ITEM, :codpr,  NEW.bode_cod, :cantpr * NEW.mvar_cant, :unipr, :costo, :nrolote, :FACTOR, :IVA, :ivam, :consumo, :codpr, 'N', 'N', :despr, :COSTO * :cantpr, NULL);
                END
            END
        end
      end
    END
END^

SET TERM ; ^

SET TERM ^ ;

ALTER TRIGGER PRODUCCION_ORDEN_AU
as
declare variable CONSEC INTEGER;
declare variable ID INTEGER;
declare variable ARTIC VARCHAR(20);
declare variable TOTAL NUMERIC(18,2);
declare variable COSTO NUMERIC(18,2);
declare variable COSTOS NUMERIC(18,2);
declare variable COSTOD NUMERIC(18,2);
declare variable FEC DATE;
declare variable CANT NUMERIC(18,4);
declare variable CANTE NUMERIC(18,4);
declare variable IDMOV INTEGER;
begin
if (NEW.pror_anulado = 'S') then
    BEGIN
    select enco_consec from comprobante_encabezado where enco_tiporef = 19 and enco_idref = old.pror_id into :consec;
    if (NOT consec is null) then
     delete from comprobante_detalle where enco_consec = :consec;
    delete from comprobante_encabezado where enco_tiporef = 19 and enco_idref = old.pror_id;
    INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
        VALUES (USER, 19, NEW.pror_id, 'A', NEW.pref_pre || NEW.pror_numero);
    END
else
    begin
    if (NEW.pror_estado <> 'A' AND OLD.pror_estado = 'A') then
        BEGIN
        /* ESTAN CERRANDO LA ORDEN */
        FOR SELECT ED.prde_id, ED.ARTI_COD, EE.prde_fecha, ED.pren_cantok
            FROM produccion_entrada_det ED, produccion_entrada_enc EE
            WHERE EE.prde_id = ED.prde_id AND EE.pror_id = NEW.pror_id
            ORDER BY EE.prde_id
            INTO :ID, :artic, :fec, :CANT
            DO
            BEGIN
            TOTAL = 0;
            /* busque el id de la orden */
            SELECT SUM(D.pode_cant * D.pode_costo) FROM produccion_orden_detalle D, produccion_orden E
                WHERE D.pror_id = E.pror_id AND E.pror_id = NEW.pror_id AND D.pode_anulado = 'N' INTO :COSTO;
            if (COSTO IS NULL) then
                COSTO = 0;
            SELECT SUM(prsa_CANT * PRSA_COSTO) FROM produccion_salida_det D, produccion_salida_enc E
                WHERE D.prsa_id = E.prsa_id AND E.pror_id = NEW.pror_id AND D.prsa_anulado = 'N' INTO :COSTOS;
            if (COSTOS IS NULL) then
                COSTOS = 0;
            SELECT SUM(D.prdd_cant * D.prdd_costo) FROM produccion_devolucion_det D, produccion_devolucion E
                WHERE D.prdd_id = E.prdd_id AND E.pror_id = NEW.pror_id AND D.prdd_anulado = 'N' INTO :COSTOD;
            if (COSTOD IS NULL) then
                COSTOD = 0;
            COSTOS = COSTO + COSTOS - COSTOD;
            SELECT SUM(D.pren_cantok + D.pren_cantmal) FROM produccion_entrada_det D, produccion_entrada_enc E
                WHERE D.prde_id = E.prde_id AND E.pror_id = NEW.pror_id AND D.pren_anulado = 'N' INTO :cante;
            if (cante IS NULL) then
                cante = 0;
            if (cante <> 0) then
                TOTAL = COSTOS / CANTE;
            ELSE
                TOTAL = 0;
            FOR SELECT MVAR_CONS FROM MOVIMIENTO_ARTICULO WHERE MVAR_TIPODOC = 20 AND MVAR_IDREF = :ID AND MVAR_ENTRADA = 'S' AND ARTI_COD = :artic
                INTO :IDMOV
                DO
                BEGIN
                EXECUTE PROCEDURE actualice_costo(:artic, :fec, :total, :cant, 'S', 'S', :IDMOV, 20);
                UPDATE MOVIMIENTO_ARTICULO SET MVAR_COSTO = :TOTAL WHERE MVAR_CONS = :IDMOV;
                EXECUTE PROCEDURE actualice_costo(:artic, :fec, :total, :cant, 'S', 'N', :IDMOV, 20);
                EXECUTE PROCEDURE chequeo_costos(:artic, :fec-1);
                END
            END
        END
    INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
        VALUES (USER, 19, NEW.pror_id, 'U', NEW.pref_pre || NEW.pror_numero);
    end
if ((OLD.pref_pre <> NEW.pref_pre) or
    (OLD.pror_numero <> NEW.pror_numero) or
    (OLD.pror_fecha <> NEW.pror_fecha) ) then
    UPDATE produccion_orden_detalle SET PODE_TRANSMIT = 'N' WHERE PROR_ID = OLD.pror_id;

if (OLD.pror_anulado <> NEW.pror_anulado) then
    UPDATE produccion_orden_detalle SET PODE_ANULADO = NEW.pror_anulado WHERE PROR_ID = OLD.pror_id;

if (OLD.pror_transmit <> NEW.pror_transmit) then
    UPDATE produccion_orden_detalle SET PODE_TRANSMIT = NEW.pror_transmit WHERE PROR_ID = OLD.pror_id;
end^

SET TERM ; ^

/* 20140221B */
/* SUCURSAL EN CONTROL DE FACTURAS MENSUALES */

SET TERM ^ ;

CREATE OR ALTER TRIGGER FACTURAS_DETALLE_AI FOR FACTURAS_DETALLE
ACTIVE AFTER INSERT POSITION 0
AS
declare variable fec date;
declare variable NOMCLI VARCHAR(60);
declare variable CONC VARCHAR(60);
declare variable Pref varchar(4);
declare variable Num varchar(8);
declare variable Nit varchar(20);
declare variable TIPO INTEGER;
declare variable INVFAC CHAR(2);
declare variable PEDAUTO CHAR(2);
declare variable CONSO CHAR(2);
declare variable CONSOLIDA INTEGER;
declare variable ESPOS CHAR(1);
declare variable BONOS CHAR(2);
declare variable VRBONO NUMERIC(18,2);
declare variable I INTEGER;
declare variable ITEM INTEGER;
declare variable CANTAUX NUMERIC(18,4);
declare variable CANT NUMERIC(18,4);
declare variable CANTPEND NUMERIC(18,4);
declare variable factmes char(2);
declare variable ano integer;
declare variable mes integer;
declare variable MESES integer;
declare variable grpfm VARCHAR(3);
declare variable grp VARCHAR(3);
declare variable SUCURSAL VARCHAR(10);
BEGIN
select fact_fecha, pref_pre, fact_numero, terc_nit, fact_nomcliente, fact_consolida, fact_sucursal
    from facturas where fact_id = new.fact_id
    into :fec, :Pref, :Num, :Nit, :Nomcli, :Consolida, :sucursal;
if ((NEW.fact_id <> 0) and (new.fade_anulado = 'N')) then
    BEGIN
    EXECUTE PROCEDURE LEE_CONFIGURACION('FACTURACION','FACTURAS','GENERAR PEDIDO AUTOMATICAMENTE CON LA FACTURA') RETURNING_VALUES (PEDAUTO);
    SELECT MAX(CEFA_TIPOORI) FROM consolide_faltantes WHERE CEFA_ID = :CONSOLIDA INTO :TIPO;
    if (Tipo IS NULL) then
        Tipo = 0;
    execute procedure lee_configuracion('FACTURACION', 'FACTURAS', 'AFECTAR INVENTARIO CON LA FACTURA') returning_values (:INVFAC);
    SELECT MIN(AUTO_ESPOS) FROM AUTORIZACIONES WHERE PREF_PRE = :pref INTO :ESPOS;
    if (ESPOS = 'S') then
        BEGIN
        INVFAC = 'SI';
        PEDAUTO = 'NO';
        END
    /* si se hizo con base en una remisi¢n no afecte inventario */
    if ((Tipo <> 32) and (INVFAC = 'SI')) then
        begin
        CANTPEND = 0;
        if ((NEW.fade_idpend <> 0) AND (NEW.fade_itempend <> 0)) then
            BEGIN
            select d.pevd_cant * d.pevd_factor from pendiente_ventas_detalle D WHERE D.pend_id = NEW.fade_idpend AND D.pevd_item = NEW.fade_itempend into :cantpend;
            if ((new.fade_cant * new.fade_factor) < cantpend) then
                exception cantidad_cruce_mayor 'La cantidad facturada ' || cast(new.fade_cant * new.fade_factor as varchar(20)) || ' no puede ser menor al pendiente previamente grabado' || cast(:cantpend as varchar(20));
            /* ACTUALICE EL IDFACT EN EL PENDIENTE */
            UPDATE pendiente_ventas_detalle D SET D.pevd_idfact = NEW.fact_id WHERE D.pend_id = NEW.fade_idpend AND D.pevd_item = NEW.fade_itempend AND ((D.pevd_idfact IS NULL) or (D.pevd_idfact = 0));
            END
        if (STRLEN(NOMCLI) > 40) then
            CONC = 'FV No.' || :pref || :num || '-' || SUBSTR(NOMCLI, 1, 40);
        ELSE
            CONC = 'FV No.' || :pref || :NUM || '-' || NOMCLI;
        if ((((new.fade_factor * new.fade_cant) - cantpend) > 0) or (new.fade_cant < 0))  then
            INSERT INTO MOVIMIENTO_ARTICULO
                (ARTI_COD, BODE_COD, MVAR_FECHA, MVAR_TIPODOC, MVAR_IDREF, MVAR_CONC, MVAR_CANT, MVAR_COSTO, MVAR_ENTRADA, MVAR_LOTE, MVAR_PREF, MVAR_NUMERO, MVAR_ITEM, TERC_NIT)
                VALUES(NEW.ARTI_COD, NEW.BODE_COD, :FEC, 31, NEW.fact_id,
                :CONC, new.fade_factor * new.fade_cant, 0, 'N', new.fade_lote, :Pref, :Num, new.fade_item, :Nit);
        end
    if (PEDAUTO = 'SI') then
        BEGIN
        INSERT INTO PEDIDOS_DETALLE (PEDI_ID, PEDE_ITEM, ARTI_COD, PEDE_CANT, PEDE_UNIDAD, PEDE_DTOPORC, PEDE_DTOMONTO, PEDE_IVAPORC, PEDE_IVAMONTO, PEDE_CONSUMO, PEDE_FACTOR, PEDE_DESC, PEDE_OBS, PEDE_CODBAR, PEDE_TOTAL, PEDE_ANULADO, PEDE_TRANSMIT, LIPR_COD, PEDE_REFERENCIA, PEDE_PRUNIT, PEDE_FACTURAD, PEDE_REMISIONAD, PEDE_RESERVA, BODE_COD)
            VALUES (GEN_ID(id_pedido,0), NEW.FADE_ITEM, NEW.ARTI_COD, NEW.FADE_CANT, NEW.FADE_UNIDAD, NEW.FADE_DTOPORC, NEW.FADE_DTOMONTO, NEW.FADE_IVAPORC, NEW.FADE_IVAMONTO, NEW.FADE_CONSUMO, NEW.FADE_FACTOR, NEW.FADE_DESC, NEW.FADE_OBS, NEW.FADE_CODBAR, NEW.FADE_TOTAL, 'N', 'N', NEW.LIPR_COD, NEW.FADE_REFERENCIA, NEW.FADE_PRUNIT, NEW.FADE_CANT * NEW.FADE_FACTOR, 0, NEW.FADE_CANT * NEW.FADE_FACTOR, NEW.bode_cod);
        END
    ELSE
        BEGIN
        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.fact_id, COFA_CANTCR = COFA_CANT * COFA_FACTOR, COFA_FECDES = :fec
                    where COFA_ID = :consolida AND ARTI_COD = NEW.ARTI_COD;
            ELSE
                BEGIN
                CANTAUX = new.fade_cant * new.fade_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.fact_id, COFA_CANTCR = COFA_CANT * COFA_FACTOR, COFA_FECDES = :fec
                                where COFA_ID = :consolida and COFA_ITEM = :ITEM;
                            CANTAUX = CANTAUX - CANT;
                            end
                        else
                            begin
                            update consolidado_faltantes
                                set COFA_IDDES = new.fact_id, COFA_CANTCR = COFA_CANTCR + :CANTAUX, COFA_FECDES = :fec
                                where COFA_ID = :consolida and COFA_ITEM = :ITEM;
                            CANTAUX = 0;
                            end
                    end
                END
            END
        END
    EXECUTE procedure LEE_CONFIGURACION ('FACTURACION', 'ARTICULOS', 'PERMITIR GENERAR BONOS DE PAGO AL FACTURAR ARTICULOS SELECCIONADOS') returning_values (BONOS);
    if (BONOS = 'SI') then
        BEGIN
        SELECT ARTI_VALORBONO FROM ARTICULO WHERE ARTI_COD = NEW.arti_cod INTO :VRBONO;
        if (VRBONO <> 0) then
            BEGIN
            I = 1;
            WHILE (I <= (NEW.fade_cant * NEW.fade_factor)) DO
                BEGIN
                INSERT INTO BONOS_PAGO (BOPA_ID, BOPA_FACTURA, BOPA_PREF, BOPA_NUMERO, BOPA_FECHA, BOPA_ITEM, BOPA_MONTO, BOPA_IDRDC)
                    VALUES (GEN_ID(ID_BONOPAGO, 1), NEW.fact_id, :pref, :num, :fec, :I, :VRBONO, 0);
                I = I + 1;
                END
            END
        END
    execute procedure lee_configuracion('FACTURACION', 'FACTURAS', 'CONTROLAR FACTURACION MENSUAL POR CADA CLIENTE') returning_values (:factmes);
    if (factmes = 'SI') Then
        begin
        execute procedure lee_configuracion('FACTURACION', 'FACTURAS', 'GRUPO DE MERCANCIA PARA CONTROL MENSUAL DE FACTURACION') returning_values (:grpfm);
        SELECT GRUP_COD FROM ARTICULO WHERE ARTI_COD = NEW.arti_cod INTO :GRP;
        if (GRP = :GRPFM) then
            BEGIN
            /* actualice el control de facturacion */
            ano = extract(year from :fec);
            mes = extract(month from :fec);
            MESES = NEW.fade_cant;
            UPDATE movimiento_clientes SET MVCL_CONC = NEW.FADE_DESC || ' MES' WHERE MVCL_TIPOREF = 31 AND MVCL_IDREF = NEW.FACT_ID;
            while (meses > 0) DO
                BEGIN
                if (exists (select fame_nit from facturas_mes where fame_nit = :nit and fame_sucursal = :sucursal and fame_ano = :ano and fame_mes = :mes)) then
                    exception mes_ya_facturado 'El cliente ' || :NIT || '-' || :sucursal || ' ya tiene una factura de ' || :ano || '-' || :mes;
                else
                    INSERT INTO facturas_mes (FAME_NIT, FAME_ANO, FAME_MES, FAME_IDFACT, FAME_SUCURSAL)
                        VALUES (:nit, :ANO, :MES, NEW.fact_id, :sucursal);
                UPDATE movimiento_clientes SET MVCL_CONC = MVCL_CONC || ' ' || :MES WHERE MVCL_TIPOREF = 31 AND MVCL_IDREF = NEW.FACT_ID;
                MES = MES + 1;
                MESES = MESES - 1;
                END
            END
        end
    END
END^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER TRIGGER FACTURAS_DETALLE_AU FOR FACTURAS_DETALLE
ACTIVE AFTER UPDATE POSITION 0
as
declare variable fec date;
declare variable CONC VARCHAR(60);
declare variable NOMCLI varchar(60);
declare variable Pref varchar(4);
declare variable Num varchar(8);
declare variable Nit varchar(20);
declare variable factor numeric(18,4);
declare variable INVFAC CHAR(2);
declare variable TIPO INTEGER;
declare variable PEDAUTO CHAR(2);
declare variable CONSO CHAR(2);
declare variable CONSOLIDA INTEGER;
declare variable consec INTEGER;
declare variable ESPOS CHAR(1);
declare variable BONOS CHAR(2);
declare variable VRBONO NUMERIC(18,2);
declare variable I INTEGER;
declare variable ITEM INTEGER;
declare variable CANTAUX NUMERIC(18,4);
declare variable CANTPEND NUMERIC(18,4);
declare variable CANT NUMERIC(18,4);
declare variable factmes char(2);
declare variable ano integer;
declare variable mes integer;
declare variable MESES integer;
declare variable grpfm VARCHAR(3);
declare variable grp VARCHAR(3);
declare variable SUCURSAL VARCHAR(10);
BEGIN
EXECUTE PROCEDURE LEE_CONFIGURACION('FACTURACION','FACTURAS','GENERAR PEDIDO AUTOMATICAMENTE CON LA FACTURA') RETURNING_VALUES (PEDAUTO);
execute procedure lee_configuracion('FACTURACION', 'FACTURAS', 'CONTROLAR FACTURACION MENSUAL POR CADA CLIENTE') returning_values (:factmes);
if ((OLD.fact_id <> 0) AND (OLD.fade_anulado = 'N')) then
    BEGIN
    if ((OLD.FADE_CANT * OLD.FADE_FACTOR <> NEW.fade_cant * NEW.fade_factor) or (OLD.fade_total <> NEW.fade_total) or (OLD.arti_cod <> NEW.arti_cod) or (NEW.fade_anulado = 'S')) then
        begin
        DELETE FROM MOVIMIENTO_ARTICULO WHERE (mvar_tipodoc = 31) and (mvar_idref = OLD.fact_id) and (mvar_item = old.fade_item);
        if ((OLD.fade_idpend <> 0) AND (OLD.fade_itempend <> 0)) then
            BEGIN
            /* ACTUALICE EL IDFACT EN EL PENDIENTE */
            UPDATE pendiente_ventas_detalle D SET D.pevd_idfact = 0 WHERE D.pend_id = OLD.fade_idpend AND D.pevd_item = OLD.fade_itempend;
            END

        if (PEDAUTO = 'SI') then
            BEGIN
            SELECT pref_pre, fact_numero from facturas where fact_id = OLD.fact_id
                into :Pref, :Num;
            SELECT PEDI_ID FROM PEDIDOS WHERE PREF_PRE = :pref AND PEDI_NUMERO = :num into :consec;
            if (consec is not null) then
              DELETE FROM PEDIDOS_DETALLE WHERE PEDE_ITEM = OLD.FADE_ITEM AND PEDI_ID = :consec;
            END
        ELSE
            BEGIN
            /* DESHAGA LOS PENDIENTES */
            select fact_consolida from facturas where fact_id = old.fact_id into :Consolida;
            if (CONSOLIDA <> 0) then
                begin
                CANTAUX = old.fade_cant * old.fade_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
            END
        delete from bonos_pago where bopa_factura = old.fact_id;
        if (factmes = 'SI') Then
            DELETE FROM facturas_mes WHERE FAME_IDFACT = OLD.fact_id;
        end
    END
if ((NEW.fact_id <> 0) and (new.fade_anulado = 'N')) then
    if ((OLD.fact_id = 0) OR (OLD.FADE_CANT * OLD.FADE_FACTOR <> NEW.fade_cant * NEW.fade_factor) or (OLD.fade_total <> NEW.fade_total) or (OLD.arti_cod <> NEW.arti_cod) or (OLD.fade_anulado = 'S')) then
      BEGIN
      select fact_fecha, pref_pre, fact_numero, terc_nit, fact_nomcliente, fact_consolida, fact_sucursal
            from facturas where fact_id = new.fact_id
            into :fec, :Pref, :Num, :Nit, :Nomcli, :Consolida, :sucursal;
      SELECT MAX(CEFA_TIPOORI) FROM consolide_faltantes WHERE CEFA_ID = :CONSOLIDA INTO :TIPO;
      if (Tipo IS NULL) then
        Tipo = 0;
      execute procedure lee_configuracion('FACTURACION', 'FACTURAS', 'AFECTAR INVENTARIO CON LA FACTURA') returning_values (:INVFAC);
      SELECT MIN(AUTO_ESPOS) FROM AUTORIZACIONES WHERE PREF_PRE = :pref INTO :ESPOS;
      if (ESPOS = 'S') then
        BEGIN
        INVFAC = 'SI';
        PEDAUTO = 'NO';
        END
       /* si se hizo con base en una remisi¢n no afecte inventario */
      if ((Tipo <> 32) and (INVFAC = 'SI')) then
        begin
        CANTPEND = 0;
        if ((NEW.fade_idpend <> 0) AND (NEW.fade_itempend <> 0)) then
          BEGIN
          /* ACTUALICE EL IDFACT EN EL PENDIENTE */
          select d.pevd_cant * d.pevd_factor from pendiente_ventas_detalle D WHERE D.pend_id = NEW.fade_idpend AND D.pevd_item = NEW.fade_itempend into :cantpend;
          if ((new.fade_cant * new.fade_factor) < cantpend) then
            exception cantidad_cruce_mayor 'La cantidad facturada ' || cast(new.fade_cant * new.fade_factor as varchar(20)) || ' es menor al pendiente previamente grabado' || cast(:cant as varchar(20));
          UPDATE pendiente_ventas_detalle D SET D.pevd_idfact = NEW.fact_id WHERE D.pend_id = NEW.fade_idpend AND D.pevd_item = NEW.fade_itempend AND ((D.pevd_idfact IS NULL) or (D.pevd_idfact = 0));
          END
        if (STRLEN(NOMCLI) > 29) then
            CONC = 'FACTURA DE VENTA No.' || PREF || NUM || '-' || SUBSTR(NOMCLI,1,29);
        ELSE
            CONC = 'FACTURA DE VENTA No.' || PREF || NUM || '-' || NOMCLI;
        DELETE FROM MOVIMIENTO_ARTICULO WHERE (mvar_tipodoc = 31) and (mvar_idref = OLD.fact_id) and (mvar_item = old.fade_item);
        execute procedure factor_unidad_cant(new.arti_cod, new.fade_unidad) returning_values(factor);
        if ((((:factor * new.fade_cant) - cantpend) > 0) or (new.fade_cant < 0)) then
            BEGIN
            INSERT INTO MOVIMIENTO_ARTICULO
                (ARTI_COD, BODE_COD, MVAR_FECHA, MVAR_TIPODOC, MVAR_IDREF, MVAR_CONC, MVAR_CANT, MVAR_COSTO, MVAR_ENTRADA, MVAR_LOTE, MVAR_PREF, MVAR_NUMERO, MVAR_ITEM, TERC_NIT)
                VALUES(NEW.ARTI_COD, NEW.BODE_COD, :FEC, 31, NEW.fact_id,
                :CONC, :factor * new.fade_cant, 0, 'N', new.fade_lote, :Pref, :Num, new.fade_item, :Nit);
            END
        end
      if (PEDAUTO = 'SI') then
        BEGIN
        INSERT INTO PEDIDOS_DETALLE (PEDI_ID, PEDE_ITEM, ARTI_COD, PEDE_CANT, PEDE_UNIDAD, PEDE_DTOPORC, PEDE_DTOMONTO, PEDE_IVAPORC, PEDE_IVAMONTO, PEDE_CONSUMO, PEDE_FACTOR, PEDE_DESC, PEDE_OBS, PEDE_CODBAR, PEDE_TOTAL, PEDE_ANULADO, PEDE_TRANSMIT, LIPR_COD, PEDE_REFERENCIA, PEDE_PRUNIT, PEDE_FACTURAD, PEDE_REMISIONAD, PEDE_RESERVA, BODE_COD)
            VALUES (0, NEW.FADE_ITEM, NEW.ARTI_COD, NEW.FADE_CANT, NEW.FADE_UNIDAD, NEW.FADE_DTOPORC, NEW.FADE_DTOMONTO, NEW.FADE_IVAPORC, NEW.FADE_IVAMONTO, NEW.FADE_CONSUMO, NEW.FADE_FACTOR, NEW.FADE_DESC, NEW.FADE_OBS, NEW.FADE_CODBAR, NEW.FADE_TOTAL, 'N', 'N', NEW.LIPR_COD, NEW.FADE_REFERENCIA, NEW.FADE_PRUNIT, NEW.FADE_CANT * NEW.FADE_FACTOR, 0, NEW.FADE_CANT * NEW.FADE_FACTOR, NEW.bode_cod);
        END
      ELSE
        BEGIN
        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.fact_id, COFA_CANTCR = COFA_CANT * COFA_FACTOR, COFA_FECDES = :fec
                    where COFA_ID = :consolida AND ARTI_COD = NEW.ARTI_COD;
            ELSE
                BEGIN
                CANTAUX = new.fade_cant * new.fade_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.fact_id, COFA_CANTCR = COFA_CANT * COFA_FACTOR, COFA_FECDES = :fec
                                where COFA_ID = :consolida and COFA_ITEM = :ITEM;
                            CANTAUX = CANTAUX - CANT;
                            end
                        else
                            begin
                            update consolidado_faltantes
                                set COFA_IDDES = new.fact_id, COFA_CANTCR = COFA_CANTCR + :CANTAUX, COFA_FECDES = :fec
                                where COFA_ID = :consolida and COFA_ITEM = :ITEM;
                            CANTAUX = 0;
                            end
                    end
                END
            END
        END
      EXECUTE procedure LEE_CONFIGURACION ('FACTURACION', 'ARTICULOS', 'PERMITIR GENERAR BONOS DE PAGO AL FACTURAR ARTICULOS SELECCIONADOS') returning_values (BONOS);
      if (BONOS = 'SI') then
        BEGIN
        SELECT ARTI_VALORBONO FROM ARTICULO WHERE ARTI_COD = NEW.arti_cod INTO :VRBONO;
        if (VRBONO <> 0) then
            BEGIN
            I = 1;
            WHILE (I <= (NEW.fade_cant * NEW.fade_factor)) DO
                BEGIN
                INSERT INTO BONOS_PAGO (BOPA_ID, BOPA_FACTURA, BOPA_PREF, BOPA_NUMERO, BOPA_FECHA, BOPA_ITEM, BOPA_MONTO, BOPA_IDRDC)
                    VALUES (GEN_ID(ID_BONOPAGO, 1), NEW.fact_id, :pref, :num, :fec, :I, :VRBONO, 0);
                I = I + 1;
                END
            END
        END
      if (factmes = 'SI') Then
        begin
        execute procedure lee_configuracion('FACTURACION', 'FACTURAS', 'GRUPO DE MERCANCIA PARA CONTROL MENSUAL DE FACTURACION') returning_values (:grpfm);
        SELECT GRUP_COD FROM ARTICULO WHERE ARTI_COD = NEW.arti_cod INTO :GRP;
        if (GRP = :GRPFM) then
            BEGIN
            /* actualice el control de facturacion */
            ano = extract(year from :fec);
            mes = extract(month from :fec);
            MESES = NEW.fade_cant;
            UPDATE movimiento_clientes SET MVCL_CONC = NEW.FADE_DESC || ' MES' WHERE MVCL_TIPOREF = 31 AND MVCL_IDREF = NEW.FACT_ID;
            while (meses > 0) DO
                BEGIN
                if (exists (select fame_nit from facturas_mes where fame_nit = :nit and fame_sucursal = :sucursal and fame_ano = :ano and fame_mes = :mes)) then
                    exception mes_ya_facturado 'El cliente ' || :NIT || '-' || :sucursal || ' ya tiene una factura de ' || :ano || '-' || :mes;
                else
                    INSERT INTO facturas_mes (FAME_NIT, FAME_ANO, FAME_MES, FAME_IDFACT, FAME_SUCURSAL)
                        VALUES (:nit, :ANO, :MES, NEW.fact_id, :sucursal);
                UPDATE movimiento_clientes SET MVCL_CONC = MVCL_CONC || ' ' || :MES WHERE MVCL_TIPOREF = 31 AND MVCL_IDREF = NEW.FACT_ID;
                MES = MES + 1;
                MESES = MESES - 1;
                END
            END
        end
      END
END^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER procedure REP_FACTURAS_MES (
    DESDE varchar(20),
    HASTA varchar(20),
    GRPINI varchar(5),
    GRPFIN varchar(5),
    ANO varchar(4),
    MES integer,
    ORDEN char(1),
    AGRUPA char(1))
returns (
    NIT varchar(20),
    NOMBRE varchar(60),
    TELEFONO varchar(40),
    CIUDAD varchar(40),
    CONTACTO varchar(60),
    EMAIL varchar(100),
    FAX varchar(25),
    CEL varchar(25),
    CODCLI varchar(20),
    CODZONA varchar(2),
    NOMZONA varchar(60),
    CODCOBR integer,
    NOMCOBR varchar(60),
    DV char(1),
    CODCIUD char(5),
    NOMCIUD varchar(60),
    SUCURSAL varchar(10),
    NOMSUC varchar(60))
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);
begin
if (ORDEN = 'C') then
    BEGIN
    NITINI = DESDE;
    NITFIN = HASTA;
    NOMINI = '';
    NOMFIN = 'zz';
    END
ELSE
    BEGIN
    NOMINI = DESDE;
    NOMFIN = HASTA;
    NITINI = '';
    NITFIN = 'zz';
    END
FOR select T.TERC_NIT, TERC_NOM, TERC_DV, CLSU_TEL, CLSU_CIUDAD, S.COBR_COD, S.ZONA_COD, T.CIUD_COD, CLCU_COD, CLSU_NOMBRE, TERC_CONTACTO, TERC_EMAIL, TERC_FAX, TERC_CEL, CLIE_COD
    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
        T.TERC_NOM >= :NOMINI AND T.TERC_NOM <= :NOMFIN
    INTO :NIT, :NOMBRE, :DV, :TELEFONO, :CIUDAD, :CODCOBR, :CODZONA, :CODCIUD, :SUCURSAL, :NOMSUC, :CONTACTO, :EMAIL, :FAX, :CEL, :CODCLI
    DO  
    BEGIN
    SELECT COBR_NOM FROM COBRADORES CB WHERE COBR_COD = :CODCOBR INTO :NOMCOBR;
    SELECT ZONA_NOM FROM ZONAS Z 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
        if (NOT EXISTS (SELECT FAME_IDFACT FROM FACTURAS_MES WHERE FAME_NIT = :nit AND FAME_SUCURSAL = :sucursal AND FAME_ANO = :ANO AND FAME_MES = :MES)) then
            SUSPEND;
        END
    END
end^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER procedure REP_SIN_FACTURAS_MES (
    DESDE varchar(20),
    HASTA varchar(20),
    GRPINI varchar(5),
    GRPFIN varchar(5),
    ANO varchar(4),
    MES integer,
    ORDEN char(1),
    AGRUPA char(1))
returns (
    NIT varchar(20),
    NOMBRE varchar(60),
    TELEFONO varchar(40),
    CIUDAD varchar(40),
    CONTACTO varchar(60),
    EMAIL varchar(100),
    FAX varchar(25),
    CEL varchar(25),
    CODCLI varchar(20),
    CODZONA varchar(2),
    NOMZONA varchar(60),
    CODCOBR integer,
    NOMCOBR varchar(60),
    DV char(1),
    CODCIUD char(5),
    NOMCIUD varchar(60),
    SUCURSAL varchar(10),
    NOMSUC varchar(60))
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);
begin
if (ORDEN = 'C') then
    BEGIN
    NITINI = DESDE;
    NITFIN = HASTA;
    NOMINI = '';
    NOMFIN = 'zz';
    END
ELSE
    BEGIN
    NOMINI = DESDE;
    NOMFIN = HASTA;
    NITINI = '';
    NITFIN = 'zz';
    END
FOR select T.TERC_NIT, TERC_NOM, TERC_DV, CLSU_TEL, CLSU_CIUDAD, S.COBR_COD, S.ZONA_COD, T.CIUD_COD, CLCU_COD, CLSU_NOMBRE, TERC_CONTACTO, TERC_EMAIL, TERC_FAX, TERC_CEL, CLIE_COD
    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
        T.TERC_NOM >= :NOMINI AND T.TERC_NOM <= :NOMFIN
    INTO :NIT, :NOMBRE, :DV, :TELEFONO, :CIUDAD, :CODCOBR, :CODZONA, :CODCIUD, :SUCURSAL, :NOMSUC, :CONTACTO, :EMAIL, :FAX, :CEL, :CODCLI
    DO  
    BEGIN
    SELECT COBR_NOM FROM COBRADORES CB WHERE COBR_COD = :CODCOBR INTO :NOMCOBR;
    SELECT ZONA_NOM FROM ZONAS Z 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
        if (NOT EXISTS (SELECT FAME_IDFACT FROM FACTURAS_MES WHERE FAME_NIT = :nit AND FAME_SUCURSAL = :sucursal AND FAME_ANO = :ANO AND FAME_MES = :MES)) then
            SUSPEND;
        END
    END
end^

SET TERM ; ^

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 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 ; ^

/* 20140225F */
/* VERIFICAR MONTO DE LA NOTA ASOCIADA POR SI ACASO YA QUE EL NUMERO PUEDE QUEDAR GRABADO */

SET TERM ^ ;

CREATE OR ALTER TRIGGER TRASLADOS_AU FOR TRASLADOS
ACTIVE AFTER UPDATE POSITION 0
AS
declare variable CONC VARCHAR(60);
declare variable ID INTEGER;
declare variable consec INTEGER;
BEGIN
/* borre la contabilizacion */
if (new.tras_anulado = 'S') then
    begin
    select enco_consec from comprobante_encabezado where enco_tiporef = 76 and enco_idref = old.tras_id into :consec;
    if (NOT consec is null) then
      delete from comprobante_detalle where enco_consec = :consec;
    delete from comprobante_encabezado where enco_tiporef = 76 and enco_idref = old.tras_id;
    INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD, AUDI_TICO)
        VALUES (USER,76, NEW.tras_id, 'A', NEW.prba_pref || NEW.tras_numero, NEW.cuba_cod);
    end

if ((old.tras_id <> 0) and (old.tras_anulado = 'N')) then
    begin
    UPDATE MOVIMIENTO_BANCO
        SET MOBA_CONCEPTO = 'ANULADO', MOBA_TOTAL = 0
        WHERE MOBA_TIPODOC = 76 AND MOBA_IDREF = NEW.tras_id;
    DELETE FROM MOVIMIENTO_BANCO
        WHERE MOBA_TIPODOC <> 76 AND MOBA_TIPOREF = 76 AND MOBA_IDREF = NEW.tras_id;
    if (new.tras_anulado = 'N') then
        DELETE FROM notas_debito
            WHERE PRBA_PREF = OLD.tras_notapref AND NDBC_NUMERO = OLD.tras_nota AND CUBA_COD = OLD.cuba_cod and NDBC_MONTO = OLD.tras_notamonto;
    else
        UPDATE notas_debito SET NDBC_ANULADO = 'S'
            WHERE PRBA_PREF = OLD.tras_notapref AND NDBC_NUMERO = OLD.tras_nota AND CUBA_COD = OLD.cuba_cod and NDBC_MONTO = OLD.tras_notamonto;
    END
if ((NEW.tras_id <> 0) AND (NEW.TRAS_ANULADO = 'N')) then
    BEGIN
    /* Inserte el movimiento de la cuenta origen */
    INSERT INTO MOVIMIENTO_BANCO
        (MOBA_ID, CUBA_COD, MOBA_TIPODOC, MOBA_PREF, MOBA_NUMERO, MOBA_FECHA, MOBA_CONCEPTO, MOBA_TOTAL, MOBA_DB, MOBA_IDREF, MOBA_TIPOREF)
        VALUES(GEN_ID(ID_MOVBANCO,1), NEW.cuba_cod, 76, NEW.PRBA_PREF, NEW.tras_numero, NEW.tras_fecha, NEW.tras_concepto, NEW.tras_monto, 'N', new.tras_id, 76);
    /* Inserte el movimiento de la cuenta destino */
    INSERT INTO MOVIMIENTO_BANCO
        (MOBA_ID, CUBA_COD, MOBA_TIPODOC, MOBA_PREF, MOBA_NUMERO, MOBA_FECHA, MOBA_CONCEPTO, MOBA_TOTAL, MOBA_DB, MOBA_IDREF, MOBA_TIPOREF)
        VALUES(GEN_ID(ID_MOVBANCO,1), NEW.tras_ctadest, 76, NEW.PRBA_PREF, NEW.tras_numero, NEW.tras_fecha, NEW.tras_concepto, NEW.tras_monto, 'S', new.tras_id, 76);
    if (new.tras_gmfmonto <> 0) then
        begin
        conc = 'GMF EN TRASLADO No. ' || NEW.PRBA_PREF || NEW.TRAS_NUMERO;
        INSERT INTO MOVIMIENTO_BANCO
            (MOBA_ID, CUBA_COD, MOBA_TIPODOC, MOBA_PREF, MOBA_NUMERO, MOBA_FECHA, MOBA_CONCEPTO, MOBA_TOTAL, MOBA_DB, MOBA_IDREF, MOBA_TIPOREF)
            VALUES(GEN_ID(ID_MOVBANCO,1), NEW.cuba_cod, 79, NEW.PRBA_PREF, NEW.tras_numero, NEW.tras_fecha, :conc, NEW.tras_gmfmonto, 'N', new.tras_id, 76);
        end
    if (new.tras_notamonto <> 0) then
        begin
        conc = 'COMISION EN TRASLADO No. ' || NEW.PRBA_PREF || NEW.TRAS_NUMERO;
        EXECUTE PROCEDURE CAMBIE_ID_NOTA_DB_BANCO returning_values (ID);
        INSERT INTO NOTAS_DEBITO
            (NDBC_ID, CUBA_COD, PRBA_PREF, NDBC_NUMERO, NDBC_FECHA, NDBC_CONCEPTO, NDBC_MONTO, NDBC_IVAPORC, NDBC_IVAMONTO, NDBC_GMFPORC, NDBC_GMFMONTO, NDBC_ANULADO, NDBC_TRANSMIT)
            VALUES(:ID, NEW.cuba_cod, NEW.PRBA_PREF, NEW.tras_nota, NEW.tras_fecha, :conc, NEW.tras_notamonto, NEW.tras_ivaporc2, new.tras_ivamonto2, 0, 0, 'N', 'N');
        end
    INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD, AUDI_TICO)
        VALUES (NEW.tras_usuario, 76, NEW.tras_id, 'U', NEW.prba_pref || NEW.tras_numero, NEW.cuba_cod);
    END
END^

SET TERM ; ^

/* 20140226 */
/* MAL NOMBRE DE MODULO EN ALGUNOS PROCEDIMIENTOS */

UPDATE PROCEDIMIENTOS_USUARIO
SET PRUS_MODULO = 'C. X PAGAR'
WHERE (PRUS_COD = 6);


UPDATE PROCEDIMIENTOS_USUARIO
SET PRUS_MODULO = 'CAJA'
WHERE (PRUS_COD = 7);


UPDATE PROCEDIMIENTOS_USUARIO
SET PRUS_MODULO = 'CAJA'
WHERE (PRUS_COD = 8);


UPDATE PROCEDIMIENTOS_USUARIO
SET PRUS_MODULO = 'CAJA'
WHERE (PRUS_COD = 9);


UPDATE PROCEDIMIENTOS_USUARIO
SET PRUS_MODULO = 'CAJA'
WHERE (PRUS_COD = 10);
COMMIT WORK;

/* 20140303d */
/* error campos trocados en el select del emsamble */
SET TERM ^ ;

CREATE OR ALTER procedure REP_ENSAMBLES (
    FECINI date,
    FECFIN date,
    PREFINI varchar(4),
    PREFFIN varchar(4),
    OPER integer,
    MAQUI integer,
    BODINI varchar(2),
    BODFIN varchar(2),
    DETALLE char(1),
    SUBEMPRESA integer)
returns (
    FECHA date,
    PREF varchar(4),
    NUMERO varchar(8),
    TURNO varchar(60),
    OPERARIO varchar(60),
    MAQUINA varchar(60),
    BODEGA varchar(2),
    NOMBODEGA varchar(60),
    PRODUCTO varchar(20),
    DESPROD varchar(60),
    CANT numeric(18,4),
    PESO numeric(18,4),
    RETAL varchar(60),
    PESORETAL numeric(18,4),
    CONC varchar(60),
    OBS varchar(255),
    CODCOMP varchar(20),
    DESCOMP varchar(60),
    CANTCOMP numeric(18,4),
    BODCOMP varchar(2),
    PESOCOMP numeric(18,4))
AS
declare variable cantretal NUMERIC(18,4);
declare variable ID INTEGER;
begin
FOR SELECT ENSA_ID, E.PREF_PRE, ENSA_NUMERO, ENSA_FECHA, ENSA_CONC, E.BODE_COD, BODE_NOM, ENSA_TURNO, ENSA_CODBAR, ENSA_DESC,
    ENSA_CANT, ENSA_PESO, ENSA_OBS, ENSA_CODRETAL, ENSA_CANTRETAL, ENSA_OPER, ENSA_MAQUINA
    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 E.PREF_PRE >= :prefini AND E.PREF_PRE <= :preffin
     AND P.PREF_PRE = E.PREF_PRE AND P.TIDO_COD = 15 AND ((P.SUCU_ID = :SUBEMPRESA) or (:SUBEMPRESA = 0)) AND ENSA_ANULADO = 'N'
     AND ((:OPER = 0) OR (ENSA_OPER = :OPER)) AND ((:MAQUI = 0) or (ENSA_MAQUINA = :MAQUI)) AND E.bode_cod >= :bodini AND E.bode_cod <= :bodfin
    ORDER BY ENSA_FECHA, ENSA_ID
    into :ID, :PREF, :NUMERO, :FECHA, :conc, :bodega, :nombodega, :turno, :producto, :desprod,
    :cant, :peso, :OBS, :retal, :cantretal, :operario, :maquina
    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;
    SELECT ARTI_PESO FROM ARTICULO WHERE ARTI_COD = :retal INTO :pesoretal;
    if (pesoretal IS NULL) then
        pesoretal = 0;
    pesoretal = pesoretal * cantretal / 1000;
    if (DETALLE = 'S') then
        FOR SELECT ESDE_CODBAR, ESDE_DESC, ESDE_CANT, BODE_COD, ESDE_PESO
            FROM ensambles_detalle D, ARTICULO A WHERE D.ARTI_COD = A.ARTI_COD AND D.ENSA_ID = :ID INTO
            :codcomp, :descomp, :cantcomp, :bodcomp, :pesocomp
            DO
            BEGIN
            SUSPEND;
            END
    else
        SUSPEND;
    END
end^

SET TERM ; ^

update revision set revi_fecha = '2014/03/03';
commit work;

/* 20140226B IMPR */
SET TERM ^ ;

CREATE OR ALTER procedure IMPR_ORDENCMP (
    ID integer,
    BODINI varchar(2),
    BODFIN varchar(2))
returns (
    PREF varchar(4),
    NUMERO varchar(8),
    FECHA date,
    DIASVENCE integer,
    NIT varchar(20),
    NOMTERCERO varchar(60),
    CODBODEGA varchar(2),
    NOMBODEGA varchar(30),
    COTIZACION varchar(30),
    SUBTOTAL numeric(18,2),
    DTOPORC numeric(9,2),
    DTOMONTO numeric(18,2),
    ADICIONAL numeric(18,2),
    IVAMONTO 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),
    RTECREE numeric(9,2),
    RTECREEM numeric(18,2),
    EXTRA numeric(18,2),
    DTOFPORC numeric(9,2),
    DTOFMONTO numeric(18,2),
    FECHADTO date,
    CONDENTREGA varchar(255),
    TOTALFAC numeric(18,2),
    OBS blob sub_type 1 segment size 80,
    BOD1 varchar(2),
    BOD2 varchar(2),
    BOD3 varchar(2),
    BOD4 varchar(2),
    BOD5 varchar(2),
    BOD6 varchar(2),
    BOD7 varchar(2),
    BOD8 varchar(2),
    BOD9 varchar(2),
    BOD0 varchar(2),
    ITEM integer,
    ARTICULO varchar(15),
    CODBAR varchar(15),
    ARTIDES varchar(60),
    ARTIPROV varchar(15),
    CANT numeric(18,4),
    UNIDAD varchar(8),
    BODITEM varchar(2),
    PRUNIT numeric(18,2),
    DTOITPORC numeric(9,2),
    DTOITMONTO numeric(18,2),
    PRNETO numeric(18,2),
    IVAPORC numeric(9,2),
    IVAITMONTO numeric(18,2),
    CONSUMO numeric(18,2),
    TOTAL numeric(18,2),
    TOTALPAGAR numeric(18,2),
    OBSITEM blob sub_type 1 segment size 80,
    CODIGOPR varchar(20),
    ZONACOD varchar(2),
    ZONANOM varchar(30),
    DV char(1),
    DIRECCION varchar(60),
    CIUDAD varchar(40),
    TELEFONO varchar(40),
    CONTACTO varchar(60),
    DIASPAGO integer,
    FAX varchar(25),
    GRUPO varchar(2),
    SUBGRUPO varchar(3),
    MARCA varchar(3),
    PESO numeric(9,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),
    IVA1 numeric(18,2),
    IVA2 numeric(18,2),
    IVA3 numeric(18,2),
    SUMAEX numeric(18,2),
    SUMAGR numeric(18,2),
    CANTB1 numeric(18,4),
    CANTB2 numeric(18,4),
    CANTB3 numeric(18,4),
    CANTB4 numeric(18,4),
    CANTB5 numeric(18,4),
    CANTB6 numeric(18,4),
    CANTB7 numeric(18,4),
    CANTB8 numeric(18,4),
    CANTB9 numeric(18,4),
    CANTB0 numeric(18,4))
AS
declare variable imptos char(1);
declare variable tarifa integer;
declare variable orden char(2);
declare variable i integer;
declare variable totalitem numeric(18,2);
declare variable ivaitem numeric(18,2);
declare variable cantitem numeric(18,2);
BEGIN
  SELECT PREF_PRE, ORDC_NUMERO, ORDC_FECHA, ORDC_VALIDEZ, O.BODE_COD, BODE_NOM, O.TERC_NIT, TERC_NOM, ORDC_COTIZACION, ORDC_IMPTOS,
    ORDC_DTOPORC, ORDC_DTOMONTO, ORDC_ADICIONAL, ORDC_IVAMONTO, 
    ORDC_EXTRA, ORDC_DTOFPORC, ORDC_DTOFMONTO, ORDC_DTOFECHA, ORDC_TOTAL, TERC_DIR, TERC_CIU, TERC_TEL, TERC_CONTACTO, TERC_FAX, TERC_DV,
    ORDC_OBS,ORDC_DIASPAGO, ORDC_CONDENTREGA, ORDC_RTFTEPORC, ORDC_RTFTEMONTO, ORDC_RTIVAPORC, ORDC_RTIVAMONTO,
    ORDC_RTICAPORC, ORDC_RTICAMONTO, ORDC_RTCREE, ORDC_RTCREEM
    FROM ORDENES_COMPRA O, BODEGA B, TERCEROS T
    WHERE O.BODE_COD = B.BODE_COD AND O.TERC_NIT = T.TERC_NIT AND O.ORDC_ID = :ID
    into :PREF, :NUMERO, :FECHA, :DIASVENCE, :CODBODEGA, :NOMBODEGA, :NIT, :NOMTERCERO, :COTIZACION, :IMPTOS,
    :DTOPORC, :DTOMONTO, :ADICIONAL, :IVAMONTO, :EXTRA, :DTOFPORC, :DTOFMONTO, :FECHADTO, :TOTALFAC,
    :DIRECCION, :CIUDAD, :TELEFONO, :CONTACTO, :FAX, :DV, :OBS, :DIASPAGO, :condentrega, :RTEFTEPORC, :RTEFTEMONTO, :RTEIVAPORC, :RTEIVAMONTO,
    :RTEICAPORC, :RTEICAMONTO, :RTECREE, :RTECREEM;
    
  SELECT PROV_COD, P.GRPR_COD, GRPR_NOM
    FROM PROVEEDORES P, GRUPOS_PROVEEDORES G
    WHERE TERC_NIT = :NIT AND G.GRPR_COD = P.GRPR_COD
    INTO :CODIGOPR, :ZONACOD, :ZONANOM;
    
  SUBTOTAL = TOTALFAC - EXTRA - IVAMONTO - ADICIONAL + DTOMONTO;
  TOTALPAGAR = TOTALFAC - RTEFTEMONTO - RTEIVAMONTO - RTEICAMONTO - RTECREEM;
  SUMAEX = 0;
  SUMA1 = 0;
  SUMA2 = 0;
  SUMA3 = 0;
  IVA1 = 0;
  IVA2 = 0;
  IVA3 = 0;

execute procedure lee_configuracion('COMPRAS', 'DOCUMENTOS', 'ORDENAR ITEMS POR BODEGA AL IMPRIMIR DOCUMENTOS') returning_values (:Orden);
if (orden = 'NO') then
  BEGIN
  FOR SELECT OCDE_ITEM, D.ARTI_COD, OCDE_CODBAR, OCDE_DESC, OCDE_CANT, OCDE_UNIDAD, BODE_COD, OCDE_PRUNIT,
    OCDE_DTOPORC, OCDE_DTOMONTO, OCDE_IVAPORC, OCDE_IVAMONTO, OCDE_CONSUMO, OCDE_TOTAL, OCDE_OBS,
    GRUP_COD, SUBG_COD, MARC_COD, ARTI_PESO, ARTI_ANCHO, ARTI_ALTO, ARTI_LARGO, TAIV_COD, OCDE_CODPROV
    FROM ORDENES_COMPRA_DETALLE D, ARTICULO A
    WHERE D.ARTI_COD = A.ARTI_COD AND D.ORDC_ID = :ID
    ORDER BY OCDE_ITEM
    INTO :ITEM, :ARTICULO, :CODBAR, :ARTIDES, :CANT, :UNIDAD, :BODITEM, :PRUNIT,
    :DTOITPORC, :DTOITMONTO, :IVAPORC, :IVAITMONTO, :CONSUMO, :TOTAL, :OBSITEM,
    :GRUPO, :SUBGRUPO, :MARCA, :PESO, :ANCHO, :ALTO, :LARGO, :TARIFA, :ARTIPROV
    DO
      BEGIN
      PRNETO = PRUNIT - DTOITMONTO;
      if (IVAPORC = 0) then
        SUMAEX = SUMAEX + TOTAL;
      if (TARIFA = 1) then
        BEGIN
        SUMA1 = SUMA1 + TOTAL - IVAITMONTO;
        IVA1 = IVA1 + IVAITMONTO;
        END
      if (TARIFA = 2) then
        BEGIN
        SUMA2 = SUMA2 + TOTAL - IVAITMONTO;
        IVA2 = IVA2 + IVAITMONTO;
        END
      if (TARIFA = 3) then
        BEGIN
        SUMA3 = SUMA3 + TOTAL - IVAITMONTO;
        IVA3 = IVA3 + IVAITMONTO;
        END
      SUMAGR = SUMA1 + SUMA2 + SUMA3;
      if (IMPTOS = 'N') then
        TOTAL = TOTAL - IVAITMONTO;
      SUSPEND;
      END
  END
ELSE
  BEGIN
  /* RECALCULE TOTALES PARA EL RANGO IMPRESO */
  SELECT SUM(OCDE_IVAMONTO), SUM(OCDE_TOTAL) FROM ORDENES_COMPRA_DETALLE
    WHERE ORDC_ID = :ID AND BODE_COD >= :BODINI AND bode_cod <= :bodfin 
    into :IVAMONTO, :TOTALFAC;
  DTOMONTO = DTOPORC * (TOTALFAC - IVAMONTO);
  SUBTOTAL = TOTALFAC - IVAMONTO + DTOMONTO;
  /* INICIALICE LAS COLUMNAS */
  i = 0;
  for select bode_cod from bodega ORDER by BODE_COD into :bod0
    do
    begin
    i = i + 1;
    if (I = 1) then bod1 = :bod0;
    if (I = 2) then bod2 = :bod0;
    if (I = 3) then bod3 = :bod0;
    if (I = 4) then bod4 = :bod0;
    if (I = 5) then bod5 = :bod0;
    if (I = 6) then bod6 = :bod0;
    if (I = 7) then bod7 = :bod0;
    if (I = 8) then bod8 = :bod0;
    if (I = 9) then bod9 = :bod0;
    end
  /* AGRUPE POR ARTICULO PARA PODER MANEJAR LAS COLUMNAS */
  for select distinct arti_cod from ordenes_compra_detalle
    where ordc_id = :id  AND BODE_COD >= :BODINI AND bode_cod <= :bodfin into :articulo
    do
    begin
    TOTAL = 0;
    ivaitmonto = 0;
    CANT = 0;
    cantb1 = 0;
    cantb2 = 0;
    cantb3 = 0;
    cantb4 = 0;
    cantb5 = 0;
    cantb6 = 0;
    cantb7 = 0;
    cantb8 = 0;
    cantb9 = 0;
    cantb0 = 0;
    FOR SELECT OCDE_CODBAR, OCDE_DESC, OCDE_CANT, OCDE_UNIDAD, BODE_COD, OCDE_PRUNIT,
        OCDE_DTOPORC, OCDE_DTOMONTO, OCDE_IVAPORC, OCDE_IVAMONTO, OCDE_CONSUMO, OCDE_TOTAL, OCDE_OBS,
        GRUP_COD, SUBG_COD, MARC_COD, ARTI_PESO, ARTI_ANCHO, ARTI_ALTO, ARTI_LARGO, TAIV_COD, OCDE_CODPROV
        FROM ORDENES_COMPRA_DETALLE D, ARTICULO A
        WHERE D.ARTI_COD = A.ARTI_COD AND D.ORDC_ID = :ID AND D.ARTI_COD = :ARTICULO AND
        D.BODE_COD >= :BODINI AND D.bode_cod <= :bodfin
        ORDER BY D.bode_cod, OCDE_ITEM
        INTO :CODBAR, :ARTIDES, :cantitem, :UNIDAD, :BODITEM, :PRUNIT,
        :DTOITPORC, :DTOITMONTO, :IVAPORC, :ivaitem, :CONSUMO, :totalitem, :OBSITEM,
        :GRUPO, :SUBGRUPO, :MARCA, :PESO, :ANCHO, :ALTO, :LARGO, :TARIFA, :ARTIPROV
        DO
        BEGIN
        if (boditem = bod1) then
            cantb1 = cantb1 + CANTITEM;
        if (boditem = bod2) then
            cantb2 = cantb2 + CANTITEM;
        if (boditem = bod3) then
            cantb3 = cantb3 + CANTITEM;
        if (boditem = bod4) then
            cantb4 = cantb4 + CANTITEM;
        if (boditem = bod5) then
            cantb5 = cantb5 + CANTITEM;
        if (boditem = bod6) then
            cantb6 = cantb6 + CANTITEM;
        if (boditem = bod7) then
            cantb7 = cantb7 + CANTITEM;
        if (boditem = bod8) then
            cantb8 = cantb8 + CANTITEM;
        if (boditem = bod9) then
            cantb9 = cantb9 + CANTITEM;
        if (boditem = bod0) then
            cantb0 = cantb0 + CANTITEM;
        PRNETO = PRUNIT - DTOITMONTO;
        if (IVAPORC = 0) then
            SUMAEX = SUMAEX + totalitem;
        if (TARIFA = 1) then
            BEGIN
            SUMA1 = SUMA1 + totalitem - ivaitem;
            IVA1 = IVA1 + ivaitem;
            END
        if (TARIFA = 2) then
            BEGIN
            SUMA2 = SUMA2 + totalitem - ivaitem;
            IVA2 = IVA2 + ivaitem;
            END
        if (TARIFA = 3) then
            BEGIN
            SUMA3 = SUMA3 + totalitem - ivaitem;
            IVA3 = IVA3 + ivaitem;
            END
        SUMAGR = SUMA1 + SUMA2 + SUMA3;
        if (IMPTOS = 'N') then
            totalitem = totalitem - ivaitem;
        TOTAL = TOTAL + TOTALITEM;
        ivaitmonto = ivaitmonto + ivaitem;
        CANT = CANT + cantitem;
        end
    if (CANT <> 0) then
        SUSPEND;
    END
  END
END^

SET TERM ; ^

/* 20140303E */
/* ACLARACION AYUDA */
UPDATE CONFIGURACION
SET CONF_AYUDA = 'Indique el código de la lista de precios base para el cambio automático de precios. Nunca debe dejar vacia la respuesta, si no usa la opción de precios automáticos con base en otro precio deje la respuesta en 1'
WHERE (CONF_MODULO = 'FACTURACION') AND (CONF_CATEGORIA = 'ARTICULOS') AND (CONF_PROPIEDAD = 'CODIGO DE LA LISTA DE PRECIOS BASE PARA CAMBIO DE PRECIOS AUTOMATICO');
commit work;

/* 20140304 */
/* STRING TRUNCATION POR NUMERO DE 8 DIGITOS EN PEDIDO AUTOMATICO */
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 = OLD.fact_numero;
            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, RIGHT(NEW.FACT_NUMERO,6), 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 ; ^

/* 20140304B */
/* leve mejora en rendimiento generando certificados, sin embargo si se usa tabla de configuracion se demoran en promedio 2seg
   por tercero sin importar si hay movimiento o no */
SET TERM ^ ;

CREATE OR ALTER procedure CERTIFICADOS_RETENCION (
    NITINI varchar(20),
    NITFIN varchar(20),
    CTAINI varchar(20),
    CTAFIN varchar(20),
    FECINI varchar(8),
    FECFIN varchar(8),
    FECEXP date,
    ADMON varchar(60),
    NUMERAR char(1),
    INICIAL varchar(6))
returns (
    NIT varchar(20),
    NOMBRE varchar(60),
    DIRECCION varchar(60),
    CIUDAD varchar(40),
    CODCUENTA varchar(20),
    NOMCUENTA varchar(60),
    BASEIVA numeric(18,2),
    BASE numeric(18,2),
    PORC numeric(9,2),
    RETENCION numeric(18,2),
    FECHAEXP date,
    ADMINISTRACION varchar(60),
    NUMERO varchar(20))
AS
declare variable actual integer;
declare variable ANOINI CHAR(4);
declare variable MESINI CHAR(2);
declare variable FECHAINI CHAR(8);
declare variable SALDORET NUMERIC(18,2);
declare variable SALDOBASE NUMERIC(18,2);
declare variable CTARTIVA VARCHAR(20);
declare variable CTAIVA VARCHAR(20);
declare variable BASEDB NUMERIC(18,2);
declare variable BASECR NUMERIC(18,2);
declare variable BASERET NUMERIC(18,2);
begin
EXECUTE PROCEDURE LEE_CONFIGURACION ('CONTABILIDAD', 'GENERAL', 'AÑO DE INICIO') RETURNING_VALUES (:ANOINI);
EXECUTE PROCEDURE LEE_CONFIGURACION ('CONTABILIDAD', 'GENERAL', 'MES DE INICIO') RETURNING_VALUES (:MESINI);
execute procedure lee_configuracion('CONTABILIDAD', 'GENERAL', 'CUENTA DE RETENCION DE IVA PARA CERTIFICADOS') returning_values (:CTARTIVA);
execute procedure lee_configuracion('CONTABILIDAD', 'GENERAL', 'CUENTA DE IVA PARA CERTIFICADOS DE RETENCION DE IVA') returning_values (:CTAIVA);
execute procedure compone_fecha_conta (:ANOINI, CAST(:MESINI AS INTEGER), 1) returning_values (FECHAINI);
FECHAEXP = FECEXP;
ADMINISTRACION = ADMON;
ACTUAL = CAST(INICIAL AS INTEGER);
FOR SELECT TERC_NIT, TERC_NOM, TERC_DIR, TERC_CIU FROM TERCEROS
  WHERE TERC_NIT >= :NITINI AND TERC_NIT <= :NITFIN ORDER BY TERC_NIT
  INTO :NIT, :NOMBRE, :DIRECCION, :CIUDAD
  DO
    BEGIN
    FOR SELECT CUEN_COD, CUEN_NOM, CUEN_PORC FROM CUENTAS WHERE CUEN_RETENCION = 'S' AND
      CUEN_COD >= :CTAINI AND CUEN_COD <= :CTAFIN
      INTO :CODCUENTA, :NOMCUENTA, :PORC
      DO
        BEGIN
        SALDORET = 0;
        SALDOBASE = 0;
        if (FECHAINI > FECINI) then
            BEGIN
            /* INCLUYA LOS SALDOS INICIALES EN EL CERTIFICADO */
            SELECT SUM(SAIN_DEBITO-SAIN_CREDITO) FROM SALDOS_INICIALES
                WHERE CUEN_COD = :CODCUENTA AND TERC_NIT = :NIT
                INTO :SALDORET;
            if (SALDORET IS NULL) then
                SALDORET = 0;
            if (PORC <> 0) then
                SALDOBASE = SALDORET * 100 / PORC;
            END
        /* SUME LOS MOVIMIENTOS DEL AÑO DE LAS CUENTAS RELACIONADAS */
        SELECT SUM(CODE_DEBITO - CODE_CREDITO)
          FROM COMPROBANTE_ENCABEZADO E, COMPROBANTE_DETALLE D, configura_certrete C
          WHERE E.ENCO_CONSEC = D.ENCO_CONSEC AND SUBSTRING(CUEN_COD FROM 1 FOR STRLEN(C.cfcr_ctabase)) = C.cfcr_ctabase AND D.TERC_NIT = :NIT AND
          ENCO_FECHA >= :FECINI AND ENCO_FECHA <= :FECFIN AND C.cfcr_cuenta = :codcuenta AND C.cfcr_base = 'N'
          INTO :base;
        if (BASE is null) then
            BASE = 0;
        SELECT SUM(CODE_DEBITO)
          FROM COMPROBANTE_ENCABEZADO E, COMPROBANTE_DETALLE D, configura_certrete C
          WHERE E.ENCO_CONSEC = D.ENCO_CONSEC AND SUBSTRING(CUEN_COD FROM 1 FOR STRLEN(C.cfcr_ctabase)) = C.cfcr_ctabase AND D.TERC_NIT = :NIT AND
          ENCO_FECHA >= :FECINI AND ENCO_FECHA <= :FECFIN AND C.cfcr_cuenta = :codcuenta AND C.cfcr_base = 'D'
          INTO :basedb;
        if (BASEDB is null) then
            BASEDB = 0;
        SELECT SUM(CODE_CREDITO)
          FROM COMPROBANTE_ENCABEZADO E, COMPROBANTE_DETALLE D, configura_certrete C
          WHERE E.ENCO_CONSEC = D.ENCO_CONSEC AND SUBSTRING(CUEN_COD FROM 1 FOR STRLEN(C.cfcr_ctabase)) = C.cfcr_ctabase AND D.TERC_NIT = :NIT AND
          ENCO_FECHA >= :FECINI AND ENCO_FECHA <= :FECFIN AND C.cfcr_cuenta = :codcuenta AND C.cfcr_base = 'C'
          INTO :basecr;
        if (BASECR is null) then
            BASECR = 0;
        BASE = BASE + BASEDB + BASECR;
        SELECT SUM(CODE_BASE), SUM(CODE_DEBITO - CODE_CREDITO)
          FROM COMPROBANTE_ENCABEZADO E, COMPROBANTE_DETALLE D
          WHERE E.ENCO_CONSEC = D.ENCO_CONSEC AND CUEN_COD = :codcuenta AND D.TERC_NIT = :NIT AND
          ENCO_FECHA >= :FECINI AND ENCO_FECHA <= :FECFIN
          INTO :BASERET, :RETENCION;
        if (RETENCION is null) then
            RETENCION = 0;
        if (BASERET is null) then
            BASERET = 0;
        if ((BASE = 0) or (BASE IS NULL))  then
            BASE = BASERET;
        /* CALCULO DE LA BASE DEL IVA SI EL CERIFICADO ES DE RETEIVA */
        if (SUBSTRING(CTAINI FROM 1 FOR STRLEN(CTARTIVA)) = CTARTIVA) then
            BEGIN
            BASEIVA = 0;
            SELECT SUM(CODE_BASE) FROM COMPROBANTE_ENCABEZADO E, COMPROBANTE_DETALLE D
              WHERE E.ENCO_CONSEC = D.ENCO_CONSEC AND SUBSTRING(CUEN_COD FROM 1 FOR strlen(:ctaiva)) = :CTAIVA AND D.TERC_NIT = :NIT AND
              ENCO_FECHA >= :FECINI AND ENCO_FECHA <= :FECFIN AND EXISTS (SELECT ENCO_CONSEC FROM comprobante_detalle WHERE ENCO_CONSEC = D.enco_consec AND CUEN_COD = :CODCUENTA)
              INTO :BASEIVA;
            if (BASEIVA IS NULL) then
                BASEIVA = 0;
--            if (PORC <> 0) then
--                BASEIVA = BASE * 100 / PORC;
--            ELSE
--                BASEIVA = 0;
            END
        BASE = BASE + SALDOBASE;
        RETENCION = RETENCION + SALDORET;
        if (RETENCION <> 0) then
            begin
            if (substr(CODCUENTA, 1, 1) = '2') then
                BEGIN
                if (BASE < 0) then
                    BASE = BASE * -1;
                RETENCION = RETENCION * -1;
                END
            if (numerar = 'S') then
                BEGIN
                NUMERO = CAST(ACTUAL AS CHAR(6));
                EXECUTE PROCEDURE COMPLETA_CEROS(NUMERO) returning_values (NUMERO);
                NUMERO = 'NUMERO: ' || NUMERO;
                ACTUAL = ACTUAL + 1;
                END
            ELSE
                NUMERO = '';
            SUSPEND;
            end
        END
    END
end^

SET TERM ; ^

/* 20140304C */
/* cruces de pendientes por entregar */
SET TERM ^ ;

CREATE OR ALTER procedure CRUCES_DOCUMENTO_DETALLE (
    TIPOORI integer,
    IDORI integer)
returns (
    TIPODES integer,
    ID integer,
    NOMTIPO varchar(8),
    PREFIJO varchar(4),
    NUMERO varchar(6),
    FECHA date,
    ARTIC varchar(20),
    DESCRIPCION varchar(60),
    CANT numeric(18,2),
    UNIDAD varchar(8),
    CODBOD varchar(2),
    LOTE varchar(20),
    OBS varchar(255))
AS
declare variable IDC INTEGER;
declare variable PEDAUTO CHAR(2);
begin
EXECUTE PROCEDURE LEE_CONFIGURACION('FACTURACION','FACTURAS','GENERAR PEDIDO AUTOMATICAMENTE CON LA FACTURA') RETURNING_VALUES (PEDAUTO);
FOR SELECT ARTI_COD, COFA_DESCITE, COFA_CANT, COFA_UNIDAD, COFA_BODEGA, COFA_LOTE, SUBSTRING(CODE_OBSIT FROM 1 FOR 255), COFA_TIPODES, COFA_ID
    FROM CONSOLIDADO_FALTANTES WHERE COFA_TIPOORI = :TIPOORI AND COFA_IDORI = :IDORI AND COFA_OK = 'S'
    INTO :ARTIC, :DESCRIPCION, :CANT, :UNIDAD, :CODBOD, :LOTE, :OBS, :TIPODES, :IDC
    DO
    BEGIN
    SELECT TIDO_NOMCORTO FROM tipo_documento WHERE TIDO_COD = :tipodes INTO :nomtipo;
    if (TIPODES = 21) then
        SELECT FACO_ID, PREF_PRE, FACO_NUMERO, FACO_FECHA FROM FACTURAS_COMPRA WHERE FACO_CONSOLIDA = :IDC AND FACO_ANULADO = 'N' INTO :ID, :PREFIJO, :NUMERO, :FECHA;
    if (TIPODES = 22) then
        SELECT REPR_ID, PREF_PRE, REPR_NUMERO, REPR_FECHA FROM remision_proveedor WHERE REPR_CONSOLIDA = :IDC AND REPR_ANULADO = 'N' INTO :ID, :PREFIJO, :NUMERO, :FECHA;
    if (TIPODES = 23) then
        SELECT ORDC_ID, PREF_PRE, ORDC_NUMERO, ORDC_FECHA FROM ORDENES_COMPRA WHERE ORDC_CONSOLIDA = :IDC AND ORDC_ANULADO = 'N' INTO :ID, :PREFIJO, :NUMERO, :FECHA;
    if (TIPODES = 31) then
        SELECT FACT_ID, PREF_PRE, FACT_NUMERO, FACT_FECHA FROM FACTURAS WHERE FACT_CONSOLIDA = :IDC AND FACT_ANULADO = 'N' INTO :ID, :PREFIJO, :NUMERO, :FECHA;
    if (TIPODES = 32) then
        SELECT REVT_ID, PREF_PRE, REVT_NUMERO, REVT_FECHA FROM remisiones_venta WHERE REVT_CONSOLIDA = :IDC AND REVT_ANULADO = 'N' INTO :ID, :PREFIJO, :NUMERO, :FECHA;
    if (TIPODES = 34) then
        SELECT PEDI_ID, PREF_PRE, PEDI_NUMERO, PEDI_FECHA FROM PEDIDOS WHERE PEDI_CONSOLIDA = :IDC AND PEDI_ANULADO = 'N' INTO :ID, :PREFIJO, :NUMERO, :FECHA;
    suspend;
    END

if (tipoori = 31) then
    BEGIN
    tipodes = 33;
    SELECT TIDO_NOMCORTO FROM tipo_documento WHERE TIDO_COD = :tipodes INTO :nomtipo;
    for select devt_id, pref_pre, devt_numero, devt_fecha from devoluciones_ventas where devt_factid = :idori and devt_anulado = 'N'
        into :ID, :PREFIJO, :NUMERO, :FECHA
        do
        suspend;

    tipodes = 34;
    if (PEDAUTO = 'SI') then
        BEGIN
        SELECT PEDI_ID FROM PEDIDOS P, FACTURAS F WHERE P.PREF_PRE = F.pref_pre AND PEDI_NUMERO = FACT_NUMERO AND fact_id = :idori into :idori;
        FOR SELECT DISTINCT COFA_TIPODES, COFA_ID FROM CONSOLIDADO_FALTANTES
            WHERE COFA_TIPOORI = 34 AND COFA_IDORI = :IDORI AND COFA_OK = 'S'
            INTO :TIPODES, :IDC
            DO
            BEGIN
            if (TIPODES = 32) then
                BEGIN
                SELECT TIDO_NOMCORTO FROM tipo_documento WHERE TIDO_COD = :tipodes INTO :nomtipo;
                SELECT REVT_ID, PREF_PRE, REVT_NUMERO, REVT_FECHA FROM remisiones_venta
                    WHERE REVT_CONSOLIDA = :IDC AND REVT_ANULADO = 'N'
                    INTO :ID, :PREFIJO, :NUMERO, :FECHA;
                SUSPEND;
                END
            END
        END

    tipodes = 37;
    SELECT TIDO_NOMCORTO FROM tipo_documento WHERE TIDO_COD = :tipodes INTO :nomtipo;
    for select r.rute_id, r.pref_pre, r.rute_numero, r.rute_fecha from rutero_detalle d, rutero r
        where r.rute_id = d.rute_id and d.rutd_factid = :idori and r.rute_anulado = 'N'
        into :ID, :PREFIJO, :NUMERO, :FECHA
        do
        suspend;
    END
if (tipoori = 32) then
    BEGIN
    tipodes = 33;
    SELECT TIDO_NOMCORTO FROM tipo_documento WHERE TIDO_COD = :tipodes INTO :nomtipo;
    for select devt_id, pref_pre, devt_numero, devt_fecha from devoluciones_ventas where devt_remid = :idori and devt_anulado = 'N'
        into :ID, :PREFIJO, :NUMERO, :FECHA
        do
        suspend;
    END
if (tipoori = 34) then
    BEGIN
    tipodes = 33;
    SELECT TIDO_NOMCORTO FROM tipo_documento WHERE TIDO_COD = :tipodes INTO :nomtipo;
    for select devt_id, pref_pre, devt_numero, devt_fecha from devoluciones_ventas where devt_pedid = :idori and devt_anulado = 'N'
        into :ID, :PREFIJO, :NUMERO, :FECHA
        do
        suspend;
    END
if (tipoori = 40) then
    BEGIN
    tipodes = 31;
    SELECT TIDO_NOMCORTO FROM tipo_documento WHERE TIDO_COD = :tipodes INTO :nomtipo;
    for select f.fact_id, pref_pre, fact_numero, fact_fecha, D.arti_cod, D.fade_desc, D.fade_cant, D.fade_unidad, D.bode_cod, D.fade_lote
        from facturas F, facturas_detalle D
        where F.fact_id = D.fact_id AND d.fade_idpend = :idori and fade_anulado = 'N'
        into :ID, :PREFIJO, :NUMERO, :FECHA, ARTIC, DESCRIPCION, CANT, UNIDAD, CODBOD, LOTE
        do
        suspend;
    END
end^

SET TERM ; ^

/* 20140306 */
/* BUSQUEDA POR CODIGOS DE BARRA CUANDO HAY VARIOS */
SET TERM ^ ;

CREATE OR ALTER procedure CONSULTA_ARTICULOS_VTAS (
    FECHA date,
    INACTIVOS char(1),
    MODULO varchar(20),
    BUSCAR varchar(100),
    CUALQUIERA char(1),
    COLUMNA integer,
    BUSCAR2 varchar(30),
    BUSCAR3 varchar(30),
    BUSCAR4 varchar(30),
    BUSCAR5 varchar(30))
returns (
    CODIGO varchar(20),
    DES varchar(60),
    REF varchar(20),
    GRUPO varchar(30),
    SUBGR varchar(3),
    MARCA varchar(30),
    UNIDAD varchar(8),
    ESTADO varchar(30),
    IVA numeric(9,2),
    EXISTEN numeric(18,2),
    PRECIO numeric(18,2),
    CLASE char(1))
AS
DECLARE VARIABLE LISTA INTEGER;
DECLARE VARIABLE EXIST CHAR(2);
DECLARE VARIABLE SINEXIST CHAR(2);
declare variable DIG INTEGER;
declare variable OK CHAR(1);
declare variable USARDC CHAR(2);
declare variable DESCORTA VARCHAR(60);
BEGIN
EXISTEN = 0;
EXECUTE PROCEDURE lee_configuracion ('FACTURACION','ARTICULOS', 'VER EXISTENCIA EN CONSULTA ARTICULOS') returning_values (:EXIST);
SELECT FIRST 1 LIPR_COD FROM LISTA_PRECIOS L, USUARIO U WHERE USER_COD = USER AND ((L.SUCU_ID = U.sucu_id) or (L.SUCU_ID = 0) or (U.SUCU_ID = 0)) AND LIPR_PREDET = 'S'
    INTO :LISTA;
if (modulo = 'FACTURACION') then
  EXECUTE PROCEDURE lee_configuracion ('FACTURACION','ARTICULOS','VER ARTICULOS SIN EXISTENCIA EN CONSULTA DE ARTICULOS') returning_values (:sinexist);
else
  sinexist = 'SI';
EXECUTE PROCEDURE LEE_CONFIGURACION ('FACTURACION', 'ARTICULOS', 'REDONDEO AL MULTIPLO DE DIEZ EN PRECIOS') returning_values (DIG);
EXECUTE PROCEDURE LEE_CONFIGURACION ('FACTURACION', 'ARTICULOS', 'USAR DESCRIPCION CORTA EN LUGAR DE LA ESTANDAR EN BUSQUEDA Y DOCUMENTOS DE VENTA') returning_values (USARDC);
if ((USARDC = 'SI') AND (COLUMNA = 1)) then
    COLUMNA = 4;
if (LISTA > 0) then
    BEGIN
    if ((BUSCAR IS NOT NULL) AND (BUSCAR <> '')) then
      BEGIN
      if (COLUMNA = 3) then
        BEGIN
        FOR select arti_cod, coba_cod from barras_articulo b where (upper(b.coba_cod) like upper(:buscar)) and
            ((:INACTIVOS = 'S') or (b.coba_activo = 'S'))
            into :codigo, :ref
            do
            begin
            select arti_des, grup_cod, subg_cod, arti_unidad, esar_cod, taiv_porc, marc_cod,arti_clase, ARTI_DESCORTA
                from articulo a, tarifa_iva t
                where a.taiv_cod = t.taiv_cod and arti_cod = :codigo
                INTO :DES, :GRUPO, :SUBGR, :UNIDAD, :ESTADO, :IVA, :MARCA, :CLASE, :DESCORTA;
            if (USARDC = 'SI') then
                DES = DESCORTA;
            PRECIO = 0;
            SELECT prar_fijo PRECIO FROM precios_articulo WHERE arti_cod = :CODIGO and lipr_cod = :LISTA INTO :PRECIO;
            EXECUTE PROCEDURE redondee(PRECIO, DIG) returning_values (PRECIO);
            if (EXIST = 'SI') then
                BEGIN
                EXECUTE PROCEDURE saldo_total_inventario (:CODIGO, :FECHA) returning_values (:EXISTEN);
                if ((SINEXIST = 'SI')  or (existen <> 0)) then
                    OK = 'S';
                END
            ELSE
                OK = 'S';
            if (ok = 'S') then
                suspend;
            end
        END
      ELSE
        BEGIN
        FOR select a.arti_cod, arti_des, grup_cod, subg_cod, arti_unidad, esar_cod, taiv_porc, marc_cod,arti_clase, ARTI_DESCORTA
            from articulo a, tarifa_iva t
            where a.taiv_cod = t.taiv_cod and substring(a.arti_cod from 1 FOR 2) <> '.t' and
            ((:INACTIVOS = 'S') or (esar_cod = 'A') or ((:INACTIVOS = 'C') AND (esar_cod = 'N'))) AND
            ((:COLUMNA <> 0) or (upper(A.ARTI_COD) like upper(:buscar))) AND
            ((:columna <> 1) or (upper(A.ARTI_DES) like upper(:buscar))) AND
            ((:columna <> 4) or (upper(A.ARTI_DESCORTA) like upper(:buscar))) AND
            ((:columna <> 2) or (upper(A.ARTI_OBS) like upper(:buscar)) or (upper(A.ARTI_DES) like upper(:buscar)))
            INTO :CODIGO, :DES, :GRUPO, :SUBGR, :UNIDAD, :ESTADO, :IVA, :MARCA, :CLASE, :DESCORTA
            do
            begin
            ref = '';
            if (USARDC = 'SI') then
                DES = DESCORTA;
            select first 1 coba_cod from barras_articulo where arti_cod = :codigo into :ref;
            if ((COLUMNA <> 3) or (upper(REF) like upper(:buscar))) then
                BEGIN
                OK = 'N';
                PRECIO = 0;
                SELECT prar_fijo PRECIO FROM precios_articulo WHERE arti_cod = :CODIGO and lipr_cod = :LISTA INTO :PRECIO;
                EXECUTE PROCEDURE redondee(PRECIO, DIG) returning_values (PRECIO);
                if (EXIST = 'SI') then
                    BEGIN
                    EXECUTE PROCEDURE saldo_total_inventario (:CODIGO, :FECHA) returning_values (:EXISTEN);
                    if ((SINEXIST = 'SI')  or (existen <> 0)) then
                        OK = 'S';
                    END
                ELSE
                    OK = 'S';
                if (ok = 'S') then
                    if (CUALQUIERA = 'S') then
                        SUSPEND;
                    ELSE
                        if (BUSCAR2 <> '') then
                            BEGIN
                            IF (NOT EXISTS (SELECT ARTI_COD FROM ARTICULO WHERE ARTI_COD = :CODIGO AND ((upper(ARTI_DES) like upper(:BUSCAR2)) or (upper(ARTI_DESCORTA) like upper(:BUSCAR2)) or (UPPER(ARTI_OBS) LIKE UPPER(:BUSCAR2))))) THEN
                                OK = 'N';
                            if ((OK = 'S') AND (BUSCAR3 <> '')) then
                                IF (NOT EXISTS (SELECT ARTI_COD FROM ARTICULO WHERE ARTI_COD = :CODIGO AND ((upper(ARTI_DES) like upper(:BUSCAR3)) or (upper(ARTI_DESCORTA) like upper(:BUSCAR3)) or (UPPER(ARTI_OBS) LIKE UPPER(:BUSCAR3))))) THEN
                                    OK = 'N';
                            if ((OK = 'S') AND (BUSCAR4 <> '')) then
                                IF (NOT EXISTS (SELECT ARTI_COD FROM ARTICULO WHERE ARTI_COD = :CODIGO AND ((upper(ARTI_DES) like upper(:BUSCAR4)) or (upper(ARTI_DESCORTA) like upper(:BUSCAR4)) or (UPPER(ARTI_OBS) LIKE UPPER(:BUSCAR4))))) THEN
                                    OK = 'N';
                            if ((OK = 'S') AND (BUSCAR5 <> '')) then
                                IF (NOT EXISTS (SELECT ARTI_COD FROM ARTICULO WHERE ARTI_COD = :CODIGO AND ((upper(ARTI_DES) like upper(:BUSCAR5)) or (upper(ARTI_DESCORTA) like upper(:BUSCAR5)) or (UPPER(ARTI_OBS) LIKE UPPER(:BUSCAR5))))) THEN
                                    OK = 'N';
                            if (OK = 'S') then
                                SUSPEND;
                            END
                        ELSE
                            SUSPEND;
                END
            end
        END
      END
    ELSE
        begin
        FOR select a.arti_cod, arti_des, grup_cod, subg_cod, arti_unidad, esar_cod, taiv_porc, marc_cod,arti_clase, ARTI_DESCORTA
            from articulo a, tarifa_iva t
            where a.taiv_cod = t.taiv_cod and substring(a.arti_cod from 1 FOR 2) <> '.t' and
            ((:INACTIVOS = 'S') or (esar_cod = 'A') or ((:INACTIVOS = 'C') AND (esar_cod = 'N')))
            INTO :CODIGO, :DES, :GRUPO, :SUBGR, :UNIDAD, :ESTADO, :IVA, :MARCA, :CLASE, :DESCORTA
            do
            begin
            ref = '';
            if (USARDC = 'SI') then
                DES = DESCORTA;
            select first 1 coba_cod from barras_articulo where arti_cod = :codigo into :ref;
            PRECIO = 0;
            SELECT prar_fijo PRECIO FROM precios_articulo WHERE arti_cod = :CODIGO and lipr_cod = :LISTA INTO :PRECIO;
            EXECUTE PROCEDURE redondee(PRECIO, DIG) returning_values (PRECIO);
            if (EXIST = 'SI') then
                BEGIN
                EXECUTE PROCEDURE saldo_total_inventario (:CODIGO, :FECHA) returning_values (:EXISTEN);
                if ((SINEXIST = 'SI')  or (existen <> 0)) then
                    SUSPEND;
                END
            ELSE
                SUSPEND;
            END
        end
    END
ELSE
    if ((BUSCAR IS NOT NULL) AND (BUSCAR <> '')) then
      begin
      if (COLUMNA = 3) then
        BEGIN
        FOR select arti_cod, coba_cod from barras_articulo b where (upper(b.coba_cod) like upper(:buscar)) and
            ((:INACTIVOS = 'S') or (b.coba_activo = 'S'))
            into :codigo, :ref
            do
            begin
            select arti_des, grup_cod, subg_cod, arti_unidad, esar_cod, taiv_porc, marc_cod,arti_clase, ARTI_DESCORTA
                from articulo a, tarifa_iva t
                where a.taiv_cod = t.taiv_cod and arti_cod = :codigo
                INTO :DES, :GRUPO, :SUBGR, :UNIDAD, :ESTADO, :IVA, :MARCA, :CLASE, :DESCORTA;
            if (USARDC = 'SI') then
                DES = DESCORTA;
            if (EXIST = 'SI') then
                EXECUTE PROCEDURE saldo_total_inventario (:CODIGO, :FECHA) returning_values (:EXISTEN);
            suspend;
            end
        END
      ELSE
        begin
        FOR select arti_cod, arti_des, grup_cod, subg_cod, arti_unidad, esar_cod, taiv_porc, arti_precio, marc_cod, arti_clase, ARTI_DESCORTA
            from articulo a, tarifa_iva t
            where a.taiv_cod = t.taiv_cod and substring(a.arti_cod from 1 FOR 2) <> '.t' and
            ((:INACTIVOS = 'S') or (esar_cod = 'A') or ((:INACTIVOS = 'C') AND (esar_cod = 'N'))) AND
            ((:COLUMNA <> 0) or (upper(A.ARTI_COD) like upper(:buscar))) AND
            ((:columna <> 1) or (upper(A.ARTI_DES) like upper(:buscar))) AND
            ((:columna <> 4) or (upper(A.ARTI_DESCORTA) like upper(:buscar))) AND
            ((:columna <> 2) or (upper(A.ARTI_OBS) like upper(:buscar)) or (upper(A.ARTI_DES) like upper(:buscar)))
            INTO :CODIGO, :DES, :GRUPO, :SUBGR, :UNIDAD, :ESTADO, :IVA, :PRECIO, :MARCA, :CLASE, :DESCORTA
            do
            begin
            ref = '';
            if (USARDC = 'SI') then
                DES = DESCORTA;
            select first 1 coba_cod from barras_articulo where arti_cod = :codigo into :ref;
            if ((COLUMNA <> 3) or (upper(REF) like upper(:buscar))) then
                BEGIN
                if (EXIST = 'SI') then
                    BEGIN
                    EXECUTE PROCEDURE saldo_total_inventario (:CODIGO, :FECHA) returning_values (:EXISTEN);
                    if ((SINEXIST = 'SI') or (existen <> 0)) then
                        OK = 'S';
                    END
                ELSE
                    OK = 'S';
                if (ok = 'S') then
                    if (CUALQUIERA = 'S') then
                        SUSPEND;
                    ELSE
                        if (BUSCAR2 <> '') then
                            BEGIN
                            IF (NOT EXISTS (SELECT ARTI_COD FROM ARTICULO WHERE ARTI_COD = :CODIGO AND ((upper(ARTI_DES) like upper(:BUSCAR2)) or (upper(ARTI_DESCORTA) like upper(:BUSCAR2)) or (UPPER(ARTI_OBS) LIKE UPPER(:BUSCAR2))))) THEN
                                OK = 'N';
                            if ((OK = 'S') AND (BUSCAR3 <> '')) then
                                IF (NOT EXISTS (SELECT ARTI_COD FROM ARTICULO WHERE ARTI_COD = :CODIGO AND ((upper(ARTI_DES) like upper(:BUSCAR3)) or (upper(ARTI_DESCORTA) like upper(:BUSCAR3)) or (UPPER(ARTI_OBS) LIKE UPPER(:BUSCAR3))))) THEN
                                    OK = 'N';
                            if ((OK = 'S') AND (BUSCAR4 <> '')) then
                                IF (NOT EXISTS (SELECT ARTI_COD FROM ARTICULO WHERE ARTI_COD = :CODIGO AND ((upper(ARTI_DES) like upper(:BUSCAR4)) or (upper(ARTI_DESCORTA) like upper(:BUSCAR4)) or (UPPER(ARTI_OBS) LIKE UPPER(:BUSCAR4))))) THEN
                                    OK = 'N';
                            if ((OK = 'S') AND (BUSCAR5 <> '')) then
                                IF (NOT EXISTS (SELECT ARTI_COD FROM ARTICULO WHERE ARTI_COD = :CODIGO AND ((upper(ARTI_DES) like upper(:BUSCAR5)) or (upper(ARTI_DESCORTA) like upper(:BUSCAR5)) or (UPPER(ARTI_OBS) LIKE UPPER(:BUSCAR5))))) THEN
                                    OK = 'N';
                            if (OK = 'S') then
                                SUSPEND;
                            END
                        ELSE
                            SUSPEND;
                END
            end
        end
      end
    ELSE
        FOR select arti_cod, arti_des, grup_cod, subg_cod, arti_unidad, esar_cod, taiv_porc, arti_precio, marc_cod, arti_clase, ARTI_DESCORTA
            from articulo a, tarifa_iva t
            where a.taiv_cod = t.taiv_cod and substring(a.arti_cod from 1 FOR 2) <> '.t' and
            ((:INACTIVOS = 'S') or (esar_cod = 'A') or ((:INACTIVOS = 'C') AND (esar_cod = 'N')))
            INTO :CODIGO, :DES, :GRUPO, :SUBGR, :UNIDAD, :ESTADO, :IVA, :PRECIO, :MARCA, :CLASE, :DESCORTA
            do
            begin
            ref = '';
            if (USARDC = 'SI') then
                DES = DESCORTA;
            select first 1 coba_cod from barras_articulo where arti_cod = :codigo into :ref;
            if (EXIST = 'SI') then
                BEGIN
                EXECUTE PROCEDURE saldo_total_inventario (:CODIGO, :FECHA) returning_values (:EXISTEN);
                if ((SINEXIST = 'SI') or (existen <> 0)) then
                    SUSPEND;
                END
            ELSE
                SUSPEND;
            end
END^

SET TERM ; ^

/* 20140306B */
/* activos fijos con datos NIIF */

ALTER TABLE ACTIVOS_FIJOS
ADD ACFJ_DEPNIIF SMALLINT;

ALTER TABLE ACTIVOS_FIJOS
ADD ACFJ_RESCATE T_MONTO;

CREATE TABLE ACTIVOS_FIJOS_VALOR (
    ACFJ_COD T_COD_ARTICULO NOT NULL,
    ACFV_FECHA FECHA NOT NULL,
    ACFV_VALOR T_MONTO);

ALTER TABLE ACTIVOS_FIJOS_VALOR
ADD CONSTRAINT PK_ACTIVOS_FIJOS_VALOR
PRIMARY KEY (ACFJ_COD,ACFV_FECHA);

GRANT ALL ON ACTIVOS_FIJOS_VALOR TO PUBLIC;

/* 20140306C */

UPDATE IMPORTACION_INVENTARIO
SET IMIN_ANCHO = 8
WHERE (IMIN_TIPO = 6) AND (IMIN_DATO = 'ENCO_NUMERO');
commit work;

/* 20140307 */
/* CIERRE FACTURACION CON CANTIDAD DE FP */
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),
    CANTFP1 integer,
    CANTFP2 integer,
    CANTFP3 integer,
    CANTFP4 integer,
    CANTFP5 integer,
    CANTFP6 integer,
    CANTFP7 integer,
    CANTFP8 integer,
    CANTFP9 integer,
    CANTFP10 integer,
    CANTFP11 integer,
    CANTFP12 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 r_iddoc integer;
declare variable f_id integer;
declare variable f_total numeric(18,2);
declare variable factor numeric(18,4);
declare variable ajuste integer;
declare variable PREFRDC VARCHAR(4);
declare variable otrabo numeric(18,4);
begin
AJUSTE = 0;
if (PREFIJO <> '') then
  SELECT PREF_PRE, AUTO_NUMERO, AUTO_PREFRDC FROM AUTORIZACIONES WHERE PREF_PRE = :PREFIJO INTO :PREF, :autoriza, :prefrdc;
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 */
  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 = 1 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 :CANTFP1, :FORMAP1;
  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 = 1 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;
  FORMAP1 = FORMAP1 + OTRABO;
  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 = 2 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 :CANTFP2, :FORMAP2;
  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 = 2 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;
  FORMAP2 = FORMAP2 + OTRABO;
  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 = 3 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 :CANTFP3, :FORMAP3;
  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 = 3 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;
  FORMAP3 = FORMAP3 + OTRABO;
  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 = 4 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 :CANTFP4, :FORMAP4;
  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 = 4 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;
  FORMAP4 = FORMAP4 + OTRABO;
  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 = 5 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 :CANTFP5, :FORMAP5;
  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 = 5 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;
  FORMAP5 = FORMAP5 + OTRABO;
  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 = 6 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 :CANTFP6, :FORMAP6;
  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 = 6 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;
  FORMAP6 = FORMAP6 + OTRABO;
  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 = 7 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 :CANTFP7, :FORMAP7;
  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 = 7 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;
  FORMAP7 = FORMAP7 + OTRABO;
  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 = 8 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 :CANTFP8, :FORMAP8;
  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 = 8 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;
  FORMAP8 = FORMAP8 + OTRABO;
  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 = 9 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 :CANTFP9, :FORMAP9;
  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 = 9 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;
  FORMAP9 = FORMAP9 + OTRABO;
  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 = 10 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 :CANTFP10, :FORMAP10;
  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 = 10 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;
  FORMAP10 = FORMAP10 + OTRABO;
  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 = 11 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 :CANTFP11, :FORMAP11;
  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 = 11 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;
  FORMAP11 = FORMAP11 + OTRABO;
  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 = 12 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 :CANTFP12, :FORMAP12;
  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 = 12 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;
  FORMAP12 = FORMAP12 + OTRABO;

  /* 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 (formap1 is null) then
    formap1 = 0;
  if (formap2 is null) then
    formap2 = 0;
  if (formap3 is null) then
    formap3 = 0;
  if (formap4 is null) then
    formap4 = 0;
  if (formap5 is null) then
    formap5 = 0;
  if (formap6 is null) then
    formap6 = 0;
  if (formap7 is null) then
    formap7 = 0;
  if (formap8 is null) then
    formap8 = 0;
  if (formap9 is null) then
    formap9 = 0;
  if (formap10 is null) then
    formap10 = 0;
  if (formap11 is null) then
    formap11 = 0;
  if (formap12 is null) then
    formap12 = 0;
  CARTERA = TOTALNETO - formap1 - formap2 - formap3 - formap4 - formap5 - formap6 - formap7 - formap8 - formap9 - formap10 -
     formap11 - formap12;
/*
  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
  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;
        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 ; ^

/* 20130307c */
/* string truncation por nombre de más de 40c */
SET TERM ^ ;

CREATE OR 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 ^ ;

CREATE OR ALTER procedure CONTABIL_REMIPROV (
    IDDOC integer,
    IDINTER integer)
returns (
    ERRORI integer,
    VER char(1),
    IDC integer)
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 TIPOCOMP VARCHAR(3);
DECLARE VARIABLE PREFCONT VARCHAR(4);
DECLARE VARIABLE INVEN CHAR(1);
DECLARE VARIABLE CTAINVEN VARCHAR(20);
DECLARE VARIABLE IVA CHAR(1);
DECLARE VARIABLE CTAIVA VARCHAR(20);
DECLARE VARIABLE CONSUMO CHAR(1);
DECLARE VARIABLE CTACONSUMO VARCHAR(20);
DECLARE VARIABLE CXP CHAR(1);
DECLARE VARIABLE CTACXP VARCHAR(20);
DECLARE VARIABLE 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', TICO_COD, PRCO_PRE, INCO_INVEN, INCO_IVA, INCO_CONSUMO, INCO_CXP,
    INCO_CTAINVEN, INCO_CTAIVA, INCO_CTACONSUMO, INCO_CTADTO, INCO_CTAADIC, INCO_CTAEXTRA, INCO_CTACXP,
    INCO_CONFIRMAR, INCO_CENTRO
    FROM INTERFAZ_COMPRAS WHERE INCO_ID = :IDINTER
    INTO :EXISTE, :TIPOCOMP, :PREFCONT, :INVEN, :IVA, :CONSUMO, :CXP,
    :CTAINVEN, :CTAIVA, :CTACONSUMO, :CTADTO, :CTAADIC, :CTAEXTRA, :CTACXP,
    :VER, :CENT;
  if (EXISTE = 'S') then
    BEGIN
    /* BORRE CONTABILIZACION PREVIA */
    DELETE FROM CONTABILIZACION WHERE CNTB_TIPOREF = 22 AND CNTB_IDREF = :IDDOC;
    /* 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 = 'REMIPRV No.' || NUMERO || '-' || SUBSTRING(NOMBRE FROM 1 FOR 21) || '-NPROV.' || NUMPROV;
        IDC = GEN_ID(ID_CONTABILIZA, 1);
        INSERT INTO CONTABILIZACION (CNTB_ID, CNTB_TIPOCOMP, CNTB_PREFCNT, CNTB_NUMERO, CNTB_FECHA, CNTB_CONCEPTO, CNTB_REF, CNTB_TIPOREF, CNTB_IDREF, CNTB_PREFREF, CNTB_NUMREF, CNTB_PROCESADO)
            VALUES (:IDC, :TIPOCOMP, :PREFCONT, :NUM, :FECHA, :CONCEPTO, '', 22, :IDDOC, :PREFIJO, :NUM, 'N');
        NUMITEMS = 0;
        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 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(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 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(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 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(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 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(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 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(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(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(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(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(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(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(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(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 ; ^

/* 20140311b */
/* AUN USABA EL CAMPO COFA_OK PARA VALIDAR CRUCES */
SET TERM ^ ;

CREATE OR ALTER procedure CRUCES_DOCUMENTO_DETALLE (
    TIPOORI integer,
    IDORI integer)
returns (
    TIPODES integer,
    ID integer,
    NOMTIPO varchar(8),
    PREFIJO varchar(4),
    NUMERO varchar(6),
    FECHA date,
    ARTIC varchar(20),
    DESCRIPCION varchar(60),
    CANT numeric(18,2),
    UNIDAD varchar(8),
    CODBOD varchar(2),
    LOTE varchar(20),
    OBS varchar(255))
AS
declare variable IDC INTEGER;
declare variable PEDAUTO CHAR(2);
begin
EXECUTE PROCEDURE LEE_CONFIGURACION('FACTURACION','FACTURAS','GENERAR PEDIDO AUTOMATICAMENTE CON LA FACTURA') RETURNING_VALUES (PEDAUTO);
FOR SELECT ARTI_COD, COFA_DESCITE, COFA_CANT, COFA_UNIDAD, COFA_BODEGA, COFA_LOTE, SUBSTRING(CODE_OBSIT FROM 1 FOR 255), COFA_TIPODES, COFA_ID
    FROM CONSOLIDADO_FALTANTES WHERE COFA_TIPOORI = :TIPOORI AND COFA_IDORI = :IDORI AND COFA_CANTCR <> 0
    INTO :ARTIC, :DESCRIPCION, :CANT, :UNIDAD, :CODBOD, :LOTE, :OBS, :TIPODES, :IDC
    DO
    BEGIN
    SELECT TIDO_NOMCORTO FROM tipo_documento WHERE TIDO_COD = :tipodes INTO :nomtipo;
    if (TIPODES = 21) then
        SELECT FACO_ID, PREF_PRE, FACO_NUMERO, FACO_FECHA FROM FACTURAS_COMPRA WHERE FACO_CONSOLIDA = :IDC AND FACO_ANULADO = 'N' INTO :ID, :PREFIJO, :NUMERO, :FECHA;
    if (TIPODES = 22) then
        SELECT REPR_ID, PREF_PRE, REPR_NUMERO, REPR_FECHA FROM remision_proveedor WHERE REPR_CONSOLIDA = :IDC AND REPR_ANULADO = 'N' INTO :ID, :PREFIJO, :NUMERO, :FECHA;
    if (TIPODES = 23) then
        SELECT ORDC_ID, PREF_PRE, ORDC_NUMERO, ORDC_FECHA FROM ORDENES_COMPRA WHERE ORDC_CONSOLIDA = :IDC AND ORDC_ANULADO = 'N' INTO :ID, :PREFIJO, :NUMERO, :FECHA;
    if (TIPODES = 31) then
        SELECT FACT_ID, PREF_PRE, FACT_NUMERO, FACT_FECHA FROM FACTURAS WHERE FACT_CONSOLIDA = :IDC AND FACT_ANULADO = 'N' INTO :ID, :PREFIJO, :NUMERO, :FECHA;
    if (TIPODES = 32) then
        SELECT REVT_ID, PREF_PRE, REVT_NUMERO, REVT_FECHA FROM remisiones_venta WHERE REVT_CONSOLIDA = :IDC AND REVT_ANULADO = 'N' INTO :ID, :PREFIJO, :NUMERO, :FECHA;
    if (TIPODES = 34) then
        SELECT PEDI_ID, PREF_PRE, PEDI_NUMERO, PEDI_FECHA FROM PEDIDOS WHERE PEDI_CONSOLIDA = :IDC AND PEDI_ANULADO = 'N' INTO :ID, :PREFIJO, :NUMERO, :FECHA;
    suspend;
    END

if (tipoori = 31) then
    BEGIN
    tipodes = 33;
    SELECT TIDO_NOMCORTO FROM tipo_documento WHERE TIDO_COD = :tipodes INTO :nomtipo;
    for select devt_id, pref_pre, devt_numero, devt_fecha from devoluciones_ventas where devt_factid = :idori and devt_anulado = 'N'
        into :ID, :PREFIJO, :NUMERO, :FECHA
        do
        suspend;

    tipodes = 34;
    if (PEDAUTO = 'SI') then
        BEGIN
        SELECT PEDI_ID FROM PEDIDOS P, FACTURAS F WHERE P.PREF_PRE = F.pref_pre AND PEDI_NUMERO = FACT_NUMERO AND fact_id = :idori into :idori;
        FOR SELECT DISTINCT COFA_TIPODES, COFA_ID FROM CONSOLIDADO_FALTANTES
            WHERE COFA_TIPOORI = 34 AND COFA_IDORI = :IDORI AND COFA_OK = 'S'
            INTO :TIPODES, :IDC
            DO
            BEGIN
            if (TIPODES = 32) then
                BEGIN
                SELECT TIDO_NOMCORTO FROM tipo_documento WHERE TIDO_COD = :tipodes INTO :nomtipo;
                SELECT REVT_ID, PREF_PRE, REVT_NUMERO, REVT_FECHA FROM remisiones_venta
                    WHERE REVT_CONSOLIDA = :IDC AND REVT_ANULADO = 'N'
                    INTO :ID, :PREFIJO, :NUMERO, :FECHA;
                SUSPEND;
                END
            END
        END

    tipodes = 37;
    SELECT TIDO_NOMCORTO FROM tipo_documento WHERE TIDO_COD = :tipodes INTO :nomtipo;
    for select r.rute_id, r.pref_pre, r.rute_numero, r.rute_fecha from rutero_detalle d, rutero r
        where r.rute_id = d.rute_id and d.rutd_factid = :idori and r.rute_anulado = 'N'
        into :ID, :PREFIJO, :NUMERO, :FECHA
        do
        suspend;
    END
if (tipoori = 32) then
    BEGIN
    tipodes = 33;
    SELECT TIDO_NOMCORTO FROM tipo_documento WHERE TIDO_COD = :tipodes INTO :nomtipo;
    for select devt_id, pref_pre, devt_numero, devt_fecha from devoluciones_ventas where devt_remid = :idori and devt_anulado = 'N'
        into :ID, :PREFIJO, :NUMERO, :FECHA
        do
        suspend;
    END
if (tipoori = 34) then
    BEGIN
    tipodes = 33;
    SELECT TIDO_NOMCORTO FROM tipo_documento WHERE TIDO_COD = :tipodes INTO :nomtipo;
    for select devt_id, pref_pre, devt_numero, devt_fecha from devoluciones_ventas where devt_pedid = :idori and devt_anulado = 'N'
        into :ID, :PREFIJO, :NUMERO, :FECHA
        do
        suspend;
    END
if (tipoori = 40) then
    BEGIN
    tipodes = 31;
    SELECT TIDO_NOMCORTO FROM tipo_documento WHERE TIDO_COD = :tipodes INTO :nomtipo;
    for select f.fact_id, pref_pre, fact_numero, fact_fecha, D.arti_cod, D.fade_desc, D.fade_cant, D.fade_unidad, D.bode_cod, D.fade_lote
        from facturas F, facturas_detalle D
        where F.fact_id = D.fact_id AND d.fade_idpend = :idori and fade_anulado = 'N'
        into :ID, :PREFIJO, :NUMERO, :FECHA, ARTIC, DESCRIPCION, CANT, UNIDAD, CODBOD, LOTE
        do
        suspend;
    END
end^

SET TERM ; ^

/* 20140312 */
/* VALIDE LA EXISTENCIA RESERVADA SI LA CONFIGURACION ESTA EN PROHIBIR */
SET TERM ^ ;

CREATE OR ALTER procedure EXISTENCIA_BODEGA (
    ARTICULO varchar(15),
    FECHA date,
    BODEGA varchar(2))
returns (
    EXISTENCIA numeric(18,2),
    RESERVADO numeric(18,2))
AS
declare variable ORDENC NUMERIC(18,4);
declare variable PEDIDO NUMERIC(18,4);
declare variable ITEM INTEGER;
declare variable ID INTEGER;
declare variable UND VARCHAR(8);
declare variable CANT NUMERIC(18,4);
declare variable factor2 NUMERIC(18,4);
declare variable PEDAUTO CHAR(2);
BEGIN
execute procedure saldo_inventario (:articulo, :bodega, :fecha) returning_values (:Existencia);
/* LO RESERVADO */
SELECT SUM(RSDE_LIBERAR)
  FROM RESERVAS_DETALLE RD, RESERVAS R
  WHERE R.RESE_ID = RD.RESE_ID AND ARTI_COD = :ARTICULO AND RESE_FECHA <= :FECHA AND RESE_VENCE >= :FECHA AND RD.BODE_COD = :BODEGA AND RSDE_ANULADO = 'N'
  INTO :RESERVADO;
if (RESERVADO IS NULL) then
    RESERVADO = 0;
PEDIDO = 0;
FOR SELECT P.PEDI_ID, PEDE_ITEM, PEDE_CANT * PEDE_FACTOR
    FROM PEDIDOS P, PEDIDOS_DETALLE PD
    WHERE P.PEDI_ID = PD.PEDI_ID AND PD.ARTI_COD = :ARTICULO AND (PEDI_FECHA+PEDI_VALIDEZ) >= :FECHA AND PEDI_FECHA <= :FECHA AND PEDE_ANULADO = 'N' AND BODE_COD = :BODEGA
    INTO :ID, :ITEM, :CANT
    do
    BEGIN
    EXECUTE PROCEDURE FALTANTE(34, 31, ID, ITEM) returning_values (ORDENC, UND, FACTOR2);
    EXECUTE PROCEDURE LEE_CONFIGURACION('FACTURACION', 'FACTURAS', 'GENERAR PEDIDO AUTOMATICAMENTE CON LA FACTURA') returning_values (pedauto);
    if ((ORDENC * FACTOR2 = CANT) or (PEDAUTO = 'SI')) then /* SI NO SE HA FACTURADO MIRE A VER SI SE REMISIONO */
        EXECUTE PROCEDURE FALTANTE(34, 32, ID, ITEM) returning_values (ORDENC, UND, FACTOR2);
    if (ORDENC IS NULL) then
        ORDENC = 0;
    PEDIDO = PEDIDO + ORDENC * FACTOR2;
    END
RESERVADO = RESERVADO + PEDIDO;
SUSPEND;
END^

SET TERM ; ^

GRANT EXECUTE ON PROCEDURE existencia_bodega TO PUBLIC;

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;
    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
    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 ; ^

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;
    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
    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 ; ^

/* 20140312b */
/* si el porcentaje de retenciones es cero calculelo */
SET TERM ^ ;

CREATE OR ALTER procedure CONTABIL_NOTADBCL (
    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 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 TIPOCOMP VARCHAR(3);
declare variable PREFCONT VARCHAR(4);
declare variable BASE CHAR(1);
declare variable CTABASE VARCHAR(20);
declare variable IVA CHAR(1);
declare variable CTAIVA VARCHAR(20);
declare variable CLIE CHAR(1);
declare variable CTACLIE VARCHAR(20);
declare variable RTFTE CHAR(1);
declare variable CTARTFTE VARCHAR(20);
declare variable RTIVA CHAR(1);
declare variable CTARTIVA VARCHAR(20);
declare variable RTICA CHAR(1);
declare variable CTARTICA VARCHAR(20);
declare variable RTCREE CHAR(1);
declare variable CTARTCREE VARCHAR(20);
declare variable EXISTE CHAR(1);
declare variable CUENTA VARCHAR(20);
declare variable ES_RETENCION CHAR(1);
declare variable TIPOCUEN CHAR(1);
declare variable NIT VARCHAR(20);
declare variable NOMBRE VARCHAR(60);
declare variable PROY VARCHAR(4);
declare variable CENTRO VARCHAR(4);
declare variable 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', TICO_COD, PRCO_PRE, INCA_BASE, INCA_IVA, INCA_RTFTE, INCA_RTIVA, INCA_RTICA, INCA_RTCREE, INCA_CLIE, INCA_CTABASE, INCA_CTAIVA,
    INCA_CTARTFTE, INCA_CTARTIVA, INCA_CTARTICA, INCA_CTARTCREE, INCA_CTACLIE, INCA_CONFIRMAR
    FROM INTERFAZ_CARTERA
    WHERE INCA_ID = :IDINTER
    INTO :EXISTE, :TIPOCOMP, :PREFCONT, :BASE, :IVA, :RTFTE, :RTIVA, :RTICA, :RTCREE, :CLIE, :CTABASE, :CTAIVA,
    :CTARTFTE, :CTARTIVA, :CTARTICA, :CTARTCREE, :CTACLIE, :VER;
if (EXISTE = 'S') then
  BEGIN
  /* BORRE CUALQUEIR CONTABILIZACION PREVIA */
  DELETE FROM CONTABILIZACION WHERE CNTB_TIPOREF = 41 AND CNTB_IDREF = :IDDOC;
  /* 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_NOM, 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, :NOMBRE, 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);
    /* REGISTRE EL ENCABEZADO CONTABLE */
    IDC = GEN_ID(ID_CONTABILIZA, 1);
    INSERT INTO CONTABILIZACION (CNTB_ID, CNTB_TIPOCOMP, CNTB_PREFCNT, CNTB_NUMERO, CNTB_FECHA, CNTB_CONCEPTO, CNTB_REF, CNTB_TIPOREF, CNTB_IDREF, CNTB_PREFREF, CNTB_NUMREF, CNTB_PROCESADO)
        VALUES (:IDC, :TIPOCOMP, :PREFCONT, :NUM, :FECHA, :CONC, '', 41, :IDDOC, :PREF, :NUM, 'N');
    NROI = 0;
    SUMA = 0;
    ERROR = 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
                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';
                ERROR = ERROR + 1;
                end
            if (ES_RETENCION = 'S') then
                if (PORC <> 0) then
                    montobase = FLOOR(VRSUBT / PORC * -1);
                else
                    montobase = VRSUBT * -1;
            else
                montobase = 0;
            if (TIPOCUEN = 'I') then
                BEGIN
                EXECUTE PROCEDURE ERRORINT(41, :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, :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
                WHERE CUEN_COD = :CTAIVA INTO :CUENTA, :TIPOCUEN;
            if (CUENTA IS NULL) then
                begin
                EXECUTE PROCEDURE ERRORINT(41, :IDDOC, :CTAIVA, 2);
                CUENTA = CTAIVA;
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'I') then
                BEGIN
                EXECUTE PROCEDURE ERRORINT(41, :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, :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;
        if ((prtfte = 0) AND (vrsubt <> 0)) then
            prtfte = vrrtfte / vrsubt;
        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(41, :IDDOC, :CTARTFTE, 2);
            CUENTA = CTARTFTE;
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            EXECUTE PROCEDURE ERRORINT(41, :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, '', :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
                WHERE CUEN_COD = :CTARTFTE INTO :CUENTA, :TIPOCUEN;
            if (CUENTA IS NULL) then
                begin
                EXECUTE PROCEDURE ERRORINT(41, :IDDOC, :CTARTFTE, 2);
                CUENTA = CTARTFTE;
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'I') then
                BEGIN
                EXECUTE PROCEDURE ERRORINT(41, :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, 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;
        if ((porc = 0) AND (vriva <> 0)) then
            porc = vrrtiva / vriva;
        CUENTA = NULL;
        SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
            WHERE CUEN_COD = :CTARTIVA INTO :CUENTA, :TIPOCUEN;
        if (CUENTA IS NULL) then
            begin
            EXECUTE PROCEDURE ERRORINT(41, :IDDOC, :CTARTIVA, 2);
            CUENTA = CTARTIVA;
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            EXECUTE PROCEDURE ERRORINT(41, :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, '', :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;
        if ((prtica = 0) AND (vrsubt <> 0)) then
            prtica = vrrtica / vrsubt;
        CUENTA = NULL;
        SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
            WHERE CUEN_COD = :CTARTICA INTO :CUENTA, :TIPOCUEN;
        if (CUENTA IS NULL) then
            begin
            EXECUTE PROCEDURE ERRORINT(41, :IDDOC, :CTARTICA, 2);
            CUENTA = CTARTICA;
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            EXECUTE PROCEDURE ERRORINT(41, :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, '', :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;
        if ((prtcree = 0) AND (vrsubt <> 0)) then
            prtcree = vrrtcree / vrsubt;
        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(41, :IDDOC, :CTARTCREE, 2);
            CUENTA = CTARTCREE;
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            EXECUTE PROCEDURE ERRORINT(41, :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, '', :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
                WHERE CUEN_COD = :ctartcree INTO :CUENTA, :TIPOCUEN;
            if (CUENTA IS NULL) then
                begin
                EXECUTE PROCEDURE ERRORINT(41, :IDDOC, :ctartcree, 2);
                CUENTA = ctartcree;
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'I') then
                BEGIN
                EXECUTE PROCEDURE ERRORINT(41, :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, :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
            WHERE CUEN_COD = :CUENTAADIC INTO :CUENTA, :TIPOCUEN;
        IF (CUENTA IS NULL) THEN
            begin
            EXECUTE PROCEDURE ERRORINT(41, :IDDOC, :CUENTAADIC, 2);
            CUENTA = CUENTAADIC;
            ERROR = ERROR + 1;
            end
        /* DEPENDE DEL TIPO DE CUENTA */
        if (TIPOCUEN = 'I') then
            BEGIN
            EXECUTE PROCEDURE ERRORINT(41, :IDDOC, :CUENTA, 3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'C') then
            BEGIN
            if (DBADIC = 'S') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_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
            WHERE CUEN_COD = :CTACLIE INTO :CUENTA, :TIPOCUEN;
        IF (CUENTA IS NULL) then
            begin
            EXECUTE PROCEDURE ERRORINT(41, :IDDOC, :CTACLIE, 2);
            CUENTA = CTACLIE;
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            EXECUTE PROCEDURE ERRORINT(41, :IDDOC, :CUENTA, 3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'C') then
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_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 (ERROR > 0) then
        VER = 'S';
    SUSPEND;
    END /* NO ANULADO */
  END /* EXISTE LA INTERFAZ */
ELSE
    BEGIN
    EXECUTE PROCEDURE ERRORINT(41, :IDDOC, :PREF, 1);
    ERROR = ERROR + 1;
    VER = 'S';
    SUSPEND;
    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 ^ ;

CREATE OR ALTER procedure CONTABIL_NOTACRCL (
    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 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 TIPOCOMP VARCHAR(3);
declare variable PREFCONT VARCHAR(4);
declare variable BASE CHAR(1);
declare variable CTABASE VARCHAR(20);
declare variable IVA CHAR(1);
declare variable CTAIVA VARCHAR(20);
declare variable CLIE CHAR(1);
declare variable CTACLIE VARCHAR(20);
declare variable RTFTE CHAR(1);
declare variable CTARTFTE VARCHAR(20);
declare variable RTIVA CHAR(1);
declare variable CTARTIVA VARCHAR(20);
declare variable RTICA CHAR(1);
declare variable CTARTICA VARCHAR(20);
declare variable RTCREE CHAR(1);
declare variable 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 NOMBRE VARCHAR(60);
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', TICO_COD, PRCO_PRE, INCA_BASE, INCA_IVA, INCA_RTFTE, INCA_RTIVA, INCA_RTICA, INCA_RTCREE, INCA_CLIE, INCA_CTABASE, INCA_CTAIVA, INCA_CTARTFTE, INCA_CTARTIVA, INCA_CTARTICA, INCA_CTARTCREE, INCA_CTACLIE, INCA_CONFIRMAR
    FROM INTERFAZ_CARTERA
    WHERE INCA_ID = :IDINTER
    INTO :EXISTE, :TIPOCOMP, :PREFCONT, :BASE, :IVA, :RTFTE, :RTIVA, :RTICA, :RTCREE, :CLIE, :CTABASE, :CTAIVA, :CTARTFTE, :CTARTIVA, :CTARTICA, :CTARCREE, :CTACLIE, :VER;
  if (EXISTE = 'S') then
    BEGIN
    /* BORRE CUALQUEIR CONTABILIZACION PREVIA */
    DELETE FROM CONTABILIZACION WHERE CNTB_TIPOREF = 42 AND CNTB_IDREF = :IDDOC;
    /* 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_NOM,
        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, :NOMBRE,
        :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);
      /* REGISTRE EL ENCABEZADO CONTABLE */
      IDC = GEN_ID(ID_CONTABILIZA, 1);
      INSERT INTO CONTABILIZACION (CNTB_ID, CNTB_TIPOCOMP, CNTB_PREFCNT, CNTB_NUMERO, CNTB_FECHA, CNTB_CONCEPTO, CNTB_REF, CNTB_TIPOREF, CNTB_IDREF, CNTB_PREFREF, CNTB_NUMREF, CNTB_PROCESADO)
        VALUES (:IDC, :TIPOCOMP, :PREFCONT, :NUM, :FECHA, :CONC, '', 42, :IDDOC, :PREF, :NUM, 'N');
      NROI = 0;
      SUMA = 0;
      ERROR = 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
                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';
                ERROR = ERROR + 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';
                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, '', :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
                WHERE CUEN_COD = :CTAIVA INTO :CUENTA, :TIPOCUEN;
            if (CUENTA IS NULL) then
                begin
                EXECUTE PROCEDURE ERRORINT(42, :IDDOC, :CTAIVA, 2);
                CUENTA = CTAIVA;
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'I') then
                BEGIN
                EXECUTE PROCEDURE ERRORINT(42, :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, :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;
        if ((prtfte = 0) AND (vrsubt <> 0)) then
            prtfte = vrrtfte / vrsubt;
        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(42, :IDDOC, :CTARTFTE, 2);
            CUENTA = CTARTFTE;
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            EXECUTE PROCEDURE ERRORINT(42, :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, :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
                WHERE CUEN_COD = :CTARTFTE INTO :CUENTA, :TIPOCUEN;
            if (CUENTA IS NULL) then
                begin
                EXECUTE PROCEDURE ERRORINT(42, :IDDOC, :CTARTFTE, 2);
                CUENTA = CTARTFTE;
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'I') then
                BEGIN
                EXECUTE PROCEDURE ERRORINT(42, :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, '', :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;
        if ((porc = 0) AND (vriva <> 0)) then
            porc = vrrtiva / vriva;
        CUENTA = NULL;
        SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
            WHERE CUEN_COD = :CTARTIVA INTO :CUENTA, :TIPOCUEN;
        if (CUENTA IS NULL) then
            begin
            EXECUTE PROCEDURE ERRORINT(42, :IDDOC, :CTARTIVA, 2);
            CUENTA = CTARTIVA;
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            EXECUTE PROCEDURE ERRORINT(42, :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, :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;
        if ((prtica = 0) AND (vrsubt <> 0)) then
            prtica = vrrtica / vrsubt;
        CUENTA = NULL;
        SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
            WHERE CUEN_COD = :CTARTICA INTO :CUENTA, :TIPOCUEN;
        if (CUENTA IS NULL) then
            begin
            EXECUTE PROCEDURE ERRORINT(42, :IDDOC, :CTARTICA, 2);
            CUENTA = CTARTICA;
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            EXECUTE PROCEDURE ERRORINT(42, :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, :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;
        if ((prtcree = 0) AND (vrsubt <> 0)) then
            prtcree = vrrcree / vrsubt;
        CUENTA = NULL;
        SELECT CUEN_COD, CUEN_TIPO FROM CUENTAS
            WHERE CUEN_COD = :CTARTICA INTO :CUENTA, :TIPOCUEN;
        if (CUENTA IS NULL) then
            begin
            EXECUTE PROCEDURE ERRORINT(42, :IDDOC, :ctarcree, 2);
            CUENTA = ctarcree;
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            EXECUTE PROCEDURE ERRORINT(42, :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, :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
                WHERE CUEN_COD = :ctarcree INTO :CUENTA, :TIPOCUEN;
            if (CUENTA IS NULL) then
                begin
                EXECUTE PROCEDURE ERRORINT(42, :IDDOC, :CTARTFTE, 2);
                CUENTA = CTARTFTE;
                TIPOCUEN = 'N';
                ERROR = ERROR + 1;
                end
            if (TIPOCUEN = 'I') then
                BEGIN
                EXECUTE PROCEDURE ERRORINT(42, :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, '', :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
            WHERE CUEN_COD = :CUENTAADIC INTO :CUENTA, :TIPOCUEN;
        IF (CUENTA IS NULL) then
            begin
            EXECUTE PROCEDURE ERRORINT(42, :IDDOC, :CUENTAADIC, 2);
            CUENTA = CUENTAADIC;
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            end
        /* DEPENDE DEL TIPO DE CUENTA */
        if (TIPOCUEN = 'I') then
            BEGIN
            EXECUTE PROCEDURE ERRORINT(42, :IDDOC, :CUENTA, 3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'C') then
            BEGIN
            if (DBADIC = 'S') then
                BEGIN
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_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
            WHERE CUEN_COD = :CTACLIE INTO :CUENTA, :TIPOCUEN;
        IF (CUENTA IS NULL) then
            begin
            EXECUTE PROCEDURE ERRORINT(42, :IDDOC, :CTACLIE, 2);
            CUENTA = CTACLIE;
            ERROR = ERROR + 1;
            end
        if (TIPOCUEN = 'I') then
            BEGIN
            EXECUTE PROCEDURE ERRORINT(42, :IDDOC, :CUENTA, 3);
            TIPOCUEN = 'N';
            ERROR = ERROR + 1;
            END
        if (TIPOCUEN = 'C') then
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_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 (ERROR > 0) then
        VER = 'S';
    SUSPEND;
    END /* NO ANULADO */
  END /* EXISTE LA INTERFAZ */
ELSE
  BEGIN
  EXECUTE PROCEDURE ERRORINT(42, :IDDOC, :PREF, 1);
  ERROR = ERROR + 1;
  VER = 'S';
  SUSPEND;
  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 ; ^

/* 20140318B */
/* MAL REPORTE POR COBRADOR, MAL VERIFICACION RANGO DE FECHAS EN SELECT DISTINC COBRADOR */
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);
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);
  /* 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 (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 ; ^

/* 20140320 */
/* GRUPOS DE ACTIVOS, SUGIERE VIDA UTIL */
CREATE TABLE ACTIVOS_GRUPOS (
    ACGR_ID T_ID NOT NULL,
    ACGR_NOM T_CONCEPTO,
    ACGR_MESDEP T_ID,
    ACGR_DEP T_BOOLEANO,
    ACGR_MESDEPN T_ID);
alter table ACTIVOS_GRUPOS
add constraint PK_ACTIVOS_GRUPOS
primary key (ACGR_ID);

ALTER TABLE ACTIVOS_FIJOS
ADD ACGR_ID T_ID;
/* DEPRECIACION POR UNIDADES U HORAS PRODUCIDAS */
ALTER TABLE ACTIVOS_FIJOS
ADD ACFJ_UNIDADES T_BOOLEANO;

/* LOS SUBGRUPOS SON PARA ASOCIAR DOS O MAS ACTIVOS (PARTES) */
CREATE TABLE ACTIVOS_SUBGRUPO (
    ACGR_ID T_ID NOT NULL,
    ACSG_ID T_ID NOT NULL,
    ACSG_NOMBRE T_CONCEPTO);
alter table ACTIVOS_SUBGRUPO
add constraint PK_ACTIVOS_SUBGRUPO
primary key (ACGR_ID, ACSG_ID);

grant select, delete, insert, update on ACTIVOS_GRUPOS to PUBLIC;
grant select, delete, insert, update on activos_subgrupo to PUBLIC;

ALTER TABLE ACTIVOS_FIJOS
ADD ACSG_ID T_ID;

ALTER TABLE ACTIVOS_FIJOS
ADD ACFJ_CTADEPD T_CTA_CONTABLE;

ALTER TABLE ACTIVOS_FIJOS
ADD ACFJ_CTADEPC T_CTA_CONTABLE;

ALTER TABLE ACTIVOS_FIJOS
ADD ACFJ_CTANIIFD T_CTA_CONTABLE;

ALTER TABLE ACTIVOS_FIJOS
ADD ACFJ_CTANIIFC T_CTA_CONTABLE;

CREATE TABLE ACTIVOS_CENTROS (
    ACFJ_COD T_COD_ARTICULO NOT NULL,
    ACCE_ITEM T_ID NOT NULL,
    ACCE_PROY T_PROYECTO,
    ACCE_CENTRO T_CENTRO,
    ACCE_PORC T_PORCENTAJE);
alter table ACTIVOS_CENTROS
add constraint PK_ACTIVOS_CENTROS
primary key (ACFJ_COD,ACCE_ITEM);

ALTER TABLE ACTIVOS_FIJOS
ADD ACFJ_CTACONTA T_CTA_CONTABLE;

ALTER TABLE ACTIVOS_FIJOS
ADD ACFJ_CTANIIF T_CTA_CONTABLE;

CREATE TABLE DEPRECIACION (
    DEPR_ID T_ID NOT NULL,
    DEPR_FECHA CHAR(8),
    TICO_COD T_TIPO_COMP,
    PRCO_PREF PREFIJO,
    ENCO_CONSEC T_ID,
    DEPR_REFER VARCHAR(10),
    ENCO_NUMERO T_NUMDOC,
    DEPR_USUARIO T_USUARIO,
    DEPR_CONC T_CONCEPTO);
alter table DEPRECIACION
add constraint PK_DEPRECIACION
primary key (DEPR_ID);

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

CREATE SEQUENCE ID_DEPRECIA;

SET TERM ^ ;

create or alter procedure CAMBIE_ID_DEPRECIA
returns (
    ID integer)
AS
declare variable NUMROWS INTEGER;
BEGIN
/* TRAE EL ID NUEVO Y LO ACTUALIZA */
NUMROWS = 1;
while (NUMROWS > 0) DO
    BEGIN
    ID = GEN_ID(id_deprecia, 1);
    /* VERIFIQUE SI YA EXISTE */
    SELECT COUNT(*) FROM depreciacion WHERE DEPR_ID = :ID INTO :NUMROWS;
    END
SUSPEND;
END
^

SET TERM ; ^

GRANT EXECUTE ON PROCEDURE cambie_id_deprecia TO PUBLIC;

/* 20140322 */
/* CIERRE POR VENDEDOR */
ALTER TABLE FORMATO_LINEAS
ADD FOLI_REPITE T_BOOLEANO;

UPDATE FORMATO_LINEAS SET FOLI_REPITE = 'N' WHERE FOLI_REPITE IS NULL;
COMMIT WORK;

UPDATE or INSERT INTO TIPO_DOCUMENTO (TIDO_COD, TIDO_NOMCORTO, TIDO_NOMLARGO, TIDO_MODULO, TIDO_INVE, TIDO_CART, TIDO_CXP, TIDO_CAJA, TIDO_BCOS, TIDO_NOM, TIDO_IMP) VALUES (122, 'CIERRVND', 'CIERRE POR VENDEDOR', 'VENTAS', 'N', 'N', 'N', 'N', 'N', NULL, 'N');
UPDATE or INSERT INTO TIPO_DOCUMENTO (TIDO_COD, TIDO_NOMCORTO, TIDO_NOMLARGO, TIDO_MODULO, TIDO_INVE, TIDO_CART, TIDO_CXP, TIDO_CAJA, TIDO_BCOS, TIDO_NOM, TIDO_IMP) VALUES (123, 'CIERZETA', 'CIERRE ZETA POS', 'VENTAS', 'N', 'N', 'N', 'N', 'N', 'N', 'N');
COMMIT WORK;

INSERT INTO FORMATOS (TIDO_COD, PREF_PRE, FORM_IMPRE, FORM_NROITEMS, FORM_PAGINAS, FORM_ENTRELINEA, FORM_FONT, FORM_FSIZE, FORM_PAPELAN, FORM_PAPELAL) VALUES (122, '0001', '1', 600, 'S', 20, 'Roman', 6, 8, 11);
COMMIT WORK;

INSERT INTO FORMATO_DATOS (TIDO_COD, PREF_PRE, DAFO_DATO, DAFO_IMPRIME, DAFO_POSX, DAFO_POSY, DAFO_FORMATO, DAFO_LONG, DAFO_REPITE, DAFO_FONT, DAFO_FSIZE, DAFO_LIQUIDA, DAFO_POSYVAR, DAFO_ITEM, DAFO_INI, DAFO_CORTARPALABRAS, DAFO_JUSTIFICA) VALUES (122, '0001', 'NUMERO FACTURAS', 'S', 1150, 270, NULL, 10, 'S', 'Roman', 6, 'S', 'N', 1, 1, 'S', 'I');
INSERT INTO FORMATO_DATOS (TIDO_COD, PREF_PRE, DAFO_DATO, DAFO_IMPRIME, DAFO_POSX, DAFO_POSY, DAFO_FORMATO, DAFO_LONG, DAFO_REPITE, DAFO_FONT, DAFO_FSIZE, DAFO_LIQUIDA, DAFO_POSYVAR, DAFO_ITEM, DAFO_INI, DAFO_CORTARPALABRAS, DAFO_JUSTIFICA) VALUES (122, '0001', 'FECHA', 'S', 700, 150, NULL, 12, 'N', 'Roman', 6, 'S', 'N', 2, 1, 'S', 'I');
INSERT INTO FORMATO_DATOS (TIDO_COD, PREF_PRE, DAFO_DATO, DAFO_IMPRIME, DAFO_POSX, DAFO_POSY, DAFO_FORMATO, DAFO_LONG, DAFO_REPITE, DAFO_FONT, DAFO_FSIZE, DAFO_LIQUIDA, DAFO_POSYVAR, DAFO_ITEM, DAFO_INI, DAFO_CORTARPALABRAS, DAFO_JUSTIFICA) VALUES (122, '0001', 'PREFIJO', 'S', 700, 180, NULL, 4, 'N', 'Roman', 6, 'S', 'N', 3, 1, 'S', 'I');
INSERT INTO FORMATO_DATOS (TIDO_COD, PREF_PRE, DAFO_DATO, DAFO_IMPRIME, DAFO_POSX, DAFO_POSY, DAFO_FORMATO, DAFO_LONG, DAFO_REPITE, DAFO_FONT, DAFO_FSIZE, DAFO_LIQUIDA, DAFO_POSYVAR, DAFO_ITEM, DAFO_INI, DAFO_CORTARPALABRAS, DAFO_JUSTIFICA) VALUES (122, '0001', 'NUMERO ANULADOS', 'N', 240, 480, NULL, NULL, 'S', 'Roman', 6, 'S', 'N', 4, 1, 'S', 'I');
INSERT INTO FORMATO_DATOS (TIDO_COD, PREF_PRE, DAFO_DATO, DAFO_IMPRIME, DAFO_POSX, DAFO_POSY, DAFO_FORMATO, DAFO_LONG, DAFO_REPITE, DAFO_FONT, DAFO_FSIZE, DAFO_LIQUIDA, DAFO_POSYVAR, DAFO_ITEM, DAFO_INI, DAFO_CORTARPALABRAS, DAFO_JUSTIFICA) VALUES (122, '0001', 'TOTAL ITEMS FACTURADOS', 'S', NULL, NULL, NULL, NULL, 'N', 'Roman', 6, 'S', 'N', 5, 1, 'S', 'I');
INSERT INTO FORMATO_DATOS (TIDO_COD, PREF_PRE, DAFO_DATO, DAFO_IMPRIME, DAFO_POSX, DAFO_POSY, DAFO_FORMATO, DAFO_LONG, DAFO_REPITE, DAFO_FONT, DAFO_FSIZE, DAFO_LIQUIDA, DAFO_POSYVAR, DAFO_ITEM, DAFO_INI, DAFO_CORTARPALABRAS, DAFO_JUSTIFICA) VALUES (122, '0001', 'TOTAL IVA FACTURAS', 'S', 1000, 1080, NULL, NULL, 'N', 'Roman', 6, 'S', 'S', 6, 1, 'S', 'I');
INSERT INTO FORMATO_DATOS (TIDO_COD, PREF_PRE, DAFO_DATO, DAFO_IMPRIME, DAFO_POSX, DAFO_POSY, DAFO_FORMATO, DAFO_LONG, DAFO_REPITE, DAFO_FONT, DAFO_FSIZE, DAFO_LIQUIDA, DAFO_POSYVAR, DAFO_ITEM, DAFO_INI, DAFO_CORTARPALABRAS, DAFO_JUSTIFICA) VALUES (122, '0001', 'TOTAL BASE FACTURAS', 'S', 1000, 1050, NULL, NULL, 'N', 'Roman', 6, 'S', 'N', 7, 1, 'S', 'I');
INSERT INTO FORMATO_DATOS (TIDO_COD, PREF_PRE, DAFO_DATO, DAFO_IMPRIME, DAFO_POSX, DAFO_POSY, DAFO_FORMATO, DAFO_LONG, DAFO_REPITE, DAFO_FONT, DAFO_FSIZE, DAFO_LIQUIDA, DAFO_POSYVAR, DAFO_ITEM, DAFO_INI, DAFO_CORTARPALABRAS, DAFO_JUSTIFICA) VALUES (122, '0001', 'FACTURAS', 'S', 1350, 330, NULL, 10, 'S', 'Roman', 6, 'N', 'N', 8, 1, 'S', 'I');
INSERT INTO FORMATO_DATOS (TIDO_COD, PREF_PRE, DAFO_DATO, DAFO_IMPRIME, DAFO_POSX, DAFO_POSY, DAFO_FORMATO, DAFO_LONG, DAFO_REPITE, DAFO_FONT, DAFO_FSIZE, DAFO_LIQUIDA, DAFO_POSYVAR, DAFO_ITEM, DAFO_INI, DAFO_CORTARPALABRAS, DAFO_JUSTIFICA) VALUES (122, '0001', 'TOTAL BASE DEVOLUCIONES', 'S', 1000, 1140, NULL, NULL, 'N', 'Roman', 6, 'S', 'N', 9, 1, 'S', 'I');
INSERT INTO FORMATO_DATOS (TIDO_COD, PREF_PRE, DAFO_DATO, DAFO_IMPRIME, DAFO_POSX, DAFO_POSY, DAFO_FORMATO, DAFO_LONG, DAFO_REPITE, DAFO_FONT, DAFO_FSIZE, DAFO_LIQUIDA, DAFO_POSYVAR, DAFO_ITEM, DAFO_INI, DAFO_CORTARPALABRAS, DAFO_JUSTIFICA) VALUES (122, '0001', 'TOTAL IVA DEVOLUCIONES', 'S', 1000, 1170, NULL, NULL, 'N', 'Roman', 6, 'S', 'S', 10, 1, 'S', 'I');
INSERT INTO FORMATO_DATOS (TIDO_COD, PREF_PRE, DAFO_DATO, DAFO_IMPRIME, DAFO_POSX, DAFO_POSY, DAFO_FORMATO, DAFO_LONG, DAFO_REPITE, DAFO_FONT, DAFO_FSIZE, DAFO_LIQUIDA, DAFO_POSYVAR, DAFO_ITEM, DAFO_INI, DAFO_CORTARPALABRAS, DAFO_JUSTIFICA) VALUES (122, '0001', 'DEVOLUCIONES', 'S', 1350, 360, NULL, 10, 'S', 'Roman', 6, 'N', 'N', 11, 1, 'S', 'I');
INSERT INTO FORMATO_DATOS (TIDO_COD, PREF_PRE, DAFO_DATO, DAFO_IMPRIME, DAFO_POSX, DAFO_POSY, DAFO_FORMATO, DAFO_LONG, DAFO_REPITE, DAFO_FONT, DAFO_FSIZE, DAFO_LIQUIDA, DAFO_POSYVAR, DAFO_ITEM, DAFO_INI, DAFO_CORTARPALABRAS, DAFO_JUSTIFICA) VALUES (122, '0001', 'ANULADOS', 'N', 1350, 480, NULL, 10, 'S', 'Roman', 6, 'S', 'N', 12, 1, 'S', 'I');
INSERT INTO FORMATO_DATOS (TIDO_COD, PREF_PRE, DAFO_DATO, DAFO_IMPRIME, DAFO_POSX, DAFO_POSY, DAFO_FORMATO, DAFO_LONG, DAFO_REPITE, DAFO_FONT, DAFO_FSIZE, DAFO_LIQUIDA, DAFO_POSYVAR, DAFO_ITEM, DAFO_INI, DAFO_CORTARPALABRAS, DAFO_JUSTIFICA) VALUES (122, '0001', 'TOTAL IVA ANULADOS', 'S', NULL, NULL, NULL, NULL, 'N', 'Roman', 6, 'S', 'N', 13, 1, 'S', 'I');
INSERT INTO FORMATO_DATOS (TIDO_COD, PREF_PRE, DAFO_DATO, DAFO_IMPRIME, DAFO_POSX, DAFO_POSY, DAFO_FORMATO, DAFO_LONG, DAFO_REPITE, DAFO_FONT, DAFO_FSIZE, DAFO_LIQUIDA, DAFO_POSYVAR, DAFO_ITEM, DAFO_INI, DAFO_CORTARPALABRAS, DAFO_JUSTIFICA) VALUES (122, '0001', 'TOTAL BASE NETO', 'S', NULL, NULL, NULL, NULL, 'N', 'Roman', 6, 'S', 'N', 14, 1, 'S', 'I');
INSERT INTO FORMATO_DATOS (TIDO_COD, PREF_PRE, DAFO_DATO, DAFO_IMPRIME, DAFO_POSX, DAFO_POSY, DAFO_FORMATO, DAFO_LONG, DAFO_REPITE, DAFO_FONT, DAFO_FSIZE, DAFO_LIQUIDA, DAFO_POSYVAR, DAFO_ITEM, DAFO_INI, DAFO_CORTARPALABRAS, DAFO_JUSTIFICA) VALUES (122, '0001', 'TOTAL IVA NETO', 'S', NULL, NULL, NULL, NULL, 'N', 'Roman', 6, 'S', 'N', 15, 1, 'S', 'I');
INSERT INTO FORMATO_DATOS (TIDO_COD, PREF_PRE, DAFO_DATO, DAFO_IMPRIME, DAFO_POSX, DAFO_POSY, DAFO_FORMATO, DAFO_LONG, DAFO_REPITE, DAFO_FONT, DAFO_FSIZE, DAFO_LIQUIDA, DAFO_POSYVAR, DAFO_ITEM, DAFO_INI, DAFO_CORTARPALABRAS, DAFO_JUSTIFICA) VALUES (122, '0001', 'TOTAL NETO', 'S', NULL, NULL, NULL, NULL, 'N', 'Roman', 6, 'S', 'N', 16, 1, 'S', 'I');
INSERT INTO FORMATO_DATOS (TIDO_COD, PREF_PRE, DAFO_DATO, DAFO_IMPRIME, DAFO_POSX, DAFO_POSY, DAFO_FORMATO, DAFO_LONG, DAFO_REPITE, DAFO_FONT, DAFO_FSIZE, DAFO_LIQUIDA, DAFO_POSYVAR, DAFO_ITEM, DAFO_INI, DAFO_CORTARPALABRAS, DAFO_JUSTIFICA) VALUES (122, '0001', 'TOTAL FORMA PAGO 1', 'S', 1000, 1260, NULL, NULL, 'N', 'Roman', 6, 'S', 'S', 17, 1, 'S', 'I');
INSERT INTO FORMATO_DATOS (TIDO_COD, PREF_PRE, DAFO_DATO, DAFO_IMPRIME, DAFO_POSX, DAFO_POSY, DAFO_FORMATO, DAFO_LONG, DAFO_REPITE, DAFO_FONT, DAFO_FSIZE, DAFO_LIQUIDA, DAFO_POSYVAR, DAFO_ITEM, DAFO_INI, DAFO_CORTARPALABRAS, DAFO_JUSTIFICA) VALUES (122, '0001', 'TOTAL FORMA PAGO 2', 'S', 1000, 1290, NULL, NULL, 'N', 'Roman', 6, 'S', 'S', 18, 1, 'S', 'I');
INSERT INTO FORMATO_DATOS (TIDO_COD, PREF_PRE, DAFO_DATO, DAFO_IMPRIME, DAFO_POSX, DAFO_POSY, DAFO_FORMATO, DAFO_LONG, DAFO_REPITE, DAFO_FONT, DAFO_FSIZE, DAFO_LIQUIDA, DAFO_POSYVAR, DAFO_ITEM, DAFO_INI, DAFO_CORTARPALABRAS, DAFO_JUSTIFICA) VALUES (122, '0001', 'TOTAL FORMA PAGO 3', 'S', 1000, 1320, NULL, NULL, 'N', 'Roman', 6, 'S', 'S', 19, 1, 'S', 'I');
INSERT INTO FORMATO_DATOS (TIDO_COD, PREF_PRE, DAFO_DATO, DAFO_IMPRIME, DAFO_POSX, DAFO_POSY, DAFO_FORMATO, DAFO_LONG, DAFO_REPITE, DAFO_FONT, DAFO_FSIZE, DAFO_LIQUIDA, DAFO_POSYVAR, DAFO_ITEM, DAFO_INI, DAFO_CORTARPALABRAS, DAFO_JUSTIFICA) VALUES (122, '0001', 'TOTAL FORMA PAGO 4', 'S', 1000, 1350, NULL, NULL, 'N', 'Roman', 6, 'S', 'S', 20, 1, 'S', 'I');
INSERT INTO FORMATO_DATOS (TIDO_COD, PREF_PRE, DAFO_DATO, DAFO_IMPRIME, DAFO_POSX, DAFO_POSY, DAFO_FORMATO, DAFO_LONG, DAFO_REPITE, DAFO_FONT, DAFO_FSIZE, DAFO_LIQUIDA, DAFO_POSYVAR, DAFO_ITEM, DAFO_INI, DAFO_CORTARPALABRAS, DAFO_JUSTIFICA) VALUES (122, '0001', 'TOTAL FORMA PAGO 5', 'S', 1000, 1380, NULL, NULL, 'N', 'Roman', 6, 'S', 'S', 21, 1, 'S', 'I');
INSERT INTO FORMATO_DATOS (TIDO_COD, PREF_PRE, DAFO_DATO, DAFO_IMPRIME, DAFO_POSX, DAFO_POSY, DAFO_FORMATO, DAFO_LONG, DAFO_REPITE, DAFO_FONT, DAFO_FSIZE, DAFO_LIQUIDA, DAFO_POSYVAR, DAFO_ITEM, DAFO_INI, DAFO_CORTARPALABRAS, DAFO_JUSTIFICA) VALUES (122, '0001', 'TOTAL FORMA PAGO 6', 'S', 1000, 1410, NULL, NULL, 'N', 'Roman', 6, 'S', 'S', 22, 1, 'S', 'I');
INSERT INTO FORMATO_DATOS (TIDO_COD, PREF_PRE, DAFO_DATO, DAFO_IMPRIME, DAFO_POSX, DAFO_POSY, DAFO_FORMATO, DAFO_LONG, DAFO_REPITE, DAFO_FONT, DAFO_FSIZE, DAFO_LIQUIDA, DAFO_POSYVAR, DAFO_ITEM, DAFO_INI, DAFO_CORTARPALABRAS, DAFO_JUSTIFICA) VALUES (122, '0001', 'TOTAL FORMA PAGO 7', 'S', 1000, 1440, NULL, NULL, 'N', 'Roman', 6, 'S', 'S', 23, 1, 'S', 'I');
INSERT INTO FORMATO_DATOS (TIDO_COD, PREF_PRE, DAFO_DATO, DAFO_IMPRIME, DAFO_POSX, DAFO_POSY, DAFO_FORMATO, DAFO_LONG, DAFO_REPITE, DAFO_FONT, DAFO_FSIZE, DAFO_LIQUIDA, DAFO_POSYVAR, DAFO_ITEM, DAFO_INI, DAFO_CORTARPALABRAS, DAFO_JUSTIFICA) VALUES (122, '0001', 'TOTAL FORMA PAGO 8', 'S', 1000, 1470, NULL, NULL, 'N', 'Roman', 6, 'S', 'S', 24, 1, 'S', 'I');
INSERT INTO FORMATO_DATOS (TIDO_COD, PREF_PRE, DAFO_DATO, DAFO_IMPRIME, DAFO_POSX, DAFO_POSY, DAFO_FORMATO, DAFO_LONG, DAFO_REPITE, DAFO_FONT, DAFO_FSIZE, DAFO_LIQUIDA, DAFO_POSYVAR, DAFO_ITEM, DAFO_INI, DAFO_CORTARPALABRAS, DAFO_JUSTIFICA) VALUES (122, '0001', 'TOTAL FORMA PAGO 9', 'S', 1000, 1500, NULL, NULL, 'N', 'Roman', 6, 'S', 'S', 25, 1, 'S', 'I');
INSERT INTO FORMATO_DATOS (TIDO_COD, PREF_PRE, DAFO_DATO, DAFO_IMPRIME, DAFO_POSX, DAFO_POSY, DAFO_FORMATO, DAFO_LONG, DAFO_REPITE, DAFO_FONT, DAFO_FSIZE, DAFO_LIQUIDA, DAFO_POSYVAR, DAFO_ITEM, DAFO_INI, DAFO_CORTARPALABRAS, DAFO_JUSTIFICA) VALUES (122, '0001', 'TOTAL FORMA PAGO 10', 'S', 1000, 1530, NULL, NULL, 'N', 'Roman', 6, 'S', 'S', 26, 1, 'S', 'I');
INSERT INTO FORMATO_DATOS (TIDO_COD, PREF_PRE, DAFO_DATO, DAFO_IMPRIME, DAFO_POSX, DAFO_POSY, DAFO_FORMATO, DAFO_LONG, DAFO_REPITE, DAFO_FONT, DAFO_FSIZE, DAFO_LIQUIDA, DAFO_POSYVAR, DAFO_ITEM, DAFO_INI, DAFO_CORTARPALABRAS, DAFO_JUSTIFICA) VALUES (122, '0001', 'TOTAL FORMA PAGO 11', 'S', 1000, 1560, NULL, NULL, 'N', 'Roman', 6, 'S', 'S', 27, 1, 'S', 'I');
INSERT INTO FORMATO_DATOS (TIDO_COD, PREF_PRE, DAFO_DATO, DAFO_IMPRIME, DAFO_POSX, DAFO_POSY, DAFO_FORMATO, DAFO_LONG, DAFO_REPITE, DAFO_FONT, DAFO_FSIZE, DAFO_LIQUIDA, DAFO_POSYVAR, DAFO_ITEM, DAFO_INI, DAFO_CORTARPALABRAS, DAFO_JUSTIFICA) VALUES (122, '0001', 'TOTAL FORMA PAGO 12', 'S', 1000, 1590, NULL, NULL, 'N', 'Roman', 6, 'S', 'S', 28, 1, 'S', 'I');
INSERT INTO FORMATO_DATOS (TIDO_COD, PREF_PRE, DAFO_DATO, DAFO_IMPRIME, DAFO_POSX, DAFO_POSY, DAFO_FORMATO, DAFO_LONG, DAFO_REPITE, DAFO_FONT, DAFO_FSIZE, DAFO_LIQUIDA, DAFO_POSYVAR, DAFO_ITEM, DAFO_INI, DAFO_CORTARPALABRAS, DAFO_JUSTIFICA) VALUES (122, '0001', 'TOTAL FORMA PAGO 13', 'S', 1000, 1620, NULL, NULL, 'N', 'Roman', 6, 'S', 'S', 29, 1, 'S', 'I');
INSERT INTO FORMATO_DATOS (TIDO_COD, PREF_PRE, DAFO_DATO, DAFO_IMPRIME, DAFO_POSX, DAFO_POSY, DAFO_FORMATO, DAFO_LONG, DAFO_REPITE, DAFO_FONT, DAFO_FSIZE, DAFO_LIQUIDA, DAFO_POSYVAR, DAFO_ITEM, DAFO_INI, DAFO_CORTARPALABRAS, DAFO_JUSTIFICA) VALUES (122, '0001', 'TOTAL FORMA PAGO 14', 'S', 1000, 1650, NULL, NULL, 'N', 'Roman', 6, 'S', 'S', 30, 1, 'S', 'I');
INSERT INTO FORMATO_DATOS (TIDO_COD, PREF_PRE, DAFO_DATO, DAFO_IMPRIME, DAFO_POSX, DAFO_POSY, DAFO_FORMATO, DAFO_LONG, DAFO_REPITE, DAFO_FONT, DAFO_FSIZE, DAFO_LIQUIDA, DAFO_POSYVAR, DAFO_ITEM, DAFO_INI, DAFO_CORTARPALABRAS, DAFO_JUSTIFICA) VALUES (122, '0001', 'TOTAL FORMA PAGO 15', 'S', 1000, 1680, NULL, NULL, 'N', 'Roman', 6, 'S', 'S', 31, 1, 'S', 'I');
INSERT INTO FORMATO_DATOS (TIDO_COD, PREF_PRE, DAFO_DATO, DAFO_IMPRIME, DAFO_POSX, DAFO_POSY, DAFO_FORMATO, DAFO_LONG, DAFO_REPITE, DAFO_FONT, DAFO_FSIZE, DAFO_LIQUIDA, DAFO_POSYVAR, DAFO_ITEM, DAFO_INI, DAFO_CORTARPALABRAS, DAFO_JUSTIFICA) VALUES (122, '0001', 'TOTAL CARTERA', 'S', NULL, NULL, NULL, NULL, 'N', 'Roman', 6, 'S', 'N', 32, 1, 'S', 'I');
INSERT INTO FORMATO_DATOS (TIDO_COD, PREF_PRE, DAFO_DATO, DAFO_IMPRIME, DAFO_POSX, DAFO_POSY, DAFO_FORMATO, DAFO_LONG, DAFO_REPITE, DAFO_FONT, DAFO_FSIZE, DAFO_LIQUIDA, DAFO_POSYVAR, DAFO_ITEM, DAFO_INI, DAFO_CORTARPALABRAS, DAFO_JUSTIFICA) VALUES (122, '0001', 'TOTAL RETENCIONES', 'S', NULL, NULL, NULL, NULL, 'N', 'Roman', 6, 'S', 'N', 33, 1, 'S', 'I');
INSERT INTO FORMATO_DATOS (TIDO_COD, PREF_PRE, DAFO_DATO, DAFO_IMPRIME, DAFO_POSX, DAFO_POSY, DAFO_FORMATO, DAFO_LONG, DAFO_REPITE, DAFO_FONT, DAFO_FSIZE, DAFO_LIQUIDA, DAFO_POSYVAR, DAFO_ITEM, DAFO_INI, DAFO_CORTARPALABRAS, DAFO_JUSTIFICA) VALUES (122, '0001', 'PUNTO DE VENTA', 'S', 700, 210, NULL, 10, 'N', 'Roman', 6, 'S', 'N', 34, 1, 'S', 'I');
INSERT INTO FORMATO_DATOS (TIDO_COD, PREF_PRE, DAFO_DATO, DAFO_IMPRIME, DAFO_POSX, DAFO_POSY, DAFO_FORMATO, DAFO_LONG, DAFO_REPITE, DAFO_FONT, DAFO_FSIZE, DAFO_LIQUIDA, DAFO_POSYVAR, DAFO_ITEM, DAFO_INI, DAFO_CORTARPALABRAS, DAFO_JUSTIFICA) VALUES (122, '0001', 'NOMBRE USUARIO', 'N', 700, 270, NULL, NULL, 'N', 'Roman', 6, 'S', 'N', 35, 1, 'S', 'I');
INSERT INTO FORMATO_DATOS (TIDO_COD, PREF_PRE, DAFO_DATO, DAFO_IMPRIME, DAFO_POSX, DAFO_POSY, DAFO_FORMATO, DAFO_LONG, DAFO_REPITE, DAFO_FONT, DAFO_FSIZE, DAFO_LIQUIDA, DAFO_POSYVAR, DAFO_ITEM, DAFO_INI, DAFO_CORTARPALABRAS, DAFO_JUSTIFICA) VALUES (122, '0001', 'CODIGO USUARIO', 'S', NULL, NULL, NULL, NULL, 'N', 'Roman', 6, 'N', 'N', 36, 1, 'S', 'I');
INSERT INTO FORMATO_DATOS (TIDO_COD, PREF_PRE, DAFO_DATO, DAFO_IMPRIME, DAFO_POSX, DAFO_POSY, DAFO_FORMATO, DAFO_LONG, DAFO_REPITE, DAFO_FONT, DAFO_FSIZE, DAFO_LIQUIDA, DAFO_POSYVAR, DAFO_ITEM, DAFO_INI, DAFO_CORTARPALABRAS, DAFO_JUSTIFICA) VALUES (122, '0001', 'NOMBRE COMPANIA', 'S', NULL, NULL, NULL, NULL, 'N', 'Roman', 6, 'S', 'N', 37, 1, 'S', 'I');
INSERT INTO FORMATO_DATOS (TIDO_COD, PREF_PRE, DAFO_DATO, DAFO_IMPRIME, DAFO_POSX, DAFO_POSY, DAFO_FORMATO, DAFO_LONG, DAFO_REPITE, DAFO_FONT, DAFO_FSIZE, DAFO_LIQUIDA, DAFO_POSYVAR, DAFO_ITEM, DAFO_INI, DAFO_CORTARPALABRAS, DAFO_JUSTIFICA) VALUES (122, '0001', 'DIR COMPANIA', 'S', NULL, NULL, NULL, NULL, 'N', 'Roman', 6, 'N', 'N', 38, 1, 'S', 'I');
INSERT INTO FORMATO_DATOS (TIDO_COD, PREF_PRE, DAFO_DATO, DAFO_IMPRIME, DAFO_POSX, DAFO_POSY, DAFO_FORMATO, DAFO_LONG, DAFO_REPITE, DAFO_FONT, DAFO_FSIZE, DAFO_LIQUIDA, DAFO_POSYVAR, DAFO_ITEM, DAFO_INI, DAFO_CORTARPALABRAS, DAFO_JUSTIFICA) VALUES (122, '0001', 'TEL COMPANIA', 'S', NULL, NULL, NULL, NULL, 'N', 'Roman', 6, 'S', 'N', 39, 1, 'S', 'I');
INSERT INTO FORMATO_DATOS (TIDO_COD, PREF_PRE, DAFO_DATO, DAFO_IMPRIME, DAFO_POSX, DAFO_POSY, DAFO_FORMATO, DAFO_LONG, DAFO_REPITE, DAFO_FONT, DAFO_FSIZE, DAFO_LIQUIDA, DAFO_POSYVAR, DAFO_ITEM, DAFO_INI, DAFO_CORTARPALABRAS, DAFO_JUSTIFICA) VALUES (122, '0001', 'ENCABEZA COMPANIA', 'S', NULL, NULL, NULL, NULL, 'N', 'Roman', 6, 'S', 'N', 41, 1, 'S', 'I');
INSERT INTO FORMATO_DATOS (TIDO_COD, PREF_PRE, DAFO_DATO, DAFO_IMPRIME, DAFO_POSX, DAFO_POSY, DAFO_FORMATO, DAFO_LONG, DAFO_REPITE, DAFO_FONT, DAFO_FSIZE, DAFO_LIQUIDA, DAFO_POSYVAR, DAFO_ITEM, DAFO_INI, DAFO_CORTARPALABRAS, DAFO_JUSTIFICA) VALUES (122, '0001', 'NUMERO FACTURAS', 'N', NULL, NULL, NULL, NULL, 'N', 'Roman', 6, 'S', 'N', 43, 1, 'S', 'I');
INSERT INTO FORMATO_DATOS (TIDO_COD, PREF_PRE, DAFO_DATO, DAFO_IMPRIME, DAFO_POSX, DAFO_POSY, DAFO_FORMATO, DAFO_LONG, DAFO_REPITE, DAFO_FONT, DAFO_FSIZE, DAFO_LIQUIDA, DAFO_POSYVAR, DAFO_ITEM, DAFO_INI, DAFO_CORTARPALABRAS, DAFO_JUSTIFICA) VALUES (122, '0001', 'NUMERO ANULADOS', 'N', NULL, NULL, NULL, NULL, 'N', 'Roman', 6, 'N', 'N', 44, 1, 'S', 'I');
INSERT INTO FORMATO_DATOS (TIDO_COD, PREF_PRE, DAFO_DATO, DAFO_IMPRIME, DAFO_POSX, DAFO_POSY, DAFO_FORMATO, DAFO_LONG, DAFO_REPITE, DAFO_FONT, DAFO_FSIZE, DAFO_LIQUIDA, DAFO_POSYVAR, DAFO_ITEM, DAFO_INI, DAFO_CORTARPALABRAS, DAFO_JUSTIFICA) VALUES (122, '0001', 'ITEMS FACTURADOS', 'S', 240, 330, NULL, 10, 'S', 'Roman', 6, 'N', 'N', 45, 1, 'S', 'I');
INSERT INTO FORMATO_DATOS (TIDO_COD, PREF_PRE, DAFO_DATO, DAFO_IMPRIME, DAFO_POSX, DAFO_POSY, DAFO_FORMATO, DAFO_LONG, DAFO_REPITE, DAFO_FONT, DAFO_FSIZE, DAFO_LIQUIDA, DAFO_POSYVAR, DAFO_ITEM, DAFO_INI, DAFO_CORTARPALABRAS, DAFO_JUSTIFICA) VALUES (122, '0001', 'ITEMS DEVUELTOS', 'S', 240, 360, NULL, 10, 'S', 'Roman', 6, 'N', 'N', 46, 1, 'S', 'I');
INSERT INTO FORMATO_DATOS (TIDO_COD, PREF_PRE, DAFO_DATO, DAFO_IMPRIME, DAFO_POSX, DAFO_POSY, DAFO_FORMATO, DAFO_LONG, DAFO_REPITE, DAFO_FONT, DAFO_FSIZE, DAFO_LIQUIDA, DAFO_POSYVAR, DAFO_ITEM, DAFO_INI, DAFO_CORTARPALABRAS, DAFO_JUSTIFICA) VALUES (122, '0001', 'BASE FACTURAS', 'S', 750, 330, NULL, 10, 'S', 'Roman', 6, 'N', 'N', 47, 1, 'S', 'I');
INSERT INTO FORMATO_DATOS (TIDO_COD, PREF_PRE, DAFO_DATO, DAFO_IMPRIME, DAFO_POSX, DAFO_POSY, DAFO_FORMATO, DAFO_LONG, DAFO_REPITE, DAFO_FONT, DAFO_FSIZE, DAFO_LIQUIDA, DAFO_POSYVAR, DAFO_ITEM, DAFO_INI, DAFO_CORTARPALABRAS, DAFO_JUSTIFICA) VALUES (122, '0001', 'IVA FACTURAS', 'S', 1000, 330, NULL, 10, 'S', 'Roman', 6, 'N', 'N', 48, 1, 'S', 'I');
INSERT INTO FORMATO_DATOS (TIDO_COD, PREF_PRE, DAFO_DATO, DAFO_IMPRIME, DAFO_POSX, DAFO_POSY, DAFO_FORMATO, DAFO_LONG, DAFO_REPITE, DAFO_FONT, DAFO_FSIZE, DAFO_LIQUIDA, DAFO_POSYVAR, DAFO_ITEM, DAFO_INI, DAFO_CORTARPALABRAS, DAFO_JUSTIFICA) VALUES (122, '0001', 'FACTURAS', 'S', NULL, NULL, NULL, NULL, 'N', 'Roman', 6, 'N', 'N', 49, 1, 'S', 'I');
INSERT INTO FORMATO_DATOS (TIDO_COD, PREF_PRE, DAFO_DATO, DAFO_IMPRIME, DAFO_POSX, DAFO_POSY, DAFO_FORMATO, DAFO_LONG, DAFO_REPITE, DAFO_FONT, DAFO_FSIZE, DAFO_LIQUIDA, DAFO_POSYVAR, DAFO_ITEM, DAFO_INI, DAFO_CORTARPALABRAS, DAFO_JUSTIFICA) VALUES (122, '0001', 'BASE DEVOLUCIONES', 'S', 750, 360, NULL, 10, 'S', 'Roman', 6, 'N', 'N', 50, 1, 'S', 'I');
INSERT INTO FORMATO_DATOS (TIDO_COD, PREF_PRE, DAFO_DATO, DAFO_IMPRIME, DAFO_POSX, DAFO_POSY, DAFO_FORMATO, DAFO_LONG, DAFO_REPITE, DAFO_FONT, DAFO_FSIZE, DAFO_LIQUIDA, DAFO_POSYVAR, DAFO_ITEM, DAFO_INI, DAFO_CORTARPALABRAS, DAFO_JUSTIFICA) VALUES (122, '0001', 'IVA DEVOLUCIONES', 'S', 1000, 360, NULL, 10, 'S', 'Roman', 6, 'N', 'N', 51, 1, 'S', 'I');
INSERT INTO FORMATO_DATOS (TIDO_COD, PREF_PRE, DAFO_DATO, DAFO_IMPRIME, DAFO_POSX, DAFO_POSY, DAFO_FORMATO, DAFO_LONG, DAFO_REPITE, DAFO_FONT, DAFO_FSIZE, DAFO_LIQUIDA, DAFO_POSYVAR, DAFO_ITEM, DAFO_INI, DAFO_CORTARPALABRAS, DAFO_JUSTIFICA) VALUES (122, '0001', 'DEVOLUCIONES', 'S', NULL, NULL, NULL, NULL, 'N', 'Roman', 6, 'N', 'N', 52, 1, 'S', 'I');
INSERT INTO FORMATO_DATOS (TIDO_COD, PREF_PRE, DAFO_DATO, DAFO_IMPRIME, DAFO_POSX, DAFO_POSY, DAFO_FORMATO, DAFO_LONG, DAFO_REPITE, DAFO_FONT, DAFO_FSIZE, DAFO_LIQUIDA, DAFO_POSYVAR, DAFO_ITEM, DAFO_INI, DAFO_CORTARPALABRAS, DAFO_JUSTIFICA) VALUES (122, '0001', 'ANULADOS', 'S', NULL, NULL, NULL, NULL, 'N', 'Roman', 6, 'N', 'N', 53, 1, 'S', 'I');
INSERT INTO FORMATO_DATOS (TIDO_COD, PREF_PRE, DAFO_DATO, DAFO_IMPRIME, DAFO_POSX, DAFO_POSY, DAFO_FORMATO, DAFO_LONG, DAFO_REPITE, DAFO_FONT, DAFO_FSIZE, DAFO_LIQUIDA, DAFO_POSYVAR, DAFO_ITEM, DAFO_INI, DAFO_CORTARPALABRAS, DAFO_JUSTIFICA) VALUES (122, '0001', 'IVA ANULADOS', 'N', 1000, 480, NULL, 10, 'S', 'Roman', 6, 'N', 'N', 54, 1, 'S', 'I');
INSERT INTO FORMATO_DATOS (TIDO_COD, PREF_PRE, DAFO_DATO, DAFO_IMPRIME, DAFO_POSX, DAFO_POSY, DAFO_FORMATO, DAFO_LONG, DAFO_REPITE, DAFO_FONT, DAFO_FSIZE, DAFO_LIQUIDA, DAFO_POSYVAR, DAFO_ITEM, DAFO_INI, DAFO_CORTARPALABRAS, DAFO_JUSTIFICA) VALUES (122, '0001', 'BASE NETO', 'S', 750, 420, NULL, 10, 'S', 'Roman', 6, 'N', 'N', 55, 1, 'S', 'I');
INSERT INTO FORMATO_DATOS (TIDO_COD, PREF_PRE, DAFO_DATO, DAFO_IMPRIME, DAFO_POSX, DAFO_POSY, DAFO_FORMATO, DAFO_LONG, DAFO_REPITE, DAFO_FONT, DAFO_FSIZE, DAFO_LIQUIDA, DAFO_POSYVAR, DAFO_ITEM, DAFO_INI, DAFO_CORTARPALABRAS, DAFO_JUSTIFICA) VALUES (122, '0001', 'IVA NETO', 'S', 1000, 420, NULL, 10, 'S', 'Roman', 6, 'N', 'N', 56, 1, 'S', 'I');
INSERT INTO FORMATO_DATOS (TIDO_COD, PREF_PRE, DAFO_DATO, DAFO_IMPRIME, DAFO_POSX, DAFO_POSY, DAFO_FORMATO, DAFO_LONG, DAFO_REPITE, DAFO_FONT, DAFO_FSIZE, DAFO_LIQUIDA, DAFO_POSYVAR, DAFO_ITEM, DAFO_INI, DAFO_CORTARPALABRAS, DAFO_JUSTIFICA) VALUES (122, '0001', 'NETO', 'S', NULL, NULL, NULL, NULL, 'N', 'Roman', 6, 'N', 'N', 57, 1, 'S', 'I');
INSERT INTO FORMATO_DATOS (TIDO_COD, PREF_PRE, DAFO_DATO, DAFO_IMPRIME, DAFO_POSX, DAFO_POSY, DAFO_FORMATO, DAFO_LONG, DAFO_REPITE, DAFO_FONT, DAFO_FSIZE, DAFO_LIQUIDA, DAFO_POSYVAR, DAFO_ITEM, DAFO_INI, DAFO_CORTARPALABRAS, DAFO_JUSTIFICA) VALUES (122, '0001', 'FORMA PAGO 1', 'S', 1000, 480, NULL, NULL, 'S', 'Roman', 6, 'N', 'N', 58, 1, 'S', 'I');
INSERT INTO FORMATO_DATOS (TIDO_COD, PREF_PRE, DAFO_DATO, DAFO_IMPRIME, DAFO_POSX, DAFO_POSY, DAFO_FORMATO, DAFO_LONG, DAFO_REPITE, DAFO_FONT, DAFO_FSIZE, DAFO_LIQUIDA, DAFO_POSYVAR, DAFO_ITEM, DAFO_INI, DAFO_CORTARPALABRAS, DAFO_JUSTIFICA) VALUES (122, '0001', 'FORMA PAGO 2', 'S', 1000, 510, NULL, NULL, 'S', 'Roman', 6, 'N', 'N', 59, 1, 'S', 'I');
INSERT INTO FORMATO_DATOS (TIDO_COD, PREF_PRE, DAFO_DATO, DAFO_IMPRIME, DAFO_POSX, DAFO_POSY, DAFO_FORMATO, DAFO_LONG, DAFO_REPITE, DAFO_FONT, DAFO_FSIZE, DAFO_LIQUIDA, DAFO_POSYVAR, DAFO_ITEM, DAFO_INI, DAFO_CORTARPALABRAS, DAFO_JUSTIFICA) VALUES (122, '0001', 'FORMA PAGO 3', 'S', 1000, 540, NULL, NULL, 'S', 'Roman', 6, 'N', 'N', 60, 1, 'S', 'I');
INSERT INTO FORMATO_DATOS (TIDO_COD, PREF_PRE, DAFO_DATO, DAFO_IMPRIME, DAFO_POSX, DAFO_POSY, DAFO_FORMATO, DAFO_LONG, DAFO_REPITE, DAFO_FONT, DAFO_FSIZE, DAFO_LIQUIDA, DAFO_POSYVAR, DAFO_ITEM, DAFO_INI, DAFO_CORTARPALABRAS, DAFO_JUSTIFICA) VALUES (122, '0001', 'FORMA PAGO 4', 'S', 1000, 570, NULL, NULL, 'S', 'Roman', 6, 'N', 'N', 61, 1, 'S', 'I');
INSERT INTO FORMATO_DATOS (TIDO_COD, PREF_PRE, DAFO_DATO, DAFO_IMPRIME, DAFO_POSX, DAFO_POSY, DAFO_FORMATO, DAFO_LONG, DAFO_REPITE, DAFO_FONT, DAFO_FSIZE, DAFO_LIQUIDA, DAFO_POSYVAR, DAFO_ITEM, DAFO_INI, DAFO_CORTARPALABRAS, DAFO_JUSTIFICA) VALUES (122, '0001', 'FORMA PAGO 5', 'S', 1000, 600, NULL, NULL, 'S', 'Roman', 6, 'N', 'N', 62, 1, 'S', 'I');
INSERT INTO FORMATO_DATOS (TIDO_COD, PREF_PRE, DAFO_DATO, DAFO_IMPRIME, DAFO_POSX, DAFO_POSY, DAFO_FORMATO, DAFO_LONG, DAFO_REPITE, DAFO_FONT, DAFO_FSIZE, DAFO_LIQUIDA, DAFO_POSYVAR, DAFO_ITEM, DAFO_INI, DAFO_CORTARPALABRAS, DAFO_JUSTIFICA) VALUES (122, '0001', 'FORMA PAGO 6', 'S', 1000, 630, NULL, NULL, 'S', 'Roman', 6, 'N', 'N', 63, 1, 'S', 'I');
INSERT INTO FORMATO_DATOS (TIDO_COD, PREF_PRE, DAFO_DATO, DAFO_IMPRIME, DAFO_POSX, DAFO_POSY, DAFO_FORMATO, DAFO_LONG, DAFO_REPITE, DAFO_FONT, DAFO_FSIZE, DAFO_LIQUIDA, DAFO_POSYVAR, DAFO_ITEM, DAFO_INI, DAFO_CORTARPALABRAS, DAFO_JUSTIFICA) VALUES (122, '0001', 'FORMA PAGO 7', 'S', 1000, 660, NULL, NULL, 'S', 'Roman', 6, 'N', 'N', 64, 1, 'S', 'I');
INSERT INTO FORMATO_DATOS (TIDO_COD, PREF_PRE, DAFO_DATO, DAFO_IMPRIME, DAFO_POSX, DAFO_POSY, DAFO_FORMATO, DAFO_LONG, DAFO_REPITE, DAFO_FONT, DAFO_FSIZE, DAFO_LIQUIDA, DAFO_POSYVAR, DAFO_ITEM, DAFO_INI, DAFO_CORTARPALABRAS, DAFO_JUSTIFICA) VALUES (122, '0001', 'FORMA PAGO 8', 'S', 1000, 690, NULL, NULL, 'S', 'Roman', 6, 'N', 'N', 65, 1, 'S', 'I');
INSERT INTO FORMATO_DATOS (TIDO_COD, PREF_PRE, DAFO_DATO, DAFO_IMPRIME, DAFO_POSX, DAFO_POSY, DAFO_FORMATO, DAFO_LONG, DAFO_REPITE, DAFO_FONT, DAFO_FSIZE, DAFO_LIQUIDA, DAFO_POSYVAR, DAFO_ITEM, DAFO_INI, DAFO_CORTARPALABRAS, DAFO_JUSTIFICA) VALUES (122, '0001', 'FORMA PAGO 9', 'S', 1000, 720, NULL, NULL, 'S', 'Roman', 6, 'N', 'N', 66, 1, 'S', 'I');
INSERT INTO FORMATO_DATOS (TIDO_COD, PREF_PRE, DAFO_DATO, DAFO_IMPRIME, DAFO_POSX, DAFO_POSY, DAFO_FORMATO, DAFO_LONG, DAFO_REPITE, DAFO_FONT, DAFO_FSIZE, DAFO_LIQUIDA, DAFO_POSYVAR, DAFO_ITEM, DAFO_INI, DAFO_CORTARPALABRAS, DAFO_JUSTIFICA) VALUES (122, '0001', 'FORMA PAGO 10', 'S', 1000, 750, NULL, NULL, 'N', 'Roman', 6, 'N', 'N', 67, 1, 'S', 'I');
INSERT INTO FORMATO_DATOS (TIDO_COD, PREF_PRE, DAFO_DATO, DAFO_IMPRIME, DAFO_POSX, DAFO_POSY, DAFO_FORMATO, DAFO_LONG, DAFO_REPITE, DAFO_FONT, DAFO_FSIZE, DAFO_LIQUIDA, DAFO_POSYVAR, DAFO_ITEM, DAFO_INI, DAFO_CORTARPALABRAS, DAFO_JUSTIFICA) VALUES (122, '0001', 'FORMA PAGO 11', 'S', 1000, 780, NULL, NULL, 'N', 'Roman', 6, 'N', 'N', 68, 1, 'S', 'I');
INSERT INTO FORMATO_DATOS (TIDO_COD, PREF_PRE, DAFO_DATO, DAFO_IMPRIME, DAFO_POSX, DAFO_POSY, DAFO_FORMATO, DAFO_LONG, DAFO_REPITE, DAFO_FONT, DAFO_FSIZE, DAFO_LIQUIDA, DAFO_POSYVAR, DAFO_ITEM, DAFO_INI, DAFO_CORTARPALABRAS, DAFO_JUSTIFICA) VALUES (122, '0001', 'FORMA PAGO 13', 'S', 1000, 810, NULL, NULL, 'N', 'Roman', 6, 'N', 'N', 69, 1, 'S', 'I');
INSERT INTO FORMATO_DATOS (TIDO_COD, PREF_PRE, DAFO_DATO, DAFO_IMPRIME, DAFO_POSX, DAFO_POSY, DAFO_FORMATO, DAFO_LONG, DAFO_REPITE, DAFO_FONT, DAFO_FSIZE, DAFO_LIQUIDA, DAFO_POSYVAR, DAFO_ITEM, DAFO_INI, DAFO_CORTARPALABRAS, DAFO_JUSTIFICA) VALUES (122, '0001', 'FORMA PAGO 14', 'S', 1000, 840, NULL, NULL, 'N', 'Roman', 6, 'N', 'N', 70, 1, 'S', 'I');
INSERT INTO FORMATO_DATOS (TIDO_COD, PREF_PRE, DAFO_DATO, DAFO_IMPRIME, DAFO_POSX, DAFO_POSY, DAFO_FORMATO, DAFO_LONG, DAFO_REPITE, DAFO_FONT, DAFO_FSIZE, DAFO_LIQUIDA, DAFO_POSYVAR, DAFO_ITEM, DAFO_INI, DAFO_CORTARPALABRAS, DAFO_JUSTIFICA) VALUES (122, '0001', 'FORMA PAGO 15', 'S', 1000, 870, NULL, NULL, 'N', 'Roman', 6, 'N', 'N', 71, 1, 'S', 'I');
INSERT INTO FORMATO_DATOS (TIDO_COD, PREF_PRE, DAFO_DATO, DAFO_IMPRIME, DAFO_POSX, DAFO_POSY, DAFO_FORMATO, DAFO_LONG, DAFO_REPITE, DAFO_FONT, DAFO_FSIZE, DAFO_LIQUIDA, DAFO_POSYVAR, DAFO_ITEM, DAFO_INI, DAFO_CORTARPALABRAS, DAFO_JUSTIFICA) VALUES (122, '0001', 'CARTERA', 'S', NULL, NULL, NULL, NULL, 'N', 'Roman', 6, 'N', 'N', 72, 1, 'S', 'I');
INSERT INTO FORMATO_DATOS (TIDO_COD, PREF_PRE, DAFO_DATO, DAFO_IMPRIME, DAFO_POSX, DAFO_POSY, DAFO_FORMATO, DAFO_LONG, DAFO_REPITE, DAFO_FONT, DAFO_FSIZE, DAFO_LIQUIDA, DAFO_POSYVAR, DAFO_ITEM, DAFO_INI, DAFO_CORTARPALABRAS, DAFO_JUSTIFICA) VALUES (122, '0001', 'RETENCIONES', 'S', NULL, NULL, NULL, NULL, 'N', 'Roman', 6, 'N', 'N', 73, 1, 'S', 'I');
INSERT INTO FORMATO_DATOS (TIDO_COD, PREF_PRE, DAFO_DATO, DAFO_IMPRIME, DAFO_POSX, DAFO_POSY, DAFO_FORMATO, DAFO_LONG, DAFO_REPITE, DAFO_FONT, DAFO_FSIZE, DAFO_LIQUIDA, DAFO_POSYVAR, DAFO_ITEM, DAFO_INI, DAFO_CORTARPALABRAS, DAFO_JUSTIFICA) VALUES (122, '0001', 'VENDEDOR', 'S', 700, 240, NULL, 10, 'S', 'Roman', 6, 'N', 'N', 74, 1, 'S', 'I');
INSERT INTO FORMATO_DATOS (TIDO_COD, PREF_PRE, DAFO_DATO, DAFO_IMPRIME, DAFO_POSX, DAFO_POSY, DAFO_FORMATO, DAFO_LONG, DAFO_REPITE, DAFO_FONT, DAFO_FSIZE, DAFO_LIQUIDA, DAFO_POSYVAR, DAFO_ITEM, DAFO_INI, DAFO_CORTARPALABRAS, DAFO_JUSTIFICA) VALUES (122, '0001', 'NOMBRE VENDEDOR', 'S', 800, 240, NULL, 30, 'S', 'Roman', 6, 'N', 'N', 75, 1, 'S', 'I');
INSERT INTO FORMATO_DATOS (TIDO_COD, PREF_PRE, DAFO_DATO, DAFO_IMPRIME, DAFO_POSX, DAFO_POSY, DAFO_FORMATO, DAFO_LONG, DAFO_REPITE, DAFO_FONT, DAFO_FSIZE, DAFO_LIQUIDA, DAFO_POSYVAR, DAFO_ITEM, DAFO_INI, DAFO_CORTARPALABRAS, DAFO_JUSTIFICA) VALUES (122, '0001', 'TOTAL DEVOLUCIONES', 'S', 1000, 1200, NULL, NULL, 'N', 'Roman', 6, 'S', 'S', 998, 1, 'S', 'I');
INSERT INTO FORMATO_DATOS (TIDO_COD, PREF_PRE, DAFO_DATO, DAFO_IMPRIME, DAFO_POSX, DAFO_POSY, DAFO_FORMATO, DAFO_LONG, DAFO_REPITE, DAFO_FONT, DAFO_FSIZE, DAFO_LIQUIDA, DAFO_POSYVAR, DAFO_ITEM, DAFO_INI, DAFO_CORTARPALABRAS, DAFO_JUSTIFICA) VALUES (122, '0001', 'TOTAL FACTURAS', 'S', 1000, 1110, NULL, NULL, 'N', 'Roman', 6, 'S', 'S', 999, 1, 'S', 'I');
INSERT INTO FORMATO_DATOS (TIDO_COD, PREF_PRE, DAFO_DATO, DAFO_IMPRIME, DAFO_POSX, DAFO_POSY, DAFO_FORMATO, DAFO_LONG, DAFO_REPITE, DAFO_FONT, DAFO_FSIZE, DAFO_LIQUIDA, DAFO_POSYVAR, DAFO_ITEM, DAFO_INI, DAFO_CORTARPALABRAS, DAFO_JUSTIFICA) VALUES (122, '0001', 'NETO', 'S', 1350, 420, NULL, 10, 'S', 'Roman', 6, 'N', 'N', 997, 1, 'S', 'I');

COMMIT WORK;

INSERT INTO FORMATO_LINEAS (TIDO_COD, PREF_PRE, FOLI_ITEM, FOLI_TIPO, FOLI_X, FOLI_Y, FOLI_POSX, FOLI_POSY, FOLI_CADENA, FOLI_FONT, FOLI_FSIZE, FOLI_LIQUIDA) VALUES (122, '0001', 1, 'T', NULL, NULL, 400, 30, 'SUPERMERCADO', 'Arial Black', 10, 'N');
INSERT INTO FORMATO_LINEAS (TIDO_COD, PREF_PRE, FOLI_ITEM, FOLI_TIPO, FOLI_X, FOLI_Y, FOLI_POSX, FOLI_POSY, FOLI_CADENA, FOLI_FONT, FOLI_FSIZE, FOLI_LIQUIDA) VALUES (122, '0001', 2, 'T', NULL, NULL, 120, 50, 'VICTORIA PLAZA LIBERTADORES', 'Arial Black', 10, 'N');
INSERT INTO FORMATO_LINEAS (TIDO_COD, PREF_PRE, FOLI_ITEM, FOLI_TIPO, FOLI_X, FOLI_Y, FOLI_POSX, FOLI_POSY, FOLI_CADENA, FOLI_FONT, FOLI_FSIZE, FOLI_LIQUIDA) VALUES (122, '0001', 3, 'T', NULL, NULL, 350, 70, 'LUIS ALIRIO RANGEL SILVA', 'Roman', 8, 'N');
INSERT INTO FORMATO_LINEAS (TIDO_COD, PREF_PRE, FOLI_ITEM, FOLI_TIPO, FOLI_X, FOLI_Y, FOLI_POSX, FOLI_POSY, FOLI_CADENA, FOLI_FONT, FOLI_FSIZE, FOLI_LIQUIDA) VALUES (122, '0001', 4, 'T', NULL, NULL, 450, 90, 'NIT: 13.440.168-3', 'Roman', 8, 'N');
INSERT INTO FORMATO_LINEAS (TIDO_COD, PREF_PRE, FOLI_ITEM, FOLI_TIPO, FOLI_X, FOLI_Y, FOLI_POSX, FOLI_POSY, FOLI_CADENA, FOLI_FONT, FOLI_FSIZE, FOLI_LIQUIDA) VALUES (122, '0001', 5, 'T', NULL, NULL, 110, 120, 'INFORME  DE CIERRE  DE VENTAS VENDEDOR', 'Roman', 8, 'N');
INSERT INTO FORMATO_LINEAS (TIDO_COD, PREF_PRE, FOLI_ITEM, FOLI_TIPO, FOLI_X, FOLI_Y, FOLI_POSX, FOLI_POSY, FOLI_CADENA, FOLI_FONT, FOLI_FSIZE, FOLI_LIQUIDA) VALUES (122, '0001', 8, 'T', NULL, NULL, 110, 150, 'FECHA:', 'Roman', 8, 'N');
INSERT INTO FORMATO_LINEAS (TIDO_COD, PREF_PRE, FOLI_ITEM, FOLI_TIPO, FOLI_X, FOLI_Y, FOLI_POSX, FOLI_POSY, FOLI_CADENA, FOLI_FONT, FOLI_FSIZE, FOLI_LIQUIDA) VALUES (122, '0001', 9, 'T', NULL, NULL, 110, 210, 'PUNTO DE VENTA', 'Roman', 8, 'N');
INSERT INTO FORMATO_LINEAS (TIDO_COD, PREF_PRE, FOLI_ITEM, FOLI_TIPO, FOLI_X, FOLI_Y, FOLI_POSX, FOLI_POSY, FOLI_CADENA, FOLI_FONT, FOLI_FSIZE, FOLI_LIQUIDA) VALUES (122, '0001', 10, 'T', NULL, NULL, 110, 240, 'CAJERO:', 'Roman', 8, 'N');
INSERT INTO FORMATO_LINEAS (TIDO_COD, PREF_PRE, FOLI_ITEM, FOLI_TIPO, FOLI_X, FOLI_Y, FOLI_POSX, FOLI_POSY, FOLI_CADENA, FOLI_FONT, FOLI_FSIZE, FOLI_LIQUIDA) VALUES (122, '0001', 12, 'T', NULL, NULL, 110, 300, 'PREFIJO VENTA:', 'Roman', 8, 'N');
INSERT INTO FORMATO_LINEAS (TIDO_COD, PREF_PRE, FOLI_ITEM, FOLI_TIPO, FOLI_X, FOLI_Y, FOLI_POSX, FOLI_POSY, FOLI_CADENA, FOLI_FONT, FOLI_FSIZE, FOLI_LIQUIDA) VALUES (122, '0001', 15, 'T', NULL, NULL, 110, 270, 'TOTAL FACTURAS ELABORADAS:', 'Roman', 8, 'N');
INSERT INTO FORMATO_LINEAS (TIDO_COD, PREF_PRE, FOLI_ITEM, FOLI_TIPO, FOLI_X, FOLI_Y, FOLI_POSX, FOLI_POSY, FOLI_CADENA, FOLI_FONT, FOLI_FSIZE, FOLI_LIQUIDA) VALUES (122, '0001', 16, 'T', NULL, NULL, 240, 300, 'ITEMS:', 'Roman', 8, 'N');
INSERT INTO FORMATO_LINEAS (TIDO_COD, PREF_PRE, FOLI_ITEM, FOLI_TIPO, FOLI_X, FOLI_Y, FOLI_POSX, FOLI_POSY, FOLI_CADENA, FOLI_FONT, FOLI_FSIZE, FOLI_LIQUIDA) VALUES (122, '0001', 17, 'T', NULL, NULL, 530, 300, 'BASE:', 'Roman', 8, 'N');
INSERT INTO FORMATO_LINEAS (TIDO_COD, PREF_PRE, FOLI_ITEM, FOLI_TIPO, FOLI_X, FOLI_Y, FOLI_POSX, FOLI_POSY, FOLI_CADENA, FOLI_FONT, FOLI_FSIZE, FOLI_LIQUIDA) VALUES (122, '0001', 18, 'T', NULL, NULL, 1200, 300, 'TOTAL:', 'Roman', 8, 'N');
INSERT INTO FORMATO_LINEAS (TIDO_COD, PREF_PRE, FOLI_ITEM, FOLI_TIPO, FOLI_X, FOLI_Y, FOLI_POSX, FOLI_POSY, FOLI_CADENA, FOLI_FONT, FOLI_FSIZE, FOLI_LIQUIDA) VALUES (122, '0001', 19, 'T', NULL, NULL, 900, 300, 'IVA:', 'Roman', 8, 'N');
INSERT INTO FORMATO_LINEAS (TIDO_COD, PREF_PRE, FOLI_ITEM, FOLI_TIPO, FOLI_X, FOLI_Y, FOLI_POSX, FOLI_POSY, FOLI_CADENA, FOLI_FONT, FOLI_FSIZE, FOLI_LIQUIDA) VALUES (122, '0001', 20, 'T', NULL, NULL, 110, 330, 'F:', 'Roman', 8, 'N');
INSERT INTO FORMATO_LINEAS (TIDO_COD, PREF_PRE, FOLI_ITEM, FOLI_TIPO, FOLI_X, FOLI_Y, FOLI_POSX, FOLI_POSY, FOLI_CADENA, FOLI_FONT, FOLI_FSIZE, FOLI_LIQUIDA) VALUES (122, '0001', 21, 'T', NULL, NULL, 110, 360, 'D:', 'Roman', 8, 'N');
INSERT INTO FORMATO_LINEAS (TIDO_COD, PREF_PRE, FOLI_ITEM, FOLI_TIPO, FOLI_X, FOLI_Y, FOLI_POSX, FOLI_POSY, FOLI_CADENA, FOLI_FONT, FOLI_FSIZE, FOLI_LIQUIDA) VALUES (122, '0001', 22, 'T', NULL, NULL, 110, 390, '            ____________________________', 'Roman', 8, 'N');
INSERT INTO FORMATO_LINEAS (TIDO_COD, PREF_PRE, FOLI_ITEM, FOLI_TIPO, FOLI_X, FOLI_Y, FOLI_POSX, FOLI_POSY, FOLI_CADENA, FOLI_FONT, FOLI_FSIZE, FOLI_LIQUIDA) VALUES (122, '0001', 23, 'T', NULL, NULL, 110, 420, 'NETO:', 'Roman', 8, 'N');
INSERT INTO FORMATO_LINEAS (TIDO_COD, PREF_PRE, FOLI_ITEM, FOLI_TIPO, FOLI_X, FOLI_Y, FOLI_POSX, FOLI_POSY, FOLI_CADENA, FOLI_FONT, FOLI_FSIZE, FOLI_LIQUIDA) VALUES (122, '0001', 37, 'T', NULL, NULL, 110, 450, 'DISCRIMINACION POR FORMA DE PAGO', 'Roman', 8, 'N');
INSERT INTO FORMATO_LINEAS (TIDO_COD, PREF_PRE, FOLI_ITEM, FOLI_TIPO, FOLI_X, FOLI_Y, FOLI_POSX, FOLI_POSY, FOLI_CADENA, FOLI_FONT, FOLI_FSIZE, FOLI_LIQUIDA) VALUES (122, '0001', 38, 'T', NULL, NULL, 110, 480, 'EFECTIVO', 'Roman', 8, 'N');
INSERT INTO FORMATO_LINEAS (TIDO_COD, PREF_PRE, FOLI_ITEM, FOLI_TIPO, FOLI_X, FOLI_Y, FOLI_POSX, FOLI_POSY, FOLI_CADENA, FOLI_FONT, FOLI_FSIZE, FOLI_LIQUIDA) VALUES (122, '0001', 39, 'T', NULL, NULL, 110, 510, 'ELECTRON', 'Roman', 8, 'N');
INSERT INTO FORMATO_LINEAS (TIDO_COD, PREF_PRE, FOLI_ITEM, FOLI_TIPO, FOLI_X, FOLI_Y, FOLI_POSX, FOLI_POSY, FOLI_CADENA, FOLI_FONT, FOLI_FSIZE, FOLI_LIQUIDA) VALUES (122, '0001', 40, 'T', NULL, NULL, 110, 540, 'VISA CREDITO', 'Roman', 8, 'N');
INSERT INTO FORMATO_LINEAS (TIDO_COD, PREF_PRE, FOLI_ITEM, FOLI_TIPO, FOLI_X, FOLI_Y, FOLI_POSX, FOLI_POSY, FOLI_CADENA, FOLI_FONT, FOLI_FSIZE, FOLI_LIQUIDA) VALUES (122, '0001', 41, 'T', NULL, NULL, 110, 570, 'MASTERCARD DEBITO', 'Roman', 8, 'N');
INSERT INTO FORMATO_LINEAS (TIDO_COD, PREF_PRE, FOLI_ITEM, FOLI_TIPO, FOLI_X, FOLI_Y, FOLI_POSX, FOLI_POSY, FOLI_CADENA, FOLI_FONT, FOLI_FSIZE, FOLI_LIQUIDA) VALUES (122, '0001', 42, 'T', NULL, NULL, 110, 600, 'MASTERCARD CREDITO', 'Roman', 8, 'N');
INSERT INTO FORMATO_LINEAS (TIDO_COD, PREF_PRE, FOLI_ITEM, FOLI_TIPO, FOLI_X, FOLI_Y, FOLI_POSX, FOLI_POSY, FOLI_CADENA, FOLI_FONT, FOLI_FSIZE, FOLI_LIQUIDA) VALUES (122, '0001', 43, 'T', NULL, NULL, 110, 630, 'AMERICAN EXPRESS', 'Roman', 8, 'N');
INSERT INTO FORMATO_LINEAS (TIDO_COD, PREF_PRE, FOLI_ITEM, FOLI_TIPO, FOLI_X, FOLI_Y, FOLI_POSX, FOLI_POSY, FOLI_CADENA, FOLI_FONT, FOLI_FSIZE, FOLI_LIQUIDA) VALUES (122, '0001', 44, 'T', NULL, NULL, 110, 660, 'DINERS', 'Roman', 8, 'N');
INSERT INTO FORMATO_LINEAS (TIDO_COD, PREF_PRE, FOLI_ITEM, FOLI_TIPO, FOLI_X, FOLI_Y, FOLI_POSX, FOLI_POSY, FOLI_CADENA, FOLI_FONT, FOLI_FSIZE, FOLI_LIQUIDA) VALUES (122, '0001', 45, 'T', NULL, NULL, 110, 690, 'SERVIBANCA', 'Roman', 8, 'N');
INSERT INTO FORMATO_LINEAS (TIDO_COD, PREF_PRE, FOLI_ITEM, FOLI_TIPO, FOLI_X, FOLI_Y, FOLI_POSX, FOLI_POSY, FOLI_CADENA, FOLI_FONT, FOLI_FSIZE, FOLI_LIQUIDA) VALUES (122, '0001', 46, 'T', NULL, NULL, 110, 720, 'BONOS VICTORIA LIBERTA', 'Roman', 8, 'N');
INSERT INTO FORMATO_LINEAS (TIDO_COD, PREF_PRE, FOLI_ITEM, FOLI_TIPO, FOLI_X, FOLI_Y, FOLI_POSX, FOLI_POSY, FOLI_CADENA, FOLI_FONT, FOLI_FSIZE, FOLI_LIQUIDA) VALUES (122, '0001', 47, 'T', NULL, NULL, 110, 750, 'BONOS VICTORIA PLUSS', 'Roman', 8, 'N');
INSERT INTO FORMATO_LINEAS (TIDO_COD, PREF_PRE, FOLI_ITEM, FOLI_TIPO, FOLI_X, FOLI_Y, FOLI_POSX, FOLI_POSY, FOLI_CADENA, FOLI_FONT, FOLI_FSIZE, FOLI_LIQUIDA) VALUES (122, '0001', 48, 'T', NULL, NULL, 110, 780, 'SODEHXO PASS', 'Roman', 8, 'N');
INSERT INTO FORMATO_LINEAS (TIDO_COD, PREF_PRE, FOLI_ITEM, FOLI_TIPO, FOLI_X, FOLI_Y, FOLI_POSX, FOLI_POSY, FOLI_CADENA, FOLI_FONT, FOLI_FSIZE, FOLI_LIQUIDA) VALUES (122, '0001', 50, 'T', NULL, NULL, 110, 810, 'BIG PASS', 'Roman', 8, 'N');
INSERT INTO FORMATO_LINEAS (TIDO_COD, PREF_PRE, FOLI_ITEM, FOLI_TIPO, FOLI_X, FOLI_Y, FOLI_POSX, FOLI_POSY, FOLI_CADENA, FOLI_FONT, FOLI_FSIZE, FOLI_LIQUIDA) VALUES (122, '0001', 51, 'T', NULL, NULL, 110, 840, 'BONOS COMFANORTE', 'Roman', 8, 'N');
INSERT INTO FORMATO_LINEAS (TIDO_COD, PREF_PRE, FOLI_ITEM, FOLI_TIPO, FOLI_X, FOLI_Y, FOLI_POSX, FOLI_POSY, FOLI_CADENA, FOLI_FONT, FOLI_FSIZE, FOLI_LIQUIDA) VALUES (122, '0001', 52, 'T', NULL, NULL, 110, 870, 'TARJETA COMFANORTE', 'Roman', 8, 'N');
INSERT INTO FORMATO_LINEAS (TIDO_COD, PREF_PRE, FOLI_ITEM, FOLI_TIPO, FOLI_X, FOLI_Y, FOLI_POSX, FOLI_POSY, FOLI_CADENA, FOLI_FONT, FOLI_FSIZE, FOLI_LIQUIDA) VALUES (122, '0001', 215, 'T', NULL, NULL, 110, 1000, '---------------------------', 'Roman', 8, 'N');
INSERT INTO FORMATO_LINEAS (TIDO_COD, PREF_PRE, FOLI_ITEM, FOLI_TIPO, FOLI_X, FOLI_Y, FOLI_POSX, FOLI_POSY, FOLI_CADENA, FOLI_FONT, FOLI_FSIZE, FOLI_LIQUIDA) VALUES (122, '0001', 216, 'T', NULL, NULL, 110, 1020, 'TOTAL FACTURAS ELABORADAS:', 'Roman', 8, 'N');
INSERT INTO FORMATO_LINEAS (TIDO_COD, PREF_PRE, FOLI_ITEM, FOLI_TIPO, FOLI_X, FOLI_Y, FOLI_POSX, FOLI_POSY, FOLI_CADENA, FOLI_FONT, FOLI_FSIZE, FOLI_LIQUIDA) VALUES (122, '0001', 217, 'T', NULL, NULL, 110, 1050, 'BASE FACTURAS:', 'Roman', 8, 'N');
INSERT INTO FORMATO_LINEAS (TIDO_COD, PREF_PRE, FOLI_ITEM, FOLI_TIPO, FOLI_X, FOLI_Y, FOLI_POSX, FOLI_POSY, FOLI_CADENA, FOLI_FONT, FOLI_FSIZE, FOLI_LIQUIDA) VALUES (122, '0001', 218, 'T', NULL, NULL, 110, 1080, 'IVA FACTURAS:', 'Roman', 8, 'N');
INSERT INTO FORMATO_LINEAS (TIDO_COD, PREF_PRE, FOLI_ITEM, FOLI_TIPO, FOLI_X, FOLI_Y, FOLI_POSX, FOLI_POSY, FOLI_CADENA, FOLI_FONT, FOLI_FSIZE, FOLI_LIQUIDA) VALUES (122, '0001', 219, 'T', NULL, NULL, 110, 1110, 'TOTAL FACTURAS:', 'Roman', 8, 'N');
INSERT INTO FORMATO_LINEAS (TIDO_COD, PREF_PRE, FOLI_ITEM, FOLI_TIPO, FOLI_X, FOLI_Y, FOLI_POSX, FOLI_POSY, FOLI_CADENA, FOLI_FONT, FOLI_FSIZE, FOLI_LIQUIDA) VALUES (122, '0001', 237, 'T', NULL, NULL, 110, 1230, 'DISCRIMINACION POR FORMA DE PAGO', 'Roman', 8, 'N');
INSERT INTO FORMATO_LINEAS (TIDO_COD, PREF_PRE, FOLI_ITEM, FOLI_TIPO, FOLI_X, FOLI_Y, FOLI_POSX, FOLI_POSY, FOLI_CADENA, FOLI_FONT, FOLI_FSIZE, FOLI_LIQUIDA) VALUES (122, '0001', 238, 'T', NULL, NULL, 110, 1260, 'EFECTIVO', 'Roman', 8, 'N');
INSERT INTO FORMATO_LINEAS (TIDO_COD, PREF_PRE, FOLI_ITEM, FOLI_TIPO, FOLI_X, FOLI_Y, FOLI_POSX, FOLI_POSY, FOLI_CADENA, FOLI_FONT, FOLI_FSIZE, FOLI_LIQUIDA) VALUES (122, '0001', 239, 'T', NULL, NULL, 110, 1290, 'ELECTRON', 'Roman', 8, 'N');
INSERT INTO FORMATO_LINEAS (TIDO_COD, PREF_PRE, FOLI_ITEM, FOLI_TIPO, FOLI_X, FOLI_Y, FOLI_POSX, FOLI_POSY, FOLI_CADENA, FOLI_FONT, FOLI_FSIZE, FOLI_LIQUIDA) VALUES (122, '0001', 240, 'T', NULL, NULL, 110, 1320, 'VISA CREDITO', 'Roman', 8, 'N');
INSERT INTO FORMATO_LINEAS (TIDO_COD, PREF_PRE, FOLI_ITEM, FOLI_TIPO, FOLI_X, FOLI_Y, FOLI_POSX, FOLI_POSY, FOLI_CADENA, FOLI_FONT, FOLI_FSIZE, FOLI_LIQUIDA) VALUES (122, '0001', 241, 'T', NULL, NULL, 110, 1350, 'MASTERCARD DEBITO', 'Roman', 8, 'N');
INSERT INTO FORMATO_LINEAS (TIDO_COD, PREF_PRE, FOLI_ITEM, FOLI_TIPO, FOLI_X, FOLI_Y, FOLI_POSX, FOLI_POSY, FOLI_CADENA, FOLI_FONT, FOLI_FSIZE, FOLI_LIQUIDA) VALUES (122, '0001', 242, 'T', NULL, NULL, 110, 1380, 'MASTERCARD CREDITO', 'Roman', 8, 'N');
INSERT INTO FORMATO_LINEAS (TIDO_COD, PREF_PRE, FOLI_ITEM, FOLI_TIPO, FOLI_X, FOLI_Y, FOLI_POSX, FOLI_POSY, FOLI_CADENA, FOLI_FONT, FOLI_FSIZE, FOLI_LIQUIDA) VALUES (122, '0001', 243, 'T', NULL, NULL, 110, 1410, 'AMERICAN EXPRESS', 'Roman', 8, 'N');
INSERT INTO FORMATO_LINEAS (TIDO_COD, PREF_PRE, FOLI_ITEM, FOLI_TIPO, FOLI_X, FOLI_Y, FOLI_POSX, FOLI_POSY, FOLI_CADENA, FOLI_FONT, FOLI_FSIZE, FOLI_LIQUIDA) VALUES (122, '0001', 244, 'T', NULL, NULL, 110, 1440, 'DINERS', 'Roman', 8, 'N');
INSERT INTO FORMATO_LINEAS (TIDO_COD, PREF_PRE, FOLI_ITEM, FOLI_TIPO, FOLI_X, FOLI_Y, FOLI_POSX, FOLI_POSY, FOLI_CADENA, FOLI_FONT, FOLI_FSIZE, FOLI_LIQUIDA) VALUES (122, '0001', 245, 'T', NULL, NULL, 110, 1470, 'SERVIBANCA', 'Roman', 8, 'N');
INSERT INTO FORMATO_LINEAS (TIDO_COD, PREF_PRE, FOLI_ITEM, FOLI_TIPO, FOLI_X, FOLI_Y, FOLI_POSX, FOLI_POSY, FOLI_CADENA, FOLI_FONT, FOLI_FSIZE, FOLI_LIQUIDA) VALUES (122, '0001', 246, 'T', NULL, NULL, 110, 1500, 'BONOS VICTORIA LIBERTA', 'Roman', 8, 'N');
INSERT INTO FORMATO_LINEAS (TIDO_COD, PREF_PRE, FOLI_ITEM, FOLI_TIPO, FOLI_X, FOLI_Y, FOLI_POSX, FOLI_POSY, FOLI_CADENA, FOLI_FONT, FOLI_FSIZE, FOLI_LIQUIDA) VALUES (122, '0001', 247, 'T', NULL, NULL, 110, 1530, 'BONOS VICTORIA PLUSS', 'Roman', 8, 'N');
INSERT INTO FORMATO_LINEAS (TIDO_COD, PREF_PRE, FOLI_ITEM, FOLI_TIPO, FOLI_X, FOLI_Y, FOLI_POSX, FOLI_POSY, FOLI_CADENA, FOLI_FONT, FOLI_FSIZE, FOLI_LIQUIDA) VALUES (122, '0001', 248, 'T', NULL, NULL, 110, 1560, 'SODEHXO PASS', 'Roman', 8, 'N');
INSERT INTO FORMATO_LINEAS (TIDO_COD, PREF_PRE, FOLI_ITEM, FOLI_TIPO, FOLI_X, FOLI_Y, FOLI_POSX, FOLI_POSY, FOLI_CADENA, FOLI_FONT, FOLI_FSIZE, FOLI_LIQUIDA) VALUES (122, '0001', 250, 'T', NULL, NULL, 110, 1590, 'BIG PASS', 'Roman', 8, 'N');
INSERT INTO FORMATO_LINEAS (TIDO_COD, PREF_PRE, FOLI_ITEM, FOLI_TIPO, FOLI_X, FOLI_Y, FOLI_POSX, FOLI_POSY, FOLI_CADENA, FOLI_FONT, FOLI_FSIZE, FOLI_LIQUIDA) VALUES (122, '0001', 251, 'T', NULL, NULL, 110, 1620, 'BONOS COMFANORTE', 'Roman', 8, 'N');
INSERT INTO FORMATO_LINEAS (TIDO_COD, PREF_PRE, FOLI_ITEM, FOLI_TIPO, FOLI_X, FOLI_Y, FOLI_POSX, FOLI_POSY, FOLI_CADENA, FOLI_FONT, FOLI_FSIZE, FOLI_LIQUIDA) VALUES (122, '0001', 252, 'T', NULL, NULL, 110, 1650, 'TARJETA COMFANORTE', 'Roman', 8, 'N');
INSERT INTO FORMATO_LINEAS (TIDO_COD, PREF_PRE, FOLI_ITEM, FOLI_TIPO, FOLI_X, FOLI_Y, FOLI_POSX, FOLI_POSY, FOLI_CADENA, FOLI_FONT, FOLI_FSIZE, FOLI_LIQUIDA) VALUES (122, '0001', 317, 'T', NULL, NULL, 110, 1140, 'BASE DEVOLUCIONES:', 'Roman', 8, 'N');
INSERT INTO FORMATO_LINEAS (TIDO_COD, PREF_PRE, FOLI_ITEM, FOLI_TIPO, FOLI_X, FOLI_Y, FOLI_POSX, FOLI_POSY, FOLI_CADENA, FOLI_FONT, FOLI_FSIZE, FOLI_LIQUIDA) VALUES (122, '0001', 318, 'T', NULL, NULL, 110, 1170, 'IVA DEVOLUCIONES:', 'Roman', 8, 'N');
INSERT INTO FORMATO_LINEAS (TIDO_COD, PREF_PRE, FOLI_ITEM, FOLI_TIPO, FOLI_X, FOLI_Y, FOLI_POSX, FOLI_POSY, FOLI_CADENA, FOLI_FONT, FOLI_FSIZE, FOLI_LIQUIDA) VALUES (122, '0001', 319, 'T', NULL, NULL, 110, 1200, 'TOTAL DEVOLUCIONES:', 'Roman', 8, 'N');
COMMIT WORK;

/* DESCUENTE TRASLADOS Y CAMBIOS DE DOCUMENTOS DEL CIERRE POR VENDEDOR */
ALTER TABLE traslados_caja
ADD VEND_COD T_ID;

ALTER TABLE CAMBIO_DOCUMENTOS
ADD VEND_COD T_ID;

SET TERM ^ ;

CREATE OR ALTER procedure CIERRE_FACTURACION_VEND (
    FECHA date,
    PUNTO integer,
    PREFIJO varchar(4))
returns (
    PUNTOVTA varchar(60),
    CODVEND integer,
    NOMVEND varchar(60),
    NROFAC integer,
    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),
    TRASLADO 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),
    CARTERA numeric(18,2),
    RETES numeric(18,2),
    NROFACTANUL integer,
    IVANUL numeric(18,2),
    TOTALFACANUL numeric(18,2),
    TNROFAC integer,
    TBASEFAC numeric(18,2),
    TIVAFAC numeric(18,2),
    TTOTALFAC numeric(18,2),
    TNROITE integer,
    TNRODEV integer,
    TBASEDEV numeric(18,2),
    TIVADEV numeric(18,2),
    TTOTALDEV numeric(18,2),
    TBASENETO numeric(18,2),
    TIVANETO numeric(18,2),
    TTOTALNETO numeric(18,2),
    TFORMAP1 numeric(18,2),
    TFORMAP2 numeric(18,2),
    TFORMAP3 numeric(18,2),
    TFORMAP4 numeric(18,2),
    TFORMAP5 numeric(18,2),
    TFORMAP6 numeric(18,2),
    TFORMAP7 numeric(18,2),
    TFORMAP8 numeric(18,2),
    TFORMAP9 numeric(18,2),
    TFORMAP10 numeric(18,2),
    TFORMAP11 numeric(18,2),
    TFORMAP12 numeric(18,2),
    TFORMAP13 numeric(18,2),
    TFORMAP14 numeric(18,2),
    TFORMAP15 numeric(18,2),
    TCARTERA numeric(18,2),
    TRETES numeric(18,2),
    TNROFACTANUL integer,
    TIVANUL numeric(18,2),
    TTOTALFACANUL numeric(18,2))
AS
declare variable AUTORIZA varchar(20);
declare variable basedv numeric(18,2);
declare variable ivad numeric(18,2);
declare variable totald numeric(18,2);
declare variable i integer;
declare variable r_iddoc integer;
declare variable f_id integer;
declare variable f_total numeric(18,2);
declare variable FP INTEGER;
declare variable TFP numeric(18,2);
begin
SELECT AUTO_NUMERO FROM AUTORIZACIONES WHERE PREF_PRE = :PREFIJO INTO :autoriza;
SELECT PTVT_NOM FROM PUNTO_VENTA WHERE PTVT_ID = :punto INTO :puntovta;
TNROFAC = 0;
TBASEFAC = 0;
TIVAFAC = 0;
TTOTALFAC = 0;
TNROITE = 0;
TNRODEV = 0;
TBASEDEV = 0;
TIVADEV = 0;
TTOTALDEV = 0;
TBASENETO = 0;
TIVANETO = 0;
TTOTALNETO = 0;
TFORMAP1 = 0;
TFORMAP2 = 0;
TFORMAP3 = 0;
TFORMAP4 = 0;
TFORMAP5 = 0;
TFORMAP6 = 0;
TFORMAP7 = 0;
TFORMAP8 = 0;
TFORMAP9 = 0;
TFORMAP10 = 0;
TFORMAP11 = 0;
TFORMAP12 = 0;
TFORMAP13 = 0;
TFORMAP14 = 0;
TFORMAP15 = 0;
TCARTERA = 0;
TRETES = 0;
TNROFACTANUL = 0;
TIVANUL = 0;
TTOTALFACANUL = 0;
FOR SELECT VEND_COD, VEND_NOMBRE FROM VENDEDORES V WHERE EXISTS (SELECT FACT_ID FROM FACTURAS WHERE FACT_FECHA = :FECHA AND FACT_ANULADO = 'N' AND VEND_COD = V.vend_cod AND PTVT_ID = :PUNTO)
  INTO :codvend, :nomvend
  DO
  BEGIN
  /* LAS VENTAS */
  SELECT COUNT(FACT_ID), SUM(FACT_TOTAL - FACT_IVAMONTO + FACT_DEC2799), SUM(FACT_IVAMONTO), SUM(FACT_TOTAL)
    FROM FACTURAS WHERE FACT_FECHA = :FECHA AND PTVT_ID = :PUNTO AND VEND_COD = :codvend AND ((PREF_PRE = :PREFIJO) or (:PREFIJO = '')) and FACT_ANULADO = 'N'
    INTO :NROFAC, :BASENETO, :IVANETO, :TOTALNETO;
  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 VEND_COD = :codvend 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;
  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 VEND_COD = :codvend 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 VEND_COD = :codvend AND DEVT_ANULADO = 'N' and substring(d.arti_cod from 1 FOR 2) <> '.t'
    INTO :I, :BASEDV, :IVAD, :TOTALD;
  SELECT COUNT(FACT_NUMERO),SUM(FACT_TOTAL - FACT_IVAMONTO), SUM(FACT_IVAMONTO) FROM FACTURAS
    WHERE FACT_FECHA = :FECHA AND PTVT_ID = :PUNTO AND VEND_COD = :codvend AND ((PREF_PRE = :PREFIJO) or (:PREFIJO = '')) and FACT_ANULADO = 'S'
    INTO :NROFACTANUL, :TOTALFACANUL, :IVANUL;
  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;
  TNROFAC = TNROFAC + NROFAC;
  TBASEFAC = TBASEFAC + BASEFAC;
  TIVAFAC = TIVAFAC + IVAFAC;
  TTOTALFAC = TTOTALFAC + TOTALFAC;
  TNROITE = TNROITE + NROITE;
  TNRODEV = TNRODEV + NRODEV;
  TBASEDEV = TBASEDEV + BASEDEV;
  TIVADEV = TIVADEV + IVADEV;
  TTOTALDEV = TTOTALDEV + TOTALDEV;
  TBASENETO = TBASENETO + BASENETO;
  TIVANETO = TIVANETO + IVANETO;
  TTOTALNETO = TTOTALNETO + TOTALNETO;
  TNROFACTANUL = TNROFACTANUL + NROFACTANUL;
  TIVANUL = TIVANUL + IVANUL;
  TTOTALFACANUL = TTOTALFACANUL + TOTALFACANUL;
  SELECT SUM(D.trcd_monto) FROM traslados_caja T, traslados_caja_det D, punto_venta PT
    WHERE T.trcj_id = D.trcj_id AND T.trcj_fecha = :fecha AND PT.caja_id = T.caja_id AND PT.ptvt_id = :punto AND T.trcj_anulado = 'N' AND T.vend_cod = :codvend
    INTO :traslado;
  if (TRASLADO IS NULL) then
    TRASLADO = 0;

  /* POR FORMA DE PAGO */
  SELECT SUM(RCPA_MONTO) FROM RECIBOS_CAJA_PAGO P, RECIBOS_CAJA R, PUNTO_VENTA PT, AUTORIZACIONES A
    WHERE R.RECA_ID = P.RECA_ID AND PT.PTVT_ID = :punto AND COBR_COD = :codvend AND RECA_FECHA = :FECHA AND PT.caja_id = R.caja_id AND A.pref_pre = :PREFIJO
    AND A.auto_numero = :autoriza AND ((A.auto_prefrdc = R.PREF_PRE) or (:PREFIJO = '')) AND FOPA_ID = 1 and RECA_ANULADO = 'N'
    INTO :FORMAP1;
  SELECT SUM(RCPA_MONTO) FROM RECIBOS_CAJA_PAGO P, RECIBOS_CAJA R, PUNTO_VENTA PT, AUTORIZACIONES A
    WHERE R.RECA_ID = P.RECA_ID AND PT.PTVT_ID = :punto AND COBR_COD = :codvend AND RECA_FECHA = :FECHA AND PT.caja_id = R.caja_id AND A.pref_pre = :PREFIJO
    AND A.auto_numero = :autoriza AND ((A.auto_prefrdc = R.PREF_PRE) or (:PREFIJO = '')) AND FOPA_ID = 2 and RECA_ANULADO = 'N'
    INTO :FORMAP2;
  SELECT SUM(RCPA_MONTO) FROM RECIBOS_CAJA_PAGO P, RECIBOS_CAJA R, PUNTO_VENTA PT, AUTORIZACIONES A
    WHERE R.RECA_ID = P.RECA_ID AND PT.PTVT_ID = :punto AND COBR_COD = :codvend AND RECA_FECHA = :FECHA AND PT.caja_id = R.caja_id AND A.pref_pre = :PREFIJO
    AND A.auto_numero = :autoriza AND ((A.auto_prefrdc = R.PREF_PRE) or (:PREFIJO = '')) AND FOPA_ID = 3 and RECA_ANULADO = 'N'
    INTO :FORMAP3;
  SELECT SUM(RCPA_MONTO) FROM RECIBOS_CAJA_PAGO P, RECIBOS_CAJA R, PUNTO_VENTA PT, AUTORIZACIONES A
    WHERE R.RECA_ID = P.RECA_ID AND PT.PTVT_ID = :punto AND COBR_COD = :codvend AND RECA_FECHA = :FECHA AND PT.caja_id = R.caja_id AND A.pref_pre = :PREFIJO
    AND A.auto_numero = :autoriza AND ((A.auto_prefrdc = R.PREF_PRE) or (:PREFIJO = '')) AND FOPA_ID = 4 and RECA_ANULADO = 'N'
    INTO :FORMAP4;
  SELECT SUM(RCPA_MONTO) FROM RECIBOS_CAJA_PAGO P, RECIBOS_CAJA R, PUNTO_VENTA PT, AUTORIZACIONES A
    WHERE R.RECA_ID = P.RECA_ID AND PT.PTVT_ID = :punto AND COBR_COD = :codvend AND RECA_FECHA = :FECHA AND PT.caja_id = R.caja_id AND A.pref_pre = :PREFIJO
    AND A.auto_numero = :autoriza AND ((A.auto_prefrdc = R.PREF_PRE) or (:PREFIJO = '')) AND FOPA_ID = 5 and RECA_ANULADO = 'N'
    INTO :FORMAP5;
  SELECT SUM(RCPA_MONTO) FROM RECIBOS_CAJA_PAGO P, RECIBOS_CAJA R, PUNTO_VENTA PT, AUTORIZACIONES A
    WHERE R.RECA_ID = P.RECA_ID AND PT.PTVT_ID = :punto AND COBR_COD = :codvend AND RECA_FECHA = :FECHA AND PT.caja_id = R.caja_id AND A.pref_pre = :PREFIJO
    AND A.auto_numero = :autoriza AND ((A.auto_prefrdc = R.PREF_PRE) or (:PREFIJO = '')) AND FOPA_ID = 6 and RECA_ANULADO = 'N'
    INTO :FORMAP6;
  SELECT SUM(RCPA_MONTO) FROM RECIBOS_CAJA_PAGO P, RECIBOS_CAJA R, PUNTO_VENTA PT, AUTORIZACIONES A
    WHERE R.RECA_ID = P.RECA_ID AND PT.PTVT_ID = :punto AND COBR_COD = :codvend AND RECA_FECHA = :FECHA AND PT.caja_id = R.caja_id AND A.pref_pre = :PREFIJO
    AND A.auto_numero = :autoriza AND ((A.auto_prefrdc = R.PREF_PRE) or (:PREFIJO = '')) AND FOPA_ID = 7 and RECA_ANULADO = 'N'
    INTO :FORMAP7;
  SELECT SUM(RCPA_MONTO) FROM RECIBOS_CAJA_PAGO P, RECIBOS_CAJA R, PUNTO_VENTA PT, AUTORIZACIONES A
    WHERE R.RECA_ID = P.RECA_ID AND PT.PTVT_ID = :punto AND COBR_COD = :codvend AND RECA_FECHA = :FECHA AND PT.caja_id = R.caja_id AND A.pref_pre = :PREFIJO
    AND A.auto_numero = :autoriza AND ((A.auto_prefrdc = R.PREF_PRE) or (:PREFIJO = '')) AND FOPA_ID = 8 and RECA_ANULADO = 'N'
    INTO :FORMAP8;
  SELECT SUM(RCPA_MONTO) FROM RECIBOS_CAJA_PAGO P, RECIBOS_CAJA R, PUNTO_VENTA PT, AUTORIZACIONES A
    WHERE R.RECA_ID = P.RECA_ID AND PT.PTVT_ID = :punto AND COBR_COD = :codvend AND RECA_FECHA = :FECHA AND PT.caja_id = R.caja_id AND A.pref_pre = :PREFIJO
    AND A.auto_numero = :autoriza AND ((A.auto_prefrdc = R.PREF_PRE) or (:PREFIJO = '')) AND FOPA_ID = 9 and RECA_ANULADO = 'N'
    INTO :FORMAP9;
  SELECT SUM(RCPA_MONTO) FROM RECIBOS_CAJA_PAGO P, RECIBOS_CAJA R, PUNTO_VENTA PT, AUTORIZACIONES A
    WHERE R.RECA_ID = P.RECA_ID AND PT.PTVT_ID = :punto AND COBR_COD = :codvend AND RECA_FECHA = :FECHA AND PT.caja_id = R.caja_id AND A.pref_pre = :PREFIJO
    AND A.auto_numero = :autoriza AND ((A.auto_prefrdc = R.PREF_PRE) or (:PREFIJO = '')) AND FOPA_ID = 10 and RECA_ANULADO = 'N'
    INTO :FORMAP10;
  SELECT SUM(RCPA_MONTO) FROM RECIBOS_CAJA_PAGO P, RECIBOS_CAJA R, PUNTO_VENTA PT, AUTORIZACIONES A
    WHERE R.RECA_ID = P.RECA_ID AND PT.PTVT_ID = :punto AND COBR_COD = :codvend AND RECA_FECHA = :FECHA AND PT.caja_id = R.caja_id AND A.pref_pre = :PREFIJO
    AND A.auto_numero = :autoriza AND ((A.auto_prefrdc = R.PREF_PRE) or (:PREFIJO = '')) AND FOPA_ID = 11 and RECA_ANULADO = 'N'
    INTO :FORMAP11;
  SELECT SUM(RCPA_MONTO) FROM RECIBOS_CAJA_PAGO P, RECIBOS_CAJA R, PUNTO_VENTA PT, AUTORIZACIONES A
    WHERE R.RECA_ID = P.RECA_ID AND PT.PTVT_ID = :punto AND COBR_COD = :codvend AND RECA_FECHA = :FECHA AND PT.caja_id = R.caja_id AND A.pref_pre = :PREFIJO
    AND A.auto_numero = :autoriza AND ((A.auto_prefrdc = R.PREF_PRE) or (:PREFIJO = '')) AND FOPA_ID = 12 and RECA_ANULADO = 'N'
    INTO :FORMAP12;
  SELECT SUM(RCPA_MONTO) FROM RECIBOS_CAJA_PAGO P, RECIBOS_CAJA R, PUNTO_VENTA PT, AUTORIZACIONES A
    WHERE R.RECA_ID = P.RECA_ID AND PT.PTVT_ID = :punto AND COBR_COD = :codvend AND RECA_FECHA = :FECHA AND PT.caja_id = R.caja_id AND A.pref_pre = :PREFIJO
    AND A.auto_numero = :autoriza AND ((A.auto_prefrdc = R.PREF_PRE) or (:PREFIJO = '')) AND FOPA_ID = 13 and RECA_ANULADO = 'N'
    INTO :FORMAP13;
  SELECT SUM(RCPA_MONTO) FROM RECIBOS_CAJA_PAGO P, RECIBOS_CAJA R, PUNTO_VENTA PT, AUTORIZACIONES A
    WHERE R.RECA_ID = P.RECA_ID AND PT.PTVT_ID = :punto AND COBR_COD = :codvend AND RECA_FECHA = :FECHA AND PT.caja_id = R.caja_id AND A.pref_pre = :PREFIJO
    AND A.auto_numero = :autoriza AND ((A.auto_prefrdc = R.PREF_PRE) or (:PREFIJO = '')) AND FOPA_ID = 14 and RECA_ANULADO = 'N'
    INTO :FORMAP14;
  SELECT SUM(RCPA_MONTO) FROM RECIBOS_CAJA_PAGO P, RECIBOS_CAJA R, PUNTO_VENTA PT, AUTORIZACIONES A
    WHERE R.RECA_ID = P.RECA_ID AND PT.PTVT_ID = :punto AND COBR_COD = :codvend AND RECA_FECHA = :FECHA AND PT.caja_id = R.caja_id AND A.pref_pre = :PREFIJO
    AND A.auto_numero = :autoriza AND ((A.auto_prefrdc = R.PREF_PRE) or (:PREFIJO = '')) AND FOPA_ID = 15 and RECA_ANULADO = 'N'
    INTO :FORMAP15;
  /* RESTE LOS TRASLADOS DE CAJA */
  FOR SELECT MAX(D.fopa_id), SUM(D.trcd_monto) FROM traslados_caja T, traslados_caja_det D, punto_venta PT
    WHERE T.trcj_id = D.trcj_id AND T.trcj_fecha = :fecha AND PT.caja_id = T.caja_id AND PT.ptvt_id = :punto AND T.trcj_anulado = 'N' AND T.vend_cod = :codvend AND D.fopa_id = 1
    GROUP BY D.fopa_id INTO :FP, :TFP
    DO
    BEGIN
    if (tfp IS NULL) then
      tfp = 0;
    if (FP = 1) then
      formap1 = FORMAP1 - TFP;
    if (FP = 2) then
      formap2 = FORMAP2 - TFP;
    if (FP = 3) then
      formap3 = FORMAP3 - TFP;
    if (FP = 4) then
      formap4 = FORMAP4 - TFP;
    if (FP = 5) then
      formap5 = FORMAP5 - TFP;
    if (FP = 6) then
      formap6 = FORMAP6 - TFP;
    if (FP = 7) then
      formap7 = FORMAP7 - TFP;
    if (FP = 8) then
      formap8 = FORMAP8 - TFP;
    if (FP = 9) then
      formap9 = FORMAP9 - TFP;
    if (FP = 10) then
      formap10 = FORMAP10 - TFP;
    if (FP = 11) then
      formap11 = FORMAP11 - TFP;
    if (FP = 12) then
      formap12 = FORMAP12 - TFP;
    if (FP = 13) then
      formap13 = FORMAP13 - TFP;
    if (FP = 14) then
      formap14 = FORMAP14 - TFP;
    if (FP = 15) then
      formap15 = FORMAP15 - TFP;
    END
  /* AJUSTE LOS CAMBIOS DE DOCUMENTOS */
  FOR SELECT MAX(E.fopa_id), SUM(E.cden_monto) FROM cambio_documentos C, cambiodoc_entradas E, punto_venta PT
    WHERE C.cado_id = E.cado_id AND C.cado_fecha = :fecha AND PT.caja_id = C.caja_id AND PT.ptvt_id = :punto AND C.cado_anulado = 'N' AND C.vend_cod = :codvend
    GROUP BY E.fopa_id INTO :FP, tfp
    DO
    BEGIN
    if (tfp IS NULL) then
      tfp = 0;
    if (FP = 1) then
      formap1 = FORMAP1 - TFP;
    if (FP = 2) then
      formap2 = FORMAP2 - TFP;
    if (FP = 3) then
      formap3 = FORMAP3 - TFP;
    if (FP = 4) then
      formap4 = FORMAP4 - TFP;
    if (FP = 5) then
      formap5 = FORMAP5 - TFP;
    if (FP = 6) then
      formap6 = FORMAP6 - TFP;
    if (FP = 7) then
      formap7 = FORMAP7 - TFP;
    if (FP = 8) then
      formap8 = FORMAP8 - TFP;
    if (FP = 9) then
      formap9 = FORMAP9 - TFP;
    if (FP = 10) then
      formap10 = FORMAP10 - TFP;
    if (FP = 11) then
      formap11 = FORMAP11 - TFP;
    if (FP = 12) then
      formap12 = FORMAP12 - TFP;
    if (FP = 13) then
      formap13 = FORMAP13 - TFP;
    if (FP = 14) then
      formap14 = FORMAP14 - TFP;
    if (FP = 15) then
      formap15 = FORMAP15 - TFP;
    end
  FOR SELECT MAX(S.fopa_id), SUM(S.cdsa_monto) FROM cambio_documentos C, cambiodoc_salidas S, punto_venta PT
    WHERE C.cado_id = s.cado_id AND C.cado_fecha = :fecha AND PT.caja_id = C.caja_id AND PT.ptvt_id = :punto AND C.cado_anulado = 'N' AND C.vend_cod = :codvend
    GROUP BY s.fopa_id INTO :FP, tfp
    DO
    BEGIN
    if (tfp IS NULL) then
      tfp = 0;
    if (FP = 1) then
      formap1 = FORMAP1 + TFP;
    if (FP = 2) then
      formap2 = FORMAP2 + TFP;
    if (FP = 3) then
      formap3 = FORMAP3 + TFP;
    if (FP = 4) then
      formap4 = FORMAP4 + TFP;
    if (FP = 5) then
      formap5 = FORMAP5 + TFP;
    if (FP = 6) then
      formap6 = FORMAP6 + TFP;
    if (FP = 7) then
      formap7 = FORMAP7 + TFP;
    if (FP = 8) then
      formap8 = FORMAP8 + TFP;
    if (FP = 9) then
      formap9 = FORMAP9 + TFP;
    if (FP = 10) then
      formap10 = FORMAP10 + TFP;
    if (FP = 11) then
      formap11 = FORMAP11 + TFP;
    if (FP = 12) then
      formap12 = FORMAP12 + TFP;
    if (FP = 13) then
      formap13 = FORMAP13 + TFP;
    if (FP = 14) then
      formap14 = FORMAP14 + TFP;
    if (FP = 15) then
      formap15 = FORMAP15 + TFP;
    end
  cartera = 0;
  for SELECT FACT_ID,FACT_TOTAL FROM FACTURAS WHERE FACT_FECHA = :FECHA AND PTVT_ID = :PUNTO AND VEND_COD = :codvend AND ((PREF_PRE = :PREFIJO) or (:PREFIJO = '')) and FACT_ANULADO = 'N' into :f_id,:F_TOTAL
    do
    begin
     Select COUNT(D.RECA_ID) FROM recibos_caja_detalle D, RECIBOS_CAJA R where R.RECA_ID = D.RECA_ID AND R.RECA_FECHA = :FECHA AND RECA_ANULADO = 'N' and D.RCDE_tipodoc = 31 and D.RCDE_IDDOC = :f_id into :r_iddoc;
     if (r_iddoc = 0) then
       CARTERA = :cartera + :F_TOTAL;
    end
  for SELECT DEVT_ID,DEVT_TOTAL FROM devoluciones_ventas WHERE DEVT_FECHA = :FECHA AND PTVT_ID = :PUNTO and VEND_COD = :codvend AND DEVT_ANULADO = 'N' into :f_id,:F_TOTAL
    do
    begin
     Select COUNT(D.RECA_ID) FROM recibos_caja_detalle D, RECIBOS_CAJA R where R.RECA_ID = D.RECA_ID AND R.RECA_FECHA = :FECHA AND RECA_ANULADO = 'N' and D.RCDE_tipodoc = 33 and D.RCDE_IDDOC = :f_id into :r_iddoc;
     if (r_iddoc = 0) then
       CARTERA = :cartera - :F_TOTAL;
    end
  /* SUME LAS RETENCIONES COMO CARTERA */
  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 COBR_COD = :codvend 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 (formap1 is null) then
    formap1 = 0;
  if (formap2 is null) then
    formap2 = 0;
  if (formap3 is null) then
    formap3 = 0;
  if (formap4 is null) then
    formap4 = 0;
  if (formap5 is null) then
    formap5 = 0;
  if (formap6 is null) then
    formap6 = 0;
  if (formap7 is null) then
    formap7 = 0;
  if (formap8 is null) then
    formap8 = 0;
  if (formap9 is null) then
    formap9 = 0;
  if (formap10 is null) then
    formap10 = 0;
  if (formap11 is null) then
    formap11 = 0;
  if (formap12 is null) then
    formap12 = 0;
  if (formap13 is null) then
    formap13 = 0;
  if (formap14 is null) then
    formap14 = 0;
  if (formap15 is null) then
    formap15 = 0;
  if (cartera is null) then
    cartera = 0;
  TFORMAP1 = TFORMAP1 + FORMAP1;
  TFORMAP2 = TFORMAP2 + FORMAP2;
  TFORMAP3 = TFORMAP3 + FORMAP3;
  TFORMAP4 = TFORMAP4 + FORMAP4;
  TFORMAP5 = TFORMAP5 + FORMAP5;
  TFORMAP6 = TFORMAP6 + FORMAP6;
  TFORMAP7 = TFORMAP7 + FORMAP7;
  TFORMAP8 = TFORMAP8 + FORMAP8;
  TFORMAP9 = TFORMAP9 + FORMAP9;
  TFORMAP10 = TFORMAP10 + FORMAP10;
  TFORMAP11 = TFORMAP11 + FORMAP11;
  TFORMAP12 = TFORMAP12 + FORMAP12;
  TFORMAP13 = TFORMAP13 + FORMAP13;
  TFORMAP14 = TFORMAP14 + FORMAP14;
  TFORMAP15 = TFORMAP15 + FORMAP15;
  TCARTERA = TCARTERA + CARTERA;
  TRETES = TRETES + RETES;
  INSERT INTO AUDITORIA(AUDI_USUARIO, TIDO_COD, AUDI_IDDOC, AUDI_OPER, AUDI_COD)
    VALUES (USER, 122, :punto, 'I', (:formap1+:formap2+:formap3+:formap4+:formap5+:CARTERA));
  suspend;
  END
end^

SET TERM ; ^

INSERT INTO FORMATOS (TIDO_COD, PREF_PRE, FORM_IMPRE, FORM_NROITEMS, FORM_PAGINAS, FORM_ENTRELINEA, FORM_FONT, FORM_FSIZE, FORM_PAPELAN, FORM_PAPELAL) VALUES (123, '0001', '1', 600, 'S', 20, 'Roman', 6, 6, 11);

INSERT INTO FORMATO_DATOS (TIDO_COD, PREF_PRE, DAFO_DATO, DAFO_IMPRIME, DAFO_POSX, DAFO_POSY, DAFO_FORMATO, DAFO_LONG, DAFO_REPITE, DAFO_FONT, DAFO_FSIZE, DAFO_LIQUIDA, DAFO_POSYVAR, DAFO_ITEM, DAFO_INI, DAFO_CORTARPALABRAS, DAFO_JUSTIFICA) VALUES (123, '0001', 'TOTAL FORMA PAGO 6', 'S', 1200, 120, '0', 10, 'N', 'Arial', 8, 'N', 'N', 3155, 1, 'S', 'I');
INSERT INTO FORMATO_DATOS (TIDO_COD, PREF_PRE, DAFO_DATO, DAFO_IMPRIME, DAFO_POSX, DAFO_POSY, DAFO_FORMATO, DAFO_LONG, DAFO_REPITE, DAFO_FONT, DAFO_FSIZE, DAFO_LIQUIDA, DAFO_POSYVAR, DAFO_ITEM, DAFO_INI, DAFO_CORTARPALABRAS, DAFO_JUSTIFICA) VALUES (123, '0001', 'TOTAL FORMA PAGO 8', 'S', 1230, 129, '0', 10, 'N', 'Arial', 8, 'N', 'N', 3157, 1, 'S', 'I');
INSERT INTO FORMATO_DATOS (TIDO_COD, PREF_PRE, DAFO_DATO, DAFO_IMPRIME, DAFO_POSX, DAFO_POSY, DAFO_FORMATO, DAFO_LONG, DAFO_REPITE, DAFO_FONT, DAFO_FSIZE, DAFO_LIQUIDA, DAFO_POSYVAR, DAFO_ITEM, DAFO_INI, DAFO_CORTARPALABRAS, DAFO_JUSTIFICA) VALUES (123, '0001', 'TOTAL FORMA PAGO 9', 'S', 1230, 132, '0', 10, 'N', 'Arial', 8, 'N', 'N', 3158, 1, 'S', 'I');
INSERT INTO FORMATO_DATOS (TIDO_COD, PREF_PRE, DAFO_DATO, DAFO_IMPRIME, DAFO_POSX, DAFO_POSY, DAFO_FORMATO, DAFO_LONG, DAFO_REPITE, DAFO_FONT, DAFO_FSIZE, DAFO_LIQUIDA, DAFO_POSYVAR, DAFO_ITEM, DAFO_INI, DAFO_CORTARPALABRAS, DAFO_JUSTIFICA) VALUES (123, '0001', 'TOTAL FORMA PAGO 10', 'S', 1230, 135, '0', 10, 'N', 'Arial', 8, 'N', 'N', 3159, 1, 'S', 'I');
INSERT INTO FORMATO_DATOS (TIDO_COD, PREF_PRE, DAFO_DATO, DAFO_IMPRIME, DAFO_POSX, DAFO_POSY, DAFO_FORMATO, DAFO_LONG, DAFO_REPITE, DAFO_FONT, DAFO_FSIZE, DAFO_LIQUIDA, DAFO_POSYVAR, DAFO_ITEM, DAFO_INI, DAFO_CORTARPALABRAS, DAFO_JUSTIFICA) VALUES (123, '0001', 'TOTAL FORMA PAGO 11', 'S', 1230, 138, '0', 10, 'N', 'Arial', 8, 'N', 'N', 3160, 1, 'S', 'I');
INSERT INTO FORMATO_DATOS (TIDO_COD, PREF_PRE, DAFO_DATO, DAFO_IMPRIME, DAFO_POSX, DAFO_POSY, DAFO_FORMATO, DAFO_LONG, DAFO_REPITE, DAFO_FONT, DAFO_FSIZE, DAFO_LIQUIDA, DAFO_POSYVAR, DAFO_ITEM, DAFO_INI, DAFO_CORTARPALABRAS, DAFO_JUSTIFICA) VALUES (123, '0001', 'TOTAL FORMA PAGO 12', 'S', 1230, 141, '0', 10, 'N', 'Arial', 8, 'N', 'N', 3161, 1, 'S', 'I');
INSERT INTO FORMATO_DATOS (TIDO_COD, PREF_PRE, DAFO_DATO, DAFO_IMPRIME, DAFO_POSX, DAFO_POSY, DAFO_FORMATO, DAFO_LONG, DAFO_REPITE, DAFO_FONT, DAFO_FSIZE, DAFO_LIQUIDA, DAFO_POSYVAR, DAFO_ITEM, DAFO_INI, DAFO_CORTARPALABRAS, DAFO_JUSTIFICA) VALUES (123, '0001', 'TOTAL FORMA PAGO 13', 'S', 1230, 144, '0', 10, 'N', 'Arial', 8, 'N', 'N', 3162, 1, 'S', 'I');
INSERT INTO FORMATO_DATOS (TIDO_COD, PREF_PRE, DAFO_DATO, DAFO_IMPRIME, DAFO_POSX, DAFO_POSY, DAFO_FORMATO, DAFO_LONG, DAFO_REPITE, DAFO_FONT, DAFO_FSIZE, DAFO_LIQUIDA, DAFO_POSYVAR, DAFO_ITEM, DAFO_INI, DAFO_CORTARPALABRAS, DAFO_JUSTIFICA) VALUES (123, '0001', 'TOTAL FORMA PAGO 14', 'S', 1230, 147, '0', 10, 'N', 'Arial', 8, 'N', 'N', 3163, 1, 'S', 'I');
INSERT INTO FORMATO_DATOS (TIDO_COD, PREF_PRE, DAFO_DATO, DAFO_IMPRIME, DAFO_POSX, DAFO_POSY, DAFO_FORMATO, DAFO_LONG, DAFO_REPITE, DAFO_FONT, DAFO_FSIZE, DAFO_LIQUIDA, DAFO_POSYVAR, DAFO_ITEM, DAFO_INI, DAFO_CORTARPALABRAS, DAFO_JUSTIFICA) VALUES (123, '0001', 'TOTAL FORMA PAGO 15', 'S', 1230, 150, '0', 10, 'N', 'Arial', 8, 'N', 'N', 3164, 1, 'S', 'I');
INSERT INTO FORMATO_DATOS (TIDO_COD, PREF_PRE, DAFO_DATO, DAFO_IMPRIME, DAFO_POSX, DAFO_POSY, DAFO_FORMATO, DAFO_LONG, DAFO_REPITE, DAFO_FONT, DAFO_FSIZE, DAFO_LIQUIDA, DAFO_POSYVAR, DAFO_ITEM, DAFO_INI, DAFO_CORTARPALABRAS, DAFO_JUSTIFICA) VALUES (123, '0001', 'TOTAL FORMA PAGO 16', 'N', 1230, 153, '0', 10, 'N', 'Roman', 8, 'N', 'N', 3165, 1, 'S', 'I');
INSERT INTO FORMATO_DATOS (TIDO_COD, PREF_PRE, DAFO_DATO, DAFO_IMPRIME, DAFO_POSX, DAFO_POSY, DAFO_FORMATO, DAFO_LONG, DAFO_REPITE, DAFO_FONT, DAFO_FSIZE, DAFO_LIQUIDA, DAFO_POSYVAR, DAFO_ITEM, DAFO_INI, DAFO_CORTARPALABRAS, DAFO_JUSTIFICA) VALUES (123, '0001', 'PREFIJO', 'S', 700, 30, NULL, 10, 'N', 'Arial', 8, 'N', 'N', 2991, 1, 'S', 'I');
INSERT INTO FORMATO_DATOS (TIDO_COD, PREF_PRE, DAFO_DATO, DAFO_IMPRIME, DAFO_POSX, DAFO_POSY, DAFO_FORMATO, DAFO_LONG, DAFO_REPITE, DAFO_FONT, DAFO_FSIZE, DAFO_LIQUIDA, DAFO_POSYVAR, DAFO_ITEM, DAFO_INI, DAFO_CORTARPALABRAS, DAFO_JUSTIFICA) VALUES (123, '0001', 'AUTORIZACION', 'N', NULL, NULL, NULL, 10, 'N', '16 cpi', 8, 'N', 'N', 2992, 1, 'S', 'I');
INSERT INTO FORMATO_DATOS (TIDO_COD, PREF_PRE, DAFO_DATO, DAFO_IMPRIME, DAFO_POSX, DAFO_POSY, DAFO_FORMATO, DAFO_LONG, DAFO_REPITE, DAFO_FONT, DAFO_FSIZE, DAFO_LIQUIDA, DAFO_POSYVAR, DAFO_ITEM, DAFO_INI, DAFO_CORTARPALABRAS, DAFO_JUSTIFICA) VALUES (123, '0001', 'FECHA', 'S', 700, 18, NULL, 12, 'N', 'Arial', 8, 'N', 'N', 2993, 1, 'S', 'I');
INSERT INTO FORMATO_DATOS (TIDO_COD, PREF_PRE, DAFO_DATO, DAFO_IMPRIME, DAFO_POSX, DAFO_POSY, DAFO_FORMATO, DAFO_LONG, DAFO_REPITE, DAFO_FONT, DAFO_FSIZE, DAFO_LIQUIDA, DAFO_POSYVAR, DAFO_ITEM, DAFO_INI, DAFO_CORTARPALABRAS, DAFO_JUSTIFICA) VALUES (123, '0001', 'NUMERO INICIAL', 'S', 700, 33, NULL, 6, 'N', 'Arial', 8, 'N', 'N', 2994, 1, 'S', 'I');
INSERT INTO FORMATO_DATOS (TIDO_COD, PREF_PRE, DAFO_DATO, DAFO_IMPRIME, DAFO_POSX, DAFO_POSY, DAFO_FORMATO, DAFO_LONG, DAFO_REPITE, DAFO_FONT, DAFO_FSIZE, DAFO_LIQUIDA, DAFO_POSYVAR, DAFO_ITEM, DAFO_INI, DAFO_CORTARPALABRAS, DAFO_JUSTIFICA) VALUES (123, '0001', 'NUMERO FINAL', 'S', 700, 36, NULL, 6, 'N', 'Arial', 8, 'N', 'N', 2995, 1, 'S', 'I');
INSERT INTO FORMATO_DATOS (TIDO_COD, PREF_PRE, DAFO_DATO, DAFO_IMPRIME, DAFO_POSX, DAFO_POSY, DAFO_FORMATO, DAFO_LONG, DAFO_REPITE, DAFO_FONT, DAFO_FSIZE, DAFO_LIQUIDA, DAFO_POSYVAR, DAFO_ITEM, DAFO_INI, DAFO_CORTARPALABRAS, DAFO_JUSTIFICA) VALUES (123, '0001', 'NUMERO FACTURAS', 'S', 1150, 39, NULL, 10, 'N', 'Arial', 8, 'N', 'N', 2996, 1, 'S', 'I');
INSERT INTO FORMATO_DATOS (TIDO_COD, PREF_PRE, DAFO_DATO, DAFO_IMPRIME, DAFO_POSX, DAFO_POSY, DAFO_FORMATO, DAFO_LONG, DAFO_REPITE, DAFO_FONT, DAFO_FSIZE, DAFO_LIQUIDA, DAFO_POSYVAR, DAFO_ITEM, DAFO_INI, DAFO_CORTARPALABRAS, DAFO_JUSTIFICA) VALUES (123, '0001', 'ITEMS FACTURADOS', 'S', 240, 48, NULL, 10, 'N', 'Arial', 8, 'N', 'N', 2997, 1, 'S', 'I');
INSERT INTO FORMATO_DATOS (TIDO_COD, PREF_PRE, DAFO_DATO, DAFO_IMPRIME, DAFO_POSX, DAFO_POSY, DAFO_FORMATO, DAFO_LONG, DAFO_REPITE, DAFO_FONT, DAFO_FSIZE, DAFO_LIQUIDA, DAFO_POSYVAR, DAFO_ITEM, DAFO_INI, DAFO_CORTARPALABRAS, DAFO_JUSTIFICA) VALUES (123, '0001', 'ITEMS DEVUELTOS', 'S', 240, 51, NULL, 10, 'N', 'Arial', 8, 'N', 'N', 2998, 1, 'S', 'I');
INSERT INTO FORMATO_DATOS (TIDO_COD, PREF_PRE, DAFO_DATO, DAFO_IMPRIME, DAFO_POSX, DAFO_POSY, DAFO_FORMATO, DAFO_LONG, DAFO_REPITE, DAFO_FONT, DAFO_FSIZE, DAFO_LIQUIDA, DAFO_POSYVAR, DAFO_ITEM, DAFO_INI, DAFO_CORTARPALABRAS, DAFO_JUSTIFICA) VALUES (123, '0001', 'BASE FACTURAS', 'S', 750, 48, '0', 10, 'N', 'Arial', 8, 'N', 'N', 2999, 1, 'S', 'I');
INSERT INTO FORMATO_DATOS (TIDO_COD, PREF_PRE, DAFO_DATO, DAFO_IMPRIME, DAFO_POSX, DAFO_POSY, DAFO_FORMATO, DAFO_LONG, DAFO_REPITE, DAFO_FONT, DAFO_FSIZE, DAFO_LIQUIDA, DAFO_POSYVAR, DAFO_ITEM, DAFO_INI, DAFO_CORTARPALABRAS, DAFO_JUSTIFICA) VALUES (123, '0001', 'IVA FACTURAS', 'S', 1000, 48, '0', 10, 'N', 'Arial', 8, 'N', 'N', 3000, 1, 'S', 'I');
INSERT INTO FORMATO_DATOS (TIDO_COD, PREF_PRE, DAFO_DATO, DAFO_IMPRIME, DAFO_POSX, DAFO_POSY, DAFO_FORMATO, DAFO_LONG, DAFO_REPITE, DAFO_FONT, DAFO_FSIZE, DAFO_LIQUIDA, DAFO_POSYVAR, DAFO_ITEM, DAFO_INI, DAFO_CORTARPALABRAS, DAFO_JUSTIFICA) VALUES (123, '0001', 'TOTAL FACTURAS', 'S', 1350, 48, '0', 10, 'N', 'Arial', 8, 'N', 'N', 3001, 1, 'S', 'I');
INSERT INTO FORMATO_DATOS (TIDO_COD, PREF_PRE, DAFO_DATO, DAFO_IMPRIME, DAFO_POSX, DAFO_POSY, DAFO_FORMATO, DAFO_LONG, DAFO_REPITE, DAFO_FONT, DAFO_FSIZE, DAFO_LIQUIDA, DAFO_POSYVAR, DAFO_ITEM, DAFO_INI, DAFO_CORTARPALABRAS, DAFO_JUSTIFICA) VALUES (123, '0001', 'BASE DEVOLUCIONES', 'S', 750, 51, '0', 10, 'N', 'Arial', 8, 'N', 'N', 3002, 1, 'S', 'I');
INSERT INTO FORMATO_DATOS (TIDO_COD, PREF_PRE, DAFO_DATO, DAFO_IMPRIME, DAFO_POSX, DAFO_POSY, DAFO_FORMATO, DAFO_LONG, DAFO_REPITE, DAFO_FONT, DAFO_FSIZE, DAFO_LIQUIDA, DAFO_POSYVAR, DAFO_ITEM, DAFO_INI, DAFO_CORTARPALABRAS, DAFO_JUSTIFICA) VALUES (123, '0001', 'IVA DEVOLUCIONES', 'S', 1000, 51, '0', 10, 'N', 'Arial', 8, 'N', 'N', 3003, 1, 'S', 'I');
INSERT INTO FORMATO_DATOS (TIDO_COD, PREF_PRE, DAFO_DATO, DAFO_IMPRIME, DAFO_POSX, DAFO_POSY, DAFO_FORMATO, DAFO_LONG, DAFO_REPITE, DAFO_FONT, DAFO_FSIZE, DAFO_LIQUIDA, DAFO_POSYVAR, DAFO_ITEM, DAFO_INI, DAFO_CORTARPALABRAS, DAFO_JUSTIFICA) VALUES (123, '0001', 'TOTAL DEVOLUCIONES', 'S', 1350, 51, '0', 10, 'N', 'Arial', 8, 'N', 'N', 3004, 1, 'S', 'I');
INSERT INTO FORMATO_DATOS (TIDO_COD, PREF_PRE, DAFO_DATO, DAFO_IMPRIME, DAFO_POSX, DAFO_POSY, DAFO_FORMATO, DAFO_LONG, DAFO_REPITE, DAFO_FONT, DAFO_FSIZE, DAFO_LIQUIDA, DAFO_POSYVAR, DAFO_ITEM, DAFO_INI, DAFO_CORTARPALABRAS, DAFO_JUSTIFICA) VALUES (123, '0001', 'BASE NETO', 'S', 750, 60, '0', 10, 'N', 'Arial', 8, 'N', 'N', 3005, 1, 'S', 'I');
INSERT INTO FORMATO_DATOS (TIDO_COD, PREF_PRE, DAFO_DATO, DAFO_IMPRIME, DAFO_POSX, DAFO_POSY, DAFO_FORMATO, DAFO_LONG, DAFO_REPITE, DAFO_FONT, DAFO_FSIZE, DAFO_LIQUIDA, DAFO_POSYVAR, DAFO_ITEM, DAFO_INI, DAFO_CORTARPALABRAS, DAFO_JUSTIFICA) VALUES (123, '0001', 'IVA NETO', 'S', 980, 60, '0', 10, 'N', 'Arial', 8, 'N', 'N', 3006, 1, 'S', 'I');
INSERT INTO FORMATO_DATOS (TIDO_COD, PREF_PRE, DAFO_DATO, DAFO_IMPRIME, DAFO_POSX, DAFO_POSY, DAFO_FORMATO, DAFO_LONG, DAFO_REPITE, DAFO_FONT, DAFO_FSIZE, DAFO_LIQUIDA, DAFO_POSYVAR, DAFO_ITEM, DAFO_INI, DAFO_CORTARPALABRAS, DAFO_JUSTIFICA) VALUES (123, '0001', 'TOTAL NETO', 'S', 1350, 60, '0', 10, 'N', 'Arial', 8, 'N', 'N', 3007, 1, 'S', 'I');
INSERT INTO FORMATO_DATOS (TIDO_COD, PREF_PRE, DAFO_DATO, DAFO_IMPRIME, DAFO_POSX, DAFO_POSY, DAFO_FORMATO, DAFO_LONG, DAFO_REPITE, DAFO_FONT, DAFO_FSIZE, DAFO_LIQUIDA, DAFO_POSYVAR, DAFO_ITEM, DAFO_INI, DAFO_CORTARPALABRAS, DAFO_JUSTIFICA) VALUES (123, '0001', 'BASE FACTURAS TARIFA 0', 'S', 950, 69, '0', 10, 'N', 'Arial', 8, 'N', 'N', 3008, 1, 'S', 'I');
INSERT INTO FORMATO_DATOS (TIDO_COD, PREF_PRE, DAFO_DATO, DAFO_IMPRIME, DAFO_POSX, DAFO_POSY, DAFO_FORMATO, DAFO_LONG, DAFO_REPITE, DAFO_FONT, DAFO_FSIZE, DAFO_LIQUIDA, DAFO_POSYVAR, DAFO_ITEM, DAFO_INI, DAFO_CORTARPALABRAS, DAFO_JUSTIFICA) VALUES (123, '0001', 'BASE DEVOLUCIONES TARIFA 0', 'S', 950, 72, '0', 10, 'N', 'Arial', 8, 'N', 'N', 3009, 1, 'S', 'I');
INSERT INTO FORMATO_DATOS (TIDO_COD, PREF_PRE, DAFO_DATO, DAFO_IMPRIME, DAFO_POSX, DAFO_POSY, DAFO_FORMATO, DAFO_LONG, DAFO_REPITE, DAFO_FONT, DAFO_FSIZE, DAFO_LIQUIDA, DAFO_POSYVAR, DAFO_ITEM, DAFO_INI, DAFO_CORTARPALABRAS, DAFO_JUSTIFICA) VALUES (123, '0001', 'IVA FACTURAS TARIFA 0', 'S', 1350, 69, '0', 10, 'N', 'Arial', 8, 'N', 'N', 3010, 1, 'S', 'I');
INSERT INTO FORMATO_DATOS (TIDO_COD, PREF_PRE, DAFO_DATO, DAFO_IMPRIME, DAFO_POSX, DAFO_POSY, DAFO_FORMATO, DAFO_LONG, DAFO_REPITE, DAFO_FONT, DAFO_FSIZE, DAFO_LIQUIDA, DAFO_POSYVAR, DAFO_ITEM, DAFO_INI, DAFO_CORTARPALABRAS, DAFO_JUSTIFICA) VALUES (123, '0001', 'IVA DEVOLUCIONES TARIFA 0', 'S', 1350, 72, '0', 10, 'N', 'Arial', 8, 'N', 'N', 3011, 1, 'S', 'I');
INSERT INTO FORMATO_DATOS (TIDO_COD, PREF_PRE, DAFO_DATO, DAFO_IMPRIME, DAFO_POSX, DAFO_POSY, DAFO_FORMATO, DAFO_LONG, DAFO_REPITE, DAFO_FONT, DAFO_FSIZE, DAFO_LIQUIDA, DAFO_POSYVAR, DAFO_ITEM, DAFO_INI, DAFO_CORTARPALABRAS, DAFO_JUSTIFICA) VALUES (123, '0001', 'TOTAL FORMA PAGO 1', 'S', 1230, 108, '0', 10, 'N', 'Arial', 8, 'N', 'N', 3012, 1, 'S', 'I');
INSERT INTO FORMATO_DATOS (TIDO_COD, PREF_PRE, DAFO_DATO, DAFO_IMPRIME, DAFO_POSX, DAFO_POSY, DAFO_FORMATO, DAFO_LONG, DAFO_REPITE, DAFO_FONT, DAFO_FSIZE, DAFO_LIQUIDA, DAFO_POSYVAR, DAFO_ITEM, DAFO_INI, DAFO_CORTARPALABRAS, DAFO_JUSTIFICA) VALUES (123, '0001', 'TOTAL FORMA PAGO 2', 'S', 1230, 111, '0', 10, 'N', 'Arial', 8, 'N', 'N', 3013, 1, 'S', 'I');
INSERT INTO FORMATO_DATOS (TIDO_COD, PREF_PRE, DAFO_DATO, DAFO_IMPRIME, DAFO_POSX, DAFO_POSY, DAFO_FORMATO, DAFO_LONG, DAFO_REPITE, DAFO_FONT, DAFO_FSIZE, DAFO_LIQUIDA, DAFO_POSYVAR, DAFO_ITEM, DAFO_INI, DAFO_CORTARPALABRAS, DAFO_JUSTIFICA) VALUES (123, '0001', 'TOTAL FORMA PAGO 3', 'S', 1230, 114, '0', 10, 'N', 'Arial', 8, 'N', 'N', 3014, 1, 'S', 'I');
INSERT INTO FORMATO_DATOS (TIDO_COD, PREF_PRE, DAFO_DATO, DAFO_IMPRIME, DAFO_POSX, DAFO_POSY, DAFO_FORMATO, DAFO_LONG, DAFO_REPITE, DAFO_FONT, DAFO_FSIZE, DAFO_LIQUIDA, DAFO_POSYVAR, DAFO_ITEM, DAFO_INI, DAFO_CORTARPALABRAS, DAFO_JUSTIFICA) VALUES (123, '0001', 'TOTAL FORMA PAGO 4', 'S', 1230, 117, '0', 10, 'N', 'Arial', 8, 'N', 'N', 3015, 1, 'S', 'I');
INSERT INTO FORMATO_DATOS (TIDO_COD, PREF_PRE, DAFO_DATO, DAFO_IMPRIME, DAFO_POSX, DAFO_POSY, DAFO_FORMATO, DAFO_LONG, DAFO_REPITE, DAFO_FONT, DAFO_FSIZE, DAFO_LIQUIDA, DAFO_POSYVAR, DAFO_ITEM, DAFO_INI, DAFO_CORTARPALABRAS, DAFO_JUSTIFICA) VALUES (123, '0001', 'IVA FACTURAS TARIFA 1', 'S', 1350, 75, '0', 10, 'N', 'Arial', 8, 'N', 'N', 3016, 1, 'S', 'I');
INSERT INTO FORMATO_DATOS (TIDO_COD, PREF_PRE, DAFO_DATO, DAFO_IMPRIME, DAFO_POSX, DAFO_POSY, DAFO_FORMATO, DAFO_LONG, DAFO_REPITE, DAFO_FONT, DAFO_FSIZE, DAFO_LIQUIDA, DAFO_POSYVAR, DAFO_ITEM, DAFO_INI, DAFO_CORTARPALABRAS, DAFO_JUSTIFICA) VALUES (123, '0001', 'IVA FACTURAS TARIFA 3', 'N', 1350, NULL, '0', 10, 'N', '16 cpi', 8, 'N', 'N', 3017, 1, 'S', 'I');
INSERT INTO FORMATO_DATOS (TIDO_COD, PREF_PRE, DAFO_DATO, DAFO_IMPRIME, DAFO_POSX, DAFO_POSY, DAFO_FORMATO, DAFO_LONG, DAFO_REPITE, DAFO_FONT, DAFO_FSIZE, DAFO_LIQUIDA, DAFO_POSYVAR, DAFO_ITEM, DAFO_INI, DAFO_CORTARPALABRAS, DAFO_JUSTIFICA) VALUES (123, '0001', 'IVA FACTURAS TARIFA 2', 'S', 1350, 81, '0', 10, 'N', 'Arial', 8, 'N', 'N', 3018, 1, 'S', 'I');
INSERT INTO FORMATO_DATOS (TIDO_COD, PREF_PRE, DAFO_DATO, DAFO_IMPRIME, DAFO_POSX, DAFO_POSY, DAFO_FORMATO, DAFO_LONG, DAFO_REPITE, DAFO_FONT, DAFO_FSIZE, DAFO_LIQUIDA, DAFO_POSYVAR, DAFO_ITEM, DAFO_INI, DAFO_CORTARPALABRAS, DAFO_JUSTIFICA) VALUES (123, '0001', 'IVA DEVOLUCIONES TARIFA 3', 'N', 1350, NULL, '0', 10, 'N', '16 cpi', 8, 'N', 'N', 3019, 1, 'S', 'I');
INSERT INTO FORMATO_DATOS (TIDO_COD, PREF_PRE, DAFO_DATO, DAFO_IMPRIME, DAFO_POSX, DAFO_POSY, DAFO_FORMATO, DAFO_LONG, DAFO_REPITE, DAFO_FONT, DAFO_FSIZE, DAFO_LIQUIDA, DAFO_POSYVAR, DAFO_ITEM, DAFO_INI, DAFO_CORTARPALABRAS, DAFO_JUSTIFICA) VALUES (123, '0001', 'IVA DEVOLUCIONES TARIFA 2', 'S', 1350, 84, '0', 10, 'N', 'Arial', 8, 'N', 'N', 3020, 1, 'S', 'I');
INSERT INTO FORMATO_DATOS (TIDO_COD, PREF_PRE, DAFO_DATO, DAFO_IMPRIME, DAFO_POSX, DAFO_POSY, DAFO_FORMATO, DAFO_LONG, DAFO_REPITE, DAFO_FONT, DAFO_FSIZE, DAFO_LIQUIDA, DAFO_POSYVAR, DAFO_ITEM, DAFO_INI, DAFO_CORTARPALABRAS, DAFO_JUSTIFICA) VALUES (123, '0001', 'IVA DEVOLUCIONES TARIFA 1', 'S', 1350, 78, '0', 10, 'N', 'Arial', 8, 'N', 'N', 3021, 1, 'S', 'I');
INSERT INTO FORMATO_DATOS (TIDO_COD, PREF_PRE, DAFO_DATO, DAFO_IMPRIME, DAFO_POSX, DAFO_POSY, DAFO_FORMATO, DAFO_LONG, DAFO_REPITE, DAFO_FONT, DAFO_FSIZE, DAFO_LIQUIDA, DAFO_POSYVAR, DAFO_ITEM, DAFO_INI, DAFO_CORTARPALABRAS, DAFO_JUSTIFICA) VALUES (123, '0001', 'IVA DEVOLUCIONES TARIFA 4', 'N', 1350, NULL, '0', 10, 'N', '16 cpi', 8, 'N', 'N', 3022, 1, 'S', 'I');
INSERT INTO FORMATO_DATOS (TIDO_COD, PREF_PRE, DAFO_DATO, DAFO_IMPRIME, DAFO_POSX, DAFO_POSY, DAFO_FORMATO, DAFO_LONG, DAFO_REPITE, DAFO_FONT, DAFO_FSIZE, DAFO_LIQUIDA, DAFO_POSYVAR, DAFO_ITEM, DAFO_INI, DAFO_CORTARPALABRAS, DAFO_JUSTIFICA) VALUES (123, '0001', 'BASE DEVOLUCIONES TARIFA 4', 'N', 950, NULL, '0', 10, 'N', '16 cpi', 8, 'N', 'N', 3023, 1, 'S', 'I');
INSERT INTO FORMATO_DATOS (TIDO_COD, PREF_PRE, DAFO_DATO, DAFO_IMPRIME, DAFO_POSX, DAFO_POSY, DAFO_FORMATO, DAFO_LONG, DAFO_REPITE, DAFO_FONT, DAFO_FSIZE, DAFO_LIQUIDA, DAFO_POSYVAR, DAFO_ITEM, DAFO_INI, DAFO_CORTARPALABRAS, DAFO_JUSTIFICA) VALUES (123, '0001', 'BASE DEVOLUCIONES TARIFA 3', 'N', 950, NULL, '0', 10, 'N', '16 cpi', 8, 'N', 'N', 3024, 1, 'S', 'I');
INSERT INTO FORMATO_DATOS (TIDO_COD, PREF_PRE, DAFO_DATO, DAFO_IMPRIME, DAFO_POSX, DAFO_POSY, DAFO_FORMATO, DAFO_LONG, DAFO_REPITE, DAFO_FONT, DAFO_FSIZE, DAFO_LIQUIDA, DAFO_POSYVAR, DAFO_ITEM, DAFO_INI, DAFO_CORTARPALABRAS, DAFO_JUSTIFICA) VALUES (123, '0001', 'BASE DEVOLUCIONES TARIFA 2', 'S', 950, 84, '0', 10, 'N', 'Arial', 8, 'N', 'N', 3025, 1, 'S', 'I');
INSERT INTO FORMATO_DATOS (TIDO_COD, PREF_PRE, DAFO_DATO, DAFO_IMPRIME, DAFO_POSX, DAFO_POSY, DAFO_FORMATO, DAFO_LONG, DAFO_REPITE, DAFO_FONT, DAFO_FSIZE, DAFO_LIQUIDA, DAFO_POSYVAR, DAFO_ITEM, DAFO_INI, DAFO_CORTARPALABRAS, DAFO_JUSTIFICA) VALUES (123, '0001', 'BASE DEVOLUCIONES TARIFA 1', 'S', 950, 78, '0', 10, 'N', 'Arial', 8, 'N', 'N', 3026, 1, 'S', 'I');
INSERT INTO FORMATO_DATOS (TIDO_COD, PREF_PRE, DAFO_DATO, DAFO_IMPRIME, DAFO_POSX, DAFO_POSY, DAFO_FORMATO, DAFO_LONG, DAFO_REPITE, DAFO_FONT, DAFO_FSIZE, DAFO_LIQUIDA, DAFO_POSYVAR, DAFO_ITEM, DAFO_INI, DAFO_CORTARPALABRAS, DAFO_JUSTIFICA) VALUES (123, '0001', 'TOTAL FORMA PAGO 5', 'S', 1230, 123, '0', 10, 'N', 'Arial', 8, 'N', 'N', 3027, 1, 'S', 'I');
INSERT INTO FORMATO_DATOS (TIDO_COD, PREF_PRE, DAFO_DATO, DAFO_IMPRIME, DAFO_POSX, DAFO_POSY, DAFO_FORMATO, DAFO_LONG, DAFO_REPITE, DAFO_FONT, DAFO_FSIZE, DAFO_LIQUIDA, DAFO_POSYVAR, DAFO_ITEM, DAFO_INI, DAFO_CORTARPALABRAS, DAFO_JUSTIFICA) VALUES (123, '0001', 'PUNTO DE VENTA', 'S', 700, 21, NULL, 20, 'N', 'Arial', 8, 'N', 'N', 3028, 1, 'S', 'I');
INSERT INTO FORMATO_DATOS (TIDO_COD, PREF_PRE, DAFO_DATO, DAFO_IMPRIME, DAFO_POSX, DAFO_POSY, DAFO_FORMATO, DAFO_LONG, DAFO_REPITE, DAFO_FONT, DAFO_FSIZE, DAFO_LIQUIDA, DAFO_POSYVAR, DAFO_ITEM, DAFO_INI, DAFO_CORTARPALABRAS, DAFO_JUSTIFICA) VALUES (123, '0001', 'CODIGO USUARIO', 'N', NULL, NULL, NULL, 10, 'N', '16 cpi', 8, 'N', 'N', 3029, 1, 'S', 'I');
INSERT INTO FORMATO_DATOS (TIDO_COD, PREF_PRE, DAFO_DATO, DAFO_IMPRIME, DAFO_POSX, DAFO_POSY, DAFO_FORMATO, DAFO_LONG, DAFO_REPITE, DAFO_FONT, DAFO_FSIZE, DAFO_LIQUIDA, DAFO_POSYVAR, DAFO_ITEM, DAFO_INI, DAFO_CORTARPALABRAS, DAFO_JUSTIFICA) VALUES (123, '0001', 'NOMBRE USUARIO', 'S', 700, 27, NULL, 19, 'N', 'Arial', 8, 'N', 'N', 3030, 1, 'S', 'I');
INSERT INTO FORMATO_DATOS (TIDO_COD, PREF_PRE, DAFO_DATO, DAFO_IMPRIME, DAFO_POSX, DAFO_POSY, DAFO_FORMATO, DAFO_LONG, DAFO_REPITE, DAFO_FONT, DAFO_FSIZE, DAFO_LIQUIDA, DAFO_POSYVAR, DAFO_ITEM, DAFO_INI, DAFO_CORTARPALABRAS, DAFO_JUSTIFICA) VALUES (123, '0001', 'BASE FACTURAS TARIFA 4', 'N', 950, NULL, '0', 10, 'N', '16 cpi', 8, 'N', 'N', 3031, 1, 'S', 'I');
INSERT INTO FORMATO_DATOS (TIDO_COD, PREF_PRE, DAFO_DATO, DAFO_IMPRIME, DAFO_POSX, DAFO_POSY, DAFO_FORMATO, DAFO_LONG, DAFO_REPITE, DAFO_FONT, DAFO_FSIZE, DAFO_LIQUIDA, DAFO_POSYVAR, DAFO_ITEM, DAFO_INI, DAFO_CORTARPALABRAS, DAFO_JUSTIFICA) VALUES (123, '0001', 'BASE FACTURAS TARIFA 3', 'N', 950, NULL, '0', 10, 'N', '16 cpi', 8, 'N', 'N', 3032, 1, 'S', 'I');
INSERT INTO FORMATO_DATOS (TIDO_COD, PREF_PRE, DAFO_DATO, DAFO_IMPRIME, DAFO_POSX, DAFO_POSY, DAFO_FORMATO, DAFO_LONG, DAFO_REPITE, DAFO_FONT, DAFO_FSIZE, DAFO_LIQUIDA, DAFO_POSYVAR, DAFO_ITEM, DAFO_INI, DAFO_CORTARPALABRAS, DAFO_JUSTIFICA) VALUES (123, '0001', 'BASE FACTURAS TARIFA 2', 'S', 950, 81, '0', 10, 'N', 'Arial', 8, 'N', 'N', 3033, 1, 'S', 'I');
INSERT INTO FORMATO_DATOS (TIDO_COD, PREF_PRE, DAFO_DATO, DAFO_IMPRIME, DAFO_POSX, DAFO_POSY, DAFO_FORMATO, DAFO_LONG, DAFO_REPITE, DAFO_FONT, DAFO_FSIZE, DAFO_LIQUIDA, DAFO_POSYVAR, DAFO_ITEM, DAFO_INI, DAFO_CORTARPALABRAS, DAFO_JUSTIFICA) VALUES (123, '0001', 'BASE FACTURAS TARIFA 1', 'S', 950, 75, '0', 10, 'N', 'Arial', 8, 'N', 'N', 3034, 1, 'S', 'I');
INSERT INTO FORMATO_DATOS (TIDO_COD, PREF_PRE, DAFO_DATO, DAFO_IMPRIME, DAFO_POSX, DAFO_POSY, DAFO_FORMATO, DAFO_LONG, DAFO_REPITE, DAFO_FONT, DAFO_FSIZE, DAFO_LIQUIDA, DAFO_POSYVAR, DAFO_ITEM, DAFO_INI, DAFO_CORTARPALABRAS, DAFO_JUSTIFICA) VALUES (123, '0001', 'HORA INICIO', 'S', 350, 15, NULL, 12, 'N', 'Arial', 8, 'N', 'N', 3100, 1, 'S', 'I');
INSERT INTO FORMATO_DATOS (TIDO_COD, PREF_PRE, DAFO_DATO, DAFO_IMPRIME, DAFO_POSX, DAFO_POSY, DAFO_FORMATO, DAFO_LONG, DAFO_REPITE, DAFO_FONT, DAFO_FSIZE, DAFO_LIQUIDA, DAFO_POSYVAR, DAFO_ITEM, DAFO_INI, DAFO_CORTARPALABRAS, DAFO_JUSTIFICA) VALUES (123, '0001', 'HORA FIN', 'S', 900, 15, NULL, 12, 'N', 'Arial', 8, 'N', 'N', 3101, 1, 'S', 'I');
INSERT INTO FORMATO_DATOS (TIDO_COD, PREF_PRE, DAFO_DATO, DAFO_IMPRIME, DAFO_POSX, DAFO_POSY, DAFO_FORMATO, DAFO_LONG, DAFO_REPITE, DAFO_FONT, DAFO_FSIZE, DAFO_LIQUIDA, DAFO_POSYVAR, DAFO_ITEM, DAFO_INI, DAFO_CORTARPALABRAS, DAFO_JUSTIFICA) VALUES (123, '0001', 'NUMERO ANULADOS', 'S', 1150, 93, '0', 10, 'N', 'Arial', 8, 'N', 'N', 3150, 1, 'S', 'I');
INSERT INTO FORMATO_DATOS (TIDO_COD, PREF_PRE, DAFO_DATO, DAFO_IMPRIME, DAFO_POSX, DAFO_POSY, DAFO_FORMATO, DAFO_LONG, DAFO_REPITE, DAFO_FONT, DAFO_FSIZE, DAFO_LIQUIDA, DAFO_POSYVAR, DAFO_ITEM, DAFO_INI, DAFO_CORTARPALABRAS, DAFO_JUSTIFICA) VALUES (123, '0001', 'TOTAL ANULADO', 'S', 1230, 99, '0', 10, 'N', 'Arial', 8, 'N', 'N', 3151, 1, 'S', 'I');
INSERT INTO FORMATO_DATOS (TIDO_COD, PREF_PRE, DAFO_DATO, DAFO_IMPRIME, DAFO_POSX, DAFO_POSY, DAFO_FORMATO, DAFO_LONG, DAFO_REPITE, DAFO_FONT, DAFO_FSIZE, DAFO_LIQUIDA, DAFO_POSYVAR, DAFO_ITEM, DAFO_INI, DAFO_CORTARPALABRAS, DAFO_JUSTIFICA) VALUES (123, '0001', 'IVA ANULADOS', 'S', 1230, 96, '0', 10, 'N', 'Arial', 8, 'N', 'N', 3153, 1, 'S', 'I');
INSERT INTO FORMATO_DATOS (TIDO_COD, PREF_PRE, DAFO_DATO, DAFO_IMPRIME, DAFO_POSX, DAFO_POSY, DAFO_FORMATO, DAFO_LONG, DAFO_REPITE, DAFO_FONT, DAFO_FSIZE, DAFO_LIQUIDA, DAFO_POSYVAR, DAFO_ITEM, DAFO_INI, DAFO_CORTARPALABRAS, DAFO_JUSTIFICA) VALUES (123, '0001', 'NOMBRE VENDEDOR', 'S', 700, 24, NULL, 20, 'N', 'Arial', 8, 'N', 'N', 3154, 1, 'S', 'I');
INSERT INTO FORMATO_DATOS (TIDO_COD, PREF_PRE, DAFO_DATO, DAFO_IMPRIME, DAFO_POSX, DAFO_POSY, DAFO_FORMATO, DAFO_LONG, DAFO_REPITE, DAFO_FONT, DAFO_FSIZE, DAFO_LIQUIDA, DAFO_POSYVAR, DAFO_ITEM, DAFO_INI, DAFO_CORTARPALABRAS, DAFO_JUSTIFICA) VALUES (123, '0001', 'TOTAL FORMA PAGO 7', 'S', 1230, 126, '0', 10, 'N', 'Arial', 8, 'N', 'N', 3156, 1, 'S', 'I');
INSERT INTO FORMATO_DATOS (TIDO_COD, PREF_PRE, DAFO_DATO, DAFO_IMPRIME, DAFO_POSX, DAFO_POSY, DAFO_FORMATO, DAFO_LONG, DAFO_REPITE, DAFO_FONT, DAFO_FSIZE, DAFO_LIQUIDA, DAFO_POSYVAR, DAFO_ITEM, DAFO_INI, DAFO_CORTARPALABRAS, DAFO_JUSTIFICA) VALUES (123, '0001', 'TRASLADOS', 'S', 1350, 53, '0', 10, 'N', 'Arial', 8, 'N', 'N', 3166, 1, 'S', 'I');
COMMIT WORK;

INSERT INTO FORMATO_LINEAS (TIDO_COD, PREF_PRE, FOLI_ITEM, FOLI_TIPO, FOLI_X, FOLI_Y, FOLI_POSX, FOLI_POSY, FOLI_CADENA, FOLI_FONT, FOLI_FSIZE, FOLI_LIQUIDA, FOLI_REPITE) VALUES (123, '0001', 988, 'T', NULL, NULL, 110, 129, 'SERVIBANCA', 'Arial', 8, 'N', NULL);
INSERT INTO FORMATO_LINEAS (TIDO_COD, PREF_PRE, FOLI_ITEM, FOLI_TIPO, FOLI_X, FOLI_Y, FOLI_POSX, FOLI_POSY, FOLI_CADENA, FOLI_FONT, FOLI_FSIZE, FOLI_LIQUIDA, FOLI_REPITE) VALUES (123, '0001', 989, 'T', NULL, NULL, 110, 132, 'BONOS VICTORIA LIBERTA', 'Arial', 8, 'N', NULL);
INSERT INTO FORMATO_LINEAS (TIDO_COD, PREF_PRE, FOLI_ITEM, FOLI_TIPO, FOLI_X, FOLI_Y, FOLI_POSX, FOLI_POSY, FOLI_CADENA, FOLI_FONT, FOLI_FSIZE, FOLI_LIQUIDA, FOLI_REPITE) VALUES (123, '0001', 990, 'T', NULL, NULL, 110, 135, 'BONOS VICTORIA PLUSS', 'Arial', 8, 'N', NULL);
INSERT INTO FORMATO_LINEAS (TIDO_COD, PREF_PRE, FOLI_ITEM, FOLI_TIPO, FOLI_X, FOLI_Y, FOLI_POSX, FOLI_POSY, FOLI_CADENA, FOLI_FONT, FOLI_FSIZE, FOLI_LIQUIDA, FOLI_REPITE) VALUES (123, '0001', 991, 'T', NULL, NULL, 110, 138, 'SODEXHO PASS', 'Arial', 8, 'N', NULL);
INSERT INTO FORMATO_LINEAS (TIDO_COD, PREF_PRE, FOLI_ITEM, FOLI_TIPO, FOLI_X, FOLI_Y, FOLI_POSX, FOLI_POSY, FOLI_CADENA, FOLI_FONT, FOLI_FSIZE, FOLI_LIQUIDA, FOLI_REPITE) VALUES (123, '0001', 992, 'T', NULL, NULL, 110, 141, 'BIG PASS', 'Arial', 8, 'N', NULL);
INSERT INTO FORMATO_LINEAS (TIDO_COD, PREF_PRE, FOLI_ITEM, FOLI_TIPO, FOLI_X, FOLI_Y, FOLI_POSX, FOLI_POSY, FOLI_CADENA, FOLI_FONT, FOLI_FSIZE, FOLI_LIQUIDA, FOLI_REPITE) VALUES (123, '0001', 993, 'T', NULL, NULL, 110, 144, 'BONOS COMFANORTE', 'Arial', 8, 'N', NULL);
INSERT INTO FORMATO_LINEAS (TIDO_COD, PREF_PRE, FOLI_ITEM, FOLI_TIPO, FOLI_X, FOLI_Y, FOLI_POSX, FOLI_POSY, FOLI_CADENA, FOLI_FONT, FOLI_FSIZE, FOLI_LIQUIDA, FOLI_REPITE) VALUES (123, '0001', 994, 'T', NULL, NULL, 110, 147, 'TARJETA COMFANORTE', 'Arial', 8, 'N', NULL);
INSERT INTO FORMATO_LINEAS (TIDO_COD, PREF_PRE, FOLI_ITEM, FOLI_TIPO, FOLI_X, FOLI_Y, FOLI_POSX, FOLI_POSY, FOLI_CADENA, FOLI_FONT, FOLI_FSIZE, FOLI_LIQUIDA, FOLI_REPITE) VALUES (123, '0001', 91, 'T', NULL, NULL, 110, 12, 'INFORME DIARIO DE VENTAS DEFINITIVO Z', 'Arial Black', 8, 'N', NULL);
INSERT INTO FORMATO_LINEAS (TIDO_COD, PREF_PRE, FOLI_ITEM, FOLI_TIPO, FOLI_X, FOLI_Y, FOLI_POSX, FOLI_POSY, FOLI_CADENA, FOLI_FONT, FOLI_FSIZE, FOLI_LIQUIDA, FOLI_REPITE) VALUES (123, '0001', 93, 'T', NULL, NULL, 110, 18, 'FECHA:', 'Arial', 8, 'N', NULL);
INSERT INTO FORMATO_LINEAS (TIDO_COD, PREF_PRE, FOLI_ITEM, FOLI_TIPO, FOLI_X, FOLI_Y, FOLI_POSX, FOLI_POSY, FOLI_CADENA, FOLI_FONT, FOLI_FSIZE, FOLI_LIQUIDA, FOLI_REPITE) VALUES (123, '0001', 94, 'T', NULL, NULL, 110, 21, 'PUNTO DE VENTA:', 'Arial', 8, 'N', NULL);
INSERT INTO FORMATO_LINEAS (TIDO_COD, PREF_PRE, FOLI_ITEM, FOLI_TIPO, FOLI_X, FOLI_Y, FOLI_POSX, FOLI_POSY, FOLI_CADENA, FOLI_FONT, FOLI_FSIZE, FOLI_LIQUIDA, FOLI_REPITE) VALUES (123, '0001', 95, 'T', NULL, NULL, 110, 27, 'IMPRESO POR:', 'Arial', 8, 'N', NULL);
INSERT INTO FORMATO_LINEAS (TIDO_COD, PREF_PRE, FOLI_ITEM, FOLI_TIPO, FOLI_X, FOLI_Y, FOLI_POSX, FOLI_POSY, FOLI_CADENA, FOLI_FONT, FOLI_FSIZE, FOLI_LIQUIDA, FOLI_REPITE) VALUES (123, '0001', 96, 'T', NULL, NULL, 110, 33, 'NUMERO INICIAL:', 'Arial', 8, 'N', NULL);
INSERT INTO FORMATO_LINEAS (TIDO_COD, PREF_PRE, FOLI_ITEM, FOLI_TIPO, FOLI_X, FOLI_Y, FOLI_POSX, FOLI_POSY, FOLI_CADENA, FOLI_FONT, FOLI_FSIZE, FOLI_LIQUIDA, FOLI_REPITE) VALUES (123, '0001', 98, 'T', NULL, NULL, 900, 45, 'IVA', 'Arial', 8, 'N', NULL);
INSERT INTO FORMATO_LINEAS (TIDO_COD, PREF_PRE, FOLI_ITEM, FOLI_TIPO, FOLI_X, FOLI_Y, FOLI_POSX, FOLI_POSY, FOLI_CADENA, FOLI_FONT, FOLI_FSIZE, FOLI_LIQUIDA, FOLI_REPITE) VALUES (123, '0001', 100, 'T', NULL, NULL, 110, 39, 'TOTAL FACTURAS ELABORADAS:', 'Arial', 8, 'N', NULL);
INSERT INTO FORMATO_LINEAS (TIDO_COD, PREF_PRE, FOLI_ITEM, FOLI_TIPO, FOLI_X, FOLI_Y, FOLI_POSX, FOLI_POSY, FOLI_CADENA, FOLI_FONT, FOLI_FSIZE, FOLI_LIQUIDA, FOLI_REPITE) VALUES (123, '0001', 101, 'T', NULL, NULL, 240, 45, 'ITEMS', 'Arial', 8, 'N', NULL);
INSERT INTO FORMATO_LINEAS (TIDO_COD, PREF_PRE, FOLI_ITEM, FOLI_TIPO, FOLI_X, FOLI_Y, FOLI_POSX, FOLI_POSY, FOLI_CADENA, FOLI_FONT, FOLI_FSIZE, FOLI_LIQUIDA, FOLI_REPITE) VALUES (123, '0001', 102, 'T', NULL, NULL, 530, 45, 'BASE', 'Arial', 8, 'N', NULL);
INSERT INTO FORMATO_LINEAS (TIDO_COD, PREF_PRE, FOLI_ITEM, FOLI_TIPO, FOLI_X, FOLI_Y, FOLI_POSX, FOLI_POSY, FOLI_CADENA, FOLI_FONT, FOLI_FSIZE, FOLI_LIQUIDA, FOLI_REPITE) VALUES (123, '0001', 103, 'T', NULL, NULL, 1230, 45, 'TOTAL', 'Arial', 8, 'N', NULL);
INSERT INTO FORMATO_LINEAS (TIDO_COD, PREF_PRE, FOLI_ITEM, FOLI_TIPO, FOLI_X, FOLI_Y, FOLI_POSX, FOLI_POSY, FOLI_CADENA, FOLI_FONT, FOLI_FSIZE, FOLI_LIQUIDA, FOLI_REPITE) VALUES (123, '0001', 882, 'T', NULL, NULL, 450, 9, 'NIT: 13.440.168-3', 'Arial', 8, 'N', NULL);
INSERT INTO FORMATO_LINEAS (TIDO_COD, PREF_PRE, FOLI_ITEM, FOLI_TIPO, FOLI_X, FOLI_Y, FOLI_POSX, FOLI_POSY, FOLI_CADENA, FOLI_FONT, FOLI_FSIZE, FOLI_LIQUIDA, FOLI_REPITE) VALUES (123, '0001', 883, 'T', NULL, NULL, 110, 63, 'DISCRIMINACION POR TARIFAS IVA', 'Arial', 8, 'N', NULL);
INSERT INTO FORMATO_LINEAS (TIDO_COD, PREF_PRE, FOLI_ITEM, FOLI_TIPO, FOLI_X, FOLI_Y, FOLI_POSX, FOLI_POSY, FOLI_CADENA, FOLI_FONT, FOLI_FSIZE, FOLI_LIQUIDA, FOLI_REPITE) VALUES (123, '0001', 886, 'T', NULL, NULL, 110, 78, 'DEV. 10%', 'Arial', 8, 'N', NULL);
INSERT INTO FORMATO_LINEAS (TIDO_COD, PREF_PRE, FOLI_ITEM, FOLI_TIPO, FOLI_X, FOLI_Y, FOLI_POSX, FOLI_POSY, FOLI_CADENA, FOLI_FONT, FOLI_FSIZE, FOLI_LIQUIDA, FOLI_REPITE) VALUES (123, '0001', 941, 'T', NULL, NULL, 110, 36, 'NUMERO FINAL:', 'Arial', 8, 'N', NULL);
INSERT INTO FORMATO_LINEAS (TIDO_COD, PREF_PRE, FOLI_ITEM, FOLI_TIPO, FOLI_X, FOLI_Y, FOLI_POSX, FOLI_POSY, FOLI_CADENA, FOLI_FONT, FOLI_FSIZE, FOLI_LIQUIDA, FOLI_REPITE) VALUES (123, '0001', 957, 'T', NULL, NULL, 400, 3, 'SUPERMERCADO', 'Arial Black', 10, 'N', NULL);
INSERT INTO FORMATO_LINEAS (TIDO_COD, PREF_PRE, FOLI_ITEM, FOLI_TIPO, FOLI_X, FOLI_Y, FOLI_POSX, FOLI_POSY, FOLI_CADENA, FOLI_FONT, FOLI_FSIZE, FOLI_LIQUIDA, FOLI_REPITE) VALUES (123, '0001', 958, 'T', NULL, NULL, 110, 48, 'F:', 'Arial', 8, 'N', NULL);
INSERT INTO FORMATO_LINEAS (TIDO_COD, PREF_PRE, FOLI_ITEM, FOLI_TIPO, FOLI_X, FOLI_Y, FOLI_POSX, FOLI_POSY, FOLI_CADENA, FOLI_FONT, FOLI_FSIZE, FOLI_LIQUIDA, FOLI_REPITE) VALUES (123, '0001', 959, 'T', NULL, NULL, 110, 51, 'D:', 'Arial', 8, 'N', NULL);
INSERT INTO FORMATO_LINEAS (TIDO_COD, PREF_PRE, FOLI_ITEM, FOLI_TIPO, FOLI_X, FOLI_Y, FOLI_POSX, FOLI_POSY, FOLI_CADENA, FOLI_FONT, FOLI_FSIZE, FOLI_LIQUIDA, FOLI_REPITE) VALUES (123, '0001', 960, 'T', NULL, NULL, 730, 66, 'BASE', 'Arial', 8, 'N', NULL);
INSERT INTO FORMATO_LINEAS (TIDO_COD, PREF_PRE, FOLI_ITEM, FOLI_TIPO, FOLI_X, FOLI_Y, FOLI_POSX, FOLI_POSY, FOLI_CADENA, FOLI_FONT, FOLI_FSIZE, FOLI_LIQUIDA, FOLI_REPITE) VALUES (123, '0001', 963, 'T', NULL, NULL, 1230, 66, 'IVA', 'Arial', 8, 'N', NULL);
INSERT INTO FORMATO_LINEAS (TIDO_COD, PREF_PRE, FOLI_ITEM, FOLI_TIPO, FOLI_X, FOLI_Y, FOLI_POSX, FOLI_POSY, FOLI_CADENA, FOLI_FONT, FOLI_FSIZE, FOLI_LIQUIDA, FOLI_REPITE) VALUES (123, '0001', 964, 'T', NULL, NULL, 110, 60, 'NETO:', 'Arial', 8, 'N', NULL);
INSERT INTO FORMATO_LINEAS (TIDO_COD, PREF_PRE, FOLI_ITEM, FOLI_TIPO, FOLI_X, FOLI_Y, FOLI_POSX, FOLI_POSY, FOLI_CADENA, FOLI_FONT, FOLI_FSIZE, FOLI_LIQUIDA, FOLI_REPITE) VALUES (123, '0001', 965, 'T', NULL, NULL, 110, 69, 'VENTAS EXCENTAS', 'Arial', 8, 'N', NULL);
INSERT INTO FORMATO_LINEAS (TIDO_COD, PREF_PRE, FOLI_ITEM, FOLI_TIPO, FOLI_X, FOLI_Y, FOLI_POSX, FOLI_POSY, FOLI_CADENA, FOLI_FONT, FOLI_FSIZE, FOLI_LIQUIDA, FOLI_REPITE) VALUES (123, '0001', 966, 'T', NULL, NULL, 110, 72, 'DEV. EXCENTAS', 'Arial', 8, 'N', NULL);
INSERT INTO FORMATO_LINEAS (TIDO_COD, PREF_PRE, FOLI_ITEM, FOLI_TIPO, FOLI_X, FOLI_Y, FOLI_POSX, FOLI_POSY, FOLI_CADENA, FOLI_FONT, FOLI_FSIZE, FOLI_LIQUIDA, FOLI_REPITE) VALUES (123, '0001', 967, 'T', NULL, NULL, 110, 75, 'VENTAS 10%', 'Arial', 8, 'N', NULL);
INSERT INTO FORMATO_LINEAS (TIDO_COD, PREF_PRE, FOLI_ITEM, FOLI_TIPO, FOLI_X, FOLI_Y, FOLI_POSX, FOLI_POSY, FOLI_CADENA, FOLI_FONT, FOLI_FSIZE, FOLI_LIQUIDA, FOLI_REPITE) VALUES (123, '0001', 968, 'T', NULL, NULL, 110, 81, 'VENTAS 16%', 'Arial', 8, 'N', NULL);
INSERT INTO FORMATO_LINEAS (TIDO_COD, PREF_PRE, FOLI_ITEM, FOLI_TIPO, FOLI_X, FOLI_Y, FOLI_POSX, FOLI_POSY, FOLI_CADENA, FOLI_FONT, FOLI_FSIZE, FOLI_LIQUIDA, FOLI_REPITE) VALUES (123, '0001', 969, 'T', NULL, NULL, 110, 84, 'DEV. 16%', 'Arial', 8, 'N', NULL);
INSERT INTO FORMATO_LINEAS (TIDO_COD, PREF_PRE, FOLI_ITEM, FOLI_TIPO, FOLI_X, FOLI_Y, FOLI_POSX, FOLI_POSY, FOLI_CADENA, FOLI_FONT, FOLI_FSIZE, FOLI_LIQUIDA, FOLI_REPITE) VALUES (123, '0001', 970, 'T', NULL, NULL, 110, 105, 'DISCRIMINACION POR FORMAS DE PAGO', 'Arial', 8, 'N', NULL);
INSERT INTO FORMATO_LINEAS (TIDO_COD, PREF_PRE, FOLI_ITEM, FOLI_TIPO, FOLI_X, FOLI_Y, FOLI_POSX, FOLI_POSY, FOLI_CADENA, FOLI_FONT, FOLI_FSIZE, FOLI_LIQUIDA, FOLI_REPITE) VALUES (123, '0001', 971, 'T', NULL, NULL, 110, 108, 'EFECTIVO', 'Arial', 8, 'N', NULL);
INSERT INTO FORMATO_LINEAS (TIDO_COD, PREF_PRE, FOLI_ITEM, FOLI_TIPO, FOLI_X, FOLI_Y, FOLI_POSX, FOLI_POSY, FOLI_CADENA, FOLI_FONT, FOLI_FSIZE, FOLI_LIQUIDA, FOLI_REPITE) VALUES (123, '0001', 972, 'T', NULL, NULL, 110, 111, 'ELECTRON', 'Arial', 8, 'N', NULL);
INSERT INTO FORMATO_LINEAS (TIDO_COD, PREF_PRE, FOLI_ITEM, FOLI_TIPO, FOLI_X, FOLI_Y, FOLI_POSX, FOLI_POSY, FOLI_CADENA, FOLI_FONT, FOLI_FSIZE, FOLI_LIQUIDA, FOLI_REPITE) VALUES (123, '0001', 973, 'T', NULL, NULL, 110, 114, 'VISA CREDITO', 'Arial', 8, 'N', NULL);
INSERT INTO FORMATO_LINEAS (TIDO_COD, PREF_PRE, FOLI_ITEM, FOLI_TIPO, FOLI_X, FOLI_Y, FOLI_POSX, FOLI_POSY, FOLI_CADENA, FOLI_FONT, FOLI_FSIZE, FOLI_LIQUIDA, FOLI_REPITE) VALUES (123, '0001', 974, 'T', NULL, NULL, 110, 117, 'MASTERCARD DEBITO', 'Arial', 8, 'N', NULL);
INSERT INTO FORMATO_LINEAS (TIDO_COD, PREF_PRE, FOLI_ITEM, FOLI_TIPO, FOLI_X, FOLI_Y, FOLI_POSX, FOLI_POSY, FOLI_CADENA, FOLI_FONT, FOLI_FSIZE, FOLI_LIQUIDA, FOLI_REPITE) VALUES (123, '0001', 975, 'T', NULL, NULL, 110, 120, 'MASTERCARD CREDITO', 'Arial', 8, 'N', NULL);
INSERT INTO FORMATO_LINEAS (TIDO_COD, PREF_PRE, FOLI_ITEM, FOLI_TIPO, FOLI_X, FOLI_Y, FOLI_POSX, FOLI_POSY, FOLI_CADENA, FOLI_FONT, FOLI_FSIZE, FOLI_LIQUIDA, FOLI_REPITE) VALUES (123, '0001', 976, 'T', NULL, NULL, 110, 30, 'PREFIJO VENTA:', 'Arial', 8, 'N', NULL);
INSERT INTO FORMATO_LINEAS (TIDO_COD, PREF_PRE, FOLI_ITEM, FOLI_TIPO, FOLI_X, FOLI_Y, FOLI_POSX, FOLI_POSY, FOLI_CADENA, FOLI_FONT, FOLI_FSIZE, FOLI_LIQUIDA, FOLI_REPITE) VALUES (123, '0001', 977, 'T', NULL, NULL, 110, 15, 'INICIO:', 'Arial', 8, 'N', NULL);
INSERT INTO FORMATO_LINEAS (TIDO_COD, PREF_PRE, FOLI_ITEM, FOLI_TIPO, FOLI_X, FOLI_Y, FOLI_POSX, FOLI_POSY, FOLI_CADENA, FOLI_FONT, FOLI_FSIZE, FOLI_LIQUIDA, FOLI_REPITE) VALUES (123, '0001', 978, 'T', NULL, NULL, 750, 15, 'FIN:', 'Arial', 8, 'N', NULL);
INSERT INTO FORMATO_LINEAS (TIDO_COD, PREF_PRE, FOLI_ITEM, FOLI_TIPO, FOLI_X, FOLI_Y, FOLI_POSX, FOLI_POSY, FOLI_CADENA, FOLI_FONT, FOLI_FSIZE, FOLI_LIQUIDA, FOLI_REPITE) VALUES (123, '0001', 979, 'T', NULL, NULL, 110, 57, '             ___________________________', 'Arial', 8, 'N', NULL);
INSERT INTO FORMATO_LINEAS (TIDO_COD, PREF_PRE, FOLI_ITEM, FOLI_TIPO, FOLI_X, FOLI_Y, FOLI_POSX, FOLI_POSY, FOLI_CADENA, FOLI_FONT, FOLI_FSIZE, FOLI_LIQUIDA, FOLI_REPITE) VALUES (123, '0001', 980, 'T', NULL, NULL, 110, 96, 'IVA FACT. ANULADAS', 'Arial', 8, 'N', NULL);
INSERT INTO FORMATO_LINEAS (TIDO_COD, PREF_PRE, FOLI_ITEM, FOLI_TIPO, FOLI_X, FOLI_Y, FOLI_POSX, FOLI_POSY, FOLI_CADENA, FOLI_FONT, FOLI_FSIZE, FOLI_LIQUIDA, FOLI_REPITE) VALUES (123, '0001', 981, 'T', NULL, NULL, 110, 93, 'Nª ANULADAS', 'Arial', 8, 'N', NULL);
INSERT INTO FORMATO_LINEAS (TIDO_COD, PREF_PRE, FOLI_ITEM, FOLI_TIPO, FOLI_X, FOLI_Y, FOLI_POSX, FOLI_POSY, FOLI_CADENA, FOLI_FONT, FOLI_FSIZE, FOLI_LIQUIDA, FOLI_REPITE) VALUES (123, '0001', 982, 'T', NULL, NULL, 110, 99, 'BASE ANULADAS', 'Arial', 8, 'N', NULL);
INSERT INTO FORMATO_LINEAS (TIDO_COD, PREF_PRE, FOLI_ITEM, FOLI_TIPO, FOLI_X, FOLI_Y, FOLI_POSX, FOLI_POSY, FOLI_CADENA, FOLI_FONT, FOLI_FSIZE, FOLI_LIQUIDA, FOLI_REPITE) VALUES (123, '0001', 983, 'T', NULL, NULL, 110, 90, 'DISCRIMINACION FACTURAS ANULADAS', 'Arial', 8, 'N', NULL);
INSERT INTO FORMATO_LINEAS (TIDO_COD, PREF_PRE, FOLI_ITEM, FOLI_TIPO, FOLI_X, FOLI_Y, FOLI_POSX, FOLI_POSY, FOLI_CADENA, FOLI_FONT, FOLI_FSIZE, FOLI_LIQUIDA, FOLI_REPITE) VALUES (123, '0001', 984, 'T', NULL, NULL, 110, 123, 'AMERICAN EXPRESS', 'Arial', 8, 'N', NULL);
INSERT INTO FORMATO_LINEAS (TIDO_COD, PREF_PRE, FOLI_ITEM, FOLI_TIPO, FOLI_X, FOLI_Y, FOLI_POSX, FOLI_POSY, FOLI_CADENA, FOLI_FONT, FOLI_FSIZE, FOLI_LIQUIDA, FOLI_REPITE) VALUES (123, '0001', 985, 'T', NULL, NULL, 123, 5, 'VICTORIA PLAZA LIBERTADORES', 'Arial Black', 10, 'N', NULL);
INSERT INTO FORMATO_LINEAS (TIDO_COD, PREF_PRE, FOLI_ITEM, FOLI_TIPO, FOLI_X, FOLI_Y, FOLI_POSX, FOLI_POSY, FOLI_CADENA, FOLI_FONT, FOLI_FSIZE, FOLI_LIQUIDA, FOLI_REPITE) VALUES (123, '0001', 986, 'T', NULL, NULL, 110, 24, 'CAJERO:', 'Arial', 8, 'N', NULL);
INSERT INTO FORMATO_LINEAS (TIDO_COD, PREF_PRE, FOLI_ITEM, FOLI_TIPO, FOLI_X, FOLI_Y, FOLI_POSX, FOLI_POSY, FOLI_CADENA, FOLI_FONT, FOLI_FSIZE, FOLI_LIQUIDA, FOLI_REPITE) VALUES (123, '0001', 987, 'T', NULL, NULL, 110, 126, 'DINERS', 'Arial', 8, 'N', NULL);
INSERT INTO FORMATO_LINEAS (TIDO_COD, PREF_PRE, FOLI_ITEM, FOLI_TIPO, FOLI_X, FOLI_Y, FOLI_POSX, FOLI_POSY, FOLI_CADENA, FOLI_FONT, FOLI_FSIZE, FOLI_LIQUIDA, FOLI_REPITE) VALUES (123, '0001', 995, 'T', NULL, NULL, 350, 7, 'LUIS ALIRIO RANGEL SILVA', 'Arial', 8, 'N', NULL);
INSERT INTO FORMATO_LINEAS (TIDO_COD, PREF_PRE, FOLI_ITEM, FOLI_TIPO, FOLI_X, FOLI_Y, FOLI_POSX, FOLI_POSY, FOLI_CADENA, FOLI_FONT, FOLI_FSIZE, FOLI_LIQUIDA, FOLI_REPITE) VALUES (123, '0001', 996, 'T', NULL, NULL, 110, 53, 'TRASLADOS', 'Arial', 8, 'N', NULL);
INSERT INTO FORMATO_LINEAS (TIDO_COD, PREF_PRE, FOLI_ITEM, FOLI_TIPO, FOLI_X, FOLI_Y, FOLI_POSX, FOLI_POSY, FOLI_CADENA, FOLI_FONT, FOLI_FSIZE, FOLI_LIQUIDA, FOLI_REPITE) VALUES (123, '0001', 997, 'T', NULL, NULL, 110, 150, 'BONOS DE DEVOLUCIONES', 'Arial', 8, 'N', NULL);
COMMIT WORK;

update revision set revi_fecha = '2014/03/22', revi_nomina = '2014/03/14';
commit work;

