/* Desarrollos TEG-MEK */
INSERT INTO CONFIGURACION (CONF_MODULO, CONF_CATEGORIA, CONF_PROPIEDAD, CONF_VALOR, CONF_POSIBLES, CONF_AYUDA) VALUES ('COMPRAS', 'FACTURAS', 'CUENTA CONTABLE PARA IMPUESTO EN COMPRAS DE BEBIDAS AZUCARADAS', '143590', '', 'Indique el codigo de la cuenta contable por concepto del impuesto a las bebidas azucaradas en compras');
INSERT INTO CONFIGURACION (CONF_MODULO, CONF_CATEGORIA, CONF_PROPIEDAD, CONF_VALOR, CONF_POSIBLES, CONF_AYUDA) VALUES ('COMPRAS', 'FACTURAS', 'CUENTA CONTABLE PARA IMPUESTO EN COMPRAS DE ALIMENTOS ULTRAPROCESADOS', '143595', '', 'Indique el codigo de la cuenta contable por concepto del impuesto a los ultra procesados');
COMMIT WORK;

ALTER TABLE PROVEEDORES
ADD PROV_IMPBA T_BOOLEANO;

ALTER TABLE PROVEEDORES
ADD PROV_IMPUP T_BOOLEANO;

ALTER TRIGGER PROVEEDORES_AU INACTIVE;
update proveedores set prov_impba = 'N' where prov_impba is null;
update proveedores set prov_impup = 'N' where prov_impup is null;
commit work;
ALTER TRIGGER PROVEEDORES_AU ACTIVE;

ALTER TABLE ARTICULO
ADD ARTI_IMPUP T_PORCENTAJE;

ALTER TABLE ARTICULO
ADD ARTI_IMPBA T_MONTO;

ALTER TRIGGER ARTICULO_AU INACTIVE;

UPDATE ARTICULO SET ARTI_IMPUP = 0 WHERE ARTI_IMPUP IS NULL;
COMMIT WORK;

UPDATE ARTICULO SET ARTI_IMPBA = 0 WHERE ARTI_IMPBA IS NULL;
COMMIT WORK;

ALTER TRIGGER ARTICULO_AU ACTIVE;

ALTER TABLE FACTURAS_COMPRA
ADD FACO_IMPBA T_MONTO;

ALTER TABLE FACTURAS_COMPRA
ADD FACO_IMPUP T_MONTO;

ALTER TABLE COTIZACION_PROVEEDOR
ADD COPR_IMPBA T_MONTO;

ALTER TABLE COTIZACION_PROVEEDOR
ADD COPR_IMPUP T_MONTO;

ALTER TABLE ORDENES_COMPRA
ADD ORDC_IMPBA T_MONTO;

ALTER TABLE ORDENES_COMPRA
ADD ORDC_IMPUP T_MONTO;

ALTER TABLE REMISION_PROVEEDOR
ADD REPR_IMPBA T_MONTO;

ALTER TABLE REMISION_PROVEEDOR
ADD REPR_IMPUP T_MONTO;

ALTER TABLE DEVOLUCIONES_COMPRAS
ADD DVCO_IMPBA T_MONTO;

ALTER TABLE DEVOLUCIONES_COMPRAS
ADD DVCO_IMPUP T_MONTO;

ALTER TABLE FACTURAS_COMPRAS_DETALLE
ADD FCDE_IMPBA T_MONTO;

ALTER TABLE FACTURAS_COMPRAS_DETALLE
ADD FCDE_IMPUPP T_PORCENTAJE;

ALTER TABLE FACTURAS_COMPRAS_DETALLE
ADD FCDE_IMPUP T_MONTO;

ALTER TABLE COTIZACIONES_PROVEEDOR_DET
ADD CPRD_IMPBA T_MONTO;

ALTER TABLE COTIZACIONES_PROVEEDOR_DET
ADD CPRD_IMPUPP T_PORCENTAJE;

ALTER TABLE COTIZACIONES_PROVEEDOR_DET
ADD CPRD_IMPUP T_MONTO;

ALTER TABLE ORDENES_COMPRA_DETALLE
ADD OCDE_IMPBA T_MONTO;

ALTER TABLE ORDENES_COMPRA_DETALLE
ADD OCDE_IMPUPP T_PORCENTAJE;

ALTER TABLE ORDENES_COMPRA_DETALLE
ADD OCDE_IMPUP T_MONTO;

ALTER TABLE REMISION_PROVEEDOR_DET
ADD RPVD_IMPBA T_MONTO;

ALTER TABLE REMISION_PROVEEDOR_DET
ADD RPVD_IMPUPP T_PORCENTAJE;

ALTER TABLE REMISION_PROVEEDOR_DET
ADD RPVD_IMPUP T_MONTO;

ALTER TABLE DEVOLUCIONES_COMPRAS_DET
ADD DVCD_IMPBA T_MONTO;

ALTER TABLE DEVOLUCIONES_COMPRAS_DET
ADD DVCD_IMPUPP T_PORCENTAJE;

ALTER TABLE DEVOLUCIONES_COMPRAS_DET
ADD DVCD_IMPUP T_MONTO;

SET TERM ^ ;

CREATE OR ALTER procedure IMPR_FACTCOMP (
    ID integer,
    BODINI varchar(2),
    BODFIN varchar(2))
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(15),
    COTIZACION varchar(30),
    NUMPROVCOT varchar(15),
    PEDIDO varchar(30),
    NUMPROVPED varchar(15),
    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),
    TOTIMPBA NUMERIC(18,2),
    TOTIMPUP NUMERIC(18,2),
    DTOFPORC numeric(9,2),
    DTOFMONTO numeric(18,2),
    FECHADTO date,
    TOTALFAC numeric(18,2),
    TOTCOSTONEG numeric(18,2),
    TOTALPAGAR numeric(18,2),
    CUDS varchar(100),
    OBS blob sub_type TEXT 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 TEXT segment size 80,
    STAND varchar(20),
    SERIALES varchar(4096),
    PRUNIT numeric(18,2),
    DTOITPORC numeric(9,2),
    DTOITMONTO numeric(18,2),
    DTOIT1 numeric(18,2),
    DTOIT2 numeric(18,2),
    DTOIT3 numeric(18,2),
    DTOIT1M numeric(18,2),
    DTOIT2M numeric(18,2),
    DTOIT3M numeric(18,2),
    PRNETO numeric(18,2),
    COSTONEG numeric(18,2),
    IVAPORC numeric(9,2),
    IVAITMONTO numeric(18,2),
    CONSUMO numeric(18,2),
    ITIMPBA NUMERIC(18,2),
    ITIMPUPP NUMERIC(9,2),
    ITIMPUPM NUMERIC(18,2),
    SUBTOTIT numeric(18,2),
    SUBTOTITCON numeric(18,2),
    TOTITCOSTONEG 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),
    DTOITEM1 numeric(18,2),
    DTOITEM2 numeric(18,2),
    DTOITEM3 numeric(18,2),
    TOTCONSUMO numeric(18,2),
    SUMAEX numeric(18,2),
    SUMAGR numeric(18,2),
    NUMITEMS integer,
    PAGTOTAL integer,
    UNDRESALTAR char(1))
as
declare variable IMPTOS CHAR(1);
declare variable TARIFA INTEGER;
declare variable SIMPLIFICA CHAR(1);
declare variable orden char(2);
DECLARE VARIABLE ITEMFOR INTEGER;
declare variable CONSOLIDA INTEGER;
declare variable FACTOR DOUBLE PRECISION;
declare variable REDON INTEGER;
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, FACO_DTO1IT, FACO_DTO2IT, FACO_DTO3IT, FACO_CONSOLIDA, FACO_NRONDE, FACO_IMPBA, FACO_IMPUP
    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, :dtoitem1, :dtoitem2, :dtoitem3, :CONSOLIDA, CUDS, :totimpba, :totimpup;
    
    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 - totimpba - totimpup;
  TOTALPAGAR = TOTALFAC - RTEFTEMONTO - RTEIVAMONTO - RTEICAMONTO - RTECREEM;
  SUMAEX = 0;
  SUMA1 = 0;
  SUMA2 = 0;
  SUMA3 = 0;
  IVA1 = 0;
  IVA2 = 0;
  IVA3 = 0;
  TOTCONSUMO = 0;

SELECT COUNT(FCDE_ITEM) from facturas_compras_detalle WHERE FACO_ID = :ID INTO :numitems;
SELECT FORM_NROITEMS FROM FORMATOS WHERE TIDO_COD = 21 AND PREF_PRE = :pref INTO :ITEMFOR;
if (ITEMFOR > 0) then
    pagtotal = CEIL(CAST(NUMITEMS AS DOUBLE PRECISION)/CAST(ITEMFOR AS DOUBLE PRECISION));
ELSE
    PAGTOTAL = 0;
NUMPROVPED = '';
if (CONSOLIDA <> 0) then
    BEGIN
    SELECT max(O.ordc_numprov) FROM consolidado_faltantes C, ordenes_compra O WHERE C.cofa_tipoori = 24 AND C.cofa_tipodes = 21 AND C.cofa_id = :consolida
        AND O.ordc_id = C.cofa_idori INTO :numprovped;
    SELECT max(P.copr_numprov) FROM consolidado_faltantes C, cotizacion_proveedor P WHERE C.cofa_tipoori = 25 AND C.cofa_tipodes = 21 AND C.cofa_id = :consolida
        AND P.copr_id = C.cofa_idori INTO :numprovcot;
    END

/* RECALCULE TOTALES PARA EL RANGO IMPRESO */
execute procedure lee_configuracion('COMPRAS', 'DOCUMENTOS', 'REDONDEO AL MULTIPLO DE DIEZ EN TOTALES') returning_values (:REDON);
if ((:TOTALFAC-:IVAMONTO+:dtomonto-:ADICIONAL) = 0) then
    FACTOR = 1;
else
    FACTOR = CAST(TOTALFAC-IVAMONTO-EXTRA AS DOUBLE PRECISION)/CAST(TOTALFAC - IVAMONTO - extra + :dtomonto - ADICIONAL AS DOUBLE PRECISION);

SELECT SUM(FCDE_IVAMONTO), SUM(FCDE_TOTAL) FROM facturas_compras_detalle
    WHERE FACO_ID = :ID AND BODE_COD >= :BODINI AND bode_cod <= :bodfin
    into :IVAMONTO, :TOTALFAC;
DTOMONTO = DTOPORC * (TOTALFAC - IVAMONTO) / 100;
EXECUTE PROCEDURE REDONDEE(DTOMONTO, :REDON) returning_values (DTOMONTO);

SELECT SUM(FCDE_IVAMONTO * :FACTOR), SUM(FCDE_TOTAL * :FACTOR) FROM facturas_compras_detalle
    WHERE FACO_ID = :ID AND BODE_COD >= :BODINI AND bode_cod <= :bodfin
    into :IVAMONTO, :TOTALFAC;
EXECUTE PROCEDURE REDONDEE(IVAMONTO, :REDON) returning_values (IVAMONTO);
EXECUTE PROCEDURE REDONDEE(TOTALFAC, :REDON) returning_values (TOTALFAC);
SUBTOTAL = TOTALFAC - IVAMONTO + DTOMONTO;
execute procedure lee_configuracion('COMPRAS', 'DOCUMENTOS', 'ORDENAR ITEMS POR BODEGA AL IMPRIMIR DOCUMENTOS') returning_values (:Orden);
item = 0;
totcostoneg = 0;
if (orden = 'NO') then
  BEGIN
  FOR SELECT 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,
    FCDE_DTO1, FCDE_DTO2, FCDE_DTO3, FCDE_DTOM1, FCDE_DTOM2, FCDE_DTOM3, FCDE_COSTONEG, FCDE_IMPBA, FCDE_IMPUP, FCDE_IMPUPP
    FROM FACTURAS_COMPRAS_DETALLE D, ARTICULO A
    WHERE D.ARTI_COD = A.ARTI_COD AND D.FACO_ID = :ID
    AND D.BODE_COD >= :BODINI AND D.bode_cod <= :bodfin
    ORDER BY FCDE_ITEM
    INTO :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,
    :dtoit1, :dtoit2, :dtoit3, :dtoit1m, :dtoit2m, :dtoit3m, :COSTONEG, :itimpba, :itimpupm, :itimpupp
    DO
      BEGIN
      if (DTOIT1 IS NULL) then
        DTOIT1 = 0;
      if (DTOIT2 IS NULL) then
        DTOIT2 = 0;
      if (DTOIT3 IS NULL) then
        DTOIT3 = 0;
      if (DTOIT1M IS NULL) then
        DTOIT1M = 0;
      if (DTOIT2M IS NULL) then
        DTOIT2M = 0;
      if (DTOIT3M IS NULL) then
        DTOIT3M = 0;
      ITEM = ITEM +1;
      select unar_resaltar from unidad_articulo where unar_unidad = :unidad and arti_cod = :articulo and unar_activa = 'S' into :undresaltar;
      if (UNDRESALTAR = 'S') then
        UNDRESALTAR = '*';
      ELSE
        UNDRESALTAR = '';
      PRNETO = PRUNIT - DTOITMONTO - DTOIT1M - DTOIT2M - DTOIT3M - ((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 - CONSUMO;
        IVA1 = IVA1 + IVAITMONTO;
        END
      if (TARIFA = 2) then
        BEGIN
        SUMA2 = SUMA2 + TOTAL - IVAITMONTO - CONSUMO;
        IVA2 = IVA2 + IVAITMONTO;
        END
      if (TARIFA = 3) then
        BEGIN
        SUMA3 = SUMA3 + TOTAL - IVAITMONTO - CONSUMO;
        IVA3 = IVA3 + IVAITMONTO;
        END
      SUMAGR = SUMA1 + SUMA2 + SUMA3;
      if (IMPTOS = 'N') then
        TOTAL = TOTAL - IVAITMONTO - CONSUMO;
      TOTITCOSTONEG = CANT * COSTONEG;
      totcostoneg = totcostoneg + totitcostoneg;
      SELECT STAND_COD FROM STANDS WHERE ARTI_COD = :ARTICULO AND STAND_BODEGA = :boditem INTO :stand;
      EXECUTE PROCEDURE seriales_item_documento(21, :ID, :ITEM) returning_values (:SERIALES);
      SUSPEND;
      END
  END
ELSE
  BEGIN
  FOR SELECT 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,
    FCDE_DTO1, FCDE_DTO2, FCDE_DTO3, FCDE_DTOM1, FCDE_DTOM2, FCDE_DTOM3, FCDE_COSTONEG, FCDE_IMPBA, FCDE_IMPUP, FCDE_IMPUPP
    FROM FACTURAS_COMPRAS_DETALLE D, ARTICULO A
    WHERE D.ARTI_COD = A.ARTI_COD AND D.FACO_ID = :ID
    AND D.BODE_COD >= :BODINI AND D.bode_cod <= :bodfin
    ORDER BY D.bode_cod, FCDE_ITEM
    INTO :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,
    :dtoit1, :dtoit2, :dtoit3, :dtoit1m, :dtoit2m, :dtoit3m, :costoneg, :itimpba, :itimpupm, :itimpupp
    DO
      BEGIN
      if (DTOIT1 IS NULL) then
        DTOIT1 = 0;
      if (DTOIT2 IS NULL) then
        DTOIT2 = 0;
      if (DTOIT3 IS NULL) then
        DTOIT3 = 0;
      if (DTOIT1M IS NULL) then
        DTOIT1M = 0;
      if (DTOIT2M IS NULL) then
        DTOIT2M = 0;
      if (DTOIT3M IS NULL) then
        DTOIT3M = 0;
      ITEM = ITEM +1;
      select unar_resaltar from unidad_articulo where unar_unidad = :unidad and arti_cod = :articulo and unar_activa = 'S' into :undresaltar;
      if (UNDRESALTAR = 'S') then
        UNDRESALTAR = '*';
      ELSE
        UNDRESALTAR = '';
      PRNETO = PRUNIT - DTOITMONTO - DTOIT1M - DTOIT2M - DTOIT3M - ((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 - CONSUMO;
        IVA1 = IVA1 + IVAITMONTO;
        END
      if (TARIFA = 2) then
        BEGIN
        SUMA2 = SUMA2 + TOTAL - IVAITMONTO - CONSUMO;
        IVA2 = IVA2 + IVAITMONTO;
        END
      if (TARIFA = 3) then
        BEGIN
        SUMA3 = SUMA3 + TOTAL - IVAITMONTO - CONSUMO;
        IVA3 = IVA3 + IVAITMONTO;
        END
      SUMAGR = SUMA1 + SUMA2 + SUMA3;
      if (IMPTOS = 'N') then
        TOTAL = TOTAL - IVAITMONTO - CONSUMO;
      TOTITCOSTONEG = CANT * COSTONEG;
      totcostoneg = totcostoneg + totitcostoneg;
      SELECT STAND_COD FROM STANDS WHERE ARTI_COD = :ARTICULO AND STAND_BODEGA = :boditem INTO :stand;
      EXECUTE PROCEDURE seriales_item_documento(21, :ID, :ITEM) returning_values (:SERIALES);
      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(15),
    COTIZACION varchar(30),
    NUMPROVCOT varchar(15),
    PEDIDO varchar(30),
    NUMPROVPED varchar(15),
    SUBTOTAL numeric(18,2),
    DTOPORC numeric(9,2),
    DTOMONTO numeric(18,2),
    ADICIONAL numeric(18,2),
    IVAMONTO numeric(18,2),
    EXTRA numeric(18,2),
    TOTIMPBA NUMERIC(18,2),
    TOTIMPUP NUMERIC(18,2),
    TOTCOSTONEG numeric(18,2),
    TOTALFAC numeric(18,2),
    OBS blob sub_type TEXT 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),
    SERIALES varchar(4096),
    PRUNIT numeric(18,2),
    DTOITPORC numeric(9,2),
    DTOITMONTO numeric(18,2),
    PRNETO numeric(18,2),
    COSTONEG numeric(18,2),
    IVAPORC numeric(9,2),
    IVAITMONTO numeric(18,2),
    CONSUMO numeric(18,2),
    ITIMPBA NUMERIC(18,2),
    ITIMPUPP NUMERIC(18,2),
    ITIMPUPM NUMERIC(18,2),
    TOTITCOSTONEG numeric(18,2),
    TOTAL numeric(18,2),
    OBSITEM blob sub_type TEXT 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),
    NUMITEMS integer,
    PAGTOTAL integer,
    UNDRESALTAR char(1))
as
declare variable IMPTOS CHAR(1);
declare variable TARIFA INTEGER;
declare variable orden char(2);
DECLARE VARIABLE ITEMFOR INTEGER;
declare variable CONSOLIDA INTEGER;
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, REPR_CONSOLIDA, repr_impba, repr_impup
    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, :consolida, :totimpba, :totimpup;
    
  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 - totimpba - totimpup;
  SUMAEX = 0;
  SUMA1 = 0;
  SUMA2 = 0;
  SUMA3 = 0;
  IVA1 = 0;
  IVA2 = 0;
  IVA3 = 0;

SELECT COUNT(RPVD_ITEM) from remision_proveedor_det WHERE REPR_ID = :ID INTO :numitems;
SELECT FORM_NROITEMS FROM FORMATOS WHERE TIDO_COD = 22 AND PREF_PRE = :pref INTO :ITEMFOR;
if (ITEMFOR > 0) then
    pagtotal = CEIL(CAST(NUMITEMS AS DOUBLE PRECISION)/CAST(ITEMFOR AS DOUBLE PRECISION));
ELSE
    PAGTOTAL = 0;

NUMPROVPED = '';
if (CONSOLIDA <> 0) then
    BEGIN
    SELECT O.ordc_numprov FROM consolidado_faltantes C, ordenes_compra O WHERE C.cofa_tipoori = 24 AND C.cofa_tipodes = 22 AND C.cofa_id = :consolida
        AND O.ordc_id = C.cofa_idori INTO :numprovped;
    SELECT P.copr_numprov FROM consolidado_faltantes C, cotizacion_proveedor P WHERE C.cofa_tipoori = 25 AND C.cofa_tipodes = 22 AND C.cofa_id = :consolida
        AND P.copr_id = C.cofa_idori INTO :numprovcot;
    END
execute procedure lee_configuracion('COMPRAS', 'DOCUMENTOS', 'ORDENAR ITEMS POR BODEGA AL IMPRIMIR DOCUMENTOS') returning_values (:Orden);
ITEM = 0;
totcostoneg = 0;
if (orden = 'NO') then
  BEGIN
  FOR SELECT 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, RPVD_COSTONEG, RPVD_IMPBA, RPVD_IMPUP, RPVD_IMPUPP
    FROM REMISION_PROVEEDOR_DET D, ARTICULO A
    WHERE D.ARTI_COD = A.ARTI_COD AND D.REPR_ID = :ID
    ORDER BY RPVD_ITEM
    INTO :ARTICULO, :CODBAR, :ARTIDES, :CANT, :UNIDAD, :BODITEM, :LOTE, :PRUNIT,
    :DTOITPORC, :DTOITMONTO, :IVAPORC, :IVAITMONTO, :CONSUMO, :TOTAL, :OBSITEM,
    :GRUPO, :SUBGRUPO, :MARCA, :PESO, :ANCHO, :ALTO, :LARGO, :TARIFA, :ARTIPROV, :costoneg, :itimpba, :itimpupm, :itimpupp
    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
      ITEM = ITEM + 1;
      select unar_resaltar from unidad_articulo where unar_unidad = :unidad and arti_cod = :articulo and unar_activa = 'S' into :undresaltar;
      if (UNDRESALTAR = 'S') then
        UNDRESALTAR = '*';
      ELSE
        UNDRESALTAR = '';
      SUMAGR = SUMA1 + SUMA2 + SUMA3;
      if (IMPTOS = 'N') then
        TOTAL = TOTAL - IVAITMONTO;
      TOTITCOSTONEG = CANT * COSTONEG;
      totcostoneg = totcostoneg + totitcostoneg;
      SELECT STAND_COD FROM STANDS WHERE ARTI_COD = :ARTICULO AND STAND_BODEGA = :boditem INTO :stand;
      EXECUTE PROCEDURE seriales_item_documento(22, :ID, :ITEM) returning_values (:SERIALES);
      SUSPEND;
      END
  END
ELSE
  BEGIN
  FOR SELECT 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, RPVD_COSTONEG, RPVD_IMPBA, RPVD_IMPUP, RPVD_IMPUPP
    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 :ARTICULO, :CODBAR, :ARTIDES, :CANT, :UNIDAD, :BODITEM, :LOTE, :PRUNIT,
    :DTOITPORC, :DTOITMONTO, :IVAPORC, :IVAITMONTO, :CONSUMO, :TOTAL, :OBSITEM,
    :GRUPO, :SUBGRUPO, :MARCA, :PESO, :ANCHO, :ALTO, :LARGO, :TARIFA, :ARTIPROV, :costoneg, :itimpba, :itimpupm, :itimpupp
    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
      ITEM = ITEM + 1;
      select unar_resaltar from unidad_articulo where unar_unidad = :unidad and arti_cod = :articulo and unar_activa = 'S' into :undresaltar;
      if (UNDRESALTAR = 'S') then
        UNDRESALTAR = '*';
      ELSE
        UNDRESALTAR = '';
      SUMAGR = SUMA1 + SUMA2 + SUMA3;
      if (IMPTOS = 'N') then
        TOTAL = TOTAL - IVAITMONTO;
      TOTITCOSTONEG = CANT * COSTONEG;
      totcostoneg = totcostoneg + totitcostoneg;
      SELECT STAND_COD FROM STANDS WHERE ARTI_COD = :ARTICULO AND STAND_BODEGA = :boditem INTO :stand;
      EXECUTE PROCEDURE seriales_item_documento(22, :ID, :ITEM) returning_values (:SERIALES);
      SUSPEND;
      END
  END
END^

SET TERM ; ^

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),
    NUMPROV varchar(12),
    SUBTOTAL numeric(18,2),
    DTOPORC numeric(9,2),
    DTOMONTO numeric(18,2),
    ADICIONAL numeric(18,2),
    IVAMONTO numeric(18,2),
    TOTIMPBA NUMERIC(18,2),
    TOTIMPUP 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),
    TOTCOSTONEG numeric(18,2),
    OBS blob sub_type TEXT 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),
    DTOIT1 numeric(18,2),
    DTOIT2 numeric(18,2),
    DTOIT3 numeric(18,2),
    DTOIT1M numeric(18,2),
    DTOIT2M numeric(18,2),
    DTOIT3M numeric(18,2),
    PRNETO numeric(18,2),
    COSTONEG numeric(18,2),
    IVAPORC numeric(9,2),
    IVAITMONTO numeric(18,2),
    CONSUMO numeric(18,2),
    ITIMPBA NUMERIC(18,2),
    ITIMPUPP NUMERIC(18,2),
    ITIMPUPM NUMERIC(18,2),
    TOTAL numeric(18,2),
    TOTITCOSTONEG numeric(18,2),
    TOTALPAGAR numeric(18,2),
    OBSITEM blob sub_type TEXT segment size 80,
    CODIGOPR varchar(20),
    ZONACOD varchar(2),
    ZONANOM varchar(60),
    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),
    PESOTOT numeric(18,4),
    VOLUMUNIT numeric(18,4),
    VOLUMTOT 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),
    DTOITEM1 numeric(18,2),
    DTOITEM2 numeric(18,2),
    DTOITEM3 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),
    NUMITEMS integer,
    PAGTOTAL integer,
    UNDRESALTAR char(1))
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);
DECLARE VARIABLE ITEMFOR INTEGER;
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, ORDC_DTO1IT, ORDC_DTO2IT, ORDC_DTO3IT, ORDC_NUMPROV, ORDC_IMPBA, ORDC_IMPUP
    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, :dtoitem1, :dtoitem2, :dtoitem3, :numprov, :TOTIMPBA, :TOTIMPUP;
    
  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 - totimpba - totimpup;
  TOTALPAGAR = TOTALFAC - RTEFTEMONTO - RTEIVAMONTO - RTEICAMONTO - RTECREEM;
  SUMAEX = 0;
  SUMA1 = 0;
  SUMA2 = 0;
  SUMA3 = 0;
  IVA1 = 0;
  IVA2 = 0;
  IVA3 = 0;
  PESOTOT = 0;
  VOLUMTOT = 0;

SELECT COUNT(OCDE_ITEM) from ordenes_compra_detalle WHERE ORDC_ID = :ID INTO :numitems;
SELECT FORM_NROITEMS FROM FORMATOS WHERE TIDO_COD = 23 AND PREF_PRE = :pref INTO :ITEMFOR;
if (ITEMFOR > 0) then
    pagtotal = CEIL(CAST(NUMITEMS AS DOUBLE PRECISION)/CAST(ITEMFOR AS DOUBLE PRECISION));
ELSE
    PAGTOTAL = 0;
totcostoneg = 0;
execute procedure lee_configuracion('COMPRAS', 'DOCUMENTOS', 'ORDENAR ITEMS POR BODEGA AL IMPRIMIR DOCUMENTOS') returning_values (:Orden);
if (orden = 'NO') then
  BEGIN
  ITEM = 0;
  FOR SELECT 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, TAIV_COD, OCDE_CODPROV,
    (ARTI_PESO / 1000 * OCDE_CANT * OCDE_FACTOR), (ARTI_LARGO / 100 * OCDE_FACTOR), (ARTI_ANCHO / 100 * OCDE_FACTOR), (ARTI_ALTO / 100 * OCDE_FACTOR),
    OCDE_DTO1, OCDE_DTO2, OCDE_DTO3, OCDE_DTOM1, OCDE_DTOM2, OCDE_DTOM3, OCDE_COSTONEG, OCDE_IMPBA, OCDE_IMPUP, OCDE_IMPUPP
    FROM ORDENES_COMPRA_DETALLE D, ARTICULO A
    WHERE D.ARTI_COD = A.ARTI_COD AND D.ORDC_ID = :ID
    ORDER BY OCDE_ITEM
    INTO :ARTICULO, :CODBAR, :ARTIDES, :CANT, :UNIDAD, :BODITEM, :PRUNIT,
    :DTOITPORC, :DTOITMONTO, :IVAPORC, :IVAITMONTO, :CONSUMO, :TOTAL, :OBSITEM,
    :GRUPO, :SUBGRUPO, :MARCA, :TARIFA, :ARTIPROV,
    :PESO, :LARGO, :ANCHO, :ALTO,
    :dtoit1, :dtoit2, :dtoit3, :dtoit1m, :dtoit2m, :dtoit3m, :costoneg, :ITIMPBA, :itimpupm, :itimpupp
    DO
      BEGIN
      if (DTOIT1 IS NULL) then
        DTOIT1 = 0;
      if (DTOIT2 IS NULL) then
        DTOIT2 = 0;
      if (DTOIT3 IS NULL) then
        DTOIT3 = 0;
      if (DTOIT1M IS NULL) then
        DTOIT1M = 0;
      if (DTOIT2M IS NULL) then
        DTOIT2M = 0;
      if (DTOIT3M IS NULL) then
        DTOIT3M = 0;
      ITEM = ITEM + 1;
      select unar_resaltar from unidad_articulo where unar_unidad = :unidad and arti_cod = :articulo and unar_activa = 'S' into :undresaltar;
      if (UNDRESALTAR = 'S') then
        UNDRESALTAR = '*';
      ELSE
        UNDRESALTAR = '';
      PRNETO = 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;
      if (IMPTOS = 'N') then
        TOTAL = TOTAL - IVAITMONTO;
      if (PESO IS NULL) then
        PESO = 0;
      PESOTOT = PESOTOT + PESO;
      VOLUMUNIT = ANCHO * ALTO * LARGO;
      volumunit = VOLUMUNIT * CANT;
      if (VOLUMUNIT IS NULL) then
        VOLUMUNIT = 0;
      VOLUMTOT = VOLUMTOT + VOLUMUNIT;
      TOTITCOSTONEG = CANT * COSTONEG;
      TOTCOSTONEG = TOTCOSTONEG + TOTITCOSTONEG;
      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, TAIV_COD, OCDE_CODPROV,
        (ARTI_PESO / 1000 * OCDE_CANT * OCDE_FACTOR), (ARTI_LARGO / 100 * OCDE_FACTOR), (ARTI_ANCHO / 100 * OCDE_FACTOR), (ARTI_ALTO / 100 * OCDE_FACTOR),
        OCDE_DTO1, OCDE_DTO2, OCDE_DTO3, OCDE_DTOM1, OCDE_DTOM2, OCDE_DTOM3, OCDE_COSTONEG, OCDE_IMPBA, OCDE_IMPUP, OCDE_IMPUPP
        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, :TARIFA, :ARTIPROV,
        :PESO, :LARGO, :ANCHO, :ALTO,
        :dtoit1, :dtoit2, :dtoit3, :dtoit1m, :dtoit2m, :dtoit3m, :costoneg, :ITIMPBA, :itimpupm, :itimpupp
        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;
        if (DTOIT1 IS NULL) then
            DTOIT1 = 0;
        if (DTOIT2 IS NULL) then
            DTOIT2 = 0;
        if (DTOIT3 IS NULL) then
            DTOIT3 = 0;
        if (DTOIT1M IS NULL) then
            DTOIT1M = 0;
        if (DTOIT2M IS NULL) then
            DTOIT2M = 0;
        if (DTOIT3M IS NULL) then
            DTOIT3M = 0;
        PRNETO = PRUNIT - DTOITMONTO - DTOIT1M - DTOIT2M - DTOIT3M;
        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;
        if (PESO IS NULL) then
            PESO = 0;
        PESOTOT = PESOTOT + PESO;
        VOLUMUNIT = ANCHO * ALTO * LARGO;
        volumunit = VOLUMUNIT * CANT;
        if (VOLUMUNIT IS NULL) then
          VOLUMUNIT = 0;
        VOLUMTOT = VOLUMTOT + VOLUMUNIT;
        TOTITCOSTONEG = CANT * COSTONEG;
        TOTCOSTONEG = TOTCOSTONEG + TOTITCOSTONEG;
        end
    if (CANT <> 0) then
        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),
    RESIDENTE char(1),
    NOMTERCERO varchar(60),
    CODBODEGA varchar(2),
    NOMBODEGA varchar(30),
    FACTURA varchar(30),
    FECHAFAC date,
    NUMPROV varchar(30),
    SUBTOTAL numeric(18,2),
    DTOPORC numeric(9,2),
    DTOMONTO numeric(18,2),
    ADICIONAL numeric(18,2),
    IVAMONTO numeric(18,2),
    TOTIMPBA NUMERIC(18,2),
    TOTIMPUP 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 TEXT segment size 80,
    ITEM integer,
    ARTICULO varchar(15),
    CODBAR varchar(15),
    ARTIDES varchar(60),
    CANT numeric(18,4),
    UNIDAD varchar(8),
    LOTE varchar(15),
    SERIALES varchar(4096),
    BODITEM varchar(2),
    PRUNIT numeric(18,2),
    DTOITPORC numeric(9,2),
    DTOITMONTO numeric(18,2),
    PRSINIVA numeric(18,2),
    PRNETO numeric(18,2),
    IVAPORC numeric(9,2),
    IVAITMONTO numeric(18,2),
    CONSUMO numeric(18,2),
    ITIMPBA NUMERIC(18,2),
    ITIMPUPP NUMERIC(18,2),
    ITIMPUPM NUMERIC(18,2),
    TOTAL numeric(18,2),
    OBSITEM blob sub_type TEXT segment size 80,
    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),
    CUDSFAC varchar(100),
    CUDS varchar(100),
    NUMITEMS integer,
    PAGTOTAL integer,
    UNDRESALTAR char(1))
as
declare variable IMPTOS CHAR(1);
declare variable TARIFA INTEGER;
declare variable orden char(2);
declare variable IDFACT INTEGER;
DECLARE VARIABLE ITEMFOR 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, dvco_cuds, DVCO_IMPBA, DVCO_IMPUP
    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, :CUDS, :TOTIMPBA, :TOTIMPUP;
    
  SELECT PROV_COD, P.GRPR_COD, GRPR_NOM, P.prov_residente
    FROM PROVEEDORES P, GRUPOS_PROVEEDORES G
    WHERE TERC_NIT = :NIT AND G.GRPR_COD = P.GRPR_COD
    INTO :CODIGOPR, :ZONACOD, :ZONANOM, :residente;
  SELECT FACO_NUMPROV, FACO_NRONDE, FACO_FECHA FROM FACTURAS_COMPRA WHERE FACO_ID = :idfact INTO :numprov, :cudsfac, :FECHAFAC;
  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;

SELECT COUNT(DVCD_ITEM) from devoluciones_compras_det WHERE DVCO_ID = :ID INTO :numitems;
SELECT FORM_NROITEMS FROM FORMATOS WHERE TIDO_COD = 24 AND PREF_PRE = :pref INTO :ITEMFOR;
if (ITEMFOR > 0) then
    pagtotal = CEIL(CAST(NUMITEMS AS DOUBLE PRECISION)/CAST(ITEMFOR AS DOUBLE PRECISION));
ELSE
    PAGTOTAL = 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, DVCD_LOTE,
    GRUP_COD, SUBG_COD, MARC_COD, ARTI_PESO, ARTI_ANCHO, ARTI_ALTO, ARTI_LARGO, TAIV_COD, DVCD_IMPBA, DVCD_IMPUP, DVCD_IMPUPP
    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, :LOTE,
    :GRUPO, :SUBGRUPO, :MARCA, :PESO, :ANCHO, :ALTO, :LARGO, :TARIFA, :ITIMPBA, :itimpupm, :itimpupp
    DO
      BEGIN
      ITEM = ITEM + 1;
      select unar_resaltar from unidad_articulo where unar_unidad = :unidad and arti_cod = :articulo and unar_activa = 'S' into :undresaltar;
      if (UNDRESALTAR = 'S') then
        UNDRESALTAR = '*';
      ELSE
        UNDRESALTAR = '';
      PRNETO = PRUNIT - DTOITMONTO - ((IVAITMONTO+CONSUMO) / CANT);
      if ((IMPTOS = 'N') or (ivaporc = 0)) then
        PRSINIVA = prunit;
      ELSE
        PRSINIVA = ((PRUNIT - IIF(CANT <> 0,(CONSUMO/CANT), 0)) * 100) / (100 + IVAPORC);
      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;
      EXECUTE PROCEDURE seriales_item_documento(24, :ID, :ITEM) returning_values (:SERIALES);
      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, DVCD_LOTE,
    GRUP_COD, SUBG_COD, MARC_COD, ARTI_PESO, ARTI_ANCHO, ARTI_ALTO, ARTI_LARGO, TAIV_COD, DVCD_IMPBA, DVCD_IMPUP, DVCD_IMPUPP
    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, :lote,
    :GRUPO, :SUBGRUPO, :MARCA, :PESO, :ANCHO, :ALTO, :LARGO, :TARIFA, :ITIMPBA, :itimpupm, :itimpupp
    DO
      BEGIN
      ITEM = ITEM + 1;
      select unar_resaltar from unidad_articulo where unar_unidad = :unidad and arti_cod = :articulo and unar_activa = 'S' into :undresaltar;
      if (UNDRESALTAR = 'S') then
        UNDRESALTAR = '*';
      ELSE
        UNDRESALTAR = '';
      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;
      EXECUTE PROCEDURE seriales_item_documento(24, :ID, :ITEM) returning_values (:SERIALES);
      SUSPEND;
      END
  END
END^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER procedure IMPUESTOS_COMPRAS (
    FECINI date,
    FECFIN date,
    PREFIJO varchar(4),
    ANULADOS char(1))
returns (
    TIPO integer,
    NOMTIPO varchar(30),
    PREF varchar(4),
    NUMERO varchar(8),
    FECHA date,
    NIT varchar(20),
    NUMPROV varchar(15),
    NOMTERCERO varchar(60),
    SUBTOTAL numeric(18,2),
    DTOMONTO numeric(18,2),
    ADICIONAL numeric(18,2),
    IVAMONTO numeric(18,2),
    CONSUMO numeric(18,2),
    IMPBA NUMERIC(18,2),
    IMPUP NUMERIC(18,2),
    EXENTOS numeric(18,2),
    IVA1 numeric(18,2),
    IVA2 numeric(18,2),
    IVA3 numeric(18,2),
    IVA4 numeric(18,2),
    IVA5 numeric(18,2),
    IVA6 numeric(18,2),
    IVA7 numeric(18,2),
    IVA8 numeric(18,2),
    GRAVADOS1 numeric(18,2),
    GRAVADOS2 numeric(18,2),
    GRAVADOS3 numeric(18,2),
    GRAVADOS4 numeric(18,2),
    GRAVADOS5 numeric(18,2),
    GRAVADOS6 numeric(18,2),
    GRAVADOS7 numeric(18,2),
    GRAVADOS8 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 FACTOR DOUBLE PRECISION;
declare variable dtobase CHAR(2);
declare variable FECCMP VARCHAR(8);
BEGIN
EXECUTE PROCEDURE lee_configuracion('COMPRAS', 'DOCUMENTOS', 'APLICAR DESCUENTOS Y VALORES ADICIONALES EN BASES DE REPORTE DE IMPUESTOS EN COMPRAS') returning_values (DTOBASE);
EXECUTE PROCEDURE lee_configuracion('COMPRAS', 'FACTURAS', 'REPORTE DE IMPUESTOS EN COMPRAS CON FECHA FACTURA O FECHA REGISTRO') returning_values (FECCMP);
/* FACTURA */
TIPO = 21;
SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 21 INTO :NOMTIPO;

FOR SELECT FACO_ID, PREF_PRE, FACO_NUMERO, IIF(:FECCMP = 'REGISTRO', FACO_FECHA, FACO_FECDOC), TERC_NIT, FACO_ADICIONAL-FACO_DTOMONTO, FACO_IVAMONTO, FACO_RTFTEMONTO,
    FACO_RTIVAMONTO, FACO_RTICAMONTO, FACO_RTCREEM, FACO_EXTRA, FACO_TOTAL, FACO_ANULADO, FACO_NUMPROV, FACO_EXENTO, FACO_IMPBA, FACO_IMPUP
    FROM FACTURAS_COMPRA
    WHERE FACO_FECHA >= :FECINI AND FACO_FECHA <= :FECFIN ORDER BY FACO_FECHA, PREF_PRE, FACO_NUMERO
    INTO :ID, :PREF, :NUMERO, :FECHA, :NIT, :DTOMONTO, :IVAMONTO, :RTFTEMONTO,
    :RTIVAMONTO, :RTICAMONTO, :RTCREEMONTO, :EXTRA, :TOTAL, :ANULADO, :numprov, :TER_EXENTO, :IMPBA, :IMPUP
    DO
    BEGIN
    SELECT TERC_NOM FROM TERCEROS WHERE TERC_NIT = :NIT INTO :NOMTERCERO;
    if ((PREFIJO = '') or (PREFIJO IS NULL) or (PREF = PREFIJO)) then
        if ((ANULADOS = 'S') or (ANULADO = 'N')) then
            BEGIN
            if (ANULADO = 'S') then
              BEGIN
              EXENTOS = 0;
              IMPBA = 0;
              IMPUP = 0;
              GRAVADOS1 = 0;
              GRAVADOS2 = 0;
              GRAVADOS3 = 0;
              GRAVADOS4 = 0;
              GRAVADOS5 = 0;
              GRAVADOS6 = 0;
              GRAVADOS7 = 0;
              GRAVADOS8 = 0;
              IVA1 = 0;
              IVA2 = 0;
              IVA3 = 0;
              IVA4 = 0;
              IVA5 = 0;
              IVA6 = 0;
              IVA7 = 0;
              IVA8 = 0;
              SUBTOTAL = 0;
              TOTAL = 0;
              EXTRA = 0;
              IVAMONTO = 0;
              DTOMONTO = 0;
              NETO = 0;
              RTFTEMONTO = 0;
              RTIVAMONTO = 0;
              RTICAMONTO = 0;
              RTCREEMONTO = 0;
              CONSUMO = 0;
              END
            ELSE
              BEGIN
              if (DTOBASE = 'NO') then
                  FACTOR = 1;
              else
                  if ((TOTAL-IVAMONTO-DTOMONTO) = 0) then
                    FACTOR = 1;
                  else
                    FACTOR = cast(TOTAL-IVAMONTO+DTOMONTO as double precision)/cast(TOTAL-IVAMONTO as double precision);

              if (TER_EXENTO = 'S') then
                BEGIN
                SELECT SUM(FCDE_TOTAL - FCDE_IVAMONTO - FCDE_CONSUMO)*:FACTOR FROM FACTURAS_COMPRAS_DETALLE D WHERE FACO_ID = :ID AND FCDE_IVAMONTO = 0 INTO :EXENTOS;
                SELECT SUM(FCDE_TOTAL - FCDE_IVAMONTO - FCDE_CONSUMO)*:FACTOR, SUM(FCDE_IVAMONTO)*:FACTOR FROM FACTURAS_COMPRAS_DETALLE D WHERE FACO_ID = :ID AND FCDE_TIVA = 1 AND FCDE_IVAMONTO <> 0 INTO :GRAVADOS1, :IVA1;
                SELECT SUM(FCDE_TOTAL - FCDE_IVAMONTO - FCDE_CONSUMO)*:FACTOR, SUM(FCDE_IVAMONTO)*:FACTOR FROM FACTURAS_COMPRAS_DETALLE D WHERE FACO_ID = :ID AND FCDE_TIVA = 2 AND FCDE_IVAMONTO <> 0 INTO :GRAVADOS2, :IVA2;
                SELECT SUM(FCDE_TOTAL - FCDE_IVAMONTO - FCDE_CONSUMO)*:FACTOR, SUM(FCDE_IVAMONTO)*:FACTOR FROM FACTURAS_COMPRAS_DETALLE D WHERE FACO_ID = :ID AND FCDE_TIVA = 3 AND FCDE_IVAMONTO <> 0 INTO :GRAVADOS3, :IVA3;
                SELECT SUM(FCDE_TOTAL - FCDE_IVAMONTO - FCDE_CONSUMO)*:FACTOR, SUM(FCDE_IVAMONTO)*:FACTOR FROM FACTURAS_COMPRAS_DETALLE D WHERE FACO_ID = :ID AND FCDE_TIVA = 4 AND FCDE_IVAMONTO <> 0 INTO :GRAVADOS4, :IVA4;
                SELECT SUM(FCDE_TOTAL - FCDE_IVAMONTO - FCDE_CONSUMO)*:FACTOR, SUM(FCDE_IVAMONTO)*:FACTOR FROM FACTURAS_COMPRAS_DETALLE D WHERE FACO_ID = :ID AND FCDE_TIVA = 5 AND FCDE_IVAMONTO <> 0 INTO :GRAVADOS5, :IVA5;
                SELECT SUM(FCDE_TOTAL - FCDE_IVAMONTO - FCDE_CONSUMO)*:FACTOR, SUM(FCDE_IVAMONTO)*:FACTOR FROM FACTURAS_COMPRAS_DETALLE D WHERE FACO_ID = :ID AND FCDE_TIVA = 6 AND FCDE_IVAMONTO <> 0 INTO :GRAVADOS6, :IVA6;
                SELECT SUM(FCDE_TOTAL - FCDE_IVAMONTO - FCDE_CONSUMO)*:FACTOR, SUM(FCDE_IVAMONTO)*:FACTOR FROM FACTURAS_COMPRAS_DETALLE D WHERE FACO_ID = :ID AND FCDE_TIVA = 7 AND FCDE_IVAMONTO <> 0 INTO :GRAVADOS7, :IVA7;
                SELECT SUM(FCDE_TOTAL - FCDE_IVAMONTO - FCDE_CONSUMO)*:FACTOR, SUM(FCDE_IVAMONTO)*:FACTOR FROM FACTURAS_COMPRAS_DETALLE D WHERE FACO_ID = :ID AND FCDE_TIVA = 8 AND FCDE_IVAMONTO <> 0 INTO :GRAVADOS8, :IVA8;
                end
              else
                begin
                SELECT SUM(FCDE_TOTAL - FCDE_IVAMONTO - FCDE_CONSUMO)*:FACTOR FROM FACTURAS_COMPRAS_DETALLE D WHERE FACO_ID = :ID AND FCDE_TIVA = 0 INTO :EXENTOS;
                SELECT SUM(FCDE_TOTAL - FCDE_IVAMONTO - FCDE_CONSUMO)*:FACTOR, SUM(FCDE_IVAMONTO)*:FACTOR FROM FACTURAS_COMPRAS_DETALLE D WHERE FACO_ID = :ID AND FCDE_TIVA = 1 INTO :GRAVADOS1, :IVA1;
                SELECT SUM(FCDE_TOTAL - FCDE_IVAMONTO - FCDE_CONSUMO)*:FACTOR, SUM(FCDE_IVAMONTO)*:FACTOR FROM FACTURAS_COMPRAS_DETALLE D WHERE FACO_ID = :ID AND FCDE_TIVA = 2 INTO :GRAVADOS2, :IVA2;
                SELECT SUM(FCDE_TOTAL - FCDE_IVAMONTO - FCDE_CONSUMO)*:FACTOR, SUM(FCDE_IVAMONTO)*:FACTOR FROM FACTURAS_COMPRAS_DETALLE D WHERE FACO_ID = :ID AND FCDE_TIVA = 3 INTO :GRAVADOS3, :IVA3;
                SELECT SUM(FCDE_TOTAL - FCDE_IVAMONTO - FCDE_CONSUMO)*:FACTOR, SUM(FCDE_IVAMONTO)*:FACTOR FROM FACTURAS_COMPRAS_DETALLE D WHERE FACO_ID = :ID AND FCDE_TIVA = 4 INTO :GRAVADOS4, :IVA4;
                SELECT SUM(FCDE_TOTAL - FCDE_IVAMONTO - FCDE_CONSUMO)*:FACTOR, SUM(FCDE_IVAMONTO)*:FACTOR FROM FACTURAS_COMPRAS_DETALLE D WHERE FACO_ID = :ID AND FCDE_TIVA = 5 INTO :GRAVADOS5, :IVA5;
                SELECT SUM(FCDE_TOTAL - FCDE_IVAMONTO - FCDE_CONSUMO)*:FACTOR, SUM(FCDE_IVAMONTO)*:FACTOR FROM FACTURAS_COMPRAS_DETALLE D WHERE FACO_ID = :ID AND FCDE_TIVA = 6 INTO :GRAVADOS6, :IVA6;
                SELECT SUM(FCDE_TOTAL - FCDE_IVAMONTO - FCDE_CONSUMO)*:FACTOR, SUM(FCDE_IVAMONTO)*:FACTOR FROM FACTURAS_COMPRAS_DETALLE D WHERE FACO_ID = :ID AND FCDE_TIVA = 7 INTO :GRAVADOS7, :IVA7;
                SELECT SUM(FCDE_TOTAL - FCDE_IVAMONTO - FCDE_CONSUMO)*:FACTOR, SUM(FCDE_IVAMONTO)*:FACTOR FROM FACTURAS_COMPRAS_DETALLE D WHERE FACO_ID = :ID AND FCDE_TIVA = 8 INTO :GRAVADOS8, :IVA8;
                end
              SELECT SUM(FCDE_CONSUMO) FROM FACTURAS_COMPRAS_DETALLE WHERE FACO_ID = :ID INTO :CONSUMO;
              SUBTOTAL = TOTAL - EXTRA - IVAMONTO - DTOMONTO;
              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 (gravados6 is null) then
                gravados6 = 0;
            if (gravados7 is null) then
                gravados7 = 0;
            if (gravados8 is null) then
                gravados8 = 0;
            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 (iva6 is null) then
                iva6 = 0;
            if (iva7 is null) then
                iva7 = 0;
            if (iva8 is null) then
                iva8 = 0;
            if (consumo is null) then
                consumo = 0;
            EXECUTE PROCEDURE ORDENE_TARIFAS(gravados1, gravados2, gravados3, gravados4, gravados5, gravados6, gravados7, gravados8, IVA1, IVA2, IVA3, IVA4, IVA5, iva6, IVA7, IVA8)
                returning_values (gravados1, gravados2, gravados3, gravados4, gravados5, gravados6, gravados7, gravados8, IVA1, IVA2, IVA3, IVA4, IVA5, iva6, IVA7, IVA8);
            SUSPEND;
            END
    END
    
TIPO = 24;
SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 24 INTO :NOMTIPO;
/* DEVOLUCIONES */
FOR SELECT DVCO_ID, PREF_PRE, DVCO_NUMERO, DVCO_FECHA, D.TERC_NIT, DVCO_ADICIONAL-DVCO_DTOMONTO, DVCO_IVAMONTO, DVCO_RTFTEMONTO,
    DVCO_RTIVAMONTO, DVCO_RTICAMONTO, DVCO_RTCREEM, DVCO_EXTRA, DVCO_TOTAL, DVCO_ANULADO, '', DVCO_EXENTO, DVCO_IMPBA, DVCO_IMPUP
    FROM DEVOLUCIONES_COMPRAS D, movimiento_proveedor M
    WHERE DVCO_FECHA >= :FECINI AND DVCO_FECHA <= :FECFIN AND M.mvpr_tiporef = 24 AND M.mvpr_idref = D.dvco_id
    ORDER BY DVCO_FECHA, PREF_PRE, DVCO_NUMERO
    INTO :ID, :PREF, :NUMERO, :FECHA, :NIT, :DTOMONTO, :IVAMONTO, :RTFTEMONTO,
    :RTIVAMONTO, :RTICAMONTO, :RTCREEMONTO, :EXTRA, :TOTAL, :ANULADO, :numprov, :TER_EXENTO, :IMPBA, :IMPUP
    DO
    BEGIN
    if ((PREFIJO = '') or (PREFIJO IS NULL) or (PREF = PREFIJO)) then
        if ((ANULADOS = 'S') or (ANULADO = 'N')) then
            BEGIN
            SELECT TERC_NOM FROM TERCEROS WHERE TERC_NIT = :NIT INTO :NOMTERCERO;
            If (ANULADO = 'S') then
             BEGIN
              EXENTOS = 0;
              IMPBA = 0;
              IMPUP = 0;
              GRAVADOS1 = 0;
              GRAVADOS2 = 0;
              GRAVADOS3 = 0;
              GRAVADOS4 = 0;
              GRAVADOS5 = 0;
              GRAVADOS6 = 0;
              GRAVADOS7 = 0;
              GRAVADOS8 = 0;
              IVA1 = 0;
              IVA2 = 0;
              IVA3 = 0;
              IVA4 = 0;
              IVA5 = 0;
              IVA6 = 0;
              IVA7 = 0;
              IVA8 = 0;
              SUBTOTAL = 0;
              TOTAL = 0;
              EXTRA = 0;
              IVAMONTO = 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;
              IMPBA = IMPBA * -1;
              IMPUP = IMPUP * -1;
              EXTRA = EXTRA * -1;
              TOTAL = TOTAL * -1;
              RTFTEMONTO = RTFTEMONTO * -1;
              RTIVAMONTO = RTIVAMONTO * -1;
              RTICAMONTO = RTICAMONTO * -1;
              RTCREEMONTO = RTCREEMONTO * -1;
              if (DTOBASE = 'NO') then
                  FACTOR = 1;
              else
                  if ((TOTAL-IVAMONTO-DTOMONTO) = 0) then
                    FACTOR = 1;
                  else
                    FACTOR = cast(TOTAL-IVAMONTO+DTOMONTO as double precision)/cast(TOTAL-IVAMONTO as double precision);
              /* CALCULE LAS DIFERENTES TARIFAS */
              if (TER_EXENTO = 'S') then
                BEGIN
                SELECT SUM(DVCD_TOTAL - DVCD_IVAMONTO - DVCD_CONSUMO)*:FACTOR FROM DEVOLUCIONES_COMPRAS_DET D WHERE DVCO_ID = :ID AND DVCD_IVAMONTO = 0 INTO :EXENTOS;
                SELECT SUM(DVCD_TOTAL - DVCD_IVAMONTO - DVCD_CONSUMO)*:FACTOR, SUM(DVCD_IVAMONTO)*:FACTOR FROM DEVOLUCIONES_COMPRAS_DET D WHERE DVCO_ID = :ID AND DVCD_TIVA = 1 AND DVCD_IVAMONTO <> 0 INTO :GRAVADOS1, :IVA1;
                SELECT SUM(DVCD_TOTAL - DVCD_IVAMONTO - DVCD_CONSUMO)*:FACTOR, SUM(DVCD_IVAMONTO)*:FACTOR FROM DEVOLUCIONES_COMPRAS_DET D WHERE DVCO_ID = :ID AND DVCD_TIVA = 2 AND DVCD_IVAMONTO <> 0 INTO :GRAVADOS2, :IVA2;
                SELECT SUM(DVCD_TOTAL - DVCD_IVAMONTO - DVCD_CONSUMO)*:FACTOR, SUM(DVCD_IVAMONTO)*:FACTOR FROM DEVOLUCIONES_COMPRAS_DET D WHERE DVCO_ID = :ID AND DVCD_TIVA = 3 AND DVCD_IVAMONTO <> 0 INTO :GRAVADOS3, :IVA3;
                SELECT SUM(DVCD_TOTAL - DVCD_IVAMONTO - DVCD_CONSUMO)*:FACTOR, SUM(DVCD_IVAMONTO)*:FACTOR FROM DEVOLUCIONES_COMPRAS_DET D WHERE DVCO_ID = :ID AND DVCD_TIVA = 4 AND DVCD_IVAMONTO <> 0 INTO :GRAVADOS4, :IVA4;
                SELECT SUM(DVCD_TOTAL - DVCD_IVAMONTO - DVCD_CONSUMO)*:FACTOR, SUM(DVCD_IVAMONTO)*:FACTOR FROM DEVOLUCIONES_COMPRAS_DET D WHERE DVCO_ID = :ID AND DVCD_TIVA = 5 AND DVCD_IVAMONTO <> 0 INTO :GRAVADOS5, :IVA5;
                SELECT SUM(DVCD_TOTAL - DVCD_IVAMONTO - DVCD_CONSUMO)*:FACTOR, SUM(DVCD_IVAMONTO)*:FACTOR FROM DEVOLUCIONES_COMPRAS_DET D WHERE DVCO_ID = :ID AND DVCD_TIVA = 6 AND DVCD_IVAMONTO <> 0 INTO :GRAVADOS6, :IVA6;
                SELECT SUM(DVCD_TOTAL - DVCD_IVAMONTO - DVCD_CONSUMO)*:FACTOR, SUM(DVCD_IVAMONTO)*:FACTOR FROM DEVOLUCIONES_COMPRAS_DET D WHERE DVCO_ID = :ID AND DVCD_TIVA = 7 AND DVCD_IVAMONTO <> 0 INTO :GRAVADOS7, :IVA7;
                SELECT SUM(DVCD_TOTAL - DVCD_IVAMONTO - DVCD_CONSUMO)*:FACTOR, SUM(DVCD_IVAMONTO)*:FACTOR FROM DEVOLUCIONES_COMPRAS_DET D WHERE DVCO_ID = :ID AND DVCD_TIVA = 8 AND DVCD_IVAMONTO <> 0 INTO :GRAVADOS8, :IVA8;
                END
              ELSE
                BEGIN
                SELECT SUM(DVCD_TOTAL - DVCD_IVAMONTO - DVCD_CONSUMO)*:FACTOR FROM DEVOLUCIONES_COMPRAS_DET D WHERE DVCO_ID = :ID AND DVCD_TIVA = 0 INTO :EXENTOS;
                SELECT SUM(DVCD_TOTAL - DVCD_IVAMONTO - DVCD_CONSUMO)*:FACTOR, SUM(DVCD_IVAMONTO)*:FACTOR FROM DEVOLUCIONES_COMPRAS_DET D WHERE DVCO_ID = :ID AND DVCD_TIVA = 1 INTO :GRAVADOS1, :IVA1;
                SELECT SUM(DVCD_TOTAL - DVCD_IVAMONTO - DVCD_CONSUMO)*:FACTOR, SUM(DVCD_IVAMONTO)*:FACTOR FROM DEVOLUCIONES_COMPRAS_DET D WHERE DVCO_ID = :ID AND DVCD_TIVA = 2 INTO :GRAVADOS2, :IVA2;
                SELECT SUM(DVCD_TOTAL - DVCD_IVAMONTO - DVCD_CONSUMO)*:FACTOR, SUM(DVCD_IVAMONTO)*:FACTOR FROM DEVOLUCIONES_COMPRAS_DET D WHERE DVCO_ID = :ID AND DVCD_TIVA = 3 INTO :GRAVADOS3, :IVA3;
                SELECT SUM(DVCD_TOTAL - DVCD_IVAMONTO - DVCD_CONSUMO)*:FACTOR, SUM(DVCD_IVAMONTO)*:FACTOR FROM DEVOLUCIONES_COMPRAS_DET D WHERE DVCO_ID = :ID AND DVCD_TIVA = 4 INTO :GRAVADOS4, :IVA4;
                SELECT SUM(DVCD_TOTAL - DVCD_IVAMONTO - DVCD_CONSUMO)*:FACTOR, SUM(DVCD_IVAMONTO)*:FACTOR FROM DEVOLUCIONES_COMPRAS_DET D WHERE DVCO_ID = :ID AND DVCD_TIVA = 5 INTO :GRAVADOS5, :IVA5;
                SELECT SUM(DVCD_TOTAL - DVCD_IVAMONTO - DVCD_CONSUMO)*:FACTOR, SUM(DVCD_IVAMONTO)*:FACTOR FROM DEVOLUCIONES_COMPRAS_DET D WHERE DVCO_ID = :ID AND DVCD_TIVA = 6 INTO :GRAVADOS6, :IVA6;
                SELECT SUM(DVCD_TOTAL - DVCD_IVAMONTO - DVCD_CONSUMO)*:FACTOR, SUM(DVCD_IVAMONTO)*:FACTOR FROM DEVOLUCIONES_COMPRAS_DET D WHERE DVCO_ID = :ID AND DVCD_TIVA = 7 INTO :GRAVADOS7, :IVA7;
                SELECT SUM(DVCD_TOTAL - DVCD_IVAMONTO - DVCD_CONSUMO)*:FACTOR, SUM(DVCD_IVAMONTO)*:FACTOR FROM DEVOLUCIONES_COMPRAS_DET D WHERE DVCO_ID = :ID AND DVCD_TIVA = 8 INTO :GRAVADOS8, :IVA8;
                END
              SELECT SUM(DVCD_CONSUMO) FROM DEVOLUCIONES_COMPRAS_DET WHERE DVCO_ID = :ID INTO :CONSUMO;
              CONSUMO = CONSUMO * -1;
              if (EXENTOS is NULL) then
                EXENTOS = 0;
              ELSE
                EXENTOS = EXENTOS * -1;
              if (GRAVADOS1 is NULL) then
                GRAVADOS1 = 0;
              ELSE
                GRAVADOS1 = GRAVADOS1 * -1;
              if (GRAVADOS2 is NULL) then
                GRAVADOS2 = 0;
              ELSE
                GRAVADOS2 = GRAVADOS2 * -1;
              if (GRAVADOS3 is NULL) then
                GRAVADOS3 = 0;
              ELSE
                GRAVADOS3 = GRAVADOS3 * -1;
              if (GRAVADOS4 is NULL) then
                GRAVADOS4 = 0;
              ELSE
                GRAVADOS4 = GRAVADOS4 * -1;
              if (GRAVADOS5 is NULL) then
                GRAVADOS5 = 0;
              ELSE
                GRAVADOS5 = GRAVADOS5 * -1;
              if (GRAVADOS6 is NULL) then
                GRAVADOS6 = 0;
              ELSE
                GRAVADOS6 = GRAVADOS6 * -1;
              if (GRAVADOS7 is NULL) then
                GRAVADOS7 = 0;
              ELSE
                GRAVADOS7 = GRAVADOS7 * -1;
              if (GRAVADOS8 is NULL) then
                GRAVADOS8 = 0;
              ELSE
                GRAVADOS8 = GRAVADOS8 * -1;
              SUBTOTAL = TOTAL - EXTRA - IVAMONTO - DTOMONTO;
              NETO = TOTAL - RTFTEMONTO - RTIVAMONTO - RTICAMONTO - RTCREEMONTO;
             END
            if (iva1 is null) then
                iva1 = 0;
            else
                iva1 = iva1 * -1;
            if (iva2 is null) then
                iva2 = 0;
            else
                iva2 = iva2 * -1;
            if (iva3 is null) then
                iva3 = 0;
            else
                iva3 = iva3 * -1;
            if (iva4 is null) then
                iva4 = 0;
            else
                iva4 = iva4 * -1;
            if (iva5 is null) then
                iva5 = 0;
            else
                iva5 = iva5 * -1;
            if (iva6 is null) then
                iva6 = 0;
            else
                iva6 = iva6 * -1;
            if (iva7 is null) then
                iva7 = 0;
            else
                iva7 = iva7 * -1;
            if (iva8 is null) then
                iva8 = 0;
            else
                iva8 = iva8 * -1;
            if (consumo is null) then
                consumo = 0;
            else
                consumo = consumo * -1;
            EXECUTE PROCEDURE ORDENE_TARIFAS(gravados1, gravados2, gravados3, gravados4, gravados5, gravados6, gravados7, gravados8, IVA1, IVA2, IVA3, IVA4, IVA5, iva6, IVA7, IVA8)
                returning_values (gravados1, gravados2, gravados3, gravados4, gravados5, gravados6, gravados7, gravados8, IVA1, IVA2, IVA3, IVA4, IVA5, iva6, IVA7, IVA8);
            SUSPEND;
            END
    END

IMPBA = 0;
IMPUP = 0;
CONSUMO = 0;
execute procedure lee_configuracion ('COMPRAS', 'DOCUMENTOS', 'INCLUIR NOTAS DE CXPAGAR EN REPORTE DE IMPUESTOS EN COMPRAS') returning_values (:NOTAS);
if (NOTAS = 'SI') then
    BEGIN
     TIPO = 52;
     SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 52 INTO :NOMTIPO;
     FOR SELECT NCPR_ID, PREF_PRE, NCPR_NUMERO, NCPR_FECHA, TERC_NIT, 0, NCPR_IVAMONTO, NCPR_RTFTEMONTO, NCPR_RTIVAMONTO,
        NCPR_RTICAMONTO, NCPR_RTCREEM, 0, NCPR_MONTO + NCPR_IVAMONTO, NCPR_ANULADO, '', NCPR_BASE0, NCPR_BASE1, NCPR_BASE2, NCPR_BASE3,
        NCPR_IVA1, NCPR_IVA2, NCPR_IVA3
       FROM NOTAS_CREDITO_PROVEEDOR
       WHERE NCPR_FECHA >= :FECINI AND NCPR_FECHA <= :FECFIN ORDER BY NCPR_FECHA, PREF_PRE, NCPR_NUMERO
       INTO :ID, :PREF, :NUMERO, :FECHA, :NIT, :DTOMONTO, :IVAMONTO, :RTFTEMONTO, :RTIVAMONTO,
        :RTICAMONTO, :RTCREEMONTO, :EXTRA, :TOTAL, :ANULADO, :numprov, :exentos, :gravados1, :gravados2, :gravados3,
        :iva1, :iva2, :iva3
       DO
       BEGIN
       SELECT TERC_NOM, TERC_EXENTO FROM TERCEROS WHERE TERC_NIT = :NIT INTO :NOMTERCERO, :TER_EXENTO;
       if ((PREFIJO = '') or (PREFIJO IS NULL) or (PREF = PREFIJO)) then
         BEGIN
         GRAVADOS4 = 0;
         GRAVADOS5 = 0;
         IVA4 = 0;
         IVA5 = 0;
         If (ANULADO = 'S') then
           BEGIN
            EXENTOS = 0;
            GRAVADOS1 = 0;
            GRAVADOS2 = 0;
            GRAVADOS3 = 0;
            IVA1 = 0;
            IVA2 = 0;
            IVA3 = 0;
            SUBTOTAL = 0;
            TOTAL = 0;
            EXTRA = 0;
            IVAMONTO = 0;
            DTOMONTO = 0;
            NETO = 0;
            RTFTEMONTO = 0;
            RTIVAMONTO = 0;
            RTICAMONTO = 0;
            RTCREEMONTO = 0;
           END
          ELSE
            BEGIN
            if (EXENTOS is NULL) then
                EXENTOS = 0;
            ELSE
                EXENTOS = EXENTOS * -1;
            if (GRAVADOS1 is NULL) then
              GRAVADOS1 = 0;
            ELSE
              GRAVADOS1 = GRAVADOS1 * -1;
            if (GRAVADOS2 is NULL) then
              GRAVADOS2 = 0;
            ELSE
              GRAVADOS2 = GRAVADOS2 * -1;
            if (GRAVADOS3 is NULL) then
              GRAVADOS3 = 0;
            ELSE
              GRAVADOS3 = GRAVADOS3 * -1;
            if (iva1 is NULL) then
              iva1 = 0;
            ELSE
              iva1 = iva1 * -1;
            if (iva2 is NULL) then
              iva2 = 0;
            ELSE
              iva2 = iva2 * -1;
            if (iva3 is NULL) then
              iva3 = 0;
            ELSE
              iva3 = iva3 * -1;
            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;
            CONSUMO = 0;
            SUBTOTAL = TOTAL - EXTRA - IVAMONTO - DTOMONTO;
            NETO = TOTAL - RTFTEMONTO - RTIVAMONTO - RTICAMONTO - RTCREEMONTO;
           END
         EXECUTE PROCEDURE ORDENE_TARIFAS(gravados1, gravados2, gravados3, gravados4, gravados5, gravados6, gravados7, gravados8, IVA1, IVA2, IVA3, IVA4, IVA5, iva6, IVA7, IVA8)
            returning_values (gravados1, gravados2, gravados3, gravados4, gravados5, gravados6, gravados7, gravados8, IVA1, IVA2, IVA3, IVA4, IVA5, iva6, IVA7, IVA8);
         suspend;
         END
       END

     TIPO = 51;
     SELECT TIDO_NOMLARGO FROM TIPO_DOCUMENTO WHERE TIDO_COD = 51 INTO :NOMTIPO;
     FOR SELECT NDPR_ID, PREF_PRE, NDPR_NUMERO, NDPR_FECHA, TERC_NIT, 0, NDPR_IVAMONTO, NDPR_RTFTEMONTO, NDPR_RTIVAMONTO,
        NDPR_RTICAMONTO, NDPR_RTCREEM, 0, NDPR_MONTO + NDPR_IVAMONTO, NDPR_ANULADO, NDPR_NUMPROV, NDPR_BASE0, NDPR_BASE1, NDPR_BASE2,
        NDPR_BASE3, NDPR_IVA1, NDPR_IVA2, NDPR_IVA3
       FROM NOTAS_DEBITO_PROVEEDOR
       WHERE NDPR_FECHA >= :FECINI AND NDPR_FECHA <= :FECFIN ORDER BY NDPR_FECHA, PREF_PRE, NDPR_NUMERO
       INTO :ID, :PREF, :NUMERO, :FECHA, :NIT, :DTOMONTO, :IVAMONTO, :RTFTEMONTO, :RTIVAMONTO,
        :RTICAMONTO, :RTCREEMONTO, :EXTRA, :TOTAL, :ANULADO, :numprov, :exentos, :gravados1, :gravados2,
        :gravados3, :iva1, :iva2, :iva3
       DO
       BEGIN
       SELECT TERC_NOM, TERC_EXENTO FROM TERCEROS WHERE TERC_NIT = :NIT INTO :NOMTERCERO, :TER_EXENTO;
       if ((PREFIJO = '') or (PREFIJO IS NULL) or (PREF = PREFIJO)) then
         BEGIN
         GRAVADOS4 = 0;
         GRAVADOS5 = 0;
         IVA4 = 0;
         IVA5 = 0;
         CONSUMO = 0;
         If (ANULADO = 'S') then
           BEGIN
            EXENTOS = 0;
            GRAVADOS1 = 0;
            GRAVADOS2 = 0;
            GRAVADOS3 = 0;
            IVA1 = 0;
            IVA2 = 0;
            IVA3 = 0;
            SUBTOTAL = 0;
            TOTAL = 0;
            EXTRA = 0;
            IVAMONTO = 0;
            DTOMONTO = 0;
            NETO = 0;
            RTFTEMONTO = 0;
            RTIVAMONTO = 0;
            RTICAMONTO = 0;
            RTCREEMONTO = 0;
           END
          ELSE
           BEGIN
            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 (iva1 is NULL) then
              iva1 = 0;
            if (iva2 is NULL) then
              iva2 = 0;
            if (iva3 is NULL) then
              iva3 = 0;
            SUBTOTAL = TOTAL - EXTRA - IVAMONTO - DTOMONTO;
            NETO = TOTAL - RTFTEMONTO - RTIVAMONTO - RTICAMONTO - RTCREEMONTO;
           END
EXECUTE PROCEDURE ORDENE_TARIFAS(gravados1, gravados2, gravados3, gravados4, gravados5, gravados6, gravados7, gravados8, IVA1, IVA2, IVA3, IVA4, IVA5, iva6, IVA7, IVA8)
            returning_values (gravados1, gravados2, gravados3, gravados4, gravados5, gravados6, gravados7, gravados8, IVA1, IVA2, IVA3, IVA4, IVA5, iva6, IVA7, IVA8);
         suspend;
         END
       END
    END
END^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER procedure CONTABIL_FACTCOMP (
    IDDOC integer,
    IDINTER integer)
returns (
    ERROR integer,
    VER char(1),
    IDC integer)
as
declare variable PREFIJO varchar(4);
declare variable NUM varchar(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,4);
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 VRFOMENTO 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 ICOINC char(2);
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(1);
declare variable BODE_DET char(2);
declare variable NUMPROV varchar(15);
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);
declare variable CTAFOMENTO varchar(20);
declare variable EQUIVALE char(1);
declare variable TOTIMPBA numeric(18,2);
declare variable TOTIMPUP numeric(18,2);
declare variable ISINC char(2);
declare variable ISCTA varchar(2);
declare variable IMPBA numeric(18,2);
declare variable IMPUP numeric(18,2);
begin
EXECUTE PROCEDURE lee_configuracion ('COMPRAS', 'DOCUMENTOS', 'LLEVAR IMPUESTOS SALUDABLES COMO MAYOR VALOR DEL COSTO DEL INVENTARIO') returning_values(:isinc);
EXECUTE PROCEDURE lee_configuracion ('COMPRAS', 'DOCUMENTOS', 'COSTO IMPUESTOS SALUDABLES EN CUENTA INDEPENDIENTE DE LA BASE') returning_values(:ISCTA);
  /* INTERFACE */
  EXISTE = 'N';
  select 'S', TICO_COD, PRCO_PRE, INCO_INVEN, INCO_IVA, INCO_CONSUMO, INCO_CXP, INCO_RTFTE, INCO_RTIVA, INCO_RTICA,
         INCO_RTCREE, INCO_CTAINVEN, INCO_CTAIVA, INCO_CTACONSUMO, INCO_CTADTO, INCO_CTAADIC, INCO_CTAEXTRA,
         INCO_CTACXP, INCO_CTARTFTE, INCO_CTARTIVA, INCO_CTARTICA, INCO_CTARTCREE, INCO_CONFIRMAR, INCO_CENTRO, INCO_FOMENTO, INCO_CTAFOMENTO, INCO_EQUIVALENCIA
  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, :FOMENTO, :CTAFOMENTO, :EQUIVALE;
  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, FACO_FOMENTO, FACO_IMPBA, FACO_IMPUP
    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, :VRFOMENTO, :TOTIMPBA, :TOTIMPUP;
    /* 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 + vrfomento;
      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, 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, TERC_NIT, CNTB_EQUIVAL)
      values (:IDC, :TIPOCOMP, :PREFCONT, :NUM, :FECHA, :CONCEPTO, '', 21, :IDDOC, :PREFIJO, :NUM, 'N', :NIT, :EQUIVALE);
      NUMITEMS = 0;
      SUMA = 0;
      NETO = 0;
      ERROR = 0;
      EXECUTE PROCEDURE lee_configuracion ('INVENTARIO', 'ARTICULOS', 'IMPOCONSUMO COMO MAYOR VALOR DEL COSTO') returning_values(:icoinc);
      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 ((cast(MERCANCIA as double precision) - VALORADIC) <> 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(FCDE_TOTAL), sum(FCDE_IVAMONTO), sum(FCDE_CONSUMO), SUM(FCDE_IMPUP), SUM(FCDE_IMPBA), max(F.BODE_COD)
            from ARTICULO A, CONTABIL_ARTICULO C, FACTURAS_COMPRAS_DETALLE F
            where F.FACO_ID = :IDDOC and F.ARTI_COD = A.ARTI_COD and A.ARTI_COD = C.ARTI_COD
            group by COAR_CTACOMP, F.BODE_COD
            into :CTAINVEN, :MONTO, :IMPTOS, :VALORADIC, :IMPUP, :IMPBA, :BODE_DET
        do
          begin
          if (CENT = 'B') then
            select BODE_CENTRO, BODE_PROY from BODEGA where BODE_COD = :BODE_DET into :CENTRODET, :PROYDET;
          MONTO = MONTO - IMPTOS;
          if (ICOINC <> 'SI') then
            MONTO = MONTO - VALORADIC;
          if ((isinc <> 'SI') or (ISCTA = 'SI')) then
            MONTO = MONTO - IMPBA - IMPUP;
          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_TOTAL, 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
              MONTO = MONTO - IMPTOS;
              if (ICOINC <> 'SI') then
                MONTO = MONTO - VALORADIC;
              MONTO = MONTO * FACTOR;
              execute procedure REDONDEE(IMPTOS, DIG) returning_values (IMPTOS);
              execute procedure REDONDEE(MONTO, DIG) returning_values (MONTO);
              if (CENT = 'B') then
                insert into CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS,
                                                 CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO,
                                                 CNDE_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(FCDE_TOTAL), sum(FCDE_IVAMONTO), sum(FCDE_CONSUMO), SUM(FCDE_IMPUP), SUM(FCDE_IMPBA), max(BODE_COD)
            from FACTURAS_COMPRAS_DETALLE where FACO_ID = :IDDOC group by BODE_COD
            into :MONTO, :IMPTOS, :VALORADIC, :IMPUP, :IMPBA, :BODE_DET
        do
          begin
          if (CENT = 'B') then
            select BODE_CENTRO, BODE_PROY from BODEGA where BODE_COD = :BODE_DET into :CENTRODET, :PROYDET;
          MONTO = MONTO - IMPTOS;
          if (ICOINC <> 'SI') then
            MONTO = MONTO - VALORADIC;
          if ((isinc <> 'SI') or (ISCTA = 'SI')) then
            MONTO = MONTO - IMPBA - IMPUP;
          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_TOTAL, FCDE_IVAMONTO, FCDE_CONSUMO
                from FACTURAS_COMPRAS_DETALLE where FACO_ID = :IDDOC into :ARTICULO, :MONTO, :IMPTOS, :VALORADIC
            do
              begin
              MONTO = MONTO - IMPTOS;
              if (ICOINC <> 'SI') then
                MONTO = MONTO - VALORADIC;
              MONTO = MONTO * FACTOR;
              execute procedure REDONDEE(MONTO, DIG) returning_values (MONTO);
              execute procedure REDONDEE(IMPTOS, DIG) returning_values (IMPTOS);
              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
      if ((ISINC <> 'SI') or (iscta = 'SI')) then
        begin
        if ((totimpba <> 0) and (INVEN <> 'N')) then /* IMP BEBIDAS AZUCARADAS */
            begin
            execute procedure redondee(totimpba, DIG) returning_values (IMPTOS);
    
            /* TRAIGA LAS CARACTERISTICAS DE LA CUENTA */
            EXECUTE PROCEDURE lee_configuracion('COMPRAS', 'FACTURAS', 'CUENTA CONTABLE PARA IMPUESTO EN COMPRAS DE BEBIDAS AZUCARADAS') returning_values (ctafomento);
            execute procedure CUENTA_INTERFAZ(21, :IDDOC, :CTAFOMENTO, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'C') then
                TIPOCUEN = 'N';
            if (TIPOCUEN = 'N') then
                begin
                insert into CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    values (:IDC, :NUMITEMS, :CTAFOMENTO, :CONCEPTO, '', :IMPTOS, 0, 0, 0, :NIT, :PROY, :CENTRO, 0, 0);
                NUMITEMS = NUMITEMS + 1;
                NETO = NETO + IMPTOS;
                end
            end
        if ((totimpup <> 0) and (INVEN <> 'N')) then /* IMP ULTRAPROCESADOS */
            begin
            execute procedure redondee(totimpup, DIG) returning_values (IMPTOS);
    
            /* TRAIGA LAS CARACTERISTICAS DE LA CUENTA */
            EXECUTE PROCEDURE lee_configuracion('COMPRAS', 'FACTURAS', 'CUENTA CONTABLE PARA IMPUESTO EN COMPRAS DE ALIMENTOS ULTRAPROCESADOS') returning_values (ctafomento);
            execute procedure CUENTA_INTERFAZ(21, :IDDOC, :CTAFOMENTO, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'C') then
                TIPOCUEN = 'N';
            if (TIPOCUEN = 'N') then
                begin
                insert into CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                    values (:IDC, :NUMITEMS, :CTAFOMENTO, :CONCEPTO, '', :IMPTOS, 0, 0, 0, :NIT, :PROY, :CENTRO, 0, 0);
                NUMITEMS = NUMITEMS + 1;
                NETO = NETO + IMPTOS;
                end
            end
        end
      /* EL IVA */
      if ((IVA = 'A') and (SIMPLIF = 'N')) then
        begin
        for select max(COAR_CTAIVAC), sum(FCDE_IVAMONTO), sum(FCDE_TOTAL-FCDE_IVAMONTO-FCDE_CONSUMO-FCDE_IMPBA-FCDE_IMPUP), sum(FCDE_CONSUMO)
            from ARTICULO A, CONTABIL_ARTICULO C, FACTURAS_COMPRAS_DETALLE F
            where F.FACO_ID = :IDDOC and F.ARTI_COD = A.ARTI_COD and A.ARTI_COD = C.ARTI_COD and FCDE_IVAMONTO <> 0 and fcde_dtoporc <> 100
            group by COAR_CTAIVAC
            into :CTAIVA, :IMPTOS, :MONTO, :VALORADIC
            do
            if (IMPTOS <> 0) then
                begin
                if (MERCANCIA <> 0) then
                    begin
                    IMPTOS = cast(IMPTOS as double precision) * cast(VRSUBT as double precision) / cast(MERCANCIA as double precision);
                    MONTO = cast(MONTO as double precision) * cast(VRSUBT as double precision) / cast(MERCANCIA as double precision);
                    end
                else
                    MONTO = 0;
                execute procedure REDONDEE(IMPTOS, DIG) returning_values (IMPTOS);
                execute procedure REDONDEE(MONTO, DIG) returning_values (MONTO);
                if (MONTO <> 0) then
                    PORCIVA = cast(:IMPTOS as double precision) * 100 / cast(:MONTO as double precision);
                else
                    PORCIVA = 0;
                execute procedure CUENTA_INTERFAZ(21, :IDDOC, :CTAIVA, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (TIPOCUEN = 'C') then
                    begin
                    insert into CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS,
                        CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE,
                        CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                      values (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :IMPTOS, 0, :MONTO, :PORCIVA, :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, :PORCIVA, :NIT, :PROY, :CENTRO, null,
                      null, null, null, 0, 0);
                    NUMITEMS = NUMITEMS + 1;
                    NETO = NETO + IMPTOS;
                    end
                end
        IMPTOS = 0;
        MONTO = 0;
        for select max(COAR_CTAIVAC), sum(FCDE_IVAMONTO), sum(FCDE_CONSUMO), max(f.fcde_ivaporc)
            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 and fcde_dtoporc = 100
            group by COAR_CTAIVAC
            into :CTAIVA, :IMPTOS, :VALORADIC, :PORCIVA
            do
            if (IMPTOS <> 0) then
                begin
                if (MERCANCIA <> 0) then
                    IMPTOS = cast(IMPTOS as double precision) * cast(VRSUBT as double precision) / cast(MERCANCIA as double precision);
                execute procedure REDONDEE(IMPTOS, DIG) returning_values (IMPTOS);
                execute procedure CUENTA_INTERFAZ(21, :IDDOC, :CTAIVA, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (TIPOCUEN = 'C') then
                    begin
                    insert into CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS,
                        CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCNUMERO, CNDE_DOCAPLICAR, CNDE_DOCVENCE,
                        CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                      values (:IDC, :NUMITEMS, :CUENTA, :CONCEPTO, '', :IMPTOS, 0, :MONTO, :PORCIVA, :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, :PORCIVA, :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(FCDE_TOTAL-FCDE_IVAMONTO-FCDE_CONSUMO-FCDE_IMPBA-FCDE_IMPUP), sum(FCDE_CONSUMO)
            from FACTURAS_COMPRAS_DETALLE F where F.FACO_ID = :IDDOC and FCDE_IVAMONTO <> 0
            into :IMPTOS, :MONTO, :VALORADIC;
        if (IMPTOS <> 0) then
            begin
            if (MERCANCIA <> 0) then
                begin
                IMPTOS = cast(IMPTOS as double precision) * VRSUBT / MERCANCIA;
                MONTO = cast(MONTO as double precision) * VRSUBT / MERCANCIA;
                end
            else
                MONTO = 0;
            execute procedure REDONDEE(IMPTOS, DIG) returning_values (IMPTOS);
            execute procedure REDONDEE(MONTO, DIG) returning_values (MONTO);
            if (MONTO <> 0) then
                PORCIVA = cast(:IMPTOS as double precision) * 100 / cast(:MONTO as double precision);
            else
                PORCIVA = 0;
            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 = 'C') then
                begin
                insert into CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS,
                    CNDE_CREDITOS, CNDE_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,
                    :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, :PORCIVA, :NIT, :PROY, :CENTRO, null,
                    null, null, null, 0, 0);
                NUMITEMS = NUMITEMS + 1;
                NETO = NETO + IMPTOS;
                end
            end
        end
      /* EL IMPOCONSUMO */
      if ((CONSUMO = 'A') AND (ICOINC <> 'SI')) then
        begin
        for select max(COAR_CTACONS), sum(FCDE_CONSUMO) from ARTICULO A, CONTABIL_ARTICULO C, FACTURAS_COMPRAS_DETALLE F
            where F.FACO_ID = :IDDOC and F.ARTI_COD = A.ARTI_COD and A.ARTI_COD = C.ARTI_COD
            group by COAR_CTACONS
            into :CTACONSUMO, :IMPTOS
        do
          if (IMPTOS <> 0) then
            begin
            execute procedure REDONDEE(IMPTOS, DIG) returning_values (IMPTOS);
            execute procedure CUENTA_INTERFAZ(21, :IDDOC, :CTACONSUMO, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
              ERROR = ERROR + 1;
            if (TIPOCUEN = 'C') then
                begin
                insert into CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS,
                                                 CNDE_CREDITOS, CNDE_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
        end
      if ((CONSUMO = 'K') AND (ICOINC <> 'SI')) 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;
          /* 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
        end
        /* EL FOMENTO */
        if (FOMENTO = 'A') then
            begin
            for select max(COAR_CTAFOMENTO), sum(FCDE_FOMM), sum(FCDE_CANT * FCDE_PRUNIT * ( 1 - FCDE_DTOPORC / 100)), max(fcde_fomp)
                from ARTICULO A, CONTABIL_ARTICULO C, FACTURAS_COMPRAS_DETALLE F
                where F.FACO_ID = :IDDOC and F.ARTI_COD = A.ARTI_COD and A.ARTI_COD = C.ARTI_COD
                group by COAR_CTAFOMENTO into :CTAFOMENTO, :IMPTOS, :baseadic, :porc
            do
              if (IMPTOS <> 0) then
                begin
                execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
                execute procedure CUENTA_INTERFAZ(21, :IDDOC, :CTAFOMENTO, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (TIPOCUEN = 'I') then
                    begin
                    for select F.ARTI_COD, FCDE_FOMM from ARTICULO A, FACTURAS_COMPRAS_DETALLE F where F.FACO_ID = :IDDOC into :ARTICULO, :IMPTOS
                        do
                        begin
                        if (IMPTOS <> 0) then
                            begin
                            execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
                            insert into CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                                values (:IDC, :NUMITEMS, :CTAFOMENTO, :CONCEPTO, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, :ARTICULO, 0, 0);
                            NUMITEMS = NUMITEMS + 1;
                            NETO = NETO - IMPTOS;
                            end
                        end
                    end
                if (TIPOCUEN = 'C') then
                    TIPOCUEN = 'N';
                if (TIPOCUEN = 'N') then
                    begin
                    insert into CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        values (:IDC, :NUMITEMS, :CTAFOMENTO, :CONCEPTO, '', 0, :IMPTOS, :baseadic, :porc, :NIT, :PROY, :CENTRO, 0, 0);
                    NUMITEMS = NUMITEMS + 1;
                    NETO = NETO - IMPTOS;
                    end
                end
            end
        if (FOMENTO = 'K') then /* CONSUMO EN CTA CONSTANTE */
            begin
            select sum(FCDE_FOMM), sum(FCDE_CANT * FCDE_PRUNIT * ( 1 - FCDE_DTOPORC / 100)), max(fcde_fomp)
                from FACTURAS_COMPRAS_DETALLE F where F.FACO_ID = :IDDOC and fcde_fomm <> 0
                into :IMPTOS, :baseadic, :porc;
            if (IMPTOS <> 0) then
                begin
                execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);

                /* TRAIGA LAS CARACTERISTICAS DE LA CUENTA */
                execute procedure CUENTA_INTERFAZ(21, :IDDOC, :CTAFOMENTO, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                /* DEPENDE DEL TIPO DE CUENTA */
                if (TIPOCUEN = 'I') then
                    begin
                    /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                    for select F.ARTI_COD, FCDE_CONSUMO from ARTICULO A, FACTURAS_COMPRAS_DETALLE F where F.FACO_ID = :IDDOC into :ARTICULO, :IMPTOS
                        do
                        begin
                        if (IMPTOS <> 0) then
                            begin
                            execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
                            insert into CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                                values (:IDC, :NUMITEMS, :CTAFOMENTO, :CONCEPTO, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, :ARTICULO, 0, 0);
                            NUMITEMS = NUMITEMS + 1;
                            NETO = NETO - IMPTOS;
                            end
                        end
                    end
                if (TIPOCUEN = 'C') then
                    TIPOCUEN = 'N';
                if (TIPOCUEN = 'N') then
                    begin
                    insert into CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        values (:IDC, :NUMITEMS, :CTAFOMENTO, :CONCEPTO, '', 0, :IMPTOS, :baseadic, :porc, :NIT, :PROY, :CENTRO, 0, 0);
                    NUMITEMS = NUMITEMS + 1;
                    NETO = NETO - IMPTOS;
                    end
                end
            end
      /* DESCUENTO */
      if ((CTADTO is not null) and
          (CTADTO <> '')) then
        begin
        execute procedure REDONDEE(VRDTO, DIG)
            returning_values (VRDTO);
        if (VRDTO <> 0) then
            begin
            /* TRAIGA LAS CARACTERISTICAS DE LA CUENTA */
            execute procedure CUENTA_INTERFAZ(21, :IDDOC, :CTADTO, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            if (TIPOCUEN = 'C') then
                begin
                insert into CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS,
                                             CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO,
                                             CNDE_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;
      SUMA = 0;
      /* 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 = 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 = SUMA + VRRTFTE;
            end
          end
        end
      if ((RTFTE = 'A') and
          (VRRTFTE <> 0)) then
      begin
        for select max(COAR_CTARTFTE), max(COAR_RTFTE), min(COAR_RTBASE),
                   sum(FCDE_TOTAL - FCDE_IVAMONTO - FCDE_CONSUMO),
                   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, COAR_RTFTE
            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 = 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 = 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/10, :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/10, :NIT, :PROY, :CENTRO,
                    null, null, null, null, 0, 0);
            NUMITEMS = NUMITEMS + 1;
            NETO = NETO - VRRTICA;
            SUMA = SUMA + VRRTICA;
          end
        end
      end
      if (RTICA = 'A') then
      begin
        if (VRRTICA <> 0) then
        begin
          for select max(COAR_CTARTICA), sum(FCDE_TOTAL - FCDE_IVAMONTO - FCDE_CONSUMO),
                     sum(((FCDE_TOTAL - FCDE_IVAMONTO - FCDE_CONSUMO) / 1000) * C.COAR_RTICA), max(C.COAR_RTICA)
              from CONTABIL_ARTICULO C, FACTURAS_COMPRAS_DETALLE F
              where F.FACO_ID = :IDDOC and
                    F.ARTI_COD = C.ARTI_COD and
                    ((FCDE_REFERENCIA <> '.t') or (FCDE_REFERENCIA is null))
              group by COAR_CTARTICA
              into :CTARTICA, :MONTO, :VRRTICA, :PRTICA
          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, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :VRRTICA, (:MONTO * -1), :PRTICA / 10, :NIT, :PROY,
                        :CENTRO, :NUMERO, null, :VENCE, null, 0, 31);
                NUMITEMS = NUMITEMS + 1;
              NETO = NETO - VRRTICA;
              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, :NUMITEMS, :CUENTA, :CONCEPTO, '', 0, :VRRTICA, (:MONTO * -1), :PRTICA / 10, :NIT, :PROY,
                        :CENTRO, null, null, null, null, 0, 0);
                NUMITEMS = NUMITEMS + 1;
                NETO = NETO - VRRTICA;
                SUMA = SUMA + VRRTICA;
              end
            end
          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 and INCC_CN <> 'N'
          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
        /* AJUSTE LA PRIMERA CUENTA */
        UPDATE CONTABILIZACION_DET SET CNDE_DEBITOS = CNDE_DEBITOS - :NETO
            WHERE CNTB_ID = :IDC AND CNDE_ITEM = 0;
        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,
    CN CHAR(1))
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_CONSEC 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) or (CN = 'N')) then
    begin
    ESTADO = 'PROCESANDO';
    SUSPEND;
    SELECT MAX(INCO_ID) FROM INTERFAZ_COMPRAS WHERE PREF_PRE = :PREF AND TIDO_COD = 21 INTO :IDI;
    if (CN <> 'N') then
       EXECUTE PROCEDURE CONTABIL_FACTCOMP (:ID, :IDI) RETURNING_VALUES (:ERROR, VER, :IDC);
    else
        BEGIN
        ERROR = 0;
        IDC = IDREF;
        END
    if (ERROR = 0) then
        if (CN <> 'C') then
            EXECUTE PROCEDURE contabil_factcomp_niif (:ID, :IDI, :IDC) RETURNING_VALUES (:ERROR, :VER);
    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, 4);
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 ICOINC CHAR(2);
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 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;
declare variable EQUIVALE CHAR(1);
declare variable FOMENTO char(1);
declare variable VRFOMENTO numeric(18,2);
declare variable CTAFOMENTO varchar(20);
declare variable TOTIMPBA numeric(18,2);
declare variable TOTIMPUP numeric(18,2);
BEGIN
/* BUSQUE LA INTERFACE */
EXISTE = 'N';
SELECT 'S', TICO_COD, PRCO_PRE, INCO_INVEN, INCO_IVA, INCO_CONSUMO, INCO_CXP, INCO_RTFTE, INCO_RTIVA, INCO_RTICA, INCO_RTCREE,
    INCO_CTAINVEN, INCO_CTAIVA, INCO_CTACONSUMO, INCO_CTADTO, INCO_CTAADIC, INCO_CTAEXTRA, INCO_CTACXP, INCO_CTARTFTE,
    INCO_CTARTIVA, INCO_CTARTICA, INCO_CTARTCREE, INCO_CONFIRMAR, INCO_CENTRO, INCO_FOMENTO, INCO_CTAFOMENTO, INCO_EQUIVALENCIA
    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, :FOMENTO, :CTAFOMENTO, :EQUIVALE;
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, D.dvco_fomento, dvco_impba, dvco_impup
        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, :vrfomento, :totimpba, :totimpup;
   if ((ANULADO = 'N') AND (IDREM = 0)) then
    BEGIN
    NUMERO = PREFIJO || NUM;
    VRSUBT = VRTOTAL - VREXTRA - VRIVA + vrfomento; /* 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 ('INVENTARIO', 'ARTICULOS', 'IMPOCONSUMO COMO MAYOR VALOR DEL COSTO') returning_values(:icoinc);
    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 = 'DOCUMENTOS' 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, TERC_NIT, CNTB_EQUIVAL)
        VALUES (:IDC, :TIPOCOMP, :PREFCONT, :NUM, :FECHA, :CONCEPTO, '', 24, :IDDOC, :PREFIJO, :NUM, 'N', :NIT, :EQUIVALE);

    NUMITEMS = 0;
    SUMA = 0;
    ERROR = 0;
    /* CUENTAS DE INVENTARIO */
    if (INVEN = 'A') then
        BEGIN
        /* SUME LAS BASES DE LOS ARTICULOS DEL DOCUMENTO */
        FOR SELECT MAX(COAR_CTACOMP), SUM(cast(DVCD_CANT as double precision) * (DVCD_PRUNIT-DVCD_DTOMONTO)), SUM(DVCD_IVAMONTO), SUM(DVCD_CONSUMO)
            FROM ARTICULO A, CONTABIL_ARTICULO C, DEVOLUCIONES_COMPRAS_DET F
            WHERE F.DVCO_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD
            GROUP BY COAR_CTAINV
            INTO :CTAINVEN, :MONTO, :IMPTOS, :VALORADIC
            DO
            BEGIN
            if (IMPINC = 'S') then
                BEGIN
                MONTO = MONTO - IMPTOS;
                MONTO = MONTO - VALORADIC;
                END
            if (ICOINC = 'SI') then
                MONTO = MONTO + VALORADIC;
            MONTO = MONTO * FACTOR;
            execute procedure redondee(MONTO, DIG) returning_values (MONTO);
            /* 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;
                        MONTO = MONTO - VALORADIC;
                        END
                    if (ICOINC = 'SI') then
                        MONTO = MONTO + VALORADIC;
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, 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;
            MONTO = MONTO - VALORADIC;
            END
        if (ICOINC = 'SI') then
            MONTO = MONTO + VALORADIC;
        MONTO = MONTO * FACTOR;
        execute procedure redondee(MONTO, DIG) returning_values (MONTO);
        /* 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;
                    MONTO = MONTO - VALORADIC;
                    END
                if (ICOINC = 'SI') then
                    MONTO = MONTO + VALORADIC;
                INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_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 */
        
    if ((totimpba <> 0) and (INVEN <> 'N')) then /* IMP BEBIDAS AZUCARADAS */
        begin
        execute procedure redondee(totimpba, DIG) returning_values (IMPTOS);

        /* TRAIGA LAS CARACTERISTICAS DE LA CUENTA */
        EXECUTE PROCEDURE lee_configuracion('COMPRAS', 'FACTURAS', 'CUENTA CONTABLE PARA IMPUESTO EN COMPRAS DE BEBIDAS AZUCARADAS') returning_values (ctafomento);
        execute procedure CUENTA_INTERFAZ(24, :IDDOC, :CTAFOMENTO, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
        if (ERRORC <> 0) then
            ERROR = ERROR + 1;
        if (TIPOCUEN = 'C') then
            TIPOCUEN = 'N';
        if (TIPOCUEN = 'N') then
            begin
            insert into CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                values (:IDC, :NUMITEMS, :CTAFOMENTO, :CONCEPTO, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, 0, 0);
            NUMITEMS = NUMITEMS + 1;
            SUMA = SUMA - IMPTOS;
            end
        end
    if ((totimpup <> 0) and (INVEN <> 'N')) then /* IMP ULTRAPROCESADOS */
        begin
        execute procedure redondee(totimpup, DIG) returning_values (IMPTOS);

        /* TRAIGA LAS CARACTERISTICAS DE LA CUENTA */
        EXECUTE PROCEDURE lee_configuracion('COMPRAS', 'FACTURAS', 'CUENTA CONTABLE PARA IMPUESTO EN COMPRAS DE ALIMENTOS ULTRAPROCESADOS') returning_values (ctafomento);
        execute procedure CUENTA_INTERFAZ(24, :IDDOC, :CTAFOMENTO, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
        if (ERRORC <> 0) then
            ERROR = ERROR + 1;
        if (TIPOCUEN = 'C') then
            TIPOCUEN = 'N';
        if (TIPOCUEN = 'N') then
            begin
            insert into CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                values (:IDC, :NUMITEMS, :CTAFOMENTO, :CONCEPTO, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, 0, 0);
            NUMITEMS = NUMITEMS + 1;
            SUMA = SUMA - IMPTOS;
            end
        end
    /* 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
            MONTO = CAST(MONTO AS DOUBLE PRECISION) * VRSUBT / MERCANCIA;
            IMPTOS = CAST(IMPTOS AS DOUBLE PRECISION) * VRSUBT / MERCANCIA;
            execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
            if (IMPINC = 'S') then
                BEGIN
                MONTO = MONTO - IMPTOS;
                MONTO = MONTO - VALORADIC;
                END
            execute procedure redondee(MONTO, DIG) returning_values (MONTO);
            MONTO = MONTO * -1;
            /* TRAIGA LAS CARCATERISTICAS DE LA CUENTA */
            EXECUTE PROCEDURE CUENTA_INTERFAZ(24, :IDDOC, :CTAIVA, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            /* DEPENDE DEL TIPO DE CUENTA */
            if (TIPOCUEN = 'I') then
                BEGIN
                /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                FOR SELECT F.ARTI_COD, DVCD_IVAMONTO, (cast(DVCD_CANT as double precision) * (DVCD_PRUNIT-DVCD_DTOMONTO)), TAIV_PORC, DVCD_CONSUMO
                    FROM ARTICULO A, CONTABIL_ARTICULO C, DEVOLUCIONES_COMPRAS_DET F, TARIFA_IVA T
                    WHERE F.DVCO_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD AND COAR_CTAIVAV = :CUENTA AND A.TAIV_COD = T.TAIV_COD
                    INTO :ARTICULO, :IMPTOS, :MONTO, :PORCIVA, :VALORADIC
                DO
                    BEGIN
                    if (IMPINC = 'S') then
                        BEGIN
                        MONTO = MONTO - IMPTOS;
                        MONTO = MONTO - VALORADIC;
                        END
                    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, :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;
            execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
            if (IMPINC = 'S') then
                BEGIN
                MONTO = MONTO - IMPTOS;
                MONTO = MONTO - VALORADIC;
                END
            execute procedure redondee(MONTO, DIG) returning_values (MONTO);
            MONTO = MONTO * -1;
            /* TRAIGA LAS CARACTERISTICAS DE LA CUENTA */
            EXECUTE PROCEDURE CUENTA_INTERFAZ(24, :IDDOC, :CTAIVA, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            /* DEPENDE DEL TIPO DE CUENTA */
            if (TIPOCUEN = 'I') then
                BEGIN
                /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                FOR SELECT F.ARTI_COD, (cast(DVCD_CANT as double precision) * (DVCD_PRUNIT-DVCD_DTOMONTO)), DVCD_IVAMONTO, TAIV_PORC, DVCD_CONSUMO
                    FROM ARTICULO A, DEVOLUCIONES_COMPRAS_DET F, TARIFA_IVA T
                    WHERE F.DVCO_ID = :IDDOC AND A.TAIV_COD = T.TAIV_COD
                    INTO :ARTICULO, :MONTO, :IMPTOS, :PORCIVA, :VALORADIC
                    DO
                    BEGIN
                    if (IMPTOS <> 0) then
                        BEGIN
                        if (IMPINC = 'S') then
                            BEGIN
                            MONTO = MONTO - IMPTOS;
                            MONTO = MONTO - VALORADIC;
                            END
                        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, :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') AND (ICOINC <> 'SI')) then
        BEGIN
        /* SUME LAS BASES DE LOS ARTICULOS DEL DOCUMENTO */
        FOR SELECT MAX(COAR_CTACONS), SUM(DVCD_CONSUMO)
            FROM ARTICULO A, CONTABIL_ARTICULO C, DEVOLUCIONES_COMPRAS_DET F
            WHERE F.DVCO_ID = :IDDOC AND F.ARTI_COD = A.ARTI_COD AND A.ARTI_COD = C.ARTI_COD
            GROUP BY COAR_CTACONS
            INTO :CTACONSUMO, :IMPTOS
        DO
            BEGIN
            if (IMPTOS <> 0) then
                BEGIN
                /* TRAIGA LAS CARACTERISTICAS DE LA CUENTA */
                EXECUTE PROCEDURE CUENTA_INTERFAZ(24, :IDDOC, :CTACONSUMO, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                /* DEPENDE DEL TIPO DE CUENTA */
                if (TIPOCUEN = 'C') then
                    BEGIN
                    INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, 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
            END /* FOR */
        END /* CONSUMO X ARTICULO */
        
    if ((CONSUMO = 'K') AND (ICOINC <> 'SI')) then
        BEGIN
        SELECT SUM(DVCD_CONSUMO)
            FROM DEVOLUCIONES_COMPRAS_DET F
            WHERE F.DVCO_ID = :IDDOC 
            INTO :IMPTOS;
            
        if (IMPTOS <> 0) then
            BEGIN
            /* TRAIGA LAS CARACTERISTICAS DE LA CUENTA */
            EXECUTE PROCEDURE CUENTA_INTERFAZ(24, :IDDOC, :CTACONSUMO, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
            if (ERRORC <> 0) then
                ERROR = ERROR + 1;
            /* DEPENDE DEL TIPO DE CUENTA */
            if (TIPOCUEN = '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
        END /* CONSUMO EN CTA CONSTANTE */
        
        /* EL FOMENTO */
        if (FOMENTO = 'A') then
            begin
            for select max(COAR_CTAFOMENTO), sum(F.dvcd_fomm), sum(F.dvcd_cant * F.dvcd_prunit * ( 1 - F.dvcd_dtoporc / 100)), max(F.dvcd_fomp)
                from ARTICULO A, CONTABIL_ARTICULO C, devoluciones_compras_det F
                where F.dvco_id = :IDDOC and F.ARTI_COD = A.ARTI_COD and A.ARTI_COD = C.ARTI_COD
                group by COAR_CTAFOMENTO into :CTAFOMENTO, :IMPTOS, :baseadic, :porc
            do
              if (IMPTOS <> 0) then
                begin
                execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);
                execute procedure CUENTA_INTERFAZ(24, :IDDOC, :CTAFOMENTO, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                if (TIPOCUEN = 'I') then
                    begin
                    for select F.ARTI_COD, F.dvcd_fomm from ARTICULO A, devoluciones_compras_det F where F.dvco_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_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                                values (:IDC, :NUMITEMS, :CTAFOMENTO, :CONCEPTO, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, :ARTICULO, 0, 0);
                            NUMITEMS = NUMITEMS + 1;
                            SUMA = SUMA - IMPTOS;
                            end
                        end
                    end
                if (TIPOCUEN = 'C') then
                    TIPOCUEN = 'N';
                if (TIPOCUEN = 'N') then
                    begin
                    insert into CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        values (:IDC, :NUMITEMS, :CTAFOMENTO, :CONCEPTO, '', 0, :IMPTOS, :baseadic, :porc, :NIT, :PROY, :CENTRO, 0, 0);
                    NUMITEMS = NUMITEMS + 1;
                    SUMA = SUMA - IMPTOS;
                    end
                end
            end
        if (FOMENTO = 'K') then /* CONSUMO EN CTA CONSTANTE */
            begin
            select sum(F.dvcd_fomm), sum(F.dvcd_cant * F.dvcd_prunit * ( 1 - F.dvcd_dtoporc / 100)), max(F.dvcd_fomp)
                from devoluciones_compras_det F where F.dvco_id = :IDDOC and F.dvcd_fomm <> 0
                into :IMPTOS, :baseadic, :porc;
            if (IMPTOS <> 0) then
                begin
                execute procedure redondee(IMPTOS, DIG) returning_values (IMPTOS);

                /* TRAIGA LAS CARACTERISTICAS DE LA CUENTA */
                execute procedure CUENTA_INTERFAZ(24, :IDDOC, :CTAFOMENTO, 'S') returning_values (CUENTA, TIPOCUEN, ERRORC);
                if (ERRORC <> 0) then
                    ERROR = ERROR + 1;
                /* DEPENDE DEL TIPO DE CUENTA */
                if (TIPOCUEN = 'I') then
                    begin
                    /* ES UNA CUENTA DE INVENTARIO, RESGISTRE UNO A UNO LOS ARTICULOS */
                    for select F.ARTI_COD, F.dvcd_consumo from ARTICULO A, devoluciones_compras_det F where F.dvco_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_ARTICULO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                                values (:IDC, :NUMITEMS, :CTAFOMENTO, :CONCEPTO, '', 0, :IMPTOS, 0, 0, :NIT, :PROY, :CENTRO, :ARTICULO, 0, 0);
                            NUMITEMS = NUMITEMS + 1;
                            SUMA = SUMA - IMPTOS;
                            end
                        end
                    end
                if (TIPOCUEN = 'C') then
                    TIPOCUEN = 'N';
                if (TIPOCUEN = 'N') then
                    begin
                    insert into CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_DOCTIPOA, CNDE_DOCTIPON)
                        values (:IDC, :NUMITEMS, :CTAFOMENTO, :CONCEPTO, '', 0, :IMPTOS, :baseadic, :porc, :NIT, :PROY, :CENTRO, 0, 0);
                    NUMITEMS = NUMITEMS + 1;
                    SUMA = SUMA - IMPTOS;
                    end
                end
            end
    /* DESCUENTO */
    if ((CTADTO IS NOT NULL) AND
        (CTADTO <> '') AND
        (VRDTO <> 0)) THEN
        BEGIN
        /* TRAIGA LAS CARACTERISTICAS DE LA CUENTA */
        EXECUTE PROCEDURE CUENTA_INTERFAZ(24, :IDDOC, :CTADTO, 'N') returning_values (CUENTA, TIPOCUEN, ERRORC);
        if (ERRORC <> 0) then
            ERROR = ERROR + 1;
        if (TIPOCUEN = 'C') then
            BEGIN
            INSERT INTO CONTABILIZACION_DET (CNTB_ID, CNDE_ITEM, CNDE_CUENTA, CNDE_CONC, CNDE_REF, CNDE_DEBITOS, CNDE_CREDITOS, CNDE_BASE, CNDE_PORC, CNDE_TERC, CNDE_PROY, CNDE_CENTRO, CNDE_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 */
        
    /* 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;
    /* 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
      if (vrrtfte <> 0) 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/10, :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/10, :NIT, :PROY, :CENTRO, NULL, NULL, NULL, NULL, 0, 0);
            NUMITEMS = NUMITEMS + 1;
            SUMA = SUMA + VRRTICA;
            END
        END /* RTICA */
      if (RTICA = 'A') then
        begin
        if (VRRTICA <> 0) then
            begin
            for select max(COAR_CTARTICA), sum(D.dvcd_total - D.dvcd_ivamonto - D.dvcd_consumo),
                     sum(((D.dvcd_total - D.dvcd_ivamonto - D.dvcd_consumo) / 1000) * C.COAR_RTICA), max(C.COAR_RTICA)
              from CONTABIL_ARTICULO C, devoluciones_compras_det D
              where D.dvco_id = :IDDOC and d.ARTI_COD = C.ARTI_COD
              group by COAR_CTARTICA
              into :CTARTICA, :MONTO, :VRRTICA, :PRTICA
            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, :NUMITEMS, :CUENTA, :CONCEPTO, '', :VRRTICA, 0, :MONTO, :PRTICA / 10, :NIT, :PROY,
                        :CENTRO, :NUMERO, null, :fecha, null, 0, 31);
                    NUMITEMS = NUMITEMS + 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, :NUMITEMS, :CUENTA, :CONCEPTO, '', :VRRTICA, 0, :MONTO, :PRTICA / 10, :NIT, :PROY,
                        :CENTRO, null, null, null, null, 0, 0);
                    NUMITEMS = NUMITEMS + 1;
                    SUMA = SUMA + VRRTICA;
                    end
                end
            end
        end
      end
    /* 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 AND INCC_CN <> 'N'
        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,
    CN CHAR(1))
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_CONSEC 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) or (CN = 'N')) then
    begin
    ESTADO = 'PROCESANDO';
    SUSPEND;
    SELECT MAX(INCO_ID) FROM INTERFAZ_COMPRAS WHERE PREF_PRE = :PREF AND TIDO_COD = 24 INTO :IDI;
    if (IDI is NOT NULL) then
      BEGIN
      if (CN <> 'N') then
        EXECUTE PROCEDURE CONTABIL_DEVOLCOMP (:ID, :IDI) RETURNING_VALUES (:ERROR, :VER, :IDC);
      else
        BEGIN
        ERROR = 0;
        IDC = IDREF;
        END
      if (ERROR = 0) then
        if (CN <> 'C') then
            EXECUTE PROCEDURE contabil_devolcomp_niif (:ID, :IDI, :IDC) RETURNING_VALUES (:ERROR, :VER);
      if (ERROR = 0) then
        BEGIN
        EXECUTE PROCEDURE CONTABILIZA_PENDIENTE (:IDC);
        ESTADO = 'OK';
        end
      ELSE
        ESTADO = 'ERROR';
      suspend;
      END
    end
  END
END^

SET TERM ; ^



